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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054 #ifndef _LEVELSOLVER_H_
00055 #define _LEVELSOLVER_H_
00056
00057 #include <cstdlib>
00058 #include <iostream>
00059 #include <cassert>
00060 #include <cmath>
00061
00062 #include "REAL.H"
00063 #include "IntVect.H"
00064 #include "Box.H"
00065 #include "FArrayBox.H"
00066 #include "DisjointBoxLayout.H"
00067 #include "LevelData.H"
00068 #include "LevelMG.H"
00069 #include "ProblemDomain.H"
00070
00072
00076 class LevelSolver
00077 {
00078 public:
00080
00082 LevelSolver();
00083
00085 virtual ~LevelSolver();
00086
00088
00104 LevelSolver(const DisjointBoxLayout& a_grids,
00105 const DisjointBoxLayout* a_baseGrids,
00106 const ProblemDomain& a_domain,
00107 Real a_dxLevel,
00108 int a_nRefCrse,
00109 const LevelOp* const a_opin,
00110 int a_ncomp,
00111 bool a_limitCoarsening = false);
00112
00114
00130 LevelSolver(const DisjointBoxLayout& a_grids,
00131 const DisjointBoxLayout* a_baseGrids,
00132 const Box& a_domain,
00133 Real a_dxLevel,
00134 int a_nRefCrse,
00135 const LevelOp* const a_opin,
00136 int a_ncomp = 1,
00137 bool a_limitCoarsening = false);
00138
00140
00154 virtual void define(const DisjointBoxLayout& a_grids,
00155 const DisjointBoxLayout* a_baseGrids,
00156 const ProblemDomain& a_domain,
00157 Real a_dxLevel,
00158 int a_nRefCrse,
00159 const LevelOp* const a_opin,
00160 int a_ncomp = 1,
00161 bool a_limitCoarsening = false);
00162
00164
00178 virtual void define(const DisjointBoxLayout& a_grids,
00179 const DisjointBoxLayout* a_baseGrids,
00180 const Box& a_domain,
00181 Real a_dxLevel,
00182 int a_nRefCrse,
00183 const LevelOp* const a_opin,
00184 int a_ncomp=1,
00185 bool a_limitCoarsening = false);
00186
00188 bool isDefined() const;
00189
00191 void clearMemory();
00192
00194 void setDefaultValues();
00195
00197
00200 void levelSolveH(
00201 LevelData<FArrayBox>& a_phi,
00203 const LevelData<FArrayBox>& a_rhs,
00205 bool a_initializePhiToZero=true);
00206
00208
00212 void levelSolve(
00213 LevelData<FArrayBox>& a_phi,
00215 const LevelData<FArrayBox>* a_phic,
00217 const LevelData<FArrayBox>& a_rhs,
00219 bool a_initializePhiToZero=true);
00220
00222 void setNumSmoothUp(int a_numSmoothUp);
00223
00225 void setNumSmoothDown(int a_numSmoothDown);
00226
00228 void setTolerance(Real a_tolerance);
00229
00231
00237 void setOperatorTolerance(Real a_operatorTolerance);
00238
00240 void setVerbose(bool a_verbose);
00241
00243 void setMaxIter(int a_maxIter);
00244
00246
00251
00252 void setMinIter(int a_minIter);
00253
00255
00260 virtual void setConvergenceMetric(Real a_metric, int a_comp);
00261
00263 virtual void resetConvergenceMetrics();
00264
00266 void setNormType(int a_normType);
00267
00268 protected:
00272 LevelMG m_levelMG;
00273
00277 LevelOp* m_levelOpPtr;
00278
00282 bool m_isDefined;
00283
00287 DisjointBoxLayout m_grids;
00288
00292 ProblemDomain m_domain;
00293
00297 LevelData<FArrayBox> m_resid;
00298
00302 LevelData<FArrayBox> m_scratch;
00303
00307 LevelData<FArrayBox> m_corr;
00308
00312 int m_nRefCrse;
00313
00317 Real m_dxLevel;
00318
00322 int m_maxIter;
00323
00327 int m_minIter;
00328
00332 int m_numSmoothUp;
00333
00337 int m_numSmoothDown;
00338
00342 Real m_tolerance;
00343
00347 int m_normType;
00348
00352 Vector<Real> m_convergenceMetrics;
00353
00357 Real m_operatorTolerance;
00358
00362 bool m_verbose;
00363
00364 private:
00365 void operator = (const LevelSolver&)
00366 {
00367 }
00368
00369 LevelSolver(const LevelSolver&)
00370 {
00371 }
00372 };
00373
00374 #endif