vtf-logo

weno/applications/euler/2d/InclinedJet/src/Problem.h

00001 // -*- C++ -*-
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 // Due to the underscore in the Fortran procedure name, an extra underscore will
00019 // be added to its symbol. Therefore, instead of using FORTRAN_NAME, the macro
00020 // FORTRAN_NAME_ should be used.
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 /* f_lset */
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          // int max_level = MaxLevel(base::GH());
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

Generated on Fri Aug 24 13:01:28 2007 for AMROC Applications - by  doxygen 1.4.7