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