xref: /petsc/src/dm/tests/ex32.c (revision d8e47b638cf8f604a99e9678e1df24f82d959cd7)
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