1c4762a1bSJed Brown static char help[] = "Tests DMGetCompatibility() with a 3D DMDA.\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscdm.h> 4c4762a1bSJed Brown #include <petscdmda.h> 5c4762a1bSJed Brown #include <petscdmstag.h> 6c4762a1bSJed Brown 7c4762a1bSJed Brown int main(int argc, char **argv) { 8c4762a1bSJed Brown PetscInt M = 3, N = 5, P = 3, s = 1, w = 2, i, m = PETSC_DECIDE, n = PETSC_DECIDE, p = PETSC_DECIDE; 9c4762a1bSJed Brown PetscInt *lx = NULL, *ly = NULL, *lz = NULL; 10c4762a1bSJed Brown PetscBool test_order = PETSC_FALSE; 11c4762a1bSJed Brown DM da; 12c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE, by = DM_BOUNDARY_NONE, bz = DM_BOUNDARY_NONE; 13c4762a1bSJed Brown DMDAStencilType stencil_type = DMDA_STENCIL_BOX; 14c4762a1bSJed Brown PetscBool flg = PETSC_FALSE, distribute = PETSC_FALSE; 15c4762a1bSJed Brown 16327415f7SBarry Smith PetscFunctionBeginUser; 179566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 18c4762a1bSJed Brown 19c4762a1bSJed Brown /* Read options */ 209566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-NX", &M, NULL)); 219566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-NY", &N, NULL)); 229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-NZ", &P, NULL)); 239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 249566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-p", &p, NULL)); 269566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-s", &s, NULL)); 279566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-w", &w, NULL)); 28c4762a1bSJed Brown flg = PETSC_FALSE; 299566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-star", &flg, NULL)); 30c4762a1bSJed Brown if (flg) stencil_type = DMDA_STENCIL_STAR; 31c4762a1bSJed Brown flg = PETSC_FALSE; 329566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-box", &flg, NULL)); 33c4762a1bSJed Brown if (flg) stencil_type = DMDA_STENCIL_BOX; 34c4762a1bSJed Brown 35c4762a1bSJed Brown flg = PETSC_FALSE; 369566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xperiodic", &flg, NULL)); 37c4762a1bSJed Brown if (flg) bx = DM_BOUNDARY_PERIODIC; 38c4762a1bSJed Brown flg = PETSC_FALSE; 399566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xghosted", &flg, NULL)); 40c4762a1bSJed Brown if (flg) bx = DM_BOUNDARY_GHOSTED; 41c4762a1bSJed Brown flg = PETSC_FALSE; 429566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xnonghosted", &flg, NULL)); 43c4762a1bSJed Brown 44c4762a1bSJed Brown flg = PETSC_FALSE; 459566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-yperiodic", &flg, NULL)); 46c4762a1bSJed Brown if (flg) by = DM_BOUNDARY_PERIODIC; 47c4762a1bSJed Brown flg = PETSC_FALSE; 489566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-yghosted", &flg, NULL)); 49c4762a1bSJed Brown if (flg) by = DM_BOUNDARY_GHOSTED; 50c4762a1bSJed Brown flg = PETSC_FALSE; 519566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-ynonghosted", &flg, NULL)); 52c4762a1bSJed Brown 53c4762a1bSJed Brown flg = PETSC_FALSE; 549566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-zperiodic", &flg, NULL)); 55c4762a1bSJed Brown if (flg) bz = DM_BOUNDARY_PERIODIC; 56c4762a1bSJed Brown flg = PETSC_FALSE; 579566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-zghosted", &flg, NULL)); 58c4762a1bSJed Brown if (flg) bz = DM_BOUNDARY_GHOSTED; 59c4762a1bSJed Brown flg = PETSC_FALSE; 609566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-znonghosted", &flg, NULL)); 61c4762a1bSJed Brown 629566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testorder", &test_order, NULL)); 63c4762a1bSJed Brown 64c4762a1bSJed Brown flg = PETSC_FALSE; 659566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-distribute", &distribute, NULL)); 66c4762a1bSJed Brown if (distribute) { 6708401ef6SPierre Jolivet PetscCheck(m != PETSC_DECIDE, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must set -m option with -distribute option"); 689566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(m, &lx)); 69c4762a1bSJed Brown for (i = 0; i < m - 1; i++) lx[i] = 4; 70c4762a1bSJed Brown lx[m - 1] = M - 4 * (m - 1); 7108401ef6SPierre Jolivet PetscCheck(n != PETSC_DECIDE, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must set -n option with -distribute option"); 729566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &ly)); 73c4762a1bSJed Brown for (i = 0; i < n - 1; i++) ly[i] = 2; 74c4762a1bSJed Brown ly[n - 1] = N - 2 * (n - 1); 7508401ef6SPierre Jolivet PetscCheck(p != PETSC_DECIDE, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must set -p option with -distribute option"); 769566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(p, &lz)); 77c4762a1bSJed Brown for (i = 0; i < p - 1; i++) lz[i] = 2; 78c4762a1bSJed Brown lz[p - 1] = P - 2 * (p - 1); 79c4762a1bSJed Brown } 80c4762a1bSJed Brown 819566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz, &da)); 829566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 839566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 84c4762a1bSJed Brown 85c4762a1bSJed Brown /* Check self-compatibility */ 86c4762a1bSJed Brown { 87c4762a1bSJed Brown PetscBool compatible, set; 889566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da, &compatible, &set)); 89*48a46eb9SPierre Jolivet if (!set || !compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not compatible with itself\n")); 90c4762a1bSJed Brown } 91c4762a1bSJed Brown 92c4762a1bSJed Brown /* Check compatibility with the same DM on a dup'd communicator */ 93c4762a1bSJed Brown { 94c4762a1bSJed Brown DM da2; 95c4762a1bSJed Brown PetscBool compatible, set; 96c4762a1bSJed Brown MPI_Comm comm2; 979566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_dup(PETSC_COMM_WORLD, &comm2)); 989566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(comm2, bx, by, bz, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz, &da2)); 999566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da2)); 1009566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1019566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 102*48a46eb9SPierre Jolivet if (!set || !compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not compatible with DMDA on dup'd comm\n")); 1039566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 1049566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_free(&comm2)); 105c4762a1bSJed Brown } 106c4762a1bSJed Brown 107c4762a1bSJed Brown /* Check compatibility with a derived DMDA */ 108c4762a1bSJed Brown { 109c4762a1bSJed Brown DM da2; 110c4762a1bSJed Brown PetscBool compatible, set; 1119566063dSJacob Faibussowitsch PetscCall(DMDACreateCompatibleDMDA(da, w * 2, &da2)); 1129566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 113*48a46eb9SPierre Jolivet if (!set || !compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not compatible with DMDA created with DMDACreateCompatibleDMDA()\n")); 1149566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 115c4762a1bSJed Brown } 116c4762a1bSJed Brown 117c4762a1bSJed Brown /* Confirm incompatibility with different stencil width */ 118c4762a1bSJed Brown { 119c4762a1bSJed Brown DM da2; 120c4762a1bSJed Brown PetscBool compatible, set; 1219566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, w, 0, lx, ly, lz, &da2)); 1229566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1239566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 124*48a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different stencil width)\n")); 1259566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 126c4762a1bSJed Brown } 127c4762a1bSJed Brown 128c4762a1bSJed Brown /* Confirm incompatibility with different boundary types */ 129c4762a1bSJed Brown { 130c4762a1bSJed Brown DM da2; 131c4762a1bSJed Brown PetscBool compatible, set; 132c4762a1bSJed Brown DMBoundaryType bz2; 133c4762a1bSJed Brown bz2 = bz == DM_BOUNDARY_NONE ? DM_BOUNDARY_GHOSTED : DM_BOUNDARY_NONE; 1349566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz2, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz, &da2)); 1359566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1369566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 137*48a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different boundary type)\n")); 1389566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 139c4762a1bSJed Brown } 140c4762a1bSJed Brown 141c4762a1bSJed Brown if (!distribute) { 142c4762a1bSJed Brown /* Confirm incompatibility with different global sizes */ 143c4762a1bSJed Brown { 144c4762a1bSJed Brown DM da2; 145c4762a1bSJed Brown PetscBool compatible, set; 1469566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P * 2, m, n, p, w, s, lx, ly, lz, &da2)); 1479566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1489566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 149*48a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different global sizes)\n")); 1509566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 151c4762a1bSJed Brown } 152c4762a1bSJed Brown } 153c4762a1bSJed Brown 154c4762a1bSJed Brown if (distribute && p > 1) { 155c4762a1bSJed Brown /* Confirm incompatibility with different local size */ 156c4762a1bSJed Brown { 157c4762a1bSJed Brown DM da2; 158c4762a1bSJed Brown PetscBool compatible, set; 159c4762a1bSJed Brown PetscMPIInt rank; 160c4762a1bSJed Brown PetscInt *lz2; 1619566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(p, &lz2)); 162c4762a1bSJed Brown for (i = 0; i < p - 1; i++) lz2[i] = 1; /* One point per rank instead of 2 */ 163c4762a1bSJed Brown lz2[p - 1] = P - (p - 1); 1649566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 1659566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz2, &da2)); 1669566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1679566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 168*48a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different local sizes) \n")); 1699566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 1709566063dSJacob Faibussowitsch PetscCall(PetscFree(lz2)); 171c4762a1bSJed Brown } 172c4762a1bSJed Brown } 173c4762a1bSJed Brown 174c4762a1bSJed Brown /* Check compatibility with a DM of different type (DMStag) */ 175c4762a1bSJed Brown { 176c4762a1bSJed Brown DM dm2; 177c4762a1bSJed Brown PetscBool compatible, set; 1789566063dSJacob Faibussowitsch PetscCall(DMStagCreate3d(PETSC_COMM_WORLD, bx, by, bz, M, N, P, m, n, p, 1, 1, 1, 1, DMSTAG_STENCIL_STAR, w, lx, ly, lz, &dm2)); 1799566063dSJacob Faibussowitsch PetscCall(DMSetUp(dm2)); 1809566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, dm2, &compatible, &set)); 181c4762a1bSJed Brown /* Don't interpret the result, but note that one can run with -info */ 1829566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm2)); 183c4762a1bSJed Brown } 184c4762a1bSJed Brown 185c4762a1bSJed Brown /* Free memory */ 1869566063dSJacob Faibussowitsch PetscCall(PetscFree(lx)); 1879566063dSJacob Faibussowitsch PetscCall(PetscFree(ly)); 1889566063dSJacob Faibussowitsch PetscCall(PetscFree(lz)); 1899566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 1909566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 191b122ec5aSJacob Faibussowitsch return 0; 192c4762a1bSJed Brown } 193c4762a1bSJed Brown 194c4762a1bSJed Brown /*TEST 195c4762a1bSJed Brown 196c4762a1bSJed Brown test: 197c4762a1bSJed Brown suffix: 1 198c4762a1bSJed Brown 199c4762a1bSJed Brown test: 200c4762a1bSJed Brown suffix: 2 201c4762a1bSJed Brown nsize: 3 202660278c0SBarry Smith args: -distribute -m 1 -n 1 -p 3 -NZ 20 203c4762a1bSJed Brown 204c4762a1bSJed Brown TEST*/ 205