vtf-logo

weno/applications/euler/3d/Jet/src/Problem.h

00001 // -*- C++ -*-
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                        // +1 fields for passive scalars
00009                        // +1 field for temperature
00010                        // +1 feild to output dcflag and 
00011                        // +1 fieldsgske
00012 #define NVARS     6   // Fixup used only for vector of state and 2 scalars
00013 
00014 //#define SYNCTIME
00015 #define OWN_AMRSOLVER
00016 #define OWN_FLAGGING
00017 
00018 #include "WENOProblem.h"
00019 #ifdef SYNCTIME
00020 #include "WENOStdSyncTimeProblem.h"
00021 #else
00022 #include "WENOStdProblem.h"
00023 #endif
00024 #include "AMRInterpolation.h"
00025 #include "WENOStatistics.h"
00026 
00027 #ifdef OWN_FLAGGING
00028 #define NZONES 2
00029 
00030 class FlaggingSpecific : 
00031   public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00032   typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00033 public:
00034   FlaggingSpecific(base::solver_type& solver) : base(solver) {
00035       base::AddCriterion(new ByValue<VectorType,FlagType,DIM>());
00036       base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
00037       base::AddCriterion(new LimiterType<VectorType,FlagType,DIM>());
00038       base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
00039       base::AddCriterion(new RelativeError<VectorType,FixupType,FlagType,DIM>(solver));
00040 #ifdef f_flgout
00041       base::AddCriterion(new F77ByValue<VectorType,FlagType,DIM>(f_flgout));
00042       base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(f_flgout));
00043       base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(f_flgout));
00044       base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00045       base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00046 #endif
00047     }
00048 
00049   virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00050     base::register_at(Ctrl, prefix);
00051     char VariableName[32];
00052     for (int iz=0; iz < NZONES ; iz++)
00053       for (int d=0; d<DIM; d++) {
00054         sprintf(VariableName,"DCellsMin%d(%d)",iz+1,d+1);
00055         RegisterAt(base::LocCtrl,VariableName,dcmin[iz][d]);
00056         sprintf(VariableName,"DCellsMax%d(%d)",iz+1,d+1);
00057         RegisterAt(base::LocCtrl,VariableName,dcmax[iz][d]);
00058       } 
00059     for (int d=0; d<DIM; d++) {
00060       sprintf(VariableName,"FCellsMin(%d)",d+1);
00061       RegisterAt(base::LocCtrl,VariableName,scmin[d]);
00062       sprintf(VariableName,"FCellsMax(%d)",d+1);
00063       RegisterAt(base::LocCtrl,VariableName,scmax[d]);
00064     } 
00065   }
00066   virtual void register_at(ControlDevice& Ctrl) {
00067     register_at(Ctrl, "");
00068   }
00069 
00070   virtual void SetFlags(const int Time, const int Level, double t, double dt) {
00071     base::SetFlags(Time, Level, t, dt);
00072     int max_level = MaxLevel(base::GH());
00073     for ( int iz = 0 ; iz < NZONES ; iz ++ ) {
00074       Coords lb(base::Dim(), dcmin[iz]), ub(base::Dim(), dcmax[iz]), 
00075         s(base::Dim(),1);
00076       BBox bbox(lb*StepSize(base::GH(),0), ub*StepSize(base::GH(),0),
00077                 s*StepSize(base::GH(),0));
00078       bbox.refine(StepSize(base::GH(),0)/StepSize(base::GH(),Level));
00079       
00080       forall (base::Flags(),Time,Level,c)  
00081         if ( Level > max_level - (2+iz) )
00082           base::Flags()(Time,Level,c).equals(GoodPoint, bbox);
00083       end_forall
00084     }
00085     // Mark the slot
00086     Coords lb(base::Dim(), scmin), ub(base::Dim(), scmax), s(base::Dim(),1);
00087     BBox bbox(lb*StepSize(base::GH(),0), ub*StepSize(base::GH(),0),
00088               s*StepSize(base::GH(),0));
00089     bbox.refine(StepSize(base::GH(),0)/StepSize(base::GH(),Level));
00090       
00091     forall (base::Flags(),Time,Level,c)
00092       base::Flags()(Time,Level,c).equals(BadPoint, bbox);
00093     end_forall
00094   }
00095 
00096   ~FlaggingSpecific() { DeleteAllCriterions(); }
00097 private:
00098   int dcmin[NZONES][DIM], dcmax[NZONES][DIM];
00099   int scmin[DIM], scmax[DIM];
00100 };
00101 #endif
00102 
00103 #ifdef OWN_AMRSOLVER
00104 
00105 class SolverSpecific : 
00106 #ifdef SYNCTIME
00107   public AMRSolverSyncTime<VectorType,FixupType,FlagType,DIM> {
00108   typedef AMRSolverSyncTime<VectorType,FixupType,FlagType,DIM> base;
00109 #else
00110   public AMRSolver<VectorType,FixupType,FlagType,DIM> {
00111   typedef AMRSolver<VectorType,FixupType,FlagType,DIM> base;
00112 #endif
00113   typedef AMRInterpolation<VectorType,DIM> interpolation_type;
00114   typedef WENOF77FileOutput<VectorType,DIM> output_type;
00115   typedef WENOStatistics<VectorType,interpolation_type,output_type,DIM> stat_type;
00116 public:
00117   SolverSpecific(IntegratorSpecific& integ, 
00118                  base::initial_condition_type& init,
00119                  base::boundary_conditions_type& bc) :
00120 #ifdef SYNCTIME
00121     AMRSolverSyncTime<VectorType,FixupType,FlagType,DIM>(integ, init, bc) {
00122 #else
00123     AMRSolver<VectorType,FixupType,FlagType,DIM>(integ, init, bc) {
00124 #endif
00125     SetLevelTransfer(new F77LevelTransfer<VectorType,DIM>(f_prolong, f_restrict));
00126 #ifdef f_flgout
00127     SetFileOutput(new WENOF77FileOutput<VectorType,DIM>(f_flgout, f_bounds)); 
00128 #else   
00129     SetFileOutput(new FileOutput<VectorType,DIM>()); 
00130 #endif
00131     SetFixup(new FixupSpecific());
00132     SetFlagging(new FlaggingSpecific(*this)); 
00133     _Interpolation = new interpolation_type();
00134     _Stats = new stat_type(_Interpolation, (output_type*)_FileOutput);
00135   }  
00136 
00137   ~SolverSpecific() {
00138     delete _LevelTransfer;
00139     delete _Flagging;
00140     delete _Fixup;
00141     delete _FileOutput;
00142     delete _Interpolation;
00143     delete _Stats;
00144   }
00145 
00146   virtual void register_at(ControlDevice& Ctrl) { base::register_at(Ctrl); }
00147   virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00148     base::register_at(Ctrl, prefix);
00149     if (_Stats) _Stats->register_at(base::LocCtrl, ""); 
00150   }
00151 
00152   virtual void SetupData() {
00153     base::SetupData();
00154     _Interpolation->SetupData(base::PGH(), base::NGhosts());
00155     _Stats->Setup(base::PGH(), base::NGhosts(), base::shape, base::geom);
00156   }
00157 
00158   virtual void Advance(double& t, double& dt) {
00159         base::Advance(t, dt);
00160         _Stats->Evaluate(base::t, base::U(), base::Work());
00161     }
00162 
00163   virtual void Initialize_(const double& dt_start) { 
00164       base::Initialize_(dt_start);
00165       _Stats->Evaluate(base::t, base::U(), base::Work());
00166   }
00167 
00168 protected:
00169   interpolation_type* _Interpolation; 
00170   stat_type* _Stats;