Skip to content

Commit e911eb2

Browse files
committed
Remove globals from poisson and update tests to handle this
1 parent 1e4bf1c commit e911eb2

File tree

5 files changed

+173
-85
lines changed

5 files changed

+173
-85
lines changed

src/poisson/main.f90

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ program main
33

44
implicit none
55

6-
integer :: element_to_node(3,mxe), vb_index(mxe), boundary_node_num(2,mxb), num_side_nodes(4,mxb)
6+
integer :: num_nodes, num_elements, num_boundary_points, element_to_node(3,mxe), vb_index(mxe), boundary_node_num(2,mxb), num_side_nodes(4,mxb)
77
real :: coordinates(2, mxp), nodal_value_of_f(mxp), vb1(mxc), vb2(mxc), vb(3,mxc)
88
integer :: fname_io = 100, fname_out_io = 101
99

@@ -37,15 +37,15 @@ program main
3737
!!
3838
!! *** Reads the triangular mesh and problem constants: Kx,Ky,Q,fp,q
3939
!!
40-
call inp(element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,fname_io)
40+
call inp(num_nodes,num_elements,num_boundary_points,element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,fname_io)
4141

4242
!!
4343
!! *** Assembles and solves the system of equations
4444
!!
45-
call pcg(element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,nodal_value_of_f)
45+
call pcg(num_nodes,num_elements,num_boundary_points,element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,nodal_value_of_f)
4646

4747
!!
4848
!! *** Writes the computed solution
4949
!!
50-
call out(element_to_node,coordinates,nodal_value_of_f,fname_out_io)
50+
call out(num_nodes,num_elements,element_to_node,coordinates,nodal_value_of_f,fname_out_io)
5151
end program main

src/poisson/poisson.f90

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,6 @@ module poisson
9494
integer, parameter :: mxb = 5000
9595
integer, parameter :: mxc = 100
9696

97-
integer :: num_nodes, num_elements, num_boundary_points, num_sets, num_dirichlet_boundary_conditions, &
98-
num_neumann_boundary_conditions
99-
10097
contains
10198

10299
subroutine open_file(file_name, status, file_io)
@@ -124,15 +121,18 @@ end subroutine open_file
124121
!! "inp" reads the input data: triangular mesh and problem parameters. *
125122
!! *
126123
!!-----------------------------------------------------------------------------*
127-
subroutine inp(element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,file_io)
124+
subroutine inp(num_nodes,num_elements,num_boundary_points,element_to_node,vb_index,coordinates, &
125+
boundary_node_num,num_side_nodes,vb,vb1,vb2,file_io)
128126
implicit none
129127

130-
integer, intent(out) :: element_to_node(3,mxp), vb_index(mxe), boundary_node_num(2,mxb), &
128+
integer, intent(out) :: num_nodes, num_elements, num_boundary_points, &
129+
element_to_node(3,mxp), vb_index(mxe), boundary_node_num(2,mxb), &
131130
num_side_nodes(4,mxb)
132131
real, intent(out) :: vb(3,mxc), vb1(mxc), vb2(mxc), coordinates(2, mxp)
133132
integer, intent(in) :: file_io
134133

135-
integer :: mx, ib, ip, ie, jb, jp, je, icheck
134+
integer :: mx, ib, ip, ie, jb, jp, je, icheck, num_sets, num_dirichlet_boundary_conditions, &
135+
num_neumann_boundary_conditions
136136
character*80 :: text
137137

138138
read(file_io,'(a)') text
@@ -237,12 +237,13 @@ end subroutine inp
237237
!! method. *
238238
!! *
239239
!!-----------------------------------------------------------------------------*
240-
subroutine pcg(element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,nodal_value_of_f)
240+
subroutine pcg(num_nodes,num_elements,num_boundary_points,element_to_node,vb_index,coordinates,boundary_node_num,num_side_nodes,vb,vb1,vb2,nodal_value_of_f)
241241
implicit none
242242

243243
real, parameter :: eps = 1.e-04
244244

245-
integer, intent(in) :: element_to_node(3,mxp), vb_index(mxe), boundary_node_num(2,mxb), num_side_nodes(4,mxb)
245+
integer, intent(in) :: num_nodes, num_elements, num_boundary_points, &
246+
element_to_node(3,mxp), vb_index(mxe), boundary_node_num(2,mxb), num_side_nodes(4,mxb)
246247
real, intent(in) :: coordinates(2, mxp), vb(3,mxc), vb1(mxc), vb2(mxc)
247248
real, intent(out) :: nodal_value_of_f(mxp)
248249

@@ -444,7 +445,7 @@ subroutine pcg(element_to_node,vb_index,coordinates,boundary_node_num,num_side_n
444445

445446
is_converged = res.le.rh0*tol
446447
if(is_converged) then
447-
write(*,'(a,i4)') ' *** PCG converged: iterations = ',it
448+
! write(*,'(a,i4)') ' *** PCG converged: iterations = ',it
448449
exit
449450
endif
450451
end do nit_loop
@@ -461,10 +462,10 @@ end subroutine pcg
461462
!!-----------------------------------------------------------------------------*
462463
!! "out" writes output results. *
463464
!!-----------------------------------------------------------------------------*
464-
subroutine out(element_to_node,coordinates,nodal_value_of_f,file_io)
465+
subroutine out(num_nodes,num_elements,element_to_node,coordinates,nodal_value_of_f,file_io)
465466
implicit none
466467

467-
integer, intent(in) :: element_to_node(3,mxp), file_io
468+
integer, intent(in) :: num_nodes,num_elements,element_to_node(3,mxp), file_io
468469
real, intent(in) :: nodal_value_of_f(mxp), coordinates(2, mxp)
469470

470471
integer :: ip, ie

testing/test-drive/test_poisson.f90

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ module test_drive_poisson
2020
!> inp test inputs
2121
type :: inp_inputs_t
2222
character(len=:), allocatable :: data_filename
23-
type(mesh_scalars_t) :: mesh_scalars
2423
end type inp_inputs_t
2524

2625
!> inp test expected outputs
2726
type :: inp_expected_outputs_t
27+
type(mesh_scalars_t) :: mesh_scalars
2828
type(mesh_vectors_t) :: mesh_vectors
2929
end type inp_expected_outputs_t
3030

@@ -40,6 +40,13 @@ module test_drive_poisson
4040
real :: nodal_value_of_f(mxp)
4141
end type pcg_expected_outputs_t
4242

43+
!> out test inputs
44+
type :: out_inputs_t
45+
type(mesh_scalars_t) :: mesh_scalars
46+
type(mesh_vectors_t) :: mesh_vectors
47+
real :: nodal_value_of_f(mxp)
48+
end type out_inputs_t
49+
4350
contains
4451

4552
!> Collect all test in this module into a single test suite
@@ -98,7 +105,8 @@ subroutine verify_inp(error, inputs, expected_outputs)
98105
type(inp_inputs_t), intent(in) :: inputs
99106
type(inp_expected_outputs_t), intent(in) :: expected_outputs
100107

101-
integer :: actual_element_to_node(3,mxp), actual_vb_index(mxe), actual_boundary_node_num(2,mxb), &
108+
integer :: actual_num_nodes, actual_num_elements, actual_num_boundary_points, &
109+
actual_element_to_node(3,mxp), actual_vb_index(mxe), actual_boundary_node_num(2,mxb), &
102110
actual_num_side_nodes(4,mxb), file_io = 123, i, j
103111
real :: actual_vb(3,mxc), actual_vb1(mxc), actual_vb2(mxc), actual_coordinates(2, mxp)
104112
character(len=200) :: failure_message
@@ -107,21 +115,31 @@ subroutine verify_inp(error, inputs, expected_outputs)
107115
! Open the file ready to be read
108116
call open_file(inputs%data_filename, 'old', file_io)
109117

110-
call inp( &
111-
actual_element_to_node, &
112-
actual_vb_index, &
113-
actual_coordinates, &
114-
actual_boundary_node_num, &
115-
actual_num_side_nodes, &
116-
actual_vb, &
117-
actual_vb1, &
118-
actual_vb2, &
119-
file_io &
118+
call inp( &
119+
actual_num_nodes, &
120+
actual_num_elements, &
121+
actual_num_boundary_points, &
122+
actual_element_to_node, &
123+
actual_vb_index, &
124+
actual_coordinates, &
125+
actual_boundary_node_num, &
126+
actual_num_side_nodes, &
127+
actual_vb, &
128+
actual_vb1, &
129+
actual_vb2, &
130+
file_io &
120131
)
121132

122133
close(file_io)
123134

124-
do i = 1, inputs%mesh_scalars%num_elements
135+
call check(error, actual_num_nodes, expected_outputs%mesh_scalars%num_nodes)
136+
if (allocated(error)) return
137+
call check(error, actual_num_elements, expected_outputs%mesh_scalars%num_elements)
138+
if (allocated(error)) return
139+
call check(error, actual_num_boundary_points, expected_outputs%mesh_scalars%num_boundary_points)
140+
if (allocated(error)) return
141+
142+
do i = 1, expected_outputs%mesh_scalars%num_elements
125143
do j = 1, 3
126144
write(failure_message,'(a,i1,a,i1,a,i2,a,i2)') "Unexpected value for element_to_node(", j, ",", i, "), got ", actual_element_to_node(j, i), " expected ", expected_outputs%mesh_vectors%element_to_node(j, i)
127145
call check(error, actual_element_to_node(j, i), expected_outputs%mesh_vectors%element_to_node(j, i), failure_message)
@@ -133,15 +151,15 @@ subroutine verify_inp(error, inputs, expected_outputs)
133151
if (allocated(error)) return
134152
end do
135153

136-
do i = 1, inputs%mesh_scalars%num_nodes
154+
do i = 1, expected_outputs%mesh_scalars%num_nodes
137155
do j = 1, 2
138156
write(failure_message,'(a,i1,a,i1,a,f5.2,a,f5.2)') "Unexpected value for coordinates(", j, ",", i, "), got ", actual_coordinates(j, i), " expected ", expected_outputs%mesh_vectors%coordinates(j, i)
139157
call check(error, actual_coordinates(j, i), expected_outputs%mesh_vectors%coordinates(j, i), failure_message, thr=threshold)
140158
if (allocated(error)) return
141159
end do
142160
end do
143161

144-
do i = 1, inputs%mesh_scalars%num_boundary_points
162+
do i = 1, expected_outputs%mesh_scalars%num_boundary_points
145163
do j = 1, 2
146164
write(failure_message,'(a,i1,a,i1,a,i2,a,i2)') "Unexpected value for boundary_node_num(", j, ",", i, "), got ", actual_boundary_node_num(j, i), " expected ", expected_outputs%mesh_vectors%boundary_node_num(j, i)
147165
call check(error, actual_boundary_node_num(j, i), expected_outputs%mesh_vectors%boundary_node_num(j, i), failure_message)
@@ -155,21 +173,21 @@ subroutine verify_inp(error, inputs, expected_outputs)
155173
end do
156174
end do
157175

158-
do i = 1, inputs%mesh_scalars%num_sets
176+
do i = 1, expected_outputs%mesh_scalars%num_sets
159177
do j = 1, 3
160178
write(failure_message,'(a,i1,a,i1,a,f5.2,a,f5.2)') "Unexpected value for vb(", j, ",", i, "), got ", actual_vb(j, i), " expected ", expected_outputs%mesh_vectors%vb(j, i)
161179
call check(error, actual_vb(j, i), expected_outputs%mesh_vectors%vb(j, i), failure_message, thr=threshold)
162180
if (allocated(error)) return
163181
end do
164182
end do
165183

166-
do i = 1, inputs%mesh_scalars%num_dirichlet_boundary_conditions
184+
do i = 1, expected_outputs%mesh_scalars%num_dirichlet_boundary_conditions
167185
write(failure_message,'(a,i1,a,f5.2,a,f5.2)') "Unexpected value for vb1(", i, "), got ", actual_vb1(i), " expected ", expected_outputs%mesh_vectors%vb1(i)
168186
call check(error, actual_vb1(i), expected_outputs%mesh_vectors%vb1(i), failure_message, thr=threshold)
169187
if (allocated(error)) return
170188
end do
171189

172-
do i = 1, inputs%mesh_scalars%num_neumann_boundary_conditions
190+
do i = 1, expected_outputs%mesh_scalars%num_neumann_boundary_conditions
173191
write(failure_message,'(a,i1,a,f5.2,a,f5.2)') "Unexpected value for vb2(", i, "), got ", actual_vb2(i), " expected ", expected_outputs%mesh_vectors%vb2(i)
174192
call check(error, actual_vb2(i), expected_outputs%mesh_vectors%vb2(i), failure_message, thr=threshold)
175193
if (allocated(error)) return
@@ -183,7 +201,7 @@ subroutine test_inp_15_05(error)
183201
type(inp_inputs_t) :: inputs
184202
type(inp_expected_outputs_t) :: expected_outputs
185203

186-
call get_15_05_mesh_values(inputs%data_filename, inputs%mesh_scalars, expected_outputs%mesh_vectors)
204+
call get_15_05_mesh_values(inputs%data_filename, expected_outputs%mesh_scalars, expected_outputs%mesh_vectors)
187205

188206
call verify_inp(error, inputs, expected_outputs)
189207

@@ -202,16 +220,19 @@ subroutine verify_pcg(error, inputs, expected_outputs)
202220
real :: threshold = 1e-06
203221
integer :: i
204222

205-
call pcg( &
206-
inputs%mesh_vectors%element_to_node, &
207-
inputs%mesh_vectors%vb_index, &
208-
inputs%mesh_vectors%coordinates, &
209-
inputs%mesh_vectors%boundary_node_num, &
210-
inputs%mesh_vectors%num_side_nodes, &
211-
inputs%mesh_vectors%vb, &
212-
inputs%mesh_vectors%vb1, &
213-
inputs%mesh_vectors%vb2, &
214-
actual_nodal_value_of_f &
223+
call pcg(&
224+
inputs%mesh_scalars%num_nodes, &
225+
inputs%mesh_scalars%num_elements, &
226+
inputs%mesh_scalars%num_boundary_points, &
227+
inputs%mesh_vectors%element_to_node, &
228+
inputs%mesh_vectors%vb_index, &
229+
inputs%mesh_vectors%coordinates, &
230+
inputs%mesh_vectors%boundary_node_num, &
231+
inputs%mesh_vectors%num_side_nodes, &
232+
inputs%mesh_vectors%vb, &
233+
inputs%mesh_vectors%vb1, &
234+
inputs%mesh_vectors%vb2, &
235+
actual_nodal_value_of_f &
215236
)
216237

217238
! verify outputs
@@ -237,4 +258,15 @@ subroutine test_pcg_15_05(error)
237258

238259
deallocate(inputs%data_filename)
239260
end subroutine test_pcg_15_05
261+
262+
subroutine verify_out(error, inputs, expected_outputs)
263+
implicit none
264+
type(error_type), allocatable, intent(out) :: error
265+
266+
type(inp_inputs_t), intent(in) :: inputs
267+
type(inp_expected_outputs_t), intent(in) :: expected_outputs
268+
269+
! Verification code for the out subroutine
270+
! This is a placeholder for the actual verification code
271+
end subroutine verify_out
240272
end module

0 commit comments

Comments
 (0)