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 6d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 7d71ae5a4SJacob Faibussowitsch { 8c4762a1bSJed Brown PetscMPIInt size; 9c4762a1bSJed Brown PetscInt N = 6, m = PETSC_DECIDE, n = PETSC_DECIDE, p = PETSC_DECIDE, M = 8, dof = 1, stencil_width = 1, P = 5, pt = 0, st = 0; 10c4762a1bSJed Brown PetscBool flg2, flg3, native = PETSC_FALSE; 11c4762a1bSJed Brown DMBoundaryType bx = DM_BOUNDARY_NONE, by = DM_BOUNDARY_NONE, bz = DM_BOUNDARY_NONE; 12c4762a1bSJed Brown DMDAStencilType stencil_type = DMDA_STENCIL_STAR; 13c4762a1bSJed Brown DM da; 14c4762a1bSJed Brown Vec global1, global2, global3, global4; 15c4762a1bSJed Brown PetscScalar mone = -1.0; 16c4762a1bSJed Brown PetscReal norm; 17c4762a1bSJed Brown PetscViewer viewer; 18c4762a1bSJed Brown PetscRandom rdm; 19c4762a1bSJed Brown 20327415f7SBarry Smith PetscFunctionBeginUser; 21c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 229566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-M", &M, NULL)); 239566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-N", &N, NULL)); 249566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-P", &P, NULL)); 259566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-dof", &dof, NULL)); 269566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-stencil_width", &stencil_width, NULL)); 279566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-periodic", &pt, NULL)); 289566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(NULL, NULL, "-native", &native, NULL)); 29c4762a1bSJed Brown if (pt == 1) bx = DM_BOUNDARY_PERIODIC; 30c4762a1bSJed Brown if (pt == 2) by = DM_BOUNDARY_PERIODIC; 319371c9d4SSatish Balay if (pt == 3) { 329371c9d4SSatish Balay bx = DM_BOUNDARY_PERIODIC; 339371c9d4SSatish Balay by = DM_BOUNDARY_PERIODIC; 349371c9d4SSatish Balay } 35c4762a1bSJed Brown if (pt == 4) bz = DM_BOUNDARY_PERIODIC; 36c4762a1bSJed Brown 379566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetInt(NULL, NULL, "-stencil_type", &st, NULL)); 38c4762a1bSJed Brown stencil_type = (DMDAStencilType)st; 39c4762a1bSJed Brown 409566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-one", &flg2)); 419566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-two", &flg2)); 429566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-three", &flg3)); 43c4762a1bSJed Brown if (flg2) { 449566063dSJacob Faibussowitsch PetscCall(DMDACreate2d(PETSC_COMM_WORLD, bx, by, stencil_type, M, N, m, n, dof, stencil_width, 0, 0, &da)); 45c4762a1bSJed Brown } else if (flg3) { 469566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, bx, by, bz, stencil_type, M, N, P, m, n, p, dof, stencil_width, 0, 0, 0, &da)); 47c4762a1bSJed Brown } else { 489566063dSJacob Faibussowitsch PetscCall(DMDACreate1d(PETSC_COMM_WORLD, bx, M, dof, stencil_width, NULL, &da)); 49c4762a1bSJed Brown } 509566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 519566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 52c4762a1bSJed Brown 539566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global1)); 549566063dSJacob Faibussowitsch PetscCall(PetscRandomCreate(PETSC_COMM_WORLD, &rdm)); 559566063dSJacob Faibussowitsch PetscCall(PetscRandomSetFromOptions(rdm)); 569566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global2)); 579566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global3)); 589566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da, &global4)); 59c4762a1bSJed Brown 609566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "temp", FILE_MODE_WRITE, &viewer)); 619566063dSJacob Faibussowitsch if (native) PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_NATIVE)); 629566063dSJacob Faibussowitsch PetscCall(VecSetRandom(global1, rdm)); 639566063dSJacob Faibussowitsch PetscCall(VecView(global1, viewer)); 649566063dSJacob Faibussowitsch PetscCall(VecSetRandom(global3, rdm)); 659566063dSJacob Faibussowitsch PetscCall(VecView(global3, viewer)); 669566063dSJacob Faibussowitsch if (native) PetscCall(PetscViewerPopFormat(viewer)); 679566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 68c4762a1bSJed Brown 699566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "temp", FILE_MODE_READ, &viewer)); 709566063dSJacob Faibussowitsch if (native) PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_NATIVE)); 719566063dSJacob Faibussowitsch PetscCall(VecLoad(global2, viewer)); 729566063dSJacob Faibussowitsch PetscCall(VecLoad(global4, viewer)); 739566063dSJacob Faibussowitsch if (native) PetscCall(PetscViewerPopFormat(viewer)); 749566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 75c4762a1bSJed Brown 76c4762a1bSJed Brown if (native) { 77c4762a1bSJed Brown Vec filenative; 78c4762a1bSJed Brown PetscBool same; 799566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "temp", FILE_MODE_READ, &viewer)); 809566063dSJacob Faibussowitsch PetscCall(DMDACreateNaturalVector(da, &filenative)); 81c4762a1bSJed Brown /* DMDA "natural" Vec does not commandeer VecLoad. The following load will only work when run on the same process 82c4762a1bSJed Brown * layout, where as the standard VecView/VecLoad (using DMDA and not PETSC_VIEWER_NATIVE) can be read on a different 83c4762a1bSJed Brown * number of processors. */ 849566063dSJacob Faibussowitsch PetscCall(VecLoad(filenative, viewer)); 859566063dSJacob Faibussowitsch PetscCall(VecEqual(global2, filenative, &same)); 86c4762a1bSJed Brown if (!same) { 879566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "ex23: global vector does not match contents of file\n")); 889566063dSJacob Faibussowitsch PetscCall(VecView(global2, 0)); 899566063dSJacob Faibussowitsch PetscCall(VecView(filenative, 0)); 90c4762a1bSJed Brown } 919566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 929566063dSJacob Faibussowitsch PetscCall(VecDestroy(&filenative)); 93c4762a1bSJed Brown } 94c4762a1bSJed Brown 959566063dSJacob Faibussowitsch PetscCall(VecAXPY(global2, mone, global1)); 969566063dSJacob Faibussowitsch PetscCall(VecNorm(global2, NORM_MAX, &norm)); 97c4762a1bSJed Brown if (norm != 0.0) { 989566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 999566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "ex23: Norm of difference %g should be zero\n", (double)norm)); 1009566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Number of processors %d\n", size)); 10163a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " M,N,P,dof %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n", M, N, P, dof)); 10263a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " stencil_width %" PetscInt_FMT " stencil_type %d periodic %d\n", stencil_width, (int)stencil_type, (int)bx)); 1039566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " dimension %d\n", 1 + (int)flg2 + (int)flg3)); 104c4762a1bSJed Brown } 1059566063dSJacob Faibussowitsch PetscCall(VecAXPY(global4, mone, global3)); 1069566063dSJacob Faibussowitsch PetscCall(VecNorm(global4, NORM_MAX, &norm)); 107c4762a1bSJed Brown if (norm != 0.0) { 1089566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size)); 1099566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "ex23: Norm of difference %g should be zero\n", (double)norm)); 1109566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " Number of processors %d\n", size)); 11163a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " M,N,P,dof %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n", M, N, P, dof)); 11263a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " stencil_width %" PetscInt_FMT " stencil_type %d periodic %d\n", stencil_width, (int)stencil_type, (int)bx)); 1139566063dSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, " dimension %d\n", 1 + (int)flg2 + (int)flg3)); 114c4762a1bSJed Brown } 115c4762a1bSJed Brown 1169566063dSJacob Faibussowitsch PetscCall(PetscRandomDestroy(&rdm)); 1179566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 1189566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global1)); 1199566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global2)); 1209566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global3)); 1219566063dSJacob Faibussowitsch PetscCall(VecDestroy(&global4)); 1229566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 123b122ec5aSJacob Faibussowitsch return 0; 124c4762a1bSJed Brown } 125c4762a1bSJed Brown 126c4762a1bSJed Brown /*TEST 127c4762a1bSJed Brown 128c4762a1bSJed Brown test: 129c4762a1bSJed Brown nsize: {{1 3}} 130c4762a1bSJed Brown args: -one -dof {{1 2 3}} -stencil_type {{0 1}} 131*3886731fSPierre Jolivet output_file: output/empty.out 132c4762a1bSJed Brown 133c4762a1bSJed Brown test: 134c4762a1bSJed Brown suffix: 3 135c4762a1bSJed Brown nsize: {{2 4}} 136c4762a1bSJed Brown args: -two -dof {{1 3}} -stencil_type {{0 1}} 137*3886731fSPierre Jolivet output_file: output/empty.out 138c4762a1bSJed Brown 139c4762a1bSJed Brown test: 140c4762a1bSJed Brown suffix: 4 141c4762a1bSJed Brown nsize: {{1 4}} 142c4762a1bSJed Brown args: -three -dof {{2 3}} -stencil_type {{0 1}} 143*3886731fSPierre Jolivet output_file: output/empty.out 144c4762a1bSJed Brown 145c4762a1bSJed Brown test: 146c4762a1bSJed Brown suffix: 2 147c4762a1bSJed Brown nsize: 2 148c4762a1bSJed Brown args: -two -native 149*3886731fSPierre Jolivet output_file: output/empty.out 150c4762a1bSJed Brown 151c4762a1bSJed Brown TEST*/ 152