KASKADE 7 development version
abstract_interface.hh
Go to the documentation of this file.
1#ifndef ABSTRACT_INTERFACE_HH
2#define ABSTRACT_INTERFACE_HH
3
4#include <memory>
5#include <iostream>
6#include <boost/signals2.hpp>
7#include <string>
8#include <cmath>
9#include <vector>
10
11#include <dune/grid/config.h>
12#include "linalg/triplet.hh"
13
14namespace Kaskade
15{
26 {
27 public:
28 // No copy constructor.
30
32
35 {
36 if(this==&l)
37 {
38 std::vector<double> alphaV(nComponents(),alpha+1.0);
39 return doscale(alphaV);
40 }
41 else
42 return doaxpy(alpha, l, component);
43 }
44
45 AbstractFunctionSpaceElement& axpy(double alpha, AbstractFunctionSpaceElement const&l, std::string const role)
46 {
47 return axpy_role(alpha,l,role);
48 }
49
50 AbstractFunctionSpaceElement& axpy_role(double alpha, AbstractFunctionSpaceElement const&l, std::string const role)
51 {
52 for(int i=0; i<nComponents(); ++i)
53 {
54 if(getRole(i)==role) axpy(alpha,l,i);
55 }
56 return *this;
57 }
58
61 {
62 if(this==&l)
63 {
64 std::vector<double> alphaV(nComponents(),alpha+1.0);
65 return doscale(alphaV);
66 }
67 else
68 return doaxpy_(alpha, l);
69 }
70
71
74 {
75 if(this!=&v) return doassign(v);
76 return *this;
77 }
78
85 {
86 std::vector<double> lambdaV(nComponents(),lambda);
87 return doscale(lambdaV);
88 }
89
91 AbstractFunctionSpaceElement& operator*=(std::vector<double>const& lambda)
92 {
93 return doscale(lambda);
94 }
95
97
104 {
105 return doapplyAsDualTo(v,component,component+1);
106 }
107
109 {
110 return doapplyAsDualTo(v,0,nComponents());
111 }
112
113 double applyAsDualTo(AbstractFunctionSpaceElement const& v, std::string const& role) const
114 {
115 return applyAsDualTo_role(v,role);
116 }
117
118 double applyAsDualTo_role(AbstractFunctionSpaceElement const&v, std::string const role) const
119 {
120 double res(0.0);
121 for(int i=0; i<nComponents(); ++i)
122 {
123 if(getRole(i)==role) res+=applyAsDualTo(v,i);
124 }
125 return res;
126 }
127
128 virtual std::string getRole(int component) const = 0;
129
131 void swap(AbstractFunctionSpaceElement& v) { doswap(v); }
132
133 virtual int nComponents() const = 0;
134
136 virtual void writeToFile(std::string const& file, bool append, int order=1) const {}
137
139 virtual void print(std::string const& message="") const { std::cout << "AbstractFunctionSpaceElement: No printing available!" << std::endl;}
140
142 virtual std::unique_ptr<AbstractFunctionSpaceElement> clone() const = 0;
143
145 virtual std::unique_ptr<AbstractFunctionSpaceElement> initZeroVector() const = 0;
146
147 private:
149 virtual AbstractFunctionSpaceElement& doaxpy(double alpha, AbstractFunctionSpaceElement const& l, int component) = 0;
150 virtual AbstractFunctionSpaceElement& doaxpy_(double alpha, AbstractFunctionSpaceElement const& l) = 0;
152 virtual AbstractFunctionSpaceElement& doscale(std::vector<double> const& lambda) = 0;
154 virtual AbstractFunctionSpaceElement& doassign(AbstractFunctionSpaceElement const& l) = 0;
156 virtual void doswap(AbstractFunctionSpaceElement& l) = 0;
157 virtual double doapplyAsDualTo(AbstractFunctionSpaceElement const& v,int vbegin, int vend) const = 0;
158
159 protected:
161 };
162
164
167 {
168 public:
170 virtual double eval() const = 0;
172 virtual double evalL1norm() const = 0;
174 virtual void evald(AbstractFunctionSpaceElement &g, int rbegin=0, int rend=-1) const = 0;
176 void ddxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
177 {
178 d2axpy(1.0,y,x,rbegin,rend,cbegin,cend);
179 }
181 void ddtxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
182 {
183 d2taxpy(1.0,y,x,rbegin,rend,cbegin,cend);
184 }
186 virtual void d2axpy(double a, AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const = 0;
188 virtual void d2taxpy(double a, AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const = 0;
190 virtual void getMatrixBlocks(MatrixAsTriplet<double>& mat, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const = 0;//{ assert(!"not implemented"); }
192 virtual AbstractFunctionSpaceElement const& getOrigin() const = 0;
193
194 virtual void precompute() = 0;
195
196 virtual void flush() = 0;
197
199 };
200
202 {
203 public:
206 };
207
209
213 {
214 public:
216 virtual void connectToSignalForFlush(boost::signals2::signal<void()>&) = 0;
217 };
218
220 {};
221
224 {
225 public:
226 virtual double evaluate(AbstractFunctionSpaceElement const& x) const { assert(!"not implemented"); return 0; }
227 virtual std::unique_ptr<AbstractLinearization> getLinearization(AbstractFunctionSpaceElement const& x) const = 0;
228 virtual std::unique_ptr<AbstractFunctionSpaceElement> getImageVector(AbstractFunctionSpaceElement const& x) const = 0;
229 virtual bool inDomain(AbstractFunctionSpaceElement const& x) const { return true; }
231 };
232
235 {
236 public:
238 };
239
240
242 template<typename ParameterType>
244 {
245 public:
246 explicit Parameters(ParameterType const& p) : pref(p) {}
247 ParameterType const& getPars() const {return pref;}
248 private:
249 ParameterType const& pref;
250 };
251
253 template<class ParameterType>
254 Parameters<ParameterType> makePars(ParameterType const& p) { return Parameters<ParameterType>(p); }
255
256
259 {
260 public:
261 virtual std::unique_ptr<AbstractFunctional> getFunctional(AbstractParameters const&) const = 0;
262 virtual std::unique_ptr<AbstractFunctional> getParameterLinFunctional(AbstractParameters const& p) const
263 { assert(!"ParameterFunctional: Linearization not Implemented"); return getFunctional(p);}
264 virtual std::unique_ptr<AbstractFunctional> getLinFunctionValue(AbstractParameters const& p) const
265 { assert(!"ParameterFunctional: Linearization not Implemented"); return getFunctional(p);}
267 };
268
271 {
272 public:
276 { doSolve(correction, linearization);
277 correction *= -1.0;
278 }
280 void simplified(AbstractFunctionSpaceElement& correction, AbstractLinearization const& linearization, AbstractLinearization const& oldlinearization) const
281 { doResolve(correction, linearization, oldlinearization);
282 correction *= -1.0;
283 }
284
287 void simplified(AbstractFunctionSpaceElement& correction, AbstractLinearization const& linearization) const
288 { doResolve(correction, linearization);
289 correction *= -1.0;
290 }
291
293 virtual void setRelativeAccuracy(double accuracy) = 0;
295 virtual void setAbsoluteAccuracy(double) {}
297 virtual double getRelativeAccuracy() = 0;
299 virtual double getAbsoluteAccuracy() = 0;
300
301 virtual bool improvementPossible() = 0;
302
303 virtual bool changedGrid() { return false; }
304
306
308 virtual void doSolve(AbstractFunctionSpaceElement& correction,
309 AbstractLinearization& lin) = 0;
311 virtual void doResolve(AbstractFunctionSpaceElement& correction,
312 AbstractLinearization const& lin,
313 AbstractLinearization const& olin) const = 0;
314
316 virtual void doResolve(AbstractFunctionSpaceElement& correction,
317 AbstractLinearization const& lin) const = 0;
318
319 mutable boost::signals2::signal<void()> changed;
320 };
321
322
324 {
325 public:
326 virtual void addPerturbation
327 (AbstractFunctionSpaceElement& newIterate,
328 AbstractFunctionSpaceElement const& perturbation,
329 AbstractLinearization const& lin,
330 std::vector<std::shared_ptr<AbstractFunctionSpaceElement> > basis = std::vector<std::shared_ptr<AbstractFunctionSpaceElement> >()) const = 0;
331
332 virtual std::unique_ptr<AbstractChart> clone() const = 0;
333 };
334
335
337 {
338 public:
339 virtual ~AbstractNorm(){}
340 virtual double operator()(AbstractFunctionSpaceElement const&) const = 0;
341 virtual void setOrigin(AbstractLinearization const&) {}
342 };
343
345 {
346 public:
349 {
350 double sc = this->operator()(v,v);
351 if(sc < 0) std::cout << "Warning: scalar product not positive definite! Taking absolute value" << std::endl;
352 return sqrt(std::fabs(sc));
353 }
354 };
355
358 {
359 public:
360 virtual double absoluteError() const = 0;
362 };
363
366 {
367 public:
368 virtual std::unique_ptr<AbstractErrorEstimate> createEstimate(AbstractFunctionSpaceElement const& correction,
369 AbstractLinearization const& lin) const = 0;
371 };
372
375 {
376 public:
378 virtual void adapt() = 0;
380 virtual void mark(AbstractErrorEstimate&, double portion) = 0;
382 virtual void flushMarks() = 0;
384 virtual int size() = 0;
386
387 virtual int getNMarked() = 0;
388
390 mutable boost::signals2::signal<void()> gridWillChange;
391 };
392
394 {
395 public:
397
399
400 virtual void refineGrid() = 0;
401
402 virtual double estimatedAbsoluteError() const = 0;
403
404 virtual size_t gridSize() const = 0;
405
406// virtual void setNorm(AbstractNorm const&) = 0;
407 };
408
410 {
411 public:
413 virtual double d0(std::vector<double> const&) const = 0;
414 };
415
417 {
418 public:
420
421 virtual std::vector<double> d1(std::vector<double> const&) const = 0;
422 };
423
426} // namespace Kaskade
427#endif
Representation of an adaptive grid and a simple set of operations thereon.
virtual void mark(AbstractErrorEstimate &, double portion)=0
Mark elements, using an error estimate that hold error indicators.
virtual void adapt()=0
Change grid according to marked elements.
virtual void flushMarks()=0
Remove all marks in the grid.
boost::signals2::signal< void()> gridWillChange
Inform others that the grid will change.
virtual int size()=0
Number of patches.
virtual void addPerturbation(AbstractFunctionSpaceElement &newIterate, AbstractFunctionSpaceElement const &perturbation, AbstractLinearization const &lin, std::vector< std::shared_ptr< AbstractFunctionSpaceElement > > basis=std::vector< std::shared_ptr< AbstractFunctionSpaceElement > >()) const =0
virtual std::unique_ptr< AbstractChart > clone() const =0
Representation of an error estimate, i.e. the output of an error estimator.
virtual double absoluteError() const =0
Representation of an error estimator.
virtual std::unique_ptr< AbstractErrorEstimate > createEstimate(AbstractFunctionSpaceElement const &correction, AbstractLinearization const &lin) const =0
virtual void connectToSignalForFlush(boost::signals2::signal< void()> &)=0
Abstract Vector for function space algorithms.
AbstractFunctionSpaceElement & operator-=(AbstractFunctionSpaceElement const &v)
Basic vector arithmetic.
AbstractFunctionSpaceElement & operator=(AbstractFunctionSpaceElement const &v)
Assignment.
virtual void writeToFile(std::string const &file, bool append, int order=1) const
Optional output.
AbstractFunctionSpaceElement & operator+=(AbstractFunctionSpaceElement const &v)
Basic vector arithmetic.
AbstractFunctionSpaceElement & axpy(double alpha, AbstractFunctionSpaceElement const &l, int component)
*this += alpha*l
double applyAsDualTo(AbstractFunctionSpaceElement const &v) const
AbstractFunctionSpaceElement & operator*=(std::vector< double >const &lambda)
Scaling each component of the vector separately.
virtual std::string getRole(int component) const =0
virtual std::unique_ptr< AbstractFunctionSpaceElement > clone() const =0
Construction of a vector of the same type.
virtual void print(std::string const &message="") const
Optional output.
AbstractFunctionSpaceElement & axpy_role(double alpha, AbstractFunctionSpaceElement const &l, std::string const role)
virtual int nComponents() const =0
AbstractFunctionSpaceElement(AbstractFunctionSpaceElement const &)=delete
double applyAsDualTo_role(AbstractFunctionSpaceElement const &v, std::string const role) const
AbstractFunctionSpaceElement & axpy(double alpha, AbstractFunctionSpaceElement const &l)
*this += alpha*l
virtual std::unique_ptr< AbstractFunctionSpaceElement > initZeroVector() const =0
Construction of a vector of the same type.
AbstractFunctionSpaceElement & operator*=(double lambda)
Basic vector arithmetic.
AbstractFunctionSpaceElement & axpy(double alpha, AbstractFunctionSpaceElement const &l, std::string const role)
double applyAsDualTo(AbstractFunctionSpaceElement const &v, int component) const
Interpret *this as a dual vector, and apply it to v.
void swap(AbstractFunctionSpaceElement &v)
Shallow swap.
double applyAsDualTo(AbstractFunctionSpaceElement const &v, std::string const &role) const
Representation of a nonlinear functional.
virtual double evaluate(AbstractFunctionSpaceElement const &x) const
virtual bool inDomain(AbstractFunctionSpaceElement const &x) const
virtual std::unique_ptr< AbstractFunctionSpaceElement > getImageVector(AbstractFunctionSpaceElement const &x) const =0
virtual std::unique_ptr< AbstractLinearization > getLinearization(AbstractFunctionSpaceElement const &x) const =0
virtual double estimatedAbsoluteError() const =0
virtual void operator()(AbstractLinearization const &lin, AbstractFunctionSpaceElement const &x, AbstractFunctionSpaceElement const &dx, int, AbstractFunctionSpaceElement const &rhs)=0
void ddxpy(AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
Evaluate hessian times second argument: y = y+ddf*x.
virtual void getMatrixBlocks(MatrixAsTriplet< double > &mat, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const =0
Access matrix representation if available.
virtual double eval() const =0
Evaluate functional.
virtual double evalL1norm() const =0
Evaluate L1 norm of integrand.
void ddtxpy(AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
Evaluate hessian times second argument: y = y+ddf*x.
virtual void d2axpy(double a, AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const =0
Evaluate hessian times second argument: y = y+a*ddf*x.
virtual void evald(AbstractFunctionSpaceElement &g, int rbegin=0, int rend=-1) const =0
Evaluate derivative.
virtual void d2taxpy(double a, AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const =0
Evaluate hessian times second argument: y = y+a*ddf*x.
virtual AbstractFunctionSpaceElement const & getOrigin() const =0
Get point of linearization.
Class that models the functionality of a (possibly inexact) linear solver.
virtual void setAbsoluteAccuracy(double)
Specify accuracy that should be achieved.
virtual double getRelativeAccuracy()=0
Get accuracy that was actually achieved.
virtual bool improvementPossible()=0
boost::signals2::signal< void()> changed
virtual void doSolve(AbstractFunctionSpaceElement &correction, AbstractLinearization &lin)=0
Solve Newton System: correction = +F'(iterate)^{-1}F(iterate)
virtual double getAbsoluteAccuracy()=0
Get accuracy that was actually achieved.
void ordinary(AbstractFunctionSpaceElement &correction, AbstractLinearization &linearization)
virtual void setRelativeAccuracy(double accuracy)=0
Specify accuracy that should be achieved.
virtual void doResolve(AbstractFunctionSpaceElement &correction, AbstractLinearization const &lin) const =0
Solve simplified Newton system: scorrection = +F'(iterate)^{-1}F(trialIterate)
virtual void doResolve(AbstractFunctionSpaceElement &correction, AbstractLinearization const &lin, AbstractLinearization const &olin) const =0
Solve simplified Newton system: scorrection = +F'(iterate)^{-1}F(trialIterate)
void simplified(AbstractFunctionSpaceElement &correction, AbstractLinearization const &linearization, AbstractLinearization const &oldlinearization) const
void simplified(AbstractFunctionSpaceElement &correction, AbstractLinearization const &linearization) const
virtual double operator()(AbstractFunctionSpaceElement const &) const =0
virtual void setOrigin(AbstractLinearization const &)
Creates a functional from a homotopy of functionals by inserting a parameter.
virtual std::unique_ptr< AbstractFunctional > getLinFunctionValue(AbstractParameters const &p) const
virtual std::unique_ptr< AbstractFunctional > getParameterLinFunctional(AbstractParameters const &p) const
virtual std::unique_ptr< AbstractFunctional > getFunctional(AbstractParameters const &) const =0
Representation of parameters.
virtual void apply(AbstractFunctionSpaceElement const &x, AbstractFunctionSpaceElement &Px)=0
virtual void setLinearization(AbstractLinearization &)=0
virtual double operator()(AbstractFunctionSpaceElement const &, AbstractFunctionSpaceElement const &) const =0
double operator()(AbstractFunctionSpaceElement const &v) const
virtual double d0(std::vector< double > const &) const =0
virtual std::vector< double > d1(std::vector< double > const &) const =0
...for parameter dependent functionals, implements AbstractParameters
Parameters(ParameterType const &p)
ParameterType const & getPars() const
Parameters< ParameterType > makePars(ParameterType const &p)
auto & component(LinearProductSpace< Scalar, Sequence > &x)
Definition: linearspace.hh:463