ceed-operator.c (38d0029a08e84b16bbdde77c27446234f5f09cf2) ceed-operator.c (7a982d89c751e293e39d23a7c44a161cef1fcd06)
1// Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2// the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3// reserved. See files LICENSE and NOTICE for details.
4//
5// This file is part of CEED, a collection of benchmarks, miniapps, software
6// libraries and APIs for efficient high-order finite element and spectral
7// element discretizations for exascale applications. For more information and
8// source code availability see http://github.com/ceed.

--- 6 unchanged lines hidden (view full) ---

15// testbed platforms, in support of the nation's exascale computing imperative.
16
17#include <ceed-impl.h>
18#include <ceed-backend.h>
19#include <string.h>
20#include <math.h>
21
22/// @file
1// Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2// the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3// reserved. See files LICENSE and NOTICE for details.
4//
5// This file is part of CEED, a collection of benchmarks, miniapps, software
6// libraries and APIs for efficient high-order finite element and spectral
7// element discretizations for exascale applications. For more information and
8// source code availability see http://github.com/ceed.

--- 6 unchanged lines hidden (view full) ---

15// testbed platforms, in support of the nation's exascale computing imperative.
16
17#include <ceed-impl.h>
18#include <ceed-backend.h>
19#include <string.h>
20#include <math.h>
21
22/// @file
23/// Implementation of public CeedOperator interfaces
24///
25/// @addtogroup CeedOperator
26/// @{
23/// Implementation of CeedOperator interfaces
27
24
25/// ----------------------------------------------------------------------------
26/// CeedOperator Library Internal Functions
27/// ----------------------------------------------------------------------------
28/// @addtogroup CeedOperatorDeveloper
29/// @{
30
28/**
31/**
32 @brief Duplicate a CeedOperator with a reference Ceed to fallback for advanced
33 CeedOperator functionality
34
35 @param op CeedOperator to create fallback for
36
37 @return An error code: 0 - success, otherwise - failure
38
39 @ref Developer
40**/
41int CeedOperatorCreateFallback(CeedOperator op) {
42 int ierr;
43
44 // Fallback Ceed
45 const char *resource, *fallbackresource;
46 ierr = CeedGetResource(op->ceed, &resource); CeedChk(ierr);
47 ierr = CeedGetOperatorFallbackResource(op->ceed, &fallbackresource);
48 CeedChk(ierr);
49 if (!strcmp(resource, fallbackresource))
50 // LCOV_EXCL_START
51 return CeedError(op->ceed, 1, "Backend %s cannot create an operator"
52 "fallback to resource %s", resource, fallbackresource);
53 // LCOV_EXCL_STOP
54
55 // Fallback Ceed
56 Ceed ceedref;
57 if (!op->ceed->opfallbackceed) {
58 ierr = CeedInit(fallbackresource, &ceedref); CeedChk(ierr);
59 ceedref->opfallbackparent = op->ceed;
60 op->ceed->opfallbackceed = ceedref;
61 }
62 ceedref = op->ceed->opfallbackceed;
63
64 // Clone Op
65 CeedOperator opref;
66 ierr = CeedCalloc(1, &opref); CeedChk(ierr);
67 memcpy(opref, op, sizeof(*opref)); CeedChk(ierr);
68 opref->data = NULL;
69 opref->setupdone = 0;
70 opref->ceed = ceedref;
71 ierr = ceedref->OperatorCreate(opref); CeedChk(ierr);
72 op->opfallback = opref;
73
74 // Clone QF
75 CeedQFunction qfref;
76 ierr = CeedCalloc(1, &qfref); CeedChk(ierr);
77 memcpy(qfref, (op->qf), sizeof(*qfref)); CeedChk(ierr);
78 qfref->data = NULL;
79 qfref->ceed = ceedref;
80 ierr = ceedref->QFunctionCreate(qfref); CeedChk(ierr);
81 opref->qf = qfref;
82 op->qffallback = qfref;
83
84 return 0;
85}
86
87/**
88 @brief Check if a CeedOperator is ready to be used.
89
90 @param[in] ceed Ceed object for error handling
91 @param[in] op CeedOperator to check
92
93 @return An error code: 0 - success, otherwise - failure
94
95 @ref Developer
96**/
97static int CeedOperatorCheckReady(Ceed ceed, CeedOperator op) {
98 CeedQFunction qf = op->qf;
99
100 if (op->composite) {
101 if (!op->numsub)
102 // LCOV_EXCL_START
103 return CeedError(ceed, 1, "No suboperators set");
104 // LCOV_EXCL_STOP
105 } else {
106 if (op->nfields == 0)
107 // LCOV_EXCL_START
108 return CeedError(ceed, 1, "No operator fields set");
109 // LCOV_EXCL_STOP
110 if (op->nfields < qf->numinputfields + qf->numoutputfields)
111 // LCOV_EXCL_START
112 return CeedError(ceed, 1, "Not all operator fields set");
113 // LCOV_EXCL_STOP
114 if (!op->hasrestriction)
115 // LCOV_EXCL_START
116 return CeedError(ceed, 1,"At least one restriction required");
117 // LCOV_EXCL_STOP
118 if (op->numqpoints == 0)
119 // LCOV_EXCL_START
120 return CeedError(ceed, 1,"At least one non-collocated basis required");
121 // LCOV_EXCL_STOP
122 }
123
124 return 0;
125}
126
127/**
128 @brief View a field of a CeedOperator
129
130 @param[in] field Operator field to view
131 @param[in] fieldnumber Number of field being viewed
132 @param[in] stream Stream to view to, e.g., stdout
133
134 @return An error code: 0 - success, otherwise - failure
135
136 @ref Utility
137**/
138static int CeedOperatorFieldView(CeedOperatorField field,
139 CeedQFunctionField qffield,
140 CeedInt fieldnumber, bool sub, bool in,
141 FILE *stream) {
142 const char *pre = sub ? " " : "";
143 const char *inout = in ? "Input" : "Output";
144
145 fprintf(stream, "%s %s Field [%d]:\n"
146 "%s Name: \"%s\"\n",
147 pre, inout, fieldnumber, pre, qffield->fieldname);
148
149 if (field->basis == CEED_BASIS_COLLOCATED)
150 fprintf(stream, "%s Collocated basis\n", pre);
151
152 if (field->vec == CEED_VECTOR_ACTIVE)
153 fprintf(stream, "%s Active vector\n", pre);
154 else if (field->vec == CEED_VECTOR_NONE)
155 fprintf(stream, "%s No vector\n", pre);
156
157 return 0;
158}
159
160/**
161 @brief View a single CeedOperator
162
163 @param[in] op CeedOperator to view
164 @param[in] sub Boolean flag for sub-operator
165 @param[in] stream Stream to write; typically stdout/stderr or a file
166
167 @return Error code: 0 - success, otherwise - failure
168
169 @ref Utility
170**/
171int CeedOperatorSingleView(CeedOperator op, bool sub, FILE *stream) {
172 int ierr;
173 const char *pre = sub ? " " : "";
174
175 CeedInt totalfields;
176 ierr = CeedOperatorGetNumArgs(op, &totalfields); CeedChk(ierr);
177
178 fprintf(stream, "%s %d Field%s\n", pre, totalfields, totalfields>1 ? "s" : "");
179
180 fprintf(stream, "%s %d Input Field%s:\n", pre, op->qf->numinputfields,
181 op->qf->numinputfields>1 ? "s" : "");
182 for (CeedInt i=0; i<op->qf->numinputfields; i++) {
183 ierr = CeedOperatorFieldView(op->inputfields[i], op->qf->inputfields[i],
184 i, sub, 1, stream); CeedChk(ierr);
185 }
186
187 fprintf(stream, "%s %d Output Field%s:\n", pre, op->qf->numoutputfields,
188 op->qf->numoutputfields>1 ? "s" : "");
189 for (CeedInt i=0; i<op->qf->numoutputfields; i++) {
190 ierr = CeedOperatorFieldView(op->outputfields[i], op->qf->inputfields[i],
191 i, sub, 0, stream); CeedChk(ierr);
192 }
193
194 return 0;
195}
196
197/// @}
198
199/// ----------------------------------------------------------------------------
200/// CeedOperator Backend API
201/// ----------------------------------------------------------------------------
202/// @addtogroup CeedOperatorBackend
203/// @{
204
205/**
206 @brief Get the Ceed associated with a CeedOperator
207
208 @param op CeedOperator
209 @param[out] ceed Variable to store Ceed
210
211 @return An error code: 0 - success, otherwise - failure
212
213 @ref Backend
214**/
215
216int CeedOperatorGetCeed(CeedOperator op, Ceed *ceed) {
217 *ceed = op->ceed;
218 return 0;
219}
220
221/**
222 @brief Get the number of elements associated with a CeedOperator
223
224 @param op CeedOperator
225 @param[out] numelem Variable to store number of elements
226
227 @return An error code: 0 - success, otherwise - failure
228
229 @ref Backend
230**/
231
232int CeedOperatorGetNumElements(CeedOperator op, CeedInt *numelem) {
233 if (op->composite)
234 // LCOV_EXCL_START
235 return CeedError(op->ceed, 1, "Not defined for composite operator");
236 // LCOV_EXCL_STOP
237
238 *numelem = op->numelements;
239 return 0;
240}
241
242/**
243 @brief Get the number of quadrature points associated with a CeedOperator
244
245 @param op CeedOperator
246 @param[out] numqpts Variable to store vector number of quadrature points
247
248 @return An error code: 0 - success, otherwise - failure
249
250 @ref Backend
251**/
252
253int CeedOperatorGetNumQuadraturePoints(CeedOperator op, CeedInt *numqpts) {
254 if (op->composite)
255 // LCOV_EXCL_START
256 return CeedError(op->ceed, 1, "Not defined for composite operator");
257 // LCOV_EXCL_STOP
258
259 *numqpts = op->numqpoints;
260 return 0;
261}
262
263/**
264 @brief Get the number of arguments associated with a CeedOperator
265
266 @param op CeedOperator
267 @param[out] numargs Variable to store vector number of arguments
268
269 @return An error code: 0 - success, otherwise - failure
270
271 @ref Backend
272**/
273
274int CeedOperatorGetNumArgs(CeedOperator op, CeedInt *numargs) {
275 if (op->composite)
276 // LCOV_EXCL_START
277 return CeedError(op->ceed, 1, "Not defined for composite operators");
278 // LCOV_EXCL_STOP
279
280 *numargs = op->nfields;
281 return 0;
282}
283
284/**
285 @brief Get the setup status of a CeedOperator
286
287 @param op CeedOperator
288 @param[out] setupdone Variable to store setup status
289
290 @return An error code: 0 - success, otherwise - failure
291
292 @ref Backend
293**/
294
295int CeedOperatorGetSetupStatus(CeedOperator op, bool *setupdone) {
296 *setupdone = op->setupdone;
297 return 0;
298}
299
300/**
301 @brief Get the QFunction associated with a CeedOperator
302
303 @param op CeedOperator
304 @param[out] qf Variable to store QFunction
305
306 @return An error code: 0 - success, otherwise - failure
307
308 @ref Backend
309**/
310
311int CeedOperatorGetQFunction(CeedOperator op, CeedQFunction *qf) {
312 if (op->composite)
313 // LCOV_EXCL_START
314 return CeedError(op->ceed, 1, "Not defined for composite operator");
315 // LCOV_EXCL_STOP
316
317 *qf = op->qf;
318 return 0;
319}
320
321/**
322 @brief Get the number of suboperators associated with a CeedOperator
323
324 @param op CeedOperator
325 @param[out] numsub Variable to store number of suboperators
326
327 @return An error code: 0 - success, otherwise - failure
328
329 @ref Backend
330**/
331
332int CeedOperatorGetNumSub(CeedOperator op, CeedInt *numsub) {
333 if (!op->composite)
334 // LCOV_EXCL_START
335 return CeedError(op->ceed, 1, "Not a composite operator");
336 // LCOV_EXCL_STOP
337
338 *numsub = op->numsub;
339 return 0;
340}
341
342/**
343 @brief Get the list of suboperators associated with a CeedOperator
344
345 @param op CeedOperator
346 @param[out] suboperators Variable to store list of suboperators
347
348 @return An error code: 0 - success, otherwise - failure
349
350 @ref Backend
351**/
352
353int CeedOperatorGetSubList(CeedOperator op, CeedOperator **suboperators) {
354 if (!op->composite)
355 // LCOV_EXCL_START
356 return CeedError(op->ceed, 1, "Not a composite operator");
357 // LCOV_EXCL_STOP
358
359 *suboperators = op->suboperators;
360 return 0;
361}
362
363/**
364 @brief Get the backend data of a CeedOperator
365
366 @param op CeedOperator
367 @param[out] data Variable to store data
368
369 @return An error code: 0 - success, otherwise - failure
370
371 @ref Backend
372**/
373
374int CeedOperatorGetData(CeedOperator op, void **data) {
375 *data = op->data;
376 return 0;
377}
378
379/**
380 @brief Set the backend data of a CeedOperator
381
382 @param[out] op CeedOperator
383 @param data Data to set
384
385 @return An error code: 0 - success, otherwise - failure
386
387 @ref Backend
388**/
389
390int CeedOperatorSetData(CeedOperator op, void **data) {
391 op->data = *data;
392 return 0;
393}
394
395/**
396 @brief Set the setup flag of a CeedOperator to True
397
398 @param op CeedOperator
399
400 @return An error code: 0 - success, otherwise - failure
401
402 @ref Backend
403**/
404
405int CeedOperatorSetSetupDone(CeedOperator op) {
406 op->setupdone = 1;
407 return 0;
408}
409
410/**
411 @brief Get the CeedOperatorFields of a CeedOperator
412
413 @param op CeedOperator
414 @param[out] inputfields Variable to store inputfields
415 @param[out] outputfields Variable to store outputfields
416
417 @return An error code: 0 - success, otherwise - failure
418
419 @ref Backend
420**/
421
422int CeedOperatorGetFields(CeedOperator op, CeedOperatorField **inputfields,
423 CeedOperatorField **outputfields) {
424 if (op->composite)
425 // LCOV_EXCL_START
426 return CeedError(op->ceed, 1, "Not defined for composite operator");
427 // LCOV_EXCL_STOP
428
429 if (inputfields) *inputfields = op->inputfields;
430 if (outputfields) *outputfields = op->outputfields;
431 return 0;
432}
433
434/**
435 @brief Get the CeedElemRestriction of a CeedOperatorField
436
437 @param opfield CeedOperatorField
438 @param[out] rstr Variable to store CeedElemRestriction
439
440 @return An error code: 0 - success, otherwise - failure
441
442 @ref Backend
443**/
444
445int CeedOperatorFieldGetElemRestriction(CeedOperatorField opfield,
446 CeedElemRestriction *rstr) {
447 *rstr = opfield->Erestrict;
448 return 0;
449}
450
451/**
452 @brief Get the CeedBasis of a CeedOperatorField
453
454 @param opfield CeedOperatorField
455 @param[out] basis Variable to store CeedBasis
456
457 @return An error code: 0 - success, otherwise - failure
458
459 @ref Backend
460**/
461
462int CeedOperatorFieldGetBasis(CeedOperatorField opfield, CeedBasis *basis) {
463 *basis = opfield->basis;
464 return 0;
465}
466
467/**
468 @brief Get the CeedVector of a CeedOperatorField
469
470 @param opfield CeedOperatorField
471 @param[out] vec Variable to store CeedVector
472
473 @return An error code: 0 - success, otherwise - failure
474
475 @ref Backend
476**/
477
478int CeedOperatorFieldGetVector(CeedOperatorField opfield, CeedVector *vec) {
479 *vec = opfield->vec;
480 return 0;
481}
482
483/// @}
484
485/// ----------------------------------------------------------------------------
486/// CeedOperator Public API
487/// ----------------------------------------------------------------------------
488/// @addtogroup CeedOperatorUser
489/// @{
490
491/**
29 @brief Create a CeedOperator and associate a CeedQFunction. A CeedBasis and
30 CeedElemRestriction can be associated with CeedQFunction fields with
31 \ref CeedOperatorSetField.
32
33 @param ceed A Ceed object where the CeedOperator will be created
34 @param qf QFunction defining the action of the operator at quadrature points
35 @param dqf QFunction defining the action of the Jacobian of @a qf (or
36 CEED_QFUNCTION_NONE)
37 @param dqfT QFunction defining the action of the transpose of the Jacobian
38 of @a qf (or CEED_QFUNCTION_NONE)
39 @param[out] op Address of the variable where the newly created
40 CeedOperator will be stored
41
42 @return An error code: 0 - success, otherwise - failure
43
492 @brief Create a CeedOperator and associate a CeedQFunction. A CeedBasis and
493 CeedElemRestriction can be associated with CeedQFunction fields with
494 \ref CeedOperatorSetField.
495
496 @param ceed A Ceed object where the CeedOperator will be created
497 @param qf QFunction defining the action of the operator at quadrature points
498 @param dqf QFunction defining the action of the Jacobian of @a qf (or
499 CEED_QFUNCTION_NONE)
500 @param dqfT QFunction defining the action of the transpose of the Jacobian
501 of @a qf (or CEED_QFUNCTION_NONE)
502 @param[out] op Address of the variable where the newly created
503 CeedOperator will be stored
504
505 @return An error code: 0 - success, otherwise - failure
506
44 @ref Basic
507 @ref User
45 */
46int CeedOperatorCreate(Ceed ceed, CeedQFunction qf, CeedQFunction dqf,
47 CeedQFunction dqfT, CeedOperator *op) {
48 int ierr;
49
50 if (!ceed->OperatorCreate) {
51 Ceed delegate;
52 ierr = CeedGetObjectDelegate(ceed, &delegate, "Operator"); CeedChk(ierr);

--- 35 unchanged lines hidden (view full) ---

88 @brief Create an operator that composes the action of several operators
89
90 @param ceed A Ceed object where the CeedOperator will be created
91 @param[out] op Address of the variable where the newly created
92 Composite CeedOperator will be stored
93
94 @return An error code: 0 - success, otherwise - failure
95
508 */
509int CeedOperatorCreate(Ceed ceed, CeedQFunction qf, CeedQFunction dqf,
510 CeedQFunction dqfT, CeedOperator *op) {
511 int ierr;
512
513 if (!ceed->OperatorCreate) {
514 Ceed delegate;
515 ierr = CeedGetObjectDelegate(ceed, &delegate, "Operator"); CeedChk(ierr);

--- 35 unchanged lines hidden (view full) ---

551 @brief Create an operator that composes the action of several operators
552
553 @param ceed A Ceed object where the CeedOperator will be created
554 @param[out] op Address of the variable where the newly created
555 Composite CeedOperator will be stored
556
557 @return An error code: 0 - success, otherwise - failure
558
96 @ref Basic
559 @ref User
97 */
98int CeedCompositeOperatorCreate(Ceed ceed, CeedOperator *op) {
99 int ierr;
100
101 if (!ceed->CompositeOperatorCreate) {
102 Ceed delegate;
103 ierr = CeedGetObjectDelegate(ceed, &delegate, "Operator"); CeedChk(ierr);
104

--- 33 unchanged lines hidden (view full) ---

138 @param b CeedBasis in which the field resides or CEED_BASIS_COLLOCATED
139 if collocated with quadrature points
140 @param v CeedVector to be used by CeedOperator or CEED_VECTOR_ACTIVE
141 if field is active or CEED_VECTOR_NONE if using
142 CEED_EVAL_WEIGHT in the QFunction
143
144 @return An error code: 0 - success, otherwise - failure
145
560 */
561int CeedCompositeOperatorCreate(Ceed ceed, CeedOperator *op) {
562 int ierr;
563
564 if (!ceed->CompositeOperatorCreate) {
565 Ceed delegate;
566 ierr = CeedGetObjectDelegate(ceed, &delegate, "Operator"); CeedChk(ierr);
567

--- 33 unchanged lines hidden (view full) ---

601 @param b CeedBasis in which the field resides or CEED_BASIS_COLLOCATED
602 if collocated with quadrature points
603 @param v CeedVector to be used by CeedOperator or CEED_VECTOR_ACTIVE
604 if field is active or CEED_VECTOR_NONE if using
605 CEED_EVAL_WEIGHT in the QFunction
606
607 @return An error code: 0 - success, otherwise - failure
608
146 @ref Basic
609 @ref User
147**/
148int CeedOperatorSetField(CeedOperator op, const char *fieldname,
149 CeedElemRestriction r, CeedBasis b, CeedVector v) {
150 int ierr;
151 if (op->composite)
152 // LCOV_EXCL_START
153 return CeedError(op->ceed, 1, "Cannot add field to composite operator.");
154 // LCOV_EXCL_STOP

--- 79 unchanged lines hidden (view full) ---

234/**
235 @brief Add a sub-operator to a composite CeedOperator
236
237 @param[out] compositeop Composite CeedOperator
238 @param subop Sub-operator CeedOperator
239
240 @return An error code: 0 - success, otherwise - failure
241
610**/
611int CeedOperatorSetField(CeedOperator op, const char *fieldname,
612 CeedElemRestriction r, CeedBasis b, CeedVector v) {
613 int ierr;
614 if (op->composite)
615 // LCOV_EXCL_START
616 return CeedError(op->ceed, 1, "Cannot add field to composite operator.");
617 // LCOV_EXCL_STOP

--- 79 unchanged lines hidden (view full) ---

697/**
698 @brief Add a sub-operator to a composite CeedOperator
699
700 @param[out] compositeop Composite CeedOperator
701 @param subop Sub-operator CeedOperator
702
703 @return An error code: 0 - success, otherwise - failure
704
242 @ref Basic
705 @ref User
243 */
244int CeedCompositeOperatorAddSub(CeedOperator compositeop, CeedOperator subop) {
245 if (!compositeop->composite)
246 // LCOV_EXCL_START
247 return CeedError(compositeop->ceed, 1, "CeedOperator is not a composite "
248 "operator");
249 // LCOV_EXCL_STOP
250

--- 4 unchanged lines hidden (view full) ---

255
256 compositeop->suboperators[compositeop->numsub] = subop;
257 subop->refcount++;
258 compositeop->numsub++;
259 return 0;
260}
261
262/**
706 */
707int CeedCompositeOperatorAddSub(CeedOperator compositeop, CeedOperator subop) {
708 if (!compositeop->composite)
709 // LCOV_EXCL_START
710 return CeedError(compositeop->ceed, 1, "CeedOperator is not a composite "
711 "operator");
712 // LCOV_EXCL_STOP
713

--- 4 unchanged lines hidden (view full) ---

718
719 compositeop->suboperators[compositeop->numsub] = subop;
720 subop->refcount++;
721 compositeop->numsub++;
722 return 0;
723}
724
725/**
263 @brief Duplicate a CeedOperator with a reference Ceed to fallback for advanced
264 CeedOperator functionality
265
266 @param op CeedOperator to create fallback for
267
268 @return An error code: 0 - success, otherwise - failure
269
270 @ref Developer
271**/
272int CeedOperatorCreateFallback(CeedOperator op) {
273 int ierr;
274
275 // Fallback Ceed
276 const char *resource, *fallbackresource;
277 ierr = CeedGetResource(op->ceed, &resource); CeedChk(ierr);
278 ierr = CeedGetOperatorFallbackResource(op->ceed, &fallbackresource);
279 CeedChk(ierr);
280 if (!strcmp(resource, fallbackresource))
281 // LCOV_EXCL_START
282 return CeedError(op->ceed, 1, "Backend %s cannot create an operator"
283 "fallback to resource %s", resource, fallbackresource);
284 // LCOV_EXCL_STOP
285
286 // Fallback Ceed
287 Ceed ceedref;
288 if (!op->ceed->opfallbackceed) {
289 ierr = CeedInit(fallbackresource, &ceedref); CeedChk(ierr);
290 ceedref->opfallbackparent = op->ceed;
291 op->ceed->opfallbackceed = ceedref;
292 }
293 ceedref = op->ceed->opfallbackceed;
294
295 // Clone Op
296 CeedOperator opref;
297 ierr = CeedCalloc(1, &opref); CeedChk(ierr);
298 memcpy(opref, op, sizeof(*opref)); CeedChk(ierr);
299 opref->data = NULL;
300 opref->setupdone = 0;
301 opref->ceed = ceedref;
302 ierr = ceedref->OperatorCreate(opref); CeedChk(ierr);
303 op->opfallback = opref;
304
305 // Clone QF
306 CeedQFunction qfref;
307 ierr = CeedCalloc(1, &qfref); CeedChk(ierr);
308 memcpy(qfref, (op->qf), sizeof(*qfref)); CeedChk(ierr);
309 qfref->data = NULL;
310 qfref->ceed = ceedref;
311 ierr = ceedref->QFunctionCreate(qfref); CeedChk(ierr);
312 opref->qf = qfref;
313 op->qffallback = qfref;
314
315 return 0;
316}
317
318/**
319 @brief Check if a CeedOperator is ready to be used.
320
321 @param[in] ceed Ceed object for error handling
322 @param[in] op CeedOperator to check
323
324 @return An error code: 0 - success, otherwise - failure
325
326 @ref Basic
327**/
328static int CeedOperatorCheckReady(Ceed ceed, CeedOperator op) {
329 CeedQFunction qf = op->qf;
330
331 if (op->composite) {
332 if (!op->numsub)
333 // LCOV_EXCL_START
334 return CeedError(ceed, 1, "No suboperators set");
335 // LCOV_EXCL_STOP
336 } else {
337 if (op->nfields == 0)
338 // LCOV_EXCL_START
339 return CeedError(ceed, 1, "No operator fields set");
340 // LCOV_EXCL_STOP
341 if (op->nfields < qf->numinputfields + qf->numoutputfields)
342 // LCOV_EXCL_START
343 return CeedError(ceed, 1, "Not all operator fields set");
344 // LCOV_EXCL_STOP
345 if (!op->hasrestriction)
346 // LCOV_EXCL_START
347 return CeedError(ceed, 1,"At least one restriction required");
348 // LCOV_EXCL_STOP
349 if (op->numqpoints == 0)
350 // LCOV_EXCL_START
351 return CeedError(ceed, 1,"At least one non-collocated basis required");
352 // LCOV_EXCL_STOP
353 }
354
355 return 0;
356}
357
358/**
359 @brief Assemble a linear CeedQFunction associated with a CeedOperator
360
361 This returns a CeedVector containing a matrix at each quadrature point
362 providing the action of the CeedQFunction associated with the CeedOperator.
363 The vector 'assembled' is of shape
364 [num_elements, num_input_fields, num_output_fields, num_quad_points]
365 and contains column-major matrices representing the action of the
366 CeedQFunction for a corresponding quadrature point on an element. Inputs and

--- 8 unchanged lines hidden (view full) ---

375 quadrature points
376 @param[out] rstr CeedElemRestriction for CeedVector containing assembled
377 CeedQFunction
378 @param request Address of CeedRequest for non-blocking completion, else
379 CEED_REQUEST_IMMEDIATE
380
381 @return An error code: 0 - success, otherwise - failure
382
726 @brief Assemble a linear CeedQFunction associated with a CeedOperator
727
728 This returns a CeedVector containing a matrix at each quadrature point
729 providing the action of the CeedQFunction associated with the CeedOperator.
730 The vector 'assembled' is of shape
731 [num_elements, num_input_fields, num_output_fields, num_quad_points]
732 and contains column-major matrices representing the action of the
733 CeedQFunction for a corresponding quadrature point on an element. Inputs and

--- 8 unchanged lines hidden (view full) ---

742 quadrature points
743 @param[out] rstr CeedElemRestriction for CeedVector containing assembled
744 CeedQFunction
745 @param request Address of CeedRequest for non-blocking completion, else
746 CEED_REQUEST_IMMEDIATE
747
748 @return An error code: 0 - success, otherwise - failure
749
383 @ref Basic
750 @ref User
384**/
385int CeedOperatorAssembleLinearQFunction(CeedOperator op, CeedVector *assembled,
386 CeedElemRestriction *rstr,
387 CeedRequest *request) {
388 int ierr;
389 Ceed ceed = op->ceed;
390 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
391

--- 21 unchanged lines hidden (view full) ---

413
414 @param op CeedOperator to assemble CeedQFunction
415 @param[out] assembled CeedVector to store assembled CeedOperator diagonal
416 @param request Address of CeedRequest for non-blocking completion, else
417 CEED_REQUEST_IMMEDIATE
418
419 @return An error code: 0 - success, otherwise - failure
420
751**/
752int CeedOperatorAssembleLinearQFunction(CeedOperator op, CeedVector *assembled,
753 CeedElemRestriction *rstr,
754 CeedRequest *request) {
755 int ierr;
756 Ceed ceed = op->ceed;
757 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
758

--- 21 unchanged lines hidden (view full) ---

780
781 @param op CeedOperator to assemble CeedQFunction
782 @param[out] assembled CeedVector to store assembled CeedOperator diagonal
783 @param request Address of CeedRequest for non-blocking completion, else
784 CEED_REQUEST_IMMEDIATE
785
786 @return An error code: 0 - success, otherwise - failure
787
421 @ref Basic
788 @ref User
422**/
423int CeedOperatorAssembleLinearDiagonal(CeedOperator op, CeedVector *assembled,
424 CeedRequest *request) {
425 int ierr;
426 Ceed ceed = op->ceed;
427 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
428
429 // Use backend version, if available

--- 28 unchanged lines hidden (view full) ---

458 @param op CeedOperator to create element inverses
459 @param[out] fdminv CeedOperator to apply the action of a FDM based inverse
460 for each element
461 @param request Address of CeedRequest for non-blocking completion, else
462 CEED_REQUEST_IMMEDIATE
463
464 @return An error code: 0 - success, otherwise - failure
465
789**/
790int CeedOperatorAssembleLinearDiagonal(CeedOperator op, CeedVector *assembled,
791 CeedRequest *request) {
792 int ierr;
793 Ceed ceed = op->ceed;
794 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
795
796 // Use backend version, if available

--- 28 unchanged lines hidden (view full) ---

825 @param op CeedOperator to create element inverses
826 @param[out] fdminv CeedOperator to apply the action of a FDM based inverse
827 for each element
828 @param request Address of CeedRequest for non-blocking completion, else
829 CEED_REQUEST_IMMEDIATE
830
831 @return An error code: 0 - success, otherwise - failure
832
466 @ref Advanced
833 @ref Backend
467**/
468int CeedOperatorCreateFDMElementInverse(CeedOperator op, CeedOperator *fdminv,
469 CeedRequest *request) {
470 int ierr;
471 Ceed ceed = op->ceed;
472 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
473
474 // Use backend version, if available

--- 7 unchanged lines hidden (view full) ---

482 // Assemble
483 ierr = op->opfallback->CreateFDMElementInverse(op->opfallback, fdminv,
484 request); CeedChk(ierr);
485 }
486
487 return 0;
488}
489
834**/
835int CeedOperatorCreateFDMElementInverse(CeedOperator op, CeedOperator *fdminv,
836 CeedRequest *request) {
837 int ierr;
838 Ceed ceed = op->ceed;
839 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
840
841 // Use backend version, if available

--- 7 unchanged lines hidden (view full) ---

849 // Assemble
850 ierr = op->opfallback->CreateFDMElementInverse(op->opfallback, fdminv,
851 request); CeedChk(ierr);
852 }
853
854 return 0;
855}
856
857/**
858 @brief View a CeedOperator
490
859
860 @param[in] op CeedOperator to view
861 @param[in] stream Stream to write; typically stdout/stderr or a file
862
863 @return Error code: 0 - success, otherwise - failure
864
865 @ref User
866**/
867int CeedOperatorView(CeedOperator op, FILE *stream) {
868 int ierr;
869
870 if (op->composite) {
871 fprintf(stream, "Composite CeedOperator\n");
872
873 for (CeedInt i=0; i<op->numsub; i++) {
874 fprintf(stream, " SubOperator [%d]:\n", i);
875 ierr = CeedOperatorSingleView(op->suboperators[i], 1, stream);
876 CeedChk(ierr);
877 }
878 } else {
879 fprintf(stream, "CeedOperator\n");
880 ierr = CeedOperatorSingleView(op, 0, stream); CeedChk(ierr);
881 }
882
883 return 0;
884}
885
491/**
492 @brief Apply CeedOperator to a vector
493
494 This computes the action of the operator on the specified (active) input,
495 yielding its (active) output. All inputs and outputs must be specified using
496 CeedOperatorSetField().
497
498 @param op CeedOperator to apply
499 @param[in] in CeedVector containing input state or CEED_VECTOR_NONE if
500 there are no active inputs
501 @param[out] out CeedVector to store result of applying operator (must be
502 distinct from @a in) or CEED_VECTOR_NONE if there are no
503 active outputs
504 @param request Address of CeedRequest for non-blocking completion, else
505 CEED_REQUEST_IMMEDIATE
506
507 @return An error code: 0 - success, otherwise - failure
508
886/**
887 @brief Apply CeedOperator to a vector
888
889 This computes the action of the operator on the specified (active) input,
890 yielding its (active) output. All inputs and outputs must be specified using
891 CeedOperatorSetField().
892
893 @param op CeedOperator to apply
894 @param[in] in CeedVector containing input state or CEED_VECTOR_NONE if
895 there are no active inputs
896 @param[out] out CeedVector to store result of applying operator (must be
897 distinct from @a in) or CEED_VECTOR_NONE if there are no
898 active outputs
899 @param request Address of CeedRequest for non-blocking completion, else
900 CEED_REQUEST_IMMEDIATE
901
902 @return An error code: 0 - success, otherwise - failure
903
509 @ref Basic
904 @ref User
510**/
511int CeedOperatorApply(CeedOperator op, CeedVector in, CeedVector out,
512 CeedRequest *request) {
513 int ierr;
514 Ceed ceed = op->ceed;
515 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
516
517 if (op->numelements) {

--- 59 unchanged lines hidden (view full) ---

577 active inputs
578 @param[out] out CeedVector to sum in result of applying operator (must be
579 distinct from @a in) or NULL if there are no active outputs
580 @param request Address of CeedRequest for non-blocking completion, else
581 CEED_REQUEST_IMMEDIATE
582
583 @return An error code: 0 - success, otherwise - failure
584
905**/
906int CeedOperatorApply(CeedOperator op, CeedVector in, CeedVector out,
907 CeedRequest *request) {
908 int ierr;
909 Ceed ceed = op->ceed;
910 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
911
912 if (op->numelements) {

--- 59 unchanged lines hidden (view full) ---

972 active inputs
973 @param[out] out CeedVector to sum in result of applying operator (must be
974 distinct from @a in) or NULL if there are no active outputs
975 @param request Address of CeedRequest for non-blocking completion, else
976 CEED_REQUEST_IMMEDIATE
977
978 @return An error code: 0 - success, otherwise - failure
979
585 @ref Basic
980 @ref User
586**/
587int CeedOperatorApplyAdd(CeedOperator op, CeedVector in, CeedVector out,
588 CeedRequest *request) {
589 int ierr;
590 Ceed ceed = op->ceed;
591 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
592
593 if (op->numelements) {

--- 15 unchanged lines hidden (view full) ---

609 }
610 }
611 }
612
613 return 0;
614}
615
616/**
981**/
982int CeedOperatorApplyAdd(CeedOperator op, CeedVector in, CeedVector out,
983 CeedRequest *request) {
984 int ierr;
985 Ceed ceed = op->ceed;
986 ierr = CeedOperatorCheckReady(ceed, op); CeedChk(ierr);
987
988 if (op->numelements) {

--- 15 unchanged lines hidden (view full) ---

1004 }
1005 }
1006 }
1007
1008 return 0;
1009}
1010
1011/**
617 @brief Get the Ceed associated with a CeedOperator
618
619 @param op CeedOperator
620 @param[out] ceed Variable to store Ceed
621
622 @return An error code: 0 - success, otherwise - failure
623
624 @ref Advanced
625**/
626
627int CeedOperatorGetCeed(CeedOperator op, Ceed *ceed) {
628 *ceed = op->ceed;
629 return 0;
630}
631
632/**
633 @brief Get the number of elements associated with a CeedOperator
634
635 @param op CeedOperator
636 @param[out] numelem Variable to store number of elements
637
638 @return An error code: 0 - success, otherwise - failure
639
640 @ref Advanced
641**/
642
643int CeedOperatorGetNumElements(CeedOperator op, CeedInt *numelem) {
644 if (op->composite)
645 // LCOV_EXCL_START
646 return CeedError(op->ceed, 1, "Not defined for composite operator");
647 // LCOV_EXCL_STOP
648
649 *numelem = op->numelements;
650 return 0;
651}
652
653/**
654 @brief Get the number of quadrature points associated with a CeedOperator
655
656 @param op CeedOperator
657 @param[out] numqpts Variable to store vector number of quadrature points
658
659 @return An error code: 0 - success, otherwise - failure
660
661 @ref Advanced
662**/
663
664int CeedOperatorGetNumQuadraturePoints(CeedOperator op, CeedInt *numqpts) {
665 if (op->composite)
666 // LCOV_EXCL_START
667 return CeedError(op->ceed, 1, "Not defined for composite operator");
668 // LCOV_EXCL_STOP
669
670 *numqpts = op->numqpoints;
671 return 0;
672}
673
674/**
675 @brief Get the number of arguments associated with a CeedOperator
676
677 @param op CeedOperator
678 @param[out] numargs Variable to store vector number of arguments
679
680 @return An error code: 0 - success, otherwise - failure
681
682 @ref Advanced
683**/
684
685int CeedOperatorGetNumArgs(CeedOperator op, CeedInt *numargs) {
686 if (op->composite)
687 // LCOV_EXCL_START
688 return CeedError(op->ceed, 1, "Not defined for composite operators");
689 // LCOV_EXCL_STOP
690
691 *numargs = op->nfields;
692 return 0;
693}
694
695/**
696 @brief Get the setup status of a CeedOperator
697
698 @param op CeedOperator
699 @param[out] setupdone Variable to store setup status
700
701 @return An error code: 0 - success, otherwise - failure
702
703 @ref Advanced
704**/
705
706int CeedOperatorGetSetupStatus(CeedOperator op, bool *setupdone) {
707 *setupdone = op->setupdone;
708 return 0;
709}
710
711/**
712 @brief Get the QFunction associated with a CeedOperator
713
714 @param op CeedOperator
715 @param[out] qf Variable to store QFunction
716
717 @return An error code: 0 - success, otherwise - failure
718
719 @ref Advanced
720**/
721
722int CeedOperatorGetQFunction(CeedOperator op, CeedQFunction *qf) {
723 if (op->composite)
724 // LCOV_EXCL_START
725 return CeedError(op->ceed, 1, "Not defined for composite operator");
726 // LCOV_EXCL_STOP
727
728 *qf = op->qf;
729 return 0;
730}
731
732/**
733 @brief Get the number of suboperators associated with a CeedOperator
734
735 @param op CeedOperator
736 @param[out] numsub Variable to store number of suboperators
737
738 @return An error code: 0 - success, otherwise - failure
739
740 @ref Advanced
741**/
742
743int CeedOperatorGetNumSub(CeedOperator op, CeedInt *numsub) {
744 if (!op->composite)
745 // LCOV_EXCL_START
746 return CeedError(op->ceed, 1, "Not a composite operator");
747 // LCOV_EXCL_STOP
748
749 *numsub = op->numsub;
750 return 0;
751}
752
753/**
754 @brief Get the list of suboperators associated with a CeedOperator
755
756 @param op CeedOperator
757 @param[out] suboperators Variable to store list of suboperators
758
759 @return An error code: 0 - success, otherwise - failure
760
761 @ref Advanced
762**/
763
764int CeedOperatorGetSubList(CeedOperator op, CeedOperator **suboperators) {
765 if (!op->composite)
766 // LCOV_EXCL_START
767 return CeedError(op->ceed, 1, "Not a composite operator");
768 // LCOV_EXCL_STOP
769
770 *suboperators = op->suboperators;
771 return 0;
772}
773
774/**
775 @brief Set the backend data of a CeedOperator
776
777 @param[out] op CeedOperator
778 @param data Data to set
779
780 @return An error code: 0 - success, otherwise - failure
781
782 @ref Advanced
783**/
784
785int CeedOperatorSetData(CeedOperator op, void **data) {
786 op->data = *data;
787 return 0;
788}
789
790/**
791 @brief Get the backend data of a CeedOperator
792
793 @param op CeedOperator
794 @param[out] data Variable to store data
795
796 @return An error code: 0 - success, otherwise - failure
797
798 @ref Advanced
799**/
800
801int CeedOperatorGetData(CeedOperator op, void **data) {
802 *data = op->data;
803 return 0;
804}
805
806/**
807 @brief Set the setup flag of a CeedOperator to True
808
809 @param op CeedOperator
810
811 @return An error code: 0 - success, otherwise - failure
812
813 @ref Advanced
814**/
815
816int CeedOperatorSetSetupDone(CeedOperator op) {
817 op->setupdone = 1;
818 return 0;
819}
820
821/**
822 @brief View a field of a CeedOperator
823
824 @param[in] field Operator field to view
825 @param[in] fieldnumber Number of field being viewed
826 @param[in] stream Stream to view to, e.g., stdout
827
828 @return An error code: 0 - success, otherwise - failure
829
830 @ref Utility
831**/
832static int CeedOperatorFieldView(CeedOperatorField field,
833 CeedQFunctionField qffield,
834 CeedInt fieldnumber, bool sub, bool in,
835 FILE *stream) {
836 const char *pre = sub ? " " : "";
837 const char *inout = in ? "Input" : "Output";
838
839 fprintf(stream, "%s %s Field [%d]:\n"
840 "%s Name: \"%s\"\n",
841 pre, inout, fieldnumber, pre, qffield->fieldname);
842
843 if (field->basis == CEED_BASIS_COLLOCATED)
844 fprintf(stream, "%s Collocated basis\n", pre);
845
846 if (field->vec == CEED_VECTOR_ACTIVE)
847 fprintf(stream, "%s Active vector\n", pre);
848 else if (field->vec == CEED_VECTOR_NONE)
849 fprintf(stream, "%s No vector\n", pre);
850
851 return 0;
852}
853
854/**
855 @brief View a single CeedOperator
856
857 @param[in] op CeedOperator to view
858 @param[in] sub Boolean flag for sub-operator
859 @param[in] stream Stream to write; typically stdout/stderr or a file
860
861 @return Error code: 0 - success, otherwise - failure
862
863 @ref Utility
864**/
865int CeedOperatorSingleView(CeedOperator op, bool sub, FILE *stream) {
866 int ierr;
867 const char *pre = sub ? " " : "";
868
869 CeedInt totalfields;
870 ierr = CeedOperatorGetNumArgs(op, &totalfields); CeedChk(ierr);
871
872 fprintf(stream, "%s %d Field%s\n", pre, totalfields, totalfields>1 ? "s" : "");
873
874 fprintf(stream, "%s %d Input Field%s:\n", pre, op->qf->numinputfields,
875 op->qf->numinputfields>1 ? "s" : "");
876 for (CeedInt i=0; i<op->qf->numinputfields; i++) {
877 ierr = CeedOperatorFieldView(op->inputfields[i], op->qf->inputfields[i],
878 i, sub, 1, stream); CeedChk(ierr);
879 }
880
881 fprintf(stream, "%s %d Output Field%s:\n", pre, op->qf->numoutputfields,
882 op->qf->numoutputfields>1 ? "s" : "");
883 for (CeedInt i=0; i<op->qf->numoutputfields; i++) {
884 ierr = CeedOperatorFieldView(op->outputfields[i], op->qf->inputfields[i],
885 i, sub, 0, stream); CeedChk(ierr);
886 }
887
888 return 0;
889}
890
891/**
892 @brief View a CeedOperator
893
894 @param[in] op CeedOperator to view
895 @param[in] stream Stream to write; typically stdout/stderr or a file
896
897 @return Error code: 0 - success, otherwise - failure
898
899 @ref Utility
900**/
901int CeedOperatorView(CeedOperator op, FILE *stream) {
902 int ierr;
903
904 if (op->composite) {
905 fprintf(stream, "Composite CeedOperator\n");
906
907 for (CeedInt i=0; i<op->numsub; i++) {
908 fprintf(stream, " SubOperator [%d]:\n", i);
909 ierr = CeedOperatorSingleView(op->suboperators[i], 1, stream);
910 CeedChk(ierr);
911 }
912 } else {
913 fprintf(stream, "CeedOperator\n");
914 ierr = CeedOperatorSingleView(op, 0, stream); CeedChk(ierr);
915 }
916
917 return 0;
918}
919
920/**
921 @brief Get the CeedOperatorFields of a CeedOperator
922
923 @param op CeedOperator
924 @param[out] inputfields Variable to store inputfields
925 @param[out] outputfields Variable to store outputfields
926
927 @return An error code: 0 - success, otherwise - failure
928
929 @ref Advanced
930**/
931
932int CeedOperatorGetFields(CeedOperator op, CeedOperatorField **inputfields,
933 CeedOperatorField **outputfields) {
934 if (op->composite)
935 // LCOV_EXCL_START
936 return CeedError(op->ceed, 1, "Not defined for composite operator");
937 // LCOV_EXCL_STOP
938
939 if (inputfields) *inputfields = op->inputfields;
940 if (outputfields) *outputfields = op->outputfields;
941 return 0;
942}
943
944/**
945 @brief Get the CeedElemRestriction of a CeedOperatorField
946
947 @param opfield CeedOperatorField
948 @param[out] rstr Variable to store CeedElemRestriction
949
950 @return An error code: 0 - success, otherwise - failure
951
952 @ref Advanced
953**/
954
955int CeedOperatorFieldGetElemRestriction(CeedOperatorField opfield,
956 CeedElemRestriction *rstr) {
957 *rstr = opfield->Erestrict;
958 return 0;
959}
960
961/**
962 @brief Get the CeedBasis of a CeedOperatorField
963
964 @param opfield CeedOperatorField
965 @param[out] basis Variable to store CeedBasis
966
967 @return An error code: 0 - success, otherwise - failure
968
969 @ref Advanced
970**/
971
972int CeedOperatorFieldGetBasis(CeedOperatorField opfield, CeedBasis *basis) {
973 *basis = opfield->basis;
974 return 0;
975}
976
977/**
978 @brief Get the CeedVector of a CeedOperatorField
979
980 @param opfield CeedOperatorField
981 @param[out] vec Variable to store CeedVector
982
983 @return An error code: 0 - success, otherwise - failure
984
985 @ref Advanced
986**/
987
988int CeedOperatorFieldGetVector(CeedOperatorField opfield, CeedVector *vec) {
989 *vec = opfield->vec;
990 return 0;
991}
992
993/**
994 @brief Destroy a CeedOperator
995
996 @param op CeedOperator to destroy
997
998 @return An error code: 0 - success, otherwise - failure
999
1012 @brief Destroy a CeedOperator
1013
1014 @param op CeedOperator to destroy
1015
1016 @return An error code: 0 - success, otherwise - failure
1017
1000 @ref Basic
1018 @ref User
1001**/
1002int CeedOperatorDestroy(CeedOperator *op) {
1003 int ierr;
1004
1005 if (!*op || --(*op)->refcount > 0) return 0;
1006 if ((*op)->Destroy) {
1007 ierr = (*op)->Destroy(*op); CeedChk(ierr);
1008 }

--- 55 unchanged lines hidden ---
1019**/
1020int CeedOperatorDestroy(CeedOperator *op) {
1021 int ierr;
1022
1023 if (!*op || --(*op)->refcount > 0) return 0;
1024 if ((*op)->Destroy) {
1025 ierr = (*op)->Destroy(*op); CeedChk(ierr);
1026 }

--- 55 unchanged lines hidden ---