1ccb4e88aSToby Isaac const char help[] = "Test basic creation and evaluation of PETSCSPACEPTRIMMED"; 2ccb4e88aSToby Isaac 3ccb4e88aSToby Isaac #include <petscfe.h> 4ccb4e88aSToby Isaac 5*9371c9d4SSatish 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)); 46*9371c9d4SSatish Balay for (PetscInt i = 0; i < Bsize; i++) { PetscCheck(!PetscIsInfOrNanReal(B[i]), comm, PETSC_ERR_PLIB, "Bad value B[%" PetscInt_FMT "]", i); } 47*9371c9d4SSatish Balay for (PetscInt i = 0; i < Dsize; i++) { PetscCheck(!PetscIsInfOrNanReal(D[i]), comm, PETSC_ERR_PLIB, "Bad value D[%" PetscInt_FMT "]", i); } 48*9371c9d4SSatish 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 55*9371c9d4SSatish 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*9371c9d4SSatish Balay 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