vtf-logo

weno/applications/euler/3d/InclinedJet/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 
00015 #include "WENOProblem.h"
00016 //#include "WENOStdProblem.h"
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     //int max_level = MaxLevel(base::GH());
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   }