xref: /petsc/src/dm/tutorials/ex4.c (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
1 static char help[] = "Demonstrates various vector routines for DMDA.\n\n";
2 
3 /*
4   Include "petscpf.h" so that we can use pf functions and "petscdmda.h" so
5  we can use the PETSc distributed arrays
6 */
7 
8 #include <petscpf.h>
9 #include <petscdm.h>
10 #include <petscdmda.h>
11 
12 PetscErrorCode myfunction(void *ctx, PetscInt n, const PetscScalar *xy, PetscScalar *u)
13 {
14   PetscInt i;
15 
16   PetscFunctionBeginUser;
17   for (i = 0; i < n; i++) {
18     u[2 * i]     = xy[2 * i];
19     u[2 * i + 1] = xy[2 * i + 1];
20   }
21   PetscFunctionReturn(PETSC_SUCCESS);
22 }
23 
24 int main(int argc, char **argv)
25 {
26   Vec      u, xy;
27   DM       da;
28   PetscInt m = 10, n = 10, dof = 2;
29   PF       pf;
30 
31   PetscFunctionBeginUser;
32   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
33   PetscCall(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, m, n, PETSC_DECIDE, PETSC_DECIDE, dof, 1, 0, 0, &da));
34   PetscCall(DMSetFromOptions(da));
35   PetscCall(DMSetUp(da));
36   PetscCall(DMDASetUniformCoordinates(da, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0));
37   PetscCall(DMCreateGlobalVector(da, &u));
38   PetscCall(DMGetCoordinates(da, &xy));
39 
40   PetscCall(DMDACreatePF(da, &pf));
41   PetscCall(PFSet(pf, myfunction, 0, 0, 0, 0));
42   PetscCall(PFSetFromOptions(pf));
43 
44   PetscCall(PFApplyVec(pf, xy, u));
45 
46   PetscCall(VecView(u, PETSC_VIEWER_DRAW_WORLD));
47 
48   /*
49      Free work space.  All PETSc objects should be destroyed when they
50      are no longer needed.
51   */
52   PetscCall(VecDestroy(&u));
53   PetscCall(PFDestroy(&pf));
54   PetscCall(DMDestroy(&da));
55   PetscCall(PetscFinalize());
56   return 0;
57 }
58 
59 /*TEST
60 
61    test:
62 
63 TEST*/
64