• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • Related Pages
    • combl.f
    • cuser.i
    • init3.f
    • lset3.f
    • Makefile.am
    • physbd3.f
    • saux3.f
    • src3cjburn.f
    • Problem.h
    • ip3euzndrfl.f
    • chk3euznd.f
    • rpn3euzndvlg.f
    • rpt3euznd.f
    • flgout3euznd.f
    • rec3euznd.f
    • flx3euznd.f
    • amr_main.C
    • File List
    • File Members

    fsi/sfc-amroc/TubeCJBurnSlot/src/Problem.h

    Go to the documentation of this file.
    00001 // -*- C++ -*-
    00002 
    00003 // Copyright (C) 2003-2007 California Institute of Technology
    00004 // Ralf Deiterding, ralf@cacr.caltech.edu
    00005 
    00006 #ifndef AMROCFLUIDPROBLEMH
    00007 #define AMROCFLUIDPROBLEMH
    00008 
    00009 #include "eulerznd3.h"
    00010 
    00011 #undef  NAUX
    00012 #define NAUX  2
    00013 
    00014 #include "ClpProblem.h"
    00015 
    00016 #define MaxIntPoints (20)
    00017 #define MaxDPoints (10)
    00018 
    00019 #define OWNFLAGGING
    00020 #define OWNGFMAMRSOLVER
    00021 #include "ClpStdGFMProblem.h" 
    00022 #include "AMRGFMInterpolation.h"
    00023 #include "StatCPTLevelSet.h"
    00024 
    00025 class FlaggingSpecific : 
    00026   public AMRFlagging<VectorType,FixupType,FlagType,DIM> {
    00027   typedef AMRFlagging<VectorType,FixupType,FlagType,DIM> base;
    00028 public:
    00029   FlaggingSpecific(base::solvertype& solver) : base(solver) {
    00030       base::AddCriterion(new ByValue<VectorType,FlagType,DIM>());
    00031       base::AddCriterion(new ScaledGradient<VectorType,FlagType,DIM>());
    00032       base::AddCriterion(new LimiterType<VectorType,FlagType,DIM>());
    00033       base::AddCriterion(new AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver));
    00034       base::AddCriterion(new RelativeError<VectorType,FixupType,FlagType,DIM>(solver));
    00035 #ifdef fflgout
    00036       base::AddCriterion(new F77ByValue<VectorType,FlagType,DIM>(fflgout));
    00037       base::AddCriterion(new F77ScaledGradient<VectorType,FlagType,DIM>(fflgout));
    00038       base::AddCriterion(new F77LimiterType<VectorType,FlagType,DIM>(fflgout));
    00039       base::AddCriterion(new F77AbsoluteError<VectorType,FixupType,FlagType,DIM>(solver,fflgout));
    00040       base::AddCriterion(new F77RelativeError<VectorType,FixupType,FlagType,DIM>(solver,fflgout));
    00041 #endif
    00042       dcmin = new int[MaxDPoints*base::Dim()];
    00043       dcmax = new int[MaxDPoints*base::Dim()];
    00044       dclev = new int[MaxDPoints];
    00045       for (int d=0; d<MaxDPoints*base::Dim(); d++) {
    00046         dcmin[d] = 0; dcmax[d] = -1;
    00047       }
    00048       for (int i=0; i<MaxDPoints; i++)
    00049         dclev[i] = 1000000;
    00050     }
    00051 
    00052   ~FlaggingSpecific() { 
    00053     DeleteAllCriterions(); 
    00054     delete [] dcmin;
    00055     delete [] dcmax;
    00056   }
    00057 
    00058   virtual void registerat(ControlDevice& Ctrl, const std::string& prefix) {
    00059     base::registerat(Ctrl, prefix);
    00060     char VariableName[32];
    00061     for (int i=0; i<MaxDPoints; i++) {
    00062       for (int d=0; d<base::Dim(); d++) {
    00063         sprintf(VariableName,"DCellsMin(%d,%d)",i+1,d+1);
    00064         RegisterAt(base::LocCtrl,VariableName,dcmin[i*base::Dim()+d]);
    00065         sprintf(VariableName,"DCellsMax(%d,%d)",i+1,d+1);
    00066         RegisterAt(base::LocCtrl,VariableName,dcmax[i*base::Dim()+d]);
    00067       }
    00068       sprintf(VariableName,"DMinLevel(%d)",i+1);
    00069       RegisterAt(base::LocCtrl,VariableName,dclev[i]);
    00070     }
    00071   }
    00072   virtual void registerat(ControlDevice& Ctrl) {
    00073     registerat(Ctrl, "");
    00074   }
    00075 
    00076   virtual void SetFlags(const int Time, const int Level, double t, double dt) {
    00077     base::SetFlags(Time, Level, t, dt);
    00078     for (int i=0; i<MaxDPoints; i++) 
    00079       if (Level>=dclev[i]) {
    00080         Coords lb(base::Dim(), dcmin+i*base::Dim()), ub(base::Dim(), dcmax+i*base::Dim()), 
    00081                   s(base::Dim(),1);
    00082         BBox bbox(lb*RefinedBy(base::GH(),MaxLevel(base::GH())),
    00083                   ub*RefinedBy(base::GH(),MaxLevel(base::GH())),
    00084                   s*StepSize(base::GH(),Level));
    00085         forall (base::Flags(),Time,Level,c)  
    00086           base::Flags()(Time,Level,c).equals(GoodPoint, bbox);
    00087         endforall    
    00088       }
    00089   }
    00090 
    00091 private:
    00092   int *dcmin, *dcmax, *dclev;
    00093 };
    00094 
    00095 
    00096 template <class DataType, int dim>
    00097 class F77CPTLevelSet : public StatCPTLevelSet<DataType,dim> {
    00098   typedef StatCPTLevelSet<DataType,dim> base;
    00099 public:
    00100   typedef typename base::gridfcttype gridfcttype;  
    00101   typedef typename base::griddatatype griddatatype;
    00102   typedef genericfortranfunc genericfunctype; 
    00103 
    00104   typedef void (*lset3functype) ( const INTEGER& maxmx, const INTEGER& maxmy, const INTEGER& maxmz,
    00105                                      const INTEGER& mbc,
    00106                                      const INTEGER& mx, const INTEGER& my, const INTEGER& mz,
    00107                                      const DOUBLE x[], const DOUBLE y[], const DOUBLE z[],
    00108                                      const DOUBLE& dx, const DOUBLE& dy, const DOUBLE& dz, 
    00109                                      DataType q[], const DOUBLE& t);
    00110 
    00111   F77CPTLevelSet() : base(), flset(0) {}
    00112   F77CPTLevelSet(genericfunctype lset) : base(), flset(lset) {}
    00113 
    00114   virtual void SetPhi(gridfcttype& phi, const int Time, const int Level, double t) { 
    00115     base::SetPhi(phi,Time,Level,t);
    00116     forall (phi,Time,Level,c)
    00117       SetGrid(phi(Time,Level,c),Level,t);    
    00118     endforall
    00119   }
    00120 
    00121   virtual void SetGrid(griddatatype& gdphi, const int& level, const double& t) {   
    00122     assert(flset != (genericfunctype) 0);
    00123     Coords ex = gdphi.extents();
    00124     DCoords lbcorner = base::GH().worldCoords(gdphi.lower(), gdphi.stepsize());
    00125     DCoords dx = base::GH().worldStep(gdphi.stepsize());
    00126     int maxm[3], mx[3], d;
    00127     DataType* x[3];
    00128     for (d=0; d<dim; d++) {
    00129       maxm[d] = ex(d);
    00130       mx[d] = ex(d)-2*base::NGhosts();
    00131       x[d] = new DataType[maxm[d]];
    00132       for (int i=0; i<maxm[d]; i++) x[d][i] = (i+0.5)*dx(d)+lbcorner(d);
    00133     }
    00134 
    00135     ((lset3functype) flset)(AA(3,mx), base::NGhosts(), AA(3,mx), 
    00136                                 AA(3,x), AA(3,dx), gdphi.data(), t);
    00137 
    00138     for (d=0; d<dim; d++) 
    00139       delete [] x[d];
    00140   }
    00141 
    00142   inline void SetFunc(genericfunctype lset) { flset = lset; }
    00143   genericfunctype GetFunc() const { return flset; }
    00144 
    00145 protected:
    00146   genericfunctype flset;
    00147 };
    00148 
    00149 
    00150 
    00151 class SolverSpecific : 
    00152   public AMRGFMSolver<VectorType,FixupType,FlagType,DIM> {
    00153   typedef VectorType::InternalDataType DataType;
    00154   typedef AMRGFMSolver<VectorType,FixupType,FlagType,DIM> base;
    00155   typedef AMRGFMInterpolation<VectorType,FixupType,FlagType,DIM> interpolationtype;
    00156 public:
    00157   typedef F77GFMFileOutput<VectorType,FixupType,FlagType,DIM> outputtype;
    00158   typedef interpolationtype::pointtype pointtype;
    00159 
    00160   SolverSpecific(IntegratorSpecific& integ, 
    00161                  base::initialconditiontype& init,
    00162                  base::boundaryconditionstype& bc) : base(integ, init, bc) {
    00163     SetLevelTransfer(new F77LevelTransfer<VectorType,DIM>(fprolong, frestrict));
    00164     SetFileOutput(new outputtype(*this,fflgout)); 
    00165     SetFixup(new FixupSpecific(IntegratorSpecific));
    00166     SetFlagging(new FlaggingSpecific(*this)); 
    00167     AddGFM(new GhostFluidMethod<VectorType,DIM>(
    00168               new F77GFMBoundary<VectorType,DIM>(fibndrfl,fitrans),
    00169               new F77CPTLevelSet<DataType,DIM>(flset)));
    00170     Interpolation = new interpolationtype(*this);
    00171     NIntPoints = 0;
    00172     IntName = "ptrack.txt";
    00173   }  
    00174  
    00175   ~SolverSpecific() {
    00176     DeleteGFM(GFM[0]);
    00177     delete Flagging;
    00178     delete Fixup;
    00179     delete Interpolation;
    00180   }
    00181 
    00182   virtual void registerat(ControlDevice& Ctrl, const std::string& prefix) {
    00183     base::registerat(Ctrl,prefix);
    00184     IntCtrl = base::LocCtrl.getSubDevice("TrackPressure");
    00185     RegisterAt(IntCtrl,"NPoints",NIntPoints);
    00186     char VariableName[32];
    00187     for (int nc=0; nc<MaxIntPoints; nc++) {
    00188       for (int d=0; d<base::Dim(); d++) {
    00189         std::sprintf(VariableName,"Point(%d,%d)",nc+1,d+1);
    00190         RegisterAt(IntCtrl,VariableName,IntPoints[nc](d)); 
    00191         IntPoints[nc](d) = 0.0;
    00192       }
    00193     }
    00194     RegisterAt(IntCtrl,"FileName",IntName);
    00195   } 
    00196   virtual void registerat(ControlDevice& Ctrl) {
    00197     base::registerat(Ctrl);
    00198   }
    00199 
    00200   virtual void SetupData() {
    00201     base::SetupData();
    00202     Interpolation->SetupData(base::PGH(), base::NGhosts());
    00203   }
    00204 
    00205   virtual void Advance(double& t, double& dt) {
    00206     base::Advance(t,dt);
    00207     if (NIntPoints<=0 || NIntPoints>MaxIntPoints) return;
    00208 
    00209     int me = MYPROC;
    00210     // Calculate pressure
    00211     for (register int l=0; l<=FineLevel(base::GH()); l++) {
    00212       int Time = CurrentTime(base::GH(),l);
    00213       int presscnt = base::Dim()+4;
    00214       ((outputtype*) FileOutput)->Transform(base::U(), base::Work(), Time, l, 
    00215                                               presscnt, base::t[l]);
    00216     }
    00217 
    00218     DataType* p = new DataType[NIntPoints];
    00219     Interpolation->PointsValues(base::Work(),base::t[0],NIntPoints,IntPoints,p);
    00220     Interpolation->ArrayCombine(VizServer,NIntPoints,p);
    00221 
    00222     // Append to output file only on processor VizServer
    00223     if (me == VizServer) {
    00224       std::ofstream outfile;
    00225       std::ostream* out;
    00226       outfile.open(IntName.cstr(), std::ios::out | std::ios::app);
    00227       out = new std::ostream(outfile.rdbuf());
    00228       *out << base::t[0];
    00229       for (int ns=0; ns<NIntPoints; ns++)
    00230         *out << " " << p[ns]; 
    00231       *out << std::endl;
    00232       outfile.close();
    00233       delete out;      
    00234     }
    00235 
    00236     delete [] p;
    00237   } 
    00238 
    00239 protected:
    00240   IntegratorSpecific IntegratorSpecific;
    00241   InitialConditionSpecific InitialConditionSpecific;
    00242   BoundaryConditionsSpecific BoundaryConditionsSpecific;
    00243   interpolationtype* Interpolation; 
    00244   ControlDevice IntCtrl;
    00245   int NIntPoints;
    00246   pointtype IntPoints[MaxIntPoints];
    00247   std::string IntName;