Ignore:
Timestamp:
Mar 3, 2020 8:49:28 PM (19 months ago)
Author:
suehring
Message:

Synthetic turbulence: performance optimizations - random numbers only defined and computed locally, option to compute velocity seeds locally without need of global communication; paralell random number generator: new routine to initialize 1D random number arrays; virtual measurements: CPU-log points added

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/random_generator_parallel_mod.f90

    r4360 r4438  
    2525! -----------------
    2626! $Id$
     27! - Rename variables to avoid confusion with subdomain grid indices
     28! - Some formatting adjustments
     29! - New routine to initialize spatial 1D-arrays independent on the 2D random-
     30!   number array
     31!
     32! 4360 2020-01-07 11:25:50Z suehring
    2733! Corrected "Former revisions" section
    2834!
     
    5056!------------------------------------------------------------------------------!
    5157MODULE random_generator_parallel
    52  
    5358
    5459   USE kinds
    55    
     60
    5661   IMPLICIT NONE
    57    
    58    PRIVATE
    59    PUBLIC random_number_parallel, random_seed_parallel, random_dummy,          &
    60           id_random_array, seq_random_array, init_parallel_random_generator
    61    
     62
    6263   INTEGER(isp), SAVE :: lenran=0             !<
    6364   INTEGER(isp), SAVE :: seq=0                !<
     
    6869   INTEGER(isp), SAVE :: nran0                !<
    6970   INTEGER(isp), SAVE :: rans                 !<
    70    
     71
    7172   INTEGER(isp), DIMENSION(:, :), POINTER, SAVE :: ranseeds   !<
    72    
     73
    7374   INTEGER(isp), DIMENSION(:), POINTER, SAVE :: iran   !<
    7475   INTEGER(isp), DIMENSION(:), POINTER, SAVE :: jran   !<
     
    7778   INTEGER(isp), DIMENSION(:), POINTER, SAVE :: nran   !<
    7879   INTEGER(isp), DIMENSION(:), POINTER, SAVE :: ranv   !<
    79    
    80    
    81    
     80
    8281   INTEGER(isp), DIMENSION(:,:), ALLOCATABLE   ::  id_random_array    !<
    8382   INTEGER(isp), DIMENSION(:,:,:), ALLOCATABLE ::  seq_random_array   !<
    84    
     83
    8584   REAL(wp), SAVE :: amm   !<
    86    
     85
    8786   REAL(wp) :: random_dummy=0.0   !<
    88    
     87
    8988   INTERFACE init_parallel_random_generator
    90       MODULE PROCEDURE init_parallel_random_generator
     89      MODULE PROCEDURE init_parallel_random_generator_1d
     90      MODULE PROCEDURE init_parallel_random_generator_2d
    9191   END INTERFACE
    92    
     92
    9393   INTERFACE random_number_parallel
    9494      MODULE PROCEDURE ran0_s
    9595   END INTERFACE
    96    
     96
    9797   INTERFACE random_seed_parallel
    9898      MODULE PROCEDURE random_seed_parallel
    9999   END INTERFACE
    100    
     100
    101101   INTERFACE ran_hash
    102102      MODULE PROCEDURE ran_hash_v
    103103   END INTERFACE
    104    
     104
    105105   INTERFACE reallocate
    106106      MODULE PROCEDURE reallocate_iv,reallocate_im
    107107   END INTERFACE
    108    
     108
    109109   INTERFACE arth
    110110      MODULE PROCEDURE arth_i
    111111   END INTERFACE
    112112
     113   PRIVATE
     114
     115   PUBLIC random_number_parallel, random_seed_parallel, random_dummy,          &
     116          id_random_array, seq_random_array, init_parallel_random_generator
     117
    113118 CONTAINS
    114  
    115 !------------------------------------------------------------------------------!
    116 ! Description:
    117 ! ------------
    118 !> Initialize the parallel random number generator for a specific subdomain
    119 !------------------------------------------------------------------------------!
    120    SUBROUTINE init_parallel_random_generator( nx, nys, nyn, nxl, nxr )
    121 
    122       USE kinds
     119
     120!------------------------------------------------------------------------------!
     121! Description:
     122! ------------
     123!> Initialize the parallel random number generator for a 1-dimensional array.
     124!------------------------------------------------------------------------------!
     125   SUBROUTINE init_parallel_random_generator_1d( nxy, ns, ne, id_rand, seq_rand )
    123126
    124127      USE control_parameters,                                                  &
    125128          ONLY: ensemble_member_nr
    126129
     130      INTEGER(isp), INTENT(IN) ::  nxy  !< constant scaling with grid dimensions
     131      INTEGER(isp), INTENT(IN) ::  ns   !< start index on subdomain
     132      INTEGER(isp), INTENT(IN) ::  ne   !< end index on subdomain
     133
     134      INTEGER(iwp) ::  j   !< loop index
     135
     136      INTEGER(isp), DIMENSION(ns:ne)   ::  id_rand  !< initial IDs
     137      INTEGER(isp), DIMENSION(5,ns:ne) ::  seq_rand !< initial random seeds
     138
     139!
     140!--   Asigning an ID to every vertical gridpoint column
     141!--   dependig on the ensemble run number.
     142      DO  j = ns, ne
     143         id_rand(j) = j * ( nxy + 1.0_wp ) + 1.0_wp + 1E6 *                    &
     144                                ( ensemble_member_nr - 1000 )
     145      ENDDO
     146!
     147!--   Initializing with random_seed_parallel for every vertical
     148!--   gridpoint column.
     149      random_dummy=0
     150      DO  j = ns, ne
     151         CALL random_seed_parallel( random_sequence=id_rand(j) )
     152         CALL random_number_parallel( random_dummy )
     153         CALL random_seed_parallel( get=seq_rand(:,j) )
     154      ENDDO
     155
     156   END SUBROUTINE init_parallel_random_generator_1d
     157
     158!------------------------------------------------------------------------------!
     159! Description:
     160! ------------
     161!> Initialize the parallel random number generator for a specific subdomain
     162!------------------------------------------------------------------------------!
     163   SUBROUTINE init_parallel_random_generator_2d( nx_l, nys_l, nyn_l, nxl_l, nxr_l )
     164
     165      USE kinds
     166
     167      USE control_parameters,                                                  &
     168          ONLY: ensemble_member_nr
     169
    127170      IMPLICIT NONE
    128171
    129       INTEGER(isp), INTENT(IN) ::  nx    !<
    130       INTEGER(isp), INTENT(IN) ::  nys   !<
    131       INTEGER(isp), INTENT(IN) ::  nyn   !<
    132       INTEGER(isp), INTENT(IN) ::  nxl   !<
    133       INTEGER(isp), INTENT(IN) ::  nxr   !<
    134 
    135       INTEGER(iwp) ::  i   !<
    136       INTEGER(iwp) ::  j   !<
     172      INTEGER(isp), INTENT(IN) ::  nx_l    !< constant
     173      INTEGER(isp), INTENT(IN) ::  nys_l   !< local lower subdomain bound index in y-direction
     174      INTEGER(isp), INTENT(IN) ::  nyn_l   !< local upper subdomain bound index in y-direction
     175      INTEGER(isp), INTENT(IN) ::  nxl_l   !< local lower subdomain bound index in x-direction
     176      INTEGER(isp), INTENT(IN) ::  nxr_l   !< local upper subdomain bound index in x-direction
     177
     178      INTEGER(iwp) ::  i   !< grid index x-direction
     179      INTEGER(iwp) ::  j   !< grid index y-direction
    137180
    138181!--   Allocate ID-array and state-space-array
    139       ALLOCATE ( seq_random_array(5,nys:nyn,nxl:nxr) )
    140       ALLOCATE ( id_random_array(nys:nyn,nxl:nxr) )
     182      ALLOCATE ( seq_random_array(5,nys_l:nyn_l,nxl_l:nxr_l) )
     183      ALLOCATE ( id_random_array(nys_l:nyn_l,nxl_l:nxr_l) )
    141184      seq_random_array = 0
    142185      id_random_array  = 0
     
    144187!--   Asigning an ID to every vertical gridpoint column
    145188!--   dependig on the ensemble run number.
    146       DO i=nxl, nxr
    147          DO j=nys, nyn
    148             id_random_array(j,i) = j*(nx+1.0_wp) + i + 1.0_wp + 1E6 * &
     189      DO  i = nxl_l, nxr_l
     190         DO  j = nys_l, nyn_l
     191            id_random_array(j,i) = j * ( nx_l + 1.0_wp ) + i + 1.0_wp + 1E6 * &
    149192                                   ( ensemble_member_nr - 1000 )
    150193         ENDDO
     
    153196!--   gridpoint column.
    154197      random_dummy=0
    155       DO i = nxl, nxr
    156          DO j = nys, nyn
     198      DO  i = nxl_l, nxr_l
     199         DO  j = nys_l, nyn_l
    157200            CALL random_seed_parallel (random_sequence=id_random_array(j, i))
    158201            CALL random_number_parallel (random_dummy)
     
    161204      ENDDO
    162205
    163    END SUBROUTINE init_parallel_random_generator
     206   END SUBROUTINE init_parallel_random_generator_2d
    164207 
    165208!------------------------------------------------------------------------------!
Note: See TracChangeset for help on using the changeset viewer.