dune-localfunctions 2.12-git
Loading...
Searching...
No Matches
crouzeixraviart.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5#ifndef DUNE_LOCALFUNCTIONS_CROUZEIXRAVIART_HH
6#define DUNE_LOCALFUNCTIONS_CROUZEIXRAVIART_HH
7
8#include <array>
9#include <numeric>
10
13
14#include <dune/geometry/type.hh>
16
21
22namespace Dune { namespace Impl
23{
30 template<class D, class R, unsigned int dim>
31 class CrouzeixRaviartLocalBasis
32 {
33 public:
34 using Traits = LocalBasisTraits<D,dim,FieldVector<D,dim>,R,1,FieldVector<R,1>,FieldMatrix<R,1,dim> >;
35
38 static constexpr unsigned int size ()
39 {
40 return dim+1;
41 }
42
44 void evaluateFunction(const typename Traits::DomainType& x,
46 {
47 out.resize(size());
48
49 std::fill(out.begin(), out.end()-1, 1.0);
50 out.back() = 1.0-dim;
51
52 for (unsigned int i=0; i<dim; i++)
53 {
54 out[i] -= dim * x[dim-i-1];
55 out.back() += dim*x[i];
56 }
57 }
58
64 void evaluateJacobian(const typename Traits::DomainType& x,
66 {
67 out.resize(size());
68
69 for (unsigned i=0; i<dim; i++)
70 for (unsigned j=0; j<dim; j++)
71 out[i][0][j] = (i==(dim-1-j)) ? -(double)dim : 0;
72
73 std::fill(out.back()[0].begin(), out.back()[0].end(), dim);
74 }
75
82 void partial(const std::array<unsigned int,dim>& order,
83 const typename Traits::DomainType& in,
85 {
86 auto totalOrder = std::accumulate(order.begin(), order.end(), 0);
87
88 out.resize(size());
89
90 if (totalOrder == 0) {
91 evaluateFunction(in, out);
92 return;
93 }
94
95 if (totalOrder==1)
96 {
97 auto direction = std::find(order.begin(), order.end(), 1)-order.begin();
98
99 for (unsigned int i=0; i<dim; i++)
100 out[i] = (i==(dim-1-direction)) ? -(double)dim : 0.0;
101
102 out.back()[0] = dim;
103 }
104 else // all higher order derivatives are zero
105 std::fill(out.begin(), out.end(), 0);
106 }
107
109 static constexpr unsigned int order ()
110 {
111 return 1;
112 }
113 };
114
119 template<unsigned int dim>
120 class CrouzeixRaviartLocalCoefficients
121 {
122 public:
124 CrouzeixRaviartLocalCoefficients ()
125 : localKeys_(size())
126 {
127 for (std::size_t i=0; i<size(); i++)
128 localKeys_[i] = LocalKey(i,1,0);
129 }
130
132 static constexpr std::size_t size ()
133 {
134 return dim+1;
135 }
136
138 const LocalKey& localKey (std::size_t i) const
139 {
140 return localKeys_[i];
141 }
142
143 private:
144 std::vector<LocalKey> localKeys_;
145 };
146
151 template<class LocalBasis>
152 class CrouzeixRaviartLocalInterpolation
153 {
154 public:
155
163 template<typename F, typename C>
164 void interpolate (const F& f, std::vector<C>& out) const
165 {
166 constexpr auto dim = LocalBasis::Traits::dimDomain;
167
168 out.resize(LocalBasis::size());
169
170 // Evaluate at the facet midpoints
171 auto refSimplex = ReferenceElements<typename LocalBasis::Traits::DomainFieldType,dim>::simplex();
172 for (int i=0; i<refSimplex.size(1); i++)
173 out[i] = Impl::rangeCast(f(refSimplex.template geometry<1>(i).center()));
174 }
175 };
176
177} } // namespace Dune::Impl
178
179namespace Dune
180{
187 template<class D, class R, int dim>
189 {
190 public:
194 Impl::CrouzeixRaviartLocalCoefficients<dim>,
195 Impl::CrouzeixRaviartLocalInterpolation<Impl::CrouzeixRaviartLocalBasis<D,R,dim> > >;
196
199 const typename Traits::LocalBasisType& localBasis() const
200 {
201 return basis_;
202 }
203
207 {
208 return coefficients_;
209 }
210
214 {
215 return interpolation_;
216 }
217
219 static constexpr std::size_t size()
220 {
221 return dim+1;
222 }
223
226 static constexpr GeometryType type()
227 {
228 return GeometryTypes::simplex(dim);
229 }
230
231 private:
232 Impl::CrouzeixRaviartLocalBasis<D,R,dim> basis_;
233 Impl::CrouzeixRaviartLocalCoefficients<dim> coefficients_;
234 Impl::CrouzeixRaviartLocalInterpolation<Impl::CrouzeixRaviartLocalBasis<D,R,dim> > interpolation_;
235 };
236
237} // namespace Dune
238
239#endif // DUNE_LOCALFUNCTIONS_CROUZEIXRAVIART_HH
size_type dim() const
D DomainType
domain type
Definition common/localbasis.hh:43
traits helper struct
Definition localfiniteelementtraits.hh:13
LB LocalBasisType
Definition localfiniteelementtraits.hh:16
LC LocalCoefficientsType
Definition localfiniteelementtraits.hh:20
LI LocalInterpolationType
Definition localfiniteelementtraits.hh:24
Crouzeix-Raviart finite element.
Definition crouzeixraviart.hh:189
static constexpr GeometryType type()
The reference element that the local finite element is defined on.
Definition crouzeixraviart.hh:226
const Traits::LocalCoefficientsType & localCoefficients() const
Returns the assignment of the degrees of freedom to the element subentities.
Definition crouzeixraviart.hh:206
const Traits::LocalInterpolationType & localInterpolation() const
Returns object that evaluates degrees of freedom.
Definition crouzeixraviart.hh:213
const Traits::LocalBasisType & localBasis() const
Returns the local basis, i.e., the set of shape functions.
Definition crouzeixraviart.hh:199
static constexpr std::size_t size()
The number of shape functions.
Definition crouzeixraviart.hh:219
T accumulate(T... args)
T back(T... args)
T begin(T... args)
T end(T... args)
T fill(T... args)
T find(T... args)
T resize(T... args)