@@ -17,6 +17,8 @@ created using one of:
17
17
- [`create_tensor_h1_lagrange_basis`](@ref)
18
18
- [`create_tensor_h1_basis`](@ref)
19
19
- [`create_h1_basis`](@ref)
20
+ - [`create_hdiv_basis`](@ref)
21
+ - [`create_hcurl_basis`](@ref)
20
22
"""
21
23
mutable struct Basis <: AbstractBasis
22
24
ref:: RefValue{C.CeedBasis}
112
114
@doc raw """
113
115
create_h1_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, grad, qref, qweight)
114
116
115
- Create a non tensor-product basis for H^1 discretizations
117
+ Create a non tensor-product basis for $ H^1$ discretizations
116
118
117
119
# Arguments:
118
120
- `ceed`: A [`Ceed`](@ref) object where the [`Basis`](@ref) will be created.
@@ -166,6 +168,121 @@ function create_h1_basis(
166
168
Basis (ref)
167
169
end
168
170
171
+ @doc raw """
172
+ create_hdiv_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, div, qref, qweight)
173
+
174
+ Create a non tensor-product basis for H(div) discretizations
175
+
176
+ # Arguments:
177
+ - `ceed`: A [`Ceed`](@ref) object where the [`Basis`](@ref) will be created.
178
+ - `topo`: [`Topology`](@ref) of element, e.g. hypercube, simplex, etc.
179
+ - `ncomp`: Number of field components (1 for scalar fields).
180
+ - `nnodes`: Total number of nodes.
181
+ - `nqpts`: Total number of quadrature points.
182
+ - `interp`: Matrix of size `(dim, nqpts, nnodes)` expressing the values of basis functions
183
+ at quadrature points.
184
+ - `div`: Array of size `(nqpts, nnodes)` expressing divergence of basis functions at
185
+ quadrature points.
186
+ - `qref`: Array of length `nqpts` holding the locations of quadrature points on the
187
+ reference element $[-1, 1]$.
188
+ - `qweight`: Array of length `nqpts` holding the quadrature weights on the reference
189
+ element.
190
+ """
191
+ function create_hdiv_basis (
192
+ c:: Ceed ,
193
+ topo:: Topology ,
194
+ ncomp,
195
+ nnodes,
196
+ nqpts,
197
+ interp:: AbstractArray{CeedScalar} ,
198
+ div:: AbstractArray{CeedScalar} ,
199
+ qref:: AbstractArray{CeedScalar} ,
200
+ qweight:: AbstractArray{CeedScalar} ,
201
+ )
202
+ dim = getdimension (topo)
203
+ @assert size (interp) == (dim, nqpts, nnodes)
204
+ @assert size (div) == (nqpts, nnodes)
205
+ @assert length (qref) == nqpts
206
+ @assert length (qweight) == nqpts
207
+
208
+ # Convert from Julia matrices and tensors (column-major) to row-major format
209
+ interp_rowmajor = permutedims (interp, [3 , 2 , 1 ])
210
+ div_rowmajor = collect (div' )
211
+
212
+ ref = Ref {C.CeedBasis} ()
213
+ C. CeedBasisCreateHdiv (
214
+ c[],
215
+ topo,
216
+ ncomp,
217
+ nnodes,
218
+ nqpts,
219
+ interp_rowmajor,
220
+ div_rowmajor,
221
+ qref,
222
+ qweight,
223
+ ref,
224
+ )
225
+ Basis (ref)
226
+ end
227
+
228
+ @doc raw """
229
+ create_hcurl_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, curl, qref, qweight)
230
+
231
+ Create a non tensor-product basis for H(curl) discretizations
232
+
233
+ # Arguments:
234
+ - `ceed`: A [`Ceed`](@ref) object where the [`Basis`](@ref) will be created.
235
+ - `topo`: [`Topology`](@ref) of element, e.g. hypercube, simplex, etc.
236
+ - `ncomp`: Number of field components (1 for scalar fields).
237
+ - `nnodes`: Total number of nodes.
238
+ - `nqpts`: Total number of quadrature points.
239
+ - `interp`: Matrix of size `(dim, nqpts, nnodes)` expressing the values of basis functions
240
+ at quadrature points.
241
+ - `curl`: Matrix of size `(curlcomp, nqpts, nnodes)`, `curlcomp = 1 if dim < 3 else dim`)
242
+ matrix expressing curl of basis functions at quadrature points.
243
+ - `qref`: Array of length `nqpts` holding the locations of quadrature points on the
244
+ reference element $[-1, 1]$.
245
+ - `qweight`: Array of length `nqpts` holding the quadrature weights on the reference
246
+ element.
247
+ """
248
+ function create_hcurl_basis (
249
+ c:: Ceed ,
250
+ topo:: Topology ,
251
+ ncomp,
252
+ nnodes,
253
+ nqpts,
254
+ interp:: AbstractArray{CeedScalar} ,
255
+ curl:: AbstractArray{CeedScalar} ,
256
+ qref:: AbstractArray{CeedScalar} ,
257
+ qweight:: AbstractArray{CeedScalar} ,
258
+ )
259
+ dim = getdimension (topo)
260
+ curlcomp = dim < 3 ? 1 : dim
261
+ @assert size (interp) == (dim, nqpts, nnodes)
262
+ @assert size (curl) == (curlcomp, nqpts, nnodes)
263
+ @assert length (qref) == nqpts
264
+ @assert length (qweight) == nqpts
265
+
266
+ # Convert from Julia matrices and tensors (column-major) to row-major format
267
+ interp_rowmajor = permutedims (interp, [3 , 2 , 1 ])
268
+ curl_rowmajor = permutedims (curl, [3 , 2 , 1 ])
269
+
270
+ ref = Ref {C.CeedBasis} ()
271
+ C. CeedBasisCreateHcurl (
272
+ c[],
273
+ topo,
274
+ ncomp,
275
+ nnodes,
276
+ nqpts,
277
+ interp_rowmajor,
278
+ curl_rowmajor,
279
+ qref,
280
+ qweight,
281
+ ref,
282
+ )
283
+ Basis (ref)
284
+ end
285
+
169
286
"""
170
287
apply!(b::Basis, nelem, tmode::TransposeMode, emode::EvalMode, u::AbstractCeedVector, v::AbstractCeedVector)
171
288
@@ -342,18 +459,25 @@ function getqweights(b::Basis)
342
459
copy (unsafe_wrap (Array, ref[], istensor[] ? getnumqpts1d (b) : getnumqpts (b)))
343
460
end
344
461
345
- """
462
+ @doc raw """
346
463
getinterp(b::Basis)
347
464
348
465
Get the interpolation matrix of the given [`Basis`](@ref). Returns a matrix of size
349
- `(getnumqpts(b), getnumnodes(b))`.
466
+ `(getnumqpts(b), getnumnodes(b))` for a given $H^1$ basis or `(getdimension(b),
467
+ getnumqpts(b), getnumnodes(b))` for a given vector $H(div)$ or $H(curl)$ basis.
350
468
"""
351
469
function getinterp (b:: Basis )
352
470
ref = Ref {Ptr{CeedScalar}} ()
353
471
C. CeedBasisGetInterp (b[], ref)
354
472
q = getnumqpts (b)
355
473
p = getnumnodes (b)
356
- collect (unsafe_wrap (Array, ref[], (p, q))' )
474
+ qcomp = Ref {CeedInt} ()
475
+ C. CeedBasisGetNumQuadratureComponents (b[], C. CEED_EVAL_INTERP, qcomp)
476
+ if qcomp[] == 1
477
+ collect (unsafe_wrap (Array, ref[], (p, q))' )
478
+ else
479
+ permutedims (unsafe_wrap (Array, ref[], (p, q, qcomp[])), [3 , 2 , 1 ])
480
+ end
357
481
end
358
482
359
483
"""
@@ -399,3 +523,34 @@ function getgrad1d(b::Basis)
399
523
p = getnumnodes1d (b)
400
524
collect (unsafe_wrap (Array, ref[], (p, q))' )
401
525
end
526
+
527
+ """
528
+ getdiv(b::Basis)
529
+
530
+ Get the divergence matrix of the given [`Basis`](@ref). Returns a tensor of size
531
+ `(getnumqpts(b), getnumnodes(b))`.
532
+ """
533
+ function getdiv (b:: Basis )
534
+ ref = Ref {Ptr{CeedScalar}} ()
535
+ C. CeedBasisGetDiv (b[], ref)
536
+ q = getnumqpts (b)
537
+ p = getnumnodes (b)
538
+ collect (unsafe_wrap (Array, ref[], (p, q))' )
539
+ end
540
+
541
+ """
542
+ getcurl(b::Basis)
543
+
544
+ Get the curl matrix of the given [`Basis`](@ref). Returns a tensor of size
545
+ `(curlcomp, getnumqpts(b), getnumnodes(b))`, `curlcomp = 1 if getdimension(b) < 3 else
546
+ getdimension(b)`.
547
+ """
548
+ function getcurl (b:: Basis )
549
+ ref = Ref {Ptr{CeedScalar}} ()
550
+ C. CeedBasisGetCurl (b[], ref)
551
+ q = getnumqpts (b)
552
+ p = getnumnodes (b)
553
+ qcomp = Ref {CeedInt} ()
554
+ C. CeedBasisGetNumQuadratureComponents (b[], C. CEED_EVAL_CURL, qcomp)
555
+ permutedims (unsafe_wrap (Array, ref[], (p, q, qcomp[])), [3 , 2 , 1 ])
556
+ end
0 commit comments