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; 185f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceCreate(comm, &sp)); 195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetName((PetscObject)sp, "ptrimmed")); 205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceSetType(sp, PETSCSPACEPTRIMMED)); 215f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceSetNumVariables(sp, dim)); 225f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDTBinomialInt(dim, PetscAbsInt(formDegree), &Nf)); 235f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceSetNumComponents(sp, Nf * nCopies)); 245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceSetDegree(sp, degree, PETSC_DETERMINE)); 255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpacePTrimmedSetFormDegree(sp, formDegree)); 265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceSetUp(sp)); 275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceView(sp, NULL)); 28ccb4e88aSToby Isaac 295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDTPTrimmedSize(dim, formDegree == 0 ? degree : degree + 1, PetscAbsInt(formDegree), &Nbexp)); 30ccb4e88aSToby Isaac Nbexp *= nCopies; 315f80ce2aSJacob 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; 355f80ce2aSJacob 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 395f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDTStroudConicalQuadrature(dim, 1, maxD + 1, -1., 1., &quad)); 405f80ce2aSJacob 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; 455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc3(Bsize, &B, Dsize, &D, Hsize, &H)); 465f80ce2aSJacob 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 } 565f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree3(B, D, H)); 575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscQuadratureDestroy(&quad)); 585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSpaceDestroy(&sp)); 59ccb4e88aSToby Isaac PetscFunctionReturn(0); 60ccb4e88aSToby Isaac } 61ccb4e88aSToby Isaac 62ccb4e88aSToby Isaac int main(int argc, char *argv[]) 63ccb4e88aSToby Isaac { 64ccb4e88aSToby Isaac 65*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc, &argv, NULL, help)); 66ccb4e88aSToby Isaac for (PetscInt dim = 0; dim <= 3; dim++) { 67ccb4e88aSToby Isaac for (PetscInt formDegree = -dim; formDegree <= dim; formDegree++) { 68ccb4e88aSToby Isaac for (PetscInt degree = 0; degree <= 4; degree++) { 69ccb4e88aSToby Isaac if (formDegree == 0 && degree == 0) continue; 70ccb4e88aSToby Isaac for (PetscInt nCopies = 1; nCopies <= PetscMax(2,dim); nCopies++) { 715f80ce2aSJacob Faibussowitsch CHKERRQ(test(dim, formDegree, degree, nCopies)); 72ccb4e88aSToby Isaac } 73ccb4e88aSToby Isaac } 74ccb4e88aSToby Isaac } 75ccb4e88aSToby Isaac } 76*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 77*b122ec5aSJacob Faibussowitsch return 0; 78ccb4e88aSToby Isaac } 79ccb4e88aSToby Isaac 80ccb4e88aSToby Isaac /*TEST 81ccb4e88aSToby Isaac 82ccb4e88aSToby Isaac test: 83ccb4e88aSToby Isaac 84ccb4e88aSToby Isaac TEST*/ 85