Skip to content
Snippets Groups Projects
Commit 2b20008c authored by Uwe Schulzweida's avatar Uwe Schulzweida
Browse files

Moved remap_set_mask() to remaplib.c

parent 9885aeb6
No related branches found
No related tags found
1 merge request!242Consecstat.cc: fix problem with intel/openmp
......@@ -216,40 +216,8 @@ LonLatPoint remapgrid_get_lonlat(const RemapGrid *grid, size_t index);
void remap_check_area(size_t grid_size, const Varray<double> &cell_area, const char *name);
template <typename T>
void
remap_set_mask(const Varray<T> &v, size_t gridsize, size_t numMissVals, double mv, Varray<int8_t> &mask)
{
T missval = mv;
mask.resize(gridsize);
if (numMissVals)
{
if (std::isnan(missval))
{
#ifdef _OPENMP
#pragma omp parallel for default(shared) schedule(static)
#endif
for (size_t i = 0; i < gridsize; ++i) mask[i] = fp_is_not_equal(v[i], missval);
}
else
{
#ifdef _OPENMP
#pragma omp parallel for default(shared) schedule(static)
#endif
for (size_t i = 0; i < gridsize; ++i) mask[i] = !is_equal(v[i], missval);
}
}
else
{
for (size_t i = 0; i < gridsize; ++i) mask[i] = 1;
}
}
inline void
remap_set_mask(const Field &field1, size_t gridsize, size_t numMissVals, double missval, Varray<int8_t> &imask)
{
auto func = [&](auto &v) { remap_set_mask(v, gridsize, numMissVals, missval, imask); };
field_operation(func, field1);
}
void remap_set_mask(const Varray<T> &v, size_t gridsize, size_t numMissVals, double mv, Varray<int8_t> &mask);
void remap_set_mask(const Field &field1, size_t gridsize, size_t numMissVals, double missval, Varray<int8_t> &imask);
#endif /* REMAP_H */
......@@ -1145,3 +1145,44 @@ remap_check_area(size_t gridSize, const Varray<double> &cell_area, const char *n
if (cell_area[i] < -0.01) cdo_print("%s grid area error: %zu %g", name, i, cell_area[i]);
}
}
template <typename T>
void
remap_set_mask(const Varray<T> &v, size_t gridsize, size_t numMissVals, double mv, Varray<int8_t> &mask)
{
T missval = mv;
mask.resize(gridsize);
if (numMissVals)
{
if (std::isnan(missval))
{
#ifdef _OPENMP
#pragma omp parallel for default(shared) schedule(static)
#endif
for (size_t i = 0; i < gridsize; ++i) mask[i] = fp_is_not_equal(v[i], missval);
}
else
{
#ifdef _OPENMP
#pragma omp parallel for default(shared) schedule(static)
#endif
for (size_t i = 0; i < gridsize; ++i) mask[i] = !is_equal(v[i], missval);
}
}
else
{
for (size_t i = 0; i < gridsize; ++i) mask[i] = 1;
}
}
// Explicit instantiation
template void remap_set_mask(const Varray<float> &v, size_t gridsize, size_t numMissVals, double mv, Varray<int8_t> &mask);
template void remap_set_mask(const Varray<double> &v, size_t gridsize, size_t numMissVals, double mv, Varray<int8_t> &mask);
void
remap_set_mask(const Field &field1, size_t gridsize, size_t numMissVals, double missval, Varray<int8_t> &imask)
{
auto func = [&](auto &v) { remap_set_mask(v, gridsize, numMissVals, missval, imask); };
field_operation(func, field1);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment