xref: /petsc/src/dm/dt/space/impls/ptrimmed/tests/ex1.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
1ccb4e88aSToby Isaac const char help[] = "Test basic creation and evaluation of PETSCSPACEPTRIMMED";
2ccb4e88aSToby Isaac 
3ccb4e88aSToby Isaac #include <petscfe.h>
4ccb4e88aSToby Isaac 
5ccb4e88aSToby Isaac static PetscErrorCode test(PetscInt dim, PetscInt formDegree, PetscInt degree, PetscInt nCopies)
6ccb4e88aSToby Isaac {
7ccb4e88aSToby Isaac   MPI_Comm         comm = PETSC_COMM_SELF;
8ccb4e88aSToby Isaac   PetscSpace       sp;
9ccb4e88aSToby Isaac   PetscInt         Nf, Nb;
10ccb4e88aSToby Isaac   PetscInt         maxDexp, maxD, d;
11ccb4e88aSToby Isaac   PetscInt         Nbexp, Bsize, Dsize, Hsize;
12ccb4e88aSToby Isaac   PetscReal       *B, *D, *H;
13ccb4e88aSToby Isaac   PetscQuadrature  quad;
14ccb4e88aSToby Isaac   PetscInt         npoints;
15ccb4e88aSToby Isaac   const PetscReal *points;
16ccb4e88aSToby Isaac 
17ccb4e88aSToby Isaac   PetscFunctionBegin;
18*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceCreate(comm, &sp));
19*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)sp, "ptrimmed"));
20*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceSetType(sp, PETSCSPACEPTRIMMED));
21*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceSetNumVariables(sp, dim));
22*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDTBinomialInt(dim, PetscAbsInt(formDegree), &Nf));
23*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceSetNumComponents(sp, Nf * nCopies));
24*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceSetDegree(sp, degree, PETSC_DETERMINE));
25*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpacePTrimmedSetFormDegree(sp, formDegree));
26*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceSetUp(sp));
27*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceView(sp, NULL));
28ccb4e88aSToby Isaac 
29*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDTPTrimmedSize(dim, formDegree == 0 ? degree : degree + 1, PetscAbsInt(formDegree), &Nbexp));
30ccb4e88aSToby Isaac   Nbexp *= nCopies;
31*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceGetDimension(sp, &Nb));
322c71b3e2SJacob Faibussowitsch   PetscCheckFalse(Nb != Nbexp,comm, PETSC_ERR_PLIB, "Space dimension mismatch, %D != %D", Nbexp, Nb);
33ccb4e88aSToby Isaac 
34ccb4e88aSToby Isaac   maxDexp = (PetscAbsInt(formDegree) == dim || formDegree == 0) ? degree : degree + 1;
35*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceGetDegree(sp, &d, &maxD));
362c71b3e2SJacob Faibussowitsch   PetscCheckFalse(degree != d,comm, PETSC_ERR_PLIB, "Space degree mismatch, %D != %D", degree, d);
372c71b3e2SJacob Faibussowitsch   PetscCheckFalse(maxDexp != maxD,comm, PETSC_ERR_PLIB, "Space max degree mismatch, %D != %D", maxDexp, maxD);
38ccb4e88aSToby Isaac 
39*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDTStroudConicalQuadrature(dim, 1, maxD + 1, -1., 1., &quad));
40*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscQuadratureGetData(quad, NULL, NULL, &npoints, &points, NULL));
41ccb4e88aSToby Isaac 
42ccb4e88aSToby Isaac   Bsize = npoints * Nb * Nf * nCopies;
43ccb4e88aSToby Isaac   Dsize = dim * Bsize;
44ccb4e88aSToby Isaac   Hsize = dim * Dsize;
45*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc3(Bsize, &B, Dsize, &D, Hsize, &H));
46*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceEvaluate(sp, npoints, points, B, D, H));
47ccb4e88aSToby Isaac   for (PetscInt i = 0; i < Bsize; i++) {
482c71b3e2SJacob Faibussowitsch     PetscCheckFalse(PetscIsInfOrNanReal(B[i]),comm, PETSC_ERR_PLIB, "Bad value B[%D]", i);
49ccb4e88aSToby Isaac   }
50ccb4e88aSToby Isaac   for (PetscInt i = 0; i < Dsize; i++) {
512c71b3e2SJacob Faibussowitsch     PetscCheckFalse(PetscIsInfOrNanReal(D[i]),comm, PETSC_ERR_PLIB, "Bad value D[%D]", i);
52ccb4e88aSToby Isaac   }
53ccb4e88aSToby Isaac   for (PetscInt i = 0; i < Hsize; i++) {
542c71b3e2SJacob Faibussowitsch     PetscCheckFalse(PetscIsInfOrNanReal(H[i]),comm, PETSC_ERR_PLIB, "Bad value H[%H]", i);
55ccb4e88aSToby Isaac   }
56*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3(B, D, H));
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscQuadratureDestroy(&quad));
58*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSpaceDestroy(&sp));
59ccb4e88aSToby Isaac   PetscFunctionReturn(0);
60ccb4e88aSToby Isaac }
61ccb4e88aSToby Isaac 
62ccb4e88aSToby Isaac int main(int argc, char *argv[])
63ccb4e88aSToby Isaac {
64ccb4e88aSToby Isaac   PetscErrorCode ierr;
65ccb4e88aSToby Isaac 
66ccb4e88aSToby Isaac   ierr = PetscInitialize(&argc, &argv, NULL, help);if (ierr) return ierr;
67ccb4e88aSToby Isaac   for (PetscInt dim = 0; dim <= 3; dim++) {
68ccb4e88aSToby Isaac     for (PetscInt formDegree = -dim; formDegree <= dim; formDegree++) {
69ccb4e88aSToby Isaac       for (PetscInt degree = 0; degree <= 4; degree++) {
70ccb4e88aSToby Isaac         if (formDegree == 0 && degree == 0) continue;
71ccb4e88aSToby Isaac         for (PetscInt nCopies = 1; nCopies <= PetscMax(2,dim); nCopies++) {
72*5f80ce2aSJacob Faibussowitsch           CHKERRQ(test(dim, formDegree, degree, nCopies));
73ccb4e88aSToby Isaac         }
74ccb4e88aSToby Isaac       }
75ccb4e88aSToby Isaac     }
76ccb4e88aSToby Isaac   }
77ccb4e88aSToby Isaac   ierr = PetscFinalize();
78ccb4e88aSToby Isaac   return ierr;
79ccb4e88aSToby Isaac }
80ccb4e88aSToby Isaac 
81ccb4e88aSToby Isaac /*TEST
82ccb4e88aSToby Isaac 
83ccb4e88aSToby Isaac   test:
84ccb4e88aSToby Isaac 
85ccb4e88aSToby Isaac TEST*/
86