KASKADE 7 development version
functional_manipulation.hh
Go to the documentation of this file.
1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2/* */
3/* This file is part of the library KASKADE 7 */
4/* https://www.zib.de/research/projects/kaskade7-finite-element-toolbox */
5/* */
6/* Copyright (C) 2002-2019 Zuse Institute Berlin */
7/* */
8/* KASKADE 7 is distributed under the terms of the ZIB Academic License. */
9/* see $KASKADE/academic.txt */
10/* */
11/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
12
13#ifndef FUNCTIONAL_MANIPULATION_HH
14#define FUNCTIONAL_MANIPULATION_HH
15
16namespace Kaskade
17{
18// APPEARS TO BE UNUSED (and is anyways undocumented and in a bad state).
19// WILL BE REMOVED AFTER 2019-08.
20// template<class Function, class Evaluators, class VarArgs>
21// class ComputeTestFunctions
22// {
23// public:
24// ComputeTestFunctions(Function const& u_,
25// Evaluators const& evaluators_,
26// VarArgs& testfu_):
27// u(u_), evaluators(evaluators_), testfu(testfu_)
28// {
29// }
30//
31// template<class Variable>
32// void operator()(Variable const& var) const
33// {
34// int const id = Variable::id;
35// int const spc = Variable::spaceIndex;
36// using namespace boost::fusion;
37// at_c<id>(testfu).value.result_of::value_at_c<VarArgs, id>::type::ValueType::operator=(at_c<id>(u.data).value(at_c<spc>(evaluators)));
38// at_c<id>(testfu).gradient.result_of::value_at_c<VarArgs, id>::type::GradientType::operator=(at_c<id>(u.data).gradient(at_c<spc>(evaluators)));
39// }
40// private:
41// Function const& u;
42// Evaluators const& evaluators;
43// VarArgs& testfu;
44// };
45
46 //----------------------------------------------------------------------------------------------------
57 template<class Lin, bool simplified=true>
59 {
60 public:
61
62 typedef Lin Linearization;
63
64 static ProblemType const type = Linearization::type;
65
66 typedef typename Linearization::AnsatzVars AnsatzVars;
67 typedef typename Linearization::TestVars TestVars;
68 typedef typename Linearization::OriginVars OriginVars;
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;
74 typedef typename Entity::LeafIntersectionIterator FaceIterator;
75
76 typedef typename Linearization::AnsatzVars::VariableSet DomainElement;
77 typedef typename boost::fusion::result_of::as_vector<typename boost::fusion::result_of::transform<Spaces, GetEvaluatorTypes>::type>::type Evaluators;
78
79 QuadraticModel(Linearization const& f_, DomainElement const& dx_) : f(f_), ddf(f_), dx(dx_) {}
80
81 QuadraticModel(Linearization const& f_, Linearization const& ddf_, DomainElement const& dx_) : f(f_), ddf(ddf_), dx(dx_) {}
82
83 template<int row>
85 {
86 typedef typename boost::fusion::result_of::value_at_c<typename DomainElement::Functions,row>::type::ValueType type;
87 };
88
89 // To be used with accumulate.
90 template<int row, int dim, class Cache>
92 {
93 public:
94 template <class T> struct result {};
95
96 template<typename T, typename State>
97 struct result<HessianTimesDirection<row,dim,Cache>(T,State)>
98 {
99 typedef typename RowValueType<row>::type type;
100 };
101
102 // arg_ : argument that would be used in a d1 evaluation
103 // du_ : direction, in which d2(arg, .) is evaluated
104 // cache_: cache_.d2 is evaluated
105 // eval: : evaluators to compute shape functions.
106 HessianTimesDirection(VariationalArg<RT,dim> const& arg_, DomainElement const &du_,Cache const& cache_, Evaluators const& eval_):
107 arg(arg_), du(du_), cache(cache_), evaluators(eval_)
108 {
109 }
110
111 template<class Variable>
112 typename RowValueType<row>::type operator()(Variable const& var,typename RowValueType<row>::type const& sum) const
113 {
114 using namespace boost::fusion;
115 int const id = Variable::id;
117 {
118 int const csIdx = Variable::spaceIndex;
119 int nShapeFcts = at_c<csIdx>(evaluators).size();
120 typename RowValueType<row>::type s2(sum);
121 for (int i=0; i<nShapeFcts; ++i)
122 {
124 // d2(shapefunction_values, arg)
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);
127 }
128 return s2;
129 }
130 else
131 {
132 return sum;
133 }
134 }
135 private:
136 VariationalArg<RT,dim> const& arg;
137 DomainElement const& du;
138 Cache const& cache;
139 Evaluators const& evaluators;
140 };
141
142 template<class LinFunctional>
144 {
145 public:
146 template <class T> struct result {};
147
148 template<typename T, typename State>
149 struct result<LinearFunctionalTimesDirection<LinFunctional>(T,State)>
150 {
151 typedef RT type;
152 };
153
154 LinearFunctionalTimesDirection(DomainElement const &du_, LinFunctional const& fctl_, Evaluators const& eval_):
155 du(du_), fctl(fctl_), evaluators(eval_)
156 {
157 }
158
159 template<class Variable>
160 RT operator()(Variable const& var, RT const& sum) const
161 {
162 using namespace boost::fusion;
163 int const id = Variable::id;
164 int const csIdx = Variable::spaceIndex;
165 int nShapeFcts = at_c<csIdx>(evaluators).size();
166
167 RT s2(sum);
169 for (int i=0; i<nShapeFcts; ++i)
170 {
171 typename RowValueType<id>::type fv;
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]];
174 }
175 return s2;
176 }
177 private:
178 DomainElement const& du;
179 LinFunctional const& fctl;
180 Evaluators const& evaluators;
181 };
182
183
184
186 {
187 typedef typename Linearization::DomainCache DomainCache1;
188 DomainCache(int flags, Linearization const& f_, Linearization const& ddf_, DomainElement const& du_)
189 : du(du_),
190 fdc(f_.createDomainCache(flags)),
191 ffdc(ddf_.createDomainCache(flags))
192 {
193 if(simplified) ddfdc=&ffdc;
194 else
195 ddfdc=&fdc;
196 }
197
198 template<class EntityOrFace>
199 void moveTo(EntityOrFace const& e_)
200 {
201 fdc.moveTo(e_);
202 if(simplified) ddfdc->moveTo(e_);
203 }
204
205 template<class Position>
206 void evaluateAt(Position const& x, Evaluators const& evaluators)
207 {
208 using namespace boost::fusion;
209 fdc.evaluateAt(x,evaluators);
210 if(simplified) ddfdc->evaluateAt(x,evaluators);
211 eval=&evaluators;
212 }
213
214 RT d0() const {
215 return boost::fusion::accumulate(vars,fdc.d0(),LinearFunctionalTimesDirection<DomainCache >(du,*this,*eval));
216 }
217
218 template <int row, int dim>
220 {
221 return boost::fusion::accumulate(vars,fdc.d1<row,dim>(arg),HessianTimesDirection<row,dim,DomainCache1>(arg,du,*ddfdc,*eval));
222 }
223
224 template <int row, int dim>
226 {
227 return 0.5*boost::fusion::accumulate(vars,2.0*fdc.d1<row,dim>(arg),HessianTimesDirection<row,dim,DomainCache1>(arg,du,*ddfdc,*eval));
228 }
229
230 template <int row, int col, int dim>
232 d2(VariationalArg<RT,dim> const& arg1, VariationalArg<RT,dim> const& arg2) const
233 {
234 return fdc.d2<row,col,dim>(arg1,arg2);
235 }
236
237 private:
238 DomainElement const& du;
239 DomainCache1 fdc, ffdc;
240 DomainCache1* ddfdc;
241 typename AnsatzVars::Variables vars;
242 Evaluators const* eval;
243 };
244
245
247 {
248 typedef typename Linearization::BoundaryCache BoundaryCache1;
249
250 BoundaryCache(int flags, Linearization const& f_, Linearization const& ddf_, DomainElement const& du_)
251 : du(du_),
252 fdc(f_.createBoundaryCache(flags)),
253 ffdc(ddf_.createBoundaryCache(flags))
254 {
255 if(simplified) ddfdc=&ffdc;
256 else
257 ddfdc=&fdc;
258 }
259
260 template<class EntityOrFace>
261 void moveTo(EntityOrFace const& e_)
262 {
263 fdc.moveTo(e_);
264 if(simplified) ddfdc->moveTo(e_);
265 }
266
267 template<class Position>
268 void evaluateAt(Position const& x, Evaluators const& evaluators)
269 {
270 using namespace boost::fusion;
271 fdc.evaluateAt(x,evaluators);
272 if(simplified) ddfdc->evaluateAt(x,evaluators);
273 eval=&evaluators;
274 }
275
276 RT d0() const { assert(!"not implemented"); return fdc.d0(); }
277
278 template <int row, int dim>
280 {
281 return boost::fusion::accumulate(vars,fdc.d1<row,dim>(arg),HessianTimesDirection<row,dim,BoundaryCache1>(arg,du,*ddfdc,*eval));
282 }
283
284 template <int row, int col, int dim>
286 d2(VariationalArg<RT,dim> const& arg1, VariationalArg<RT,dim> const& arg2) const
287 {
288 return fdc.d2<row,col,dim>(arg1,arg2);
289 }
290
291 private:
292 DomainElement const& du;
293 BoundaryCache1 fdc, ffdc;
294 BoundaryCache1* ddfdc;
295 typename AnsatzVars::Variables vars;
296 Evaluators const* eval;
297 };
298
299
300
301 DomainCache createDomainCache(int flags=7) const {return DomainCache(flags,f,ddf,dx);}
302
303 BoundaryCache createBoundaryCache(int flags=7) const {return BoundaryCache(flags,f,ddf,dx);}
304
305 template <class Cell>
306 int integrationOrder(Cell const& cell , int shapeFunctionOrder, bool boundary) const
307 {
308 return f.integrationOrder(cell,shapeFunctionOrder,boundary);
309 }
310
311 DomainElement const& getOrigin() const {return f.getOrigin(); }
312
313 template <int row, int col>
314 struct D2
315 {
316 static bool const present = Linearization::template D2<row,col>::present;
317 static bool const lumped = Linearization::template D2<row,col>::lumped;
318 static bool const symmetric = true;
319 };
320
321 template <int row>
322 struct D1
323 {
324 static bool const present = Linearization::template D1<row>::present;
325 };
326
327 private:
328 Linearization const& f;
329 Linearization const& ddf;
330 DomainElement const& dx;
331 };
332
333 //----------------------------------------------------------------------------------------------------
340 namespace ifff{
341 template <bool c>
342 struct if_
343 {
344 template <class A, class B>
345 static A value(A const& a, B const& b) { return a; }
346 };
347
348 template <>
349 struct if_<false>
350 {
351 template <class A, class B>
352 static B value(A const& a, B const& b) { return b; }
353 };
354
355 };
356
357 // DEPRECATED. TODO: improve functional difference in functional_aux.hh to cover arbitrary linear combinations
358 // SumFunctional appears to be essentially unused (only found an occurence in
359 // KaskadeProblems/stateConstraints/stateConstraints_aux.hh from 2009).
360 template<class Fu1, class Fu2>
362 {
363 public:
364
365 typedef Fu1 Functional;
366 typedef Fu2 Functional2;
367
368 static ProblemType const type = Functional::type;
369
370 typedef typename Functional::AnsatzVars AnsatzVars;
371 typedef typename Functional::TestVars TestVars;
372 typedef typename Functional::OriginVars OriginVars;
373 typedef typename Functional::RT RT;
374 typedef typename Functional::RT Scalar;
375 typedef typename AnsatzVars::Grid Grid;
376 typedef typename AnsatzVars::Spaces Spaces;
377
378
379 typedef typename Grid::template Codim<0>::Entity Entity;
380 typedef typename Entity::LeafIntersectionIterator FaceIterator;
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;
383
384
385 SumFunctional(Functional const& f_, Functional2 const& f2_) : f(f_), f2(f2_) {}
386
387 template<int row>
389 {
390 typedef typename boost::fusion::result_of::value_at_c<typename Function::Functions,row>::type::ValueType type;
391 };
392
394 {
395 typedef typename Functional::DomainCache DomainCache1;
396 typedef typename Functional2::DomainCache DomainCache2;
397 DomainCache(int flags, Functional const& f_, Functional2 const& f2_)
398 : fdc(f_.createDomainCache(flags)),
399 f2dc(f2_.createDomainCache(flags))
400 {
401 }
402
403 template<class EntityOrFace>
404 void moveTo(EntityOrFace const& e_)
405 {
406 fdc.moveTo(e_);
407 f2dc.moveTo(e_);
408 }
409
410 template<class Position>
411 void evaluateAt(Position const& x, Evaluators const& evaluators)
412 {
413 using namespace boost::fusion;
414 fdc.evaluateAt(x,evaluators);
415 f2dc.evaluateAt(x,evaluators);
416 }
417
418 RT d0() const { return fdc.d0()+f2dc.d0(); }
419
420 template <int row, int dim>
422 {
423 return fdc.d1<row,dim>(arg)+f2dc.d1<row,dim>(arg);
424 }
425
426 template <int row, int col, int dim>
428 d2(VariationalArg<RT,dim> const& arg1, VariationalArg<RT,dim> const& arg2) const
429 {
430
432 if(Functional::template D2<row,col>::present) result +=
433 ifff::if_<Functional::template D2<row,col>::present>::value(fdc.d2<row,col,dim>(arg1,arg2),result);
434 if(Functional2::template D2<row,col>::present) result +=
435 ifff::if_<Functional2::template D2<row,col>::present>::value(f2dc.d2<row,col,dim>(arg1,arg2),result);
436
437
438 // if(Functional::template D2<row,col>::present) result += fdc.d2<row,col,dim>(arg1,arg2);
439 // if(Functional2::template D2<row,col>::present) result += f2dc.d2<row,col,dim>(arg1,arg2);
440
441 return result;
442 }
443
444 private:
445 DomainCache1 fdc;
446 DomainCache2 f2dc;
447 };
448
449
451 {
452 typedef typename Functional::BoundaryCache BoundaryCache1;
453 typedef typename Functional2::BoundaryCache BoundaryCache2;
454
455 BoundaryCache(int flags, Functional const& f_, Functional2 const& f2_)
456 : fdc(f_.createBoundaryCache(flags)),
457 f2dc(f2_.createBoundaryCache(flags))
458 {
459 }
460
461 template<class EntityOrFace>
462 void moveTo(EntityOrFace const& e_)
463 {
464 fdc.moveTo(e_);
465 f2dc.moveTo(e_);
466 }
467
468 template<class Position>
469 void evaluateAt(Position const& x, Evaluators const& evaluators)
470 {
471 using namespace boost::fusion;
472 fdc.evaluateAt(x,evaluators);
473 f2dc.evaluateAt(x,evaluators);
474 }
475
476 RT d0() const { return fdc.d0()+f2dc.d0(); }
477
478 template <int row, int dim>
480 {
481 typename RowValueType<row>::type result=fdc.d1<row,dim>(arg);
482
483 result +=f2dc.d1<row,dim>(arg); ;
484 return result;
485 }
486
487 template <int row, int col, int dim>
489 d2(VariationalArg<RT,dim> const& arg1, VariationalArg<RT,dim> const& arg2) const
490 {
491
493 if(Functional::template D2<row,col>::present) result +=
494 ifff::if_<Functional::template D2<row,col>::present>::value(fdc.d2<row,col,dim>(arg1,arg2),result);
495 if(Functional2::template D2<row,col>::present) result +=
496 ifff::if_<Functional2::template D2<row,col>::present>::value(f2dc.d2<row,col,dim>(arg1,arg2),result);
497
498 return result;
499 // if(!Functional::template D2<row,col>::present) return f2dc.d2<row,col,dim>(arg1,arg2);
500 // if(!Functional2::template D2<row,col>::present) return fdc.d2<row,col,dim>(arg1,arg2);
501 // return fdc.d2<row,col,dim>(arg1,arg2)+f2dc.d2<row,col,dim>(arg1,arg2);
502 }
503
504 private:
505 BoundaryCache1 fdc;
506 BoundaryCache2 f2dc;
507 };
508
509
510
511 DomainCache createDomainCache(int flags=7) const {return DomainCache(flags,f,f2);}
512
513 BoundaryCache createBoundaryCache(int flags=7) const {return BoundaryCache(flags,f,f2);}
514
515 template <class Cell>
516 int integrationOrder(Cell const& cell , int shapeFunctionOrder, bool boundary) const
517 {
518 return std::max(f.integrationOrder(cell,shapeFunctionOrder,boundary),f2.integrationOrder(cell,shapeFunctionOrder,boundary));
519 }
520
521 Function const& getOrigin() const {return f.getOrigin(); }
522
523 template <int row>
524 struct D1
525 {
526 static bool const present = Functional::template D1<row>::present || Functional2::template D1<row>::present;
527 };
528
529 template <int row, int col>
530 struct D2
531 {
532 static bool const present = Functional::template D2<row,col>::present || Functional2::template D2<row,col>::present;
533 static bool const lumped = Functional::template D2<row,col>::lumped;
534 static bool const symmetric = Functional::template D2<row,col>::symmetric && Functional2::template D2<row,col>::symmetric;
535 };
536
537 private:
538 Functional const& f;
539 Functional2 const& f2;
540 };
541
542 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
543 /* * * * * * * * * * * * * * * * * * * * * Sum Caches * * * * * * * * * * * * * * * * * * * */
544 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
549 template <class Cache1, class Cache2>
551 {
552 public:
553 SumCache(Cache1 const& cache1_, Cache2 const& cache2_) : cache1(cache1_), cache2(cache2_)
554 {}
555
556 auto d0() const -> decltype(std::declval<Cache1>().d0()+std::declval<Cache2>().d0())
557 {
558 return cache1.d0() + cache2.d0();
559 }
560
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))
563 {
564 return cache1.template d1<row>(arg) + cache2.template d1<row>(arg);
565 }
566
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))
570 {
571 return cache1.template d2<row,col>(arg1,arg2) + cache2.template d2<row,col>(arg1,arg2);
572 }
573
574 private:
575 Cache1 const& cache1;
576 Cache2 const& cache2;
577 };
578} /* end of namespace Kaskade */
579
580#endif
Function is the interface for evaluatable functions .
Definition: concepts.hh:324
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
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::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
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.
Definition: gridBasics.hh:35
Dune::FieldVector< T, n > max(Dune::FieldVector< T, n > x, Dune::FieldVector< T, n > const &y)
Componentwise maximum.
Definition: fixdune.hh:110
Helper class for specifying the number of components of a variable.
Definition: variables.hh:100
void evaluateAt(Position const &x, Evaluators const &evaluators)
BoundaryCache(int flags, Linearization const &f_, Linearization const &ddf_, DomainElement const &du_)
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
RowValueType< row >::type evaluate(VariationalArg< RT, dim > const &arg) const
DomainCache(int flags, Linearization const &f_, Linearization const &ddf_, DomainElement const &du_)
void evaluateAt(Position const &x, Evaluators const &evaluators)
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
boost::fusion::result_of::value_at_c< typenameDomainElement::Functions, row >::type::ValueType type
RowValueType< row >::type d1(VariationalArg< RT, dim > const &arg) const
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
BoundaryCache(int flags, Functional const &f_, Functional2 const &f2_)
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_)
RowValueType< row >::type d1(VariationalArg< RT, dim > const &arg) const
boost::fusion::result_of::value_at_c< typenameFunction::Functions, row >::type::ValueType type
A class defining elementary information about a single variable.
Definition: variables.hh:128
static int const spaceIndex
Definition: variables.hh:129
static B value(A const &a, B const &b)
static A value(A const &a, B const &b)