00001
00002
00003 #ifndef AMROC_PROBLEM_H
00004 #define AMROC_PROBLEM_H
00005
00006 #define DIM 3
00007 #define NEQUATIONS 8 // Euler equations for gases in 3D (5 fields),
00008
00009
00010
00011 #define NVARS 5 // Total number of active variables
00012
00013 #include "LBMProblem.h"
00014 #include "LBMD3Q19.h"
00015
00016 typedef double DataType;
00017 typedef LBMD3Q19<DataType> LBMType;
00018
00019 #define OWN_AMRSOLVER
00020 #include "LBMStdProblem.h"
00021 #include "AMRInterpolation.h"
00022 #define SJSON
00023 #include "AMRStatistics.h"
00024
00025
00026 class SolverSpecific :
00027 public AMRSolver<MicroType,FixupType,FlagType,DIM> {
00028 typedef AMRSolver<MicroType,FixupType,FlagType,DIM> base;
00029 typedef MicroType::InternalDataType DataType;
00030 typedef AMRInterpolation<MicroType,DIM> interpolation_type;
00031 typedef interpolation_type::point_type point_type;
00032 typedef SchemeFileOutput<LBMType,DIM> output_type;
00033 typedef AMRStatistics<MicroType,interpolation_type,output_type,DIM> stat_type;
00034 public:
00035 SolverSpecific(IntegratorSpecific& integ,
00036 base::initial_condition_type& init,
00037 base::boundary_conditions_type& bc) : base(integ, init, bc) {
00038 SetLevelTransfer(new LBMF77LevelTransfer<LBMType,DIM>(integ.Scheme(), f_prolong, f_restrict));
00039 SetFileOutput(new SchemeFileOutput<LBMType,DIM>(integ.Scheme()));
00040 SetFixup(new FixupSpecific(integ.Scheme()));
00041 SetFlagging(new FlaggingSpecific(*this,integ.Scheme()));
00042 _Interpolation = new interpolation_type();
00043 _Stats = new stat_type(_Interpolation, (output_type*)_FileOutput);
00044 }
00045
00046 ~SolverSpecific() {
00047 delete _LevelTransfer;
00048 delete _Flagging;
00049 delete _Fixup;
00050 delete _FileOutput;
00051 delete _Interpolation;
00052 delete _Stats;
00053 }
00054
00055 virtual void register_at(ControlDevice& Ctrl) { base::register_at(Ctrl); }
00056 virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00057 base::register_at(Ctrl, prefix);
00058 if (_Stats) _Stats->register_at(base::LocCtrl, "");
00059 }
00060
00061 virtual void SetupData() {
00062 base::SetupData();
00063 base::NAMRTimeSteps = 1;
00064 base::AdaptBndTimeInterpolate = 0;
00065 base::Step[0].LastTime = 1.e37;
00066 base::Step[0].VariableTimeStepping = -1;
00067 base::Step[0].dtv[0] = ((LBMIntegrator<LBMType,DIM> &)Integrator_()).LBM().TimeScale();
00068
00069 _Interpolation->SetupData(base::PGH(), base::NGhosts());
00070 _Stats->Setup(base::PGH(), base::NGhosts(), base::shape, base::geom);
00071
00072 LBMType &lbm = (LBMType &)((LBMIntegrator<LBMType,DIM> &)Integrator_()).LBM();
00073 DataType u_avg_p = ((LBMBoundaryConditions<LBMType,DIM> &)BoundaryConditions_()).Side(3).aux[0];
00074 BBox wb = base::GH().wholebbox();
00075 DCoords lc = base::GH().worldCoords(wb.lower(),wb.stepsize());
00076 DCoords uc = base::GH().worldCoords(wb.upper()+wb.stepsize(),wb.stepsize());
00077 DataType l0_p=uc(0)-lc(0);
00078 DataType omega = lbm.Omega(lbm.TimeScale());
00079 double Re_p=u_avg_p*l0_p/lbm.GasViscosity();
00080 double Re_lbm=(u_avg_p/lbm.VelocityScale())*(l0_p/lbm.LengthScale())/lbm.LatticeViscosity(omega);
00081 std::cout << "l0_p=" << l0_p << " u_avg_p=" << u_avg_p
00082 << " Re_p=" << Re_p << " Re_lbm=" << Re_lbm << std::endl;
00083 assert(std::fabs(Re_p-Re_lbm)<DBL_EPSILON*LB_FACTOR);
00084 }
00085
00086 virtual void Advance(double& t, double& dt) {
00087 base::Advance(t, dt);
00088 _Stats->Evaluate(base::t, base::U(), base::Work());
00089 }
00090
00091 virtual void Initialize_(const double& dt_start) {
00092 base::Initialize_(dt_start);
00093 _Stats->Evaluate(base::t, base::U(), base::Work());
00094 }
00095
00096 protected:
00097 interpolation_type* _Interpolation;
00098 stat_type* _Stats;
00099 };