vtf-logo

weno/applications/euler/1d/AcousticWave/src/Problem.h

00001 // -*- C++ -*-
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