|
|
|
@ -5,11 +5,12 @@ class Simple2DData: public BaseData
|
|
|
|
|
{ |
|
|
|
|
real x0 = 0.0, y0 = 0.0; |
|
|
|
|
size_t nx = 0, ny = 0; |
|
|
|
|
real xstep = 0.0, ystep = 0.0; |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
Simple2DData() = default; |
|
|
|
|
|
|
|
|
|
Simple2DData(size_t nx_, size_t ny_, real x0_, real y0_): BaseData(nx_ * ny_), x0(x0_), y0(y0_), nx(nx_), ny(ny_) {} |
|
|
|
|
Simple2DData(size_t nx_, size_t ny_, real x0_, real y0_, real xs_, real ys_): BaseData(nx_ * ny_), x0(x0_), y0(y0_), nx(nx_), ny(ny_), xstep(xs_), ystep(ys_) {} |
|
|
|
|
|
|
|
|
|
const real& V(size_t i) const { return BaseData::V(i); } |
|
|
|
|
real& V(size_t i) { return BaseData::V(i); } |
|
|
|
@ -26,50 +27,9 @@ class Simple2DData: public BaseData
|
|
|
|
|
size_t Nx() const { return nx; } |
|
|
|
|
size_t Ny() const { return ny; } |
|
|
|
|
|
|
|
|
|
real Lon(size_t ix, size_t iy) const { return x0 + ix / 12.0; } |
|
|
|
|
real Lat(size_t ix, size_t iy) const { return y0 + iy / 12.0; } |
|
|
|
|
real Lon(size_t ix, [[maybe_unused]] size_t iy) const { return x0 + ix * xstep; } |
|
|
|
|
real Lat([[maybe_unused]] size_t ix, size_t iy) const { return y0 + iy * ystep; } |
|
|
|
|
|
|
|
|
|
real Lon(size_t i) const { return Lon(i % nx, i / nx); } |
|
|
|
|
real Lat(size_t i) const { return Lat(i % nx, i / nx); } |
|
|
|
|
|
|
|
|
|
void InitCount(std::vector<size_t>& count) const |
|
|
|
|
{ |
|
|
|
|
count.resize(data.size()); |
|
|
|
|
for(size_t i = 0; i < N(); i++) count[i] = (V(i) == fillval) ? 0 : 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Simple2DData& Add(const Simple2DData& d, std::vector<size_t>& count) |
|
|
|
|
{ |
|
|
|
|
if(!d) return *this; |
|
|
|
|
if(!*this) |
|
|
|
|
{ |
|
|
|
|
*this = d; |
|
|
|
|
InitCount(count); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(N() != d.N() || N() != count.size()) return *this; |
|
|
|
|
for(size_t i = 0; i < N(); i++) |
|
|
|
|
if(d.V(i) != fillval) |
|
|
|
|
{ |
|
|
|
|
if(V(i) == fillval) |
|
|
|
|
{ |
|
|
|
|
V(i) = d(i); |
|
|
|
|
count[i] = 1; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
V(i) += d(i); |
|
|
|
|
count[i]++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Simple2DData& Div(const std::vector<size_t>& count) |
|
|
|
|
{ |
|
|
|
|
if(N() != count.size()) return *this; |
|
|
|
|
for(size_t i = 0; i < N(); i++) |
|
|
|
|
if(count[i] != 0) V(i) /= count[i]; |
|
|
|
|
return *this; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|