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