xref: /libCEED/rust/libceed-sys/c-src/interface/ceed-operator.c (revision d0eb30a5497a9f676c94d4f8a11ba53bf9f5d27f)
1d7b241e6Sjeremylt // Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at
2d7b241e6Sjeremylt // the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights
3d7b241e6Sjeremylt // reserved. See files LICENSE and NOTICE for details.
4d7b241e6Sjeremylt //
5d7b241e6Sjeremylt // This file is part of CEED, a collection of benchmarks, miniapps, software
6d7b241e6Sjeremylt // libraries and APIs for efficient high-order finite element and spectral
7d7b241e6Sjeremylt // element discretizations for exascale applications. For more information and
8d7b241e6Sjeremylt // source code availability see http://github.com/ceed.
9d7b241e6Sjeremylt //
10d7b241e6Sjeremylt // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
11d7b241e6Sjeremylt // a collaborative effort of two U.S. Department of Energy organizations (Office
12d7b241e6Sjeremylt // of Science and the National Nuclear Security Administration) responsible for
13d7b241e6Sjeremylt // the planning and preparation of a capable exascale ecosystem, including
14d7b241e6Sjeremylt // software, applications, hardware, advanced system engineering and early
15d7b241e6Sjeremylt // testbed platforms, in support of the nation's exascale computing imperative.
16d7b241e6Sjeremylt 
17d7b241e6Sjeremylt #include <ceed-impl.h>
18d863ab9bSjeremylt #include <ceed-backend.h>
19d7b241e6Sjeremylt #include <string.h>
20d7b241e6Sjeremylt 
21dfdf5a53Sjeremylt /// @file
22dfdf5a53Sjeremylt /// Implementation of public CeedOperator interfaces
23dfdf5a53Sjeremylt ///
24dfdf5a53Sjeremylt /// @addtogroup CeedOperator
25dfdf5a53Sjeremylt ///   @{
26d7b241e6Sjeremylt 
27d7b241e6Sjeremylt /**
28b11c1e72Sjeremylt   @brief Create an operator from element restriction, basis, and QFunction
29d7b241e6Sjeremylt 
30b11c1e72Sjeremylt   @param ceed    A Ceed object where the CeedOperator will be created
31d7b241e6Sjeremylt   @param qf      QFunction defining the action of the operator at quadrature points
32d7b241e6Sjeremylt   @param dqf     QFunction defining the action of the Jacobian of @a qf (or NULL)
33d7b241e6Sjeremylt   @param dqfT    QFunction defining the action of the transpose of the Jacobian
34d7b241e6Sjeremylt                    of @a qf (or NULL)
35b11c1e72Sjeremylt   @param[out] op Address of the variable where the newly created
36b11c1e72Sjeremylt                      CeedOperator will be stored
37b11c1e72Sjeremylt 
38b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
39dfdf5a53Sjeremylt 
40dfdf5a53Sjeremylt   @ref Basic
41d7b241e6Sjeremylt  */
42d7b241e6Sjeremylt int CeedOperatorCreate(Ceed ceed, CeedQFunction qf, CeedQFunction dqf,
43d7b241e6Sjeremylt                        CeedQFunction dqfT, CeedOperator *op) {
44d7b241e6Sjeremylt   int ierr;
45d7b241e6Sjeremylt 
465fe0d4faSjeremylt   if (!ceed->OperatorCreate) {
475fe0d4faSjeremylt     Ceed delegate;
485fe0d4faSjeremylt     ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr);
495fe0d4faSjeremylt 
505fe0d4faSjeremylt     if (!delegate)
515fe0d4faSjeremylt       return CeedError(ceed, 1, "Backend does not support OperatorCreate");
525fe0d4faSjeremylt 
535fe0d4faSjeremylt     ierr = CeedOperatorCreate(delegate, qf, dqf, dqfT, op); CeedChk(ierr);
545fe0d4faSjeremylt     return 0;
555fe0d4faSjeremylt   }
565fe0d4faSjeremylt 
57d7b241e6Sjeremylt   ierr = CeedCalloc(1,op); CeedChk(ierr);
58d7b241e6Sjeremylt   (*op)->ceed = ceed;
59d7b241e6Sjeremylt   ceed->refcount++;
60d7b241e6Sjeremylt   (*op)->refcount = 1;
61d7b241e6Sjeremylt   (*op)->qf = qf;
62d7b241e6Sjeremylt   qf->refcount++;
63d7b241e6Sjeremylt   (*op)->dqf = dqf;
64d7b241e6Sjeremylt   if (dqf) dqf->refcount++;
65d7b241e6Sjeremylt   (*op)->dqfT = dqfT;
66d7b241e6Sjeremylt   if (dqfT) dqfT->refcount++;
67fe2413ffSjeremylt   ierr = CeedCalloc(16, &(*op)->inputfields); CeedChk(ierr);
68fe2413ffSjeremylt   ierr = CeedCalloc(16, &(*op)->outputfields); CeedChk(ierr);
69d7b241e6Sjeremylt   ierr = ceed->OperatorCreate(*op); CeedChk(ierr);
70d7b241e6Sjeremylt   return 0;
71d7b241e6Sjeremylt }
72d7b241e6Sjeremylt 
73d7b241e6Sjeremylt /**
74b11c1e72Sjeremylt   @brief Provide a field to a CeedOperator for use by its CeedQFunction
75d7b241e6Sjeremylt 
76d7b241e6Sjeremylt   This function is used to specify both active and passive fields to a
77d7b241e6Sjeremylt   CeedOperator.  For passive fields, a vector @arg v must be provided.  Passive
78d7b241e6Sjeremylt   fields can inputs or outputs (updated in-place when operator is applied).
79d7b241e6Sjeremylt 
80d7b241e6Sjeremylt   Active fields must be specified using this function, but their data (in a
81d7b241e6Sjeremylt   CeedVector) is passed in CeedOperatorApply().  There can be at most one active
82d7b241e6Sjeremylt   input and at most one active output.
83d7b241e6Sjeremylt 
84b11c1e72Sjeremylt   @param op         Ceedoperator on which to provide the field
85b11c1e72Sjeremylt   @param fieldname  Name of the field (to be matched with the name used by CeedQFunction)
86b11c1e72Sjeremylt   @param r          CeedElemRestriction
87b0e29e78Sjeremylt   @param lmode      CeedTransposeMode which specifies the ordering of the
88b0e29e78Sjeremylt                       components of the l-vector used by this CeedOperatorField,
89b0e29e78Sjeremylt                       CEED_NOTRANSPOSE indicates the component is the
90b0e29e78Sjeremylt                       outermost index and CEED_TRANSPOSE indicates the component
91b0e29e78Sjeremylt                       is the innermost index in ordering of the l-vector
92783c99b3SValeria Barra   @param b          CeedBasis in which the field resides or CEED_BASIS_COLLOCATED
93b11c1e72Sjeremylt                       if collocated with quadrature points
94b11c1e72Sjeremylt   @param v          CeedVector to be used by CeedOperator or CEED_VECTOR_ACTIVE
95b11c1e72Sjeremylt                       if field is active or CEED_VECTOR_NONE if using
96b11c1e72Sjeremylt                       CEED_EVAL_WEIGHT in the qfunction
97b11c1e72Sjeremylt 
98b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
99dfdf5a53Sjeremylt 
100dfdf5a53Sjeremylt   @ref Basic
101b11c1e72Sjeremylt **/
102d7b241e6Sjeremylt int CeedOperatorSetField(CeedOperator op, const char *fieldname,
1034dccadb6Sjeremylt                          CeedElemRestriction r, CeedTransposeMode lmode,
1044dccadb6Sjeremylt                          CeedBasis b, CeedVector v) {
105d7b241e6Sjeremylt   int ierr;
106d7b241e6Sjeremylt   CeedInt numelements;
107d7b241e6Sjeremylt   ierr = CeedElemRestrictionGetNumElements(r, &numelements); CeedChk(ierr);
108d7b241e6Sjeremylt   if (op->numelements && op->numelements != numelements)
109d7b241e6Sjeremylt     return CeedError(op->ceed, 1,
110d7b241e6Sjeremylt                      "ElemRestriction with %d elements incompatible with prior %d elements",
111d7b241e6Sjeremylt                      numelements, op->numelements);
112d7b241e6Sjeremylt   op->numelements = numelements;
113d7b241e6Sjeremylt 
114783c99b3SValeria Barra   if (b != CEED_BASIS_COLLOCATED) {
115d7b241e6Sjeremylt     CeedInt numqpoints;
116d7b241e6Sjeremylt     ierr = CeedBasisGetNumQuadraturePoints(b, &numqpoints); CeedChk(ierr);
117d7b241e6Sjeremylt     if (op->numqpoints && op->numqpoints != numqpoints)
118d7b241e6Sjeremylt       return CeedError(op->ceed, 1,
119d7b241e6Sjeremylt                        "Basis with %d quadrature points incompatible with prior %d points",
120d7b241e6Sjeremylt                        numqpoints, op->numqpoints);
121d7b241e6Sjeremylt     op->numqpoints = numqpoints;
122d7b241e6Sjeremylt   }
123d1bcdac9Sjeremylt   CeedOperatorField *ofield;
124d7b241e6Sjeremylt   for (CeedInt i=0; i<op->qf->numinputfields; i++) {
125fe2413ffSjeremylt     if (!strcmp(fieldname, (*op->qf->inputfields[i]).fieldname)) {
126d7b241e6Sjeremylt       ofield = &op->inputfields[i];
127d7b241e6Sjeremylt       goto found;
128d7b241e6Sjeremylt     }
129d7b241e6Sjeremylt   }
130d7b241e6Sjeremylt   for (CeedInt i=0; i<op->qf->numoutputfields; i++) {
131fe2413ffSjeremylt     if (!strcmp(fieldname, (*op->qf->outputfields[i]).fieldname)) {
132d7b241e6Sjeremylt       ofield = &op->outputfields[i];
133d7b241e6Sjeremylt       goto found;
134d7b241e6Sjeremylt     }
135d7b241e6Sjeremylt   }
136d7b241e6Sjeremylt   return CeedError(op->ceed, 1, "QFunction has no knowledge of field '%s'",
137d7b241e6Sjeremylt                    fieldname);
138d7b241e6Sjeremylt found:
139fe2413ffSjeremylt   ierr = CeedCalloc(1, ofield); CeedChk(ierr);
140fe2413ffSjeremylt   (*ofield)->Erestrict = r;
141fe2413ffSjeremylt   (*ofield)->lmode = lmode;
142fe2413ffSjeremylt   (*ofield)->basis = b;
143fe2413ffSjeremylt   (*ofield)->vec = v;
144d7b241e6Sjeremylt   op->nfields += 1;
145d7b241e6Sjeremylt   return 0;
146d7b241e6Sjeremylt }
147d7b241e6Sjeremylt 
148d7b241e6Sjeremylt /**
149b11c1e72Sjeremylt   @brief Apply CeedOperator to a vector
150d7b241e6Sjeremylt 
151d7b241e6Sjeremylt   This computes the action of the operator on the specified (active) input,
152d7b241e6Sjeremylt   yielding its (active) output.  All inputs and outputs must be specified using
153d7b241e6Sjeremylt   CeedOperatorSetField().
154d7b241e6Sjeremylt 
155d7b241e6Sjeremylt   @param op        CeedOperator to apply
156b11c1e72Sjeremylt   @param[in] in    CeedVector containing input state or NULL if there are no
157b11c1e72Sjeremylt                      active inputs
158b11c1e72Sjeremylt   @param[out] out  CeedVector to store result of applying operator (must be
159d7b241e6Sjeremylt                      distinct from @a in) or NULL if there are no active outputs
160d7b241e6Sjeremylt   @param request   Address of CeedRequest for non-blocking completion, else
161d7b241e6Sjeremylt                      CEED_REQUEST_IMMEDIATE
162b11c1e72Sjeremylt 
163b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
164dfdf5a53Sjeremylt 
165dfdf5a53Sjeremylt   @ref Basic
166b11c1e72Sjeremylt **/
167d7b241e6Sjeremylt int CeedOperatorApply(CeedOperator op, CeedVector in,
168d7b241e6Sjeremylt                       CeedVector out, CeedRequest *request) {
169d7b241e6Sjeremylt   int ierr;
170d7b241e6Sjeremylt   Ceed ceed = op->ceed;
171d7b241e6Sjeremylt   CeedQFunction qf = op->qf;
172d7b241e6Sjeremylt 
173d7b241e6Sjeremylt   if (op->nfields == 0) return CeedError(ceed, 1, "No operator fields set");
174d7b241e6Sjeremylt   if (op->nfields < qf->numinputfields + qf->numoutputfields) return CeedError(
175d7b241e6Sjeremylt           ceed, 1, "Not all operator fields set");
176d7b241e6Sjeremylt   if (op->numelements == 0) return CeedError(ceed, 1,
177d7b241e6Sjeremylt                                      "At least one restriction required");
178d7b241e6Sjeremylt   if (op->numqpoints == 0) return CeedError(ceed, 1,
179783c99b3SValeria Barra                                     "At least one non-collocated basis required");
180d7b241e6Sjeremylt   ierr = op->Apply(op, in, out, request); CeedChk(ierr);
181d7b241e6Sjeremylt   return 0;
182d7b241e6Sjeremylt }
183d7b241e6Sjeremylt 
184d7b241e6Sjeremylt /**
1854ce2993fSjeremylt   @brief Get the Ceed associated with a CeedOperator
1864ce2993fSjeremylt 
1874ce2993fSjeremylt   @param op              CeedOperator
1884ce2993fSjeremylt   @param[out] ceed       Variable to store Ceed
1894ce2993fSjeremylt 
1904ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
1914ce2993fSjeremylt 
19223617272Sjeremylt   @ref Advanced
1934ce2993fSjeremylt **/
1944ce2993fSjeremylt 
1954ce2993fSjeremylt int CeedOperatorGetCeed(CeedOperator op, Ceed *ceed) {
1964ce2993fSjeremylt   *ceed = op->ceed;
1974ce2993fSjeremylt   return 0;
1984ce2993fSjeremylt }
1994ce2993fSjeremylt 
2004ce2993fSjeremylt /**
2014ce2993fSjeremylt   @brief Get the number of elements associated with a CeedOperator
2024ce2993fSjeremylt 
2034ce2993fSjeremylt   @param op              CeedOperator
2044ce2993fSjeremylt   @param[out] numelem    Variable to store number of elements
2054ce2993fSjeremylt 
2064ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
2074ce2993fSjeremylt 
20823617272Sjeremylt   @ref Advanced
2094ce2993fSjeremylt **/
2104ce2993fSjeremylt 
2114ce2993fSjeremylt int CeedOperatorGetNumElements(CeedOperator op, CeedInt *numelem) {
2124ce2993fSjeremylt   *numelem = op->numelements;
2134ce2993fSjeremylt   return 0;
2144ce2993fSjeremylt }
2154ce2993fSjeremylt 
2164ce2993fSjeremylt /**
2174ce2993fSjeremylt   @brief Get the number of quadrature points associated with a CeedOperator
2184ce2993fSjeremylt 
2194ce2993fSjeremylt   @param op              CeedOperator
2204ce2993fSjeremylt   @param[out] numqpts    Variable to store vector number of quadrature points
2214ce2993fSjeremylt 
2224ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
2234ce2993fSjeremylt 
22423617272Sjeremylt   @ref Advanced
2254ce2993fSjeremylt **/
2264ce2993fSjeremylt 
2274ce2993fSjeremylt int CeedOperatorGetNumQuadraturePoints(CeedOperator op, CeedInt *numqpts) {
2284ce2993fSjeremylt   *numqpts = op->numqpoints;
2294ce2993fSjeremylt   return 0;
2304ce2993fSjeremylt }
2314ce2993fSjeremylt 
2324ce2993fSjeremylt /**
2334ce2993fSjeremylt   @brief Get the number of arguments associated with a CeedOperator
2344ce2993fSjeremylt 
2354ce2993fSjeremylt   @param op              CeedOperator
2364ce2993fSjeremylt   @param[out] numargs    Variable to store vector number of arguments
2374ce2993fSjeremylt 
2384ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
2394ce2993fSjeremylt 
24023617272Sjeremylt   @ref Advanced
2414ce2993fSjeremylt **/
2424ce2993fSjeremylt 
2434ce2993fSjeremylt int CeedOperatorGetNumArgs(CeedOperator op, CeedInt *numargs) {
2444ce2993fSjeremylt   *numargs = op->nfields;
2454ce2993fSjeremylt   return 0;
2464ce2993fSjeremylt }
2474ce2993fSjeremylt 
2484ce2993fSjeremylt /**
2494ce2993fSjeremylt   @brief Get the setup status of a CeedOperator
2504ce2993fSjeremylt 
2514ce2993fSjeremylt   @param op              CeedOperator
2524ce2993fSjeremylt   @param[out] numelem    Variable to store setup status
2534ce2993fSjeremylt 
2544ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
2554ce2993fSjeremylt 
25623617272Sjeremylt   @ref Advanced
2574ce2993fSjeremylt **/
2584ce2993fSjeremylt 
2594ce2993fSjeremylt int CeedOperatorGetSetupStatus(CeedOperator op, bool *setupdone) {
2604ce2993fSjeremylt   *setupdone = op->setupdone;
2614ce2993fSjeremylt   return 0;
2624ce2993fSjeremylt }
2634ce2993fSjeremylt 
2644ce2993fSjeremylt /**
2654ce2993fSjeremylt   @brief Get the QFunction associated with a CeedOperator
2664ce2993fSjeremylt 
2674ce2993fSjeremylt   @param op              CeedOperator
2684ce2993fSjeremylt   @param[out] qf         Variable to store qfunction
2694ce2993fSjeremylt 
2704ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
2714ce2993fSjeremylt 
27223617272Sjeremylt   @ref Advanced
2734ce2993fSjeremylt **/
2744ce2993fSjeremylt 
2754ce2993fSjeremylt int CeedOperatorGetQFunction(CeedOperator op, CeedQFunction *qf) {
2764ce2993fSjeremylt   *qf = op->qf;
2774ce2993fSjeremylt   return 0;
2784ce2993fSjeremylt }
2794ce2993fSjeremylt 
2804ce2993fSjeremylt /**
281fe2413ffSjeremylt   @brief Set the backend data of a CeedOperator
282fe2413ffSjeremylt 
283fe2413ffSjeremylt   @param[out] op         CeedOperator
284fe2413ffSjeremylt   @param data            Data to set
285fe2413ffSjeremylt 
286fe2413ffSjeremylt   @return An error code: 0 - success, otherwise - failure
287fe2413ffSjeremylt 
288fe2413ffSjeremylt   @ref Advanced
289fe2413ffSjeremylt **/
290fe2413ffSjeremylt 
291fe2413ffSjeremylt int CeedOperatorSetData(CeedOperator op, void* *data) {
292fe2413ffSjeremylt   op->data = *data;
293fe2413ffSjeremylt   return 0;
294fe2413ffSjeremylt }
295fe2413ffSjeremylt 
296fe2413ffSjeremylt /**
2974ce2993fSjeremylt   @brief Get the backend data of a CeedOperator
2984ce2993fSjeremylt 
2994ce2993fSjeremylt   @param op              CeedOperator
3004ce2993fSjeremylt   @param[out] data       Variable to store data
3014ce2993fSjeremylt 
3024ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3034ce2993fSjeremylt 
30423617272Sjeremylt   @ref Advanced
3054ce2993fSjeremylt **/
3064ce2993fSjeremylt 
3074ce2993fSjeremylt int CeedOperatorGetData(CeedOperator op, void* *data) {
3084ce2993fSjeremylt   *data = op->data;
3094ce2993fSjeremylt   return 0;
3104ce2993fSjeremylt }
3114ce2993fSjeremylt 
3124ce2993fSjeremylt /**
3134ce2993fSjeremylt   @brief Set the setup flag of a CeedOperator to True
3144ce2993fSjeremylt 
3154ce2993fSjeremylt   @param op              CeedOperator
3164ce2993fSjeremylt 
3174ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3184ce2993fSjeremylt 
31923617272Sjeremylt   @ref Advanced
3204ce2993fSjeremylt **/
3214ce2993fSjeremylt 
3224ce2993fSjeremylt int CeedOperatorSetSetupDone(CeedOperator op) {
3234ce2993fSjeremylt   op->setupdone = 1;
3244ce2993fSjeremylt   return 0;
3254ce2993fSjeremylt }
3264ce2993fSjeremylt 
3274ce2993fSjeremylt /**
328d1bcdac9Sjeremylt   @brief Get the CeedOperatorFields of a CeedOperator
329d1bcdac9Sjeremylt 
330d1bcdac9Sjeremylt   @param op                 CeedOperator
331d1bcdac9Sjeremylt   @param[out] inputfields   Variable to store inputfields
332d1bcdac9Sjeremylt   @param[out] outputfields  Variable to store outputfields
333d1bcdac9Sjeremylt 
334d1bcdac9Sjeremylt   @return An error code: 0 - success, otherwise - failure
335d1bcdac9Sjeremylt 
336d1bcdac9Sjeremylt   @ref Advanced
337d1bcdac9Sjeremylt **/
338d1bcdac9Sjeremylt 
339d1bcdac9Sjeremylt int CeedOperatorGetFields(CeedOperator op,
340d1bcdac9Sjeremylt                           CeedOperatorField* *inputfields,
341d1bcdac9Sjeremylt                           CeedOperatorField* *outputfields) {
342d1bcdac9Sjeremylt   if (inputfields) *inputfields = op->inputfields;
343d1bcdac9Sjeremylt   if (outputfields) *outputfields = op->outputfields;
344d1bcdac9Sjeremylt   return 0;
345d1bcdac9Sjeremylt }
346d1bcdac9Sjeremylt 
347d1bcdac9Sjeremylt /**
3484dccadb6Sjeremylt   @brief Get the L vector CeedTransposeMode of a CeedOperatorField
3494dccadb6Sjeremylt 
3504dccadb6Sjeremylt   @param opfield         CeedOperatorField
3514dccadb6Sjeremylt   @param[out] lmode      Variable to store CeedTransposeMode
3524dccadb6Sjeremylt 
3534dccadb6Sjeremylt   @return An error code: 0 - success, otherwise - failure
3544dccadb6Sjeremylt 
3554dccadb6Sjeremylt   @ref Advanced
3564dccadb6Sjeremylt **/
3574dccadb6Sjeremylt 
3584dccadb6Sjeremylt int CeedOperatorFieldGetLMode(CeedOperatorField opfield,
3594dccadb6Sjeremylt                               CeedTransposeMode *lmode) {
360fe2413ffSjeremylt   *lmode = opfield->lmode;
3614dccadb6Sjeremylt   return 0;
3624dccadb6Sjeremylt }/**
363d1bcdac9Sjeremylt   @brief Get the CeedElemRestriction of a CeedOperatorField
364d1bcdac9Sjeremylt 
365d1bcdac9Sjeremylt   @param opfield         CeedOperatorField
366d1bcdac9Sjeremylt   @param[out] rstr       Variable to store CeedElemRestriction
367d1bcdac9Sjeremylt 
368d1bcdac9Sjeremylt   @return An error code: 0 - success, otherwise - failure
369d1bcdac9Sjeremylt 
370d1bcdac9Sjeremylt   @ref Advanced
371d1bcdac9Sjeremylt **/
372d1bcdac9Sjeremylt 
373d1bcdac9Sjeremylt int CeedOperatorFieldGetElemRestriction(CeedOperatorField opfield,
374d1bcdac9Sjeremylt                                         CeedElemRestriction *rstr) {
375fe2413ffSjeremylt   *rstr = opfield->Erestrict;
376d1bcdac9Sjeremylt   return 0;
377d1bcdac9Sjeremylt }
378d1bcdac9Sjeremylt 
379d1bcdac9Sjeremylt /**
380d1bcdac9Sjeremylt   @brief Get the CeedBasis of a CeedOperatorField
381d1bcdac9Sjeremylt 
382d1bcdac9Sjeremylt   @param opfield         CeedOperatorField
383d1bcdac9Sjeremylt   @param[out] basis      Variable to store CeedBasis
384d1bcdac9Sjeremylt 
385d1bcdac9Sjeremylt   @return An error code: 0 - success, otherwise - failure
386d1bcdac9Sjeremylt 
387d1bcdac9Sjeremylt   @ref Advanced
388d1bcdac9Sjeremylt **/
389d1bcdac9Sjeremylt 
390d1bcdac9Sjeremylt int CeedOperatorFieldGetBasis(CeedOperatorField opfield,
391d1bcdac9Sjeremylt                               CeedBasis *basis) {
392fe2413ffSjeremylt   *basis = opfield->basis;
393d1bcdac9Sjeremylt   return 0;
394d1bcdac9Sjeremylt }
395d1bcdac9Sjeremylt 
396d1bcdac9Sjeremylt /**
397d1bcdac9Sjeremylt   @brief Get the CeedVector of a CeedOperatorField
398d1bcdac9Sjeremylt 
399d1bcdac9Sjeremylt   @param opfield         CeedOperatorField
400d1bcdac9Sjeremylt   @param[out] vec        Variable to store CeedVector
401d1bcdac9Sjeremylt 
402d1bcdac9Sjeremylt   @return An error code: 0 - success, otherwise - failure
403d1bcdac9Sjeremylt 
404d1bcdac9Sjeremylt   @ref Advanced
405d1bcdac9Sjeremylt **/
406d1bcdac9Sjeremylt 
407d1bcdac9Sjeremylt int CeedOperatorFieldGetVector(CeedOperatorField opfield,
408d1bcdac9Sjeremylt                                CeedVector *vec) {
409fe2413ffSjeremylt   *vec = opfield->vec;
410d1bcdac9Sjeremylt   return 0;
411d1bcdac9Sjeremylt }
412d1bcdac9Sjeremylt 
413d1bcdac9Sjeremylt /**
414b11c1e72Sjeremylt   @brief Destroy a CeedOperator
415d7b241e6Sjeremylt 
416d7b241e6Sjeremylt   @param op CeedOperator to destroy
417b11c1e72Sjeremylt 
418b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
419dfdf5a53Sjeremylt 
420dfdf5a53Sjeremylt   @ref Basic
421b11c1e72Sjeremylt **/
422d7b241e6Sjeremylt int CeedOperatorDestroy(CeedOperator *op) {
423d7b241e6Sjeremylt   int ierr;
424d7b241e6Sjeremylt 
425d7b241e6Sjeremylt   if (!*op || --(*op)->refcount > 0) return 0;
426d7b241e6Sjeremylt   if ((*op)->Destroy) {
427d7b241e6Sjeremylt     ierr = (*op)->Destroy(*op); CeedChk(ierr);
428d7b241e6Sjeremylt   }
429fe2413ffSjeremylt   ierr = CeedDestroy(&(*op)->ceed); CeedChk(ierr);
430fe2413ffSjeremylt   // Free fields
431*d0eb30a5Sjeremylt   for (int i=0; i<(*op)->nfields; i++) {
432*d0eb30a5Sjeremylt     if ((*op)->outputfields[i]) {
433fe2413ffSjeremylt       ierr = CeedFree(&(*op)->inputfields[i]); CeedChk(ierr);
434fe2413ffSjeremylt     }
435*d0eb30a5Sjeremylt   }
436*d0eb30a5Sjeremylt   for (int i=0; i<(*op)->nfields; i++) {
437*d0eb30a5Sjeremylt     if ((*op)->outputfields[i]) {
438fe2413ffSjeremylt       ierr = CeedFree(&(*op)->outputfields[i]); CeedChk(ierr);
439fe2413ffSjeremylt     }
440*d0eb30a5Sjeremylt   }
441d7b241e6Sjeremylt   ierr = CeedQFunctionDestroy(&(*op)->qf); CeedChk(ierr);
442d7b241e6Sjeremylt   ierr = CeedQFunctionDestroy(&(*op)->dqf); CeedChk(ierr);
443d7b241e6Sjeremylt   ierr = CeedQFunctionDestroy(&(*op)->dqfT); CeedChk(ierr);
444fe2413ffSjeremylt 
445fe2413ffSjeremylt   ierr = CeedFree(&(*op)->inputfields); CeedChk(ierr);
446fe2413ffSjeremylt   ierr = CeedFree(&(*op)->outputfields); CeedChk(ierr);
447d7b241e6Sjeremylt   ierr = CeedFree(op); CeedChk(ierr);
448d7b241e6Sjeremylt   return 0;
449d7b241e6Sjeremylt }
450d7b241e6Sjeremylt 
451d7b241e6Sjeremylt /// @}
452