hp2FEM  0.1
include/ds/SymmetricMatrix.h
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_
 All Classes Files Functions Variables Typedefs Friends Defines