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