00001
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
00009
00010
00011
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
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
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
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
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
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: