00001
00002
00003
00004
00005
00006
00007
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
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