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