1c4762a1bSJed Brown! Tests DMDAGetVecGetArray() 2c4762a1bSJed Brown#include <petsc/finclude/petscdm.h> 3ce78bad3SBarry Smith#include <petsc/finclude/petscdmda.h> 4*c5e229c2SMartin Diehlprogram main 5ce78bad3SBarry Smith use petscdmda 6c4762a1bSJed Brown use petsc 7c4762a1bSJed Brown implicit none 8c4762a1bSJed Brown 9c4762a1bSJed Brown Type(tVec) g 10c4762a1bSJed Brown Type(tDM) ada 11c4762a1bSJed Brown 12c4762a1bSJed Brown PetscScalar, pointer :: x1(:), x2(:, :) 13c4762a1bSJed Brown PetscScalar, pointer :: x3(:, :, :), x4(:, :, :, :) 14c4762a1bSJed Brown PetscErrorCode ierr 15c4762a1bSJed Brown PetscInt m, n, p, dof, s, i, j, k, xs, xl 16c4762a1bSJed Brown PetscInt ys, yl 17c4762a1bSJed Brown PetscInt zs, zl, sw 18c4762a1bSJed Brown 19659f25fdSBarry Smith PetscInt nen, nel 20659f25fdSBarry Smith PetscInt, pointer :: elements(:) 21659f25fdSBarry Smith 228d9ecca5SBarry Smith PetscInt nfields 238d9ecca5SBarry Smith character(80), pointer :: namefields(:) 248d9ecca5SBarry Smith IS, pointer :: isfields(:) 258d9ecca5SBarry Smith DM, pointer :: dmfields(:) 268d9ecca5SBarry Smith PetscInt zero, one 278d9ecca5SBarry Smith 28c4762a1bSJed Brown m = 5 29c4762a1bSJed Brown n = 6 30ccfd86f1SBarry Smith p = 4 31c4762a1bSJed Brown s = 1 32c4762a1bSJed Brown dof = 1 33c4762a1bSJed Brown sw = 1 348d9ecca5SBarry Smith zero = 0 358d9ecca5SBarry Smith one = 1 36d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 375d83a8b1SBarry Smith PetscCallA(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, m, dof, sw, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 38d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 39d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 40d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, xl, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, ierr)) 41ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x1, ierr)) 42c4762a1bSJed Brown do i = xs, xs + xl - 1 43c4762a1bSJed Brown! CHKMEMQ 44c4762a1bSJed Brown x1(i) = i 45c4762a1bSJed Brown! CHKMEMQ 46c4762a1bSJed Brown end do 47ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x1, ierr)) 48d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 49d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 50d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 51c4762a1bSJed Brown 525d83a8b1SBarry Smith PetscCallA(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, m, n, PETSC_DECIDE, PETSC_DECIDE, dof, s, PETSC_NULL_INTEGER_ARRAY, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 53d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 54d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 55d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, PETSC_NULL_INTEGER, xl, yl, PETSC_NULL_INTEGER, ierr)) 56ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x2, ierr)) 57c4762a1bSJed Brown do i = xs, xs + xl - 1 58c4762a1bSJed Brown do j = ys, ys + yl - 1 59c4762a1bSJed Brown! CHKMEMQ 60c4762a1bSJed Brown x2(i, j) = i + j 61c4762a1bSJed Brown! CHKMEMQ 62c4762a1bSJed Brown end do 63c4762a1bSJed Brown end do 64ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x2, ierr)) 65d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 66d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 67659f25fdSBarry Smith 68659f25fdSBarry Smith PetscCallA(DMDAGetElements(ada, nen, nel, elements, ierr)) 69659f25fdSBarry Smith do i = 1, nen*nel 704820e4eaSBarry Smith PetscCheckA(elements(i) >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, 'Error getting DMDA elements') 71659f25fdSBarry Smith end do 72659f25fdSBarry Smith PetscCallA(DMDARestoreElements(ada, nen, nel, elements, ierr)) 73d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 74c4762a1bSJed Brown 755d83a8b1SBarry Smith PetscCallA(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, m, n, p, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, dof, s, PETSC_NULL_INTEGER_ARRAY, PETSC_NULL_INTEGER_ARRAY, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 76d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 77d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 78d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, zs, xl, yl, zl, ierr)) 79ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x3, ierr)) 80c4762a1bSJed Brown do i = xs, xs + xl - 1 81c4762a1bSJed Brown do j = ys, ys + yl - 1 82c4762a1bSJed Brown do k = zs, zs + zl - 1 83c4762a1bSJed Brown! CHKMEMQ 84c4762a1bSJed Brown x3(i, j, k) = i + j + k 85c4762a1bSJed Brown! CHKMEMQ 86c4762a1bSJed Brown end do 87c4762a1bSJed Brown end do 88c4762a1bSJed Brown end do 89ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x3, ierr)) 90d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 91d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 92d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 93c4762a1bSJed Brown 94c4762a1bSJed Brown! 95c4762a1bSJed Brown! Same tests but now with DOF > 1, so dimensions of array are one higher 96c4762a1bSJed Brown! 97c4762a1bSJed Brown dof = 2 985d83a8b1SBarry Smith PetscCallA(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, m, dof, sw, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 99d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 100d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 101d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, xl, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, ierr)) 102ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x2, ierr)) 103c4762a1bSJed Brown do i = xs, xs + xl - 1 104c4762a1bSJed Brown! CHKMEMQ 105c4762a1bSJed Brown x2(0, i) = i 106c4762a1bSJed Brown x2(1, i) = -i 107c4762a1bSJed Brown! CHKMEMQ 108c4762a1bSJed Brown end do 109ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x1, ierr)) 110d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 111d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 1128d9ecca5SBarry Smith 1138d9ecca5SBarry Smith ! some testing unrelated to the example 1148d9ecca5SBarry Smith PetscCallA(DMDASetFieldName(ada, zero, 'Field 0', ierr)) 1158d9ecca5SBarry Smith PetscCallA(DMDASetFieldName(ada, one, 'Field 1', ierr)) 1168d9ecca5SBarry Smith PetscCallA(DMCreateFieldDecomposition(ada, nfields, namefields, PETSC_NULL_IS_POINTER, PETSC_NULL_DM_POINTER, ierr)) 1178d9ecca5SBarry Smith ! print*,nfields,trim(namefields(1)),trim(namefields(2)) 1188d9ecca5SBarry Smith PetscCallA(DMDestroyFieldDecomposition(ada, nfields, namefields, PETSC_NULL_IS_POINTER, PETSC_NULL_DM_POINTER, ierr)) 1198d9ecca5SBarry Smith PetscCallA(DMCreateFieldDecomposition(ada, nfields, namefields, isfields, dmfields, ierr)) 1208d9ecca5SBarry Smith PetscCallA(DMDestroyFieldDecomposition(ada, nfields, namefields, isfields, dmfields, ierr)) 1218d9ecca5SBarry Smith 122d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 123c4762a1bSJed Brown 124c4762a1bSJed Brown dof = 2 1255d83a8b1SBarry Smith PetscCallA(DMDACreate2d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, m, n, PETSC_DECIDE, PETSC_DECIDE, dof, s, PETSC_NULL_INTEGER_ARRAY, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 126d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 127d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 128d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, PETSC_NULL_INTEGER, xl, yl, PETSC_NULL_INTEGER, ierr)) 129ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x3, ierr)) 130c4762a1bSJed Brown do i = xs, xs + xl - 1 131c4762a1bSJed Brown do j = ys, ys + yl - 1 132c4762a1bSJed Brown! CHKMEMQ 133c4762a1bSJed Brown x3(0, i, j) = i + j 134c4762a1bSJed Brown x3(1, i, j) = -(i + j) 135c4762a1bSJed Brown! CHKMEMQ 136c4762a1bSJed Brown end do 137c4762a1bSJed Brown end do 138ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x3, ierr)) 139d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 140d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 141d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 142c4762a1bSJed Brown 143c4762a1bSJed Brown dof = 3 1445d83a8b1SBarry Smith PetscCallA(DMDACreate3d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DM_BOUNDARY_NONE, DMDA_STENCIL_BOX, m, n, p, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, dof, s, PETSC_NULL_INTEGER_ARRAY, PETSC_NULL_INTEGER_ARRAY, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 145d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 146d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 147d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, zs, xl, yl, zl, ierr)) 148ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x4, ierr)) 149c4762a1bSJed Brown do i = xs, xs + xl - 1 150c4762a1bSJed Brown do j = ys, ys + yl - 1 151c4762a1bSJed Brown do k = zs, zs + zl - 1 152c4762a1bSJed Brown! CHKMEMQ 153c4762a1bSJed Brown x4(0, i, j, k) = i + j + k 154c4762a1bSJed Brown x4(1, i, j, k) = -(i + j + k) 155c4762a1bSJed Brown x4(2, i, j, k) = i + j + k 156c4762a1bSJed Brown! CHKMEMQ 157c4762a1bSJed Brown end do 158c4762a1bSJed Brown end do 159c4762a1bSJed Brown end do 160ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x4, ierr)) 161d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 162d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 163d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 164c4762a1bSJed Brown 165d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 166c4762a1bSJed BrownEND PROGRAM 167c4762a1bSJed Brown 168c4762a1bSJed Brown! 169c4762a1bSJed Brown!/*TEST 170c4762a1bSJed Brown! 171c4762a1bSJed Brown! build: 172c4762a1bSJed Brown! requires: !complex 173c4762a1bSJed Brown! 174c4762a1bSJed Brown! test: 175c4762a1bSJed Brown! filter: Error: grep -v "Vec Object" | grep -v "Warning: ieee_inexact is signaling" 176c4762a1bSJed Brown! 177c4762a1bSJed Brown!TEST*/ 178