00001
00002
00003 #ifndef AMROC_PROBLEM_H
00004 #define AMROC_PROBLEM_H
00005
00006 #define DIM 3
00007 #define NEQUATIONS 9 // Euler equations for gases in 3D (5 fields),
00008
00009
00010
00011
00012 #define NVARS 6 // Fixup used only for vector of state and 2 scalars
00013
00014
00015 #include "WENOProblem.h"
00016
00017
00018 #define OWN_GFMAMRSOLVER
00019 #define OWN_FLAGGING
00020 #define NZONES 1
00021 #include "WENOStdGFMProblem.h"
00022
00023 #define f_init_commongm FORTRAN_NAME(comblgm, COMBLGM)
00024 extern "C" {
00025 void f_init_commongm(const INTEGER& dim, INTEGER* shape, DOUBLE* geom,
00026 INTEGER& maxlev, INTEGER* refine);
00027 }
00028
00029 class FlaggingSpecific :
00030 public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00031 typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00032 public:
00033 FlaggingSpecific(base::solver_type& solver) : base(solver) {
00034 base::AddCriterion(new ByValue<VectorType,FlagType,DIM>());
00035 base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
00036 base::AddCriterion(new LimiterType<VectorType,FlagType,DIM>());
00037 base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
00038 base::AddCriterion(new RelativeError<VectorType,FixupType,FlagType,DIM>(solver));
00039 #ifdef f_flgout
00040 base::AddCriterion(new F77ByValue<VectorType,FlagType,DIM>(f_flgout));
00041 base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(f_flgout));
00042 base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(f_flgout));
00043 base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00044 base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00045 #endif
00046 }
00047
00048 virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00049 base::register_at(Ctrl, prefix);
00050 char VariableName[32];
00051 for (int iz=0; iz < NZONES ; iz++)
00052 for (int d=0; d<DIM; d++) {
00053 sprintf(VariableName,"DCellsMin%d(%d)",iz+1,d+1);
00054 RegisterAt(base::LocCtrl,VariableName,dcmin[iz][d]);
00055 sprintf(VariableName,"DCellsMax%d(%d)",iz+1,d+1);
00056 RegisterAt(base::LocCtrl,VariableName,dcmax[iz][d]);
00057 }
00058 }
00059 virtual void register_at(ControlDevice& Ctrl) {
00060 register_at(Ctrl, "");
00061 }
00062
00063 virtual void SetFlags(const int Time, const int Level, double t, double dt) {
00064 base::SetFlags(Time, Level, t, dt);
00065
00066 for ( int iz = 0 ; iz < NZONES ; iz ++ ) {
00067 Coords lb(base::Dim(), dcmin[iz]), ub(base::Dim(), dcmax[iz]),
00068 s(base::Dim(),1);
00069 BBox bbox(lb*StepSize(base::GH(),0), ub*StepSize(base::GH(),0),
00070 s*StepSize(base::GH(),0));
00071 bbox.refine(StepSize(base::GH(),0)/StepSize(base::GH(),Level));
00072
00073 forall (base::Flags(),Time,Level,c)
00074 base::Flags()(Time,Level,c).equals(BadPoint, bbox);
00075 end_forall
00076 }
00077 }
00078
00079 ~FlaggingSpecific() { DeleteAllCriterions(); }
00080 private:
00081 int dcmin[NZONES][DIM], dcmax[NZONES][DIM];
00082 };
00083
00084 class SolverSpecific :
00085 public AMRGFMSolver<VectorType,FixupType,FlagType,DIM> {
00086 typedef VectorType::InternalDataType DataType;
00087 typedef AMRGFMSolver<VectorType,FixupType,FlagType,DIM> base;
00088 typedef WENOF77GFMFileOutput<VectorType,FixupType,FlagType,DIM> output_type;
00089 public:
00090
00091 SolverSpecific(IntegratorSpecific& integ,
00092 base::initial_condition_type& init,
00093 base::boundary_conditions_type& bc) : base(integ, init, bc) {
00094 SetLevelTransfer(new F77LevelTransfer<VectorType,DIM>(f_prolong, f_restrict));
00095 #ifdef f_flgout
00096 SetFileOutput(new WENOF77GFMFileOutput<VectorType,FixupType,FlagType,DIM>(*this,f_flgout,f_bounds));
00097 #else
00098 SetFileOutput(new GFMFileOutput<VectorType,FixupType,FlagType,DIM>(*this));
00099 #endif
00100 SetFixup(new FixupSpecific());
00101 SetFlagging(new FlaggingSpecific(*this));
00102 AddGFM(new GhostFluidMethod<VectorType,DIM>(
00103 new F77GFMBoundary<VectorType,DIM>(f_ibndrfl,f_itrans),
00104 new F77GFMLevelSet<DataType,DIM>(f_lset)));
00105 }
00106
00107 virtual void SetupData() {
00108 int dim = DIM;
00109 base::SetupData();
00110 f_init_commongm(dim,shape,geom,MaxLev,_RefineFactor);
00111 }
00112
00113 ~SolverSpecific() {
00114 DeleteGFM(_GFM[0]);
00115 delete _Flagging;
00116 delete _Fixup;
00117 }