xref: /petsc/src/dm/tutorials/ex11f90.F90 (revision d8606c274c09e255c003062beb17b1be973467bc)
1c4762a1bSJed Brown      program main
2c4762a1bSJed Brown!-----------------------------------------------------------------------
3c4762a1bSJed Brown!
4c4762a1bSJed Brown!    Tests DMDAGetVecGetArray()
5c4762a1bSJed Brown!-----------------------------------------------------------------------
6c4762a1bSJed Brown!
7c4762a1bSJed Brown
8c4762a1bSJed Brown#include <petsc/finclude/petscdm.h>
9c4762a1bSJed Brown      use petsc
10c4762a1bSJed Brown      implicit none
11c4762a1bSJed Brown
12c4762a1bSJed Brown      Type(tVec)  g
13c4762a1bSJed Brown      Type(tDM)   ada
14c4762a1bSJed Brown
15c4762a1bSJed Brown      PetscScalar,pointer :: x1(:),x2(:,:)
16c4762a1bSJed Brown      PetscScalar,pointer :: x3(:,:,:),x4(:,:,:,:)
17c4762a1bSJed Brown      PetscErrorCode ierr
18c4762a1bSJed Brown      PetscInt m,n,p,dof,s,i,j,k,xs,xl
19c4762a1bSJed Brown      PetscInt ys,yl
20c4762a1bSJed Brown      PetscInt zs,zl,sw
21c4762a1bSJed Brown
22c4762a1bSJed Brown      m = 5
23c4762a1bSJed Brown      n = 6
24c4762a1bSJed Brown      p = 4;
25c4762a1bSJed Brown      s = 1
26c4762a1bSJed Brown      dof = 1
27c4762a1bSJed Brown      sw = 1
28*d8606c27SBarry Smith      PetscCallA(PetscInitialize(ierr))
29*d8606c27SBarry Smith      PetscCallA(DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,m,dof,sw,PETSC_NULL_INTEGER,ada,ierr))
30*d8606c27SBarry Smith      PetscCallA(DMSetUp(ada,ierr))
31*d8606c27SBarry Smith      PetscCallA(DMGetGlobalVector(ada,g,ierr))
32*d8606c27SBarry Smith      PetscCallA(DMDAGetCorners(ada,xs,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,xl,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,ierr))
33*d8606c27SBarry Smith      PetscCallA(DMDAVecGetArrayF90(ada,g,x1,ierr))
34c4762a1bSJed Brown      do i=xs,xs+xl-1
35c4762a1bSJed Brown!         CHKMEMQ
36c4762a1bSJed Brown         x1(i) = i
37c4762a1bSJed Brown!         CHKMEMQ
38c4762a1bSJed Brown      enddo
39*d8606c27SBarry Smith      PetscCallA(DMDAVecRestoreArrayF90(ada,g,x1,ierr))
40*d8606c27SBarry Smith      PetscCallA(VecView(g,PETSC_VIEWER_STDOUT_WORLD,ierr))
41*d8606c27SBarry Smith      PetscCallA(DMRestoreGlobalVector(ada,g,ierr))
42*d8606c27SBarry Smith      PetscCallA(DMDestroy(ada,ierr))
43c4762a1bSJed Brown
44*d8606c27SBarry 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,PETSC_NULL_INTEGER,ada,ierr))
45*d8606c27SBarry Smith      PetscCallA(DMSetUp(ada,ierr))
46*d8606c27SBarry Smith      PetscCallA(DMGetGlobalVector(ada,g,ierr))
47*d8606c27SBarry Smith      PetscCallA(DMDAGetCorners(ada,xs,ys,PETSC_NULL_INTEGER,xl,yl,PETSC_NULL_INTEGER,ierr))
48*d8606c27SBarry Smith      PetscCallA(DMDAVecGetArrayF90(ada,g,x2,ierr))
49c4762a1bSJed Brown      do i=xs,xs+xl-1
50c4762a1bSJed Brown        do j=ys,ys+yl-1
51c4762a1bSJed Brown!           CHKMEMQ
52c4762a1bSJed Brown           x2(i,j) = i + j
53c4762a1bSJed Brown!           CHKMEMQ
54c4762a1bSJed Brown        enddo
55c4762a1bSJed Brown      enddo
56*d8606c27SBarry Smith      PetscCallA(DMDAVecRestoreArrayF90(ada,g,x2,ierr))
57*d8606c27SBarry Smith      PetscCallA(VecView(g,PETSC_VIEWER_STDOUT_WORLD,ierr))
58*d8606c27SBarry Smith      PetscCallA(DMRestoreGlobalVector(ada,g,ierr))
59*d8606c27SBarry Smith      PetscCallA(DMDestroy(ada,ierr))
60c4762a1bSJed Brown
61*d8606c27SBarry 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,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,ada,ierr))
62*d8606c27SBarry Smith      PetscCallA(DMSetUp(ada,ierr))
63*d8606c27SBarry Smith      PetscCallA(DMGetGlobalVector(ada,g,ierr))
64*d8606c27SBarry Smith      PetscCallA(DMDAGetCorners(ada,xs,ys,zs,xl,yl,zl,ierr))
65*d8606c27SBarry Smith      PetscCallA(DMDAVecGetArrayF90(ada,g,x3,ierr))
66c4762a1bSJed Brown      do i=xs,xs+xl-1
67c4762a1bSJed Brown        do j=ys,ys+yl-1
68c4762a1bSJed Brown          do k=zs,zs+zl-1
69c4762a1bSJed Brown!            CHKMEMQ
70c4762a1bSJed Brown            x3(i,j,k) = i + j + k
71c4762a1bSJed Brown!            CHKMEMQ
72c4762a1bSJed Brown          enddo
73c4762a1bSJed Brown        enddo
74c4762a1bSJed Brown      enddo
75*d8606c27SBarry Smith      PetscCallA(DMDAVecRestoreArrayF90(ada,g,x3,ierr))
76*d8606c27SBarry Smith      PetscCallA(VecView(g,PETSC_VIEWER_STDOUT_WORLD,ierr))
77*d8606c27SBarry Smith      PetscCallA(DMRestoreGlobalVector(ada,g,ierr))
78*d8606c27SBarry Smith      PetscCallA(DMDestroy(ada,ierr))
79c4762a1bSJed Brown
80c4762a1bSJed Brown!
81c4762a1bSJed Brown!  Same tests but now with DOF > 1, so dimensions of array are one higher
82c4762a1bSJed Brown!
83c4762a1bSJed Brown      dof = 2
84*d8606c27SBarry Smith      PetscCallA(DMDACreate1d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,m,dof,sw,PETSC_NULL_INTEGER,ada,ierr))
85*d8606c27SBarry Smith      PetscCallA(DMSetUp(ada,ierr))
86*d8606c27SBarry Smith      PetscCallA(DMGetGlobalVector(ada,g,ierr))
87*d8606c27SBarry Smith      PetscCallA(DMDAGetCorners(ada,xs,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,xl,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,ierr))
88*d8606c27SBarry Smith      PetscCallA(DMDAVecGetArrayF90(ada,g,x2,ierr))
89c4762a1bSJed Brown      do i=xs,xs+xl-1
90c4762a1bSJed Brown!         CHKMEMQ
91c4762a1bSJed Brown         x2(0,i) = i
92c4762a1bSJed Brown         x2(1,i) = -i
93c4762a1bSJed Brown!         CHKMEMQ
94c4762a1bSJed Brown      enddo
95*d8606c27SBarry Smith      PetscCallA(DMDAVecRestoreArrayF90(ada,g,x1,ierr))
96*d8606c27SBarry Smith      PetscCallA(VecView(g,PETSC_VIEWER_STDOUT_WORLD,ierr))
97*d8606c27SBarry Smith      PetscCallA(DMRestoreGlobalVector(ada,g,ierr))
98*d8606c27SBarry Smith      PetscCallA(DMDestroy(ada,ierr))
99c4762a1bSJed Brown
100c4762a1bSJed Brown      dof = 2
101*d8606c27SBarry 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,PETSC_NULL_INTEGER,ada,ierr))
102*d8606c27SBarry Smith      PetscCallA(DMSetUp(ada,ierr))
103*d8606c27SBarry Smith      PetscCallA(DMGetGlobalVector(ada,g,ierr))
104*d8606c27SBarry Smith      PetscCallA(DMDAGetCorners(ada,xs,ys,PETSC_NULL_INTEGER,xl,yl,PETSC_NULL_INTEGER,ierr))
105*d8606c27SBarry Smith      PetscCallA(DMDAVecGetArrayF90(ada,g,x3,ierr))
106c4762a1bSJed Brown      do i=xs,xs+xl-1
107c4762a1bSJed Brown        do j=ys,ys+yl-1
108c4762a1bSJed Brown!           CHKMEMQ
109c4762a1bSJed Brown           x3(0,i,j) = i + j
110c4762a1bSJed Brown           x3(1,i,j) = -(i + j)
111c4762a1bSJed Brown!           CHKMEMQ
112c4762a1bSJed Brown        enddo
113c4762a1bSJed Brown      enddo
114*d8606c27SBarry Smith      PetscCallA(DMDAVecRestoreArrayF90(ada,g,x3,ierr))
115*d8606c27SBarry Smith      PetscCallA(VecView(g,PETSC_VIEWER_STDOUT_WORLD,ierr))
116*d8606c27SBarry Smith      PetscCallA(DMRestoreGlobalVector(ada,g,ierr))
117*d8606c27SBarry Smith      PetscCallA(DMDestroy(ada,ierr))
118c4762a1bSJed Brown
119c4762a1bSJed Brown      dof = 3
120*d8606c27SBarry 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,PETSC_NULL_INTEGER,PETSC_NULL_INTEGER,ada,ierr))
121*d8606c27SBarry Smith      PetscCallA(DMSetUp(ada,ierr))
122*d8606c27SBarry Smith      PetscCallA(DMGetGlobalVector(ada,g,ierr))
123*d8606c27SBarry Smith      PetscCallA(DMDAGetCorners(ada,xs,ys,zs,xl,yl,zl,ierr))
124*d8606c27SBarry Smith      PetscCallA(DMDAVecGetArrayF90(ada,g,x4,ierr))
125c4762a1bSJed Brown      do i=xs,xs+xl-1
126c4762a1bSJed Brown        do j=ys,ys+yl-1
127c4762a1bSJed Brown          do k=zs,zs+zl-1
128c4762a1bSJed Brown!            CHKMEMQ
129c4762a1bSJed Brown            x4(0,i,j,k) = i + j + k
130c4762a1bSJed Brown            x4(1,i,j,k) = -(i + j + k)
131c4762a1bSJed Brown            x4(2,i,j,k) = i + j + k
132c4762a1bSJed Brown!            CHKMEMQ
133c4762a1bSJed Brown          enddo
134c4762a1bSJed Brown        enddo
135c4762a1bSJed Brown      enddo
136*d8606c27SBarry Smith      PetscCallA(DMDAVecRestoreArrayF90(ada,g,x4,ierr))
137*d8606c27SBarry Smith      PetscCallA(VecView(g,PETSC_VIEWER_STDOUT_WORLD,ierr))
138*d8606c27SBarry Smith      PetscCallA(DMRestoreGlobalVector(ada,g,ierr))
139*d8606c27SBarry Smith      PetscCallA(DMDestroy(ada,ierr))
140c4762a1bSJed Brown
141*d8606c27SBarry Smith      PetscCallA(PetscFinalize(ierr))
142c4762a1bSJed Brown      END PROGRAM
143c4762a1bSJed Brown
144c4762a1bSJed Brown!
145c4762a1bSJed Brown!/*TEST
146c4762a1bSJed Brown!
147c4762a1bSJed Brown!   build:
148c4762a1bSJed Brown!     requires: !complex
149c4762a1bSJed Brown!
150c4762a1bSJed Brown!   test:
151c4762a1bSJed Brown!     filter: Error: grep -v "Vec Object" | grep -v "Warning: ieee_inexact is signaling"
152c4762a1bSJed Brown!
153c4762a1bSJed Brown!TEST*/
154