00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013
00014
00015 #ifndef _NEWPOISSONOP_H_
00016 #define _NEWPOISSONOP_H_
00017
00018 #include "AMRMultiGrid.H"
00019 #include "REAL.H"
00020 #include "Box.H"
00021 #include "LevelDataOps.H"
00022 #include "BCFunc.H"
00023 #include "FArrayBox.H"
00024 #include "NamespaceHeader.H"
00025
00026 class NewPoissonOp : public MGLevelOp<FArrayBox>
00027 {
00028 public:
00029 NewPoissonOp(){ ; }
00030
00031 virtual ~NewPoissonOp() { ; }
00035
00036 void define(const RealVect& a_dx,
00037 const ProblemDomain& a_domain,
00038 BCFunc a_bc);
00039
00040 virtual void createCoarsened( FArrayBox& a_lhs,
00041 const FArrayBox& a_rhs,
00042 const int& a_refRat);
00043
00044 virtual void residual( FArrayBox& a_lhs,
00045 const FArrayBox& a_phi,
00046 const FArrayBox& a_rhs,
00047 bool a_homogeneous = false);
00048 virtual void preCond( FArrayBox& a_correction,
00049 const FArrayBox& a_residual);
00050 virtual void applyOp( FArrayBox& a_lhs,
00051 const FArrayBox& a_phi,
00052 bool a_homogeneous = false);
00053 virtual void create( FArrayBox& a_lhs,
00054 const FArrayBox& a_rhs);
00055 virtual void assign( FArrayBox& a_lhs,
00056 const FArrayBox& a_rhs) ;
00057 virtual Real dotProduct(const FArrayBox& a_1,
00058 const FArrayBox& a_2) ;
00059 virtual void incr( FArrayBox& a_lhs,
00060 const FArrayBox& a_x,
00061 Real a_scale) ;
00062 virtual void axby( FArrayBox& a_lhs, const FArrayBox& a_x,
00063 const FArrayBox& a_y,
00064 Real a, Real b) ;
00065 virtual void scale(FArrayBox& a_lhs, const Real& a_scale) ;
00066
00067 virtual Real norm(const FArrayBox& a_x, int a_ord);
00068
00069 virtual void setToZero(FArrayBox& a_x);
00070
00076
00077 virtual void relax(FArrayBox& a_e,
00078 const FArrayBox& a_residual,
00079 int iterations);
00080
00081 virtual void createCoarser(FArrayBox& a_coarse,
00082 const FArrayBox& a_fine,
00083 bool ghost);
00088 virtual void restrictResidual(FArrayBox& a_resCoarse,
00089 FArrayBox& a_phiFine,
00090 const FArrayBox& a_rhsFine);
00091
00096 virtual void prolongIncrement(FArrayBox& a_phiThisLevel,
00097 const FArrayBox& a_correctCoarse);
00098
00102 protected:
00103 RealVect m_dx;
00104 RealVect m_dxCrse;
00105 ProblemDomain m_domain;
00106 BCFunc m_bc;
00107
00108 void levelGSRB(FArrayBox& a_e, const FArrayBox& a_residual);
00109
00110 void colorGS(FArrayBox& a_phi,
00111 const FArrayBox& a_rhs,
00112 const IntVect& color);
00113
00114 bool nextColor(IntVect& color,
00115 const IntVect& limit);
00116
00117 void levelRelaxColor(FArrayBox& a_phi,
00118 const FArrayBox& a_rhs,
00119 const IntVect& a_color,
00120 const Real& a_weight,
00121 const bool& a_homogeneousPhysBC);
00122
00123 };
00124
00125 class NewPoissonOpFactory : public MGLevelOpFactory<FArrayBox>
00126 {
00127 public:
00128
00129 NewPoissonOpFactory();
00130 NewPoissonOpFactory(RealVect& a_dx, BCFunc a_bc);
00131 void define(const RealVect& m_dx,BCFunc m_bc);
00132 virtual ~NewPoissonOpFactory(){;}
00133 virtual NewPoissonOp* MGnewOp(const ProblemDomain& a_FineindexSpace,
00134 int a_depth,
00135 bool a_homoOnly = true);
00136 virtual void MGreclaim(NewPoissonOp* a_reclaim);
00137
00138 RealVect m_dx;
00139 BCFunc m_bc;
00140
00141 };
00142
00143 #include "NamespaceFooter.H"
00144 #endif