Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef SUNDANCE_PROBLEMTESTING_H
00032 #define SUNDANCE_PROBLEMTESTING_H
00033
00034 #include "SundanceFunctional.hpp"
00035 #include "SundanceLinearProblem.hpp"
00036
00037 namespace Sundance
00038 {
00039
00040 using namespace Teuchos;
00041
00042
00043
00044
00045
00046
00047 bool checkErrorNorms(
00048 const Mesh& mesh,
00049 const CellFilter& filter,
00050 const Expr& numSoln,
00051 const Expr& exactSoln,
00052 const QuadratureFamily& quad,
00053 double L2Tol,
00054 double H1SemiTol,
00055 double H1Tol);
00056
00057
00058
00059
00060
00061 double fitPower(const Array<double>& h, const Array<double>& err);
00062
00063
00064
00065
00066
00067
00068
00069
00070 class LineDomain
00071 {
00072 public:
00073
00074 LineDomain(const Array<int>& nx);
00075
00076
00077 LineDomain(double a, double b, const Array<int>& nx);
00078
00079
00080 int numMeshes() const {return mesh_.size();}
00081
00082
00083 const CellFilter& left() const {return left_;}
00084
00085
00086 const CellFilter& right() const {return right_;}
00087
00088
00089 const CellFilter& interior() const {return interior_;}
00090
00091
00092 const Mesh& mesh(int i) const {return mesh_[i];}
00093
00094
00095 double a() const {return a_;}
00096
00097
00098 double b() const {return b_;}
00099
00100
00101 int nx(int i) const {return nx_[i];}
00102
00103 private:
00104 void init();
00105
00106 double a_;
00107 double b_;
00108 Array<int> nx_;
00109 CellFilter interior_;
00110 CellFilter left_;
00111 CellFilter right_;
00112 Array<Mesh> mesh_;
00113 };
00114
00115
00116
00117
00118 class LPTestSpec
00119 {
00120 public:
00121
00122 LPTestSpec() {;}
00123
00124 LPTestSpec(const std::string& solverFile, double tol)
00125 : hasProcRestriction_(false), allowedProcNumbers_(),
00126 solverFile_(solverFile), tol_(tol){}
00127
00128
00129 LPTestSpec(const std::string& solverFile, double tol,
00130 const Set<int>& allowedProcs)
00131 : hasProcRestriction_(true), allowedProcNumbers_(allowedProcs),
00132 solverFile_(solverFile), tol_(tol){}
00133
00134
00135 const double& tol() const {return tol_;}
00136
00137
00138 const std::string& solverFile() const {return solverFile_;}
00139
00140
00141 bool nProcIsAllowed(int np) const
00142 {
00143 if (!hasProcRestriction_) return true;
00144 return allowedProcNumbers_.contains(np);
00145 }
00146
00147 private:
00148 bool hasProcRestriction_;
00149
00150 Set<int> allowedProcNumbers_;
00151
00152 std::string solverFile_;
00153
00154 double tol_;
00155 };
00156
00157
00158
00159 std::ostream& operator<<(std::ostream& os, const LPTestSpec& spec);
00160
00161 class ForwardProblemTestBase;
00162
00163
00164
00165
00166 class ErrNormCalculatorBase
00167 {
00168 public:
00169
00170
00171 virtual Array<double> computeNorms(const ForwardProblemTestBase* prob,
00172 int meshIndex,
00173 const Expr& numSoln, const Expr& exactSoln) const = 0 ;
00174 };
00175
00176
00177
00178
00179 class L2NormCalculator : public ErrNormCalculatorBase
00180 {
00181 public:
00182
00183 L2NormCalculator() {}
00184
00185
00186 virtual Array<double> computeNorms(const ForwardProblemTestBase* prob,
00187 int meshIndex,
00188 const Expr& numSoln, const Expr& exactSoln) const ;
00189
00190 };
00191
00192
00193
00194
00195 class ForwardProblemTestBase
00196 {
00197 public:
00198
00199 virtual bool run(const std::string& solverFile, double tol) const ;
00200
00201
00202 virtual std::string name() const = 0 ;
00203
00204
00205 virtual Expr exactSoln() const = 0 ;
00206
00207
00208 virtual VectorType<double> vecType() const ;
00209
00210
00211 virtual Expr coord(int d) const ;
00212
00213
00214 virtual Mesh getMesh(int i) const = 0 ;
00215
00216
00217 virtual CellFilter interior() const = 0 ;
00218
00219
00220 virtual RCP<ErrNormCalculatorBase> normCalculator() const ;
00221
00222
00223
00224
00225
00226 virtual bool solve(const Mesh& mesh, const LinearSolver<double>& solver,
00227 Expr& soln) const = 0 ;
00228
00229
00230 virtual int numMeshes() const = 0 ;
00231
00232
00233
00234
00235 virtual double cellSize(int i) const ;
00236
00237
00238
00239
00240
00241 virtual Array<int> pExpected() const = 0 ;
00242
00243 private:
00244
00245 bool runSingleTest(const std::string& solverFile, const double& tol) const ;
00246
00247
00248 bool runTestSequence(const std::string& solverFile, const double& tol) const ;
00249 };
00250
00251
00252 class LPTestBase : public ForwardProblemTestBase
00253 {
00254 public:
00255
00256
00257 virtual Array<LPTestSpec> specs() const ;
00258
00259
00260 virtual LinearProblem prob(const Mesh& mesh) const = 0 ;
00261
00262
00263 virtual bool solve(const Mesh& mesh,
00264 const LinearSolver<double>& solver,
00265 Expr& soln) const ;
00266 };
00267
00268
00269
00270
00271 class LP1DTestBase : public LPTestBase
00272 {
00273 public:
00274
00275 LP1DTestBase(const Array<int>& nx);
00276
00277
00278 LP1DTestBase(double a, double b, const Array<int>& nx);
00279
00280
00281 CellFilter interior() const {return domain_.interior();}
00282
00283
00284 Mesh getMesh(int i) const {return domain_.mesh(i);}
00285
00286
00287 const LineDomain& domain() const {return domain_;}
00288
00289
00290 int numMeshes() const {return domain_.numMeshes();}
00291
00292 private:
00293 LineDomain domain_;
00294 };
00295
00296
00297
00298 class LPTestSuite
00299 {
00300 public:
00301
00302 LPTestSuite();
00303
00304
00305 void registerTest(const RCP<LPTestBase>& test) ;
00306
00307
00308 bool run() const ;
00309
00310 private:
00311 Array<RCP<LPTestBase> > tests_;
00312 Array<Array<LPTestSpec> > testSpecs_;
00313 };
00314
00315
00316 }
00317
00318 #endif
00319