2 #ifndef DUNE_PDELAB_DIFFUSIONCCFV_HH 3 #define DUNE_PDELAB_DIFFUSIONCCFV_HH 4 #warning "The file dune/pdelab/localoperator/diffusionccfv.hh is deprecated. Please use the ConvectionDiffusionCCFV local operator from dune/pdelab/localoperator/convectiondiffusionccfv.hh instead." 6 #include<dune/common/deprecated.hh> 7 #include<dune/common/exceptions.hh> 8 #include<dune/common/fvector.hh> 9 #include<dune/geometry/referenceelements.hh> 31 template<
typename K,
typename A0,
typename F,
typename B,
typename J,
typename G>
45 enum { doPatternVolume =
true };
46 enum { doPatternSkeleton =
true };
49 enum { doAlphaVolume =
true };
50 enum { doAlphaSkeleton =
true };
51 enum { doAlphaBoundary =
true };
52 enum { doLambdaVolume =
false };
53 enum { doLambdaSkeleton =
false };
54 enum { doLambdaBoundary =
false };
56 DUNE_DEPRECATED_MSG(
"Deprecated in DUNE-PDELab 2.4, use the local operator ConvectionDiffusionCCFV instead!")
57 DiffusionCCFV (const K& k_, const A0& a0_, const F& f_, const B& b_, const J& j_, const G& g_)
58 : k(k_), a0(a0_), f(f_), b(b_), j(j_), g(g_)
63 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
64 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 67 typedef typename LFSU::Traits::FiniteElementType::
68 Traits::LocalBasisType::Traits::DomainFieldType DF;
71 const int dim = EG::Geometry::dimension;
74 const Dune::FieldVector<DF,dim>&
75 inside_local = Dune::ReferenceElements<DF,dim>::general(eg.entity().type()).position(0,0);
78 typename A0::Traits::RangeType a0value;
79 a0.evaluate(eg.entity(),inside_local,a0value);
81 r.accumulate(lfsu,0,a0value*x(lfsu,0)*eg.geometry().volume());
84 typename F::Traits::RangeType fvalue;
85 f.evaluate(eg.entity(),inside_local,fvalue);
87 r.accumulate(lfsu,0,-fvalue*eg.geometry().volume());
92 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
94 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
95 const LFSU& lfsu_n,
const X& x_n,
const LFSV& lfsv_n,
99 typedef typename LFSU::Traits::FiniteElementType::
100 Traits::LocalBasisType::Traits::DomainFieldType DF;
101 typedef typename LFSU::Traits::FiniteElementType::
102 Traits::LocalBasisType::Traits::RangeFieldType RF;
105 const Dune::FieldVector<DF,IG::dimension-1>&
106 face_local = Dune::ReferenceElements<DF,IG::dimension-1>::general(ig.geometry().type()).position(0,0);
109 RF face_volume = ig.geometry().integrationElement(face_local)
110 *Dune::ReferenceElements<DF,IG::dimension-1>::general(ig.geometry().type()).volume();
112 auto cell_inside = ig.inside();
113 auto cell_outside = ig.outside();
116 const Dune::FieldVector<DF,IG::dimension>&
117 inside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_inside.type()).position(0,0);
118 const Dune::FieldVector<DF,IG::dimension>&
119 outside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_outside.type()).position(0,0);
122 typename K::Traits::RangeType k_inside, k_outside;
123 k.evaluate(cell_inside,inside_local,k_inside);
124 k.evaluate(cell_outside,outside_local,k_outside);
125 typename K::Traits::RangeType k_avg = 2.0/(1.0/(k_inside+1E-30) + 1.0/(k_outside+1E-30));
128 Dune::FieldVector<DF,IG::dimension>
129 inside_global = cell_inside.geometry().global(inside_local);
130 Dune::FieldVector<DF,IG::dimension>
131 outside_global = cell_outside.geometry().global(outside_local);
134 inside_global -= outside_global;
135 RF distance = inside_global.two_norm();
138 r_s.accumulate(lfsu_s,0,k_avg*(x_s(lfsu_s,0)-x_n(lfsu_n,0))*face_volume/distance);
139 r_n.accumulate(lfsu_n,0,-k_avg*(x_s(lfsu_s,0)-x_n(lfsu_n,0))*face_volume/distance);
144 template<
typename IG,
typename LFSU,
typename X,
typename LFSV,
typename R>
146 const LFSU& lfsu_s,
const X& x_s,
const LFSV& lfsv_s,
150 typedef typename LFSU::Traits::FiniteElementType::
151 Traits::LocalBasisType::Traits::DomainFieldType DF;
152 typedef typename LFSU::Traits::FiniteElementType::
153 Traits::LocalBasisType::Traits::RangeFieldType RF;
156 const Dune::FieldVector<DF,IG::dimension-1>&
157 face_local = Dune::ReferenceElements<DF,IG::dimension-1>::general(ig.geometry().type()).position(0,0);
160 RF face_volume = ig.geometry().integrationElement(face_local)
161 *Dune::ReferenceElements<DF,IG::dimension-1>::general(ig.geometry().type()).volume();
163 auto cell_inside = ig.inside();
166 const Dune::FieldVector<DF,IG::dimension>&
167 inside_local = Dune::ReferenceElements<DF,IG::dimension>::general(cell_inside.type()).position(0,0);
170 typename B::Traits::RangeType bctype;
171 b.evaluate(ig,face_local,bctype);
177 Dune::FieldVector<DF,IG::dimension>
178 inside_global = cell_inside.geometry().global(inside_local);
179 Dune::FieldVector<DF,IG::dimension>
180 outside_global = ig.geometry().global(face_local);
181 inside_global -= outside_global;
182 RF distance = inside_global.two_norm();
185 typename K::Traits::RangeType k_inside;
186 k.evaluate(cell_inside,inside_local,k_inside);
189 typename G::Traits::DomainType x = ig.geometryInInside().global(face_local);
190 typename G::Traits::RangeType y;
191 g.evaluate(cell_inside,x,y);
194 r_s.accumulate(lfsu_s,0,k_inside*(x_s(lfsu_s,0)-y[0])*face_volume/distance);
202 typename J::Traits::DomainType x = ig.geometryInInside().global(face_local);
203 typename J::Traits::RangeType jvalue;
204 j.evaluate(cell_inside,x,jvalue);
207 r_s.accumulate(lfsu_s,0,jvalue*face_volume);
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: diffusionccfv.hh:64
sparsity pattern generator
Definition: pattern.hh:13
Implements linear and nonlinear versions of jacobian_apply_skeleton() based on alpha_skeleton() ...
Definition: numericaljacobianapply.hh:180
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
Definition: adaptivity.hh:27
Definition: diffusionccfv.hh:32
static bool isDirichlet(Type i)
Test for Dirichlet boundary condition.
Definition: diffusionparam.hh:28
sparsity pattern generator
Definition: pattern.hh:29
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_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: diffusionccfv.hh:93
Implement jacobian_volume() based on alpha_volume()
Definition: numericaljacobian.hh:31
void alpha_boundary(const IG &ig, const LFSU &lfsu_s, const X &x_s, const LFSV &lfsv_s, R &r_s) const
Definition: diffusionccfv.hh:145
Definition: convectiondiffusionccfv.hh:38
Implements linear and nonlinear versions of jacobian_apply_volume() based on alpha_volume() ...
Definition: numericaljacobianapply.hh:32
Implement jacobian_skeleton() based on alpha_skeleton()
Definition: numericaljacobian.hh:156