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