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 }
00032
00033 virtual ~NewPoissonOp()
00034 {
00035 }
00036
00037
00038
00039
00040
00041 void define(const RealVect& a_dx,
00042 const ProblemDomain& a_domain,
00043 BCFunc a_bc);
00044
00045 virtual void createCoarsened( FArrayBox& a_lhs,
00046 const FArrayBox& a_rhs,
00047 const int& a_refRat);
00048
00049 virtual void residual( FArrayBox& a_lhs,
00050 const FArrayBox& a_phi,
00051 const FArrayBox& a_rhs,
00052 bool a_homogeneous = false);
00053 virtual void preCond( FArrayBox& a_correction,
00054 const FArrayBox& a_residual);
00055 virtual void applyOp( FArrayBox& a_lhs,
00056 const FArrayBox& a_phi,
00057 bool a_homogeneous = false);
00058 virtual void create( FArrayBox& a_lhs,
00059 const FArrayBox& a_rhs);
00060 virtual void assign( FArrayBox& a_lhs,
00061 const FArrayBox& a_rhs) ;
00062 virtual Real dotProduct(const FArrayBox& a_1,
00063 const FArrayBox& a_2) ;
00064 virtual void incr( FArrayBox& a_lhs,
00065 const FArrayBox& a_x,
00066 Real a_scale) ;
00067 virtual void axby( FArrayBox& a_lhs, const FArrayBox& a_x,
00068 const FArrayBox& a_y,
00069 Real a, Real b) ;
00070 virtual void scale(FArrayBox& a_lhs, const Real& a_scale) ;
00071
00072 virtual Real norm(const FArrayBox& a_x, int a_ord);
00073
00074 virtual void setToZero(FArrayBox& a_x);
00075
00076
00077
00078
00079
00080
00081
00082 virtual void relax(FArrayBox& a_e,
00083 const FArrayBox& a_residual,
00084 int iterations);
00085
00086 virtual void createCoarser(FArrayBox& a_coarse,
00087 const FArrayBox& a_fine,
00088 bool ghost);
00089
00090
00091
00092
00093 virtual void restrictResidual(FArrayBox& a_resCoarse,
00094 FArrayBox& a_phiFine,
00095 const FArrayBox& a_rhsFine);
00096
00097
00098
00099
00100
00101 virtual void prolongIncrement(FArrayBox& a_phiThisLevel,
00102 const FArrayBox& a_correctCoarse);
00103
00104
00105
00106
00107 protected:
00108 RealVect m_dx;
00109 RealVect m_dxCrse;
00110 ProblemDomain m_domain;
00111 BCFunc m_bc;
00112
00113 void levelGSRB(FArrayBox& a_e, const FArrayBox& a_residual);
00114
00115 void colorGS(FArrayBox& a_phi,
00116 const FArrayBox& a_rhs,
00117 const IntVect& color);
00118
00119 bool nextColor(IntVect& color,
00120 const IntVect& limit);
00121
00122 void levelRelaxColor(FArrayBox& a_phi,
00123 const FArrayBox& a_rhs,
00124 const IntVect& a_color,
00125 const Real& a_weight,
00126 const bool& a_homogeneousPhysBC);
00127
00128 };
00129
00130 class NewPoissonOpFactory : public MGLevelOpFactory<FArrayBox>
00131 {
00132 public:
00133
00134 NewPoissonOpFactory();
00135
00136 NewPoissonOpFactory(RealVect& a_dx, BCFunc a_bc);
00137
00138 void define(const RealVect& m_dx,BCFunc m_bc);
00139
00140 virtual ~NewPoissonOpFactory()
00141 {
00142
00143 }
00144 virtual NewPoissonOp* MGnewOp(const ProblemDomain& a_FineindexSpace,
00145 int a_depth,
00146 bool a_homoOnly = true);
00147
00148 virtual void MGreclaim(NewPoissonOp* a_reclaim);
00149
00150 RealVect m_dx;
00151 BCFunc m_bc;
00152 };
00153
00154 #include "NamespaceFooter.H"
00155 #endif