55 const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz,
56 const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ);
58 Array4D(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz);
68 Array4D(
const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ,
const T& init);
85 const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz,
86 const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ);
103 const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz,
104 const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ);
106 void fill(
const Array4D<T>& i_array4D,
const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz);
121 void resize(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz);
122 void resize(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz,
const T& init);
123 void size(
size_t& anw,
size_t& anx,
size_t& any,
size_t& anz)
const;
125 size_t getNw()
const;
126 size_t getNx()
const;
127 size_t getNy()
const;
128 size_t getNz()
const;
162 template<
class P>
friend std::iostream& operator<<(std::iostream& os, const Array4D<P>&
array);
170 T&
operator ()(
const size_t& w,
const size_t& x,
const size_t& y,
const size_t& z);
171 const T
operator ()(
const size_t& w,
const size_t& x,
const size_t& y,
const size_t& z)
const;
212 return vecData.at(i);
220 return vecData.at(i);
228 if ((w >= nw) || (x >= nx) || (y >= ny) || (z >= nz)) {
229 std::stringstream ss;
230 ss <<
"Trying to access array(" << w <<
"," << x <<
"," << y <<
"," << z <<
")";
231 ss <<
" while array is ("<< nw <<
"," << nx <<
"," << ny <<
"," << nz <<
")";
237 return vecData[w + x*nw + y*nwnx + z*nwnxny];
240 template<
class T>
inline const T
Array4D<T>::operator()(
const size_t& w,
const size_t& x,
const size_t& y,
const size_t& z)
const {
242 if ((w >= nw) || (x >= nx) || (y >= ny) || (z >= nz)) {
243 std::stringstream ss;
244 ss <<
"Trying to access array("<< w <<
"," << x <<
"," << y <<
"," << z <<
")";
245 ss <<
" while array is ("<< nw <<
"," << nx <<
"," << ny <<
"," << nz <<
")";
249 return vecData[w + nw*x + y*nwnx + z*nwnxny];
252 template<
class T>
Array4D<T>::Array4D() : vecData(), nw(0), nx(0), ny(0), nz(0), nwnx(0), nwnxny(0), keep_nodata(true)
257 const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz,
258 const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ)
259 : vecData(i_sizeW*i_sizeX*i_sizeY*i_sizeZ), nw(i_sizeW), nx(i_sizeX), ny(i_sizeY), nz(i_sizeZ), nwnx(i_sizeW*i_sizeX), nwnxny(i_sizeW*i_sizeX*i_sizeY), keep_nodata(true)
261 subset(i_array4D, i_nw, i_nx, i_ny, i_nz, i_sizeW, i_sizeX, i_sizeY, i_sizeZ);
265 const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz,
266 const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ)
269 if (((i_nw+i_sizeW) > i_array4D.
nw) || ((i_nx+i_sizeX) > i_array4D.
nx) || ((i_ny+i_sizeY) > i_array4D.
ny) || ((i_nz+i_sizeZ) > i_array4D.
nz)) {
270 std::stringstream ss;
271 ss <<
"Trying to cut an array of size ("<< i_array4D.
nw <<
"," << i_array4D.
nx <<
"," << i_array4D.
ny <<
"," << i_array4D.
nz <<
") ";
272 ss <<
"to size (" << i_sizeW <<
"," << i_sizeX <<
"," << i_sizeY <<
"," << i_sizeZ <<
") ";
273 ss <<
"starting at ("<< i_nw <<
"," << i_nx <<
"," << i_ny <<
"," << i_nz <<
")";
277 if ((i_sizeW == 0) || (i_sizeX == 0) || (i_sizeY == 0) || (i_sizeZ == 0))
280 resize(i_sizeW, i_sizeX, i_sizeY, i_sizeZ);
282 for (
size_t ii=0; ii<nz; ii++) {
283 for (
size_t jj=0; jj<ny; jj++) {
284 for (
size_t kk=0; kk<nx; kk++) {
285 for (
size_t ll=0; ll<nw; ll++)
287 operator()(ll,kk,jj,ii) = i_array4D(i_nw+ll, i_nx+kk, i_ny+jj, i_nz+ii);
293 template<
class T>
void Array4D<T>::fill(
const Array4D<T>& i_array4D,
const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz)
295 size_t i_sizeW, i_sizeX, i_sizeY, i_sizeZ;
296 i_array4D.
size(i_sizeW, i_sizeX, i_sizeY, i_sizeZ);
297 fill(i_array4D, i_nw, i_nx, i_ny, i_nz, i_sizeW, i_sizeX, i_sizeY, i_sizeZ);
301 const size_t& i_nw,
const size_t& i_nx,
const size_t& i_ny,
const size_t& i_nz,
302 const size_t& i_sizeW,
const size_t& i_sizeX,
const size_t& i_sizeY,
const size_t& i_sizeZ)
305 if (((i_nw+i_sizeW) > i_array4D.
nw) || ((i_nx+i_sizeX) > i_array4D.
nx) || ((i_ny+i_sizeY) > i_array4D.
ny) || ((i_nz+i_sizeZ) > i_array4D.
nz)) {
306 std::stringstream ss;
307 ss <<
"Filling an array of size (" << nw <<
"," << nx <<
"," << ny <<
"," << nz <<
") ";
308 ss <<
"with an array of size (" << i_sizeW <<
"," << i_sizeX <<
"," << i_sizeY <<
"," << i_sizeZ <<
") ";
309 ss <<
"starting at (" << i_nw <<
"," << i_nx <<
"," << i_ny <<
"," << i_nz <<
")";
313 if ((i_sizeW == 0) || (i_sizeX == 0) || (i_sizeY == 0) || (i_sizeZ == 0))
317 for (
size_t ii=i_nz; ii<(i_nz+i_sizeZ); ii++) {
318 for (
size_t jj=i_ny; jj<(i_ny+i_sizeY); jj++) {
319 for (
size_t kk=i_nx; kk<(i_nx+i_sizeX); kk++) {
320 for (
size_t ll=i_nw; ll<(i_nw+i_sizeW); ll++) {
321 const size_t iw = ll-i_nw;
322 const size_t ix = kk-i_nx;
323 const size_t iy = jj-i_ny;
324 const size_t iz = ii-i_nz;
325 operator()(ll,kk,jj,ii) = i_array4D(iw,ix, iy, iz);
332 template<
class T>
Array4D<T>::Array4D(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz)
333 : vecData(anw*anx*any*anz), nw(anw), nx(anx), ny(any), nz(anz), nwnx(anw*anx), nwnxny(anw*anx*any), keep_nodata(true)
338 template<
class T>
Array4D<T>::Array4D(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz,
const T& init)
339 : vecData(anw*anx*any*anz, init), nw(anw), nx(anx), ny(any), nz(anz), nwnx(anw*anx), nwnxny(anw*anx*any), keep_nodata(true)
345 keep_nodata = i_keep_nodata;
352 template<
class T>
void Array4D<T>::resize(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz) {
354 vecData.resize(anw*anx*any*anz);
363 template<
class T>
void Array4D<T>::resize(
const size_t& anw,
const size_t& anx,
const size_t& any,
const size_t& anz,
const T& init) {
365 vecData.resize(anw*anx*any*anz, init);
374 template<
class T>
void Array4D<T>::size(
size_t& anw,
size_t& anx,
size_t& any,
size_t& anz)
const {
403 nw = nx = ny = nz = nwnx = nwnxny = 0;
407 return (nw==0 && nx==0 && ny==0 && nz==0);
411 std::stringstream os;
413 for (
size_t ll=0; ll<nw; ll++) {
414 os <<
"dim4[" << ll <<
"]\n";
415 for (
size_t kk=0; kk<nz; kk++) {
416 os <<
"depth[" << kk <<
"]\n";
417 for (
size_t ii=0; ii<nx; ii++) {
418 for (
size_t jj=0; jj<ny; jj++) {
419 os << operator()(ii,jj,kk,ll) <<
" ";
425 os <<
"</array4d>\n";
429 template<
class P> std::iostream& operator<<(std::iostream& os, const Array4D<P>&
array) {
430 os.write(reinterpret_cast<const char*>(&
array.keep_nodata),
sizeof(
array.keep_nodata));
431 os.write(reinterpret_cast<const char*>(&
array.nx),
sizeof(
array.nx));
432 os.write(reinterpret_cast<const char*>(&
array.ny),
sizeof(
array.ny));
433 os.write(reinterpret_cast<const char*>(&
array.nz),
sizeof(
array.nz));
434 os.write(reinterpret_cast<const char*>(&
array.nw),
sizeof(
array.nw));
435 os.write(reinterpret_cast<const char*>(&
array.vecData[0]), static_cast<std::streamsize>(
array.nx*
array.ny*
array.nz*
array.nw*
sizeof(P)));
441 is.read(reinterpret_cast<char*>(&array.
nx),
sizeof(array.
nx));
442 is.read(reinterpret_cast<char*>(&array.
ny),
sizeof(array.
ny));
443 is.read(reinterpret_cast<char*>(&array.
nz),
sizeof(array.
nz));
444 is.read(reinterpret_cast<char*>(&array.
nw),
sizeof(array.
nw));
446 is.read(reinterpret_cast<char*>(&array.
vecData[0]), static_cast<std::streamsize>(array.
nx*array.
ny*array.
nz*array.
nw*
sizeof(P)));
452 T min = std::numeric_limits<T>::max();
453 const size_t nwyz = nwnxny*nz;
455 if (keep_nodata==
false) {
456 for (
size_t jj=0; jj<nwyz; jj++) {
457 const T val = vecData[jj];
458 if (val<min) min=val;
462 for (
size_t jj=0; jj<nwyz; jj++) {
463 const T val = vecData[jj];
466 if (min!=std::numeric_limits<T>::max())
return min;
473 T max = -std::numeric_limits<T>::max();
474 const size_t nwyz = nwnxny*nz;
476 if (keep_nodata==
false) {
477 for (
size_t jj=0; jj<nwyz; jj++) {
478 const T val = vecData[jj];
479 if (val>max) max=val;
483 for (
size_t jj=0; jj<nwyz; jj++) {
484 const T val = vecData[jj];
487 if (max!=-std::numeric_limits<T>::max())
return max;
495 const size_t nwyz = nwnxny*nz;
497 if (keep_nodata==
false) {
498 for (
size_t jj=0; jj<nwyz; jj++) {
499 const T val = vecData[jj];
502 if (nwyz>0)
return mean/(T)(nwyz);
506 for (
size_t jj=0; jj<nwyz; jj++) {
507 const T val = vecData[jj];
513 if (count>0)
return mean/(T)(count);
520 const size_t nwyz = nwnxny*nz;
522 if (keep_nodata==
false) {
526 for (
size_t ii=0; ii<nwyz; ii++) {
534 if (std::numeric_limits<T>::is_signed) {
535 const size_t nwyz = nwnxny*nz;
536 if (keep_nodata==
false) {
537 for (
size_t jj=0; jj<nwyz; jj++) {
538 T& val = vecData[jj];
542 for (
size_t jj=0; jj<nwyz; jj++) {
543 T& val = vecData[jj];
560 if (nw!=rhs.
nw || nx!=rhs.
nx || ny!=rhs.
ny || nz!=rhs.
nz)
return false;
562 const size_t nwyz = nwnxny*nz;
563 for (
size_t jj=0; jj<nwyz; jj++)
574 if (
this != &source) {
588 std::fill(vecData.begin(), vecData.end(), value);
595 if ((rhs.
nw != nw) || (rhs.
nx != nx) || (rhs.
ny != ny) || (rhs.
nz != nz)) {
596 std::stringstream ss;
597 ss <<
"Trying to add two Array4D objects with different dimensions: ";
598 ss <<
"(" << nw <<
"," << nx <<
"," << ny <<
"," << nz <<
") + (" << rhs.
nw <<
"," << rhs.
nx <<
"," << rhs.
ny <<
"," << rhs.
nz <<
")";
602 const size_t nwyz = nwnxny*nz;
603 if (keep_nodata==
false) {
604 for (
size_t jj=0; jj<nwyz; jj++) {
605 vecData[jj] += rhs(jj);
608 for (
size_t jj=0; jj<nwyz; jj++) {
612 vecData[jj] += rhs(jj);
629 if (rhs==0.)
return *
this;
632 const size_t nwyz = nwnxny*nz;
633 if (keep_nodata==
false) {
634 for (
size_t jj=0; jj<nwyz; jj++) {
638 for (
size_t jj=0; jj<nwyz; jj++) {
658 if ((rhs.
nw != nw) || (rhs.
nx != nx) || (rhs.
ny != ny) || (rhs.
nz != nz)) {
659 std::stringstream ss;
660 ss <<
"Trying to substract two Array4D objects with different dimensions: ";
661 ss <<
"(" << nw <<
"," << nx <<
"," << ny <<
"," << nz <<
") - (" << rhs.
nw <<
"," << rhs.
nx <<
"," << rhs.
ny <<
"," << rhs.
nz <<
")";
665 const size_t nwyz = nwnxny*nz;
666 if (keep_nodata==
false) {
667 for (
size_t jj=0; jj<nwyz; jj++) {
668 vecData[jj] -= rhs(jj);
671 for (
size_t jj=0; jj<nwyz; jj++) {
675 vecData[jj] -= rhs(jj);
707 if ((rhs.
nw != nw) || (rhs.
nx != nx) || (rhs.
ny != ny) || (rhs.
nz != nz)) {
708 std::stringstream ss;
709 ss <<
"Trying to multiply two Array4D objects with different dimensions: ";
710 ss <<
"("<< nw <<
"," << nx <<
"," << ny <<
"," << nz <<
") * (" << rhs.
nw <<
"," << rhs.
nx <<
"," << rhs.
ny <<
"," << rhs.
nz <<
")";
714 const size_t nwxyz = nwnxny*nz;
715 if (keep_nodata==
false) {
716 for (
size_t jj=0; jj<nwxyz; jj++) {
717 vecData[jj] *= rhs(jj);
720 for (
size_t jj=0; jj<nwxyz; jj++) {
724 vecData[jj] *= rhs(jj);
741 if (rhs==1.)
return *
this;
744 const size_t nwxyz = nwnxny*nz;
745 if (keep_nodata==
false) {
746 for (
size_t jj=0; jj<nwxyz; jj++) {
750 for (
size_t jj=0; jj<nwxyz; jj++) {
770 if ((rhs.
nw != nw) || (rhs.
nx != nx) || (rhs.
ny != ny) || (rhs.
nz != nz)) {
771 std::stringstream ss;
772 ss <<
"Trying to divide two Array4D objects with different dimensions: ";
773 ss <<
"(" << nw <<
"," << nx <<
"," << ny <<
"," << nz <<
") / (" << rhs.
nw <<
"," << rhs.
nx <<
"," << rhs.
ny <<
"," << rhs.
nz <<
")";
777 const size_t nwxyz = nwnxny*nz;
778 if (keep_nodata==
false) {
779 for (
size_t jj=0; jj<nwxyz; jj++) {
780 vecData[jj] /= rhs(jj);
783 for (
size_t jj=0; jj<nwxyz; jj++) {
787 vecData[jj] /= rhs(jj);
819 if (nx!=in_nx || ny!=in_ny || nz!=in_nz || nw!=in_nw)
822 const size_t nwxyz = nx*ny*nz*nw;
823 for (
size_t jj=0; jj<nwxyz; jj++)
void resize(const size_t &anw, const size_t &anx, const size_t &any, const size_t &anz)
Definition: Array4D.h:352
bool operator==(const Array4D< T > &) const
Operator that tests for equality.
Definition: Array4D.h:816
bool keep_nodata
Definition: Array4D.h:207
bool getKeepNodata()
get how to process nodata values (ie: as nodata or as normal numbers)
Definition: Array4D.h:348
void abs()
Definition: Array4D.h:533
void size(size_t &anw, size_t &anx, size_t &any, size_t &anz) const
Definition: Array4D.h:374
size_t getNw() const
Definition: Array4D.h:385
bool checkEpsilonEquality(const Array4D< double > &rhs, const double &epsilon) const
Definition: Array4D.h:559
size_t size() const
Definition: Array4D.h:381
bool operator!=(const Array4D< T > &) const
Operator that tests for inequality.
Definition: Array4D.h:829
Array4D< T > & operator*=(const T &rhs)
Definition: Array4D.h:739
size_t nx
Definition: Array4D.h:202
T & operator()(const size_t &i)
Definition: Array4D.h:210
Array4D< T > & operator-=(const T &rhs)
Definition: Array4D.h:690
size_t nw
Definition: Array4D.h:201
size_t getNz() const
Definition: Array4D.h:397
Array4D< T > & operator=(const Array4D< T > &)
Definition: Array4D.h:573
const Array4D< T > getAbs() const
returns the grid of the absolute value of values contained in the grid
Definition: Array4D.h:551
const Array4D< T > operator*(const T &rhs) const
Definition: Array4D.h:759
const Array4D< T > operator+(const T &rhs) const
Definition: Array4D.h:647
Array4D()
Definition: Array4D.h:252
std::vector< T > vecData
The actual objects are stored in a one-dimensional vector.
Definition: Array4D.h:200
bool checkEpsilonEquality(const double &val1, const double &val2, const double &epsilon)
Check whether two values are equal regarding a certain epsilon environment (within certain radius of ...
Definition: IOUtils.h:81
size_t nwnxny
Definition: Array4D.h:206
The template class Array4D is a 4D Array (Tensor) able to hold any type of object as datatype...
Definition: Array4D.h:36
size_t getNx() const
Definition: Array4D.h:389
const Array4D< T > operator/(const T &rhs) const
Definition: Array4D.h:808
void fill(const Array4D< T > &i_array4D, const size_t &i_nw, const size_t &i_nx, const size_t &i_ny, const size_t &i_nz, const size_t &i_sizeW, const size_t &i_sizeX, const size_t &i_sizeY, const size_t &i_sizeZ)
A method that can be used to insert a subplane into an existing Array4D object that is passed as i_ar...
Definition: Array4D.h:300
T getMin() const
returns the minimum value contained in the grid
Definition: Array4D.h:450
bool empty() const
Definition: Array4D.h:406
size_t nz
Definition: Array4D.h:204
const std::string toString() const
Definition: Array4D.h:410
size_t getCount() const
returns the number of points contained in the grid. If setNodataHandling(IOUtils::RAW_NODATA), then the number of points is the size of the grid. If setNodataHandling(IOUtils::PARSE_NODATA), then it is the number of non-nodata values in the grid
Definition: Array4D.h:518
#define AT
Definition: IOExceptions.h:29
friend std::iostream & operator>>(std::iostream &is, Array4D< P > &array)
Definition: Array4D.h:439
const double nodata
This is the internal nodata value.
Definition: IOUtils.h:60
size_t getNy() const
Definition: Array4D.h:393
void clear()
Definition: Array4D.h:401
T getMax() const
returns the maximum value contained in the grid
Definition: Array4D.h:471
size_t nwnx
Definition: Array4D.h:205
Array4D< T > & operator+=(const T &rhs)
Definition: Array4D.h:627
size_t ny
Definition: Array4D.h:203
thrown when an index is out of bounds
Definition: IOExceptions.h:108
const double e
Definition: Meteoconst.h:66
Array4D< T > & operator/=(const T &rhs)
Definition: Array4D.h:802
void setKeepNodata(const bool i_keep_nodata)
set how to process nodata values (ie: as nodata or as normal numbers)
Definition: Array4D.h:344
void subset(const Array4D< T > &i_array4D, const size_t &i_nw, const size_t &i_nx, const size_t &i_ny, const size_t &i_nz, const size_t &i_sizeW, const size_t &i_sizeX, const size_t &i_sizeY, const size_t &i_sizeZ)
Definition: Array4D.h:264
T getMean() const
returns the mean value contained in the grid
Definition: Array4D.h:492
The basic exception class adjusted for the needs of SLF software.
Definition: IOExceptions.h:41
std::iostream & operator>>(std::iostream &is, Config &cfg)
Definition: Config.cc:141
value::array array
Definition: picojson.h:194
const Array4D< T > operator-(const T &rhs) const
Definition: Array4D.h:696