xref: /libCEED/tests/t208-elemrestriction.c (revision db10e42ca2079676d7a17395bfa2477882ba7682)
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;
11*db10e42cSDavid Medina   CeedInt elemsize = 2;
12*db10e42cSDavid Medina   CeedInt ind[elemsize*ne];
13be9261b7Sjeremylt   CeedScalar a[ne+1];
14be9261b7Sjeremylt   CeedElemRestriction r;
15*db10e42cSDavid Medina   CeedScalar *y_array;
16be9261b7Sjeremylt 
17be9261b7Sjeremylt   CeedInit(argv[1], &ceed);
18288c0443SJeremy L Thompson 
19be9261b7Sjeremylt   CeedVectorCreate(ceed, ne+1, &x);
20288c0443SJeremy L Thompson   for (CeedInt i=0; i<ne+1; i++)
21288c0443SJeremy L Thompson     a[i] = 10 + i;
22be9261b7Sjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
23be9261b7Sjeremylt 
24be9261b7Sjeremylt   for (CeedInt i=0; i<ne; i++) {
25*db10e42cSDavid Medina     for (CeedInt k=0; k<elemsize; k++) {
26*db10e42cSDavid Medina       ind[elemsize*i+k] = i+k;
27be9261b7Sjeremylt     }
28*db10e42cSDavid Medina   }
29*db10e42cSDavid Medina   CeedElemRestrictionCreateBlocked(ceed, ne, elemsize, blksize, ne+1, 1, CEED_MEM_HOST,
30be9261b7Sjeremylt                                    CEED_USE_POINTER, ind, &r);
31*db10e42cSDavid Medina 
32*db10e42cSDavid Medina   CeedVectorCreate(ceed, blksize*elemsize, &y);
33be9261b7Sjeremylt   CeedVectorSetValue(y, 0); // Allocates array
34be9261b7Sjeremylt 
35be9261b7Sjeremylt   // NoTranspose
36be9261b7Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_NOTRANSPOSE, CEED_NOTRANSPOSE, x, y,
37be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
38*db10e42cSDavid Medina 
39*db10e42cSDavid Medina   // Zero padded entries
40*db10e42cSDavid Medina   CeedVectorGetArray(y, CEED_MEM_HOST, &y_array);
41*db10e42cSDavid Medina   for (CeedInt i = (elemsize*ne - blksize*elemsize); i < blksize*elemsize; ++i) {
42*db10e42cSDavid Medina     y_array[i] = 0;
43*db10e42cSDavid Medina   }
44*db10e42cSDavid Medina   CeedVectorRestoreArray(y, &y_array);
45be9261b7Sjeremylt   CeedVectorView(y, "%12.8f", stdout);
46be9261b7Sjeremylt 
47be9261b7Sjeremylt   // Transpose
48be9261b7Sjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
49288c0443SJeremy L Thompson   for (CeedInt i=0; i<ne+1; i++)
50288c0443SJeremy L Thompson     a[i] = 0;
51be9261b7Sjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
52be9261b7Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_TRANSPOSE, CEED_NOTRANSPOSE, y, x,
53be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
54be9261b7Sjeremylt   CeedVectorView(x, "%12.8f", stdout);
55be9261b7Sjeremylt 
56be9261b7Sjeremylt   CeedVectorDestroy(&x);
57be9261b7Sjeremylt   CeedVectorDestroy(&y);
58be9261b7Sjeremylt   CeedElemRestrictionDestroy(&r);
59be9261b7Sjeremylt   CeedDestroy(&ceed);
60be9261b7Sjeremylt   return 0;
61be9261b7Sjeremylt }
62