xref: /petsc/src/dm/tutorials/ex11f90.F90 (revision 9b88ac225e01f016352a5f4cd90e158abe5f5675)
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