Date: 2022-08-02T03:14:26+00:00

Actual source code: ex51.c

      1: static char help[] = "Tests DMDAVecGetArrayDOF()\n";
      2: #include <petscdm.h>
      3: #include <petscdmda.h>

      5: int main(int argc, char *argv[])
      6: {
      7:   DM             da, daX, daY;
      8:   DMDALocalInfo  info;
      9:   MPI_Comm       commX, commY;
     10:   Vec            basisX, basisY;
     11:   PetscScalar    **arrayX, **arrayY;
     12:   const PetscInt *lx, *ly;
     13:   PetscInt       M     = 3, N = 3;
     14:   PetscInt       p     = 1;
     15:   PetscInt       numGP = 3;
     16:   PetscInt       dof   = 2*(p+1)*numGP;
     17:   PetscMPIInt    rank, subsize, subrank;

     19:   PetscInitialize(&argc,&argv,0,help);
     20:   MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
     21:   /* Create 2D DMDA */
     22:   DMDACreate2d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,M,N,PETSC_DECIDE,PETSC_DECIDE,1,1,NULL,NULL,&da);
     23:   DMSetFromOptions(da);
     24:   DMSetUp(da);
     25:   /* Create 1D DMDAs along two directions. */
     26:   DMDAGetOwnershipRanges(da, &lx, &ly, NULL);
     27:   DMDAGetLocalInfo(da, &info);
     28:   /* Partitioning in the X direction makes a subcomm extending in the Y direction and vice-versa. */
     29:   DMDAGetProcessorSubsets(da, DM_X, &commY);
     30:   DMDAGetProcessorSubsets(da, DM_Y, &commX);
     31:   MPI_Comm_size(commX, &subsize);
     32:   MPI_Comm_rank(commX, &subrank);
     33:   PetscSynchronizedPrintf(PETSC_COMM_WORLD, "[%d]X subrank: %d subsize: %d\n", rank, subrank, subsize);
     34:   PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);
     35:   MPI_Comm_size(commY, &subsize);
     36:   MPI_Comm_rank(commY, &subrank);
     37:   PetscSynchronizedPrintf(PETSC_COMM_WORLD, "[%d]Y subrank: %d subsize: %d\n", rank, subrank, subsize);
     38:   PetscSynchronizedFlush(PETSC_COMM_WORLD,PETSC_STDOUT);
     39:   DMDACreate1d(commX, DM_BOUNDARY_NONE, info.mx, dof, 1, lx, &daX);
     40:   DMSetUp(daX);
     41:   DMDACreate1d(commY, DM_BOUNDARY_NONE, info.my, dof, 1, ly, &daY);
     42:   DMSetUp(daY);
     43:   /* Create 1D vectors for basis functions */
     44:   DMGetGlobalVector(daX, &basisX);
     45:   DMGetGlobalVector(daY, &basisY);
     46:   /* Extract basis functions */
     47:   DMDAVecGetArrayDOF(daX, basisX, &arrayX);
     48:   DMDAVecGetArrayDOF(daY, basisY, &arrayY);
     49:   /*arrayX[i][ndof]; */
     50:   /*arrayY[j][ndof]; */
     51:   DMDAVecRestoreArrayDOF(daX, basisX, &arrayX);
     52:   DMDAVecRestoreArrayDOF(daY, basisY, &arrayY);
     53:   /* Return basis vectors */
     54:   DMRestoreGlobalVector(daX, &basisX);
     55:   DMRestoreGlobalVector(daY, &basisY);
     56:   /* Cleanup */
     57:   MPI_Comm_free(&commX);
     58:   MPI_Comm_free(&commY);
     59:   DMDestroy(&daX);
     60:   DMDestroy(&daY);
     61:   DMDestroy(&da);
     62:   PetscFinalize();
     63:   return 0;
     64: }

     66: /*TEST

     68:    test:
     69:       nsize: 2

     71: TEST*/