22#ifndef KASKADE_TIMESTEPPING_EULERSDC_UTIL_HH_
23#define KASKADE_TIMESTEPPING_EULERSDC_UTIL_HH_
31#include <boost/timer/timer.hpp>
33#include "dune/common/dynmatrix.hh"
34#include "dune/common/dynvector.hh"
57template<
class Vector,
class Norm>
58typename Vector::value_type
normVecDiff(std::vector<Vector>
const& y0, std::vector<Vector>
const& y1, Norm norm);
109 template<
class Vector>
111 std::function<
Vector(
typename Vector::value_type,
Vector const&)> rhsFunc,
112 std::vector<Vector> & yi, std::vector<Vector> & dyi,
113 bool verbose =
false)
116 auto const& pts = grid.
points();
120 int const n = pts.size() - 1;
123 assert(yi.size() == n+1);
124 assert(dyi.size() == n+1);
127 for (
int i = 0; i <= n; ++i)
137 boost::timer::cpu_timer timer;
138 for (
auto i = 1; i <= n; ++i)
143 for (
int k = 0; k <= n; ++k)
145 total += integ[i-1][k] * rhsFunc(pts[k], yi[k]);
148 dyi[i] = dyi[i-1] + (pts[i] - pts[i-1]) *(rhsFunc(pts[i-1],yi[i-1]+dyi[i-1]) - rhsFunc(pts[i-1],yi[i-1])) + total - yi[i] + yi[i-1];
152 for (
auto i = 0; i <= n; ++i)
156 std::cout <<
"yi[" << i <<
"] = " << yi[i] <<
"\n";
166 template<
class Vector,
class RealVector>
168 std::function<
Vector(
typename Vector::value_type,
Vector const&)> rhsFunc,
169 RealVector const& toleranceVector,
typename Vector::value_type rho,
171 std::vector<Vector> & yi, std::vector<Vector> & dyi,
172 bool verbose =
false)
175 auto const& tpts = grid.
points();
179 unsigned int const n = tpts.size() - 1;
182 assert(yi.size() == n+1);
183 assert(dyi.size() == n+1);
186 for (
auto i = 0u; i <= n; ++i)
195 std::vector<Vector> errVector(n+1,
Vector(0.0));
201 auto sz = dyi[0].size();
202 for (
auto i = 1u; i <= n; ++i)
203 errVector[i] =
Vector(toleranceVector[i]/sz);
208 for (
auto i = 1u; i <= n; ++i)
209 errVector[i] =
Vector(toleranceVector[i]);
216 boost::timer::cpu_timer timer;
217 for (
auto i = 1u; i <= n; ++i)
223 for (
auto k = 0u; k <= n; ++k)
225 total += integ[i-1][k] * (rhsFunc(tpts[k], yi[k]) + errVector[k]);
228 dyi[i] = dyi[i-1] + (tpts[i] - tpts[i-1]) *((rhsFunc(tpts[i-1],yi[i-1]+dyi[i-1]) - rhsFunc(tpts[i-1],yi[i-1]))- (1 - rho)*errVector[i-1]) + total - yi[i] + yi[i-1];
232 for (
auto i = 0u; i <= n; ++i)
236 std::cout <<
"yi[" << i <<
"] = " << yi[i] <<
"\n";
245 template <
class Vector,
class Norm>
271 std::vector<Vector>
const& yCurrent,
272 std::vector<Vector>
const& yNext,
302 std::vector<Vector>
const& yPrev,
303 std::vector<Vector>
const& yCurrent,
304 std::vector<Vector>
const& yNext) = 0;
314 template<
class Vector,
class Norm>
334 std::vector<Vector>
const& yPrev,
335 std::vector<Vector>
const& yCurrent,
336 std::vector<Vector>
const& yNext)
339 auto nCollocationPts = timePts.size();
340 alphaVec =
RealVector(nCollocationPts-1, 0.0);
346 for (
auto i = 0u; i < nCollocationPts-1; ++i)
349 for (
auto k = 0u; k < nCollocationPts-1; ++k)
350 total += std::abs(integrationMatrix[k][i]);
351 if (i != nCollocationPts-2)
352 alphaVec[i] = (total + (timePts[i+1] - timePts[i]) * (1 + rho));
370 template<
class Vector,
class Norm>
391 std::vector<Vector>
const& yPrev,
392 std::vector<Vector>
const& yCurrent,
393 std::vector<Vector>
const& yNext)
396 auto nCollocationPts = timePts.size();
400 auto alphaMat = computeAlphaMat(timePts, integrationMatrix, yPrev, yCurrent, yNext, nCollocationPts);
402 for (
int i = 0; i < nCollocationPts -1; ++i)
404 for (
int j = 0; j < nCollocationPts; ++j)
406 if (alphaMat[i][j] > gamma[j])
407 gamma[j] = alphaMat[i][j];
432 std::vector<Vector>
const& yPrev,
433 std::vector<Vector>
const& yCurrent,
434 std::vector<Vector>
const& yNext,
435 int nCollocationPts);
449 template<
class Vector,
class Norm>
450 typename Vector::value_type
normVecDiff(std::vector<Vector>
const& y0, std::vector<Vector>
const& y1,
Norm norm)
453 std::vector<Vector> dy(y0.size(),
Vector(0.0));
454 for (
auto i = 0u; i < y0.size(); ++i)
456 dy[i] = y1[i] - y0[i];
458 return norm.
value(dy);
465 template <
class Vector,
class Norm>
467 std::vector<Vector>
const& yCurrent,
468 std::vector<Vector>
const& yNext,
471 size_t n = yPrev.size();
473 std::vector<Vector> y01(n,
Vector(0.0));
474 std::vector<Vector> y12(n,
Vector(0.0));
475 for (
auto i = 0u; i < n; ++i)
477 y01[i] = yCurrent[i] - yPrev[i] ;
478 y12[i] = yNext[i] - yCurrent[i];
480 auto val01 = norm.
value(y01);
481 auto val12 = norm.
value(y12);
482 auto beta = val12/(val01 + val12);
483 auto val = val12/val01;
484 if (val > 1 || val != val)
501 template<
class Vector,
class Norm>
504 std::vector<Vector>
const& yPrev,
505 std::vector<Vector>
const& yCurrent,
506 std::vector<Vector>
const& yNext,
513 alphaMat =
RealMatrix(nCollocationPts-1, nCollocationPts, 0.0);
514 for (
auto i = 0; i < nCollocationPts-1; ++i)
516 for (
auto k = 0; k < nCollocationPts; ++k)
519 alphaMat[i][k] = std::abs(integrationMatrix[i][k]) + (timePts[i+1] - timePts[i]) * (1 + rho);
521 alphaMat[i][k] = std::abs(integrationMatrix[i][k]);
MaxNorm class derived from the abstract base class Norm. Here the max norm represents the max norm of...
Abstract base class of various norms.
virtual field_type value(std::vector< Vector > const &vecs)=0
OneNorm class derived from the abstract base class Norm.
Abstract base class of time grids for (block) spectral defect correction methods.
virtual RealVector const & points() const =0
Time points in the time step.
virtual RealMatrix const & integrationMatrix() const =0
Integration matrix .
Dune::DynamicMatrix< double > RealMatrix
typename Vector::value_type field_type
Dune::DynamicVector< double > RealVector
virtual RealVector const & computeAlphaVec(RealVector const &timePoints, RealMatrix const &integrationMatrix, std::vector< Vector > const &yPrev, std::vector< Vector > const &yCurrent, std::vector< Vector > const &yNext)=0
field_type sdcContractionFactor(std::vector< Vector > const &yPrev, std::vector< Vector > const &yCurrent, std::vector< Vector > const &yNext, Norm &norm)
virtual ~SDCUtilMaxNorm()
virtual RealVector const & computeAlphaVec(RealVector const &timePts, RealMatrix const &integrationMatrix, std::vector< Vector > const &yPrev, std::vector< Vector > const &yCurrent, std::vector< Vector > const &yNext)
Dune::DynamicVector< double > RealVector
virtual ~SDCUtilOneNorm()
Dune::DynamicVector< double > RealVector
virtual RealVector const & computeAlphaVec(RealVector const &timePts, RealMatrix const &integrationMatrix, std::vector< Vector > const &yPrev, std::vector< Vector > const &yCurrent, std::vector< Vector > const &yNext)
This file contains various utility functions that augment the basic functionality of Dune.
Dune::FieldVector< Scalar, dim > Vector
Dune::DynamicVector< double > RealVector
NormType
Enum class to define the norm type in class Norm.
Vector::value_type normVecDiff(std::vector< Vector > const &y0, std::vector< Vector > const &y1, Norm norm)
Some utility functions.
Dune::DynamicMatrix< double > RealMatrix
void sdcExplicitEulerIterationStep(Kaskade::SDCTimeGrid const &grid, std::function< Vector(typename Vector::value_type, Vector const &)> rhsFunc, std::vector< Vector > &yi, std::vector< Vector > &dyi, bool verbose=false)
void inexactSDCExplicitEulerIterationStep(Kaskade::SDCTimeGrid const &grid, std::function< Vector(typename Vector::value_type, Vector const &)> rhsFunc, RealVector const &toleranceVector, typename Vector::value_type rho, Kaskade::NormType norm_t, std::vector< Vector > &yi, std::vector< Vector > &dyi, bool verbose=false)