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