00001 #ifndef _MY_HybridPressionModuleMPI_ 00002 #define _MY_HybridPressionModuleMPI_ 00003 #include "hybridpressionmodule.h" 00004 00005 00018 class HybridPressionModuleMPI : public HybridPressionModule 00019 { 00020 protected: 00021 std::ostream &m_out; 00022 VecIndex fLeftBCRcvMap; 00023 VecIndex fRightBCRcvMap; 00024 VecIndex fLeftBCSndMap; 00025 VecIndex fRightBCSndMap; 00026 void setCommunication(); 00027 void checkBC(Function3D &fPrescribedVelocities, Function3D &fPrescribedPression); 00028 int m_meshOverlap; 00029 double m_xSize; 00030 double m_b; 00031 double m_theta; 00032 unsigned m_itCnt; 00033 VecDouble m_RHS; 00034 VecDouble m_solPrev; 00039 VecDouble BL_Snd,BL_Rcv,BR_Snd,BR_Rcv; 00046 VecDouble RBC_Snd,RBC_Rcv,LBC_Snd,LBC_Rcv,RBC_Prev,LBC_Prev; 00049 VecDouble m_vTol; 00050 double m_max_tol; 00051 protected: 00052 void exchangeData(VecDouble &lSnd,VecDouble &lRcv,VecDouble &rSnd,VecDouble &rRcv); 00053 00054 void getBParameter(VecDouble &vB, const VecDouble &K,const VecDouble &S1,Function1D &fMobT,const VecIndex &fI); 00055 void addRobinBC(const VecDouble &v1,const VecDouble &pB,const VecIndex &fI, const VecDouble &vK,const VecDouble &S1,Function1D &fMobT,VecDouble &vRHS); 00056 void addRobinBC(const VecDouble &pB,const VecIndex &fI, const VecDouble &vK,const VecDouble &S1,Function1D &fMobT,SparseMatrix<double> &A); 00057 void getRobinBC(VecDouble &vRobin,const VecDouble &K,const VecDouble &vP,const VecDouble &S1,Function1D &fMobT,const VecIndex &fI,bool bNegateB); 00058 00059 virtual void iterateRed(TransportBase &trans); 00060 virtual void iterateBlack(TransportBase &trans); 00061 00062 void assemblySystem(TransportBase &trans,SparseMatrix<double> &A,VecDouble &B,VecDouble &K,const VecDouble &S1, Function1D &fMobT, FunctionOfCellFields &fMobGrav); 00063 int checkConvergence(double tol); 00064 00065 void getNormalVelocitiesFromPressure(VecDouble &Vq,const VecDouble &K,const VecDouble &vP,const VecDouble &S1,Function1D &fMobT,FunctionOfCellFields &fMobGrav,const VecDouble &LRobinBC,const VecDouble &RRobinBC); 00066 00067 00068 virtual void initIteration()=0; 00069 virtual void solve()=0; 00070 00071 00072 public: 00073 HybridPressionModuleMPI(OrthoMesh &mesh,Function3D &fPrescribedVelocities, Function3D &fPrescribedPression, Function3D &K,Function1D &fMobT,FunctionOfCellFields &fGravSource,double Xsize,double b,double theta,int meshOverlap,double maxTol, int debugLevel,std::ostream &out=std::cout); 00074 virtual ~HybridPressionModuleMPI(); 00075 virtual void iterate(TransportBase &trans); 00076 virtual void printOutput(); 00077 00078 00079 }; 00080 00081 #endif