Skip to content

Commit 571548e

Browse files
Update Julia/Python/Rust/Fortran bindings
1 parent 11f1c81 commit 571548e

File tree

4 files changed

+202
-8
lines changed

4 files changed

+202
-8
lines changed

interface/ceed-fortran.c

+34
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,40 @@ CEED_EXTERN void fCeedBasisCreateH1(int *ceed, int *topo, int *num_comp, int *nn
449449
}
450450
}
451451

452+
#define fCeedBasisCreateHdiv FORTRAN_NAME(ceedbasiscreatehdiv, CEEDBASISCREATEHDIV)
453+
CEED_EXTERN void fCeedBasisCreateHdiv(int *ceed, int *topo, int *num_comp, int *nnodes, int *nqpts, const CeedScalar *interp, const CeedScalar *div,
454+
const CeedScalar *qref, const CeedScalar *qweight, int *basis, int *err) {
455+
if (CeedBasis_count == CeedBasis_count_max) {
456+
CeedBasis_count_max += CeedBasis_count_max / 2 + 1;
457+
CeedRealloc(CeedBasis_count_max, &CeedBasis_dict);
458+
}
459+
460+
*err = CeedBasisCreateHdiv(Ceed_dict[*ceed], (CeedElemTopology)*topo, *num_comp, *nnodes, *nqpts, interp, div, qref, qweight,
461+
&CeedBasis_dict[CeedBasis_count]);
462+
463+
if (*err == 0) {
464+
*basis = CeedBasis_count++;
465+
CeedBasis_n++;
466+
}
467+
}
468+
469+
#define fCeedBasisCreateHcurl FORTRAN_NAME(ceedbasiscreatehcurl, CEEDBASISCREATEHCURL)
470+
CEED_EXTERN void fCeedBasisCreateHcurl(int *ceed, int *topo, int *num_comp, int *nnodes, int *nqpts, const CeedScalar *interp, const CeedScalar *curl,
471+
const CeedScalar *qref, const CeedScalar *qweight, int *basis, int *err) {
472+
if (CeedBasis_count == CeedBasis_count_max) {
473+
CeedBasis_count_max += CeedBasis_count_max / 2 + 1;
474+
CeedRealloc(CeedBasis_count_max, &CeedBasis_dict);
475+
}
476+
477+
*err = CeedBasisCreateHcurl(Ceed_dict[*ceed], (CeedElemTopology)*topo, *num_comp, *nnodes, *nqpts, interp, curl, qref, qweight,
478+
&CeedBasis_dict[CeedBasis_count]);
479+
480+
if (*err == 0) {
481+
*basis = CeedBasis_count++;
482+
CeedBasis_n++;
483+
}
484+
}
485+
452486
#define fCeedBasisView FORTRAN_NAME(ceedbasisview, CEEDBASISVIEW)
453487
CEED_EXTERN void fCeedBasisView(int *basis, int *err) { *err = CeedBasisView(CeedBasis_dict[*basis], stdout); }
454488

julia/LibCEED.jl/src/generated/libceed_bindings.jl

+8-8
Original file line numberDiff line numberDiff line change
@@ -389,14 +389,6 @@ function CeedBasisGetNumComponents(basis, num_comp)
389389
ccall((:CeedBasisGetNumComponents, libceed), Cint, (CeedBasis, Ptr{CeedInt}), basis, num_comp)
390390
end
391391

392-
function CeedBasisGetNumQuadratureComponents(basis, q_comp)
393-
ccall((:CeedBasisGetNumQuadratureComponents, libceed), Cint, (CeedBasis, Ptr{CeedInt}), basis, q_comp)
394-
end
395-
396-
function CeedBasisGetNumCurlComponents(basis, curl_comp)
397-
ccall((:CeedBasisGetNumCurlComponents, libceed), Cint, (CeedBasis, Ptr{CeedInt}), basis, curl_comp)
398-
end
399-
400392
function CeedBasisGetNumNodes(basis, P)
401393
ccall((:CeedBasisGetNumNodes, libceed), Cint, (CeedBasis, Ptr{CeedInt}), basis, P)
402394
end
@@ -1034,6 +1026,10 @@ function CeedBasisReference(basis)
10341026
ccall((:CeedBasisReference, libceed), Cint, (CeedBasis,), basis)
10351027
end
10361028

1029+
function CeedBasisGetNumQuadratureComponents(basis, eval_mode, q_comp)
1030+
ccall((:CeedBasisGetNumQuadratureComponents, libceed), Cint, (CeedBasis, CeedEvalMode, Ptr{CeedInt}), basis, eval_mode, q_comp)
1031+
end
1032+
10371033
function CeedBasisGetFlopsEstimate(basis, t_mode, eval_mode, flops)
10381034
ccall((:CeedBasisGetFlopsEstimate, libceed), Cint, (CeedBasis, CeedTransposeMode, CeedEvalMode, Ptr{CeedSize}), basis, t_mode, eval_mode, flops)
10391035
end
@@ -1062,6 +1058,10 @@ function CeedTensorContractApply(contract, A, B, C, J, t, t_mode, Add, u, v)
10621058
ccall((:CeedTensorContractApply, libceed), Cint, (CeedTensorContract, CeedInt, CeedInt, CeedInt, CeedInt, Ptr{CeedScalar}, CeedTransposeMode, CeedInt, Ptr{CeedScalar}, Ptr{CeedScalar}), contract, A, B, C, J, t, t_mode, Add, u, v)
10631059
end
10641060

1061+
function CeedTensorContractStridedApply(contract, A, B, C, D, J, t, t_mode, add, u, v)
1062+
ccall((:CeedTensorContractStridedApply, libceed), Cint, (CeedTensorContract, CeedInt, CeedInt, CeedInt, CeedInt, CeedInt, Ptr{CeedScalar}, CeedTransposeMode, CeedInt, Ptr{CeedScalar}, Ptr{CeedScalar}), contract, A, B, C, D, J, t, t_mode, add, u, v)
1063+
end
1064+
10651065
function CeedTensorContractGetCeed(contract, ceed)
10661066
ccall((:CeedTensorContractGetCeed, libceed), Cint, (CeedTensorContract, Ptr{Ceed}), contract, ceed)
10671067
end

python/ceed_basis.py

+82
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,88 @@ def __init__(self, ceed, topo, ncomp, nnodes,
339339
# ------------------------------------------------------------------------------
340340

341341

342+
class BasisHdiv(Basis):
343+
"""Ceed Hdiv Basis: finite element non tensor-product basis for H(div) discretizations."""
344+
345+
# Constructor
346+
def __init__(self, ceed, topo, ncomp, nnodes,
347+
nqpts, interp, grad, qref, qweight):
348+
349+
# Setup arguments
350+
self._pointer = ffi.new("CeedBasis *")
351+
352+
self._ceed = ceed
353+
354+
interp_pointer = ffi.new("CeedScalar *")
355+
interp_pointer = ffi.cast(
356+
"CeedScalar *",
357+
interp.__array_interface__['data'][0])
358+
359+
div_pointer = ffi.new("CeedScalar *")
360+
div_pointer = ffi.cast(
361+
"CeedScalar *",
362+
grad.__array_interface__['data'][0])
363+
364+
qref_pointer = ffi.new("CeedScalar *")
365+
qref_pointer = ffi.cast(
366+
"CeedScalar *",
367+
qref.__array_interface__['data'][0])
368+
369+
qweight_pointer = ffi.new("CeedScalar *")
370+
qweight_pointer = ffi.cast(
371+
"CeedScalar *",
372+
qweight.__array_interface__['data'][0])
373+
374+
# libCEED call
375+
err_code = lib.CeedBasisCreateHdiv(self._ceed._pointer[0], topo, ncomp,
376+
nnodes, nqpts, interp_pointer,
377+
div_pointer, qref_pointer,
378+
qweight_pointer, self._pointer)
379+
380+
# ------------------------------------------------------------------------------
381+
382+
383+
class BasisHcurl(Basis):
384+
"""Ceed Hcurl Basis: finite element non tensor-product basis for H(curl) discretizations."""
385+
386+
# Constructor
387+
def __init__(self, ceed, topo, ncomp, nnodes,
388+
nqpts, interp, grad, qref, qweight):
389+
390+
# Setup arguments
391+
self._pointer = ffi.new("CeedBasis *")
392+
393+
self._ceed = ceed
394+
395+
interp_pointer = ffi.new("CeedScalar *")
396+
interp_pointer = ffi.cast(
397+
"CeedScalar *",
398+
interp.__array_interface__['data'][0])
399+
400+
curl_pointer = ffi.new("CeedScalar *")
401+
curl_pointer = ffi.cast(
402+
"CeedScalar *",
403+
grad.__array_interface__['data'][0])
404+
405+
qref_pointer = ffi.new("CeedScalar *")
406+
qref_pointer = ffi.cast(
407+
"CeedScalar *",
408+
qref.__array_interface__['data'][0])
409+
410+
qweight_pointer = ffi.new("CeedScalar *")
411+
qweight_pointer = ffi.cast(
412+
"CeedScalar *",
413+
qweight.__array_interface__['data'][0])
414+
415+
# libCEED call
416+
err_code = lib.CeedBasisCreateHcurl(self._ceed._pointer[0], topo, ncomp,
417+
nnodes, nqpts, interp_pointer,
418+
curl_pointer, qref_pointer,
419+
qweight_pointer, self._pointer)
420+
421+
# ------------------------------------------------------------------------------
422+
423+
342424
class TransposeBasis():
343425
"""Transpose Ceed Basis: transpose of finite element tensor-product basis objects."""
344426

rust/libceed/src/basis.rs

+78
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,84 @@ impl<'a> Basis<'a> {
238238
})
239239
}
240240

241+
pub fn create_Hdiv(
242+
ceed: &crate::Ceed,
243+
topo: crate::ElemTopology,
244+
ncomp: usize,
245+
nnodes: usize,
246+
nqpts: usize,
247+
interp: &[crate::Scalar],
248+
div: &[crate::Scalar],
249+
qref: &[crate::Scalar],
250+
qweight: &[crate::Scalar],
251+
) -> crate::Result<Self> {
252+
let mut ptr = std::ptr::null_mut();
253+
let (topo, ncomp, nnodes, nqpts) = (
254+
topo as bind_ceed::CeedElemTopology,
255+
i32::try_from(ncomp).unwrap(),
256+
i32::try_from(nnodes).unwrap(),
257+
i32::try_from(nqpts).unwrap(),
258+
);
259+
let ierr = unsafe {
260+
bind_ceed::CeedBasisCreateHdiv(
261+
ceed.ptr,
262+
topo,
263+
ncomp,
264+
nnodes,
265+
nqpts,
266+
interp.as_ptr(),
267+
div.as_ptr(),
268+
qref.as_ptr(),
269+
qweight.as_ptr(),
270+
&mut ptr,
271+
)
272+
};
273+
ceed.check_error(ierr)?;
274+
Ok(Self {
275+
ptr,
276+
_lifeline: PhantomData,
277+
})
278+
}
279+
280+
pub fn create_Hcurl(
281+
ceed: &crate::Ceed,
282+
topo: crate::ElemTopology,
283+
ncomp: usize,
284+
nnodes: usize,
285+
nqpts: usize,
286+
interp: &[crate::Scalar],
287+
curl: &[crate::Scalar],
288+
qref: &[crate::Scalar],
289+
qweight: &[crate::Scalar],
290+
) -> crate::Result<Self> {
291+
let mut ptr = std::ptr::null_mut();
292+
let (topo, ncomp, nnodes, nqpts) = (
293+
topo as bind_ceed::CeedElemTopology,
294+
i32::try_from(ncomp).unwrap(),
295+
i32::try_from(nnodes).unwrap(),
296+
i32::try_from(nqpts).unwrap(),
297+
);
298+
let ierr = unsafe {
299+
bind_ceed::CeedBasisCreateHcurl(
300+
ceed.ptr,
301+
topo,
302+
ncomp,
303+
nnodes,
304+
nqpts,
305+
interp.as_ptr(),
306+
curl.as_ptr(),
307+
qref.as_ptr(),
308+
qweight.as_ptr(),
309+
&mut ptr,
310+
)
311+
};
312+
ceed.check_error(ierr)?;
313+
Ok(Self {
314+
ptr,
315+
_lifeline: PhantomData,
316+
})
317+
}
318+
241319
// Error handling
242320
#[doc(hidden)]
243321
fn check_error(&self, ierr: i32) -> crate::Result<i32> {

0 commit comments

Comments
 (0)