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