New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 2587 for branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/ran_num.F90 – NEMO

Ignore:
Timestamp:
2011-02-15T12:58:59+01:00 (13 years ago)
Author:
vidard
Message:

refer to ticket #798

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/ran_num.F90

    r1885 r2587  
    1313   USE dom_oce        ! Domain variables 
    1414   USE in_out_manager ! I/O stuff 
     15   USE mt19937ar, ONLY : & 
     16    & init_mtrand,       & 
     17    & mtrand_real1 
    1518 
    1619   IMPLICIT NONE 
     
    118121        
    119122   END FUNCTION gausva 
    120  
    121    FUNCTION psrandom( kdum )  
    122       !!---------------------------------------------------------------------- 
    123       !!               ***  ROUTINE psrandom *** 
    124       !!           
    125       !! ** Purpose : Pseudo-Random number generator. 
    126       !! 
    127       !! ** Method  : Returns a pseudo-random number from a uniform distribution 
    128       !!              between 0 and 1 
    129       !!              Call with kdum a negative integer to initialize. 
    130       !!              Thereafter, do not alter kdum between successive deviates  
    131       !!              in sequence. 
    132       !! 
    133       !! ** Action  :  
    134       !! 
    135       !! History : 
    136       !!        !  10-02  (F. Vigilant)  Original code  
    137       !!---------------------------------------------------------------------- 
    138       !! * Function return 
    139       REAL(wp) ::  & 
    140          & psrandom 
    141       !! * Arguments 
    142       INTEGER, INTENT(INOUT) :: & 
    143          & kdum          ! Seed 
    144       LOGICAL, SAVE :: & 
    145          & llinit = .FALSE. 
    146  
    147       ! Initialization 
    148       IF ( .NOT. llinit ) THEN 
    149           
    150          CALL srand( kdum ) 
    151          llinit     = .TRUE. 
    152           
    153       ENDIF 
    154  
    155       CALL rand(psrandom)  
    156  
    157    END FUNCTION psrandom 
    158     
    159123 
    160124   FUNCTION gaustb_2d( ki, kj, kseed, pamp, pmean  ) 
     
    241205      IF ( niset(ki,kj) == 0 ) THEN 
    242206 
    243          zv1   = 2.0_wp * psrandom_2d( ki, kj, kdum ) - 1.0_wp 
    244          zv2   = 2.0_wp * psrandom_2d( ki, kj, kdum ) - 1.0_wp 
     207         zv1   = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 
     208         zv2   = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 
    245209         zrsq  = zv1**2 + zv2**2 
    246210 
    247211         DO WHILE ( ( zrsq >= 1.0_wp ) .OR. ( zrsq == 0.0_wp ) )  
    248212 
    249             zv1   = 2.0_wp * psrandom_2d( ki, kj, kdum ) - 1.0_wp 
    250             zv2   = 2.0_wp * psrandom_2d( ki, kj, kdum ) - 1.0_wp 
     213            zv1   = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 
     214            zv2   = 2.0_wp * psrandom( kdum(ki,kj) ) - 1.0_wp 
    251215            zrsq  = zv1**2 + zv2**2 
    252216 
     
    267231   END FUNCTION gausva_2d 
    268232 
    269    FUNCTION psrandom_2d( ki, kj, kdum )  
    270       !!---------------------------------------------------------------------- 
    271       !!               ***  ROUTINE psrandom_2d *** 
    272       !!           
    273       !! ** Purpose : Random number generator. 
     233   FUNCTION psrandom( kdum ) 
     234      !!---------------------------------------------------------------------- 
     235      !!               ***  ROUTINE psrandom *** 
     236      !!           
     237      !! ** Purpose : Pseudo-Random number generator. 
    274238      !! 
    275239      !! ** Method  : Returns a pseudo-random number from a uniform distribution 
     
    286250      !! * Function return 
    287251      REAL(wp) ::  & 
    288          & psrandom_2d 
    289       !! * Arguments 
    290       INTEGER, INTENT(IN) :: & 
    291          & ki, &         ! Indices in seed array 
    292          & kj 
    293       INTEGER, INTENT(INOUT), DIMENSION(jpi,jpj) :: & 
     252         & psrandom 
     253      !! * Arguments 
     254      INTEGER, INTENT(INOUT) :: & 
    294255         & kdum          ! Seed 
    295256      LOGICAL, SAVE :: & 
    296257         & llinit = .FALSE. 
     258      INTEGER :: & 
     259   & kdum1, & 
     260   & kdum2 
    297261 
    298262      ! Initialization 
    299263      IF ( .NOT. llinit ) THEN 
    300           
    301          CALL srand( kdum( ki,kj ) ) 
     264    kdum2 = 596035 
     265    kdum1 = kdum + nproc * kdum2 
     266         CALL init_mtrand(kdum) 
    302267         llinit     = .TRUE. 
    303           
    304       ENDIF 
    305  
    306       CALL rand(psrandom_2d)   
     268      ENDIF 
     269 
     270      psrandom = mtrand_real1() 
    307271       
    308    END FUNCTION psrandom_2d 
     272   END FUNCTION psrandom 
     273 
    309274 
    310275END MODULE ran_num 
Note: See TracChangeset for help on using the changeset viewer.