vtf-logo

clawpack/applications/euler_chem/3d/ConvReflDet/src/Problem.h

00001 // -*- C++ -*-
00002 
00003 // Copyright (C) 2003-2007 California Institute of Technology
00004 // Ralf Deiterding, ralf@amroc.net
00005 
00006 #ifndef AMROC_PROBLEM_H
00007 #define AMROC_PROBLEM_H
00008 
00009 #include "eulerrhok3.h"
00010 
00011 #define NEQUATIONS 14
00012 #define NEQUSED    14
00013 #define NFIXUP     13
00014 #define NAUX        6
00015 
00016 #include "ClpProblem.h"
00017 
00018 #define f_lsetrfl FORTRAN_NAME(lsrfl, LSRFL)
00019 #define f_lsetrdi FORTRAN_NAME(lsrdi, LSRDI)
00020 
00021 extern "C" {
00022   void f_lsetrfl();
00023   void f_lsetrdi();
00024 }
00025 
00026 #define OWN_FLAGGING
00027 #define OWN_GFMAMRSOLVER
00028 #include "ClpStdGFMProblem.h"
00029 #include "F77Interfaces/F77UpdateLevelTransfer.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   }