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> 18d7b241e6Sjeremylt 19d7b241e6Sjeremylt /// @file 20d7b241e6Sjeremylt /// Implementation of public CeedElemRestriction interfaces 21d7b241e6Sjeremylt /// 22dfdf5a53Sjeremylt /// @addtogroup CeedElemRestriction 23d7b241e6Sjeremylt /// @{ 24d7b241e6Sjeremylt 25d7b241e6Sjeremylt /** 26b11c1e72Sjeremylt @brief Create a CeedElemRestriction 27d7b241e6Sjeremylt 28b11c1e72Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created 29b11c1e72Sjeremylt @param nelem Number of elements described in the @a indices array 30b11c1e72Sjeremylt @param elemsize Size (number of "nodes") per element 31d7b241e6Sjeremylt @param ndof The total size of the input CeedVector to which the 32d7b241e6Sjeremylt restriction will be applied. This size may include data 33d7b241e6Sjeremylt used by other CeedElemRestriction objects describing 34d7b241e6Sjeremylt different types of elements. 35b11c1e72Sjeremylt @param ncomp Number of field components per interpolation node 36b11c1e72Sjeremylt @param mtype Memory type of the @a indices array, see CeedMemType 37b11c1e72Sjeremylt @param cmode Copy mode for the @a indices array, see CeedCopyMode 38ecf6354eSJed Brown @param indices Array of shape [@a nelem, @a elemsize]. Row i holds the ordered list 39d7b241e6Sjeremylt of the indices (into the input CeedVector) for the unknowns 40d7b241e6Sjeremylt corresponding to element i, where 0 <= i < @a nelements. 41d7b241e6Sjeremylt All indices must be in the range [0, @a ndof). 42*4ce2993fSjeremylt @param[out] rstr Address of the variable where the newly created 43b11c1e72Sjeremylt CeedElemRestriction will be stored 44d7b241e6Sjeremylt 45b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 46dfdf5a53Sjeremylt 47dfdf5a53Sjeremylt @ref Basic 48b11c1e72Sjeremylt **/ 49d7b241e6Sjeremylt int CeedElemRestrictionCreate(Ceed ceed, CeedInt nelem, CeedInt elemsize, 50d7b241e6Sjeremylt CeedInt ndof, CeedInt ncomp, CeedMemType mtype, 51d7b241e6Sjeremylt CeedCopyMode cmode, const CeedInt *indices, 52*4ce2993fSjeremylt CeedElemRestriction *rstr) { 53d7b241e6Sjeremylt int ierr; 54d7b241e6Sjeremylt 555fe0d4faSjeremylt if (!ceed->ElemRestrictionCreate) { 565fe0d4faSjeremylt Ceed delegate; 575fe0d4faSjeremylt ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr); 585fe0d4faSjeremylt 595fe0d4faSjeremylt if (!delegate) 60d7b241e6Sjeremylt return CeedError(ceed, 1, "Backend does not support ElemRestrictionCreate"); 615fe0d4faSjeremylt 625fe0d4faSjeremylt ierr = CeedElemRestrictionCreate(delegate, nelem, elemsize, 635fe0d4faSjeremylt ndof, ncomp, mtype, cmode, 64*4ce2993fSjeremylt indices, rstr); CeedChk(ierr); 655fe0d4faSjeremylt return 0; 665fe0d4faSjeremylt } 675fe0d4faSjeremylt 68*4ce2993fSjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 69*4ce2993fSjeremylt (*rstr)->ceed = ceed; 70d7b241e6Sjeremylt ceed->refcount++; 71*4ce2993fSjeremylt (*rstr)->refcount = 1; 72*4ce2993fSjeremylt (*rstr)->nelem = nelem; 73*4ce2993fSjeremylt (*rstr)->elemsize = elemsize; 74*4ce2993fSjeremylt (*rstr)->ndof = ndof; 75*4ce2993fSjeremylt (*rstr)->ncomp = ncomp; 76*4ce2993fSjeremylt (*rstr)->nblk = nelem; 77*4ce2993fSjeremylt (*rstr)->blksize = 1; 78*4ce2993fSjeremylt ierr = ceed->ElemRestrictionCreate(mtype, cmode, indices, *rstr); CeedChk(ierr); 79d7b241e6Sjeremylt return 0; 80d7b241e6Sjeremylt } 81d7b241e6Sjeremylt 82d7b241e6Sjeremylt /** 83b11c1e72Sjeremylt @brief Create an identity CeedElemRestriction 84d7b241e6Sjeremylt 85b11c1e72Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created 86b11c1e72Sjeremylt @param nelem Number of elements described in the @a indices array 87b11c1e72Sjeremylt @param elemsize Size (number of "nodes") per element 88d7b241e6Sjeremylt @param ndof The total size of the input CeedVector to which the 89d7b241e6Sjeremylt restriction will be applied. This size may include data 90d7b241e6Sjeremylt used by other CeedElemRestriction objects describing 91b11c1e72Sjeremylt different types of elements 92b11c1e72Sjeremylt @param ncomp Number of field components per interpolation node 93*4ce2993fSjeremylt @param rstr Address of the variable where the newly created 94b11c1e72Sjeremylt CeedElemRestriction will be stored 95d7b241e6Sjeremylt 96b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 97dfdf5a53Sjeremylt 98dfdf5a53Sjeremylt @ref Basic 99b11c1e72Sjeremylt **/ 1004b8bea3bSJed Brown int CeedElemRestrictionCreateIdentity(Ceed ceed, CeedInt nelem, 1014b8bea3bSJed Brown CeedInt elemsize, 102*4ce2993fSjeremylt CeedInt ndof, CeedInt ncomp, CeedElemRestriction *rstr) { 103d7b241e6Sjeremylt int ierr; 104d7b241e6Sjeremylt 1055fe0d4faSjeremylt if (!ceed->ElemRestrictionCreate) { 1065fe0d4faSjeremylt Ceed delegate; 1075fe0d4faSjeremylt ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr); 1085fe0d4faSjeremylt 1095fe0d4faSjeremylt if (!delegate) 1104b8bea3bSJed Brown return CeedError(ceed, 1, 1115fe0d4faSjeremylt "Backend does not support ElemRestrictionCreate"); 1125fe0d4faSjeremylt 1135fe0d4faSjeremylt ierr = CeedElemRestrictionCreateIdentity(delegate, nelem, elemsize, 114*4ce2993fSjeremylt ndof, ncomp, rstr); CeedChk(ierr); 1155fe0d4faSjeremylt return 0; 1165fe0d4faSjeremylt } 1175fe0d4faSjeremylt 118*4ce2993fSjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 119*4ce2993fSjeremylt (*rstr)->ceed = ceed; 120d7b241e6Sjeremylt ceed->refcount++; 121*4ce2993fSjeremylt (*rstr)->refcount = 1; 122*4ce2993fSjeremylt (*rstr)->nelem = nelem; 123*4ce2993fSjeremylt (*rstr)->elemsize = elemsize; 124*4ce2993fSjeremylt (*rstr)->ndof = ndof; 125*4ce2993fSjeremylt (*rstr)->ncomp = ncomp; 126*4ce2993fSjeremylt (*rstr)->nblk = nelem; 127*4ce2993fSjeremylt (*rstr)->blksize = 1; 128*4ce2993fSjeremylt ierr = ceed->ElemRestrictionCreate(CEED_MEM_HOST, CEED_OWN_POINTER, NULL, *rstr); 1294b8bea3bSJed Brown CeedChk(ierr); 130d7b241e6Sjeremylt return 0; 131d7b241e6Sjeremylt } 132d7b241e6Sjeremylt 133d7b241e6Sjeremylt /** 134b11c1e72Sjeremylt @brief Permute and pad indices for a blocked restriction 135d7b241e6Sjeremylt 136ecf6354eSJed Brown @param indices Array of shape [@a nelem, @a elemsize]. Row i holds the ordered list 137d7b241e6Sjeremylt of the indices (into the input CeedVector) for the unknowns 138d7b241e6Sjeremylt corresponding to element i, where 0 <= i < @a nelements. 139d7b241e6Sjeremylt All indices must be in the range [0, @a ndof). 140ecf6354eSJed Brown @param blkindices Array of permuted and padded indices of 141ecf6354eSJed Brown shape [@a nblk, @a elemsize, @a blksize]. 142d7b241e6Sjeremylt @param nblk Number of blocks 143d7b241e6Sjeremylt @param nelem Number of elements 144d7b241e6Sjeremylt @param blksize Number of elements in a block 145d7b241e6Sjeremylt @param elemsize Size of each element 146d7b241e6Sjeremylt 147b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 148b11c1e72Sjeremylt 149dfdf5a53Sjeremylt @ref Utility 150b11c1e72Sjeremylt **/ 151dfdf5a53Sjeremylt int CeedPermutePadIndices(const CeedInt *indices, CeedInt *blkindices, 152d7b241e6Sjeremylt CeedInt nblk, CeedInt nelem, 153d7b241e6Sjeremylt CeedInt blksize, CeedInt elemsize) { 154d7b241e6Sjeremylt for (CeedInt e = 0; e < nblk*blksize; e+=blksize) 155d7b241e6Sjeremylt for (int j = 0; j < blksize; j++) 156d7b241e6Sjeremylt for (int k = 0; k < elemsize; k++) 157d7b241e6Sjeremylt blkindices[e*elemsize + k*blksize + j] 158d7b241e6Sjeremylt = indices[CeedIntMin(e+j,nelem-1)*elemsize + k]; 159dfdf5a53Sjeremylt return 0; 160d7b241e6Sjeremylt } 161d7b241e6Sjeremylt 162d7b241e6Sjeremylt /** 163b11c1e72Sjeremylt @brief Create a blocked CeedElemRestriction, typically only called by backends 164d7b241e6Sjeremylt 165d7b241e6Sjeremylt @param ceed A Ceed object where the CeedElemRestriction will be created. 166d7b241e6Sjeremylt @param nelem Number of elements described in the @a indices array. 167b11c1e72Sjeremylt @param elemsize Size (number of unknowns) per element 168b11c1e72Sjeremylt @param blksize Number of elements in a block 169d7b241e6Sjeremylt @param ndof The total size of the input CeedVector to which the 170d7b241e6Sjeremylt restriction will be applied. This size may include data 171d7b241e6Sjeremylt used by other CeedElemRestriction objects describing 172d7b241e6Sjeremylt different types of elements. 173b11c1e72Sjeremylt @param ncomp Number of components stored at each node 174b11c1e72Sjeremylt @param mtype Memory type of the @a indices array, see CeedMemType 175b11c1e72Sjeremylt @param cmode Copy mode for the @a indices array, see CeedCopyMode 176ecf6354eSJed Brown @param indices Array of shape [@a nelem, @a elemsize]. Row i holds the ordered list 177d7b241e6Sjeremylt of the indices (into the input CeedVector) for the unknowns 178d7b241e6Sjeremylt corresponding to element i, where 0 <= i < @a nelements. 179d7b241e6Sjeremylt All indices must be in the range [0, @a ndof). The 180d7b241e6Sjeremylt backend will permute and pad this array to the desired 181d7b241e6Sjeremylt ordering for the blocksize, which is typically given by the 182d7b241e6Sjeremylt backend. The default reordering is to interlace elements. 183*4ce2993fSjeremylt @param rstr Address of the variable where the newly created 184b11c1e72Sjeremylt CeedElemRestriction will be stored 185d7b241e6Sjeremylt 186b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 187dfdf5a53Sjeremylt 188dfdf5a53Sjeremylt @ref Advanced 189b11c1e72Sjeremylt **/ 190d7b241e6Sjeremylt int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInt nelem, CeedInt elemsize, 191d7b241e6Sjeremylt CeedInt blksize, CeedInt ndof, CeedInt ncomp, 192d7b241e6Sjeremylt CeedMemType mtype, CeedCopyMode cmode, 193*4ce2993fSjeremylt const CeedInt *indices, 194*4ce2993fSjeremylt CeedElemRestriction *rstr) { 195d7b241e6Sjeremylt int ierr; 196d7b241e6Sjeremylt CeedInt *blkindices; 197d7b241e6Sjeremylt CeedInt nblk = (nelem / blksize) + !!(nelem % blksize); 198d7b241e6Sjeremylt 1995fe0d4faSjeremylt if (!ceed->ElemRestrictionCreateBlocked) { 2005fe0d4faSjeremylt Ceed delegate; 2015fe0d4faSjeremylt ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr); 2025fe0d4faSjeremylt 2035fe0d4faSjeremylt if (!delegate) 204d7b241e6Sjeremylt return CeedError(ceed, 1, 205d7b241e6Sjeremylt "Backend does not support ElemRestrictionCreateBlocked"); 2065fe0d4faSjeremylt 2075fe0d4faSjeremylt ierr = CeedElemRestrictionCreateBlocked(delegate, nelem, elemsize, 2085fe0d4faSjeremylt blksize, ndof, ncomp, mtype, cmode, 209*4ce2993fSjeremylt indices, rstr); CeedChk(ierr); 2105fe0d4faSjeremylt return 0; 2115fe0d4faSjeremylt } 212d7b241e6Sjeremylt 213*4ce2993fSjeremylt ierr = CeedCalloc(1, rstr); CeedChk(ierr); 214d7b241e6Sjeremylt 215d7b241e6Sjeremylt if (indices) { 216d7b241e6Sjeremylt ierr = CeedCalloc(nblk*blksize*elemsize, &blkindices); 2174b8bea3bSJed Brown ierr = CeedPermutePadIndices(indices, blkindices, nblk, nelem, blksize, 2184b8bea3bSJed Brown elemsize); 219dfdf5a53Sjeremylt CeedChk(ierr); 220d7b241e6Sjeremylt } else { 221d7b241e6Sjeremylt blkindices = NULL; 222d7b241e6Sjeremylt } 223d7b241e6Sjeremylt 224*4ce2993fSjeremylt (*rstr)->ceed = ceed; 225d7b241e6Sjeremylt ceed->refcount++; 226*4ce2993fSjeremylt (*rstr)->refcount = 1; 227*4ce2993fSjeremylt (*rstr)->nelem = nelem; 228*4ce2993fSjeremylt (*rstr)->elemsize = elemsize; 229*4ce2993fSjeremylt (*rstr)->ndof = ndof; 230*4ce2993fSjeremylt (*rstr)->ncomp = ncomp; 231*4ce2993fSjeremylt (*rstr)->nblk = nblk; 232*4ce2993fSjeremylt (*rstr)->blksize = blksize; 233667bc5fcSjeremylt ierr = ceed->ElemRestrictionCreateBlocked(CEED_MEM_HOST, CEED_OWN_POINTER, 234*4ce2993fSjeremylt (const CeedInt *) blkindices, *rstr); 235d7b241e6Sjeremylt CeedChk(ierr); 236d7b241e6Sjeremylt 237d7b241e6Sjeremylt if (cmode == CEED_OWN_POINTER) 238d7b241e6Sjeremylt ierr = CeedFree(&indices); CeedChk(ierr); 239d7b241e6Sjeremylt 240d7b241e6Sjeremylt return 0; 241d7b241e6Sjeremylt } 242d7b241e6Sjeremylt 243b11c1e72Sjeremylt /** 244b11c1e72Sjeremylt @brief Create CeedVectors associated with a CeedElemRestriction 245b11c1e72Sjeremylt 246*4ce2993fSjeremylt @param rstr CeedElemRestriction 247b11c1e72Sjeremylt @param lvec The address of the L-vector to be created, or NULL 248b11c1e72Sjeremylt @param evec The address of the E-vector to be created, or NULL 249b11c1e72Sjeremylt 250b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 251dfdf5a53Sjeremylt 252dfdf5a53Sjeremylt @ref Advanced 253b11c1e72Sjeremylt **/ 254*4ce2993fSjeremylt int CeedElemRestrictionCreateVector(CeedElemRestriction rstr, CeedVector *lvec, 255d7b241e6Sjeremylt CeedVector *evec) { 256d7b241e6Sjeremylt int ierr; 257d7b241e6Sjeremylt CeedInt n, m; 258*4ce2993fSjeremylt m = rstr->ndof * rstr->ncomp; 259*4ce2993fSjeremylt n = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp; 260d7b241e6Sjeremylt if (lvec) { 261*4ce2993fSjeremylt ierr = CeedVectorCreate(rstr->ceed, m, lvec); CeedChk(ierr); 262d7b241e6Sjeremylt } 263d7b241e6Sjeremylt if (evec) { 264*4ce2993fSjeremylt ierr = CeedVectorCreate(rstr->ceed, n, evec); CeedChk(ierr); 265d7b241e6Sjeremylt } 266d7b241e6Sjeremylt return 0; 267d7b241e6Sjeremylt } 268d7b241e6Sjeremylt 269d7b241e6Sjeremylt /** 270b11c1e72Sjeremylt @brief Restrict an L-vector to an E-vector or apply transpose 271d7b241e6Sjeremylt 272*4ce2993fSjeremylt @param rstr CeedElemRestriction 273d7b241e6Sjeremylt @param tmode Apply restriction or transpose 274d7b241e6Sjeremylt @param lmode Ordering of the ncomp components 275d7b241e6Sjeremylt @param u Input vector (of size @a ndof when tmode=CEED_NOTRANSPOSE) 276d7b241e6Sjeremylt @param v Output vector (of size @a nelem * @a elemsize when tmode=CEED_NOTRANSPOSE) 277d7b241e6Sjeremylt @param request Request or CEED_REQUEST_IMMEDIATE 278b11c1e72Sjeremylt 279b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 280dfdf5a53Sjeremylt 281dfdf5a53Sjeremylt @ref Advanced 282b11c1e72Sjeremylt **/ 283*4ce2993fSjeremylt int CeedElemRestrictionApply(CeedElemRestriction rstr, CeedTransposeMode tmode, 284d7b241e6Sjeremylt CeedTransposeMode lmode, 285d7b241e6Sjeremylt CeedVector u, CeedVector v, CeedRequest *request) { 286d7b241e6Sjeremylt CeedInt m,n; 287d7b241e6Sjeremylt int ierr; 288d7b241e6Sjeremylt 289d7b241e6Sjeremylt if (tmode == CEED_NOTRANSPOSE) { 290*4ce2993fSjeremylt m = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp; 291*4ce2993fSjeremylt n = rstr->ndof * rstr->ncomp; 292d7b241e6Sjeremylt } else { 293*4ce2993fSjeremylt m = rstr->ndof * rstr->ncomp; 294*4ce2993fSjeremylt n = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp; 295d7b241e6Sjeremylt } 296d7b241e6Sjeremylt if (n != u->length) 297*4ce2993fSjeremylt return CeedError(rstr->ceed, 2, 298d7b241e6Sjeremylt "Input vector size %d not compatible with element restriction (%d, %d)", 299d7b241e6Sjeremylt u->length, m, n); 300d7b241e6Sjeremylt if (m != v->length) 301*4ce2993fSjeremylt return CeedError(rstr->ceed, 2, 302d7b241e6Sjeremylt "Output vector size %d not compatible with element restriction (%d, %d)", 303d7b241e6Sjeremylt v->length, m, n); 304*4ce2993fSjeremylt ierr = rstr->Apply(rstr, tmode, lmode, u, v, request); CeedChk(ierr); 305d7b241e6Sjeremylt 306d7b241e6Sjeremylt return 0; 307d7b241e6Sjeremylt } 308d7b241e6Sjeremylt 309d7b241e6Sjeremylt /** 310*4ce2993fSjeremylt @brief Get the Ceed associated with a CeedElemRestriction 311*4ce2993fSjeremylt 312*4ce2993fSjeremylt @param rstr CeedElemRestriction 313*4ce2993fSjeremylt @param[out] ceed Variable to store Ceed 314*4ce2993fSjeremylt 315*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 316*4ce2993fSjeremylt 317*4ce2993fSjeremylt @ref Utility 318*4ce2993fSjeremylt **/ 319*4ce2993fSjeremylt int CeedElemRestrictionGetCeed(CeedElemRestriction rstr, Ceed *ceed) { 320*4ce2993fSjeremylt *ceed = rstr->ceed; 321*4ce2993fSjeremylt return 0; 322*4ce2993fSjeremylt } 323*4ce2993fSjeremylt 324*4ce2993fSjeremylt /** 325b11c1e72Sjeremylt @brief Get the total number of elements in the range of a CeedElemRestriction 326d7b241e6Sjeremylt 327*4ce2993fSjeremylt @param rstr CeedElemRestriction 328*4ce2993fSjeremylt @param[out] numelements Variable to store number of elements 329b11c1e72Sjeremylt 330b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 331dfdf5a53Sjeremylt 332dfdf5a53Sjeremylt @ref Utility 333b11c1e72Sjeremylt **/ 334*4ce2993fSjeremylt int CeedElemRestrictionGetNumElements(CeedElemRestriction rstr, 335*4ce2993fSjeremylt CeedInt *numelem) { 336*4ce2993fSjeremylt *numelem = rstr->nelem; 337*4ce2993fSjeremylt return 0; 338*4ce2993fSjeremylt } 339*4ce2993fSjeremylt 340*4ce2993fSjeremylt /** 341*4ce2993fSjeremylt @brief Get the size of elements in the CeedElemRestriction 342*4ce2993fSjeremylt 343*4ce2993fSjeremylt @param rstr CeedElemRestriction 344*4ce2993fSjeremylt @param[out] elemsize Variable to store size of elements 345*4ce2993fSjeremylt 346*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 347*4ce2993fSjeremylt 348*4ce2993fSjeremylt @ref Utility 349*4ce2993fSjeremylt **/ 350*4ce2993fSjeremylt int CeedElemRestrictionGetElementSize(CeedElemRestriction rstr, 351*4ce2993fSjeremylt CeedInt *elemsize) { 352*4ce2993fSjeremylt *elemsize = rstr->elemsize; 353*4ce2993fSjeremylt return 0; 354*4ce2993fSjeremylt } 355*4ce2993fSjeremylt 356*4ce2993fSjeremylt /** 357*4ce2993fSjeremylt @brief Get the number of degrees of freedom in the range of a 358*4ce2993fSjeremylt CeedElemRestriction 359*4ce2993fSjeremylt 360*4ce2993fSjeremylt @param rstr CeedElemRestriction 361*4ce2993fSjeremylt @param[out] numdof Variable to store number of DoFs 362*4ce2993fSjeremylt 363*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 364*4ce2993fSjeremylt 365*4ce2993fSjeremylt @ref Utility 366*4ce2993fSjeremylt **/ 367*4ce2993fSjeremylt int CeedElemRestrictionGetNumDoF(CeedElemRestriction rstr, 368*4ce2993fSjeremylt CeedInt *numdof) { 369*4ce2993fSjeremylt *numdof = rstr->ndof; 370*4ce2993fSjeremylt return 0; 371*4ce2993fSjeremylt } 372*4ce2993fSjeremylt 373*4ce2993fSjeremylt /** 374*4ce2993fSjeremylt @brief Get the number of components in the elements of a 375*4ce2993fSjeremylt CeedElemRestriction 376*4ce2993fSjeremylt 377*4ce2993fSjeremylt @param rstr CeedElemRestriction 378*4ce2993fSjeremylt @param[out] numcomp Variable to store number of components 379*4ce2993fSjeremylt 380*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 381*4ce2993fSjeremylt 382*4ce2993fSjeremylt @ref Utility 383*4ce2993fSjeremylt **/ 384*4ce2993fSjeremylt int CeedElemRestrictionGetNumComponents(CeedElemRestriction rstr, 385*4ce2993fSjeremylt CeedInt *numcomp) { 386*4ce2993fSjeremylt *numcomp = rstr->ncomp; 387*4ce2993fSjeremylt return 0; 388*4ce2993fSjeremylt } 389*4ce2993fSjeremylt 390*4ce2993fSjeremylt /** 391*4ce2993fSjeremylt @brief Get the number of blocks in a CeedElemRestriction 392*4ce2993fSjeremylt 393*4ce2993fSjeremylt @param rstr CeedElemRestriction 394*4ce2993fSjeremylt @param[out] numblock Variable to store number of blocks 395*4ce2993fSjeremylt 396*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 397*4ce2993fSjeremylt 398*4ce2993fSjeremylt @ref Utility 399*4ce2993fSjeremylt **/ 400*4ce2993fSjeremylt int CeedElemRestrictionGetNumBlocks(CeedElemRestriction rstr, 401*4ce2993fSjeremylt CeedInt *numblock) { 402*4ce2993fSjeremylt *numblock = rstr->nblk; 403*4ce2993fSjeremylt return 0; 404*4ce2993fSjeremylt } 405*4ce2993fSjeremylt 406*4ce2993fSjeremylt /** 407*4ce2993fSjeremylt @brief Get the size of blocks in the CeedElemRestriction 408*4ce2993fSjeremylt 409*4ce2993fSjeremylt @param r CeedElemRestriction 410*4ce2993fSjeremylt @param[out] blksize Variable to store size of blocks 411*4ce2993fSjeremylt 412*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 413*4ce2993fSjeremylt 414*4ce2993fSjeremylt @ref Utility 415*4ce2993fSjeremylt **/ 416*4ce2993fSjeremylt int CeedElemRestrictionGetBlockSize(CeedElemRestriction rstr, 417*4ce2993fSjeremylt CeedInt *blksize) { 418*4ce2993fSjeremylt *blksize = rstr->blksize; 419*4ce2993fSjeremylt return 0; 420*4ce2993fSjeremylt } 421*4ce2993fSjeremylt 422*4ce2993fSjeremylt /** 423*4ce2993fSjeremylt @brief Get the backend data of a CeedElemRestriction 424*4ce2993fSjeremylt 425*4ce2993fSjeremylt @param r CeedElemRestriction 426*4ce2993fSjeremylt @param[out] data Variable to store data 427*4ce2993fSjeremylt 428*4ce2993fSjeremylt @return An error code: 0 - success, otherwise - failure 429*4ce2993fSjeremylt 430*4ce2993fSjeremylt @ref Utility 431*4ce2993fSjeremylt **/ 432*4ce2993fSjeremylt int CeedElemRestrictionGetData(CeedElemRestriction rstr, 433*4ce2993fSjeremylt void* *data) { 434*4ce2993fSjeremylt *data = rstr->data; 435d7b241e6Sjeremylt return 0; 436d7b241e6Sjeremylt } 437d7b241e6Sjeremylt 438d7b241e6Sjeremylt /** 439b11c1e72Sjeremylt @brief Destroy a CeedElemRestriction 440b11c1e72Sjeremylt 441*4ce2993fSjeremylt @param rstr CeedElemRestriction to destroy 442b11c1e72Sjeremylt 443b11c1e72Sjeremylt @return An error code: 0 - success, otherwise - failure 444dfdf5a53Sjeremylt 445dfdf5a53Sjeremylt @ref Basic 446b11c1e72Sjeremylt **/ 447*4ce2993fSjeremylt int CeedElemRestrictionDestroy(CeedElemRestriction *rstr) { 448d7b241e6Sjeremylt int ierr; 449d7b241e6Sjeremylt 450*4ce2993fSjeremylt if (!*rstr || --(*rstr)->refcount > 0) return 0; 451*4ce2993fSjeremylt if ((*rstr)->Destroy) { 452*4ce2993fSjeremylt ierr = (*rstr)->Destroy(*rstr); CeedChk(ierr); 453d7b241e6Sjeremylt } 454*4ce2993fSjeremylt ierr = CeedDestroy(&(*rstr)->ceed); CeedChk(ierr); 455*4ce2993fSjeremylt ierr = CeedFree(rstr); CeedChk(ierr); 456d7b241e6Sjeremylt return 0; 457d7b241e6Sjeremylt } 458d7b241e6Sjeremylt 459d7b241e6Sjeremylt /// @} 460