Commit 7b2db7e5 authored by Backofen, Rainer's avatar Backofen, Rainer
Browse files

added posibility to use est_t_max for time adaptivity. The time error may now...

added posibility to use est_t_max for time adaptivity. The time error may now be defined as est_t_combined =sum_fac*est_t_sum + max_fac*est_t_max. Default is sum_fac=1 and max_fac=0. Thus, by default adaption is working as before. 
parent 8ee949af
...@@ -49,6 +49,8 @@ namespace AMDiS { ...@@ -49,6 +49,8 @@ namespace AMDiS {
SerUtil::serialize(out, scalContents[i]->est_t_sum); SerUtil::serialize(out, scalContents[i]->est_t_sum);
SerUtil::serialize(out, scalContents[i]->est_max); SerUtil::serialize(out, scalContents[i]->est_max);
SerUtil::serialize(out, scalContents[i]->est_t_max); SerUtil::serialize(out, scalContents[i]->est_t_max);
SerUtil::serialize(out, scalContents[i]->fac_max);
SerUtil::serialize(out, scalContents[i]->fac_sum);
SerUtil::serialize(out, scalContents[i]->spaceTolerance); SerUtil::serialize(out, scalContents[i]->spaceTolerance);
SerUtil::serialize(out, scalContents[i]->timeTolerance); SerUtil::serialize(out, scalContents[i]->timeTolerance);
SerUtil::serialize(out, scalContents[i]->timeErrLow); SerUtil::serialize(out, scalContents[i]->timeErrLow);
...@@ -93,6 +95,8 @@ namespace AMDiS { ...@@ -93,6 +95,8 @@ namespace AMDiS {
SerUtil::deserialize(in, scalContents[i]->est_t_sum); SerUtil::deserialize(in, scalContents[i]->est_t_sum);
SerUtil::deserialize(in, scalContents[i]->est_max); SerUtil::deserialize(in, scalContents[i]->est_max);
SerUtil::deserialize(in, scalContents[i]->est_t_max); SerUtil::deserialize(in, scalContents[i]->est_t_max);
SerUtil::deserialize(in, scalContents[i]->fac_max);
SerUtil::deserialize(in, scalContents[i]->fac_sum);
SerUtil::deserialize(in, scalContents[i]->spaceTolerance); SerUtil::deserialize(in, scalContents[i]->spaceTolerance);
SerUtil::deserialize(in, scalContents[i]->timeTolerance); SerUtil::deserialize(in, scalContents[i]->timeTolerance);
SerUtil::deserialize(in, scalContents[i]->timeErrLow); SerUtil::deserialize(in, scalContents[i]->timeErrLow);
......
...@@ -50,6 +50,8 @@ namespace AMDiS { ...@@ -50,6 +50,8 @@ namespace AMDiS {
est_t_sum(0.0), est_t_sum(0.0),
est_max(0.0), est_max(0.0),
est_t_max(0.0), est_t_max(0.0),
fac_max(0.0),
fac_sum(1.0),
spaceTolerance(1.0), spaceTolerance(1.0),
timeTolerance(1.0), timeTolerance(1.0),
timeErrLow(1.0), timeErrLow(1.0),
...@@ -57,6 +59,7 @@ namespace AMDiS { ...@@ -57,6 +59,7 @@ namespace AMDiS {
refinementAllowed(1), refinementAllowed(1),
refineBisections(1), refineBisections(1),
coarseBisections(1) coarseBisections(1)
{ {
double totalTol = 1.0; double totalTol = 1.0;
double relSpaceErr = 1.0; double relSpaceErr = 1.0;
...@@ -73,6 +76,8 @@ namespace AMDiS { ...@@ -73,6 +76,8 @@ namespace AMDiS {
GET_PARAMETER(0, prefix + "->refinement allowed", "%d", &refinementAllowed); GET_PARAMETER(0, prefix + "->refinement allowed", "%d", &refinementAllowed);
GET_PARAMETER(0, prefix + "->refine bisections", "%d", &refineBisections); GET_PARAMETER(0, prefix + "->refine bisections", "%d", &refineBisections);
GET_PARAMETER(0, prefix + "->coarsen bisections", "%d", &coarseBisections); GET_PARAMETER(0, prefix + "->coarsen bisections", "%d", &coarseBisections);
GET_PARAMETER(0, prefix + "->sum factor", "%f", &fac_sum);
GET_PARAMETER(0, prefix + "->max factor", "%f", &fac_max);
spaceTolerance = totalTol * relSpaceErr; spaceTolerance = totalTol * relSpaceErr;
timeTolerance = totalTol * relTimeErr * timeTheta1; timeTolerance = totalTol * relTimeErr * timeTheta1;
...@@ -91,6 +96,9 @@ namespace AMDiS { ...@@ -91,6 +96,9 @@ namespace AMDiS {
/// Maximum of all time error estimates /// Maximum of all time error estimates
double est_t_max; double est_t_max;
/// factors to combine max and integral time estimate
double fac_max, fac_sum;
/// Tolerance for the (absolute or relative) error /// Tolerance for the (absolute or relative) error
double spaceTolerance; double spaceTolerance;
...@@ -220,7 +228,7 @@ namespace AMDiS { ...@@ -220,7 +228,7 @@ namespace AMDiS {
virtual bool timeToleranceReached() virtual bool timeToleranceReached()
{ {
for (unsigned int i = 0; i < scalContents.size(); i++) for (unsigned int i = 0; i < scalContents.size(); i++)
if (!(scalContents[i]->est_t_sum < scalContents[i]->timeTolerance)) if (!(getTimeEstCombined(i) < scalContents[i]->timeTolerance))
return false; return false;
return true; return true;
...@@ -229,7 +237,7 @@ namespace AMDiS { ...@@ -229,7 +237,7 @@ namespace AMDiS {
/// Returns whether time tolerance of component i is reached. /// Returns whether time tolerance of component i is reached.
virtual bool timeToleranceReached(int i) virtual bool timeToleranceReached(int i)
{ {
if (!(scalContents[i]->est_t_sum < scalContents[i]->timeTolerance)) if (!(getTimeEstCombined(i) < scalContents[i]->timeTolerance))
return false; return false;
else else
return true; return true;
...@@ -239,20 +247,31 @@ namespace AMDiS { ...@@ -239,20 +247,31 @@ namespace AMDiS {
virtual bool timeErrorLow() virtual bool timeErrorLow()
{ {
for (unsigned int i = 0; i < scalContents.size(); i++) for (unsigned int i = 0; i < scalContents.size(); i++)
if (!(scalContents[i]->est_t_sum < scalContents[i]->timeErrLow)) if (!(getTimeEstCombined(i) < scalContents[i]->timeErrLow))
return false; return false;
return true; return true;
} }
/// Returns the time estimation as a combination
/// of maximal and integral time error
double getTimeEstCombined(unsigned i) const
{
return scalContents[i]->est_t_max*scalContents[i]->fac_max
+scalContents[i]->est_t_sum*scalContents[i]->fac_sum;
}
/// Print debug information about time error and its bound. /// Print debug information about time error and its bound.
void printTimeErrorLowInfo() void printTimeErrorLowInfo()
{ {
for (unsigned int i = 0; i < scalContents.size(); i++) for (unsigned int i = 0; i < scalContents.size(); i++){
std::cout << " Time error estimate = " << scalContents[i]->est_t_sum std::cout << " Time error estimate = " << getTimeEstCombined(i)
<< " Time error estimate sum = " << scalContents[i]->est_t_sum
<< " Time error estimate max = " << scalContents[i]->est_t_max
<< " Time error low bound = " << scalContents[i]->timeErrLow << " Time error low bound = " << scalContents[i]->timeErrLow
<< " Time error high bound = " << scalContents[i]->timeTolerance << "\n"; << " Time error high bound = " << scalContents[i]->timeTolerance << "\n";
} }
}
/// Returns \ref spaceIteration. /// Returns \ref spaceIteration.
inline int getSpaceIteration() inline int getSpaceIteration()
......
...@@ -141,6 +141,7 @@ namespace AMDiS { ...@@ -141,6 +141,7 @@ namespace AMDiS {
if (!fixedTimestep_ && if (!fixedTimestep_ &&
!adaptInfo->timeToleranceReached() && !adaptInfo->timeToleranceReached() &&
adaptInfo->getTimestepIteration() <= adaptInfo->getMaxTimestepIteration() &&
!(adaptInfo->getTimestep() <= adaptInfo->getMinTimestep())) { !(adaptInfo->getTimestep() <= adaptInfo->getMinTimestep())) {
adaptInfo->setTime(adaptInfo->getTime() - adaptInfo->getTimestep()); adaptInfo->setTime(adaptInfo->getTime() - adaptInfo->getTimestep());
...@@ -148,6 +149,7 @@ namespace AMDiS { ...@@ -148,6 +149,7 @@ namespace AMDiS {
continue; continue;
} }
adaptInfo->setSpaceIteration(0); adaptInfo->setSpaceIteration(0);
...@@ -185,6 +187,7 @@ namespace AMDiS { ...@@ -185,6 +187,7 @@ namespace AMDiS {
} while(!adaptInfo->timeToleranceReached() && } while(!adaptInfo->timeToleranceReached() &&
!(adaptInfo->getTimestep() <= adaptInfo->getMinTimestep()) && !(adaptInfo->getTimestep() <= adaptInfo->getMinTimestep()) &&
adaptInfo->getTimestepIteration() <= adaptInfo->getMaxTimestepIteration()); adaptInfo->getTimestepIteration() <= adaptInfo->getMaxTimestepIteration());
adaptInfo->setLastProcessedTimestep(adaptInfo->getTimestep()); adaptInfo->setLastProcessedTimestep(adaptInfo->getTimestep());
// After successful iteration/timestep the timestep will be changed according // After successful iteration/timestep the timestep will be changed according
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment