xref: /libCEED/tests/t209-elemrestriction.c (revision b0d170e7bc2e5c930ee481a47eb73044935a48a4)
1 /// @file
2 /// Test calculation of dof multiplicity in element restriction
3 /// \test Test calculation of dof multiplicity in element restriction
4 #include <ceed.h>
5 
6 int main(int argc, char **argv) {
7   Ceed                ceed;
8   CeedVector          mult;
9   CeedInt             num_elem = 3;
10   CeedInt             ind[4 * num_elem];
11   const CeedScalar   *mm;
12   CeedElemRestriction r;
13 
14   CeedInit(argv[1], &ceed);
15 
16   CeedVectorCreate(ceed, 3 * num_elem + 1, &mult);
17   CeedVectorSetValue(mult, 0);  // Allocates array
18 
19   for (CeedInt i = 0; i < num_elem; i++) {
20     ind[4 * i + 0] = i * 3 + 0;
21     ind[4 * i + 1] = i * 3 + 1;
22     ind[4 * i + 2] = i * 3 + 2;
23     ind[4 * i + 3] = i * 3 + 3;
24   }
25   CeedElemRestrictionCreate(ceed, num_elem, 4, 1, 1, 3 * num_elem + 1, CEED_MEM_HOST, CEED_USE_POINTER, ind, &r);
26 
27   CeedElemRestrictionGetMultiplicity(r, mult);
28 
29   CeedVectorGetArrayRead(mult, CEED_MEM_HOST, &mm);
30   for (CeedInt i = 0; i < 3 * num_elem + 1; i++) {
31     if ((1 + (i > 0 && i < 3 * num_elem && (i % 3 == 0) ? 1 : 0)) != mm[i]) {
32       // LCOV_EXCL_START
33       printf("Error in multiplicity vector: mult[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)mm[i]);
34       // LCOV_EXCL_STOP
35     }
36   }
37   CeedVectorRestoreArrayRead(mult, &mm);
38 
39   CeedVectorDestroy(&mult);
40   CeedElemRestrictionDestroy(&r);
41   CeedDestroy(&ceed);
42   return 0;
43 }
44