Skip to content

Commit 3280946

Browse files
authored
Merge pull request #1104 from Antoinemarteau/moment-based-reffes
Moment based reffes - Implementation of scalar Bernstein basis in barycentric coordinates.
2 parents c158861 + f9fccc9 commit 3280946

29 files changed

+1458
-377
lines changed

NEWS.md

+9-4
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10-
- Documentation and refactoring of Gridap.Polynomials. Since PR[#TODO](https://github.com/gridap/Gridap.jl/pull/#TODO).
10+
### Added
11+
12+
- Added AMR-related methods `mark` and `estimate` to `Adaptivity` module. Implemented Dorfler marking strategy. Since PR[#1063](https://github.com/gridap/Gridap.jl/pull/1063).
13+
14+
- Documentation and refactoring of Gridap.Polynomials. Since PR[#1072](https://github.com/gridap/Gridap.jl/pull/#1072).
1115
- Two new families of polynomial bases in addition to `Monomial`, `Legendre` (former `Jacobi`) and `ModalC0`: `Chebyshev` and `Bernstein`
12-
- `MonomialBasis` and `Q[Curl]GradMonomialBasis` have been generalized to `Legendre`, `Chebyshev` and `Bernstein` using the new `UniformPolyBasis` and `CompWiseTensorPolyBasis` respectively.
16+
- `MonomialBasis` and `Q[Curl]GradMonomialBasis` have been generalized to `Legendre`, `Chebyshev` and `Bernstein` using the new `CartProdPolyBasis` and `CompWiseTensorPolyBasis` respectively.
1317
- `PCurlGradMonomialBasis` has been generalized to `Legendre` and `Chebyshev` using the new `RaviartThomasPolyBasis`.
14-
- New aliases and high level constructor for `UniformPolyBasis` (former MonomialBasis): `MonomialBasis`, `LegendreBasis`, `ChebyshevBasis` and `BernsteinBasis`.
18+
- New aliases and high level constructor for `CartProdPolyBasis` (former MonomialBasis): `MonomialBasis`, `LegendreBasis`, `ChebyshevBasis` and `BernsteinBasis`.
1519
- New high level constructors for Nedelec and Raviart-Thomas polynomial bases:
1620
- Nedelec on simplex `PGradBasis(PT<:Polynomial, Val(D), order)`
1721
- Nedelec on n-cubes `QGradBasis(PT<:Polynomial, Val(D), order)`
1822
- Raviart on simplex `PCurlGradBasis(PT<:Polynomial, Val(D), order)`
1923
- Raviart on n-cubes `QCurlGradBasis(PT<:Polynomial, Val(D), order)`
24+
- Added `BernsteinBasisOnSimplex` that implements Bernstein polynomials in barycentric coordinates, since PR[#1104](https://github.com/gridap/Gridap.jl/pull/#1104).
2025

2126
## [0.18.10] - 2025-03-04
2227

@@ -50,7 +55,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5055

5156
- Existing Jacobi polynomial bases/spaces were renamed to Legendre (which they were).
5257
- `Monomial` is now subtype of the new abstract type`Polynomial <: Field`
53-
- `MonomialBasis` is now an alias for `UniformPolyBasis{...,Monomial}`
58+
- `MonomialBasis` is now an alias for `CartProdPolyBasis{...,Monomial}`
5459
- All polynomial bases are now subtypes of the new abstract type `PolynomialBasis <: AbstractVector{<:Polynomial}`
5560
- `get_order(b::(Q/P)[Curl]Grad...)`, now returns the order of the basis, +1 than the order parameter passed to the constructor.
5661
- `NedelecPreBasisOnSimplex` is renamed `NedelecPolyBasisOnSimplex`

docs/generate_diagrams.jl

+5-3
Original file line numberDiff line numberDiff line change
@@ -53,29 +53,31 @@ end
5353
a1 <|-left- PolynomialBasis
5454
5555
together {
56-
struct UniformPolyBasis {
56+
struct CartProdPolyBasis {
5757
+get_exponents
5858
+get_orders
5959
}
6060
struct CompWiseTensorPolyBasis
6161
struct RaviartThomasPolyBasis
6262
struct NedelecPolyBasisOnSimplex
63+
struct BernsteinBasisOnSimplex
6364
struct ModalC0Basis {
6465
+get_orders
6566
}
6667
}
6768
68-
PolynomialBasis <|-- UniformPolyBasis
69+
PolynomialBasis <|-- CartProdPolyBasis
6970
PolynomialBasis <|-- CompWiseTensorPolyBasis
7071
PolynomialBasis <|-- RaviartThomasPolyBasis
7172
PolynomialBasis <|-- NedelecPolyBasisOnSimplex
73+
PolynomialBasis <|-- BernsteinBasisOnSimplex
7274
PolynomialBasis <|-- ModalC0Basis
7375
7476
object "(<:Polynomial)Basis" as m1
7577
object "QGrad[<:Polynomial]Basis\nQCurlGrad[<:Polynomial]Basis" as m2
7678
object "PCurlGrad[<:Polynomial]Basis" as m4
7779
object "PGradMonomialBasis" as m5
78-
UniformPolyBasis <-down- m1
80+
CartProdPolyBasis <-down- m1
7981
CompWiseTensorPolyBasis <-down- m2
8082
RaviartThomasPolyBasis <-down- m4
8183
NedelecPolyBasisOnSimplex <-down- m5

docs/make.jl

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ pages = [
2424
"Developper notes" => Any[
2525
"dev-notes/block-assemblers.md",
2626
"dev-notes/pullbacks.md",
27+
"dev-notes/bernstein.md",
2728
"dev-notes/autodiff.md",
2829
],
2930
]

docs/src/Polynomials.md

+78-60
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ polynomial spaces. The order ``K`` 1D monomial is
3131
```math
3232
x \rightarrow x^K,
3333
```
34-
and the order ``\boldsymbol{K}=(K_1, K_2, \dots, K_D)`` D-dimensional monomial is defined by
34+
and the order ``\bm{K}=(K_1, K_2, \dots, K_D)`` D-dimensional monomial is defined by
3535
```math
36-
\boldsymbol{x} = (x_1, x_2, \dots, x_D) \longrightarrow
37-
\boldsymbol{x}^{\boldsymbol{K}} = x_1^{K_1}x_2^{K_2}...x_D^{K_D} = \Pi_{i=1}^D
36+
\bm{x} = (x_1, x_2, \dots, x_D) \longrightarrow
37+
\bm{x}^{\bm{K}} = x_1^{K_1}x_2^{K_2}...x_D^{K_D} = \Pi_{i=1}^D
3838
x_i^{K_i}.
3939
```
4040

@@ -52,7 +52,7 @@ This module implements the normalized shifted [`Legendre`](@ref) polynomials,
5252
shifted to be orthogonal on ``[0,1]`` using the change of variable ``x
5353
\rightarrow 2x-1``, leading to
5454
```math
55-
P^*_{n}(x)=\frac{1}{\sqrt{2n+1}}P_n(2x-1)=\frac{1}{\sqrt{2n+1}}(-1)^{n}\sum _{i=0}^{n}{\binom{n}{i}}{\binom{n+i}{i}}(-x)^{i}.
55+
P^*_{n}(x)=\frac{1}{\sqrt{2n+1}}P_n(2x-1)=\frac{1}{\sqrt{2n+1}}(-1)^{n} _{i=0}^{n}{\binom{n}{i}}{\binom{n+i}{i}}(-x)^{i}.
5656
```
5757

5858
#### Chebyshev polynomials
@@ -65,9 +65,9 @@ polynomials ``U_n`` can be recursively defined by
6565
```
6666
or explicitly defined by
6767
```math
68-
T_{n}(x)=\sum _{i=0}^{\left\lfloor {n}/{2}\right\rfloor }{\binom
68+
T_{n}(x)= _{i=0}^{\left\lfloor {n}/{2}\right\rfloor }{\binom
6969
{n}{2i}}\left(x^{2}-1\right)^{i}x^{n-2i},\qquad
70-
U_{n}(x)=\sum _{i=0}^{\left\lfloor {n}/{2}\right\rfloor }{\binom
70+
U_{n}(x)= _{i=0}^{\left\lfloor {n}/{2}\right\rfloor }{\binom
7171
{n+1}{2i+1}}\left(x^{2}-1\right)^{i}x^{n-2i},
7272
```
7373
where ``\left\lfloor {n}/2\right\rfloor`` is `floor(n/2)`.
@@ -82,12 +82,28 @@ The analog second kind shifted Chebyshev polynomials can be implemented by
8282

8383
#### Bernstein polynomials
8484

85-
The [`Bernstein`](@ref) polynomials forming a basis of ``\mathbb{P}_K`` are
86-
defined by
85+
The univariate [`Bernstein`](@ref) polynomials forming a basis of ``ℙ_K``
86+
are defined by
87+
```math
88+
B^K_{n}(x) = \binom{K}{n} x^n (1-x)^{K-n}\qquad\text{ for } 0 ≤ n ≤ K.
89+
```
90+
91+
The ``D``-multivariate Bernstein polynomials of degree ``K`` are defined by
8792
```math
88-
B^K_{n}(x) = \binom{K}{n} x^n (1-x)^{K-n}\qquad\text{ for } 0\leq n\leq K.
93+
B^{D,K}_α(\bm{x}) = \binom{K}{α} λ(\bm{x})^α\qquad\text{for all }α ∈\mathcal{I}_K^D
8994
```
90-
They are positive on ``[0,1]`` and sum to ``1``.
95+
where
96+
- ``\mathcal{I}^D_K=\{ α ∈ ℤ_+^{N} \quad\big|\quad |α| = K \}`` where ``N = D+1``,
97+
- ``\binom{|α|}{α} = \frac{|α|!}{α!} = \frac{K!}{α_1 !α_2 !\dotsα_N!}`` and ``K=|α|=∑_{1 ≤ i ≤ N} α_i``,
98+
and ``λ(\bm x)`` is the set of barycentric coordinates of ``\bm x`` relative to a given simplex,
99+
see the developer notes on the [Bernstein bases algorithms](@ref).
100+
101+
The superscript ``D`` and ``K`` in ``B^{D,K}_α(x)`` can be omitted because they
102+
are always determined by ``α`` using ``{D=\#(α)-1}`` and ``K=|α|``. The set
103+
``\{B_α\}_{α∈\mathcal{I}_K^D}`` is a basis of ``ℙ^D_K``, implemented by
104+
[`BernsteinBasisOnSimplex`](@ref).
105+
106+
The Bernstein polynomials sum to ``1``, and are positive in the simplex.
91107

92108
#### ModalC0 polynomials
93109

@@ -97,7 +113,7 @@ polynomials ``\phi_K`` for which ``\phi_K(0) = \delta_{0K}`` and ``\phi_K(1) =
97113
17 of [Badia-Neiva-Verdugo 2022](https://doi.org/10.1016/j.camwa.2022.09.027).
98114

99115
When `ModalC0` is used as a `<:Polynomial` parameter in
100-
[`UniformPolyBasis`](@ref) or other bases (except `ModalC0Basis`), the trivial
116+
[`CartProdPolyBasis`](@ref) or other bases (except `ModalC0Basis`), the trivial
101117
bounding box `(a=Point{D}(0...), b=Point{D}(1...))` is assumed, which
102118
coincides with the usual definition of the ModalC0 bases.
103119

@@ -106,90 +122,90 @@ coincides with the usual definition of the ModalC0 bases.
106122

107123
#### P and Q spaces
108124

109-
Let us denote ``\mathbb{P}_K(x)`` the space of univariate polynomials of order up to ``K`` in the varible ``x``
125+
Let us denote ``ℙ_K(x)`` the space of univariate polynomials of order up to ``K`` in the varible ``x``
110126
```math
111-
\mathbb{P}_K(x) = \text{Span}\big\{\quad x\rightarrow x^i \quad\big|\quad 0\leq i\leq K \quad\big\}.
127+
ℙ_K(x) = \text{Span}\big\{\quad x\rightarrow x^i \quad\big|\quad 0 ≤ i ≤ K \quad\big\}.
112128
```
113129

114-
Then, ``\mathbb{Q}^D`` and ``\mathbb{P}^D`` are the spaces for Lagrange elements
130+
Then, ``^D`` and ``^D`` are the spaces for Lagrange elements
115131
on D-cubes and D-simplices respectively, defined by
116132
```math
117-
\mathbb{Q}^D_K = \text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^\alpha \quad\big|\quad 0\leq
118-
\alpha_1, \alpha_2, \dots, \alpha_D \leq K \quad\big\},
133+
^D_K = \text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^α \quad\big|\quad 0
134+
α_1, α_2, \dots, α_D ≤ K \quad\big\},
119135
```
120136
and
121137
```math
122-
\mathbb{P}^D_K = \text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^\alpha \quad\big|\quad 0\leq
123-
\alpha_1, \alpha_2, \dots, \alpha_D \leq K;\quad \sum_{d=1}^D \alpha_d \leq
138+
^D_K = \text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^α \quad\big|\quad 0
139+
α_1, α_2, \dots, α_D ≤ K;\quad ∑_{d=1}^D α_d ≤
124140
K \quad\big\}.
125141
```
126142

127-
To note, there is ``\mathbb{P}_K = \mathbb{P}^1_K = \mathbb{Q}^1_K``.
143+
To note, there is ``ℙ_K = ^1_K = ^1_K``.
128144

129145
#### Serendipity space Sr
130146

131147
The serendipity space, commonly used for serendipity finite elements on n-cubes,
132148
are defined by
133149
```math
134-
\mathbb{S}r^D_K = \text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^\alpha \quad\big|\quad 0\leq
135-
\alpha_1, \alpha_2, \dots, \alpha_D \leq K;\quad
136-
\sum_{d=1}^D \alpha_d\;\mathbb{1}_{[2,K]}(\alpha_d) \leq K \quad\big\}
150+
\mathbb{S}r^D_K = \text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^α \quad\big|\quad 0
151+
α_1, α_2, \dots, α_D ≤ K;\quad
152+
∑_{d=1}^D α_d\;\mathbb{1}_{[2,K]}(α_d) ≤ K \quad\big\}
137153
```
138-
where ``\mathbb{1}_{[2,K]}(\alpha_d)`` is ``1`` if ``\alpha_d\geq 2`` or else
154+
where ``\mathbb{1}_{[2,K]}(α_d)`` is ``1`` if ``α_d ≥ 2`` or else
139155
``0``.
140156

141157
#### Homogeneous P and Q spaces
142158

143159
It will later be useful to define the homogeneous Q spaces
144160
```math
145-
\tilde{\mathbb{Q}}^D_K = \mathbb{Q}^D_K\backslash\mathbb{Q}^D_{K-1} =
146-
\text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^\alpha \quad\big|\quad 0\leq \alpha_1,
147-
\alpha_2, \dots, \alpha_D \leq K; \quad \text{max}(\alpha) = K \quad\big\},
161+
\tilde{ℚ}^D_K = ^D_K\backslashℚ^D_{K-1} =
162+
\text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^α \quad\big|\quad 0 ≤ α_1,
163+
α_2, \dots, α_D ≤ K; \quad \text{max}(α) = K \quad\big\},
148164
```
149165
and homogeneous P spaces
150166
```math
151-
\tilde{\mathbb{P}}^D_K = \mathbb{P}^D_K\backslash \mathbb{P}^D_{K-1} =
152-
\text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^\alpha \quad\big|\quad 0\leq \alpha_1,
153-
\alpha_2, \dots, \alpha_D \leq K;\quad \sum_{d=1}^D \alpha_d = K \quad\big\}.
167+
\tilde{ℙ}^D_K = ^D_K\backslash ^D_{K-1} =
168+
\text{Span}\big\{\quad \bm{x}\rightarrow\bm{x}^α \quad\big|\quad 0 ≤ α_1,
169+
α_2, \dots, α_D ≤ K;\quad ∑_{d=1}^D α_d = K \quad\big\}.
154170
```
155171

156172

157-
#### Nédélec spaces
173+
#### Nédélec ``curl``-conforming spaces
158174

159175
The Kᵗʰ Nédélec polynomial spaces on respectively rectangles and
160176
triangles are defined by
161177
```math
162-
\mathbb{ND}^2_K(\square) = \left(\mathbb{Q}^2_K\right)^2 \oplus
163-
\left(\begin{array}{c} y^{K+1}\,\mathbb{P}_K(x)\\ x^{K+1}\,\mathbb{P}_K(y) \end{array}\right)
178+
ℕ𝔻^2_K(\square) = \left(^2_K\right)^2
179+
\left(\begin{array}{c} y^{K+1}\,ℙ_K(x)\\ x^{K+1}\,ℙ_K(y) \end{array}\right)
164180
,\qquad
165-
\mathbb{ND}^2_K(\bigtriangleup) =\left(\mathbb{P}^2_K\right)^2 \oplus\bm{x}\times(\tilde{\mathbb{P}}^2_K)^2,
181+
ℕ𝔻^2_K(\bigtriangleup) =\left(^2_K\right)^2 ⊕\bm{x}\times(\tilde{}^2_K)^2,
166182
```
167183
where ``\times`` here means ``\left(\begin{array}{c} x\\ y
168184
\end{array}\right)\times\left(\begin{array}{c} p(\bm{x})\\ q(\bm{x})
169185
\end{array}\right) = \left(\begin{array}{c} y p(\bm{x})\\ -x q(\bm{x})
170-
\end{array}\right)`` and ``\oplus`` is the direct sum of vector spaces.
186+
\end{array}\right)`` and ```` is the direct sum of vector spaces.
171187

172188
Then, the Kᵗʰ Nédélec polynomial spaces on respectively hexahedra and
173189
tetrahedra are defined by
174190
```math
175-
\mathbb{ND}^3_K(\square) = \left(\mathbb{Q}^3_K\right)^3 \oplus \bm{x}\times(\tilde{\mathbb{Q}}^3_K)^3,\qquad
176-
\mathbb{ND}^3_K(\bigtriangleup) =\left(\mathbb{P}^3_K\right)^3 \oplus \bm{x}\times(\tilde{\mathbb{P}}^3_K)^3.
191+
ℕ𝔻^3_K(\square) = \left(^3_K\right)^3 \bm{x}\times(\tilde{}^3_K)^3,\qquad
192+
ℕ𝔻^3_K(\bigtriangleup) =\left(^3_K\right)^3 \bm{x}\times(\tilde{}^3_K)^3.
177193
```
178194

179-
``\mathbb{ND}^D_K(\square)`` and ``\mathbb{ND}^D_K(\bigtriangleup)`` are of
180-
order K+1 and the curl of their elements are in ``(\mathbb{Q}^D_K)^D``
181-
and ``(\mathbb{P}^D_K)^D`` respectively.
195+
``ℕ𝔻^D_K(\square)`` and ``ℕ𝔻^D_K(\bigtriangleup)`` are of
196+
order K+1 and the curl of their elements are in ``(^D_K)^D``
197+
and ``(^D_K)^D`` respectively.
182198

183-
#### Raviart-Thomas spaces
199+
#### Raviart-Thomas and Nédélec ``div``-conforming Spaces
184200

185201
The Kᵗʰ Raviart-Thomas polynomial spaces on respectively D-cubes and
186202
D-simplices are defined by
187203
```math
188-
\mathbb{ND}^D_K(\square) = \left(\mathbb{Q}^D_K\right)^D \oplus \bm{x}\;\tilde{\mathbb{Q}}^D_K, \qquad
189-
\mathbb{ND}^D_K(\bigtriangleup) = \left(\mathbb{P}^D_K\right)^D \oplus \bm{x}\;\tilde{\mathbb{P}}^D_K,
204+
ℕ𝔻^D_K(\square) = \left(^D_K\right)^D \bm{x}\;\tilde{}^D_K, \qquad
205+
ℕ𝔻^D_K(\bigtriangleup) = \left(^D_K\right)^D \bm{x}\;\tilde{}^D_K,
190206
```
191207
these bases are of dimension K+1 and the divergence of their elements are in
192-
``\mathbb{Q}^D_K`` and ``\mathbb{P}^D_K`` respectively.
208+
``^D_K`` and ``^D_K`` respectively.
193209

194210

195211
#### Filter functions
@@ -205,20 +221,18 @@ The signature of the filter functions should be
205221
(term,order) -> Bool
206222

207223
where `term` is a tuple of `D` integers containing the exponents of a
208-
multivariate monomial, that correspond to the multi-index ``\alpha`` previously
224+
multivariate monomial, that correspond to the multi-index ``α`` previously
209225
used in the P/Q spaces definitions.
210226

211-
When using [`hierarchical`](@ref isHierarchical) 1D bases, the following
212-
filters can be used to define associated polynomial spaces:
213-
214-
| space | filter |
215-
| :-----------| :--------------------------------------------------------------- |
216-
| ℚᴰ | `_q_filter(e,order) = maximum(e) <= order` |
217-
| ℚᴰₙ\\ℚᴰₙ₋₁ | `_qs_filter(e,order) = maximum(e) == order` |
218-
| ℙᴰ | `_p_filter(e,order) = sum(e) <= order` |
219-
| ℙᴰₙ\\ℙᴰₙ₋₁ | `_ps_filter(e,order) = sum(e) == order` |
220-
| 𝕊rᴰₙ | `_ser_filter(e,order) = sum( [ i for i in e if i>1 ] ) <= order` |
227+
The following example filters can be used to define associated polynomial spaces:
221228

229+
| space | filter | possible family |
230+
| :-----------| :------------------------------------------------------------| :------------------------------------ |
231+
| ℚᴰ | `_q_filter(e,order) = maximum(e) <= order` | All |
232+
| ℚᴰₙ\\ℚᴰₙ₋₁ | `_qh_filter(e,order) = maximum(e) == order` | [`Monomial`](@ref) |
233+
| ℙᴰ | `_p_filter(e,order) = sum(e) <= order` | All |
234+
| ℙᴰₙ\\ℙᴰₙ₋₁ | `_ph_filter(e,order) = sum(e) == order` | [`Monomial`](@ref) |
235+
| 𝕊rᴰₙ | `_ser_filter(e,order) = sum( i for i in e if i>1 ) <= order` | [`hierarchical`](@ref isHierarchical) |
222236

223237
## Types for polynomial families
224238

@@ -252,7 +266,7 @@ ModalC0
252266

253267
```@docs
254268
PolynomialBasis
255-
get_order
269+
get_order(::PolynomialBasis)
256270
MonomialBasis(args...)
257271
MonomialBasis
258272
LegendreBasis(args...)
@@ -263,12 +277,16 @@ BernsteinBasis(args...)
263277
```
264278
!!! warning
265279
Calling `BernsteinBasis` with the filters (e.g. a `_p_filter`) rarely
266-
yields a basis for the associated space (e.g. ``\mathbb{P}``). Indeed, the
280+
yields a basis for the associated space (e.g. ````). Indeed, the
267281
term numbers do not correspond to the degree of the polynomial, because the
268282
basis is not [`hierarchical`](@ref isHierarchical).
269283

270284
```@docs
271285
BernsteinBasis
286+
BernsteinBasisOnSimplex
287+
BernsteinBasisOnSimplex(::Val,::Type,::Int,vertices=nothing)
288+
bernstein_terms
289+
bernstein_term_id
272290
PGradBasis
273291
QGradBasis
274292
PCurlGradBasis
@@ -279,10 +297,10 @@ QCurlGradBasis
279297
![](./assets/poly_2.svg)
280298

281299
```@docs
282-
UniformPolyBasis
283-
UniformPolyBasis(::Type, ::Val{D}, ::Type, ::Int, ::Function) where D
284-
UniformPolyBasis(::Type, ::Val{D}, ::Type{V}, ::NTuple{D,Int}, ::Function) where {D,V}
285-
get_orders
300+
CartProdPolyBasis
301+
CartProdPolyBasis(::Type, ::Val{D}, ::Type, ::Int, ::Function) where D
302+
CartProdPolyBasis(::Type, ::Val{D}, ::Type{V}, ::NTuple{D,Int}, ::Function) where {D,V}
303+
get_orders(::CartProdPolyBasis)
286304
get_exponents
287305
CompWiseTensorPolyBasis
288306
NedelecPolyBasisOnSimplex

docs/src/assets/poly_2.svg

+1-1
Loading

0 commit comments

Comments
 (0)