00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef TNT_FORTRAN_ARRAY3D_UTILS_H
00022 #define TNT_FORTRAN_ARRAY3D_UTILS_H
00023
00024 #include <cstdlib>
00025 #include <cassert>
00026
00027 namespace TNT
00028 {
00029
00030
00031 template <class T>
00032 std::ostream& operator<<(std::ostream &s, const Fortran_Array3D<T> &A)
00033 {
00034 int M=A.dim1();
00035 int N=A.dim2();
00036 int K=A.dim3();
00037
00038 s << M << " " << N << " " << K << "\n";
00039
00040 for (int i=1; i<=M; i++)
00041 {
00042 for (int j=1; j<=N; j++)
00043 {
00044 for (int k=1; k<=K; k++)
00045 s << A(i,j,k) << " ";
00046 s << "\n";
00047 }
00048 s << "\n";
00049 }
00050
00051
00052 return s;
00053 }
00054
00055 template <class T>
00056 std::istream& operator>>(std::istream &s, Fortran_Array3D<T> &A)
00057 {
00058
00059 int M, N, K;
00060
00061 s >> M >> N >> K;
00062
00063 Fortran_Array3D<T> B(M,N,K);
00064
00065 for (int i=1; i<=M; i++)
00066 for (int j=1; j<=N; j++)
00067 for (int k=1; k<=K; k++)
00068 s >> B(i,j,k);
00069
00070 A = B;
00071 return s;
00072 }
00073
00074
00075 template <class T>
00076 Fortran_Array3D<T> operator+(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00077 {
00078 int m = A.dim1();
00079 int n = A.dim2();
00080 int p = A.dim3();
00081
00082 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00083 return Fortran_Array3D<T>();
00084
00085 else
00086 {
00087 Fortran_Array3D<T> C(m,n,p);
00088
00089 for (int i=1; i<=m; i++)
00090 for (int j=1; j<=n; j++)
00091 for (int k=1; k<=p; k++)
00092 C(i,j,k) = A(i,j,k)+ B(i,j,k);
00093
00094 return C;
00095 }
00096 }
00097
00098
00099 template <class T>
00100 Fortran_Array3D<T> operator-(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00101 {
00102 int m = A.dim1();
00103 int n = A.dim2();
00104 int p = A.dim3();
00105
00106 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00107 return Fortran_Array3D<T>();
00108
00109 else
00110 {
00111 Fortran_Array3D<T> C(m,n,p);
00112
00113 for (int i=1; i<=m; i++)
00114 for (int j=1; j<=n; j++)
00115 for (int k=1; k<=p; k++)
00116 C(i,j,k) = A(i,j,k)- B(i,j,k);
00117
00118 return C;
00119 }
00120 }
00121
00122
00123 template <class T>
00124 Fortran_Array3D<T> operator*(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00125 {
00126 int m = A.dim1();
00127 int n = A.dim2();
00128 int p = A.dim3();
00129
00130 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00131 return Fortran_Array3D<T>();
00132
00133 else
00134 {
00135 Fortran_Array3D<T> C(m,n,p);
00136
00137 for (int i=1; i<=m; i++)
00138 for (int j=1; j<=n; j++)
00139 for (int k=1; k<=p; k++)
00140 C(i,j,k) = A(i,j,k)* B(i,j,k);
00141
00142 return C;
00143 }
00144 }
00145
00146
00147 template <class T>
00148 Fortran_Array3D<T> operator/(const Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00149 {
00150 int m = A.dim1();
00151 int n = A.dim2();
00152 int p = A.dim3();
00153
00154 if (B.dim1() != m || B.dim2() != n || B.dim3() != p )
00155 return Fortran_Array3D<T>();
00156
00157 else
00158 {
00159 Fortran_Array3D<T> C(m,n,p);
00160
00161 for (int i=1; i<=m; i++)
00162 for (int j=1; j<=n; j++)
00163 for (int k=1; k<=p; k++)
00164 C(i,j,k) = A(i,j,k)/ B(i,j,k);
00165
00166 return C;
00167 }
00168 }
00169
00170
00171 template <class T>
00172 Fortran_Array3D<T>& operator+=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00173 {
00174 int m = A.dim1();
00175 int n = A.dim2();
00176 int p = A.dim3();
00177
00178 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00179 {
00180 for (int i=1; i<=m; i++)
00181 for (int j=1; j<=n; j++)
00182 for (int k=1; k<=p; k++)
00183 A(i,j,k) += B(i,j,k);
00184 }
00185
00186 return A;
00187 }
00188
00189
00190 template <class T>
00191 Fortran_Array3D<T>& operator-=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00192 {
00193 int m = A.dim1();
00194 int n = A.dim2();
00195 int p = A.dim3();
00196
00197 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00198 {
00199 for (int i=1; i<=m; i++)
00200 for (int j=1; j<=n; j++)
00201 for (int k=1; k<=p; k++)
00202 A(i,j,k) -= B(i,j,k);
00203 }
00204
00205 return A;
00206 }
00207
00208
00209 template <class T>
00210 Fortran_Array3D<T>& operator*=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00211 {
00212 int m = A.dim1();
00213 int n = A.dim2();
00214 int p = A.dim3();
00215
00216 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00217 {
00218 for (int i=1; i<=m; i++)
00219 for (int j=1; j<=n; j++)
00220 for (int k=1; k<=p; k++)
00221 A(i,j,k) *= B(i,j,k);
00222 }
00223
00224 return A;
00225 }
00226
00227
00228 template <class T>
00229 Fortran_Array3D<T>& operator/=(Fortran_Array3D<T> &A, const Fortran_Array3D<T> &B)
00230 {
00231 int m = A.dim1();
00232 int n = A.dim2();
00233 int p = A.dim3();
00234
00235 if (B.dim1() == m && B.dim2() == n && B.dim3() == p )
00236 {
00237 for (int i=1; i<=m; i++)
00238 for (int j=1; j<=n; j++)
00239 for (int k=1; k<=p; k++)
00240 A(i,j,k) /= B(i,j,k);
00241 }
00242
00243 return A;
00244 }
00245
00246
00247 }
00248
00249 #endif