2 #ifndef DUNE_PDELAB_DIFFUSION_HH 3 #define DUNE_PDELAB_DIFFUSION_HH 4 #warning This file is deprecated and will be removed after the Dune-PDELab 2.4 release! Use the ConvectionDiffusionFEM local operator from dune/pdelab/localoperator/convectiondiffusionfem.hh instead! 8 #include<dune/common/exceptions.hh> 9 #include<dune/common/fvector.hh> 10 #include<dune/geometry/type.hh> 11 #include<dune/geometry/referenceelements.hh> 12 #include<dune/geometry/quadraturerules.hh> 38 template<
typename K,
typename A0,
typename F,
typename B,
typename J>
54 DUNE_DEPRECATED_MSG(
"Deprecated in Dune-PDELab 2.4, use the local operator ConvectionDiffusionFEM instead!")
55 Diffusion (const K& k_, const A0& a0_, const F& f_, const B& bctype_, const J& j_,
int intorder_=2)
56 : k(k_), a0(a0_), f(f_), bctype(bctype_), j(j_), intorder(intorder_)
60 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
61 void alpha_volume (
const EG& eg,
const LFSU& lfsu,
const X& x,
const LFSV& lfsv, R& r)
const 64 typedef typename LFSU::Traits::FiniteElementType::
65 Traits::LocalBasisType::Traits::DomainFieldType DF;
66 typedef typename LFSU::Traits::FiniteElementType::
67 Traits::LocalBasisType::Traits::RangeFieldType RF;
68 typedef typename LFSU::Traits::FiniteElementType::
69 Traits::LocalBasisType::Traits::JacobianType JacobianType;
70 typedef typename LFSU::Traits::FiniteElementType::
71 Traits::LocalBasisType::Traits::RangeType RangeType;
73 typedef typename LFSU::Traits::SizeType size_type;
76 const int dim = EG::Geometry::dimension;
79 Dune::GeometryType gt = eg.geometry().type();
80 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
83 typename K::Traits::RangeType tensor(0.0);
84 Dune::FieldVector<DF,dim> localcenter = Dune::ReferenceElements<DF,dim>::general(gt).position(0,0);
85 k.evaluate(eg.entity(),localcenter,tensor);
88 for (
typename Dune::QuadratureRule<DF,dim>::const_iterator it=rule.begin(); it!=rule.end(); ++it)
91 std::vector<JacobianType> js(lfsu.size());
92 lfsu.finiteElement().localBasis().evaluateJacobian(it->position(),js);
95 const typename EG::Geometry::JacobianInverseTransposed jac =
96 eg.geometry().jacobianInverseTransposed(it->position());
97 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
98 for (size_type i=0; i<lfsu.size(); i++)
101 jac.umv(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[i],gradphi[i]);
110 Dune::FieldVector<RF,dim> Kgradu(0.0);
111 tensor.umv(gradu,Kgradu);
114 std::vector<RangeType> phi(lfsu.size());
115 lfsu.finiteElement().localBasis().evaluateFunction(it->position(),phi);
119 for (size_type i=0; i<lfsu.size(); i++)
123 typename A0::Traits::RangeType y;
124 a0.evaluate(eg.entity(),it->position(),y);
127 RF factor = it->weight() * eg.geometry().integrationElement(it->position());
128 for (size_type i=0; i<lfsu.size(); i++)
129 r[i] += ( Kgradu*gradphi[i] + y*u*phi[i] )*factor;
134 template<
typename EG,
typename LFSU,
typename X,
typename LFSV,
typename R>
139 typedef typename LFSU::Traits::FiniteElementType::
140 Traits::LocalBasisType::Traits::DomainFieldType DF;
141 typedef typename LFSU::Traits::FiniteElementType::
142 Traits::LocalBasisType::Traits::RangeFieldType RF;
143 typedef typename LFSU::Traits::FiniteElementType::
144 Traits::LocalBasisType::Traits::JacobianType JacobianType;
145 typedef typename LFSU::Traits::FiniteElementType::
146 Traits::LocalBasisType::Traits::RangeType RangeType;
147 typedef typename LFSU::Traits::SizeType size_type;
150 const int dim = EG::Geometry::dimension;
153 Dune::GeometryType gt = eg.geometry().type();
154 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
157 typename K::Traits::RangeType tensor(0.0);
158 Dune::FieldVector<DF,dim> localcenter = Dune::ReferenceElements<DF,dim>::general(gt).position(0,0);
159 k.evaluate(eg.entity(),localcenter,tensor);
162 for (
typename Dune::QuadratureRule<DF,dim>::const_iterator it=rule.begin(); it!=rule.end(); ++it)
165 std::vector<JacobianType> js(lfsu.size());
166 lfsu.finiteElement().localBasis().evaluateJacobian(it->position(),js);
169 const typename EG::Geometry::JacobianInverseTransposed jac =
170 eg.geometry().jacobianInverseTransposed(it->position());
171 std::vector<Dune::FieldVector<RF,dim> > gradphi(lfsu.size());
172 for (size_type i=0; i<lfsu.size(); i++)
175 jac.umv(js[i][0],gradphi[i]);
179 std::vector<Dune::FieldVector<RF,dim> > Kgradphi(lfsu.size());
180 for (size_type i=0; i<lfsu.size(); i++)
181 tensor.mv(gradphi[i],Kgradphi[i]);
184 std::vector<RangeType> phi(lfsu.size());
185 lfsu.finiteElement().localBasis().evaluateFunction(it->position(),phi);
188 typename A0::Traits::RangeType y;
189 a0.evaluate(eg.entity(),it->position(),y);
192 RF factor = it->weight() * eg.geometry().integrationElement(it->position());
193 for (size_type j=0; j<lfsu.size(); j++)
194 for (size_type i=0; i<lfsu.size(); i++)
195 mat(i,j) += ( Kgradphi[j]*gradphi[i] + y*phi[j]*phi[i] )*factor;
200 template<
typename EG,
typename LFSV,
typename R>
204 typedef typename LFSV::Traits::FiniteElementType::
205 Traits::LocalBasisType::Traits::DomainFieldType DF;
206 typedef typename LFSV::Traits::FiniteElementType::
207 Traits::LocalBasisType::Traits::RangeFieldType RF;
208 typedef typename LFSV::Traits::FiniteElementType::
209 Traits::LocalBasisType::Traits::RangeType RangeType;
211 typedef typename LFSV::Traits::SizeType size_type;
214 const int dim = EG::Geometry::dimension;
217 Dune::GeometryType gt = eg.geometry().type();
218 const Dune::QuadratureRule<DF,dim>& rule = Dune::QuadratureRules<DF,dim>::rule(gt,intorder);
221 for (
typename Dune::QuadratureRule<DF,dim>::const_iterator it=rule.begin(); it!=rule.end(); ++it)
224 std::vector<RangeType> phi(lfsv.size());
225 lfsv.finiteElement().localBasis().evaluateFunction(it->position(),phi);
228 typename F::Traits::RangeType y;
229 f.evaluate(eg.entity(),it->position(),y);
232 RF factor = it->weight() * eg.geometry().integrationElement(it->position());
233 for (size_type i=0; i<lfsv.size(); i++)
234 r[i] -= y*phi[i]*factor;
239 template<
typename IG,
typename LFSV,
typename R>
243 typedef typename LFSV::Traits::FiniteElementType::
244 Traits::LocalBasisType::Traits::DomainFieldType DF;
245 typedef typename LFSV::Traits::FiniteElementType::
246 Traits::LocalBasisType::Traits::RangeFieldType RF;
247 typedef typename LFSV::Traits::FiniteElementType::
248 Traits::LocalBasisType::Traits::RangeType RangeType;
250 typedef typename LFSV::Traits::SizeType size_type;
253 const int dim = IG::dimension;
256 Dune::GeometryType gtface = ig.geometryInInside().type();
257 const Dune::QuadratureRule<DF,dim-1>& rule = Dune::QuadratureRules<DF,dim-1>::rule(gtface,intorder);
260 for (
typename Dune::QuadratureRule<DF,dim-1>::const_iterator it=rule.begin(); it!=rule.end(); ++it)
264 if( bctype.isDirichlet( ig,it->position() ) )
268 Dune::FieldVector<DF,dim> local = ig.geometryInInside().global(it->position());
271 std::vector<RangeType> phi(lfsv.size());
272 lfsv.finiteElement().localBasis().evaluateFunction(local,phi);
275 typename J::Traits::RangeType y;
276 j.evaluate(*(ig.inside()),local,y);
279 RF factor = it->weight()*ig.geometry().integrationElement(it->position());
280 for (size_type i=0; i<lfsv.size(); i++)
281 r[i] += y*phi[i]*factor;
sparsity pattern generator
Definition: pattern.hh:13
const IG & ig
Definition: constraints.hh:148
static const int dim
Definition: adaptivity.hh:83
Definition: adaptivity.hh:27
Default flags for all local operators.
Definition: flags.hh:18
void lambda_boundary(const IG &ig, const LFSV &lfsv, R &r) const
Definition: diffusion.hh:240
Default class for additional methods in instationary local operators.
Definition: idefault.hh:89
Definition: diffusion.hh:51
Definition: diffusion.hh:47
void lambda_volume(const EG &eg, const LFSV &lfsv, R &r) const
Definition: diffusion.hh:201
void alpha_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, R &r) const
Definition: diffusion.hh:61
Implements linear and nonlinear versions of jacobian_apply_volume() based on alpha_volume() ...
Definition: numericaljacobianapply.hh:32
void jacobian_volume(const EG &eg, const LFSU &lfsu, const X &x, const LFSV &lfsv, LocalMatrix< R > &mat) const
Definition: diffusion.hh:135
Definition: diffusion.hh:50
Definition: diffusion.hh:52
Definition: diffusion.hh:39