13#ifndef FUNCTIONAL_MANIPULATION_HH
14#define FUNCTIONAL_MANIPULATION_HH
57 template<
class Lin,
bool simplified=true>
67 typedef typename Linearization::TestVars
TestVars;
69 typedef typename Linearization::RT
RT;
70 typedef typename Linearization::RT
Scalar;
71 typedef typename AnsatzVars::Grid
Grid;
72 typedef typename AnsatzVars::Spaces
Spaces;
73 typedef typename Grid::template Codim<0>::Entity
Entity;
77 typedef typename boost::fusion::result_of::as_vector<typename boost::fusion::result_of::transform<Spaces, GetEvaluatorTypes>::type>
::type Evaluators;
86 typedef typename boost::fusion::result_of::value_at_c<typename DomainElement::Functions,row>::type::ValueType
type;
90 template<
int row,
int dim,
class Cache>
96 template<
typename T,
typename State>
107 arg(arg_), du(du_), cache(cache_), evaluators(eval_)
111 template<
class Variable>
115 int const id = Variable::id;
119 int nShapeFcts = at_c<csIdx>(evaluators).size();
121 for (
int i=0; i<nShapeFcts; ++i)
125 fm=cache.template d2<row,id,dim>(at_c<csIdx>(evaluators).evalData[i],arg);
126 fm.umv((*at_c<id>(du.data))[at_c<csIdx>(evaluators).globalIndices()[i]],s2);
142 template<
class LinFunctional>
148 template<
typename T,
typename State>
155 du(du_), fctl(fctl_), evaluators(eval_)
159 template<
class Variable>
163 int const id = Variable::id;
165 int nShapeFcts = at_c<csIdx>(evaluators).size();
169 for (
int i=0; i<nShapeFcts; ++i)
172 fv = fctl.template evaluate<id>(at_c<csIdx>(evaluators).evalData[i]);
173 s2 += fv*(*at_c<id>(du.data))[at_c<csIdx>(evaluators).globalIndices()[i]];
179 LinFunctional
const& fctl;
193 if(simplified) ddfdc=&ffdc;
198 template<
class EntityOrFace>
202 if(simplified) ddfdc->moveTo(e_);
205 template<
class Position>
209 fdc.evaluateAt(x,evaluators);
210 if(simplified) ddfdc->evaluateAt(x,evaluators);
218 template <
int row,
int dim>
224 template <
int row,
int dim>
230 template <
int row,
int col,
int dim>
234 return fdc.d2<row,col,dim>(arg1,arg2);
241 typename AnsatzVars::Variables vars;
255 if(simplified) ddfdc=&ffdc;
260 template<
class EntityOrFace>
264 if(simplified) ddfdc->moveTo(e_);
267 template<
class Position>
271 fdc.evaluateAt(x,evaluators);
272 if(simplified) ddfdc->evaluateAt(x,evaluators);
276 RT d0()
const { assert(!
"not implemented");
return fdc.d0(); }
278 template <
int row,
int dim>
284 template <
int row,
int col,
int dim>
288 return fdc.d2<row,col,dim>(arg1,arg2);
295 typename AnsatzVars::Variables vars;
305 template <
class Cell>
308 return f.integrationOrder(cell,shapeFunctionOrder,boundary);
313 template <
int row,
int col>
344 template <
class A,
class B>
345 static A
value(A
const& a, B
const& b) {
return a; }
351 template <
class A,
class B>
352 static B
value(A
const& a, B
const& b) {
return b; }
360 template<
class Fu1,
class Fu2>
373 typedef typename Functional::RT
RT;
375 typedef typename AnsatzVars::Grid
Grid;
376 typedef typename AnsatzVars::Spaces
Spaces;
379 typedef typename Grid::template Codim<0>::Entity
Entity;
381 typedef typename Functional::AnsatzVars::VariableSet
Function;
382 typedef typename boost::fusion::result_of::as_vector<typename boost::fusion::result_of::transform<Spaces, GetEvaluatorTypes>::type>
::type Evaluators;
390 typedef typename boost::fusion::result_of::value_at_c<typename Function::Functions,row>::type::ValueType
type;
403 template<
class EntityOrFace>
410 template<
class Position>
414 fdc.evaluateAt(x,evaluators);
415 f2dc.evaluateAt(x,evaluators);
418 RT d0()
const {
return fdc.d0()+f2dc.d0(); }
420 template <
int row,
int dim>
423 return fdc.d1<row,dim>(arg)+f2dc.d1<row,dim>(arg);
426 template <
int row,
int col,
int dim>
461 template<
class EntityOrFace>
468 template<
class Position>
472 fdc.evaluateAt(x,evaluators);
473 f2dc.evaluateAt(x,evaluators);
476 RT d0()
const {
return fdc.d0()+f2dc.d0(); }
478 template <
int row,
int dim>
483 result +=f2dc.d1<row,dim>(arg); ;
487 template <
int row,
int col,
int dim>
515 template <
class Cell>
518 return std::max(f.integrationOrder(cell,shapeFunctionOrder,boundary),f2.integrationOrder(cell,shapeFunctionOrder,boundary));
529 template <
int row,
int col>
549 template <
class Cache1,
class Cache2>
553 SumCache(Cache1
const& cache1_, Cache2
const& cache2_) : cache1(cache1_), cache2(cache2_)
556 auto d0() const -> decltype(std::declval<Cache1>().
d0()+std::declval<Cache2>().
d0())
558 return cache1.d0() + cache2.d0();
561 template <
int row,
class Arg>
562 auto d1(Arg
const& arg)
const ->
decltype(std::declval<Cache1>().template d1<row>(arg)+std::declval<Cache2>().template d1<row>(arg))
564 return cache1.template d1<row>(arg) + cache2.template d1<row>(arg);
567 template <
int row,
int col,
class Arg1,
class Arg2>
568 auto d2(Arg1
const& arg1, Arg2
const& arg2)
const
569 ->
decltype(std::declval<Cache1>().template d2<row,col>(arg1,arg2)+std::declval<Cache2>().template d2<row,col>(arg1,arg2))
571 return cache1.template d2<row,col>(arg1,arg2) + cache2.template d2<row,col>(arg1,arg2);
575 Cache1
const& cache1;
576 Cache2
const& cache2;
Function is the interface for evaluatable functions .
HessianTimesDirection(VariationalArg< RT, dim > const &arg_, DomainElement const &du_, Cache const &cache_, Evaluators const &eval_)
RowValueType< row >::type operator()(Variable const &var, typename RowValueType< row >::type const &sum) const
LinearFunctionalTimesDirection(DomainElement const &du_, LinFunctional const &fctl_, Evaluators const &eval_)
RT operator()(Variable const &var, RT const &sum) const
Creates a (linear) model to a linearization of a functional.
DomainCache createDomainCache(int flags=7) const
Linearization::TestVars TestVars
AnsatzVars::Spaces Spaces
boost::fusion::result_of::as_vector< typenameboost::fusion::result_of::transform< Spaces, GetEvaluatorTypes >::type >::type Evaluators
Linearization::AnsatzVars AnsatzVars
Entity::LeafIntersectionIterator FaceIterator
static ProblemType const type
QuadraticModel(Linearization const &f_, Linearization const &ddf_, DomainElement const &dx_)
DomainElement const & getOrigin() const
Grid::template Codim< 0 >::Entity Entity
int integrationOrder(Cell const &cell, int shapeFunctionOrder, bool boundary) const
Linearization::OriginVars OriginVars
QuadraticModel(Linearization const &f_, DomainElement const &dx_)
Linearization::AnsatzVars::VariableSet DomainElement
BoundaryCache createBoundaryCache(int flags=7) const
auto d2(Arg1 const &arg1, Arg2 const &arg2) const -> decltype(std::declval< Cache1 >().template d2< row, col >(arg1, arg2)+std::declval< Cache2 >().template d2< row, col >(arg1, arg2))
auto d1(Arg const &arg) const -> decltype(std::declval< Cache1 >().template d1< row >(arg)+std::declval< Cache2 >().template d1< row >(arg))
auto d0() const -> decltype(std::declval< Cache1 >().d0()+std::declval< Cache2 >().d0())
SumCache(Cache1 const &cache1_, Cache2 const &cache2_)
DomainCache createDomainCache(int flags=7) const
Grid::template Codim< 0 >::Entity Entity
Functional::TestVars TestVars
Functional::AnsatzVars AnsatzVars
SumFunctional(Functional const &f_, Functional2 const &f2_)
static ProblemType const type
boost::fusion::result_of::as_vector< typenameboost::fusion::result_of::transform< Spaces, GetEvaluatorTypes >::type >::type Evaluators
Functional::OriginVars OriginVars
Entity::LeafIntersectionIterator FaceIterator
Function const & getOrigin() const
Functional::AnsatzVars::VariableSet Function
int integrationOrder(Cell const &cell, int shapeFunctionOrder, bool boundary) const
AnsatzVars::Spaces Spaces
BoundaryCache createBoundaryCache(int flags=7) const
ProblemType
A type for describing the nature of a PDE problem.
typename GridView::template Codim< 0 >::Entity Cell
The type of cells (entities of codimension 0) in the grid view.
Dune::FieldVector< T, n > max(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise maximum.
Helper class for specifying the number of components of a variable.
void moveTo(EntityOrFace const &e_)
void evaluateAt(Position const &x, Evaluators const &evaluators)
BoundaryCache(int flags, Linearization const &f_, Linearization const &ddf_, DomainElement const &du_)
Linearization::BoundaryCache BoundaryCache1
Dune::FieldMatrix< RT, TestVars::template Components< row >::m, AnsatzVars::template Components< col >::m > d2(VariationalArg< RT, dim > const &arg1, VariationalArg< RT, dim > const &arg2) const
RowValueType< row >::type d1(VariationalArg< RT, dim > const &arg) const
static bool const present
static bool const present
static bool const symmetric
RowValueType< row >::type evaluate(VariationalArg< RT, dim > const &arg) const
DomainCache(int flags, Linearization const &f_, Linearization const &ddf_, DomainElement const &du_)
void moveTo(EntityOrFace const &e_)
void evaluateAt(Position const &x, Evaluators const &evaluators)
Linearization::DomainCache DomainCache1
RowValueType< row >::type d1(VariationalArg< RT, dim > const &arg) const
Dune::FieldMatrix< RT, TestVars::template Components< row >::m, AnsatzVars::template Components< col >::m > d2(VariationalArg< RT, dim > const &arg1, VariationalArg< RT, dim > const &arg2) const
RowValueType< row >::type type
boost::fusion::result_of::value_at_c< typenameDomainElement::Functions, row >::type::ValueType type
RowValueType< row >::type d1(VariationalArg< RT, dim > const &arg) const
Functional2::BoundaryCache BoundaryCache2
Functional::BoundaryCache BoundaryCache1
void evaluateAt(Position const &x, Evaluators const &evaluators)
void moveTo(EntityOrFace const &e_)
Dune::FieldMatrix< RT, TestVars::template Components< row >::m, AnsatzVars::template Components< col >::m > d2(VariationalArg< RT, dim > const &arg1, VariationalArg< RT, dim > const &arg2) const
BoundaryCache(int flags, Functional const &f_, Functional2 const &f2_)
static bool const present
static bool const present
static bool const symmetric
Functional::DomainCache DomainCache1
void evaluateAt(Position const &x, Evaluators const &evaluators)
Dune::FieldMatrix< RT, TestVars::template Components< row >::m, AnsatzVars::template Components< col >::m > d2(VariationalArg< RT, dim > const &arg1, VariationalArg< RT, dim > const &arg2) const
DomainCache(int flags, Functional const &f_, Functional2 const &f2_)
Functional2::DomainCache DomainCache2
RowValueType< row >::type d1(VariationalArg< RT, dim > const &arg) const
void moveTo(EntityOrFace const &e_)
boost::fusion::result_of::value_at_c< typenameFunction::Functions, row >::type::ValueType type
A class defining elementary information about a single variable.
static int const spaceIndex
static B value(A const &a, B const &b)
static A value(A const &a, B const &b)