3 #ifndef DUNE_PDELAB_LOCALOPERATOR_SUM_HH
4 #define DUNE_PDELAB_LOCALOPERATOR_SUM_HH
8 #include <dune/common/forloop.hh>
9 #include <dune/common/static_assert.hh>
10 #include <dune/common/tuples.hh>
11 #include <dune/common/tupleutility.hh>
12 #include <dune/common/typetraits.hh>
29 template<
typename Args>
34 typedef typename ForEachType<AddPtrTypeEvaluator, Args>::Type ArgPtrs;
35 typedef typename ForEachType<AddRefTypeEvaluator, Args>::Type ArgRefs;
49 : lops(transformTuple<AddPtrTypeEvaluator>(lops_))
53 template<std::
size_t i>
54 void setSummand(
typename tuple_element<i,Args>::type& summand)
55 { get<i>(lops) = &summand; }
58 template<std::
size_t i>
60 {
return *get<i>(lops); }
71 template<
typename T1,
typename T2>
73 :
public integral_constant<bool, T1::value || T2:: value>
75 template<
template<
int>
class Value>
76 struct AccFlag :
public GenericForLoop<OrOperation, Value, 0, size-1>
80 struct PatternVolumeValue :
public integral_constant
81 < bool, tuple_element<i, Args>::type::doPatternVolume>
84 struct PatternVolumePostSkeletonValue :
public integral_constant
85 < bool, tuple_element<i, Args>::type::doPatternVolumePostSkeleton>
88 struct PatternSkeletonValue :
public integral_constant
89 < bool, tuple_element<i, Args>::type::doPatternSkeleton>
92 struct PatternBoundaryValue :
public integral_constant
93 < bool, tuple_element<i, Args>::type::doPatternBoundary>
97 struct AlphaVolumeValue :
public integral_constant
98 < bool, tuple_element<i, Args>::type::doAlphaVolume>
101 struct AlphaVolumePostSkeletonValue :
public integral_constant
102 < bool, tuple_element<i, Args>::type::doAlphaVolumePostSkeleton>
105 struct AlphaSkeletonValue :
public integral_constant
106 < bool, tuple_element<i, Args>::type::doAlphaSkeleton>
109 struct AlphaBoundaryValue :
public integral_constant
110 < bool, tuple_element<i, Args>::type::doAlphaBoundary>
114 struct LambdaVolumeValue :
public integral_constant
115 < bool, tuple_element<i, Args>::type::doLambdaVolume>
118 struct LambdaVolumePostSkeletonValue :
public integral_constant
119 < bool, tuple_element<i, Args>::type::doLambdaVolumePostSkeleton>
122 struct LambdaSkeletonValue :
public integral_constant
123 < bool, tuple_element<i, Args>::type::doLambdaSkeleton>
126 struct LambdaBoundaryValue :
public integral_constant
127 < bool, tuple_element<i, Args>::type::doLambdaBoundary>
131 struct OneSidedSkeletonRequiredValue :
public integral_constant
132 < bool, ( ( tuple_element<i, Args>::type::doAlphaSkeleton ||
133 tuple_element<i, Args>::type::doLambdaSkeleton) &&
134 ! tuple_element<i, Args>::type::doSkeletonTwoSided)>
137 struct TwoSidedSkeletonRequiredValue :
public integral_constant
138 < bool, ( ( tuple_element<i, Args>::type::doAlphaSkeleton ||
139 tuple_element<i, Args>::type::doLambdaSkeleton) &&
140 tuple_element<i, Args>::type::doSkeletonTwoSided)>
202 "Some summands require a one-sided skelton, others a "
203 "two-sided skeleton. This is not supported.");
217 struct PatternVolumeOperation {
218 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
219 static void apply(
const ArgPtrs& lops,
220 const LFSU& lfsu,
const LFSV& lfsv,
221 LocalPattern& pattern)
224 tuple_element<i,Args>::type::doPatternVolume>
::
230 struct PatternVolumePostSkeletonOperation {
231 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
232 static void apply(
const ArgPtrs& lops,
233 const LFSU& lfsu,
const LFSV& lfsv,
234 LocalPattern& pattern)
236 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
237 tuple_element<i,Args>::type::doPatternVolumePostSkeleton>
::
243 struct PatternSkeletonOperation {
244 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
245 static void apply(
const ArgPtrs& lops,
246 const LFSU& lfsu_s,
const LFSV& lfsv_s,
247 const LFSU& lfsu_n,
const LFSV& lfsv_n,
248 LocalPattern& pattern_sn,
249 LocalPattern& pattern_ns)
251 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
252 tuple_element<i,Args>::type::doPatternSkeleton>
::
254 lfsu_s, lfsv_s, lfsu_n, lfsv_n,
255 pattern_sn, pattern_ns);
260 struct PatternBoundaryOperation {
261 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
262 static void apply(
const ArgPtrs& lops,
263 const LFSU& lfsu_s,
const LFSV& lfsv_s,
264 LocalPattern& pattern_ss)
266 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
267 tuple_element<i,Args>::type::doPatternBoundary>
::
279 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
281 (
const LFSU& lfsu,
const LFSV& lfsv,
282 LocalPattern& pattern)
const
284 ForLoop<PatternVolumeOperation, 0, size-1>::
285 apply(lops, lfsu, lfsv, pattern);
295 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
297 (
const LFSU& lfsu,
const LFSV& lfsv,
298 LocalPattern& pattern)
const
300 ForLoop<PatternVolumePostSkeletonOperation, 0, size-1>::
301 apply(lops, lfsu, lfsv, pattern);
310 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
312 (
const LFSU& lfsu_s,
const LFSV& lfsv_s,
313 const LFSU& lfsu_n,
const LFSV& lfsv_n,
314 LocalPattern& pattern_sn,
315 LocalPattern& pattern_ns)
const
317 ForLoop<PatternSkeletonOperation, 0, size-1>::
318 apply(lops, lfsu_s, lfsv_s, lfsu_n, lfsv_n,
319 pattern_sn, pattern_ns);
328 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
330 (
const LFSU& lfsu_s,
const LFSV& lfsv_s,
331 LocalPattern& pattern_ss)
const
333 ForLoop<PatternBoundaryOperation, 0, size-1>::
334 apply(lops, lfsu_s, lfsv_s, pattern_ss);
349 struct AlphaVolumeOperation {
350 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
352 static void apply(
const ArgPtrs& lops,
const EG&
eg,
353 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
357 tuple_element<i,Args>::type::doAlphaVolume>
::
363 struct AlphaVolumePostSkeletonOperation {
364 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
366 static void apply(
const ArgPtrs& lops,
const EG&
eg,
367 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
370 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
371 tuple_element<i,Args>::type::doAlphaVolumePostSkeleton>
::
379 struct AlphaSkeletonOperation {
380 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
382 static void apply(
const ArgPtrs& lops,
const IG&
ig,
383 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
384 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
387 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
388 tuple_element<i,Args>::type::doAlphaSkeleton>
::
397 struct AlphaBoundaryOperation {
398 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
400 static void apply(
const ArgPtrs& lops,
const IG&
ig,
401 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
404 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
405 tuple_element<i,Args>::type::doAlphaBoundary>
::
416 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
420 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
423 ForLoop<AlphaVolumeOperation, 0, size-1>::
424 apply(lops, eg, lfsu, x, lfsv, r);
433 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
437 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
440 ForLoop<AlphaVolumePostSkeletonOperation, 0, size-1>::
441 apply(lops, eg, lfsu, x, lfsv, r);
449 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
453 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
454 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
455 R& r_s, R& r_n)
const
457 ForLoop<AlphaSkeletonOperation, 0, size-1>::
469 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
473 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
476 ForLoop<AlphaVolumePostSkeletonOperation, 0, size-1>::
477 apply(lops, ig, lfsu_s, x_s, lfsv_s, r_s);
492 struct LambdaVolumeOperation {
493 template<
typename EG,
typename LFSV,
typename R>
494 static void apply(
const ArgPtrs& lops,
const EG& eg,
499 tuple_element<i,Args>::type::doLambdaVolume>
::
505 struct LambdaVolumePostSkeletonOperation {
506 template<
typename EG,
typename LFSV,
typename R>
507 static void apply(
const ArgPtrs& lops,
const EG& eg,
511 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
512 tuple_element<i,Args>::type::doLambdaVolumePostSkeleton>
::
518 struct LambdaSkeletonOperation {
519 template<
typename IG,
typename LFSV,
typename R>
520 static void apply(
const ArgPtrs& lops,
const IG& ig,
525 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
526 tuple_element<i,Args>::type::doLambdaSkeleton>
::
534 struct LambdaBoundaryOperation {
535 template<
typename IG,
typename LFSV,
typename R>
536 static void apply(
const ArgPtrs& lops,
const IG& ig,
540 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
541 tuple_element<i,Args>::type::doLambdaBoundary>
::
552 template<
typename EG,
typename LFSV,
typename R>
555 ForLoop<LambdaVolumeOperation, 0, size-1>::
556 apply(lops, eg, lfsv, r);
565 template<
typename EG,
typename LFSV,
typename R>
570 ForLoop<LambdaVolumePostSkeletonOperation, 0, size-1>::
571 apply(lops, eg, lfsv, r);
579 template<
typename IG,
typename LFSV,
typename R>
581 const LFSV& lfsv_s,
const LFSV& lfsv_n,
582 R& r_s, R& r_n)
const
584 ForLoop<LambdaSkeletonOperation, 0, size-1>::
585 apply(lops, ig, lfsv_s, lfsv_n, r_s, r_n);
593 template<
typename IG,
typename LFSV,
typename R>
596 ForLoop<LambdaBoundaryOperation, 0, size-1>::
597 apply(lops, ig, lfsv_s, r_s);
612 struct JacobianApplyVolumeOperation {
613 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
615 static void apply(
const ArgPtrs& lops,
const EG& eg,
616 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
620 tuple_element<i,Args>::type::doAlphaVolume>
::
626 struct JacobianApplyVolumePostSkeletonOperation {
627 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
629 static void apply(
const ArgPtrs& lops,
const EG& eg,
630 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
633 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
634 tuple_element<i,Args>::type::doAlphaVolumePostSkeleton>
::
642 struct JacobianApplySkeletonOperation {
643 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
645 static void apply(
const ArgPtrs& lops,
const IG& ig,
646 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
647 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
650 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
651 tuple_element<i,Args>::type::doAlphaSkeleton>
::
660 struct JacobianApplyBoundaryOperation {
661 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
663 static void apply(
const ArgPtrs& lops,
const IG& ig,
664 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
667 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
668 tuple_element<i,Args>::type::doAlphaBoundary>
::
681 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
685 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
688 ForLoop<JacobianApplyVolumeOperation, 0, size-1>::
689 apply(lops, eg, lfsu, x, lfsv, y);
698 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
702 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
705 ForLoop<JacobianApplyVolumePostSkeletonOperation, 0, size-1>::
706 apply(lops, eg, lfsu, x, lfsv, y);
714 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
718 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
719 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
720 Y& y_s, Y& y_n)
const
722 ForLoop<JacobianApplySkeletonOperation, 0, size-1>::
734 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
738 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
741 ForLoop<JacobianApplyBoundaryOperation, 0, size-1>::
742 apply(lops, ig, lfsu_s, x_s, lfsv_s, y_s);
757 struct JacobianVolumeOperation {
758 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
760 static void apply(
const ArgPtrs& lops,
const EG& eg,
761 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
765 tuple_element<i,Args>::type::doAlphaVolume>
::
771 struct JacobianVolumePostSkeletonOperation {
772 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
773 typename LocalMatrix>
774 static void apply(
const ArgPtrs& lops,
const EG& eg,
775 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
778 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
779 tuple_element<i,Args>::type::doAlphaVolumePostSkeleton>
::
787 struct JacobianSkeletonOperation {
788 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
789 typename LocalMatrix>
790 static void apply(
const ArgPtrs& lops,
const IG& ig,
791 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
792 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
793 LocalMatrix& mat_ss, LocalMatrix& mat_sn,
794 LocalMatrix& mat_ns, LocalMatrix& mat_nn)
796 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
797 tuple_element<i,Args>::type::doAlphaSkeleton>
::
801 mat_ss, mat_sn, mat_ns, mat_nn);
806 struct JacobianBoundaryOperation {
807 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
808 typename LocalMatrix>
809 static void apply(
const ArgPtrs& lops,
const IG& ig,
810 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
813 LocalAssemblerCallSwitch<typename tuple_element<i,Args>::type,
814 tuple_element<i,Args>::type::doAlphaBoundary>
::
816 lfsu_s, x_s, lfsv_s, mat_ss);
826 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
827 typename LocalMatrix>
830 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
833 ForLoop<JacobianVolumeOperation, 0, size-1>::
834 apply(lops, eg, lfsu, x, lfsv, mat);
842 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
846 const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
849 ForLoop<JacobianVolumePostSkeletonOperation, 0, size-1>::
850 apply(lops, eg, lfsu, x, lfsv, mat);
858 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
862 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
863 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
867 ForLoop<JacobianSkeletonOperation, 0, size-1>::
871 mat_ss, mat_sn, mat_ns, mat_nn);
879 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
883 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
886 ForLoop<JacobianBoundaryOperation, 0, size-1>::
887 apply(lops, ig, lfsu_s, x_s, lfsv_s, mat_ss);
899 typedef typename tuple_element<0, Args>::type::RealType
RealType;
905 template<
int i>
struct SetTimeOperation {
906 static void apply(ArgPtrs& lops,
RealType t)
910 template<
int i>
struct PreStepOperation {
911 static void apply(ArgPtrs& lops,
913 { get<i>(lops)->
preStep(time, dt, stages); }
916 template<
int i>
struct PostStepOperation {
917 static void apply(ArgPtrs& lops)
921 template<
int i>
struct PreStageOperation {
922 static void apply(ArgPtrs& lops,
RealType time,
int r)
923 { get<i>(lops)->
preStage(time, r); }
926 template<
int i>
struct PostStageOperation {
927 static void apply(ArgPtrs& lops)
931 template<
int i>
struct SuggestTimestepOperation {
932 static void apply(ArgPtrs& lops,
RealType& dt)
940 ForLoop<SetTimeOperation, 0, size-1>::apply(lops, t);
946 return get<0>(lops)->
getTime();
952 ForLoop<PreStepOperation, 0, size-1>::apply(lops, time, dt, stages);
958 ForLoop<PostStepOperation, 0, size-1>::apply(lops);
964 ForLoop<PreStageOperation, 0, size-1>::apply(lops, time, r);
976 ForLoop<PostStageOperation, 0, size-1>::apply(lops);
987 ForLoop<SuggestTimestepOperation, 0, size-1>::apply(lops, dt);
998 #endif // DUNE_PDELAB_LOCALOPERATOR_SUM_HH
void lambda_volume(const EG &eg, const LFSV &lfsv, R &r) const
get an element's contribution to lambda
Definition: sum.hh:553
int getStage() const
get current stage
Definition: sum.hh:968
void postStep()
to be called once at the end of each time step
Definition: sum.hh:956
A local operator to take the sum of other local operators.
Definition: sum.hh:30
void jacobian_volume_post_skeleton(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, LocalMatrix &mat) const
get an element's jacobian after the intersections have been handled
Definition: sum.hh:845
void lambda_volume_post_skeleton(const EG &eg, const LFSV &lfsv, R &r) const
get an element's contribution to lambda after the intersections have been handled ...
Definition: sum.hh:566
void lambda_boundary(const IG &ig, const LFSV &lfsv_s, R &r_s) const
get a boundary intersections's contribution to lambda
Definition: sum.hh:594
void jacobian_apply_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, Y &y_s) const
apply a boundary intersections's jacobian
Definition: sum.hh:737
void pattern_volume(const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern) const
get an element's contribution to the sparsity pattern
Definition: sum.hh:281
Definition: callswitch.hh:12
void preStage(RealType time, int r)
to be called once before each stage
Definition: sum.hh:962
dune_static_assert(!(AccFlag< OneSidedSkeletonRequiredValue >::value &&AccFlag< TwoSidedSkeletonRequiredValue >::value),"Some summands require a one-sided skelton, others a ""two-sided skeleton. This is not supported.")
tuple_element< i, Args >::type & getSummand()
get the i'th component of the sum
Definition: sum.hh:59
RealType suggestTimestep(RealType dt) const
to be called after stage 1
Definition: sum.hh:985
void lambda_skeleton(const IG &ig, const LFSV &lfsv_s, const LFSV &lfsv_n, R &r_s, R &r_n) const
get an internal intersections's contribution to lambda
Definition: sum.hh:580
void jacobian_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, LocalMatrix &mat_ss, LocalMatrix &mat_sn, LocalMatrix &mat_ns, LocalMatrix &mat_nn) const
apply an internal intersections's jacobians
Definition: sum.hh:861
A dense matrix for storing data associated with the degrees of freedom of a pair of LocalFunctionSpac...
Definition: common/localmatrix.hh:184
const IG & ig
Definition: common/constraints.hh:146
RealType getTime() const
get current time
Definition: sum.hh:944
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
get a boundary intersections's contribution to alpha
Definition: sum.hh:472
void setTime(RealType t)
set time for subsequent evaluation
Definition: sum.hh:938
void jacobian_apply_volume_post_skeleton(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, Y &y) const
apply an element's jacobian after the intersections have been handled
Definition: sum.hh:701
void jacobian_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, LocalMatrix &mat_ss) const
get a boundary intersections's jacobian
Definition: sum.hh:882
static const unsigned int value
Definition: gridfunctionspace/tags.hh:175
void jacobian_apply_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, Y &y) const
apply an element's jacobian
Definition: sum.hh:684
void alpha_volume_post_skeleton(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
get an element's contribution to alpha after the intersections have been handled
Definition: sum.hh:436
void alpha_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, R &r_s, R &r_n) const
get an internal intersections's contribution to alpha
Definition: sum.hh:452
InstationarySumLocalOperator(const ArgRefs &lops_)
construct a InstationarySumLocalOperator from a tuple of local operators
Definition: sum.hh:48
void pattern_skeleton(const LFSU &lfsu_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const LFSV &lfsv_n, LocalPattern &pattern_sn, LocalPattern &pattern_ns) const
get an internal intersection's contribution to the sparsity pattern
Definition: sum.hh:312
void setSummand(typename tuple_element< i, Args >::type &summand)
set the i'th component of the sum
Definition: sum.hh:54
const EG & eg
Definition: common/constraints.hh:277
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, LocalMatrix &mat) const
get an element's jacobian
Definition: sum.hh:829
void jacobian_apply_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, Y &y_s, Y &y_n) const
apply an internal intersections's jacobians
Definition: sum.hh:717
tuple_element< 0, Args >::type::RealType RealType
Export type used for time values.
Definition: sum.hh:899
void preStep(RealType time, RealType dt, int stages)
to be called once before each time step
Definition: sum.hh:950
void postStage()
to be called once at the end of each stage
Definition: sum.hh:974
void pattern_boundary(const LFSU &lfsu_s, const LFSV &lfsv_s, LocalPattern &pattern_ss) const
get a boundary intersection's contribution to the sparsity pattern
Definition: sum.hh:330
void pattern_volume_post_skeleton(const LFSU &lfsu, const LFSV &lfsv, LocalPattern &pattern) const
get an element's contribution to the sparsity pattern after the intersections have been handled ...
Definition: sum.hh:297
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
get an element's contribution to alpha
Definition: sum.hh:419