xref: /libCEED/tests/t208-elemrestriction.c (revision a8d322087fa8f150327cdc2bf14a171452b711ec)
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*a8d32208Sjeremylt   CeedTransposeMode lmode = CEED_NOTRANSPOSE;
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*a8d32208Sjeremylt   CeedElemRestrictionCreateBlocked(ceed, lmode, ne, elemsize, blksize, ne+1, 1,
31*a8d32208Sjeremylt                                    CEED_MEM_HOST, CEED_USE_POINTER, ind, &r);
32db10e42cSDavid Medina 
33db10e42cSDavid Medina   CeedVectorCreate(ceed, blksize*elemsize, &y);
34be9261b7Sjeremylt   CeedVectorSetValue(y, 0); // Allocates array
35be9261b7Sjeremylt 
36be9261b7Sjeremylt   // NoTranspose
37*a8d32208Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_NOTRANSPOSE, x, y,
38be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
39db10e42cSDavid Medina 
40db10e42cSDavid Medina   // Zero padded entries
41db10e42cSDavid Medina   CeedVectorGetArray(y, CEED_MEM_HOST, &y_array);
42db10e42cSDavid Medina   for (CeedInt i = (elemsize*ne - blksize*elemsize); i < blksize*elemsize; ++i) {
43db10e42cSDavid Medina     y_array[i] = 0;
44db10e42cSDavid Medina   }
45db10e42cSDavid Medina   CeedVectorRestoreArray(y, &y_array);
46be9261b7Sjeremylt   CeedVectorView(y, "%12.8f", stdout);
47be9261b7Sjeremylt 
48be9261b7Sjeremylt   // Transpose
49be9261b7Sjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
50288c0443SJeremy L Thompson   for (CeedInt i=0; i<ne+1; i++)
51288c0443SJeremy L Thompson     a[i] = 0;
52be9261b7Sjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
53*a8d32208Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_TRANSPOSE, y, x,
54be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
55be9261b7Sjeremylt   CeedVectorView(x, "%12.8f", stdout);
56be9261b7Sjeremylt 
57be9261b7Sjeremylt   CeedVectorDestroy(&x);
58be9261b7Sjeremylt   CeedVectorDestroy(&y);
59be9261b7Sjeremylt   CeedElemRestrictionDestroy(&r);
60be9261b7Sjeremylt   CeedDestroy(&ceed);
61be9261b7Sjeremylt   return 0;
62be9261b7Sjeremylt }
63