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 7d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 8d71ae5a4SJacob Faibussowitsch { 9c4762a1bSJed Brown PetscInt M = 3, N = 5, P = 3, s = 1, w = 2, i, m = PETSC_DECIDE, n = PETSC_DECIDE, p = PETSC_DECIDE; 10c4762a1bSJed Brown PetscInt *lx = NULL, *ly = NULL, *lz = NULL; 11c4762a1bSJed Brown PetscBool test_order = PETSC_FALSE; 12c4762a1bSJed Brown DM da; 13c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE, by = DM_BOUNDARY_NONE, bz = DM_BOUNDARY_NONE; 14c4762a1bSJed Brown DMDAStencilType stencil_type = DMDA_STENCIL_BOX; 15c4762a1bSJed Brown PetscBool flg = PETSC_FALSE, distribute = PETSC_FALSE; 16c4762a1bSJed Brown 17327415f7SBarry Smith PetscFunctionBeginUser; 18c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 19c4762a1bSJed Brown 20c4762a1bSJed Brown /* Read options */ 219566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-NX", &M, NULL)); 229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-NY", &N, NULL)); 239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-NZ", &P, NULL)); 249566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL)); 259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL)); 269566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-p", &p, NULL)); 279566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-s", &s, NULL)); 289566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-w", &w, NULL)); 29c4762a1bSJed Brown flg = PETSC_FALSE; 309566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-star", &flg, NULL)); 31c4762a1bSJed Brown if (flg) stencil_type = DMDA_STENCIL_STAR; 32c4762a1bSJed Brown flg = PETSC_FALSE; 339566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-box", &flg, NULL)); 34c4762a1bSJed Brown if (flg) stencil_type = DMDA_STENCIL_BOX; 35c4762a1bSJed Brown 36c4762a1bSJed Brown flg = PETSC_FALSE; 379566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xperiodic", &flg, NULL)); 38c4762a1bSJed Brown if (flg) bx = DM_BOUNDARY_PERIODIC; 39c4762a1bSJed Brown flg = PETSC_FALSE; 409566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xghosted", &flg, NULL)); 41c4762a1bSJed Brown if (flg) bx = DM_BOUNDARY_GHOSTED; 42c4762a1bSJed Brown flg = PETSC_FALSE; 439566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-xnonghosted", &flg, NULL)); 44c4762a1bSJed Brown 45c4762a1bSJed Brown flg = PETSC_FALSE; 469566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-yperiodic", &flg, NULL)); 47c4762a1bSJed Brown if (flg) by = DM_BOUNDARY_PERIODIC; 48c4762a1bSJed Brown flg = PETSC_FALSE; 499566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-yghosted", &flg, NULL)); 50c4762a1bSJed Brown if (flg) by = DM_BOUNDARY_GHOSTED; 51c4762a1bSJed Brown flg = PETSC_FALSE; 529566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-ynonghosted", &flg, NULL)); 53c4762a1bSJed Brown 54c4762a1bSJed Brown flg = PETSC_FALSE; 559566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-zperiodic", &flg, NULL)); 56c4762a1bSJed Brown if (flg) bz = DM_BOUNDARY_PERIODIC; 57c4762a1bSJed Brown flg = PETSC_FALSE; 589566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-zghosted", &flg, NULL)); 59c4762a1bSJed Brown if (flg) bz = DM_BOUNDARY_GHOSTED; 60c4762a1bSJed Brown flg = PETSC_FALSE; 619566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-znonghosted", &flg, NULL)); 62c4762a1bSJed Brown 639566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-testorder", &test_order, NULL)); 64c4762a1bSJed Brown 65c4762a1bSJed Brown flg = PETSC_FALSE; 669566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-distribute", &distribute, NULL)); 67c4762a1bSJed Brown if (distribute) { 6808401ef6SPierre Jolivet PetscCheck(m != PETSC_DECIDE, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must set -m option with -distribute option"); 699566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(m, &lx)); 70c4762a1bSJed Brown for (i = 0; i < m - 1; i++) lx[i] = 4; 71c4762a1bSJed Brown lx[m - 1] = M - 4 * (m - 1); 7208401ef6SPierre Jolivet PetscCheck(n != PETSC_DECIDE, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must set -n option with -distribute option"); 739566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(n, &ly)); 74c4762a1bSJed Brown for (i = 0; i < n - 1; i++) ly[i] = 2; 75c4762a1bSJed Brown ly[n - 1] = N - 2 * (n - 1); 7608401ef6SPierre Jolivet PetscCheck(p != PETSC_DECIDE, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must set -p option with -distribute option"); 779566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(p, &lz)); 78c4762a1bSJed Brown for (i = 0; i < p - 1; i++) lz[i] = 2; 79c4762a1bSJed Brown lz[p - 1] = P - 2 * (p - 1); 80c4762a1bSJed Brown } 81c4762a1bSJed Brown 829566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz, &da)); 839566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 849566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 85c4762a1bSJed Brown 86c4762a1bSJed Brown /* Check self-compatibility */ 87c4762a1bSJed Brown { 88c4762a1bSJed Brown PetscBool compatible, set; 899566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da, &compatible, &set)); 9048a46eb9SPierre Jolivet if (!set || !compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not compatible with itself\n")); 91c4762a1bSJed Brown } 92c4762a1bSJed Brown 93c4762a1bSJed Brown /* Check compatibility with the same DM on a dup'd communicator */ 94c4762a1bSJed Brown { 95c4762a1bSJed Brown DM da2; 96c4762a1bSJed Brown PetscBool compatible, set; 97c4762a1bSJed Brown MPI_Comm comm2; 989566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_dup(PETSC_COMM_WORLD, &comm2)); 999566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(comm2, bx, by, bz, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz, &da2)); 1009566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da2)); 1019566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1029566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 10348a46eb9SPierre Jolivet if (!set || !compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not compatible with DMDA on dup'd comm\n")); 1049566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 1059566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_free(&comm2)); 106c4762a1bSJed Brown } 107c4762a1bSJed Brown 108c4762a1bSJed Brown /* Check compatibility with a derived DMDA */ 109c4762a1bSJed Brown { 110c4762a1bSJed Brown DM da2; 111c4762a1bSJed Brown PetscBool compatible, set; 1129566063dSJacob Faibussowitsch PetscCall(DMDACreateCompatibleDMDA(da, w * 2, &da2)); 1139566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 11448a46eb9SPierre Jolivet if (!set || !compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not compatible with DMDA created with DMDACreateCompatibleDMDA()\n")); 1159566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 116c4762a1bSJed Brown } 117c4762a1bSJed Brown 118c4762a1bSJed Brown /* Confirm incompatibility with different stencil width */ 119c4762a1bSJed Brown { 120c4762a1bSJed Brown DM da2; 121c4762a1bSJed Brown PetscBool compatible, set; 1229566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, w, 0, lx, ly, lz, &da2)); 1239566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1249566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 12548a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different stencil width)\n")); 1269566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 127c4762a1bSJed Brown } 128c4762a1bSJed Brown 129c4762a1bSJed Brown /* Confirm incompatibility with different boundary types */ 130c4762a1bSJed Brown { 131c4762a1bSJed Brown DM da2; 132c4762a1bSJed Brown PetscBool compatible, set; 133c4762a1bSJed Brown DMBoundaryType bz2; 134c4762a1bSJed Brown bz2 = bz == DM_BOUNDARY_NONE ? DM_BOUNDARY_GHOSTED : DM_BOUNDARY_NONE; 1359566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz2, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz, &da2)); 1369566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1379566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 13848a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different boundary type)\n")); 1399566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 140c4762a1bSJed Brown } 141c4762a1bSJed Brown 142c4762a1bSJed Brown if (!distribute) { 143c4762a1bSJed Brown /* Confirm incompatibility with different global sizes */ 144c4762a1bSJed Brown { 145c4762a1bSJed Brown DM da2; 146c4762a1bSJed Brown PetscBool compatible, set; 1479566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P * 2, m, n, p, w, s, lx, ly, lz, &da2)); 1489566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1499566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 15048a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different global sizes)\n")); 1519566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 152c4762a1bSJed Brown } 153c4762a1bSJed Brown } 154c4762a1bSJed Brown 155c4762a1bSJed Brown if (distribute && p > 1) { 156c4762a1bSJed Brown /* Confirm incompatibility with different local size */ 157c4762a1bSJed Brown { 158c4762a1bSJed Brown DM da2; 159c4762a1bSJed Brown PetscBool compatible, set; 160c4762a1bSJed Brown PetscMPIInt rank; 161c4762a1bSJed Brown PetscInt *lz2; 1629566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(p, &lz2)); 163c4762a1bSJed Brown for (i = 0; i < p - 1; i++) lz2[i] = 1; /* One point per rank instead of 2 */ 164c4762a1bSJed Brown lz2[p - 1] = P - (p - 1); 1659566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 1669566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, w, s, lx, ly, lz2, &da2)); 1679566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 1689566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, da2, &compatible, &set)); 16948a46eb9SPierre Jolivet if (!set || compatible) PetscCall(PetscPrintf(PetscObjectComm((PetscObject)da), "Error: DM not determined incompatible with known-incompatible DMDA (different local sizes) \n")); 1709566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 1719566063dSJacob Faibussowitsch PetscCall(PetscFree(lz2)); 172c4762a1bSJed Brown } 173c4762a1bSJed Brown } 174c4762a1bSJed Brown 175c4762a1bSJed Brown /* Check compatibility with a DM of different type (DMStag) */ 176c4762a1bSJed Brown { 177c4762a1bSJed Brown DM dm2; 178c4762a1bSJed Brown PetscBool compatible, set; 1799566063dSJacob 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)); 1809566063dSJacob Faibussowitsch PetscCall(DMSetUp(dm2)); 1819566063dSJacob Faibussowitsch PetscCall(DMGetCompatibility(da, dm2, &compatible, &set)); 182c4762a1bSJed Brown /* Don't interpret the result, but note that one can run with -info */ 1839566063dSJacob Faibussowitsch PetscCall(DMDestroy(&dm2)); 184c4762a1bSJed Brown } 185c4762a1bSJed Brown 186c4762a1bSJed Brown /* Free memory */ 1879566063dSJacob Faibussowitsch PetscCall(PetscFree(lx)); 1889566063dSJacob Faibussowitsch PetscCall(PetscFree(ly)); 1899566063dSJacob Faibussowitsch PetscCall(PetscFree(lz)); 1909566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 1919566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 192b122ec5aSJacob Faibussowitsch return 0; 193c4762a1bSJed Brown } 194c4762a1bSJed Brown 195c4762a1bSJed Brown /*TEST 196c4762a1bSJed Brown 197c4762a1bSJed Brown test: 198c4762a1bSJed Brown suffix: 1 199*3886731fSPierre Jolivet output_file: output/empty.out 200c4762a1bSJed Brown 201c4762a1bSJed Brown test: 202c4762a1bSJed Brown suffix: 2 203c4762a1bSJed Brown nsize: 3 204660278c0SBarry Smith args: -distribute -m 1 -n 1 -p 3 -NZ 20 205*3886731fSPierre Jolivet output_file: output/empty.out 206c4762a1bSJed Brown 207c4762a1bSJed Brown TEST*/ 208