00001
00002
00003
00004
00005
00006 #ifndef AMROC_AMRPREADAPT_SOLVER_H
00007 #define AMROC_AMRPREADAPT_SOLVER_H
00008
00016 #include "AMRSolver.h"
00017
00018 #include <iostream>
00019 #include <string>
00020 #include <cstdio>
00021
00022 #define MAXLEVELS 5
00023
00024 template <int dim>
00025 class Patch : public controlable {
00026 public:
00027 Patch() {
00028 lb.rank = dim;
00029 ub.rank = dim;
00030 s.rank = dim;
00031 }
00032
00033 virtual ~Patch() {}
00034
00035 virtual void register_at(ControlDevice& Ctrl) {}
00036 virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00037 LocCtrl = Ctrl.getSubDevice(prefix+"Patch");
00038 for (int d=0; d<dim; d++) {
00039 char text[8];
00040 std::sprintf(text,"lb(%d)",d+1);
00041 RegisterAt(LocCtrl,text,lb(d));
00042 std::sprintf(text,"ub(%d)",d+1);
00043 RegisterAt(LocCtrl,text,ub(d));
00044 std::sprintf(text,"s(%d)",d+1);
00045 RegisterAt(LocCtrl,text,s(d));
00046 }
00047 }
00048
00049 public:
00050 Coords lb, ub, s;
00051 ControlDevice LocCtrl;
00052 };
00053
00054
00062 template <class VectorType, class FixupType, class FlagType, int dim>
00063 class AMRPreAdaptSolver :
00064 public AMRSolver<VectorType,FixupType,FlagType,dim> {
00065
00066 typedef Integrator<VectorType,dim> integrator_type;
00067 typedef InitialCondition<VectorType,dim> initial_condition_type;
00068 typedef BoundaryConditions<VectorType,dim> boundary_conditions_type;
00069
00070 typedef AMRSolver<VectorType,FixupType,FlagType,dim> base;
00071
00072 typedef Patch<dim> patch_type;
00073
00074 public:
00075 AMRPreAdaptSolver(integrator_type& integ,
00076 initial_condition_type& init,
00077 boundary_conditions_type& bc) :
00078 base(integ, init, bc), SwitchTime(0) {
00079 for (int c=0; c<MAXLEVELS; c++) {
00080 li[c] = 0;
00081 ls[c] = 0;
00082 PatchListInit[c] = (patch_type*) 0;
00083 PatchListSwitch[c] = (patch_type*) 0;
00084 }
00085 }
00086
00087 virtual ~AMRPreAdaptSolver() {
00088 for (int c=0; c<MAXLEVELS; c++) {
00089 if (PatchListInit[c])
00090 delete [] PatchListInit[c];
00091 if (PatchListSwitch[c])
00092 delete [] PatchListSwitch[c];
00093 }
00094 }
00095
00096 virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00097 base::register_at(Ctrl,prefix);
00098 ControlDevice LocCtrlInit = base::LocCtrl.getSubDevice(prefix+"InitialRefinement");
00099 int c;
00100 for (c=0; c<MAXLEVELS; c++) {
00101 char LevelControlsName[24];
00102 std::sprintf(LevelControlsName,"PatchesOnLevel%d",c+1);
00103 RegisterAt(LocCtrlInit,LevelControlsName,li[c]);
00104 }
00105
00106 RegisterAt(base::LocCtrl,"SwitchTime",SwitchTime);
00107 ControlDevice LocCtrlSwitch = base::LocCtrl.getSubDevice(prefix+"SwitchRefinement");
00108 for (c=0; c<MAXLEVELS; c++) {
00109 char LevelControlsName[24];
00110 std::sprintf(LevelControlsName,"PatchesOnLevel%d",c+1);
00111 RegisterAt(LocCtrlSwitch,LevelControlsName,ls[c]);
00112 }
00113 }
00114 virtual void register_at(ControlDevice& Ctrl) {
00115 register_at(Ctrl, "");
00116 }
00117
00118 virtual void SetupData() {
00119 base::SetupData();
00120
00121 ControlDevice PatchCtrlInit(GetFileControlDevice("patches_init.in",""));
00122 int m;
00123 for (m=0; m<MAXLEVELS; m++) {
00124 PatchListInit[m] = new patch_type[li[m]];
00125 for (int i=0; i<li[m]; i++) {
00126 char text[5];
00127 std::sprintf(text,"%d-%d-",m+1,i+1);
00128 (PatchListInit[m])[i].register_at(PatchCtrlInit,std::string(text));
00129 }
00130 }
00131 PatchCtrlInit.update();
00132
00133 ControlDevice PatchCtrlSwitch(GetFileControlDevice("patches_switch.in",""));
00134 for (m=0; m<MAXLEVELS; m++) {
00135 PatchListSwitch[m] = new patch_type[ls[m]];
00136 for (int i=0; i<ls[m]; i++) {
00137 char text[5];
00138 std::sprintf(text,"%d-%d-",m+1,i+1);
00139 (PatchListSwitch[m])[i].register_at(PatchCtrlSwitch,std::string(text));
00140 }
00141 }
00142 PatchCtrlSwitch.update();
00143 }
00144
00145 virtual void Initialize_(const double& dt_start) {
00146 BBoxList bblist[MAXLEVELS];
00147 int m;
00148 for (m=0; m<MAXLEVELS; m++)
00149 for (int i=0; i<li[m]; i++) {
00150 std::cout << ((PatchListInit[m])[i].lb)*RefinedBy(base::GH(),MaxLevel(base::GH()))
00151 << " "
00152 << ((PatchListInit[m])[i].ub)*RefinedBy(base::GH(),MaxLevel(base::GH()))
00153 << " "
00154 << ((PatchListInit[m])[i].s)*StepSize(base::GH(),m) << std::endl;
00155
00156 bblist[m].add(BBox(((PatchListInit[m])[i].lb)*RefinedBy(base::GH(),MaxLevel(base::GH())),
00157 ((PatchListInit[m])[i].ub)*RefinedBy(base::GH(),MaxLevel(base::GH())),
00158 ((PatchListInit[m])[i].s)*StepSize(base::GH(),m)));
00159 }
00160
00161 for (m=0; m<MaxLevel(base::GH());m++)
00162 if (li[m] > 0) {
00163 Refine(base::GH(),bblist[m],m);
00164 RecomposeHierarchy(base::GH());
00165 }
00166
00167 int Store = base::RegridEvery;
00168 base::RegridEvery = 0;
00169 base::Initialize_(dt_start);
00170 base::RegridEvery = Store;
00171 }
00172
00173 virtual double Tick(int VariableTimeStepping, const double dtv[], const double cflv[],
00174 int& Rejections) {
00175 if (SwitchTime>0 &&
00176 SwitchTime*RefinedBy(base::GH(),MaxLevel(base::GH())) == CurrentTime(base::GH(),0)) {
00177 BBoxList bblist[MAXLEVELS];
00178 int m;
00179 for (m=0; m<MAXLEVELS; m++)
00180 for (int i=0; i<ls[m]; i++) {
00181 bblist[m].add(BBox(((PatchListSwitch[m])[i].lb)*RefinedBy(base::GH(),MaxLevel(base::GH())),
00182 ((PatchListSwitch[m])[i].ub)*RefinedBy(base::GH(),MaxLevel(base::GH())),
00183 ((PatchListSwitch[m])[i].s)*StepSize(base::GH(),m)));
00184 }
00185
00186 for (m=0; m<MaxLevel(base::GH());m++)
00187 if (ls[m] > 0) {
00188 Refine(base::GH(),bblist[m],m);
00189 RecomposeHierarchy(base::GH());
00190 }
00191 }
00192
00193 return (base::Tick(VariableTimeStepping, dtv, cflv, Rejections));
00194 }
00195
00196 protected:
00197 int SwitchTime;
00198 int li[MAXLEVELS];
00199 int ls[MAXLEVELS];
00200 patch_type* PatchListInit[MAXLEVELS];
00201 patch_type* PatchListSwitch[MAXLEVELS];
00202 };
00203
00204 #endif