2 #ifndef DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONFEM_HH
3 #define DUNE_PDELAB_LOCALOPERATOR_CONVECTIONDIFFUSIONFEM_HH
8 #include<dune/common/deprecated.hh>
10 #include<dune/geometry/referenceelements.hh>
38 template<
typename T,
typename FiniteElementMap>
57 : param(param_), intorderadd(intorderadd_)
62 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
63 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const
66 using RF =
typename LFSU::Traits::FiniteElementType::
67 Traits::LocalBasisType::Traits::RangeFieldType;
68 using size_type =
typename LFSU::Traits::SizeType;
71 const int dim = EG::Entity::dimension;
74 const auto& cell = eg.entity();
77 auto geo = eg.geometry();
80 auto ref_el = referenceElement(geo);
81 auto localcenter = ref_el.position(0,0);
82 auto tensor = param.A(cell,localcenter);
85 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
86 Dune::FieldVector<RF,dim> gradu(0.0);
87 Dune::FieldVector<RF,dim> Agradu(0.0);
90 typename EG::Geometry::JacobianInverseTransposed jac;
93 auto intorder = intorderadd+2*lfsu.finiteElement().localBasis().order();
97 if (!Impl::permeabilityIsConstantPerCell<T>(param))
99 tensor = param.A(cell, ip.position());
103 auto& phi = cache.evaluateFunction(ip.position(),lfsu.finiteElement().localBasis());
107 for (size_type i=0; i<lfsu.size(); i++)
108 u += x(lfsu,i)*phi[i];
111 auto& js = cache.evaluateJacobian(ip.position(),lfsu.finiteElement().localBasis());
114 jac = geo.jacobianInverseTransposed(ip.position());
115 for (size_type i=0; i<lfsu.size(); i++)
116 jac.mv(js[i][0],gradphi[i]);
120 for (size_type i=0; i<lfsu.size(); i++)
121 gradu.axpy(x(lfsu,i),gradphi[i]);
124 tensor.mv(gradu,Agradu);
127 auto b = param.b(cell,ip.position());
128 auto c = param.c(cell,ip.position());
129 auto f = param.f(cell,ip.position());
132 RF factor = ip.weight() * geo.integrationElement(ip.position());
133 for (size_type i=0; i<lfsu.size(); i++)
134 r.accumulate(lfsu,i,( Agradu*gradphi[i] - u*(b*gradphi[i]) + (c*u-f)*phi[i] )*factor);
139 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename M>
144 using RF =
typename LFSU::Traits::FiniteElementType::
145 Traits::LocalBasisType::Traits::RangeFieldType;
146 using size_type =
typename LFSU::Traits::SizeType;
149 const int dim = EG::Entity::dimension;
152 const auto& cell = eg.entity();
155 auto geo = eg.geometry();
158 auto ref_el = referenceElement(geo);
159 auto localcenter = ref_el.position(0,0);
160 auto tensor = param.A(cell,localcenter);
163 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
164 std::vector<Dune::FieldVector<RF,dim> > Agradphi(lfsu.size());
167 typename EG::Geometry::JacobianInverseTransposed jac;
170 auto intorder = intorderadd+2*lfsu.finiteElement().localBasis().order();
174 if (!Impl::permeabilityIsConstantPerCell<T>(param))
176 tensor = param.A(cell, ip.position());
180 auto& js = cache.evaluateJacobian(ip.position(),lfsu.finiteElement().localBasis());
183 jac = geo.jacobianInverseTransposed(ip.position());
184 for (size_type i=0; i<lfsu.size(); i++)
186 jac.mv(js[i][0],gradphi[i]);
187 tensor.mv(gradphi[i],Agradphi[i]);
191 auto& phi = cache.evaluateFunction(ip.position(),lfsu.finiteElement().localBasis());
194 auto b = param.b(cell,ip.position());
195 auto c = param.c(cell,ip.position());
198 RF factor = ip.weight() * geo.integrationElement(ip.position());
199 for (size_type j=0; j<lfsu.size(); j++)
200 for (size_type i=0; i<lfsu.size(); i++)
201 mat.accumulate(lfsu,i,lfsu,j,( Agradphi[j]*gradphi[i]-phi[j]*(b*gradphi[i])+c*phi[j]*phi[i] )*factor);
206 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
208 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
212 using RF =
typename LFSV::Traits::FiniteElementType::
213 Traits::LocalBasisType::Traits::RangeFieldType;
214 using size_type =
typename LFSV::Traits::SizeType;
217 const auto& cell_inside =
ig.inside();
220 auto geo =
ig.geometry();
223 auto geo_in_inside =
ig.geometryInInside();
226 auto ref_el = referenceElement(geo_in_inside);
227 auto local_face_center = ref_el.position(0,0);
228 auto intersection =
ig.intersection();
229 auto bctype = param.bctype(intersection,local_face_center);
235 auto intorder = intorderadd+2*lfsu_s.finiteElement().localBasis().order();
239 auto local = geo_in_inside.global(ip.position());
242 auto& phi = cache.evaluateFunction(local,lfsu_s.finiteElement().localBasis());
247 auto j = param.j(intersection,ip.position());
250 auto factor = ip.weight()*geo.integrationElement(ip.position());
251 for (size_type i=0; i<lfsu_s.size(); i++)
252 r_s.accumulate(lfsu_s,i,j*phi[i]*factor);
259 for (size_type i=0; i<lfsu_s.size(); i++)
260 u += x_s(lfsu_s,i)*phi[i];
263 auto b = param.b(cell_inside,local);
264 auto n =
ig.unitOuterNormal(ip.position());
267 auto o = param.o(intersection,ip.position());
270 auto factor = ip.weight()*geo.integrationElement(ip.position());
271 for (size_type i=0; i<lfsu_s.size(); i++)
272 r_s.accumulate(lfsu_s,i,( (b*n)*u + o)*phi[i]*factor);
278 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename M>
280 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
284 using size_type =
typename LFSV::Traits::SizeType;
287 const auto& cell_inside =
ig.inside();
290 auto geo =
ig.geometry();
293 auto geo_in_inside =
ig.geometryInInside();
296 auto ref_el = referenceElement(geo_in_inside);
297 auto local_face_center = ref_el.position(0,0);
298 auto intersection =
ig.intersection();
299 auto bctype = param.bctype(intersection,local_face_center);
306 auto intorder = intorderadd+2*lfsu_s.finiteElement().localBasis().order();
310 auto local = geo_in_inside.global(ip.position());
313 auto& phi = cache.evaluateFunction(local,lfsu_s.finiteElement().localBasis());
316 auto b = param.b(cell_inside,local);
317 auto n =
ig.unitOuterNormal(ip.position());
320 auto factor = ip.weight()*geo.integrationElement(ip.position());
321 for (size_type j=0; j<lfsu_s.size(); j++)
322 for (size_type i=0; i<lfsu_s.size(); i++)
323 mat_s.accumulate(lfsu_s,i,lfsu_s,j,(b*n)*phi[j]*phi[i]*factor);
337 using LocalBasisType =
typename FiniteElementMap::Traits::FiniteElementType::Traits::LocalBasisType;
362 enum { dim = T::Traits::GridViewType::dimension };
364 using Real =
typename T::Traits::RangeFieldType;
383 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
384 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const
387 using RF =
typename LFSU::Traits::FiniteElementType::
388 Traits::LocalBasisType::Traits::RangeFieldType;
389 using RangeType =
typename LFSU::Traits::FiniteElementType::
390 Traits::LocalBasisType::Traits::RangeType;
391 using size_type =
typename LFSU::Traits::SizeType;
394 const auto& cell = eg.entity();
397 auto geo = eg.geometry();
400 std::vector<RangeType> phi(lfsu.size());
404 auto intorder = 2*lfsu.finiteElement().localBasis().order();
408 lfsu.finiteElement().localBasis().evaluateFunction(ip.position(),phi);
412 for (size_type i=0; i<lfsu.size(); i++)
413 u += x(lfsu,i)*phi[i];
416 auto c = param.c(cell,ip.position());
419 auto f = param.f(cell,ip.position());
422 auto factor = ip.weight() * geo.integrationElement(ip.position());
423 sum += (f*f-c*c*u*u)*factor;
427 auto h_T = diameter(geo);
428 r.accumulate(lfsv,0,h_T*h_T*sum);
434 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
436 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
437 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
438 R& r_s, R& r_n)
const
441 using RF =
typename LFSU::Traits::FiniteElementType::
442 Traits::LocalBasisType::Traits::RangeFieldType;
443 using JacobianType =
typename LFSU::Traits::FiniteElementType::
444 Traits::LocalBasisType::Traits::JacobianType;
445 using size_type =
typename LFSU::Traits::SizeType;
448 const int dim = IG::Entity::dimension;
451 const auto& cell_inside =
ig.inside();
452 const auto& cell_outside =
ig.outside();
455 auto geo =
ig.geometry();
456 auto geo_inside = cell_inside.geometry();
457 auto geo_outside = cell_outside.geometry();
460 auto geo_in_inside =
ig.geometryInInside();
461 auto geo_in_outside =
ig.geometryInOutside();
464 auto ref_el_inside = referenceElement(geo_inside);
465 auto ref_el_outside = referenceElement(geo_outside);
466 auto local_inside = ref_el_inside.position(0,0);
467 auto local_outside = ref_el_outside.position(0,0);
468 auto A_s = param.A(cell_inside,local_inside);
469 auto A_n = param.A(cell_outside,local_outside);
472 auto n_F =
ig.centerUnitOuterNormal();
473 Dune::FieldVector<RF,dim> An_F_s;
475 Dune::FieldVector<RF,dim> An_F_n;
479 std::vector<JacobianType> gradphi_s(lfsu_s.size());
480 std::vector<JacobianType> gradphi_n(lfsu_n.size());
481 std::vector<Dune::FieldVector<RF,dim> > tgradphi_s(lfsu_s.size());
482 std::vector<Dune::FieldVector<RF,dim> > tgradphi_n(lfsu_n.size());
483 Dune::FieldVector<RF,dim> gradu_s(0.0);
484 Dune::FieldVector<RF,dim> gradu_n(0.0);
487 typename IG::Entity::Geometry::JacobianInverseTransposed jac;
491 auto intorder = 2*lfsu_s.finiteElement().localBasis().order();
495 if (!Impl::permeabilityIsConstantPerCell<T>(param))
498 auto n_F_local =
ig.unitOuterNormal(ip.position());
500 A_s = param.A(cell_inside,geo_in_inside.global(ip.position()));
501 A_n = param.A(cell_outside,geo_in_outside.global(ip.position()));
502 A_s.mv(n_F_local,An_F_s);
503 A_n.mv(n_F_local,An_F_n);
507 auto iplocal_s = geo_in_inside.global(ip.position());
508 auto iplocal_n = geo_in_outside.global(ip.position());
511 lfsu_s.finiteElement().localBasis().evaluateJacobian(iplocal_s,gradphi_s);
512 lfsu_n.finiteElement().localBasis().evaluateJacobian(iplocal_n,gradphi_n);
515 jac = geo_inside.jacobianInverseTransposed(iplocal_s);
516 for (size_type i=0; i<lfsu_s.size(); i++) jac.mv(gradphi_s[i][0],tgradphi_s[i]);
517 jac = geo_outside.jacobianInverseTransposed(iplocal_n);
518 for (size_type i=0; i<lfsu_n.size(); i++) jac.mv(gradphi_n[i][0],tgradphi_n[i]);
522 for (size_type i=0; i<lfsu_s.size(); i++)
523 gradu_s.axpy(x_s(lfsu_s,i),tgradphi_s[i]);
525 for (size_type i=0; i<lfsu_n.size(); i++)
526 gradu_n.axpy(x_n(lfsu_n,i),tgradphi_n[i]);
529 auto factor = ip.weight() * geo.integrationElement(ip.position());
530 auto jump = (An_F_s*gradu_s)-(An_F_n*gradu_n);
531 sum += 0.25*jump*jump*factor;
536 auto h_T = std::max(diameter(geo_inside),diameter(geo_outside));
537 r_s.accumulate(lfsv_s,0,h_T*sum);
538 r_n.accumulate(lfsv_n,0,h_T*sum);
544 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
546 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
550 using RF =
typename LFSU::Traits::FiniteElementType::
551 Traits::LocalBasisType::Traits::RangeFieldType;
552 using JacobianType =
typename LFSU::Traits::FiniteElementType::
553 Traits::LocalBasisType::Traits::JacobianType;
554 using size_type =
typename LFSU::Traits::SizeType;
557 const int dim = IG::Entity::dimension;
560 const auto& cell_inside =
ig.inside();
563 auto geo =
ig.geometry();
564 auto geo_inside = cell_inside.geometry();
567 auto ref_el_inside = referenceElement(geo_inside);
568 auto local_inside = ref_el_inside.position(0,0);
569 auto A_s = param.A(cell_inside,local_inside);
572 auto n_F =
ig.centerUnitOuterNormal();
573 Dune::FieldVector<RF,dim> An_F_s;
577 auto geo_in_inside =
ig.geometryInInside();
580 auto ref_el_in_inside = referenceElement(geo_in_inside);
581 auto face_local = ref_el_in_inside.position(0,0);
582 auto bctype = param.bctype(
ig.intersection(),face_local);
587 std::vector<JacobianType> gradphi_s(lfsu_s.size());
588 std::vector<Dune::FieldVector<RF,dim> > tgradphi_s(lfsu_s.size());
589 Dune::FieldVector<RF,dim> gradu_s(0.0);
592 typename IG::Entity::Geometry::JacobianInverseTransposed jac;
596 auto intorder = 2*lfsu_s.finiteElement().localBasis().order();
600 if (!Impl::permeabilityIsConstantPerCell<T>(param))
603 auto n_F_local =
ig.unitOuterNormal(ip.position());
605 A_s = param.A(cell_inside,geo_in_inside.global(ip.position()));
606 A_s.mv(n_F_local,An_F_s);
610 auto iplocal_s = geo_in_inside.global(ip.position());
613 lfsu_s.finiteElement().localBasis().evaluateJacobian(iplocal_s,gradphi_s);
616 jac = geo_inside.jacobianInverseTransposed(iplocal_s);
617 for (size_type i=0; i<lfsu_s.size(); i++) jac.mv(gradphi_s[i][0],tgradphi_s[i]);
621 for (size_type i=0; i<lfsu_s.size(); i++)
622 gradu_s.axpy(x_s(lfsu_s,i),tgradphi_s[i]);
625 auto j = param.j(
ig.intersection(),ip.position());
628 auto factor = ip.weight() * geo.integrationElement(ip.position());
629 auto jump = j+(An_F_s*gradu_s);
630 sum += jump*jump*factor;
635 auto h_T = diameter(geo_inside);
636 r_s.accumulate(lfsv_s,0,h_T*sum);
643 typename GEO::ctype diameter (
const GEO& geo)
const
645 using DF =
typename GEO::ctype;
647 const int dim = GEO::coorddimension;
648 for (
int i=0; i<geo.corners(); i++)
650 Dune::FieldVector<DF,dim> xi = geo.corner(i);
651 for (
int j=i+1; j<geo.corners(); j++)
653 Dune::FieldVector<DF,dim> xj = geo.corner(j);
655 hmax = std::max(hmax,xj.two_norm());
684 enum { dim = T::Traits::GridViewType::dimension };
686 using Real =
typename T::Traits::RangeFieldType;
700 : param(param_), time(time_), dt(dt_), cmax(0)
704 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
705 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const
708 using RF =
typename LFSU::Traits::FiniteElementType::
709 Traits::LocalBasisType::Traits::RangeFieldType;
710 using RangeType =
typename LFSU::Traits::FiniteElementType::
711 Traits::LocalBasisType::Traits::RangeType;
712 using size_type =
typename LFSU::Traits::SizeType;
715 const auto& cell = eg.entity();
718 auto geo = eg.geometry();
721 std::vector<RangeType> phi(lfsu.size());
728 auto intorder = 2*lfsu.finiteElement().localBasis().order();
732 lfsu.finiteElement().localBasis().evaluateFunction(ip.position(),phi);
736 for (size_type i=0; i<lfsu.size(); i++)
737 u += x(lfsu,i)*phi[i];
740 auto factor = ip.weight() * geo.integrationElement(ip.position());
745 auto f_down = param.f(cell,ip.position());
746 param.setTime(time+0.5*dt);
747 auto f_mid = param.f(cell,ip.position());
748 param.setTime(time+dt);
749 auto f_up = param.f(cell,ip.position());
750 auto f_average = (1.0/6.0)*f_down + (2.0/3.0)*f_mid + (1.0/6.0)*f_up;
753 fsum_down += (f_down-f_average)*(f_down-f_average)*factor;
754 fsum_mid += (f_mid-f_average)*(f_mid-f_average)*factor;
755 fsum_up += (f_up-f_average)*(f_up-f_average)*factor;
759 auto h_T = diameter(geo);
760 r.accumulate(lfsv,0,(h_T*h_T/dt)*sum);
761 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) );
781 typename GEO::ctype diameter (
const GEO& geo)
const
783 using DF =
typename GEO::ctype;
785 const int dim = GEO::coorddimension;
786 for (
int i=0; i<geo.corners(); i++)
788 Dune::FieldVector<DF,dim> xi = geo.corner(i);
789 for (
int j=i+1; j<geo.corners(); j++)
791 Dune::FieldVector<DF,dim> xj = geo.corner(j);
793 hmax = std::max(hmax,xj.two_norm());
802 template<
typename T,
typename EG>
809 template<
typename X,
typename Y>
812 y[0] = t.f(eg.entity(),x);
840 enum { dim = T::Traits::GridViewType::dimension };
842 using Real =
typename T::Traits::RangeFieldType;
857 : param(param_), time(time_), dt(dt_)
861 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
862 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const
865 using RF =
typename LFSU::Traits::FiniteElementType::
866 Traits::LocalBasisType::Traits::RangeFieldType;
867 using RangeType =
typename LFSU::Traits::FiniteElementType::
868 Traits::LocalBasisType::Traits::RangeType;
869 using size_type =
typename LFSU::Traits::SizeType;
870 using JacobianType =
typename LFSU::Traits::FiniteElementType::
871 Traits::LocalBasisType::Traits::JacobianType;
874 const int dim = EG::Geometry::mydimension;
877 auto geo = eg.geometry();
881 std::vector<RF> f_up, f_down, f_mid;
883 lfsu.finiteElement().localInterpolation().interpolate(f_adapter,f_down);
884 param.setTime(time+0.5*dt);
885 lfsu.finiteElement().localInterpolation().interpolate(f_adapter,f_mid);
886 param.setTime(time+dt);
887 lfsu.finiteElement().localInterpolation().interpolate(f_adapter,f_up);
890 std::vector<JacobianType> js(lfsu.size());
891 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
892 Dune::FieldVector<RF,dim> gradu(0.0);
893 Dune::FieldVector<RF,dim> gradf_down(0.0);
894 Dune::FieldVector<RF,dim> gradf_mid(0.0);
895 Dune::FieldVector<RF,dim> gradf_up(0.0);
896 Dune::FieldVector<RF,dim> gradf_average(0.0);
899 typename EG::Geometry::JacobianInverseTransposed jac;
904 RF fsum_grad_up(0.0);
905 RF fsum_grad_mid(0.0);
906 RF fsum_grad_down(0.0);
907 auto intorder = 2*lfsu.finiteElement().localBasis().order();
911 std::vector<RangeType> phi(lfsu.size());
912 lfsu.finiteElement().localBasis().evaluateFunction(ip.position(),phi);
916 for (size_type i=0; i<lfsu.size(); i++)
917 u += x(lfsu,i)*phi[i];
920 auto factor = ip.weight() * geo.integrationElement(ip.position());
924 lfsu.finiteElement().localBasis().evaluateJacobian(ip.position(),js);
927 jac = geo.jacobianInverseTransposed(ip.position());
928 for (size_type i=0; i<lfsu.size(); i++)
929 jac.mv(js[i][0],gradphi[i]);
933 for (size_type i=0; i<lfsu.size(); i++)
934 gradu.axpy(x(lfsu,i),gradphi[i]);
937 sum_grad += (gradu*gradu)*factor;
941 for (size_type i=0; i<lfsu.size(); i++) gradf_down.axpy(f_down[i],gradphi[i]);
943 for (size_type i=0; i<lfsu.size(); i++) gradf_mid.axpy(f_mid[i],gradphi[i]);
945 for (size_type i=0; i<lfsu.size(); i++) gradf_up.axpy(f_up[i],gradphi[i]);
947 for (size_type i=0; i<lfsu.size(); i++)
948 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]);
951 gradf_down -= gradf_average;
952 fsum_grad_down += (gradf_down*gradf_down)*factor;
953 gradf_mid -= gradf_average;
954 fsum_grad_mid += (gradf_mid*gradf_mid)*factor;
955 gradf_up -= gradf_average;
956 fsum_grad_up += (gradf_up*gradf_up)*factor;
960 auto h_T = diameter(geo);
961 r.accumulate(lfsv,0,dt * sum_grad);
962 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));
967 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
969 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
973 using RF =
typename LFSU::Traits::FiniteElementType::
974 Traits::LocalBasisType::Traits::RangeFieldType;
977 const auto& cell_inside =
ig.inside();
980 auto geo =
ig.geometry();
981 auto geo_inside = cell_inside.geometry();
984 auto geo_in_inside =
ig.geometryInInside();
987 auto ref_el_in_inside = referenceElement(geo_in_inside);
988 auto face_local = ref_el_in_inside.position(0,0);
989 auto bctype = param.bctype(
ig.intersection(),face_local);
996 const int intorder = 2*lfsu_s.finiteElement().localBasis().order();
1000 param.setTime(time);
1001 auto j_down = param.j(
ig.intersection(),ip.position());
1002 param.setTime(time+0.5*dt);
1003 auto j_mid = param.j(
ig.intersection(),ip.position());
1004 param.setTime(time+dt);
1005 auto j_up = param.j(
ig.intersection(),ip.position());
1008 auto factor = ip.weight() * geo.integrationElement(ip.position());
1009 sum_down += (j_down-j_mid)*(j_down-j_mid)*factor;
1010 sum_up += (j_up-j_mid)*(j_up-j_mid)*factor;
1015 auto h_T = diameter(geo_inside);
1016 r_s.accumulate(lfsv_s,0,(h_T+dt*dt/h_T)*dt*0.5*(sum_down+sum_up));
1025 typename GEO::ctype diameter (
const GEO& geo)
const
1027 using DF =
typename GEO::ctype;
1029 const int dim = GEO::coorddimension;
1030 for (
int i=0; i<geo.corners(); i++)
1032 Dune::FieldVector<DF,dim> xi = geo.corner(i);
1033 for (
int j=i+1; j<geo.corners(); j++)
1035 Dune::FieldVector<DF,dim> xj = geo.corner(j);
1037 hmax = std::max(hmax,xj.two_norm());
static const int dim
Definition: adaptivity.hh:84
const IG & ig
Definition: constraints.hh:149
For backward compatibility – Do not use this!
Definition: adaptivity.hh:28
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
store values of basis functions and gradients in a cache
Definition: localbasiscache.hh:18
Definition: convectiondiffusionfem.hh:47
@ doPatternVolume
Definition: convectiondiffusionfem.hh:50
@ doAlphaBoundary
Definition: convectiondiffusionfem.hh:54
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:207
void setTime(double t)
set time in parameter class
Definition: convectiondiffusionfem.hh:329
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, M &mat) const
Definition: convectiondiffusionfem.hh:140
@ doAlphaVolume
Definition: convectiondiffusionfem.hh:53
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:63
ConvectionDiffusionFEM(T ¶m_, int intorderadd_=0)
Definition: convectiondiffusionfem.hh:56
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:279
Definition: convectiondiffusionfem.hh:361
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:384
@ doAlphaBoundary
Definition: convectiondiffusionfem.hh:375
ConvectionDiffusionFEMResidualEstimator(T ¶m_)
constructor: pass parameter object
Definition: convectiondiffusionfem.hh:378
@ doPatternVolume
Definition: convectiondiffusionfem.hh:369
@ doAlphaVolume
Definition: convectiondiffusionfem.hh:373
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:545
@ doPatternSkeleton
Definition: convectiondiffusionfem.hh:370
@ doAlphaSkeleton
Definition: convectiondiffusionfem.hh:374
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:435
Definition: convectiondiffusionfem.hh:683
void clearCmax()
Definition: convectiondiffusionfem.hh:764
@ doAlphaVolume
Definition: convectiondiffusionfem.hh:695
double getCmax() const
Definition: convectiondiffusionfem.hh:769
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:705
@ doPatternVolume
Definition: convectiondiffusionfem.hh:691
@ doPatternSkeleton
Definition: convectiondiffusionfem.hh:692
ConvectionDiffusionTemporalResidualEstimator1(T ¶m_, double time_, double dt_)
constructor: pass parameter object
Definition: convectiondiffusionfem.hh:699
Definition: convectiondiffusionfem.hh:804
CD_RHS_LocalAdapter(const T &t_, const EG &eg_)
Definition: convectiondiffusionfem.hh:806
void evaluate(const X &x, Y &y) const
Definition: convectiondiffusionfem.hh:810
Definition: convectiondiffusionfem.hh:839
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: convectiondiffusionfem.hh:862
@ doAlphaBoundary
Definition: convectiondiffusionfem.hh:852
@ doPatternVolume
Definition: convectiondiffusionfem.hh:847
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:968
@ doPatternSkeleton
Definition: convectiondiffusionfem.hh:848
@ doAlphaVolume
Definition: convectiondiffusionfem.hh:851
ConvectionDiffusionTemporalResidualEstimator(T ¶m_, double time_, double dt_)
constructor: pass parameter object
Definition: convectiondiffusionfem.hh:856
Type
Definition: convectiondiffusionparameter.hh:113
@ Neumann
Definition: convectiondiffusionparameter.hh:113
@ Outflow
Definition: convectiondiffusionparameter.hh:113
@ Dirichlet
Definition: convectiondiffusionparameter.hh:113
Default flags for all local operators.
Definition: flags.hh:19
Default class for additional methods in instationary local operators.
Definition: idefault.hh:90
Implement jacobian_volume() based on alpha_volume()
Definition: numericaljacobian.hh:32
Implement jacobian_boundary() based on alpha_boundary()
Definition: numericaljacobian.hh:251
Implements linear and nonlinear versions of jacobian_apply_volume() based on alpha_volume()
Definition: numericaljacobianapply.hh:34
Implements linear and nonlinear versions of jacobian_apply_boundary() based on alpha_boundary()
Definition: numericaljacobianapply.hh:287
sparsity pattern generator
Definition: pattern.hh:14