1 #ifndef DUNE_PDELAB_ONESTEP_JACOBIANRESIDUALENGINE_HH
2 #define DUNE_PDELAB_ONESTEP_JACOBIANRESIDUALENGINE_HH
18 template<
typename OSLA>
26 template<
typename TrialConstra
intsContainer,
typename TestConstra
intsContainer>
29 return cu.containsNonDirichletConstraints() || cv.containsNonDirichletConstraints();
33 typedef typename OSLA::Real
Real;
36 typedef typename LocalAssembler::LocalPreStageAssemblerEngine
PreStageEngine;
37 typedef typename LocalAssembler::LocalResidualAssemblerEngine
ResidualEngine;
38 typedef typename LocalAssembler::LocalAssemblerDT1::LocalJacobianAssemblerEngine
JacobianEngine;
48 : la(local_assembler_),
55 prestage_engine = & prestage_engine_;
60 jacobian_engine = & jacobian_engine_;
66 {
return prestage_engine->requireSkeleton() ||
67 jacobian_engine->requireSkeleton(); }
69 {
return prestage_engine->requireSkeletonTwoSided() ||
70 jacobian_engine->requireSkeletonTwoSided(); }
72 {
return prestage_engine->requireUVVolume() ||
73 jacobian_engine->requireUVVolume(); }
75 {
return prestage_engine->requireVVolume() ||
76 jacobian_engine->requireVVolume(); }
78 {
return prestage_engine->requireUVSkeleton() ||
79 jacobian_engine->requireUVSkeleton(); }
81 {
return prestage_engine->requireVSkeleton() ||
82 jacobian_engine->requireVSkeleton(); }
84 {
return prestage_engine->requireUVBoundary() ||
85 jacobian_engine->requireUVBoundary(); }
87 {
return prestage_engine->requireVBoundary() ||
88 jacobian_engine->requireVBoundary(); }
90 {
return prestage_engine->requireUVVolumePostSkeleton() ||
91 jacobian_engine->requireUVVolumePostSkeleton(); }
93 {
return prestage_engine->requireVVolumePostSkeleton() ||
94 jacobian_engine->requireVVolumePostSkeleton(); }
104 template<
typename EG,
typename LFSU,
typename LFSV>
106 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
107 prestage_engine->onBindLFSUV(eg,lfsu,lfsv);
108 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
109 jacobian_engine->onBindLFSUV(eg,lfsu,lfsv);
112 template<
typename EG,
typename LFSV>
114 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
115 prestage_engine->onBindLFSV(eg,lfsv);
116 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
117 jacobian_engine->onBindLFSV(eg,lfsv);
120 template<
typename IG,
typename LFSU,
typename LFSV>
122 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
123 prestage_engine->onBindLFSUVInside(ig,lfsu,lfsv);
124 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
125 jacobian_engine->onBindLFSUVInside(ig,lfsu,lfsv);
128 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N>
130 const LFSU_S & lfsus,
const LFSV_S & lfsvs,
131 const LFSU_N & lfsun,
const LFSV_N & lfsvn)
133 if (prestage_engine->requireSkeleton())
134 prestage_engine->onBindLFSUVOutside(ig,lfsus,lfsvs,lfsun,lfsvn);
135 if (jacobian_engine->requireSkeleton())
136 jacobian_engine->onBindLFSUVOutside(ig,lfsus,lfsvs,lfsun,lfsvn);
139 template<
typename IG,
typename LFSV>
141 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
142 prestage_engine->onBindLFSVInside(ig,lfsv);
143 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
144 jacobian_engine->onBindLFSVInside(ig,lfsv);
147 template<
typename IG,
typename LFSV_S,
typename LFSV_N>
149 const LFSV_S & lfsvs,
150 const LFSV_N & lfsvn)
152 if (prestage_engine->requireSkeleton())
153 prestage_engine->onBindLFSVOutside(ig,lfsvs,lfsvn);
154 if (jacobian_engine->requireSkeleton())
155 jacobian_engine->onBindLFSVOutside(ig,lfsvs,lfsvn);
163 template<
typename EG,
typename LFSV>
165 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
166 prestage_engine->onUnbindLFSV(eg,lfsv);
167 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
168 jacobian_engine->onUnbindLFSV(eg,lfsv);
171 template<
typename IG,
typename LFSV>
173 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
174 prestage_engine->onUnbindLFSVInside(ig,lfsv);
175 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
176 jacobian_engine->onUnbindLFSVInside(ig,lfsv);
179 template<
typename IG,
typename LFSV_S,
typename LFSV_N>
181 const LFSV_S & lfsvs,
182 const LFSV_N & lfsvn)
184 if (prestage_engine->requireSkeleton())
185 prestage_engine->onUnbindLFSVOutside(ig,lfsvs,lfsvn);
186 if (jacobian_engine->requireSkeleton())
187 jacobian_engine->onUnbindLFSVOutside(ig,lfsvs,lfsvn);
190 template<
typename EG,
typename LFSU,
typename LFSV>
193 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
194 prestage_engine->onUnbindLFSUV(eg,lfsu,lfsv);
195 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
196 jacobian_engine->onUnbindLFSUV(eg,lfsu,lfsv);
199 template<
typename IG,
typename LFSU,
typename LFSV>
202 if (prestage_engine->requireUVVolume() || prestage_engine->requireVVolume())
203 prestage_engine->onUnbindLFSUVInside(ig,lfsu,lfsv);
204 if (jacobian_engine->requireUVVolume() || jacobian_engine->requireVVolume())
205 jacobian_engine->onUnbindLFSUVInside(ig,lfsu,lfsv);
208 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N>
210 const LFSU_S& lfsu_s,
const LFSV_S& lfsv_s,
211 const LFSU_N& lfsu_n,
const LFSV_N& lfsv_n)
213 if (prestage_engine->requireSkeleton())
214 prestage_engine->onUnbindLFSUVOutside(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
215 if (jacobian_engine->requireSkeleton())
216 jacobian_engine->onUnbindLFSUVOutside(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
224 template<
typename LFSU>
226 if (prestage_engine->requireUVVolume())
227 prestage_engine->loadCoefficientsLFSUInside(lfsu_s);
228 if (jacobian_engine->requireUVVolume())
229 jacobian_engine->loadCoefficientsLFSUInside(lfsu_s);
232 template<
typename LFSU>
234 if (prestage_engine->requireUVSkeleton())
235 prestage_engine->loadCoefficientsLFSUOutside(lfsu_n);
236 if (jacobian_engine->requireUVSkeleton())
237 jacobian_engine->loadCoefficientsLFSUOutside(lfsu_n);
240 template<
typename LFSU>
243 prestage_engine->loadCoefficientsLFSUCoupling(lfsu_c);
244 jacobian_engine->loadCoefficientsLFSUCoupling(lfsu_c);
252 prestage_engine->preAssembly();
253 jacobian_engine->preAssembly();
256 template<
typename GFSU,
typename GFSV>
258 prestage_engine->postAssembly(gfsu,gfsv);
259 jacobian_engine->postAssembly(gfsu,gfsv);
267 template<
typename EG>
270 const bool abort_a = prestage_engine->assembleCell(eg);
271 const bool abort_c = jacobian_engine->assembleCell(eg);
272 return abort_a && abort_c;
275 template<
typename EG,
typename LFSU,
typename LFSV>
278 if (prestage_engine->requireUVVolume())
279 prestage_engine->assembleUVVolume(eg,lfsu,lfsv);
281 prestage_engine->setTimeInLastStage();
282 if (jacobian_engine->requireUVVolume())
283 jacobian_engine->assembleUVVolume(eg,lfsu,lfsv);
286 template<
typename EG,
typename LFSV>
289 if (prestage_engine->requireVVolume())
290 prestage_engine->assembleVVolume(eg,lfsv);
292 prestage_engine->setTimeInLastStage();
293 if (jacobian_engine->requireVVolume())
294 jacobian_engine->assembleVVolume(eg,lfsv);
297 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N>
299 const LFSU_N & lfsu_n,
const LFSV_N & lfsv_n)
301 if (prestage_engine->requireUVSkeleton())
302 prestage_engine->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
304 if (jacobian_engine->requireUVSkeleton())
305 jacobian_engine->assembleUVSkeleton(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n);
308 template<
typename IG,
typename LFSV_S,
typename LFSV_N>
311 if (prestage_engine->requireVSkeleton())
312 prestage_engine->assembleVSkeleton(ig,lfsv_s,lfsv_n);
314 if (jacobian_engine->requireVSkeleton())
315 jacobian_engine->assembleVSkeleton(ig,lfsv_s,lfsv_n);
318 template<
typename IG,
typename LFSU,
typename LFSV>
321 if (prestage_engine->requireUVBoundary())
322 prestage_engine->assembleUVBoundary(ig,lfsu_s,lfsv_s);
324 if (jacobian_engine->requireUVBoundary())
325 jacobian_engine->assembleUVBoundary(ig,lfsu_s,lfsv_s);
328 template<
typename IG,
typename LFSV>
331 if (prestage_engine->requireVBoundary())
332 prestage_engine->assembleVBoundary(ig,lfsv_s);
334 if (jacobian_engine->requireVBoundary())
335 jacobian_engine->assembleVBoundary(ig,lfsv_s);
338 template<
typename IG,
typename LFSU_S,
typename LFSV_S,
typename LFSU_N,
typename LFSV_N,
339 typename LFSU_C,
typename LFSV_C>
341 const LFSU_S & lfsu_s,
const LFSV_S & lfsv_s,
342 const LFSU_N & lfsu_n,
const LFSV_N & lfsv_n,
343 const LFSU_C & lfsu_coupling,
const LFSV_C & lfsv_coupling)
345 prestage_engine->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_coupling,lfsv_coupling);
347 jacobian_engine->assembleUVEnrichedCoupling(ig,lfsu_s,lfsv_s,lfsu_n,lfsv_n,lfsu_coupling,lfsv_coupling);
350 template<
typename IG,
typename LFSV_S,
typename LFSV_N,
typename LFSV_C>
352 const LFSV_S & lfsv_s,
353 const LFSV_N & lfsv_n,
354 const LFSV_C & lfsv_coupling)
356 prestage_engine->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_coupling);
358 jacobian_engine->assembleVEnrichedCoupling(ig,lfsv_s,lfsv_n,lfsv_coupling);
361 template<
typename EG,
typename LFSU,
typename LFSV>
364 if (prestage_engine->requireUVVolumePostSkeleton())
365 prestage_engine->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
367 if (jacobian_engine->requireUVVolumePostSkeleton())
368 jacobian_engine->assembleUVVolumePostSkeleton(eg,lfsu,lfsv);
371 template<
typename EG,
typename LFSV>
374 if (prestage_engine->requireVVolumePostSkeleton())
375 prestage_engine->assembleVVolumePostSkeleton(eg,lfsv);
377 if (jacobian_engine->requireVVolumePostSkeleton())
378 jacobian_engine->assembleVVolumePostSkeleton(eg,lfsv);
void assembleVSkeleton(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n)
Definition: jacobianresidualengine.hh:309
OSLA LocalAssembler
Definition: jacobianresidualengine.hh:35
bool requireSkeletonTwoSided() const
Definition: jacobianresidualengine.hh:68
void onBindLFSUVInside(const IG &ig, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:121
void onUnbindLFSUVInside(const IG &ig, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:200
bool requireUVVolume() const
Definition: jacobianresidualengine.hh:71
void setLocalJacobianEngine(JacobianEngine &jacobian_engine_)
Definition: jacobianresidualengine.hh:58
void assembleUVVolumePostSkeleton(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:362
void onUnbindLFSVOutside(const IG &ig, const LFSV_S &lfsvs, const LFSV_N &lfsvn)
Definition: jacobianresidualengine.hh:180
void assembleUVBoundary(const IG &ig, const LFSU &lfsu_s, const LFSV &lfsv_s)
Definition: jacobianresidualengine.hh:319
void onUnbindLFSUVOutside(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
Definition: jacobianresidualengine.hh:209
OneStepExplicitLocalJacobianResidualAssemblerEngine(LocalAssembler &local_assembler_)
Constructor.
Definition: jacobianresidualengine.hh:47
bool requireUVBoundary() const
Definition: jacobianresidualengine.hh:83
void assembleUVEnrichedCoupling(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n, const LFSU_C &lfsu_coupling, const LFSV_C &lfsv_coupling)
Definition: jacobianresidualengine.hh:340
void preAssembly()
Definition: jacobianresidualengine.hh:251
void onBindLFSUV(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:105
LocalAssembler::LocalPreStageAssemblerEngine PreStageEngine
Definition: jacobianresidualengine.hh:36
The local assembler engine for DUNE grids which assembles the residual vector.
Definition: jacobianresidualengine.hh:19
void assembleVVolume(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:287
bool requireVBoundary() const
Definition: jacobianresidualengine.hh:86
OSLA::Real Real
The type for real numbers.
Definition: jacobianresidualengine.hh:33
void assembleVEnrichedCoupling(const IG &ig, const LFSV_S &lfsv_s, const LFSV_N &lfsv_n, const LFSV_C &lfsv_coupling)
Definition: jacobianresidualengine.hh:351
bool requireUVVolumePostSkeleton() const
Definition: jacobianresidualengine.hh:89
void onUnbindLFSUV(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:191
bool requireSkeleton() const
Definition: jacobianresidualengine.hh:65
void setLocalPreStageEngine(PreStageEngine &prestage_engine_)
Definition: jacobianresidualengine.hh:53
const IG & ig
Definition: common/constraints.hh:146
Base class for LocalAssemblerEngine implementations to avoid boilerplate code.
Definition: localassemblerenginebase.hh:21
bool needsConstraintsCaching(const TrialConstraintsContainer &cu, const TestConstraintsContainer &cv) const
Definition: jacobianresidualengine.hh:27
void assembleVVolumePostSkeleton(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:372
LocalAssembler::LocalAssemblerDT1::LocalJacobianAssemblerEngine JacobianEngine
Definition: jacobianresidualengine.hh:38
bool requireVVolumePostSkeleton() const
Definition: jacobianresidualengine.hh:92
void postAssembly(const GFSU &gfsu, const GFSV &gfsv)
Definition: jacobianresidualengine.hh:257
void assembleUVSkeleton(const IG &ig, const LFSU_S &lfsu_s, const LFSV_S &lfsv_s, const LFSU_N &lfsu_n, const LFSV_N &lfsv_n)
Definition: jacobianresidualengine.hh:298
void onUnbindLFSVInside(const IG &ig, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:172
void onBindLFSVOutside(const IG &ig, const LFSV_S &lfsvs, const LFSV_N &lfsvn)
Definition: jacobianresidualengine.hh:148
void onBindLFSUVOutside(const IG &ig, const LFSU_S &lfsus, const LFSV_S &lfsvs, const LFSU_N &lfsun, const LFSV_N &lfsvn)
Definition: jacobianresidualengine.hh:129
bool requireVSkeleton() const
Definition: jacobianresidualengine.hh:80
void onUnbindLFSV(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:164
LocalAssembler::LocalResidualAssemblerEngine ResidualEngine
Definition: jacobianresidualengine.hh:37
void loadCoefficientsLFSUOutside(const LFSU &lfsu_n)
Definition: jacobianresidualengine.hh:233
const EG & eg
Definition: common/constraints.hh:277
bool assembleCell(const EG &eg)
Definition: jacobianresidualengine.hh:268
void onBindLFSVInside(const IG &ig, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:140
void onBindLFSV(const EG &eg, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:113
void loadCoefficientsLFSUInside(const LFSU &lfsu_s)
Definition: jacobianresidualengine.hh:225
void loadCoefficientsLFSUCoupling(const LFSU &lfsu_c)
Definition: jacobianresidualengine.hh:241
bool requireUVSkeleton() const
Definition: jacobianresidualengine.hh:77
OSLA OneStepLocalAssembler
The type of the wrapping local assembler.
Definition: jacobianresidualengine.hh:24
void assembleVBoundary(const IG &ig, const LFSV &lfsv_s)
Definition: jacobianresidualengine.hh:329
bool requireVVolume() const
Definition: jacobianresidualengine.hh:74
void assembleUVVolume(const EG &eg, const LFSU &lfsu, const LFSV &lfsv)
Definition: jacobianresidualengine.hh:276
const LocalAssembler & localAssembler() const
Public access to the wrapping local assembler.
Definition: jacobianresidualengine.hh:99