xref: /libCEED/tests/t208-elemrestriction.c (revision 61dbc9d25335c1a7855bdb901ed4d560d51eee1f)
1be9261b7Sjeremylt /// @file
2be9261b7Sjeremylt /// Test creation, use, and destruction of a blocked element restriction
3be9261b7Sjeremylt /// \test Test creation, use, and destruction of a blocked element restriction
4be9261b7Sjeremylt #include <ceed.h>
5be9261b7Sjeremylt 
6be9261b7Sjeremylt int main(int argc, char **argv) {
7be9261b7Sjeremylt   Ceed ceed;
8be9261b7Sjeremylt   CeedVector x, y;
9be9261b7Sjeremylt   CeedInt ne = 8;
10be9261b7Sjeremylt   CeedInt blksize = 5;
11db10e42cSDavid Medina   CeedInt elemsize = 2;
12db10e42cSDavid Medina   CeedInt ind[elemsize*ne];
13be9261b7Sjeremylt   CeedScalar a[ne+1];
14be9261b7Sjeremylt   CeedElemRestriction r;
15db10e42cSDavid Medina   CeedScalar *y_array;
16*61dbc9d2Sjeremylt   CeedInterlaceMode imode = CEED_NONINTERLACED;
17be9261b7Sjeremylt 
18be9261b7Sjeremylt   CeedInit(argv[1], &ceed);
19288c0443SJeremy L Thompson 
20be9261b7Sjeremylt   CeedVectorCreate(ceed, ne+1, &x);
21288c0443SJeremy L Thompson   for (CeedInt i=0; i<ne+1; i++)
22288c0443SJeremy L Thompson     a[i] = 10 + i;
23be9261b7Sjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
24be9261b7Sjeremylt 
25be9261b7Sjeremylt   for (CeedInt i=0; i<ne; i++) {
26db10e42cSDavid Medina     for (CeedInt k=0; k<elemsize; k++) {
27db10e42cSDavid Medina       ind[elemsize*i+k] = i+k;
28be9261b7Sjeremylt     }
29db10e42cSDavid Medina   }
30*61dbc9d2Sjeremylt 
31*61dbc9d2Sjeremylt   CeedElemRestrictionCreateBlocked(ceed, imode, ne, elemsize, blksize, ne+1, 1,
32a8d32208Sjeremylt                                    CEED_MEM_HOST, CEED_USE_POINTER, ind, &r);
33db10e42cSDavid Medina 
34db10e42cSDavid Medina   CeedVectorCreate(ceed, blksize*elemsize, &y);
35be9261b7Sjeremylt   CeedVectorSetValue(y, 0); // Allocates array
36be9261b7Sjeremylt 
37be9261b7Sjeremylt   // NoTranspose
38a8d32208Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_NOTRANSPOSE, x, y,
39be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
40db10e42cSDavid Medina 
41db10e42cSDavid Medina   // Zero padded entries
42db10e42cSDavid Medina   CeedVectorGetArray(y, CEED_MEM_HOST, &y_array);
43db10e42cSDavid Medina   for (CeedInt i = (elemsize*ne - blksize*elemsize); i < blksize*elemsize; ++i) {
44db10e42cSDavid Medina     y_array[i] = 0;
45db10e42cSDavid Medina   }
46db10e42cSDavid Medina   CeedVectorRestoreArray(y, &y_array);
47be9261b7Sjeremylt   CeedVectorView(y, "%12.8f", stdout);
48be9261b7Sjeremylt 
49be9261b7Sjeremylt   // Transpose
50be9261b7Sjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
51288c0443SJeremy L Thompson   for (CeedInt i=0; i<ne+1; i++)
52288c0443SJeremy L Thompson     a[i] = 0;
53be9261b7Sjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
54a8d32208Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_TRANSPOSE, y, x,
55be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
56be9261b7Sjeremylt   CeedVectorView(x, "%12.8f", stdout);
57be9261b7Sjeremylt 
58be9261b7Sjeremylt   CeedVectorDestroy(&x);
59be9261b7Sjeremylt   CeedVectorDestroy(&y);
60be9261b7Sjeremylt   CeedElemRestrictionDestroy(&r);
61be9261b7Sjeremylt   CeedDestroy(&ceed);
62be9261b7Sjeremylt   return 0;
63be9261b7Sjeremylt }
64