dune-composites (2.5.1)

localoperator_ovlp_region.hh
1#ifndef LOP_OVLP_REGION_HH
2#define LOP_OVLP_REGION_HH
3
4namespace Dune {
5 namespace PDELab {
6
7 template<typename LocalOperatorBase, typename GFS>
8 class LocalOperatorOvlpRegion {
9
10 typedef Dune::PDELab::Backend::Vector<GFS,int> V;
11
12 public:
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);
17 }
18
19 // pattern assembly flags
20 enum { doPatternVolume = LocalOperatorBase::doPatternVolume };
21 enum { doPatternSkeleton = LocalOperatorBase::doPatternSkeleton };
22 enum { doPatternVolumePostSkeleton = LocalOperatorBase::doPatternVolumePostSkeleton };
23 enum { doPatternBoundary = LocalOperatorBase::doPatternBoundary };
24
25 // residual assembly flags
26 enum { doAlphaVolume = true };
27 enum { doAlphaVolumePostSkeleton = LocalOperatorBase::doAlphaVolumePostSkeleton };
28 //enum { doAlphaPostSkeletonVolume = LocalOperatorBase::doAlphaPostSkeletonVolume };
29 enum { doAlphaBoundary = true };
30
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 };
36
37 template<typename LFSU, typename LFSV, typename LocalPattern>
38 void pattern_volume (const LFSU& lfsu, const LFSV& lfsv, LocalPattern& pattern) const
39 {
40 if (entity_is_interior(lfsu))
41 return;
42 baseop.pattern_volume(lfsu, lfsv, pattern);
43 }
44
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
47 {
48 if (entity_is_interior(lfsu_s))
49 return;
50 baseop.pattern_skeleton(lfsu_s, lfsv_s, lfsu_n, lfsv_n, pattern_sn, pattern_ns);
51 }
52
53 template<typename LFSU, typename LFSV, typename LocalPattern>
54 void pattern_volume_post_skeleton (const LFSU& lfsu, const LFSV& lfsv, LocalPattern& pattern) const
55 {
56 if (entity_is_interior(lfsu))
57 return;
58 baseop.pattern_volume(lfsu, lfsv, pattern);
59 }
60
61 template<typename LFSU, typename LFSV, typename LocalPattern>
62 void pattern_boundary (const LFSU& lfsu_s, const LFSV& lfsv_s, LocalPattern& pattern_ss) const
63 {
64 if (entity_is_interior(lfsu_s))
65 return;
66 baseop.pattern_boundary (lfsu_s, lfsv_s, pattern_ss);
67 }
68
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
71 {
72 if (entity_is_interior(lfsu))
73 return;
74 baseop.alpha_volume(eg, lfsu, x, lfsv, r);
75 }
76
77 // jacobian of volume term
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
80 {
81 if (entity_is_interior(lfsu))
82 return;
83 baseop.jacobian_volume (eg, lfsu, x, lfsv, mat);
84 }
85
86 // volume integral depending only on test functions
87 template<typename EG, typename LFSV, typename R>
88 void lambda_volume (const EG& eg, const LFSV& lfsv, R& r) const
89 {
90 if (entity_is_interior(lfsv))
91 return;
92 baseop.lambda_volume (eg, lfsv, r);
93 }
94
95 // post skeleton: compute time step allowable for cell; to be done later
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
99 {
100 if (entity_is_interior(lfsu))
101 return;
102 baseop.alpha_volume_post_skeleton (eg, lfsu, x, lfsv, r);
103 }
104
105 // boundary integral
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,
109 R& r_s) const
110 {
111 if (entity_is_interior(lfsu_s))
112 return;
113 baseop.alpha_boundary (ig, lfsu_s, x_s, lfsv_s, r_s);
114 }
115
116 // jacobian contribution from boundary
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,
120 M& mat_s) const
121 {
122 if (entity_is_interior(lfsu_s))
123 return;
124 baseop.jacobian_boundary (ig, lfsu_s, x_s, lfsv_s, mat_s);
125 }
126
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
132 {
133 if (entity_is_interior(lfsu_s))
134 return;
135 baseop.alpha_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, r_s, r_n);
136 }
137
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
144 {
145 if (entity_is_interior(lfsu_s))
146 return;
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);
148 }
149
150
151 void setTime (double t)
152 {
153 baseop.setTime(t);
154 }
155
156 private:
157
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)
165 return true;
166 }
167 return false;
168 }
169
170 LocalOperatorBase& baseop;
171 V subdomain_sum;
172 };
173
174 }
175}
176#endif
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Sep 5, 22:35, 2025)