1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Demonstrates various vector routines for DMDA.\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown /* 5c4762a1bSJed Brown Include "petscpf.h" so that we can use pf functions and "petscdmda.h" so 6c4762a1bSJed Brown we can use the PETSc distributed arrays 7c4762a1bSJed Brown */ 8c4762a1bSJed Brown 9c4762a1bSJed Brown #include <petscpf.h> 10c4762a1bSJed Brown #include <petscdm.h> 11c4762a1bSJed Brown #include <petscdmda.h> 12c4762a1bSJed Brown 13c4762a1bSJed Brown PetscErrorCode myfunction(void *ctx,PetscInt n,const PetscScalar *xy,PetscScalar *u) 14c4762a1bSJed Brown { 15c4762a1bSJed Brown PetscInt i; 16c4762a1bSJed Brown 17c4762a1bSJed Brown PetscFunctionBeginUser; 18c4762a1bSJed Brown for (i=0; i<n; i++) { 19c4762a1bSJed Brown u[2*i] = xy[2*i]; 20c4762a1bSJed Brown u[2*i+1] = xy[2*i+1]; 21c4762a1bSJed Brown } 22c4762a1bSJed Brown PetscFunctionReturn(0); 23c4762a1bSJed Brown } 24c4762a1bSJed Brown 25c4762a1bSJed Brown int main(int argc,char **argv) 26c4762a1bSJed Brown { 27c4762a1bSJed Brown Vec u,xy; 28c4762a1bSJed Brown DM da; 29c4762a1bSJed Brown PetscInt m = 10, n = 10, dof = 2; 30c4762a1bSJed Brown PF pf; 31c4762a1bSJed Brown 32*327415f7SBarry Smith PetscFunctionBeginUser; 339566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); 349566063dSJacob Faibussowitsch 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)); 359566063dSJacob Faibussowitsch PetscCall(DMSetFromOptions(da)); 369566063dSJacob Faibussowitsch PetscCall(DMSetUp(da)); 379566063dSJacob Faibussowitsch PetscCall(DMDASetUniformCoordinates(da,0.0,1.0,0.0,1.0,0.0,1.0)); 389566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(da,&u)); 399566063dSJacob Faibussowitsch PetscCall(DMGetCoordinates(da,&xy)); 40c4762a1bSJed Brown 419566063dSJacob Faibussowitsch PetscCall(DMDACreatePF(da,&pf)); 429566063dSJacob Faibussowitsch PetscCall(PFSet(pf,myfunction,0,0,0,0)); 439566063dSJacob Faibussowitsch PetscCall(PFSetFromOptions(pf)); 44c4762a1bSJed Brown 459566063dSJacob Faibussowitsch PetscCall(PFApplyVec(pf,xy,u)); 46c4762a1bSJed Brown 479566063dSJacob Faibussowitsch PetscCall(VecView(u,PETSC_VIEWER_DRAW_WORLD)); 48c4762a1bSJed Brown 49c4762a1bSJed Brown /* 50c4762a1bSJed Brown Free work space. All PETSc objects should be destroyed when they 51c4762a1bSJed Brown are no longer needed. 52c4762a1bSJed Brown */ 539566063dSJacob Faibussowitsch PetscCall(VecDestroy(&u)); 549566063dSJacob Faibussowitsch PetscCall(PFDestroy(&pf)); 559566063dSJacob Faibussowitsch PetscCall(DMDestroy(&da)); 569566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 57b122ec5aSJacob Faibussowitsch return 0; 58c4762a1bSJed Brown } 59c4762a1bSJed Brown 60c4762a1bSJed Brown /*TEST 61c4762a1bSJed Brown 62c4762a1bSJed Brown test: 63c4762a1bSJed Brown 64c4762a1bSJed Brown TEST*/ 65