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