1#ifndef NEWTON_BRIDGE_HH
2#define NEWTON_BRIDGE_HH
26#include <boost/signals2.hpp>
27#include <boost/bind.hpp>
28#include <boost/fusion/include/transform.hpp>
48 template<
class Implementation> Implementation&
getImpl(AbstractFunctionSpaceElement& v);
49 template<
class Implementation> Implementation
const&
getImpl(AbstractFunctionSpaceElement
const& v);
52 template<
class VectorImpl>
57 static void read(VectorImpl &out, std::vector<double>
const& in,
int vbegin,
int vend)
59 out.resize(in.size());
61 for(
int i=0; i<in.size(); ++i) out[i]=in[i];
63 for(
int i=vbegin; i<vend; ++i) out[i]=in[i];
66 static void write(VectorImpl
const &in, std::vector<double> & out,
int vbegin,
int vend)
68 out.resize(in.size());
70 for(
int i=0; i<in.size(); ++i) out[i]=in[i];
72 for(
int i=vbegin; i<vend; ++i) out[i]=in[i];
75 static void writeToFile(std::string
const& name,
bool append, VectorImpl
const& x)
87 static void print(VectorImpl
const& out, std::string
const& message)
89 std::cout << message <<
"[";
90 for(
int i=0; i<out.size();++i)
91 std::cout << out[i] <<
" ";
92 std::cout <<
"]" << std::endl;
97 static void scale(VectorImpl &out, std::vector<double>
const& lambda)
99 for(
int i=0; i<out.size(); ++i) out[i]*=lambda[i];
104 template<
class Descr>
108 static const int nComponents = VectorImpl::Descriptions::noOfVariables;
116 static void read(
VectorImpl &out, std::vector<double>
const& in,
int vbegin,
int vend)
118 assert(in.size() >= out.
descriptions.degreesOfFreedom(vbegin,vend));
119 out.
read(vbegin,vend,in.begin());
122 static void write(
VectorImpl const& in, std::vector<double>& out,
int vbegin,
int vend)
124 out.resize(in.
descriptions.degreesOfFreedom(vbegin,vend),0.0);
125 in.
write(vbegin,vend,out.begin());
166 struct ComponentWiseScalarMult {
168 template <
class Element>
void operator()(Element& e)
const { e *= s[i]; ++i; }
170 std::vector<double>
const& s;
176 boost::fusion::for_each(out.
data, ComponentWiseScalarMult(lambda));
194 template<
typename Implementation>
198 template <
class Creator>
203 virtual std::unique_ptr<AbstractFunctionSpaceElement>
clone()
const
210 auto zeroVector =
clone();
221 virtual void read(std::vector<double>
const& in,
int vbegin,
int vend)
226 virtual void read(std::vector<double>
const& in)
231 virtual void write(std::vector<double>& out,
int vbegin,
int vend)
const
236 virtual void write(std::vector<double>& out)
const
251 virtual void print(std::string
const& message=
"")
const
258 std::vector<double> v1,v2;
263 for(
int i=0; i<
std::min(v1.size(),v2.size()); ++i)
275 virtual Vector& doscale(std::vector<double>
const& lambda)
282 std::vector<double> add1,add2;
285 for(
int i=0; i<add1.size();++i)
286 add1[i]+=alpha*add2[i];
292 implementation.axpy(alpha,
dynamic_cast<Vector<Implementation> const&
>(t2).
get());
307 Vector<Implementation>& operator=(Vector<Implementation>
const & v);
310 Vector(Vector<Implementation>
const & v)
329 template<
class Implementation>
337 template<
class Implementation>
651 template<
typename FunctionalImpl,
typename DomainImpl=
typename FunctionalImpl::AnsatzVars::VariableSet,
typename ImageImpl=DomainImpl>
655 typedef typename FunctionalImpl::Scalar
Scalar;
662 template <
typename... ConstructorArguments>
673 return std::unique_ptr<AbstractFunctionSpaceElement>(
new Vector<ImageImpl>(getImpl<ImageImpl>(x)));
689 template<
typename FunctionalImpl,
typename DomainImpl=
typename FunctionalImpl::AnsatzVars::VariableSet,
typename ImageImpl=DomainImpl>
692 typedef typename FunctionalImpl::Scalar Scalar;
700 template <
typename... ConstructorArguments>
710 assembler = assembler_;
714 std::shared_ptr<Assembler> assembler;
718 template<
typename FunctionalImpl,
typename DomainImpl=
typename FunctionalImpl::AnsatzVars::VariableSet,
typename ImageImpl=DomainImpl>
728 template <
typename... ConstructorArguments>
738 assembler = assembler_;
742 std::shared_ptr<Assembler> assembler;
745 template<
class Variables,
class Functional>
746 std::unique_ptr<AbstractFunctional>
getFunctional(std::unique_ptr<Functional>&& F)
751 template<
class Variables,
class Functional>
759 template<
typename Func,
typename VectorImpl>
762 typedef typename Func::OptimalityFunctional VarFu;
763 typedef typename Func::Parameter Parameter;
764 typedef typename Func::ParameterLinearization FuncPLin;
765 typedef typename Func::ParameterValueLinearization FuncPVLin;
767 template<
class VariFu>
770 static void setParameter(Parameter , VariFu&) { std::cout <<
"Pns"; };
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> >
776 static void setParameter(Parameter mu, VarFu& f) { f.setParameter(mu); };
791 template<
typename Func,
typename VectorImpl>
794 typedef typename Func::OptimalityFunctional VarFu;
795 typedef typename Func::Parameter Parameter;
796 typedef typename Func::ParameterLinearization FuncPLin;
797 typedef typename Func::ParameterValueLinearization FuncPVLin;
799 template<
class VariFu>
802 static void setParameter(Parameter , VariFu&) { std::cout <<
"Pns"; };
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> >
808 static void setParameter(Parameter mu, VarFu& f) { f.setParameter(mu); };
832 ParaTraits<typename VarFu::Functional>::setParameter(
dynamic_cast<Parameters<Parameter> const&
>(p).getPars(),F);
842 inline std::unique_ptr<T>
makeUP(T* t) {
return std::unique_ptr<T>(t); };
847 template <
class Fu1,
class Fu2>
Interfaces for function space oriented algorithms.
Abstract Vector for function space algorithms.
AbstractFunctionSpaceElement()
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
C1ParameterFunctional(VarFu &F_)
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(FunctionalImpl *impl)
KaskadeNormalStepFunctional(std::unique_ptr< FunctionalImpl > &&imp)
Bridge class for Functionals. Its most prominent task is to create linearizations,...
KaskadeTangentialStepFunctional(std::unique_ptr< FunctionalImpl > &&imp)
KaskadeTangentialStepFunctional(FunctionalImpl *impl)
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.
ParameterFunctional(VarFu &F_)
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.
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.
void write(OutIterator i) const
DEPRECATED use vectorToSequence instead.
...for parameter dependent functionals, implements AbstractParameters
A class for storing a heterogeneous collection of FunctionSpaceElement s.
Descriptions const & descriptions
Descriptions of variable set, of type VariableSetDescription (lots of useful infos)
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.
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)
void spaceTransfer(Fu1 &f1, Fu2 const &f2)
DEPRECATED. Use interpolateGlobally instead.
Some norms for FunctionSpaceElement s or FunctionViews.
void operator()(Fu1 &f1, Fu2 const &f2)
void operator()(Element &e) const
ComponentWiseScalarMult(std::vector< double >const &s_)
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)
VariableSet< Descr > VectorImpl
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 const int nComponents
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.
options for VTK/AMIRA output