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