hp2FEM
0.1
|
00001 #ifndef _MATRIX_H_ 00002 #define _MATRIX_H_ 00003 // --------------------------------------------- 00004 // company : 00005 // user : 00006 // date : 22 Mar 2015 17:21 00007 // file : Matrix.h 00008 // markers : Full 00009 // language : C++ 00010 // generator : Metamill 6.0 00011 // --------------------------------------------- 00012 00013 //#UBLK-BEG-HEADERH 00014 //============================================================== 00015 // Description : 00016 //-------------------------------------------------------------- 00017 // Author : Gilberto Luis 00018 // Created : 16 Dez 2010 00019 //-------------------------------------------------------------- 00020 // Change history : 00021 // 16 Dez 2010 (Gilberto Luis) Initial version generated 00022 // 00023 //============================================================== 00024 //#UBLK-END-HEADERH 00025 00026 /*================================================================================================= 00027 = = 00028 = Copyright 2010-2015 Marco Lucio Bittencourt / Fabiano Fernandes Bargos = 00029 = Gilberto Luis Valente / Jorge Luis Suzuki / Allan Patrick Cordeiro Dias = 00030 = = 00031 = Licensed under the Apache License, Version 2.0 (the "License"); = 00032 = you may not use this file except in compliance with the License. = 00033 = You may obtain a copy of the License at = 00034 = = 00035 = http://www.apache.org/licenses/LICENSE-2.0 = 00036 = = 00037 = Unless required by applicable law or agreed to in writing, software = 00038 = distributed under the License is distributed on an "AS IS" BASIS, = 00039 = WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. = 00040 = See the License for the specific language governing permissions and = 00041 = limitations under the License. = 00042 = = 00043 =================================================================================================*/ 00044 00045 00046 class SymmetricMatrix; 00047 00048 00049 #define SizeAttributesM 24 00050 #define SizeExtraMemM (ALIGNMENT - (SizeAttributesM % ALIGNMENT)) 00051 00052 00053 #include <cstdio> 00054 #include "DS_defs.h" 00055 #include "SymmetricMatrix.h" 00056 00057 00064 class Matrix 00065 { 00066 //#UBLK-BEG-CLASSDEF mm:629e3606-c4f4-11df-9da6-88402942916d 00067 //#UBLK-END-CLASSDEF 00068 00069 public: 00070 00071 // METHOD=mm:5f0ac0ec-c4f4-11df-9da6-88402942916d 00072 Matrix(); 00073 00074 // METHOD=mm:5f0ac0ed-c4f4-11df-9da6-88402942916d 00075 Matrix(unsigned long NumberLines, unsigned long NumberColumns, double InitValue = 0.0); 00076 00077 // METHOD=mm:5f0ac0ee-c4f4-11df-9da6-88402942916d 00078 Matrix(Matrix& Instance); 00079 00080 // METHOD=mm:5f0ac0ef-c4f4-11df-9da6-88402942916d 00081 Matrix(FILE* File); 00082 00083 // METHOD=mm:5dfb04f3-dd4f-11e0-9bb1-fbdee659cc27 00084 ~Matrix(); 00085 00086 // METHOD=mm:5f0ac0f5-c4f4-11df-9da6-88402942916d 00087 Matrix& operator=(Matrix& Instance); 00088 00089 // METHOD=mm:5f0ac0f6-c4f4-11df-9da6-88402942916d 00090 Matrix& Equal(Matrix& Instance); 00091 00092 // METHOD=mm:5f0ac0f7-c4f4-11df-9da6-88402942916d 00093 operator double * const(); 00094 00095 // METHOD=mm:5f0ac0f8-c4f4-11df-9da6-88402942916d 00096 double& operator()(long Row, long Column); 00097 00098 // METHOD=mm:5f0ac0f9-c4f4-11df-9da6-88402942916d 00099 double& GetElement(unsigned long Row, unsigned long Column); 00100 00101 // METHOD=mm:8875f1ab-0dcd-11e0-991f-babcb1a60f9f 00102 double& GetEndElement(); 00103 00104 // METHOD=mm:c35eea9b-0a05-11e0-8e8f-dbf83d4a9011 00105 void SetElement(long Row, long Column, double Element); 00106 00107 // METHOD=mm:5f0ac0fe-c4f4-11df-9da6-88402942916d 00108 void SetOrder(unsigned long NumberLines = 0, unsigned long NumberColumns = 0, double InitValue = 0.0); 00109 00110 // METHOD=mm:5f0ac0ff-c4f4-11df-9da6-88402942916d 00111 void GetOrder(unsigned long& NumberLines, unsigned long& NumberColumns); 00112 00113 // METHOD=mm:5f0ac100-c4f4-11df-9da6-88402942916d 00114 long GetNumberLines(); 00115 00116 // METHOD=mm:5f0ac101-c4f4-11df-9da6-88402942916d 00117 long GetNumberColumns(); 00118 00119 // METHOD=mm:5f0ac102-c4f4-11df-9da6-88402942916d 00120 unsigned long GetNumberElements(); 00121 00122 // METHOD=mm:5f0ac103-c4f4-11df-9da6-88402942916d 00123 long SizeOf(); 00124 00125 // METHOD=mm:5f0ac108-c4f4-11df-9da6-88402942916d 00126 void Reset(double Value = 0.0); 00127 00128 // METHOD=mm:5f0ac109-c4f4-11df-9da6-88402942916d 00129 void Identity(); 00130 00131 // METHOD=mm:5f0ac10a-c4f4-11df-9da6-88402942916d 00132 void Transpose(Matrix& Transpost); 00133 00134 // METHOD=mm:5f0ac10b-c4f4-11df-9da6-88402942916d 00135 void Insert(Matrix& SubMatrix, long InitLine = 0, long InitColumn = 0); 00136 00137 // METHOD=mm:5f0ac10c-c4f4-11df-9da6-88402942916d 00138 double Maximum(); 00139 00140 // METHOD=mm:5f0ac10d-c4f4-11df-9da6-88402942916d 00141 double Minimum(); 00142 00143 // METHOD=mm:5f0ac112-c4f4-11df-9da6-88402942916d 00144 double EuclideanNorm(); 00145 00146 // METHOD=mm:5b4516c3-b4a4-11e0-948c-88b1406d0184 00147 Matrix& Product(double* A, unsigned long N, double b = 1.0); 00148 00149 // METHOD=mm:5f0ac113-c4f4-11df-9da6-88402942916d 00150 double Norm1(); 00151 00152 // METHOD=mm:5f0ac114-c4f4-11df-9da6-88402942916d 00153 double NormInfinity(); 00154 00155 // METHOD=mm:5f0ac115-c4f4-11df-9da6-88402942916d 00156 Matrix& Chs(); 00157 00158 // METHOD=mm:5f0ac116-c4f4-11df-9da6-88402942916d 00159 Matrix& operator-(); 00160 00161 // METHOD=mm:5f0ac117-c4f4-11df-9da6-88402942916d 00162 Matrix& Add(Matrix& A, Matrix& B); 00163 00164 // METHOD=mm:5f0ac11c-c4f4-11df-9da6-88402942916d 00165 friend Matrix operator+(Matrix& A, Matrix& B); 00166 00167 // METHOD=mm:5f0ac11d-c4f4-11df-9da6-88402942916d 00168 Matrix& operator+=(Matrix& B); 00169 00170 // METHOD=mm:5f0ac11e-c4f4-11df-9da6-88402942916d 00171 Matrix& Add(Matrix& B); 00172 00173 // METHOD=mm:5f0ac11f-c4f4-11df-9da6-88402942916d 00174 Matrix& Subtract(Matrix& A, Matrix& B); 00175 00176 // METHOD=mm:5f0ac120-c4f4-11df-9da6-88402942916d 00177 friend Matrix operator-(Matrix& A, Matrix& B); 00178 00179 // METHOD=mm:5f0ac121-c4f4-11df-9da6-88402942916d 00180 Matrix& operator-=(Matrix& B); 00181 00182 // METHOD=mm:5f0ac126-c4f4-11df-9da6-88402942916d 00183 Matrix& Subtract(Matrix& B); 00184 00185 // METHOD=mm:5f0ac127-c4f4-11df-9da6-88402942916d 00186 Matrix& Add(double Scalar); 00187 00188 // METHOD=mm:5f0ac128-c4f4-11df-9da6-88402942916d 00189 Matrix& operator+=(double Scalar); 00190 00191 // METHOD=mm:5f0ac129-c4f4-11df-9da6-88402942916d 00192 Matrix& Subtract(double Scalar); 00193 00194 // METHOD=mm:5f0ac12a-c4f4-11df-9da6-88402942916d 00195 Matrix& operator-=(double Scalar); 00196 00197 // METHOD=mm:5f0ac12b-c4f4-11df-9da6-88402942916d 00198 Matrix& Multiplicate(double Scalar); 00199 00200 // METHOD=mm:5f0ac130-c4f4-11df-9da6-88402942916d 00201 Matrix& operator*=(double Scalar); 00202 00203 // METHOD=mm:5f0ac131-c4f4-11df-9da6-88402942916d 00204 double ScalarProduct(Matrix& B); 00205 00206 // METHOD=mm:f53fb377-0d39-11e0-960e-85a0a6aeef2e 00207 void TensorProduct(Matrix& A, Matrix& B); 00208 00209 // METHOD=mm:5f0ac132-c4f4-11df-9da6-88402942916d 00210 double operator^(Matrix& B); 00211 00212 // METHOD=mm:5f0ac133-c4f4-11df-9da6-88402942916d 00213 friend Matrix operator*(Matrix& A, Matrix& B); 00214 00215 // METHOD=mm:5f0ac134-c4f4-11df-9da6-88402942916d 00216 Matrix& Multiplicate(Matrix& A, Matrix& B); 00217 00218 // METHOD=mm:5f0ac135-c4f4-11df-9da6-88402942916d 00219 friend Matrix operator*(Matrix& A, SymmetricMatrix& B); 00220 00221 // METHOD=mm:5f0ac13a-c4f4-11df-9da6-88402942916d 00222 Matrix& Multiplicate(Matrix& A, SymmetricMatrix& B); 00223 00224 // METHOD=mm:5f0ac13b-c4f4-11df-9da6-88402942916d 00225 friend Matrix operator*(SymmetricMatrix& A, Matrix& B); 00226 00227 // METHOD=mm:5f0ac13c-c4f4-11df-9da6-88402942916d 00228 Matrix& Multiplicate(SymmetricMatrix& A, Matrix& B); 00229 00230 // METHOD=mm:5f0ac13d-c4f4-11df-9da6-88402942916d 00231 friend Matrix operator*(SymmetricMatrix& A, SymmetricMatrix& B); 00232 00233 // METHOD=mm:5f0ac13e-c4f4-11df-9da6-88402942916d 00234 Matrix& Multiplicate(SymmetricMatrix& A, SymmetricMatrix& B); 00235 00236 // METHOD=mm:5f0ac13f-c4f4-11df-9da6-88402942916d 00237 Matrix& TripleProduct(Matrix& A, Matrix& B); 00238 00239 // METHOD=mm:5f0ac144-c4f4-11df-9da6-88402942916d 00240 void Save(FILE* File); 00241 00242 // METHOD=mm:5f0ac145-c4f4-11df-9da6-88402942916d 00243 void Save(char* TabName, int Version, char* Filename); 00244 00245 // METHOD=mm:5f0ac146-c4f4-11df-9da6-88402942916d 00246 void Restore(FILE* File); 00247 00248 // METHOD=mm:5f0ac147-c4f4-11df-9da6-88402942916d 00249 void Restore(char* TabName, int Version, char* Filename); 00250 00251 // METHOD=mm:5f0ac148-c4f4-11df-9da6-88402942916d 00252 void Print(FILE* File, char* Title, char* Format); 00253 00254 // METHOD=mm:5f0ac149-c4f4-11df-9da6-88402942916d 00255 void Print(FILE* File = stdout, const char* Message = "", int NumMaxCols = 5, int Mant = 14, int Dec = 7); 00256 00257 // METHOD=mm:5f0ac14e-c4f4-11df-9da6-88402942916d 00258 void Free(); 00259 00260 // METHOD=mm:5f0ac14f-c4f4-11df-9da6-88402942916d 00261 void GaussSolver(double* U, double* B, double Precision); 00262 00263 // METHOD=mm:5f0ac150-c4f4-11df-9da6-88402942916d 00264 void GaussSolver(); 00265 00266 // METHOD=mm:5f0ac151-c4f4-11df-9da6-88402942916d 00267 void GaussSolver(double* U, double* B); 00268 00269 // METHOD=mm:5f0ac152-c4f4-11df-9da6-88402942916d 00270 void GaussSeidel(double* U, double* B, long MaxNumberIter, double Omega, double Precision = 1.0e-4, double RelaxFactor = 1.81, NormDS_E Norm = EUCLID); 00271 00272 00273 protected: 00274 00275 // METHOD=mm:5f0ac153-c4f4-11df-9da6-88402942916d 00276 void Alloc(double InitValue = 0.0); 00277 00278 // METHOD=mm:5f0ac158-c4f4-11df-9da6-88402942916d 00279 friend inline void Multiplicate(Matrix& A, SymmetricMatrix& B, Matrix& C); 00280 00281 // METHOD=mm:b3511349-d561-43ea-9a3e-172a7c405aed 00282 double scalv(double* x, double* y, unsigned long dim); 00283 00284 // METHOD=mm:96d04aca-6c60-4347-9216-2053a2f07022 00285 int mitgsl(double* vetx, double* ma, double* vetb, long neq, long itmax, double eps, double beta, int codconvg); 00286 00287 // METHOD=mm:ed2b7a2d-0610-473d-9551-8f966b75cb6d 00288 void prmatba(double* ma, double* mb, long nlina, long ncola, double* mc); 00289 00290 // METHOD=mm:335c6dda-d9f1-4c81-b52b-b43b1276e0eb 00291 int mgausst1(double* ma, unsigned long neq, long* step, long* vinfopiv, double* auxptr); 00292 00293 // METHOD=mm:2351935c-5016-4e7c-9d03-67e9e63e21a0 00294 void solgauss1(double* vetx, double* ma, double* vetb, long neq, long* vinfopiv); 00295 00296 00301 // attr=mm:5f0ac0e4-c4f4-11df-9da6-88402942916d 00302 int GaussFlag; 00303 00308 // attr=mm:5f0ac0e1-c4f4-11df-9da6-88402942916d 00309 unsigned long NumLines; 00310 00315 // attr=mm:5f0ac0e2-c4f4-11df-9da6-88402942916d 00316 unsigned long NumColumns; 00317 00321 // attr=mm:5f0ac0e5-c4f4-11df-9da6-88402942916d 00322 long* VInfoPiv; 00323 00327 // attr=mm:5f0ac0e3-c4f4-11df-9da6-88402942916d 00328 double* FMatrix; 00329 00333 // attr=mm:5f0ac0ea-c4f4-11df-9da6-88402942916d 00334 double* AuxPtr; 00335 00339 // attr=mm:fd20ebc9-344e-11e0-8e77-a21ed083ce8a 00340 char ExtraMemory[SizeExtraMemM]; 00341 00342 00343 private: 00344 00345 //#UBLK-BEG-CLASSMEMB mm:629e3606-c4f4-11df-9da6-88402942916d 00346 //#UBLK-END-CLASSMEMB 00347 }; 00348 00349 //#UBLK-BEG-GLOBALH 00350 //*** Removed methods: 21 Dez 2010 17:42 00351 //--- 00352 //uuid=mm:bc232d41-0c3f-11e0-9f76-cabf8e30fede 00353 // double& GetEndElement(); 00354 00355 //*** Removed methods: 21 Fev 2011 17:44 00356 //--- 00357 //uuid=mm:e6f59b69-3841-11e0-893c-fc4410c867b1 00358 // long SizeOfAttributes(); 00359 00360 //*** Removed methods: 23 Jul 2011 12:15 00361 //--- 00362 //uuid=mm:0acdc113-b4a4-11e0-948c-88b1406d0184 00363 // Matrix& TransposeProduct(Matrix& A); 00364 00365 //#UBLK-END-GLOBALH 00366 00367 00368 #endif // _MATRIX_H_