xref: /libCEED/tests/t206-elemrestriction.c (revision d1d35e2f02dc969aee8debf3fd943dd784aa847a)
173d26085Sjeremylt /// @file
273d26085Sjeremylt /// Test creation, transpose use, and destruction of a multicomponent element restriction
373d26085Sjeremylt /// \test Test creation, transpose use, and destruction of a multicomponent element restriction
473d26085Sjeremylt #include <ceed.h>
5ec3da8bcSJed Brown #include <ceed/backend.h>
673d26085Sjeremylt 
773d26085Sjeremylt int main(int argc, char **argv) {
873d26085Sjeremylt   Ceed ceed;
973d26085Sjeremylt   CeedVector x, y;
10*d1d35e2fSjeremylt   CeedInt num_elem = 5;
11*d1d35e2fSjeremylt   CeedInt ind[2*num_elem];
1249fd234cSJeremy L Thompson   CeedInt layout[3];
1349fd234cSJeremy L Thompson   CeedScalar mult;
14*d1d35e2fSjeremylt   CeedScalar a[2*(num_elem*2)];
1573d26085Sjeremylt   const CeedScalar *yy;
1673d26085Sjeremylt   CeedElemRestriction r;
1773d26085Sjeremylt 
1873d26085Sjeremylt   CeedInit(argv[1], &ceed);
1973d26085Sjeremylt 
2073d26085Sjeremylt   // Setup
21*d1d35e2fSjeremylt   CeedVectorCreate(ceed, 2*(num_elem*2), &x);
2273d26085Sjeremylt 
23*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem; i++) {
2473d26085Sjeremylt     ind[2*i+0] = i;
2573d26085Sjeremylt     ind[2*i+1] = i+1;
2673d26085Sjeremylt   }
27*d1d35e2fSjeremylt   CeedElemRestrictionCreate(ceed, num_elem, 2, 2, num_elem+1, 2*(num_elem+1),
28*d1d35e2fSjeremylt                             CEED_MEM_HOST,
29288c0443SJeremy L Thompson                             CEED_USE_POINTER, ind, &r);
30*d1d35e2fSjeremylt   CeedVectorCreate(ceed, 2*(num_elem+1), &y);
3173d26085Sjeremylt   CeedVectorSetValue(y, 0); // Allocates array
3273d26085Sjeremylt 
3349fd234cSJeremy L Thompson   // Set x data in backend E-layout
3449fd234cSJeremy L Thompson   CeedElemRestrictionGetELayout(r, &layout);
3549fd234cSJeremy L Thompson   for (CeedInt i=0; i<2; i++)      // Node
3649fd234cSJeremy L Thompson     for (CeedInt j=0; j<2; j++)    // Component
37*d1d35e2fSjeremylt       for (CeedInt k=0; k<num_elem; k++) // Element
3849fd234cSJeremy L Thompson         a[i*layout[0] + j*layout[1] + k*layout[2]] = 10*j+(2*k+i+1)/2;
3949fd234cSJeremy L Thompson   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
4049fd234cSJeremy L Thompson 
4173d26085Sjeremylt   // Restrict
42a8d32208Sjeremylt   CeedElemRestrictionApply(r, CEED_TRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
4373d26085Sjeremylt 
4473d26085Sjeremylt   // Check
4573d26085Sjeremylt   CeedVectorGetArrayRead(y, CEED_MEM_HOST, &yy);
46*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem+1; i++) {
47*d1d35e2fSjeremylt     mult = i>0&&i<num_elem ? 2 : 1;
4849fd234cSJeremy L Thompson     if (yy[i] != i*mult)
49a2546046Sjeremylt       // LCOV_EXCL_START
5073d26085Sjeremylt       printf("Error in restricted array y[%d] = %f != %f\n",
5149fd234cSJeremy L Thompson              i, (double)yy[i], i*mult);
52de996c55Sjeremylt     // LCOV_EXCL_STOP
53*d1d35e2fSjeremylt     if (yy[i+num_elem+1] != (10+i)*mult)
54a2546046Sjeremylt       // LCOV_EXCL_START
5573d26085Sjeremylt       printf("Error in restricted array y[%d] = %f != %f\n",
56*d1d35e2fSjeremylt              i+num_elem+1, (double)yy[i+num_elem+1], (10.+i)*mult);
57de996c55Sjeremylt     // LCOV_EXCL_STOP
5873d26085Sjeremylt   }
5973d26085Sjeremylt 
6073d26085Sjeremylt   CeedVectorRestoreArrayRead(y, &yy);
6173d26085Sjeremylt   CeedVectorDestroy(&x);
6273d26085Sjeremylt   CeedVectorDestroy(&y);
6373d26085Sjeremylt   CeedElemRestrictionDestroy(&r);
6473d26085Sjeremylt   CeedDestroy(&ceed);
6573d26085Sjeremylt   return 0;
6673d26085Sjeremylt }
67