xref: /petsc/src/dm/tutorials/ex4.c (revision 7bb670c6b095b2af062682d621b50e4a531d2a07)
1 
2 static char help[] = "Demonstrates various vector routines for DMDA.\n\n";
3 
4 /*
5   Include "petscpf.h" so that we can use pf functions and "petscdmda.h" so
6  we can use the PETSc distributed arrays
7 */
8 
9 #include <petscpf.h>
10 #include <petscdm.h>
11 #include <petscdmda.h>
12 
13 PetscErrorCode myfunction(void *ctx,PetscInt n,const PetscScalar *xy,PetscScalar *u)
14 {
15   PetscInt i;
16 
17   PetscFunctionBeginUser;
18   for (i=0; i<n; i++) {
19     u[2*i]   = xy[2*i];
20     u[2*i+1] = xy[2*i+1];
21   }
22   PetscFunctionReturn(0);
23 }
24 
25 int main(int argc,char **argv)
26 {
27   Vec            u,xy;
28   DM             da;
29   PetscInt       m = 10, n = 10, dof = 2;
30   PF             pf;
31 
32   PetscCall(PetscInitialize(&argc,&argv,(char*)0,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