Basis.jl (11b88dda510d0aa70e79dc59ad165e2a5539c3c3) Basis.jl (b2e3f8ecbfa285d0f4ffde9b24c57cc13f0319fb)
1abstract type AbstractBasis end
2
3"""
4 BasisCollocated()
5
6Returns the singleton object corresponding to libCEED's `CEED_BASIS_COLLOCATED`.
7"""
8struct BasisCollocated <: AbstractBasis end

--- 112 unchanged lines hidden (view full) ---

121- `topo`: [`Topology`](@ref) of element, e.g. hypercube, simplex, etc.
122- `ncomp`: Number of field components (1 for scalar fields).
123- `nnodes`: Total number of nodes.
124- `nqpts`: Total number of quadrature points.
125- `interp`: Matrix of size `(nqpts, nnodes)` expressing the values of nodal basis functions
126 at quadrature points.
127- `grad`: Array of size `(dim, nqpts, nnodes)` expressing derivatives of nodal basis
128 functions at quadrature points.
1abstract type AbstractBasis end
2
3"""
4 BasisCollocated()
5
6Returns the singleton object corresponding to libCEED's `CEED_BASIS_COLLOCATED`.
7"""
8struct BasisCollocated <: AbstractBasis end

--- 112 unchanged lines hidden (view full) ---

121- `topo`: [`Topology`](@ref) of element, e.g. hypercube, simplex, etc.
122- `ncomp`: Number of field components (1 for scalar fields).
123- `nnodes`: Total number of nodes.
124- `nqpts`: Total number of quadrature points.
125- `interp`: Matrix of size `(nqpts, nnodes)` expressing the values of nodal basis functions
126 at quadrature points.
127- `grad`: Array of size `(dim, nqpts, nnodes)` expressing derivatives of nodal basis
128 functions at quadrature points.
129- `qref`: Array of length `nqpts` holding the locations of quadrature points on the
129- `qref`: Matrix of size `(dim, nqpts)` holding the locations of quadrature points on the
130 reference element $[-1, 1]$.
131- `qweight`: Array of length `nqpts` holding the quadrature weights on the reference
132 element.
133"""
134function create_h1_basis(
135 c::Ceed,
136 topo::Topology,
137 ncomp,
138 nnodes,
139 nqpts,
140 interp::AbstractArray{CeedScalar},
141 grad::AbstractArray{CeedScalar},
142 qref::AbstractArray{CeedScalar},
143 qweight::AbstractArray{CeedScalar},
144)
145 dim = getdimension(topo)
146 @assert size(interp) == (nqpts, nnodes)
147 @assert size(grad) == (dim, nqpts, nnodes)
130 reference element $[-1, 1]$.
131- `qweight`: Array of length `nqpts` holding the quadrature weights on the reference
132 element.
133"""
134function create_h1_basis(
135 c::Ceed,
136 topo::Topology,
137 ncomp,
138 nnodes,
139 nqpts,
140 interp::AbstractArray{CeedScalar},
141 grad::AbstractArray{CeedScalar},
142 qref::AbstractArray{CeedScalar},
143 qweight::AbstractArray{CeedScalar},
144)
145 dim = getdimension(topo)
146 @assert size(interp) == (nqpts, nnodes)
147 @assert size(grad) == (dim, nqpts, nnodes)
148 @assert length(qref) == nqpts
148 @assert size(qref) == (dim, nqpts)
149 @assert length(qweight) == nqpts
150
151 # Convert from Julia matrices and tensors (column-major) to row-major format
152 interp_rowmajor = collect(interp')
153 grad_rowmajor = permutedims(grad, [3, 2, 1])
149 @assert length(qweight) == nqpts
150
151 # Convert from Julia matrices and tensors (column-major) to row-major format
152 interp_rowmajor = collect(interp')
153 grad_rowmajor = permutedims(grad, [3, 2, 1])
154 qref_rowmajor = collect(qref')
154
155 ref = Ref{C.CeedBasis}()
156 C.CeedBasisCreateH1(
157 c[],
158 topo,
159 ncomp,
160 nnodes,
161 nqpts,
162 interp_rowmajor,
163 grad_rowmajor,
155
156 ref = Ref{C.CeedBasis}()
157 C.CeedBasisCreateH1(
158 c[],
159 topo,
160 ncomp,
161 nnodes,
162 nqpts,
163 interp_rowmajor,
164 grad_rowmajor,
164 qref,
165 qref_rowmajor,
165 qweight,
166 ref,
167 )
168 Basis(ref)
169end
170
171@doc raw"""
172 create_hdiv_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, div, qref, qweight)

--- 5 unchanged lines hidden (view full) ---

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.
166 qweight,
167 ref,
168 )
169 Basis(ref)
170end
171
172@doc raw"""
173 create_hdiv_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, div, qref, qweight)

--- 5 unchanged lines hidden (view full) ---

179- `topo`: [`Topology`](@ref) of element, e.g. hypercube, simplex, etc.
180- `ncomp`: Number of field components (1 for scalar fields).
181- `nnodes`: Total number of nodes.
182- `nqpts`: Total number of quadrature points.
183- `interp`: Matrix of size `(dim, nqpts, nnodes)` expressing the values of basis functions
184 at quadrature points.
185- `div`: Array of size `(nqpts, nnodes)` expressing divergence of basis functions at
186 quadrature points.
186- `qref`: Array of length `nqpts` holding the locations of quadrature points on the
187- `qref`: Matrix of size `(dim, 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"""
191function 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)
188 reference element $[-1, 1]$.
189- `qweight`: Array of length `nqpts` holding the quadrature weights on the reference
190 element.
191"""
192function create_hdiv_basis(
193 c::Ceed,
194 topo::Topology,
195 ncomp,
196 nnodes,
197 nqpts,
198 interp::AbstractArray{CeedScalar},
199 div::AbstractArray{CeedScalar},
200 qref::AbstractArray{CeedScalar},
201 qweight::AbstractArray{CeedScalar},
202)
203 dim = getdimension(topo)
204 @assert size(interp) == (dim, nqpts, nnodes)
205 @assert size(div) == (nqpts, nnodes)
205 @assert length(qref) == nqpts
206 @assert size(qref) == (dim, 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')
207 @assert length(qweight) == nqpts
208
209 # Convert from Julia matrices and tensors (column-major) to row-major format
210 interp_rowmajor = permutedims(interp, [3, 2, 1])
211 div_rowmajor = collect(div')
212 qref_rowmajor = collect(qref')
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,
213
214 ref = Ref{C.CeedBasis}()
215 C.CeedBasisCreateHdiv(
216 c[],
217 topo,
218 ncomp,
219 nnodes,
220 nqpts,
221 interp_rowmajor,
222 div_rowmajor,
221 qref,
223 qref_rowmajor,
222 qweight,
223 ref,
224 )
225 Basis(ref)
226end
227
228@doc raw"""
229 create_hcurl_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, curl, qref, qweight)

--- 5 unchanged lines hidden (view full) ---

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.
224 qweight,
225 ref,
226 )
227 Basis(ref)
228end
229
230@doc raw"""
231 create_hcurl_basis(c::Ceed, topo::Topology, ncomp, nnodes, nqpts, interp, curl, qref, qweight)

--- 5 unchanged lines hidden (view full) ---

237- `topo`: [`Topology`](@ref) of element, e.g. hypercube, simplex, etc.
238- `ncomp`: Number of field components (1 for scalar fields).
239- `nnodes`: Total number of nodes.
240- `nqpts`: Total number of quadrature points.
241- `interp`: Matrix of size `(dim, nqpts, nnodes)` expressing the values of basis functions
242 at quadrature points.
243- `curl`: Matrix of size `(curlcomp, nqpts, nnodes)`, `curlcomp = 1 if dim < 3 else dim`)
244 matrix expressing curl of basis functions at quadrature points.
243- `qref`: Array of length `nqpts` holding the locations of quadrature points on the
245- `qref`: Matrix of size `(dim, 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"""
248function 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)
246 reference element $[-1, 1]$.
247- `qweight`: Array of length `nqpts` holding the quadrature weights on the reference
248 element.
249"""
250function create_hcurl_basis(
251 c::Ceed,
252 topo::Topology,
253 ncomp,
254 nnodes,
255 nqpts,
256 interp::AbstractArray{CeedScalar},
257 curl::AbstractArray{CeedScalar},
258 qref::AbstractArray{CeedScalar},
259 qweight::AbstractArray{CeedScalar},
260)
261 dim = getdimension(topo)
262 curlcomp = dim < 3 ? 1 : dim
263 @assert size(interp) == (dim, nqpts, nnodes)
264 @assert size(curl) == (curlcomp, nqpts, nnodes)
263 @assert length(qref) == nqpts
265 @assert size(qref) == (dim, 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])
266 @assert length(qweight) == nqpts
267
268 # Convert from Julia matrices and tensors (column-major) to row-major format
269 interp_rowmajor = permutedims(interp, [3, 2, 1])
270 curl_rowmajor = permutedims(curl, [3, 2, 1])
271 qref_rowmajor = collect(qref')
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,
272
273 ref = Ref{C.CeedBasis}()
274 C.CeedBasisCreateHcurl(
275 c[],
276 topo,
277 ncomp,
278 nnodes,
279 nqpts,
280 interp_rowmajor,
281 curl_rowmajor,
279 qref,
282 qref_rowmajor,
280 qweight,
281 ref,
282 )
283 Basis(ref)
284end
285
286"""
287 apply!(b::Basis, nelem, tmode::TransposeMode, emode::EvalMode, u::AbstractCeedVector, v::AbstractCeedVector)

--- 35 unchanged lines hidden (view full) ---

323"""
324function apply(b::Basis, u::AbstractVector; nelem=1, tmode=NOTRANSPOSE, emode=EVAL_INTERP)
325 ceed_ref = Ref{C.Ceed}()
326 ccall((:CeedBasisGetCeed, C.libceed), Cint, (C.CeedBasis, Ptr{C.Ceed}), b[], ceed_ref)
327 c = Ceed(ceed_ref)
328
329 u_vec = CeedVector(c, u)
330
283 qweight,
284 ref,
285 )
286 Basis(ref)
287end
288
289"""
290 apply!(b::Basis, nelem, tmode::TransposeMode, emode::EvalMode, u::AbstractCeedVector, v::AbstractCeedVector)

--- 35 unchanged lines hidden (view full) ---

326"""
327function apply(b::Basis, u::AbstractVector; nelem=1, tmode=NOTRANSPOSE, emode=EVAL_INTERP)
328 ceed_ref = Ref{C.Ceed}()
329 ccall((:CeedBasisGetCeed, C.libceed), Cint, (C.CeedBasis, Ptr{C.Ceed}), b[], ceed_ref)
330 c = Ceed(ceed_ref)
331
332 u_vec = CeedVector(c, u)
333
331 len_v = (tmode == TRANSPOSE) ? getnumnodes(b) : getnumqpts(b)
332 if emode == EVAL_GRAD
333 len_v *= getdimension(b)
334 end
334 qcomp = Ref{CeedInt}()
335 C.CeedBasisGetNumQuadratureComponents(b[], emode, qcomp)
336 len_v = (tmode == TRANSPOSE) ? getnumnodes(b) : qcomp[]*getnumqpts(b)
335
336 v_vec = CeedVector(c, len_v)
337
338 apply!(b, nelem, tmode, emode, u_vec, v_vec)
339 Vector(v_vec)
340end
341
342"""

--- 89 unchanged lines hidden (view full) ---

432[`Basis`](@ref).
433"""
434function getqref(b::Basis)
435 istensor = Ref{Bool}()
436 C.CeedBasisIsTensor(b[], istensor)
437 ref = Ref{Ptr{CeedScalar}}()
438 C.CeedBasisGetQRef(b[], ref)
439 copy(
337
338 v_vec = CeedVector(c, len_v)
339
340 apply!(b, nelem, tmode, emode, u_vec, v_vec)
341 Vector(v_vec)
342end
343
344"""

--- 89 unchanged lines hidden (view full) ---

434[`Basis`](@ref).
435"""
436function getqref(b::Basis)
437 istensor = Ref{Bool}()
438 C.CeedBasisIsTensor(b[], istensor)
439 ref = Ref{Ptr{CeedScalar}}()
440 C.CeedBasisGetQRef(b[], ref)
441 copy(
440 unsafe_wrap(
441 Array,
442 ref[],
443 istensor[] ? getnumqpts1d(b) : (getnumqpts(b)*getdimension(b)),
444 ),
442 istensor[] ? unsafe_wrap(Array, ref[], getnumqpts1d(b)) :
443 unsafe_wrap(Array, ref[], (getnumqpts(b), getdimension(b)))',
445 )
446end
447
448"""
449 getqref(b::Basis)
450
451Get the quadrature weights of quadrature points (in `dim` dimensions) of the given
452[`Basis`](@ref).

--- 104 unchanged lines hidden ---
444 )
445end
446
447"""
448 getqref(b::Basis)
449
450Get the quadrature weights of quadrature points (in `dim` dimensions) of the given
451[`Basis`](@ref).

--- 104 unchanged lines hidden ---