4 #ifndef DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_BASIS_HH
5 #define DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_BASIS_HH
10 #include <dune/common/fmatrix.hh>
11 #include <dune/common/fvector.hh>
33 template<
class Geometry,
class RF>
35 private EdgeS0_5Common<Geometry::mydimension, typename Geometry::ctype>
48 typedef FieldVector<RangeField, dimRange>
Range;
50 typedef FieldMatrix<RangeField, dimRange, dimDomainGlobal>
Jacobian;
68 std::vector<typename P1Basis::Traits::Jacobian> p1j;
70 std::vector<typename Traits::DomainField> edgel;
80 template<
typename VertexOrder>
91 for(std::size_t i = 0; i <
s; ++i) {
92 edgel[i] = (geo.corner(
refelem.subEntity(i,dim-1,0,dim))-
93 geo.corner(
refelem.subEntity(i,dim-1,1,dim))
95 const typename VertexOrder::iterator& edgeVertexOrder =
96 vertexOrder.begin(dim-1, i);
97 if(edgeVertexOrder[0] > edgeVertexOrder[1])
103 std::size_t
size ()
const {
return s; }
107 std::vector<typename Traits::Range>& out)
const
113 std::vector<typename P1LocalBasis::Traits::RangeType> p1v;
116 for(std::size_t i = 0; i <
s; i++) {
117 const std::size_t i0 =
refelem.subEntity(i,dim-1,0,dim);
118 const std::size_t i1 =
refelem.subEntity(i,dim-1,1,dim);
119 out[i].axpy( p1v[i0], p1j[i1][0]);
120 out[i].axpy(-p1v[i1], p1j[i0][0]);
127 std::vector<typename Traits::Jacobian>& out)
const
131 for(std::size_t i = 0; i <
s; i++) {
132 const std::size_t i0 =
refelem.subEntity(i,dim-1,0,dim);
133 const std::size_t i1 =
refelem.subEntity(i,dim-1,1,dim);
134 for(std::size_t j = 0; j < dim; j++)
135 for(std::size_t k = 0; k < dim; k++)
136 out[i][j][k] = edgel[i] *
137 (p1j[i0][0][k]*p1j[i1][0][j]-p1j[i1][0][k]*p1j[i0][0][j]);
144 std::vector<typename Traits::Range>& out)
const
146 auto totalOrder = std::accumulate(
order.begin(),
order.end(), 0);
147 if (totalOrder == 0) {
149 }
else if (totalOrder==1) {
150 auto const k = std::distance(
order.begin(), std::find(
order.begin(),
order.end(), 1));
153 for (std::size_t i = 0; i <
s; i++)
155 const std::size_t i0 =
refelem.subEntity(i,dim-1,0,dim);
156 const std::size_t i1 =
refelem.subEntity(i,dim-1,1,dim);
157 for(std::size_t j = 0; j < dim; j++)
158 out[i][j] = edgel[i] *
159 (p1j[i0][0][k]*p1j[i1][0][j] - p1j[i1][0][k]*p1j[i0][0][j]);
162 DUNE_THROW(NotImplemented,
"Desired derivative order is not implemented");
167 std::size_t
order ()
const {
return 1; }
170 template<
class Geometry,
class RF>
171 const typename EdgeS0_5Basis<Geometry, RF>::P1LocalBasis&
172 EdgeS0_5Basis<Geometry, RF>::p1LocalBasis = P1LocalBasis();
176 #endif // DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_BASIS_HH