1c4762a1bSJed Brown! Tests DMDAGetVecGetArray() 2ce78bad3SBarry Smith#include <petsc/finclude/petscdmda.h> 3c5e229c2SMartin Diehlprogram main 4ce78bad3SBarry Smith use petscdmda 5c4762a1bSJed Brown implicit none 6c4762a1bSJed Brown 7*02c639afSMartin Diehl type(tVec) g 8*02c639afSMartin Diehl type(tDM) ada 9c4762a1bSJed Brown 10c4762a1bSJed Brown PetscScalar, pointer :: x1(:), x2(:, :) 11c4762a1bSJed Brown PetscScalar, pointer :: x3(:, :, :), x4(:, :, :, :) 12c4762a1bSJed Brown PetscErrorCode ierr 13c4762a1bSJed Brown PetscInt m, n, p, dof, s, i, j, k, xs, xl 14c4762a1bSJed Brown PetscInt ys, yl 15c4762a1bSJed Brown PetscInt zs, zl, sw 16c4762a1bSJed Brown 17659f25fdSBarry Smith PetscInt nen, nel 18659f25fdSBarry Smith PetscInt, pointer :: elements(:) 19659f25fdSBarry Smith 208d9ecca5SBarry Smith PetscInt nfields 218d9ecca5SBarry Smith character(80), pointer :: namefields(:) 228d9ecca5SBarry Smith IS, pointer :: isfields(:) 238d9ecca5SBarry Smith DM, pointer :: dmfields(:) 248d9ecca5SBarry Smith PetscInt zero, one 258d9ecca5SBarry Smith 26c4762a1bSJed Brown m = 5 27c4762a1bSJed Brown n = 6 28ccfd86f1SBarry Smith p = 4 29c4762a1bSJed Brown s = 1 30c4762a1bSJed Brown dof = 1 31c4762a1bSJed Brown sw = 1 328d9ecca5SBarry Smith zero = 0 338d9ecca5SBarry Smith one = 1 34d8606c27SBarry Smith PetscCallA(PetscInitialize(ierr)) 355d83a8b1SBarry Smith PetscCallA(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, m, dof, sw, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 36d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 37d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 38d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, xl, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, ierr)) 39ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x1, ierr)) 40c4762a1bSJed Brown do i = xs, xs + xl - 1 41c4762a1bSJed Brown! CHKMEMQ 42c4762a1bSJed Brown x1(i) = i 43c4762a1bSJed Brown! CHKMEMQ 44c4762a1bSJed Brown end do 45ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x1, ierr)) 46d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 47d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 48d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 49c4762a1bSJed Brown 505d83a8b1SBarry 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)) 51d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 52d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 53d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, PETSC_NULL_INTEGER, xl, yl, PETSC_NULL_INTEGER, ierr)) 54ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x2, ierr)) 55c4762a1bSJed Brown do i = xs, xs + xl - 1 56c4762a1bSJed Brown do j = ys, ys + yl - 1 57c4762a1bSJed Brown! CHKMEMQ 58c4762a1bSJed Brown x2(i, j) = i + j 59c4762a1bSJed Brown! CHKMEMQ 60c4762a1bSJed Brown end do 61c4762a1bSJed Brown end do 62ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x2, ierr)) 63d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 64d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 65659f25fdSBarry Smith 66659f25fdSBarry Smith PetscCallA(DMDAGetElements(ada, nen, nel, elements, ierr)) 67659f25fdSBarry Smith do i = 1, nen*nel 684820e4eaSBarry Smith PetscCheckA(elements(i) >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, 'Error getting DMDA elements') 69659f25fdSBarry Smith end do 70659f25fdSBarry Smith PetscCallA(DMDARestoreElements(ada, nen, nel, elements, ierr)) 71d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 72c4762a1bSJed Brown 735d83a8b1SBarry 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)) 74d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 75d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 76d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, zs, xl, yl, zl, ierr)) 77ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x3, ierr)) 78c4762a1bSJed Brown do i = xs, xs + xl - 1 79c4762a1bSJed Brown do j = ys, ys + yl - 1 80c4762a1bSJed Brown do k = zs, zs + zl - 1 81c4762a1bSJed Brown! CHKMEMQ 82c4762a1bSJed Brown x3(i, j, k) = i + j + k 83c4762a1bSJed Brown! CHKMEMQ 84c4762a1bSJed Brown end do 85c4762a1bSJed Brown end do 86c4762a1bSJed Brown end do 87ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x3, ierr)) 88d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 89d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 90d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 91c4762a1bSJed Brown 92c4762a1bSJed Brown! 93c4762a1bSJed Brown! Same tests but now with DOF > 1, so dimensions of array are one higher 94c4762a1bSJed Brown! 95c4762a1bSJed Brown dof = 2 965d83a8b1SBarry Smith PetscCallA(DMDACreate1d(PETSC_COMM_WORLD, DM_BOUNDARY_NONE, m, dof, sw, PETSC_NULL_INTEGER_ARRAY, ada, ierr)) 97d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 98d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 99d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, xl, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, ierr)) 100ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x2, ierr)) 101c4762a1bSJed Brown do i = xs, xs + xl - 1 102c4762a1bSJed Brown! CHKMEMQ 103c4762a1bSJed Brown x2(0, i) = i 104c4762a1bSJed Brown x2(1, i) = -i 105c4762a1bSJed Brown! CHKMEMQ 106c4762a1bSJed Brown end do 107ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x1, ierr)) 108d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 109d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 1108d9ecca5SBarry Smith 1118d9ecca5SBarry Smith ! some testing unrelated to the example 1128d9ecca5SBarry Smith PetscCallA(DMDASetFieldName(ada, zero, 'Field 0', ierr)) 1138d9ecca5SBarry Smith PetscCallA(DMDASetFieldName(ada, one, 'Field 1', ierr)) 1148d9ecca5SBarry Smith PetscCallA(DMCreateFieldDecomposition(ada, nfields, namefields, PETSC_NULL_IS_POINTER, PETSC_NULL_DM_POINTER, ierr)) 1158d9ecca5SBarry Smith ! print*,nfields,trim(namefields(1)),trim(namefields(2)) 1168d9ecca5SBarry Smith PetscCallA(DMDestroyFieldDecomposition(ada, nfields, namefields, PETSC_NULL_IS_POINTER, PETSC_NULL_DM_POINTER, ierr)) 1178d9ecca5SBarry Smith PetscCallA(DMCreateFieldDecomposition(ada, nfields, namefields, isfields, dmfields, ierr)) 1188d9ecca5SBarry Smith PetscCallA(DMDestroyFieldDecomposition(ada, nfields, namefields, isfields, dmfields, ierr)) 1198d9ecca5SBarry Smith 120d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 121c4762a1bSJed Brown 122c4762a1bSJed Brown dof = 2 1235d83a8b1SBarry 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)) 124d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 125d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 126d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, PETSC_NULL_INTEGER, xl, yl, PETSC_NULL_INTEGER, ierr)) 127ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x3, ierr)) 128c4762a1bSJed Brown do i = xs, xs + xl - 1 129c4762a1bSJed Brown do j = ys, ys + yl - 1 130c4762a1bSJed Brown! CHKMEMQ 131c4762a1bSJed Brown x3(0, i, j) = i + j 132c4762a1bSJed Brown x3(1, i, j) = -(i + j) 133c4762a1bSJed Brown! CHKMEMQ 134c4762a1bSJed Brown end do 135c4762a1bSJed Brown end do 136ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x3, ierr)) 137d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 138d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 139d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 140c4762a1bSJed Brown 141c4762a1bSJed Brown dof = 3 1425d83a8b1SBarry 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)) 143d8606c27SBarry Smith PetscCallA(DMSetUp(ada, ierr)) 144d8606c27SBarry Smith PetscCallA(DMGetGlobalVector(ada, g, ierr)) 145d8606c27SBarry Smith PetscCallA(DMDAGetCorners(ada, xs, ys, zs, xl, yl, zl, ierr)) 146ce78bad3SBarry Smith PetscCallA(DMDAVecGetArray(ada, g, x4, ierr)) 147c4762a1bSJed Brown do i = xs, xs + xl - 1 148c4762a1bSJed Brown do j = ys, ys + yl - 1 149c4762a1bSJed Brown do k = zs, zs + zl - 1 150c4762a1bSJed Brown! CHKMEMQ 151c4762a1bSJed Brown x4(0, i, j, k) = i + j + k 152c4762a1bSJed Brown x4(1, i, j, k) = -(i + j + k) 153c4762a1bSJed Brown x4(2, i, j, k) = i + j + k 154c4762a1bSJed Brown! CHKMEMQ 155c4762a1bSJed Brown end do 156c4762a1bSJed Brown end do 157c4762a1bSJed Brown end do 158ce78bad3SBarry Smith PetscCallA(DMDAVecRestoreArray(ada, g, x4, ierr)) 159d8606c27SBarry Smith PetscCallA(VecView(g, PETSC_VIEWER_STDOUT_WORLD, ierr)) 160d8606c27SBarry Smith PetscCallA(DMRestoreGlobalVector(ada, g, ierr)) 161d8606c27SBarry Smith PetscCallA(DMDestroy(ada, ierr)) 162c4762a1bSJed Brown 163d8606c27SBarry Smith PetscCallA(PetscFinalize(ierr)) 164*02c639afSMartin Diehlend program 165c4762a1bSJed Brown 166c4762a1bSJed Brown! 167c4762a1bSJed Brown!/*TEST 168c4762a1bSJed Brown! 169c4762a1bSJed Brown! build: 170c4762a1bSJed Brown! requires: !complex 171c4762a1bSJed Brown! 172c4762a1bSJed Brown! test: 173c4762a1bSJed Brown! filter: Error: grep -v "Vec Object" | grep -v "Warning: ieee_inexact is signaling" 174c4762a1bSJed Brown! 175c4762a1bSJed Brown!TEST*/ 176