vtf-logo

ExactSolution.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 // Copyright (C) 2002 Ralf Deiterding
00004 // Brandenburgische Universitaet Cottbus
00005 //
00006 // Copyright (C) 2003-2007 California Institute of Technology
00007 // Ralf Deiterding, ralf@amroc.net
00008 
00009 #ifndef AMROC_EXACT_SOLUTION_H
00010 #define AMROC_EXACT_SOLUTION_H
00011 
00025 template <class VectorType, int dim>
00026 class ExactSolution : public AMRBase<VectorType,dim> {
00027   typedef AMRBase<VectorType,dim> base;
00028   typedef typename VectorType::InternalDataType DataType;
00029 
00030 public:
00031   typedef typename base::vec_grid_fct_type vec_grid_fct_type;  
00032   typedef typename base::vec_grid_data_type vec_grid_data_type;
00033   typedef GridFunction<DataType,dim> grid_fct_type;
00034   typedef GridData<DataType,dim> grid_data_type;
00035 
00036   ExactSolution() : base(), ENorm(0), ENormCutOut(1), ENormAll(1), ENormComp(1) {} 
00037 
00038   virtual ~ExactSolution() {}
00039 
00040   virtual void SetGrid(vec_grid_data_type& gd, const int& level, double t) {} 
00041 
00042   virtual void register_at(ControlDevice& Ctrl, const std::string& prefix) {
00043     LocCtrl = Ctrl.getSubDevice(prefix+"Error");    
00044     RegisterAt(LocCtrl,"Norm",ENorm);    
00045     RegisterAt(LocCtrl,"NoRestrict",ENormCutOut);
00046     RegisterAt(LocCtrl,"CombineLevels",ENormAll);
00047     RegisterAt(LocCtrl,"ComponentWise",ENormComp);
00048   }
00049   virtual void register_at(ControlDevice& Ctrl) { register_at(Ctrl, ""); }
00050   virtual void init() {}
00051   virtual void update() {}
00052   virtual void finish() {}
00053 
00054   //---------------------------------------------------------------------- 
00055   // Calculate Error Norm for conservative variables 
00056   //---------------------------------------------------------------------- 
00057   virtual void ErrorNorm(vec_grid_fct_type& u, grid_fct_type& work, 
00058                          const double& t) {
00059     if (ENorm<1 || ENorm>3) 
00060       return;
00061     int me = MY_PROC;
00062     if (me == VizServer) 
00063       std::cout << "                         Error:";
00064     for (int lev=0; lev<=FineLevel(base::GH()); lev++) {
00065       int Time = CurrentTime(base::GH(),lev); 
00066       int TStep = TimeStep(u,lev);
00067       forall (u,Time+TStep,lev,c) 
00068         SetGrid(u(Time+TStep,lev,c), lev, t);
00069         u(Time+TStep,lev,c).minus(u(Time,lev,c));
00070       end_forall      
00071     }
00072 
00073     DataType *Error = (DataType *) 0;
00074     if (ENormComp) {
00075       for (int i=0; i<base::NEquations(); i++) { 
00076         for (int lev=0; lev<=FineLevel(base::GH()); lev++) {
00077           int Time = CurrentTime(base::GH(),lev); 
00078           int TStep = TimeStep(u,lev);
00079           forall (u,Time+TStep,lev,c) 
00080             equals_from(work(Time+TStep,lev,c), u(Time+TStep,lev,c), i);
00081           end_forall 
00082         }       
00083         CalculateNorm(work, Error);
00084         if (ENormAll) std::cout << "   " << Error[0];
00085         else for (int lev=0; lev<=FineLevel(base::GH()); lev++) 
00086           std::cout << "   L(" << i << "," << lev << ")=" << Error[lev];
00087       }
00088     }
00089     else {
00090       CalculateNorm(u, Error);
00091       if (ENormAll) std::cout << "   " << Error[0];
00092       else for (int lev=0; lev<=FineLevel(base::GH()); lev++) 
00093         std::cout << "   L(" << lev << ")=" << Error[lev];
00094     }
00095     if (me == VizServer) 
00096       std::cout << std::endl;
00097     if (Error) 
00098       delete [] Error;
00099   }  
00100 
00101   virtual void CalculateNorm(vec_grid_fct_type& u, double*& Error) {
00102     if (ENormAll)
00103       Error = new double[1];
00104     else
00105       Error = new double[FineLevel(base::GH())];
00106 
00107     Error[0] = 0.0;
00108     for (int lev=0; lev<=FineLevel(base::GH()); lev++) {
00109       int Time = CurrentTime(base::GH(),lev); 
00110       int TStep = TimeStep(u,lev), FTStep=0;
00111       if (lev<FineLevel(base::GH()))
00112         FTStep = TimeStep(u,lev+1);
00113       
00114       forall (u,Time+TStep,lev,c) 
00115         if (lev<FineLevel(base::GH()) && ENormCutOut) {
00116           forall (u,Time+FTStep,lev+1,c2) 
00117             BBox bb(coarsen(u.interiorbbox(Time+FTStep,lev+1,c2),base::GH().refinefactor(lev)));
00118             u(Time+TStep,lev,c).equals(VectorType(0.0),bb);
00119           end_forall      
00120         }
00121       end_forall      
00122 
00123       double ErrorLev = Norm(u,Time+TStep,lev,ENorm);
00124       if (ENormAll) {
00125         switch (ENorm) {
00126         case DAGHNormL1:
00127         case DAGHNormL2:
00128           Error[0] += ErrorLev;
00129           break;
00130         case DAGHNormMax: 
00131           Error[0] = Max(Error[0], ErrorLev);
00132           break;
00133         default:
00134           break;
00135         }
00136       }
00137       else 
00138         Error[lev] = ErrorLev;
00139     }
00140   }  
00141 
00142   virtual void CalculateNorm(grid_fct_type& u, double*& Error) {
00143     if (ENormAll)
00144       Error = new double[1];
00145     else
00146       Error = new double[FineLevel(base::GH())];
00147 
00148     Error[0] = 0.0;
00149     for (int lev=0; lev<=FineLevel(base::GH()); lev++) {
00150       int Time = CurrentTime(base::GH(),lev); 
00151       int TStep = TimeStep(u,lev), FTStep=0;
00152       if (lev<FineLevel(base::GH()))
00153         FTStep = TimeStep(u,lev+1);
00154       
00155       forall (u,Time+TStep,lev,c) 
00156         if (lev<FineLevel(base::GH()) && ENormCutOut) {
00157           forall (u,Time+FTStep,lev+1,c2) 
00158             BBox bb(coarsen(u.interiorbbox(Time+FTStep,lev+1,c2),base::GH().refinefactor(lev)));
00159             u(Time+TStep,lev,c).equals(DataType(0.0),bb);
00160           end_forall      
00161         }
00162       end_forall      
00163 
00164       double ErrorLev = Norm(u,Time+TStep,lev,ENorm);
00165       if (ENormAll) {
00166         switch (ENorm) {
00167         case DAGHNormL1:
00168         case DAGHNormL2:
00169           Error[0] += ErrorLev;
00170           break;
00171         case DAGHNormMax: 
00172           Error[0] = Max(Error[0], ErrorLev);
00173           break;
00174         default:
00175           break;
00176         }
00177       }
00178       else 
00179         Error[lev] = ErrorLev;
00180     }
00181   }  
00182 
00183  protected:
00184   int ENorm, ENormCutOut, ENormAll, ENormComp;
00185   ControlDevice LocCtrl;  
00186 };
00187 
00188 
00189 #endif

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