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