Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CeedElemRestriction for H(curl) #1265

Merged
merged 16 commits into from
Aug 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
77d1c12
Element restriction for high-order (> 1) H(curl) elements requiring m…
sebastiangrimberg Mar 2, 2023
fcbe8c0
enum CeedRestrictionType for CeedElemRestriction type
sebastiangrimberg Apr 24, 2023
9475e04
Fix bugs for blocked ElemRestriction apply
sebastiangrimberg Jul 27, 2023
0305e20
Update backends for unified ElemRestrictionCreate variants for all re…
sebastiangrimberg May 6, 2023
bd403d5
Add unit tests for curl-conforming restriction
sebastiangrimberg Mar 2, 2023
0c73c03
Improve element restriction for H(curl) spaces by reorganizing loops,…
sebastiangrimberg Jun 22, 2023
20a9377
Address PR comment on hidden variable and clarify by renaming
sebastiangrimberg Jul 20, 2023
7c1dbaf
Operator full assembly with oriented or curl-conforming element restr…
sebastiangrimberg May 6, 2023
94648b7
Organize element restriction variants in ref backend
sebastiangrimberg Jul 13, 2023
709403c
Update Julia/Python/Rust/Fortran bindings
sebastiangrimberg Apr 17, 2023
61a27d7
CEED_RESTRICTION_DEFAULT -> CEED_RESTRICTION_STANDARD
sebastiangrimberg Jul 25, 2023
0012573
Add missing checks for support of different element restriction types…
sebastiangrimberg Jul 25, 2023
89edb9e
Attempting to resolve NVRTC and HIPRTC compilation errors
sebastiangrimberg Jul 26, 2023
b9ef437
Address PR comments for Python API docstrings
sebastiangrimberg Jul 26, 2023
b8c4711
Update releasenodes.md and AUTHORS
sebastiangrimberg Jul 27, 2023
c16dd8e
Update unit tests to improve coverage
sebastiangrimberg Jul 28, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Jean-Sylvain Camier
Veselin Dobrev
Yohann Dudouit
Leila Ghaffari
Sebastian Grimberg
Tzanio Kolev
David Medina
Will Pazner
Expand Down
57 changes: 41 additions & 16 deletions backends/blocked/ceed-blocked-operator.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,29 +41,54 @@ static int CeedOperatorSetupFields_Blocked(CeedQFunction qf, CeedOperator op, bo
CeedCallBackend(CeedQFunctionFieldGetEvalMode(qf_fields[i], &eval_mode));

if (eval_mode != CEED_EVAL_WEIGHT) {
Ceed ceed_rstr;
CeedCallBackend(CeedOperatorFieldGetElemRestriction(op_fields[i], &r));
CeedCallBackend(CeedElemRestrictionGetCeed(r, &ceed));
CeedCallBackend(CeedElemRestrictionGetCeed(r, &ceed_rstr));
CeedSize l_size;
CeedInt num_elem, elem_size, comp_stride;
CeedCallBackend(CeedElemRestrictionGetNumElements(r, &num_elem));
CeedCallBackend(CeedElemRestrictionGetElementSize(r, &elem_size));
CeedCallBackend(CeedElemRestrictionGetLVectorSize(r, &l_size));
CeedCallBackend(CeedElemRestrictionGetNumComponents(r, &num_comp));

bool strided;
CeedCallBackend(CeedElemRestrictionIsStrided(r, &strided));
if (strided) {
CeedInt strides[3];
CeedCallBackend(CeedElemRestrictionGetStrides(r, &strides));
CeedCallBackend(
CeedElemRestrictionCreateBlockedStrided(ceed, num_elem, elem_size, blk_size, num_comp, l_size, strides, &blk_restr[i + start_e]));
} else {
const CeedInt *offsets = NULL;
CeedCallBackend(CeedElemRestrictionGetOffsets(r, CEED_MEM_HOST, &offsets));
CeedCallBackend(CeedElemRestrictionGetCompStride(r, &comp_stride));
CeedCallBackend(CeedElemRestrictionCreateBlocked(ceed, num_elem, elem_size, blk_size, num_comp, comp_stride, l_size, CEED_MEM_HOST,
CEED_COPY_VALUES, offsets, &blk_restr[i + start_e]));
CeedCallBackend(CeedElemRestrictionRestoreOffsets(r, &offsets));
CeedCallBackend(CeedElemRestrictionGetCompStride(r, &comp_stride));

CeedRestrictionType rstr_type;
CeedCallBackend(CeedElemRestrictionGetType(r, &rstr_type));
switch (rstr_type) {
case CEED_RESTRICTION_STANDARD: {
const CeedInt *offsets = NULL;
CeedCallBackend(CeedElemRestrictionGetOffsets(r, CEED_MEM_HOST, &offsets));
CeedCallBackend(CeedElemRestrictionCreateBlocked(ceed_rstr, num_elem, elem_size, blk_size, num_comp, comp_stride, l_size, CEED_MEM_HOST,
CEED_COPY_VALUES, offsets, &blk_restr[i + start_e]));
CeedCallBackend(CeedElemRestrictionRestoreOffsets(r, &offsets));
} break;
case CEED_RESTRICTION_ORIENTED: {
const CeedInt *offsets = NULL;
const bool *orients = NULL;
CeedCallBackend(CeedElemRestrictionGetOffsets(r, CEED_MEM_HOST, &offsets));
CeedCallBackend(CeedElemRestrictionGetOrientations(r, CEED_MEM_HOST, &orients));
CeedCallBackend(CeedElemRestrictionCreateBlockedOriented(ceed_rstr, num_elem, elem_size, blk_size, num_comp, comp_stride, l_size,
CEED_MEM_HOST, CEED_COPY_VALUES, offsets, orients, &blk_restr[i + start_e]));
CeedCallBackend(CeedElemRestrictionRestoreOffsets(r, &offsets));
CeedCallBackend(CeedElemRestrictionRestoreOrientations(r, &orients));
} break;
case CEED_RESTRICTION_CURL_ORIENTED: {
const CeedInt *offsets = NULL;
const CeedInt8 *curl_orients = NULL;
CeedCallBackend(CeedElemRestrictionGetOffsets(r, CEED_MEM_HOST, &offsets));
CeedCallBackend(CeedElemRestrictionGetCurlOrientations(r, CEED_MEM_HOST, &curl_orients));
CeedCallBackend(CeedElemRestrictionCreateBlockedCurlOriented(ceed_rstr, num_elem, elem_size, blk_size, num_comp, comp_stride, l_size,
CEED_MEM_HOST, CEED_COPY_VALUES, offsets, curl_orients,
&blk_restr[i + start_e]));
CeedCallBackend(CeedElemRestrictionRestoreOffsets(r, &offsets));
CeedCallBackend(CeedElemRestrictionRestoreCurlOrientations(r, &curl_orients));
} break;
case CEED_RESTRICTION_STRIDED: {
CeedInt strides[3];
CeedCallBackend(CeedElemRestrictionGetStrides(r, &strides));
CeedCallBackend(
CeedElemRestrictionCreateBlockedStrided(ceed_rstr, num_elem, elem_size, blk_size, num_comp, l_size, strides, &blk_restr[i + start_e]));
} break;
}
CeedCallBackend(CeedElemRestrictionCreateVector(blk_restr[i + start_e], NULL, &e_vecs_full[i + start_e]));
}
Expand Down
9 changes: 8 additions & 1 deletion backends/cuda-ref/ceed-cuda-ref-restriction.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,8 @@ static int CeedElemRestrictionOffset_Cuda(const CeedElemRestriction r, const Cee
//------------------------------------------------------------------------------
// Create restriction
//------------------------------------------------------------------------------
int CeedElemRestrictionCreate_Cuda(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, CeedElemRestriction r) {
int CeedElemRestrictionCreate_Cuda(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, const bool *orients,
const CeedInt8 *curl_orients, CeedElemRestriction r) {
Ceed ceed;
CeedCallBackend(CeedElemRestrictionGetCeed(r, &ceed));
CeedElemRestriction_Cuda *impl;
Expand All @@ -222,6 +223,11 @@ int CeedElemRestrictionCreate_Cuda(CeedMemType mem_type, CeedCopyMode copy_mode,
CeedInt strides[3] = {1, size, elem_size};
CeedInt comp_stride = 1;

CeedRestrictionType rstr_type;
CeedCallBackend(CeedElemRestrictionGetType(r, &rstr_type));
CeedCheck(rstr_type != CEED_RESTRICTION_ORIENTED && rstr_type != CEED_RESTRICTION_CURL_ORIENTED, ceed, CEED_ERROR_BACKEND,
"Backend does not implement CeedElemRestrictionCreateOriented or CeedElemRestrictionCreateCurlOriented");

// Stride data
bool is_strided;
CeedCallBackend(CeedElemRestrictionIsStrided(r, &is_strided));
Expand Down Expand Up @@ -323,6 +329,7 @@ int CeedElemRestrictionCreate_Cuda(CeedMemType mem_type, CeedCopyMode copy_mode,
// Register backend functions
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "Apply", CeedElemRestrictionApply_Cuda));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "ApplyUnsigned", CeedElemRestrictionApply_Cuda));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "ApplyUnoriented", CeedElemRestrictionApply_Cuda));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "GetOffsets", CeedElemRestrictionGetOffsets_Cuda));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "Destroy", CeedElemRestrictionDestroy_Cuda));
return CEED_ERROR_SUCCESS;
Expand Down
3 changes: 2 additions & 1 deletion backends/cuda-ref/ceed-cuda-ref.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,8 @@ CEED_INTERN int CeedGetCublasHandle_Cuda(Ceed ceed, cublasHandle_t *handle);

CEED_INTERN int CeedVectorCreate_Cuda(CeedSize n, CeedVector vec);

CEED_INTERN int CeedElemRestrictionCreate_Cuda(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, CeedElemRestriction r);
CEED_INTERN int CeedElemRestrictionCreate_Cuda(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, const bool *orients,
const CeedInt8 *curl_orients, CeedElemRestriction r);

CEED_INTERN int CeedBasisCreateTensorH1_Cuda(CeedInt dim, CeedInt P_1d, CeedInt Q_1d, const CeedScalar *interp_1d, const CeedScalar *grad_1d,
const CeedScalar *q_ref_1d, const CeedScalar *q_weight_1d, CeedBasis basis);
Expand Down
9 changes: 8 additions & 1 deletion backends/hip-ref/ceed-hip-ref-restriction.c
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,8 @@ static int CeedElemRestrictionOffset_Hip(const CeedElemRestriction r, const Ceed
//------------------------------------------------------------------------------
// Create restriction
//------------------------------------------------------------------------------
int CeedElemRestrictionCreate_Hip(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, CeedElemRestriction r) {
int CeedElemRestrictionCreate_Hip(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, const bool *orients,
const CeedInt8 *curl_orients, CeedElemRestriction r) {
Ceed ceed;
CeedCallBackend(CeedElemRestrictionGetCeed(r, &ceed));
CeedElemRestriction_Hip *impl;
Expand All @@ -220,6 +221,11 @@ int CeedElemRestrictionCreate_Hip(CeedMemType mem_type, CeedCopyMode copy_mode,
CeedInt strides[3] = {1, size, elem_size};
CeedInt comp_stride = 1;

CeedRestrictionType rstr_type;
CeedCallBackend(CeedElemRestrictionGetType(r, &rstr_type));
CeedCheck(rstr_type != CEED_RESTRICTION_ORIENTED && rstr_type != CEED_RESTRICTION_CURL_ORIENTED, ceed, CEED_ERROR_BACKEND,
"Backend does not implement CeedElemRestrictionCreateOriented or CeedElemRestrictionCreateCurlOriented");

// Stride data
bool is_strided;
CeedCallBackend(CeedElemRestrictionIsStrided(r, &is_strided));
Expand Down Expand Up @@ -321,6 +327,7 @@ int CeedElemRestrictionCreate_Hip(CeedMemType mem_type, CeedCopyMode copy_mode,
// Register backend functions
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "Apply", CeedElemRestrictionApply_Hip));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "ApplyUnsigned", CeedElemRestrictionApply_Hip));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "ApplyUnoriented", CeedElemRestrictionApply_Hip));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "GetOffsets", CeedElemRestrictionGetOffsets_Hip));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "Destroy", CeedElemRestrictionDestroy_Hip));
return CEED_ERROR_SUCCESS;
Expand Down
3 changes: 2 additions & 1 deletion backends/hip-ref/ceed-hip-ref.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,8 @@ CEED_INTERN int CeedGetHipblasHandle_Hip(Ceed ceed, hipblasHandle_t *handle);

CEED_INTERN int CeedVectorCreate_Hip(CeedSize n, CeedVector vec);

CEED_INTERN int CeedElemRestrictionCreate_Hip(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, CeedElemRestriction r);
CEED_INTERN int CeedElemRestrictionCreate_Hip(CeedMemType mem_type, CeedCopyMode copy_mode, const CeedInt *indices, const bool *orients,
const CeedInt8 *curl_orients, CeedElemRestriction r);

CEED_INTERN int CeedBasisCreateTensorH1_Hip(CeedInt dim, CeedInt P_1d, CeedInt Q_1d, const CeedScalar *interp_1d, const CeedScalar *grad_1d,
const CeedScalar *q_ref_1d, const CeedScalar *q_weight_1d, CeedBasis basis);
Expand Down
9 changes: 8 additions & 1 deletion backends/magma/ceed-magma-restriction.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ static int CeedElemRestrictionDestroy_Magma(CeedElemRestriction r) {
return CEED_ERROR_SUCCESS;
}

int CeedElemRestrictionCreate_Magma(CeedMemType mtype, CeedCopyMode cmode, const CeedInt *offsets, CeedElemRestriction r) {
int CeedElemRestrictionCreate_Magma(CeedMemType mtype, CeedCopyMode cmode, const CeedInt *offsets, const bool *orients, const CeedInt8 *curl_orients,
CeedElemRestriction r) {
Ceed ceed;
CeedCallBackend(CeedElemRestrictionGetCeed(r, &ceed));

Expand All @@ -163,6 +164,11 @@ int CeedElemRestrictionCreate_Magma(CeedMemType mtype, CeedCopyMode cmode, const
CeedCallBackend(CeedElemRestrictionGetElementSize(r, &elemsize));
CeedInt size = elemsize * nelem;

CeedRestrictionType rstr_type;
CeedCallBackend(CeedElemRestrictionGetType(r, &rstr_type));
CeedCheck(rstr_type != CEED_RESTRICTION_ORIENTED && rstr_type != CEED_RESTRICTION_CURL_ORIENTED, ceed, CEED_ERROR_BACKEND,
"Backend does not implement CeedElemRestrictionCreateOriented or CeedElemRestrictionCreateCurlOriented");

CeedElemRestriction_Magma *impl;
CeedCallBackend(CeedCalloc(1, &impl));

Expand Down Expand Up @@ -261,6 +267,7 @@ int CeedElemRestrictionCreate_Magma(CeedMemType mtype, CeedCopyMode cmode, const
CeedCallBackend(CeedElemRestrictionSetELayout(r, layout));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "Apply", CeedElemRestrictionApply_Magma));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "ApplyUnsigned", CeedElemRestrictionApply_Magma));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "ApplyUnoriented", CeedElemRestrictionApply_Magma));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "GetOffsets", CeedElemRestrictionGetOffsets_Magma));
CeedCallBackend(CeedSetBackendFunction(ceed, "ElemRestriction", r, "Destroy", CeedElemRestrictionDestroy_Magma));
CeedCallBackend(CeedFree(&restriction_kernel_path));
Expand Down
3 changes: 2 additions & 1 deletion backends/magma/ceed-magma.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ CEED_INTERN int CeedBasisCreateTensorH1_Magma(CeedInt dim, CeedInt P1d, CeedInt
CEED_INTERN int CeedBasisCreateH1_Magma(CeedElemTopology topo, CeedInt dim, CeedInt ndof, CeedInt nqpts, const CeedScalar *interp,
const CeedScalar *grad, const CeedScalar *qref, const CeedScalar *qweight, CeedBasis basis);

CEED_INTERN int CeedElemRestrictionCreate_Magma(CeedMemType mtype, CeedCopyMode cmode, const CeedInt *offsets, CeedElemRestriction r);
CEED_INTERN int CeedElemRestrictionCreate_Magma(CeedMemType mtype, CeedCopyMode cmode, const CeedInt *indices, const bool *orients,
const CeedInt8 *curl_orients, CeedElemRestriction r);

// comment the line below to use the default magma_is_devptr function
#define magma_is_devptr magma_isdevptr
Expand Down
14 changes: 9 additions & 5 deletions backends/occa/ceed-occa-elem-restriction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,14 +297,21 @@ int ElemRestriction::registerCeedFunction(Ceed ceed, CeedElemRestriction r, cons
return CeedSetBackendFunction(ceed, "ElemRestriction", r, fname, f);
}

int ElemRestriction::ceedCreate(CeedMemType memType, CeedCopyMode copyMode, const CeedInt *indicesInput, CeedElemRestriction r) {
int ElemRestriction::ceedCreate(CeedMemType memType, CeedCopyMode copyMode, const CeedInt *indicesInput, const bool *orientsInput,
const CeedInt8 *curlOrientsInput, CeedElemRestriction r) {
Ceed ceed;
CeedCallBackend(CeedElemRestrictionGetCeed(r, &ceed));

if ((memType != CEED_MEM_DEVICE) && (memType != CEED_MEM_HOST)) {
return staticCeedError("Only HOST and DEVICE CeedMemType supported");
}

CeedRestrictionType rstr_type;
CeedCallBackend(CeedElemRestrictionGetType(r, &rstr_type));
if ((rstr_type == CEED_RESTRICTION_ORIENTED) || (rstr_type == CEED_RESTRICTION_CURL_ORIENTED)) {
return staticCeedError("(OCCA) Backend does not implement CeedElemRestrictionCreateOriented or CeedElemRestrictionCreateCurlOriented");
}

ElemRestriction *elemRestriction = new ElemRestriction();
CeedCallBackend(CeedElemRestrictionSetData(r, elemRestriction));

Expand All @@ -317,17 +324,14 @@ int ElemRestriction::ceedCreate(CeedMemType memType, CeedCopyMode copyMode, cons

CeedOccaRegisterFunction(r, "Apply", ElemRestriction::ceedApply);
CeedOccaRegisterFunction(r, "ApplyUnsigned", ElemRestriction::ceedApply);
CeedOccaRegisterFunction(r, "ApplyUnoriented", ElemRestriction::ceedApply);
CeedOccaRegisterFunction(r, "ApplyBlock", ElemRestriction::ceedApplyBlock);
CeedOccaRegisterFunction(r, "GetOffsets", ElemRestriction::ceedGetOffsets);
CeedOccaRegisterFunction(r, "Destroy", ElemRestriction::ceedDestroy);

return CEED_ERROR_SUCCESS;
}

int ElemRestriction::ceedCreateBlocked(CeedMemType memType, CeedCopyMode copyMode, const CeedInt *indicesInput, CeedElemRestriction r) {
return staticCeedError("(OCCA) Backend does not implement CeedElemRestrictionCreateBlocked");
}

int ElemRestriction::ceedApply(CeedElemRestriction r, CeedTransposeMode tmode, CeedVector u, CeedVector v, CeedRequest *request) {
ElemRestriction *elemRestriction = ElemRestriction::from(r);
Vector *uVector = Vector::from(u);
Expand Down
5 changes: 2 additions & 3 deletions backends/occa/ceed-occa-elem-restriction.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,8 @@ class ElemRestriction : public CeedObject {
//---[ Ceed Callbacks ]-----------
static int registerCeedFunction(Ceed ceed, CeedElemRestriction r, const char *fname, ceed::occa::ceedFunction f);

static int ceedCreate(CeedMemType memType, CeedCopyMode copyMode, const CeedInt *indicesInput, CeedElemRestriction r);

static int ceedCreateBlocked(CeedMemType memType, CeedCopyMode copyMode, const CeedInt *indicesInput, CeedElemRestriction r);
static int ceedCreate(CeedMemType memType, CeedCopyMode copyMode, const CeedInt *indicesInput, const bool *orientsInput,
const CeedInt8 *curlOrientsInput, CeedElemRestriction r);

static int ceedApply(CeedElemRestriction r, CeedTransposeMode tmode, CeedVector u, CeedVector v, CeedRequest *request);

Expand Down
1 change: 0 additions & 1 deletion backends/occa/ceed-occa.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,6 @@ static int registerMethods(Ceed ceed) {
CeedOccaRegisterBaseFunction("BasisCreateTensorH1", ceed::occa::TensorBasis::ceedCreate);
CeedOccaRegisterBaseFunction("BasisCreateH1", ceed::occa::SimplexBasis::ceedCreate);
CeedOccaRegisterBaseFunction("ElemRestrictionCreate", ceed::occa::ElemRestriction::ceedCreate);
CeedOccaRegisterBaseFunction("ElemRestrictionCreateBlocked", ceed::occa::ElemRestriction::ceedCreateBlocked);
CeedOccaRegisterBaseFunction("QFunctionCreate", ceed::occa::QFunction::ceedCreate);
CeedOccaRegisterBaseFunction("QFunctionContextCreate", ceed::occa::QFunctionContext::ceedCreate);
CeedOccaRegisterBaseFunction("OperatorCreate", ceed::occa::Operator::ceedCreate);
Expand Down
8 changes: 2 additions & 6 deletions backends/occa/ceed-occa.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,8 @@ CEED_INTERN int CeedQFunctionCreate_Occa(CeedQFunction qf);
CEED_INTERN int CeedQFunctionContextCreate_Occa(CeedQFunctionContext ctx);

// *****************************************************************************
CEED_INTERN int CeedElemRestrictionCreate_Occa(const CeedMemType mtype, const CeedCopyMode cmode, const CeedInt *indices,
const CeedElemRestriction res);

// *****************************************************************************
CEED_INTERN int CeedElemRestrictionCreateBlocked_Occa(const CeedMemType mtype, const CeedCopyMode cmode, const CeedInt *indices,
const CeedElemRestriction res);
CEED_INTERN int CeedElemRestrictionCreate_Occa(const CeedMemType mtype, const CeedCopyMode cmode, const CeedInt *indices, const bool *orients,
const CeedInt8 *curl_orients, const CeedElemRestriction res);

// *****************************************************************************
CEED_INTERN int CeedVectorCreate_Occa(CeedInt n, CeedVector vec);
Loading