1#ifndef COMPOSITE_STEP_SOLVERS
2#define COMPOSITE_STEP_SOLVERS
7#include <boost/timer/timer.hpp>
18 template<
class DirectSolver>
22 DirectInnerSolver(
int numberOfBlocks_,
bool stabilization_=
true) : numberOfBlocks(numberOfBlocks_), stabilization(stabilization_) {}
46 std::vector<double> r,s, soladj;
51 std::vector<double> rg(sz,0.0),rc(sz,0.0);
52 for(
int i=0;i<r.size();++i) rg[i]=r[i];
53 for(
int i=0;i<s.size();++i) rc[i+r.size()]=s[i];
55 solver->solve(rg,soladj);
56 solver->solve(rc,sol);
57 for(
int i=r.size(); i<sol.size();++i) sol[i]=soladj[i];
63 void ax(std::vector<double>& sol, std::vector<double>
const &r)
const
65 std::vector<double> r1(sz,0.0),x;
66 if(stabilization && ATx.size()!=0)
67 for(
int i=0;i<r.size();++i)
70 for(
int i=0;i<r.size();++i)
73 if(stabilization) AT.
ax(ATx,x);
74 for(
int i=0; i<sol.size(); ++i) sol[i]=x[i];
79 std::vector<double> s,r2(sz,0.0);
81 for(
int i=0;i<s.size();++i) r2[i+lin.
rows(0,numberOfBlocks)]=s[i];
82 solver->solve(r2,sol);
83 for(
int i=lin.
rows(0,numberOfBlocks); i<sol.size();++i) sol[i]=0.0;
88 mutable std::vector<double> ATx;
89 std::unique_ptr<DirectSolver> solver;
90 int numberOfBlocks, sz;
94 template <
class VectorImpl,
class InnerSolver>
103 ProjTCGSolver(InnerSolver& solver_,
int numberOfBlocks_) : solver(solver_), numberOfBlocks(numberOfBlocks_) {}
109 virtual int doSolve(std::vector<AbstractVector* >& correction,
115 boost::timer::cpu_timer timer;
117 std::vector<double> r(lN.
rows(0,numberOfBlocks),0.0);
123 for(
int i=0; i<r.size(); ++i)
127 std::cout <<
"r:" << rsum <<
" " << r.size() <<
" " << numberOfBlocks << std::endl;
130 int dimx=lT.
rows(0,numberOfBlocks);
131 std::vector<double> x,p,normalstep;
132 x.reserve(lT.
size());
133 p.reserve(lT.
size());
149 H.
axpy(r,normalstep,nu0);
151 for(
int i=0; i< r.size(); ++i)
158 int exit=projectedtcg(x,p,H,solver,r,1e-6,100);
160 for(
int i=0; i<dimx;++i) x[i] *= -1.0;
161 for(
int i=dimx; i<lT.
size();++i) x.push_back(0.0);
164 std::cout <<
" ProjTCG:" << (double)(timer.elapsed().user)/1e9 << std::endl;
168 for(
int i=0; i<dimx;++i) p[i] *= -1.0;
169 for(
int i=dimx; i<lT.
size();++i) p.push_back(0.0);
181 template <
class VectorImpl,
class InnerSolver>
190 TCGSolver(InnerSolver& solver_,
int numberOfBlocks_) : solver(solver_), numberOfBlocks(numberOfBlocks_) {}
195 virtual int doSolve(std::vector<AbstractVector* >& correction,
201 int dimx=lT.
rows(0,numberOfBlocks);
202 std::vector<double> x,p,normalstep;
206 solver.solveTCG(x,p,lT,lN,normalstep,nu0);
208 for(
int i=0; i<dimx;++i) x[i] *= -1.0;
209 for(
int i=dimx; i<x.size();++i) x[i] *= 0.0;
213 for(
int i=0; i<dimx;++i) p[i] *= -1.0;
214 for(
int i=dimx; i<p.size();++i) p[i] *= 0.0;
225 template <
class VectorImpl,
class InnerSolver>
236 PINVSolver(InnerSolver& solver_,
int numberOfBlocks_) : solver(solver_), numberOfBlocks(numberOfBlocks_) {};
244 virtual void doSolve(AbstractVector& correction,
245 AbstractVector& iterate,
249 int dimx=l.
rows(0,numberOfBlocks);
250 if(dimx==l.
size())
return;
251 std::vector<double> xcor(l.
size(),0.0);
252 solver.solveAdjAndNormal(xcor,l);
253 for(
int i=0; i< xcor.size(); ++i) xcor[i]*=-1.0;
255 std::vector<double> xiterate;
260 for(
int i=dimx; i< xcor.size(); ++i)
262 xiterate[i]= xcor[i];
272 virtual void doResolve(AbstractVector& correction,
273 AbstractLinearization
const& lin)
const
275 SparseLinearSystem
const &l =
dynamic_cast<SparseLinearSystem
const &
>(lin);
276 int dimx=l.
rows(0,numberOfBlocks);
277 if(l.size()==dimx)
return;
278 std::vector<double> x(l.size(),0.0);
279 solver.resolveNormal(x,l);
280 for(
int i=0; i< dimx; ++i) x[i]*=-1.0;
281 for(
int i=dimx; i< x.size(); ++i) x[i]=0.0;
283 dynamic_cast<Bridge::Vector<VectorImpl>&
>(correction).read(x);
286 MatrixAsTriplet<double> m;
287 mutable MatrixAsTriplet<double> P;
virtual AbstractFunctionSpaceElement const & getOrigin() const =0
Get point of linearization.
Class that models the functionality of a (possibly inexact) linear solver.
void resolveNormal(std::vector< double > &sol, SparseLinearSystem const &lin)
void ax(std::vector< double > &sol, std::vector< double >const &r) const
DirectInnerSolver(int numberOfBlocks_, bool stabilization_=true)
void solveAdjAndNormal(std::vector< double > &sol, SparseLinearSystem const &lin)
virtual double getRelativeAccuracy()
virtual void setRelativeAccuracy(double accuracy)
virtual double getAbsoluteAccuracy()
void computeSimplifiedCorrection(Kaskade::AbstractVector &, const Kaskade::AbstractLinearization &) const
virtual bool improvementPossible()
PINVSolver(InnerSolver &solver_, int numberOfBlocks_)
void computeCorrectionAndAdjointCorrection(Kaskade::AbstractVector &, Kaskade::AbstractVector &, Kaskade::AbstractLinearization &)
virtual double getRelativeAccuracy()
virtual int nSolutionVectors() const
The maximal number of solution vectors, returned by basis.
ProjTCGSolver(InnerSolver &solver_, int numberOfBlocks_)
virtual bool improvementPossible()
virtual void setRelativeAccuracy(double accuracy)
Specify accuracy that should be achieved.
virtual double getAbsoluteAccuracy()
TCGSolver(InnerSolver &solver_, int numberOfBlocks_)
virtual int nSolutionVectors() const
The maximal number of solution vectors, returned by basis.
virtual double getRelativeAccuracy()
virtual bool improvementPossible()
virtual void setRelativeAccuracy(double accuracy)
Specify accuracy that should be achieved.
virtual double getAbsoluteAccuracy()
Mathematical Vector that supports copy-on-write, implements AbstractFunctionSpaceElement.
virtual void read(std::vector< double > const &in, int vbegin, int vend)
virtual void write(std::vector< double > &out, int vbegin, int vend) const
SparseIndexInt nrows() const
Returns number of rows (computes them, if not known)
std::vector< SparseIndexInt > ridx
row indices
std::vector< SparseIndexInt > cidx
column indices
void shiftIndices(SparseIndexInt row, SparseIndexInt col)
Shifts matrix indices. Can be used together with += to concatenate sparese matrices.
std::vector< Scalar > data
data
void axpy(Y &out, X const &in, Scalar alpha=1.0, int nvectors=1) const
Matrix-vector multiplication: out += alpha * (*this) * in.
void ax(Y &out, X const &in) const
Matrix-vector multiplication: out = (*this) * in.
Abstract base class for a sparse linear system.
virtual void getMatrixBlocks(MatrixAsTriplet< double > &mat, int rbegin, int rend, int colbegin, int colend) const =0
Return matrix blocks of the linear system in triplet format.
virtual void getRHSBlocks(std::vector< double > &rhs, int rbegin, int rend) const =0
Return components of the right hand side of the linear system.
virtual void getMatrix(MatrixAsTriplet< double > &mat) const
Return the matrix of the linear system in triplet format.
virtual int cols(int colbegin, int colend) const =0
virtual int nRowBlocks() const =0
number of row blocks
virtual int size() const
Return the number of variables of the linear system.
virtual int rows(int rbegin, int rend) const =0
virtual int nColBlocks() const =0
number of column blocks
Functional::Scalar d1(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet &x, typename Functional::Scalar tolerance=1e-6, typename Functional::Scalar increment=1e-12, bool toFile=false, std::string const &filename=std::string("d1error"))
Functional::Scalar d2(Assembler &assembler, Functional const &f, typename Functional::AnsatzVars::VariableSet const &x, typename Functional::Scalar increment=1e-12, typename Functional::Scalar tolerance=1e-6, bool toFile=false, std::string const &savefilename=std::string("d2error"))
Bridge classes that connect low level FE algorithms to higher level algorithms.