vtf-logo

fsi/adlib-amroc/DetonatingCanister/src/FluidProblem.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // Copyright (C) 2003-2007 California Institute of Technology
00004 // Ralf Deiterding, ralf@amroc.net
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;