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