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 13d71ae5a4SJacob Faibussowitsch PetscErrorCode myfunction(void *ctx, PetscInt n, const PetscScalar *xy, PetscScalar *u) 14d71ae5a4SJacob Faibussowitsch { 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 } 22*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 23c4762a1bSJed Brown } 24c4762a1bSJed Brown 25d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 26d71ae5a4SJacob Faibussowitsch { 27c4762a1bSJed Brown Vec u, xy; 28c4762a1bSJed Brown DM da; 29c4762a1bSJed Brown PetscInt m = 10, n = 10, dof = 2; 30c4762a1bSJed Brown PF pf; 31c4762a1bSJed Brown 32327415f7SBarry 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