xref: /libCEED/interface/ceed-elemrestriction.c (revision fe2413ff2a5f6e0d0808f191532abb277c4b8bc7)
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 
20d7b241e6Sjeremylt /// @file
21d7b241e6Sjeremylt /// Implementation of public CeedElemRestriction interfaces
22d7b241e6Sjeremylt ///
23dfdf5a53Sjeremylt /// @addtogroup CeedElemRestriction
24d7b241e6Sjeremylt /// @{
25d7b241e6Sjeremylt 
26d7b241e6Sjeremylt /**
27b11c1e72Sjeremylt   @brief Create a CeedElemRestriction
28d7b241e6Sjeremylt 
29b11c1e72Sjeremylt   @param ceed       A Ceed object where the CeedElemRestriction will be created
30b11c1e72Sjeremylt   @param nelem      Number of elements described in the @a indices array
31b11c1e72Sjeremylt   @param elemsize   Size (number of "nodes") per element
32d7b241e6Sjeremylt   @param ndof       The total size of the input CeedVector to which the
33d7b241e6Sjeremylt                       restriction will be applied. This size may include data
34d7b241e6Sjeremylt                       used by other CeedElemRestriction objects describing
35d7b241e6Sjeremylt                       different types of elements.
36b11c1e72Sjeremylt   @param ncomp      Number of field components per interpolation node
37b11c1e72Sjeremylt   @param mtype      Memory type of the @a indices array, see CeedMemType
38b11c1e72Sjeremylt   @param cmode      Copy mode for the @a indices array, see CeedCopyMode
39ecf6354eSJed Brown   @param indices    Array of shape [@a nelem, @a elemsize]. Row i holds the ordered list
40d7b241e6Sjeremylt                       of the indices (into the input CeedVector) for the unknowns
41d7b241e6Sjeremylt                       corresponding to element i, where 0 <= i < @a nelements.
42d7b241e6Sjeremylt                       All indices must be in the range [0, @a ndof).
434ce2993fSjeremylt   @param[out] rstr  Address of the variable where the newly created
44b11c1e72Sjeremylt                       CeedElemRestriction will be stored
45d7b241e6Sjeremylt 
46b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
47dfdf5a53Sjeremylt 
48dfdf5a53Sjeremylt   @ref Basic
49b11c1e72Sjeremylt **/
50d7b241e6Sjeremylt int CeedElemRestrictionCreate(Ceed ceed, CeedInt nelem, CeedInt elemsize,
51d7b241e6Sjeremylt                               CeedInt ndof, CeedInt ncomp, CeedMemType mtype,
52d7b241e6Sjeremylt                               CeedCopyMode cmode, const CeedInt *indices,
534ce2993fSjeremylt                               CeedElemRestriction *rstr) {
54d7b241e6Sjeremylt   int ierr;
55d7b241e6Sjeremylt 
565fe0d4faSjeremylt   if (!ceed->ElemRestrictionCreate) {
575fe0d4faSjeremylt     Ceed delegate;
585fe0d4faSjeremylt     ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr);
595fe0d4faSjeremylt 
605fe0d4faSjeremylt     if (!delegate)
61d7b241e6Sjeremylt       return CeedError(ceed, 1, "Backend does not support ElemRestrictionCreate");
625fe0d4faSjeremylt 
635fe0d4faSjeremylt     ierr = CeedElemRestrictionCreate(delegate, nelem, elemsize,
645fe0d4faSjeremylt                             ndof, ncomp, mtype, cmode,
654ce2993fSjeremylt                             indices, rstr); CeedChk(ierr);
665fe0d4faSjeremylt     return 0;
675fe0d4faSjeremylt   }
685fe0d4faSjeremylt 
694ce2993fSjeremylt   ierr = CeedCalloc(1, rstr); CeedChk(ierr);
704ce2993fSjeremylt   (*rstr)->ceed = ceed;
71d7b241e6Sjeremylt   ceed->refcount++;
724ce2993fSjeremylt   (*rstr)->refcount = 1;
734ce2993fSjeremylt   (*rstr)->nelem = nelem;
744ce2993fSjeremylt   (*rstr)->elemsize = elemsize;
754ce2993fSjeremylt   (*rstr)->ndof = ndof;
764ce2993fSjeremylt   (*rstr)->ncomp = ncomp;
774ce2993fSjeremylt   (*rstr)->nblk = nelem;
784ce2993fSjeremylt   (*rstr)->blksize = 1;
794ce2993fSjeremylt   ierr = ceed->ElemRestrictionCreate(mtype, cmode, indices, *rstr); CeedChk(ierr);
80d7b241e6Sjeremylt   return 0;
81d7b241e6Sjeremylt }
82d7b241e6Sjeremylt 
83d7b241e6Sjeremylt /**
84b11c1e72Sjeremylt   @brief Create an identity CeedElemRestriction
85d7b241e6Sjeremylt 
86b11c1e72Sjeremylt   @param ceed       A Ceed object where the CeedElemRestriction will be created
87b11c1e72Sjeremylt   @param nelem      Number of elements described in the @a indices array
88b11c1e72Sjeremylt   @param elemsize   Size (number of "nodes") per element
89d7b241e6Sjeremylt   @param ndof       The total size of the input CeedVector to which the
90d7b241e6Sjeremylt                       restriction will be applied. This size may include data
91d7b241e6Sjeremylt                       used by other CeedElemRestriction objects describing
92b11c1e72Sjeremylt                       different types of elements
93b11c1e72Sjeremylt   @param ncomp      Number of field components per interpolation node
944ce2993fSjeremylt   @param rstr       Address of the variable where the newly created
95b11c1e72Sjeremylt                       CeedElemRestriction will be stored
96d7b241e6Sjeremylt 
97b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
98dfdf5a53Sjeremylt 
99dfdf5a53Sjeremylt   @ref Basic
100b11c1e72Sjeremylt **/
1014b8bea3bSJed Brown int CeedElemRestrictionCreateIdentity(Ceed ceed, CeedInt nelem,
1024b8bea3bSJed Brown                                       CeedInt elemsize,
1034ce2993fSjeremylt                                       CeedInt ndof, CeedInt ncomp, CeedElemRestriction *rstr) {
104d7b241e6Sjeremylt   int ierr;
105d7b241e6Sjeremylt 
1065fe0d4faSjeremylt   if (!ceed->ElemRestrictionCreate) {
1075fe0d4faSjeremylt     Ceed delegate;
1085fe0d4faSjeremylt     ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr);
1095fe0d4faSjeremylt 
1105fe0d4faSjeremylt     if (!delegate)
1114b8bea3bSJed Brown       return CeedError(ceed, 1,
1125fe0d4faSjeremylt                      "Backend does not support ElemRestrictionCreate");
1135fe0d4faSjeremylt 
1145fe0d4faSjeremylt     ierr = CeedElemRestrictionCreateIdentity(delegate, nelem, elemsize,
1154ce2993fSjeremylt                             ndof, ncomp, rstr); CeedChk(ierr);
1165fe0d4faSjeremylt     return 0;
1175fe0d4faSjeremylt   }
1185fe0d4faSjeremylt 
1194ce2993fSjeremylt   ierr = CeedCalloc(1, rstr); CeedChk(ierr);
1204ce2993fSjeremylt   (*rstr)->ceed = ceed;
121d7b241e6Sjeremylt   ceed->refcount++;
1224ce2993fSjeremylt   (*rstr)->refcount = 1;
1234ce2993fSjeremylt   (*rstr)->nelem = nelem;
1244ce2993fSjeremylt   (*rstr)->elemsize = elemsize;
1254ce2993fSjeremylt   (*rstr)->ndof = ndof;
1264ce2993fSjeremylt   (*rstr)->ncomp = ncomp;
1274ce2993fSjeremylt   (*rstr)->nblk = nelem;
1284ce2993fSjeremylt   (*rstr)->blksize = 1;
1294ce2993fSjeremylt   ierr = ceed->ElemRestrictionCreate(CEED_MEM_HOST, CEED_OWN_POINTER, NULL, *rstr);
1304b8bea3bSJed Brown   CeedChk(ierr);
131d7b241e6Sjeremylt   return 0;
132d7b241e6Sjeremylt }
133d7b241e6Sjeremylt 
134d7b241e6Sjeremylt /**
135b11c1e72Sjeremylt   @brief Permute and pad indices for a blocked restriction
136d7b241e6Sjeremylt 
137ecf6354eSJed Brown   @param indices    Array of shape [@a nelem, @a elemsize]. Row i holds the ordered list
138d7b241e6Sjeremylt                       of the indices (into the input CeedVector) for the unknowns
139d7b241e6Sjeremylt                       corresponding to element i, where 0 <= i < @a nelements.
140d7b241e6Sjeremylt                       All indices must be in the range [0, @a ndof).
141ecf6354eSJed Brown   @param blkindices Array of permuted and padded indices of
142ecf6354eSJed Brown                       shape [@a nblk, @a elemsize, @a blksize].
143d7b241e6Sjeremylt   @param nblk       Number of blocks
144d7b241e6Sjeremylt   @param nelem      Number of elements
145d7b241e6Sjeremylt   @param blksize    Number of elements in a block
146d7b241e6Sjeremylt   @param elemsize   Size of each element
147d7b241e6Sjeremylt 
148b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
149b11c1e72Sjeremylt 
150dfdf5a53Sjeremylt   @ref Utility
151b11c1e72Sjeremylt **/
152dfdf5a53Sjeremylt int CeedPermutePadIndices(const CeedInt *indices, CeedInt *blkindices,
153d7b241e6Sjeremylt                           CeedInt nblk, CeedInt nelem,
154d7b241e6Sjeremylt                           CeedInt blksize, CeedInt elemsize) {
155d7b241e6Sjeremylt   for (CeedInt e = 0; e < nblk*blksize; e+=blksize)
156d7b241e6Sjeremylt     for (int j = 0; j < blksize; j++)
157d7b241e6Sjeremylt       for (int k = 0; k < elemsize; k++)
158d7b241e6Sjeremylt         blkindices[e*elemsize + k*blksize + j]
159d7b241e6Sjeremylt           = indices[CeedIntMin(e+j,nelem-1)*elemsize + k];
160dfdf5a53Sjeremylt   return 0;
161d7b241e6Sjeremylt }
162d7b241e6Sjeremylt 
163d7b241e6Sjeremylt /**
164b11c1e72Sjeremylt   @brief Create a blocked CeedElemRestriction, typically only called by backends
165d7b241e6Sjeremylt 
166d7b241e6Sjeremylt   @param ceed       A Ceed object where the CeedElemRestriction will be created.
167d7b241e6Sjeremylt   @param nelem      Number of elements described in the @a indices array.
168b11c1e72Sjeremylt   @param elemsize   Size (number of unknowns) per element
169b11c1e72Sjeremylt   @param blksize    Number of elements in a block
170d7b241e6Sjeremylt   @param ndof       The total size of the input CeedVector to which the
171d7b241e6Sjeremylt                       restriction will be applied. This size may include data
172d7b241e6Sjeremylt                       used by other CeedElemRestriction objects describing
173d7b241e6Sjeremylt                       different types of elements.
174b11c1e72Sjeremylt   @param ncomp      Number of components stored at each node
175b11c1e72Sjeremylt   @param mtype      Memory type of the @a indices array, see CeedMemType
176b11c1e72Sjeremylt   @param cmode      Copy mode for the @a indices array, see CeedCopyMode
177ecf6354eSJed Brown   @param indices    Array of shape [@a nelem, @a elemsize]. Row i holds the ordered list
178d7b241e6Sjeremylt                       of the indices (into the input CeedVector) for the unknowns
179d7b241e6Sjeremylt                       corresponding to element i, where 0 <= i < @a nelements.
180d7b241e6Sjeremylt                       All indices must be in the range [0, @a ndof). The
181d7b241e6Sjeremylt                       backend will permute and pad this array to the desired
182d7b241e6Sjeremylt                       ordering for the blocksize, which is typically given by the
183d7b241e6Sjeremylt                       backend. The default reordering is to interlace elements.
1844ce2993fSjeremylt   @param rstr       Address of the variable where the newly created
185b11c1e72Sjeremylt                       CeedElemRestriction will be stored
186d7b241e6Sjeremylt 
187b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
188dfdf5a53Sjeremylt 
189dfdf5a53Sjeremylt   @ref Advanced
190b11c1e72Sjeremylt  **/
191d7b241e6Sjeremylt int CeedElemRestrictionCreateBlocked(Ceed ceed, CeedInt nelem, CeedInt elemsize,
192d7b241e6Sjeremylt                                      CeedInt blksize, CeedInt ndof, CeedInt ncomp,
193d7b241e6Sjeremylt                                      CeedMemType mtype, CeedCopyMode cmode,
1944ce2993fSjeremylt                                      const CeedInt *indices,
1954ce2993fSjeremylt                                      CeedElemRestriction *rstr) {
196d7b241e6Sjeremylt   int ierr;
197d7b241e6Sjeremylt   CeedInt *blkindices;
198d7b241e6Sjeremylt   CeedInt nblk = (nelem / blksize) + !!(nelem % blksize);
199d7b241e6Sjeremylt 
2005fe0d4faSjeremylt   if (!ceed->ElemRestrictionCreateBlocked) {
2015fe0d4faSjeremylt     Ceed delegate;
2025fe0d4faSjeremylt     ierr = CeedGetDelegate(ceed, &delegate); CeedChk(ierr);
2035fe0d4faSjeremylt 
2045fe0d4faSjeremylt     if (!delegate)
205d7b241e6Sjeremylt       return CeedError(ceed, 1,
206d7b241e6Sjeremylt                      "Backend does not support ElemRestrictionCreateBlocked");
2075fe0d4faSjeremylt 
2085fe0d4faSjeremylt     ierr = CeedElemRestrictionCreateBlocked(delegate, nelem, elemsize,
2095fe0d4faSjeremylt                             blksize, ndof, ncomp, mtype, cmode,
2104ce2993fSjeremylt                             indices, rstr); CeedChk(ierr);
2115fe0d4faSjeremylt     return 0;
2125fe0d4faSjeremylt   }
213d7b241e6Sjeremylt 
2144ce2993fSjeremylt   ierr = CeedCalloc(1, rstr); CeedChk(ierr);
215d7b241e6Sjeremylt 
216d7b241e6Sjeremylt   if (indices) {
217d7b241e6Sjeremylt     ierr = CeedCalloc(nblk*blksize*elemsize, &blkindices);
2184b8bea3bSJed Brown     ierr = CeedPermutePadIndices(indices, blkindices, nblk, nelem, blksize,
2194b8bea3bSJed Brown                                  elemsize);
220dfdf5a53Sjeremylt     CeedChk(ierr);
221d7b241e6Sjeremylt   } else {
222d7b241e6Sjeremylt     blkindices = NULL;
223d7b241e6Sjeremylt   }
224d7b241e6Sjeremylt 
2254ce2993fSjeremylt   (*rstr)->ceed = ceed;
226d7b241e6Sjeremylt   ceed->refcount++;
2274ce2993fSjeremylt   (*rstr)->refcount = 1;
2284ce2993fSjeremylt   (*rstr)->nelem = nelem;
2294ce2993fSjeremylt   (*rstr)->elemsize = elemsize;
2304ce2993fSjeremylt   (*rstr)->ndof = ndof;
2314ce2993fSjeremylt   (*rstr)->ncomp = ncomp;
2324ce2993fSjeremylt   (*rstr)->nblk = nblk;
2334ce2993fSjeremylt   (*rstr)->blksize = blksize;
234667bc5fcSjeremylt   ierr = ceed->ElemRestrictionCreateBlocked(CEED_MEM_HOST, CEED_OWN_POINTER,
2354ce2993fSjeremylt          (const CeedInt *) blkindices, *rstr);
236d7b241e6Sjeremylt   CeedChk(ierr);
237d7b241e6Sjeremylt 
238d7b241e6Sjeremylt   if (cmode == CEED_OWN_POINTER)
239d7b241e6Sjeremylt     ierr = CeedFree(&indices); CeedChk(ierr);
240d7b241e6Sjeremylt 
241d7b241e6Sjeremylt   return 0;
242d7b241e6Sjeremylt }
243d7b241e6Sjeremylt 
244b11c1e72Sjeremylt /**
245b11c1e72Sjeremylt   @brief Create CeedVectors associated with a CeedElemRestriction
246b11c1e72Sjeremylt 
2474ce2993fSjeremylt   @param rstr  CeedElemRestriction
248b11c1e72Sjeremylt   @param lvec  The address of the L-vector to be created, or NULL
249b11c1e72Sjeremylt   @param evec  The address of the E-vector to be created, or NULL
250b11c1e72Sjeremylt 
251b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
252dfdf5a53Sjeremylt 
253dfdf5a53Sjeremylt   @ref Advanced
254b11c1e72Sjeremylt **/
2554ce2993fSjeremylt int CeedElemRestrictionCreateVector(CeedElemRestriction rstr, CeedVector *lvec,
256d7b241e6Sjeremylt                                     CeedVector *evec) {
257d7b241e6Sjeremylt   int ierr;
258d7b241e6Sjeremylt   CeedInt n, m;
2594ce2993fSjeremylt   m = rstr->ndof * rstr->ncomp;
2604ce2993fSjeremylt   n = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp;
261d7b241e6Sjeremylt   if (lvec) {
2624ce2993fSjeremylt     ierr = CeedVectorCreate(rstr->ceed, m, lvec); CeedChk(ierr);
263d7b241e6Sjeremylt   }
264d7b241e6Sjeremylt   if (evec) {
2654ce2993fSjeremylt     ierr = CeedVectorCreate(rstr->ceed, n, evec); CeedChk(ierr);
266d7b241e6Sjeremylt   }
267d7b241e6Sjeremylt   return 0;
268d7b241e6Sjeremylt }
269d7b241e6Sjeremylt 
270d7b241e6Sjeremylt /**
271b11c1e72Sjeremylt   @brief Restrict an L-vector to an E-vector or apply transpose
272d7b241e6Sjeremylt 
2734ce2993fSjeremylt   @param rstr    CeedElemRestriction
274d7b241e6Sjeremylt   @param tmode   Apply restriction or transpose
275d7b241e6Sjeremylt   @param lmode   Ordering of the ncomp components
276d7b241e6Sjeremylt   @param u       Input vector (of size @a ndof when tmode=CEED_NOTRANSPOSE)
277d7b241e6Sjeremylt   @param v       Output vector (of size @a nelem * @a elemsize when tmode=CEED_NOTRANSPOSE)
278d7b241e6Sjeremylt   @param request Request or CEED_REQUEST_IMMEDIATE
279b11c1e72Sjeremylt 
280b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
281dfdf5a53Sjeremylt 
282dfdf5a53Sjeremylt   @ref Advanced
283b11c1e72Sjeremylt **/
2844ce2993fSjeremylt int CeedElemRestrictionApply(CeedElemRestriction rstr, CeedTransposeMode tmode,
285d7b241e6Sjeremylt                              CeedTransposeMode lmode,
286d7b241e6Sjeremylt                              CeedVector u, CeedVector v, CeedRequest *request) {
287d7b241e6Sjeremylt   CeedInt m,n;
288d7b241e6Sjeremylt   int ierr;
289d7b241e6Sjeremylt 
290d7b241e6Sjeremylt   if (tmode == CEED_NOTRANSPOSE) {
2914ce2993fSjeremylt     m = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp;
2924ce2993fSjeremylt     n = rstr->ndof * rstr->ncomp;
293d7b241e6Sjeremylt   } else {
2944ce2993fSjeremylt     m = rstr->ndof * rstr->ncomp;
2954ce2993fSjeremylt     n = rstr->nblk * rstr->blksize * rstr->elemsize * rstr->ncomp;
296d7b241e6Sjeremylt   }
297d7b241e6Sjeremylt   if (n != u->length)
2984ce2993fSjeremylt     return CeedError(rstr->ceed, 2,
299d7b241e6Sjeremylt                      "Input vector size %d not compatible with element restriction (%d, %d)",
300d7b241e6Sjeremylt                      u->length, m, n);
301d7b241e6Sjeremylt   if (m != v->length)
3024ce2993fSjeremylt     return CeedError(rstr->ceed, 2,
303d7b241e6Sjeremylt                      "Output vector size %d not compatible with element restriction (%d, %d)",
304d7b241e6Sjeremylt                      v->length, m, n);
3054ce2993fSjeremylt   ierr = rstr->Apply(rstr, tmode, lmode, u, v, request); CeedChk(ierr);
306d7b241e6Sjeremylt 
307d7b241e6Sjeremylt   return 0;
308d7b241e6Sjeremylt }
309d7b241e6Sjeremylt 
310d7b241e6Sjeremylt /**
3114ce2993fSjeremylt   @brief Get the Ceed associated with a CeedElemRestriction
3124ce2993fSjeremylt 
3134ce2993fSjeremylt   @param rstr             CeedElemRestriction
3144ce2993fSjeremylt   @param[out] ceed        Variable to store Ceed
3154ce2993fSjeremylt 
3164ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3174ce2993fSjeremylt 
31823617272Sjeremylt   @ref Advanced
3194ce2993fSjeremylt **/
3204ce2993fSjeremylt int CeedElemRestrictionGetCeed(CeedElemRestriction rstr, Ceed *ceed) {
3214ce2993fSjeremylt   *ceed = rstr->ceed;
3224ce2993fSjeremylt   return 0;
3234ce2993fSjeremylt }
3244ce2993fSjeremylt 
3254ce2993fSjeremylt /**
326b11c1e72Sjeremylt   @brief Get the total number of elements in the range of a CeedElemRestriction
327d7b241e6Sjeremylt 
3284ce2993fSjeremylt   @param rstr             CeedElemRestriction
3294ce2993fSjeremylt   @param[out] numelements Variable to store number of elements
330b11c1e72Sjeremylt 
331b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
332dfdf5a53Sjeremylt 
33323617272Sjeremylt   @ref Advanced
334b11c1e72Sjeremylt **/
3354ce2993fSjeremylt int CeedElemRestrictionGetNumElements(CeedElemRestriction rstr,
3364ce2993fSjeremylt                                       CeedInt *numelem) {
3374ce2993fSjeremylt   *numelem = rstr->nelem;
3384ce2993fSjeremylt   return 0;
3394ce2993fSjeremylt }
3404ce2993fSjeremylt 
3414ce2993fSjeremylt /**
3424ce2993fSjeremylt   @brief Get the size of elements in the CeedElemRestriction
3434ce2993fSjeremylt 
3444ce2993fSjeremylt   @param rstr             CeedElemRestriction
3454ce2993fSjeremylt   @param[out] elemsize    Variable to store size of elements
3464ce2993fSjeremylt 
3474ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3484ce2993fSjeremylt 
34923617272Sjeremylt   @ref Advanced
3504ce2993fSjeremylt **/
3514ce2993fSjeremylt int CeedElemRestrictionGetElementSize(CeedElemRestriction rstr,
3524ce2993fSjeremylt                                    CeedInt *elemsize) {
3534ce2993fSjeremylt   *elemsize = rstr->elemsize;
3544ce2993fSjeremylt   return 0;
3554ce2993fSjeremylt }
3564ce2993fSjeremylt 
3574ce2993fSjeremylt /**
3584ce2993fSjeremylt   @brief Get the number of degrees of freedom in the range of a
3594ce2993fSjeremylt          CeedElemRestriction
3604ce2993fSjeremylt 
3614ce2993fSjeremylt   @param rstr             CeedElemRestriction
3624ce2993fSjeremylt   @param[out] numdof      Variable to store number of DoFs
3634ce2993fSjeremylt 
3644ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3654ce2993fSjeremylt 
36623617272Sjeremylt   @ref Advanced
3674ce2993fSjeremylt **/
3684ce2993fSjeremylt int CeedElemRestrictionGetNumDoF(CeedElemRestriction rstr,
3694ce2993fSjeremylt                                  CeedInt *numdof) {
3704ce2993fSjeremylt   *numdof = rstr->ndof;
3714ce2993fSjeremylt   return 0;
3724ce2993fSjeremylt }
3734ce2993fSjeremylt 
3744ce2993fSjeremylt /**
3754ce2993fSjeremylt   @brief Get the number of components in the elements of a
3764ce2993fSjeremylt          CeedElemRestriction
3774ce2993fSjeremylt 
3784ce2993fSjeremylt   @param rstr             CeedElemRestriction
3794ce2993fSjeremylt   @param[out] numcomp     Variable to store number of components
3804ce2993fSjeremylt 
3814ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3824ce2993fSjeremylt 
38323617272Sjeremylt   @ref Advanced
3844ce2993fSjeremylt **/
3854ce2993fSjeremylt int CeedElemRestrictionGetNumComponents(CeedElemRestriction rstr,
3864ce2993fSjeremylt                                   CeedInt *numcomp) {
3874ce2993fSjeremylt   *numcomp = rstr->ncomp;
3884ce2993fSjeremylt   return 0;
3894ce2993fSjeremylt }
3904ce2993fSjeremylt 
3914ce2993fSjeremylt /**
3924ce2993fSjeremylt   @brief Get the number of blocks in a CeedElemRestriction
3934ce2993fSjeremylt 
3944ce2993fSjeremylt   @param rstr             CeedElemRestriction
3954ce2993fSjeremylt   @param[out] numblock    Variable to store number of blocks
3964ce2993fSjeremylt 
3974ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
3984ce2993fSjeremylt 
39923617272Sjeremylt   @ref Advanced
4004ce2993fSjeremylt **/
4014ce2993fSjeremylt int CeedElemRestrictionGetNumBlocks(CeedElemRestriction rstr,
4024ce2993fSjeremylt                                   CeedInt *numblock) {
4034ce2993fSjeremylt   *numblock = rstr->nblk;
4044ce2993fSjeremylt   return 0;
4054ce2993fSjeremylt }
4064ce2993fSjeremylt 
4074ce2993fSjeremylt /**
4084ce2993fSjeremylt   @brief Get the size of blocks in the CeedElemRestriction
4094ce2993fSjeremylt 
4104ce2993fSjeremylt   @param r                CeedElemRestriction
4114ce2993fSjeremylt   @param[out] blksize     Variable to store size of blocks
4124ce2993fSjeremylt 
4134ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
4144ce2993fSjeremylt 
41523617272Sjeremylt   @ref Advanced
4164ce2993fSjeremylt **/
4174ce2993fSjeremylt int CeedElemRestrictionGetBlockSize(CeedElemRestriction rstr,
4184ce2993fSjeremylt                                     CeedInt *blksize) {
4194ce2993fSjeremylt   *blksize = rstr->blksize;
4204ce2993fSjeremylt   return 0;
4214ce2993fSjeremylt }
4224ce2993fSjeremylt 
4234ce2993fSjeremylt /**
4244ce2993fSjeremylt   @brief Get the backend data of a CeedElemRestriction
4254ce2993fSjeremylt 
4264ce2993fSjeremylt   @param r                CeedElemRestriction
4274ce2993fSjeremylt   @param[out] data        Variable to store data
4284ce2993fSjeremylt 
4294ce2993fSjeremylt   @return An error code: 0 - success, otherwise - failure
4304ce2993fSjeremylt 
43123617272Sjeremylt   @ref Advanced
4324ce2993fSjeremylt **/
4334ce2993fSjeremylt int CeedElemRestrictionGetData(CeedElemRestriction rstr,
4344ce2993fSjeremylt                                     void* *data) {
4354ce2993fSjeremylt   *data = rstr->data;
436d7b241e6Sjeremylt   return 0;
437d7b241e6Sjeremylt }
438d7b241e6Sjeremylt 
439d7b241e6Sjeremylt /**
440*fe2413ffSjeremylt   @brief Set the backend data of a CeedElemRestriction
441*fe2413ffSjeremylt 
442*fe2413ffSjeremylt   @param[out] r           CeedElemRestriction
443*fe2413ffSjeremylt   @param data             Data to set
444*fe2413ffSjeremylt 
445*fe2413ffSjeremylt   @return An error code: 0 - success, otherwise - failure
446*fe2413ffSjeremylt 
447*fe2413ffSjeremylt   @ref Advanced
448*fe2413ffSjeremylt **/
449*fe2413ffSjeremylt int CeedElemRestrictionSetData(CeedElemRestriction rstr,
450*fe2413ffSjeremylt                                     void* *data) {
451*fe2413ffSjeremylt   rstr->data = *data;
452*fe2413ffSjeremylt   return 0;
453*fe2413ffSjeremylt }
454*fe2413ffSjeremylt 
455*fe2413ffSjeremylt /**
456b11c1e72Sjeremylt   @brief Destroy a CeedElemRestriction
457b11c1e72Sjeremylt 
4584ce2993fSjeremylt   @param rstr CeedElemRestriction to destroy
459b11c1e72Sjeremylt 
460b11c1e72Sjeremylt   @return An error code: 0 - success, otherwise - failure
461dfdf5a53Sjeremylt 
462dfdf5a53Sjeremylt   @ref Basic
463b11c1e72Sjeremylt **/
4644ce2993fSjeremylt int CeedElemRestrictionDestroy(CeedElemRestriction *rstr) {
465d7b241e6Sjeremylt   int ierr;
466d7b241e6Sjeremylt 
4674ce2993fSjeremylt   if (!*rstr || --(*rstr)->refcount > 0) return 0;
4684ce2993fSjeremylt   if ((*rstr)->Destroy) {
4694ce2993fSjeremylt     ierr = (*rstr)->Destroy(*rstr); CeedChk(ierr);
470d7b241e6Sjeremylt   }
4714ce2993fSjeremylt   ierr = CeedDestroy(&(*rstr)->ceed); CeedChk(ierr);
4724ce2993fSjeremylt   ierr = CeedFree(rstr); CeedChk(ierr);
473d7b241e6Sjeremylt   return 0;
474d7b241e6Sjeremylt }
475d7b241e6Sjeremylt 
476d7b241e6Sjeremylt /// @}
477