00001
00002
00003
00004
00005
00006 #ifndef AMROC_FLUIDPROBLEM_H
00007 #define AMROC_FLUIDPROBLEM_H
00008
00009 #include "eulerznd3.h"
00010
00011 #undef NAUX
00012 #define NAUX 6
00013
00014 #include "ClpProblem.h"
00015
00016 #define OWN_ELCGFMAMRSOLVER
00017 #include "ClpStdELCGFMProblem.h"
00018
00019 class FluidSolverSpecific :
00020 public AMRELCGFMSolver<VectorType,FixupType,FlagType,DIM> {
00021 typedef VectorType::InternalDataType DataType;
00022 typedef AMRELCGFMSolver<VectorType,FixupType,FlagType,DIM> base;
00023 typedef F77GFMFileOutput<VectorType,FixupType,FlagType,DIM> output_type;
00024 public:
00025 FluidSolverSpecific() : base(_IntegratorSpecific, _InitialConditionSpecific,
00026 _BoundaryConditionsSpecific) {
00027 SetLevelTransfer(new F77LevelTransfer<VectorType,DIM>(f_prolong, f_restrict));
00028 SetFileOutput(new output_type(*this,f_flgout));
00029 SetFixup(new FixupSpecific(_IntegratorSpecific));
00030 SetFlagging(new FlaggingSpecific(*this));
00031 AddGFM(new GhostFluidMethod<VectorType,DIM>(
00032 new F77ELCGFMBoundary<VectorType,DIM>(f_ibndrfl,f_itrans,*this),
00033 new CPTLevelSet<DataType,DIM>()));
00034 AddGFM(new GhostFluidMethod<VectorType,DIM>(
00035 new F77GFMBoundary<VectorType,DIM>(f_ibndrfl,f_itrans),
00036 new F77GFMLevelSet<DataType,DIM>(f_lset)));
00037 SetCoupleGFM(0);
00038 }
00039
00040 ~FluidSolverSpecific() {
00041 DeleteGFM(_GFM[1]);
00042 DeleteGFM(_GFM[0]);
00043 delete _Flagging;
00044 delete _Fixup;
00045 }
00046
00047 virtual void SendBoundaryData() {
00048 START_WATCH
00049 for (register int l=0; l<=FineLevel(base::GH()); l++)
00050 ((output_type*) _FileOutput)->Transform(base::U(), base::Work(),
00051 CurrentTime(base::GH(),l), l,
00052 base::Dim()+4, base::t[l]);
00053 END_WATCH(FLUID_CPL_PRESSURE_CALCULATE)
00054 base::SendBoundaryData();
00055 }
00056
00057 protected:
00058 IntegratorSpecific _IntegratorSpecific;
00059 InitialConditionSpecific _InitialConditionSpecific;