xref: /libCEED/tests/t213-elemrestriction.c (revision d1d35e2f02dc969aee8debf3fd943dd784aa847a)
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;
10*d1d35e2fSjeremylt   CeedInt num_elem = 8;
11*d1d35e2fSjeremylt   CeedInt blk_size = 5;
12*d1d35e2fSjeremylt   CeedInt num_comp = 3;
13*d1d35e2fSjeremylt   CeedInt *ind = malloc(sizeof(CeedInt)*2*num_elem);
14*d1d35e2fSjeremylt   CeedScalar a[num_comp*(num_elem+1)];
150036de2cSjeremylt   CeedElemRestriction r;
160036de2cSjeremylt 
170036de2cSjeremylt   CeedInit(argv[1], &ceed);
180036de2cSjeremylt 
19*d1d35e2fSjeremylt   CeedVectorCreate(ceed, (num_elem+1)*num_comp, &x);
20*d1d35e2fSjeremylt   for (CeedInt i=0; i<(num_elem+1); i++) {
21*d1d35e2fSjeremylt     a[i+0*(num_elem+1)] = 10 + i;
22*d1d35e2fSjeremylt     a[i+1*(num_elem+1)] = 20 + i;
23*d1d35e2fSjeremylt     a[i+2*(num_elem+1)] = 30 + i;
240036de2cSjeremylt   }
250036de2cSjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
260036de2cSjeremylt   CeedVectorView(x, "%12.8f", stdout);
27*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem; i++) {
280036de2cSjeremylt     ind[2*i+0] = i;
290036de2cSjeremylt     ind[2*i+1] = i+1;
300036de2cSjeremylt   }
31*d1d35e2fSjeremylt   CeedElemRestrictionCreateBlocked(ceed, num_elem, 2, blk_size, num_comp,
32*d1d35e2fSjeremylt                                    num_elem+1,
33*d1d35e2fSjeremylt                                    num_comp*(num_elem+1), CEED_MEM_HOST,
34d979a051Sjeremylt                                    CEED_OWN_POINTER, ind, &r);
35*d1d35e2fSjeremylt   CeedVectorCreate(ceed, 2*blk_size*2*num_comp, &y);
360036de2cSjeremylt   CeedVectorSetValue(y, 0); // Allocates array
370036de2cSjeremylt 
380036de2cSjeremylt   // NoTranspose
390036de2cSjeremylt   CeedElemRestrictionApply(r, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
400036de2cSjeremylt   CeedVectorView(y, "%12.8f", stdout);
410036de2cSjeremylt 
420036de2cSjeremylt   // Transpose
430036de2cSjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
44*d1d35e2fSjeremylt   for (CeedInt i=0; i<(num_elem+1)*num_comp; i++)
450036de2cSjeremylt     a[i] = 0;
460036de2cSjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
470036de2cSjeremylt   CeedElemRestrictionApply(r, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE);
480036de2cSjeremylt   CeedVectorView(x, "%12.8f", stdout);
490036de2cSjeremylt 
500036de2cSjeremylt   CeedVectorDestroy(&x);
510036de2cSjeremylt   CeedVectorDestroy(&y);
520036de2cSjeremylt   CeedElemRestrictionDestroy(&r);
530036de2cSjeremylt   CeedDestroy(&ceed);
540036de2cSjeremylt   return 0;
550036de2cSjeremylt }
56