Skip to content

Commit 0ba6602

Browse files
committed
internal - add CeedObject to handle common functionality
1 parent c111d5d commit 0ba6602

File tree

14 files changed

+384
-147
lines changed

14 files changed

+384
-147
lines changed

backends/ref/ceed-ref-basis.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ int CeedBasisCreateTensorH1_Ref(CeedInt dim, CeedInt P_1d, CeedInt Q_1d, const C
295295

296296
CeedCallBackend(CeedTensorContractCreate(ceed_parent, &contract));
297297
CeedCallBackend(CeedBasisSetTensorContract(basis, contract));
298+
CeedCallBackend(CeedTensorContractDestroy(&contract));
298299

299300
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "Apply", CeedBasisApply_Ref));
300301
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "ApplyAdd", CeedBasisApplyAdd_Ref));
@@ -317,6 +318,7 @@ int CeedBasisCreateH1_Ref(CeedElemTopology topo, CeedInt dim, CeedInt num_nodes,
317318

318319
CeedCallBackend(CeedTensorContractCreate(ceed_parent, &contract));
319320
CeedCallBackend(CeedBasisSetTensorContract(basis, contract));
321+
CeedCallBackend(CeedTensorContractDestroy(&contract));
320322

321323
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "Apply", CeedBasisApply_Ref));
322324
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "ApplyAdd", CeedBasisApplyAdd_Ref));
@@ -338,6 +340,7 @@ int CeedBasisCreateHdiv_Ref(CeedElemTopology topo, CeedInt dim, CeedInt num_node
338340

339341
CeedCallBackend(CeedTensorContractCreate(ceed_parent, &contract));
340342
CeedCallBackend(CeedBasisSetTensorContract(basis, contract));
343+
CeedCallBackend(CeedTensorContractDestroy(&contract));
341344

342345
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "Apply", CeedBasisApply_Ref));
343346
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "ApplyAdd", CeedBasisApplyAdd_Ref));
@@ -359,6 +362,7 @@ int CeedBasisCreateHcurl_Ref(CeedElemTopology topo, CeedInt dim, CeedInt num_nod
359362

360363
CeedCallBackend(CeedTensorContractCreate(ceed_parent, &contract));
361364
CeedCallBackend(CeedBasisSetTensorContract(basis, contract));
365+
CeedCallBackend(CeedTensorContractDestroy(&contract));
362366

363367
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "Apply", CeedBasisApply_Ref));
364368
CeedCallBackend(CeedSetBackendFunction(ceed, "Basis", basis, "ApplyAdd", CeedBasisApplyAdd_Ref));

include/ceed-impl.h

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -90,21 +90,28 @@ struct CeedWorkVectors_private {
9090
CeedVector *vecs;
9191
};
9292

93+
typedef struct CeedObject_private {
94+
Ceed ceed;
95+
int (*ViewFunction)(CeedObject, FILE *);
96+
int ref_count;
97+
} CeedObject_private;
98+
9399
struct Ceed_private {
94-
const char *resource;
95-
Ceed delegate;
96-
Ceed parent;
97-
ObjDelegate *obj_delegates;
98-
int obj_delegate_count;
99-
Ceed op_fallback_ceed;
100-
char **jit_source_roots;
101-
char **rust_source_roots;
102-
CeedInt num_rust_source_roots, max_rust_source_roots, num_rust_source_roots_readers;
103-
CeedInt num_jit_source_roots, max_jit_source_roots, num_jit_source_roots_readers;
104-
bool cuda_compile_with_clang;
105-
char **jit_defines;
106-
CeedInt num_jit_defines, max_jit_defines, num_jit_defines_readers;
107-
CeedInt num_tabs; /* Viewing offset */
100+
CeedObject_private obj;
101+
const char *resource;
102+
Ceed delegate;
103+
Ceed parent;
104+
ObjDelegate *obj_delegates;
105+
int obj_delegate_count;
106+
Ceed op_fallback_ceed;
107+
char **jit_source_roots;
108+
char **rust_source_roots;
109+
CeedInt num_rust_source_roots, max_rust_source_roots, num_rust_source_roots_readers;
110+
CeedInt num_jit_source_roots, max_jit_source_roots, num_jit_source_roots_readers;
111+
bool cuda_compile_with_clang;
112+
char **jit_defines;
113+
CeedInt num_jit_defines, max_jit_defines, num_jit_defines_readers;
114+
CeedInt num_tabs; /* Viewing offset */
108115
int (*Error)(Ceed, const char *, int, const char *, int, const char *, va_list *);
109116
int (*SetStream)(Ceed, void *);
110117
int (*GetPreferredMemType)(CeedMemType *);
@@ -126,7 +133,6 @@ struct Ceed_private {
126133
int (*OperatorCreate)(CeedOperator);
127134
int (*OperatorCreateAtPoints)(CeedOperator);
128135
int (*CompositeOperatorCreate)(CeedOperator);
129-
int ref_count;
130136
void *data;
131137
bool is_debug;
132138
bool is_deterministic;
@@ -136,7 +142,7 @@ struct Ceed_private {
136142
};
137143

138144
struct CeedVector_private {
139-
Ceed ceed;
145+
CeedObject_private obj;
140146
int (*HasValidArray)(CeedVector, bool *);
141147
int (*HasBorrowedArrayOfType)(CeedVector, CeedMemType, bool *);
142148
int (*CopyStrided)(CeedVector, CeedSize, CeedSize, CeedSize, CeedVector);
@@ -157,7 +163,6 @@ struct CeedVector_private {
157163
int (*PointwiseMult)(CeedVector, CeedVector, CeedVector);
158164
int (*Reciprocal)(CeedVector);
159165
int (*Destroy)(CeedVector);
160-
int ref_count;
161166
CeedSize length;
162167
uint64_t state;
163168
uint64_t num_readers;
@@ -166,7 +171,7 @@ struct CeedVector_private {
166171
};
167172

168173
struct CeedElemRestriction_private {
169-
Ceed ceed;
174+
CeedObject_private obj;
170175
CeedElemRestriction rstr_base;
171176
int (*Apply)(CeedElemRestriction, CeedTransposeMode, CeedVector, CeedVector, CeedRequest *);
172177
int (*ApplyUnsigned)(CeedElemRestriction, CeedTransposeMode, CeedVector, CeedVector, CeedRequest *);
@@ -178,7 +183,6 @@ struct CeedElemRestriction_private {
178183
int (*GetOrientations)(CeedElemRestriction, CeedMemType, const bool **);
179184
int (*GetCurlOrientations)(CeedElemRestriction, CeedMemType, const CeedInt8 **);
180185
int (*Destroy)(CeedElemRestriction);
181-
int ref_count;
182186
CeedInt num_elem; /* number of elements */
183187
CeedInt elem_size; /* number of nodes per element */
184188
CeedInt num_points; /* number of points, for points restriction */
@@ -199,13 +203,12 @@ struct CeedElemRestriction_private {
199203
};
200204

201205
struct CeedBasis_private {
202-
Ceed ceed;
206+
CeedObject_private obj;
203207
int (*Apply)(CeedBasis, CeedInt, CeedTransposeMode, CeedEvalMode, CeedVector, CeedVector);
204208
int (*ApplyAdd)(CeedBasis, CeedInt, CeedTransposeMode, CeedEvalMode, CeedVector, CeedVector);
205209
int (*ApplyAtPoints)(CeedBasis, CeedInt, const CeedInt *, CeedTransposeMode, CeedEvalMode, CeedVector, CeedVector, CeedVector);
206210
int (*ApplyAddAtPoints)(CeedBasis, CeedInt, const CeedInt *, CeedTransposeMode, CeedEvalMode, CeedVector, CeedVector, CeedVector);
207211
int (*Destroy)(CeedBasis);
208-
int ref_count;
209212
bool is_tensor_basis; /* flag for tensor basis */
210213
CeedInt dim; /* topological dimension */
211214
CeedElemTopology topo; /* element topology */
@@ -233,11 +236,10 @@ struct CeedBasis_private {
233236
};
234237

235238
struct CeedTensorContract_private {
236-
Ceed ceed;
239+
CeedObject_private obj;
237240
int (*Apply)(CeedTensorContract, CeedInt, CeedInt, CeedInt, CeedInt, const CeedScalar *restrict, CeedTransposeMode, const CeedInt,
238241
const CeedScalar *restrict, CeedScalar *restrict);
239242
int (*Destroy)(CeedTensorContract);
240-
int ref_count;
241243
void *data;
242244
};
243245

@@ -248,12 +250,11 @@ struct CeedQFunctionField_private {
248250
};
249251

250252
struct CeedQFunction_private {
251-
Ceed ceed;
253+
CeedObject_private obj;
252254
int (*Apply)(CeedQFunction, CeedInt, CeedVector *, CeedVector *);
253255
int (*SetCUDAUserFunction)(CeedQFunction, void *);
254256
int (*SetHIPUserFunction)(CeedQFunction, void *);
255257
int (*Destroy)(CeedQFunction);
256-
int ref_count;
257258
CeedInt vec_length; /* Number of quadrature points must be padded to a multiple of vec_length */
258259
CeedInt num_tabs; /* Viewing offset */
259260
CeedQFunctionField *input_fields;
@@ -275,8 +276,7 @@ struct CeedQFunction_private {
275276
};
276277

277278
struct CeedQFunctionContext_private {
278-
Ceed ceed;
279-
int ref_count;
279+
CeedObject_private obj;
280280
int (*HasValidData)(CeedQFunctionContext, bool *);
281281
int (*HasBorrowedDataOfType)(CeedQFunctionContext, CeedMemType, bool *);
282282
int (*SetData)(CeedQFunctionContext, CeedMemType, CeedCopyMode, void *);
@@ -352,9 +352,8 @@ struct CeedOperatorAssemblyData_private {
352352
};
353353

354354
struct CeedOperator_private {
355-
Ceed ceed;
356-
CeedOperator op_fallback, op_fallback_parent;
357-
int ref_count;
355+
CeedObject_private obj;
356+
CeedOperator op_fallback, op_fallback_parent;
358357
int (*LinearAssembleQFunction)(CeedOperator, CeedVector *, CeedElemRestriction *, CeedRequest *);
359358
int (*LinearAssembleQFunctionUpdate)(CeedOperator, CeedVector, CeedElemRestriction, CeedRequest *);
360359
int (*LinearAssembleDiagonal)(CeedOperator, CeedVector, CeedRequest *);

include/ceed/backend.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,11 @@ CEED_INTERN int CeedReallocArray(size_t n, size_t unit, void *p);
186186
CEED_INTERN int CeedStringAllocCopy(const char *source, char **copy);
187187
CEED_INTERN int CeedFree(void *p);
188188

189+
CEED_INTERN int CeedObjectCreate(Ceed ceed, int (*view_function)(CeedObject, FILE *), CeedObject obj);
190+
CEED_INTERN int CeedObjectReference(CeedObject obj);
191+
CEED_INTERN int CeedObjectDereference(CeedObject obj);
192+
CEED_INTERN int CeedObjectDestroy(CeedObject obj);
193+
189194
CEED_INTERN int CeedSetHostBoolArray(const bool *source_array, CeedCopyMode copy_mode, CeedSize num_values, const bool **target_array_owned,
190195
const bool **target_array_borrowed, const bool **target_array);
191196
CEED_INTERN int CeedSetHostCeedInt8Array(const CeedInt8 *source_array, CeedCopyMode copy_mode, CeedSize num_values,

include/ceed/ceed.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ typedef struct CeedContextFieldLabel_private *CeedContextFieldLabel;
9999
/// Given an element restriction \f$E\f$, basis evaluator \f$B\f$, and quadrature function\f$f\f$, a `CeedOperator` expresses operations of the form \f$E^T B^T f(B E u)\f$ acting on the vector \f$u\f$.
100100
/// @ingroup CeedOperatorUser
101101
typedef struct CeedOperator_private *CeedOperator;
102+
/// Generic type for all libCEED objects to support common functionality, such as viewing
103+
/// @ingroup CeedUser
104+
typedef struct CeedObject_private *CeedObject;
105+
106+
CEED_EXTERN int CeedObjectView(CeedObject obj, FILE *stream);
107+
CEED_EXTERN int CeedObjectGetCeed(CeedObject obj, Ceed *ceed);
108+
CEED_EXTERN Ceed CeedObjectReturnCeed(CeedObject obj);
102109

103110
CEED_EXTERN int CeedRegistryGetList(size_t *n, char ***const resources, CeedInt **array);
104111
CEED_EXTERN int CeedInit(const char *resource, Ceed *ceed);

interface/ceed-basis.c

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,21 @@ static int CeedScalarView(const char *name, const char *fp_fmt, CeedInt m, CeedI
177177
return CEED_ERROR_SUCCESS;
178178
}
179179

180+
/**
181+
@brief View a `CeedBasis` passed as a `CeedObject`
182+
183+
@param[in] basis `CeedBasis` to view
184+
@param[in] stream Filestream to write to
185+
186+
@return An error code: 0 - success, otherwise - failure
187+
188+
@ref Developer
189+
**/
190+
static int CeedBasisView_Object(CeedObject basis, FILE *stream) {
191+
CeedCall(CeedBasisView((CeedBasis)basis, stream));
192+
return CEED_ERROR_SUCCESS;
193+
}
194+
180195
/**
181196
@brief Create the interpolation and gradient matrices for projection from the nodes of `basis_from` to the nodes of `basis_to`.
182197
@@ -684,7 +699,7 @@ int CeedBasisCreateH1Fallback(Ceed ceed, CeedElemTopology topo, CeedInt num_comp
684699
CeedCall(CeedGetObjectDelegate(ceed, &delegate, "Basis"));
685700
CeedCheck(delegate, ceed, CEED_ERROR_UNSUPPORTED, "Backend does not implement BasisCreateH1");
686701

687-
CeedCall(CeedReferenceCopy(delegate, &(basis)->ceed));
702+
CeedCall(CeedReferenceCopy(delegate, &(basis)->obj.ceed));
688703
CeedCall(CeedBasisGetTopologyDimension(topo, &dim));
689704
CeedCall(delegate->BasisCreateH1(topo, dim, P, Q, interp, grad, q_ref, q_weight, basis));
690705
CeedCall(CeedDestroy(&delegate));
@@ -847,7 +862,7 @@ int CeedBasisSetData(CeedBasis basis, void *data) {
847862
@ref Backend
848863
**/
849864
int CeedBasisReference(CeedBasis basis) {
850-
basis->ref_count++;
865+
CeedCall(CeedObjectReference((CeedObject)basis));
851866
return CEED_ERROR_SUCCESS;
852867
}
853868

@@ -1524,8 +1539,7 @@ int CeedBasisCreateTensorH1(Ceed ceed, CeedInt dim, CeedInt num_comp, CeedInt P_
15241539
CeedElemTopology topo = dim == 1 ? CEED_TOPOLOGY_LINE : dim == 2 ? CEED_TOPOLOGY_QUAD : CEED_TOPOLOGY_HEX;
15251540

15261541
CeedCall(CeedCalloc(1, basis));
1527-
CeedCall(CeedReferenceCopy(ceed, &(*basis)->ceed));
1528-
(*basis)->ref_count = 1;
1542+
CeedCall(CeedObjectCreate(ceed, CeedBasisView_Object, &(*basis)->obj));
15291543
(*basis)->is_tensor_basis = true;
15301544
(*basis)->dim = dim;
15311545
(*basis)->topo = topo;
@@ -1663,8 +1677,7 @@ int CeedBasisCreateH1(Ceed ceed, CeedElemTopology topo, CeedInt num_comp, CeedIn
16631677
CeedCall(CeedBasisGetTopologyDimension(topo, &dim));
16641678

16651679
CeedCall(CeedCalloc(1, basis));
1666-
CeedCall(CeedReferenceCopy(ceed, &(*basis)->ceed));
1667-
(*basis)->ref_count = 1;
1680+
CeedCall(CeedObjectCreate(ceed, CeedBasisView_Object, &(*basis)->obj));
16681681
(*basis)->is_tensor_basis = false;
16691682
(*basis)->dim = dim;
16701683
(*basis)->topo = topo;
@@ -1723,8 +1736,7 @@ int CeedBasisCreateHdiv(Ceed ceed, CeedElemTopology topo, CeedInt num_comp, Ceed
17231736
CeedCall(CeedBasisGetTopologyDimension(topo, &dim));
17241737

17251738
CeedCall(CeedCalloc(1, basis));
1726-
CeedCall(CeedReferenceCopy(ceed, &(*basis)->ceed));
1727-
(*basis)->ref_count = 1;
1739+
CeedCall(CeedObjectCreate(ceed, CeedBasisView_Object, &(*basis)->obj));
17281740
(*basis)->is_tensor_basis = false;
17291741
(*basis)->dim = dim;
17301742
(*basis)->topo = topo;
@@ -1784,8 +1796,7 @@ int CeedBasisCreateHcurl(Ceed ceed, CeedElemTopology topo, CeedInt num_comp, Cee
17841796
curl_comp = (dim < 3) ? 1 : dim;
17851797

17861798
CeedCall(CeedCalloc(1, basis));
1787-
CeedCall(CeedReferenceCopy(ceed, &(*basis)->ceed));
1788-
(*basis)->ref_count = 1;
1799+
CeedCall(CeedObjectCreate(ceed, CeedBasisView_Object, &(*basis)->obj));
17891800
(*basis)->is_tensor_basis = false;
17901801
(*basis)->dim = dim;
17911802
(*basis)->topo = topo;
@@ -2143,21 +2154,20 @@ int CeedBasisApplyAddAtPoints(CeedBasis basis, CeedInt num_elem, const CeedInt *
21432154
@ref Advanced
21442155
**/
21452156
int CeedBasisGetCeed(CeedBasis basis, Ceed *ceed) {
2146-
*ceed = NULL;
2147-
CeedCall(CeedReferenceCopy(CeedBasisReturnCeed(basis), ceed));
2157+
CeedCall(CeedObjectGetCeed((CeedObject)basis, ceed));
21482158
return CEED_ERROR_SUCCESS;
21492159
}
21502160

21512161
/**
21522162
@brief Return the `Ceed` associated with a `CeedBasis`
21532163
2154-
@param[in] basis `CeedBasis`
2164+
@param[in] basis `CeedBasis`
21552165
21562166
@return `Ceed` associated with the `basis`
21572167
21582168
@ref Advanced
21592169
**/
2160-
Ceed CeedBasisReturnCeed(CeedBasis basis) { return basis->ceed; }
2170+
Ceed CeedBasisReturnCeed(CeedBasis basis) { return CeedObjectReturnCeed((CeedObject)basis); }
21612171

21622172
/**
21632173
@brief Get dimension for given `CeedBasis`
@@ -2436,7 +2446,7 @@ int CeedBasisGetCurl(CeedBasis basis, const CeedScalar **curl) {
24362446
}
24372447

24382448
/**
2439-
@brief Destroy a @ref CeedBasis
2449+
@brief Destroy a @ref CeedBasis
24402450
24412451
@param[in,out] basis `CeedBasis` to destroy
24422452
@@ -2445,7 +2455,7 @@ int CeedBasisGetCurl(CeedBasis basis, const CeedScalar **curl) {
24452455
@ref User
24462456
**/
24472457
int CeedBasisDestroy(CeedBasis *basis) {
2448-
if (!*basis || *basis == CEED_BASIS_NONE || --(*basis)->ref_count > 0) {
2458+
if (!*basis || *basis == CEED_BASIS_NONE || CeedObjectDereference((CeedObject)*basis) > 0) {
24492459
*basis = NULL;
24502460
return CEED_ERROR_SUCCESS;
24512461
}
@@ -2461,7 +2471,7 @@ int CeedBasisDestroy(CeedBasis *basis) {
24612471
CeedCall(CeedFree(&(*basis)->curl));
24622472
CeedCall(CeedVectorDestroy(&(*basis)->vec_chebyshev));
24632473
CeedCall(CeedBasisDestroy(&(*basis)->basis_chebyshev));
2464-
CeedCall(CeedDestroy(&(*basis)->ceed));
2474+
CeedCall(CeedObjectDestroy(&(*basis)->obj));
24652475
CeedCall(CeedFree(basis));
24662476
return CEED_ERROR_SUCCESS;
24672477
}

0 commit comments

Comments
 (0)