hp2FEM
0.1
|
00001 #ifndef _SYMMETRICMATRIX_H_ 00002 #define _SYMMETRICMATRIX_H_ 00003 // --------------------------------------------- 00004 // company : 00005 // user : 00006 // date : 22 Mar 2015 17:21 00007 // file : SymmetricMatrix.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 Matrix; 00047 00048 00049 #define SizeAttributesSM 28 00050 #define SizeExtraMemSM (ALIGNMENT - (SizeAttributesSM % ALIGNMENT)) 00051 00052 00053 #include <cstdio> 00054 #include "acdp/matematc.h" 00055 #include "ds/DS_defs.h" 00056 #include "ds/Matrix.h" 00057 00058 00063 class SymmetricMatrix 00064 { 00065 //#UBLK-BEG-CLASSDEF mm:73e74e16-c4f4-11df-9da6-88402942916d 00066 //#UBLK-END-CLASSDEF 00067 00068 public: 00069 00070 // METHOD=mm:7053b843-c4f4-11df-9da6-88402942916d 00071 SymmetricMatrix(); 00072 00073 // METHOD=mm:7053b848-c4f4-11df-9da6-88402942916d 00074 SymmetricMatrix(long MatrixOrder, double InitValue = 0.0); 00075 00076 // METHOD=mm:7053b849-c4f4-11df-9da6-88402942916d 00077 SymmetricMatrix(FILE* File); 00078 00079 // METHOD=mm:7053b84a-c4f4-11df-9da6-88402942916d 00080 SymmetricMatrix(SymmetricMatrix& Instance); 00081 00082 // METHOD=mm:7053b84b-c4f4-11df-9da6-88402942916d 00083 ~SymmetricMatrix(); 00084 00085 // METHOD=mm:7053b84c-c4f4-11df-9da6-88402942916d 00086 SymmetricMatrix& operator=(SymmetricMatrix& Instance); 00087 00088 // METHOD=mm:7053b84d-c4f4-11df-9da6-88402942916d 00089 SymmetricMatrix& Equal(SymmetricMatrix& Instance); 00090 00091 // METHOD=mm:7053b852-c4f4-11df-9da6-88402942916d 00092 operator double* const(); 00093 00094 // METHOD=mm:7053b853-c4f4-11df-9da6-88402942916d 00095 double& operator()(long Row, long Col); 00096 00097 // METHOD=mm:7053b854-c4f4-11df-9da6-88402942916d 00098 double& GetElement(unsigned long Row, unsigned long Column); 00099 00100 // METHOD=mm:7053b855-c4f4-11df-9da6-88402942916d 00101 void SetOrder(unsigned long MatrixOrder = 0, double InitValue = 0.0); 00102 00103 // METHOD=mm:7053b856-c4f4-11df-9da6-88402942916d 00104 unsigned long GetOrder(); 00105 00106 // METHOD=mm:7053b857-c4f4-11df-9da6-88402942916d 00107 unsigned long GetNumberElements(); 00108 00109 // METHOD=mm:7053b85c-c4f4-11df-9da6-88402942916d 00110 long SizeOf(); 00111 00112 // METHOD=mm:7053b85d-c4f4-11df-9da6-88402942916d 00113 void Reset(double Value = 0.0); 00114 00115 // METHOD=mm:a041e7b5-8cfc-48d5-905a-b919489cbfa4 00116 void Reset(unsigned long NumEls, double Value = 0.0); 00117 00118 // METHOD=mm:7053b85e-c4f4-11df-9da6-88402942916d 00119 void Identity(); 00120 00121 // METHOD=mm:7053b85f-c4f4-11df-9da6-88402942916d 00122 void Insert(SymmetricMatrix& SubMatrix, long InitLine = 0, long InitColumn = 0); 00123 00124 // METHOD=mm:7053b860-c4f4-11df-9da6-88402942916d 00125 double Maximum(); 00126 00127 // METHOD=mm:7053b861-c4f4-11df-9da6-88402942916d 00128 double Minimum(); 00129 00130 // METHOD=mm:7053b866-c4f4-11df-9da6-88402942916d 00131 double EuclideanNorm(); 00132 00133 // METHOD=mm:5b142dff-c9c2-11e0-952b-da8bfa8c82f2 00134 void Product(double* A, unsigned long N, double b = 1.0); 00135 00136 // METHOD=mm:7053b867-c4f4-11df-9da6-88402942916d 00137 double OneNorm(); 00138 00139 // METHOD=mm:7053b868-c4f4-11df-9da6-88402942916d 00140 double InfinityNorm(); 00141 00142 // METHOD=mm:7053b869-c4f4-11df-9da6-88402942916d 00143 SymmetricMatrix& Chs(); 00144 00145 // METHOD=mm:7053b86a-c4f4-11df-9da6-88402942916d 00146 SymmetricMatrix& operator-(); 00147 00148 // METHOD=mm:7053b86b-c4f4-11df-9da6-88402942916d 00149 friend SymmetricMatrix operator+(SymmetricMatrix& A, SymmetricMatrix& B); 00150 00151 // METHOD=mm:7053b870-c4f4-11df-9da6-88402942916d 00152 SymmetricMatrix& Add(SymmetricMatrix& A, SymmetricMatrix& B); 00153 00154 // METHOD=mm:7053b871-c4f4-11df-9da6-88402942916d 00155 SymmetricMatrix& operator+=(SymmetricMatrix& B); 00156 00157 // METHOD=mm:7053b872-c4f4-11df-9da6-88402942916d 00158 SymmetricMatrix& Add(SymmetricMatrix& B); 00159 00160 // METHOD=mm:e6c436de-f1f2-4cf1-ad6b-66a470ea900d 00161 SymmetricMatrix& Add(SymmetricMatrix& B, unsigned long NumEls); 00162 00163 // METHOD=mm:69efb8d2-cc70-4abc-9ac4-5cee706bd3d2 00164 void AddMultiplicate(SymmetricMatrix& B, double scalar, unsigned long NumEls); 00165 00166 // METHOD=mm:7053b873-c4f4-11df-9da6-88402942916d 00167 friend SymmetricMatrix operator-(SymmetricMatrix& A, SymmetricMatrix& B); 00168 00169 // METHOD=mm:7053b874-c4f4-11df-9da6-88402942916d 00170 SymmetricMatrix& Subtract(SymmetricMatrix& A, SymmetricMatrix& B); 00171 00172 // METHOD=mm:7053b875-c4f4-11df-9da6-88402942916d 00173 SymmetricMatrix& operator-=(SymmetricMatrix& B); 00174 00175 // METHOD=mm:7053b87a-c4f4-11df-9da6-88402942916d 00176 SymmetricMatrix& Subtract(SymmetricMatrix& B); 00177 00178 // METHOD=mm:7053b87b-c4f4-11df-9da6-88402942916d 00179 SymmetricMatrix& Add(double Scalar); 00180 00181 // METHOD=mm:7053b87c-c4f4-11df-9da6-88402942916d 00182 SymmetricMatrix& operator+=(double Scalar); 00183 00184 // METHOD=mm:7053b87d-c4f4-11df-9da6-88402942916d 00185 SymmetricMatrix& Subtract(double Scalar); 00186 00187 // METHOD=mm:7053b87e-c4f4-11df-9da6-88402942916d 00188 SymmetricMatrix& operator-=(double Scalar); 00189 00190 // METHOD=mm:7053b87f-c4f4-11df-9da6-88402942916d 00191 SymmetricMatrix& operator*=(double Scalar); 00192 00193 // METHOD=mm:7053b884-c4f4-11df-9da6-88402942916d 00194 SymmetricMatrix& Multiplicate(double Scalar); 00195 00196 // METHOD=mm:7053b885-c4f4-11df-9da6-88402942916d 00197 void Multiplicate(double* X, double* Y); 00198 00199 // METHOD=mm:c934d080-86f6-41af-9deb-7978ecaebec6 00200 void Multiplicate(double* X, unsigned long Size, double* Y); 00201 00202 // METHOD=mm:036711fa-3a57-478a-91d3-91c641f7ef28 00203 void Multiplicate(double* A, unsigned long nlA, unsigned long ncA, double* B, unsigned long nlB, unsigned long ncB); 00204 00205 // METHOD=mm:7053b886-c4f4-11df-9da6-88402942916d 00206 void TripleProduct(Matrix& A, SymmetricMatrix& B); 00207 00208 // METHOD=mm:4463039a-b9cd-4329-9350-ad32a51189a9 00209 void TripleProduct(double* A, unsigned short NlinesA, unsigned short NcolsA, SymmetricMatrix& B); 00210 00211 // METHOD=mm:7053b887-c4f4-11df-9da6-88402942916d 00212 double ScalarProduct(SymmetricMatrix& B); 00213 00214 // METHOD=mm:7053b888-c4f4-11df-9da6-88402942916d 00215 double operator^(SymmetricMatrix& B); 00216 00217 // METHOD=mm:7053b889-c4f4-11df-9da6-88402942916d 00218 void Save(FILE* File); 00219 00220 // METHOD=mm:7053b88e-c4f4-11df-9da6-88402942916d 00221 void Save(char* Tabname, int Version, char* Filename); 00222 00223 // METHOD=mm:7053b88f-c4f4-11df-9da6-88402942916d 00224 void Restore(FILE* File); 00225 00226 // METHOD=mm:7053b890-c4f4-11df-9da6-88402942916d 00227 void Restore(char* Tabname, int Version, char* Filename); 00228 00229 // METHOD=mm:7053b891-c4f4-11df-9da6-88402942916d 00230 void Print(FILE* File, char* Title, char* Format); 00231 00232 // METHOD=mm:7053b892-c4f4-11df-9da6-88402942916d 00233 void Print(FILE* File = stdout, const char* Message = "", int NumMaxCols = 5, int Mant = 14, int Dec = 7); 00234 00235 // METHOD=mm:7053b893-c4f4-11df-9da6-88402942916d 00236 void Print(FILE* File, int Mant, int Dec); 00237 00238 // METHOD=mm:7053b898-c4f4-11df-9da6-88402942916d 00239 void Free(); 00240 00241 // METHOD=mm:7053b899-c4f4-11df-9da6-88402942916d 00242 void GaussSolver(double* U, double* B, double Precision); 00243 00244 // METHOD=mm:7053b89a-c4f4-11df-9da6-88402942916d 00245 void GaussSolver(); 00246 00247 // METHOD=mm:7053b89b-c4f4-11df-9da6-88402942916d 00248 void GaussSolver(double* U, double* B); 00249 00250 // METHOD=mm:7053b89c-c4f4-11df-9da6-88402942916d 00251 long Jacobi(double* U, double* B, long NumberIterations, double& NormRes, double Precision = 1e-4, ConvCriterion_E Crit = WEIGHT_RESIDUE, NormDS_E Norm = EUCLID); 00252 00253 // METHOD=mm:914ecc0d-4659-4746-adac-481fc2560bc2 00254 void EigJacobi(SymmetricMatrix& B, double tol, SymmetricMatrix& eigv, Matrix& eigvec); 00255 00256 // METHOD=mm:7053b89d-c4f4-11df-9da6-88402942916d 00257 long GaussSeidel(double* U, double* B, long NumberIterations, double& NormRes, double Precision = 1e-4, ConvCriterion_E Crit = WEIGHT_RESIDUE, NormDS_E Norm = EUCLID); 00258 00259 // METHOD=mm:7053b8a2-c4f4-11df-9da6-88402942916d 00260 long SOR(double* U, double* B, long NumberIterations, double& NormRes, double Precision = 1e-4, double Omega = 1.81, ConvCriterion_E Crit = WEIGHT_RESIDUE, NormDS_E Norm = EUCLID); 00261 00262 // METHOD=mm:7053b8a3-c4f4-11df-9da6-88402942916d 00263 long CG(double* U, double* B, long MaxNumberIter, double& NormRes, double Precision = 1e-4, ConvCriterion_E Crit = WEIGHT_RESIDUE, NormDS_E Norm = EUCLID); 00264 00265 // METHOD=mm:7053b8a4-c4f4-11df-9da6-88402942916d 00266 long CGDiagonal(double* U, double* B, long MaxNumberIter, double& NormRes, double Precision = 1e-4, ConvCriterion_E Crit = WEIGHT_RESIDUE, NormDS_E Norm = EUCLID); 00267 00268 // METHOD=mm:7053b8a5-c4f4-11df-9da6-88402942916d 00269 long CGPreConditionated(double* U, double* B, long MaxNumberIter, double& NormRes, double Precision = 1e-4, double Omega = 1.81, PreMatrix_E PreMatrix = SGS, ConvCriterion_E Crit = WEIGHT_RESIDUE, NormDS_E Norm = EUCLID); 00270 00271 00272 protected: 00273 00274 // METHOD=mm:7053b836-c4f4-11df-9da6-88402942916d 00275 void FreeAuxVectors(); 00276 00277 // METHOD=mm:7053b837-c4f4-11df-9da6-88402942916d 00278 void Alloc(double InitValue = 0.0); 00279 00280 // METHOD=mm:7053b838-c4f4-11df-9da6-88402942916d 00281 friend void Multiplicate(Matrix& A, SymmetricMatrix& B, Matrix& C); 00282 00283 // METHOD=mm:7053b839-c4f4-11df-9da6-88402942916d 00284 int ConvCriteria(double* U, double* Un, double* b, double Prec, double Normb, ConvCriterion_E Crit, NormDS_E Norm, double& NormRes); 00285 00286 // METHOD=mm:7053b83e-c4f4-11df-9da6-88402942916d 00287 void praux(double* vetb, double* vetx); 00288 00289 // METHOD=mm:7053b83f-c4f4-11df-9da6-88402942916d 00290 void fwdsubst(double* vetx, double* vetb, double omega); 00291 00292 // METHOD=mm:7053b840-c4f4-11df-9da6-88402942916d 00293 void prodaux(double* U, double* Y, double cte); 00294 00295 // METHOD=mm:7053b841-c4f4-11df-9da6-88402942916d 00296 void bcksubst(double* vetx, double* vetb, double omega); 00297 00298 // METHOD=mm:7053b842-c4f4-11df-9da6-88402942916d 00299 void prodfx(double* z, double* x, double Omega); 00300 00301 // METHOD=mm:67847220-da91-41fc-ab0d-3004d8a01271 00302 double norinfv(double* u, long dim); 00303 00304 // METHOD=mm:6c42e25e-9904-4829-b270-7ba46c2cdd49 00305 double scalv(double* x, double* y, unsigned long dim); 00306 00307 // METHOD=mm:cc7567f7-633c-49e0-a669-e53b0c64df43 00308 double normaev(double* u, long dim); 00309 00310 // METHOD=mm:c38ba932-9b75-4ff4-befd-6b96746f7b59 00311 int mgausimt(double* mas, long neq, long* step); 00312 00313 // METHOD=mm:f1ad9249-1397-4d06-b372-2f1acb048b5b 00314 void pmatbsa(double* mcs, double* ma, long nlina, long ncola, double* mbs); 00315 00316 // METHOD=mm:8273a4c4-56da-4d00-9901-2a6a9e1cd3dc 00317 void promabs(double* mc, double* ma, double* mbs, long nlina, long ncola); 00318 00319 // METHOD=mm:45a0369c-f976-4e4b-ad59-0da92419c04e 00320 void solgasim(double* vetx, double* mas, double* vetb, long int neq); 00321 00322 00326 // attr=mm:7053b82b-c4f4-11df-9da6-88402942916d 00327 unsigned long PolyOrder; 00328 00333 // attr=mm:7053b82e-c4f4-11df-9da6-88402942916d 00334 double* d; 00335 00339 // attr=mm:7053b82f-c4f4-11df-9da6-88402942916d 00340 double* f; 00341 00345 // attr=mm:7053b834-c4f4-11df-9da6-88402942916d 00346 double* g; 00347 00351 // attr=mm:7053b835-c4f4-11df-9da6-88402942916d 00352 double* h; 00353 00357 // attr=mm:7053b82d-c4f4-11df-9da6-88402942916d 00358 double* SMatrix; 00359 00363 // attr=mm:7053b82c-c4f4-11df-9da6-88402942916d 00364 DoublePtr_T* PSLines; 00365 00369 // attr=mm:54b3d705-3866-11e0-893c-fc4410c867b1 00370 char ExtraMemory[SizeExtraMemSM]; 00371 00372 00373 private: 00374 00375 // METHOD=mm:639488c7-38f3-11e0-8edb-aca828ea8a14 00376 long SizeOfAttributes(); 00377 00378 00379 //#UBLK-BEG-CLASSMEMB mm:73e74e16-c4f4-11df-9da6-88402942916d 00380 //#UBLK-END-CLASSMEMB 00381 }; 00382 00383 //#UBLK-BEG-GLOBALH 00384 //*** Removed methods: 17 Jan 2012 15:08 00385 //--- 00386 //uuid=mm:51a4cda9-4dc8-49d1-8ca4-090526094cc9 00387 // void prmatba(double* ma, double* mb, long nlina, long ncola, double* mc); 00388 00389 //*** Removed methods: 24 Jan 2012 17:02 00390 //--- 00391 //uuid=mm:eaed1dd4-a20e-4bdd-be5f-da6ef24abb2a 00392 // friend Matrix& operator*(Matrix& A, SymmetricMatrix& B); 00393 00394 //#UBLK-END-GLOBALH 00395 00396 00397 #endif // _SYMMETRICMATRIX_H_