KASKADE 7 development version
kaskadeBridge.hh
Go to the documentation of this file.
1/*
2 * kaskadeBridge.hh
3 *
4 * Created on: 06.12.2013
5 * Author: Lars Lubkoll, Anton Schiela
6 */
7
8#ifndef KASKADE_BRIDGE_HH_
9#define KASKADE_BRIDGE_HH_
10
11#include <boost/signals2.hpp>
12#include <boost/bind.hpp>
13
17
18namespace Kaskade
19{
20 template <class Value>
21 void assignIfNegative(Value& val, Value newVal)
22 {
23 if(val < 0) val = newVal;
24 }
25
26 namespace Bridge
27 {
28 template <class Linearization>
30 {
31 public:
32 template <typename... Args>
33 ConnectedLinearization(const Args&... args) : Linearization(args...)
34 {}
35
36 virtual ~ConnectedLinearization() { changed(); flushconn.disconnect(); }
37
38 virtual void flush() { changed(); Linearization::flush(); }
39
40 virtual void connectToSignalForFlush(boost::signals2::signal<void ()>& sig)
41 {
42 if(flushconn.connected()) flushconn.disconnect();
43 flushconn=sig.connect(boost::bind(&ConnectedLinearization<Linearization>::flush, this));
44 }
45
46 boost::signals2::signal<void ()> changed;
47 boost::signals2::connection flushconn;
48 };
49
50
51
53
54 template<class Functional>
56 {
57 public:
58
59 static const int nThreads = 32;
60
61 typedef typename Functional::AnsatzVars::VariableSet DomainElement;
62 typedef typename Functional::TestVars::VariableSet ImageElement;
63 typedef typename Functional::Scalar Scalar;
66 typedef typename DomainElement::Descriptions::template CoefficientVectorRepresentation<>::type CoefficientVector;
67 typedef Dune::LinearOperator<CoefficientVector, CoefficientVector> OperatorType;
69
70 /* KaskadeLinearization()
71 : x(0), fu(nullptr), lin(*fu,x), ass(nullptr), xptr(nullptr)
72 {
73 flush();
74 }
75
77 KaskadeLinearization(Functional const& fu_)
78 : x(0), fu(&fu_), lin(*fu,x), ass(nullptr), xptr(nullptr)
79 {
80 flush();
81 }*/
82
85 : x(x_), fu(&fu_), lin(*fu,x), ass(new Assembler(x.descriptions.spaces)), xptr(new Vector<DomainElement>(x))
86 {
87 flush();
88 }
89
91 KaskadeLinearization(Functional const& fu_, DomainElement const& x_, std::shared_ptr<Assembler> const& ass_)
92 : x(x_), fu(&fu_), lin(*fu,x), ass(ass_), xptr(new Vector<DomainElement>(x))
93 {
94 flush();
95 }
96
98 : x(other.x), fu(other.fu), lin(*fu,x), ass(other.ass), xptr(new Vector<DomainElement>(x))
99 {
100 }
101
103
105 int cols(int cbegin=0, int cend=-1) const
106 {
108 assert(cbegin<cend);
109 return x.descriptions.degreesOfFreedom(cbegin,cend);
110 }
111
113 int rows(int rbegin=0, int rend=-1) const
114 {
116 assert(rbegin < rend);
117 return x.descriptions.degreesOfFreedom(rbegin,rend);
118 }
119
120 void precompute() {
122 }
123
125 void getMatrixBlocks(MatrixAsTriplet<Scalar>& mat, int rbegin, int rend, int cbegin, int cend) const
126 {
128 mat = ass->template get<MatrixAsTriplet<Scalar> >(false,rbegin,rend,cbegin,cend);
129
131 {
133 getDiscreteMatrixBlocks(matD,rbegin,rend,cbegin,cend);
134 mat+=matD;
135 }
136 }
137
139 void getRHSBlocks(std::vector<Scalar>& rhs, int rbegin, int rend) const
140 {
142 rhs.resize(rows(rbegin,rend),0.0);
143 ass->toSequence(rbegin,rend,rhs.begin());
145 {
146 addDiscreteRHSBlocks(rhs,rbegin,rend);
147 }
148 }
149
150
152 int nColBlocks() const { return Functional::AnsatzVars::noOfVariables; }
153
155 int nRowBlocks() const { return Functional::TestVars::noOfVariables; }
156
159 {
160 return *xptr;
161 }
162
164 {
165 x = Bridge::getImpl<DomainElement>(x_);
166 xptr.reset(new Vector<DomainElement>(x));
167
168 if(ass == nullptr)
169 {
170 ass.reset(new Assembler(x.descriptions.spaces));
171 }
172 }
173
175 Implementation const& getLinImpl() const {return lin; }
176
179
182
184 double eval() const
185 {
187 Scalar value =ass->functional();
190 return value;
191 }
192
193 double getValue() const { return eval(); }
194
195 void evald(AbstractFunctionSpaceElement& v, int rbegin, int rend) const
196 {
198 assert(rbegin<=rend);
199 std::vector<Scalar> rhs(rows(rbegin,rend),0.0);
200 getRHSBlocks(rhs,rbegin,rend);
201 dynamic_cast<Vector<ImageElement>& >(v).read(rhs,rbegin,rend);
202 }
203
204 void ddxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
205 {
208 d2axpy(1.0,y,x,rbegin,rend,cbegin,cend);
209 }
210
211 void d2axpy(double a, AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
212 {
215 assert( cbegin <= cend );
216 assert( rbegin <= rend );
217 std::vector<Scalar> result, argument;
218 dynamic_cast<Vector<ImageElement> const&>(x).write(argument,cbegin,cend);
219 dynamic_cast<Vector<ImageElement> const&>(y).write(result,rbegin,rend);
221 getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
222 mat.axpy(result, argument, a);
223 dynamic_cast<Vector<ImageElement>&>(y).read(result,rbegin,rend);
224 }
225
226 void ddtxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
227 {
230 d2taxpy(1.0,y,x,rbegin,rend,cbegin,cend);
231 }
232
233 void d2taxpy(double a, AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
234 {
237
238 assert( cbegin <= cend );
239 assert( rbegin <= rend );
240 std::vector<Scalar> result, argument;
241 dynamic_cast<Vector<ImageElement> const&>(x).write(argument,rbegin,rend);
242 dynamic_cast<Vector<ImageElement> const&>(y).write(result,cbegin,cend);
244 getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
245 mat.transpose().axpy(result, argument, a);
246 dynamic_cast<Vector<ImageElement>&>(y).read(result,cbegin,cend);
247 }
248
249 double evalL1norm() const
250 {
252 Scalar value =0;//ass.fL1norm();
254 value += std::fabs(DiscreteBlockTraits<Functional>::getValue(*fu,x));
255 return value;
256 }
257
259 {
261 return *ass;
262 }
263
265 {
266 return *fu;
267 }
268
269 protected:
270 void addDiscreteRHSBlocks(std::vector<Scalar>& rhs, int rbegin, int rend) const
271 {
272 for(int i=rbegin; i<rend; ++i)
273 {
274 std::vector<Scalar> rhsD;
276 if(rhsD.size() > 0)
277 {
278 assert(rhsD.size() == rows(i,i+1));
279 for(int k=rows(rbegin,i), l=0;k<rows(rbegin,i+1);++k, ++l)
280 rhs[k]+=rhsD[l];
281 }
282 }
283 }
284
285 void getDiscreteMatrixBlocks(MatrixAsTriplet<Scalar>& mat, int rbegin, int rend, int cbegin, int cend) const
286 {
287 for(int i=rbegin; i<rend; ++i)
288 for(int j=cbegin; j<cend; ++j)
289 {
292 matD.shiftIndices(rows(rbegin,i),cols(cbegin,j));
293 mat+=matD;
294 }
295 }
296
297 void doAssemble(int flags) const
298 {
299 int toDoFlag= ((~ass->valid()) & flags);
300 if(toDoFlag!=0) ass->assemble(lin,toDoFlag,nThreads);
301 }
302
303
307 mutable std::shared_ptr<Assembler> ass;
308 std::unique_ptr<Vector<DomainElement> > xptr;
309 };
310
312
313 template<class Functional, int stateId=1, int adjointId=2>
315 {
317 typedef typename Base::Scalar Scalar;
318 typedef typename Base::Assembler Assembler;
319 typedef typename Base::DomainElement DomainElement;
320 typedef typename Base::ImageElement ImageElement;
321 using Base::nRowBlocks;
322 using Base::nColBlocks;
323 public:
325
327 NormalStepLinearization(Functional const& fu, DomainElement const& x) : Base(fu,x) {}
328
330 NormalStepLinearization(Functional const& fu, DomainElement const& x, std::shared_ptr<Assembler> const& assembler) : Base(fu,x,assembler) {}
331
332 NormalStepLinearization(Base const& other) : Base(other) {}
333
335 void getMatrixBlocks(MatrixAsTriplet<Scalar>& mat, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
336 {
337 assignIfNegative(rend,nRowBlocks());
338 assignIfNegative(cend,nColBlocks());
339 if(rbegin==adjointId && rend==adjointId+1 && cbegin==adjointId && cend==adjointId+1) return;
341 if(rbegin==stateId && rend==stateId+1 && cbegin==stateId && cend==stateId+1)
342 {
343 mat = this->ass->template get<MatrixAsTriplet<Scalar> >(false,adjointId,adjointId+1,adjointId,adjointId+1);
344 return;
345 }
346
347 if(rbegin<=stateId && rend>stateId && cbegin<=stateId && cend > stateId)
348 {
349 size_t rows0 = 0, cols0 = 0, rows1 = 0, cols1 = 0;
351 if(rbegin < stateId)
352 {
353 tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,rbegin,stateId,cbegin,cend);
354 rows0 = tmp.nrows();
355 mat += tmp;
356 }
357 if(cbegin < stateId)
358 {
359 tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,stateId,stateId+1,cbegin,stateId);
360 cols0 = tmp.ncols();
361 tmp.shiftIndices(rows0,0);
362 mat += tmp;
363 }
364 tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,adjointId,adjointId+1,adjointId,adjointId+1);
365 rows1 = tmp.nrows(), cols1 = tmp.ncols();
366 tmp.shiftIndices(rows0,cols0);
367 mat += tmp;
368 if(cend > stateId+1)
369 {
370 tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,stateId,stateId+1,stateId+1,cend);
371 tmp.shiftIndices(rows0,cols0+cols1);
372 mat += tmp;
373 }
374 if(rend > stateId+1)
375 {
376 tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,stateId+1,rend,cbegin,cend);
377 tmp.shiftIndices(rows0+rows1,0);
378 mat += tmp;
379 }
380
381 }
382 else
383 mat = this->ass->template get<MatrixAsTriplet<Scalar> >(false,rbegin,rend,cbegin,cend);
384
385
387 {
389 this->getDiscreteMatrixBlocks(matD,rbegin,rend,cbegin,cend);
390 mat+=matD;
391 }
392 }
393
394 void ddxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
395 {
396 assignIfNegative(rend,nRowBlocks());
397 assignIfNegative(cend,nColBlocks());
398 if(rbegin==adjointId && rend==adjointId+1 && cbegin==adjointId && cend==adjointId+1) return;
399 assert(cbegin<=cend);
400 assert(rbegin<=rend);
401 std::vector<Scalar> result, argument;
402 dynamic_cast<Vector<ImageElement> const& >(x).write(argument,cbegin,cend);
403 dynamic_cast<Vector<ImageElement>& >(y).write(result,rbegin,rend);
405 getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
406 mat.axpy(result, argument);
407 dynamic_cast<Vector<ImageElement>& >(y).read(result,rbegin,rend);
408 }
409
410 void d2axpy(double a, AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
411 {
412 assignIfNegative(rend,nRowBlocks());
413 assignIfNegative(cend,nColBlocks());
414 if( rbegin == adjointId && rend == adjointId+1 && cbegin == adjointId && cend == adjointId+1 ) return;
415 assert( cbegin <= cend );
416 assert( rbegin <= rend );
417 std::vector<Scalar> result, argument;
418 dynamic_cast<Vector<ImageElement> const&>(x).write(argument,cbegin,cend);
419 dynamic_cast<Vector<ImageElement> const&>(y).write(result,rbegin,rend);
421 getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
422 mat.axpy(result, argument, a);
423 dynamic_cast<Vector<ImageElement>&>(y).read(result, rbegin, rend);
424 }
425 };
426
427 template<class Functional, int stateId=1, int adjointId=2>
429 {
431 typedef typename Base::Scalar Scalar;
432 typedef typename Base::Assembler Assembler;
433 typedef typename Base::DomainElement DomainElement;
434 typedef typename Base::ImageElement ImageElement;
435 using Base::nRowBlocks;
436 using Base::nColBlocks;
437 public:
439
441 TangentialStepLinearization(Functional const& fu, DomainElement const& x) : Base(fu,x) {}
442
444 TangentialStepLinearization(Functional const& fu, DomainElement const& x, std::shared_ptr<Assembler> const& assembler) : Base(fu,x,assembler) {}
445
446
447 TangentialStepLinearization(Base const& other) : Base(other) {}
448
450 void getMatrixBlocks(MatrixAsTriplet<Scalar>& mat, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
451 {
452 assignIfNegative(rend,nRowBlocks());
453 assignIfNegative(cend,nColBlocks());
454 if(rbegin==adjointId && rend==adjointId+1 && cbegin==adjointId && cend==adjointId+1) return;
456
457 if(rend > adjointId && cend > adjointId)
458 {
459 mat = this->ass->template get<MatrixAsTriplet<Scalar> >(false,rbegin,rend-1,cbegin,cend-1);
460 size_t rows = mat.nrows(), cols = mat.ncols();
461 auto tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,rend-1,rend,cbegin,cend-1);
462 tmp.shiftIndices(rows,0);
463 mat += tmp;
464 tmp = this->ass->template get<MatrixAsTriplet<Scalar> >(false,rbegin,rend-1,cend-1,cend);
465 tmp.shiftIndices(0,cols);
466 mat += tmp;
467 }
468 else
469 mat = this->ass->template get<MatrixAsTriplet<Scalar> >(false,rbegin,rend,cbegin,cend);
470
472 {
474 this->getDiscreteMatrixBlocks(matD,rbegin,rend,cbegin,cend);
475 mat+=matD;
476 }
477 }
478
479 void ddxpy(AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
480 {
481 assignIfNegative(rend,nRowBlocks());
482 assignIfNegative(cend,nColBlocks());
483 if(rbegin==adjointId && rend==adjointId+1 && cbegin==adjointId && cend==adjointId+1) return;
484 assert(cbegin<=cend);
485 assert(rbegin<=rend);
486 std::vector<Scalar> result, argument;
487 dynamic_cast<Vector<ImageElement> const& >(x).write(argument,cbegin,cend);
488 dynamic_cast<Vector<ImageElement>& >(y).write(result,rbegin,rend);
490 getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
491 mat.axpy(result, argument);
492 dynamic_cast<Vector<ImageElement>& >(y).read(result,rbegin,rend);
493 }
494
495 void d2axpy(double a, AbstractFunctionSpaceElement& y, AbstractFunctionSpaceElement const& x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
496 {
497 assignIfNegative(rend,nRowBlocks());
498 assignIfNegative(cend,nColBlocks());
499 if( rbegin == adjointId && rend == adjointId+1 && cbegin == adjointId && cend == adjointId+1 ) return;
500 assert( cbegin <= cend );
501 assert( rbegin <= rend );
502 std::vector<Scalar> result, argument;
503 dynamic_cast<Vector<ImageElement> const&>(x).write(argument,cbegin,cend);
504 dynamic_cast<Vector<ImageElement> const&>(y).write(result,rbegin,rend);
506 getMatrixBlocks(mat,rbegin,rend,cbegin,cend);
507 mat.axpy(result, argument, a);
508 dynamic_cast<Vector<ImageElement>&>(y).read(result,rbegin,rend);
509 }
510 };
511
512 //template <class Functional, int stateId=1, int adjointId=2> using NormalStepLinearization = ConnectedLinearization<NormalStepKaskadeLinearization<Functional,stateId,adjointId> >;
513 //template <class Functional, int stateId=1, int adjointId=2> using TangentialStepLinearization = ConnectedLinearization<TangentialStepKaskadeLinearization<Functional,stateId,adjointId> >;
514
515 }
516}
517
518#endif /* BRIDGE_HH_ */
Interfaces for function space oriented algorithms.
Abstract Vector for function space algorithms.
ConnectedLinearization(const Args &... args)
boost::signals2::signal< void()> changed
boost::signals2::connection flushconn
virtual void connectToSignalForFlush(boost::signals2::signal< void()> &sig)
Object that represents the linearization of a nonlinear functional, implements AbstractLineariztion.
FunctionalImpl::Scalar Scalar
Bridge::Linearization class that uses a VariationalFunctionalAssembler to create linear systems.
Dune::LinearOperator< CoefficientVector, CoefficientVector > OperatorType
double eval() const
return the current value Functional(Origin)
int nRowBlocks() const
return number of rows
KaskadeLinearization(Functional const &fu_, DomainElement const &x_)
Creation of a linearization for a functional fu at x_.
void getRHSBlocks(std::vector< Scalar > &rhs, int rbegin, int rend) const
write components of the gradient into rhs
void ddxpy(AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
DomainElement::Descriptions::template CoefficientVectorRepresentation ::type CoefficientVector
void addDiscreteRHSBlocks(std::vector< Scalar > &rhs, int rbegin, int rend) const
void flush()
flush all data, gathered so far
double getValue() const
value of function
void getMatrixBlocks(MatrixAsTriplet< Scalar > &mat, int rbegin, int rend, int cbegin, int cend) const
write blocks of the hessian matrix into mat
Assembler const & getValidAssembler() const
KaskadeLinearization(KaskadeLinearization const &other)
void ddtxpy(AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
void d2axpy(double a, 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+a*ddf*x.
int rows(int rbegin=0, int rend=-1) const
Number of rows of components [rbegin, rend)
Functional::AnsatzVars::VariableSet DomainElement
void d2taxpy(double a, 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+a*ddf*x.
int nColBlocks() const
return number of columns
void setOrigin(AbstractFunctionSpaceElement const &x_)
double evalL1norm() const
Evaluate L1 norm of integrand.
void getDiscreteMatrixBlocks(MatrixAsTriplet< Scalar > &mat, int rbegin, int rend, int cbegin, int cend) const
LinearizationAt< Functional > Implementation
KaskadeLinearization(Functional const &fu_, DomainElement const &x_, std::shared_ptr< Assembler > const &ass_)
Creation of a linearization for a functional fu at x_.
VariationalFunctionalAssembler< Implementation > Assembler
Functional::TestVars::VariableSet ImageElement
AbstractFunctionSpaceElement const & getOrigin() const
return point of linearization
bool inDomain(DomainElement const &x)
return whether x is in the domain of definition
std::shared_ptr< Assembler > ass
Functional const & getFunctional() const
void evald(AbstractFunctionSpaceElement &v, int rbegin, int rend) const
Evaluate derivative.
int cols(int cbegin=0, int cend=-1) const
Number of columns of components [cbegin, cend)
Implementation const & getLinImpl() const
return the implementation
std::unique_ptr< Vector< DomainElement > > xptr
void getMatrixBlocks(MatrixAsTriplet< Scalar > &mat, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
write blocks of the hessian matrix into mat
void ddxpy(AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
NormalStepLinearization(Functional const &fu, DomainElement const &x, std::shared_ptr< Assembler > const &assembler)
Creation of a linearization for a functional fu at x_.
NormalStepLinearization(Functional const &fu, DomainElement const &x)
Creation of a linearization for a functional fu at x_.
void d2axpy(double a, AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
TangentialStepLinearization(Functional const &fu, DomainElement const &x)
Creation of a linearization for a functional fu at x_.
void d2axpy(double a, AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
TangentialStepLinearization(Functional const &fu, DomainElement const &x, std::shared_ptr< Assembler > const &assembler)
Creation of a linearization for a functional fu at x_.
void getMatrixBlocks(MatrixAsTriplet< Scalar > &mat, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
write blocks of the hessian matrix into mat
void ddxpy(AbstractFunctionSpaceElement &y, AbstractFunctionSpaceElement const &x, int rbegin=0, int rend=-1, int cbegin=0, int cend=-1) const
Mathematical Vector that supports copy-on-write, implements AbstractFunctionSpaceElement.
SparseIndexInt nrows() const
Returns number of rows (computes them, if not known)
Definition: triplet.hh:202
SparseIndexInt ncols() const
Returns number of cols (computes them, if not known)
Definition: triplet.hh:215
void shiftIndices(SparseIndexInt row, SparseIndexInt col)
Shifts matrix indices. Can be used together with += to concatenate sparese matrices.
Definition: triplet.hh:334
MatrixAsTriplet & transpose()
Transposition.
Definition: triplet.hh:453
void axpy(Y &out, X const &in, Scalar alpha=1.0, int nvectors=1) const
Matrix-vector multiplication: out += alpha * (*this) * in.
Definition: triplet.hh:262
Abstract base class for a sparse linear system.
Definition: linearsystem.hh:30
A class for assembling Galerkin representation matrices and right hand sides for variational function...
static unsigned int const VALUE
DEPRECATED, enums in the Assembler namespace.
void assignIfNegative(Value &val, Value newVal)
Bridge classes that connect low level FE algorithms to higher level algorithms.
static void getMatrixBlock(MatrixAsTriplet< Scalar > &mat, Functional const &fu, Vars const &origin, int row, int col)
Definition: dune_bridge.hh:27
static Scalar getValue(Functional const &fu, Vars const &origin)
Definition: dune_bridge.hh:39
static void getRHSBlock(std::vector< Scalar > &rhs, Functional const &fu, Vars const &origin, int row)
Definition: dune_bridge.hh:33
static bool inDomain(DomainElement const &x)
Definition: dune_bridge.hh:59