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 20*15910d16Sjeremylt /// @cond DOXYGEN_SKIP 21*15910d16Sjeremylt static struct CeedElemRestriction_private ceed_elemrestriction_none; 22*15910d16Sjeremylt /// @endcond 23*15910d16Sjeremylt 24d7b241e6Sjeremylt /// @file 25d7b241e6Sjeremylt /// Implementation of public CeedElemRestriction interfaces 26d7b241e6Sjeremylt /// 27dfdf5a53Sjeremylt /// @addtogroup CeedElemRestriction 28d7b241e6Sjeremylt /// @{ 29d7b241e6Sjeremylt 30d7b241e6Sjeremylt /** 31b11c1e72Sjeremylt @brief Create a CeedElemRestriction 32d7b241e6Sjeremylt 33b11c1e72Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created 3461dbc9d2Sjeremylt @param imode Ordering of the ncomp components, i.e. it specifies 35a8d32208Sjeremylt the ordering of the components of the L-vector used 3661dbc9d2Sjeremylt by this CeedElemRestriction. CEED_NONINTERLACED indicates 3761dbc9d2Sjeremylt the component is the outermost index and CEED_INTERLACED 38a8d32208Sjeremylt indicates the component is the innermost index in 39a8d32208Sjeremylt ordering of the L-vector. 40b11c1e72Sjeremylt @param nelem Number of elements described in the @a indices array 41b11c1e72Sjeremylt @param elemsize Size (number of "nodes") per element 428795c945Sjeremylt @param nnodes The number of nodes in the L-vector. The input CeedVector 438795c945Sjeremylt to which the restriction will be applied is of size 448795c945Sjeremylt @a nnodes * @a ncomp. This size may include data 45d7b241e6Sjeremylt used by other CeedElemRestriction objects describing 46d7b241e6Sjeremylt different types of elements. 47b11c1e72Sjeremylt @param ncomp Number of field components per interpolation node 4895bb1877Svaleriabarra (1 for scalar fields) 49b11c1e72Sjeremylt @param mtype Memory type of the @a indices array, see CeedMemType 50b11c1e72Sjeremylt @param cmode Copy mode for the @a indices array, see CeedCopyMode 518795c945Sjeremylt @param indices Array of shape [@a nelem, @a elemsize]. Row i holds the 528795c945Sjeremylt ordered list of the indices (into the input CeedVector) 538795c945Sjeremylt for the unknowns corresponding to element i, where 5434138859Sjeremylt 0 <= i < @a nelem. All indices must be in the range 5523e8ed12Sjeremylt [0, @a nnodes - 1]. 564ce2993fSjeremylt @param[out] rstr Address of the variable where the newly created 57b11c1e72Sjeremylt CeedElemRestriction will be stored 58d7b241e6Sjeremylt 59b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 60dfdf5a53Sjeremylt 61dfdf5a53Sjeremylt @ref Basic 62b11c1e72Sjeremylt **/ 6361dbc9d2Sjeremylt int CeedElemRestrictionCreate(Ceed ceed, CeedInterlaceMode imode, 647509a596Sjeremylt CeedInt nelem, CeedInt elemsize, CeedInt nnodes, 657509a596Sjeremylt CeedInt ncomp, CeedMemType mtype, 667509a596Sjeremylt CeedCopyMode cmode, const CeedInt *indices, 674ce2993fSjeremylt CeedElemRestriction *rstr) { 68d7b241e6Sjeremylt int ierr; 69d7b241e6Sjeremylt 705fe0d4faSjeremylt if (!ceed->ElemRestrictionCreate) { 715fe0d4faSjeremylt Ceed delegate; 72aefd8378Sjeremylt ierr = CeedGetObjectDelegate(ceed, &delegate, "ElemRestriction"); 73aefd8378Sjeremylt CeedChk(ierr); 745fe0d4faSjeremylt 755fe0d4faSjeremylt if (!delegate) 76c042f62fSJeremy L Thompson // LCOV_EXCL_START 77d7b241e6Sjeremylt return CeedError(ceed, 1, "Backend does not support ElemRestrictionCreate"); 78c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 795fe0d4faSjeremylt 8061dbc9d2Sjeremylt ierr = CeedElemRestrictionCreate(delegate, imode, nelem, elemsize, 818795c945Sjeremylt nnodes, ncomp, mtype, cmode, 824ce2993fSjeremylt indices, rstr); CeedChk(ierr); 835fe0d4faSjeremylt return 0; 845fe0d4faSjeremylt } 855fe0d4faSjeremylt 864ce2993fSjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 874ce2993fSjeremylt (*rstr)->ceed = ceed; 88d7b241e6Sjeremylt ceed->refcount++; 894ce2993fSjeremylt (*rstr)->refcount = 1; 9061dbc9d2Sjeremylt (*rstr)->imode = imode; 914ce2993fSjeremylt (*rstr)->nelem = nelem; 924ce2993fSjeremylt (*rstr)->elemsize = elemsize; 938795c945Sjeremylt (*rstr)->nnodes = nnodes; 944ce2993fSjeremylt (*rstr)->ncomp = ncomp; 954ce2993fSjeremylt (*rstr)->nblk = nelem; 964ce2993fSjeremylt (*rstr)->blksize = 1; 974ce2993fSjeremylt ierr = ceed->ElemRestrictionCreate(mtype, cmode, indices, *rstr); CeedChk(ierr); 98d7b241e6Sjeremylt return 0; 99d7b241e6Sjeremylt } 100d7b241e6Sjeremylt 101d7b241e6Sjeremylt /** 1027509a596Sjeremylt @brief Create a strided CeedElemRestriction 103d7b241e6Sjeremylt 104b11c1e72Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created 1057509a596Sjeremylt @param nelem Number of elements described by the restriction 106b11c1e72Sjeremylt @param elemsize Size (number of "nodes") per element 1078795c945Sjeremylt @param nnodes The number of nodes in the L-vector. The input CeedVector 1088795c945Sjeremylt to which the restriction will be applied is of size 1098795c945Sjeremylt @a nnodes * @a ncomp. This size may include data 110d7b241e6Sjeremylt used by other CeedElemRestriction objects describing 1118795c945Sjeremylt different types of elements. 112b11c1e72Sjeremylt @param ncomp Number of field components per interpolation node 11395bb1877Svaleriabarra (1 for scalar fields) 1147509a596Sjeremylt @param strides Array for strides between [nodes, components, elements]. 1157509a596Sjeremylt The data for node i, component j, element k in the 1167509a596Sjeremylt L-vector is given by 1177509a596Sjeremylt i*strides[0] + j*strides[1] + k*strides[2] 1184ce2993fSjeremylt @param rstr Address of the variable where the newly created 119b11c1e72Sjeremylt CeedElemRestriction will be stored 120d7b241e6Sjeremylt 121b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 122dfdf5a53Sjeremylt 123dfdf5a53Sjeremylt @ref Basic 124b11c1e72Sjeremylt **/ 1257509a596Sjeremylt int CeedElemRestrictionCreateStrided(Ceed ceed, CeedInt nelem, CeedInt elemsize, 126a8d32208Sjeremylt CeedInt nnodes, CeedInt ncomp, 1277509a596Sjeremylt CeedInt strides[3], 128f90c8643Sjeremylt CeedElemRestriction *rstr) { 129d7b241e6Sjeremylt int ierr; 130d7b241e6Sjeremylt 1315fe0d4faSjeremylt if (!ceed->ElemRestrictionCreate) { 1325fe0d4faSjeremylt Ceed delegate; 133aefd8378Sjeremylt ierr = CeedGetObjectDelegate(ceed, &delegate, "ElemRestriction"); 134aefd8378Sjeremylt CeedChk(ierr); 1355fe0d4faSjeremylt 1365fe0d4faSjeremylt if (!delegate) 137c042f62fSJeremy L Thompson // LCOV_EXCL_START 1381d102b48SJeremy L Thompson return CeedError(ceed, 1, "Backend does not support ElemRestrictionCreate"); 139c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 1405fe0d4faSjeremylt 1417509a596Sjeremylt ierr = CeedElemRestrictionCreateStrided(delegate, nelem, elemsize, nnodes, 1427509a596Sjeremylt ncomp, strides, rstr); CeedChk(ierr); 1435fe0d4faSjeremylt return 0; 1445fe0d4faSjeremylt } 1455fe0d4faSjeremylt 1464ce2993fSjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 1474ce2993fSjeremylt (*rstr)->ceed = ceed; 148d7b241e6Sjeremylt ceed->refcount++; 1494ce2993fSjeremylt (*rstr)->refcount = 1; 1504ce2993fSjeremylt (*rstr)->nelem = nelem; 1514ce2993fSjeremylt (*rstr)->elemsize = elemsize; 1528795c945Sjeremylt (*rstr)->nnodes = nnodes; 1534ce2993fSjeremylt (*rstr)->ncomp = ncomp; 1544ce2993fSjeremylt (*rstr)->nblk = nelem; 1554ce2993fSjeremylt (*rstr)->blksize = 1; 1567509a596Sjeremylt ierr = CeedMalloc(3, &(*rstr)->strides); CeedChk(ierr); 1577509a596Sjeremylt for (int i = 0; i<3; i++) 1587509a596Sjeremylt (*rstr)->strides[i] = strides[i]; 1591dfeef1dSjeremylt ierr = ceed->ElemRestrictionCreate(CEED_MEM_HOST, CEED_OWN_POINTER, NULL, 1601dfeef1dSjeremylt *rstr); 1614b8bea3bSJed Brown CeedChk(ierr); 162d7b241e6Sjeremylt return 0; 163d7b241e6Sjeremylt } 164d7b241e6Sjeremylt 165d7b241e6Sjeremylt /** 166b11c1e72Sjeremylt @brief Permute and pad indices for a blocked restriction 167d7b241e6Sjeremylt 1688795c945Sjeremylt @param indices Array of shape [@a nelem, @a elemsize]. Row i holds the 1698795c945Sjeremylt ordered list of the indices (into the input CeedVector) 1708795c945Sjeremylt for the unknowns corresponding to element i, where 17134138859Sjeremylt 0 <= i < @a nelem. All indices must be in the range 1728795c945Sjeremylt [0, @a nnodes). 173ecf6354eSJed Brown @param blkindices Array of permuted and padded indices of 174ecf6354eSJed Brown shape [@a nblk, @a elemsize, @a blksize]. 175d7b241e6Sjeremylt @param nblk Number of blocks 176d7b241e6Sjeremylt @param nelem Number of elements 177d7b241e6Sjeremylt @param blksize Number of elements in a block 178d7b241e6Sjeremylt @param elemsize Size of each element 179d7b241e6Sjeremylt 180b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 181b11c1e72Sjeremylt 182dfdf5a53Sjeremylt @ref Utility 183b11c1e72Sjeremylt **/ 184dfdf5a53Sjeremylt int CeedPermutePadIndices(const CeedInt *indices, CeedInt *blkindices, 185692c2638Sjeremylt CeedInt nblk, CeedInt nelem, CeedInt blksize, 186692c2638Sjeremylt CeedInt elemsize) { 187d7b241e6Sjeremylt for (CeedInt e = 0; e < nblk*blksize; e+=blksize) 188d7b241e6Sjeremylt for (int j = 0; j < blksize; j++) 189d7b241e6Sjeremylt for (int k = 0; k < elemsize; k++) 190d7b241e6Sjeremylt blkindices[e*elemsize + k*blksize + j] 191d7b241e6Sjeremylt = indices[CeedIntMin(e+j,nelem-1)*elemsize + k]; 192dfdf5a53Sjeremylt return 0; 193d7b241e6Sjeremylt } 194d7b241e6Sjeremylt 195d7b241e6Sjeremylt /** 196b11c1e72Sjeremylt @brief Create a blocked CeedElemRestriction, typically only called by backends 197d7b241e6Sjeremylt 198d7b241e6Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created. 19961dbc9d2Sjeremylt @param imode Ordering of the ncomp components, i.e. it specifies 200a8d32208Sjeremylt the ordering of the components of the L-vector used 20161dbc9d2Sjeremylt by this CeedElemRestriction. CEED_NONINTERLACED indicates 20261dbc9d2Sjeremylt the component is the outermost index and CEED_INTERLACED 203a8d32208Sjeremylt indicates the component is the innermost index in 204a8d32208Sjeremylt ordering of the L-vector. 205d7b241e6Sjeremylt @param nelem Number of elements described in the @a indices array. 206b11c1e72Sjeremylt @param elemsize Size (number of unknowns) per element 207b11c1e72Sjeremylt @param blksize Number of elements in a block 2088795c945Sjeremylt @param nnodes The number of nodes in the L-vector. The input CeedVector 2098795c945Sjeremylt to which the restriction will be applied is of size 2108795c945Sjeremylt @a nnodes * @a ncomp. This size may include data 211d7b241e6Sjeremylt used by other CeedElemRestriction objects describing 212d7b241e6Sjeremylt different types of elements. 21395bb1877Svaleriabarra @param ncomp Number of field components per interpolation node 21495bb1877Svaleriabarra (1 for scalar fields) 215b11c1e72Sjeremylt @param mtype Memory type of the @a indices array, see CeedMemType 216b11c1e72Sjeremylt @param cmode Copy mode for the @a indices array, see CeedCopyMode 2178795c945Sjeremylt @param indices Array of shape [@a nelem, @a elemsize]. Row i holds the 2188795c945Sjeremylt ordered list of the indices (into the input CeedVector) 2198795c945Sjeremylt for the unknowns corresponding to element i, where 22034138859Sjeremylt 0 <= i < @a nelem. All indices must be in the range 2218795c945Sjeremylt [0, @a nnodes). The backend will permute and pad this 2228795c945Sjeremylt array to the desired ordering for the blocksize, which is 2238795c945Sjeremylt typically given by the backend. The default reordering is 2248795c945Sjeremylt to interlace elements. 2254ce2993fSjeremylt @param rstr Address of the variable where the newly created 226b11c1e72Sjeremylt CeedElemRestriction will be stored 227d7b241e6Sjeremylt 228b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 229dfdf5a53Sjeremylt 230dfdf5a53Sjeremylt @ref Advanced 231b11c1e72Sjeremylt **/ 23261dbc9d2Sjeremylt int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInterlaceMode imode, 233a8d32208Sjeremylt CeedInt nelem, CeedInt elemsize, 2348795c945Sjeremylt CeedInt blksize, CeedInt nnodes, 2358795c945Sjeremylt CeedInt ncomp, CeedMemType mtype, 2368795c945Sjeremylt CeedCopyMode cmode, const CeedInt *indices, 2374ce2993fSjeremylt CeedElemRestriction *rstr) { 238d7b241e6Sjeremylt int ierr; 239d7b241e6Sjeremylt CeedInt *blkindices; 240d7b241e6Sjeremylt CeedInt nblk = (nelem / blksize) + !!(nelem % blksize); 241d7b241e6Sjeremylt 2425fe0d4faSjeremylt if (!ceed->ElemRestrictionCreateBlocked) { 2435fe0d4faSjeremylt Ceed delegate; 244aefd8378Sjeremylt ierr = CeedGetObjectDelegate(ceed, &delegate, "ElemRestriction"); 245aefd8378Sjeremylt CeedChk(ierr); 2465fe0d4faSjeremylt 2475fe0d4faSjeremylt if (!delegate) 248c042f62fSJeremy L Thompson // LCOV_EXCL_START 2491d102b48SJeremy L Thompson return CeedError(ceed, 1, "Backend does not support " 2501d102b48SJeremy L Thompson "ElemRestrictionCreateBlocked"); 251c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 2525fe0d4faSjeremylt 25361dbc9d2Sjeremylt ierr = CeedElemRestrictionCreateBlocked(delegate, imode, nelem, elemsize, 2548795c945Sjeremylt blksize, nnodes, ncomp, mtype, cmode, 2554ce2993fSjeremylt indices, rstr); CeedChk(ierr); 2565fe0d4faSjeremylt return 0; 2575fe0d4faSjeremylt } 258d7b241e6Sjeremylt 2594ce2993fSjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 260d7b241e6Sjeremylt 261de686571SJeremy L Thompson ierr = CeedCalloc(nblk*blksize*elemsize, &blkindices); CeedChk(ierr); 2624b8bea3bSJed Brown ierr = CeedPermutePadIndices(indices, blkindices, nblk, nelem, blksize, 2634b8bea3bSJed Brown elemsize); 264dfdf5a53Sjeremylt CeedChk(ierr); 265d7b241e6Sjeremylt 2664ce2993fSjeremylt (*rstr)->ceed = ceed; 267d7b241e6Sjeremylt ceed->refcount++; 2684ce2993fSjeremylt (*rstr)->refcount = 1; 26961dbc9d2Sjeremylt (*rstr)->imode = imode; 2704ce2993fSjeremylt (*rstr)->nelem = nelem; 2714ce2993fSjeremylt (*rstr)->elemsize = elemsize; 2728795c945Sjeremylt (*rstr)->nnodes = nnodes; 2734ce2993fSjeremylt (*rstr)->ncomp = ncomp; 2744ce2993fSjeremylt (*rstr)->nblk = nblk; 2754ce2993fSjeremylt (*rstr)->blksize = blksize; 276667bc5fcSjeremylt ierr = ceed->ElemRestrictionCreateBlocked(CEED_MEM_HOST, CEED_OWN_POINTER, 2777f823360Sjeremylt (const CeedInt *) blkindices, *rstr); CeedChk(ierr); 278d7b241e6Sjeremylt 2791d102b48SJeremy L Thompson if (cmode == CEED_OWN_POINTER) { 280d7b241e6Sjeremylt ierr = CeedFree(&indices); CeedChk(ierr); 2811d102b48SJeremy L Thompson } 282d7b241e6Sjeremylt 283d7b241e6Sjeremylt return 0; 284d7b241e6Sjeremylt } 285d7b241e6Sjeremylt 286b11c1e72Sjeremylt /** 2877509a596Sjeremylt @brief Create a blocked strided CeedElemRestriction 2887509a596Sjeremylt 2897509a596Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created 2907509a596Sjeremylt @param nelem Number of elements described by the restriction 2917509a596Sjeremylt @param elemsize Size (number of "nodes") per element 2927509a596Sjeremylt @param blksize Number of elements in a block 2937509a596Sjeremylt @param nnodes The number of nodes in the L-vector. The input CeedVector 2947509a596Sjeremylt to which the restriction will be applied is of size 2957509a596Sjeremylt @a nnodes * @a ncomp. This size may include data 2967509a596Sjeremylt used by other CeedElemRestriction objects describing 2977509a596Sjeremylt different types of elements. 2987509a596Sjeremylt @param ncomp Number of field components per interpolation node 2997509a596Sjeremylt (1 for scalar fields) 3007509a596Sjeremylt @param strides Array for strides between [nodes, components, elements]. 3017509a596Sjeremylt The data for node i, component j, element k in the 3027509a596Sjeremylt L-vector is given by 3037509a596Sjeremylt i*strides[0] + j*strides[1] + k*strides[2] 3047509a596Sjeremylt @param rstr Address of the variable where the newly created 3057509a596Sjeremylt CeedElemRestriction will be stored 3067509a596Sjeremylt 3077509a596Sjeremylt @return An error code: 0 - success, otherwise - failure 3087509a596Sjeremylt 3097509a596Sjeremylt @ref Basic 3107509a596Sjeremylt **/ 3117509a596Sjeremylt int CeedElemRestrictionCreateBlockedStrided(Ceed ceed, CeedInt nelem, 3127509a596Sjeremylt CeedInt elemsize, CeedInt blksize, 3137509a596Sjeremylt CeedInt nnodes, CeedInt ncomp, 3147509a596Sjeremylt CeedInt strides[3], 3157509a596Sjeremylt CeedElemRestriction *rstr) { 3167509a596Sjeremylt int ierr; 3177509a596Sjeremylt CeedInt nblk = (nelem / blksize) + !!(nelem % blksize); 3187509a596Sjeremylt 3197509a596Sjeremylt if (!ceed->ElemRestrictionCreateBlocked) { 3207509a596Sjeremylt Ceed delegate; 3217509a596Sjeremylt ierr = CeedGetObjectDelegate(ceed, &delegate, "ElemRestriction"); 3227509a596Sjeremylt CeedChk(ierr); 3237509a596Sjeremylt 3247509a596Sjeremylt if (!delegate) 3257509a596Sjeremylt // LCOV_EXCL_START 3267509a596Sjeremylt return CeedError(ceed, 1, "Backend does not support " 3277509a596Sjeremylt "ElemRestrictionCreateBlocked"); 3287509a596Sjeremylt // LCOV_EXCL_STOP 3297509a596Sjeremylt 3307509a596Sjeremylt ierr = CeedElemRestrictionCreateBlockedStrided(delegate, nelem, elemsize, 3317509a596Sjeremylt blksize, nnodes, ncomp, 3327509a596Sjeremylt strides, rstr); 3337509a596Sjeremylt CeedChk(ierr); 3347509a596Sjeremylt return 0; 3357509a596Sjeremylt } 3367509a596Sjeremylt 3377509a596Sjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 3387509a596Sjeremylt 3397509a596Sjeremylt (*rstr)->ceed = ceed; 3407509a596Sjeremylt ceed->refcount++; 3417509a596Sjeremylt (*rstr)->refcount = 1; 3427509a596Sjeremylt (*rstr)->nelem = nelem; 3437509a596Sjeremylt (*rstr)->elemsize = elemsize; 3447509a596Sjeremylt (*rstr)->nnodes = nnodes; 3457509a596Sjeremylt (*rstr)->ncomp = ncomp; 3467509a596Sjeremylt (*rstr)->nblk = nblk; 3477509a596Sjeremylt (*rstr)->blksize = blksize; 3487509a596Sjeremylt ierr = CeedMalloc(3, &(*rstr)->strides); CeedChk(ierr); 3497509a596Sjeremylt for (int i = 0; i<3; i++) 3507509a596Sjeremylt (*rstr)->strides[i] = strides[i]; 3517509a596Sjeremylt ierr = ceed->ElemRestrictionCreateBlocked(CEED_MEM_HOST, CEED_OWN_POINTER, 3527509a596Sjeremylt NULL, *rstr); CeedChk(ierr); 3537509a596Sjeremylt 3547509a596Sjeremylt return 0; 3557509a596Sjeremylt } 3567509a596Sjeremylt 3577509a596Sjeremylt /** 358b11c1e72Sjeremylt @brief Create CeedVectors associated with a CeedElemRestriction 359b11c1e72Sjeremylt 3604ce2993fSjeremylt @param rstr CeedElemRestriction 361b11c1e72Sjeremylt @param lvec The address of the L-vector to be created, or NULL 362b11c1e72Sjeremylt @param evec The address of the E-vector to be created, or NULL 363b11c1e72Sjeremylt 364b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 365dfdf5a53Sjeremylt 366dfdf5a53Sjeremylt @ref Advanced 367b11c1e72Sjeremylt **/ 3684ce2993fSjeremylt int CeedElemRestrictionCreateVector(CeedElemRestriction rstr, CeedVector *lvec, 369d7b241e6Sjeremylt CeedVector *evec) { 370d7b241e6Sjeremylt int ierr; 371d7b241e6Sjeremylt CeedInt n, m; 3728795c945Sjeremylt m = rstr->nnodes * rstr->ncomp; 3734ce2993fSjeremylt n = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp; 374d7b241e6Sjeremylt if (lvec) { 3754ce2993fSjeremylt ierr = CeedVectorCreate(rstr->ceed, m, lvec); CeedChk(ierr); 376d7b241e6Sjeremylt } 377d7b241e6Sjeremylt if (evec) { 3784ce2993fSjeremylt ierr = CeedVectorCreate(rstr->ceed, n, evec); CeedChk(ierr); 379d7b241e6Sjeremylt } 380d7b241e6Sjeremylt return 0; 381d7b241e6Sjeremylt } 382d7b241e6Sjeremylt 383d7b241e6Sjeremylt /** 384d9e1f99aSValeria Barra @brief Restrict an L-vector to an E-vector or apply its transpose 385d7b241e6Sjeremylt 3864ce2993fSjeremylt @param rstr CeedElemRestriction 387d7b241e6Sjeremylt @param tmode Apply restriction or transpose 3887aaeacdcSjeremylt @param u Input vector (of shape [@a nnodes, @a ncomp] when 38961dbc9d2Sjeremylt tmode=CEED_NOTRANSPOSE, imode=CEED_INTERLACED) 390a8d32208Sjeremylt @param ru Output vector (of shape [@a nelem * @a elemsize] when 3917aaeacdcSjeremylt tmode=CEED_NOTRANSPOSE). Ordering of the e-vector is decided 3927aaeacdcSjeremylt by the backend. 393d7b241e6Sjeremylt @param request Request or CEED_REQUEST_IMMEDIATE 394b11c1e72Sjeremylt 395b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 396dfdf5a53Sjeremylt 397dfdf5a53Sjeremylt @ref Advanced 398b11c1e72Sjeremylt **/ 3994ce2993fSjeremylt int CeedElemRestrictionApply(CeedElemRestriction rstr, CeedTransposeMode tmode, 400a8d32208Sjeremylt CeedVector u, CeedVector ru, 401a8d32208Sjeremylt CeedRequest *request) { 402d7b241e6Sjeremylt CeedInt m,n; 403d7b241e6Sjeremylt int ierr; 404d7b241e6Sjeremylt 405d7b241e6Sjeremylt if (tmode == CEED_NOTRANSPOSE) { 4064ce2993fSjeremylt m = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp; 4078795c945Sjeremylt n = rstr->nnodes * rstr->ncomp; 408d7b241e6Sjeremylt } else { 4098795c945Sjeremylt m = rstr->nnodes * rstr->ncomp; 4104ce2993fSjeremylt n = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp; 411d7b241e6Sjeremylt } 412d7b241e6Sjeremylt if (n != u->length) 413c042f62fSJeremy L Thompson // LCOV_EXCL_START 4141d102b48SJeremy L Thompson return CeedError(rstr->ceed, 2, "Input vector size %d not compatible with " 4151d102b48SJeremy L Thompson "element restriction (%d, %d)", u->length, m, n); 416c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 417a8d32208Sjeremylt if (m != ru->length) 418c042f62fSJeremy L Thompson // LCOV_EXCL_START 4191d102b48SJeremy L Thompson return CeedError(rstr->ceed, 2, "Output vector size %d not compatible with " 420a8d32208Sjeremylt "element restriction (%d, %d)", ru->length, m, n); 421c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 422074cb416Sjeremylt ierr = rstr->Apply(rstr, tmode, u, ru, request); CeedChk(ierr); 423d7b241e6Sjeremylt 424d7b241e6Sjeremylt return 0; 425d7b241e6Sjeremylt } 426d7b241e6Sjeremylt 427d7b241e6Sjeremylt /** 428d9e1f99aSValeria Barra @brief Restrict an L-vector to a block of an E-vector or apply its transpose 429be9261b7Sjeremylt 430be9261b7Sjeremylt @param rstr CeedElemRestriction 4311f37b403Sjeremylt @param block Block number to restrict to/from, i.e. block=0 will handle 4321f37b403Sjeremylt elements [0 : blksize] and block=3 will handle elements 4331f37b403Sjeremylt [3*blksize : 4*blksize] 434be9261b7Sjeremylt @param tmode Apply restriction or transpose 4357aaeacdcSjeremylt @param u Input vector (of shape [@a nnodes, @a ncomp] when 43661dbc9d2Sjeremylt tmode=CEED_NOTRANSPOSE, imode=CEED_INTERLACED) 437a8d32208Sjeremylt @param ru Output vector (of shape [@a blksize * @a elemsize] when 4387aaeacdcSjeremylt tmode=CEED_NOTRANSPOSE). Ordering of the e-vector is decided 4397aaeacdcSjeremylt by the backend. 440be9261b7Sjeremylt @param request Request or CEED_REQUEST_IMMEDIATE 441be9261b7Sjeremylt 442be9261b7Sjeremylt @return An error code: 0 - success, otherwise - failure 443be9261b7Sjeremylt 444be9261b7Sjeremylt @ref Advanced 445be9261b7Sjeremylt **/ 446be9261b7Sjeremylt int CeedElemRestrictionApplyBlock(CeedElemRestriction rstr, CeedInt block, 447a8d32208Sjeremylt CeedTransposeMode tmode, CeedVector u, 448a8d32208Sjeremylt CeedVector ru, CeedRequest *request) { 449be9261b7Sjeremylt CeedInt m,n; 450be9261b7Sjeremylt int ierr; 451be9261b7Sjeremylt 452be9261b7Sjeremylt if (tmode == CEED_NOTRANSPOSE) { 453be9261b7Sjeremylt m = rstr->blksize * rstr->elemsize * rstr->ncomp; 4548795c945Sjeremylt n = rstr->nnodes * rstr->ncomp; 455be9261b7Sjeremylt } else { 4568795c945Sjeremylt m = rstr->nnodes * rstr->ncomp; 457be9261b7Sjeremylt n = rstr->blksize * rstr->elemsize * rstr->ncomp; 458be9261b7Sjeremylt } 459be9261b7Sjeremylt if (n != u->length) 460c042f62fSJeremy L Thompson // LCOV_EXCL_START 4611d102b48SJeremy L Thompson return CeedError(rstr->ceed, 2, "Input vector size %d not compatible with " 4621d102b48SJeremy L Thompson "element restriction (%d, %d)", u->length, m, n); 463c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 464a8d32208Sjeremylt if (m != ru->length) 465c042f62fSJeremy L Thompson // LCOV_EXCL_START 4661d102b48SJeremy L Thompson return CeedError(rstr->ceed, 2, "Output vector size %d not compatible with " 467a8d32208Sjeremylt "element restriction (%d, %d)", ru->length, m, n); 468c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 469be9261b7Sjeremylt if (rstr->blksize*block > rstr->nelem) 470c042f62fSJeremy L Thompson // LCOV_EXCL_START 4711d102b48SJeremy L Thompson return CeedError(rstr->ceed, 2, "Cannot retrieve block %d, element %d > " 4721d102b48SJeremy L Thompson "total elements %d", block, rstr->blksize*block, 4731d102b48SJeremy L Thompson rstr->nelem); 474c042f62fSJeremy L Thompson // LCOV_EXCL_STOP 475074cb416Sjeremylt ierr = rstr->ApplyBlock(rstr, block, tmode, u, ru, request); 476be9261b7Sjeremylt CeedChk(ierr); 477be9261b7Sjeremylt 478be9261b7Sjeremylt return 0; 479be9261b7Sjeremylt } 480be9261b7Sjeremylt 481be9261b7Sjeremylt /** 482d9e1f99aSValeria Barra @brief Get the multiplicity of nodes in a CeedElemRestriction 4831469ee4dSjeremylt 4841469ee4dSjeremylt @param rstr CeedElemRestriction 485b9c05c73SJed Brown @param[out] mult Vector to store multiplicity (of size nnodes*ncomp) 4861469ee4dSjeremylt 4871469ee4dSjeremylt @return An error code: 0 - success, otherwise - failure 4881469ee4dSjeremylt 4891469ee4dSjeremylt @ref Advanced 4901469ee4dSjeremylt **/ 4911469ee4dSjeremylt int CeedElemRestrictionGetMultiplicity(CeedElemRestriction rstr, 4921469ee4dSjeremylt CeedVector mult) { 4931469ee4dSjeremylt int ierr; 4941469ee4dSjeremylt CeedVector evec; 4951469ee4dSjeremylt 4961469ee4dSjeremylt // Create and set evec 4971469ee4dSjeremylt ierr = CeedElemRestrictionCreateVector(rstr, NULL, &evec); CeedChk(ierr); 4981469ee4dSjeremylt ierr = CeedVectorSetValue(evec, 1.0); CeedChk(ierr); 499fa9eac48SJed Brown ierr = CeedVectorSetValue(mult, 0.0); CeedChk(ierr); 5001469ee4dSjeremylt 5011469ee4dSjeremylt // Apply to get multiplicity 502a8d32208Sjeremylt ierr = CeedElemRestrictionApply(rstr, CEED_TRANSPOSE, evec, mult, 503efc78312Sjeremylt CEED_REQUEST_IMMEDIATE); CeedChk(ierr); 5041469ee4dSjeremylt 5051469ee4dSjeremylt // Cleanup 5061469ee4dSjeremylt ierr = CeedVectorDestroy(&evec); CeedChk(ierr); 5071469ee4dSjeremylt 5081469ee4dSjeremylt return 0; 5091469ee4dSjeremylt } 5101469ee4dSjeremylt 5111469ee4dSjeremylt /** 5124ce2993fSjeremylt @brief Get the Ceed associated with a CeedElemRestriction 5134ce2993fSjeremylt 5144ce2993fSjeremylt @param rstr CeedElemRestriction 5154ce2993fSjeremylt @param[out] ceed Variable to store Ceed 5164ce2993fSjeremylt 5174ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 5184ce2993fSjeremylt 51923617272Sjeremylt @ref Advanced 5204ce2993fSjeremylt **/ 5214ce2993fSjeremylt int CeedElemRestrictionGetCeed(CeedElemRestriction rstr, Ceed *ceed) { 5224ce2993fSjeremylt *ceed = rstr->ceed; 5234ce2993fSjeremylt return 0; 5244ce2993fSjeremylt } 5254ce2993fSjeremylt 5264ce2993fSjeremylt /** 52761dbc9d2Sjeremylt @brief Get the L-vector interlaced mode of a CeedElemRestriction 528a8d32208Sjeremylt 529a8d32208Sjeremylt @param rstr CeedElemRestriction 53061dbc9d2Sjeremylt @param[out] imode Variable to store imode 531a8d32208Sjeremylt 532a8d32208Sjeremylt @return An error code: 0 - success, otherwise - failure 533a8d32208Sjeremylt 534a8d32208Sjeremylt @ref Advanced 535a8d32208Sjeremylt **/ 53661dbc9d2Sjeremylt int CeedElemRestrictionGetIMode(CeedElemRestriction rstr, 53761dbc9d2Sjeremylt CeedInterlaceMode *imode) { 5387509a596Sjeremylt if (rstr->strides) 5397509a596Sjeremylt // LCOV_EXCL_START 5407509a596Sjeremylt return CeedError(rstr->ceed, 1, "Strided ElemRestriction has no interlace " 5417509a596Sjeremylt "mode"); 5427509a596Sjeremylt // LCOV_EXCL_STOP 5437509a596Sjeremylt 54461dbc9d2Sjeremylt *imode = rstr->imode; 545a8d32208Sjeremylt return 0; 546a8d32208Sjeremylt } 547a8d32208Sjeremylt 548a8d32208Sjeremylt /** 549b11c1e72Sjeremylt @brief Get the total number of elements in the range of a CeedElemRestriction 550d7b241e6Sjeremylt 5514ce2993fSjeremylt @param rstr CeedElemRestriction 552288c0443SJeremy L Thompson @param[out] numelem Variable to store number of elements 553b11c1e72Sjeremylt 554b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 555dfdf5a53Sjeremylt 55623617272Sjeremylt @ref Advanced 557b11c1e72Sjeremylt **/ 5584ce2993fSjeremylt int CeedElemRestrictionGetNumElements(CeedElemRestriction rstr, 5594ce2993fSjeremylt CeedInt *numelem) { 5604ce2993fSjeremylt *numelem = rstr->nelem; 5614ce2993fSjeremylt return 0; 5624ce2993fSjeremylt } 5634ce2993fSjeremylt 5644ce2993fSjeremylt /** 5654ce2993fSjeremylt @brief Get the size of elements in the CeedElemRestriction 5664ce2993fSjeremylt 5674ce2993fSjeremylt @param rstr CeedElemRestriction 5684ce2993fSjeremylt @param[out] elemsize Variable to store size of elements 5694ce2993fSjeremylt 5704ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 5714ce2993fSjeremylt 57223617272Sjeremylt @ref Advanced 5734ce2993fSjeremylt **/ 5744ce2993fSjeremylt int CeedElemRestrictionGetElementSize(CeedElemRestriction rstr, 5754ce2993fSjeremylt CeedInt *elemsize) { 5764ce2993fSjeremylt *elemsize = rstr->elemsize; 5774ce2993fSjeremylt return 0; 5784ce2993fSjeremylt } 5794ce2993fSjeremylt 5804ce2993fSjeremylt /** 5814ce2993fSjeremylt @brief Get the number of degrees of freedom in the range of a 5824ce2993fSjeremylt CeedElemRestriction 5834ce2993fSjeremylt 5844ce2993fSjeremylt @param rstr CeedElemRestriction 5858795c945Sjeremylt @param[out] numnodes Variable to store number of nodes 5864ce2993fSjeremylt 5874ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 5884ce2993fSjeremylt 58923617272Sjeremylt @ref Advanced 5904ce2993fSjeremylt **/ 5918795c945Sjeremylt int CeedElemRestrictionGetNumNodes(CeedElemRestriction rstr, 5928795c945Sjeremylt CeedInt *numnodes) { 5938795c945Sjeremylt *numnodes = rstr->nnodes; 5944ce2993fSjeremylt return 0; 5954ce2993fSjeremylt } 5964ce2993fSjeremylt 5974ce2993fSjeremylt /** 5984ce2993fSjeremylt @brief Get the number of components in the elements of a 5994ce2993fSjeremylt CeedElemRestriction 6004ce2993fSjeremylt 6014ce2993fSjeremylt @param rstr CeedElemRestriction 6024ce2993fSjeremylt @param[out] numcomp Variable to store number of components 6034ce2993fSjeremylt 6044ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 6054ce2993fSjeremylt 60623617272Sjeremylt @ref Advanced 6074ce2993fSjeremylt **/ 6084ce2993fSjeremylt int CeedElemRestrictionGetNumComponents(CeedElemRestriction rstr, 6094ce2993fSjeremylt CeedInt *numcomp) { 6104ce2993fSjeremylt *numcomp = rstr->ncomp; 6114ce2993fSjeremylt return 0; 6124ce2993fSjeremylt } 6134ce2993fSjeremylt 6144ce2993fSjeremylt /** 6154ce2993fSjeremylt @brief Get the number of blocks in a CeedElemRestriction 6164ce2993fSjeremylt 6174ce2993fSjeremylt @param rstr CeedElemRestriction 6184ce2993fSjeremylt @param[out] numblock Variable to store number of blocks 6194ce2993fSjeremylt 6204ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 6214ce2993fSjeremylt 62223617272Sjeremylt @ref Advanced 6234ce2993fSjeremylt **/ 6244ce2993fSjeremylt int CeedElemRestrictionGetNumBlocks(CeedElemRestriction rstr, 6254ce2993fSjeremylt CeedInt *numblock) { 6264ce2993fSjeremylt *numblock = rstr->nblk; 6274ce2993fSjeremylt return 0; 6284ce2993fSjeremylt } 6294ce2993fSjeremylt 6304ce2993fSjeremylt /** 6314ce2993fSjeremylt @brief Get the size of blocks in the CeedElemRestriction 6324ce2993fSjeremylt 633288c0443SJeremy L Thompson @param rstr CeedElemRestriction 6344ce2993fSjeremylt @param[out] blksize Variable to store size of blocks 6354ce2993fSjeremylt 6364ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 6374ce2993fSjeremylt 63823617272Sjeremylt @ref Advanced 6394ce2993fSjeremylt **/ 6404ce2993fSjeremylt int CeedElemRestrictionGetBlockSize(CeedElemRestriction rstr, 6414ce2993fSjeremylt CeedInt *blksize) { 6424ce2993fSjeremylt *blksize = rstr->blksize; 6434ce2993fSjeremylt return 0; 6444ce2993fSjeremylt } 6454ce2993fSjeremylt 6464ce2993fSjeremylt /** 6477509a596Sjeremylt @brief Get the strides of a strided CeedElemRestriction 6487509a596Sjeremylt 6497509a596Sjeremylt @param rstr CeedElemRestriction 6507509a596Sjeremylt @param[out] strides Variable to store strides array 6517509a596Sjeremylt 6527509a596Sjeremylt @return An error code: 0 - success, otherwise - failure 6537509a596Sjeremylt 6547509a596Sjeremylt @ref Advanced 6557509a596Sjeremylt **/ 6567509a596Sjeremylt int CeedElemRestrictionGetStrides(CeedElemRestriction rstr, 6577509a596Sjeremylt CeedInt (*strides)[3]) { 6587509a596Sjeremylt if (!rstr->strides) 6597509a596Sjeremylt // LCOV_EXCL_START 6607509a596Sjeremylt return CeedError(rstr->ceed, 1, "ElemRestriction has no stride data"); 6617509a596Sjeremylt // LCOV_EXCL_STOP 6627509a596Sjeremylt 6637509a596Sjeremylt for (int i = 0; i<3; i++) 6647509a596Sjeremylt (*strides)[i] = rstr->strides[i]; 6657509a596Sjeremylt return 0; 6667509a596Sjeremylt } 6677509a596Sjeremylt 6687509a596Sjeremylt /** 669523b8ea0Sjeremylt @brief Get the backend stride status of a CeedElemRestriction 670523b8ea0Sjeremylt 671523b8ea0Sjeremylt @param rstr CeedElemRestriction 672523b8ea0Sjeremylt @param[out] bool Variable to store stride status 673523b8ea0Sjeremylt 674523b8ea0Sjeremylt @return An error code: 0 - success, otherwise - failure 675523b8ea0Sjeremylt 676523b8ea0Sjeremylt @ref Advanced 677523b8ea0Sjeremylt **/ 678523b8ea0Sjeremylt int CeedElemRestrictionGetBackendStridesStatus(CeedElemRestriction rstr, 679523b8ea0Sjeremylt bool *status) { 680523b8ea0Sjeremylt if (!rstr->strides) 681523b8ea0Sjeremylt // LCOV_EXCL_START 682523b8ea0Sjeremylt return CeedError(rstr->ceed, 1, "ElemRestriction has no stride data"); 683523b8ea0Sjeremylt // LCOV_EXCL_STOP 684523b8ea0Sjeremylt 685523b8ea0Sjeremylt *status = ((rstr->strides[0] == CEED_STRIDES_BACKEND[0]) && 686523b8ea0Sjeremylt (rstr->strides[1] == CEED_STRIDES_BACKEND[1]) && 687523b8ea0Sjeremylt (rstr->strides[2] == CEED_STRIDES_BACKEND[2])); 688523b8ea0Sjeremylt return 0; 689523b8ea0Sjeremylt } 690523b8ea0Sjeremylt 691523b8ea0Sjeremylt /** 6924ce2993fSjeremylt @brief Get the backend data of a CeedElemRestriction 6934ce2993fSjeremylt 694288c0443SJeremy L Thompson @param rstr CeedElemRestriction 6954ce2993fSjeremylt @param[out] data Variable to store data 6964ce2993fSjeremylt 6974ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 6984ce2993fSjeremylt 69923617272Sjeremylt @ref Advanced 7004ce2993fSjeremylt **/ 7011d102b48SJeremy L Thompson int CeedElemRestrictionGetData(CeedElemRestriction rstr, void **data) { 7024ce2993fSjeremylt *data = rstr->data; 703d7b241e6Sjeremylt return 0; 704d7b241e6Sjeremylt } 705d7b241e6Sjeremylt 706d7b241e6Sjeremylt /** 707fe2413ffSjeremylt @brief Set the backend data of a CeedElemRestriction 708fe2413ffSjeremylt 709288c0443SJeremy L Thompson @param[out] rstr CeedElemRestriction 710fe2413ffSjeremylt @param data Data to set 711fe2413ffSjeremylt 712fe2413ffSjeremylt @return An error code: 0 - success, otherwise - failure 713fe2413ffSjeremylt 714fe2413ffSjeremylt @ref Advanced 715fe2413ffSjeremylt **/ 7161d102b48SJeremy L Thompson int CeedElemRestrictionSetData(CeedElemRestriction rstr, void **data) { 717fe2413ffSjeremylt rstr->data = *data; 718fe2413ffSjeremylt return 0; 719fe2413ffSjeremylt } 720fe2413ffSjeremylt 721fe2413ffSjeremylt /** 722f02ca4a2SJed Brown @brief View a CeedElemRestriction 723f02ca4a2SJed Brown 724f02ca4a2SJed Brown @param[in] rstr CeedElemRestriction to view 725f02ca4a2SJed Brown @param[in] stream Stream to write; typically stdout/stderr or a file 726f02ca4a2SJed Brown 727f02ca4a2SJed Brown @return Error code: 0 - success, otherwise - failure 728f02ca4a2SJed Brown 729f02ca4a2SJed Brown @ref Utility 730f02ca4a2SJed Brown **/ 731f02ca4a2SJed Brown int CeedElemRestrictionView(CeedElemRestriction rstr, FILE *stream) { 7327509a596Sjeremylt char stridesstr[500]; 7337509a596Sjeremylt if (rstr->strides) 7347509a596Sjeremylt sprintf(stridesstr, "[%d, %d, %d]", rstr->strides[0], rstr->strides[1], 7357509a596Sjeremylt rstr->strides[2]); 7367509a596Sjeremylt 7370036de2cSjeremylt fprintf(stream, "%sCeedElemRestriction from (%d, %d) to %d elements with %d " 7380036de2cSjeremylt "nodes each and %s %s\n", rstr->blksize > 1 ? "Blocked " : "", 7390036de2cSjeremylt rstr->nnodes, rstr->ncomp, rstr->nelem, rstr->elemsize, 7400036de2cSjeremylt rstr->strides ? "strides" : "L-vector components", 7417509a596Sjeremylt rstr->strides ? stridesstr : CeedInterlaceModes[rstr->imode]); 742f02ca4a2SJed Brown return 0; 743f02ca4a2SJed Brown } 744f02ca4a2SJed Brown 745f02ca4a2SJed Brown /** 746b11c1e72Sjeremylt @brief Destroy a CeedElemRestriction 747b11c1e72Sjeremylt 7484ce2993fSjeremylt @param rstr CeedElemRestriction to destroy 749b11c1e72Sjeremylt 750b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 751dfdf5a53Sjeremylt 752dfdf5a53Sjeremylt @ref Basic 753b11c1e72Sjeremylt **/ 7544ce2993fSjeremylt int CeedElemRestrictionDestroy(CeedElemRestriction *rstr) { 755d7b241e6Sjeremylt int ierr; 756d7b241e6Sjeremylt 7571d102b48SJeremy L Thompson if (!*rstr || --(*rstr)->refcount > 0) 7581d102b48SJeremy L Thompson return 0; 7594ce2993fSjeremylt if ((*rstr)->Destroy) { 7604ce2993fSjeremylt ierr = (*rstr)->Destroy(*rstr); CeedChk(ierr); 761d7b241e6Sjeremylt } 7627509a596Sjeremylt ierr = CeedFree(&(*rstr)->strides); CeedChk(ierr); 7634ce2993fSjeremylt ierr = CeedDestroy(&(*rstr)->ceed); CeedChk(ierr); 7644ce2993fSjeremylt ierr = CeedFree(rstr); CeedChk(ierr); 765d7b241e6Sjeremylt return 0; 766d7b241e6Sjeremylt } 767d7b241e6Sjeremylt 768523b8ea0Sjeremylt /// @cond DOXYGEN_SKIP 769523b8ea0Sjeremylt // Indicate that the stride is determined by the backend 770523b8ea0Sjeremylt CeedInt CEED_STRIDES_BACKEND[3] = {}; 771*15910d16Sjeremylt 772*15910d16Sjeremylt // Indicate that no ElemRestriction is provided by the user 773*15910d16Sjeremylt CeedElemRestriction CEED_ELEMRESTRICTION_NONE = &ceed_elemrestriction_none; 774523b8ea0Sjeremylt /// @endcond 775523b8ea0Sjeremylt 776d7b241e6Sjeremylt /// @} 777