13 const std::string& name,
17 _tolerance(tolerance),
18 _initialGlobalResidualMaxNorm(0.0),
19 _initialGlobalResidualEukledianNormSquared(0.0),
20 _initialGlobalResidualHNormSquared(0.0),
21 _previousGlobalResidualMaxNorm(0.0),
22 _previousGlobalResidualEukledianNormSquared(0.0),
23 _previousGlobalResidualHNormSquared(0.0),
24 _globalDeltaUMaxNorm(0.0),
25 _globalDeltaUEukledianNormSquared(0.0),
26 _globalDeltaUHNormSquared(0.0),
27 _minH(
std::numeric_limits<
double>::max()),
29 const std::string prefix =
"Abstract";
30 std::string::size_type index =
_name.find( prefix );
31 if (index!=std::string::npos) {
32 _name.erase(index, prefix.length());
38 return _globalResidualMaxNorm;
43 int residualReducedUnderThreshold = 0;
44 int residualGrows = 0;
50 _initialGlobalResidualMaxNorm = _globalResidualMaxNorm;
52 else if (_previousGlobalResidualMaxNorm * 1.2 < _globalResidualMaxNorm) {
53 logWarning(
"terminationCriterionHolds()",
"max residual grows from " << _previousGlobalResidualMaxNorm <<
" to " << _globalResidualMaxNorm );
56 else if (_globalResidualMaxNorm / _initialGlobalResidualMaxNorm < _tolerance) {
57 residualReducedUnderThreshold++;
60 _previousGlobalResidualMaxNorm = _globalResidualMaxNorm;
61 _previousGlobalResidualEukledianNormSquared = _globalResidualEukledianNormSquared;
62 _previousGlobalResidualHNormSquared = _globalResidualHNormSquared;
64 logDebug(
"terminationCriterionHolds()",
"residualReducedUnderThreshold=" << residualReducedUnderThreshold );
65 static int numberOfResidualGrowths = 0;
66 const int numberOfChecks = 1;
67 const int residualGrowthsLimit = 50;
69 if (residualGrows==numberOfChecks) numberOfResidualGrowths++;
71 bool output = (residualReducedUnderThreshold==numberOfChecks or numberOfResidualGrowths > residualGrowthsLimit);
73 if (residualReducedUnderThreshold==numberOfChecks)
74 logInfo(
"terminationCriterionHolds()",
"ONLY CHECKING MAX-NORM: terminating because residualReducedUnderThreshold==" << residualReducedUnderThreshold );
76 if (numberOfResidualGrowths > residualGrowthsLimit)
77 logInfo(
"terminationCriterionHolds()",
"terminating because numberOfResidualGrowths==" << numberOfResidualGrowths );
86 _globalResidualMaxNorm = 0.0;
87 _globalResidualEukledianNormSquared = 0.0;
88 _globalResidualHNormSquared = 0.0;
90 _globalDeltaUMaxNorm = 0.0;
91 _globalDeltaUEukledianNormSquared = 0.0;
92 _globalDeltaUHNormSquared = 0.0;
106 _globalResidualMaxNorm = std::max( _globalResidualMaxNorm,
std::abs(residual) );
107 _globalResidualEukledianNormSquared += residual * residual;
118 _globalDeltaUMaxNorm = std::max( _globalDeltaUMaxNorm,
std::abs(du) );
119 _globalDeltaUEukledianNormSquared += du * du;
133 std::ostringstream msg;
135 <<
": |r|_max=" << _globalResidualMaxNorm
136 <<
", |r|_2=" << std::sqrt( _globalResidualEukledianNormSquared )
137 <<
", |r|_h=" << std::sqrt( _globalResidualHNormSquared )
138 <<
", |du|_max=" << _globalDeltaUMaxNorm
139 <<
", |du|_2=" << std::sqrt( _globalDeltaUEukledianNormSquared )
140 <<
", |du|_h=" << std::sqrt( _globalDeltaUHNormSquared )
141 <<
", h_min=" << _minH
142 <<
", h_max=" << _maxH;
148 #if defined(Parallel)
149 double residualMax = _globalResidualMaxNorm;
150 double residual2 = _globalResidualEukledianNormSquared;
151 double residualH = _globalResidualHNormSquared;
152 double duMax = _globalDeltaUMaxNorm;
153 double du2 = _globalDeltaUEukledianNormSquared;
154 double duH = _globalDeltaUHNormSquared;
#define logDebug(methodName, logMacroMessageStream)
#define logWarning(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
#define logInfo(methodName, logMacroMessageStream)
Wrapper macro around tarch::tarch::logging::Log to improve logging.
std::string _name
Name of solver.
virtual bool terminationCriterionHolds()
void updateGlobalSolutionUpdates(double deltaU, const tarch::la::Vector< Dimensions, double > &h)
void synchroniseGlobalResidualAndSolutionUpdate()
Synchronise the global stats between MPI ranks.
void updateGlobalResidual(double residual, const tarch::la::Vector< Dimensions, double > &h)
void updateMinMaxMeshSize(const tarch::la::Vector< Dimensions, double > &h)
void clearGlobalResidualAndSolutionUpdate()
Clear the global mesh stats.
Solver(const std::string &name, double tolerance)
Construct the solver.
double getGlobalResidualMaxNorm() const
virtual std::string toString() const
static tarch::logging::Log _log
static int getGlobalMasterRank()
Get the global master.
static Rank & getInstance()
This operation returns the singleton instance.
Create a lock around a boolean semaphore region.
Scalar volume(const Vector< Size, Scalar > &vector)
Computes the volume of the tetrahedron spanned by the Cartesian unit vectors scaled by the correspond...
double max(double a, double b, double c)
I need the maximum of three values all the time, to I decided to write a function for this.
bool equals(const Matrix< Rows, Cols, Scalar > &lhs, const Matrix< Rows, Cols, Scalar > &rhs, const Scalar &tolerance=NUMERICAL_ZERO_DIFFERENCE)
Compares to matrices on equality by means of a numerical accuracy.
Scalar min(const Vector< Size, Scalar > &vector)
Returns the element with minimal value (NOT absolute value).