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