00001
00002
00003 #ifndef AMROC_PROBLEM_H
00004 #define AMROC_PROBLEM_H
00005
00006 #define DIM 1
00007
00008 #include "WENOProblem.h"
00009 #define OWN_FLAGGING
00010
00011 #ifdef OWN_FLAGGING
00012 #define NZONES 2
00013
00014
00015 class FlaggingSpecific :
00016 public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00017 typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00018 public:
00019 FlaggingSpecific(base::solver_type& solver) : base(solver) {
00020 base::AddCriterion(new ByValue<VectorType,FlagType,DIM>());
00021 base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
00022 base::AddCriterion(new LimiterType<VectorType,FlagType,DIM>());
00023 base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
00024 base::AddCriterion(new RelativeError<VectorType,FixupType,FlagType,DIM>(solver));
00025 #ifdef f_flgout
00026 base::AddCriterion(new F77ByValue<VectorType,FlagType,DIM>(f_flgout));
00027 base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(f_flgout));
00028 base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(f_flgout));
00029 base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00030 base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00031 #endif
00032 }
00033
00034 virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00035 base::register_at(Ctrl, prefix);
00036 char VariableName[32];
00037 for (int iz=0; iz < NZONES ; iz++)
00038 for (int d=0; d<DIM; d++) {
00039 sprintf(VariableName,"DCellsMin%d(%d)",iz+1,d+1);
00040 RegisterAt(base::LocCtrl,VariableName,dcmin[iz][d]);
00041 sprintf(VariableName,"DCellsMax%d(%d)",iz+1,d+1);
00042 RegisterAt(base::LocCtrl,VariableName,dcmax[iz][d]);
00043 }
00044 }
00045 virtual void register_at(ControlDevice& Ctrl) {
00046 register_at(Ctrl, "");
00047 }
00048
00049 virtual void SetFlags(const int Time, const int Level, double t, double dt) {
00050 base::SetFlags(Time, Level, t, dt);
00051 int max_level = MaxLevel(base::GH());
00052 for ( int iz = 0 ; iz < NZONES ; iz ++ ) {
00053 Coords lb(base::Dim(), dcmin[iz]), ub(base::Dim(), dcmax[iz]),
00054 s(base::Dim(),1);
00055 BBox bbox(lb*StepSize(base::GH(),0), ub*StepSize(base::GH(),0),
00056 s*StepSize(base::GH(),0));
00057 bbox.refine(StepSize(base::GH(),0)/StepSize(base::GH(),Level));
00058
00059 forall (base::Flags(),Time,Level,c)
00060 if ( Level > max_level - (2+iz) )
00061 base::Flags()(Time,Level,c).equals(GoodPoint, bbox);
00062 end_forall
00063 }
00064 }
00065
00066 ~FlaggingSpecific() { DeleteAllCriterions(); }
00067 private:
00068 int dcmin[NZONES][DIM], dcmax[NZONES][DIM];
00069 };
00070 #endif
00071