[Dart-dev] [6980] DART/trunk: fix a bug found by Jin Hidekatsu.

nancy at ucar.edu nancy at ucar.edu
Tue May 6 08:51:28 MDT 2014


Revision: 6980
Author:   nancy
Date:     2014-05-06 08:51:28 -0600 (Tue, 06 May 2014)
Log Message:
-----------
fix a bug found by Jin Hidekatsu.  on the hitachi compiler
on an ibm system, the constants in the random number
generator and in the seed routine in the time manager
were only initialized with 32 bit constants.  that compiler
did sign extension when converting to 64 bits, and the
values were then incorrect. initialize them with a full
64 bit number by adding leading 0s and it now works both
on Jin's system and everywhere else as well.  also
add _i8 to a few integer constants where they were
missing, but those didn't seem to be the critical fix.
Jira DART-26.

Modified Paths:
--------------
    DART/trunk/random_seq/random_seq_mod.f90
    DART/trunk/time_manager/time_manager_mod.f90

-------------- next part --------------
Modified: DART/trunk/random_seq/random_seq_mod.f90
===================================================================
--- DART/trunk/random_seq/random_seq_mod.f90	2014-05-06 14:35:20 UTC (rev 6979)
+++ DART/trunk/random_seq/random_seq_mod.f90	2014-05-06 14:51:28 UTC (rev 6980)
@@ -41,12 +41,12 @@
 integer, parameter :: M = 397
 
 ! hexadecimal constants
-integer(i8), parameter :: UPPER_MASK  = z'80000000'
-integer(i8), parameter :: LOWER_MASK  = z'7FFFFFFF'
-integer(i8), parameter :: FULL32_MASK = z'FFFFFFFF'
-integer(i8), parameter :: magic       = z'9908B0DF'
-integer(i8), parameter :: C1          = z'9D2C5680'
-integer(i8), parameter :: C2          = z'EFC60000'
+integer(i8), parameter :: UPPER_MASK  = z'0000000080000000'
+integer(i8), parameter :: LOWER_MASK  = z'000000007FFFFFFF'
+integer(i8), parameter :: FULL32_MASK = z'00000000FFFFFFFF'
+integer(i8), parameter :: magic       = z'000000009908B0DF'
+integer(i8), parameter :: C1          = z'000000009D2C5680'
+integer(i8), parameter :: C2          = z'00000000EFC60000'
 
 type random_seq_type
    private
@@ -200,7 +200,7 @@
 ! for multiplier.
 
 do i=1, N-1
-   s%mt(i) = 1812433253_i8 * ieor(s%mt(i-1), ishft(s%mt(i-1), -30)) + i
+   s%mt(i) = 1812433253_i8 * ieor(s%mt(i-1), ishft(s%mt(i-1), -30_i8)) + i
 
    s%mt(i) = iand(s%mt(i), FULL32_MASK)
 end do
@@ -238,7 +238,7 @@
       else
          m1 = 0_i8
       endif
-      s%mt(kk) = ieor(s%mt(kk + M), ieor(ishft(y,-1), m1))
+      s%mt(kk) = ieor(s%mt(kk + M), ieor(ishft(y,-1_i8), m1))
 
 ! original c code:
 !          unsigned long y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
@@ -253,7 +253,7 @@
       else
          m1 = 0_i8
       endif
-      s%mt(kk) = ieor(s%mt(kk + (M-N)), ieor(ishft(y,-1), m1))
+      s%mt(kk) = ieor(s%mt(kk + (M-N)), ieor(ishft(y,-1_i8), m1))
 
 ! original c code:
 !          unsigned long y = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK);
@@ -267,7 +267,7 @@
    else
       m1 = 0_i8
    endif
-   s%mt(N-1) = ieor(s%mt(M-1), ieor(ishft(y,-1), m1))
+   s%mt(N-1) = ieor(s%mt(M-1), ieor(ishft(y,-1_i8), m1))
 
 ! original c code:
 !        unsigned long y = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK);
@@ -280,10 +280,10 @@
 
 k = s%mt(s%mti)
 
-k = ieor(k, ishft(k, -11))
-k = ieor(k, iand(ishft(k, 7),  C1))
-k = ieor(k, iand(ishft(k, 15), C2))
-k = ieor(k, ishft(k, -18))
+k = ieor(k, ishft(k, -11_i8))
+k = ieor(k, iand(ishft(k, 7_i8),  C1))
+k = ieor(k, iand(ishft(k, 15_i8), C2))
+k = ieor(k, ishft(k, -18_i8))
 
 ! original c code:
 !  k ^= (k >> 11);

Modified: DART/trunk/time_manager/time_manager_mod.f90
===================================================================
--- DART/trunk/time_manager/time_manager_mod.f90	2014-05-06 14:35:20 UTC (rev 6979)
+++ DART/trunk/time_manager/time_manager_mod.f90	2014-05-06 14:51:28 UTC (rev 6980)
@@ -3151,7 +3151,7 @@
 
 call get_time(timestamp, seconds, days)
 
-generate_seed = iand((secs_day * days) + seconds, z'FFFFFFFF')
+generate_seed = iand((secs_day * days) + seconds, z'00000000FFFFFFFF')
 
 end function generate_seed
 


More information about the Dart-dev mailing list