vtf-logo

weno/applications/euler/3d/Homogeneous/src/Problem.h

00001 // -*- C++ -*-
00002 
00003 #ifndef AMROC_PROBLEM_H
00004 #define AMROC_PROBLEM_H
00005 
00006 #define DIM  3
00007 #define NEQUATIONS 9  // Euler equations for gases in 3D (5 fields), 
00008                        // +1 fields for passive scalars
00009                        // +1 field for temperature
00010                        // +1 feild to output dcflag and 
00011                        // +1 fieldsgske
00012 #define NVARS       6
00013   
00014 #include "WENOProblem.h"
00015 #define OWN_AMRSOLVER
00016 #include "WENOStdProblem.h"
00017 
00018 class SolverSpecific : 
00019   public AMRSolver<VectorType,FixupType,FlagType,DIM> {
00020   typedef VectorType::InternalDataType DataType;
00021   typedef AMRSolver<VectorType,FixupType,FlagType,DIM> base;
00022   typedef WENOF77FileOutput<VectorType,DIM> output_type;
00023 public:
00024   SolverSpecific(IntegratorSpecific& integ, 
00025                  base::initial_condition_type& init,
00026                  base::boundary_conditions_type& bc) :
00027     AMRSolver<VectorType,FixupType,FlagType,DIM>(integ, init, bc) {
00028     SetLevelTransfer(new F77LevelTransfer<VectorType,DIM>(f_prolong, f_restrict));
00029 #ifdef f_flgout
00030     SetFileOutput(new WENOF77FileOutput<VectorType,DIM>(f_flgout,f_bounds)); 
00031 #else   
00032     SetFileOutput(new FileOutput<VectorType,DIM>()); 
00033 #endif
00034     SetFixup(new FixupSpecific());
00035     SetFlagging(new FlaggingSpecific(*this)); 
00036   }  
00037 
00038   ~SolverSpecific() {
00039     delete _LevelTransfer;
00040     delete _Flagging;
00041     delete _Fixup;
00042     delete _FileOutput;
00043   }
00044 
00045   virtual void register_at(ControlDevice& Ctrl) { base::register_at(Ctrl); }
00046   virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00047     base::register_at(Ctrl, prefix);
00048   }
00049 
00050   virtual void SetupData() {
00051     base::SetupData();
00052   }
00053 
00054   virtual double Tick(int VariableTimeStepping, const double dtv[], 
00055                       const double cflv[],int& Rejections) {
00056 
00057     double cfl = base::Tick(VariableTimeStepping, dtv, cflv, Rejections);
00058 
00059     // statistics 
00060     int irho = 0;
00061     int iu   = 1;
00062     int iv   = 2;
00063     int iw   = 3;
00064     int isgs = 11;
00065     int ip = 7;
00066     int Level = 0 ;
00067     int Time = CurrentTime(base::GH(),Level);
00068     int TStep = TimeStep(base::U(),Level);
00069     double rkin, skin, pavg, pvar, rhoavg, rhovar, vol;
00070 
00071     vol = base::GH().wholebbox().upper(0)-base::GH().wholebbox().lower(0)+1;
00072     vol *= base::GH().wholebbox().upper(1)-base::GH().wholebbox().lower(1)+1;
00073     vol *= base::GH().wholebbox().upper(2)-base::GH().wholebbox().lower(2)+1;
00074 
00075     // subgrid kinetic energy
00076     forall (base::U(),Time,Level,c)
00077       ((output_type*) base::_FileOutput)->Transform(base::U(), base::Work(), 
00078                                                     Time, Level, isgs, 
00079                                                     base::t[Level]);
00080     end_forall
00081     skin = Work().GF_sum(Time,Level)/vol;
00082 
00083     // pressure
00084     forall (base::U(),Time,Level,c)
00085       ((output_type*) base::_FileOutput)->Transform(base::U(), base::Work(), 
00086                                                     Time, Level, ip, 
00087                                                     base::t[Level]);
00088        Coords ss(base::U()(Time,Level,c).bbox().stepsize());
00089        BBox bbi(base::U().interiorbbox(Time,Level,c));
00090        BeginFastIndex3(Work, Work()(Time,Level,c).bbox(), 
00091                        Work()(Time,Level,c).data(), DataType);
00092        BeginFastIndex3(WorkN, Work()(Time+TStep,Level,c).bbox(), 
00093                         Work()(Time+TStep,Level,c).data(), DataType);
00094        DataType p;
00095        for_3 (i, j, k, bbi, ss)
00096          p = FastIndex3(Work,i,j,k);
00097        FastIndex3(WorkN,i,j,k) = p*p;
00098        end_for
00099        EndFastIndex3(Work);
00100        EndFastIndex3(WorkN);
00101     end_forall
00102     pavg = Work().GF_sum(Time,Level)/vol;
00103     pvar = Work().GF_sum(Time+TStep,Level)/vol-pavg*pavg;
00104 
00105     // density
00106     forall (base::U(),Time,Level,c)
00107        Coords ss(base::U()(Time,Level,c).bbox().stepsize());
00108        BBox bbi(base::U().interiorbbox(Time,Level,c));
00109        BeginFastIndex3(U, base::U()(Time,Level,c).bbox(), 
00110                        base::U()(Time,Level,c).data(), VectorType);
00111        BeginFastIndex3(Work, Work()(Time,Level,c).bbox(), 
00112                        Work()(Time,Level,c).data(), DataType);
00113        BeginFastIndex3(WorkN, Work()(Time+TStep,Level,c).bbox(), 
00114                         Work()(Time+TStep,Level,c).data(), DataType);
00115        DataType rho;
00116        for_3 (i, j, k, bbi, ss)
00117          rho = FastIndex3(U,i,j,k)(irho);
00118          FastIndex3(Work,i,j,k) = rho;
00119          FastIndex3(WorkN,i,j,k) = rho*rho;
00120        end_for
00121        EndFastIndex3(U);
00122        EndFastIndex3(Work);
00123        EndFastIndex3(WorkN);
00124     end_forall
00125     rhoavg = Work().GF_sum(Time,Level)/vol;
00126     rhovar = Work().GF_sum(Time+TStep,Level)/vol-rhoavg*rhoavg;
00127 
00128     // reslved kinetic energy
00129     forall (base::U(),Time,Level,c)
00130        Coords ss(base::U()(Time,Level,c).bbox().stepsize());
00131        BBox bbi(base::U().interiorbbox(Time,Level,c));
00132        BeginFastIndex3(U, base::U()(Time,Level,c).bbox(), 
00133                        base::U()(Time,Level,c).data(), VectorType);
00134        BeginFastIndex3(Work, Work()(Time,Level,c).bbox(), 
00135                        Work()(Time,Level,c).data(), DataType);
00136        DataType rho, u, v, w;
00137        for_3 (i, j, k, bbi, ss)
00138          rho = FastIndex3(U,i,j,k)(irho);
00139          u = FastIndex3(U,i,j,k)(iu)/rho;
00140          v = FastIndex3(U,i,j,k)(iv)/rho;
00141          w = FastIndex3(U,i,j,k)(iw)/rho;
00142          FastIndex3(Work,i,j,k) = (u*u+v*v+w*w)/2.0;
00143        end_for
00144        EndFastIndex3(U);      
00145        EndFastIndex3(Work);
00146     end_forall
00147     rkin = Work().GF_sum(Time,Level)/vol;
00148 
00149     if (MY_PROC == VizServer) {
00150       std::ofstream outfile;
00151       std::ostream* out;
00152       std::string fname = "stats.dat";
00153       outfile.open(fname.c_str(), std::ios::out | std::ios::app);
00154       out = new std::ostream(outfile.rdbuf());
00155       *out << base::t[0] << " " << rkin << " " << skin << " " 
00156            << (rkin+skin) << " " << pvar << " " << rhovar << std::endl;
00157       outfile.close();
00158       delete out;      
00159     }
00160          
00161     return cfl;
00162   } 
00163 
00164 protected: