00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011
00012
00013 #ifndef _NEWPOISSONOP4_H_
00014 #define _NEWPOISSONOP4_H_
00015
00016 #include "AMRMultiGrid.H"
00017 #include "REAL.H"
00018 #include "Box.H"
00019 #include "LevelDataOps.H"
00020 #include "BCFunc.H"
00021 #include "FArrayBox.H"
00022 #include "NamespaceHeader.H"
00023
00024 class NewPoissonOp4 : public MGLevelOp<FArrayBox>
00025 {
00026 public:
00027 NewPoissonOp4()
00028 {
00029 }
00030
00031 virtual ~NewPoissonOp4()
00032 {
00033 }
00034
00035 static const int m_nGhost = 2;
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
00109 RealVect m_dx;
00110 RealVect m_dxCrse;
00111 ProblemDomain m_domain;
00112 BCFunc m_bc;
00113
00114 void levelGSRB(FArrayBox& a_e, const FArrayBox& a_residual);
00115
00116 };
00117
00118 class NewPoissonOp4Factory : public MGLevelOpFactory<FArrayBox>
00119 {
00120 public:
00121
00122 NewPoissonOp4Factory();
00123
00124 NewPoissonOp4Factory(RealVect& a_dx, BCFunc a_bc);
00125
00126 void define(const RealVect& m_dx, BCFunc m_bc);
00127
00128 virtual ~NewPoissonOp4Factory()
00129 {
00130 }
00131
00132 virtual NewPoissonOp4* MGnewOp(const ProblemDomain& a_FineindexSpace,
00133 int a_depth,
00134 bool a_homoOnly = true);
00135
00136 virtual void MGreclaim(NewPoissonOp4* a_reclaim);
00137
00138 RealVect m_dx;
00139 BCFunc m_bc;
00140
00141 };
00142
00143 #include "NamespaceFooter.H"
00144 #endif