xref: /libCEED/rust/libceed-sys/c-src/interface/ceed-elemrestriction.c (revision 4ce2993fee6e7bc9b86526ee90098d0dc489fc60)
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