xref: /petsc/src/dm/dt/tests/ex8.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
1fbdc3dfeSToby Isaac const char help[] = "Tests PetscDTBaryToIndex(), PetscDTIndexToBary(), PetscDTIndexToGradedOrder() and PetscDTGradedOrderToIndex()";
2d4afb720SToby Isaac 
3d4afb720SToby Isaac #include <petsc/private/petscimpl.h>
4d4afb720SToby Isaac #include <petsc/private/dtimpl.h>
5d4afb720SToby Isaac #include <petsc/private/petscfeimpl.h>
6d4afb720SToby Isaac 
7d4afb720SToby Isaac int main(int argc, char **argv)
8d4afb720SToby Isaac {
9d4afb720SToby Isaac   PetscInt       d, n, maxdim = 4;
10d4afb720SToby Isaac   PetscInt       *btupprev, *btup;
11fbdc3dfeSToby Isaac   PetscInt       *gtup;
12d4afb720SToby Isaac 
13*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc, &argv, NULL, help));
145f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc3(maxdim + 1, &btup, maxdim + 1, &btupprev, maxdim, &gtup));
15d4afb720SToby Isaac   for (d = 0; d <= maxdim; d++) {
16d4afb720SToby Isaac     for (n = 0; n <= d + 2; n++) {
17d4afb720SToby Isaac       PetscInt j, k, Nk, kchk;
18d4afb720SToby Isaac 
195f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDTBinomialInt(d + n, d, &Nk));
20d4afb720SToby Isaac       for (k = 0; k < Nk; k++) {
21d4afb720SToby Isaac         PetscInt sum;
22d4afb720SToby Isaac 
235f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDTIndexToBary(d + 1, n, k, btup));
24d4afb720SToby Isaac         for (j = 0, sum = 0; j < d + 1; j++) {
252c71b3e2SJacob Faibussowitsch           PetscCheckFalse(btup[j] < 0,PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D negative entry", d, n, k);
26d4afb720SToby Isaac           sum += btup[j];
27d4afb720SToby Isaac         }
282c71b3e2SJacob Faibussowitsch         PetscCheckFalse(sum != n,PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D incorrect sum", d, n, k);
295f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDTBaryToIndex(d + 1, n, btup, &kchk));
302c71b3e2SJacob Faibussowitsch         PetscCheckFalse(kchk != k,PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTBaryToIndex, d = %D, n = %D, k = %D mismatch", d, n, k);
31d4afb720SToby Isaac         if (k) {
32d4afb720SToby Isaac           j = d;
33d4afb720SToby Isaac           while (j >= 0 && btup[j] == btupprev[j]) j--;
342c71b3e2SJacob Faibussowitsch           PetscCheckFalse(j < 0,PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D equal to previous", d, n, k);
352c71b3e2SJacob Faibussowitsch           PetscCheckFalse(btup[j] < btupprev[j],PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D less to previous", d, n, k);
36d4afb720SToby Isaac         } else {
375f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscArraycpy(btupprev, btup, d + 1));
38d4afb720SToby Isaac         }
395f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDTIndexToGradedOrder(d, Nk - 1 - k, gtup));
405f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDTGradedOrderToIndex(d, gtup, &kchk));
412c71b3e2SJacob Faibussowitsch         PetscCheckFalse(kchk != Nk - 1 - k,PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTGradedOrderToIndex, d = %D, n = %D, k = %D mismatch", d, n, Nk - 1 - k);
42fbdc3dfeSToby Isaac         for (j = 0; j < d; j++) {
432c71b3e2SJacob Faibussowitsch           PetscCheckFalse(gtup[j] != btup[d - 1 - j],PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToGradedOrder, d = %D, n = %D, k = %D incorrect", d, n, Nk - 1 - k);
44d4afb720SToby Isaac         }
45d4afb720SToby Isaac       }
46d4afb720SToby Isaac     }
47fbdc3dfeSToby Isaac   }
485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3(btup, btupprev, gtup));
49*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
50*b122ec5aSJacob Faibussowitsch   return 0;
51d4afb720SToby Isaac }
52d4afb720SToby Isaac 
53d4afb720SToby Isaac /*TEST
54d4afb720SToby Isaac 
55d4afb720SToby Isaac   test:
56d4afb720SToby Isaac 
57d4afb720SToby Isaac TEST*/
58