25 template<
class Vector>
26 typename Vector::field_type oneNorm(std::vector<Vector>
const& values)
28 return std::accumulate(values.begin(),values.end(),0.0,[](
double init,
Vector const& v)
30 return init + v.one_norm();
53 template<
class Vector>
54 typename Vector::field_type
maxNorm(std::vector<Vector>
const& values)
56 typename Vector::field_type
max = values[0].infinity_norm();
58 for (
auto i = 1u; i < values.size(); ++i)
116 template <
class Vector>
118 std::function<
Vector(
typename Vector::field_type,
Vector const&)> rhsFunc,
119 std::function<
typename Vector::field_type(std::vector<Vector>
const&)> normFunc,
120 bool verbose =
false)
123 auto const& pts = grid.
points();
127 int const n = pts.size() - 1;
130 assert(yi.size() == n+1);
131 assert(dyi.size() == n+1);
139 typename Vector::field_type norm = 0.0;
143 boost::timer::cpu_timer timer;
144 for (
int i = 1; i <= n; ++i)
147 for (
size_t t = 0; t < total.size(); ++t)
150 for (
int k = 0; k < n; ++k)
151 total += integ[i-1][k] * rhsFunc(pts[k], yi[k]);
153 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];
158 for (
int i = 0; i <= n; ++i)
161 if(verbose) std::cout <<
"yi[" << i <<
"] = " << yi[i] <<
"\n";
164 norm = normFunc(dyi);
176 template <
class Vector,
class TimeGr
id=LobattoTimeGr
id>
180 EulerSDC(
double t0,
double t1,
size_t nIntervals,
bool verbose_=
false)
181 : tbegin(t0), tend(t1), verbose(verbose_), grid(nIntervals,tbegin,tend)
184 EulerSDC(
double t0,
double t1,
size_t nIntervals,
size_t maxSDCIter,
bool verbose_=
false)
185 : tbegin(t0), tend(t1), maxSDCiterations(maxSDCIter), verbose(verbose_), grid(nIntervals,tbegin,tend)
188 EulerSDC(
double t0,
double t1,
size_t nIntervals,
size_t maxSDCIter,
double tol,
bool verbose_=
false)
189 : tbegin(t0), tend(t1), maxSDCiterations(maxSDCIter), tolerance(tol), verbose(verbose_), grid(nIntervals, tbegin, tend)
195 maxSDCiterations = maxIter;
206 std::function<
typename Vector::field_type(std::vector<Vector const&>)> normFunc)
209 std::vector<Vector> yi(grid.
points().size(),initialValue), dyi(grid.
points().size(),
Vector(0.0));
214 std::cout <<
"print entries to the vector yi" << std::endl;
215 for (
int i = 0; i < yi.size(); ++i)
216 std::cout <<
"[ " << yi[i] <<
" ]" << std::endl;
219 for (
int i = 0; i < maxSDCiterations; ++i)
221 if(verbose) std::cout <<
"Iteration : " << i <<
"\n";
223 if(verbose) std::cout <<
"norm = " << stepNorm << std::endl;
232 std::function<
typename Vector::field_type(std::vector<Vector>
const&)> normFunc)
235 std::vector<Vector> yi(grid.
points().size(),initialValue), dyi(grid.
points().size(),
Vector(0.0));
242 std::cout <<
"print entries to the vector yi" << std::endl;
243 for (
int i = 0; i < yi.size(); ++i)
244 std::cout <<
"[ " << yi[i] <<
" ]" << std::endl;
249 while (stepNorm > tolerance && loop < maxSDCiterations)
252 if(verbose) std::cout <<
"Iteration: " << loop <<
"\n";
254 if(verbose) std::cout <<
"norm = " << stepNorm << std::endl;
261 double tbegin = 0, tend = 1;
262 size_t maxSDCiterations = 100;
263 double tolerance = 0.1;
264 bool verbose =
false;
Base class to perform SDC iterations based on forward Euler method. Total iterations performed depend...
EulerSDC(double t0, double t1, size_t nIntervals, size_t maxSDCIter, double tol, bool verbose_=false)
Vector integrate(Vector const &initialValue, std::function< Vector(double, Vector const &)> rightHandSide, std::function< typename Vector::field_type(std::vector< Vector const & >)> normFunc)
EulerSDC(double t0, double t1, size_t nIntervals, bool verbose_=false)
EulerSDC(double t0, double t1, size_t nIntervals, size_t maxSDCIter, bool verbose_=false)
Vector integrateTOL(Vector const &initialValue, std::function< Vector(double, Vector const &)> rightHandSide, std::function< typename Vector::field_type(std::vector< Vector > const &)> normFunc)
void setMaxSDCIterations(size_t maxIter)
void setTolerance(double tau)
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 .
This file contains various utility functions that augment the basic functionality of Dune.
Dune::FieldVector< T, n > max(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise maximum.
Dune::FieldVector< Scalar, dim > Vector
Vector::field_type maxNorm(std::vector< Vector > const &values)
A function to compute the partial norm or norm of a vector of vectors. If denotes a vector of vector...
Vector::field_type sdcExEulerIterationStep(Kaskade::SDCTimeGrid const &grid, std::vector< Vector > &yi, std::vector< Vector > &dyi, std::function< Vector(typename Vector::field_type, Vector const &)> rhsFunc, std::function< typename Vector::field_type(std::vector< Vector > const &)> normFunc, bool verbose=false)
A single spectral defect correction iteration sweep based on explicit Euler method.