00001
00002
00003
00004
00005
00006 #ifndef AMROC_PROBLEM_H
00007 #define AMROC_PROBLEM_H
00008
00009 #include "eulerrhok2.h"
00010
00011 #define NEQUATIONS 13
00012 #define NEQUSED 13
00013 #define NFIXUP 12
00014 #define NAUX 4
00015
00016 #include "ClpProblem.h"
00017 #include "F77Interfaces/F77UpdateLevelTransfer.h"
00018
00019 #define f_lsetrfl FORTRAN_NAME(lsrfl, LSRFL)
00020 #define f_lsetrdi FORTRAN_NAME(lsrdi, LSRDI)
00021
00022 extern "C" {
00023 void f_lsetrfl();
00024 void f_lsetrdi();
00025 }
00026
00027 #define OWN_FLAGGING
00028 #define OWN_GFMAMRSOLVER
00029 #include "ClpStdGFMProblem.h"
00030
00031 class FlaggingSpecific :
00032 public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00033 typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00034 public:
00035 FlaggingSpecific(base::solver_type& solver) : base(solver) {
00036 base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(f_flg));
00037 base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(f_flg));
00038 base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,f_flg));
00039 base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,f_flg));
00040 }
00041 ~FlaggingSpecific() { DeleteAllCriterions(); }
00042 };
00043
00044 class SolverSpecific :
00045 public AMRGFMSolver<VectorType,FixupType,FlagType,DIM> {
00046 typedef VectorType::InternalDataType DataType;
00047 typedef AMRGFMSolver<VectorType,FixupType,FlagType,DIM> base;
00048 public:
00049 SolverSpecific(IntegratorSpecific& integ,
00050 base::initial_condition_type& init,
00051 base::boundary_conditions_type& bc) : base(integ, init, bc) {
00052 SetLevelTransfer(new F77UpdateLevelTransfer<VectorType,DIM>(f_prolong, f_restrict, f_tupdate));
00053 SetFileOutput(new F77GFMFileOutput<VectorType,FixupType,FlagType,DIM>(*this,f_out));
00054 SetFixup(new FixupSpecific(integ));
00055 SetFlagging(new FlaggingSpecific(*this));
00056 AddGFM(new GhostFluidMethod<VectorType,DIM>(
00057 new F77GFMBoundary<VectorType,DIM>(f_ibndex,f_itrans),
00058 new F77GFMLevelSet<DataType,DIM>(f_lset)));
00059 AddGFM(new GhostFluidMethod<VectorType,DIM>(
00060 new F77GFMBoundary<VectorType,DIM>(f_ibndrfl,f_itrans),
00061 new F77GFMLevelSet<DataType,DIM>(f_lsetrdi)));
00062 AddGFM(new GhostFluidMethod<VectorType,DIM>(
00063 new F77GFMBoundary<VectorType,DIM>(f_ibndrfl,f_itrans),
00064 new F77GFMLevelSet<DataType,DIM>(f_lsetrfl)));
00065 }
00066
00067 ~SolverSpecific() {
00068 DeleteGFM(_GFM[0]);
00069 DeleteGFM(_GFM[1]);
00070 DeleteGFM(_GFM[2]);
00071 delete _Flagging;
00072 delete _Fixup;
00073 }