00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _EBAMRPOISSONOPFACTORY_H_
00012 #define _EBAMRPOISSONOPFACTORY_H_
00013
00014 #include "REAL.H"
00015 #include "Box.H"
00016 #include "FArrayBox.H"
00017 #include "Vector.H"
00018 #include <map>
00019 #include "RefCountedPtr.H"
00020
00021 #include "AMRMultiGrid.H"
00022
00023 #include "EBIndexSpace.H"
00024 #include "EBCellFAB.H"
00025 #include "EBCellFactory.H"
00026
00027 #include "EBLevelDataOps.H"
00028 #include "BaseEBBC.H"
00029 #include "BaseDomainBC.H"
00030 #include "CFIVS.H"
00031 #include "EBFluxRegister.H"
00032 #include "EBMGAverage.H"
00033 #include "EBMGInterp.H"
00034 #include "EBCoarsen.H"
00035 #include "PolyGeom.H"
00036 #include "EBAMRPoissonOp.H"
00037 #include "EBLevelGrid.H"
00038 #include "NamespaceHeader.H"
00039
00040
00041
00042
00043
00044
00045 class EBAMRPoissonOpFactory: public AMRLevelOpFactory<LevelData<EBCellFAB> >
00046 {
00047 public:
00048
00049 virtual ~EBAMRPoissonOpFactory();
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 EBAMRPoissonOpFactory(const Vector<EBLevelGrid>& a_eblgs,
00071 const Vector<int>& a_refRatio,
00072 const Vector<RefCountedPtr<EBQuadCFInterp> >& a_quadCFI,
00073 const RealVect& a_dxCoarse,
00074 const RealVect& a_origin,
00075 const int& a_numPreCondIters,
00076 const int& a_relaxType,
00077 RefCountedPtr<BaseDomainBCFactory> a_domainBCFactory,
00078 RefCountedPtr<BaseEBBCFactory> a_ebBcFactory,
00079 const Real& a_alpha,
00080 const Real& a_beta,
00081 const Real& a_time,
00082 const IntVect& a_ghostCellsPhi,
00083 const IntVect& a_ghostCellsRhs,
00084 int a_numLevels = -1);
00085
00086
00087 virtual void setData(Vector< RefCountedPtr<LevelData<BaseIVFAB<Real> > > >& a_data)
00088 {
00089 m_data = a_data;
00090 m_dataBased = true;
00091 }
00092
00093
00094 virtual void setType(Vector< RefCountedPtr<LevelData<BaseIVFAB<int> > > >& a_type)
00095 {
00096 m_type = a_type;
00097 m_typeBased = true;
00098 }
00099
00100
00101 virtual EBAMRPoissonOp*
00102 MGnewOp(const ProblemDomain& a_FineindexSpace,
00103 int a_depth,
00104 bool a_homoOnly = true);
00105
00106 EBAMRPoissonOp* createOperator(const EBLevelGrid& a_eblgMGLevel,
00107 const EBLevelGrid& a_eblgCoarMG,
00108 const bool& a_hasMGObjects,
00109 const bool& a_layoutChanged,
00110 const RealVect& a_dxMGLevel,
00111 const RealVect& a_dxCoar,
00112 RefCountedPtr<EBQuadCFInterp>& a_quadCFIMGLevel,
00113 const int& a_whichLevel,
00114 bool a_amrop);
00115
00116 virtual void reclaim(MGLevelOp<LevelData<EBCellFAB> >* a_reclaim);
00117
00118
00119 virtual EBAMRPoissonOp*
00120 AMRnewOp(const ProblemDomain& a_FineindexSpace);
00121
00122
00123 virtual void AMRreclaim(EBAMRPoissonOp* a_reclaim);
00124
00125
00126
00127
00128 virtual int refToFiner(const ProblemDomain& a_domain) const;
00129
00130
00131
00132
00133
00134
00135 static void setTestRef(int a_testRef)
00136 {
00137 s_testRef = a_testRef;
00138 }
00139
00140 static void setMaxBoxSize(int a_maxBoxSize)
00141 {
00142 s_maxBoxSize = a_maxBoxSize;
00143 }
00144
00145 static void setWhichReflux(int & a_whichReflux);
00146
00147 static int getWhichReflux();
00148
00149 protected:
00150 static int s_testRef;
00151 static int s_maxBoxSize;
00152
00153 bool m_isDefined;
00154 int m_numPreCondIters;
00155 int m_relaxType;
00156 int m_numLevels;
00157
00158
00159 Vector<EBLevelGrid> m_eblgVec;
00160 Vector<RefCountedPtr<EBQuadCFInterp> > m_quadCFIVec;
00161
00162 Vector< Vector<EBLevelGrid> > m_eblgVecMG;
00163 std::vector< bool > m_hasMGObjects;
00164 std::vector< bool > m_layoutChanged;
00165 std::vector< std::vector<bool> > m_layoutChangedMG;
00166
00167 Vector<int> m_refRatioVec;
00168 Vector<RealVect> m_dxVec;
00169 RealVect m_origin;
00170 Real m_alpha;
00171 Real m_beta;
00172 Real m_time;
00173 const IntVect m_ghostCellsPhi;
00174 const IntVect m_ghostCellsRHS;
00175
00176 RefCountedPtr<BaseDomainBCFactory> m_domainBCFactory;
00177 RefCountedPtr<BaseEBBCFactory> m_ebBCFactory;
00178
00179 static int s_whichReflux;
00180
00181 private:
00182
00183 Vector< RefCountedPtr<LevelData<BaseIVFAB<Real> > > > m_data;
00184 bool m_dataBased;
00185
00186 Vector< RefCountedPtr<LevelData<BaseIVFAB<int> > > > m_type;
00187 bool m_typeBased;
00188
00189
00190 EBAMRPoissonOpFactory()
00191 {
00192 MayDay::Error("invalid operator");
00193 }
00194
00195
00196 EBAMRPoissonOpFactory(const EBAMRPoissonOpFactory& a_opin)
00197 {
00198 MayDay::Error("invalid operator");
00199 }
00200
00201 void operator=(const EBAMRPoissonOpFactory& a_opin)
00202 {
00203 MayDay::Error("invalid operator");
00204 }
00205 };
00206
00207 #include "NamespaceFooter.H"
00208 #endif