KASKADE 7 development version
newton_bridge.hh
Go to the documentation of this file.
1#ifndef NEWTON_BRIDGE_HH
2#define NEWTON_BRIDGE_HH
3
17#include <typeinfo>
18#include <iostream>
19#include <fstream>
20#include <memory>
21#include <numeric>
22#include <utility>
23#include <sys/wait.h>
24#include <sys/types.h>
25
26#include <boost/signals2.hpp>
27#include <boost/bind.hpp>
28#include <boost/fusion/include/transform.hpp>
29
30#include "abstract_interface.hh"
31#include "algorithm_base.hh"
34#include "linalg/direct.hh"
35//#include "linalg/mumps_solve.hh"
38#include "fem/istlinterface.hh"
39#include "fem/norms.hh"
40#include "io/iobase.hh"
42
43namespace Kaskade{
44
46 namespace Bridge{
47
48 template<class Implementation> Implementation& getImpl(AbstractFunctionSpaceElement& v);
49 template<class Implementation> Implementation const& getImpl(AbstractFunctionSpaceElement const& v);
50
52 template<class VectorImpl>
54 {
55 static const int nComponents = 1;
56
57 static void read(VectorImpl &out, std::vector<double> const& in, int vbegin, int vend)
58 {
59 out.resize(in.size());
60 if(vend==-1)
61 for(int i=0; i<in.size(); ++i) out[i]=in[i];
62 else
63 for(int i=vbegin; i<vend; ++i) out[i]=in[i];
64 }
65
66 static void write(VectorImpl const &in, std::vector<double> & out, int vbegin, int vend)
67 {
68 out.resize(in.size());
69 if(vend==-1)
70 for(int i=0; i<in.size(); ++i) out[i]=in[i];
71 else
72 for(int i=vbegin; i<vend; ++i) out[i]=in[i];
73 }
74
75 static void writeToFile(std::string const& name, bool append, VectorImpl const& x)
76 {
77// std::_Ios_Openmode mode= std::ios::out;
78// if(append) mode= std::ios::app;
79// std::ofstream f(name.c_str(),mode);
80// f.setf(std::ios::scientific,std::ios::floatfield);
81// f.precision(16);
82// for(int i=0; i<x.size();++i)
83// f << x[i] << " ";
84// f << "\n";
85 }
86
87 static void print(VectorImpl const& out, std::string const& message)
88 {
89 std::cout << message << "[";
90 for(int i=0; i<out.size();++i)
91 std::cout << out[i] << " ";
92 std::cout << "]" << std::endl;
93 }
94
95 static std::string getRole(const VectorImpl &out, int component) { return ""; }
96
97 static void scale(VectorImpl &out, std::vector<double> const& lambda)
98 {
99 for(int i=0; i<out.size(); ++i) out[i]*=lambda[i];
100 }
101 };
102
104 template<class Descr>
105 struct VectorTraits<VariableSet<Descr> >
106 {
108 static const int nComponents = VectorImpl::Descriptions::noOfVariables;
109
110 static void print(VectorImpl const& out, std::string const& message)
111 {
112 // Usually these vectors are too large for printing, do nothing!
113 }
114
115
116 static void read(VectorImpl &out, std::vector<double> const& in, int vbegin, int vend)
117 {
118 assert(in.size() >= out.descriptions.degreesOfFreedom(vbegin,vend));
119 out.read(vbegin,vend,in.begin());
120 }
121
122 static void write(VectorImpl const& in, std::vector<double>& out, int vbegin, int vend)
123 {
124 out.resize(in.descriptions.degreesOfFreedom(vbegin,vend),0.0);
125 in.write(vbegin,vend,out.begin());
126 }
127
128 static void writeToFile(std::string const& name, bool append, VectorImpl const& x, int order)
129 {
130// std::cout << "write file of order " << order << std::endl;
131// boost::thread writeThread([&x,&name,&order]()
132// {
133 writeVTKFile(x.descriptions.gridView,x,name,IoOptions(),order);
134// });
135// std::cout << "starting writeToFile" << std::endl;
136// // std::cout << "Nothing written.." << std::endl;
137// pid_t pid1, pid2;
138// int status;
139//
140// // Double fork, avoids zombie processes
141// if((pid1=fork())!=0)
142// {
143// std::cout << "waiting..." << std::flush;
144// waitpid(pid1, &status, 0);
145// std::cout << "done." << std::endl;
146// }
147// else
148// {
149// if((pid2=fork())!=0)
150// {
151// std::cout << "exit" << std::endl;
152// exit(0);
153// }
154// else
155// {
156// std::cout << "write before" << std::endl;
157// writeVTKFile(x.descriptions.gridView,x.descriptions,x,name,IoOptions(),order);
158// //writeAMIRAFile(x.descriptions.gridView,x.descriptions,x,name,IoOptions(),order);
159// std::cout << "exit" << std::endl;
160// exit(0);
161// }
162// }
163 }
164
165
166 struct ComponentWiseScalarMult {
167 ComponentWiseScalarMult(std::vector<double>const& s_): s(s_), i(0) {}
168 template <class Element> void operator()(Element& e) const { e *= s[i]; ++i; }
169 private:
170 std::vector<double>const& s;
171 mutable int i;
172 };
173
174 static void scale(VectorImpl &out, std::vector<double> const& lambda)
175 {
176 boost::fusion::for_each(out.data, ComponentWiseScalarMult(lambda));
177 }
178
179 static std::string getRole(const VectorImpl &out, int component)
180 {
181 return out.descriptions.roles[component];
182 }
183
184 };
185
186
188
194 template<typename Implementation>
196 {
197 public:
198 template <class Creator>
199 explicit Vector(Creator& creator) : implementation(creator) {}
200
201 explicit Vector(Implementation const& gi) : implementation(gi) {}
202
203 virtual std::unique_ptr<AbstractFunctionSpaceElement> clone() const
204 {
205 return std::unique_ptr<AbstractFunctionSpaceElement>(new Vector<Implementation>(*this));
206 }
207
208 virtual std::unique_ptr<AbstractFunctionSpaceElement> initZeroVector() const
209 {
210 auto zeroVector = clone();
211 *zeroVector *= 0;
212 return zeroVector;
213 }
214
216 Implementation const & get() const { return implementation; }
217
219 Implementation& get() { return implementation; }
220
221 virtual void read(std::vector<double> const& in, int vbegin, int vend)
222 {
224 }
225
226 virtual void read(std::vector<double> const& in)
227 {
229 }
230
231 virtual void write(std::vector<double>& out, int vbegin, int vend) const
232 {
234 }
235
236 virtual void write(std::vector<double>& out) const
237 {
239 }
240
241 virtual std::string getRole(int component) const
242 {
244 }
245
246 int nComponents() const
247 {
249 }
250
251 virtual void print(std::string const& message="") const
252 {
254 }
255
256 virtual double doapplyAsDualTo(AbstractFunctionSpaceElement const& v, int vbegin, int vend) const
257 {
258 std::vector<double> v1,v2;
260 VectorTraits<Implementation>::write(dynamic_cast<Vector<Implementation> const& >(v).get(),v2,vbegin,vend);
261 // if(v1.size() != v2.size()) std::cout << "Warning: different sizes: " << v1.size() << " " << v2.size() << std::endl;
262 double sum=0.0;
263 for(int i=0; i< std::min(v1.size(),v2.size()); ++i)
264 {
265 sum+=v1[i]*v2[i];
266 }
267 return sum;
268 }
269
270
271 private:
273 Implementation& get_nonconst() { return implementation; }
274
275 virtual Vector& doscale(std::vector<double>const& lambda)
276 {
278 return *this;
279 }
280
281 virtual Vector& doaxpy(double alpha, AbstractFunctionSpaceElement const& t2, int component) {
282 std::vector<double> add1,add2;
283 this->write(add1,component,component+1);
284 VectorTraits<Implementation>::write(dynamic_cast<Vector<Implementation> const& >(t2).get(),add2,component,component+1);
285 for(int i=0; i<add1.size();++i)
286 add1[i]+=alpha*add2[i];
287 this->read(add1,component,component+1);
288 return *this;
289 }
290
291 virtual Vector& doaxpy_(double alpha, AbstractFunctionSpaceElement const& t2) {
292 implementation.axpy(alpha,dynamic_cast<Vector<Implementation> const& >(t2).get());
293 return *this;
294 }
295
296 virtual Vector& doassign(AbstractFunctionSpaceElement const& t2) {
297 implementation = dynamic_cast<Vector<Implementation> const& >(t2).implementation;
298 return *this;
299 }
300
301 virtual void doswap(AbstractFunctionSpaceElement& other)
302 {
303 std::swap(implementation,dynamic_cast<Vector<Implementation>& >(other).implementation);
304 }
305
306 //Hide assignment operator, rather use clone
307 Vector<Implementation>& operator=(Vector<Implementation>const & v);
308
309 // Private copy-constructor, which makes a shallow copy
310 Vector(Vector<Implementation> const & v)
312 // Private copy-constructor, which makes a deep copy
313 // Vector(Vector<Implementation> const & v):
314 // implementation(new Implementation(*(v.implementation)))
315 // {}
316
317 virtual void writeToFile(std::string const& file, bool append, int order=1) const { VectorTraits<Implementation>::writeToFile(file, append, implementation, order); };
318
319 public:
320 Implementation implementation;
321
322 friend Implementation& getImpl<Implementation>(AbstractFunctionSpaceElement& v);
323 };
324
325 //--------------------------------------------------------------------------------
326 //--------------------------------------------------------------------------------
327
329 template<class Implementation>
331 {
332 return dynamic_cast<Vector<Implementation>& >(v).get_nonconst();
333
334 }
335
337 template<class Implementation>
338 Implementation const& getImpl(AbstractFunctionSpaceElement const& v)
339 {
340 return dynamic_cast<Vector<Implementation>const& >(v).get();
341 }
342
343
344 //--------------------------------------------------------------------------------
345 //--------------------------------------------------------------------------------
346
348
386// template<typename Impl>
387// class Linearization : public AbstractLinearization, public SparseLinearSystem, public Impl::Operator
388// {
389// typedef typename Impl::Scalar Scalar;
390// typedef typename Impl::Operator Operator;
391// public:
392// typedef Impl Implementation;
393//
394// Linearization() = delete;
395//
396// Linearization(std::unique_ptr<Implementation>&& impl) : myImpl(std::move(impl)) {};
397//
398// virtual int nRowBlocks() const {return myImpl->nRowBlocks(); }
399// virtual int nColBlocks() const {return myImpl->nColBlocks(); }
400//
401// /// Implementation of AbstractLinearization
402// double eval() const { return myImpl->getValue();}
403//
404// double evalL1norm() const { return myImpl->getL1norm(); }
405//
406// double getValue() const { return eval();}
407//
408// double getValue(AbstractFunctionSpaceElement const& dx) const { return eval(dx);}
409//
410// void evald(AbstractFunctionSpaceElement& g, int rbegin=0, int rend=-1) const
411// {
412// if(rend==-1) rend=nRowBlocks();
413// assert(rbegin<=rend);
414// std::vector<Scalar> rhs(rows(rbegin,rend),0.0);
415// getRHSBlocks(rhs,rbegin,rend);
416// dynamic_cast<Vector<typename Implementation::ImageElement>& >(g).read(rhs,rbegin,rend);
417// }
418//
419// void precompute()
420// {
421// myImpl->precompute();
422// }
423//
424// void ddxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const {
425// if(rend==-1) rend=nRowBlocks();
426// if(cend==-1) cend=nColBlocks();
427// assert(cbegin<=cend);
428// assert(rbegin<=rend);
429// std::vector<Scalar> result, argument;
430// dynamic_cast<Vector<typename Implementation::ImageElement> const& >(x).write(argument,cbegin,cend);
431// dynamic_cast<Vector<typename Implementation::ImageElement>& >(y).write(result,rbegin,rend);
432// MatrixAsTriplet<Scalar> mat;
433// myImpl->getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
434// mat.axpy(result, argument);
435// dynamic_cast<Vector<typename Implementation::ImageElement>& >(y).read(result,rbegin,rend);
436// }
437//
438// AbstractFunctionSpaceElement const& getOrigin() const
439// {
440// optr.reset(new Vector<typename Implementation::DomainElement>(myImpl->getOriginImpl()));
441// return *optr;
442// }
443//
444// // Implementation of Impl::OperatorType==Dune::LinearOperator
445// void applyscaleadd(typename Operator::domain_type::field_type scale, const typename Operator::domain_type& in,typename Operator::range_type& out) const
446// {
447// std::vector<Scalar> result(this->rows(0,this->nRowBlocks())), argument(this->cols(0,this->nColBlocks()));
448// in.write(argument.begin());
449// out.write(result.begin());
450// MatrixAsTriplet<Scalar> mat;
451// myImpl->getMatrixBlocks(mat,0,nRowBlocks(),0,nColBlocks());
452// mat.axpy(argument, result, scale);
453// out.read(result.begin());
454// }
455//
456// void apply(const typename Operator::domain_type& in,typename Operator::range_type& out) const
457// {
458// std::vector<Scalar> result(this->rows(0,this->nRowBlocks())), argument(this->cols(0,this->nColBlocks()));
459// MatrixAsTriplet<Scalar> mat;
460// in.write(argument.begin());
461// myImpl->getMatrixBlocks(mat,0,nRowBlocks(),0,nColBlocks());
462// mat.ax(result, argument);
463// out.read(result.begin());
464// }
465//
466// // Implementation of SparseLinearSystem
467// virtual void getMatrixBlocks(MatrixAsTriplet<Scalar>& mat, int rbegin, int rend, int colbegin, int colend) const
468// { myImpl->getMatrixBlocks(mat,rbegin,rend,colbegin,colend); }
469//
470// virtual void getRHSBlocks(std::vector<Scalar>& rhs, int rbegin, int rend) const
471// {
472// myImpl->getRHSBlocks(rhs,rbegin,rend);
473// }
474//
475// virtual int cols(int cbegin, int cend) const {return myImpl->cols(cbegin, cend);}
476// virtual int rows(int rbegin, int rend) const {return myImpl->rows(rbegin, rend);}
477// // Other..
478//
479// typename Implementation::DomainElement const&
480// getOriginImpl() const { return myImpl->getOriginImpl(); }
481//
482// void connectToSignalForFlush(boost::signals2::signal0<void>& sig) {
483// if(flushconn.connected()) flushconn.disconnect();
484// flushconn=sig.connect(boost::bind(&Linearization<Implementation>::onGridChange, this));
485// }
486//
487// virtual ~Linearization() { changed(); flushconn.disconnect(); }
488//
489//
490// void onGridChange(){ changed(); myImpl->flush();}
491//
492// void flush(){ changed(); myImpl->flush();}
493//
494// void touch() { changed(); myImpl->touch(); }
495//
496// Implementation const& getLinImpl() const {return *myImpl;}
497// Implementation* getLinImplPtr() {return myImpl.get();}
498//
499// typename Implementation::Assembler const& getValidAssembler() const
500// {
501// return myImpl->getValidAssembler();
502// }
503//
504// private:
505// std::unique_ptr<Implementation> myImpl;
506// mutable boost::signals2::connection flushconn;
507// mutable std::unique_ptr<Vector<typename Implementation::DomainElement> > optr;
508// };
509
510
511 //--------------------------------------------------------------------------------
512 //--------------------------------------------------------------------------------
514
527// class NoParameters {};
528//
529// template<typename Implementation, typename VectorImpl, class Parameters=NoParameters>
530// class FixedGridNewtonDirection : public AbstractNewtonDirection
531// {
532// // typedef FixedGridNewtonDirection<Implementation,VectorImpl,Parameters> Self;
533// public:
534// FixedGridNewtonDirection(std::shared_ptr<Implementation> imp)
535// : myImplementation(imp), p(0)
536// {
537// }
538//
539// FixedGridNewtonDirection(std::shared_ptr<Implementation> imp, Parameters const& p_)
540// : myImplementation(imp), p(&p_) {
541// }
542//
543// ~FixedGridNewtonDirection()
544// {
545// if(flushconn.connected()) flushconn.disconnect();
546// }
547//
548// /// Solves always exactly
549// virtual void setRelativeAccuracy(double accuracy) {myImplementation->setRelativeAccuracy(accuracy);}
550//
551// /// Always exact solution
552// virtual double getRelativeAccuracy() {return myImplementation->getRelativeAccuracy();}
553//
554// /// Always exact solution
555// virtual double getAbsoluteAccuracy() {return myImplementation->getAbsoluteAccuracy();}
556//
557// virtual bool improvementPossible() { return myImplementation->improvementPossible(); }
558//
559// private:
560//
561// template<class Impl, class Paras>
562// struct CallTraits
563// {
564// static void solve(Impl& impl, std::vector<double>& res, SparseLinearSystem& lin, Paras const* p)
565// {
566// impl.resetParameters(*p);
567// impl.solve(res,lin);
568// }
569//
570// static void resolve(Impl& impl, std::vector<double> &res, SparseLinearSystem const& lin, Paras const* p)
571// {
572// impl.resetParameters(*p);
573// impl.resolve(res,lin);
574// }
575// };
576//
577// template<class Impl>
578// struct CallTraits<Impl, NoParameters>
579// {
580// static void solve(Impl& impl, std::vector<double>& res, SparseLinearSystem& lin, NoParameters const* )
581// {
582// impl.solve(res,lin);
583// }
584//
585// static void resolve(Impl& impl, std::vector<double>& res, SparseLinearSystem const& lin, NoParameters const* )
586// {
587// impl.resolve(res,lin);
588// }
589// };
590//
591// void connectToSignalForFlush(boost::signals2::signal0<void>& sig)
592// {
593// if(flushconn.connected()) flushconn.disconnect();
594// flushconn=sig.connect(boost::bind(&FixedGridNewtonDirection::onGridChange, this));
595// }
596//
597// virtual void doSolve(AbstractFunctionSpaceElement& correction, AbstractLinearization& lin)
598// {
599// if(Implementation::needMatrix)
600// {
601// connectToSignalForFlush(lin.changed);
602// std::vector<double> result;
603// CallTraits<Implementation,Parameters>::solve(*myImplementation,result,dynamic_cast<SparseLinearSystem&>(lin),p);
604// dynamic_cast<Vector<VectorImpl>& >(correction).read(result);
605// } else
606// {
607// std::cout << "Not implemented!" << std::endl;
608// // myImplementation->solve(dynamic_cast<VectorImpl& >correction,dynamic_cast<VectorImpl& >lin,dynamic_cast<VectorImpl& >lin)
609// }
610// }
611//
612// virtual void doResolve(AbstractFunctionSpaceElement& correction,
613// AbstractLinearization const& lin,
614// AbstractLinearization const& olin) const
615// {
616// if(Implementation::needMatrix)
617// {
618// std::vector<double> result;
619// CallTraits<Implementation,Parameters>::resolve(*myImplementation,result,dynamic_cast<SparseLinearSystem const &>(lin),p);
620// dynamic_cast<Vector<VectorImpl>& >(correction).read(result);
621// } else
622// {
623// std::cout << "Not implemented!" << std::endl;
624// // myImplementation->solve(correction_,lin_,olin_)
625// }
626// }
627//
628// virtual void doResolve(AbstractFunctionSpaceElement& correction,
629// AbstractLinearization const& lin) const
630// {
631// if(Implementation::needMatrix)
632// {
633// std::vector<double> result;
634// CallTraits<Implementation,Parameters>::resolve(*myImplementation,result,dynamic_cast<SparseLinearSystem const&>(lin),p);
635// dynamic_cast<Vector<VectorImpl>& >(correction).read(result);
636// } else
637// {
638// std::cout << "Not implemented!" << std::endl;
639// // myImplementation->solve(correction_,lin_,lin_)
640// }
641// }
642//
643// void onGridChange(){ myImplementation->onChangedLinearization(); }
644//
645// std::shared_ptr<Implementation> myImplementation;
646// boost::signals2::connection flushconn;
647// Parameters const* p;
648// };
649
651 template<typename FunctionalImpl, typename DomainImpl=typename FunctionalImpl::AnsatzVars::VariableSet, typename ImageImpl=DomainImpl>
653 {
654 public:
655 typedef typename FunctionalImpl::Scalar Scalar;
656
657
658 explicit Functional(FunctionalImpl* impl) : myImplementation(impl){}
659
660 explicit Functional(std::unique_ptr<FunctionalImpl>&& imp) : myImplementation(imp.release()) {}
661
662 template <typename... ConstructorArguments>
663 explicit Functional(const ConstructorArguments&... args) : myImplementation( new FunctionalImpl(args...) ) {}
664
665 std::unique_ptr<AbstractLinearization> getLinearization(AbstractFunctionSpaceElement const& x) const
666 {
667 return std::unique_ptr<AbstractLinearization>(new ConnectedKaskadeLinearization<FunctionalImpl>(*myImplementation,getImpl<DomainImpl>(x)));
668 //return std::unique_ptr<AbstractLinearization>(new Linearization<LinImpl>(std::unique_ptr<LinImpl>(new LinImpl(*myImplementation,getImpl<DomainImpl>(x)))));
669 }
670
671 virtual std::unique_ptr<AbstractFunctionSpaceElement> getImageVector(AbstractFunctionSpaceElement const& x) const
672 {
673 return std::unique_ptr<AbstractFunctionSpaceElement>(new Vector<ImageImpl>(getImpl<ImageImpl>(x)));
674 //return std::unique_ptr<AbstractFunctionSpaceElement>(new Vector<ImageImpl>(std::unique_ptr<ImageImpl>(new ImageImpl(getImpl<DomainImpl>(x)))));
675 }
676
677 virtual bool inDomain(AbstractFunctionSpaceElement const& x) const
678 {
679 return myImplementation->inDomain(getImpl<DomainImpl>(x));
680 }
681 protected:
682 std::unique_ptr<FunctionalImpl> myImplementation;
683 };
684
685 //template <class,int,int> class NormalStepLinearization;
686 //template <class,int,int> class TangentialStepLinearization;
687
689 template<typename FunctionalImpl, typename DomainImpl=typename FunctionalImpl::AnsatzVars::VariableSet, typename ImageImpl=DomainImpl>
690 class KaskadeNormalStepFunctional : public Functional<FunctionalImpl,DomainImpl,ImageImpl>
691 {
692 typedef typename FunctionalImpl::Scalar Scalar;
695 public:
696 explicit KaskadeNormalStepFunctional(std::unique_ptr<FunctionalImpl>&& imp) : Base(std::move(imp)) {}
697
698 explicit KaskadeNormalStepFunctional(FunctionalImpl* impl) : Base(impl){}
699
700 template <typename... ConstructorArguments>
701 explicit KaskadeNormalStepFunctional(const ConstructorArguments&... args) : Base(args...) {}
702
703 std::unique_ptr<AbstractLinearization> getLinearization(AbstractFunctionSpaceElement const& x) const
704 {
705 return std::unique_ptr<AbstractLinearization>(new NormalStepLinearization<FunctionalImpl>(*(this->myImplementation),getImpl<DomainImpl>(x),assembler));
706 }
707
708 void setAssembler(std::shared_ptr<Assembler>& assembler_)
709 {
710 assembler = assembler_;
711 }
712
713 private:
714 std::shared_ptr<Assembler> assembler;
715 };
716
718 template<typename FunctionalImpl, typename DomainImpl=typename FunctionalImpl::AnsatzVars::VariableSet, typename ImageImpl=DomainImpl>
719 class KaskadeTangentialStepFunctional : public Functional<FunctionalImpl,DomainImpl,ImageImpl>
720 {
723 public:
724 explicit KaskadeTangentialStepFunctional(std::unique_ptr<FunctionalImpl>&& imp) : Base(std::move(imp)) {}
725
726 explicit KaskadeTangentialStepFunctional(FunctionalImpl* impl) : Base(impl){}
727
728 template <typename... ConstructorArguments>
729 explicit KaskadeTangentialStepFunctional(const ConstructorArguments&... args) : Base(args...) {}
730
731 std::unique_ptr<AbstractLinearization> getLinearization(AbstractFunctionSpaceElement const& x) const
732 {
733 return std::unique_ptr<AbstractLinearization>(new TangentialStepLinearization<FunctionalImpl>(*(this->myImplementation),getImpl<DomainImpl>(x),assembler));
734 }
735
736 void setAssembler(std::shared_ptr<Assembler> const& assembler_)
737 {
738 assembler = assembler_;
739 }
740
741 private:
742 std::shared_ptr<Assembler> assembler;
743 };
744
745 template<class Variables, class Functional>
746 std::unique_ptr<AbstractFunctional> getFunctional(std::unique_ptr<Functional>&& F)
747 {
748 return std::unique_ptr<AbstractFunctional>(new Bridge::Functional<Functional,Variables>(std::move(F)));
749 }
750
751 template<class Variables, class Functional>
752 std::unique_ptr<AbstractFunctional> getFunctional(Functional*&& F)
753 {
754 return std::unique_ptr<AbstractFunctional>(new Bridge::Functional<Functional,Variables>(std::unique_ptr<Functional>(F)));
755 }
756
757
759 template<typename Func, typename VectorImpl>
761 {
762 typedef typename Func::OptimalityFunctional VarFu;
763 typedef typename Func::Parameter Parameter;
764 typedef typename Func::ParameterLinearization FuncPLin;
765 typedef typename Func::ParameterValueLinearization FuncPVLin;
766
767 template<class VariFu>
768 struct ParaTraits
769 {
770 static void setParameter(Parameter , VariFu&) { std::cout << "Pns"; };
771 };
772
773 template<template<class Scalar, class T, class Obj, int nEFields, class S> class V, class T, class Obj, int nEFields>
774 struct ParaTraits<V<typename VarFu::Scalar, T, Obj, nEFields, Parameter> >
775 {
776 static void setParameter(Parameter mu, VarFu& f) { f.setParameter(mu); };
777 };
778 public:
779 ParameterFunctional(VarFu& F_) : F(F_) {};
780
781 virtual std::unique_ptr<AbstractFunctional> getFunctional(AbstractParameters const& p) const
782 {
783 ParaTraits<VarFu>::setParameter(dynamic_cast<Parameters<Parameter> const&>(p).getPars(),F);
784 return std::unique_ptr<AbstractFunctional> (new Functional<Func,VectorImpl>(makeUP(new Func(dynamic_cast<Parameters<typename Func::Parameter> const&>(p).getPars(),F))));
785 }
786 private:
787 VarFu& F;
788 };
789
791 template<typename Func, typename VectorImpl>
793 {
794 typedef typename Func::OptimalityFunctional VarFu;
795 typedef typename Func::Parameter Parameter;
796 typedef typename Func::ParameterLinearization FuncPLin;
797 typedef typename Func::ParameterValueLinearization FuncPVLin;
798
799 template<class VariFu>
800 struct ParaTraits
801 {
802 static void setParameter(Parameter , VariFu&) { std::cout << "Pns"; };
803 };
804
805 template<template<class Scalar, class T, class Obj, int nEFields, class S> class V, class T, class Obj, int nEFields>
806 struct ParaTraits<V<typename VarFu::Scalar, T, Obj, nEFields, Parameter> >
807 {
808 static void setParameter(Parameter mu, VarFu& f) { f.setParameter(mu); };
809 };
810 public:
811 C1ParameterFunctional(VarFu& F_) : F(F_) {};
812
813 virtual std::unique_ptr<AbstractFunctional> getFunctional(AbstractParameters const& p) const
814 {
815 ParaTraits<VarFu>::setParameter(dynamic_cast<Parameters<Parameter> const&>(p).getPars(),F);
816 return std::unique_ptr<AbstractFunctional>(new Functional<Func,VectorImpl>(makeAP(new Func(dynamic_cast<Parameters<typename Func::Parameter> const&>(p).getPars(),F))));
817 }
818
819 virtual std::unique_ptr<AbstractFunctional> getParameterLinFunctional(AbstractParameters const& p) const
820 {
821 ParaTraits<VarFu>::setParameter(dynamic_cast<Parameters<Parameter> const&>(p).getPars(),F);
822 return std::unique_ptr<AbstractFunctional>(new Functional<FuncPLin,VectorImpl>(makeAP(new FuncPLin(dynamic_cast<Parameters<typename FuncPLin::Parameter> const&>(p).getPars(),F))));
823 }
824
825 virtual std::unique_ptr<AbstractFunctional> getLinFunctionValue(AbstractParameters const& p) const
826 {
827 // typename VarFu::FunctionalDiagonal FD;
828 // ParaTraits<typename VarFu::FunctionalDiagonal>::setParameter(dynamic_cast<Parameters<Parameter> const&>(p).getPars(),FD);
829 // std::unique_ptr<AbstractFunctional> ptr
830 // (new Functional<FuncPVLin,VectorImpl>
831 // (makeAP(new FuncPVLin(dynamic_cast<Parameters<typename FuncPVLin::Parameter> const&>(p).getPars(),FD))));
832 ParaTraits<typename VarFu::Functional>::setParameter(dynamic_cast<Parameters<Parameter> const&>(p).getPars(),F);
833 return std::unique_ptr<AbstractFunctional>(new Functional<FuncPVLin,VectorImpl>(makeUP(new FuncPVLin(dynamic_cast<Parameters<typename FuncPVLin::Parameter> const&>(p).getPars(),F))));
834 }
835 private:
836 VarFu& F;
837 };
838
839
841 template<class T>
842 inline std::unique_ptr<T> makeUP(T* t) { return std::unique_ptr<T>(t); };
843
844
846 {
847 template <class Fu1, class Fu2>
848 void operator()(Fu1& f1, Fu2 const& f2)
849 {
850 spaceTransfer(f1,f2);
851 }
852 };
853 }
854}
855#endif
Interfaces for function space oriented algorithms.
Abstract Vector for function space algorithms.
Representation of a nonlinear functional.
Creates a functional from a homotopy of functionals by inserting a parameter.
Representation of parameters.
A functional that may depend on parameters, implements AbstractC1ParameterFunctional.
virtual std::unique_ptr< AbstractFunctional > getLinFunctionValue(AbstractParameters const &p) const
virtual std::unique_ptr< AbstractFunctional > getFunctional(AbstractParameters const &p) const
virtual std::unique_ptr< AbstractFunctional > getParameterLinFunctional(AbstractParameters const &p) const
Object that represents the linearization of a nonlinear functional, implements AbstractLineariztion.
Functional(const ConstructorArguments &... args)
virtual bool inDomain(AbstractFunctionSpaceElement const &x) const
Functional(std::unique_ptr< FunctionalImpl > &&imp)
virtual std::unique_ptr< AbstractFunctionSpaceElement > getImageVector(AbstractFunctionSpaceElement const &x) const
std::unique_ptr< AbstractLinearization > getLinearization(AbstractFunctionSpaceElement const &x) const
FunctionalImpl::Scalar Scalar
Functional(FunctionalImpl *impl)
std::unique_ptr< FunctionalImpl > myImplementation
Bridge class for Functionals. Its most prominent task is to create linearizations,...
KaskadeNormalStepFunctional(const ConstructorArguments &... args)
void setAssembler(std::shared_ptr< Assembler > &assembler_)
std::unique_ptr< AbstractLinearization > getLinearization(AbstractFunctionSpaceElement const &x) const
KaskadeNormalStepFunctional(std::unique_ptr< FunctionalImpl > &&imp)
Bridge class for Functionals. Its most prominent task is to create linearizations,...
KaskadeTangentialStepFunctional(std::unique_ptr< FunctionalImpl > &&imp)
void setAssembler(std::shared_ptr< Assembler > const &assembler_)
std::unique_ptr< AbstractLinearization > getLinearization(AbstractFunctionSpaceElement const &x) const
KaskadeTangentialStepFunctional(const ConstructorArguments &... args)
A functional that may depend on parameters, implements AbstractParameterFunctional.
virtual std::unique_ptr< AbstractFunctional > getFunctional(AbstractParameters const &p) const
Mathematical Vector that supports copy-on-write, implements AbstractFunctionSpaceElement.
virtual std::unique_ptr< AbstractFunctionSpaceElement > clone() const
Construction of a vector of the same type.
Implementation const & get() const
Access to the data.
virtual void read(std::vector< double > const &in, int vbegin, int vend)
Vector(Implementation const &gi)
virtual std::unique_ptr< AbstractFunctionSpaceElement > initZeroVector() const
Construction of a vector of the same type.
Implementation & get()
Access data.
Vector(Creator &creator)
virtual void write(std::vector< double > &out, int vbegin, int vend) const
virtual void read(std::vector< double > const &in)
virtual void write(std::vector< double > &out) const
virtual void print(std::string const &message="") const
Optional output.
Implementation implementation
virtual double doapplyAsDualTo(AbstractFunctionSpaceElement const &v, int vbegin, int vend) const
virtual std::string getRole(int component) const
void read(InIterator i)
DEPRECATED use vectorFromSequence instead.
Definition: linearspace.hh:245
void write(OutIterator i) const
DEPRECATED use vectorToSequence instead.
Definition: linearspace.hh:264
...for parameter dependent functionals, implements AbstractParameters
A class for storing a heterogeneous collection of FunctionSpaceElement s.
Definition: variables.hh:341
Descriptions const & descriptions
Descriptions of variable set, of type VariableSetDescription (lots of useful infos)
Definition: variables.hh:510
A class for assembling Galerkin representation matrices and right hand sides for variational function...
Error estimation via hierachic FEM.
Dune::FieldVector< T, n > min(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise minimum.
Definition: fixdune.hh:122
Output of mesh and solution for visualization software.
std::unique_ptr< T > makeUP(T *t)
Convenience routine: makes an unique_ptr of the right type.
std::unique_ptr< AbstractFunctional > getFunctional(std::unique_ptr< Functional > &&F)
Implementation & getImpl(AbstractFunctionSpaceElement &v)
Get the implementation of an AbstractFunctionSpaceElement.
auto & component(LinearProductSpace< Scalar, Sequence > &x)
Definition: linearspace.hh:463
void spaceTransfer(Fu1 &f1, Fu2 const &f2)
DEPRECATED. Use interpolateGlobally instead.
Definition: fetransfer.hh:1119
Some norms for FunctionSpaceElement s or FunctionViews.
void operator()(Fu1 &f1, Fu2 const &f2)
static void write(VectorImpl const &in, std::vector< double > &out, int vbegin, int vend)
static std::string getRole(const VectorImpl &out, int component)
static void print(VectorImpl const &out, std::string const &message)
static void scale(VectorImpl &out, std::vector< double > const &lambda)
static void read(VectorImpl &out, std::vector< double > const &in, int vbegin, int vend)
static void writeToFile(std::string const &name, bool append, VectorImpl const &x, int order)
Traits class to unify the assignment of std::vector to a Vector.
static void writeToFile(std::string const &name, bool append, VectorImpl const &x)
static std::string getRole(const VectorImpl &out, int component)
static void read(VectorImpl &out, std::vector< double > const &in, int vbegin, int vend)
static void print(VectorImpl const &out, std::string const &message)
static void scale(VectorImpl &out, std::vector< double > const &lambda)
static void write(VectorImpl const &in, std::vector< double > &out, int vbegin, int vend)
Abstract base class of creators that can be registered at the pluggable factory.
Definition: factory.hh:31
options for VTK/AMIRA output
Definition: iobase.hh:77