adapt to OO-style RNG type and drop unnecessary use of pointers

Fortran does pass-by-reference, but `POINTER` was needed for the
procedures acting on the `rng_stream_type`. With those refactored as
type-bound procedures, almost all uses of pointers can be avoided.

One of the two remaining cases (in `helium_methods.F`) could likely be
avoided as well by using an allocatable and `move_alloc`, but this would
need another nested type like `rng_stream_p_type` but with an
allocatable member instead of a pointer (or a complete redesign of the
RNG setup in that part).
This commit is contained in:
Tiziano Müller 2019-07-18 15:47:06 +02:00 committed by Tiziano Müller
parent 9579ec3659
commit b8d84a3028
56 changed files with 553 additions and 972 deletions

View file

@ -25,8 +25,7 @@ MODULE distribution_1d_types
USE cp_para_env, ONLY: cp_para_env_release,&
cp_para_env_retain
USE cp_para_types, ONLY: cp_para_env_type
USE parallel_rng_types, ONLY: delete_rng_stream,&
rng_stream_p_type
USE parallel_rng_types, ONLY: rng_stream_p_type
#include "../base/base_uses.f90"
IMPLICIT NONE
@ -205,8 +204,8 @@ CONTAINS
DO iparticle_local = 1, nparticle_local
IF (ASSOCIATED(local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream)) THEN
CALL delete_rng_stream(local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream)
DEALLOCATE (local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream)
END IF
END DO
DEALLOCATE (local_particle_set(iparticle_kind)%rng)

View file

@ -17,8 +17,6 @@ MODULE csvr_system_types
section_vals_val_get
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
delete_rng_stream,&
next_rng_seed,&
rng_stream_type
USE simpar_types, ONLY: simpar_type
@ -39,7 +37,7 @@ MODULE csvr_system_types
REAL(KIND=dp) :: nkt
REAL(KIND=dp) :: thermostat_energy
REAL(KIND=dp) :: region_kin_energy
TYPE(rng_stream_type), POINTER :: gaussian_rng_stream
TYPE(rng_stream_type) :: gaussian_rng_stream
END TYPE csvr_thermo_type
! **************************************************************************************************
@ -106,7 +104,6 @@ CONTAINS
ALLOCATE (csvr%nvt(csvr%loc_num_csvr))
DO i = 1, csvr%loc_num_csvr
csvr%nvt(i)%thermostat_energy = 0.0_dp
NULLIFY (csvr%nvt(i)%gaussian_rng_stream)
END DO
! Initialize the gaussian stream random number
ALLOCATE (seed(3, 2, csvr%glob_num_csvr))
@ -123,9 +120,8 @@ CONTAINS
my_seed = seed(:, :, my_index)
WRITE (UNIT=name, FMT="(A,I8)") "Wiener process for Thermostat #", my_index
CALL compress(name)
CALL create_rng_stream(rng_stream=csvr%nvt(ithermo)%gaussian_rng_stream, &
name=name, distribution_type=GAUSSIAN, extended_precision=.TRUE., &
seed=my_seed)
csvr%nvt(ithermo)%gaussian_rng_stream = rng_stream_type( &
name=name, distribution_type=GAUSSIAN, extended_precision=.TRUE., seed=my_seed)
END DO
DEALLOCATE (seed)
@ -160,16 +156,8 @@ CONTAINS
CHARACTER(LEN=*), PARAMETER :: routineN = 'csvr_thermo_dealloc', &
routineP = moduleN//':'//routineN
INTEGER :: i
IF (ASSOCIATED(nvt)) THEN
DO i = 1, SIZE(nvt)
IF (ASSOCIATED(nvt(i)%gaussian_rng_stream)) THEN
CALL delete_rng_stream(nvt(i)%gaussian_rng_stream)
ENDIF
END DO
IF (ASSOCIATED(nvt)) &
DEALLOCATE (nvt)
ENDIF
END SUBROUTINE csvr_thermo_dealloc
END MODULE csvr_system_types

View file

@ -11,8 +11,7 @@
MODULE csvr_system_utils
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -80,7 +79,7 @@ CONTAINS
REAL(KIND=dp), INTENT(IN) :: kk, sigma
INTEGER, INTENT(IN) :: ndeg
REAL(KIND=dp), INTENT(IN) :: taut
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
REAL(KIND=dp) :: my_res
CHARACTER(len=*), PARAMETER :: routineN = 'rescaling_factor', &
@ -95,7 +94,7 @@ CONTAINS
ELSE
factor = 0.0_dp
END IF
rr = next_random_number(rng_stream)
rr = rng_stream%next()
reverse = 1.0_dp
! reverse of momentum is implemented to have the correct limit to Langevin dynamics for ndeg=1
! condition: rr < -SQRT(ndeg*kk*factor/(sigma*(1.0_dp-factor)))
@ -123,7 +122,7 @@ CONTAINS
! **************************************************************************************************
FUNCTION sumnoises(nn, rng_stream) RESULT(sum_gauss)
INTEGER, INTENT(IN) :: nn
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
REAL(KIND=dp) :: sum_gauss
CHARACTER(len=*), PARAMETER :: routineN = 'sumnoises', routineP = moduleN//':'//routineN
@ -132,7 +131,7 @@ CONTAINS
sum_gauss = 0.0_dp
DO i = 1, nn
sum_gauss = sum_gauss + next_random_number(rng_stream)**2
sum_gauss = sum_gauss + rng_stream%next()**2
END DO
END FUNCTION sumnoises

View file

@ -60,9 +60,6 @@ MODULE distribution_methods
molecule_kind_type
USE molecule_types, ONLY: molecule_type
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type
USE particle_types, ONLY: particle_type
USE qs_kind_types, ONLY: get_qs_kind,&
@ -1310,25 +1307,23 @@ CONTAINS
dvec(3), old_var, rn, scaled_cent(3, ncent), var_cl(ncent)
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dmat
REAL(KIND=dp), DIMENSION(3, 2) :: initial_seed
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type) :: rng_stream
CALL timeset(routineN, handle)
initial_seed = REAL(seed, dp); nat = SIZE(coord, 2)
NULLIFY (rng_stream)
ALLOCATE (dmat(ncent, nat))
CALL create_rng_stream(rng_stream=rng_stream, &
name="kmeans uniform distribution [0,1]", &
distribution_type=UNIFORM, seed=initial_seed)
rng_stream = rng_stream_type(name="kmeans uniform distribution [0,1]", &
distribution_type=UNIFORM, seed=initial_seed)
! try to find a clever initial guess with centers being somewhat distributed
rn = next_random_number(rng_stream)
rn = rng_stream%next()
ind = CEILING(rn*nat)
cent_coord(:, 1) = coord(:, ind)
DO i = 2, ncent
DO
rn = next_random_number(rng_stream)
rn = rng_stream%next()
ind = CEILING(rn*nat)
cent_coord(:, i) = coord(:, ind)
devi = HUGE(1.0_dp)
@ -1337,7 +1332,7 @@ CONTAINS
dist = SQRT(DOT_PRODUCT(dvec, dvec))
IF (dist .LT. devi) devi = dist
END DO
rn = next_random_number(rng_stream)
rn = rng_stream%next()
IF (rn .LT. devi**2/169.0) EXIT
END DO
END DO
@ -1381,7 +1376,7 @@ CONTAINS
DO i = 1, ncent
IF (nat_cl(i) == 0) THEN
rn = next_random_number(rng_stream)
rn = rng_stream%next()
scaled_cent(:, i) = scaled_coord(:, CEILING(rn*nat))
ELSE
average(:, i, 1) = average(:, i, 1)/REAL(nat_cl(i), dp)
@ -1395,8 +1390,6 @@ CONTAINS
END IF
END DO
CALL delete_rng_stream(rng_stream)
CALL timestop(handle)
END SUBROUTINE kmeans

View file

@ -82,10 +82,8 @@ MODULE environment
init_spherical_harmonics
USE parallel_rng_types, ONLY: GAUSSIAN,&
check_rng,&
create_rng_stream,&
init_rng,&
write_rng_matrices,&
write_rng_stream
rng_stream_type,&
write_rng_matrices
USE physcon, ONLY: write_physcon
USE reference_manager, ONLY: collect_citations_from_ranks,&
print_all_references,&
@ -411,7 +409,6 @@ CONTAINS
! Initialize the parallel random number generator
CALL init_rng()
iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/RNG_MATRICES", &
extension=".Log")
IF (iw > 0) THEN
@ -432,11 +429,11 @@ CONTAINS
CPABORT("Supply exactly 1 or 6 arguments for SEED in &GLOBAL only!")
END IF
CALL create_rng_stream(rng_stream=globenv%gaussian_rng_stream, &
name="Global Gaussian random numbers", &
distribution_type=GAUSSIAN, &
seed=initial_seed, &
extended_precision=.TRUE.)
globenv%gaussian_rng_stream = rng_stream_type( &
name="Global Gaussian random numbers", &
distribution_type=GAUSSIAN, &
seed=initial_seed, &
extended_precision=.TRUE.)
iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/RNG_CHECK", &
extension=".Log")
@ -449,9 +446,9 @@ CONTAINS
iw = cp_print_key_unit_nr(logger, root_section, "GLOBAL%PRINT/GLOBAL_GAUSSIAN_RNG", &
extension=".Log")
IF (iw > 0) THEN
CALL write_rng_stream(globenv%gaussian_rng_stream, iw, write_all=.TRUE.)
END IF
IF (iw > 0) &
CALL globenv%gaussian_rng_stream%write(iw, write_all=.TRUE.)
CALL cp_print_key_finished_output(iw, logger, root_section, &
"GLOBAL%PRINT/GLOBAL_GAUSSIAN_RNG")

View file

@ -44,9 +44,6 @@ MODULE ewalds_multipole
USE mathlib, ONLY: matvec_3x3
USE message_passing, ONLY: mp_sum
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
random_numbers,&
rng_stream_type
USE particle_types, ONLY: particle_type
USE pw_grid_types, ONLY: pw_grid_type
@ -1322,14 +1319,14 @@ $: ewalds_multipole_sr_macro(mode="SCREENED_COULOMB_ERF", store_energy=True, sto
e_field2
REAL(KIND=dp), POINTER, &
DIMENSION(:, :, :) :: quadrupoles
TYPE(rng_stream_type), POINTER :: random_stream
TYPE(rng_stream_type) :: random_stream
TYPE(multi_charge_type), DIMENSION(:), &
POINTER :: multipoles
NULLIFY (random_stream, multipoles, charges, dipoles, g_forces, g_pv, &
NULLIFY (multipoles, charges, dipoles, g_forces, g_pv, &
r_forces, r_pv, e_field1, e_field2)
CALL create_rng_stream(random_stream, name="DEBUG_EWALD_MULTIPOLE", &
distribution_type=UNIFORM)
random_stream = rng_stream_type(name="DEBUG_EWALD_MULTIPOLE", &
distribution_type=UNIFORM)
! check: charge - charge
task = .FALSE.
nparticles = SIZE(particle_set)
@ -1553,7 +1550,6 @@ $: ewalds_multipole_sr_macro(mode="SCREENED_COULOMB_ERF", store_energy=True, sto
DEALLOCATE (e_field2)
DEALLOCATE (g_pv)
DEALLOCATE (r_pv)
CALL delete_rng_stream(random_stream)
CONTAINS
! **************************************************************************************************
@ -1704,7 +1700,7 @@ $: ewalds_multipole_sr_macro(mode="SCREENED_COULOMB_ERF", store_energy=True, sto
INTEGER, INTENT(IN) :: idim, istart, iend
CHARACTER(LEN=*), INTENT(IN) :: label
REAL(KIND=dp), INTENT(IN) :: echarge
TYPE(rng_stream_type), POINTER :: random_stream
TYPE(rng_stream_type), INTENT(INOUT) :: random_stream
REAL(KIND=dp), DIMENSION(:), OPTIONAL, POINTER :: charges
REAL(KIND=dp), DIMENSION(:, :), OPTIONAL, POINTER :: dipoles
REAL(KIND=dp), DIMENSION(:, :, :), OPTIONAL, &
@ -1748,7 +1744,7 @@ $: ewalds_multipole_sr_macro(mode="SCREENED_COULOMB_ERF", store_energy=True, sto
CPASSERT(ASSOCIATED(dipoles))
ALLOCATE (multipoles(i)%charge_typ(isize)%charge(2))
ALLOCATE (multipoles(i)%charge_typ(isize)%pos(3, 2))
CALL random_numbers(rvec, random_stream)
CALL random_stream%fill(rvec)
rvec = rvec/(2.0_dp*SQRT(DOT_PRODUCT(rvec, rvec)))*dx
multipoles(i)%charge_typ(isize)%charge(1) = echarge
multipoles(i)%charge_typ(isize)%pos(1:3, 1) = rvec
@ -1762,8 +1758,8 @@ $: ewalds_multipole_sr_macro(mode="SCREENED_COULOMB_ERF", store_energy=True, sto
CPASSERT(ASSOCIATED(quadrupoles))
ALLOCATE (multipoles(i)%charge_typ(isize)%charge(4))
ALLOCATE (multipoles(i)%charge_typ(isize)%pos(3, 4))
CALL random_numbers(rvec1, random_stream)
CALL random_numbers(rvec2, random_stream)
CALL random_stream%fill(rvec1)
CALL random_stream%fill(rvec2)
rvec1 = rvec1/SQRT(DOT_PRODUCT(rvec1, rvec1))
rvec2 = rvec2-DOT_PRODUCT(rvec2, rvec1)*rvec1
rvec2 = rvec2/SQRT(DOT_PRODUCT(rvec2, rvec2))

View file

@ -31,11 +31,6 @@ MODULE cp_fm_types
cp2k_is_parallel, mp_allgather, mp_any_source, mp_bcast, mp_irecv, mp_isend, mp_max, &
mp_proc_null, mp_recv, mp_request_null, mp_send, mp_sum, mp_waitall
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
get_rng_stream,&
random_numbers,&
reset_to_next_rng_substream,&
rng_stream_type
#include "../base/base_uses.f90"
@ -299,7 +294,7 @@ CONTAINS
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: buff
REAL(KIND=dp), DIMENSION(3, 2), SAVE :: seed
REAL(KIND=dp), DIMENSION(:, :), POINTER :: local_data
TYPE(rng_stream_type), POINTER :: rng
TYPE(rng_stream_type) :: rng
CALL timeset(routineN, handle)
@ -311,9 +306,8 @@ CONTAINS
! guarantee same seed over all tasks
CALL mp_bcast(seed, 0, matrix%matrix_struct%para_env%group)
NULLIFY (rng)
CALL create_rng_stream(rng, "cp_fm_init_random_stream", distribution_type=UNIFORM, &
extended_precision=.TRUE., seed=seed)
rng = rng_stream_type("cp_fm_init_random_stream", distribution_type=UNIFORM, &
extended_precision=.TRUE., seed=seed)
CPASSERT(.NOT. matrix%use_sp)
@ -339,11 +333,11 @@ CONTAINS
DO icol_local = 1, ncol_local
CPASSERT(col_indices(icol_local) > icol_global)
DO
CALL reset_to_next_rng_substream(rng)
CALL rng%reset_to_next_substream()
icol_global = icol_global + 1
IF (icol_global == col_indices(icol_local)) EXIT
ENDDO
CALL random_numbers(buff, rng)
CALL rng%fill(buff)
DO irow_local = 1, nrow_local
local_data(irow_local, icol_local) = buff(row_indices(irow_local))
ENDDO
@ -352,8 +346,7 @@ CONTAINS
DEALLOCATE (buff)
! store seed before deletion (unclear if this is the proper seed)
CALL get_rng_stream(rng, ig=seed)
CALL delete_rng_stream(rng)
CALL rng%get(ig=seed)
CALL timestop(handle)

View file

@ -19,8 +19,6 @@ MODULE gle_system_types
section_vals_val_get
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
delete_rng_stream,&
next_rng_seed,&
rng_stream_type
USE string_utilities, ONLY: compress
@ -38,7 +36,7 @@ MODULE gle_system_types
INTEGER :: degrees_of_freedom
REAL(KIND=dp) :: nkt, kin_energy, thermostat_energy
REAL(KIND=dp), DIMENSION(:), POINTER :: s
TYPE(rng_stream_type), POINTER :: gaussian_rng_stream
TYPE(rng_stream_type) :: gaussian_rng_stream
END TYPE gle_thermo_type
! **************************************************************************************************
@ -202,14 +200,12 @@ CONTAINS
! Update initial seed
initial_seed = next_rng_seed(seed(:, :, gle%glob_num_gle))
DO ithermo = 1, gle%loc_num_gle
NULLIFY (gle%nvt(ithermo)%gaussian_rng_stream)
my_index = gle%map_info%index(ithermo)
my_seed = seed(:, :, my_index)
WRITE (UNIT=name, FMT="(A,I8)") "Wiener process for Thermostat #", my_index
CALL compress(name)
CALL create_rng_stream(rng_stream=gle%nvt(ithermo)%gaussian_rng_stream, &
name=name, distribution_type=GAUSSIAN, extended_precision=.TRUE., &
seed=my_seed)
gle%nvt(ithermo)%gaussian_rng_stream = rng_stream_type( &
name=name, distribution_type=GAUSSIAN, extended_precision=.TRUE., seed=my_seed)
END DO
DEALLOCATE (seed)
@ -243,9 +239,6 @@ CONTAINS
IF (ASSOCIATED(gle%nvt)) THEN
DO i = 1, SIZE(gle%nvt)
DEALLOCATE (gle%nvt(i)%s)
IF (ASSOCIATED(gle%nvt(i)%gaussian_rng_stream)) THEN
CALL delete_rng_stream(gle%nvt(i)%gaussian_rng_stream)
END IF
END DO
DEALLOCATE (gle%nvt)
ENDIF

View file

@ -23,8 +23,7 @@ MODULE global_types
default_string_length,&
dp
USE machine, ONLY: m_walltime
USE parallel_rng_types, ONLY: delete_rng_stream,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -65,7 +64,7 @@ MODULE global_types
! **************************************************************************************************
TYPE global_environment_type
INTEGER :: id_nr, ref_count
TYPE(rng_stream_type), POINTER :: gaussian_rng_stream
TYPE(rng_stream_type), ALLOCATABLE :: gaussian_rng_stream
CHARACTER(LEN=default_string_length) :: diag_library
CHARACTER(LEN=default_string_length) :: default_fft_library
CHARACTER(LEN=default_path_length) :: fftw_wisdom_file_name
@ -111,7 +110,6 @@ CONTAINS
globenv%idum = 0 !! random number seed
globenv%blacs_grid_layout = BLACS_GRID_SQUARE
globenv%cp2k_start_time = m_walltime()
NULLIFY (globenv%gaussian_rng_stream)
END SUBROUTINE globenv_create
! **************************************************************************************************
@ -144,9 +142,8 @@ CONTAINS
CPASSERT(globenv%ref_count > 0)
globenv%ref_count = globenv%ref_count - 1
IF (globenv%ref_count == 0) THEN
IF (ASSOCIATED(globenv%gaussian_rng_stream)) THEN
CALL delete_rng_stream(globenv%gaussian_rng_stream)
END IF
IF (ALLOCATED(globenv%gaussian_rng_stream)) &
DEALLOCATE (globenv%gaussian_rng_stream)
DEALLOCATE (globenv)
END IF
END IF

View file

@ -32,9 +32,6 @@ MODULE hfx_load_balance_methods
mp_sync,&
mp_waitall
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type
USE particle_types, ONLY: particle_type
USE util, ONLY: sort
@ -1849,7 +1846,7 @@ CONTAINS
INTEGER :: i, itmp, j, nstep
INTEGER(int_8), DIMENSION(:), POINTER :: my_cost_cpu, tmp_cost, tmp_cpu_cost
INTEGER, DIMENSION(:), POINTER :: tmp_cpu_index, tmp_index
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), ALLOCATABLE :: rng_stream
nstep = MAX(1, INT(number_of_processes)/2)
@ -1870,12 +1867,9 @@ CONTAINS
! it also avoids degenerate cases where thousands of zero sized tasks
! are assigned to the same (least loaded) cpu
!
IF (do_randomize) THEN
NULLIFY (rng_stream)
CALL create_rng_stream(rng_stream=rng_stream, &
name="uniform_rng", &
distribution_type=UNIFORM)
END IF
IF (do_randomize) &
rng_stream = rng_stream_type(name="uniform_rng", &
distribution_type=UNIFORM)
DO i = total_number_of_bins, 1, -nstep
tmp_cpu_cost = my_cost_cpu
@ -1890,10 +1884,6 @@ CONTAINS
ENDDO
ENDDO
IF (do_randomize) THEN
CALL delete_rng_stream(rng_stream)
END IF
DEALLOCATE (tmp_cost, tmp_index, tmp_cpu_cost)
DEALLOCATE (tmp_cpu_index, my_cost_cpu)
END SUBROUTINE optimize_distribution
@ -2538,15 +2528,15 @@ CONTAINS
SUBROUTINE reshuffle(size, array, rng_stream)
INTEGER :: size
INTEGER, DIMENSION(size) :: array
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type) :: rng_stream
INTEGER :: i, idx1, idx2, tmp
REAL(dp) :: x
DO i = 1, size*10
x = next_random_number(rng_stream)
x = rng_stream%next()
idx1 = INT(x*(size + 1 - 1)) + 1
x = next_random_number(rng_stream)
x = rng_stream%next()
idx2 = INT(x*(size + 1 - 1)) + 1
tmp = array(idx1)

View file

@ -49,8 +49,7 @@ MODULE input_restart_force_eval
USE molecule_types, ONLY: get_molecule,&
molecule_type
USE multipole_types, ONLY: multipole_type
USE parallel_rng_types, ONLY: dump_rng_stream,&
rng_record_length
USE parallel_rng_types, ONLY: rng_record_length
USE particle_list_types, ONLY: particle_list_type
USE qmmm_ff_fist, ONLY: qmmm_ff_precond_only_qm
USE qs_environment_types, ONLY: get_qs_env
@ -265,9 +264,8 @@ CONTAINS
nparticle_local = local_particles%n_el(iparticle_kind)
DO iparticle_local = 1, nparticle_local
IF (iparticle == local_particles%list(iparticle_kind)%array(iparticle_local)) THEN
CALL dump_rng_stream(rng_stream=local_particles%local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream, &
rng_record=rng_record)
CALL local_particles%local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream%dump(rng_record=rng_record)
CALL string_to_ascii(rng_record, ascii(:, iparticle))
END IF
END DO

View file

@ -78,14 +78,8 @@ MODULE library_tests
mpi_perf_test
USE minimax_exp, ONLY: validate_exp_minimax
USE mp2_weights, ONLY: test_least_square_ft
USE parallel_rng_types, ONLY: GAUSSIAN,&
UNIFORM,&
check_rng,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type,&
write_rng_stream
USE parallel_rng_types, ONLY: UNIFORM,&
rng_stream_type
USE pw_grid_types, ONLY: FULLSPACE,&
HALFSPACE,&
pw_grid_type
@ -174,8 +168,6 @@ CONTAINS
!
IF (runtest(8) /= 0) CALL mpi_perf_test(para_env%group, runtest(8), iw)
!
IF (runtest(9) /= 0) CALL rng_test(para_env, iw)
!
IF (runtest(10) /= 0) CALL validate_exp_minimax(runtest(10), iw)
!
IF (runtest(11) /= 0) CALL test_least_square_ft(runtest(11), iw)
@ -275,7 +267,6 @@ CONTAINS
CALL section_vals_val_get(test_section, 'ERI', i_val=runtest(4))
CALL section_vals_val_get(test_section, 'CLEBSCH_GORDON', i_val=runtest(6))
CALL section_vals_val_get(test_section, 'MPI', i_val=runtest(8))
CALL section_vals_val_get(test_section, 'RNG', i_val=runtest(9))
CALL section_vals_val_get(test_section, 'MINIMAX', i_val=runtest(10))
CALL section_vals_val_get(test_section, 'LEAST_SQ_FT', i_val=runtest(11))
@ -1041,113 +1032,6 @@ CONTAINS
END SUBROUTINE pw_fft_test
! **************************************************************************************************
!> \brief Test the parallel (pseudo)random number generator (RNG).
!> \param para_env ...
!> \param output_unit ...
!> \par History
!> JGH 6-Feb-2001 : Test and performance code
!> \author JGH 1-JAN-2001
! **************************************************************************************************
SUBROUTINE rng_test(para_env, output_unit)
TYPE(cp_para_env_type), POINTER :: para_env
INTEGER :: output_unit
CHARACTER(LEN=*), PARAMETER :: routineN = 'rng_test', routineP = moduleN//':'//routineN
INTEGER :: i, n
LOGICAL :: ionode
REAL(KIND=dp) :: t, tend, tmax, tmin, tstart, tsum, tsum2
TYPE(rng_stream_type), POINTER :: rng_stream
ionode = para_env%ionode
n = runtest(9)
NULLIFY (rng_stream)
! Check correctness
CALL check_rng(output_unit, ionode)
! Check performance
IF (ionode) THEN
WRITE (UNIT=output_unit, FMT="(/,/,T2,A,I10,A)") &
"Check distributions using", n, " random numbers:"
END IF
! Test uniform distribution [0,1]
CALL create_rng_stream(rng_stream=rng_stream, &
name="Test uniform distribution [0,1]", &
distribution_type=UNIFORM, &
extended_precision=.TRUE.)
IF (ionode) THEN
CALL write_rng_stream(rng_stream, output_unit, write_all=.TRUE.)
END IF
tmax = -HUGE(0.0_dp)
tmin = +HUGE(0.0_dp)
tsum = 0.0_dp
tsum2 = 0.0_dp
tstart = m_walltime()
DO i = 1, n
t = next_random_number(rng_stream)
tsum = tsum + t
tsum2 = tsum2 + t*t
IF (t > tmax) tmax = t
IF (t < tmin) tmin = t
END DO
tend = m_walltime()
IF (ionode) THEN
WRITE (UNIT=output_unit, FMT="(/,(T4,A,F12.6))") &
"Minimum: ", tmin, &
"Maximum: ", tmax, &
"Average: ", tsum/REAL(n, KIND=dp), &
"Variance:", tsum2/REAL(n, KIND=dp), &
"Time [s]:", tend - tstart
END IF
CALL delete_rng_stream(rng_stream)
! Test normal Gaussian distribution
CALL create_rng_stream(rng_stream=rng_stream, &
name="Test normal Gaussian distribution", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE.)
tmax = -HUGE(0.0_dp)
tmin = +HUGE(0.0_dp)
tsum = 0.0_dp
tsum2 = 0.0_dp
tstart = m_walltime()
DO i = 1, n
t = next_random_number(rng_stream)
tsum = tsum + t
tsum2 = tsum2 + t*t
IF (t > tmax) tmax = t
IF (t < tmin) tmin = t
END DO
tend = m_walltime()
IF (ionode) THEN
CALL write_rng_stream(rng_stream, output_unit)
WRITE (UNIT=output_unit, FMT="(/,(T4,A,F12.6))") &
"Minimum: ", tmin, &
"Maximum: ", tmax, &
"Average: ", tsum/REAL(n, KIND=dp), &
"Variance:", tsum2/REAL(n, KIND=dp), &
"Time [s]:", tend - tstart
END IF
CALL delete_rng_stream(rng_stream)
END SUBROUTINE rng_test
! **************************************************************************************************
!> \brief Tests the eigensolver library routines
!> \param para_env ...
@ -1175,7 +1059,7 @@ CONTAINS
TYPE(cp_blacs_env_type), POINTER :: blacs_env
TYPE(cp_fm_struct_type), POINTER :: fmstruct
TYPE(cp_fm_type), POINTER :: eigenvectors, matrix, work
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), ALLOCATABLE :: rng_stream
group = para_env%group
source = para_env%source
@ -1263,11 +1147,10 @@ CONTAINS
IF (para_env%ionode) THEN
SELECT CASE (init_method)
CASE (do_mat_random)
NULLIFY (rng_stream)
CALL create_rng_stream(rng_stream=rng_stream, &
name="rng_stream", &
distribution_type=UNIFORM, &
extended_precision=.TRUE.)
rng_stream = rng_stream_type( &
name="rng_stream", &
distribution_type=UNIFORM, &
extended_precision=.TRUE.)
CASE (do_mat_read)
CALL open_file(file_name="MATRIX", &
file_action="READ", &
@ -1282,7 +1165,7 @@ CONTAINS
SELECT CASE (init_method)
CASE (do_mat_random)
DO j = i, n
buffer(1, j) = next_random_number(rng_stream) - 0.5_dp
buffer(1, j) = rng_stream%next() - 0.5_dp
END DO
!MK activate/modify for a diagonal dominant symmetric matrix:
!MK buffer(1,i) = 10.0_dp*buffer(1,i)
@ -1328,8 +1211,6 @@ CONTAINS
IF (para_env%ionode) THEN
SELECT CASE (init_method)
CASE (do_mat_random)
CALL delete_rng_stream(rng_stream=rng_stream)
CASE (do_mat_read)
CALL close_file(unit_number=unit_number)
END SELECT

View file

@ -50,7 +50,6 @@ MODULE metadynamics
meta_walls, &
restart_hills, &
synchronize_multiple_walkers
USE parallel_rng_types, ONLY: next_random_number
USE particle_list_types, ONLY: particle_list_type
#if defined (__PLUMED2)
USE physcon, ONLY: angstrom, &
@ -401,7 +400,7 @@ CONTAINS
meta_env%ekin_s = 0.0_dp
DO i_c = 1, meta_env%n_colvar
cv => meta_env%metavar(i_c)
cv%vvp = next_random_number(force_env%globenv%gaussian_rng_stream)
cv%vvp = force_env%globenv%gaussian_rng_stream%next()
meta_env%ekin_s = meta_env%ekin_s + 0.5_dp*cv%mass*cv%vvp**2
END DO
ekin_w = 0.5_dp*meta_env%temp_wanted*REAL(meta_env%n_colvar, KIND=dp)

View file

@ -16,8 +16,7 @@ MODULE metadynamics_types
section_vals_val_get
USE kinds, ONLY: default_path_length,&
dp
USE parallel_rng_types, ONLY: delete_rng_stream,&
rng_stream_p_type
USE parallel_rng_types, ONLY: rng_stream_type
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -118,8 +117,8 @@ MODULE metadynamics_types
TYPE(multiple_walkers_type), POINTER :: multiple_walkers
TYPE(cp_para_env_type), POINTER :: para_env
TYPE(section_vals_type), POINTER :: metadyn_section
TYPE(rng_stream_p_type), DIMENSION(:), &
POINTER :: rng
TYPE(rng_stream_type), DIMENSION(:), &
ALLOCATABLE :: rng
INTEGER :: TAMCSteps
REAL(kind=dp) :: zdt
END TYPE meta_env_type
@ -160,7 +159,6 @@ CONTAINS
NULLIFY (meta_env%multiple_walkers, &
meta_env%metadyn_section, &
meta_env%time, &
meta_env%rng, &
meta_env%hills_env)
meta_env%use_plumed = .FALSE.
@ -227,9 +225,6 @@ CONTAINS
CALL section_vals_val_get(metadyn_section, "LANGEVIN", l_val=do_langevin)
IF (do_langevin) THEN
ALLOCATE (meta_env%rng(meta_env%n_colvar))
DO i = 1, meta_env%n_colvar
NULLIFY (meta_env%rng(meta_env%n_colvar)%stream)
END DO
ENDIF
END SUBROUTINE metadyn_create
@ -310,14 +305,9 @@ CONTAINS
END IF
! Langevin on COLVARS
IF (meta_env%langevin) THEN
DO i = 1, SIZE(meta_env%rng)
IF (ASSOCIATED(meta_env%rng(i)%stream)) THEN
CALL delete_rng_stream(meta_env%rng(i)%stream)
END IF
END DO
IF (meta_env%langevin) &
DEALLOCATE (meta_env%rng)
ENDIF
NULLIFY (meta_env%time)
NULLIFY (meta_env%metadyn_section)
DEALLOCATE (meta_env)

View file

@ -42,7 +42,6 @@ MODULE mode_selective
USE mathlib, ONLY: diamat_all
USE message_passing, ONLY: mp_bcast
USE molden_utils, ONLY: write_vibrations_molden
USE parallel_rng_types, ONLY: next_random_number
USE particle_types, ONLY: particle_type
USE physcon, ONLY: massunit,&
vibfac
@ -370,7 +369,7 @@ CONTAINS
DO j = 1, natoms
DO k = 1, 3
jj = (map_atoms(j) - 1)*3 + k
ms_vib%b_vec(jj, i) = ABS(next_random_number(globenv%gaussian_rng_stream))
ms_vib%b_vec(jj, i) = ABS(globenv%gaussian_rng_stream%next())
END DO
END DO
norm = SQRT(DOT_PRODUCT(ms_vib%b_vec(:, i), ms_vib%b_vec(:, i)))

View file

@ -32,7 +32,6 @@ MODULE dimer_types
USE molecule_kind_types, ONLY: fixd_constraint_type,&
get_molecule_kind,&
molecule_kind_type
USE parallel_rng_types, ONLY: random_numbers
#include "../base/base_uses.f90"
IMPLICIT NONE
@ -162,7 +161,7 @@ CONTAINS
END DO
CPASSERT(isize == SIZE(dimer_env%nvec))
ELSE
CALL random_numbers(dimer_env%nvec, globenv%gaussian_rng_stream)
CALL globenv%gaussian_rng_stream%fill(dimer_env%nvec)
END IF
! Check for translation in the dimer vector and remove them
IF (natom > 1) THEN

View file

@ -27,7 +27,6 @@ MODULE helium_common
dp
USE mathconstants, ONLY: pi
USE memory_utilities, ONLY: reallocate
USE parallel_rng_types, ONLY: next_random_number
USE physcon, ONLY: angstrom,&
bohr
USE pint_public, ONLY: pint_com_pos
@ -1339,7 +1338,7 @@ CONTAINS
! number of random numbers to generate:
c = 1000000000
DO j = 1, c
v = next_random_number(helium%rng_stream_uniform)
v = helium%rng_stream_uniform%next()
! walk down the search tree:
k = nb - 1
DO
@ -1418,7 +1417,7 @@ CONTAINS
! (should not be taken, but just in case it does we have something valid)
helium%pweight = 0.0_dp
t = next_random_number(helium%rng_stream_uniform)
t = helium%rng_stream_uniform%next()
helium%ptable(1) = 1 + INT(t*nb)
helium%ptable(2) = -1

View file

@ -62,12 +62,8 @@ MODULE helium_methods
mp_comm_split_direct
USE parallel_rng_types, ONLY: GAUSSIAN,&
UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_p_type,&
rng_stream_type,&
set_rng_stream
rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE physcon, ONLY: a_mass,&
angstrom,&
@ -967,8 +963,8 @@ CONTAINS
helium_env(k)%helium%u0, &
helium_env(k)%helium%e0)
CALL delete_rng_stream(helium_env(k)%helium%rng_stream_uniform)
CALL delete_rng_stream(helium_env(k)%helium%rng_stream_gaussian)
DEALLOCATE (helium_env(k)%helium%rng_stream_uniform)
DEALLOCATE (helium_env(k)%helium%rng_stream_gaussian)
! deallocate solute-related arrays
IF (helium_env(k)%helium%solute_present) THEN
@ -1222,7 +1218,7 @@ CONTAINS
!minHeHedsttmp = 0.90_dp**(iter/100)*minHeHedst
minHeHedsttmp = 0.90_dp**MIN(0, iter - 2)*minHeHedst
DO ic = 1, 3
r1 = next_random_number(helium_env(k)%helium%rng_stream_uniform)
r1 = helium_env(k)%helium%rng_stream_uniform%next()
r1 = 2.0_dp*r1 - 1.0_dp
r1 = r1*helium_env(k)%helium%cell_size
centroids(ic, ia) = r1
@ -1292,7 +1288,7 @@ CONTAINS
! if sampling fails to often, reduce he he criterion
minHeHedsttmp = 0.90_dp**MIN(0, iter - 2)*minHeHedst
DO ic = 1, 3
rvek(ic) = next_random_number(helium_env(k)%helium%rng_stream_uniform)
rvek(ic) = helium_env(k)%helium%rng_stream_uniform%next()
rvek(ic) = 2.0_dp*rvek(ic) - 1.0_dp
rvek(ic) = rvek(ic)*helium_env(k)%helium%droplet_radius
END DO
@ -1419,7 +1415,7 @@ CONTAINS
DO imode = 2, p
omega = 2.0_dp*p*kbT*SIN((imode - 1)*pip)
variance = kbT*p/(helium_env%he_mass_au*omega**2)
rand = next_random_number(helium_env%rng_stream_gaussian)
rand = helium_env%rng_stream_gaussian%next()
nmhecoords(imode) = rand*SQRT(variance)
END DO
helium_env%pos(idim, iatom, 1:p) = MATMUL(u2x, nmhecoords)
@ -1885,7 +1881,6 @@ CONTAINS
REAL(KIND=dp), DIMENSION(3, 2) :: initial_seed
TYPE(cp_logger_type), POINTER :: logger
TYPE(rng_stream_p_type), DIMENSION(:), POINTER :: gaussian_array, uniform_array
TYPE(rng_stream_type), POINTER :: next_rngs, prev_rngs
NULLIFY (logger)
logger => cp_get_default_logger()
@ -1902,73 +1897,52 @@ CONTAINS
ALLOCATE (uniform_array(helium_env(1)%helium%num_env), &
gaussian_array(helium_env(1)%helium%num_env))
DO i = 1, helium_env(1)%helium%num_env
NULLIFY (uniform_array(i)%stream, gaussian_array(i)%stream)
ALLOCATE (uniform_array(i)%stream, gaussian_array(i)%stream)
END DO
NULLIFY (prev_rngs, next_rngs)
! Create num_env RNG streams on processor all processors
! and distribute them so, that each processor gets unique
! RN sequences for his helium environments
! COMMENT: rng_stream can not be used with mp_bcast
CALL create_rng_stream(prev_rngs, &
name="helium_rns_uniform", &
distribution_type=UNIFORM, &
extended_precision=.TRUE., &
seed=initial_seed)
uniform_array(1)%stream => prev_rngs
CALL create_rng_stream(next_rngs, &
name="helium_rns_gaussian", &
last_rng_stream=prev_rngs, &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE.)
gaussian_array(1)%stream => next_rngs
NULLIFY (prev_rngs)
prev_rngs => next_rngs
NULLIFY (next_rngs)
uniform_array(1)%stream = rng_stream_type(name="helium_rns_uniform", &
distribution_type=UNIFORM, &
extended_precision=.TRUE., &
seed=initial_seed)
gaussian_array(1)%stream = rng_stream_type(name="helium_rns_gaussian", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
last_rng_stream=uniform_array(1)%stream)
DO i = 2, helium_env(1)%helium%num_env
CALL create_rng_stream(next_rngs, &
name="helium_rns_uniform", &
last_rng_stream=prev_rngs, &
distribution_type=UNIFORM, &
extended_precision=.TRUE.)
uniform_array(i)%stream => next_rngs
prev_rngs => next_rngs
NULLIFY (next_rngs)
CALL create_rng_stream(next_rngs, &
name="helium_rns_gaussian", &
last_rng_stream=prev_rngs, &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE.)
gaussian_array(i)%stream => next_rngs
prev_rngs => next_rngs
NULLIFY (next_rngs)
uniform_array(i)%stream = rng_stream_type(name="helium_rns_uniform", &
distribution_type=UNIFORM, &
extended_precision=.TRUE., &
last_rng_stream=gaussian_array(i - 1)%stream)
gaussian_array(i)%stream = rng_stream_type(name="helium_rns_uniform", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
last_rng_stream=uniform_array(i)%stream)
END DO
NULLIFY (prev_rngs)
offset = 0
DO i = 1, logger%para_env%mepos
offset = offset + helium_env(1)%env_all(i)
END DO
IF (ASSOCIATED(helium_env)) THEN
DO i = 1, SIZE(helium_env)
NULLIFY (helium_env(i)%helium%rng_stream_uniform, &
helium_env(i)%helium%rng_stream_gaussian)
helium_env(i)%helium%rng_stream_uniform => uniform_array(offset + i)%stream
helium_env(i)%helium%rng_stream_gaussian => gaussian_array(offset + i)%stream
END DO
END IF
DO i = 1, SIZE(helium_env)
NULLIFY (helium_env(i)%helium%rng_stream_uniform, &
helium_env(i)%helium%rng_stream_gaussian)
helium_env(i)%helium%rng_stream_uniform => uniform_array(offset + i)%stream
helium_env(i)%helium%rng_stream_gaussian => gaussian_array(offset + i)%stream
END DO
DO i = 1, helium_env(1)%helium%num_env
IF (i .LE. offset .OR. i .GT. offset + SIZE(helium_env)) THEN
CALL delete_rng_stream(uniform_array(i)%stream)
CALL delete_rng_stream(gaussian_array(i)%stream)
! only deallocate pointers here which were not passed on to helium_env(*)%helium
DEALLOCATE (uniform_array(i)%stream)
DEALLOCATE (gaussian_array(i)%stream)
END IF
NULLIFY (uniform_array(i)%stream)
NULLIFY (gaussian_array(i)%stream)
@ -1976,8 +1950,6 @@ CONTAINS
DEALLOCATE (uniform_array)
DEALLOCATE (gaussian_array)
RETURN
END SUBROUTINE helium_rng_init
! ***************************************************************************
@ -2060,8 +2032,8 @@ CONTAINS
ELSE
lbf = .FALSE.
END IF
CALL set_rng_stream(helium_env(k)%helium%rng_stream_uniform, bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
CALL helium_env(k)%helium%rng_stream_uniform%set(bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
bg(:, :) = UNPACK(message(off + 21:off + 26), MASK=m, FIELD=f)
cg(:, :) = UNPACK(message(off + 27:off + 32), MASK=m, FIELD=f)
ig(:, :) = UNPACK(message(off + 33:off + 38), MASK=m, FIELD=f)
@ -2072,8 +2044,8 @@ CONTAINS
ELSE
lbf = .FALSE.
END IF
CALL set_rng_stream(helium_env(k)%helium%rng_stream_gaussian, bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
CALL helium_env(k)%helium%rng_stream_gaussian%set(bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
END DO
END IF

View file

@ -43,7 +43,6 @@ MODULE helium_sampling
USE machine, ONLY: m_walltime
USE message_passing, ONLY: mp_bcast,&
mp_sum
USE parallel_rng_types, ONLY: next_random_number
USE physcon, ONLY: angstrom
USE pint_public, ONLY: pint_com_pos
USE pint_types, ONLY: pint_env_type
@ -228,7 +227,7 @@ CONTAINS
! 'rotation state' in helium%relrot wich is within (0, helium%beads-1)
! (this is needed to sample different fragments of the permutation
! paths in try_permutations)
rnd = next_random_number(helium_env(k)%helium%rng_stream_uniform)
rnd = helium_env(k)%helium%rng_stream_uniform%next()
nslices = INT(rnd*helium_env(k)%helium%beads)
CALL helium_rotate(helium_env(k)%helium, nslices)
@ -373,7 +372,7 @@ CONTAINS
END DO
ELSE IF (helium_env(1)%helium%get_helium_forces == helium_forces_last) THEN
IF (logger%para_env%ionode) THEN
sel_mp_source = INT(next_random_number(helium_env(1)%helium%rng_stream_uniform) &
sel_mp_source = INT(helium_env(1)%helium%rng_stream_uniform%next() &
*REAL(helium_env(1)%helium%num_env, dp))
END IF
CALL mp_bcast(sel_mp_source, logger%para_env%source, helium_env(1)%comm)
@ -599,7 +598,7 @@ CONTAINS
SELECT CASE (helium%m_dist_type)
CASE (helium_mdist_singlev)
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .LT. r) THEN
cyclen = 1
ELSE
@ -607,24 +606,24 @@ CONTAINS
END IF
CASE (helium_mdist_uniform)
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .LT. r) THEN
cyclen = helium%m_value
ELSE
DO
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
cyclen = INT(helium%maxcycle*x) + 1
IF (cyclen .NE. helium%m_value) EXIT
END DO
END IF
CASE (helium_mdist_linear)
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .LT. r) THEN
cyclen = helium%m_value
ELSE
DO
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
y = SQRT(2.0_dp*x)
cyclen = INT(helium%maxcycle*y/SQRT(2.0_dp)) + 1
IF (cyclen .NE. helium%m_value) EXIT
@ -632,12 +631,12 @@ CONTAINS
END IF
CASE (helium_mdist_quadratic)
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .LT. r) THEN
cyclen = helium%m_value
ELSE
DO
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
y = (3.0_dp*x)**(1.0_dp/3.0_dp)
z = 3.0_dp**(1.0_dp/3.0_dp)
cyclen = INT(helium%maxcycle*y/z) + 1
@ -646,13 +645,13 @@ CONTAINS
END IF
CASE (helium_mdist_exponential)
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .LT. r) THEN
cyclen = helium%m_value
ELSE
DO
DO
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .GE. 0.01_dp) EXIT
END DO
z = -LOG(0.01_dp)
@ -663,12 +662,12 @@ CONTAINS
END IF
CASE (helium_mdist_gaussian)
x = next_random_number(helium%rng_stream_uniform)
x = helium%rng_stream_uniform%next()
IF (x .LT. r) THEN
cyclen = 1
ELSE
DO
x = next_random_number(helium%rng_stream_gaussian)
x = helium%rng_stream_gaussian%next()
cyclen = INT(x*0.75_dp + helium%m_value - 0.5_dp) + 1
IF (cyclen .NE. 1) EXIT
END DO
@ -688,7 +687,7 @@ CONTAINS
! check, if permutation of this length can be constructed
IF (cyclen == 1) THEN
rnd = next_random_number(helium%rng_stream_uniform)
rnd = helium%rng_stream_uniform%next()
helium%ptable(1) = 1 + INT(rnd*helium%atoms)
helium%ptable(2) = -1
helium%pweight = 0.0_dp
@ -846,7 +845,7 @@ CONTAINS
DO k = 1, cyclen
CALL helium_boxmean_3d(helium, work(:, p(k), pk1), work(:, p(k), pk2), tmp1)
DO c = 1, 3
x = next_random_number(rng_stream=helium%rng_stream_gaussian, variance=1.0_dp)
x = helium%rng_stream_gaussian%next(variance=1.0_dp)
x = sigma*x
tmp1(c) = tmp1(c) + x
tmp2(c) = x
@ -872,7 +871,7 @@ CONTAINS
DO k = 1, cyclen
CALL helium_boxmean_3d(helium, work(:, p(k), pk1), work(:, perm(p(1 + MOD(k, cyclen))), 1), tmp1)
DO c = 1, 3
x = next_random_number(rng_stream=helium%rng_stream_gaussian, variance=1.0_dp)
x = helium%rng_stream_gaussian%next(variance=1.0_dp)
x = sigma*x
tmp1(c) = tmp1(c) + x
tmp2(c) = x
@ -954,7 +953,7 @@ CONTAINS
ds = ds - x*(tmp1(1)*tmp1(1) + tmp1(2)*tmp1(2) + tmp1(3)*tmp1(3))
END DO
! ok now accept or reject:
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
! IF ((dtk+ds-pds < 0.0_dp).AND.(EXP(dtk+ds-pds)<rtmp)) THEN
IF (dtk + ds - pds < 0.0_dp) THEN
IF (EXP(dtk + ds - pds) < rtmp) THEN
@ -993,7 +992,7 @@ CONTAINS
DO k = 1, cyclen
CALL helium_boxmean_3d(helium, work(:, p(k), pk1), work(:, p(k), pk2), tmp1)
DO c = 1, 3
x = next_random_number(rng_stream=helium%rng_stream_gaussian, variance=1.0_dp)
x = helium%rng_stream_gaussian%next(variance=1.0_dp)
x = sigma*x
tmp1(c) = tmp1(c) + x
tmp2(c) = x
@ -1017,7 +1016,7 @@ CONTAINS
DO k = 1, cyclen
CALL helium_boxmean_3d(helium, work(:, p(k), pk1), work(:, perm(p(1 + MOD(k, cyclen))), 1), tmp1)
DO c = 1, 3
x = next_random_number(rng_stream=helium%rng_stream_gaussian, variance=1.0_dp)
x = helium%rng_stream_gaussian%next(variance=1.0_dp)
x = sigma*x
tmp1(c) = tmp1(c) + x
tmp2(c) = x
@ -1127,7 +1126,7 @@ CONTAINS
END DO
DEALLOCATE (work3)
! ok now accept or reject:
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
! IF ((dtk+ds-pds<0.0_dp).AND.(EXP(dtk+ds-pds)<rtmp)) THEN
IF (dtk + ds - pds < 0.0_dp) THEN
IF (EXP(dtk + ds - pds) < rtmp) THEN
@ -1256,10 +1255,10 @@ CONTAINS
nmatrix => helium%nmatrix
p(len + 1) = -1
rnd = next_random_number(helium%rng_stream_uniform)
rnd = helium%rng_stream_uniform%next()
p(1) = INT(n*rnd) + 1
DO k = 1, len - 1
t = next_random_number(helium%rng_stream_uniform)
t = helium%rng_stream_uniform%next()
! find the corresponding path to connect to
! using the precalculated optimal decision tree:
i = n - 1
@ -1287,7 +1286,7 @@ CONTAINS
s1 = s1 + ipmatrix(p(len), perm(p(1)))
s2 = s2 + ipmatrix(p(len), perm(p(len)))
! final accept/reject:
rnd = next_random_number(helium%rng_stream_uniform)
rnd = helium%rng_stream_uniform%next()
t = s1*rnd
IF (t > s2) RETURN
! ok, we have accepted the permutation

View file

@ -25,7 +25,6 @@ MODULE helium_worm
USE kinds, ONLY: default_string_length,&
dp
USE mathconstants, ONLY: pi
USE parallel_rng_types, ONLY: next_random_number
USE pint_types, ONLY: pint_env_type
#include "../base/base_uses.f90"
@ -96,11 +95,11 @@ CONTAINS
IF (helium%worm_allow_open) THEN
DO ! Exit criterion at the end of the loop
DO iMC = 1, nMC
imove = next_random_number(helium%rng_stream_uniform, 1, helium%worm_all_limit)
imove = helium%rng_stream_uniform%next(1, helium%worm_all_limit)
IF (helium%worm_is_closed) THEN
IF ((imove >= helium%worm_centroid_min) .AND. (imove <= helium%worm_centroid_max)) THEN
! centroid move
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
CALL worm_centroid_move(pint_env, helium, &
iatom, helium%worm_centroid_drmax, ac)
ncentratt = ncentratt + 1
@ -109,18 +108,18 @@ CONTAINS
! staging is adjusted to conserve these weights
ELSE IF ((imove >= helium%worm_centroid_max + 1) .AND. (imove <= helium%worm_open_close_min - 1)) THEN
! staging move
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
ibead = next_random_number(helium%rng_stream_uniform, 1, helium%beads)
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
ibead = helium%rng_stream_uniform%next(1, helium%beads)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_staging_move(pint_env, helium, &
iatom, ibead, staging_l, ac)
nstagatt = nstagatt + 1
nstagacc = nstagacc + ac
ELSE IF ((imove >= helium%worm_open_close_min) .AND. (imove <= helium%worm_open_close_max)) THEN
! attempt opening of worm
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
ibead = next_random_number(helium%rng_stream_uniform, 1, helium%beads)
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
ibead = helium%rng_stream_uniform%next(1, helium%beads)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_open_move(pint_env, helium, &
iatom, ibead, staging_l, ac)
nopenatt = nopenatt + 1
@ -132,16 +131,16 @@ CONTAINS
ELSE ! worm is open
IF ((imove >= helium%worm_centroid_min) .AND. (imove <= helium%worm_centroid_max)) THEN
! centroid move
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
CALL worm_centroid_move(pint_env, helium, &
iatom, helium%worm_centroid_drmax, ac)
ncentratt = ncentratt + 1
ncentracc = ncentracc + ac
ELSE IF ((imove >= helium%worm_staging_min) .AND. (imove <= helium%worm_staging_max)) THEN
! staging move
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
ibead = next_random_number(helium%rng_stream_uniform, 1, helium%beads)
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
ibead = helium%rng_stream_uniform%next(1, helium%beads)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_staging_move(pint_env, helium, &
iatom, ibead, staging_l, ac)
nstagatt = nstagatt + 1
@ -149,7 +148,7 @@ CONTAINS
ELSE IF ((imove >= helium%worm_fcrawl_min) .AND. (imove <= helium%worm_fcrawl_max)) THEN
! crawl forward
DO icrawl = 1, helium%worm_repeat_crawl
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_crawl_move_forward(pint_env, helium, &
staging_l, ac)
ncrawlfwdatt = ncrawlfwdatt + 1
@ -158,7 +157,7 @@ CONTAINS
ELSE IF ((imove >= helium%worm_bcrawl_min) .AND. (imove <= helium%worm_bcrawl_max)) THEN
! crawl backward
DO icrawl = 1, helium%worm_repeat_crawl
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_crawl_move_backward(pint_env, helium, &
staging_l, ac)
ncrawlbwdatt = ncrawlbwdatt + 1
@ -166,20 +165,20 @@ CONTAINS
END DO
ELSE IF ((imove >= helium%worm_head_min) .AND. (imove <= helium%worm_head_max)) THEN
! move head
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_head_move(pint_env, helium, &
staging_l, ac)
nmoveheadatt = nmoveheadatt + 1
nmoveheadacc = nmoveheadacc + ac
ELSE IF ((imove >= helium%worm_tail_min) .AND. (imove <= helium%worm_tail_max)) THEN
! move tail
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_tail_move(pint_env, helium, &
staging_l, ac)
nmovetailatt = nmovetailatt + 1
nmovetailacc = nmovetailacc + ac
ELSE IF ((imove >= helium%worm_swap_min) .AND. (imove <= helium%worm_swap_max)) THEN
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_swap_move(pint_env, helium, &
helium%atoms, staging_l, ac)
npswapacc = npswapacc + ac
@ -187,7 +186,7 @@ CONTAINS
nswapatt = nswapatt + 1
ELSE IF ((imove >= helium%worm_open_close_min) .AND. (imove <= helium%worm_open_close_max)) THEN
! attempt closing of worm
staging_l = next_random_number(helium%rng_stream_uniform, 2, helium%worm_staging_l)
staging_l = helium%rng_stream_uniform%next(2, helium%worm_staging_l)
CALL worm_close_move(pint_env, helium, &
staging_l, ac)
ncloseatt = ncloseatt + 1
@ -220,19 +219,19 @@ CONTAINS
END DO !attempts loop
ELSE ! only closed configurations allowed
DO iMC = 1, nMC
imove = next_random_number(helium%rng_stream_uniform, 1, helium%worm_all_limit)
imove = helium%rng_stream_uniform%next(1, helium%worm_all_limit)
IF ((imove >= helium%worm_centroid_min) .AND. (imove <= helium%worm_centroid_max)) THEN
! centroid move
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
CALL worm_centroid_move(pint_env, helium, &
iatom, helium%worm_centroid_drmax, ac)
ncentratt = ncentratt + 1
ncentracc = ncentracc + ac
ELSE IF ((imove >= helium%worm_staging_min) .AND. (imove <= helium%worm_staging_max)) THEN
! staging move
iatom = next_random_number(helium%rng_stream_uniform, 1, helium%atoms)
ibead = next_random_number(helium%rng_stream_uniform, 1, helium%beads)
iatom = helium%rng_stream_uniform%next(1, helium%atoms)
ibead = helium%rng_stream_uniform%next(1, helium%beads)
CALL worm_staging_move(pint_env, helium, &
iatom, ibead, helium%worm_staging_l, ac)
nstagatt = nstagatt + 1
@ -355,7 +354,7 @@ CONTAINS
REAL(KIND=dp), DIMENSION(3) :: dr, dro, new_com, old_com
DO ic = 1, 3
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
dr(ic) = (2.0_dp*rtmp - 1.0_dp)*drmax
END DO
@ -417,7 +416,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -846,8 +845,6 @@ CONTAINS
partaction = partaction*helium%tau
RETURN
END FUNCTION worm_centroid_move_inter_action
! **************************************************************************************************
@ -886,8 +883,7 @@ CONTAINS
invstagemass = rk*weight*imass
! proposing new positions
DO idim = 1, 3
new_path(idim, 1) = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%tau*invstagemass)
new_path(idim, 1) = helium%rng_stream_gaussian%next(variance=helium%tau*invstagemass)
END DO
new_path(:, 1) = new_path(:, 1) + weight*(re(:) + rk*rs(:))
@ -899,8 +895,7 @@ CONTAINS
invstagemass = rk*weight*imass
! proposing new positions
DO idim = 1, 3
new_path(idim, istage) = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%tau*invstagemass)
new_path(idim, istage) = helium%rng_stream_gaussian%next(variance=helium%tau*invstagemass)
END DO
new_path(:, istage) = new_path(:, istage) + weight*(rk*new_path(:, istage - 1) + re(:))
END DO
@ -1025,7 +1020,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -1134,8 +1129,6 @@ CONTAINS
END DO
END IF
RETURN
END SUBROUTINE worm_staging_move
! **************************************************************************************************
@ -1196,15 +1189,13 @@ CONTAINS
! gro head from startbead
DO kbead = startbead + 1, endbead - 1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead - 1) + xr
END DO
END DO
! last grow head bead
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, startatom, endbead - 1) + xr
END DO
ELSE IF (endbead /= 1) THEN
@ -1212,28 +1203,24 @@ CONTAINS
! grow from startbead
DO kbead = startbead + 1, helium%beads
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead - 1) + xr
END DO
END DO
! bead one of endatom relative to last on startatom
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, endatom, 1) = helium%work(idim, startatom, helium%beads) + xr
END DO
! everything on endatom
DO kbead = 2, endbead - 1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, endatom, kbead) = helium%work(idim, endatom, kbead - 1) + xr
END DO
END DO
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, endatom, endbead - 1) + xr
END DO
ELSE ! imagtimewrap and headbead = 1
@ -1241,15 +1228,13 @@ CONTAINS
! grow from startbead
DO kbead = startbead + 1, helium%beads
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead - 1) + xr
END DO
END DO
! bead one of endatom relative to last on startatom
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, startatom, helium%beads) + xr
END DO
END IF
@ -1280,7 +1265,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -1520,7 +1505,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -1701,15 +1686,13 @@ CONTAINS
! gro head from startbead
DO kbead = startbead + 1, endbead - 1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead - 1) + xr
END DO
END DO
! last grow head bead
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, startatom, endbead - 1) + xr
END DO
ELSE IF (endbead /= 1) THEN
@ -1717,28 +1700,24 @@ CONTAINS
! grow from startbead
DO kbead = startbead + 1, helium%beads
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead - 1) + xr
END DO
END DO
! bead one of endatom relative to last on startatom
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, endatom, 1) = helium%work(idim, startatom, helium%beads) + xr
END DO
! everything on endatom
DO kbead = 2, endbead - 1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, endatom, kbead) = helium%work(idim, endatom, kbead - 1) + xr
END DO
END DO
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, endatom, endbead - 1) + xr
END DO
ELSE ! imagtimewrap and headbead = 1
@ -1746,15 +1725,13 @@ CONTAINS
! grow from startbead
DO kbead = startbead + 1, helium%beads
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead - 1) + xr
END DO
END DO
! bead one of endatom relative to last on startatom
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, startatom, helium%beads) + xr
END DO
END IF
@ -1778,7 +1755,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -1961,8 +1938,7 @@ CONTAINS
! gro tail from endbead to startbead (confusing eh?)
DO kbead = endbead - 1, startbead, -1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead + 1) + xr
END DO
END DO
@ -1971,24 +1947,21 @@ CONTAINS
! grow from endbead
DO kbead = endbead - 1, 1, -1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, endatom, kbead) = helium%work(idim, endatom, kbead + 1) + xr
END DO
END DO
! over imaginary time boundary
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, helium%beads) = helium%work(idim, endatom, 1) + xr
END DO
! rest on startatom
DO kbead = helium%beads - 1, startbead, -1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, startatom, kbead) = helium%work(idim, startatom, kbead + 1) + xr
END DO
END DO
@ -2013,7 +1986,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -2222,15 +2195,13 @@ CONTAINS
! gro head from startbead
DO kbead = helium%worm_bead_idx + 1, helium%worm_bead_idx_work - 1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx, kbead) = helium%work(idim, helium%worm_atom_idx, kbead - 1) + xr
END DO
END DO
! last grow head bead
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, helium%worm_atom_idx, helium%worm_bead_idx_work - 1) + xr
END DO
ELSE IF (helium%worm_bead_idx_work /= 1) THEN
@ -2238,28 +2209,24 @@ CONTAINS
! grow from startbead
DO kbead = helium%worm_bead_idx + 1, helium%beads
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx, kbead) = helium%work(idim, helium%worm_atom_idx, kbead - 1) + xr
END DO
END DO
! bead one of endatom relative to last on helium%worm_atom_idx
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx_work, 1) = helium%work(idim, helium%worm_atom_idx, helium%beads) + xr
END DO
! everything on endatom
DO kbead = 2, helium%worm_bead_idx_work - 1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx_work, kbead) = helium%work(idim, helium%worm_atom_idx_work, kbead - 1) + xr
END DO
END DO
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, helium%worm_atom_idx_work, helium%worm_bead_idx_work - 1) + xr
END DO
ELSE ! imagtimewrap and headbead = 1
@ -2267,15 +2234,13 @@ CONTAINS
! grow from startbead
DO kbead = helium%worm_bead_idx + 1, helium%beads
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx, kbead) = helium%work(idim, helium%worm_atom_idx, kbead - 1) + xr
END DO
END DO
! bead one of endatom relative to last on helium%worm_atom_idx
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%worm_xtra_bead_work(idim) = helium%work(idim, helium%worm_atom_idx, helium%beads) + xr
END DO
END IF
@ -2301,7 +2266,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -2519,8 +2484,7 @@ CONTAINS
! gro tail from endbead to startbead (confusing eh?)
DO kbead = helium%worm_bead_idx - 1, helium%worm_bead_idx_work, -1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx, kbead) = helium%work(idim, helium%worm_atom_idx, kbead + 1) + xr
END DO
@ -2530,24 +2494,21 @@ CONTAINS
! grow from endbead
DO kbead = helium%worm_bead_idx - 1, 1, -1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx, kbead) = helium%work(idim, helium%worm_atom_idx, kbead + 1) + xr
END DO
END DO
! over imaginary time boundary
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx_work, helium%beads) = helium%work(idim, helium%worm_atom_idx, 1) + xr
END DO
! rest on startatom
DO kbead = helium%beads - 1, helium%worm_bead_idx_work, -1
DO idim = 1, 3
xr = next_random_number(rng_stream=helium%rng_stream_gaussian, &
variance=helium%hb2m*helium%tau)
xr = helium%rng_stream_gaussian%next(variance=helium%hb2m*helium%tau)
helium%work(idim, helium%worm_atom_idx_work, kbead) = helium%work(idim, helium%worm_atom_idx_work, kbead + 1) + xr
END DO
END DO
@ -2573,7 +2534,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF
@ -2795,7 +2756,7 @@ CONTAINS
forwarddensmatsum = SUM(forwarddensmat)
! Select an atom with its corresponding probability
rtmp = next_random_number(helium%rng_stream_uniform)*forwarddensmatsum
rtmp = helium%rng_stream_uniform%next()*forwarddensmatsum
fendatom = 1
DO WHILE (rtmp >= forwarddensmat(fendatom))
rtmp = rtmp - forwarddensmat(fendatom)
@ -2941,7 +2902,7 @@ CONTAINS
IF (sdiff < -100.0_dp) THEN ! To protect from exponential underflow
should_reject = .TRUE.
ELSE
rtmp = next_random_number(helium%rng_stream_uniform)
rtmp = helium%rng_stream_uniform%next()
IF (EXP(sdiff) < rtmp) THEN
should_reject = .TRUE.
END IF

View file

@ -64,9 +64,7 @@ MODULE input_cp2k_restarts
USE molecule_kind_list_types, ONLY: molecule_kind_list_type
USE molecule_list_types, ONLY: molecule_list_type
USE neb_types, ONLY: neb_var_type
USE parallel_rng_types, ONLY: dump_rng_stream,&
get_rng_stream,&
rng_record_length
USE parallel_rng_types, ONLY: rng_record_length
USE particle_list_types, ONLY: particle_list_type
USE particle_types, ONLY: get_particle_pos_or_vel,&
particle_type
@ -1008,8 +1006,7 @@ CONTAINS
ELSE IF (pint_env%pimd_thermostat == thermostat_pile) THEN
tmpsec => section_vals_get_subs_vals(pint_section, &
"PILE%RNG_INIT")
CALL dump_rng_stream(rng_stream=pint_env%pile_therm%gaussian_rng_stream, &
rng_record=rng_record)
CALL pint_env%pile_therm%gaussian_rng_stream%dump(rng_record)
CALL string_to_ascii(rng_record, ascii(:, 1))
CALL section_rng_val_set(rng_section=tmpsec, nsize=1, &
ascii=ascii)
@ -1023,8 +1020,7 @@ CONTAINS
ELSE IF (pint_env%pimd_thermostat == thermostat_piglet) THEN
tmpsec => section_vals_get_subs_vals(pint_section, &
"PIGLET%RNG_INIT")
CALL dump_rng_stream(rng_stream=pint_env%piglet_therm%gaussian_rng_stream, &
rng_record=rng_record)
CALL pint_env%piglet_therm%gaussian_rng_stream%dump(rng_record)
CALL string_to_ascii(rng_record, ascii(:, 1))
CALL section_rng_val_set(rng_section=tmpsec, nsize=1, &
ascii=ascii)
@ -1261,8 +1257,8 @@ CONTAINS
real_msg_gather(:) = 0.0_dp
DO i = 1, SIZE(helium_env)
CALL get_rng_stream(helium_env(i)%helium%rng_stream_uniform, bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
CALL helium_env(i)%helium%rng_stream_uniform%get(bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
off = 0
real_msg(off + 1:off + 6) = PACK(bg, .TRUE.)
real_msg(off + 7:off + 12) = PACK(cg, .TRUE.)
@ -1274,8 +1270,8 @@ CONTAINS
END IF
real_msg(off + 19) = bf
real_msg(off + 20) = bu
CALL get_rng_stream(helium_env(i)%helium%rng_stream_gaussian, bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
CALL helium_env(i)%helium%rng_stream_gaussian%get(bg=bg, cg=cg, ig=ig, &
buffer=bu, buffer_filled=lbf)
off = 20
real_msg(off + 1:off + 6) = PACK(bg, .TRUE.)
real_msg(off + 7:off + 12) = PACK(cg, .TRUE.)
@ -1553,8 +1549,7 @@ CONTAINS
dwork = 0
DO i = 1, csvr%loc_num_csvr
my_index = csvr%map_info%index(i)
CALL dump_rng_stream(rng_stream=csvr%nvt(i)%gaussian_rng_stream, &
rng_record=rng_record)
CALL csvr%nvt(i)%gaussian_rng_stream%dump(rng_record)
CALL string_to_ascii(rng_record, dwork(:, my_index))
END DO
@ -1681,8 +1676,7 @@ CONTAINS
dwork = 0
DO i = 1, loc_num
j = gle%map_info%index(i)
CALL dump_rng_stream(rng_stream=gle%nvt(i)%gaussian_rng_stream, &
rng_record=rng_record)
CALL gle%nvt(i)%gaussian_rng_stream%dump(rng_record)
CALL string_to_ascii(rng_record, dwork(:, j))
END DO

View file

@ -73,8 +73,6 @@ MODULE integrator
USE molecule_list_types, ONLY: molecule_list_type
USE molecule_types, ONLY: global_constraint_type,&
molecule_type
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE particle_types, ONLY: particle_type,&
update_particle_set
@ -154,7 +152,6 @@ CONTAINS
TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
TYPE(particle_list_type), POINTER :: particles
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(simpar_type), POINTER :: simpar
TYPE(thermal_region_type), POINTER :: thermal_region
TYPE(thermal_regions_type), POINTER :: thermal_regions
@ -162,7 +159,7 @@ CONTAINS
NULLIFY (cell, para_env, gci, force_env)
NULLIFY (atomic_kinds, local_particles, subsys, local_molecules, molecule_kinds, molecules)
NULLIFY (molecule_kind_set, molecule_set, particles, particle_set, rng_stream, simpar, virial)
NULLIFY (molecule_kind_set, molecule_set, particles, particle_set, simpar, virial)
NULLIFY (thermal_region, thermal_regions, itimes)
CALL get_md_env(md_env=md_env, simpar=simpar, force_env=force_env, &
@ -253,11 +250,12 @@ CONTAINS
iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
IF (do_langevin(iparticle)) THEN
sigma = var_w(iparticle)*mass
rng_stream => local_particles%local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream
w(1, iparticle) = next_random_number(rng_stream, variance=sigma)
w(2, iparticle) = next_random_number(rng_stream, variance=sigma)
w(3, iparticle) = next_random_number(rng_stream, variance=sigma)
ASSOCIATE (rng_stream=>local_particles%local_particle_set(iparticle_kind)% &
rng(iparticle_local))
w(1, iparticle) = rng_stream%stream%next(variance=sigma)
w(2, iparticle) = rng_stream%stream%next(variance=sigma)
w(3, iparticle) = rng_stream%stream%next(variance=sigma)
END ASSOCIATE
END IF
END DO
END DO
@ -744,7 +742,6 @@ CONTAINS
shell_particles
TYPE(particle_type), DIMENSION(:), POINTER :: core_particle_set, particle_set, &
shell_particle_set
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(simpar_type), POINTER :: simpar
TYPE(thermostat_type), POINTER :: thermostat_coeff, thermostat_fast, &
thermostat_shell, thermostat_slow
@ -831,8 +828,7 @@ CONTAINS
IF (ASSOCIATED(force_env%meta_env)) THEN
IF (force_env%meta_env%langevin) THEN
DO ivar = 1, force_env%meta_env%n_colvar
rng_stream => force_env%meta_env%rng(ivar)%stream
rand(ivar) = next_random_number(rng_stream)
rand(ivar) = force_env%meta_env%rng(ivar)%next()
ENDDO
CALL metadyn_velocities_colvar(force_env, rand)
ENDIF
@ -956,7 +952,6 @@ CONTAINS
shell_particles
TYPE(particle_type), DIMENSION(:), POINTER :: core_particle_set, particle_set, &
shell_particle_set
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(simpar_type), POINTER :: simpar
TYPE(thermostat_type), POINTER :: thermostat_coeff, thermostat_part, &
thermostat_shell
@ -1040,8 +1035,7 @@ CONTAINS
IF (ASSOCIATED(force_env%meta_env)) THEN
IF (force_env%meta_env%langevin) THEN
DO ivar = 1, force_env%meta_env%n_colvar
rng_stream => force_env%meta_env%rng(ivar)%stream
rand(ivar) = next_random_number(rng_stream)
rand(ivar) = force_env%meta_env%rng(ivar)%next()
ENDDO
CALL metadyn_velocities_colvar(force_env, rand)
ENDIF
@ -1208,7 +1202,6 @@ CONTAINS
shell_particles
TYPE(particle_type), DIMENSION(:), POINTER :: core_particle_set, particle_set, &
shell_particle_set
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(simpar_type), POINTER :: simpar
TYPE(thermostat_type), POINTER :: thermostat_baro, thermostat_part, &
thermostat_shell
@ -1324,8 +1317,7 @@ CONTAINS
IF (ASSOCIATED(force_env%meta_env)) THEN
IF (force_env%meta_env%langevin) THEN
DO ivar = 1, force_env%meta_env%n_colvar
rng_stream => force_env%meta_env%rng(ivar)%stream
rand(ivar) = next_random_number(rng_stream)
rand(ivar) = force_env%meta_env%rng(ivar)%next()
ENDDO
CALL metadyn_velocities_colvar(force_env, rand)
ENDIF

View file

@ -45,8 +45,7 @@ MODULE mc_control
USE molecule_kind_types, ONLY: atom_type,&
get_molecule_kind,&
molecule_kind_type
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE physcon, ONLY: angstrom
#include "../../base/base_uses.f90"
@ -172,7 +171,7 @@ CONTAINS
TYPE(force_env_type), POINTER :: force_env
INTEGER, INTENT(IN) :: iw
INTEGER, INTENT(INOUT) :: mc_nunits_tot
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'read_mc_restart', &
routineP = moduleN//':'//routineN
@ -318,7 +317,7 @@ CONTAINS
! advance the random number sequence based on the restart step
IF (ionode) THEN
DO i = 1, nstart + 1
rand = next_random_number(rng_stream)
rand = rng_stream%next()
ENDDO
ENDIF
@ -420,4 +419,3 @@ CONTAINS
END SUBROUTINE mc_create_bias_force_env
END MODULE mc_control

View file

@ -24,8 +24,7 @@ MODULE mc_coordinates
mc_simpar_type
USE message_passing, ONLY: mp_bcast
USE molecule_types, ONLY: molecule_type
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE physcon, ONLY: angstrom
#include "../../base/base_uses.f90"
@ -345,7 +344,7 @@ CONTAINS
LOGICAL, INTENT(IN) :: ionode, lremove
INTEGER, DIMENSION(:), INTENT(IN) :: mol_type, nchains
INTEGER, INTENT(IN) :: source, group
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
INTEGER, INTENT(IN), OPTIONAL :: avbmc_atom
REAL(KIND=dp), INTENT(IN), OPTIONAL :: rmin, rmax
CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: move_type
@ -463,7 +462,7 @@ CONTAINS
ELSE
! find a new insertion point somewhere in the box
DO i = 1, 3
rand = next_random_number(rng_stream)
rand = rng_stream%next()
r_insert(i) = rand*abc(i)
ENDDO
@ -548,7 +547,7 @@ CONTAINS
total_running_weight = 0.0E0_dp
choosen = 0
IF (ionode) THEN
rand = next_random_number(rng_stream)
rand = rng_stream%next()
! CALL random_number(rand)
ENDIF
CALL mp_bcast(rand, source, group)
@ -631,7 +630,7 @@ CONTAINS
REAL(KIND=dp), DIMENSION(1:natoms), INTENT(IN) :: mass
REAL(KIND=dp), DIMENSION(1:3, 1:natoms), &
INTENT(INOUT) :: r
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'rotate_molecule', &
routineP = moduleN//':'//routineN
@ -649,7 +648,7 @@ CONTAINS
CALL get_center_of_mass(r(:, :), natoms, center_of_mass(:), mass(:))
! call a random number to figure out how far we're moving
rand = next_random_number(rng_stream)
rand = rng_stream%next()
dgamma = pi*(rand - 0.5E0_dp)*2.0E0_dp
! *** set up the rotation matrix ***
@ -719,7 +718,7 @@ CONTAINS
TYPE(mc_molecule_info_type), POINTER :: mc_molecule_info
INTEGER, INTENT(OUT) :: start_atom, box_number, molecule_type
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
INTEGER, INTENT(IN), OPTIONAL :: box, molecule_type_old
CHARACTER(LEN=*), PARAMETER :: routineN = 'find_mc_test_molecule', &
@ -747,7 +746,7 @@ CONTAINS
IF (PRESENT(box) .AND. PRESENT(molecule_type_old)) THEN
! only need to find the atom number the molecule starts on
rand = next_random_number(rng_stream)
rand = rng_stream%next()
molecule_number = CEILING(rand*REAL(nchains(molecule_type_old, box), KIND=dp))
start_mol = 1
@ -767,7 +766,7 @@ CONTAINS
ELSEIF (PRESENT(box)) THEN
! any molecule in box...need to find molecule type and start atom
rand = next_random_number(rng_stream)
rand = rng_stream%next()
molecule_number = CEILING(rand*REAL(SUM(nchains(:, box)), KIND=dp))
start_mol = 1
@ -785,7 +784,7 @@ CONTAINS
ELSEIF (PRESENT(molecule_type_old)) THEN
! any molecule of type molecule_type_old...need to find box number and start atom
rand = next_random_number(rng_stream)
rand = rng_stream%next()
molecule_number = CEILING(rand*REAL(SUM(nchains(molecule_type_old, :)), KIND=dp))
! find which box it's in
@ -818,7 +817,7 @@ CONTAINS
DO ibox = 1, SIZE(nchains(1, :))
nchains_tot = nchains_tot + SUM(nchains(:, ibox))
ENDDO
rand = next_random_number(rng_stream)
rand = rng_stream%next()
molecule_number = CEILING(rand*REAL(nchains_tot, KIND=dp))
molecule_type = mol_type(molecule_number)
@ -939,7 +938,7 @@ CONTAINS
CHARACTER(LEN=*), INTENT(IN) :: move_type
REAL(KIND=dp), DIMENSION(1:3), INTENT(OUT) :: r_insert
REAL(KIND=dp), DIMENSION(1:3), INTENT(IN) :: abc
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
INTEGER :: i
REAL(dp) :: dist, eta_1, eta_2, eta_sq, rand
@ -950,8 +949,8 @@ CONTAINS
IF (move_type == 'in') THEN
! generate a random unit vector, from Allen and Tildesley
DO
eta_1 = next_random_number(rng_stream)
eta_2 = next_random_number(rng_stream)
eta_1 = rng_stream%next()
eta_2 = rng_stream%next()
eta_sq = eta_1**2 + eta_2**2
IF (eta_sq .LT. 1.0_dp) THEN
r_insert(1) = 2.0_dp*eta_1*SQRT(1.0_dp - eta_sq)
@ -962,7 +961,7 @@ CONTAINS
ENDDO
! now scale that vector to be within the "in" region
rand = next_random_number(rng_stream)
rand = rng_stream%next()
r_insert(1:3) = r_insert(1:3)*(rand*(rmax**3 - rmin**3) + rmin**3)** &
(1.0_dp/3.0_dp)
@ -972,7 +971,7 @@ CONTAINS
! find a new insertion point somewhere in the box
DO
DO i = 1, 3
rand = next_random_number(rng_stream)
rand = rng_stream%next()
r_insert(i) = rand*abc(i)
ENDDO

View file

@ -73,8 +73,7 @@ MODULE mc_ensembles
mc_simulation_parameters_p_type,&
set_mc_par
USE message_passing, ONLY: mp_bcast
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE particle_list_types, ONLY: particle_list_p_type,&
particle_list_type
USE particle_methods, ONLY: write_particle_coordinates
@ -117,7 +116,7 @@ CONTAINS
TYPE(global_environment_type), POINTER :: globenv
TYPE(section_type), POINTER :: input_declaration
INTEGER, INTENT(IN) :: nboxes
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_run_ensemble', &
routineP = moduleN//':'//routineN
@ -444,7 +443,7 @@ CONTAINS
WRITE (iw, *) "------- On Monte Carlo Step ", nnstep
ENDIF
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
! broadcast the random number, to make sure we're on the same move
CALL mp_bcast(rand, source, group)
@ -469,7 +468,7 @@ CONTAINS
r_old, rng_stream)
CASE ("GEMC_NPT")
! we need to select a box based on the probability given in the input file
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
DO ibox = 1, nboxes
@ -574,7 +573,7 @@ CONTAINS
ENDIF
! pick a box at random
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
DO ibox = 1, nboxes
@ -600,7 +599,7 @@ CONTAINS
ENDIF
! first, pick a box to do it for
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
IF (nboxes .EQ. 2) THEN
@ -614,7 +613,7 @@ CONTAINS
ENDIF
! now pick a molecule type to do it for
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
molecule_type_swap = 0
DO imol_type = 1, nmol_types
@ -654,7 +653,7 @@ CONTAINS
! choose if we're swapping into the bonded region of mol_target, or
! into the nonbonded region
rand = next_random_number(rng_stream)
rand = rng_stream%next()
ENDIF
CALL mp_bcast(start_atom_swap, source, group)
@ -690,12 +689,12 @@ CONTAINS
DO imove = 1, nmoves
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
IF (rand .LT. pmtraion) THEN
! change molecular conformation
! first, pick a box to do it for
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
IF (nboxes .EQ. 2) THEN
IF (rand .LT. 0.75E0_dp) THEN
@ -708,7 +707,7 @@ CONTAINS
ENDIF
! figure out which molecule type we're looking for
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
molecule_type = 0
DO imol_type = 1, nmol_types
@ -736,7 +735,7 @@ CONTAINS
box=box_number, molecule_type_old=molecule_type)
! choose if we're changing a bond length or an angle
rand = next_random_number(rng_stream)
rand = rng_stream%next()
ENDIF
CALL mp_bcast(rand, source, group)
CALL mp_bcast(start_atom, source, group)
@ -766,7 +765,7 @@ CONTAINS
ELSEIF (rand .LT. pmtrans) THEN
! translate a whole molecule in the system
! pick a molecule type
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
molecule_type = 0
DO imol_type = 1, nmol_types
@ -798,7 +797,7 @@ CONTAINS
ELSEIF (rand .LT. pmcltrans) THEN
! translate a whole cluster in the system
! first, pick a box to do it for
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
DO ibox = 1, nboxes
@ -819,7 +818,7 @@ CONTAINS
ELSE
! rotate a whole molecule in the system
! pick a molecule type
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
molecule_type = 0
DO imol_type = 1, nmol_types
@ -1174,7 +1173,7 @@ CONTAINS
SUBROUTINE mc_compute_virial(mc_env, rng_stream)
TYPE(mc_environment_p_type), DIMENSION(:), POINTER :: mc_env
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_compute_virial', &
routineP = moduleN//':'//routineN

View file

@ -45,8 +45,7 @@ MODULE mc_ge_moves
mc_molecule_info_destroy, mc_molecule_info_type, mc_moves_p_type, &
mc_simulation_parameters_p_type, set_mc_par
USE message_passing, ONLY: mp_bcast
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE particle_list_types, ONLY: particle_list_p_type,&
particle_list_type
USE particle_methods, ONLY: write_particle_coordinates
@ -117,7 +116,7 @@ CONTAINS
INTEGER, DIMENSION(:), INTENT(IN) :: box_flag
TYPE(cp_subsys_p_type), DIMENSION(:), POINTER :: subsys
TYPE(particle_list_p_type), DIMENSION(:), POINTER :: particles
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
REAL(KIND=dp), INTENT(IN) :: unit_conv
CHARACTER(len=*), PARAMETER :: routineN = 'mc_Quickstep_move', &
@ -284,7 +283,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -435,7 +434,7 @@ CONTAINS
TYPE(section_type), POINTER :: input_declaration
TYPE(cp_para_env_type), POINTER :: para_env
REAL(KIND=dp), DIMENSION(1:2), INTENT(INOUT) :: bias_energy_old, last_bias_energy
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_ge_swap_move', &
routineP = moduleN//':'//routineN
@ -511,7 +510,7 @@ CONTAINS
ENDDO
! choose a direction to swap
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
IF (rand .LE. 0.50E0_dp) THEN
@ -531,7 +530,7 @@ CONTAINS
! insert_box=1
! now choose a molecule type at random
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
DO itype = 1, nmol_types
IF (rand .LT. pmswap_mol(itype)) THEN
@ -552,7 +551,7 @@ CONTAINS
moves(molecule_type, insert_box)%moves%empty + 1
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
imolecule = CEILING(rand*nchains(molecule_type, remove_box))
! figure out the atom number this molecule starts on
@ -627,7 +626,7 @@ CONTAINS
IF (ionode) THEN
! choose an insertion point
DO idim = 1, 3
rand = next_random_number(rng_stream)
rand = rng_stream%next()
pos_insert(idim) = rand*abc_insert(idim)
ENDDO
ENDIF
@ -1008,7 +1007,7 @@ CONTAINS
IF (w .GE. 1.0E0_dp) THEN
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -1138,7 +1137,7 @@ CONTAINS
INTEGER, INTENT(IN) :: nnstep
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: old_energy, energy_check
REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT) :: r_old
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_ge_volume_move', &
routineP = moduleN//':'//routineN
@ -1237,7 +1236,7 @@ CONTAINS
ENDDO
! call a random number to figure out how far we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
vol_dis = rmvolume*(rand - 0.5E0_dp)*2.0E0_dp
@ -1363,7 +1362,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF

View file

@ -51,8 +51,7 @@ MODULE mc_moves
get_molecule_kind,&
molecule_kind_type,&
torsion_type
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE physcon, ONLY: angstrom
#include "../../base/base_uses.f90"
@ -144,7 +143,7 @@ CONTAINS
REAL(KIND=dp), INTENT(INOUT) :: bias_energy
CHARACTER(LEN=*), INTENT(IN) :: move_type
LOGICAL, INTENT(OUT) :: lreject
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_conformation_change', &
routineP = moduleN//':'//routineN
@ -350,7 +349,7 @@ CONTAINS
rand = 0.0E0_dp
ELSE
IF (ionode) THEN
rand = next_random_number(rng_stream)
rand = rng_stream%next()
ENDIF
CALL mp_bcast(rand, source, group)
ENDIF
@ -440,7 +439,7 @@ CONTAINS
REAL(KIND=dp), INTENT(INOUT) :: bias_energy
INTEGER, INTENT(IN) :: molecule_type
LOGICAL, INTENT(OUT) :: lreject
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_molecule_translation', &
routineP = moduleN//':'//routineN
@ -536,13 +535,13 @@ CONTAINS
! move one molecule in the system
! call a random number to figure out which direction we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
! 1,2,3 with equal prob
move_direction = INT(3*rand) + 1
! call a random number to figure out how far we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
dis_mol = rmtrans(molecule_type)*(rand - 0.5E0_dp)*2.0E0_dp
@ -592,7 +591,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -663,7 +662,7 @@ CONTAINS
INTEGER, INTENT(IN) :: box_number, start_atom, molecule_type
REAL(KIND=dp), INTENT(INOUT) :: bias_energy
LOGICAL, INTENT(OUT) :: lreject
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_molecule_rotation', &
routineP = moduleN//':'//routineN
@ -771,7 +770,7 @@ CONTAINS
! rotate one molecule in the system
! call a random number to figure out which direction we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
! CALL RANDOM_NUMBER(rand)
CALL mp_bcast(rand, source, group)
! 1,2,3 with equal prob
@ -798,7 +797,7 @@ CONTAINS
nzcm = nzcm/masstot
! call a random number to figure out how far we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
dgamma = rmrot(molecule_type)*(rand - 0.5E0_dp)*2.0E0_dp
@ -895,7 +894,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -968,7 +967,7 @@ CONTAINS
REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: r_old
INTEGER, INTENT(IN) :: iw
INTEGER, DIMENSION(1:3, 1:2), INTENT(INOUT) :: discrete_array
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(LEN=*), PARAMETER :: routineN = 'mc_volume_move', routineP = moduleN//':'//routineN
@ -1047,7 +1046,7 @@ CONTAINS
! now do the move
! call a random number to figure out how far we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
! find the test cell lenghts for the discrete volume move
@ -1063,7 +1062,7 @@ CONTAINS
! if we're increasing the volume, we need to find a side we can increase
IF (lincrease) THEN
DO
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
iside_change = CEILING(3.0_dp*rand)
IF (discrete_array(iside_change, 1) .EQ. 1) THEN
@ -1074,7 +1073,7 @@ CONTAINS
ENDDO
ELSE
DO
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
iside_change = CEILING(3.0_dp*rand)
IF (discrete_array(iside_change, 2) .EQ. 1) THEN
@ -1240,7 +1239,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -1311,7 +1310,7 @@ CONTAINS
TYPE(molecule_kind_type), POINTER :: molecule_kind
REAL(KIND=dp), INTENT(OUT) :: dis_length
TYPE(particle_list_type), POINTER :: particles
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'change_bond_length', &
routineP = moduleN//':'//routineN
@ -1347,7 +1346,7 @@ CONTAINS
! pick which bond in the molecule at random
IF (ionode) THEN
rand = next_random_number(rng_stream)
rand = rng_stream%next()
ENDIF
CALL mp_bcast(rand, source, group)
CALL get_molecule_kind(molecule_kind, natom=natom, nbond=nbond, &
@ -1406,7 +1405,7 @@ CONTAINS
ENDDO
! choose a displacement
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
dis_length = rmbond(molecule_type)*2.0E0_dp*(rand - 0.5E0_dp)
@ -1478,7 +1477,7 @@ CONTAINS
INTEGER, INTENT(IN) :: molecule_type
TYPE(molecule_kind_type), POINTER :: molecule_kind
TYPE(particle_list_type), POINTER :: particles
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'change_bond_angle', &
routineP = moduleN//':'//routineN
@ -1517,7 +1516,7 @@ CONTAINS
! pick which bond in the molecule at random
IF (ionode) THEN
rand = next_random_number(rng_stream)
rand = rng_stream%next()
ENDIF
CALL mp_bcast(rand, source, group)
CALL get_molecule_kind(molecule_kind, natom=natom, nbend=nbend, &
@ -1573,7 +1572,7 @@ CONTAINS
ENDDO
! choose a displacement
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
dis_angle = rmangle(molecule_type)*2.0E0_dp*(rand - 0.5E0_dp)
@ -1738,7 +1737,7 @@ CONTAINS
INTEGER, INTENT(IN) :: molecule_type
TYPE(molecule_kind_type), POINTER :: molecule_kind
TYPE(particle_list_type), POINTER :: particles
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'change_dihedral', &
routineP = moduleN//':'//routineN
@ -1778,7 +1777,7 @@ CONTAINS
! pick which bond in the molecule at random
IF (ionode) THEN
rand = next_random_number(rng_stream)
rand = rng_stream%next()
! CALL RANDOM_NUMBER(rand)
ENDIF
CALL mp_bcast(rand, source, group)
@ -1837,7 +1836,7 @@ CONTAINS
ENDDO
! choose a displacement
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
dis_angle = rmdihedral(molecule_type)*2.0E0_dp*(rand - 0.5E0_dp)
@ -1959,7 +1958,7 @@ CONTAINS
molecule_type, box_number
REAL(KIND=dp), INTENT(INOUT) :: bias_energy_old, last_bias_energy
CHARACTER(LEN=*), INTENT(IN) :: move_type
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_avbmc_move', routineP = moduleN//':'//routineN
@ -2247,7 +2246,7 @@ CONTAINS
IF (w .GE. 1.0E0_dp) THEN
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -2355,7 +2354,7 @@ CONTAINS
INTEGER, INTENT(IN) :: box_number
REAL(KIND=dp), INTENT(INOUT) :: energy_check
REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: r_old
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(LEN=*), PARAMETER :: routineN = 'mc_hmc_move', routineP = moduleN//':'//routineN
@ -2425,7 +2424,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
@ -2490,7 +2489,7 @@ CONTAINS
INTEGER, INTENT(IN) :: box_number
REAL(KIND=dp), INTENT(INOUT) :: bias_energy
LOGICAL, INTENT(OUT) :: lreject
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(len=*), PARAMETER :: routineN = 'mc_cluster_translation', &
routineP = moduleN//':'//routineN
@ -2586,17 +2585,17 @@ CONTAINS
ENDIF
! call a random number to figure out which direction we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
move_direction = INT(3*rand) + 1
! call a random number to figure out how far we're moving
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
dis_mol = rmcltrans*(rand - 0.5E0_dp)*2.0E0_dp
! choosing cluster
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
jpart = INT(1 + rand*total_clus)
@ -2685,7 +2684,7 @@ CONTAINS
w = 1.0E0_dp
rand = 0.0E0_dp
ELSE
IF (ionode) rand = next_random_number(rng_stream)
IF (ionode) rand = rng_stream%next()
CALL mp_bcast(rand, source, group)
ENDIF
IF (rand .LT. w) THEN
@ -2725,4 +2724,3 @@ CONTAINS
END SUBROUTINE mc_cluster_translation
END MODULE mc_moves

View file

@ -66,8 +66,6 @@ MODULE mc_run
mc_sim_par_create, mc_sim_par_destroy, mc_simulation_parameters_p_type, read_mc_section, &
set_mc_par
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
rng_stream_type
USE physcon, ONLY: angstrom
#include "../../base/base_uses.f90"
@ -126,11 +124,11 @@ CONTAINS
TYPE(mc_molecule_info_type), POINTER :: mc_molecule_info
TYPE(mc_simulation_parameters_p_type), &
DIMENSION(:), POINTER :: mc_par
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type) :: rng_stream
TYPE(section_vals_type), POINTER :: force_env_section, mc_section, &
root_section
NULLIFY (mc_env, mc_par, force_env_2, rng_stream, force_env_section, &
NULLIFY (mc_env, mc_par, force_env_2, force_env_section, &
root_section, mc_molecule_info)
CALL force_env_retain(force_env_1)
@ -144,10 +142,10 @@ CONTAINS
! set some values...will use get_globenv if that ever comes around
! initialize the random numbers
CALL create_rng_stream(rng_stream=rng_stream, &
last_rng_stream=force_env_1%globenv%gaussian_rng_stream, &
name="first", &
distribution_type=UNIFORM)
rng_stream = rng_stream_type( &
last_rng_stream=force_env_1%globenv%gaussian_rng_stream, &
name="first", &
distribution_type=UNIFORM)
! need to figure out how many boxes we have, based on the value
! of mc_par % ensemble
@ -338,9 +336,6 @@ CONTAINS
DEALLOCATE (mc_env)
DEALLOCATE (force_env)
! delete the random numbers
CALL delete_rng_stream(rng_stream)
END SUBROUTINE do_mon_car
! **************************************************************************************************

View file

@ -99,9 +99,6 @@ MODULE tamc_run
USE molecule_types, ONLY: global_constraint_type,&
molecule_type
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE particle_types, ONLY: particle_type
@ -190,7 +187,7 @@ CONTAINS
TYPE(meta_env_type), POINTER :: meta_env_saved
TYPE(particle_list_type), POINTER :: particles
TYPE(reftraj_type), POINTER :: reftraj
TYPE(rng_stream_type), POINTER :: rng_stream, rng_stream_mc
TYPE(rng_stream_type) :: rng_stream_mc
TYPE(section_vals_type), POINTER :: constraint_section, force_env_section, &
free_energy_section, fs_section, global_section, mc_section, md_section, motion_section, &
reftraj_section, subsys_section, work_section
@ -308,7 +305,7 @@ CONTAINS
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! MC setup up
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
NULLIFY (mc_env, mc_par, rng_stream_mc, MCaverages)
NULLIFY (mc_env, mc_par, MCaverages)
CALL section_vals_get(force_env_section, n_repetition=isos)
CPASSERT(isos == 1)
@ -316,9 +313,8 @@ CONTAINS
! initialize the random numbers
! IF (para_env%ionode) THEN
CALL create_rng_stream(rng_stream=rng_stream_mc, &
name="Random numbers for monte carlo acc/rej", &
distribution_type=UNIFORM)
rng_stream_mc = rng_stream_type(name="Random numbers for monte carlo acc/rej", &
distribution_type=UNIFORM)
! ENDIF
!!!!! this shoudl go in a routine hmc_read
@ -361,9 +357,9 @@ CONTAINS
particles=particles, virial=virial)
DO i = 1, rand2skip
auxRandom = next_random_number(rng_stream_mc)
auxRandom = rng_stream_mc%next()
DO j = 1, 3*SIZE(particles%els)
auxRandom = next_random_number(globenv%gaussian_rng_stream)
auxRandom = globenv%gaussian_rng_stream%next()
ENDDO
ENDDO
@ -435,12 +431,10 @@ CONTAINS
IF (ASSOCIATED(force_env%meta_env)) THEN
IF (force_env%meta_env%langevin) THEN
CALL create_wiener_process_cv(force_env%meta_env)
NULLIFY (rng_stream)
DO j = 1, (rand2skip - 1)/nmccycles
DO i = 1, force_env%meta_env%n_colvar
rng_stream => force_env%meta_env%rng(i)%stream
auxRandom = next_random_number(rng_stream)
auxRandom = next_random_number(rng_stream)
auxRandom = force_env%meta_env%rng(i)%next()
auxRandom = force_env%meta_env%rng(i)%next()
ENDDO
ENDDO
ENDIF
@ -652,7 +646,6 @@ CONTAINS
! Clean restartable sections..
IF (my_rm_restart_info) CALL remove_restart_info(force_env%root_section)
! IF (para_env%ionode) THEN
CALL delete_rng_stream(rng_stream_mc)
! ENDIF
CALL MC_ENV_RELEASE(mc_env)
DEALLOCATE (mc_par)
@ -884,7 +877,7 @@ CONTAINS
TYPE(mc_environment_type), POINTER :: mc_env
TYPE(mc_moves_type), POINTER :: moves, gmoves
REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: r
TYPE(rng_stream_type), POINTER :: rng_stream_mc
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream_mc
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: xieta, An, fz
TYPE(mc_averages_type), INTENT(INOUT), POINTER :: averages
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: zbuff
@ -910,7 +903,6 @@ CONTAINS
TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
TYPE(particle_list_type), POINTER :: particles
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(simpar_type), POINTER :: simpar
TYPE(virial_type), POINTER :: virial
@ -918,7 +910,6 @@ CONTAINS
logger => cp_get_default_logger()
output_unit = cp_logger_get_default_io_unit(logger)
NULLIFY (rng_stream)
! quantitites to be nullified for the get_md_env
NULLIFY (simpar, force_env, para_env)
! quantities to be nullified for the force_env_get environment
@ -955,9 +946,8 @@ CONTAINS
! *** Velocity Verlet for Langevin *** v(t)--> v(t+1/2)
!!!!!! noise xi is in the first half, eta in the second half
DO ivar = 1, force_env%meta_env%n_colvar
rng_stream => force_env%meta_env%rng(ivar)%stream
xieta(ivar) = next_random_number(rng_stream)
xieta(ivar + force_env%meta_env%n_colvar) = next_random_number(rng_stream)
xieta(ivar) = force_env%meta_env%rng(ivar)%next()
xieta(ivar + force_env%meta_env%n_colvar) = force_env%meta_env%rng(ivar)%next()
gamma = force_env%meta_env%metavar(ivar)%gamma
mass = force_env%meta_env%metavar(ivar)%mass
sigma = SQRT((force_env%meta_env%temp_wanted*kelvin)*2.0_dp*(boltzmann/joule)*gamma/mass)
@ -1010,7 +1000,7 @@ CONTAINS
REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: r
TYPE(mc_simpar_type), POINTER :: mc_par
TYPE(mc_moves_type), POINTER :: moves, gmoves
TYPE(rng_stream_type), POINTER :: rng_stream_mc
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream_mc
INTEGER, INTENT(IN) :: output_unit
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: fz, zbuff
INTEGER, INTENT(IN), OPTIONAL :: nskip
@ -1146,7 +1136,7 @@ CONTAINS
REAL(KIND=dp), INTENT(INOUT) :: old_epx, old_epz, energy_check
REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: r
INTEGER, INTENT(IN) :: output_unit
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
REAL(KIND=dp), DIMENSION(:), INTENT(INOUT) :: zbuff
CHARACTER(LEN=*), PARAMETER :: routineN = 'mc_hmc_move', routineP = moduleN//':'//routineN
@ -1240,7 +1230,7 @@ CONTAINS
w = EXP(value)
ENDIF
rand = next_random_number(rng_stream)
rand = rng_stream%next()
IF (rand < w) THEN
! accept the move
moves%hmc%successes = moves%hmc%successes + 1
@ -1444,7 +1434,7 @@ CONTAINS
meta_env%ekin_s = 0.0_dp
DO i_c = 1, meta_env%n_colvar
cv => meta_env%metavar(i_c)
cv%vvp = next_random_number(force_env%globenv%gaussian_rng_stream)
cv%vvp = force_env%globenv%gaussian_rng_stream%next()
meta_env%ekin_s = meta_env%ekin_s + 0.5_dp*cv%mass*cv%vvp**2
END DO
ekin_w = 0.5_dp*meta_env%temp_wanted*REAL(meta_env%n_colvar, KIND=dp)

View file

@ -66,10 +66,6 @@ MODULE md_vel_utils
get_molecule_kind_set,&
molecule_kind_type
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
random_numbers,&
rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE particle_types, ONLY: particle_type
@ -920,9 +916,8 @@ CONTAINS
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dr, eigenvectors
TYPE(atomic_kind_type), POINTER :: atomic_kind
TYPE(cp_para_env_type), POINTER :: para_env
TYPE(rng_stream_type), POINTER :: random_stream
TYPE(rng_stream_type), ALLOCATABLE :: random_stream
NULLIFY (random_stream)
CALL cite_reference(West2006)
natoms = SIZE(particles)
temperature = simpar%temp_ext
@ -949,14 +944,15 @@ CONTAINS
CALL section_vals_val_get(md_section, "INITIAL_VIBRATION%PHASE", r_val=my_phase)
my_phase = MIN(1.0_dp, my_phase)
! generate random numbers
CALL create_rng_stream(random_stream, name="MD_INIT_VIB", distribution_type=UNIFORM)
CALL random_numbers(random, random_stream)
random_stream = rng_stream_type(name="MD_INIT_VIB", distribution_type=UNIFORM)
CALL random_stream%fill(random)
IF (my_phase .LT. 0.0_dp) THEN
CALL random_numbers(phase, random_stream)
CALL random_stream%fill(phase)
ELSE
phase = my_phase
END IF
CALL delete_rng_stream(random_stream)
DEALLOCATE (random_stream)
! the first three modes are acoustic with zero frequencies,
! exclude these from considerations
my_dof = dof - 3
@ -1234,24 +1230,24 @@ CONTAINS
IF (mass .NE. 0.0) THEN
SELECT CASE (is_fixed(i))
CASE (use_perd_x)
part(i)%v(2) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(3) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(2) = globenv%gaussian_rng_stream%next()/SQRT(mass)
part(i)%v(3) = globenv%gaussian_rng_stream%next()/SQRT(mass)
CASE (use_perd_y)
part(i)%v(1) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(3) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(1) = globenv%gaussian_rng_stream%next()/SQRT(mass)
part(i)%v(3) = globenv%gaussian_rng_stream%next()/SQRT(mass)
CASE (use_perd_z)
part(i)%v(1) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(2) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(1) = globenv%gaussian_rng_stream%next()/SQRT(mass)
part(i)%v(2) = globenv%gaussian_rng_stream%next()/SQRT(mass)
CASE (use_perd_xy)
part(i)%v(3) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(3) = globenv%gaussian_rng_stream%next()/SQRT(mass)
CASE (use_perd_xz)
part(i)%v(2) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(2) = globenv%gaussian_rng_stream%next()/SQRT(mass)
CASE (use_perd_yz)
part(i)%v(1) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(1) = globenv%gaussian_rng_stream%next()/SQRT(mass)
CASE (use_perd_none)
part(i)%v(1) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(2) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(3) = next_random_number(globenv%gaussian_rng_stream)/SQRT(mass)
part(i)%v(1) = globenv%gaussian_rng_stream%next()/SQRT(mass)
part(i)%v(2) = globenv%gaussian_rng_stream%next()/SQRT(mass)
part(i)%v(3) = globenv%gaussian_rng_stream%next()/SQRT(mass)
END SELECT
END IF
END DO

View file

@ -27,7 +27,6 @@ MODULE neb_md_utils
USE kinds, ONLY: dp
USE neb_types, ONLY: neb_type,&
neb_var_type
USE parallel_rng_types, ONLY: next_random_number
USE particle_types, ONLY: get_particle_pos_or_vel,&
particle_type,&
update_particle_pos_or_vel
@ -73,7 +72,7 @@ CONTAINS
CHARACTER(LEN=*), PARAMETER :: routineN = 'neb_initialize_velocity', &
routineP = moduleN//':'//routineN
INTEGER :: iatom, ivar, k, natom, nparticle, nvar
INTEGER :: iatom, ivar, natom, nparticle, nvar
REAL(KIND=dp) :: akin, mass, mass_tot, sc, temp, &
temp_ext, tmp_r1
REAL(KIND=dp), DIMENSION(3) :: v, vcom
@ -87,10 +86,7 @@ CONTAINS
natom = SIZE(particle_set)
mass_tot = 0.0_dp
vcom(1:3) = 0.0_dp
vels(:, i_rep) = 0.0_dp
DO k = 1, nparticle
vels(k, i_rep) = next_random_number(globenv%gaussian_rng_stream)
END DO
CALL globenv%gaussian_rng_stream%fill(vels(:, i_rep))
! Check always if BAND is working in Cartesian or in internal coordinates
! If working in cartesian coordinates let's get rid of the COM
! Compute also the total mass (both in Cartesian and internal)

View file

@ -15,8 +15,6 @@ MODULE pint_gle
USE gle_system_dynamics, ONLY: gle_cholesky_stab
USE gle_system_types, ONLY: gle_type
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE pint_types, ONLY: pint_env_type
#include "../base/base_uses.f90"
@ -55,7 +53,6 @@ CONTAINS
INTEGER :: i, ib, idim, imap, j
REAL(dp) :: mf, rr(pint_env%gle%ndim), cc(pint_env%gle%ndim, pint_env%gle%ndim)
TYPE(rng_stream_type), POINTER :: rng_stream
CALL gle_cholesky_stab(pint_env%gle%c_mat, cc, pint_env%gle%ndim)
DO i = 1, pint_env%gle%loc_num_gle
@ -63,9 +60,8 @@ CONTAINS
ib = 1 + (imap - 1)/pint_env%ndim
idim = 1 + MOD(imap - 1, pint_env%ndim)
mf = 1.0_dp/SQRT(pint_env%mass_fict(ib, idim))
rng_stream => pint_env%gle%nvt(i)%gaussian_rng_stream
DO j = 1, pint_env%gle%ndim
rr(j) = next_random_number(rng_stream)*mf
rr(j) = pint_env%gle%nvt(i)%gaussian_rng_stream%next()*mf
END DO
pint_env%gle%nvt(i)%s = MATMUL(cc, rr)
END DO
@ -86,12 +82,10 @@ CONTAINS
REAL(dp) :: alpha, beta, mf, rr
REAL(dp), DIMENSION(:, :), POINTER :: a_mat, e_tmp, h_tmp, s_tmp
TYPE(gle_type), POINTER :: gle
TYPE(rng_stream_type), POINTER :: rng_stream
CALL timeset(routineN, handle)
gle => pint_env%gle
NULLIFY (rng_stream)
ndim = gle%ndim
ALLOCATE (s_tmp(ndim, gle%loc_num_gle))
@ -108,13 +102,12 @@ CONTAINS
gle%nvt(ideg)%thermostat_energy = gle%nvt(ideg)%thermostat_energy &
+ 0.5_dp*pint_env%mass_fict(ib, idim)*gle%nvt(ideg)%s(1)**2
s_tmp(1, imap) = gle%nvt(ideg)%s(1)
rng_stream => gle%nvt(ideg)%gaussian_rng_stream
rr = next_random_number(rng_stream)
rr = gle%nvt(ideg)%gaussian_rng_stream%next()
mf = 1.0_dp/SQRT(pint_env%mass_fict(ib, idim))
e_tmp(1, imap) = rr*mf
DO iadd = 2, ndim
s_tmp(iadd, imap) = gle%nvt(ideg)%s(iadd)
rr = next_random_number(rng_stream)
rr = gle%nvt(ideg)%gaussian_rng_stream%next()
e_tmp(iadd, imap) = rr*mf
END DO
END DO

View file

@ -89,10 +89,6 @@ MODULE pint_methods
USE molecule_types, ONLY: global_constraint_type,&
molecule_type
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
next_rng_seed,&
rng_stream_type
USE particle_list_types, ONLY: particle_list_type
USE particle_types, ONLY: particle_type
@ -185,7 +181,6 @@ CONTAINS
ierr, ig, itmp, nrep, prep, stat
LOGICAL :: explicit, ltmp
REAL(kind=dp) :: dt, mass, omega
REAL(kind=dp), DIMENSION(3, 2) :: seed
TYPE(cp_subsys_type), POINTER :: subsys
TYPE(f_env_type), POINTER :: f_env
TYPE(global_constraint_type), POINTER :: gci
@ -338,14 +333,10 @@ CONTAINS
!MK ... but we have to initialise v_tol
pint_env%v_tol = 0.0_dp ! to be fixed
NULLIFY (pint_env%randomG)
seed(:, :) = next_rng_seed()
CALL create_rng_stream(pint_env%randomG, &
name="pint_randomG", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=seed)
pint_env%randomG = rng_stream_type( &
name="pint_randomG", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE.)
ALLOCATE (pint_env%e_pot_bead(pint_env%p))
pint_env%e_pot_bead = 0._dp
@ -731,7 +722,6 @@ CONTAINS
IF (ASSOCIATED(pint_env%normalmode_env)) THEN
CALL normalmode_release(pint_env%normalmode_env)
END IF
CALL delete_rng_stream(pint_env%randomG)
DEALLOCATE (pint_env%mass)
DEALLOCATE (pint_env%e_pot_bead)
@ -1052,7 +1042,7 @@ CONTAINS
REAL(kind=dp), DIMENSION(3) :: x0
REAL(kind=dp), DIMENSION(3, 2) :: seed
REAL(kind=dp), DIMENSION(:), POINTER :: bx, r_vals
TYPE(rng_stream_type), POINTER :: rng_gaussian
TYPE(rng_stream_type), ALLOCATABLE :: rng_gaussian
TYPE(section_vals_type), POINTER :: input_section
CPASSERT(ASSOCIATED(pint_env))
@ -1075,16 +1065,15 @@ CONTAINS
NULLIFY (bx)
ALLOCATE (bx(3*pint_env%p))
NULLIFY (rng_gaussian)
CALL section_vals_val_get(pint_env%input, &
"MOTION%PINT%INIT%LEVY_SEED", i_val=input_seed)
seed(:, :) = REAL(input_seed, KIND=dp)
! seed(:,:) = next_rng_seed()
CALL create_rng_stream(rng_gaussian, &
name="tmp_rng_gaussian", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=seed)
rng_gaussian = rng_stream_type( &
name="tmp_rng_gaussian", &
distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=seed)
CALL section_vals_val_get(pint_env%input, &
"MOTION%PINT%INIT%LEVY_CORRELATED", &
@ -1126,7 +1115,6 @@ CONTAINS
END IF
CALL delete_rng_stream(rng_gaussian)
DEALLOCATE (bx)
done_levy = .TRUE.
END IF
@ -1164,9 +1152,8 @@ CONTAINS
DO idim = 1, pint_env%ndim
DO ib = 1, pint_env%p
pint_env%x(ib, idim) = pint_env%x(ib, idim) + &
next_random_number(rng_stream=pint_env%randomG, &
variance=pint_env%beta/ &
SQRT(12.0_dp*pint_env%mass(idim)))
pint_env%randomG%next(variance=pint_env%beta/ &
SQRT(12.0_dp*pint_env%mass(idim)))
END DO
END DO
done_rand = .TRUE.
@ -1386,8 +1373,7 @@ CONTAINS
DO idim = 1, SIZE(pint_env%uv, 2)
DO ib = first_mode, SIZE(pint_env%uv, 1)
pint_env%uv(ib, idim) = &
next_random_number(rng_stream=pint_env%randomG, &
variance=target_t/pint_env%mass_fict(ib, idim))
pint_env%randomG%next(variance=target_t/pint_env%mass_fict(ib, idim))
END DO
END DO
@ -1399,8 +1385,7 @@ CONTAINS
IF (ltmp) THEN
CALL pint_u2x(pint_env, ux=pint_env%uv, x=pint_env%v)
DO idim = 1, pint_env%ndim
rtmp = next_random_number(rng_stream=pint_env%randomG, &
variance=pint_env%mass(idim)*pint_env%kT) &
rtmp = pint_env%randomG%next(variance=pint_env%mass(idim)*pint_env%kT) &
/pint_env%mass(idim)
DO ib = 1, pint_env%p
pint_env%v(ib, idim) = pint_env%v(ib, idim) + rtmp
@ -1569,8 +1554,7 @@ CONTAINS
DO ib = 1, SIZE(pint_env%tv, 2)
DO inos = 1, SIZE(pint_env%tv, 1)
pint_env%tv(inos, ib, idim) = &
next_random_number(rng_stream=pint_env%randomG, &
variance=mykt/pint_env%Q(ib))
pint_env%randomG%next(variance=mykt/pint_env%Q(ib))
END DO
END DO
END DO

View file

@ -29,11 +29,9 @@ MODULE pint_piglet
dp
USE message_passing, ONLY: mp_bcast
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
read_rng_stream,&
rng_record_length
rng_record_length,&
rng_stream_type,&
rng_stream_type_from_record
USE pint_io, ONLY: pint_write_line
USE pint_types, ONLY: piglet_therm_type,&
pint_env_type
@ -277,21 +275,19 @@ CONTAINS
!prepare Random number generator
NULLIFY (rng_section)
NULLIFY (piglet_therm%gaussian_rng_stream)
rng_section => section_vals_get_subs_vals(section, &
subsection_name="RNG_INIT")
CALL section_vals_get(rng_section, explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(rng_section, "_DEFAULT_KEYWORD_", &
i_rep_val=1, c_val=rng_record)
CALL read_rng_stream(rng_stream=piglet_therm%gaussian_rng_stream, &
rng_record=rng_record)
piglet_therm%gaussian_rng_stream = rng_stream_type_from_record(rng_record)
ELSE
initial_seed(:, :) = REAL(pint_env%thermostat_rng_seed, dp)
CALL create_rng_stream(rng_stream=piglet_therm%gaussian_rng_stream, &
name="piglet_rng_gaussian", distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=initial_seed)
piglet_therm%gaussian_rng_stream = rng_stream_type( &
name="piglet_rng_gaussian", distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=initial_seed)
END IF
!Compute the T and S matrices on every mpi process
@ -385,7 +381,7 @@ CONTAINS
! Fill a vector with random numbers
DO idim = 1, piglet_therm%ndim
DO j = 1, piglet_therm%nsp1
piglet_therm%temp2(j, idim) = next_random_number(piglet_therm%gaussian_rng_stream)
piglet_therm%temp2(j, idim) = piglet_therm%gaussian_rng_stream%next()
!piglet_therm%temp2(j,idim) = 1.0_dp
END DO
END DO
@ -469,7 +465,7 @@ CONTAINS
!fill temp2 with gaussian random noise
DO j = 1, nsp1
DO idim = 1, ndim
piglet_therm%temp2(j, idim) = next_random_number(piglet_therm%gaussian_rng_stream)
piglet_therm%temp2(j, idim) = piglet_therm%gaussian_rng_stream%next()
!piglet_therm%temp2(j,idim) = 1.0_dp
END DO
END DO
@ -550,7 +546,6 @@ CONTAINS
DEALLOCATE (piglet_therm%c_mat)
DEALLOCATE (piglet_therm%gle_t)
DEALLOCATE (piglet_therm%gle_s)
CALL delete_rng_stream(piglet_therm%gaussian_rng_stream)
DEALLOCATE (piglet_therm%smalls)
DEALLOCATE (piglet_therm%temp1)
DEALLOCATE (piglet_therm%temp2)

View file

@ -17,11 +17,9 @@ MODULE pint_pile
section_vals_val_get
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
read_rng_stream,&
rng_record_length
rng_record_length,&
rng_stream_type,&
rng_stream_type_from_record
USE pint_types, ONLY: normalmode_env_type,&
pile_therm_type,&
pint_env_type
@ -105,21 +103,20 @@ CONTAINS
!prepare Random number generator
NULLIFY (rng_section)
NULLIFY (pile_therm%gaussian_rng_stream)
rng_section => section_vals_get_subs_vals(section, &
subsection_name="RNG_INIT")
CALL section_vals_get(rng_section, explicit=explicit)
IF (explicit) THEN
CALL section_vals_val_get(rng_section, "_DEFAULT_KEYWORD_", &
i_rep_val=1, c_val=rng_record)
CALL read_rng_stream(rng_stream=pile_therm%gaussian_rng_stream, &
rng_record=rng_record)
pile_therm%gaussian_rng_stream = rng_stream_type_from_record(rng_record)
ELSE
initial_seed(:, :) = REAL(pint_env%thermostat_rng_seed, dp)
CALL create_rng_stream(rng_stream=pile_therm%gaussian_rng_stream, &
name="pile_rng_gaussian", distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=initial_seed)
pile_therm%gaussian_rng_stream = rng_stream_type( &
name="pile_rng_gaussian", distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=initial_seed)
END IF
END SUBROUTINE pint_pile_init
@ -151,7 +148,7 @@ CONTAINS
DO ibead = first_mode, p
vnew(ibead, idim) = pile_therm%c1(ibead)*vold(ibead, idim) + &
pile_therm%massfact(ibead, idim)*pile_therm%c2(ibead)* &
next_random_number(pile_therm%gaussian_rng_stream)
pile_therm%gaussian_rng_stream%next()
delta_ekin = delta_ekin + masses(ibead, idim)*( &
vnew(ibead, idim)*vnew(ibead, idim) - &
vold(ibead, idim)*vold(ibead, idim))
@ -185,7 +182,6 @@ CONTAINS
DEALLOCATE (pile_therm%c2)
DEALLOCATE (pile_therm%g_fric)
DEALLOCATE (pile_therm%massfact)
CALL delete_rng_stream(pile_therm%gaussian_rng_stream)
DEALLOCATE (pile_therm)
END IF
END IF

View file

@ -13,8 +13,7 @@
MODULE pint_public
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE pint_types, ONLY: pint_env_type
#include "../base/base_uses.f90"
@ -122,7 +121,7 @@ CONTAINS
!
INTEGER, INTENT(IN) :: n
REAL(kind=dp), INTENT(IN) :: t
TYPE(rng_stream_type), POINTER :: rng_gaussian
TYPE(rng_stream_type), INTENT(INOUT) :: rng_gaussian
REAL(kind=dp), DIMENSION(:), POINTER :: x
INTEGER, INTENT(OUT) :: nout
@ -177,8 +176,7 @@ CONTAINS
! generate new point and save it under j
DO ic = 1, 3
xc = (x(3*i1 + ic) + x(3*i2 + ic))/2.0
xc = xc + next_random_number(rng_stream=rng_gaussian, &
variance=vrnc)
xc = xc + rng_gaussian%next(variance=vrnc)
x(3*j + ic) = xc
END DO
nout = nout + 1
@ -220,7 +218,7 @@ CONTAINS
INTEGER, INTENT(IN) :: n
REAL(kind=dp), INTENT(IN) :: v
REAL(kind=dp), DIMENSION(:), POINTER :: x
TYPE(rng_stream_type), POINTER :: rng_gaussian
TYPE(rng_stream_type), INTENT(INOUT) :: rng_gaussian
CHARACTER(len=*), PARAMETER :: routineN = 'pint_levy_walk', routineP = moduleN//':'//routineN
@ -233,8 +231,7 @@ CONTAINS
x(3) = x0(3)
DO ib = 1, n - 1
DO ic = 1, 3
r = next_random_number(rng_stream=rng_gaussian, &
variance=1.0_dp)
r = rng_gaussian%next(variance=1.0_dp)
tau_i = (REAL(ib, dp) - 1.0_dp)/REAL(n, dp)
tau_i1 = (REAL(ib + 1, dp) - 1.0_dp)/REAL(n, dp)
x(ib*3 + ic) = (x((ib - 1)*3 + ic)*(1.0_dp - tau_i1) + &

View file

@ -34,12 +34,9 @@ MODULE pint_qtb
twopi
USE message_passing, ONLY: mp_bcast
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
delete_rng_stream,&
dump_rng_stream,&
next_random_number,&
read_rng_stream,&
rng_record_length
rng_record_length,&
rng_stream_type,&
rng_stream_type_from_record
USE pint_io, ONLY: pint_write_line
USE pint_types, ONLY: normalmode_env_type,&
pint_env_type,&
@ -128,21 +125,19 @@ CONTAINS
!prepare Random number generator
NULLIFY (rng_section)
NULLIFY (qtb_therm%gaussian_rng_stream)
rng_section => section_vals_get_subs_vals(section, &
subsection_name="RNG_INIT")
CALL section_vals_get(rng_section, explicit=restart)
IF (restart) THEN
CALL section_vals_val_get(rng_section, "_DEFAULT_KEYWORD_", &
i_rep_val=1, c_val=rng_record)
CALL read_rng_stream(rng_stream=qtb_therm%gaussian_rng_stream, &
rng_record=rng_record)
qtb_therm%gaussian_rng_stream = rng_stream_type_from_record(rng_record)
ELSE
initial_seed(:, :) = REAL(pint_env%thermostat_rng_seed, dp)
CALL create_rng_stream(rng_stream=qtb_therm%gaussian_rng_stream, &
name="qtb_rng_gaussian", distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=initial_seed)
qtb_therm%gaussian_rng_stream = rng_stream_type( &
name="qtb_rng_gaussian", distribution_type=GAUSSIAN, &
extended_precision=.TRUE., &
seed=initial_seed)
END IF
!Initialization of the QTB random forces
@ -183,15 +178,14 @@ CONTAINS
DO i = 1, qtb_therm%nf - 1
qtb_therm%rng_status(i) = qtb_therm%rng_status(i + 1)
END DO
CALL dump_rng_stream(rng_stream=qtb_therm%gaussian_rng_stream, &
rng_record=qtb_therm%rng_status(qtb_therm%nf))
CALL qtb_therm%gaussian_rng_stream%dump(qtb_therm%rng_status(qtb_therm%nf))
END IF
DO idim = 1, ndim
!update random numbers
DO i = 1, qtb_therm%nf - 1
qtb_therm%r(i, ibead, idim) = qtb_therm%r(i + 1, ibead, idim)
END DO
qtb_therm%r(qtb_therm%nf, ibead, idim) = next_random_number(qtb_therm%gaussian_rng_stream)
qtb_therm%r(qtb_therm%nf, ibead, idim) = qtb_therm%gaussian_rng_stream%next()
!compute new random force through the convolution product
qtb_therm%rf(ibead, idim) = 0.0_dp
DO i = 1, qtb_therm%nf
@ -248,7 +242,6 @@ CONTAINS
DEALLOCATE (qtb_therm%cpt)
DEALLOCATE (qtb_therm%step)
DEALLOCATE (qtb_therm%rng_status)
CALL delete_rng_stream(qtb_therm%gaussian_rng_stream)
DEALLOCATE (qtb_therm)
END IF
END IF
@ -435,15 +428,14 @@ CONTAINS
ELSE
!update the rng status
DO i = 1, qtb_therm%nf
CALL dump_rng_stream(rng_stream=qtb_therm%gaussian_rng_stream, &
rng_record=qtb_therm%rng_status(i))
CALL qtb_therm%gaussian_rng_stream%dump(qtb_therm%rng_status(i))
END DO
!if no restart then initialize random numbers from scratch
qtb_therm%cpt = 0
DO idim = 1, ndim
DO ibead = 1, p
DO i = 1, nf
qtb_therm%r(i, ibead, idim) = next_random_number(qtb_therm%gaussian_rng_stream)
qtb_therm%r(i, ibead, idim) = qtb_therm%gaussian_rng_stream%next()
END DO
END DO
END DO
@ -486,14 +478,13 @@ CONTAINS
qtb_therm%cpt = 0
!update the rng status
DO i = 1, qtb_therm%nf
CALL dump_rng_stream(rng_stream=qtb_therm%gaussian_rng_stream, &
rng_record=qtb_therm%rng_status(i))
CALL qtb_therm%gaussian_rng_stream%dump(qtb_therm%rng_status(i))
END DO
!first random numbers initialized from scratch
DO idim = 1, pint_env%ndim
DO ibead = 1, pint_env%p
DO i = 1, qtb_therm%nf
qtb_therm%r(i, ibead, idim) = next_random_number(qtb_therm%gaussian_rng_stream)
qtb_therm%r(i, ibead, idim) = qtb_therm%gaussian_rng_stream%next()
END DO
END DO
END DO
@ -518,15 +509,14 @@ CONTAINS
DO i = 1, qtb_therm%nf - 1
qtb_therm%rng_status(i) = qtb_therm%rng_status(i + 1)
END DO
CALL dump_rng_stream(rng_stream=qtb_therm%gaussian_rng_stream, &
rng_record=qtb_therm%rng_status(qtb_therm%nf))
CALL qtb_therm%gaussian_rng_stream%dump(qtb_therm%rng_status(qtb_therm%nf))
END IF
DO idim = 1, pint_env%ndim
!update random numbers
DO i = 1, qtb_therm%nf - 1
qtb_therm%r(i, ibead, idim) = qtb_therm%r(i + 1, ibead, idim)
END DO
qtb_therm%r(qtb_therm%nf, ibead, idim) = next_random_number(qtb_therm%gaussian_rng_stream)
qtb_therm%r(qtb_therm%nf, ibead, idim) = qtb_therm%gaussian_rng_stream%next()
END DO
qtb_therm%cpt(ibead) = 0
END IF

View file

@ -121,7 +121,7 @@ MODULE pint_types
TYPE(section_vals_type), POINTER :: input
TYPE(staging_env_type), POINTER :: staging_env
TYPE(normalmode_env_type), POINTER :: normalmode_env
TYPE(rng_stream_type), POINTER :: randomG
TYPE(rng_stream_type) :: randomG
TYPE(gle_type), POINTER :: gle
REAL(KIND=dp), DIMENSION(e_num_ids) :: energy
REAL(KIND=dp), DIMENSION(:), POINTER :: mass, e_pot_bead
@ -206,7 +206,7 @@ MODULE pint_types
REAL(KIND=dp), DIMENSION(:), POINTER :: c2
REAL(KIND=dp), DIMENSION(:), POINTER :: g_fric
REAL(KIND=dp), DIMENSION(:, :), POINTER :: massfact
TYPE(rng_stream_type), POINTER :: gaussian_rng_stream
TYPE(rng_stream_type) :: gaussian_rng_stream
END TYPE pile_therm_type
! ***************************************************************************
@ -240,7 +240,7 @@ MODULE pint_types
REAL(KIND=dp), DIMENSION(:, :), POINTER :: temp1
REAL(KIND=dp), DIMENSION(:, :), POINTER :: temp2
REAL(KIND=dp), DIMENSION(:, :), POINTER :: sqrtmass
TYPE(rng_stream_type), POINTER :: gaussian_rng_stream
TYPE(rng_stream_type) :: gaussian_rng_stream
END TYPE piglet_therm_type
! ***************************************************************************
@ -283,7 +283,7 @@ MODULE pint_types
INTEGER :: fp
INTEGER :: nf
REAL(KIND=dp) :: thermostat_energy
TYPE(rng_stream_type), POINTER :: gaussian_rng_stream
TYPE(rng_stream_type) :: gaussian_rng_stream
CHARACTER(LEN=rng_record_length), DIMENSION(:), POINTER :: rng_status
END TYPE qtb_therm_type

View file

@ -19,8 +19,6 @@ MODULE al_system_dynamics
USE molecule_kind_types, ONLY: molecule_kind_type
USE molecule_types, ONLY: get_molecule,&
molecule_type
USE parallel_rng_types, ONLY: next_random_number,&
rng_stream_type
USE particle_types, ONLY: particle_type
USE thermostat_utils, ONLY: ke_region_particles,&
vel_rescale_particles
@ -190,7 +188,6 @@ CONTAINS
REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: w(:, :)
TYPE(atomic_kind_type), POINTER :: atomic_kind
TYPE(molecule_type), POINTER :: molecule
TYPE(rng_stream_type), POINTER :: rng_stream
present_vel = PRESENT(vel)
@ -222,10 +219,9 @@ CONTAINS
CPASSERT(check)
DO iparticle_local = 1, nparticle_local
ipart = local_particles%list(iparticle_kind)%array(iparticle_local)
rng_stream => local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)%stream
w(1, ipart) = next_random_number(rng_stream, variance=1.0_dp)
w(2, ipart) = next_random_number(rng_stream, variance=1.0_dp)
w(3, ipart) = next_random_number(rng_stream, variance=1.0_dp)
w(1, ipart) = local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)%stream%next(variance=1.0_dp)
w(2, ipart) = local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)%stream%next(variance=1.0_dp)
w(3, ipart) = local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)%stream%next(variance=1.0_dp)
END DO
END DO

View file

@ -21,8 +21,8 @@ MODULE csvr_system_init
USE molecule_kind_types, ONLY: molecule_kind_type
USE molecule_types, ONLY: global_constraint_type,&
molecule_type
USE parallel_rng_types, ONLY: read_rng_stream,&
rng_record_length
USE parallel_rng_types, ONLY: rng_record_length,&
rng_stream_type_from_record
USE simpar_types, ONLY: simpar_type
USE thermostat_types, ONLY: thermostat_info_type
#include "../../base/base_uses.f90"
@ -182,8 +182,7 @@ CONTAINS
my_index = csvr%map_info%index(i)
CALL section_vals_val_get(section_vals=work_section, keyword_name="_DEFAULT_KEYWORD_", &
i_rep_val=my_index, c_val=rng_record)
CALL read_rng_stream(rng_stream=csvr%nvt(i)%gaussian_rng_stream, &
rng_record=rng_record)
csvr%nvt(i)%gaussian_rng_stream = rng_stream_type_from_record(rng_record)
END DO
ELSE
CALL cp_abort(__LOCATION__, &

View file

@ -42,7 +42,6 @@ MODULE extended_system_init
USE molecule_kind_types, ONLY: molecule_kind_type
USE molecule_types, ONLY: global_constraint_type,&
molecule_type
USE parallel_rng_types, ONLY: next_random_number
USE simpar_types, ONLY: simpar_type
USE thermostat_types, ONLY: thermostat_info_type
USE thermostat_utils, ONLY: get_nhc_energies
@ -750,7 +749,7 @@ CONTAINS
! Map deterministically determined random number to nhc % v
DO i = 1, nhc%loc_num_nhc
DO j = 1, nhc%nhc_len
nhc%nvt(j, i)%v = next_random_number(globenv%gaussian_rng_stream)
nhc%nvt(j, i)%v = globenv%gaussian_rng_stream%next()
END DO
END DO
@ -787,7 +786,7 @@ CONTAINS
CASE DEFAULT
DO i = 1, tot_rn
array_of_rn(i) = next_random_number(globenv%gaussian_rng_stream)
array_of_rn(i) = globenv%gaussian_rng_stream%next()
END DO
! Map deterministically determined random number to nhc % v
DO i = 1, nhc%loc_num_nhc
@ -884,7 +883,7 @@ CONTAINS
! initializing velocities
DO i = 1, SIZE(npt, 1)
DO j = i, SIZE(npt, 2)
v = next_random_number(globenv%gaussian_rng_stream)
v = globenv%gaussian_rng_stream%next()
! Symmetrizing the initial barostat velocities to ensure
! no rotation of the cell under NPT_F
npt(j, i)%v = v

View file

@ -28,10 +28,8 @@ MODULE gle_system_dynamics
USE molecule_kind_types, ONLY: molecule_kind_type
USE molecule_types, ONLY: global_constraint_type,&
molecule_type
USE parallel_rng_types, ONLY: next_random_number,&
read_rng_stream,&
rng_record_length,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_record_length,&
rng_stream_type_from_record
USE particle_types, ONLY: particle_type
USE simpar_types, ONLY: simpar_type
USE thermostat_mapping, ONLY: thermostat_mapping_region
@ -93,12 +91,10 @@ CONTAINS
REAL(dp) :: alpha, beta, rr
REAL(dp), DIMENSION(:, :), POINTER :: a_mat, e_tmp, h_tmp, s_tmp
TYPE(map_info_type), POINTER :: map_info
TYPE(rng_stream_type), POINTER :: rng_stream
CALL timeset(routineN, handle)
my_shell_adiabatic = .FALSE.
IF (PRESENT(shell_adiabatic)) my_shell_adiabatic = shell_adiabatic
NULLIFY (rng_stream)
present_vel = PRESENT(vel)
ndim = gle%ndim
ALLOCATE (s_tmp(ndim, gle%loc_num_gle))
@ -122,12 +118,11 @@ CONTAINS
IF (gle%nvt(ideg)%nkt == 0.0_dp) CYCLE
gle%nvt(ideg)%s(1) = map_info%s_kin(imap)
s_tmp(1, imap) = map_info%s_kin(imap)
rng_stream => gle%nvt(ideg)%gaussian_rng_stream
rr = next_random_number(rng_stream)
rr = gle%nvt(ideg)%gaussian_rng_stream%next()
e_tmp(1, imap) = rr
DO iadd = 2, ndim
s_tmp(iadd, imap) = gle%nvt(ideg)%s(iadd)
rr = next_random_number(rng_stream)
rr = gle%nvt(ideg)%gaussian_rng_stream%next()
e_tmp(iadd, imap) = rr
END DO
END DO
@ -502,8 +497,7 @@ CONTAINS
ind = map_info%index(i)
CALL section_vals_val_get(section_vals=work_section, keyword_name="_DEFAULT_KEYWORD_", &
i_rep_val=ind, c_val=rng_record)
CALL read_rng_stream(rng_stream=gle%nvt(i)%gaussian_rng_stream, &
rng_record=rng_record)
gle%nvt(i)%gaussian_rng_stream = rng_stream_type_from_record(rng_record)
END DO
ELSE
CALL cp_abort(__LOCATION__, &
@ -528,14 +522,12 @@ CONTAINS
INTEGER :: i, j
REAL(dp) :: rr(gle%ndim), cc(gle%ndim, gle%ndim)
TYPE(rng_stream_type), POINTER :: rng_stream
CALL gle_cholesky_stab(gle%c_mat, cc, gle%ndim)
DO i = 1, gle%loc_num_gle
rng_stream => gle%nvt(i)%gaussian_rng_stream
DO j = 1, gle%ndim
! here s should be properly initialized, when it is not read from restart
rr(j) = next_random_number(rng_stream)
rr(j) = gle%nvt(i)%gaussian_rng_stream%next()
END DO
gle%nvt(i)%s = MATMUL(cc, rr)
END DO

View file

@ -29,10 +29,10 @@ MODULE wiener_process
need_per_atom_wiener_process
USE metadynamics_types, ONLY: meta_env_type
USE parallel_rng_types, ONLY: GAUSSIAN,&
create_rng_stream,&
next_rng_seed,&
read_rng_stream,&
rng_record_length
rng_record_length,&
rng_stream_type,&
rng_stream_type_from_record
USE particle_list_types, ONLY: particle_list_type
USE simpar_types, ONLY: simpar_type
USE string_utilities, ONLY: compress
@ -107,7 +107,7 @@ CONTAINS
nparticle_local = local_particles%n_el(iparticle_kind)
ALLOCATE (local_particles%local_particle_set(iparticle_kind)%rng(nparticle_local))
DO iparticle_local = 1, nparticle_local
NULLIFY (local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)%stream)
ALLOCATE (local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)%stream)
END DO
END DO
@ -132,9 +132,9 @@ CONTAINS
iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
WRITE (UNIT=name, FMT="(A,I8)") "Wiener process for particle", iparticle
CALL compress(name)
CALL create_rng_stream(rng_stream=local_particles%local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream, name=name, distribution_type=GAUSSIAN, &
extended_precision=.TRUE., seed=seed(:, :, iparticle))
local_particles%local_particle_set(iparticle_kind)%rng(iparticle_local)% &
stream = rng_stream_type(name=name, distribution_type=GAUSSIAN, &
extended_precision=.TRUE., seed=seed(:, :, iparticle))
END DO
END DO
@ -190,10 +190,8 @@ CONTAINS
keyword_name="_DEFAULT_KEYWORD_", &
i_rep_val=iparticle, &
c_val=rng_record)
CALL read_rng_stream(rng_stream=distribution_1d% &
local_particle_set(iparticle_kind)% &
rng(iparticle_local)%stream, &
rng_record=rng_record)
distribution_1d%local_particle_set(iparticle_kind)%rng(iparticle_local)% &
stream = rng_stream_type_from_record(rng_record)
END IF
END DO
END DO
@ -227,10 +225,6 @@ CONTAINS
initial_seed = next_rng_seed()
DO i_c = 1, meta_env%n_colvar
NULLIFY (meta_env%rng(i_c)%stream)
END DO
! Each process generates all seeds. The seed generation should be
! quite fast and in this way a broadcast is avoided.
@ -248,8 +242,8 @@ CONTAINS
DO i_c = 1, meta_env%n_colvar
WRITE (UNIT=name, FMT="(A,I8)") "Wiener process for COLVAR", i_c
CALL compress(name)
CALL create_rng_stream(rng_stream=meta_env%rng(i_c)%stream, name=name, distribution_type=GAUSSIAN, &
extended_precision=.TRUE., seed=seed(:, :, i_c))
meta_env%rng(i_c) = rng_stream_type(name=name, distribution_type=GAUSSIAN, &
extended_precision=.TRUE., seed=seed(:, :, i_c))
END DO
DEALLOCATE (seed)

View file

@ -45,9 +45,6 @@ MODULE optimize_input
mp_environ,&
mp_sum
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type
USE physcon, ONLY: bohr
USE powell, ONLY: opt_state_type,&
@ -116,7 +113,7 @@ CONTAINS
INTEGER :: handle, i_var
REAL(KIND=dp) :: random_number, seed(3, 2)
TYPE(oi_env_type) :: oi_env
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), ALLOCATABLE :: rng_stream
CALL timeset(routineN, handle)
@ -126,18 +123,16 @@ CONTAINS
! if we have been asked to randomize the variables, we do this.
IF (oi_env%randomize_variables .NE. 0.0_dp) THEN
NULLIFY (rng_stream)
seed = REAL(oi_env%seed, KIND=dp)
CALL create_rng_stream(rng_stream, "run_optimize_input", distribution_type=UNIFORM, seed=seed)
rng_stream = rng_stream_type("run_optimize_input", distribution_type=UNIFORM, seed=seed)
DO i_var = 1, SIZE(oi_env%variables, 1)
IF (.NOT. oi_env%variables(i_var)%fixed) THEN
! change with a random percentage the variable
random_number = next_random_number(rng_stream)
random_number = rng_stream%next()
oi_env%variables(i_var)%value = oi_env%variables(i_var)%value* &
(1.0_dp + (2*random_number - 1.0_dp)*oi_env%randomize_variables/100.0_dp)
ENDIF
ENDDO
CALL delete_rng_stream(rng_stream)
ENDIF
! proceed to actual methods

View file

@ -11,10 +11,7 @@ MODULE pao_ml_neuralnet
USE kinds, ONLY: dp
USE pao_types, ONLY: pao_env_type,&
training_matrix_type
USE parallel_rng_types, ONLY: create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
#include "./base/base_uses.f90"
IMPLICIT NONE
@ -126,11 +123,9 @@ CONTAINS
REAL(dp) :: bak, eps, error, error1, error2, num_grad
REAL(dp), ALLOCATABLE, DIMENSION(:) :: prediction
REAL(dp), ALLOCATABLE, DIMENSION(:, :, :) :: gradient
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type) :: rng_stream
TYPE(training_matrix_type), POINTER :: training_matrix
NULLIFY (rng_stream)
! TODO this could be parallelized over ranks
DO ikind = 1, SIZE(pao%ml_training_matrices)
training_matrix => pao%ml_training_matrices(ikind)
@ -150,15 +145,14 @@ CONTAINS
ALLOCATE (training_matrix%NN(nlayers, width, width))
! initialize network with random numbers from -1.0 ... +1.0
CALL create_rng_stream(rng_stream, name="pao_nn")
rng_stream = rng_stream_type(name="pao_nn")
DO ilayer = 1, nlayers
DO i = 1, width
DO j = 1, width
training_matrix%NN(ilayer, i, j) = -1.0_dp + 2.0_dp*next_random_number(rng_stream)
training_matrix%NN(ilayer, i, j) = -1.0_dp + 2.0_dp*rng_stream%next()
ENDDO
ENDDO
ENDDO
CALL delete_rng_stream(rng_stream)
! train the network using backpropagation
ALLOCATE (gradient(nlayers, width, width))

View file

@ -163,7 +163,7 @@ CONTAINS
CALL section_create(section, __LOCATION__, name="TEST", &
description="Tests to perform on the supported libraries.", &
n_keywords=7, n_subsections=0, repeats=.FALSE.)
n_keywords=6, n_subsections=0, repeats=.FALSE.)
NULLIFY (keyword, print_key)
CALL keyword_create(keyword, __LOCATION__, name="MEMORY", &
@ -227,12 +227,6 @@ CONTAINS
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="RANDOM_NUMBER_GENERATOR", variants=(/"rng"/), &
description=" Tests the parallel random number generator (RNG)", &
usage="rng 1000000", default_i_val=0)
CALL section_add_keyword(section, keyword)
CALL keyword_release(keyword)
CALL keyword_create(keyword, __LOCATION__, name="MINIMAX", &
description="Tests validity of minimax coefficients for approximating 1/x "// &
"as a sum of exponentials. "// &

View file

@ -15,7 +15,6 @@ MODULE statistical_methods
USE cp_log_handling, ONLY: cp_logger_get_default_io_unit
USE global_types, ONLY: global_environment_type
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: next_random_number
USE util, ONLY: sort
#include "./base/base_uses.f90"
@ -456,12 +455,11 @@ CONTAINS
NULLIFY (xdata)
ALLOCATE (xdata(n))
DO i = 1, 10
xdata(i) = 5.0_dp - REAL(i, KIND=dp)/2.0_dp + 0.1* &
next_random_number(globenv%gaussian_rng_stream)
xdata(i) = 5.0_dp - REAL(i, KIND=dp)/2.0_dp + 0.1*globenv%gaussian_rng_stream%next()
WRITE (3, *) xdata(i)
END DO
DO i = 11, n
xdata(i) = 0.1*next_random_number(globenv%gaussian_rng_stream)
xdata(i) = 0.1*globenv%gaussian_rng_stream%next()
END DO
! Test for trend

View file

@ -26,10 +26,7 @@ MODULE glbopt_mincrawl
section_vals_val_get
USE kinds, ONLY: default_string_length,&
dp
USE parallel_rng_types, ONLY: create_rng_stream,&
delete_rng_stream,&
next_random_number,&
rng_stream_type
USE parallel_rng_types, ONLY: rng_stream_type
USE particle_methods, ONLY: write_particle_coordinates
USE particle_types, ONLY: particle_type
USE physcon, ONLY: kelvin
@ -88,7 +85,7 @@ MODULE glbopt_mincrawl
INTEGER :: iw = 0
INTEGER :: minima_traj_unit = 0
TYPE(section_vals_type), POINTER :: mincrawl_section => Null()
TYPE(rng_stream_type), POINTER :: rng_stream => Null()
TYPE(rng_stream_type) :: rng_stream
TYPE(particle_type), DIMENSION(:), POINTER :: particle_set => Null()
END TYPE mincrawl_type
@ -154,7 +151,7 @@ CONTAINS
this%tempdist_init(i) = 1.0/(1.0 + EXP((this%tempstep_init - i)/this%tempdist_init_width))
ENDDO
CALL create_rng_stream(this%rng_stream, name="mincrawl")
this%rng_stream = rng_stream_type(name="mincrawl")
END SUBROUTINE mincrawl_init
! **************************************************************************************************
@ -274,10 +271,10 @@ CONTAINS
REAL(KIND=dp) :: a, r
DO
r = next_random_number(this%rng_stream)
r = this%rng_stream%next()
step = INT(r*SIZE(minima%tempdist)) + 1
a = 1.0 - 2.0*ABS(minima%tempdist(step) - 0.5)
r = next_random_number(this%rng_stream)
r = this%rng_stream%next()
IF (r < a) EXIT
END DO
@ -516,7 +513,6 @@ CONTAINS
this%mincrawl_section, "MINIMA_TRAJECTORY")
CALL history_finalize(this%history)
CALL delete_rng_stream(this%rng_stream)
END SUBROUTINE mincrawl_finalize
END MODULE glbopt_mincrawl

View file

@ -32,7 +32,6 @@ MODULE glbopt_worker
USE md_run, ONLY: qs_mol_dyn
USE mdctrl_types, ONLY: glbopt_mdctrl_data_type,&
mdctrl_type
USE parallel_rng_types, ONLY: reset_to_next_rng_substream
USE physcon, ONLY: angstrom,&
kelvin
USE swarm_message, ONLY: swarm_message_add,&
@ -116,7 +115,7 @@ CONTAINS
! We want different random-number-streams for each worker
DO i = 1, worker_id
CALL reset_to_next_rng_substream(worker%globenv%gaussian_rng_stream)
CALL worker%globenv%gaussian_rng_stream%reset_to_next_substream()
END DO
CALL cp_subsys_get(worker%subsys, natom=worker%n_atoms)
@ -385,4 +384,3 @@ CONTAINS
END SUBROUTINE glbopt_worker_finalize
END MODULE glbopt_worker

View file

@ -22,10 +22,7 @@ MODULE tmc_calculations
set_cell
USE kinds, ONLY: dp
USE mathconstants, ONLY: pi
USE parallel_rng_types, ONLY: get_rng_stream,&
next_random_number,&
rng_stream_type,&
set_rng_stream
USE parallel_rng_types, ONLY: rng_stream_type
USE physcon, ONLY: boltzmann,&
joule
USE tmc_move_types, ONLY: mv_type_MD
@ -123,7 +120,7 @@ CONTAINS
END SELECT
! --- wait a bit
rnd = next_random_number(rng_stream=tmc_env%rng_stream)
rnd = tmc_env%rng_stream%next()
!rnd = 0.5
!TODO IF(worker_random_wait.AND.exact_approx_pot)THEN
! CALL SYSTEM_CLOCK(time0, time_rate, time_max)
@ -361,7 +358,7 @@ CONTAINS
REAL(KIND=dp), DIMENSION(:), POINTER :: vel
TYPE(tmc_atom_type), DIMENSION(:), POINTER :: atoms
REAL(KIND=dp) :: temerature
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
REAL(KIND=dp), DIMENSION(3, 2, 3) :: rnd_seed
CHARACTER(LEN=*), PARAMETER :: routineN = 'init_vel', routineP = moduleN//':'//routineN
@ -374,19 +371,17 @@ CONTAINS
CPASSERT(ASSOCIATED(vel))
CPASSERT(ASSOCIATED(atoms))
CALL set_rng_stream(rng_stream=rng_stream, bg=rnd_seed(:, :, 1), &
cg=rnd_seed(:, :, 2), ig=rnd_seed(:, :, 3))
CALL rng_stream%set(bg=rnd_seed(:, :, 1), cg=rnd_seed(:, :, 2), ig=rnd_seed(:, :, 3))
DO i = 1, SIZE(vel)
rnd1 = next_random_number(rng_stream)
rnd2 = next_random_number(rng_stream)
rnd1 = rng_stream%next()
rnd2 = rng_stream%next()
mass_tmp = atoms(INT(i/REAL(3, KIND=dp)) + 1)%mass
vel(i) = SQRT(-2.0_dp*LOG(rnd1))*COS(2.0_dp*PI*rnd2)* &
SQRT(kB*temerature/mass_tmp)
END DO
CALL get_rng_stream(rng_stream=rng_stream, bg=rnd_seed(:, :, 1), &
cg=rnd_seed(:, :, 2), ig=rnd_seed(:, :, 3))
CALL rng_stream%get(bg=rnd_seed(:, :, 1), cg=rnd_seed(:, :, 2), ig=rnd_seed(:, :, 3))
END SUBROUTINE init_vel

View file

@ -19,10 +19,7 @@ MODULE tmc_moves
USE mathconstants, ONLY: pi
USE mathlib, ONLY: dihedral_angle,&
rotate_vector
USE parallel_rng_types, ONLY: get_rng_stream,&
next_random_number,&
rng_stream_type,&
set_rng_stream
USE parallel_rng_types, ONLY: rng_stream_type
USE physcon, ONLY: boltzmann,&
joule
USE tmc_calculations, ONLY: center_of_mass,&
@ -70,7 +67,7 @@ CONTAINS
new_subbox, move_rejected)
TYPE(tmc_param_type), POINTER :: tmc_params
TYPE(tmc_move_type), POINTER :: move_types
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
TYPE(tree_type), POINTER :: elem
INTEGER :: mv_conf
LOGICAL :: new_subbox, move_rejected
@ -87,12 +84,11 @@ CONTAINS
CPASSERT(ASSOCIATED(tmc_params))
CPASSERT(ASSOCIATED(move_types))
CPASSERT(ASSOCIATED(rng_stream))
CPASSERT(ASSOCIATED(elem))
move_rejected = .FALSE.
CALL set_rng_stream(rng_stream=rng_stream, bg=elem%rng_seed(:, :, 1), &
CALL rng_stream%set(bg=elem%rng_seed(:, :, 1), &
cg=elem%rng_seed(:, :, 2), ig=elem%rng_seed(:, :, 3))
IF (new_subbox) THEN
@ -137,7 +133,7 @@ CONTAINS
IF (tmc_params%nr_elem_mv .EQ. 0) THEN
ind = (i - 1)*(tmc_params%dim_per_elem) + 1
ELSE
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
ind = tmc_params%dim_per_elem* &
INT(rnd*(SIZE(elem%pos)/tmc_params%dim_per_elem)) + 1
END IF
@ -145,7 +141,7 @@ CONTAINS
IF (elem%elem_stat(ind) .EQ. status_ok) THEN
! displace atom
DO d = 0, tmc_params%dim_per_elem - 1
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
elem%pos(ind + d) = elem%pos(ind + d) + (rnd - 0.5)*2.0* &
move_types%mv_size(mv_type_atom_trans, mv_conf)
END DO
@ -197,7 +193,7 @@ CONTAINS
IF (tmc_params%nr_elem_mv .EQ. 0) THEN
m = counter
ELSE
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
m = INT(rnd*nr_molec) + 1
END IF
CALL get_mol_indeces(tmc_params=tmc_params, mol_arr=elem%mol, mol=m, &
@ -210,7 +206,7 @@ CONTAINS
IF (mol_in_sb(m) .EQ. status_ok) THEN
! calculate displacement
DO d = 1, tmc_params%dim_per_elem
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
direction(d) = (rnd - 0.5)*2.0_dp*move_types%mv_size( &
mv_type_mol_trans, mv_conf)
END DO
@ -271,7 +267,7 @@ CONTAINS
IF (tmc_params%nr_elem_mv .EQ. 0) THEN
m = counter
ELSE
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
m = INT(rnd*nr_molec) + 1
END IF
CALL get_mol_indeces(tmc_params=tmc_params, mol_arr=elem%mol, mol=m, &
@ -352,7 +348,7 @@ CONTAINS
cp_to_string(elem%move_type))
END SELECT
CALL get_rng_stream(rng_stream=rng_stream, bg=elem%rng_seed(:, :, 1), &
CALL rng_stream%get(bg=elem%rng_seed(:, :, 1), &
cg=elem%rng_seed(:, :, 2), ig=elem%rng_seed(:, :, 3))
END SUBROUTINE change_pos
@ -472,7 +468,7 @@ CONTAINS
SUBROUTINE elements_in_new_subbox(tmc_params, rng_stream, elem, &
nr_of_sub_box_elements)
TYPE(tmc_param_type), POINTER :: tmc_params
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
TYPE(tree_type), POINTER :: elem
INTEGER, INTENT(OUT) :: nr_of_sub_box_elements
@ -501,19 +497,17 @@ CONTAINS
ALLOCATE (atom_tmp(tmc_params%dim_per_elem))
nr_of_sub_box_elements = 0
! -- define the center of the sub box
CALL set_rng_stream(rng_stream=rng_stream, &
bg=elem%rng_seed(:, :, 1), cg=elem%rng_seed(:, :, 2), &
CALL rng_stream%set(bg=elem%rng_seed(:, :, 1), cg=elem%rng_seed(:, :, 2), &
ig=elem%rng_seed(:, :, 3))
CALL get_cell(cell=tmc_params%cell, abc=box_size)
DO i = 1, SIZE(tmc_params%sub_box_size)
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
center_of_sub_box(i) = rnd*box_size(i)
END DO
elem%subbox_center(:) = center_of_sub_box(:)
CALL get_rng_stream(rng_stream=rng_stream, &
bg=elem%rng_seed(:, :, 1), cg=elem%rng_seed(:, :, 2), &
CALL rng_stream%get(bg=elem%rng_seed(:, :, 1), cg=elem%rng_seed(:, :, 2), &
ig=elem%rng_seed(:, :, 3))
! check all elements if they are in subbox
@ -552,7 +546,7 @@ CONTAINS
INTEGER :: ind_start, ind_end
REAL(KIND=dp) :: max_angle
TYPE(tmc_move_type), POINTER :: move_types
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
INTEGER :: dim_per_elem
CHARACTER(LEN=*), PARAMETER :: routineN = 'do_mol_rot', routineP = moduleN//':'//routineN
@ -571,11 +565,11 @@ CONTAINS
CPASSERT(ASSOCIATED(move_types))
! calculate rotation matrix (using quanternions)
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
a1 = (rnd - 0.5)*2.0*max_angle !move_types%mv_size(mv_type_mol_rot,mv_conf)
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
a2 = (rnd - 0.5)*2.0*max_angle !move_types%mv_size(mv_type_mol_rot,mv_conf)
rnd = next_random_number(rng_stream) ! next random number
rnd = rng_stream%next()
a3 = (rnd - 0.5)*2.0*max_angle !move_types%mv_size(mv_type_mol_rot,mv_conf)
q0 = COS(a2/2)*COS((a1 + a3)/2.0_dp)
q1 = SIN(a2/2)*COS((a1 - a3)/2.0_dp)
@ -615,7 +609,7 @@ CONTAINS
TYPE(tmc_atom_type) :: atom_kind
REAL(KIND=dp), INTENT(IN) :: phi, temp
LOGICAL :: rnd_sign_change
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(LEN=*), PARAMETER :: routineN = 'vel_change', routineP = moduleN//':'//routineN
@ -624,12 +618,10 @@ CONTAINS
kB = boltzmann/joule
CPASSERT(ASSOCIATED(rng_stream))
!phi = move_types%mv_size(mv_type_MD,1) ! TODO parallel tempering move sizes for vel_change
! hence first producing a gaussian random number
rnd1 = next_random_number(rng_stream)
rnd2 = next_random_number(rng_stream)
rnd1 = rng_stream%next()
rnd2 = rng_stream%next()
rnd_g = SQRT(-2.0_dp*LOG(rnd1))*COS(2.0_dp*PI*rnd2)
!we can also produce a second one in the same step:
@ -643,7 +635,7 @@ CONTAINS
! can be switched of using MD_vel_invert
! without still the balance condition should be fullfilled
rnd3 = next_random_number(rng_stream)
rnd3 = rng_stream%next()
IF (rnd3 .GE. 0.5 .AND. rnd_sign_change) THEN
d = -1
ELSE
@ -669,7 +661,7 @@ CONTAINS
tmc_params)
TYPE(tree_type), POINTER :: elem
LOGICAL :: short_loop
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
TYPE(tmc_param_type), POINTER :: tmc_params
CHARACTER(LEN=*), PARAMETER :: routineN = 'search_and_do_proton_displace_loop', &
@ -684,7 +676,6 @@ CONTAINS
NULLIFY (mol_arr)
CPASSERT(ASSOCIATED(elem))
CPASSERT(ASSOCIATED(rng_stream))
CPASSERT(ASSOCIATED(tmc_params))
! start the timing
@ -698,7 +689,7 @@ CONTAINS
mol_arr(:) = -1
donor_acceptor = not_selected
! select randomly if neighboring molecule is donor / acceptor
IF (next_random_number(rng_stream) .LT. 0.5_dp) THEN
IF (rng_stream%next() .LT. 0.5_dp) THEN
donor_acceptor = proton_acceptor
ELSE
donor_acceptor = proton_donor
@ -706,7 +697,7 @@ CONTAINS
! first step build loop
! select randomly one atom
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
! the randomly selected first atom
mol = INT(rnd*nr_mol) + 1
counter = counter + 1
@ -773,7 +764,7 @@ CONTAINS
TYPE(tree_type), POINTER :: elem
INTEGER :: mol, donor_acceptor
TYPE(tmc_param_type), POINTER :: tmc_params
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
CHARACTER(LEN=*), PARAMETER :: routineN = 'find_nearest_proton_acceptor_donator', &
routineP = moduleN//':'//routineN
@ -885,7 +876,7 @@ CONTAINS
END IF
! select randomly the next neighboring molecule
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
! the randomly selected atom: return value!
mol_tmp = neighbor_mol(INT(rnd*SIZE(neighbor_mol(:))) + 1)
mol = mol_tmp
@ -1125,7 +1116,7 @@ CONTAINS
TYPE(tree_type), POINTER :: conf
INTEGER :: T_ind
TYPE(tmc_move_type), POINTER :: move_types
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
TYPE(tmc_param_type), POINTER :: tmc_params
LOGICAL :: mv_cen_of_mass
@ -1141,7 +1132,6 @@ CONTAINS
CPASSERT(ASSOCIATED(conf))
CPASSERT(ASSOCIATED(move_types))
CPASSERT(ASSOCIATED(rng_stream))
CPASSERT(ASSOCIATED(tmc_params))
CPASSERT(T_ind .GT. 0 .AND. T_ind .LE. tmc_params%nr_temp)
CPASSERT(tmc_params%dim_per_elem .EQ. 3)
@ -1163,15 +1153,15 @@ CONTAINS
IF (tmc_params%v_isotropic) THEN
CALL get_scaled_cell(cell=tmc_params%cell, box_scale=conf%box_scale, &
abc=box_length_new, vol=vol)
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
vol = vol + (rnd - 0.5_dp)*2.0_dp*move_types%mv_size(mv_type_volume_move, T_ind)
box_length_new(:) = vol**(1/REAL(3, KIND=dp))
ELSE
CALL get_scaled_cell(cell=tmc_params%cell, box_scale=conf%box_scale, &
abc=box_length_new, vol=vol)
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
vol = vol + (rnd - 0.5_dp)*2.0_dp*move_types%mv_size(mv_type_volume_move, T_ind)
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
dir = 1 + INT(rnd*3)
box_length_new(dir) = 1.0_dp
box_length_new(dir) = vol/PRODUCT(box_length_new(:))
@ -1181,15 +1171,15 @@ CONTAINS
! increase / decrease box lenght in this direction
! l_n = l_o +- rnd * mv_size
IF (tmc_params%v_isotropic) THEN
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
box_length_new(:) = box_length_new(:) + &
(rnd - 0.5_dp)*2.0_dp* &
move_types%mv_size(mv_type_volume_move, T_ind)
ELSE
! select a random direction
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
dir = 1 + INT(rnd*3)
rnd = next_random_number(rng_stream)
rnd = rng_stream%next()
box_length_new(dir) = box_length_new(dir) + &
(rnd - 0.5_dp)*2.0_dp* &
move_types%mv_size(mv_type_volume_move, T_ind)
@ -1254,7 +1244,7 @@ CONTAINS
SUBROUTINE swap_atoms(conf, move_types, rng_stream, tmc_params)
TYPE(tree_type), POINTER :: conf
TYPE(tmc_move_type), POINTER :: move_types
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), INTENT(INOUT) :: rng_stream
TYPE(tmc_param_type), POINTER :: tmc_params
CHARACTER(LEN=*), PARAMETER :: routineN = 'swap_atoms', routineP = moduleN//':'//routineN
@ -1265,7 +1255,6 @@ CONTAINS
CPASSERT(ASSOCIATED(conf))
CPASSERT(ASSOCIATED(move_types))
CPASSERT(ASSOCIATED(rng_stream))
CPASSERT(ASSOCIATED(tmc_params))
CPASSERT(ASSOCIATED(tmc_params%atoms))
@ -1273,10 +1262,10 @@ CONTAINS
atom_search_loop: DO
! select one atom randomly
a_1 = INT(SIZE(conf%pos)/REAL(tmc_params%dim_per_elem, KIND=dp)* &
next_random_number(rng_stream)) + 1
rng_stream%next()) + 1
! select the second atom randomly
a_2 = INT(SIZE(conf%pos)/REAL(tmc_params%dim_per_elem, KIND=dp)* &
next_random_number(rng_stream)) + 1
rng_stream%next()) + 1
! check if they have different kinds
IF (tmc_params%atoms(a_1)%name .NE. tmc_params%atoms(a_2)%name) THEN
! if present, check if atoms have different type related to the specified table

View file

@ -43,8 +43,7 @@ MODULE tmc_setup
mp_comm_free,&
mp_comm_split_direct
USE parallel_rng_types, ONLY: UNIFORM,&
create_rng_stream,&
delete_rng_stream
rng_stream_type
USE physcon, ONLY: au2a => angstrom,&
au2bar => bar
USE tmc_analysis, ONLY: analysis_init,&
@ -176,15 +175,15 @@ CONTAINS
tmc_env%m_env%rnd_init*10.0_dp, &
tmc_env%m_env%rnd_init*2.0_dp/), &
(/3, 2/))
CALL create_rng_stream(rng_stream=tmc_env%rng_stream, &
name="TMC_deterministic_rng_stream", &
seed=init_rng_seed(:, :), &
distribution_type=UNIFORM)
tmc_env%rng_stream = rng_stream_type( &
name="TMC_deterministic_rng_stream", &
seed=init_rng_seed(:, :), &
distribution_type=UNIFORM)
DEALLOCATE (init_rng_seed)
ELSE
CALL create_rng_stream(rng_stream=tmc_env%rng_stream, &
name="TMC_rng_stream", &
distribution_type=UNIFORM)
tmc_env%rng_stream = rng_stream_type( &
name="TMC_rng_stream", &
distribution_type=UNIFORM)
END IF
! start running master and worker routines
@ -310,8 +309,7 @@ CONTAINS
END IF ! unused worker groups have nothing to do
! delete the random numbers
CPASSERT(ASSOCIATED(tmc_env%rng_stream))
CALL delete_rng_stream(tmc_env%rng_stream)
DEALLOCATE (tmc_env%rng_stream)
! deallocate the move types
CALL finalize_mv_types(tmc_env%params)

View file

@ -33,10 +33,6 @@
MODULE tmc_tree_build
USE cp_log_handling, ONLY: cp_to_string
USE kinds, ONLY: dp
USE parallel_rng_types, ONLY: get_rng_stream,&
next_random_number,&
reset_to_next_rng_substream,&
set_rng_stream
USE tmc_calculations, ONLY: calc_e_kin,&
init_vel
USE tmc_dot_tree, ONLY: create_dot,&
@ -290,18 +286,19 @@ CONTAINS
nr_temp=tmc_env%params%nr_temp)
! use initial/default values
CALL get_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=tmc_env%m_env%gt_act%rng_seed(:, :, 1), &
cg=tmc_env%m_env%gt_act%rng_seed(:, :, 2), &
ig=tmc_env%m_env%gt_act%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%get( &
bg=tmc_env%m_env%gt_act%rng_seed(:, :, 1), &
cg=tmc_env%m_env%gt_act%rng_seed(:, :, 2), &
ig=tmc_env%m_env%gt_act%rng_seed(:, :, 3))
global_tree => tmc_env%m_env%gt_act
tmc_env%m_env%gt_head => tmc_env%m_env%gt_act
! set global random seed
CALL set_rng_stream(rng_stream=tmc_env%rng_stream, bg=global_tree%rng_seed(:, :, 1), &
cg=global_tree%rng_seed(:, :, 2), ig=global_tree%rng_seed(:, :, 3))
global_tree%rnd_nr = next_random_number(tmc_env%rng_stream)
CALL tmc_env%rng_stream%set(bg=global_tree%rng_seed(:, :, 1), &
cg=global_tree%rng_seed(:, :, 2), &
ig=global_tree%rng_seed(:, :, 3))
global_tree%rnd_nr = tmc_env%rng_stream%next()
!-- SUBTREES: set initial values
DO i = 1, SIZE(global_tree%conf)
@ -328,10 +325,10 @@ CONTAINS
END IF
!-- different random seeds for every subtree
CALL reset_to_next_rng_substream(tmc_env%rng_stream)
CALL get_rng_stream(rng_stream=tmc_env%rng_stream, bg=global_tree%conf(i)%elem%rng_seed(:, :, 1), &
cg=global_tree%conf(i)%elem%rng_seed(:, :, 2), &
ig=global_tree%conf(i)%elem%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%reset_to_next_substream()
CALL tmc_env%rng_stream%get(bg=global_tree%conf(i)%elem%rng_seed(:, :, 1), &
cg=global_tree%conf(i)%elem%rng_seed(:, :, 2), &
ig=global_tree%conf(i)%elem%rng_seed(:, :, 3))
!-- gaussian distributed velocities
!-- calculating the kinetic energy of the initial configuration velocity
@ -645,16 +642,16 @@ CONTAINS
new_elem%conf(:) = tmp_elem%conf(:)
!-- set rnd nr generator and set next conf to change
CALL set_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=new_elem%parent%rng_seed(:, :, 1), &
cg=new_elem%parent%rng_seed(:, :, 2), &
ig=new_elem%parent%rng_seed(:, :, 3))
CALL reset_to_next_rng_substream(tmc_env%rng_stream)
CALL tmc_env%rng_stream%set( &
bg=new_elem%parent%rng_seed(:, :, 1), &
cg=new_elem%parent%rng_seed(:, :, 2), &
ig=new_elem%parent%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%reset_to_next_substream()
! the random number for acceptance check
new_elem%rnd_nr = next_random_number(tmc_env%rng_stream)
new_elem%rnd_nr = tmc_env%rng_stream%next()
! the next configuration index to move
!rnd = next_random_number(tmc_env%rng_stream)
!rnd = tmc_env%rng_stream%next()
!new_elem%mv_conf = 1+INT(size(new_elem%conf)*rnd)
! one temperature after each other
new_elem%mv_conf = new_elem%parent%mv_next_conf
@ -665,12 +662,11 @@ CONTAINS
IF (n_acc) new_elem%Temp = tmp_elem%Temp*(1 - tmc_env%m_env%temp_decrease)
!-- rnd for swap
rnd = next_random_number(tmc_env%rng_stream)
rnd2 = next_random_number(tmc_env%rng_stream)
CALL get_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=new_elem%rng_seed(:, :, 1), &
cg=new_elem%rng_seed(:, :, 2), &
ig=new_elem%rng_seed(:, :, 3))
rnd = tmc_env%rng_stream%next()
rnd2 = tmc_env%rng_stream%next()
CALL tmc_env%rng_stream%get(bg=new_elem%rng_seed(:, :, 1), &
cg=new_elem%rng_seed(:, :, 2), &
ig=new_elem%rng_seed(:, :, 3))
! swap moves are not part of the subtree structure,
! because exisiting elements from DIFFERENT subtrees are swaped
@ -893,14 +889,14 @@ CONTAINS
END IF
! set new substream of random number generator
CALL set_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=new_elem%rng_seed(:, :, 1), &
cg=new_elem%rng_seed(:, :, 2), &
ig=new_elem%rng_seed(:, :, 3))
CALL reset_to_next_rng_substream(tmc_env%rng_stream)
CALL tmc_env%rng_stream%set( &
bg=new_elem%rng_seed(:, :, 1), &
cg=new_elem%rng_seed(:, :, 2), &
ig=new_elem%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%reset_to_next_substream()
! set the temperature for the NMC moves
rnd = next_random_number(tmc_env%rng_stream)
rnd = tmc_env%rng_stream%next()
IF (tmc_env%params%NMC_inp_file .NE. "") THEN
new_elem%temp_created = INT(tmc_env%params%nr_temp*rnd) + 1
ELSE
@ -908,15 +904,15 @@ CONTAINS
END IF
! rnd nr for selecting move
rnd = next_random_number(tmc_env%rng_stream)
rnd = tmc_env%rng_stream%next()
!-- set move type
new_elem%move_type = select_random_move_type( &
move_types=tmc_env%params%move_types, &
rnd=rnd)
CALL get_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=new_elem%rng_seed(:, :, 1), &
cg=new_elem%rng_seed(:, :, 2), &
ig=new_elem%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%get( &
bg=new_elem%rng_seed(:, :, 1), &
cg=new_elem%rng_seed(:, :, 2), &
ig=new_elem%rng_seed(:, :, 3))
! move is only done by the master,
! when standard MC moves with single potential are done

View file

@ -60,7 +60,7 @@ MODULE tmc_types
TYPE tmc_env_type
TYPE(tmc_comp_set_type), POINTER :: tmc_comp_set
TYPE(tmc_param_type), POINTER :: params
TYPE(rng_stream_type), POINTER :: rng_stream
TYPE(rng_stream_type), ALLOCATABLE :: rng_stream
TYPE(master_env_type), POINTER :: m_env
TYPE(worker_env_type), POINTER :: w_env
END TYPE tmc_env_type
@ -199,7 +199,6 @@ CONTAINS
NULLIFY (tmc_env%tmc_comp_set%para_env_m_ana)
NULLIFY (tmc_env%tmc_comp_set%para_env_m_only)
NULLIFY (tmc_env%rng_stream)
NULLIFY (tmc_env%m_env, tmc_env%w_env)
! initialize the parameter section

View file

@ -47,9 +47,6 @@ MODULE tmc_worker
USE kinds, ONLY: default_string_length,&
dp
USE molecule_list_types, ONLY: molecule_list_type
USE parallel_rng_types, ONLY: get_rng_stream,&
next_random_number,&
set_rng_stream
USE particle_list_types, ONLY: particle_list_type
USE tmc_analysis, ONLY: analysis_init,&
analysis_restart_print,&
@ -613,7 +610,7 @@ CONTAINS
CPASSERT(ASSOCIATED(tmc_env))
CPASSERT(ASSOCIATED(tmc_env%params))
CPASSERT(ASSOCIATED(tmc_env%tmc_comp_set))
CPASSERT(ASSOCIATED(tmc_env%rng_stream))
CPASSERT(ALLOCATED(tmc_env%rng_stream))
CPASSERT(ASSOCIATED(conf))
CPASSERT(conf%temp_created .GT. 0)
CPASSERT(conf%temp_created .LE. tmc_env%params%nr_temp)
@ -662,15 +659,15 @@ CONTAINS
END SELECT
! set move type
CALL set_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%set( &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
conf%move_type = select_random_move_type( &
move_types=tmc_env%params%nmc_move_types, &
rnd=next_random_number(tmc_env%rng_stream))
CALL get_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
rnd=tmc_env%rng_stream%next())
CALL tmc_env%rng_stream%get( &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
! do move
CALL change_pos(tmc_params=tmc_env%params, &
@ -704,13 +701,13 @@ CONTAINS
END IF
!check NMC step
CALL set_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
rnd_nr = next_random_number(tmc_env%rng_stream)
CALL get_rng_stream(rng_stream=tmc_env%rng_stream, &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
CALL tmc_env%rng_stream%set( &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
rnd_nr = tmc_env%rng_stream%next()
CALL tmc_env%rng_stream%get( &
bg=conf%rng_seed(:, :, 1), cg=conf%rng_seed(:, :, 2), &
ig=conf%rng_seed(:, :, 3))
IF (.NOT. change_rejected) THEN
CALL acceptance_check(tree_element=conf, parent_element=last_acc_conf, &

View file

@ -12,5 +12,4 @@
FFT 10
CLEBSCH_GORDON 10
MPI 4
RANDOM_NUMBER_GENERATOR 1000
&END