xref: /libCEED/tests/t213-elemrestriction.c (revision 0036de2c0ad807bd8ab213cac28d33186520da16)
1*0036de2cSjeremylt /// @file
2*0036de2cSjeremylt /// Test creation, use, and destruction of a blocked element restriction with multiple components in the lvector, and libCEED owns ind pointer
3*0036de2cSjeremylt /// \test Test creation, use, and destruction of a blocked element restriction with multiple components in the lvector, and libCEED owns ind pointer
4*0036de2cSjeremylt #include <stdlib.h>
5*0036de2cSjeremylt #include <ceed.h>
6*0036de2cSjeremylt 
7*0036de2cSjeremylt int main(int argc, char **argv) {
8*0036de2cSjeremylt   Ceed ceed;
9*0036de2cSjeremylt   CeedVector x, y;
10*0036de2cSjeremylt   CeedInt ne = 8;
11*0036de2cSjeremylt   CeedInt blksize = 5;
12*0036de2cSjeremylt   CeedInt ncomp = 3;
13*0036de2cSjeremylt   CeedInt *ind = malloc(sizeof(CeedInt)*2*ne);
14*0036de2cSjeremylt   CeedScalar a[ncomp*(ne+1)];
15*0036de2cSjeremylt   CeedElemRestriction r;
16*0036de2cSjeremylt   CeedInterlaceMode imode = CEED_NONINTERLACED;
17*0036de2cSjeremylt 
18*0036de2cSjeremylt   CeedInit(argv[1], &ceed);
19*0036de2cSjeremylt 
20*0036de2cSjeremylt   CeedVectorCreate(ceed, (ne+1)*ncomp, &x);
21*0036de2cSjeremylt   for (CeedInt i=0; i<(ne+1); i++) {
22*0036de2cSjeremylt     a[i+0*(ne+1)] = 10 + i;
23*0036de2cSjeremylt     a[i+1*(ne+1)] = 20 + i;
24*0036de2cSjeremylt     a[i+2*(ne+1)] = 30 + i;
25*0036de2cSjeremylt   }
26*0036de2cSjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
27*0036de2cSjeremylt   CeedVectorView(x, "%12.8f", stdout);
28*0036de2cSjeremylt   for (CeedInt i=0; i<ne; i++) {
29*0036de2cSjeremylt     ind[2*i+0] = i;
30*0036de2cSjeremylt     ind[2*i+1] = i+1;
31*0036de2cSjeremylt   }
32*0036de2cSjeremylt   CeedElemRestrictionCreateBlocked(ceed, imode, ne, 2, blksize, ne+1, ncomp,
33*0036de2cSjeremylt                                    CEED_MEM_HOST, CEED_OWN_POINTER, ind, &r);
34*0036de2cSjeremylt   CeedVectorCreate(ceed, 2*blksize*2*ncomp, &y);
35*0036de2cSjeremylt   CeedVectorSetValue(y, 0); // Allocates array
36*0036de2cSjeremylt 
37*0036de2cSjeremylt   // NoTranspose
38*0036de2cSjeremylt   CeedElemRestrictionApply(r, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
39*0036de2cSjeremylt   CeedVectorView(y, "%12.8f", stdout);
40*0036de2cSjeremylt 
41*0036de2cSjeremylt   // Transpose
42*0036de2cSjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
43*0036de2cSjeremylt   for (CeedInt i=0; i<(ne+1)*ncomp; i++)
44*0036de2cSjeremylt     a[i] = 0;
45*0036de2cSjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
46*0036de2cSjeremylt   CeedElemRestrictionApply(r, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE);
47*0036de2cSjeremylt   CeedVectorView(x, "%12.8f", stdout);
48*0036de2cSjeremylt 
49*0036de2cSjeremylt   CeedVectorDestroy(&x);
50*0036de2cSjeremylt   CeedVectorDestroy(&y);
51*0036de2cSjeremylt   CeedElemRestrictionDestroy(&r);
52*0036de2cSjeremylt   CeedDestroy(&ceed);
53*0036de2cSjeremylt   return 0;
54*0036de2cSjeremylt }
55