00001 #ifndef _MY_BlockMatrix_
00002 #define _MY_BlockMatrix_
00003 #include "dynamicbase.h"
00004 #include "orthomesh.h"
00005 #include "sfunctions.h"
00006 #include <lac/sparse_direct.h>
00007 #include <grid/tria.h>
00008 #include <lac/sparse_matrix.h>
00009 #include <lac/vector.h>
00010
00011 class BlockMatrixModule : public DynamicBase
00012 {
00013 private:
00014 SparsityPattern sp;
00015 SparseMatrix<double> M;
00016
00017 Matrix m_MSi,m_MHomSi;
00018 OrthoMesh &_mesh;
00019 unsigned _m;
00020 unsigned n_fracture_cells;
00021
00022 VecDouble _BcPcNew,_BcPcOld,_SwIntegral, _vPcInitial,rhs_Si, rhs_Sihom, Sol, Sol_hom, Sol_old, Sol_hom_old, sat_old;
00023 VecDouble Solution1, Solution2;
00024 double _dt, _dx, _dy, _dz;
00025 double _Bx;
00026 VecDouble _vPor;
00027 VecDouble _vK;
00028 Function1D &_fdpc, &_fpcinv, &_fmobt, &_fmobrW;
00029
00030 protected:
00031
00032 void create_bases_functions(double bc_pc, const VecDouble &previous_sw, const VecDouble &previous_si, double por, double k, VecDouble &newSi, VecDouble &newHomSi);
00033 void buildSparsityPattern();
00034 void assembleSystem(const VecDouble &Sol_old, const VecDouble &sat_old, double _k, double _por, double _pc_bc, double dt);
00035 void Sol_Si();
00036 void Sol_Sihom();
00037
00038 public:
00039 BlockMatrixModule(OrthoMesh &mesh, unsigned n_fracture_cell, VecDouble &vPcInitial, VecDouble &vPor, VecDouble &k, Function1D &dfpc ,Function1D &fpcinv, Function1D &fmobt, Function1D &fmobrW);
00040
00041
00042 void construct_bases(VecDouble &bc_pc, double dt);
00043
00044 double get_source(unsigned blockId, double new_bc_pc);
00045
00046 ~BlockMatrixModule(){}
00047 virtual void iterate(TransportBase &trans);
00048 virtual void printOutput(){}
00049
00050 };
00051
00052 #endif