00001
00002
00003
00004
00005
00006 #ifndef AMROC_PROBLEM_H
00007 #define AMROC_PROBLEM_H
00008
00009 #include "eulerrhok1.h"
00010
00011 #define NEQUATIONS 15
00012 #define NEQUSED 12
00013 #define NFIXUP 11
00014 #define NAUX 0
00015
00016 #include "ClpProblem.h"
00017
00018 #define OWN_FLAGGING
00019 #define OWN_AMRSOLVER
00020 #include "ClpStdProblem.h"
00021 #include "F77Interfaces/F77UpdateLevelTransfer.h"
00022 #include "AMRInterpolation.h"
00023
00024 #define f_track FORTRAN_NAME(track, TRACK)
00025 extern "C" {
00026 void f_track(const INTEGER &, const DOUBLE *, const DOUBLE *, DOUBLE *, INTEGER&,
00027 const DOUBLE&, const DOUBLE&, const DOUBLE&);
00028 }
00029
00030 class FlaggingSpecific :
00031 public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
00032 typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
00033 public:
00034 FlaggingSpecific(solver_type& solver) : base(solver) {
00035 base::AddCriterion(new FlagRegions<VectorType,FlagType,DIM>());
00036 base::AddCriterion(new ByValue<VectorType,FlagType,DIM>());
00037 base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
00038 base::AddCriterion(new LimiterType<VectorType,FlagType,DIM>());
00039 base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
00040 base::AddCriterion(new RelativeError<VectorType,FixupType,FlagType,DIM>(solver));
00041 base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(f_flg));
00042 base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(f_flg));
00043 base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,f_flg));
00044 base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,f_flg));
00045 }
00046 ~FlaggingSpecific() { DeleteAllCriterions(); }
00047
00048 virtual void init() {
00049 base::init();
00050 base::AddCriterion(new UnflagRegions<VectorType,FlagType,DIM>());
00051 }
00052 };
00053
00054
00055 class SolverSpecific :
00056 public AMRSolver<VectorType,FixupType,FlagType,DIM> {
00057 typedef VectorType::InternalDataType DataType;
00058 typedef AMRSolver<VectorType,FixupType,FlagType,DIM> base;
00059 typedef F77FileOutput<VectorType,DIM> output_type;
00060 typedef AMRInterpolation<VectorType,DIM> interpolation_type;
00061 typedef interpolation_type::point_type point_type;
00062 public:
00063 SolverSpecific(IntegratorSpecific& integ,
00064 base::initial_condition_type& init,
00065 base::boundary_conditions_type& bc) : base(integ, init, bc) {
00066 SetLevelTransfer(new F77UpdateLevelTransfer<VectorType,DIM>(f_prolong, f_restrict, f_tupdate));
00067 SetFileOutput(new F77FileOutput<VectorType,DIM>(f_out));
00068 SetFixup(new FixupSpecific(integ));
00069 SetFlagging(new FlaggingSpecific(*this));
00070 _Interpolation = new interpolation_type();
00071 TrackFront = -1;
00072 TrackMin = 0.1;
00073 TrackMax = 1.e4;
00074 TrackdfMin = 1000.;
00075 TrackMin2 = 0.1;
00076 TrackMax2 = 1.e4;
00077 TrackdfMin2 = 1000.;
00078 xshock_old = 0.;
00079 xdet_old = 0.;
00080 t_old = 0.;
00081 }
00082
00083 ~SolverSpecific() {
00084 delete _LevelTransfer;
00085 delete _Flagging;
00086 delete _Fixup;
00087 delete _FileOutput;
00088 delete _Interpolation;
00089 }
00090
00091 virtual void register_at(ControlDevice& Ctrl) { base::register_at(Ctrl); }
00092 virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00093 base::register_at(Ctrl, prefix);
00094 RegisterAt(base::LocCtrl,"TrackFront",TrackFront);
00095 RegisterAt(base::LocCtrl,"TrackMin",TrackMin);
00096 RegisterAt(base::LocCtrl,"TrackMax",TrackMax);
00097 RegisterAt(base::LocCtrl,"TrackdfMin",TrackdfMin);
00098 RegisterAt(base::LocCtrl,"TrackMin2",TrackMin2);
00099 RegisterAt(base::LocCtrl,"TrackMax2",TrackMax2);
00100 RegisterAt(base::LocCtrl,"TrackdfMin2",TrackdfMin2);
00101 }
00102
00103 virtual void SetupData() {
00104 base::SetupData();
00105 _Interpolation->SetupData(base::PGH(), base::NGhosts());
00106 if (TrackFront>MaxLevel(base::GH()))
00107 TrackFront=MaxLevel(base::GH());
00108 }
00109
00110 virtual void AdvanceLevel(const int Level, int RegridEvery, bool RegridDone,
00111 bool ShadowAllowed, bool DoFixup,
00112 bool RecomposeBaseLev, bool RecomposeHighLev) {
00113
00114 base::AdvanceLevel(Level,RegridEvery,RegridDone,ShadowAllowed,
00115 DoFixup,RecomposeBaseLev,RecomposeHighLev);
00116
00117 if (Level!=TrackFront) return;
00118
00119 int me = MY_PROC;
00120 int Npoints, finelevel = FineLevel(base::GH());
00121 Npoints = base::shape[0]*RefinedBy(base::GH(),finelevel);
00122 double dx = DeltaX(base::GH(),0,finelevel);
00123
00124 DataType* p = new DataType[Npoints];
00125 DataType* r = new DataType[Npoints];
00126 DataType* xr = new DataType[Npoints];
00127 register int n;
00128
00129 for (n=0; n<Npoints; n++)
00130 r[n] = base::geom[0]+(n+0.5)*dx;
00131
00132 for (register int l=0; l<=finelevel; l++) {
00133 int Time = CurrentTime(base::GH(),l);
00134 int press_cnt = base::Dim()+4;
00135 ((output_type*) _FileOutput)->Transform(base::U(), base::Work(), Time, l,
00136 press_cnt, base::t[l]);
00137 }
00138
00139 _Interpolation->PointsValues(base::Work(),base::t[Level],Npoints,(point_type*) r,p);
00140 _Interpolation->ArrayCombine(VizServer,Npoints,p);
00141
00142 if (me == VizServer) {
00143 int nc = 0;
00144 f_track(Npoints,p,r,xr,nc,TrackMin,TrackMax,TrackdfMin);
00145 double xshock = 0.;
00146 if (nc > 0) xshock = xr[nc-1];
00147 f_track(Npoints,p,r,xr,nc,TrackMin2,TrackMax2,TrackdfMin2);
00148 double xdet = 0.;
00149 if (nc > 0) xdet = xr[nc-1];
00150 std::ofstream outfile;
00151 std::ostream* out;
00152 std::string fname = "xpos.txt";
00153 outfile.open(fname.c_str(), std::ios::out | std::ios::app);
00154 out = new std::ostream(outfile.rdbuf());
00155 *out << base::t[Level] << " " << xshock << " " << xdet << " "
00156 << (xshock-xshock_old)/(base::t[Level]-t_old)/100. << " "
00157 << (xdet-xdet_old)/(base::t[Level]-t_old)/100. << std::endl;
00158 outfile.close();
00159 t_old = base::t[Level];
00160 xshock_old = xshock;
00161 xdet_old = xdet;
00162 delete out;
00163 }
00164
00165 delete [] p;
00166 delete [] r;
00167 delete [] xr;
00168 }
00169
00170 protected:
00171 int TrackFront;
00172 double TrackMin, TrackMax, TrackdfMin;
00173 double TrackMin2, TrackMax2, TrackdfMin2;
00174 double xshock_old, xdet_old, t_old;
00175 interpolation_type* _Interpolation;
00176 };
00177
00178