Skip to content

Commit 5d082c8

Browse files
committed
minor - fix edge cases in assembly fallback to prevent segmentation fault on initialized vector
1 parent e647d04 commit 5d082c8

5 files changed

Lines changed: 26 additions & 18 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ On this page we provide a summary of the main API changes, new features and exam
1717
- Require use of `Ceed*Destroy()` on Ceed objects returned from `Ceed*Get*()`.
1818
- Rename `CeedCompositeOperatorCreate()` to `CeedOperatorCreateComposite()` for uniformity.
1919
- Rename `CeedCompositeOperator*()` to `CeedOperatorComposite*()` for uniformity.
20+
- Add `build_objects` parameter to `CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback` to allow for passing uninitialized vectors and restrictions
2021

2122
### New features
2223

backends/cuda-gen/ceed-cuda-gen-operator.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ static int CeedOperatorLinearAssembleQFunctionCore_Cuda_gen(CeedOperator op, boo
517517

518518
CeedDebug(CeedOperatorReturnCeed(op), "\nFalling back to /gpu/cuda/ref CeedOperator for LinearAssemblyQFunction\n");
519519
CeedCallBackend(CeedOperatorGetFallback(op, &op_fallback));
520-
CeedCallBackend(CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(op_fallback, assembled, rstr, request));
520+
CeedCallBackend(CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(op_fallback, build_objects, assembled, rstr, request));
521521
return CEED_ERROR_SUCCESS;
522522
}
523523
return CEED_ERROR_SUCCESS;

backends/hip-gen/ceed-hip-gen-operator.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ static int CeedOperatorLinearAssembleQFunctionCore_Hip_gen(CeedOperator op, bool
496496

497497
CeedDebug(CeedOperatorReturnCeed(op), "\nFalling back to /gpu/hip/ref CeedOperator for LinearAssembleQFunction\n");
498498
CeedCallBackend(CeedOperatorGetFallback(op, &op_fallback));
499-
CeedCallBackend(CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(op_fallback, assembled, rstr, request));
499+
CeedCallBackend(CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(op_fallback, build_objects, assembled, rstr, request));
500500
return CEED_ERROR_SUCCESS;
501501
}
502502
return CEED_ERROR_SUCCESS;

include/ceed/backend.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -473,8 +473,8 @@ CEED_EXTERN int CeedOperatorReference(CeedOperator op);
473473
CEED_EXTERN int CeedOperatorGetFallback(CeedOperator op, CeedOperator *op_fallback);
474474
CEED_EXTERN int CeedOperatorGetFallbackParent(CeedOperator op, CeedOperator *parent);
475475
CEED_EXTERN int CeedOperatorGetFallbackParentCeed(CeedOperator op, Ceed *parent);
476-
CEED_EXTERN int CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(CeedOperator op, CeedVector *assembled, CeedElemRestriction *rstr,
477-
CeedRequest *request);
476+
CEED_EXTERN int CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(CeedOperator op, bool build_objects, CeedVector *assembled,
477+
CeedElemRestriction *rstr, CeedRequest *request);
478478
CEED_INTERN int CeedOperatorAssembleSingle(CeedOperator op, CeedSize offset, CeedVector values);
479479
CEED_EXTERN int CeedOperatorSetSetupDone(CeedOperator op);
480480

interface/ceed-preconditioning.c

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -712,18 +712,19 @@ static int CeedOperatorAssembleSymbolicSingle(CeedOperator op, CeedSize offset,
712712
Note: If the value of `assembled` or `rstr` passed to this function are non-`NULL` , then it is assumed that they hold valid pointers.
713713
These objects will be destroyed if `*assembled` or `*rstr` is the only reference to the object.
714714
715-
@param[in] op `CeedOperator` to assemble `CeedQFunction`
716-
@param[in] use_parent Boolean flag to check for fallback parent implementation
717-
@param[out] assembled `CeedVector` to store assembled `CeedQFunction` at quadrature points
718-
@param[out] rstr `CeedElemRestriction` for `CeedVector` containing assembled `CeedQFunction`
719-
@param[in] request Address of @ref CeedRequest for non-blocking completion, else @ref CEED_REQUEST_IMMEDIATE
715+
@param[in] op `CeedOperator` to assemble `CeedQFunction`
716+
@param[in] build_objects Boolean flag indicating whether the `assembled` vector has been allocated
717+
@param[in] use_parent Boolean flag to check for fallback parent implementation
718+
@param[out] assembled `CeedVector` to store assembled `CeedQFunction` at quadrature points
719+
@param[out] rstr `CeedElemRestriction` for `CeedVector` containing assembled `CeedQFunction`
720+
@param[in] request Address of @ref CeedRequest for non-blocking completion, else @ref CEED_REQUEST_IMMEDIATE
720721
721722
@return An error code: 0 - success, otherwise - failure
722723
723724
@ref User
724725
**/
725-
static int CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(CeedOperator op, bool use_parent, CeedVector *assembled, CeedElemRestriction *rstr,
726-
CeedRequest *request) {
726+
static int CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(CeedOperator op, bool build_objects, bool use_parent, CeedVector *assembled,
727+
CeedElemRestriction *rstr, CeedRequest *request) {
727728
int (*LinearAssembleQFunctionUpdate)(CeedOperator, CeedVector, CeedElemRestriction, CeedRequest *) = NULL;
728729
CeedOperator op_assemble = NULL;
729730
CeedOperator op_fallback_parent = NULL;
@@ -766,6 +767,10 @@ static int CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(CeedOperator op
766767
CeedCall(CeedQFunctionAssemblyDataSetUpdateNeeded(data, false));
767768

768769
// Copy reference from internally held copy
770+
if (build_objects) {
771+
*assembled = NULL;
772+
*rstr = NULL;
773+
}
769774
CeedCall(CeedVectorReferenceCopy(assembled_vec, assembled));
770775
CeedCall(CeedElemRestrictionReferenceCopy(assembled_rstr, rstr));
771776
CeedCall(CeedVectorDestroy(&assembled_vec));
@@ -792,18 +797,19 @@ static int CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(CeedOperator op
792797
Note: If the value of `assembled` or `rstr` passed to this function are non-`NULL` , then it is assumed that they hold valid pointers.
793798
These objects will be destroyed if `*assembled` or `*rstr` is the only reference to the object.
794799
795-
@param[in] op `CeedOperator` to assemble `CeedQFunction`
796-
@param[out] assembled `CeedVector` to store assembled `CeedQFunction` at quadrature points
797-
@param[out] rstr `CeedElemRestriction` for `CeedVector` containing assembled `CeedQFunction`
798-
@param[in] request Address of @ref CeedRequest for non-blocking completion, else @ref CEED_REQUEST_IMMEDIATE
800+
@param[in] op `CeedOperator` to assemble `CeedQFunction`
801+
@param[in] build_objects Boolean flag indicating whether the `assembled` vector has been allocated
802+
@param[out] assembled `CeedVector` to store assembled `CeedQFunction` at quadrature points
803+
@param[out] rstr `CeedElemRestriction` for `CeedVector` containing assembled `CeedQFunction`
804+
@param[in] request Address of @ref CeedRequest for non-blocking completion, else @ref CEED_REQUEST_IMMEDIATE
799805
800806
@return An error code: 0 - success, otherwise - failure
801807
802808
@ref Developer
803809
**/
804-
int CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(CeedOperator op, CeedVector *assembled, CeedElemRestriction *rstr,
810+
int CeedOperatorLinearAssembleQFunctionBuildOrUpdateFallback(CeedOperator op, bool build_objects, CeedVector *assembled, CeedElemRestriction *rstr,
805811
CeedRequest *request) {
806-
return CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(op, false, assembled, rstr, request);
812+
return CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(op, build_objects, false, assembled, rstr, request);
807813
}
808814

809815
/**
@@ -2325,7 +2331,8 @@ int CeedOperatorLinearAssembleQFunction(CeedOperator op, CeedVector *assembled,
23252331
@ref User
23262332
**/
23272333
int CeedOperatorLinearAssembleQFunctionBuildOrUpdate(CeedOperator op, CeedVector *assembled, CeedElemRestriction *rstr, CeedRequest *request) {
2328-
return CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(op, true, assembled, rstr, request);
2334+
assert(assembled);
2335+
return CeedOperatorLinearAssembleQFunctionBuildOrUpdate_Core(op, *assembled == NULL, true, assembled, rstr, request);
23292336
}
23302337

23312338
/**

0 commit comments

Comments
 (0)