2 #ifndef DUNE_PDELAB_CONVECTIONDIFFUSIONFEM_HH 3 #define DUNE_PDELAB_CONVECTIONDIFFUSIONFEM_HH 34 template<
typename T,
typename FiniteElementMap>
53 : param(param_), intorderadd(intorderadd_)
58 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
59 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 62 typedef typename LFSU::Traits::FiniteElementType::
63 Traits::LocalBasisType::Traits::RangeFieldType RF;
65 typedef typename LFSU::Traits::SizeType size_type;
68 const int dim = EG::Entity::dimension;
71 auto geo = eg.geometry();
72 auto intorder = intorderadd+2*lfsu.finiteElement().localBasis().order();
76 auto localcenter = ref_el.position(0,0);
77 auto tensor = param.A(eg.entity(),localcenter);
85 auto& phi = cache.evaluateFunction(ip.position(),lfsu.finiteElement().localBasis());
89 for (size_type i=0; i<lfsu.size(); i++)
90 u += x(lfsu,i)*phi[i];
95 auto& js = cache.evaluateJacobian(ip.position(),lfsu.finiteElement().localBasis());
98 auto jac = geo.jacobianInverseTransposed(ip.position());
100 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
101 for (size_type i=0; i<lfsu.size(); i++)
102 jac.mv(js[i][0],gradphi[i]);
105 Dune::FieldVector<RF,dim> gradu(0.0);
106 for (size_type i=0; i<lfsu.size(); i++)
107 gradu.axpy(x(lfsu,i),gradphi[i]);
110 Dune::FieldVector<RF,dim> Agradu(0.0);
111 tensor.umv(gradu,Agradu);
114 auto b = param.b(eg.entity(),ip.position());
115 auto c = param.c(eg.entity(),ip.position());
116 auto f = param.f(eg.entity(),ip.position());
119 RF factor = ip.weight() * geo.integrationElement(ip.position());
120 for (size_type i=0; i<lfsu.size(); i++)
121 r.accumulate(lfsu,i,( Agradu*gradphi[i] - u*(b*gradphi[i]) + (c*u-f)*phi[i] )*factor);
126 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
131 typedef typename LFSU::Traits::FiniteElementType::
132 Traits::LocalBasisType::Traits::DomainFieldType DF;
133 typedef typename LFSU::Traits::FiniteElementType::
134 Traits::LocalBasisType::Traits::RangeFieldType RF;
135 typedef typename LFSU::Traits::FiniteElementType::
136 Traits::LocalBasisType::Traits::JacobianType JacobianType;
137 typedef typename LFSU::Traits::FiniteElementType::
138 Traits::LocalBasisType::Traits::RangeType RangeType;
139 typedef typename LFSU::Traits::SizeType size_type;
142 const int dim = EG::Entity::dimension;
145 Dune::GeometryType gt = eg.geometry().type();
146 const int intorder = intorderadd+2*lfsu.finiteElement().localBasis().order();
147 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
150 typename T::Traits::PermTensorType tensor;
151 Dune::FieldVector<DF,dim> localcenter = Dune::ReferenceElements<DF,dim>::general(gt).position(0,0);
152 tensor = param.A(eg.entity(),localcenter);
155 for (
const auto& ip : rule)
160 const std::vector<JacobianType>& js = cache.evaluateJacobian(ip.position(),lfsu.finiteElement().localBasis());
163 const typename EG::Geometry::JacobianInverseTransposed jac
164 = eg.geometry().jacobianInverseTransposed(ip.position());
165 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
166 std::vector<Dune::FieldVector<RF,dim> > Agradphi(lfsu.size());
167 for (size_type i=0; i<lfsu.size(); i++)
169 jac.mv(js[i][0],gradphi[i]);
170 tensor.mv(gradphi[i],Agradphi[i]);
176 const std::vector<RangeType>& phi = cache.evaluateFunction(ip.position(),lfsu.finiteElement().localBasis());
179 typename T::Traits::RangeType b = param.b(eg.entity(),ip.position());
180 typename T::Traits::RangeFieldType c = param.c(eg.entity(),ip.position());
183 RF factor = ip.weight() * eg.geometry().integrationElement(ip.position());
184 for (size_type j=0; j<lfsu.size(); j++)
185 for (size_type i=0; i<lfsu.size(); i++)
186 mat.accumulate(lfsu,i,lfsu,j,( Agradphi[j]*gradphi[i]-phi[j]*(b*gradphi[i])+c*phi[j]*phi[i] )*factor);
191 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
193 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
197 typedef typename LFSV::Traits::FiniteElementType::
198 Traits::LocalBasisType::Traits::DomainFieldType DF;
199 typedef typename LFSV::Traits::FiniteElementType::
200 Traits::LocalBasisType::Traits::RangeFieldType RF;
201 typedef typename LFSV::Traits::FiniteElementType::
202 Traits::LocalBasisType::Traits::RangeType RangeType;
204 typedef typename LFSV::Traits::SizeType size_type;
207 const int dim = IG::dimension;
210 auto inside_cell = ig.inside();
213 Dune::GeometryType gtface = ig.geometryInInside().type();
214 Dune::FieldVector<DF,dim-1> facecenterlocal = Dune::ReferenceElements<DF,dim-1>::general(gtface).position(0,0);
216 bctype = param.bctype(ig.intersection(),facecenterlocal);
222 const int intorder = intorderadd+2*lfsu_s.finiteElement().localBasis().order();
223 const Dune::QuadratureRule<DF,dim-1>& rule = Dune::QuadratureRules<DF,dim-1>::rule(gtface,intorder);
226 for (
const auto& ip : rule)
229 Dune::FieldVector<DF,dim> local = ig.geometryInInside().global(ip.position());
234 const std::vector<RangeType>& phi = cache.evaluateFunction(local,lfsu_s.finiteElement().localBasis());
239 typename T::Traits::RangeFieldType j = param.j(ig.intersection(),ip.position());
242 RF factor = ip.weight()*ig.geometry().integrationElement(ip.position());
243 for (size_type i=0; i<lfsu_s.size(); i++)
244 r_s.accumulate(lfsu_s,i,j*phi[i]*factor);
251 for (size_type i=0; i<lfsu_s.size(); i++)
252 u += x_s(lfsu_s,i)*phi[i];
255 typename T::Traits::RangeType b = param.b(inside_cell,local);
256 const Dune::FieldVector<DF,dim> n = ig.unitOuterNormal(ip.position());
259 typename T::Traits::RangeFieldType o = param.o(ig.intersection(),ip.position());
262 RF factor = ip.weight()*ig.geometry().integrationElement(ip.position());
263 for (size_type i=0; i<lfsu_s.size(); i++)
264 r_s.accumulate(lfsu_s,i,( (b*n)*u + o)*phi[i]*factor);
270 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
272 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
276 typedef typename LFSV::Traits::FiniteElementType::
277 Traits::LocalBasisType::Traits::DomainFieldType DF;
278 typedef typename LFSV::Traits::FiniteElementType::
279 Traits::LocalBasisType::Traits::RangeFieldType RF;
280 typedef typename LFSV::Traits::FiniteElementType::
281 Traits::LocalBasisType::Traits::RangeType RangeType;
283 typedef typename LFSV::Traits::SizeType size_type;
286 const int dim = IG::dimension;
289 auto inside_cell = ig.inside();
292 Dune::GeometryType gtface = ig.geometryInInside().type();
293 Dune::FieldVector<DF,dim-1> facecenterlocal = Dune::ReferenceElements<DF,dim-1>::general(gtface).position(0,0);
295 bctype = param.bctype(ig.intersection(),facecenterlocal);
302 const int intorder = intorderadd+2*lfsu_s.finiteElement().localBasis().order();
303 const Dune::QuadratureRule<DF,dim-1>& rule = Dune::QuadratureRules<DF,dim-1>::rule(gtface,intorder);
306 for (
const auto& ip : rule)
309 Dune::FieldVector<DF,dim> local = ig.geometryInInside().global(ip.position());
314 const std::vector<RangeType>& phi = cache.evaluateFunction(local,lfsu_s.finiteElement().localBasis());
317 typename T::Traits::RangeType b = param.b(inside_cell,local);
318 const Dune::FieldVector<DF,dim> n = ig.unitOuterNormal(ip.position());
321 RF factor = ip.weight()*ig.geometry().integrationElement(ip.position());
322 for (size_type j=0; j<lfsu_s.size(); j++)
323 for (size_type i=0; i<lfsu_s.size(); i++)
324 mat_s.accumulate(lfsu_s,i,lfsu_s,j,(b*n)*phi[j]*phi[i]*factor);
338 typedef typename FiniteElementMap::Traits::FiniteElementType::Traits::LocalBasisType LocalBasisType;
363 enum {
dim = T::Traits::GridViewType::dimension };
365 typedef typename T::Traits::RangeFieldType Real;
384 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
385 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 388 typedef typename LFSU::Traits::FiniteElementType::
389 Traits::LocalBasisType::Traits::DomainFieldType DF;
390 typedef typename LFSU::Traits::FiniteElementType::
391 Traits::LocalBasisType::Traits::RangeFieldType RF;
392 typedef typename LFSU::Traits::FiniteElementType::
393 Traits::LocalBasisType::Traits::RangeType RangeType;
394 typedef typename LFSU::Traits::SizeType size_type;
397 const int dim = EG::Geometry::mydimension;
398 const int intorder = 2*lfsu.finiteElement().localBasis().order();
401 Dune::GeometryType gt = eg.geometry().type();
402 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
406 for (
const auto& ip : rule)
409 std::vector<RangeType> phi(lfsu.size());
410 lfsu.finiteElement().localBasis().evaluateFunction(ip.position(),phi);
414 for (size_type i=0; i<lfsu.size(); i++)
415 u += x(lfsu,i)*phi[i];
418 typename T::Traits::RangeFieldType c = param.c(eg.entity(),ip.position());
421 typename T::Traits::RangeFieldType f = param.f(eg.entity(),ip.position());
424 RF factor = ip.weight() * eg.geometry().integrationElement(ip.position());
425 sum += (f*f-c*c*u*u)*factor;
429 DF h_T = diameter(eg.geometry());
430 r.accumulate(lfsv,0,h_T*h_T*sum);
436 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
438 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
439 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
440 R& r_s, R& r_n)
const 443 typedef typename LFSU::Traits::FiniteElementType::
444 Traits::LocalBasisType::Traits::DomainFieldType DF;
445 typedef typename LFSU::Traits::FiniteElementType::
446 Traits::LocalBasisType::Traits::RangeFieldType RF;
447 typedef typename LFSU::Traits::FiniteElementType::
448 Traits::LocalBasisType::Traits::JacobianType JacobianType;
449 typedef typename LFSU::Traits::SizeType size_type;
452 const int dim = IG::dimension;
455 auto inside_cell = ig.inside();
456 auto outside_cell = ig.outside();
459 const Dune::FieldVector<DF,dim>&
460 inside_local = Dune::ReferenceElements<DF,dim>::general(inside_cell.type()).position(0,0);
461 const Dune::FieldVector<DF,dim>&
462 outside_local = Dune::ReferenceElements<DF,dim>::general(outside_cell.type()).position(0,0);
463 typename T::Traits::PermTensorType A_s, A_n;
464 A_s = param.A(inside_cell,inside_local);
465 A_n = param.A(outside_cell,outside_local);
468 const int intorder = 2*lfsu_s.finiteElement().localBasis().order();
469 Dune::GeometryType gtface = ig.geometryInInside().type();
470 const Dune::QuadratureRule<DF,dim-1>& rule = Dune::QuadratureRules<DF,dim-1>::rule(gtface,intorder);
473 typename IG::Entity::Geometry::JacobianInverseTransposed jac;
476 const Dune::FieldVector<DF,dim> n_F = ig.centerUnitOuterNormal();
477 Dune::FieldVector<RF,dim> An_F_s;
479 Dune::FieldVector<RF,dim> An_F_n;
484 for (
const auto& ip : rule)
487 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(ip.position());
488 Dune::FieldVector<DF,dim> iplocal_n = ig.geometryInOutside().global(ip.position());
491 std::vector<JacobianType> gradphi_s(lfsu_s.size());
492 lfsu_s.finiteElement().localBasis().evaluateJacobian(iplocal_s,gradphi_s);
493 std::vector<JacobianType> gradphi_n(lfsu_n.size());
494 lfsu_n.finiteElement().localBasis().evaluateJacobian(iplocal_n,gradphi_n);
497 jac = inside_cell.geometry().jacobianInverseTransposed(iplocal_s);
498 std::vector<Dune::FieldVector<RF,dim> > tgradphi_s(lfsu_s.size());
499 for (size_type i=0; i<lfsu_s.size(); i++) jac.mv(gradphi_s[i][0],tgradphi_s[i]);
500 jac = outside_cell.geometry().jacobianInverseTransposed(iplocal_n);
501 std::vector<Dune::FieldVector<RF,dim> > tgradphi_n(lfsu_n.size());
502 for (size_type i=0; i<lfsu_n.size(); i++) jac.mv(gradphi_n[i][0],tgradphi_n[i]);
505 Dune::FieldVector<RF,dim> gradu_s(0.0);
506 for (size_type i=0; i<lfsu_s.size(); i++)
507 gradu_s.axpy(x_s(lfsu_s,i),tgradphi_s[i]);
508 Dune::FieldVector<RF,dim> gradu_n(0.0);
509 for (size_type i=0; i<lfsu_n.size(); i++)
510 gradu_n.axpy(x_n(lfsu_n,i),tgradphi_n[i]);
513 RF factor = ip.weight() * ig.geometry().integrationElement(ip.position());
514 RF jump = (An_F_s*gradu_s)-(An_F_n*gradu_n);
515 sum += 0.25*jump*jump*factor;
520 DF h_T = std::max(diameter(inside_cell.geometry()),diameter(outside_cell.geometry()));
521 r_s.accumulate(lfsv_s,0,h_T*sum);
522 r_n.accumulate(lfsv_n,0,h_T*sum);
528 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
530 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
534 typedef typename LFSU::Traits::FiniteElementType::
535 Traits::LocalBasisType::Traits::DomainFieldType DF;
536 typedef typename LFSU::Traits::FiniteElementType::
537 Traits::LocalBasisType::Traits::RangeFieldType RF;
538 typedef typename LFSU::Traits::FiniteElementType::
539 Traits::LocalBasisType::Traits::JacobianType JacobianType;
540 typedef typename LFSU::Traits::SizeType size_type;
543 const int dim = IG::dimension;
545 auto inside_cell = ig.inside();
547 const Dune::FieldVector<DF,dim>&
548 inside_local = Dune::ReferenceElements<DF,dim>::general(inside_cell.type()).position(0,0);
549 typename T::Traits::PermTensorType A_s;
550 A_s = param.A(inside_cell,inside_local);
551 const Dune::FieldVector<DF,dim> n_F = ig.centerUnitOuterNormal();
552 Dune::FieldVector<RF,dim> An_F_s;
556 const int intorder = 2*lfsu_s.finiteElement().localBasis().order();
557 Dune::GeometryType gtface = ig.geometryInInside().type();
558 const Dune::QuadratureRule<DF,dim-1>& rule = Dune::QuadratureRules<DF,dim-1>::rule(gtface,intorder);
561 typename IG::Entity::Geometry::JacobianInverseTransposed jac;
564 const Dune::FieldVector<DF,dim-1>
565 face_local = Dune::ReferenceElements<DF,dim-1>::general(gtface).position(0,0);
566 BCType bctype = param.bctype(ig.intersection(),face_local);
572 for (
const auto& ip : rule)
575 Dune::FieldVector<DF,dim> iplocal_s = ig.geometryInInside().global(ip.position());
578 std::vector<JacobianType> gradphi_s(lfsu_s.size());
579 lfsu_s.finiteElement().localBasis().evaluateJacobian(iplocal_s,gradphi_s);
582 jac = inside_cell.geometry().jacobianInverseTransposed(iplocal_s);
583 std::vector<Dune::FieldVector<RF,dim> > tgradphi_s(lfsu_s.size());
584 for (size_type i=0; i<lfsu_s.size(); i++) jac.mv(gradphi_s[i][0],tgradphi_s[i]);
587 Dune::FieldVector<RF,dim> gradu_s(0.0);
588 for (size_type i=0; i<lfsu_s.size(); i++)
589 gradu_s.axpy(x_s(lfsu_s,i),tgradphi_s[i]);
592 RF j = param.j(ig.intersection(),ip.position());
595 RF factor = ip.weight() * ig.geometry().integrationElement(ip.position());
596 RF jump = j+(An_F_s*gradu_s);
597 sum += jump*jump*factor;
602 DF h_T = diameter(inside_cell.geometry());
603 r_s.accumulate(lfsv_s,0,h_T*sum);
610 typename GEO::ctype diameter (
const GEO& geo)
const 612 typedef typename GEO::ctype DF;
614 const int dim = GEO::coorddimension;
615 for (
int i=0; i<geo.corners(); i++)
617 Dune::FieldVector<DF,dim> xi = geo.corner(i);
618 for (
int j=i+1; j<geo.corners(); j++)
620 Dune::FieldVector<DF,dim> xj = geo.corner(j);
622 hmax = std::max(hmax,xj.two_norm());
651 enum {
dim = T::Traits::GridViewType::dimension };
653 typedef typename T::Traits::RangeFieldType Real;
667 : param(param_), time(time_), dt(dt_), cmax(0)
671 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
672 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 675 typedef typename LFSU::Traits::FiniteElementType::
676 Traits::LocalBasisType::Traits::DomainFieldType DF;
677 typedef typename LFSU::Traits::FiniteElementType::
678 Traits::LocalBasisType::Traits::RangeFieldType RF;
679 typedef typename LFSU::Traits::FiniteElementType::
680 Traits::LocalBasisType::Traits::RangeType RangeType;
681 typedef typename LFSU::Traits::SizeType size_type;
684 const int dim = EG::Geometry::mydimension;
685 const int intorder = 2*lfsu.finiteElement().localBasis().order();
688 Dune::GeometryType gt = eg.geometry().type();
689 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
696 for (
const auto& ip : rule)
699 std::vector<RangeType> phi(lfsu.size());
700 lfsu.finiteElement().localBasis().evaluateFunction(ip.position(),phi);
704 for (size_type i=0; i<lfsu.size(); i++)
705 u += x(lfsu,i)*phi[i];
708 RF factor = ip.weight() * eg.geometry().integrationElement(ip.position());
713 typename T::Traits::RangeFieldType f_down = param.f(eg.entity(),ip.position());
714 param.setTime(time+0.5*dt);
715 typename T::Traits::RangeFieldType f_mid = param.f(eg.entity(),ip.position());
716 param.setTime(time+dt);
717 typename T::Traits::RangeFieldType f_up = param.f(eg.entity(),ip.position());
718 RF f_average = (1.0/6.0)*f_down + (2.0/3.0)*f_mid + (1.0/6.0)*f_up;
721 fsum_down += (f_down-f_average)*(f_down-f_average)*factor;
722 fsum_mid += (f_mid-f_average)*(f_mid-f_average)*factor;
723 fsum_up += (f_up-f_average)*(f_up-f_average)*factor;
727 DF h_T = diameter(eg.geometry());
728 r.accumulate(lfsv,0,(h_T*h_T/dt)*sum);
729 r.accumulate(lfsv,0,h_T*h_T * dt*((1.0/6.0)*fsum_down+(2.0/3.0)*fsum_mid+(1.0/6.0)*fsum_up) );
749 typename GEO::ctype diameter (
const GEO& geo)
const 751 typedef typename GEO::ctype DF;
753 const int dim = GEO::coorddimension;
754 for (
int i=0; i<geo.corners(); i++)
756 Dune::FieldVector<DF,dim> xi = geo.corner(i);
757 for (
int j=i+1; j<geo.corners(); j++)
759 Dune::FieldVector<DF,dim> xj = geo.corner(j);
761 hmax = std::max(hmax,xj.two_norm());
770 template<
typename T,
typename EG>
777 template<
typename X,
typename Y>
780 y[0] = t.f(eg.entity(),x);
808 enum {
dim = T::Traits::GridViewType::dimension };
810 typedef typename T::Traits::RangeFieldType Real;
825 : param(param_), time(time_), dt(dt_)
829 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
830 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 833 typedef typename LFSU::Traits::FiniteElementType::
834 Traits::LocalBasisType::Traits::DomainFieldType DF;
835 typedef typename LFSU::Traits::FiniteElementType::
836 Traits::LocalBasisType::Traits::RangeFieldType RF;
837 typedef typename LFSU::Traits::FiniteElementType::
838 Traits::LocalBasisType::Traits::RangeType RangeType;
839 typedef typename LFSU::Traits::SizeType size_type;
840 typedef typename LFSU::Traits::FiniteElementType::
841 Traits::LocalBasisType::Traits::JacobianType JacobianType;
844 const int dim = EG::Geometry::mydimension;
845 const int intorder = 2*lfsu.finiteElement().localBasis().order();
848 Dune::GeometryType gt = eg.geometry().type();
849 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
853 std::vector<RF> f_up, f_down, f_mid;
855 lfsu.finiteElement().localInterpolation().interpolate(f_adapter,f_down);
856 param.setTime(time+0.5*dt);
857 lfsu.finiteElement().localInterpolation().interpolate(f_adapter,f_mid);
858 param.setTime(time+dt);
859 lfsu.finiteElement().localInterpolation().interpolate(f_adapter,f_up);
864 RF fsum_grad_up(0.0);
865 RF fsum_grad_mid(0.0);
866 RF fsum_grad_down(0.0);
867 for (
const auto& ip : rule)
870 std::vector<RangeType> phi(lfsu.size());
871 lfsu.finiteElement().localBasis().evaluateFunction(ip.position(),phi);
875 for (size_type i=0; i<lfsu.size(); i++)
876 u += x(lfsu,i)*phi[i];
879 RF factor = ip.weight() * eg.geometry().integrationElement(ip.position());
883 std::vector<JacobianType> js(lfsu.size());
884 lfsu.finiteElement().localBasis().evaluateJacobian(ip.position(),js);
887 const typename EG::Geometry::JacobianInverseTransposed jac =
888 eg.geometry().jacobianInverseTransposed(ip.position());
889 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
890 for (size_type i=0; i<lfsu.size(); i++)
891 jac.mv(js[i][0],gradphi[i]);
894 Dune::FieldVector<RF,dim> gradu(0.0);
895 for (size_type i=0; i<lfsu.size(); i++)
896 gradu.axpy(x(lfsu,i),gradphi[i]);
899 sum_grad += (gradu*gradu)*factor;
902 Dune::FieldVector<RF,dim> gradf_down(0.0);
903 for (size_type i=0; i<lfsu.size(); i++) gradf_down.axpy(f_down[i],gradphi[i]);
904 Dune::FieldVector<RF,dim> gradf_mid(0.0);
905 for (size_type i=0; i<lfsu.size(); i++) gradf_mid.axpy(f_mid[i],gradphi[i]);
906 Dune::FieldVector<RF,dim> gradf_up(0.0);
907 for (size_type i=0; i<lfsu.size(); i++) gradf_up.axpy(f_up[i],gradphi[i]);
908 Dune::FieldVector<RF,dim> gradf_average(0.0);
909 for (size_type i=0; i<lfsu.size(); i++)
910 gradf_average.axpy((1.0/6.0)*f_down[i]+(2.0/3.0)*f_mid[i]+(1.0/6.0)*f_up[i],gradphi[i]);
913 gradf_down -= gradf_average;
914 fsum_grad_down += (gradf_down*gradf_down)*factor;
915 gradf_mid -= gradf_average;
916 fsum_grad_mid += (gradf_mid*gradf_mid)*factor;
917 gradf_up -= gradf_average;
918 fsum_grad_up += (gradf_up*gradf_up)*factor;
922 DF h_T = diameter(eg.geometry());
923 r.accumulate(lfsv,0,dt * sum_grad);
924 r.accumulate(lfsv,0,dt*dt * dt*((1.0/6.0)*fsum_grad_down+(2.0/3.0)*fsum_grad_mid+(1.0/6.0)*fsum_grad_up));
929 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
931 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
935 typedef typename LFSU::Traits::FiniteElementType::
936 Traits::LocalBasisType::Traits::DomainFieldType DF;
937 typedef typename LFSU::Traits::FiniteElementType::
938 Traits::LocalBasisType::Traits::RangeFieldType RF;
941 const int dim = IG::dimension;
944 const int intorder = 2*lfsu_s.finiteElement().localBasis().order();
945 Dune::GeometryType gtface = ig.geometryInInside().type();
946 const Dune::QuadratureRule<DF,dim-1>& rule = Dune::QuadratureRules<DF,dim-1>::rule(gtface,intorder);
949 const Dune::FieldVector<DF,dim-1>
950 face_local = Dune::ReferenceElements<DF,dim-1>::general(gtface).position(0,0);
951 BCType bctype = param.bctype(ig.intersection(),face_local);
958 for (
const auto& ip : rule)
962 RF j_down = param.j(ig.intersection(),ip.position());
963 param.setTime(time+0.5*dt);
964 RF j_mid = param.j(ig.intersection(),ip.position());
965 param.setTime(time+dt);
966 RF j_up = param.j(ig.intersection(),ip.position());
969 RF factor = ip.weight() * ig.geometry().integrationElement(ip.position());
970 sum_down += (j_down-j_mid)*(j_down-j_mid)*factor;
971 sum_up += (j_up-j_mid)*(j_up-j_mid)*factor;
976 auto inside_cell = ig.inside();
977 DF h_T = diameter(inside_cell.geometry());
978 r_s.accumulate(lfsv_s,0,(h_T+dt*dt/h_T)*dt*0.5*(sum_down+sum_up));
987 typename GEO::ctype diameter (
const GEO& geo)
const 989 typedef typename GEO::ctype DF;
991 const int dim = GEO::coorddimension;
992 for (
int i=0; i<geo.corners(); i++)
994 Dune::FieldVector<DF,dim> xi = geo.corner(i);
995 for (
int j=i+1; j<geo.corners(); j++)
997 Dune::FieldVector<DF,dim> xj = geo.corner(j);
999 hmax = std::max(hmax,xj.two_norm());
ConvectionDiffusionTemporalResidualEstimator1(T ¶m_, double time_, double dt_)
constructor: pass parameter object
Definition: convectiondiffusionfem.hh:666
double getCmax() const
Definition: convectiondiffusionfem.hh:737
CD_RHS_LocalAdapter(const T &t_, const EG &eg_)
Definition: convectiondiffusionfem.hh:774
Definition: convectiondiffusionfem.hh:35
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
Definition: convectiondiffusionfem.hh:930
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
Definition: convectiondiffusionfem.hh:529
Definition: convectiondiffusionfem.hh:804
sparsity pattern generator
Definition: pattern.hh:13
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
Definition: convectiondiffusionfem.hh:192
void setTime(double t)
set time in parameter class
Definition: convectiondiffusionfem.hh:330
ConvectionDiffusionFEM(T ¶m_, int intorderadd_=0)
Definition: convectiondiffusionfem.hh:52
const IG & ig
Definition: constraints.hh:148
static const int dim
Definition: adaptivity.hh:83
Implement jacobian_boundary() based on alpha_boundary()
Definition: numericaljacobian.hh:250
ReferenceElementWrapper< ReferenceElement< typename Geometry::ctype, Geometry::mydimension > > referenceElement(const Geometry &geo)
Returns the reference element for the given geometry.
Definition: referenceelements.hh:144
Definition: adaptivity.hh:27
Definition: convectiondiffusionparameter.hh:65
Type
Definition: convectiondiffusionparameter.hh:65
Definition: convectiondiffusionfem.hh:46
Implements linear and nonlinear versions of jacobian_apply_boundary() based on alpha_boundary() ...
Definition: numericaljacobianapply.hh:285
Default flags for all local operators.
Definition: flags.hh:18
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:672
QuadratureRuleWrapper< QuadratureRule< typename Geometry::ctype, Geometry::mydimension > > quadratureRule(const Geometry &geo, std::size_t order, QuadratureType::Enum quadrature_type=QuadratureType::GaussLegendre)
Returns a quadrature rule for the given geometry.
Definition: quadraturerules.hh:117
Definition: convectiondiffusionparameter.hh:65
Implement jacobian_volume() based on alpha_volume()
Definition: numericaljacobian.hh:31
Default class for additional methods in instationary local operators.
Definition: idefault.hh:89
void jacobian_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, M &mat_s) const
Definition: convectiondiffusionfem.hh:271
ConvectionDiffusionTemporalResidualEstimator(T ¶m_, double time_, double dt_)
constructor: pass parameter object
Definition: convectiondiffusionfem.hh:824
Definition: convectiondiffusionparameter.hh:65
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:59
Definition: convectiondiffusionfem.hh:360
Definition: convectiondiffusionfem.hh:647
void clearCmax()
Definition: convectiondiffusionfem.hh:732
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, M &mat) const
Definition: convectiondiffusionfem.hh:127
void evaluate(const X &x, Y &y) const
Definition: convectiondiffusionfem.hh:778
store values of basis functions and gradients in a cache
Definition: localbasiscache.hh:17
ConvectionDiffusionFEMResidualEstimator(T ¶m_)
constructor: pass parameter object
Definition: convectiondiffusionfem.hh:379
Implements linear and nonlinear versions of jacobian_apply_volume() based on alpha_volume() ...
Definition: numericaljacobianapply.hh:32
Definition: convectiondiffusionfem.hh:771
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: convectiondiffusionfem.hh:437
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:830
Definition: convectiondiffusionfem.hh:50
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:385
Definition: convectiondiffusionfem.hh:49