vtf-logo

AMRPreAdaptSolver.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // Copyright (C) 2002 Ralf Deiterding
00004 // Brandenburgische Universitaet Cottbus
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

Generated on Fri Aug 24 13:00:47 2007 for AMROC Fluid-solver Framework - by  doxygen 1.4.7