xref: /libCEED/tests/t208-elemrestriction.c (revision d1d35e2f02dc969aee8debf3fd943dd784aa847a)
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;
9*d1d35e2fSjeremylt   CeedInt num_elem = 8;
10*d1d35e2fSjeremylt   CeedInt blk_size = 5;
11*d1d35e2fSjeremylt   CeedInt elem_size = 2;
12*d1d35e2fSjeremylt   CeedInt ind[elem_size*num_elem];
13*d1d35e2fSjeremylt   CeedScalar a[num_elem+1];
14be9261b7Sjeremylt   CeedElemRestriction r;
15db10e42cSDavid Medina   CeedScalar *y_array;
16be9261b7Sjeremylt 
17be9261b7Sjeremylt   CeedInit(argv[1], &ceed);
18288c0443SJeremy L Thompson 
19*d1d35e2fSjeremylt   CeedVectorCreate(ceed, num_elem+1, &x);
20*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem+1; i++)
21288c0443SJeremy L Thompson     a[i] = 10 + i;
22be9261b7Sjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
23be9261b7Sjeremylt 
24*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem; i++) {
25*d1d35e2fSjeremylt     for (CeedInt k=0; k<elem_size; k++) {
26*d1d35e2fSjeremylt       ind[elem_size*i+k] = i+k;
27be9261b7Sjeremylt     }
28db10e42cSDavid Medina   }
2961dbc9d2Sjeremylt 
30*d1d35e2fSjeremylt   CeedElemRestrictionCreateBlocked(ceed, num_elem, elem_size, blk_size, 1, 1,
31*d1d35e2fSjeremylt                                    num_elem+1,
32a8d32208Sjeremylt                                    CEED_MEM_HOST, CEED_USE_POINTER, ind, &r);
33db10e42cSDavid Medina 
34*d1d35e2fSjeremylt   CeedVectorCreate(ceed, blk_size*elem_size, &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);
43*d1d35e2fSjeremylt   for (CeedInt i = (elem_size*num_elem - blk_size*elem_size);
44*d1d35e2fSjeremylt        i < blk_size*elem_size;
45*d1d35e2fSjeremylt        ++i) {
46db10e42cSDavid Medina     y_array[i] = 0;
47db10e42cSDavid Medina   }
48db10e42cSDavid Medina   CeedVectorRestoreArray(y, &y_array);
49be9261b7Sjeremylt   CeedVectorView(y, "%12.8f", stdout);
50be9261b7Sjeremylt 
51be9261b7Sjeremylt   // Transpose
52be9261b7Sjeremylt   CeedVectorGetArray(x, CEED_MEM_HOST, (CeedScalar **)&a);
53*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem+1; i++)
54288c0443SJeremy L Thompson     a[i] = 0;
55be9261b7Sjeremylt   CeedVectorRestoreArray(x, (CeedScalar **)&a);
56a8d32208Sjeremylt   CeedElemRestrictionApplyBlock(r, 1, CEED_TRANSPOSE, y, x,
57be9261b7Sjeremylt                                 CEED_REQUEST_IMMEDIATE);
58be9261b7Sjeremylt   CeedVectorView(x, "%12.8f", stdout);
59be9261b7Sjeremylt 
60be9261b7Sjeremylt   CeedVectorDestroy(&x);
61be9261b7Sjeremylt   CeedVectorDestroy(&y);
62be9261b7Sjeremylt   CeedElemRestrictionDestroy(&r);
63be9261b7Sjeremylt   CeedDestroy(&ceed);
64be9261b7Sjeremylt   return 0;
65be9261b7Sjeremylt }
66