6#ifndef DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_BASIS_HH
7#define DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_BASIS_HH
12#include <dune/common/fmatrix.hh>
13#include <dune/common/fvector.hh>
35 template<
class Geometry,
class RF>
37 private EdgeS0_5Common<Geometry::mydimension, typename Geometry::ctype>
50 typedef FieldVector<RangeField, dimRange>
Range;
52 typedef FieldMatrix<RangeField, dimRange, dimDomainGlobal>
Jacobian;
63 static const P1LocalBasis& p1LocalBasis;
71 std::vector<typename P1Basis::Traits::Jacobian> p1j;
73 std::vector<typename Traits::DomainField> edgel;
83 template<
typename VertexOrder>
94 for(std::size_t i = 0; i < s; ++i) {
95 edgel[i] = (geo.corner(refelem.subEntity(i,dim-1,0,dim))-
96 geo.corner(refelem.subEntity(i,dim-1,1,dim))
98 const typename VertexOrder::iterator& edgeVertexOrder =
99 vertexOrder.begin(dim-1, i);
100 if(edgeVertexOrder[0] > edgeVertexOrder[1])
106 std::size_t
size ()
const {
return s; }
110 std::vector<typename Traits::Range>& out)
const
116 std::vector<typename P1LocalBasis::Traits::RangeType> p1v;
117 p1LocalBasis.evaluateFunction(xl, p1v);
119 for(std::size_t i = 0; i < s; i++) {
120 const std::size_t i0 = refelem.subEntity(i,dim-1,0,dim);
121 const std::size_t i1 = refelem.subEntity(i,dim-1,1,dim);
122 out[i].axpy( p1v[i0], p1j[i1][0]);
123 out[i].axpy(-p1v[i1], p1j[i0][0]);
130 std::vector<typename Traits::Jacobian>& out)
const
134 for(std::size_t i = 0; i < s; i++) {
135 const std::size_t i0 = refelem.subEntity(i,dim-1,0,dim);
136 const std::size_t i1 = refelem.subEntity(i,dim-1,1,dim);
137 for(std::size_t j = 0; j < dim; j++)
138 for(std::size_t k = 0; k < dim; k++)
139 out[i][j][k] = edgel[i] *
140 (p1j[i0][0][k]*p1j[i1][0][j]-p1j[i1][0][k]*p1j[i0][0][j]);
147 std::vector<typename Traits::Range>& out)
const
149 auto totalOrder = std::accumulate(
order.begin(),
order.end(), 0);
150 if (totalOrder == 0) {
152 }
else if (totalOrder==1) {
153 auto const k = std::distance(
order.begin(), std::find(
order.begin(),
order.end(), 1));
156 for (std::size_t i = 0; i < s; i++)
158 const std::size_t i0 = refelem.subEntity(i,dim-1,0,dim);
159 const std::size_t i1 = refelem.subEntity(i,dim-1,1,dim);
160 for(std::size_t j = 0; j < dim; j++)
161 out[i][j] = edgel[i] *
162 (p1j[i0][0][k]*p1j[i1][0][j] - p1j[i1][0][k]*p1j[i0][0][j]);
165 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
170 std::size_t
order ()
const {
return 1; }
173 template<
class Geometry,
class RF>
174 const typename EdgeS0_5Basis<Geometry, RF>::P1LocalBasis&
175 EdgeS0_5Basis<Geometry, RF>::p1LocalBasis = P1LocalBasis();
Definition bdfmcube.hh:18
Convert a simple scalar local basis into a global basis.
Definition localtoglobaladaptors.hh:65
void evaluateJacobian(const typename Traits::DomainLocal &in, std::vector< typename Traits::Jacobian > &out) const
Definition localtoglobaladaptors.hh:125
Basis for order 0.5 (lowest order) edge elements on simplices.
Definition whitney/edges0.5/basis.hh:38
EdgeS0_5Basis(const Geometry &geo, const VertexOrder &vertexOrder)
Construct an EdgeS0_5Basis.
Definition whitney/edges0.5/basis.hh:84
void evaluateJacobian(const typename Traits::DomainLocal &, std::vector< typename Traits::Jacobian > &out) const
Evaluate all Jacobians.
Definition whitney/edges0.5/basis.hh:129
void evaluateFunction(const typename Traits::DomainLocal &xl, std::vector< typename Traits::Range > &out) const
Evaluate all shape functions.
Definition whitney/edges0.5/basis.hh:109
std::size_t size() const
number of shape functions
Definition whitney/edges0.5/basis.hh:106
void partial(const std::array< unsigned int, dim > &order, const typename Traits::DomainLocal &in, std::vector< typename Traits::Range > &out) const
Evaluate partial derivatives of all shape functions.
Definition whitney/edges0.5/basis.hh:145
std::size_t order() const
Polynomial order of the shape functions.
Definition whitney/edges0.5/basis.hh:170
export type traits for function signature
Definition whitney/edges0.5/basis.hh:41
FieldVector< DomainField, dimDomainGlobal > DomainGlobal
Definition whitney/edges0.5/basis.hh:46
static const std::size_t dimRange
Definition whitney/edges0.5/basis.hh:49
static const std::size_t dimDomainLocal
Definition whitney/edges0.5/basis.hh:43
FieldMatrix< RangeField, dimRange, dimDomainGlobal > Jacobian
Definition whitney/edges0.5/basis.hh:52
static const std::size_t dimDomainGlobal
Definition whitney/edges0.5/basis.hh:44
RF RangeField
Definition whitney/edges0.5/basis.hh:48
FieldVector< DomainField, dimDomainLocal > DomainLocal
Definition whitney/edges0.5/basis.hh:45
FieldVector< RangeField, dimRange > Range
Definition whitney/edges0.5/basis.hh:50
Geometry::ctype DomainField
Definition whitney/edges0.5/basis.hh:42
Common base class for edge elements.
Definition common.hh:23
RefElem refelem
The reference element for this edge element.
Definition common.hh:30
std::size_t s
The number of base functions.
Definition common.hh:38