vtf-logo

clawpack/applications/intro/3d/Explosion/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 "DAGH.h"                           
00010 #include "IO/control-device.h"
00011 #include "Vector.h"
00012 #include "VectorLarge.h"
00013 
00014 #define DIM        3
00015 #define NEQUATIONS 5
00016 typedef DOUBLE DataType;
00017 typedef Vector<DataType,NEQUATIONS> VectorType;
00018 
00019 #include "DAGHFortranInterfaces.h"                           
00020 
00021 //----------------------------------------------------------------------
00022 // Clawpack integrator in Fortran 77 without usage of auxiliary array aux and 
00023 // source term integration
00024 //----------------------------------------------------------------------
00025 
00026 #define NEQUSED    5
00027 #define NWAVES     3
00028 #define NAUX       0
00029 typedef Vector<DataType,NAUX> AuxType;
00030    
00031 #define f_step_3 FORTRAN_NAME(step3, STEP3)
00032 #define f_normalflux FORTRAN_NAME(rpn3eu, RPN3EU)
00033 #define f_transverseflux FORTRAN_NAME(rpt3eu, RPT3EU)
00034 
00035 extern "C" {
00036   void f_step_3();
00037   void f_normalflux();
00038   void f_transverseflux();
00039 }
00040 
00041 #include "ClpIntegrator3.h"  
00042 
00043 class IntegratorSpecific :  
00044   public ClpIntegrator<VectorType,AuxType,DIM> {
00045 public:   
00046   IntegratorSpecific() : 
00047     ClpIntegrator<VectorType,AuxType,DIM>(NEQUSED,NWAVES,f_normalflux,f_transverseflux) {}
00048 };
00049 
00050 //----------------------------------------------------------------------
00051 // Initial conditions in Fortran 77
00052 //----------------------------------------------------------------------
00053 
00054 #define f_initial FORTRAN_NAME(ic, IC)
00055 
00056 extern "C" {
00057   void f_initial();
00058 }
00059 
00060 #include "F77Interfaces/F77InitialCondition.h"  
00061 
00062 class InitialConditionSpecific : 
00063   public F77InitialCondition<VectorType,DIM> {
00064 public:    
00065   InitialConditionSpecific() : 
00066     F77InitialCondition<VectorType,DIM>(f_initial) {}
00067 };
00068 
00069 //----------------------------------------------------------------------
00070 // Boundary conditions in Fortran 77
00071 //----------------------------------------------------------------------
00072 
00073 #define f_boundary FORTRAN_NAME(physbd, PHYSBD)
00074 
00075 extern "C" {
00076   void f_boundary();
00077 }
00078 
00079 #include "F77Interfaces/F77BoundaryConditions.h"  
00080 
00081 class BoundaryConditionsSpecific : 
00082   public F77BoundaryConditions<VectorType,DIM> {
00083 public:    
00084   BoundaryConditionsSpecific() : 
00085     F77BoundaryConditions<VectorType,DIM>(f_boundary) {}
00086 };
00087 
00088 //----------------------------------------------------------------------
00089 // Inter-level operators in Fortran 77
00090 //----------------------------------------------------------------------
00091 
00092 #define f_restrict FORTRAN_NAME(restrict3, RESTRICT3)
00093 #define f_prolong FORTRAN_NAME(prolong3, PROLONG3)
00094 
00095 extern "C" {
00096   void f_restrict();
00097   void f_prolong();
00098 }
00099 
00100 #include "F77Interfaces/F77LevelTransfer.h"  
00101 
00102 class LevelTransferSpecific : 
00103   public F77LevelTransfer<VectorType,DIM> {
00104 public:    
00105   LevelTransferSpecific() : 
00106     F77LevelTransfer<VectorType,DIM>(f_prolong, f_restrict) {}
00107 };
00108 
00109 //----------------------------------------------------------------------
00110 // Flux correction
00111 //----------------------------------------------------------------------
00112 
00113 #define NFIXUP     5   
00114 typedef Vector<DataType,NFIXUP> FixupType;
00115 
00116 #include "AMRFixup.h"  
00117 
00118 class FixupSpecific : public AMRFixup<VectorType,FixupType,DIM> {
00119 public:
00120   FixupSpecific() : AMRFixup<VectorType,FixupType,DIM>() {}
00121 };
00122 
00123 //----------------------------------------------------------------------
00124 // Flagging for refinement
00125 //----------------------------------------------------------------------
00126 
00127 typedef short FlagType; 
00128 
00129 #include "AMRFlagging.h"
00130 #include "Criteria/ScaledGradient.h"
00131 #include "Criteria/AbsoluteError.h"
00132 
00133 class FlaggingSpecific : 
00134   public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00135   typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00136 public:
00137   FlaggingSpecific(base::solver_type& solver) : base(solver) {
00138     base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
00139     base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
00140   }
00141 
00142   ~FlaggingSpecific() { DeleteAllCriterions(); }
00143 };
00144 
00145 //----------------------------------------------------------------------
00146 // Berger-Collela AMR algorithmus
00147 //----------------------------------------------------------------------
00148 
00149 #include "AMRSolver.h" 
00150 
00151 class SolverSpecific : 
00152   public AMRSolver<VectorType,FixupType,FlagType,DIM> {
00153   typedef AMRSolver<VectorType,FixupType,FlagType,DIM> base;
00154 public:
00155   SolverSpecific(IntegratorSpecific& integ, 
00156                  base::initial_condition_type& init,
00157                  base::boundary_conditions_type& bc) :
00158     AMRSolver<VectorType,FixupType,FlagType,DIM>(integ, init, bc) {
00159     SetLevelTransfer(new LevelTransferSpecific());
00160     SetFileOutput(new FileOutput<VectorType,DIM>()); 
00161     SetFixup(new FixupSpecific());
00162     SetFlagging(new FlaggingSpecific(*this)); 
00163   }  
00164 
00165   ~SolverSpecific() {
00166     delete _LevelTransfer;
00167     delete _Flagging;
00168     delete _Fixup;
00169     delete _FileOutput;
00170   }
00171 }; 
00172  
00173 //----------------------------------------------------------------------
00174 // Time stepping and file output
00175 //----------------------------------------------------------------------
00176 
00177 #include "SolverControl.h"
00178 
00179 class SolverControlSpecific : 
00180   public SolverControl {
00181 public:
00182   SolverControlSpecific(AMRSolver<VectorType,FixupType,FlagType,DIM>& solver) : 
00183     SolverControl(solver) {}