1#ifndef LOP_OVLP_REGION_HH
2#define LOP_OVLP_REGION_HH
7 template<
typename LocalOperatorBase,
typename GFS>
8 class LocalOperatorOvlpRegion {
10 typedef Dune::PDELab::Backend::Vector<GFS,int> V;
13 LocalOperatorOvlpRegion (LocalOperatorBase& base_,
const GFS& gfs)
14 : baseop(base_), subdomain_sum(gfs, 1) {
15 Dune::PDELab::AddDataHandle<GFS,V> addh(gfs,subdomain_sum);
16 gfs.gridView().communicate(addh,Dune::All_All_Interface,Dune::ForwardCommunication);
20 enum { doPatternVolume = LocalOperatorBase::doPatternVolume };
21 enum { doPatternSkeleton = LocalOperatorBase::doPatternSkeleton };
22 enum { doPatternVolumePostSkeleton = LocalOperatorBase::doPatternVolumePostSkeleton };
23 enum { doPatternBoundary = LocalOperatorBase::doPatternBoundary };
26 enum { doAlphaVolume =
true };
27 enum { doAlphaVolumePostSkeleton = LocalOperatorBase::doAlphaVolumePostSkeleton };
29 enum { doAlphaBoundary =
true };
31 enum { doAlphaSkeleton = LocalOperatorBase::doAlphaSkeleton };
32 enum { doLambdaVolume = LocalOperatorBase::doLambdaVolume };
33 enum { doLambdaBoundary = LocalOperatorBase::doLambdaBoundary };
34 enum { doLambdaSkeleton = LocalOperatorBase::doLambdaSkeleton };
35 enum { doSkeletonTwoSided = LocalOperatorBase::doSkeletonTwoSided };
37 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
38 void pattern_volume (
const LFSU& lfsu,
const LFSV& lfsv, LocalPattern& pattern)
const
40 if (entity_is_interior(lfsu))
42 baseop.pattern_volume(lfsu, lfsv, pattern);
45 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
46 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
48 if (entity_is_interior(lfsu_s))
50 baseop.pattern_skeleton(lfsu_s, lfsv_s, lfsu_n, lfsv_n, pattern_sn, pattern_ns);
53 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
54 void pattern_volume_post_skeleton (
const LFSU& lfsu,
const LFSV& lfsv, LocalPattern& pattern)
const
56 if (entity_is_interior(lfsu))
58 baseop.pattern_volume(lfsu, lfsv, pattern);
61 template<
typename LFSU,
typename LFSV,
typename LocalPattern>
62 void pattern_boundary (
const LFSU& lfsu_s,
const LFSV& lfsv_s, LocalPattern& pattern_ss)
const
64 if (entity_is_interior(lfsu_s))
66 baseop.pattern_boundary (lfsu_s, lfsv_s, pattern_ss);
69 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
70 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const
72 if (entity_is_interior(lfsu))
74 baseop.alpha_volume(eg, lfsu, x, lfsv, r);
78 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
79 void jacobian_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, M& mat)
const
81 if (entity_is_interior(lfsu))
83 baseop.jacobian_volume (eg, lfsu, x, lfsv, mat);
87 template<
typename EG,
typename LFSV,
typename R>
88 void lambda_volume (
const EG& eg,
const LFSV& lfsv, R& r)
const
90 if (entity_is_interior(lfsv))
92 baseop.lambda_volume (eg, lfsv, r);
96 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
97 void alpha_volume_post_skeleton(
const EG& eg,
const LFSU& lfsu,
const X& x,
98 const LFSV& lfsv, R& r)
const
100 if (entity_is_interior(lfsu))
102 baseop.alpha_volume_post_skeleton (eg, lfsu, x, lfsv, r);
106 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
107 void alpha_boundary (
const IG& ig,
108 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
111 if (entity_is_interior(lfsu_s))
113 baseop.alpha_boundary (ig, lfsu_s, x_s, lfsv_s, r_s);
117 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
118 void jacobian_boundary (
const IG& ig,
119 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
122 if (entity_is_interior(lfsu_s))
124 baseop.jacobian_boundary (ig, lfsu_s, x_s, lfsv_s, mat_s);
127 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
128 void alpha_skeleton (
const IG& ig,
129 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
130 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
131 R& r_s, R& r_n)
const
133 if (entity_is_interior(lfsu_s))
135 baseop.alpha_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, r_s, r_n);
138 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
139 void jacobian_skeleton (
const IG& ig,
140 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
141 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
142 M& mat_ss, M& mat_sn,
143 M& mat_ns, M& mat_nn)
const
145 if (entity_is_interior(lfsu_s))
147 baseop.jacobian_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, mat_ss, mat_sn, mat_ns, mat_nn);
151 void setTime (
double t)
158 template <
typename LFS>
159 bool entity_is_interior (
const LFS& lfs)
const {
160 using Dune::PDELab::Backend::native;
161 for (
unsigned int i = 0; i < lfs.size(); i++) {
162 auto dofindex = lfs.dofIndex(i);
163 auto element_index = subdomain_sum.gridFunctionSpace().ordering().mapIndex(dofindex);
164 if (native(subdomain_sum)[element_index.back()][0] < 2)
170 LocalOperatorBase& baseop;