00001
00002
00003
00004
00005
00006 #ifndef AMROC_PROBLEM_H
00007 #define AMROC_PROBLEM_H
00008
00009 #include "euler2.h"
00010 #include "ClpProblem.h"
00011 #define OWN_AMRSOLVER
00012 #define OWN_FLAGGING
00013 #include "ClpStdProblem.h"
00014
00015 class FlaggingSpecific :
00016 public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00017 typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00018 public:
00019 FlaggingSpecific(base::solver_type& solver) : base(solver) {
00020 base::AddCriterion(new FlagRegions<VectorType,FlagType,DIM>());
00021 base::AddCriterion(new ByValue<VectorType,FlagType,DIM>());
00022 base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
00023 base::AddCriterion(new LimiterType<VectorType,FlagType,DIM>());
00024 base::AddCriterion(new MRPrediction<VectorType,FlagType,DIM>());
00025 base::AddCriterion(new MRVectorPrediction<VectorType,FlagType,DIM>());
00026 base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
00027 base::AddCriterion(new RelativeError<VectorType,FixupType,FlagType,DIM>(solver));
00028 #ifdef f_flgout
00029 base::AddCriterion(new F77ByValue<VectorType,FlagType,DIM>(f_flgout));
00030 base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(f_flgout));
00031 base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(f_flgout));
00032 base::AddCriterion(new F77MRPrediction<VectorType,FlagType,DIM>(f_flgout));
00033 base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00034 base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,f_flgout));
00035 #endif
00036 }
00037
00038 ~FlaggingSpecific() { DeleteAllCriterions(); }
00039
00040 virtual void init() {
00041 base::init();
00042 base::AddCriterion(new UnflagRegions<VectorType,FlagType,DIM>());
00043 }
00044 };
00045
00046 class SolverSpecific :
00047 public AMRSolver<VectorType,FixupType,FlagType,DIM> {
00048 typedef AMRSolver<VectorType,FixupType,FlagType,DIM> base;
00049 public:
00050 SolverSpecific(IntegratorSpecific& integ,
00051 base::initial_condition_type& init,
00052 base::boundary_conditions_type& bc) :
00053 AMRSolver<VectorType,FixupType,FlagType,DIM>(integ, init, bc) {
00054 SetLevelTransfer(new F77LevelTransfer<VectorType,DIM>(f_prolong, f_restrict));
00055 #ifdef f_flgout
00056 SetFileOutput(new F77FileOutput<VectorType,DIM>(f_flgout));
00057 #else
00058 SetFileOutput(new FileOutput<VectorType,DIM>());
00059 #endif
00060 SetFixup(new FixupSpecific(integ));
00061 SetFlagging(new FlaggingSpecific(*this));
00062 SetExactSolution(new F77ExactSolution<VectorType,DIM>(f_exact));
00063 }
00064
00065 ~SolverSpecific() {
00066 delete _LevelTransfer;
00067 delete _Flagging;
00068 delete _Fixup;
00069 delete _FileOutput;
00070 }
00071 };
00072