DUNE PDELab (2.7)

jacobianapplyengine.hh
1#ifndef DUNE_PDELAB_GRIDOPERATOR_DEFAULT_JACOBIANAPPLYENGINE_HH
2#define DUNE_PDELAB_GRIDOPERATOR_DEFAULT_JACOBIANAPPLYENGINE_HH
3
5#include <dune/pdelab/gridoperator/common/assemblerutilities.hh>
6#include <dune/pdelab/gridoperator/common/localassemblerenginebase.hh>
7#include <dune/pdelab/constraints/common/constraints.hh>
8#include <dune/pdelab/localoperator/callswitch.hh>
9
10namespace Dune{
11 namespace PDELab{
12
20 template<typename LA>
23 {
24 public:
25
26 template<typename TrialConstraintsContainer, typename TestConstraintsContainer>
27 bool needsConstraintsCaching(const TrialConstraintsContainer& cu, const TestConstraintsContainer& cv) const
28 {
29 return false;
30 }
31
33 typedef LA LocalAssembler;
34
36 typedef typename LA::LocalOperator LOP;
37
39 static constexpr bool isLinear = LOP::isLinear;
40
42 typedef typename LA::Traits::Range Range;
43 typedef typename Range::ElementType RangeElement;
44
46 typedef typename LA::Traits::Domain Domain;
47 typedef typename Domain::ElementType DomainElement;
48
50 typedef typename LA::LFSU LFSU;
51 typedef typename LA::LFSUCache LFSUCache;
52 typedef typename LFSU::Traits::GridFunctionSpace GFSU;
53 typedef typename LA::LFSV LFSV;
54 typedef typename LA::LFSVCache LFSVCache;
55 typedef typename LFSV::Traits::GridFunctionSpace GFSV;
56
57 typedef typename Domain::template ConstLocalView<LFSUCache> DomainView;
58 typedef typename Range::template LocalView<LFSVCache> RangeView;
59
67 : local_assembler(local_assembler_),
68 lop(local_assembler_.localOperator()),
69 result_view_inside(local_result_inside,1.0),
70 result_view_outside(local_result_outside,1.0)
71 {}
72
75 bool requireSkeleton() const
76 { return local_assembler.doAlphaSkeleton(); }
77 bool requireSkeletonTwoSided() const
78 { return local_assembler.doSkeletonTwoSided(); }
79 bool requireUVVolume() const
80 { return local_assembler.doAlphaVolume(); }
81 bool requireUVSkeleton() const
82 { return local_assembler.doAlphaSkeleton(); }
83 bool requireUVBoundary() const
84 { return local_assembler.doAlphaBoundary(); }
85 bool requireUVVolumePostSkeleton() const
86 { return local_assembler.doAlphaVolumePostSkeleton(); }
88
91 {
92 return local_assembler;
93 }
94
96 const typename LocalAssembler::Traits::TrialGridFunctionSpaceConstraints& trialConstraints() const
97 {
98 return localAssembler().trialConstraints();
99 }
100
102 const typename LocalAssembler::Traits::TestGridFunctionSpaceConstraints& testConstraints() const
103 {
104 return localAssembler().testConstraints();
105 }
106
109 void setSolution(const Domain & solution_)
110 {
111 global_solution_view_inside.attach(solution_);
112 global_solution_view_outside.attach(solution_);
113 }
114
117 void setUpdate(const Domain & update_)
118 {
119 global_update_view_inside.attach(update_);
120 global_update_view_outside.attach(update_);
121 }
122
125 void setResult(Range & result_)
126 {
127 global_result_view_inside.attach(result_);
128 global_result_view_outside.attach(result_);
129 }
130
134 template<typename EG, typename LFSUC, typename LFSVC>
135 void onBindLFSUV(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
136 {
137 global_solution_view_inside.bind(lfsu_cache);
138 // In the linear case the solution is not needed and we drop this part
139 if (not isLinear)
140 local_solution_inside.resize(lfsu_cache.size());
141 global_update_view_inside.bind(lfsu_cache);
142 local_update_inside.resize(lfsu_cache.size());
143 }
144
145 template<typename EG, typename LFSVC>
146 void onBindLFSV(const EG & eg, const LFSVC & lfsv_cache)
147 {
148 global_result_view_inside.bind(lfsv_cache);
149 local_result_inside.assign(lfsv_cache.size(),0.0);
150 }
151
152 template<typename IG, typename LFSUC, typename LFSVC>
153 void onBindLFSUVInside(const IG & ig, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
154 {
155 global_solution_view_inside.bind(lfsu_cache);
156 // In the linear case the solution is not needed and we drop this part
157 if (not isLinear)
158 local_solution_inside.resize(lfsu_cache.size());
159 global_update_view_inside.bind(lfsu_cache);
160 local_update_inside.resize(lfsu_cache.size());
161 }
162
163 template<typename IG, typename LFSUC, typename LFSVC>
164 void onBindLFSUVOutside(const IG & ig,
165 const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
166 const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache)
167 {
168 global_solution_view_outside.bind(lfsu_n_cache);
169 // In the linear case the solution is not needed and we drop this part
170 if (not isLinear)
171 local_solution_outside.resize(lfsu_n_cache.size());
172 global_update_view_outside.bind(lfsu_n_cache);
173 local_update_outside.resize(lfsu_n_cache.size());
174 }
175
176 template<typename IG, typename LFSVC>
177 void onBindLFSVInside(const IG & ig, const LFSVC & lfsv_cache)
178 {
179 global_result_view_inside.bind(lfsv_cache);
180 local_result_inside.assign(lfsv_cache.size(),0.0);
181 }
182
183 template<typename IG, typename LFSVC>
184 void onBindLFSVOutside(const IG & ig,
185 const LFSVC & lfsv_s_cache,
186 const LFSVC & lfsv_n_cache)
187 {
188 global_result_view_outside.bind(lfsv_n_cache);
189 local_result_outside.assign(lfsv_n_cache.size(),0.0);
190 }
191
193
197 template<typename EG, typename LFSVC>
198 void onUnbindLFSV(const EG & eg, const LFSVC & lfsv_cache)
199 {
200 global_result_view_inside.add(local_result_inside);
201 global_result_view_inside.commit();
202 }
203
204 template<typename IG, typename LFSVC>
205 void onUnbindLFSVInside(const IG & ig, const LFSVC & lfsv_cache)
206 {
207 global_result_view_inside.add(local_result_inside);
208 global_result_view_inside.commit();
209 }
210
211 template<typename IG, typename LFSVC>
212 void onUnbindLFSVOutside(const IG & ig,
213 const LFSVC & lfsv_s_cache,
214 const LFSVC & lfsv_n_cache)
215 {
216 global_result_view_outside.add(local_result_outside);
217 global_result_view_outside.commit();
218 }
220
223 template<typename LFSUC>
224 void loadCoefficientsLFSUInside(const LFSUC & lfsu_s_cache)
225 {
226 // In the linear case the solution is not needed and we drop this part
227 if (not isLinear)
228 global_solution_view_inside.read(local_solution_inside);
229 global_update_view_inside.read(local_update_inside);
230 }
231 template<typename LFSUC>
232 void loadCoefficientsLFSUOutside(const LFSUC & lfsu_n_cache)
233 {
234 // In the linear case the solution is not needed and we drop this part
235 if (not isLinear)
236 global_solution_view_outside.read(local_solution_outside);
237 global_update_view_outside.read(local_update_outside);
238 }
239 template<typename LFSUC>
240 void loadCoefficientsLFSUCoupling(const LFSUC & lfsu_c_cache)
241 {
242 DUNE_THROW(Dune::NotImplemented,"No coupling lfsu available for ");
243 }
245
248
249 void postAssembly(const GFSU& gfsu, const GFSV& gfsv)
250 {
251 if(local_assembler.doPostProcessing())
252 Dune::PDELab::constrain_residual(local_assembler.testConstraints(),
253 global_result_view_inside.container());
254 }
255
257
260
267 template<typename EG>
268 bool assembleCell(const EG & eg)
269 {
270 return LocalAssembler::isNonOverlapping && eg.entity().partitionType() != Dune::InteriorEntity;
271 }
272
273 template<typename EG, typename LFSUC, typename LFSVC>
274 void assembleUVVolume(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
275 {
276 result_view_inside.setWeight(local_assembler.weight());
277 Dune::PDELab::LocalAssemblerCallSwitch<LOP,LOP::doAlphaVolume>::
278 jacobian_apply_volume(lop,eg,lfsu_cache.localFunctionSpace(),local_solution_inside,local_update_inside,lfsv_cache.localFunctionSpace(),result_view_inside);
279 }
280
281 template<typename IG, typename LFSUC, typename LFSVC>
282 void assembleUVSkeleton(const IG & ig, const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
283 const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache)
284 {
285 result_view_inside.setWeight(local_assembler.weight());
286 result_view_outside.setWeight(local_assembler.weight());
287 Dune::PDELab::LocalAssemblerCallSwitch<LOP,LOP::doAlphaSkeleton>::
288 jacobian_apply_skeleton(lop,ig,
289 lfsu_s_cache.localFunctionSpace(),local_solution_inside,local_update_inside,lfsv_s_cache.localFunctionSpace(),
290 lfsu_n_cache.localFunctionSpace(),local_solution_outside,local_update_outside,lfsv_n_cache.localFunctionSpace(),
291 result_view_inside,result_view_outside);
292 }
293
294 template<typename IG, typename LFSUC, typename LFSVC>
295 void assembleUVBoundary(const IG & ig, const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache)
296 {
297 result_view_inside.setWeight(local_assembler.weight());
298 Dune::PDELab::LocalAssemblerCallSwitch<LOP,LOP::doAlphaBoundary>::
299 jacobian_apply_boundary(lop,ig,lfsu_s_cache.localFunctionSpace(),local_solution_inside,local_update_inside,lfsv_s_cache.localFunctionSpace(),result_view_inside);
300 }
301
302 template<typename IG, typename LFSUC, typename LFSVC>
303 static void assembleUVEnrichedCoupling(const IG & ig,
304 const LFSUC & lfsu_s_cache, const LFSVC & lfsv_s_cache,
305 const LFSUC & lfsu_n_cache, const LFSVC & lfsv_n_cache,
306 const LFSUC & lfsu_coupling_cache, const LFSVC & lfsv_coupling_cache)
307 {
308 DUNE_THROW(Dune::NotImplemented,"Assembling of coupling spaces is not implemented for ");
309 }
310
311 template<typename EG, typename LFSUC, typename LFSVC>
312 void assembleUVVolumePostSkeleton(const EG & eg, const LFSUC & lfsu_cache, const LFSVC & lfsv_cache)
313 {
314 result_view_inside.setWeight(local_assembler.weight());
315 Dune::PDELab::LocalAssemblerCallSwitch<LOP,LOP::doAlphaVolumePostSkeleton>::
316 jacobian_apply_volume_post_skeleton(lop,eg,lfsu_cache.localFunctionSpace(),local_solution_inside,local_update_inside,lfsv_cache.localFunctionSpace(),result_view_inside);
317 }
318
320
321 private:
324 const LocalAssembler & local_assembler;
325
327 const LOP & lop;
328
330 DomainView global_solution_view_inside;
331 DomainView global_solution_view_outside;
332
334 DomainView global_update_view_inside;
335 DomainView global_update_view_outside;
336
338 RangeView global_result_view_inside;
339 RangeView global_result_view_outside;
340
343 typedef Dune::PDELab::TrialSpaceTag LocalTrialSpaceTag;
344 typedef Dune::PDELab::TestSpaceTag LocalTestSpaceTag;
345
348
350 DomainVector local_solution_inside;
352 DomainVector local_solution_outside;
354 DomainVector local_update_inside;
356 DomainVector local_update_outside;
358 RangeVector local_result_inside;
360 RangeVector local_result_outside;
362 typename RangeVector::WeightedAccumulationView result_view_inside;
364 typename RangeVector::WeightedAccumulationView result_view_outside;
366
367 }; // End of class DefaultLocalJacobianAssemblerEngine
368
369 }
370}
371#endif // DUNE_PDELAB_GRIDOPERATOR_DEFAULT_JACOBIANAPPLYENGINE_HH
Default exception for dummy implementations.
Definition: exceptions.hh:261
The local assembler engine for DUNE grids which assembles the local application of the Jacobian.
Definition: jacobianapplyengine.hh:23
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: jacobianapplyengine.hh:249
bool requireSkeleton() const
Definition: jacobianapplyengine.hh:75
const LocalAssembler::Traits::TrialGridFunctionSpaceConstraints & trialConstraints() const
Trial space constraints.
Definition: jacobianapplyengine.hh:96
DefaultLocalJacobianApplyAssemblerEngine(const LocalAssembler &local_assembler_)
Constructor.
Definition: jacobianapplyengine.hh:66
void setUpdate(const Domain &update_)
Definition: jacobianapplyengine.hh:117
void setResult(Range &result_)
Definition: jacobianapplyengine.hh:125
void loadCoefficientsLFSUInside(const LFSUC &lfsu_s_cache)
Definition: jacobianapplyengine.hh:224
LA::LFSU LFSU
The local function spaces.
Definition: jacobianapplyengine.hh:50
LA::Traits::Range Range
The type of the result vector.
Definition: jacobianapplyengine.hh:42
void onBindLFSUV(const EG &eg, const LFSUC &lfsu_cache, const LFSVC &lfsv_cache)
Definition: jacobianapplyengine.hh:135
void onUnbindLFSV(const EG &eg, const LFSVC &lfsv_cache)
Definition: jacobianapplyengine.hh:198
bool assembleCell(const EG &eg)
Definition: jacobianapplyengine.hh:268
const LocalAssembler::Traits::TestGridFunctionSpaceConstraints & testConstraints() const
Test space constraints.
Definition: jacobianapplyengine.hh:102
LA LocalAssembler
The type of the wrapping local assembler.
Definition: jacobianapplyengine.hh:33
LA::LocalOperator LOP
The type of the local operator.
Definition: jacobianapplyengine.hh:36
static constexpr bool isLinear
Wheter the local operator is linear.
Definition: jacobianapplyengine.hh:39
const LocalAssembler & localAssembler() const
Public access to the wrapping local assembler.
Definition: jacobianapplyengine.hh:90
LA::Traits::Domain Domain
The type of the solution vector.
Definition: jacobianapplyengine.hh:46
void setSolution(const Domain &solution_)
Definition: jacobianapplyengine.hh:109
Base class for LocalAssemblerEngine implementations to avoid boilerplate code.
Definition: localassemblerenginebase.hh:22
void assign(size_type size, const T &value)
Resize the container to size and assign the passed value to all entries.
Definition: localvector.hh:329
WeightedVectorAccumulationView< LocalVector > WeightedAccumulationView
An accumulate-only view of this container that automatically applies a weight to all contributions.
Definition: localvector.hh:211
void resize(size_type size)
Resize the container.
Definition: localvector.hh:323
void setWeight(weight_type weight)
Resets the weighting coefficient of the view.
Definition: localvector.hh:72
#define DUNE_THROW(E, m)
Definition: exceptions.hh:216
@ InteriorEntity
all interior entities
Definition: gridenums.hh:29
void constrain_residual(const CG &cg, XG &xg)
transform residual into transformed basis: r -> r~
Definition: constraints.hh:904
Dune namespace.
Definition: alignedallocator.hh:14
Definition: localfunctionspacetags.hh:54
Definition: localfunctionspacetags.hh:48
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.111.3 (Jul 15, 22:36, 2024)