DUNE PDELab (2.7)

localoperator_ovlp_region.hh
1#ifndef DUNE_PDELAB_BACKEND_ISTL_GENEO_LOCALOPERATOR_OVLP_REGION_HH
2#define DUNE_PDELAB_BACKEND_ISTL_GENEO_LOCALOPERATOR_OVLP_REGION_HH
3
4#include <dune/pdelab/backend/interface.hh>
5#include <dune/pdelab/gridfunctionspace/lfsindexcache.hh>
6
7namespace Dune {
8 namespace PDELab {
9
17 template<typename LocalOperatorBase, typename GFS>
19
20 typedef Dune::PDELab::Backend::Vector<GFS,int> V;
21
22 public:
23 LocalOperatorOvlpRegion (LocalOperatorBase& base_, const GFS& gfs)
24 : baseop(base_), subdomain_sum(gfs, 1) {
25 // Add ones; any value > 1 then indicates multiple subdomains covering this DOF
26 Dune::PDELab::AddDataHandle<GFS,V> addh(gfs,subdomain_sum);
27 gfs.gridView().communicate(addh,Dune::All_All_Interface,Dune::ForwardCommunication);
28 }
29
30 // pattern assembly flags
31 enum { doPatternVolume = LocalOperatorBase::doPatternVolume };
32 enum { doPatternSkeleton = LocalOperatorBase::doPatternSkeleton };
33 enum { doPatternVolumePostSkeleton = LocalOperatorBase::doPatternVolumePostSkeleton };
34 enum { doPatternBoundary = LocalOperatorBase::doPatternBoundary };
35
36 // residual assembly flags
37 enum { doAlphaVolume = true };
38 enum { doAlphaVolumePostSkeleton = LocalOperatorBase::doAlphaVolumePostSkeleton };
39 //enum { doAlphaPostSkeletonVolume = LocalOperatorBase::doAlphaPostSkeletonVolume };
40 enum { doAlphaBoundary = true };
41
42 enum { doAlphaSkeleton = LocalOperatorBase::doAlphaSkeleton };
43 enum { doLambdaVolume = LocalOperatorBase::doLambdaVolume };
44 enum { doLambdaBoundary = LocalOperatorBase::doLambdaBoundary };
45 enum { doLambdaSkeleton = LocalOperatorBase::doLambdaSkeleton };
46
47 enum { doSkeletonTwoSided = LocalOperatorBase::doSkeletonTwoSided };
48 enum { isLinear = LocalOperatorBase::isLinear };
49
50 template<typename LFSU, typename LFSV, typename LocalPattern>
51 void pattern_volume (const LFSU& lfsu, const LFSV& lfsv, LocalPattern& pattern) const
52 {
53 if (entity_is_interior(lfsu))
54 return;
55 baseop.pattern_volume(lfsu, lfsv, pattern);
56 }
57
58 template<typename LFSU, typename LFSV, typename LocalPattern>
59 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
60 {
61 if (entity_is_interior(lfsu_s))
62 return;
63 baseop.pattern_skeleton(lfsu_s, lfsv_s, lfsu_n, lfsv_n, pattern_sn, pattern_ns);
64 }
65
66 template<typename LFSU, typename LFSV, typename LocalPattern>
67 void pattern_volume_post_skeleton (const LFSU& lfsu, const LFSV& lfsv, LocalPattern& pattern) const
68 {
69 if (entity_is_interior(lfsu))
70 return;
71 baseop.pattern_volume(lfsu, lfsv, pattern);
72 }
73
74 template<typename LFSU, typename LFSV, typename LocalPattern>
75 void pattern_boundary (const LFSU& lfsu_s, const LFSV& lfsv_s, LocalPattern& pattern_ss) const
76 {
77 if (entity_is_interior(lfsu_s))
78 return;
79 baseop.pattern_boundary (lfsu_s, lfsv_s, pattern_ss);
80 }
81
82 template<typename EG, typename LFSU, typename X, typename LFSV, typename R>
83 void alpha_volume (const EG& eg, const LFSU& lfsu, const X& x, const LFSV& lfsv, R& r) const
84 {
85 if (entity_is_interior(lfsu))
86 return;
87 baseop.alpha_volume(eg, lfsu, x, lfsv, r);
88 }
89
90 // jacobian of volume term
91 template<typename EG, typename LFSU, typename X, typename LFSV, typename M>
92 void jacobian_volume (const EG& eg, const LFSU& lfsu, const X& x, const LFSV& lfsv, M& mat) const
93 {
94 if (entity_is_interior(lfsu))
95 return;
96 baseop.jacobian_volume (eg, lfsu, x, lfsv, mat);
97 }
98
99 // volume integral depending only on test functions
100 template<typename EG, typename LFSV, typename R>
101 void lambda_volume (const EG& eg, const LFSV& lfsv, R& r) const
102 {
103 if (entity_is_interior(lfsv))
104 return;
105 baseop.lambda_volume (eg, lfsv, r);
106 }
107
108 // post skeleton: compute time step allowable for cell; to be done later
109 template<typename EG, typename LFSU, typename X, typename LFSV, typename R>
110 void alpha_volume_post_skeleton(const EG& eg, const LFSU& lfsu, const X& x,
111 const LFSV& lfsv, R& r) const
112 {
113 if (entity_is_interior(lfsu))
114 return;
115 baseop.alpha_volume_post_skeleton (eg, lfsu, x, lfsv, r);
116 }
117
118 // boundary integral
119 template<typename IG, typename LFSU, typename X, typename LFSV, typename R>
120 void alpha_boundary (const IG& ig,
121 const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
122 R& r_s) const
123 {
124 if (entity_is_interior(lfsu_s))
125 return;
126 baseop.alpha_boundary (ig, lfsu_s, x_s, lfsv_s, r_s);
127 }
128
129 // jacobian contribution from boundary
130 template<typename IG, typename LFSU, typename X, typename LFSV, typename M>
131 void jacobian_boundary (const IG& ig,
132 const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
133 M& mat_s) const
134 {
135 if (entity_is_interior(lfsu_s))
136 return;
137 baseop.jacobian_boundary (ig, lfsu_s, x_s, lfsv_s, mat_s);
138 }
139
140 template<typename IG, typename LFSU, typename X, typename LFSV, typename R>
141 void alpha_skeleton (const IG& ig,
142 const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
143 const LFSU& lfsu_n, const X& x_n, const LFSV& lfsv_n,
144 R& r_s, R& r_n) const
145 {
146 if (entity_is_interior(lfsu_s))
147 return;
148 baseop.alpha_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, r_s, r_n);
149 }
150
151 template<typename IG, typename LFSU, typename X, typename LFSV, typename M>
152 void jacobian_skeleton (const IG& ig,
153 const LFSU& lfsu_s, const X& x_s, const LFSV& lfsv_s,
154 const LFSU& lfsu_n, const X& x_n, const LFSV& lfsv_n,
155 M& mat_ss, M& mat_sn,
156 M& mat_ns, M& mat_nn) const
157 {
158 if (entity_is_interior(lfsu_s))
159 return;
160 baseop.jacobian_skeleton (ig, lfsu_s, x_s, lfsv_s, lfsu_n, x_n, lfsv_n, mat_ss, mat_sn, mat_ns, mat_nn);
161 }
162
163
164 void setTime (double t)
165 {
166 baseop.setTime(t);
167 }
168
169 private:
170
171 template <typename LFS>
172 bool entity_is_interior (const LFS& lfs) const {
173 LFSIndexCache<LFS> cache(lfs);
174 cache.update();
175 for (std::size_t i = 0; i < cache.size(); i++)
176 {
177 if (subdomain_sum[cache.containerIndex(i)] < 2)
178 return true;
179 }
180 return false;
181 }
182
183 LocalOperatorBase& baseop;
184 V subdomain_sum;
185 };
186
187 }
188}
189
190#endif //DUNE_PDELAB_BACKEND_ISTL_GENEO_LOCALOPERATOR_OVLP_REGION_HH
Wrapper for LocalOperators restricting their action to areas overlapping with other subdomains Any en...
Definition: localoperator_ovlp_region.hh:18
@ ForwardCommunication
communicate as given in InterfaceType
Definition: gridenums.hh:169
@ All_All_Interface
send all and receive all entities
Definition: gridenums.hh:89
Dune namespace.
Definition: alignedallocator.hh:14
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)