Actual source code: ex7.c

petsc-3.13.6 2020-09-29
Report Typos and Errors
  1: static char help[] = "Create a Plex sphere from quads and create a P1 section\n\n";

  3:  #include <petscdmplex.h>

  5: typedef struct {
  6:   PetscInt  dim;     /* Topological problem dimension */
  7:   PetscBool simplex; /* Mesh with simplices */
  8: } AppCtx;

 10: static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
 11: {

 15:   options->dim     = 2;
 16:   options->simplex = PETSC_FALSE;

 18:   PetscOptionsBegin(comm, "", "Sphere Mesh Options", "DMPLEX");
 19:   PetscOptionsRangeInt("-dim", "Problem dimension", "ex7.c", options->dim, &options->dim, NULL,1,3);
 20:   PetscOptionsBool("-simplex", "Use simplices, or tensor product cells", "ex7.c", options->simplex, &options->simplex, NULL);
 21:   PetscOptionsEnd();
 22:   return(0);
 23: }

 25: static PetscErrorCode ProjectToUnitSphere(DM dm)
 26: {
 27:   Vec            coordinates;
 28:   PetscScalar   *coords;
 29:   PetscInt       Nv, v, bs, dim, d;

 33:   DMGetCoordinatesLocal(dm, &coordinates);
 34:   VecGetLocalSize(coordinates, &Nv);
 35:   VecGetBlockSize(coordinates, &bs);
 36:   DMGetCoordinateDim(dm, &dim);
 37:   if (dim != bs) SETERRQ2(PetscObjectComm((PetscObject)dm),PETSC_ERR_PLIB,"Coordinate bs %D does not match dim %D",bs,dim);
 38:   Nv  /= dim;
 39:   VecGetArray(coordinates, &coords);
 40:   for (v = 0; v < Nv; ++v) {
 41:     PetscReal r = 0.0;

 43:     for (d = 0; d < dim; ++d) r += PetscSqr(PetscRealPart(coords[v*dim+d]));
 44:     r = PetscSqrtReal(r);
 45:     for (d = 0; d < dim; ++d) coords[v*dim+d] /= r;
 46:   }
 47:   VecRestoreArray(coordinates, &coords);
 48:   return(0);
 49: }

 51: static PetscErrorCode SetupSection(DM dm)
 52: {
 53:   PetscSection   s;
 54:   PetscInt       vStart, vEnd, v;

 58:   DMPlexGetDepthStratum(dm, 0, &vStart, &vEnd);
 59:   PetscSectionCreate(PetscObjectComm((PetscObject) dm), &s);
 60:   PetscSectionSetNumFields(s, 1);
 61:   PetscSectionSetFieldComponents(s, 0, 1);
 62:   PetscSectionSetChart(s, vStart, vEnd);
 63:   for (v = vStart; v < vEnd; ++v) {
 64:     PetscSectionSetDof(s, v, 1);
 65:     PetscSectionSetFieldDof(s, v, 0, 1);
 66:   }
 67:   PetscSectionSetUp(s);
 68:   DMSetLocalSection(dm, s);
 69:   PetscSectionDestroy(&s);
 70:   return(0);
 71: }

 73: int main(int argc, char **argv)
 74: {
 75:   DM             dm;
 76:   Vec            u;
 77:   AppCtx         ctx;

 80:   PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
 81:   ProcessOptions(PETSC_COMM_WORLD, &ctx);
 82:   DMPlexCreateSphereMesh(PETSC_COMM_WORLD, ctx.dim, ctx.simplex, &dm);
 83:   PetscObjectSetName((PetscObject) dm, "Sphere");
 84:   /* Distribute mesh over processes */
 85:   {
 86:      DM dmDist = NULL;
 87:      PetscPartitioner part;
 88:      DMPlexGetPartitioner(dm, &part);
 89:      PetscPartitionerSetFromOptions(part);
 90:      DMPlexDistribute(dm, 0, NULL, &dmDist);
 91:      if (dmDist) {
 92:        DMDestroy(&dm);
 93:        dm  = dmDist;
 94:      }
 95:   }
 96:   DMSetFromOptions(dm);
 97:   ProjectToUnitSphere(dm);
 98:   DMViewFromOptions(dm, NULL, "-dm_view");
 99:   SetupSection(dm);
100:   DMGetGlobalVector(dm, &u);
101:   VecSet(u, 2);
102:   VecViewFromOptions(u, NULL, "-vec_view");
103:   DMRestoreGlobalVector(dm, &u);
104:   DMDestroy(&dm);
105:   PetscFinalize();
106:   return ierr;
107: }

109: /*TEST

111:   test:
112:     suffix: 2d_quad
113:     requires: !__float128
114:     args: -dm_view

116:   test:
117:     suffix: 2d_quad_parallel
118:     requires: !__float128
119:     args: -dm_view -petscpartitioner_type simple
120:     nsize: 2

122:   test:
123:     suffix: 2d_tri
124:     requires: !__float128
125:     args: -simplex -dm_view

127:   test:
128:     suffix: 2d_tri_parallel
129:     requires: !__float128
130:     args: -simplex -dm_view -petscpartitioner_type simple
131:     nsize: 2

133:   test:
134:     suffix: 3d_tri
135:     requires: !__float128
136:     args: -dim 3 -simplex -dm_view

138:   test:
139:     suffix: 3d_tri_parallel
140:     requires: !__float128
141:     args: -dim 3 -simplex -dm_view -petscpartitioner_type simple
142:     nsize: 2

144: TEST*/