xref: /petsc/src/dm/dt/tests/ex8.c (revision fbdc3dfecc956bafdbba68414925614e3332ab30)
1*fbdc3dfeSToby 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;
11*fbdc3dfeSToby Isaac   PetscInt       *gtup;
12d4afb720SToby Isaac   PetscErrorCode ierr;
13d4afb720SToby Isaac 
14d4afb720SToby Isaac   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
15*fbdc3dfeSToby Isaac   ierr = PetscMalloc3(maxdim + 1, &btup, maxdim + 1, &btupprev, maxdim, &gtup);CHKERRQ(ierr);
16d4afb720SToby Isaac   for (d = 0; d <= maxdim; d++) {
17d4afb720SToby Isaac     for (n = 0; n <= d + 2; n++) {
18d4afb720SToby Isaac       PetscInt j, k, Nk, kchk;
19d4afb720SToby Isaac 
20d4afb720SToby Isaac       ierr = PetscDTBinomialInt(d + n, d, &Nk);CHKERRQ(ierr);
21d4afb720SToby Isaac       for (k = 0; k < Nk; k++) {
22d4afb720SToby Isaac         PetscInt sum;
23d4afb720SToby Isaac 
24d4afb720SToby Isaac         ierr = PetscDTIndexToBary(d + 1, n, k, btup);CHKERRQ(ierr);
25d4afb720SToby Isaac         for (j = 0, sum = 0; j < d + 1; j++) {
26*fbdc3dfeSToby Isaac           if (btup[j] < 0) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D negative entry\n", d, n, k);
27d4afb720SToby Isaac           sum += btup[j];
28d4afb720SToby Isaac         }
29*fbdc3dfeSToby Isaac         if (sum != n) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D incorrect sum\n", d, n, k);
30d4afb720SToby Isaac         ierr = PetscDTBaryToIndex(d + 1, n, btup, &kchk);CHKERRQ(ierr);
31*fbdc3dfeSToby Isaac         if (kchk != k) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTBaryToIndex, d = %D, n = %D, k = %D mismatch\n", d, n, k);
32d4afb720SToby Isaac         if (k) {
33d4afb720SToby Isaac           j = d;
34d4afb720SToby Isaac           while (j >= 0 && btup[j] == btupprev[j]) j--;
35*fbdc3dfeSToby Isaac           if (j < 0) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D equal to previous\n", d, n, k);
36*fbdc3dfeSToby Isaac           if (btup[j] < btupprev[j]) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToBary, d = %D, n = %D, k = %D less to previous\n", d, n, k);
37d4afb720SToby Isaac         } else {
38d4afb720SToby Isaac           ierr = PetscArraycpy(btupprev, btup, d + 1);CHKERRQ(ierr);
39d4afb720SToby Isaac         }
40*fbdc3dfeSToby Isaac         ierr = PetscDTIndexToGradedOrder(d, Nk - 1 - k, gtup);CHKERRQ(ierr);
41*fbdc3dfeSToby Isaac         ierr = PetscDTGradedOrderToIndex(d, gtup, &kchk);CHKERRQ(ierr);
42*fbdc3dfeSToby Isaac         if (kchk != Nk - 1 - k) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTGradedOrderToIndex, d = %D, n = %D, k = %D mismatch\n", d, n, Nk - 1 - k);
43*fbdc3dfeSToby Isaac         for (j = 0; j < d; j++) {
44*fbdc3dfeSToby Isaac           if (gtup[j] != btup[d - 1 - j]) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscDTIndexToGradedOrder, d = %D, n = %D, k = %D incorrect\n", d, n, Nk - 1 - k);
45d4afb720SToby Isaac         }
46d4afb720SToby Isaac       }
47d4afb720SToby Isaac     }
48*fbdc3dfeSToby Isaac   }
49*fbdc3dfeSToby Isaac   ierr = PetscFree3(btup, btupprev, gtup);CHKERRQ(ierr);
50d4afb720SToby Isaac   ierr = PetscFinalize();
51d4afb720SToby Isaac   return ierr;
52d4afb720SToby Isaac }
53d4afb720SToby Isaac 
54d4afb720SToby Isaac /*TEST
55d4afb720SToby Isaac 
56d4afb720SToby Isaac   test:
57d4afb720SToby Isaac 
58d4afb720SToby Isaac TEST*/
59