xref: /libCEED/tests/t213-elemrestriction.c (revision d979a0510f6353f9b8b50621433d53955a3f350a)
10036de2cSjeremylt /// @file
20036de2cSjeremylt /// Test creation, use, and destruction of a blocked element restriction with multiple components in the lvector, and libCEED owns ind pointer
30036de2cSjeremylt /// \test Test creation, use, and destruction of a blocked element restriction with multiple components in the lvector, and libCEED owns ind pointer
40036de2cSjeremylt #include <stdlib.h>
50036de2cSjeremylt #include <ceed.h>
60036de2cSjeremylt 
70036de2cSjeremylt int main(int argc, char **argv) {
80036de2cSjeremylt   Ceed ceed;
90036de2cSjeremylt   CeedVector x, y;
100036de2cSjeremylt   CeedInt ne = 8;
110036de2cSjeremylt   CeedInt blksize = 5;
120036de2cSjeremylt   CeedInt ncomp = 3;
130036de2cSjeremylt   CeedInt *ind = malloc(sizeof(CeedInt)*2*ne);
140036de2cSjeremylt   CeedScalar a[ncomp*(ne+1)];
150036de2cSjeremylt   CeedElemRestriction r;
160036de2cSjeremylt 
170036de2cSjeremylt   CeedInit(argv[1], &ceed);
180036de2cSjeremylt 
190036de2cSjeremylt   CeedVectorCreate(ceed, (ne+1)*ncomp, &x);
200036de2cSjeremylt   for (CeedInt i=0; i<(ne+1); i++) {
210036de2cSjeremylt     a[i+0*(ne+1)] = 10 + i;
220036de2cSjeremylt     a[i+1*(ne+1)] = 20 + i;
230036de2cSjeremylt     a[i+2*(ne+1)] = 30 + i;
240036de2cSjeremylt   }
250036de2cSjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
260036de2cSjeremylt   CeedVectorView(x, "%12.8f", stdout);
270036de2cSjeremylt   for (CeedInt i=0; i<ne; i++) {
280036de2cSjeremylt     ind[2*i+0] = i;
290036de2cSjeremylt     ind[2*i+1] = i+1;
300036de2cSjeremylt   }
31*d979a051Sjeremylt   CeedElemRestrictionCreateBlocked(ceed, ne, 2, blksize, ncomp, ne+1,
32*d979a051Sjeremylt                                    ncomp*(ne+1), CEED_MEM_HOST,
33*d979a051Sjeremylt                                    CEED_OWN_POINTER, ind, &r);
340036de2cSjeremylt   CeedVectorCreate(ceed, 2*blksize*2*ncomp, &y);
350036de2cSjeremylt   CeedVectorSetValue(y, 0); // Allocates array
360036de2cSjeremylt 
370036de2cSjeremylt   // NoTranspose
380036de2cSjeremylt   CeedElemRestrictionApply(r, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
390036de2cSjeremylt   CeedVectorView(y, "%12.8f", stdout);
400036de2cSjeremylt 
410036de2cSjeremylt   // Transpose
420036de2cSjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
430036de2cSjeremylt   for (CeedInt i=0; i<(ne+1)*ncomp; i++)
440036de2cSjeremylt     a[i] = 0;
450036de2cSjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
460036de2cSjeremylt   CeedElemRestrictionApply(r, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE);
470036de2cSjeremylt   CeedVectorView(x, "%12.8f", stdout);
480036de2cSjeremylt 
490036de2cSjeremylt   CeedVectorDestroy(&x);
500036de2cSjeremylt   CeedVectorDestroy(&y);
510036de2cSjeremylt   CeedElemRestrictionDestroy(&r);
520036de2cSjeremylt   CeedDestroy(&ceed);
530036de2cSjeremylt   return 0;
540036de2cSjeremylt }
55