1 #ifndef teca_numerics_h
2 #define teca_numerics_h
28 const std::string &v1,
const std::string &avg)
29 : m_v0(v0), m_v1(v1), m_avg(avg) {}
35 const_p_teca_dataset operator()(
unsigned int,
36 const std::vector<const_p_teca_dataset> &in_data,
const teca_metadata &)
38 const_p_teca_mesh in_mesh;
41 if (!(in_mesh = std::dynamic_pointer_cast<const teca_mesh>(in_data[0])) ||
42 !(v0 = in_mesh->get_point_arrays()->get(m_v0)) ||
43 !(v1 = in_mesh->get_point_arrays()->get(m_v1)))
46 <<
", " << m_v0 <<
"=" << v0 <<
", " << m_v1 <<
"=" << v1)
50 unsigned long n_pts = v0->size();
56 auto sp_v0 =
static_cast<const TT*
>(v0.get())->get_cpu_accessible();
57 const NT *p_v0 = sp_v0.get();
59 auto sp_v1 =
dynamic_cast<const TT*
>(v1.get())->get_cpu_accessible();
60 const NT *p_v1 = sp_v1.get();
62 auto sp_avg =
static_cast<TT*
>(avg.get())->get_cpu_accessible();
63 NT *p_avg = sp_avg.get();
65 for (
unsigned long i = 0; i < n_pts; ++i)
66 p_avg[i] = (p_v0[i] + p_v1[i])/NT(2);
69 p_teca_mesh out_mesh = std::static_pointer_cast<teca_mesh>(
70 in_mesh->new_instance());
72 out_mesh->shallow_copy(std::const_pointer_cast<teca_mesh>(in_mesh));
73 out_mesh->get_point_arrays()->append(m_avg, avg);
94 const std::string &v1,
const std::string &diff)
95 : m_v0(v0), m_v1(v1), m_diff(diff) {}
102 const_p_teca_dataset operator()(
unsigned int,
103 const std::vector<const_p_teca_dataset> &in_data,
const teca_metadata &)
105 const_p_teca_mesh in_mesh;
108 if (!(in_mesh = std::dynamic_pointer_cast<const teca_mesh>(in_data[0])) ||
109 !(v0 = in_mesh->get_point_arrays()->get(m_v0)) ||
110 !(v1 = in_mesh->get_point_arrays()->get(m_v1)))
113 <<
", " << m_v0 <<
"=" << v0 <<
", " << m_v1 <<
"=" << v1)
117 unsigned long n_pts = v0->size();
123 auto sp_v0 =
static_cast<const TT*
>(v0.get())->get_cpu_accessible();
124 const NT *p_v0 = sp_v0.get();
126 auto sp_v1 =
dynamic_cast<const TT*
>(v1.get())->get_cpu_accessible();
127 const NT *p_v1 = sp_v1.get();
129 auto sp_diff =
static_cast<TT*
>(diff.get())->get_cpu_accessible();
130 NT *p_diff = sp_diff.get();
132 for (
unsigned long i = 0; i < n_pts; ++i)
133 p_diff[i] = p_v1[i] - p_v0[i];
136 p_teca_mesh out_mesh = std::static_pointer_cast<teca_mesh>(
137 in_mesh->new_instance());
139 out_mesh->shallow_copy(std::const_pointer_cast<teca_mesh>(in_mesh));
140 out_mesh->get_point_arrays()->append(m_diff, diff);