diff --git a/include/evalhyd/nse.hpp b/include/evalhyd/nse.hpp new file mode 100644 index 0000000000000000000000000000000000000000..5d12416fc2274d2ba7ca57902a692c40ac1a359b --- /dev/null +++ b/include/evalhyd/nse.hpp @@ -0,0 +1,28 @@ +#include <vector> +#include "xtensor/xexpression.hpp" +#include "xtensor/xmath.hpp" + +namespace eh { + + template <class A> + A nse(const xt::xexpression<A>& sim, + const xt::xexpression<A>& obs, + int axis = 0); + + template <class A> + A nse(const xt::xexpression<A>& sim, + const xt::xexpression<A>& obs, + int axis) + { + const A& q_sim = sim.derived_cast(); + const A& q_obs = obs.derived_cast(); + + A q_avg = xt::mean(q_obs, xt::keep_dims); + + A f_num = xt::sum(xt::square(q_obs - q_sim), std::vector<int> { axis }, xt::keep_dims); + A f_den = xt::sum(xt::square(q_obs - q_avg), xt::keep_dims); + + return 1 - (f_num / f_den); + } + +} diff --git a/include/nse.hpp b/include/nse.hpp deleted file mode 100644 index a775e894be47996ed416c11275e9e12c6e6cbc20..0000000000000000000000000000000000000000 --- a/include/nse.hpp +++ /dev/null @@ -1,24 +0,0 @@ -#include <vector> -#include <xtensor/xexpression.hpp> -#include <xtensor/xmath.hpp> - -template <class A> -A nse(const xt::xexpression<A>& sim, - const xt::xexpression<A>& obs, - int axis = 0); - -template <class A> -A nse(const xt::xexpression<A>& sim, - const xt::xexpression<A>& obs, - int axis) -{ - const A& q_sim = sim.derived_cast(); - const A& q_obs = obs.derived_cast(); - - A q_avg = xt::mean(q_obs, xt::keep_dims); - - A f_num = xt::sum(xt::square(q_obs - q_sim), std::vector<int> { axis }, xt::keep_dims); - A f_den = xt::sum(xt::square(q_obs - q_avg), xt::keep_dims); - - return 1 - (f_num / f_den); -}