xref: /libCEED/tests/t204-elemrestriction.c (revision de996c553fbfe0e3ee86e746b77cddce8b7779ff)
173d26085Sjeremylt /// @file
273d26085Sjeremylt /// Test creation, use, and destruction of a multicomponent element restriction
373d26085Sjeremylt /// \test Test creation, use, and destruction of a multicomponent element restriction
473d26085Sjeremylt #include <ceed.h>
573d26085Sjeremylt 
673d26085Sjeremylt int main(int argc, char **argv) {
773d26085Sjeremylt   Ceed ceed;
873d26085Sjeremylt   CeedVector x, y;
973d26085Sjeremylt   CeedInt ne = 3;
1073d26085Sjeremylt   CeedInt ind[2*ne];
1173d26085Sjeremylt   CeedScalar a[2*(ne+1)];
1273d26085Sjeremylt   const CeedScalar *yy;
1373d26085Sjeremylt   CeedElemRestriction r;
1473d26085Sjeremylt 
1573d26085Sjeremylt   CeedInit(argv[1], &ceed);
1673d26085Sjeremylt 
1773d26085Sjeremylt   // Setup
1873d26085Sjeremylt   CeedVectorCreate(ceed, 2*(ne+1), &x);
1973d26085Sjeremylt   for (CeedInt i=0; i<ne+1; i++) {
2073d26085Sjeremylt     a[i] = 10 + i;
2173d26085Sjeremylt     a[i+ne+1] = 20 + i;
2273d26085Sjeremylt   }
2373d26085Sjeremylt   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, a);
2473d26085Sjeremylt 
2573d26085Sjeremylt   for (CeedInt i=0; i<ne; i++) {
2673d26085Sjeremylt     ind[2*i+0] = i;
2773d26085Sjeremylt     ind[2*i+1] = i+1;
2873d26085Sjeremylt   }
2973d26085Sjeremylt   CeedElemRestrictionCreate(ceed, ne, 2, ne+1, 2, CEED_MEM_HOST, CEED_USE_POINTER,
3073d26085Sjeremylt                             ind, &r);
3173d26085Sjeremylt   CeedVectorCreate(ceed, 2*(ne*2), &y);
3273d26085Sjeremylt   CeedVectorSetValue(y, 0); // Allocates array
3373d26085Sjeremylt 
3473d26085Sjeremylt   // Restrict
3573d26085Sjeremylt   CeedElemRestrictionApply(r, CEED_NOTRANSPOSE, CEED_NOTRANSPOSE, x, y,
3673d26085Sjeremylt                            CEED_REQUEST_IMMEDIATE);
3773d26085Sjeremylt 
3873d26085Sjeremylt   // Check
3973d26085Sjeremylt   CeedVectorGetArrayRead(y, CEED_MEM_HOST, &yy);
4073d26085Sjeremylt   for (CeedInt i=0; i<ne; i++) {
4173d26085Sjeremylt     for (CeedInt n=0; n<2; n++) {
4273d26085Sjeremylt       if (yy[i*4+n] != 10+(2*i+n+1)/2)
43a2546046Sjeremylt         // LCOV_EXCL_START
4473d26085Sjeremylt         printf("Error in restricted array y[%d] = %f != %f\n",
4573d26085Sjeremylt                i*4+n, (double)yy[i*4+n], 10.+(2*i+n+1)/2);
46*de996c55Sjeremylt         // LCOV_EXCL_STOP
4773d26085Sjeremylt       if (yy[i*4+n+2] != 20+(2*i+n+1)/2)
48a2546046Sjeremylt         // LCOV_EXCL_START
4973d26085Sjeremylt         printf("Error in restricted array y[%d] = %f != %f\n",
5073d26085Sjeremylt                i*4+n+2, (double)yy[i*4+n+2], 20.+(2*i+n+1)/2);
51*de996c55Sjeremylt         // LCOV_EXCL_STOP
5273d26085Sjeremylt     }
5373d26085Sjeremylt   }
5473d26085Sjeremylt 
5573d26085Sjeremylt   CeedVectorRestoreArrayRead(y, &yy);
5673d26085Sjeremylt   CeedVectorDestroy(&x);
5773d26085Sjeremylt   CeedVectorDestroy(&y);
5873d26085Sjeremylt   CeedElemRestrictionDestroy(&r);
5973d26085Sjeremylt   CeedDestroy(&ceed);
6073d26085Sjeremylt   return 0;
6173d26085Sjeremylt }
62