[Dart-dev] [5679] DART/branches/development/random_seq/random_seq_mod.f90: add some bookkeeping in the random gauss routine.
nancy at ucar.edu
nancy at ucar.edu
Mon Apr 9 15:06:24 MDT 2012
Revision: 5679
Author: nancy
Date: 2012-04-09 15:06:24 -0600 (Mon, 09 Apr 2012)
Log Message:
-----------
add some bookkeeping in the random gauss routine. if you loop inside that routine
for more than 100 times without successfully generating a good gaussian value, then
most likely you've called the random number generator without initializing it.
call the error handler instead of sitting in an infinite loop.
Modified Paths:
--------------
DART/branches/development/random_seq/random_seq_mod.f90
-------------- next part --------------
Modified: DART/branches/development/random_seq/random_seq_mod.f90
===================================================================
--- DART/branches/development/random_seq/random_seq_mod.f90 2012-04-09 21:02:26 UTC (rev 5678)
+++ DART/branches/development/random_seq/random_seq_mod.f90 2012-04-09 21:06:24 UTC (rev 5679)
@@ -59,6 +59,7 @@
end type random_seq_type
logical, save :: module_initialized = .false.
+character(len=128) :: errstring
contains
@@ -314,6 +315,7 @@
real(r8) :: ran_gauss
real(digits12) :: x, y, r2, t
+integer :: lc
if ( .not. module_initialized ) call initialize_module
@@ -326,7 +328,9 @@
s%gset = .false.
else
- 10 continue
+ lc = 0
+10 continue
+ lc = lc + 1
! choose x,y in uniform square (-1,-1) to (+1,+1)
x = -1.0_digits12 + 2.0_digits12 * ran_unif(s)
@@ -334,7 +338,16 @@
! repeat if it is outside the unit circle or at origin
r2 = x*x + y*y
- if (r2 >= 1.0_digits12 .or. r2 == 0.0_digits12) goto 10
+ if (r2 >= 1.0_digits12 .or. r2 == 0.0_digits12) then
+ if (lc > 100) then
+ write(errstring, *) 'x, y = ', x, y
+ call error_handler(E_ERR, 'ran_gauss', &
+ 'if both x and y are -1, random number generator probably not initialized', &
+ source, revision, revdate, &
+ text2 = errstring);
+ endif
+ goto 10
+ endif
t = sqrt(-2.0_digits12 * log(r2) / r2)
s%lastg = real(x * t, r8)
More information about the Dart-dev
mailing list