1605a06ccSksagiyam static char help[] = "Tests for submesh with both CG and DG coordinates\n\n"; 2605a06ccSksagiyam 3605a06ccSksagiyam #include <petscdmplex.h> 4605a06ccSksagiyam #include <petsc/private/dmimpl.h> 5605a06ccSksagiyam 6605a06ccSksagiyam int main(int argc, char **argv) 7605a06ccSksagiyam { 8605a06ccSksagiyam PetscInt dim = 1, d, cStart, cEnd, c, q, degree = 2, coordSize, offset; 9605a06ccSksagiyam PetscReal R = 1.0; 10605a06ccSksagiyam DM dm, coordDM, subdm; 11605a06ccSksagiyam PetscSection coordSec; 12605a06ccSksagiyam Vec coordVec; 13605a06ccSksagiyam PetscScalar *coords; 14605a06ccSksagiyam DMLabel filter; 15605a06ccSksagiyam const PetscInt filterValue = 1; 16605a06ccSksagiyam MPI_Comm comm; 17605a06ccSksagiyam PetscMPIInt size; 18605a06ccSksagiyam 19605a06ccSksagiyam PetscFunctionBeginUser; 20605a06ccSksagiyam PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 21605a06ccSksagiyam comm = PETSC_COMM_WORLD; 22605a06ccSksagiyam PetscCallMPI(MPI_Comm_size(comm, &size)); 23605a06ccSksagiyam if (size != 1) { 24605a06ccSksagiyam PetscCall(PetscPrintf(comm, "This example is specifically designed for comm size == 1.\n")); 25605a06ccSksagiyam PetscCall(PetscFinalize()); 26605a06ccSksagiyam return 0; 27605a06ccSksagiyam } 28605a06ccSksagiyam /* Make a unit circle with 16 elements. */ 29605a06ccSksagiyam PetscCall(DMPlexCreateSphereMesh(comm, dim, PETSC_TRUE, R, &dm)); 30605a06ccSksagiyam PetscUseTypeMethod(dm, createcellcoordinatedm, &coordDM); 31605a06ccSksagiyam PetscCall(DMSetCellCoordinateDM(dm, coordDM)); 32605a06ccSksagiyam PetscCall(DMDestroy(&coordDM)); 33605a06ccSksagiyam PetscCall(DMGetCellCoordinateSection(dm, &coordSec)); 34605a06ccSksagiyam PetscCall(PetscSectionSetNumFields(coordSec, 1)); 35605a06ccSksagiyam PetscCall(PetscSectionSetFieldComponents(coordSec, 0, dim)); 36605a06ccSksagiyam PetscCall(DMPlexGetHeightStratum(dm, 0, &cStart, &cEnd)); 37605a06ccSksagiyam PetscCall(PetscSectionSetChart(coordSec, cStart, cEnd)); 38605a06ccSksagiyam for (c = cStart; c < cEnd; ++c) { 39605a06ccSksagiyam PetscCall(PetscSectionSetDof(coordSec, c, dim * (degree + 1))); 40605a06ccSksagiyam PetscCall(PetscSectionSetFieldDof(coordSec, c, 0, dim * (degree + 1))); 41605a06ccSksagiyam } 42605a06ccSksagiyam PetscCall(PetscSectionSetUp(coordSec)); 43605a06ccSksagiyam PetscCall(PetscSectionGetStorageSize(coordSec, &coordSize)); 44605a06ccSksagiyam PetscCall(VecCreate(PETSC_COMM_SELF, &coordVec)); 45605a06ccSksagiyam PetscCall(PetscObjectSetName((PetscObject)coordVec, "cellcoordinates")); 46605a06ccSksagiyam PetscCall(VecSetBlockSize(coordVec, dim)); 47605a06ccSksagiyam PetscCall(VecSetSizes(coordVec, coordSize, PETSC_DETERMINE)); 48605a06ccSksagiyam PetscCall(VecSetType(coordVec, VECSTANDARD)); 49605a06ccSksagiyam PetscCall(VecGetArray(coordVec, &coords)); 50605a06ccSksagiyam for (c = cStart; c < cEnd; ++c) { 51605a06ccSksagiyam PetscCall(PetscSectionGetOffset(coordSec, c, &offset)); 52605a06ccSksagiyam for (q = 0; q < degree + 1; ++q) { 53605a06ccSksagiyam /* Make some DG coordinates. Note that dim = 1.*/ 54605a06ccSksagiyam for (d = 0; d < dim; ++d) coords[offset + dim * q + d] = 100. + (PetscScalar)c + (1.0 / (PetscScalar)degree) * (PetscScalar)q; 55605a06ccSksagiyam } 56605a06ccSksagiyam } 57605a06ccSksagiyam PetscCall(VecRestoreArray(coordVec, &coords)); 58605a06ccSksagiyam PetscCall(DMSetCellCoordinatesLocal(dm, coordVec)); 59605a06ccSksagiyam PetscCall(VecDestroy(&coordVec)); 60605a06ccSksagiyam /* Make submesh. */ 61605a06ccSksagiyam PetscCall(DMLabelCreate(PETSC_COMM_SELF, "filter", &filter)); 62605a06ccSksagiyam PetscCall(DMLabelSetValue(filter, 15, filterValue)); /* last cell */ 63*71f1c950SStefano Zampini PetscCall(DMPlexFilter(dm, filter, filterValue, PETSC_FALSE, PETSC_FALSE, PetscObjectComm((PetscObject)dm), NULL, &subdm)); 64605a06ccSksagiyam PetscCall(DMLabelDestroy(&filter)); 65605a06ccSksagiyam PetscCall(PetscObjectSetName((PetscObject)subdm, "Example_SubDM")); 66605a06ccSksagiyam PetscCall(DMViewFromOptions(subdm, NULL, "-dm_view")); 67605a06ccSksagiyam PetscCall(DMDestroy(&subdm)); 68605a06ccSksagiyam PetscCall(DMDestroy(&dm)); 69605a06ccSksagiyam PetscCall(PetscFinalize()); 70605a06ccSksagiyam return 0; 71605a06ccSksagiyam } 72605a06ccSksagiyam 73605a06ccSksagiyam /*TEST 74605a06ccSksagiyam 75605a06ccSksagiyam test: 76605a06ccSksagiyam suffix: 0 77605a06ccSksagiyam args: -dm_view ascii::ascii_info_detail 78605a06ccSksagiyam 79605a06ccSksagiyam TEST*/ 80