00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _AMRNODEOP_H_
00012 #define _AMRNODEOP_H_
00013
00014 #include "AMRMultiGrid.H"
00015 #include "REAL.H"
00016 #include "Box.H"
00017 #include "LevelDataOps.H"
00018 #include "NodeBCFunc.H"
00019 #include "NodeFArrayBox.H"
00020 #include "NodeCFIVS.H"
00021 #include "NodeQCFI.H"
00022 #include "CoarseAverage.H"
00023 #include "LevelFluxRegister.H"
00024 #include "AMRNodeOpF_F.H"
00025 #include "NodeCoarseAverage.H"
00026 #include "NodeLevelDataOps.H"
00027 #include "NamespaceHeader.H"
00028
00030
00032 class AMRNodeOp : public AMRLevelOp<LevelData<NodeFArrayBox> >
00033 {
00034 public:
00036
00038 AMRNodeOp();
00039
00041
00043 virtual ~AMRNodeOp() {;}
00044
00048
00050
00052 void define(const DisjointBoxLayout& a_grids,
00053 const Real& a_dx,
00054 const ProblemDomain& a_domain,
00055 NodeBCFunc a_bc);
00056
00058
00061 void define(const DisjointBoxLayout& a_grids,
00062 const DisjointBoxLayout& a_baseBAPtr,
00063 const Real& a_dxLevel,
00064 int a_refRatio,
00065 const ProblemDomain& a_domain,
00066 NodeBCFunc a_bc);
00067
00069
00070 void define(const DisjointBoxLayout& a_grids,
00071 const DisjointBoxLayout& a_gridsFiner,
00072 const DisjointBoxLayout& a_gridsCoarser,
00073 const Real& a_dxLevel,
00074 int a_refRatio,
00075 int a_refRatioFiner,
00076 const ProblemDomain& a_domain,
00077 NodeBCFunc a_bc);
00078
00080
00081 void define(const DisjointBoxLayout& a_grids,
00082 const DisjointBoxLayout& a_gridsFiner,
00083 const Real& a_dxLevel,
00084 int a_refRatio,
00085 int a_refRatioFiner,
00086 const ProblemDomain& a_domain,
00087 NodeBCFunc a_bc);
00088
00089 void projectFineInterior(LevelData<NodeFArrayBox>& a_phi,
00090 const LevelData<NodeFArrayBox>& a_phiFine);
00091
00092 virtual void residual( LevelData<NodeFArrayBox>& a_lhs,
00093 const LevelData<NodeFArrayBox>& a_phi,
00094 const LevelData<NodeFArrayBox>& a_rhs,
00095 bool a_homogeneous = false);
00096
00097 virtual void preCond( LevelData<NodeFArrayBox>& a_correction,
00098 const LevelData<NodeFArrayBox>& a_residual);
00099
00100 virtual void applyOpOnly( LevelData<NodeFArrayBox>& a_lhs,
00101 const LevelData<NodeFArrayBox>& a_phi);
00102
00103 virtual void applyOp( LevelData<NodeFArrayBox>& a_lhs,
00104 const LevelData<NodeFArrayBox>& a_phi,
00105 bool a_homogeneous = false);
00106 virtual void create( LevelData<NodeFArrayBox>& a_lhs,
00107 const LevelData<NodeFArrayBox>& a_rhs);
00108 virtual void createCoarsened( LevelData<NodeFArrayBox>& a_lhs,
00109 const LevelData<NodeFArrayBox>& a_rhs,
00110 const int& a_refRat);
00111
00112 virtual void assign( LevelData<NodeFArrayBox>& a_lhs,
00113 const LevelData<NodeFArrayBox>& a_rhs) ;
00114 virtual Real dotProduct(const LevelData<NodeFArrayBox>& a_1,
00115 const LevelData<NodeFArrayBox>& a_2) ;
00116 virtual void incr( LevelData<NodeFArrayBox>& a_lhs,
00117 const LevelData<NodeFArrayBox>& a_x,
00118 Real a_scale) ;
00119 virtual void axby( LevelData<NodeFArrayBox>& a_lhs, const LevelData<NodeFArrayBox>& a_x,
00120 const LevelData<NodeFArrayBox>& a_y,
00121 Real a, Real b) ;
00122 virtual void scale(LevelData<NodeFArrayBox>& a_lhs, const Real& a_scale) ;
00123
00124 virtual Real norm(const LevelData<NodeFArrayBox>& a_x, int a_ord);
00125
00126 virtual void setToZero( LevelData<NodeFArrayBox>& a_x);
00127
00128
00129 virtual void relax(LevelData<NodeFArrayBox>& a_e,
00130 const LevelData<NodeFArrayBox>& a_residual,
00131 int iterations);
00132
00133 virtual void createCoarser(LevelData<NodeFArrayBox>& a_coarse,
00134 const LevelData<NodeFArrayBox>& a_fine,
00135 bool ghosted);
00136
00138
00142 virtual void restrictResidual(LevelData<NodeFArrayBox>& a_resCoarse,
00143 LevelData<NodeFArrayBox>& a_phiFine,
00144 const LevelData<NodeFArrayBox>& a_rhsFine);
00145
00147
00151 virtual void prolongIncrement(LevelData<NodeFArrayBox>& a_phiThisLevel,
00152 const LevelData<NodeFArrayBox>& a_correctCoarse);
00153
00154
00156 virtual int refToCoarser(){ return m_refToCoarser; }
00157
00159
00160 virtual void AMRResidual(LevelData<NodeFArrayBox>& a_residual,
00161 const LevelData<NodeFArrayBox>& a_phiFine,
00162 const LevelData<NodeFArrayBox>& a_phi,
00163 const LevelData<NodeFArrayBox>& a_phiCoarse,
00164 const LevelData<NodeFArrayBox>& a_rhs,
00165 bool a_homogeneousPhysBC,
00166 AMRLevelOp<LevelData<NodeFArrayBox> >* a_finerOp);
00167
00168
00170
00171 virtual void AMRResidualNC(LevelData<NodeFArrayBox>& a_residual,
00172 const LevelData<NodeFArrayBox>& a_phiFine,
00173 const LevelData<NodeFArrayBox>& a_phi,
00174 const LevelData<NodeFArrayBox>& a_rhs,
00175 bool a_homogeneousPhysBC,
00176 AMRLevelOp<LevelData<NodeFArrayBox> >* a_finerOp);
00177
00179
00180 virtual void AMRResidualNF(LevelData<NodeFArrayBox>& a_residual,
00181 const LevelData<NodeFArrayBox>& a_phi,
00182 const LevelData<NodeFArrayBox>& a_phiCoarse,
00183 const LevelData<NodeFArrayBox>& a_rhs,
00184 bool a_homogeneousPhysBC);
00185
00186
00188
00189 virtual void AMROperator(LevelData<NodeFArrayBox>& a_LofPhi,
00190 const LevelData<NodeFArrayBox>& a_phiFine,
00191 const LevelData<NodeFArrayBox>& a_phi,
00192 const LevelData<NodeFArrayBox>& a_phiCoarse,
00193 bool a_homogeneousPhysBC,
00194 AMRLevelOp<LevelData<NodeFArrayBox> >* a_finerOp);
00195
00196
00198
00199 virtual void AMROperatorNC(LevelData<NodeFArrayBox>& a_LofPhi,
00200 const LevelData<NodeFArrayBox>& a_phiFine,
00201 const LevelData<NodeFArrayBox>& a_phi,
00202 bool a_homogeneousPhysBC,
00203 AMRLevelOp<LevelData<NodeFArrayBox> >* a_finerOp);
00204
00206
00207 virtual void AMROperatorNF(LevelData<NodeFArrayBox>& a_LofPhi,
00208 const LevelData<NodeFArrayBox>& a_phi,
00209 const LevelData<NodeFArrayBox>& a_phiCoarse,
00210 bool a_homogeneousPhysBC);
00211
00212
00213
00214
00216
00221 virtual void AMRRestrict(LevelData<NodeFArrayBox>& a_resCoarse,
00222 const LevelData<NodeFArrayBox>& a_residual,
00223 const LevelData<NodeFArrayBox>& a_correction,
00224 const LevelData<NodeFArrayBox>& a_coarseCorrection);
00225
00227 virtual void AMRProlong(LevelData<NodeFArrayBox>& a_correction,
00228 const LevelData<NodeFArrayBox>& a_coarseCorrection);
00229
00231 virtual void AMRUpdateResidual(LevelData<NodeFArrayBox>& a_residual,
00232 const LevelData<NodeFArrayBox>& a_correction,
00233 const LevelData<NodeFArrayBox>& a_coarseCorrection);
00234
00236
00239 virtual Real AMRNorm(const LevelData<NodeFArrayBox>& a_coarseResid,
00240 const LevelData<NodeFArrayBox>& a_fineResid,
00241 const int& a_refRat,
00242 const int& a_ord);
00243
00244
00247 Real m_alpha, m_beta;
00248
00249 protected:
00250
00251 void prolongIncrement(LevelData<NodeFArrayBox>& a_phiThisLevel,
00252 const LevelData<NodeFArrayBox>& a_correctCoarse,
00253 int a_refRat);
00254
00255
00256 ProblemDomain m_domainInteriorNodes;
00257 Real m_dx;
00258 Real m_dxCrse;
00259 ProblemDomain m_domain;
00260 NodeLevelDataOps m_levelOps;
00261 NodeBCFunc m_bc;
00262 LayoutData<NodeCFIVS> m_loCFIVS[SpaceDim];
00263 LayoutData<NodeCFIVS> m_hiCFIVS[SpaceDim];
00264 Copier m_exchangeCopier;
00265 NodeQCFI m_interpWithCoarser;
00266 NodeCoarseAverage m_averageOpMG;
00267 int m_refToCoarser;
00268 int m_refToFiner;
00269 DisjointBoxLayout m_coarsenedFineGrids;
00270 bool m_hasFiner;
00271
00272 void levelGSRB(LevelData<NodeFArrayBox>& a_e,
00273 const LevelData<NodeFArrayBox>& a_residual);
00274
00275 void homogeneousCFInterp(LevelData<NodeFArrayBox>& a_phif);
00276 void homogeneousCFInterp(LevelData<NodeFArrayBox>& a_phif,
00277 const DataIndex& a_datInd,
00278 int a_idir,
00279 Side::LoHiSide a_hiorlo);
00280
00283 LayoutData< Vector<IntVectSet> > m_IVSV;
00284
00287 LayoutData< BitSet > m_IVSVfull;
00288
00289
00290 LayoutData< Vector<IntVectSet> > m_IVSVext;
00291
00294 LayoutData< Vector<IntVectSet> > m_IVSVcoarsened;
00295
00298 LayoutData< Vector<IntVectSet> > m_IVSVcoarsenedFine;
00299
00300 void setCFIVS(const DisjointBoxLayout& a_grids);
00301 };
00302
00303 class AMRNodeOpFactory: public AMRLevelOpFactory<LevelData<NodeFArrayBox> >
00304 {
00305 public:
00306 virtual ~AMRNodeOpFactory(){;}
00307
00309 void define(const ProblemDomain& a_coarseDomain,
00310 const Vector<DisjointBoxLayout>& a_grids,
00311 const Vector<int> a_refRatios,
00312 const Real& a_coarsedx,
00313 NodeBCFunc a_bc,
00314 Real a_alpha = 0.,
00315 Real a_beta = 1.);
00316
00318 void define(const ProblemDomain& a_domain,
00319 const DisjointBoxLayout& a_grid,
00320 const Real& a_dx,
00321 NodeBCFunc a_bc,
00322 int maxDepth = -1,
00323 Real a_alpha = 0.,
00324 Real a_beta = 1.);
00325
00329 virtual AMRNodeOp*
00330 MGnewOp(const ProblemDomain& a_FineindexSpace,
00331 int depth,
00332 bool homoOnly = true);
00333
00339 virtual AMRNodeOp* AMRnewOp(const ProblemDomain& a_indexSpace);
00340
00341 virtual int refToFiner(const ProblemDomain&) const;
00342
00343 private:
00344 Vector<ProblemDomain> m_domains;
00345 Vector<DisjointBoxLayout> m_boxes;
00346 Vector<Real> m_dx;
00347 Vector<int> m_refRatios;
00348 NodeBCFunc m_bc;
00349 Real m_alpha, m_beta;
00350
00351 };
00352
00353 #include "NamespaceFooter.H"
00354 #endif