1c4762a1bSJed Brown static char help[] = "Tests DMDA ghost coordinates\n\n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscdm.h>
4c4762a1bSJed Brown #include <petscdmda.h>
5c4762a1bSJed Brown
CompareGhostedCoords(Vec gc1,Vec gc2)6d71ae5a4SJacob Faibussowitsch static PetscErrorCode CompareGhostedCoords(Vec gc1, Vec gc2)
7d71ae5a4SJacob Faibussowitsch {
8c4762a1bSJed Brown PetscReal nrm, gnrm;
9c4762a1bSJed Brown Vec tmp;
10c4762a1bSJed Brown
11c4762a1bSJed Brown PetscFunctionBeginUser;
129566063dSJacob Faibussowitsch PetscCall(VecDuplicate(gc1, &tmp));
139566063dSJacob Faibussowitsch PetscCall(VecWAXPY(tmp, -1.0, gc1, gc2));
149566063dSJacob Faibussowitsch PetscCall(VecNorm(tmp, NORM_INFINITY, &nrm));
15*462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(&nrm, &gnrm, 1, MPIU_REAL, MPIU_MAX, PETSC_COMM_WORLD));
1663a3b9bcSJacob Faibussowitsch PetscCall(PetscPrintf(PETSC_COMM_WORLD, "norm of difference of ghosted coordinates %8.2e\n", (double)gnrm));
179566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tmp));
183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
19c4762a1bSJed Brown }
20c4762a1bSJed Brown
TestQ2Q1DA(void)21d71ae5a4SJacob Faibussowitsch static PetscErrorCode TestQ2Q1DA(void)
22d71ae5a4SJacob Faibussowitsch {
23c4762a1bSJed Brown DM Q2_da, Q1_da, cda;
24c4762a1bSJed Brown PetscInt mx, my, mz;
25c4762a1bSJed Brown Vec coords, gcoords, gcoords2;
26c4762a1bSJed Brown
27362febeeSStefano Zampini PetscFunctionBeginUser;
28c4762a1bSJed Brown mx = 7;
29c4762a1bSJed Brown my = 11;
30c4762a1bSJed Brown mz = 13;
319566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, mx, my, mz, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 3, 2, 0, 0, 0, &Q2_da));
329566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(Q2_da));
339566063dSJacob Faibussowitsch PetscCall(DMSetUp(Q2_da));
349566063dSJacob Faibussowitsch PetscCall(DMDASetUniformCoordinates(Q2_da, -1.0, 1.0, -2.0, 2.0, -3.0, 3.0));
359566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(Q2_da, &coords));
369566063dSJacob Faibussowitsch PetscCall(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, mx, my, mz, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, 3, 1, 0, 0, 0, &Q1_da));
379566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(Q1_da));
389566063dSJacob Faibussowitsch PetscCall(DMSetUp(Q1_da));
399566063dSJacob Faibussowitsch PetscCall(DMSetCoordinates(Q1_da, coords));
40c4762a1bSJed Brown
41c4762a1bSJed Brown /* Get ghost coordinates one way */
429566063dSJacob Faibussowitsch PetscCall(DMGetCoordinatesLocal(Q1_da, &gcoords));
43c4762a1bSJed Brown
44c4762a1bSJed Brown /* And another */
459566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(Q1_da, &coords));
469566063dSJacob Faibussowitsch PetscCall(DMGetCoordinateDM(Q1_da, &cda));
479566063dSJacob Faibussowitsch PetscCall(DMGetLocalVector(cda, &gcoords2));
489566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalBegin(cda, coords, INSERT_VALUES, gcoords2));
499566063dSJacob Faibussowitsch PetscCall(DMGlobalToLocalEnd(cda, coords, INSERT_VALUES, gcoords2));
50c4762a1bSJed Brown
519566063dSJacob Faibussowitsch PetscCall(CompareGhostedCoords(gcoords, gcoords2));
529566063dSJacob Faibussowitsch PetscCall(DMRestoreLocalVector(cda, &gcoords2));
53c4762a1bSJed Brown
549566063dSJacob Faibussowitsch PetscCall(VecScale(coords, 10.0));
559566063dSJacob Faibussowitsch PetscCall(VecScale(gcoords, 10.0));
569566063dSJacob Faibussowitsch PetscCall(DMGetCoordinatesLocal(Q1_da, &gcoords2));
579566063dSJacob Faibussowitsch PetscCall(CompareGhostedCoords(gcoords, gcoords2));
58c4762a1bSJed Brown
599566063dSJacob Faibussowitsch PetscCall(DMDestroy(&Q2_da));
609566063dSJacob Faibussowitsch PetscCall(DMDestroy(&Q1_da));
613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
62c4762a1bSJed Brown }
63c4762a1bSJed Brown
main(int argc,char ** argv)64d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
65d71ae5a4SJacob Faibussowitsch {
66327415f7SBarry Smith PetscFunctionBeginUser;
679566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, 0, help));
689566063dSJacob Faibussowitsch PetscCall(TestQ2Q1DA());
699566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
70b122ec5aSJacob Faibussowitsch return 0;
71c4762a1bSJed Brown }
72c4762a1bSJed Brown
73c4762a1bSJed Brown /*TEST
74c4762a1bSJed Brown
75c4762a1bSJed Brown test:
76c4762a1bSJed Brown nsize: 2
77c4762a1bSJed Brown
78c4762a1bSJed Brown TEST*/
79