1#ifndef __DUNE_ACFEM_MODELOPERATIONS_HH__
2#define __DUNE_ACFEM_MODELOPERATIONS_HH__
4#include "../expressions/expressionoperations.hh"
12 template<
class Operation>
13 struct ModelExpressionOperation
16 template<
class Operation>
17 struct UnaryModelExpressionOperation
18 :
public ModelExpressionOperation<Operation>
21 template<
class Operation>
22 struct BinaryModelExpressionOperation
23 :
public ModelExpressionOperation<Operation>
31 struct BinaryModelExpressionOperation<PlusOperation>
32 :
public ModelExpressionOperation<PlusOperation>
35 template<
class LeftModel,
class RightModel,
36 class PointType,
class RangeType,
class JacobianRangeType,
38 static void flux(
const LeftModel& f,
const RightModel& g,
39 const Entity &entity,
const PointType& x,
40 const RangeType &value,
const JacobianRangeType& jacobian,
41 JacobianRangeType& ret)
43 JacobianRangeType tmp;
45 f.flux(entity, x, value, jacobian, ret);
46 if (ModelConstituents<RightModel>::hasFlux) {
47 g.flux(entity, x, value, jacobian, tmp);
53 template<
class LeftModel,
class RightModel,
54 class PointType,
class RangeType,
class JacobianRangeType,
56 static void linearizedFlux (
const LeftModel& f,
const RightModel& g,
57 const RangeType& uBar,
const JacobianRangeType& DuBar,
58 const Entity &entity,
const PointType& x,
59 const RangeType &value,
const JacobianRangeType& jacobian,
60 JacobianRangeType& ret)
62 JacobianRangeType tmp;
64 f.linearizedFlux(uBar, DuBar, entity, x, value, jacobian, ret);
65 if (ModelConstituents<RightModel>::hasFlux) {
66 g.linearizedFlux(uBar, DuBar, entity, x, value, jacobian, tmp);
72 template<
class LeftModel,
class RightModel,
73 class PointType,
class RangeType,
class JacobianRangeType,
class Entity>
74 static void source(
const LeftModel& f,
const RightModel& g,
75 const Entity &entity,
const PointType& x,
76 const RangeType& value,
const JacobianRangeType& jacobian,
81 f.source(entity, x, value, jacobian, ret);
82 if (ModelConstituents<RightModel>::hasSources) {
83 g.source(entity, x, value, jacobian, tmp);
89 template<
class LeftModel,
class RightModel,
90 class PointType,
class RangeType,
class JacobianRangeType,
92 static void linearizedSource(
const LeftModel& f,
const RightModel& g,
93 const RangeType& uBar,
const JacobianRangeType& DuBar,
94 const Entity &entity,
const PointType& x,
95 const RangeType& value,
const JacobianRangeType& jacobian,
100 f.linearizedSource(uBar, DuBar, entity, x, value, jacobian, ret);
101 if (ModelConstituents<RightModel>::hasSources) {
102 g.linearizedSource(uBar, DuBar, entity, x, value, jacobian, tmp);
108 template<
class LeftModel,
class RightModel,
109 class PointType,
class RangeType,
class JacobianRangeType,
class HessianRangeType,
111 static void fluxDivergence(
const LeftModel& f,
const RightModel& g,
112 const Entity &entity,
const PointType& x,
113 const RangeType& value,
const JacobianRangeType& jacobian,
114 const HessianRangeType& hessian,
119 f.fluxDivergence(entity, x, value, jacobian, hessian, ret);
120 if (ModelConstituents<RightModel>::hasFlux) {
121 g.fluxDivergence(entity, x, value, jacobian, hessian, tmp);
127 template<
class LeftModel,
class RightModel,
128 class Intersection,
class Point,
129 class DomainType,
class RangeType>
130 static void robinFlux(
const LeftModel& lm,
const RightModel& rm,
131 const Intersection& intersection,
133 const DomainType& unitOuterNormal,
134 const RangeType& value,
139 lm.robinFlux(intersection, x, unitOuterNormal, value, result);
140 if (ModelConstituents<RightModel>::hasRobinBoundary) {
141 rm.robinFlux(intersection, x, unitOuterNormal, value, tmp);
147 template<
class LeftModel,
class RightModel,
148 class Intersection,
class Point,
149 class DomainType,
class RangeType>
150 static void linearizedRobinFlux(
const LeftModel& lm,
151 const RightModel& rm,
152 const RangeType& uBar,
153 const Intersection& intersection,
155 const DomainType& unitOuterNormal,
156 const RangeType& value,
161 lm.linearizedRobinFlux(uBar, intersection, x, unitOuterNormal, value, result);
162 if (ModelConstituents<RightModel>::hasRobinBoundary) {
163 rm.linearizedRobinFlux(uBar, intersection, x, unitOuterNormal, value, tmp);
175 struct BinaryModelExpressionOperation<MinusOperation>
176 :
public ModelExpressionOperation<MinusOperation>
179 template<
class LeftModel,
class RightModel,
180 class PointType,
class RangeType,
class JacobianRangeType,
182 static void flux(
const LeftModel& f,
const RightModel& g,
183 const Entity &entity,
const PointType& x,
184 const RangeType& value,
const JacobianRangeType& jacobian,
185 JacobianRangeType& ret)
187 JacobianRangeType tmp;
189 f.flux(entity, x, value, jacobian, ret);
190 if (ModelConstituents<RightModel>::hasFlux) {
191 g.flux(entity, x, value, jacobian, tmp);
197 template<
class LeftModel,
class RightModel,
198 class PointType,
class RangeType,
class JacobianRangeType,
200 static void linearizedFlux(
const LeftModel& f,
const RightModel& g,
201 const RangeType& uBar,
const JacobianRangeType& DuBar,
202 const Entity &entity,
const PointType& x,
203 const RangeType &value,
const JacobianRangeType& jacobian,
204 JacobianRangeType& ret)
206 JacobianRangeType tmp;
208 f.linearizedFlux(uBar, DuBar, entity, x, value, jacobian, ret);
209 if (ModelConstituents<RightModel>::hasFlux) {
210 g.linearizedFlux(uBar, DuBar, entity, x, value, jacobian, tmp);
216 template<
class LeftModel,
class RightModel,
217 class PointType,
class RangeType,
class JacobianRangeType,
219 static void source(
const LeftModel& f,
const RightModel& g,
220 const Entity &entity,
const PointType& x,
221 const RangeType& value,
const JacobianRangeType& jacobian,
226 f.source(entity, x, value, jacobian, ret);
227 if (ModelConstituents<RightModel>::hasSources) {
228 g.source(entity, x, value, jacobian, tmp);
234 template<
class LeftModel,
class RightModel,
235 class PointType,
class RangeType,
class JacobianRangeType,
237 static void linearizedSource(
const LeftModel& f,
const RightModel& g,
238 const RangeType uBar,
const JacobianRangeType DuBar,
239 const Entity &entity,
const PointType& x,
240 const RangeType &value,
const JacobianRangeType& jacobian,
245 f.linearizedSource(uBar, DuBar, entity, x, value, jacobian, ret);
246 if (ModelConstituents<RightModel>::hasSources) {
247 g.linearizedSource(uBar, DuBar, entity, x, value, jacobian, tmp);
253 template<
class LeftModel,
class RightModel,
254 class PointType,
class RangeType,
class JacobianRangeType,
class HessianRangeType,
256 static void fluxDivergence(
const LeftModel& f,
const RightModel& g,
257 const Entity &entity,
const PointType& x,
258 const RangeType &value,
const JacobianRangeType& jacobian,
259 const HessianRangeType& hessian,
264 f.fluxDivergence(entity, x, value, jacobian, hessian, ret);
265 if (ModelConstituents<RightModel>::hasFlux) {
266 g.fluxDivergence(entity, x, value, jacobian, hessian, tmp);
272 template<
class LeftModel,
class RightModel,
273 class Intersection,
class Point,
274 class DomainType,
class RangeType>
275 static void robinFlux(
const LeftModel& lm,
const RightModel& rm,
276 const Intersection& intersection,
278 const DomainType& unitOuterNormal,
279 const RangeType& value,
284 lm.robinFlux(intersection, x, unitOuterNormal, value, result);
285 if (ModelConstituents<RightModel>::hasRobinBoundary) {
287 rm.robinFlux(intersection, x, unitOuterNormal, value, tmp);
293 template<
class LeftModel,
class RightModel,
294 class Intersection,
class Point,
295 class DomainType,
class RangeType>
296 static void linearizedRobinFlux(
const LeftModel& lm,
297 const RightModel& rm,
298 const RangeType& uBar,
299 const Intersection& intersection,
301 const DomainType& unitOuterNormal,
302 const RangeType& value,
307 lm.linearizedRobinFlux(uBar, intersection, x, unitOuterNormal, value, result);
308 if (ModelConstituents<RightModel>::hasRobinBoundary) {
309 rm.linearizedRobinFlux(uBar, intersection, x, unitOuterNormal, value, tmp);