xref: /petsc/src/dm/dt/space/impls/ptrimmed/tests/ex1.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
1ccb4e88aSToby Isaac const char help[] = "Test basic creation and evaluation of PETSCSPACEPTRIMMED";
2ccb4e88aSToby Isaac 
3ccb4e88aSToby Isaac #include <petscfe.h>
4ccb4e88aSToby Isaac 
59371c9d4SSatish Balay static PetscErrorCode test(PetscInt dim, PetscInt formDegree, PetscInt degree, PetscInt nCopies) {
6ccb4e88aSToby Isaac   MPI_Comm         comm = PETSC_COMM_SELF;
7ccb4e88aSToby Isaac   PetscSpace       sp;
8ccb4e88aSToby Isaac   PetscInt         Nf, Nb;
9ccb4e88aSToby Isaac   PetscInt         maxDexp, maxD, d;
10ccb4e88aSToby Isaac   PetscInt         Nbexp, Bsize, Dsize, Hsize;
11ccb4e88aSToby Isaac   PetscReal       *B, *D, *H;
12ccb4e88aSToby Isaac   PetscQuadrature  quad;
13ccb4e88aSToby Isaac   PetscInt         npoints;
14ccb4e88aSToby Isaac   const PetscReal *points;
15ccb4e88aSToby Isaac 
16ccb4e88aSToby Isaac   PetscFunctionBegin;
179566063dSJacob Faibussowitsch   PetscCall(PetscSpaceCreate(comm, &sp));
189566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)sp, "ptrimmed"));
199566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetType(sp, PETSCSPACEPTRIMMED));
209566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetNumVariables(sp, dim));
219566063dSJacob Faibussowitsch   PetscCall(PetscDTBinomialInt(dim, PetscAbsInt(formDegree), &Nf));
229566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetNumComponents(sp, Nf * nCopies));
239566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetDegree(sp, degree, PETSC_DETERMINE));
249566063dSJacob Faibussowitsch   PetscCall(PetscSpacePTrimmedSetFormDegree(sp, formDegree));
259566063dSJacob Faibussowitsch   PetscCall(PetscSpaceSetUp(sp));
269566063dSJacob Faibussowitsch   PetscCall(PetscSpaceView(sp, NULL));
27ccb4e88aSToby Isaac 
289566063dSJacob Faibussowitsch   PetscCall(PetscDTPTrimmedSize(dim, formDegree == 0 ? degree : degree + 1, PetscAbsInt(formDegree), &Nbexp));
29ccb4e88aSToby Isaac   Nbexp *= nCopies;
309566063dSJacob Faibussowitsch   PetscCall(PetscSpaceGetDimension(sp, &Nb));
3163a3b9bcSJacob Faibussowitsch   PetscCheck(Nb == Nbexp, comm, PETSC_ERR_PLIB, "Space dimension mismatch, %" PetscInt_FMT " != %" PetscInt_FMT, Nbexp, Nb);
32ccb4e88aSToby Isaac 
33ccb4e88aSToby Isaac   maxDexp = (PetscAbsInt(formDegree) == dim || formDegree == 0) ? degree : degree + 1;
349566063dSJacob Faibussowitsch   PetscCall(PetscSpaceGetDegree(sp, &d, &maxD));
3563a3b9bcSJacob Faibussowitsch   PetscCheck(degree == d, comm, PETSC_ERR_PLIB, "Space degree mismatch, %" PetscInt_FMT " != %" PetscInt_FMT, degree, d);
3663a3b9bcSJacob Faibussowitsch   PetscCheck(maxDexp == maxD, comm, PETSC_ERR_PLIB, "Space max degree mismatch, %" PetscInt_FMT " != %" PetscInt_FMT, maxDexp, maxD);
37ccb4e88aSToby Isaac 
389566063dSJacob Faibussowitsch   PetscCall(PetscDTStroudConicalQuadrature(dim, 1, maxD + 1, -1., 1., &quad));
399566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureGetData(quad, NULL, NULL, &npoints, &points, NULL));
40ccb4e88aSToby Isaac 
41ccb4e88aSToby Isaac   Bsize = npoints * Nb * Nf * nCopies;
42ccb4e88aSToby Isaac   Dsize = dim * Bsize;
43ccb4e88aSToby Isaac   Hsize = dim * Dsize;
449566063dSJacob Faibussowitsch   PetscCall(PetscMalloc3(Bsize, &B, Dsize, &D, Hsize, &H));
459566063dSJacob Faibussowitsch   PetscCall(PetscSpaceEvaluate(sp, npoints, points, B, D, H));
469371c9d4SSatish Balay   for (PetscInt i = 0; i < Bsize; i++) { PetscCheck(!PetscIsInfOrNanReal(B[i]), comm, PETSC_ERR_PLIB, "Bad value B[%" PetscInt_FMT "]", i); }
479371c9d4SSatish Balay   for (PetscInt i = 0; i < Dsize; i++) { PetscCheck(!PetscIsInfOrNanReal(D[i]), comm, PETSC_ERR_PLIB, "Bad value D[%" PetscInt_FMT "]", i); }
489371c9d4SSatish Balay   for (PetscInt i = 0; i < Hsize; i++) { PetscCheck(!PetscIsInfOrNanReal(H[i]), comm, PETSC_ERR_PLIB, "Bad value H[%" PetscInt_FMT "]", i); }
499566063dSJacob Faibussowitsch   PetscCall(PetscFree3(B, D, H));
509566063dSJacob Faibussowitsch   PetscCall(PetscQuadratureDestroy(&quad));
519566063dSJacob Faibussowitsch   PetscCall(PetscSpaceDestroy(&sp));
52ccb4e88aSToby Isaac   PetscFunctionReturn(0);
53ccb4e88aSToby Isaac }
54ccb4e88aSToby Isaac 
559371c9d4SSatish Balay int main(int argc, char *argv[]) {
56327415f7SBarry Smith   PetscFunctionBeginUser;
579566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
58ccb4e88aSToby Isaac   for (PetscInt dim = 0; dim <= 3; dim++) {
59ccb4e88aSToby Isaac     for (PetscInt formDegree = -dim; formDegree <= dim; formDegree++) {
60ccb4e88aSToby Isaac       for (PetscInt degree = 0; degree <= 4; degree++) {
61ccb4e88aSToby Isaac         if (formDegree == 0 && degree == 0) continue;
62*48a46eb9SPierre Jolivet         for (PetscInt nCopies = 1; nCopies <= PetscMax(2, dim); nCopies++) PetscCall(test(dim, formDegree, degree, nCopies));
63ccb4e88aSToby Isaac       }
64ccb4e88aSToby Isaac     }
65ccb4e88aSToby Isaac   }
669566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
67b122ec5aSJacob Faibussowitsch   return 0;
68ccb4e88aSToby Isaac }
69ccb4e88aSToby Isaac 
70ccb4e88aSToby Isaac /*TEST
71ccb4e88aSToby Isaac 
72ccb4e88aSToby Isaac   test:
73ccb4e88aSToby Isaac 
74ccb4e88aSToby Isaac TEST*/
75