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