2 #ifndef DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONCCFV_HH 3 #define DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONCCFV_HH 5 #include<dune/common/exceptions.hh> 6 #include<dune/common/fvector.hh> 7 #include<dune/common/typetraits.hh> 8 #include<dune/geometry/referenceelements.hh> 65 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
66 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 69 typedef typename LFSU::Traits::FiniteElementType::
70 Traits::LocalBasisType::Traits::DomainFieldType DF;
73 const int dim = EG::Geometry::mydimension;
76 const Dune::FieldVector<DF,dim>
77 inside_local(Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0));
80 typename TP::Traits::RangeFieldType c = param.c(eg.entity(),inside_local);
83 r.accumulate(lfsu,0,(c*x(lfsu,0))*eg.geometry().volume());
87 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
88 void jacobian_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv,
92 typedef typename LFSU::Traits::FiniteElementType::
93 Traits::LocalBasisType::Traits::DomainFieldType DF;
96 const int dim = EG::Geometry::mydimension;
99 const Dune::FieldVector<DF,dim>
100 inside_local(Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0));
103 typename TP::Traits::RangeFieldType c = param.c(eg.entity(),inside_local);
106 mat.accumulate(lfsu,0,lfsu,0,c*eg.geometry().volume());
111 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
113 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
114 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
115 R& r_s, R& r_n)
const 118 typedef typename LFSU::Traits::FiniteElementType::
119 Traits::LocalBasisType::Traits::DomainFieldType DF;
120 typedef typename LFSU::Traits::FiniteElementType::
121 Traits::LocalBasisType::Traits::RangeFieldType RF;
122 const int dim = IG::dimension;
125 const Dune::FieldVector<DF,dim-1>
126 face_local = Dune::ReferenceElements<DF,IG::dimension-1>::general(ig.geometry().type()).position(0,0);
129 RF face_volume = ig.geometry().integrationElement(face_local)
130 *Dune::ReferenceElements<DF,dim-1>::general(ig.geometry().type()).volume();
132 auto cell_inside = ig.inside();
133 auto cell_outside = ig.outside();
136 const Dune::FieldVector<DF,dim>
137 inside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_inside.type()).position(0,0);
138 const Dune::FieldVector<DF,dim>
139 outside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_outside.type()).position(0,0);
142 typename TP::Traits::PermTensorType tensor_inside;
143 tensor_inside = param.A(cell_inside,inside_local);
144 typename TP::Traits::PermTensorType tensor_outside;
145 tensor_outside = param.A(cell_outside,outside_local);
146 const Dune::FieldVector<DF,dim> n_F = ig.centerUnitOuterNormal();
147 Dune::FieldVector<RF,dim> An_F;
148 tensor_inside.mv(n_F,An_F);
149 RF k_inside = n_F*An_F;
150 tensor_outside.mv(n_F,An_F);
151 RF k_outside = n_F*An_F;
152 RF k_avg = 2.0/(1.0/(k_inside+1E-30) + 1.0/(k_outside+1E-30));
155 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(face_local);
156 typename TP::Traits::RangeType b = param.b(cell_inside,iplocal_s);
159 if (vn>=0) u_upwind = x_s(lfsu_s,0);
else u_upwind = x_n(lfsu_n,0);
162 Dune::FieldVector<DF,IG::dimension>
163 inside_global = cell_inside.geometry().global(inside_local);
164 Dune::FieldVector<DF,IG::dimension>
165 outside_global = cell_outside.geometry().global(outside_local);
168 inside_global -= outside_global;
169 RF distance = inside_global.two_norm();
172 r_s.accumulate(lfsu_s,0,(u_upwind*vn)*face_volume+k_avg*(x_s(lfsu_s,0)-x_n(lfsu_n,0))*face_volume/distance);
173 r_n.accumulate(lfsu_n,0,-(u_upwind*vn)*face_volume-k_avg*(x_s(lfsu_s,0)-x_n(lfsu_n,0))*face_volume/distance);
176 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
178 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
179 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
180 M& mat_ss, M& mat_sn,
181 M& mat_ns, M& mat_nn)
const 184 typedef typename LFSU::Traits::FiniteElementType::
185 Traits::LocalBasisType::Traits::DomainFieldType DF;
186 typedef typename LFSU::Traits::FiniteElementType::
187 Traits::LocalBasisType::Traits::RangeFieldType RF;
188 const int dim = IG::dimension;
191 const Dune::FieldVector<DF,dim-1>
192 face_local = Dune::ReferenceElements<DF,IG::dimension-1>::general(ig.geometry().type()).position(0,0);
195 RF face_volume = ig.geometry().integrationElement(face_local)
196 *Dune::ReferenceElements<DF,dim-1>::general(ig.geometry().type()).volume();
198 auto cell_inside = ig.inside();
199 auto cell_outside = ig.outside();
202 const Dune::FieldVector<DF,dim>
203 inside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_inside.type()).position(0,0);
204 const Dune::FieldVector<DF,dim>
205 outside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_outside.type()).position(0,0);
208 typename TP::Traits::PermTensorType tensor_inside;
209 tensor_inside = param.A(cell_inside,inside_local);
210 typename TP::Traits::PermTensorType tensor_outside;
211 tensor_outside = param.A(cell_outside,outside_local);
212 const Dune::FieldVector<DF,dim> n_F = ig.centerUnitOuterNormal();
213 Dune::FieldVector<RF,dim> An_F;
214 tensor_inside.mv(n_F,An_F);
215 RF k_inside = n_F*An_F;
216 tensor_outside.mv(n_F,An_F);
217 RF k_outside = n_F*An_F;
218 RF k_avg = 2.0/(1.0/(k_inside+1E-30) + 1.0/(k_outside+1E-30));
221 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(face_local);
222 typename TP::Traits::RangeType b = param.b(cell_inside,iplocal_s);
226 Dune::FieldVector<DF,IG::dimension>
227 inside_global = cell_inside.geometry().global(inside_local);
228 Dune::FieldVector<DF,IG::dimension>
229 outside_global = cell_outside.geometry().global(outside_local);
232 inside_global -= outside_global;
233 RF distance = inside_global.two_norm();
236 mat_ss.accumulate(lfsu_s,0,lfsu_s,0, k_avg*face_volume/distance );
237 mat_ns.accumulate(lfsu_n,0,lfsu_s,0, -k_avg*face_volume/distance );
238 mat_sn.accumulate(lfsu_s,0,lfsu_n,0, -k_avg*face_volume/distance );
239 mat_nn.accumulate(lfsu_n,0,lfsu_n,0, k_avg*face_volume/distance );
242 mat_ss.accumulate(lfsu_s,0,lfsu_s,0, vn*face_volume );
243 mat_ns.accumulate(lfsu_n,0,lfsu_s,0, -vn*face_volume );
247 mat_sn.accumulate(lfsu_s,0,lfsu_n,0, vn*face_volume );
248 mat_nn.accumulate(lfsu_n,0,lfsu_n,0, -vn*face_volume );
256 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
258 const LFSV& lfsv, R& r)
const 261 typedef typename LFSU::Traits::FiniteElementType::
262 Traits::LocalBasisType::Traits::DomainFieldType DF;
263 const int dim = EG::Geometry::mydimension;
265 if (!first_stage)
return;
268 const Dune::FieldVector<DF,dim>&
269 inside_local = Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0);
272 typename TP::Traits::RangeFieldType cellcapacity = param.d(eg.entity(),inside_local)*eg.geometry().volume();
273 typename TP::Traits::RangeFieldType celldt = cellcapacity/(cellinflux+1E-30);
274 dtmin = std::min(dtmin,celldt);
281 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
283 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
287 typedef typename LFSU::Traits::FiniteElementType::
288 Traits::LocalBasisType::Traits::DomainFieldType DF;
289 typedef typename LFSU::Traits::FiniteElementType::
290 Traits::LocalBasisType::Traits::RangeFieldType RF;
291 const int dim = IG::dimension;
294 const Dune::FieldVector<DF,dim-1>
295 face_local = Dune::ReferenceElements<DF,dim-1>::general(ig.geometry().type()).position(0,0);
298 RF face_volume = ig.geometry().integrationElement(face_local)
299 *Dune::ReferenceElements<DF,dim-1>::general(ig.geometry().type()).volume();
301 auto cell_inside = ig.inside();
304 const Dune::FieldVector<DF,dim>
305 inside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_inside.type()).position(0,0);
309 bctype = param.bctype(ig.intersection(),face_local);
315 Dune::FieldVector<DF,dim> inside_global = cell_inside.geometry().global(inside_local);
316 Dune::FieldVector<DF,dim> outside_global = ig.geometry().global(face_local);
317 inside_global -= outside_global;
318 RF distance = inside_global.two_norm();
321 typename TP::Traits::PermTensorType tensor_inside;
322 tensor_inside = param.A(cell_inside,inside_local);
323 const Dune::FieldVector<DF,dim> n_F = ig.centerUnitOuterNormal();
324 Dune::FieldVector<RF,dim> An_F;
325 tensor_inside.mv(n_F,An_F);
326 RF k_inside = n_F*An_F;
329 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(face_local);
330 RF g = param.g(cell_inside,iplocal_s);
333 typename TP::Traits::RangeType b = param.b(cell_inside,iplocal_s);
334 const Dune::FieldVector<DF,dim> n = ig.centerUnitOuterNormal();
337 r_s.accumulate(lfsu_s,0,(b*n)*g*face_volume + k_inside*(x_s(lfsu_s,0)-g)*face_volume/distance);
348 typename TP::Traits::RangeFieldType j = param.j(ig.intersection(),face_local);
351 r_s.accumulate(lfsu_s,0,j*face_volume);
359 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(face_local);
360 typename TP::Traits::RangeType b = param.b(cell_inside,iplocal_s);
361 const Dune::FieldVector<DF,dim> n = ig.centerUnitOuterNormal();
364 typename TP::Traits::RangeFieldType o = param.o(ig.intersection(),face_local);
367 r_s.accumulate(lfsu_s,0,((b*n)*x_s(lfsu_s,0) + o)*face_volume);
373 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
375 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
379 typedef typename LFSU::Traits::FiniteElementType::
380 Traits::LocalBasisType::Traits::DomainFieldType DF;
381 typedef typename LFSU::Traits::FiniteElementType::
382 Traits::LocalBasisType::Traits::RangeFieldType RF;
383 const int dim = IG::dimension;
386 const Dune::FieldVector<DF,dim-1>
387 face_local = Dune::ReferenceElements<DF,dim-1>::general(ig.geometry().type()).position(0,0);
390 RF face_volume = ig.geometry().integrationElement(face_local)
391 *Dune::ReferenceElements<DF,dim-1>::general(ig.geometry().type()).volume();
393 auto cell_inside = ig.inside();
396 const Dune::FieldVector<DF,dim>
397 inside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_inside.type()).position(0,0);
401 bctype = param.bctype(ig.intersection(),face_local);
408 Dune::FieldVector<DF,dim> inside_global = cell_inside.geometry().global(inside_local);
409 Dune::FieldVector<DF,dim> outside_global = ig.geometry().global(face_local);
410 inside_global -= outside_global;
411 RF distance = inside_global.two_norm();
414 typename TP::Traits::PermTensorType tensor_inside;
415 tensor_inside = param.A(cell_inside,inside_local);
416 const Dune::FieldVector<DF,dim> n_F = ig.centerUnitOuterNormal();
417 Dune::FieldVector<RF,dim> An_F;
418 tensor_inside.mv(n_F,An_F);
419 RF k_inside = n_F*An_F;
422 mat_ss.accumulate(lfsu_s,0,lfsv_s,0, k_inside*face_volume/distance );
430 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(face_local);
431 typename TP::Traits::RangeType b = param.b(cell_inside,iplocal_s);
432 const Dune::FieldVector<DF,dim> n = ig.centerUnitOuterNormal();
435 mat_ss.accumulate(lfsu_s,0,lfsv_s,0, (b*n)*face_volume );
442 template<
typename EG,
typename LFSV,
typename R>
446 typedef typename LFSV::Traits::FiniteElementType::
447 Traits::LocalBasisType::Traits::DomainFieldType DF;
448 const int dim = EG::Geometry::mydimension;
451 const Dune::FieldVector<DF,dim>&
452 inside_local = Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0);
455 typename TP::Traits::RangeFieldType f = param.f(eg.entity(),inside_local);
457 r.accumulate(lfsv,0,-f*eg.geometry().volume());
461 void setTime (
typename TP::Traits::RangeFieldType t)
467 void preStep (
typename TP::Traits::RangeFieldType time,
typename TP::Traits::RangeFieldType dt,
473 void preStage (
typename TP::Traits::RangeFieldType time,
int r)
480 else first_stage =
false;
489 typename TP::Traits::RangeFieldType
suggestTimestep (
typename TP::Traits::RangeFieldType dt)
const 497 mutable typename TP::Traits::RangeFieldType dtmin;
498 mutable typename TP::Traits::RangeFieldType cellinflux;
531 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
532 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 535 typedef typename LFSU::Traits::FiniteElementType::
536 Traits::LocalBasisType::Traits::DomainFieldType DF;
539 const int dim = EG::Geometry::mydimension;
542 const Dune::FieldVector<DF,dim>&
543 inside_local = Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0);
545 typename TP::Traits::RangeFieldType capacity = param.d(eg.entity(),inside_local);
548 r.accumulate(lfsu,0,capacity*x(lfsu,0)*eg.geometry().volume());
552 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
557 typedef typename LFSU::Traits::FiniteElementType::
558 Traits::LocalBasisType::Traits::DomainFieldType DF;
561 const int dim = EG::Geometry::mydimension;
564 const Dune::FieldVector<DF,dim>&
565 inside_local = Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0);
568 typename TP::Traits::RangeFieldType capacity = param.d(eg.entity(),inside_local);
571 mat.accumulate(lfsu,0,lfsu,0,capacity*eg.geometry().volume());
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionccfv.hh:66
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionccfv.hh:532
Definition: convectiondiffusionccfv.hh:50
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
Definition: convectiondiffusionccfv.hh:282
Definition: convectiondiffusionccfv.hh:57
sparsity pattern generator
Definition: pattern.hh:13
Definition: convectiondiffusionccfv.hh:56
void alpha_volume_post_skeleton(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionccfv.hh:257
const IG & ig
Definition: constraints.hh:148
void preStage(typename TP::Traits::RangeFieldType time, int r)
to be called once before each stage
Definition: convectiondiffusionccfv.hh:473
static const int dim
Definition: adaptivity.hh:83
Definition: convectiondiffusionccfv.hh:58
Definition: adaptivity.hh:27
Definition: convectiondiffusionparameter.hh:65
void setTime(typename TP::Traits::RangeFieldType t)
set time in parameter class
Definition: convectiondiffusionccfv.hh:461
Type
Definition: convectiondiffusionparameter.hh:65
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, M &mat) const
Definition: convectiondiffusionccfv.hh:88
void alpha_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, R &r_s, R &r_n) const
Definition: convectiondiffusionccfv.hh:112
sparsity pattern generator
Definition: pattern.hh:29
void preStep(typename TP::Traits::RangeFieldType time, typename TP::Traits::RangeFieldType dt, int stages)
to be called once before each time step
Definition: convectiondiffusionccfv.hh:467
Default flags for all local operators.
Definition: flags.hh:18
ConvectionDiffusionCCFVTemporalOperator(TP ¶m_)
Definition: convectiondiffusionccfv.hh:525
void lambda_volume(const EG &eg, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionccfv.hh:443
Definition: convectiondiffusionparameter.hh:65
void jacobian_skeleton(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, const LFSU &lfsu_n, const X &x_n, const LFSV &lfsv_n, M &mat_ss, M &mat_sn, M &mat_ns, M &mat_nn) const
Definition: convectiondiffusionccfv.hh:177
Definition: convectiondiffusionccfv.hh:59
Default class for additional methods in instationary local operators.
Definition: idefault.hh:89
Definition: convectiondiffusionccfv.hh:511
Definition: convectiondiffusionparameter.hh:65
TP::Traits::RangeFieldType suggestTimestep(typename TP::Traits::RangeFieldType dt) const
to be called once before each stage
Definition: convectiondiffusionccfv.hh:489
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, M &mat) const
Definition: convectiondiffusionccfv.hh:553
void jacobian_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, M &mat_ss) const
Definition: convectiondiffusionccfv.hh:374
ConvectionDiffusionCCFV(TP ¶m_)
Definition: convectiondiffusionccfv.hh:61
Definition: convectiondiffusionccfv.hh:36
Definition: convectiondiffusionccfv.hh:54
Definition: convectiondiffusionccfv.hh:51
Definition: convectiondiffusionccfv.hh:55
void postStage()
to be called once at the end of each stage
Definition: convectiondiffusionccfv.hh:484