16#include <boost/timer/timer.hpp>
36 typedef typename EvolutionEquation::AnsatzVars::VariableSet
State;
48 EvolutionEquation& eq_,
typename EvolutionEquation::AnsatzVars
const& ansatzVars_,
49 std::vector<std::pair<double,double> >
const& tolX):
50 ansatzVars(ansatzVars_), eq(&eq_,0), gop(ansatzVars.spaces),
extrap(0),
68 boost::timer::cpu_timer timer;
70 std::vector<double> stepFractions(order+1);
71 for (
int i=0; i<=order; ++i) stepFractions[i] = 1.0/(i+1);
74 int const nvars = EvolutionEquation::AnsatzVars::noOfVariables;
75 int const neq = EvolutionEquation::TestVars::noOfVariables;
76 size_t nnz = gop.
nnz(0,neq,0,nvars,
false);
77 size_t size = ansatzVars.degreesOfFreedom(0,nvars);
79 std::vector<int> ridx(nnz), cidx(nnz);
80 std::vector<double> data(nnz), rhs(size), sol(size);
82 State dx(x), dxsum(x), tmp(x);
83 double const t = eq.time();
85 eq.temporalEvaluationRange(t,t+dt);
87 for (
int i=0; i<=order; ++i) {
88 double const tau = stepFractions[i]*dt;
99 gop.toTriplet(0,neq,0,nvars,ridx.begin(),cidx.begin(),data.begin(),
false);
106 for (
int k=0; k<rhs.size(); ++k) assert(finite(rhs[k]));
107 matrix.
solve(rhs,sol);
108 for (
int k=0; k<sol.size(); ++k) assert(finite(sol[k]));
109 dx.read(sol.begin());
114 for (
int j=1; j<=i; ++j) {
116 eq.time(eq.time()+tau);
117 tmp = x; tmp += dxsum;
123 for (
int k=0; k<rhs.size(); ++k) assert(finite(rhs[k]));
124 matrix.
solve(rhs,sol);
125 for (
int k=0; k<sol.size(); ++k) assert(finite(sol[k]));
126 dx.read(sol.begin());
145 std::vector<std::pair<double,double> > e(ansatzVars.noOfVariables);
148 extrap[j].data,x.data,ansatzVars.spaces,eq.scaling(),
151 return e[0].first/(0.1+e[0].second);
154 template <
class OutStream>
166 typename EvolutionEquation::AnsatzVars
const& ansatzVars;
Extrapolated linearly implicit Euler method.
EvolutionEquation::AnsatzVars::VariableSet State
State const & step(State const &x, double dt, int order)
double estimateError(State const &x, int i, int j) const
double matrixAssemblyTime
void advanceTime(double dt)
Limex(GridManager< typename EvolutionEquation::AnsatzVars::Grid > &gridManager, EvolutionEquation &eq_, typename EvolutionEquation::AnsatzVars const &ansatzVars_, std::vector< std::pair< double, double > > const &tolX)
ExtrapolationTableau< State > extrap
void reportTime(OutStream &out) const
Self & setTau(Scalar dt)
Sets the time step size.
Proxy class for the linearization of semi-linear time stepping schemes.
Factorization of sparse linear systems with UMFPack.
void solve(std::vector< Scalar > const &b, std::vector< Scalar > &x, bool transposed=false) const
void toSequence(int rbegin, int rend, DataOutIter xi) const
Writes the subvector defined by the half-open block range [rbegin,rend) to the output iterator xi.
static unsigned int const RHS
size_t nnz(size_t rbegin=0, size_t rend=TestVariableSetDescription::noOfVariables, size_t cbegin=0, size_t cend=AnsatzVariableSetDescription::noOfVariables, bool extractOnlyLowerTriangle=false) const
Returns the number of structurally nonzero entries in the submatrix defined by the half-open block ra...
void assemble(F const &f, unsigned int flags=Assembler::EVERYTHING, int nThreads=0, bool verbose=false)
Assembly without block filter or cell filter.
void relativeError(Variables const &varDesc, Functions const &f1, Functions const &f2, Functions const &f3, Spaces const &spaces, Scaling const &scaling, OutIter out)