1c4762a1bSJed Brown static char help[] = "Tests VecView()/VecLoad() for DMDA vectors (this tests DMDAGlobalToNatural()).\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscdm.h> 4c4762a1bSJed Brown #include <petscdmda.h> 5c4762a1bSJed Brown #include <petscviewerhdf5.h> 6c4762a1bSJed Brown 7d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 8d71ae5a4SJacob Faibussowitsch { 9c4762a1bSJed Brown PetscMPIInt rank, size; 10c4762a1bSJed Brown PetscInt N = 6, M = 8, P = 5, dof = 1; 11c4762a1bSJed Brown PetscInt stencil_width = 1, pt = 0, st = 0; 12c4762a1bSJed Brown PetscBool flg2, flg3, isbinary, mpiio; 13c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE, by = DM_BOUNDARY_NONE, bz = DM_BOUNDARY_NONE; 14c4762a1bSJed Brown DMDAStencilType stencil_type = DMDA_STENCIL_STAR; 15c4762a1bSJed Brown DM da, da2; 16c4762a1bSJed Brown Vec global1, global2; 17c4762a1bSJed Brown PetscScalar mone = -1.0; 18c4762a1bSJed Brown PetscReal norm; 19c4762a1bSJed Brown PetscViewer viewer; 20c4762a1bSJed Brown PetscRandom rdm; 21c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 22c4762a1bSJed Brown PetscBool ishdf5; 23c4762a1bSJed Brown #endif 24c4762a1bSJed Brown 25327415f7SBarry Smith PetscFunctionBeginUser; 26*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 279566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 289566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 29c4762a1bSJed Brown 309566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-M", &M, NULL)); 319566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-N", &N, NULL)); 329566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-P", &P, NULL)); 339566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-dof", &dof, NULL)); 349566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-stencil_width", &stencil_width, NULL)); 359566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-periodic", &pt, NULL)); 36c4762a1bSJed Brown if (pt == 1) bx = DM_BOUNDARY_PERIODIC; 37c4762a1bSJed Brown if (pt == 2) by = DM_BOUNDARY_PERIODIC; 389371c9d4SSatish Balay if (pt == 4) { 399371c9d4SSatish Balay bx = DM_BOUNDARY_PERIODIC; 409371c9d4SSatish Balay by = DM_BOUNDARY_PERIODIC; 419371c9d4SSatish Balay } 42c4762a1bSJed Brown 439566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-stencil_type", &st, NULL)); 44c4762a1bSJed Brown stencil_type = (DMDAStencilType)st; 45c4762a1bSJed Brown 469566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-oned", &flg2)); 479566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-twod", &flg2)); 489566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-threed", &flg3)); 49c4762a1bSJed Brown 509566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-binary", &isbinary)); 51c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 529566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-hdf5", &ishdf5)); 53c4762a1bSJed Brown #endif 549566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-mpiio", &mpiio)); 55c4762a1bSJed Brown if (flg2) { 569566063dSJacob Faibussowitsch PetscCall(DMDACreate2d(PETSC_COMM_WORLD, bx, by, stencil_type, M, N, PETSC_DECIDE, PETSC_DECIDE, dof, stencil_width, 0, 0, &da)); 57c4762a1bSJed Brown } else if (flg3) { 589566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, dof, stencil_width, 0, 0, 0, &da)); 59c4762a1bSJed Brown } else { 609566063dSJacob Faibussowitsch PetscCall(DMDACreate1d(PETSC_COMM_WORLD, bx, M, dof, stencil_width, NULL, &da)); 61c4762a1bSJed Brown } 629566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 639566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 64c4762a1bSJed Brown 659566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global1)); 669566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)global1, "Test_Vec")); 679566063dSJacob Faibussowitsch PetscCall(PetscRandomCreate(PETSC_COMM_WORLD, &rdm)); 689566063dSJacob Faibussowitsch PetscCall(PetscRandomSetFromOptions(rdm)); 699566063dSJacob Faibussowitsch PetscCall(VecSetRandom(global1, rdm)); 70c4762a1bSJed Brown if (isbinary) { 7148a46eb9SPierre Jolivet if (mpiio) PetscCall(PetscOptionsSetValue(NULL, "-viewer_binary_mpiio", "")); 729566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "temp", FILE_MODE_WRITE, &viewer)); 73c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 74c4762a1bSJed Brown } else if (ishdf5) { 759566063dSJacob Faibussowitsch PetscCall(PetscViewerHDF5Open(PETSC_COMM_WORLD, "temp", FILE_MODE_WRITE, &viewer)); 76c4762a1bSJed Brown #endif 77546078acSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Invalid Viewer : Run with -binary or -hdf5 option"); 789566063dSJacob Faibussowitsch PetscCall(VecView(global1, viewer)); 799566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 80c4762a1bSJed Brown 819566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Global vector written to temp file is \n")); 829566063dSJacob Faibussowitsch PetscCall(VecView(global1, PETSC_VIEWER_STDOUT_WORLD)); 83c4762a1bSJed Brown 84c4762a1bSJed Brown if (flg2) { 859566063dSJacob Faibussowitsch PetscCall(DMDACreate2d(PETSC_COMM_WORLD, bx, by, stencil_type, M, N, PETSC_DECIDE, PETSC_DECIDE, dof, stencil_width, 0, 0, &da2)); 86c4762a1bSJed Brown } else if (flg3) { 879566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, dof, stencil_width, 0, 0, 0, &da2)); 88c4762a1bSJed Brown } else { 899566063dSJacob Faibussowitsch PetscCall(DMDACreate1d(PETSC_COMM_WORLD, bx, M, dof, stencil_width, NULL, &da2)); 90c4762a1bSJed Brown } 919566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da2)); 929566063dSJacob Faibussowitsch PetscCall(DMSetUp(da2)); 93c4762a1bSJed Brown 94c4762a1bSJed Brown if (isbinary) { 959566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "temp", FILE_MODE_READ, &viewer)); 96c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5) 97c4762a1bSJed Brown } else if (ishdf5) { 989566063dSJacob Faibussowitsch PetscCall(PetscViewerHDF5Open(PETSC_COMM_WORLD, "temp", FILE_MODE_READ, &viewer)); 99c4762a1bSJed Brown #endif 100546078acSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP, "Invalid Viewer : Run with -binary or -hdf5 option"); 101c4762a1bSJed Brown 1029566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da2, &global2)); 1039566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)global2, "Test_Vec")); 1049566063dSJacob Faibussowitsch PetscCall(VecLoad(global2, viewer)); 1059566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 106c4762a1bSJed Brown 1079566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Global vector read from temp file is \n")); 1089566063dSJacob Faibussowitsch PetscCall(VecView(global2, PETSC_VIEWER_STDOUT_WORLD)); 1099566063dSJacob Faibussowitsch PetscCall(VecAXPY(global2, mone, global1)); 1109566063dSJacob Faibussowitsch PetscCall(VecNorm(global2, NORM_MAX, &norm)); 111c4762a1bSJed Brown if (norm != 0.0) { 1129566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "ex23: Norm of difference %g should be zero\n", (double)norm)); 1139566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Number of processors %d\n", size)); 11463a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " M,N,P,dof %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n", M, N, P, dof)); 11563a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " stencil_width %" PetscInt_FMT " stencil_type %d periodic %d\n", stencil_width, (int)stencil_type, (int)pt)); 1169566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " dimension %d\n", 1 + (int)flg2 + (int)flg3)); 117c4762a1bSJed Brown } 118c4762a1bSJed Brown 1199566063dSJacob Faibussowitsch PetscCall(PetscRandomDestroy(&rdm)); 1209566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 1219566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da2)); 1229566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global1)); 1239566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global2)); 1249566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 125b122ec5aSJacob Faibussowitsch return 0; 126c4762a1bSJed Brown } 127