00001 #ifdef CH_LANG_CC
00002
00003
00004
00005
00006
00007
00008
00009 #endif
00010
00011 #ifndef _BACKWARDEULER_H_
00012 #define _BACKWARDEULER_H_
00013
00014 #include <cmath>
00015 #include <cstdlib>
00016 #include <cstdio>
00017 #include <iostream>
00018 #include <iomanip>
00019 #include <fstream>
00020 #include <string>
00021 #include "AMRMultiGrid.H"
00022 #include "LevelData.H"
00023 #include "FArrayBox.H"
00024 #include "AMRTGA.H"
00025 #include "NamespaceHeader.H"
00026
00027
00028
00029
00030
00031
00032
00033 class BackwardEuler
00034 {
00035 public:
00036
00037 ~BackwardEuler();
00038
00039
00040
00041
00042 BackwardEuler(const RefCountedPtr<AMRMultiGrid< LevelData<FArrayBox> > > & a_solver,
00043 const AMRLevelOpFactory<LevelData<FArrayBox> >& a_factory,
00044 const ProblemDomain& a_level0Domain,
00045 const Vector<int>& a_refRat,
00046 int a_numLevels = -1, int a_verbosity = 3);
00047
00048
00049
00050
00051
00052 void oneStep(Vector<LevelData<FArrayBox>*>& a_phiNew,
00053 Vector<LevelData<FArrayBox>*>& a_phiOld,
00054 Vector<LevelData<FArrayBox>*>& a_source,
00055 const Real& a_dt,
00056 int a_lbase,
00057 int a_lmax,
00058 bool a_zeroPhi = true);
00059
00060
00061 void resetAlphaAndBeta(const Real& a_alpha,
00062 const Real& a_beta);
00063
00064 void
00065 computeDiffusion(Vector< LevelData<FArrayBox>* >& a_diffusiveTerm,
00066 Vector< LevelData<FArrayBox>* >& a_phiOld,
00067 Vector< LevelData<FArrayBox>* >& a_src,
00068 Real a_oldTime, Real a_dt,
00069 int a_lbase, int a_lmax, bool a_zeroPhi);
00070
00071
00072 protected:
00073 void solveHelm(Vector<LevelData<FArrayBox>* >& a_ans,
00074 Vector<LevelData<FArrayBox>* >& a_rhs,
00075 int a_lbase,
00076 int a_lmax,
00077 Real a_dt,
00078 bool a_zeroPhi);
00079
00080
00081 void createEulerRHS(Vector<LevelData<FArrayBox>* >& a_ans,
00082 Vector<LevelData<FArrayBox>* >& a_source,
00083 Vector<LevelData<FArrayBox>* >& a_phiOld,
00084 int a_lbase,
00085 int a_lmax,
00086 Real a_dt);
00087 void createData(Vector<LevelData<FArrayBox>* >& a_source,
00088 int a_lbase,
00089 int a_lmax);
00090
00091 TGAHelmOp<LevelData<FArrayBox> >*
00092 newOp(const ProblemDomain& a_indexSpace,
00093 const AMRLevelOpFactory<LevelData<FArrayBox> >& a_opFact);
00094
00095 private:
00096
00097
00098 Vector<TGAHelmOp<LevelData<FArrayBox> > * > m_ops;
00099 Vector< LevelData<FArrayBox>* > m_rhst;
00100 ProblemDomain m_level0Domain;
00101 Vector<int> m_refRat;
00102 RefCountedPtr<AMRMultiGrid< LevelData<FArrayBox> > > m_solver;
00103 int m_verbosity, m_numLevels;
00104 bool m_dataCreated;
00105
00106
00107 BackwardEuler(const BackwardEuler& a_opin)
00108 {
00109 MayDay::Error("invalid operator");
00110 }
00111
00112 void operator=(const BackwardEuler& a_opin)
00113 {
00114 MayDay::Error("invalid operator");
00115 }
00116
00117
00118 BackwardEuler()
00119 {
00120 MayDay::Error("invalid operator");
00121 }
00122 };
00123
00124 #include "NamespaceFooter.H"
00125
00126 #endif