54 #ifndef ARRAY_LIBRARY_N_AXIS_H 55 #define ARRAY_LIBRARY_N_AXIS_H 68 template<
class T>
bool operator< (const GSlice_iter<T>&,
const GSlice_iter<T>&);
72 template<
class T>
class GSlice_iter :
public iterator<forward_iterator_tag, T> {
82 T& ref(
size_t i)
const;
113 for (
size_t ic = 0; ic < gsizes.size()-1; ++ic){
114 loc += (i/gsizes[ic+1]) * gs.stride()[ic];
117 loc += i * gs.stride()[gsizes.size()-1];
118 return (*v)[gs.start()+loc];
126 v(vv), gs(gss), curr(0), gsizes(gs.size()){
127 for (
size_t ic(1); ic <
gsizes.size(); ++ic) {
128 gsizes[gss.size().size()-ic-1] *=
gsizes[gss.size().size()-ic];
139 while ( (p.
gs.stride()[count] == p.
gs.stride()[count])
140 && (p.
gs.size()[count] == p.
gs.size()[count] ))
141 if (count++ == q.
gs.size().size()-1)
return true;
153 if (p.curr<q.curr && p.gs.start() == q.gs.start())
154 while ( (p.gs.stride()[count] == p.gs.stride()[count])
155 && (p.gs.size()[count] == p.gs.size()[count] ))
156 if (count++ == q.gs.size().size()-1)
return true;
170 template<
class T>
bool operator< (const CGSlice_iter<T>&,
const CGSlice_iter<T>&);
174 template<
class T>
class CGSlice_iter :
public iterator<forward_iterator_tag, T,const T*, const T&> {
184 const T&
ref(
size_t i)
const;
215 for (
size_t ic = 0; ic <
gsizes.size()-1; ++ic){
216 loc += (i/
gsizes[ic+1]) *
gs.stride()[ic];
219 loc += i *
gs.stride()[
gsizes.size()-1];
220 return (*
v)[
gs.start()+loc];
229 for (
int ic=1; ic <
gsizes.size(); ++ic) {
230 gsizes[gss.size().size()-ic-1] *=
gsizes[gss.size().size()-ic];
241 while ( (p.
gs.stride()[count] == p.
gs.stride()[count])
242 && (p.
gs.size()[count] == p.
gs.size()[count] ))
243 if (count++ == q.
gs.size().size()-1)
return true;
255 if (p.curr<q.curr && p.gs.start() == q.gs.start())
256 while ( (p.gs.stride()[count] == p.gs.stride()[count])
257 && (p.gs.size()[count] == p.gs.size()[count] ))
258 if (count++ == q.gs.size().size()-1)
return true;
288 size_t dim()
const {
return d1*d2;}
289 size_t dim1()
const {
return d1;}
290 size_t dim2()
const {
return d2;}
298 vector<T> d2c(
size_t j);
311 Array2D& operator=(
const T& d);
313 Array2D& operator*=(
const T& d);
315 Array2D& operator+=(
const T& d);
317 Array2D& operator-=(
const T& d);
321 Array2D& multid1(
const valarray<T>& vmulti);
322 Array2D& multid2(
const valarray<T>& vmulti);
338 v =
new valarray<T>(
d1*
d2);
344 v =
new valarray<T>(
d1*
d2);
345 (*v) = other.
array();
374 for (
size_t i(0); i <
d1; ++i ){
375 d1vec[i] = (*v)[i+j*
d1];
385 valarray<size_t> sz(2), str(2);
386 str[1] =
d1; str[0] = 1;
387 sz[1] =
d2; sz[0] = e-b+1;
393 valarray<size_t> sz(2), str(2);
394 str[1] =
d1; str[0] = 1;
395 sz[1] =
d2; sz[0] = e-b+1;
401 valarray<size_t> sz(1), str(1);
402 str[0] = 1; sz[0] = (e-b+1)*
d1;
408 valarray<size_t> sz(1), str(1);
409 str[0] = 1; sz[0] = (e-b+1)*
d1;
417 valarray<size_t> sz(2), str(2);
418 str[1] = 1; str[0] =
dim1();
419 sz[1] = nx; sz[0] = ny;
425 valarray<size_t> sz(2), str(2);
426 str[1] = 1; str[0] =
dim1();
427 sz[1] = nx; sz[0] = ny;
440 if (
this != &other) {
441 (*v) = other.
array();
452 (*v) *= vmulti.
array();
462 (*v) += vadd.
array();
472 (*v) -= vmin.
array();
481 for (
size_t j(0); j<
d1*
d2; j+=
d1 ){
482 for (
size_t i(0); i<
d1; ++i ){
483 (*v)[i+j] *= vmulti[i];
491 for (
size_t j(0); j<
d2; ++j ){
492 for (
size_t i(j*
d1); i< (j+1)*d1; ++i ){
493 (*v)[i] *= vmulti[j];
508 for(
long i(0); i< long(
d1*
d2)-2; ++i) {
509 (*v)[i] -= (*v)[i+2];
511 for(
long i(
d1*d2-3); i>-1; --i) {
588 for(
long i(0); i< long(
d1*
d2)-twod1; ++i) {
592 (*v)[i] -= (*v)[i+twod1];
595 for(
long i(
d1*d2-twod1-1); i>-1; --i) {
596 (*v)[i+
d1] = (*v)[i];
605 for (
size_t j(0); j <
d2; ++j ){
606 for (
size_t i(j*
d1); i< j*d1+N; ++i ){
646 T& operator[](
size_t i);
647 T operator[](
size_t i)
const;
649 T& real(
size_t i,
size_t j);
650 T real(
size_t i,
size_t j)
const;
651 T& imag(
size_t i,
size_t j);
652 T imag(
size_t i,
size_t j)
const;
705 v =
new valarray<T>(2*
d1*
d2);
712 v =
new valarray<T>(2*
d1*
d2);
713 (*v) = other.
array();
733 return (*
v)[2*i+j*
td1];
737 return (*
v)[2*i+j*
td1];
741 return (*
v)[2*i+1+j*
td1];
745 return (*
v)[2*i+1+j*
td1];
753 valarray<size_t> sz(3), str(3);
754 str[2] = 1, str[1] =
td1; str[0] = 2;
755 sz[2] = 2, sz[1] =
d2; sz[0] = e-b+1;
761 valarray<size_t> sz(3), str(3);
762 str[2] = 1, str[1] =
td1; str[0] = 2;
763 sz[2] = 2, sz[1] =
d2; sz[0] = e-b+1;
769 valarray<size_t> sz(1), str(1);
770 str[0] = 1; sz[0] = (e-b+1)*
td1;
776 valarray<size_t> sz(1), str(1);
777 str[0] = 1; sz[0] = (e-b+1)*
td1;
785 valarray<size_t> sz(2), str(2);
786 str[1] = 1; str[0] =
td1;
787 sz[1] = 2*nx; sz[0] = ny;
793 valarray<size_t> sz(2), str(2);
794 str[1] = 1; str[0] =
td1;
795 sz[1] = 2*nx; sz[0] = ny;
805 for (
size_t i(0); i<
td1*
d2; i+=2) {
812 for (
size_t i(0); i<
td1*
d2; i+=2) {
819 for (
size_t i(0); i<
d1*
d2; ++i) {
820 (*v)[2*i] = other.
array()[i];
826 if (
this != &other) {
827 (*v) = other.
array();
840 for (
size_t i(0); i<
td1*
d2; i+=2) {
841 T vi((*
v)[i]*c.imag());
843 (*v)[i] -= (*v)[i+1]*c.imag();
844 (*v)[i+1] *= c.real();
851 for (
size_t i(0); i<
d1*
d2; ++i) {
852 (*v)[2*i] *= vmulti.
array()[i];
853 (*v)[2*i+1] *= vmulti.
array()[i];
859 for (
size_t i(0); i<
td1*
d2; i+=2) {
860 T vi((*
v)[i] * vmulti.
array()[i+1]);
861 (*v)[i] *= vmulti.
array()[i];
862 (*v)[i] -= (*v)[i+1]*vmulti.
array()[i+1];
863 (*v)[i+1] *= vmulti.
array()[i];
872 for (
size_t i(0); i<
td1*
d2; i+=2) {
879 for (
size_t i(0); i<
td1*
d2; i+=2) {
881 (*v)[i+1] +=c.imag();
887 for (
size_t i(0); i<
d1*
d2; ++i) {
888 (*v)[2*i] += vadd.
array()[i];
894 (*v) += vadd.
array();
901 for (
size_t i(0); i<
td1*
d2; i+=2) {
908 for (
size_t i(0); i<
td1*
d2; i+=2) {
910 (*v)[i+1] -=c.imag();
916 for (
size_t i(0); i<
d1*
d2; ++i) {
917 (*v)[2*i] -= vmin.
array()[i];
923 (*v) -= vmin.
array();
932 for (
size_t j(0); j<
td1*
d2; j+=
td1 ){
933 for (
size_t i(0); i<
d1; ++i ){
934 (*v)[2*i+j] *= vmulti[i];
935 (*v)[2*i+1+j] *= vmulti[i];
942 for (
size_t j(0); j<
td1*
d2; j+=
td1 ){
943 for (
size_t i(0); i<
d1; ++i ){
944 T vi((*
v)[2*i+j]*vmulti[i].
imag());
945 (*v)[2*i+j] *= vmulti[i].real();
946 (*v)[2*i+j] -= (*v)[2*i+1+j] * vmulti[i].imag();
947 (*v)[2*i+1+j] *= vmulti[i].real();
956 for (
size_t j(0); j<
d2; ++j ){
957 for (
size_t i(j*
td1); i< (j+1)*td1; ++i ){
958 (*v)[i] *= vmulti[j];
966 for (
size_t j(0); j<
d2; ++j ){
967 for (
size_t i(j*
td1); i< (j+1)*td1; i+=2 ){
968 T vi((*
v)[i]* vmulti[j].
imag());
969 (*v)[i] *= vmulti[j].real();
970 (*v)[i] -= (*v)[i+1] * vmulti[j].imag();
971 (*v)[i+1] *= vmulti[j].real();
988 for(
long i(0); i<
td1*
d2-4; ++i) {
989 (*v)[i] -= (*v)[i+4];
991 for(
long i(
td1*d2-5); i>-1; --i) {
1005 for(
long i(0); i<
td1*
d2-twotd1; ++i) {
1006 (*v)[i] -= (*v)[i+twotd1];
1008 for(
long i(
td1*
d2-twotd1-1); i>-1; --i) {
1009 (*v)[i+
td1] = (*v)[i];
1017 for (
size_t j(0); j <
d2; ++j ){
1018 for (
size_t i(j*
td1); i< j*td1+2*N; ++i ){
1047 Array3D(
size_t x,
size_t y,
size_t z);
1052 size_t dim()
const {
return d1*d2*d3;}
1059 T& operator()(
size_t i,
size_t j,
size_t k);
1060 T operator()(
size_t i,
size_t j,
size_t k)
const;
1061 T& operator()(
size_t i);
1062 T operator()(
size_t i)
const;
1070 GSlice_iter<T> SubArray3D(
size_t st,
size_t nx,
size_t ny,
size_t nz);
1076 CGSlice_iter<T> SubArray3D(
size_t st,
size_t nx,
size_t ny,
size_t nz)
const;
1091 Array3D& multid3(
const valarray<T>& vmulti);
1113 v =
new valarray<T>(
d1*
d2*
d3);
1122 v =
new valarray<T>(
d1*d2*
d3);
1123 (*v) = other.
array();
1163 valarray<size_t> sz(3), str(3);
1164 str[2] =
d1; str[1] =
d1d2; str[0] = 1;
1165 sz[2] =
d2; sz[1] =
d3; sz[0] = e-b+1;
1171 valarray<size_t> sz(3), str(3);
1172 str[2] =
d1; str[1] =
d1d2; str[0] = 1;
1173 sz[2] =
d2; sz[1] =
d3; sz[0] = e-b+1;
1179 valarray<size_t> sz(3), str(3);
1180 str[2] = 1; str[1] =
d1d2; str[0] =
d1;
1181 sz[2] =
d1; sz[1] =
d3; sz[0] = e-b+1;
1187 valarray<size_t> sz(3), str(3);
1188 str[2] = 1; str[1] =
d1d2; str[0] =
d1;
1189 sz[2] =
d1; sz[1] =
d3; sz[0] = e-b+1;
1195 valarray<size_t> sz(2), str(2);
1196 str[1] = 1; str[0] =
d1d2;
1197 sz[1] =
d1d2; sz[0] = e-b+1;
1203 valarray<size_t> sz(2), str(2);
1204 str[1] = 1; str[0] =
d1d2;
1205 sz[1] =
d1d2; sz[0] = e-b+1;
1213 valarray<size_t> sz(3), str(3);
1214 str[2] = 1; str[1] =
dim1(); str[0] =
d1d2;
1215 sz[2] = nx; sz[1] = ny; sz[0] = nz;
1222 valarray<size_t> sz(3), str(3);
1223 str[2] = 1; str[1] =
dim1(); str[0] =
d1d2;
1224 sz[2] = nx; sz[1] = ny; sz[0] = nz;
1239 if (
this != &other) {
1240 (*v) = other.
array();
1251 (*v) *= vmulti.
array();
1261 (*v) += vadd.
array();
1271 (*v) -= vmin.
array();
1279 for (
size_t j(0); j<
d1*
d2*
d3; j+=
d1 ){
1280 for (
size_t i(0); i<
d1; ++i ){
1281 (*v)[i+j] *= vmulti[i];
1289 for (
size_t k(0); k<
d3*
d2*
d1; k+=d1*
d2 ) {
1290 for (
size_t j(0); j<
d2; ++j ) {
1291 for (
size_t i(j*d1); i< (j+1)*d1; ++i ){
1292 (*v)[i+k] *= vmulti[j];
1301 for (
size_t k(0); k<
d3; ++k) {
1302 for (
size_t i(k*
d1*
d2); i< (k+1)*
d1*d2; ++i ){
1303 (*v)[i] *= vmulti[k];
1312 for (
size_t j(0); j <
d2*
d3; ++j ){
1313 for (
size_t i(j*
d1); i< (j+1)*d1; ++i ){
1314 (*v)[i] *= vd2d3.
array()[j];
1326 for(
long i(0); i<
d1*
d2*
d3-2; ++i) {
1327 (*v)[i] -= (*v)[i+2];
1329 for(
long i(
d1*
d2*d3-3); i>-1; --i) {
1330 (*v)[i+1] = (*v)[i];
1338 for(
long i(0); i<
d1*
d2*
d3-twod1; ++i) {
1339 (*v)[i] -= (*v)[i+twod1];
1341 for(
long i(
d1*
d2*
d3-twod1-1); i>-1; --i) {
1342 (*v)[i+
d1] = (*v)[i];
1349 long twod1d2 = 2*
d1d2;
1350 for(
long i(0); i<
d1*
d2*
d3-twod1d2; ++i) {
1351 (*v)[i] -= (*v)[i+twod1d2];
1353 for(
long i(
d1*
d2*
d3-twod1d2-1); i>-1; --i) {
1354 (*v)[i+
d1d2] = (*v)[i];
1362 for (
size_t j(0); j <
d2*
d3; ++j ){
1363 for (
size_t i(j*
d1); i< j*d1+N; ++i ){
1403 T& operator[](
size_t i);
1404 T operator[](
size_t i)
const;
1406 T& real(
size_t i,
size_t j,
size_t k);
1407 T real(
size_t i,
size_t j,
size_t k)
const;
1408 T& imag(
size_t i,
size_t j,
size_t k);
1409 T imag(
size_t i,
size_t j,
size_t k)
const;
1470 v =
new valarray<T>(2*
d1*
d2*
d3);
1481 v =
new valarray<T>(2*
d1*d2*
d3);
1482 (*v) = other.
array();
1522 valarray<size_t> sz(4), str(4);
1523 str[3] = 1, str[2] =
td1; str[1] =
td1d2; str[0] = 2;
1524 sz[3] = 2, sz[2] =
d2; sz[1] =
d3; sz[0] = e-b+1;
1530 valarray<size_t> sz(4), str(4);
1531 str[3] = 1, str[2] =
td1; str[1] =
td1d2; str[0] = 2;
1532 sz[3] = 2, sz[2] =
d2; sz[1] =
d3; sz[0] = e-b+1;
1538 valarray<size_t> sz(3), str(3);
1539 str[2] = 1; str[1] =
td1d2; str[0] =
td1;
1540 sz[2] =
td1; sz[1] =
d3; sz[0] = e-b+1;
1546 valarray<size_t> sz(3), str(3);
1547 str[2] = 1; str[1] =
td1d2; str[0] =
td1;
1548 sz[2] =
td1; sz[1] =
d3; sz[0] = e-b+1;
1554 valarray<size_t> sz(2), str(2);
1555 str[1] = 1; str[0] =
td1d2;
1556 sz[1] =
td1d2; sz[0] = e-b+1;
1562 valarray<size_t> sz(2), str(2);
1563 str[1] = 1; str[0] =
td1d2;
1564 sz[1] =
td1d2; sz[0] = e-b+1;
1572 valarray<size_t> sz(3), str(3);
1573 str[2] = 1; str[1] =
td1; str[0] =
td1d2;
1574 sz[2] = 2*nx; sz[1] = ny; sz[0] = nz;
1581 valarray<size_t> sz(3), str(3);
1582 str[2] = 1; str[1] =
td1; str[0] =
td1d2;
1583 sz[2] = 2*nx; sz[1] = ny; sz[0] = nz;
1592 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1599 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1601 (*v)[i+1] =c.imag();
1606 for (
size_t i(0); i<
d1*
d2*
d3; ++i) {
1607 (*v)[2*i] = other.
array()[i];
1613 if (
this != &other) {
1614 (*v) = other.
array();
1627 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1628 T vi((*
v)[i]*c.imag());
1629 (*v)[i] *= c.
real();
1630 (*v)[i] -= (*v)[i+1]*c.imag();
1631 (*v)[i+1] *= c.real();
1638 for (
size_t i(0); i<
d1*
d2*
d3; ++i) {
1639 (*v)[2*i] *= vmulti.
array()[i];
1640 (*v)[2*i+1] *= vmulti.
array()[i];
1646 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1647 T vi((*
v)[i] * vmulti.
array()[i+1]);
1648 (*v)[i] *= vmulti.
array()[i];
1649 (*v)[i] -= (*v)[i+1]*vmulti.
array()[i+1];
1650 (*v)[i+1] *= vmulti.
array()[i];
1659 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1666 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1668 (*v)[i+1] +=c.imag();
1674 for (
size_t i(0); i<
d1*
d2*
d3; ++i) {
1675 (*v)[2*i] += vadd.
array()[i];
1681 (*v) += vadd.
array();
1688 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1695 for (
size_t i(0); i<
td1*
d2*
d3; i+=2) {
1697 (*v)[i+1] -=c.imag();
1703 for (
size_t i(0); i<
d1*
d2*
d3; ++i) {
1704 (*v)[2*i] -= vmin.
array()[i];
1710 (*v) -= vmin.
array();
1720 for (
size_t i(0); i<
d1; ++i ){
1721 (*v)[2*i+j] *= vmulti[i];
1722 (*v)[2*i+1+j] *= vmulti[i];
1731 for (
size_t i(0); i<
d1; ++i ){
1732 T vi((*
v)[2*i+j]*vmulti[i].
imag());
1733 (*v)[2*i+j] *= vmulti[i].real();
1734 (*v)[2*i+j] -= (*v)[2*i+1+j] * vmulti[i].imag();
1735 (*v)[2*i+1+j] *= vmulti[i].real();
1736 (*v)[2*i+1+j] += vi;
1744 for (
size_t k(0); k<
d3*
d2*
td1; k+=td1*
d2 ) {
1745 for (
size_t j(0); j<
d2; ++j ) {
1746 for (
size_t i(j*td1); i< (j+1)*td1; ++i ){
1747 (*v)[i+k] *= vmulti[j];
1756 for (
size_t k(0); k<
d3*
d2*
td1; k+=td1*
d2 ) {
1757 for (
size_t j(0); j<
d2; ++j ) {
1758 for (
size_t i(j*td1); i< (j+1)*td1; i+=2 ){
1759 T vi((*
v)[i+k]* vmulti[j].
imag());
1760 (*v)[i+k] *= vmulti[j].real();
1761 (*v)[i+k] -= (*v)[i+k+1] * vmulti[j].imag();
1762 (*v)[i+k+1] *= vmulti[j].real();
1772 for (
size_t k(0); k<
d3; ++k) {
1773 for (
size_t i(k*
td1*
d2); i< (k+1)*
td1*d2; ++i ){
1774 (*v)[i] *= vmulti[k];
1782 for (
size_t k(0); k<
d3; ++k) {
1783 for (
size_t i(k*
td1*
d2); i< (k+1)*
td1*d2; i+=2 ){
1784 T vi((*
v)[i]* vmulti[k].
imag());
1785 (*v)[i] *= vmulti[k].real();
1786 (*v)[i] -= (*v)[i+1] * vmulti[k].imag();
1787 (*v)[i+1] *= vmulti[k].real();
1797 for (
size_t j(0); j <
d2*
d3; ++j ){
1798 for (
size_t i(j*
td1); i< (j+1)*td1; ++i ){
1799 (*v)[i] *= vd2d3.
array()[j];
1808 for (
size_t j(0); j <
d2*
d3; ++j ){
1809 for (
size_t i(j*
td1); i< (j+1)*td1; i+=2 ){
1810 T vi((*
v)[i]*vd2d3.
array()[2*j+1]);
1811 (*v)[i] *= vd2d3.
array()[2*j];
1812 (*v)[i] -= (*v)[i+1]*vd2d3.
array()[2*j+1];
1813 (*v)[i+1] *= vd2d3.
array()[2*j];
1824 for(
long i(0); i<
td1*
d2*
d3-4; ++i) {
1825 (*v)[i] -= (*v)[i+4];
1827 for(
long i(
td1*
d2*d3-5); i>-1; --i) {
1828 (*v)[i+2] = (*v)[i];
1835 long twotd1 = 2*
td1;
1836 for(
long i(0); i<
td1*
d2*
d3-twotd1; ++i) {
1837 (*v)[i] -= (*v)[i+twotd1];
1839 for(
long i(
td1*
d2*
d3-twotd1-1); i>-1; --i) {
1840 (*v)[i+
td1] = (*v)[i];
1847 long twotd1d2 = 2*
td1d2;
1848 for(
long i(0); i< long(
td1*
d2*
d3)-twotd1d2; ++i) {
1849 (*v)[i] -= (*v)[i+twotd1d2];
1851 for(
long i(
td1*
d2*d3-twotd1d2-1); i>-1; --i) {
1852 (*v)[i+
td1d2] = (*v)[i];
1860 for (
size_t j(0); j <
d2*
d3; ++j ){
1861 for (
size_t i(j*
td1); i< j*td1+2*N; ++i ){
1892 Array4D(
size_t x,
size_t y,
size_t z,
size_t w);
1897 size_t dim()
const {
return d1*d2*d3*d4;}
1905 T& operator()(
size_t i,
size_t j,
size_t k,
size_t l);
1906 T operator()(
size_t i,
size_t j,
size_t k,
size_t l)
const;
1907 T& operator()(
size_t i);
1908 T operator()(
size_t i)
const;
1917 GSlice_iter<T> SubArray4D(
size_t st,
size_t nx,
size_t ny,
size_t nz,
size_t nw);
1924 CGSlice_iter<T> SubArray4D(
size_t st,
size_t nx,
size_t ny,
size_t nz,
size_t nw)
const;
1940 Array4D& multid4(
const valarray<T>& vmulti);
1975 v =
new valarray<T>(
d1*d2*d3*
d4);
1976 (*v) = other.
array();
2015 valarray<size_t> sz(4), str(4);
2016 str[3] =
d1; str[2] =
d1d2; str[1] =
d1d2d3; str[0] = 1;
2017 sz[3] =
d2; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2023 valarray<size_t> sz(4), str(4);
2024 str[3] =
d1; str[2] =
d1d2; str[1] =
d1d2d3; str[0] = 1;
2025 sz[3] =
d2; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2031 valarray<size_t> sz(4), str(4);
2032 str[3] = 1; str[2] =
d1d2; str[1] =
d1d2d3; str[0] =
d1;
2033 sz[3] =
d1; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2039 valarray<size_t> sz(4), str(4);
2040 str[3] = 1; str[2] =
d1d2; str[1] =
d1d2d3; str[0] =
d1;
2041 sz[3] =
d1; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2047 valarray<size_t> sz(3), str(3);
2049 sz[2] =
d1d2; sz[1] =
d4; sz[0] = e-b+1;
2055 valarray<size_t> sz(3), str(3);
2057 sz[2] =
d1d2; sz[1] =
d4; sz[0] = e-b+1;
2063 valarray<size_t> sz(2), str(2);
2064 str[1] = 1; str[0] =
d1d2d3;
2065 sz[1] =
d1d2d3; sz[0] = e-b+1;
2071 valarray<size_t> sz(2), str(2);
2072 str[1] = 1; str[0] =
d1d2d3;
2073 sz[1] =
d1d2d3; sz[0] = e-b+1;
2082 valarray<size_t> sz(4), str(4);
2083 str[3] = 1; str[2] =
d1; str[1] =
d1d2; str[0] =
d1d2d3;
2084 sz[3] = nx; sz[2] = ny; sz[1] = nz; sz[0] = nw;
2091 valarray<size_t> sz(3), str(3);
2092 str[3] = 1; str[2] =
d1; str[1] =
d1d2; str[0] =
d1d2d3;
2093 sz[3] = nx; sz[2] = ny; sz[1] = nz; sz[0] = nw;
2108 if (
this != &other) {
2109 (*v) = other.
array();
2120 (*v) *= vmulti.
array();
2130 (*v) += vadd.
array();
2140 (*v) -= vmin.
array();
2149 for (
size_t j(0); j<
dim(); j+=
d1 ){
2150 for (
size_t i(0); i<
d1; ++i ){
2151 (*v)[i+j] *= vmulti[i];
2162 for (
size_t k(0); k<
dim(); k+=
d1*
d2 ) {
2163 for (
size_t j(0); j<
d2; ++j ) {
2164 for (
size_t i(j*
d1); i< (j+1)*d1; ++i ){
2165 (*v)[i+k] *= vmulti[j];
2177 for (
size_t l(0); l<
dim(); l+=
d1*
d2*
d3) {
2178 for (
size_t k(0); k<
d3; ++k) {
2179 for (
size_t i(k*
d1*
d2); i< (k+1)*
d1*d2; ++i ){
2180 (*v)[i+l] *= vmulti[k];
2192 for (
size_t k(0); k<
d4; ++k) {
2193 for (
size_t i(k*
d1*
d2*
d3); i< (k+1)*
d1*
d2*d3; ++i ){
2194 (*v)[i] *= vmulti[k];
2206 for (
size_t j(0); j <
d2*
d3*
d4; ++j ){
2207 for (
size_t i(j*
d1); i< (j+1)*d1; ++i ){
2208 (*v)[i] *= vd2d3d4.
array()[j];
2219 for(
long i(0); i<
dim()-2; ++i) {
2220 (*v)[i] -= (*v)[i+2];
2222 for(
long i(
dim()-3); i>-1; --i) {
2223 (*v)[i+1] = (*v)[i];
2231 for(
long i(0); i<
dim()-twod1; ++i) {
2232 (*v)[i] -= (*v)[i+twod1];
2234 for(
long i(
dim()-twod1-1); i>-1; --i) {
2235 (*v)[i+
d1] = (*v)[i];
2242 long twod1d2 = 2*
d1d2;
2243 for(
long i(0); i<
dim()-twod1d2; ++i) {
2244 (*v)[i] -= (*v)[i+twod1d2];
2246 for(
long i(
dim()-twod1d2-1); i>-1; --i) {
2247 (*v)[i+
d1d2] = (*v)[i];
2254 long twod1d2d3 = 2*
d1d2d3;
2255 for(
long i(0); i<
dim()-twod1d2d3; ++i) {
2256 (*v)[i] -= (*v)[i+twod1d2d3];
2258 for(
long i(
dim()-twod1d2d3-1); i>-1; --i) {
2259 (*v)[i+
d1d2d3] = (*v)[i];
2267 for (
size_t j(0); j <
d2*
d3*
d4; ++j ){
2268 for (
size_t i(j*
d1); i< j*d1+N; ++i ){
2307 size_t dim()
const {
return d1*d2*d3*
d4;}
2315 T& operator[](
size_t i);
2316 T operator[](
size_t i)
const;
2318 T& real(
size_t i,
size_t j,
size_t k,
size_t l);
2319 T real(
size_t i,
size_t j,
size_t k,
size_t l)
const;
2320 T& imag(
size_t i,
size_t j,
size_t k,
size_t l);
2321 T imag(
size_t i,
size_t j,
size_t k,
size_t l)
const;
2402 v =
new valarray<T>(2*
d1*d2*d3*
d4);
2403 (*v) = other.
array();
2444 valarray<size_t> sz(5), str(5);
2445 str[4] = 1, str[3] =
td1; str[2] =
td1d2; str[1] =
td1d2d3; str[0] = 2;
2446 sz[4] = 2, sz[3] =
d2; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2452 valarray<size_t> sz(5), str(5);
2453 str[4] = 1, str[3] =
td1; str[2] =
td1d2; str[1] =
td1d2d3; str[0] = 2;
2454 sz[4] = 2, sz[3] =
d2; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2460 valarray<size_t> sz(4), str(4);
2462 sz[3] =
td1; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2468 valarray<size_t> sz(4), str(4);
2470 sz[3] =
td1; sz[2] =
d3; sz[1] =
d4; sz[0] = e-b+1;
2476 valarray<size_t> sz(3), str(3);
2478 sz[2] =
td1d2; sz[1] =
d4; sz[0] = e-b+1;
2484 valarray<size_t> sz(3), str(3);
2486 sz[2] =
td1d2; sz[1] =
d4; sz[0] = e-b+1;
2492 valarray<size_t> sz(2), str(2);
2494 sz[1] =
td1d2d3; sz[0] = e-b+1;
2500 valarray<size_t> sz(2), str(2);
2502 sz[1] =
td1d2d3; sz[0] = e-b+1;
2511 SubArray4D(
size_t st,
size_t nx,
size_t ny,
size_t nz,
size_t nw){
2512 valarray<size_t> sz(4), str(4);
2514 sz[3] = 2*nx; sz[2] = ny; sz[1] = nz; sz[0] = nw;
2521 SubArray4D(
size_t st,
size_t nx,
size_t ny,
size_t nz,
size_t nw)
const{
2522 valarray<size_t> sz(4), str(4);
2524 sz[3] = 2*nx; sz[2] = ny; sz[1] = nz; sz[0] = nw;
2533 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2540 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2542 (*v)[i+1] =c.imag();
2547 for (
size_t i(0); i<
d1*
d2*
d3*
d4; ++i) {
2548 (*v)[2*i] = other.
array()[i];
2554 if (
this != &other) {
2555 (*v) = other.
array();
2568 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2569 T vi((*
v)[i]*c.imag());
2570 (*v)[i] *= c.
real();
2571 (*v)[i] -= (*v)[i+1]*c.imag();
2572 (*v)[i+1] *= c.real();
2579 for (
size_t i(0); i<
d1*
d2*
d3*
d4; ++i) {
2580 (*v)[2*i] *= vmulti.
array()[i];
2581 (*v)[2*i+1] *= vmulti.
array()[i];
2587 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2588 T vi((*
v)[i] * vmulti.
array()[i+1]);
2589 (*v)[i] *= vmulti.
array()[i];
2590 (*v)[i] -= (*v)[i+1]*vmulti.
array()[i+1];
2591 (*v)[i+1] *= vmulti.
array()[i];
2600 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2607 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2609 (*v)[i+1] +=c.imag();
2615 for (
size_t i(0); i<
d1*
d2*
d3*
d4; ++i) {
2616 (*v)[2*i] += vadd.
array()[i];
2622 (*v) += vadd.
array();
2629 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2636 for (
size_t i(0); i<
td1*
d2*
d3*
d4; i+=2) {
2638 (*v)[i+1] -=c.imag();
2644 for (
size_t i(0); i<
d1*
d2*
d3*
d4; ++i) {
2645 (*v)[2*i] -= vmin.
array()[i];
2651 (*v) -= vmin.
array();
2660 for (
size_t j(0); j< 2*
dim(); j+=
td1 ){
2661 for (
size_t i(0); i<
d1; ++i ){
2662 (*v)[2*i+j] *= vmulti[i];
2663 (*v)[2*i+1+j] *= vmulti[i];
2670 for (
size_t j(0); j< 2*
dim(); j+=
td1 ){
2671 for (
size_t i(0); i<
d1; ++i ){
2672 T vi((*
v)[2*i+j]*vmulti[i].
imag());
2673 (*v)[2*i+j] *= vmulti[i].real();
2674 (*v)[2*i+j] -= (*v)[2*i+1+j] * vmulti[i].imag();
2675 (*v)[2*i+1+j] *= vmulti[i].real();
2676 (*v)[2*i+1+j] += vi;
2684 for (
size_t k(0); k< 2*
dim(); k+=
td1*
d2 ) {
2685 for (
size_t j(0); j<
d2; ++j ) {
2686 for (
size_t i(j*
td1); i< (j+1)*td1; ++i ){
2687 (*v)[i+k] *= vmulti[j];
2695 for (
size_t k(0); k< 2*
dim(); k+=
td1*
d2 ) {
2696 for (
size_t j(0); j<
d2; ++j ) {
2697 for (
size_t i(j*
td1); i< (j+1)*td1; i+=2 ){
2698 T vi((*
v)[i+k]* vmulti[j].
imag());
2699 (*v)[i+k] *= vmulti[j].real();
2700 (*v)[i+k] -= (*v)[i+k+1] * vmulti[j].imag();
2701 (*v)[i+k+1] *= vmulti[j].real();
2711 for (
size_t l(0); l< 2*
dim(); l+=
td1*
d2*
d3) {
2712 for (
size_t k(0); k<
d3; ++k) {
2713 for (
size_t i(k*
td1*
d2); i< (k+1)*
td1*d2; ++i ){
2714 (*v)[i+l] *= vmulti[k];
2722 for (
size_t l(0); l< 2*
dim(); l+=
td1*
d2*
d3) {
2723 for (
size_t k(0); k<
d3; ++k) {
2724 for (
size_t i(k*
td1*
d2); i< (k+1)*
td1*d2; i+=2 ){
2725 T vi((*
v)[i+l]* vmulti[k].
imag());
2726 (*v)[i+l] *= vmulti[k].real();
2727 (*v)[i+l] -= (*v)[i+l+1] * vmulti[k].imag();
2728 (*v)[i+l+1] *= vmulti[k].real();
2738 for (
size_t k(0); k<
d4; ++k) {
2740 (*v)[i] *= vmulti[k];
2747 for (
size_t k(0); k<
d4; ++k) {
2748 for (
size_t i(k*
td1*
d2*
d3); i< (k+1)*
td1*
d2*d3; i+=2 ){
2749 T vi((*
v)[i]* vmulti[k].
imag());
2750 (*v)[i] *= vmulti[k].real();
2751 (*v)[i] -= (*v)[i+1] * vmulti[k].imag();
2752 (*v)[i+1] *= vmulti[k].real();
2762 for (
size_t j(0); j <
d2*
d3*
d4; ++j ){
2763 for (
size_t i(j*
td1); i< (j+1)*td1; ++i ){
2764 (*v)[i] *= vd2d3d4.
array()[j];
2773 for (
size_t j(0); j <
d2*
d3*
d4; ++j ){
2774 for (
size_t i(j*
td1); i< (j+1)*td1; i+=2 ){
2775 T vi((*
v)[i]*vd2d3d4.
array()[2*j+1]);
2776 (*v)[i] *= vd2d3d4.
array()[2*j];
2777 (*v)[i] -= (*v)[i+1]*vd2d3d4.
array()[2*j+1];
2778 (*v)[i+1] *= vd2d3d4.
array()[2*j];
2790 for(
long i(0); i< 2*
dim()-4; ++i) {
2791 (*v)[i] -= (*v)[i+4];
2793 for(
long i(2*
dim()-5); i>-1; --i) {
2794 (*v)[i+2] = (*v)[i];
2801 long twotd1 = 2*
td1;
2802 for(
long i(0); i< 2*
dim()-twotd1; ++i) {
2803 (*v)[i] -= (*v)[i+twotd1];
2805 for(
long i(2*
dim()-twotd1-1); i>-1; --i) {
2806 (*v)[i+
td1] = (*v)[i];
2813 long twotd1d2 = 2*
td1d2;
2814 for(
long i(0); i< 2*
dim()-twotd1d2; ++i) {
2815 (*v)[i] -= (*v)[i+twotd1d2];
2817 for(
long i(2*
dim()-twotd1d2-1); i>-1; --i) {
2818 (*v)[i+
td1d2] = (*v)[i];
2826 for(
long i(0); i< long(2*
dim())-twotd1d2d3; ++i) {
2827 (*v)[i] -= (*v)[i+twotd1d2d3];
2829 for(
long i(2*
dim()-twotd1d2d3-1); i>-1; --i) {
2838 for (
size_t j(0); j <
d2*
d3*
d4; ++j ){
2839 for (
size_t i(j*
td1); i< j*td1+2*N; ++i ){
Array4D_cmplx & multid4(const valarray< T > &vmulti)
Array4D & multid4(const valarray< T > &vmulti)
Array3D_cmplx & operator+=(const T &d)
friend bool operator!=(const CGSlice_iter &p, const CGSlice_iter &q)
GSlice_iter< T > d1c(size_t b, size_t e)
GSlice_iter< T > d4c(size_t b, size_t e)
valarray< T > & array() const
Array3D_cmplx & operator*=(const T &d)
CGSlice_iter & operator++()
Array4D & operator+=(const T &d)
GSlice_iter< T > d1c(size_t b, size_t e)
Array2D & operator-=(const T &d)
Array4D_cmplx & multid2(const valarray< T > &vmulti)
Array3D_cmplx & Filterd1(size_t N)
GSlice_iter< T > SubArray4D(size_t st, size_t nx, size_t ny, size_t nz, size_t nw)
Array4D & Filterd1(size_t N)
bool operator==(const GSlice_iter< T > &, const GSlice_iter< T > &)
GSlice_iter< T > d1c(size_t b, size_t e)
GSlice_iter< T > SubArray4D(size_t st, size_t nx, size_t ny, size_t nz, size_t nw)
GSlice_iter< T > d1c(size_t b, size_t e)
valarray< size_t > gsizes
Array2D & multid2(const valarray< T > &vmulti)
Array2D & multid1(const valarray< T > &vmulti)
GSlice_iter< T > d3c(size_t b, size_t e)
Array2D & operator*=(const T &d)
Array3D_cmplx(size_t x, size_t y, size_t z)
friend bool operator==(const GSlice_iter &p, const GSlice_iter &q)
GSlice_iter< T > d2c(size_t b, size_t e)
CGSlice_iter(valarray< T > *vv, gslice gss)
GSlice_iter< T > d2c(size_t b, size_t e)
GSlice_iter operator++(int)
Array4D_cmplx & operator=(const T &d)
Array4D & operator=(const T &d)
CGSlice_iter operator++(int)
Array3D_cmplx & multid2(const valarray< T > &vmulti)
GSlice_iter< T > d1c(size_t b, size_t e)
Array4D & multid2d3d4(const Array3D< T > &vd2d3d4)
GSlice_iter< T > d3c(size_t b, size_t e)
Array4D_cmplx(size_t x, size_t y, size_t z, size_t w)
Array3D & operator-=(const T &d)
Array4D & multid3(const valarray< T > &vmulti)
valarray< size_t > gsizes
Array4D & operator*=(const T &d)
Array4D & operator-=(const T &d)
T & imag(size_t i, size_t j)
Array2D(size_t x, size_t y)
const T & operator[](size_t i) const
valarray< T > & array() const
GSlice_iter< T > d2c(size_t b, size_t e)
Array4D & multid2(const valarray< T > &vmulti)
bool operator!=(const GSlice_iter< T > &, const GSlice_iter< T > &)
Array2D_cmplx & operator=(const T &d)
valarray< T > & array() const
valarray< T > & array() const
Array3D & multid2d3(const Array2D< T > &vd2d3)
Array4D(size_t x, size_t y, size_t z, size_t w)
T & operator()(size_t i, size_t j, size_t k, size_t l)
T & real(size_t i, size_t j, size_t k, size_t l)
valarray< T > & array() const
GSlice_iter< T > d3c(size_t b, size_t e)
Array3D_cmplx & operator=(const T &d)
Array2D_cmplx & multid1(const valarray< T > &vmulti)
Array4D_cmplx & operator+=(const T &d)
GSlice_iter< T > d2c(size_t b, size_t e)
GSlice_iter< T > SubArray3D(size_t st, size_t nx, size_t ny, size_t nz)
const T & operator()(size_t i) const
Array3D & multid3(const valarray< T > &vmulti)
T & operator()(size_t i, size_t j, size_t k)
Array4D_cmplx & multid1(const valarray< T > &vmulti)
friend bool operator!=(const GSlice_iter &p, const GSlice_iter &q)
Array3D_cmplx & multid2d3(const Array2D< T > &vd2d3)
Array3D & operator*=(const T &d)
Array2D_cmplx(size_t x, size_t y)
Array2D_cmplx & multid2(const valarray< T > &vmulti)
Array4D_cmplx & Filterd1(size_t N)
GSlice_iter< T > d3c(size_t b, size_t e)
valarray< T > & array() const
Array4D & multid1(const valarray< T > &vmulti)
GSlice_iter< T > SubArray2D(size_t st, size_t nx, size_t ny)
Array3D_cmplx & operator-=(const T &d)
Array2D_cmplx & Filterd1(size_t N)
Array2D_cmplx & operator*=(const T &d)
Array4D_cmplx & operator-=(const T &d)
GSlice_iter< T > SubArray2D(size_t st, size_t nx, size_t ny)
T & real(size_t i, size_t j)
GSlice_iter(valarray< T > *vv, gslice gss)
Array3D_cmplx & multid1(const valarray< T > &vmulti)
Array3D(size_t x, size_t y, size_t z)
friend bool operator==(const CGSlice_iter &p, const CGSlice_iter &q)
GSlice_iter< T > d4c(size_t b, size_t e)
Array3D & multid1(const valarray< T > &vmulti)
Array2D & Filterd1(size_t N)
Array4D_cmplx & multid3(const valarray< T > &vmulti)
Array4D_cmplx & multid2d3d4(const Array3D< T > &vd2d3d4)
const T & operator*() const
Array3D & multid2(const valarray< T > &vmulti)
Array3D_cmplx & multid3(const valarray< T > &vmulti)
const T & ref(size_t i) const
Array2D_cmplx & operator-=(const T &d)
GSlice_iter< T > SubArray3D(size_t st, size_t nx, size_t ny, size_t nz)
T & real(size_t i, size_t j, size_t k)
GSlice_iter< T > d2c(size_t b, size_t e)
T & operator()(size_t i, size_t j)
T & imag(size_t i, size_t j, size_t k, size_t l)
Array3D & operator=(const T &d)
GSlice_iter & operator++()
Array3D & operator+=(const T &d)
GSlice_iter< T > d1c(size_t b, size_t e)
Array4D_cmplx & operator*=(const T &d)
T & imag(size_t i, size_t j, size_t k)
Array2D & operator=(const T &d)
vector< T > d2c(size_t j)
Array3D & Filterd1(size_t N)
Array2D & operator+=(const T &d)
Array2D_cmplx & operator+=(const T &d)