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