Actual source code: ex14.c

  1: static char help[] = "Test DMClone_Stag()\n\n";

  3: #include <petscdm.h>
  4: #include <petscdmstag.h>

  6: int main(int argc, char **argv)
  7: {
  8:   DM        dm, dm2;
  9:   PetscInt  dim;
 10:   PetscBool flg, setSizes;

 12:   /* Create a DMStag object */
 13:   PetscFunctionBeginUser;
 14:   PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
 15:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-dim", &dim, &flg));
 16:   PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Supply -dim option with value 1, 2, or 3");
 17:   setSizes = PETSC_FALSE;
 18:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-setsizes", &setSizes, NULL));
 19:   if (setSizes) {
 20:     PetscMPIInt size;
 21:     PetscInt    lx[4] = {2, 3}, ranksx = 2, mx = 5;
 22:     PetscInt    ly[3] = {3, 8, 2}, ranksy = 3, my = 13;
 23:     PetscInt    lz[2] = {2, 4}, ranksz = 2, mz = 6;

 25:     PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
 26:     switch (dim) {
 27:     case 1:
 28:       PetscCheck(size == ranksx, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 1 -setSizes", ranksx);
 29:       PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, mx, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, &dm));
 30:       break;
 31:     case 2:
 32:       PetscCheck(size == ranksx * ranksy, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 2 -setSizes", ranksx * ranksy);
 33:       PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, mx, my, ranksx, ranksy, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, ly, &dm));
 34:       break;
 35:     case 3:
 36:       PetscCheck(size == ranksx * ranksy * ranksz, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG, "Must run on %" PetscInt_FMT " ranks with -dim 3 -setSizes", ranksx * ranksy * ranksz);
 37:       PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, mx, my, mz, ranksx, ranksy, ranksz, 1, 1, 1, 1, DMSTAG_STENCIL_BOX, 1, lx, ly, lz, &dm));
 38:       break;
 39:     default:
 40:       SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "No support for dimension %" PetscInt_FMT, dim);
 41:     }
 42:   } else {
 43:     if (dim == 1) {
 44:       PetscCall(DMStagCreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, 2, 2, 3, DMSTAG_STENCIL_BOX, 1, NULL, &dm));
 45:     } else if (dim == 2) {
 46:       PetscCall(DMStagCreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 2, 2, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, DMSTAG_STENCIL_BOX, 1, NULL, NULL, &dm));
 47:     } else if (dim == 3) {
 48:       PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, 2, 2, 2, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 2, 3, 4, 5, DMSTAG_STENCIL_BOX, 1, NULL, NULL, NULL, &dm));
 49:     } else {
 50:       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Supply -dim option with value 1, 2, or 3\n"));
 51:       return 1;
 52:     }
 53:   }
 54:   PetscCall(DMSetFromOptions(dm));
 55:   PetscCall(DMSetUp(dm));
 56:   PetscCall(DMView(dm, PETSC_VIEWER_STDOUT_WORLD));

 58:   /* Create a cloned DMStag object */
 59:   PetscCall(DMClone(dm, &dm2));
 60:   PetscCall(DMView(dm2, PETSC_VIEWER_STDOUT_WORLD));

 62:   PetscCall(DMDestroy(&dm));
 63:   PetscCall(DMDestroy(&dm2));
 64:   PetscCall(PetscFinalize());
 65:   return 0;
 66: }

 68: /*TEST

 70:    test:
 71:       suffix: 1
 72:       nsize: 1
 73:       args: -dim 1

 75:    test:
 76:       suffix: 2
 77:       nsize: 4
 78:       args: -dim 2

 80:    test:
 81:       suffix: 3
 82:       nsize: 6
 83:       args: -dim 3 -stag_grid_x 3 -stag_grid_y 2 -stag_grid_z 1

 85:    test:
 86:       suffix: 4
 87:       nsize: 2
 88:       args: -dim 1 -setsizes

 90:    test:
 91:       suffix: 5
 92:       nsize: 6
 93:       args: -dim 2 -setsizes

 95:    test:
 96:       suffix: 6
 97:       nsize: 12
 98:       args: -dim 3 -setsizes

100: TEST*/