Skip to content

Commit 9560d06

Browse files
committed
interface - add reference copying functions
Co-authored-by: Jed Brown <jed@jedbrown.org>
1 parent 34359f1 commit 9560d06

16 files changed

Lines changed: 411 additions & 38 deletions

include/ceed/backend.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ CEED_EXTERN int CeedSetBackendFunction(Ceed ceed,
9393
const char *func_name, int (*f)());
9494
CEED_EXTERN int CeedGetData(Ceed ceed, void *data);
9595
CEED_EXTERN int CeedSetData(Ceed ceed, void *data);
96-
CEED_EXTERN int CeedIncrementRefCounter(Ceed ceed);
96+
CEED_EXTERN int CeedReference(Ceed ceed);
9797

9898
CEED_EXTERN int CeedVectorGetCeed(CeedVector vec, Ceed *ceed);
9999
CEED_EXTERN int CeedVectorGetState(CeedVector vec, uint64_t *state);
100100
CEED_EXTERN int CeedVectorAddReference(CeedVector vec);
101101
CEED_EXTERN int CeedVectorGetData(CeedVector vec, void *data);
102102
CEED_EXTERN int CeedVectorSetData(CeedVector vec, void *data);
103-
CEED_EXTERN int CeedVectorIncrementRefCounter(CeedVector vec);
103+
CEED_EXTERN int CeedVectorReference(CeedVector vec);
104104

105105
CEED_EXTERN int CeedElemRestrictionGetCeed(CeedElemRestriction rstr,
106106
Ceed *ceed);
@@ -122,7 +122,7 @@ CEED_EXTERN int CeedElemRestrictionGetData(CeedElemRestriction rstr,
122122
void *data);
123123
CEED_EXTERN int CeedElemRestrictionSetData(CeedElemRestriction rstr,
124124
void *data);
125-
CEED_EXTERN int CeedElemRestrictionIncrementRefCounter(CeedElemRestriction rstr);
125+
CEED_EXTERN int CeedElemRestrictionReference(CeedElemRestriction rstr);
126126

127127
CEED_EXTERN int CeedBasisGetCollocatedGrad(CeedBasis basis,
128128
CeedScalar *colo_grad_1d);
@@ -133,7 +133,7 @@ CEED_EXTERN int CeedBasisGetCeed(CeedBasis basis, Ceed *ceed);
133133
CEED_EXTERN int CeedBasisIsTensor(CeedBasis basis, bool *is_tensor);
134134
CEED_EXTERN int CeedBasisGetData(CeedBasis basis, void *data);
135135
CEED_EXTERN int CeedBasisSetData(CeedBasis basis, void *data);
136-
CEED_EXTERN int CeedBasisIncrementRefCounter(CeedBasis basis);
136+
CEED_EXTERN int CeedBasisReference(CeedBasis basis);
137137

138138
CEED_EXTERN int CeedBasisGetTopologyDimension(CeedElemTopology topo,
139139
CeedInt *dim);
@@ -157,7 +157,7 @@ CEED_EXTERN int CeedTensorContractGetData(CeedTensorContract contract,
157157
void *data);
158158
CEED_EXTERN int CeedTensorContractSetData(CeedTensorContract contract,
159159
void *data);
160-
CEED_EXTERN int CeedTensorContractIncrementRefCounter(CeedTensorContract contract);
160+
CEED_EXTERN int CeedTensorContractReference(CeedTensorContract contract);
161161
CEED_EXTERN int CeedTensorContractDestroy(CeedTensorContract *contract);
162162

163163
CEED_EXTERN int CeedQFunctionRegister(const char *, const char *, CeedInt,
@@ -179,7 +179,7 @@ CEED_EXTERN int CeedQFunctionGetInnerContext(CeedQFunction qf,
179179
CEED_EXTERN int CeedQFunctionIsIdentity(CeedQFunction qf, bool *is_identity);
180180
CEED_EXTERN int CeedQFunctionGetData(CeedQFunction qf, void *data);
181181
CEED_EXTERN int CeedQFunctionSetData(CeedQFunction qf, void *data);
182-
CEED_EXTERN int CeedQFunctionIncrementRefCounter(CeedQFunction qf);
182+
CEED_EXTERN int CeedQFunctionReference(CeedQFunction qf);
183183
CEED_EXTERN int CeedQFunctionGetFields(CeedQFunction qf,
184184
CeedQFunctionField **input_fields,
185185
CeedQFunctionField **output_fields);
@@ -200,7 +200,7 @@ CEED_EXTERN int CeedQFunctionContextGetBackendData(CeedQFunctionContext ctx,
200200
void *data);
201201
CEED_EXTERN int CeedQFunctionContextSetBackendData(CeedQFunctionContext ctx,
202202
void *data);
203-
CEED_EXTERN int CeedQFunctionContextIncrementRefCounter(CeedQFunctionContext ctx);
203+
CEED_EXTERN int CeedQFunctionContextReference(CeedQFunctionContext ctx);
204204

205205
CEED_EXTERN int CeedOperatorGetCeed(CeedOperator op, Ceed *ceed);
206206
CEED_EXTERN int CeedOperatorGetNumElements(CeedOperator op, CeedInt *num_elem);
@@ -215,7 +215,7 @@ CEED_EXTERN int CeedOperatorGetSubList(CeedOperator op,
215215
CeedOperator **sub_operators);
216216
CEED_EXTERN int CeedOperatorGetData(CeedOperator op, void *data);
217217
CEED_EXTERN int CeedOperatorSetData(CeedOperator op, void *data);
218-
CEED_EXTERN int CeedOperatorIncrementRefCounter(CeedOperator op);
218+
CEED_EXTERN int CeedOperatorReference(CeedOperator op);
219219
CEED_EXTERN int CeedOperatorSetSetupDone(CeedOperator op);
220220

221221
CEED_EXTERN int CeedOperatorGetFields(CeedOperator op,

include/ceed/ceed.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ typedef struct CeedOperator_private *CeedOperator;
150150

151151
CEED_EXTERN int CeedRegistryGetList(size_t *n, char ***const resources, CeedInt **array);
152152
CEED_EXTERN int CeedInit(const char *resource, Ceed *ceed);
153+
CEED_EXTERN int CeedReferenceCopy(Ceed ceed, Ceed *ceed_copy);
153154
CEED_EXTERN int CeedGetResource(Ceed ceed, const char **resource);
154155
CEED_EXTERN int CeedIsDeterministic(Ceed ceed, bool *is_deterministic);
155156
CEED_EXTERN int CeedView(Ceed ceed, FILE *stream);
@@ -304,6 +305,7 @@ typedef enum {
304305
CEED_EXTERN const char *const CeedCopyModes[];
305306

306307
CEED_EXTERN int CeedVectorCreate(Ceed ceed, CeedInt len, CeedVector *vec);
308+
CEED_EXTERN int CeedVectorReferenceCopy(CeedVector vec, CeedVector *vec_copy);
307309
CEED_EXTERN int CeedVectorSetArray(CeedVector vec, CeedMemType mem_type,
308310
CeedCopyMode copy_mode, CeedScalar *array);
309311
CEED_EXTERN int CeedVectorSetValue(CeedVector vec, CeedScalar value);
@@ -386,6 +388,8 @@ CEED_EXTERN int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInt num_elem,
386388
CEED_EXTERN int CeedElemRestrictionCreateBlockedStrided(Ceed ceed,
387389
CeedInt num_elem, CeedInt elem_size, CeedInt blk_size, CeedInt num_comp,
388390
CeedInt l_size, const CeedInt strides[3], CeedElemRestriction *rstr);
391+
CEED_EXTERN int CeedElemRestrictionReferenceCopy(CeedElemRestriction rstr,
392+
CeedElemRestriction *rstr_copy);
389393
CEED_EXTERN int CeedElemRestrictionCreateVector(CeedElemRestriction rstr,
390394
CeedVector *lvec, CeedVector *evec);
391395
CEED_EXTERN int CeedElemRestrictionApply(CeedElemRestriction rstr,
@@ -489,6 +493,7 @@ CEED_EXTERN int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo,
489493
const CeedScalar *grad,
490494
const CeedScalar *q_ref,
491495
const CeedScalar *q_weights, CeedBasis *basis);
496+
CEED_EXTERN int CeedBasisReferenceCopy(CeedBasis basis, CeedBasis *basis_copy);
492497
CEED_EXTERN int CeedBasisView(CeedBasis basis, FILE *stream);
493498
CEED_EXTERN int CeedBasisApply(CeedBasis basis, CeedInt num_elem,
494499
CeedTransposeMode t_mode,
@@ -554,6 +559,7 @@ CEED_EXTERN int CeedQFunctionCreateInteriorByName(Ceed ceed, const char *name,
554559
CeedQFunction *qf);
555560
CEED_EXTERN int CeedQFunctionCreateIdentity(Ceed ceed, CeedInt size,
556561
CeedEvalMode in_mode, CeedEvalMode out_mode, CeedQFunction *qf);
562+
CEED_EXTERN int CeedQFunctionReferenceCopy(CeedQFunction qf, CeedQFunction *qf_copy);
557563
CEED_EXTERN int CeedQFunctionAddInput(CeedQFunction qf, const char *field_name,
558564
CeedInt size, CeedEvalMode eval_mode);
559565
CEED_EXTERN int CeedQFunctionAddOutput(CeedQFunction qf, const char *field_name,
@@ -567,6 +573,8 @@ CEED_EXTERN int CeedQFunctionDestroy(CeedQFunction *qf);
567573

568574
CEED_EXTERN int CeedQFunctionContextCreate(Ceed ceed,
569575
CeedQFunctionContext *ctx);
576+
CEED_EXTERN int CeedQFunctionContextReferenceCopy(CeedQFunctionContext ctx,
577+
CeedQFunctionContext *ctx_copy);
570578
CEED_EXTERN int CeedQFunctionContextSetData(CeedQFunctionContext ctx,
571579
CeedMemType mem_type, CeedCopyMode copy_mode, size_t size, void *data);
572580
CEED_EXTERN int CeedQFunctionContextGetData(CeedQFunctionContext ctx,
@@ -582,6 +590,7 @@ CEED_EXTERN int CeedOperatorCreate(Ceed ceed, CeedQFunction qf,
582590
CeedQFunction dqf, CeedQFunction dqfT,
583591
CeedOperator *op);
584592
CEED_EXTERN int CeedCompositeOperatorCreate(Ceed ceed, CeedOperator *op);
593+
CEED_EXTERN int CeedOperatorReferenceCopy(CeedOperator op, CeedOperator *op_copy);
585594
CEED_EXTERN int CeedOperatorSetField(CeedOperator op, const char *field_name,
586595
CeedElemRestriction r, CeedBasis b,
587596
CeedVector v);

interface/ceed-basis.c

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ int CeedBasisSetData(CeedBasis basis, void *data) {
304304
305305
@ref Backend
306306
**/
307-
int CeedBasisIncrementRefCounter(CeedBasis basis) {
307+
int CeedBasisReference(CeedBasis basis) {
308308
basis->ref_count++;
309309
return CEED_ERROR_SUCCESS;
310310
}
@@ -352,7 +352,7 @@ int CeedBasisGetTensorContract(CeedBasis basis, CeedTensorContract *contract) {
352352
int CeedBasisSetTensorContract(CeedBasis basis, CeedTensorContract contract) {
353353
int ierr;
354354
basis->contract = contract;
355-
ierr = CeedTensorContractIncrementRefCounter(contract); CeedChk(ierr);
355+
ierr = CeedTensorContractReference(contract); CeedChk(ierr);
356356
return CEED_ERROR_SUCCESS;
357357
}
358358

@@ -451,7 +451,7 @@ int CeedBasisCreateTensorH1(Ceed ceed, CeedInt dim, CeedInt num_comp,
451451

452452
ierr = CeedCalloc(1, basis); CeedChk(ierr);
453453
(*basis)->ceed = ceed;
454-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
454+
ierr = CeedReference(ceed); CeedChk(ierr);
455455
(*basis)->ref_count = 1;
456456
(*basis)->tensor_basis = 1;
457457
(*basis)->dim = dim;
@@ -612,7 +612,7 @@ int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo, CeedInt num_comp,
612612
ierr = CeedBasisGetTopologyDimension(topo, &dim); CeedChk(ierr);
613613

614614
(*basis)->ceed = ceed;
615-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
615+
ierr = CeedReference(ceed); CeedChk(ierr);
616616
(*basis)->ref_count = 1;
617617
(*basis)->tensor_basis = 0;
618618
(*basis)->dim = dim;
@@ -633,6 +633,30 @@ int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo, CeedInt num_comp,
633633
return CEED_ERROR_SUCCESS;
634634
}
635635

636+
/**
637+
@brief Copy the pointer to a CeedBasis. Both pointers should
638+
be destroyed with `CeedBasisDestroy()`;
639+
Note: If `*basis_copy` is non-NULL, then it is assumed that
640+
`*basis_copy` is a pointer to a CeedBasis. This CeedBasis
641+
will be destroyed if `*basis_copy` is the only
642+
reference to this CeedBasis.
643+
644+
@param basis CeedBasis to copy reference to
645+
@param[out] basis_copy Variable to store copied reference
646+
647+
@return An error code: 0 - success, otherwise - failure
648+
649+
@ref User
650+
**/
651+
int CeedBasisReferenceCopy(CeedBasis basis, CeedBasis *basis_copy) {
652+
int ierr;
653+
654+
ierr = CeedBasisReference(basis); CeedChk(ierr);
655+
ierr = CeedBasisDestroy(basis_copy); CeedChk(ierr);
656+
*basis_copy = basis;
657+
return CEED_ERROR_SUCCESS;
658+
}
659+
636660
/**
637661
@brief View a CeedBasis
638662

interface/ceed-elemrestriction.c

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ int CeedElemRestrictionSetData(CeedElemRestriction rstr, void *data) {
280280
281281
@ref Backend
282282
**/
283-
int CeedElemRestrictionIncrementRefCounter(CeedElemRestriction rstr) {
283+
int CeedElemRestrictionReference(CeedElemRestriction rstr) {
284284
rstr->ref_count++;
285285
return CEED_ERROR_SUCCESS;
286286
}
@@ -358,7 +358,7 @@ int CeedElemRestrictionCreate(Ceed ceed, CeedInt num_elem, CeedInt elem_size,
358358

359359
ierr = CeedCalloc(1, rstr); CeedChk(ierr);
360360
(*rstr)->ceed = ceed;
361-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
361+
ierr = CeedReference(ceed); CeedChk(ierr);
362362
(*rstr)->ref_count = 1;
363363
(*rstr)->num_elem = num_elem;
364364
(*rstr)->elem_size = elem_size;
@@ -421,7 +421,7 @@ int CeedElemRestrictionCreateStrided(Ceed ceed, CeedInt num_elem,
421421

422422
ierr = CeedCalloc(1, rstr); CeedChk(ierr);
423423
(*rstr)->ceed = ceed;
424-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
424+
ierr = CeedReference(ceed); CeedChk(ierr);
425425
(*rstr)->ref_count = 1;
426426
(*rstr)->num_elem = num_elem;
427427
(*rstr)->elem_size = elem_size;
@@ -506,7 +506,7 @@ int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInt num_elem,
506506
elem_size); CeedChk(ierr);
507507

508508
(*rstr)->ceed = ceed;
509-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
509+
ierr = CeedReference(ceed); CeedChk(ierr);
510510
(*rstr)->ref_count = 1;
511511
(*rstr)->num_elem = num_elem;
512512
(*rstr)->elem_size = elem_size;
@@ -572,7 +572,7 @@ int CeedElemRestrictionCreateBlockedStrided(Ceed ceed, CeedInt num_elem,
572572
ierr = CeedCalloc(1, rstr); CeedChk(ierr);
573573

574574
(*rstr)->ceed = ceed;
575-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
575+
ierr = CeedReference(ceed); CeedChk(ierr);
576576
(*rstr)->ref_count = 1;
577577
(*rstr)->num_elem = num_elem;
578578
(*rstr)->elem_size = elem_size;
@@ -588,6 +588,31 @@ int CeedElemRestrictionCreateBlockedStrided(Ceed ceed, CeedInt num_elem,
588588
return CEED_ERROR_SUCCESS;
589589
}
590590

591+
/**
592+
@brief Copy the pointer to a CeedElemRestriction. Both pointers should
593+
be destroyed with `CeedElemRestrictionDestroy()`;
594+
Note: If `*rstr_copy` is non-NULL, then it is assumed that
595+
`*rstr_copy` is a pointer to a CeedElemRestriction. This
596+
CeedElemRestriction will be destroyed if `*rstr_copy` is the
597+
only reference to this CeedElemRestriction.
598+
599+
@param rstr CeedElemRestriction to copy reference to
600+
@param[out] rstr_copy Variable to store copied reference
601+
602+
@return An error code: 0 - success, otherwise - failure
603+
604+
@ref User
605+
**/
606+
int CeedElemRestrictionReferenceCopy(CeedElemRestriction rstr,
607+
CeedElemRestriction *rstr_copy) {
608+
int ierr;
609+
610+
ierr = CeedElemRestrictionReference(rstr); CeedChk(ierr);
611+
ierr = CeedElemRestrictionDestroy(rstr_copy); CeedChk(ierr);
612+
*rstr_copy = rstr;
613+
return CEED_ERROR_SUCCESS;
614+
}
615+
591616
/**
592617
@brief Create CeedVectors associated with a CeedElemRestriction
593618

interface/ceed-operator.c

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ int CeedOperatorSetData(CeedOperator op, void *data) {
763763
764764
@ref Backend
765765
**/
766-
int CeedOperatorIncrementRefCounter(CeedOperator op) {
766+
int CeedOperatorReference(CeedOperator op) {
767767
op->ref_count++;
768768
return CEED_ERROR_SUCCESS;
769769
}
@@ -908,17 +908,17 @@ int CeedOperatorCreate(Ceed ceed, CeedQFunction qf, CeedQFunction dqf,
908908
// LCOV_EXCL_STOP
909909
ierr = CeedCalloc(1, op); CeedChk(ierr);
910910
(*op)->ceed = ceed;
911-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
911+
ierr = CeedReference(ceed); CeedChk(ierr);
912912
(*op)->ref_count = 1;
913913
(*op)->qf = qf;
914-
ierr = CeedQFunctionIncrementRefCounter(qf); CeedChk(ierr);
914+
ierr = CeedQFunctionReference(qf); CeedChk(ierr);
915915
if (dqf && dqf != CEED_QFUNCTION_NONE) {
916916
(*op)->dqf = dqf;
917-
ierr = CeedQFunctionIncrementRefCounter(dqf); CeedChk(ierr);
917+
ierr = CeedQFunctionReference(dqf); CeedChk(ierr);
918918
}
919919
if (dqfT && dqfT != CEED_QFUNCTION_NONE) {
920920
(*op)->dqfT = dqfT;
921-
ierr = CeedQFunctionIncrementRefCounter(dqfT); CeedChk(ierr);
921+
ierr = CeedQFunctionReference(dqfT); CeedChk(ierr);
922922
}
923923
ierr = CeedCalloc(16, &(*op)->input_fields); CeedChk(ierr);
924924
ierr = CeedCalloc(16, &(*op)->output_fields); CeedChk(ierr);
@@ -952,7 +952,7 @@ int CeedCompositeOperatorCreate(Ceed ceed, CeedOperator *op) {
952952

953953
ierr = CeedCalloc(1, op); CeedChk(ierr);
954954
(*op)->ceed = ceed;
955-
ierr = CeedIncrementRefCounter(ceed); CeedChk(ierr);
955+
ierr = CeedReference(ceed); CeedChk(ierr);
956956
(*op)->composite = true;
957957
ierr = CeedCalloc(16, &(*op)->sub_operators); CeedChk(ierr);
958958

@@ -962,6 +962,30 @@ int CeedCompositeOperatorCreate(Ceed ceed, CeedOperator *op) {
962962
return CEED_ERROR_SUCCESS;
963963
}
964964

965+
/**
966+
@brief Copy the pointer to a CeedOperator. Both pointers should
967+
be destroyed with `CeedOperatorDestroy()`;
968+
Note: If `*op_copy` is non-NULL, then it is assumed that
969+
`*op_copy` is a pointer to a CeedOperator. This
970+
CeedOperator will be destroyed if `*op_copy` is the only
971+
reference to this CeedOperator.
972+
973+
@param op CeedOperator to copy reference to
974+
@param[out] op_copy Variable to store copied reference
975+
976+
@return An error code: 0 - success, otherwise - failure
977+
978+
@ref User
979+
**/
980+
int CeedOperatorReferenceCopy(CeedOperator op, CeedOperator *op_copy) {
981+
int ierr;
982+
983+
ierr = CeedOperatorReference(op); CeedChk(ierr);
984+
ierr = CeedOperatorDestroy(op_copy); CeedChk(ierr);
985+
*op_copy = op;
986+
return CEED_ERROR_SUCCESS;
987+
}
988+
965989
/**
966990
@brief Provide a field to a CeedOperator for use by its CeedQFunction
967991
@@ -1062,11 +1086,11 @@ int CeedOperatorSetField(CeedOperator op, const char *field_name,
10621086

10631087
(*op_field)->vec = v;
10641088
if (v != CEED_VECTOR_ACTIVE && v != CEED_VECTOR_NONE) {
1065-
ierr = CeedVectorIncrementRefCounter(v); CeedChk(ierr);
1089+
ierr = CeedVectorReference(v); CeedChk(ierr);
10661090
}
10671091

10681092
(*op_field)->elem_restr = r;
1069-
ierr = CeedElemRestrictionIncrementRefCounter(r); CeedChk(ierr);
1093+
ierr = CeedElemRestrictionReference(r); CeedChk(ierr);
10701094
if (r != CEED_ELEMRESTRICTION_NONE) {
10711095
op->num_elem = num_elem;
10721096
op->has_restriction = true; // Restriction set, but num_elem may be 0
@@ -1075,7 +1099,7 @@ int CeedOperatorSetField(CeedOperator op, const char *field_name,
10751099
(*op_field)->basis = b;
10761100
if (b != CEED_BASIS_COLLOCATED) {
10771101
op->num_qpts = num_qpts;
1078-
ierr = CeedBasisIncrementRefCounter(b); CeedChk(ierr);
1102+
ierr = CeedBasisReference(b); CeedChk(ierr);
10791103
}
10801104

10811105
op->num_fields += 1;
@@ -1114,7 +1138,7 @@ int CeedCompositeOperatorAddSub(CeedOperator composite_op,
11141138
// LCOV_EXCL_STOP
11151139

11161140
composite_op->sub_operators[composite_op->num_suboperators] = sub_op;
1117-
ierr = CeedOperatorIncrementRefCounter(sub_op); CeedChk(ierr);
1141+
ierr = CeedOperatorReference(sub_op); CeedChk(ierr);
11181142
composite_op->num_suboperators++;
11191143
return CEED_ERROR_SUCCESS;
11201144
}

0 commit comments

Comments
 (0)