Skip to content

Commit e73a809

Browse files
committed
Merge pull request #11 from Parallel-in-Time/fix_rnd_numbers
Fix rnd numbers
2 parents f476263 + cea23f2 commit e73a809

File tree

4 files changed

+88
-52
lines changed

4 files changed

+88
-52
lines changed

src/run_timestepper.f90

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ PROGRAM run_timestepper
6767

6868
! Load initial value
6969
ALLOCATE(Q(-2:Nx+3,-2:Ny+3,-2:Nz+3))
70-
OPEN(unit=100, file='q0.dat', ACTION='read', STATUS='old')
71-
READ(100,'(F35.25)') Q
72-
CLOSE(100)
70+
OPEN(unit=11, file='q0.dat', ACTION='read', STATUS='old')
71+
READ(11,'(F35.25)') Q
72+
CLOSE(11)
7373

7474
! Output
7575
IF (be_verbose) THEN
@@ -108,4 +108,4 @@ PROGRAM run_timestepper
108108
CALL FinalizeTimestepper
109109
CALL MPI_FINALIZE(ierr)
110110

111-
END PROGRAM run_timestepper
111+
END PROGRAM run_timestepper

test/src/advection_boundaries_test.f90

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,27 @@ PROGRAM advection_boundaries_test
1313
DOUBLE PRECISION, PARAMETER :: pi = 3.1415926535897932_8 ! underscore indicates rounding to real(8) precision
1414
DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:,:) :: Q, RQ, Qbc, RQbc
1515
DOUBLE PRECISION :: dx, dy, dz, x, y, z
16-
INTEGER :: Nx, Ny, Nz, i, j, k, order, Nthreads, nt, seed, time1(8)
16+
INTEGER :: Nx, Ny, Nz, i, j, k, order, Nthreads, nt, seed_size, clock
17+
INTEGER, PARAMETER :: N_min = 6, N_max = 128
1718

18-
CALL DATE_AND_TIME(values=time1)
19-
seed = 1000*time1(7)+time1(8)
20-
CALL SRAND(seed)
19+
INTEGER, ALLOCATABLE, DIMENSION(:) :: seed
20+
REAL :: random_real
21+
22+
CALL RANDOM_SEED(size = seed_size)
23+
ALLOCATE(seed(seed_size))
24+
CALL SYSTEM_CLOCK(count = clock)
25+
seed = clock + 37 * (/ (i - 1, i = 1, seed_size) /)
26+
CALL RANDOM_SEED(put = seed)
27+
DEALLOCATE(seed)
2128

2229
! Generate random values of Nx, Ny, Nz that are at least 6, to exclude too small domains
23-
Nx = 6 + INT( RAND()*128 )
24-
Ny = 6 + INT( RAND()*128 )
25-
Nz = 6 + INT( RAND()*128 )
30+
CALL RANDOM_NUMBER(random_real)
31+
Nx = N_min + FLOOR( (N_max+1-N_min)*random_real )
32+
CALL RANDOM_NUMBER(random_real)
33+
Ny = N_min + FLOOR( (N_max+1-N_min)*random_real )
34+
CALL RANDOM_NUMBER(random_real)
35+
Nz = N_min + FLOOR( (N_max+1-N_min)*random_real )
36+
2637
Nthreads = 8
2738

2839
ALLOCATE(Q( -2:Nx+3,-2:Ny+3,-2:Nz+3,0:Nthreads-1))
@@ -111,4 +122,4 @@ PROGRAM advection_boundaries_test
111122

112123
PRINT*, '\x1B[32m[0] -- Successful: GetRHSAdvection produces identical results when ghost-cells are filled manually or through the boundaries module.\x1B[0m'
113124

114-
END PROGRAM advection_boundaries_test
125+
END PROGRAM advection_boundaries_test

test/src/advection_test.f90

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -25,37 +25,43 @@ PROGRAM Upwind_Test
2525
DOUBLE PRECISION, DIMENSION(Nthreads) :: runtimes
2626
INTEGER :: i, j, k, r, nt, ierr, mpi_thread_provided, i_add, j_add, k_add
2727

28-
INTEGER :: Nx, Ny, Nz, i_start, i_end, j_start, j_end, k_start, k_end, seed, time1(8), order
28+
INTEGER, ALLOCATABLE, DIMENSION(:) :: seed
29+
30+
INTEGER :: Nx, Ny, Nz, i_start, i_end, j_start, j_end, k_start, k_end, seed_size, clock, order
31+
REAL :: random_real
2932

3033
LOGICAL, PARAMETER, DIMENSION(3) :: do_test = (/ .true. , .true., .true. /)
3134

3235
CALL MPI_INIT_THREAD(MPI_THREAD_FUNNELED, mpi_thread_provided, ierr)
3336

3437
! Create two random value for the offsets
35-
CALL DATE_AND_TIME(values=time1)
36-
seed = 1000*time1(7)+time1(8)
37-
CALL SRAND(seed)
38+
CALL RANDOM_SEED(size = seed_size)
39+
ALLOCATE(seed(seed_size))
40+
CALL SYSTEM_CLOCK(count = clock)
41+
seed = clock + 37 * (/ (i - 1, i = 1, seed_size) /)
42+
CALL RANDOM_SEED(put = seed)
43+
DEALLOCATE(seed)
3844

3945
IF (do_test(1)) THEN
4046

4147
! Test for order 1 and 5
4248
DO order=1,5,4
4349

44-
Nx = 128 + INT( RAND()*128 )
45-
Ny = 128 + INT( RAND()*128 )
46-
Nz = 128 + INT( RAND()*128 )
50+
Nx = random_integer(128, 256)
51+
Ny = random_integer(128, 256)
52+
Nz = random_integer(128, 256)
4753

4854
! Generate three random integers between -256 and +256
49-
i_start = INT( RAND()*(256+1+256) )-256
50-
j_start = INT( RAND()*(256+1+256) )-256
51-
k_start = INT( RAND()*(256+1+256) )-256
55+
i_start = random_integer(-256, 256)
56+
j_start = random_integer(-256, 256)
57+
k_start = random_integer(-256, 256)
5258

5359
! Then generate three more positive random integers between 3 and 32.
5460
! In initialization, the used buffer is enlarged by these numbers to verify the routine
5561
! can correctly work on a subset of the allocated buffer
56-
i_add = 3 + INT( RAND()*32 )
57-
j_add = 3 + INT( RAND()*32 )
58-
k_add = 3 + INT( RAND()*32 )
62+
i_add = random_integer(3, 32)
63+
j_add = random_integer(3, 32)
64+
k_add = random_integer(3, 32)
5965

6066
! The first test makes sure that a constant Q leads to a zero flux divergence. This is
6167
! for running 1 to 8 concurrent calls to GetRHS. Also, the time is measured in some
@@ -80,7 +86,7 @@ PROGRAM Upwind_Test
8086
CALL OMP_SET_NUM_THREADS(nt)
8187

8288
! fill Q with constant random value
83-
q_val = RAND(1)
89+
CALL RANDOM_NUMBER(q_val)
8490

8591
!$OMP PARALLEL DO schedule(static)
8692
DO i=0,nt-1
@@ -134,21 +140,21 @@ PROGRAM Upwind_Test
134140
! TEST 2: Make sure that if Q is constant in one dimension, so is the resulting RQ
135141
IF (do_test(2)) THEN
136142

137-
Nx = 32 + INT( RAND()*32 )
138-
Ny = 32 + INT( RAND()*32 )
139-
Nz = 32 + INT( RAND()*32 )
143+
Nx = random_integer(32, 64)
144+
Ny = random_integer(32, 64)
145+
Nz = random_integer(32, 64)
140146

141147
! Generate three random integers between -256 and +256
142-
i_start = INT( RAND()*(256+1+256) )-256
143-
j_start = INT( RAND()*(256+1+256) )-256
144-
k_start = INT( RAND()*(256+1+256) )-256
148+
i_start = random_integer(-256, 256)
149+
j_start = random_integer(-256, 256)
150+
k_start = random_integer(-256, 256)
145151

146152
! Then generate three more positive random integers between 3 and 32.
147153
! In initialization, the used buffer is enlarged by these numbers to verify the routine
148154
! can correctly work on a subset of the allocated buffer
149-
i_add = 3 + INT( RAND()*32 )
150-
j_add = 3 + INT( RAND()*32 )
151-
k_add = 3 + INT( RAND()*32 )
155+
i_add = random_integer(3, 32)
156+
j_add = random_integer(3, 32)
157+
k_add = random_integer(3, 32)
152158

153159
! The first test makes sure that a constant Q leads to a zero flux divergence. This is
154160
! for running 1 to 8 concurrent calls to GetRHS. Also, the time is measured in some
@@ -295,16 +301,16 @@ PROGRAM Upwind_Test
295301
dz = 1.0/DBLE(Nz)
296302

297303
! Generate three random integers between -256 and +256
298-
i_start = INT( RAND()*(256+1+256) )-256
299-
j_start = INT( RAND()*(256+1+256) )-256
300-
k_start = INT( RAND()*(256+1+256) )-256
304+
i_start = random_integer(-256, 256)
305+
j_start = random_integer(-256, 256)
306+
k_start = random_integer(-256, 256)
301307

302-
! Then generate three more positive random integers between 3 and 32.
308+
! Then generate three more positive random integers between 3 and 8.
303309
! In initialization, the used buffer is enlarged by these numbers to verify the routine
304310
! can correctly work on a subset of the allocated buffer
305-
i_add = 3 + INT( RAND()*8 )
306-
j_add = 3 + INT( RAND()*8 )
307-
k_add = 3 + INT( RAND()*8 )
311+
i_add = random_integer(3, 8)
312+
j_add = random_integer(3, 8)
313+
k_add = random_integer(3, 8)
308314

309315
i_end = i_start + Nx - 1
310316
j_end = j_start + Ny - 1
@@ -412,4 +418,14 @@ PROGRAM Upwind_Test
412418
PRINT*, '\x1B[32m[0] -- Successful: Advection module returns zero for constant input and produces expected rates of convergence. \x1B[0m'
413419
END IF
414420

415-
END PROGRAM Upwind_Test
421+
CONTAINS
422+
FUNCTION random_integer(vmin, vmax) RESULT(val)
423+
INTEGER, INTENT(IN) :: vmin, vmax
424+
INTEGER :: val
425+
426+
CALL RANDOM_NUMBER(random_real)
427+
val = vmin + FLOOR( (vmax+1-vmin)*random_real )
428+
429+
END FUNCTION random_integer
430+
431+
END PROGRAM Upwind_Test

test/src/boundaries_test.f90

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,25 @@ PROGRAM boundaries_test
88

99
DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:,:,:) :: Q, Qall
1010
DOUBLE PRECISION :: dx, dy, dz, x, y, z
11-
INTEGER :: Nx, Ny, Nz, seed, time1(8), i, j, k
12-
13-
CALL DATE_AND_TIME(values=time1)
14-
seed = 1000*time1(7)+time1(8)
15-
CALL SRAND(seed)
11+
INTEGER :: Nx, Ny, Nz, seed_size, i, j, k, clock
12+
INTEGER, PARAMETER :: N_min = 25, N_max = 256
13+
INTEGER, ALLOCATABLE, DIMENSION(:) :: seed
14+
REAL random_real
15+
16+
CALL RANDOM_SEED(size = seed_size)
17+
ALLOCATE(seed(seed_size))
18+
CALL SYSTEM_CLOCK(count = clock)
19+
seed = clock + 37 * (/ (i - 1, i = 1, seed_size) /)
20+
CALL RANDOM_SEED(put = seed)
21+
DEALLOCATE(seed)
1622

1723
! Create random integer values for Nx, Ny, Nz
18-
Nx = 25 + INT(RAND()*256)
19-
Ny = 25 + INT(RAND()*256)
20-
Nz = 25 + INT(RAND()*256)
24+
CALL RANDOM_NUMBER(random_real)
25+
Nx = N_min + FLOOR( (N_max+1-N_min)*random_real )
26+
CALL RANDOM_NUMBER(random_real)
27+
Ny = N_min + FLOOR( (N_max+1-N_min)*random_real )
28+
CALL RANDOM_NUMBER(random_real)
29+
Nz = N_min + FLOOR( (N_max+1-N_min)*random_real )
2130

2231
dx = 1.0/DBLE(Nx)
2332
dy = 1.0/DBLE(Ny)
@@ -106,4 +115,4 @@ PROGRAM boundaries_test
106115

107116
PRINT*, '\x1B[32m[0] -- Successful: Ghost cell values generated by boundaries module match directly inserted values.\x1B[0m'
108117

109-
END PROGRAM boundaries_test
118+
END PROGRAM boundaries_test

0 commit comments

Comments
 (0)