73 MODULE PROCEDURE get_timeseed_i4_0d, get_timeseed_i4_1d, &
74 get_timeseed_i8_0d, get_timeseed_i8_1d
201 MODULE PROCEDURE xor4096s_0d, xor4096s_1d, xor4096f_0d, xor4096f_1d, &
202 xor4096l_0d, xor4096l_1d, xor4096d_0d, xor4096d_1d
288 MODULE PROCEDURE xor4096gf_0d, xor4096gf_1d, xor4096gd_0d, xor4096gd_1d
304 subroutine get_timeseed_i4_0d(seed)
307 integer(i4),
intent(inout) :: seed
310 integer(i4),
dimension(8) :: time_array
312 call date_and_time(values = time_array)
314 time_array(5) * 3600000_i4 + &
315 time_array(6) * 60000_i4 + &
316 time_array(7) * 1000_i4 + &
319 end subroutine get_timeseed_i4_0d
321 subroutine get_timeseed_i4_1d(seed)
324 integer(i4),
dimension(:),
intent(inout) :: seed
327 integer(i4),
dimension(8) :: time_array
330 call date_and_time(values = time_array)
332 time_array(5) * 3600000_i4 + &
333 time_array(6) * 60000_i4 + &
334 time_array(7) * 1000_i4 + &
337 seed(i) = seed(i - 1) + 1000_i4
340 end subroutine get_timeseed_i4_1d
342 subroutine get_timeseed_i8_0d(seed)
345 integer(i8),
intent(inout) :: seed
348 integer(i4),
dimension(8) :: time_array
350 call date_and_time(values = time_array)
352 int(time_array(5),
i8) * 3600000_i8 + &
353 int(time_array(6),
i8) * 60000_i8 + &
354 int(time_array(7),
i8) * 1000_i8 + &
355 int(time_array(8),
i8) * 1_i8
357 end subroutine get_timeseed_i8_0d
359 subroutine get_timeseed_i8_1d(seed)
362 integer(i8),
dimension(:),
intent(inout) :: seed
365 integer(i4),
dimension(8) :: time_array
368 call date_and_time(values = time_array)
370 int(time_array(5),
i8) * 3600000_i8 + &
371 int(time_array(6),
i8) * 60000_i8 + &
372 int(time_array(7),
i8) * 1000_i8 + &
373 int(time_array(8),
i8) * 1_i8
375 seed(i) = seed(i - 1) + 1000_i8
378 end subroutine get_timeseed_i8_1d
382 subroutine xor4096s_0d(seed, SingleIntegerRN, save_state)
385 integer(i4),
intent(in) :: seed
386 integer(i4),
intent(out) :: singleintegerrn
387 integer(i4),
optional,
dimension(n_save_state),
intent(inout) :: save_state
389 integer(i4) :: wlen, r, s, a, b, c, d
391 integer(i4),
save :: w
392 integer(i4),
save :: x(0 : 127)
393 integer(i4) :: weyl = 1640531527_i4
394 integer(i4) :: t, v, tmp
395 integer(i4),
save :: i = -1
406 if (
present(save_state) .and. (seed .eq. 0))
then
407 x(0 : r - 1) = save_state(1 : r)
408 i = save_state(r + 1)
409 w = save_state(r + 2)
412 If ((i .lt. 0) .or. (seed .ne. 0))
then
413 If (seed .ne. 0)
then
421 v = ieor(v, ishft(v, 13))
422 v = ieor(v, ishft(v, -17))
423 v = ieor(v, ishft(v, 5))
432 else if ((huge(1_i4) - w) > weyl)
then
435 tmp = -(huge(1_i4) - w - weyl)
436 w = tmp - huge(1_i4) - 2_i4
438 v = ieor(v, ishft(v, 13))
439 v = ieor(v, ishft(v, -17))
440 v = ieor(v, ishft(v, 5))
447 i = iand(i + 1, r - 1)
449 v = x(iand(i + (r - s), r - 1))
450 t = ieor(t, ishft(t, a))
451 t = ieor(t, ishft(t, -b))
452 v = ieor(v, ishft(v, c))
453 v = ieor(v, ieor(t, ishft(v, -d)))
459 i = iand(i + 1, r - 1)
461 v = x(iand(i + (r - s), r - 1))
462 t = ieor(t, ishft(t, a))
463 t = ieor(t, ishft(t, -b))
464 v = ieor(v, ishft(v, c))
465 v = ieor(v, ieor(t, ishft(v, -d)))
470 singleintegerrn = v + w
472 if(
present(save_state))
then
473 save_state(1 : r) = x(0 : r - 1)
474 save_state(r + 1) = i
475 save_state(r + 2) = w
479 end subroutine xor4096s_0d
483 subroutine xor4096s_1d(seed, SingleIntegerRN, save_state)
486 integer(i4),
dimension(:),
intent(in) :: seed
487 integer(i4),
dimension(size(seed, 1)),
intent(out) :: singleintegerrn
488 integer(i4),
optional,
dimension(size(seed, 1), n_save_state),
intent(inout) :: save_state
491 integer(i4) :: wlen, r, s, a, b, c, d
492 integer(i4) :: weyl = 1640531527_i4
493 integer(i4) :: k, j, tmp
494 integer(i4),
dimension(size(seed, 1)) :: t, v
495 integer(i4),
dimension(:, :),
allocatable,
save :: x
496 integer(i4),
dimension(:),
allocatable,
save :: i, w
508 if (any(seed .eq. 0_i4) .and. any(seed .ne. 0_i4))
then
509 stop
'xor4096: seeds have to be eigther all 0 or all larger than 0'
512 if (
present(save_state) .and. all(seed .eq. 0_i4))
then
513 if (
allocated(x))
then
514 if (
size(x, 1) .ne. m)
then
519 allocate(x(m, 0 : r - 1))
523 if (.not.
allocated(x))
then
525 allocate(x(m, 0 : r - 1))
528 x(:, 0 : r - 1) = save_state(:, 1 : r)
529 i(:) = save_state(:, r + 1)
530 w(:) = save_state(:, r + 2)
533 if(all(seed .ne. 0_i4))
then
534 if (
allocated(x))
then
542 allocate(x(m, 0 : r - 1))
547 If ((i(j) .lt. 0) .or. (seed(j) .ne. 0))
then
548 If (seed(j) .ne. 0)
then
556 v(j) = ieor(v(j), ishft(v(j), 13))
557 v(j) = ieor(v(j), ishft(v(j), -17))
558 v(j) = ieor(v(j), ishft(v(j), 5))
565 if (w(j) < 0_i4)
then
567 else if ((huge(1_i4) - w(j)) > weyl)
then
570 tmp = -(huge(1_i4) - w(j) - weyl)
571 w(j) = tmp - huge(1_i4) - 2_i4
573 v(j) = ieor(v(j), ishft(v(j), 13))
574 v(j) = ieor(v(j), ishft(v(j), -17))
575 v(j) = ieor(v(j), ishft(v(j), 5))
576 x(j, k) = v(j) + w(j)
582 i(j) = iand(i(j) + 1, r - 1)
584 v(j) = x(j, iand(i(j) + (r - s), r - 1))
585 t(j) = ieor(t(j), ishft(t(j), a))
586 t(j) = ieor(t(j), ishft(t(j), -b))
587 v(j) = ieor(v(j), ishft(v(j), c))
588 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
597 i(j) = iand(i(j) + 1, r - 1)
599 v(j) = x(j, iand(i(j) + (r - s), r - 1))
600 t(j) = ieor(t(j), ishft(t(j), a))
601 t(j) = ieor(t(j), ishft(t(j), -b))
602 v(j) = ieor(v(j), ishft(v(j), c))
603 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
609 singleintegerrn = v + w
611 if(
present(save_state))
then
612 save_state(:, 1 : r) = x(:, 0 : r - 1)
613 save_state(:, r + 1) = i(:)
614 save_state(:, r + 2) = w(:)
618 end subroutine xor4096s_1d
622 subroutine xor4096f_0d(seed, SingleRealRN, save_state)
626 integer(i4),
intent(in) :: seed
627 real(
sp),
intent(out) :: singlerealrn
628 integer(i4),
optional,
dimension(n_save_state),
intent(inout) :: save_state
630 integer(i4) :: wlen, r, s, a, b, c, d
631 integer(i4),
save :: w
632 integer(i4),
save :: x(0 : 127)
633 integer(i4) :: weyl = 1640531527_i4
634 integer(i4) :: t, v, tmp
635 integer(i4),
save :: i = -1
638 real(
sp) :: t24 = 1.0_sp / 16777216.0_sp
654 if (
present(save_state) .and. (seed .eq. 0))
then
655 x(0 : r - 1) = save_state(1 : r)
656 i = save_state(r + 1)
657 w = save_state(r + 2)
660 If ((i .lt. 0) .or. (seed .ne. 0))
then
661 If (seed .ne. 0)
then
669 v = ieor(v, ishft(v, 13))
670 v = ieor(v, ishft(v, -17))
671 v = ieor(v, ishft(v, 5))
680 else if ((huge(1_i4) - w) > weyl)
then
683 tmp = -(huge(1_i4) - w - weyl)
684 w = tmp - huge(1_i4) - 2_i4
686 v = ieor(v, ishft(v, 13))
687 v = ieor(v, ishft(v, -17))
688 v = ieor(v, ishft(v, 5))
695 i = iand(i + 1, r - 1)
697 v = x(iand(i + (r - s), r - 1))
698 t = ieor(t, ishft(t, a))
699 t = ieor(t, ishft(t, -b))
700 v = ieor(v, ishft(v, c))
701 v = ieor(v, ieor(t, ishft(v, -d)))
708 Do While (v .eq. 0_i4)
709 i = iand(i + 1, r - 1)
711 v = x(iand(i + (r - s), r - 1))
712 t = ieor(t, ishft(t, a))
713 t = ieor(t, ishft(t, -b))
714 v = ieor(v, ishft(v, c))
715 v = ieor(v, ieor(t, ishft(v, -d)))
722 singlerealrn = t24 * v
724 if(
present(save_state))
then
725 save_state(1 : r) = x(0 : r - 1)
726 save_state(r + 1) = i
727 save_state(r + 2) = w
733 end subroutine xor4096f_0d
737 subroutine xor4096f_1d(seed, SingleRealRN, save_state)
741 integer(i4),
dimension(:),
intent(in) :: seed
742 real(
sp),
dimension(size(seed)),
intent(out) :: singlerealrn
743 integer(i4),
optional,
dimension(size(seed, 1), n_save_state),
intent(inout) :: save_state
746 integer(i4) :: wlen, r, s, a, b, c, d
747 integer(i4) :: weyl = 1640531527_i4
748 integer(i4) :: k, j, tmp
749 real(
sp),
save :: t24 = 1.0_sp / 16777216.0_sp
750 integer(i4),
dimension(size(seed)) :: t, v
751 integer(i4),
dimension(:, :),
allocatable,
save :: x
752 integer(i4),
dimension(:),
allocatable,
save :: i, w
769 if (any(seed .eq. 0_i4) .and. any(seed .ne. 0_i4))
then
770 stop
'xor4096: seeds have to be eigther all 0 or all larger than 0'
773 if (
present(save_state) .and. all(seed .eq. 0_i4))
then
774 if (
allocated(x))
then
775 if (
size(x, 1) .ne. m)
then
780 allocate(x(m, 0 : r - 1))
784 if (.not.
allocated(x))
then
786 allocate(x(m, 0 : r - 1))
789 x(:, 0 : r - 1) = save_state(:, 1 : r)
790 i(:) = save_state(:, r + 1)
791 w(:) = save_state(:, r + 2)
794 if(all(seed .ne. 0_i4))
then
795 if (
allocated(x))
then
803 allocate(x(m, 0 : r - 1))
808 If ((i(j) .lt. 0) .or. (seed(j) .ne. 0))
then
809 If (seed(j) .ne. 0)
then
817 v(j) = ieor(v(j), ishft(v(j), 13))
818 v(j) = ieor(v(j), ishft(v(j), -17))
819 v(j) = ieor(v(j), ishft(v(j), 5))
826 if (w(j) < 0_i4)
then
828 else if ((huge(1_i4) - w(j)) > weyl)
then
831 tmp = -(huge(1_i4) - w(j) - weyl)
832 w(j) = tmp - huge(1_i4) - 2_i4
834 v(j) = ieor(v(j), ishft(v(j), 13))
835 v(j) = ieor(v(j), ishft(v(j), -17))
836 v(j) = ieor(v(j), ishft(v(j), 5))
837 x(j, k) = v(j) + w(j)
843 i(j) = iand(i(j) + 1, r - 1)
845 v(j) = x(j, iand(i(j) + (r - s), r - 1))
846 t(j) = ieor(t(j), ishft(t(j), a))
847 t(j) = ieor(t(j), ishft(t(j), -b))
848 v(j) = ieor(v(j), ishft(v(j), c))
849 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
858 Do While (v(j) .eq. 0_i4)
859 i(j) = iand(i(j) + 1, r - 1)
861 v(j) = x(j, iand(i(j) + (r - s), r - 1))
862 t(j) = ieor(t(j), ishft(t(j), a))
863 t(j) = ieor(t(j), ishft(t(j), -b))
864 v(j) = ieor(v(j), ishft(v(j), c))
865 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
869 v(j) = ishft(v(j), -8)
873 singlerealrn = t24 * v
875 if(
present(save_state))
then
876 save_state(:, 1 : r) = x(:, 0 : r - 1)
877 save_state(:, r + 1) = i(:)
878 save_state(:, r + 2) = w(:)
882 end subroutine xor4096f_1d
886 subroutine xor4096l_0d(seed, DoubleIntegerRN, save_state)
890 integer(i8),
intent(in) :: seed
891 integer(i8),
intent(out) :: doubleintegerrn
892 integer(i8),
optional,
dimension(n_save_state),
intent(inout) :: save_state
894 integer(i8) :: wlen, r, s, a, b, c, d
895 integer(i8),
save :: w
896 integer(i8),
save :: x(0 : 63)
897 integer(i8) :: weyl = 7046029254386353131_i8
898 integer(i8) :: t, v, tmp
899 integer(i8),
save :: i = -1
912 if (
present(save_state) .and. (seed .eq. 0_i8))
then
913 x(0 : r - 1) = save_state(1 : r)
914 i = save_state(r + 1)
915 w = save_state(r + 2)
918 If ((i .lt. 0) .or. (seed .ne. 0))
then
919 If (seed .ne. 0)
then
927 v = ieor(v, ishft(v, 7))
928 v = ieor(v, ishft(v, -9))
937 else if ((huge(1_i8) - w) > weyl)
then
940 tmp = -(huge(1_i8) - w - weyl)
941 w = tmp - huge(1_i8) - 2_i8
943 v = ieor(v, ishft(v, 7))
944 v = ieor(v, ishft(v, -9))
951 i = iand(i + 1, r - 1)
953 v = x(iand(i + (r - s), r - 1))
954 t = ieor(t, ishft(t, a))
955 t = ieor(t, ishft(t, -b))
956 v = ieor(v, ishft(v, c))
957 v = ieor(v, ieor(t, ishft(v, -d)))
963 i = iand(i + 1, r - 1)
965 v = x(iand(i + (r - s), r - 1))
966 t = ieor(t, ishft(t, a))
967 t = ieor(t, ishft(t, -b))
968 v = ieor(v, ishft(v, c))
969 v = ieor(v, ieor(t, ishft(v, -d)))
974 doubleintegerrn = v + w
976 if(
present(save_state))
then
977 save_state(1 : r) = x(0 : r - 1)
978 save_state(r + 1) = i
979 save_state(r + 2) = w
983 end subroutine xor4096l_0d
987 subroutine xor4096l_1d(seed, DoubleIntegerRN, save_state)
991 integer(i8),
dimension(:),
intent(in) :: seed
992 integer(i8),
dimension(size(seed, 1)),
intent(out) :: doubleintegerrn
993 integer(i8),
optional,
dimension(size(seed, 1), n_save_state),
intent(inout) :: save_state
996 integer(i8) :: wlen, r, s, a, b, c, d
997 integer(i8) :: weyl = 7046029254386353131_i8
998 integer(i8) :: k, j, tmp
999 integer(i8),
dimension(size(seed)) :: t, v
1000 integer(i8),
dimension(:, :),
allocatable,
save :: x
1001 integer(i8),
dimension(:),
allocatable,
save :: i, w
1015 if (any(seed .eq. 0_i8) .and. any(seed .ne. 0_i8))
then
1016 stop
'xor4096: seeds have to be eigther all 0 or all larger than 0'
1019 if (
present(save_state) .and. all(seed .eq. 0_i4))
then
1020 if (
allocated(x))
then
1021 if (
size(x, 1) .ne. m)
then
1026 allocate(x(m, 0 : r - 1))
1030 if (.not.
allocated(x))
then
1032 allocate(x(m, 0 : r - 1))
1035 x(:, 0 : r - 1) = save_state(:, 1 : r)
1036 i(:) = save_state(:, r + 1)
1037 w(:) = save_state(:, r + 2)
1040 if(all(seed .ne. 0_i4))
then
1041 if (
allocated(x))
then
1049 allocate(x(m, 0 : r - 1))
1054 If ((i(j) .lt. 0) .or. (seed(j) .ne. 0))
then
1055 If (seed(j) .ne. 0)
then
1063 v(j) = ieor(v(j), ishft(v(j), 7))
1064 v(j) = ieor(v(j), ishft(v(j), -9))
1071 if (w(j) < 0_i8)
then
1073 else if ((huge(1_i8) - w(j)) > weyl)
then
1076 tmp = -(huge(1_i8) - w(j) - weyl)
1077 w(j) = tmp - huge(1_i8) - 2_i8
1079 v(j) = ieor(v(j), ishft(v(j), 7))
1080 v(j) = ieor(v(j), ishft(v(j), -9))
1081 x(j, k) = v(j) + w(j)
1087 i(j) = iand(i(j) + 1, r - 1)
1089 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1090 t(j) = ieor(t(j), ishft(t(j), a))
1091 t(j) = ieor(t(j), ishft(t(j), -b))
1092 v(j) = ieor(v(j), ishft(v(j), c))
1093 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1101 i(j) = iand(i(j) + 1, r - 1)
1103 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1104 t(j) = ieor(t(j), ishft(t(j), a))
1105 t(j) = ieor(t(j), ishft(t(j), -b))
1106 v(j) = ieor(v(j), ishft(v(j), c))
1107 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1113 doubleintegerrn = v + w
1115 if(
present(save_state))
then
1116 save_state(:, 1 : r) = x(:, 0 : r - 1)
1117 save_state(:, r + 1) = i(:)
1118 save_state(:, r + 2) = w(:)
1122 end subroutine xor4096l_1d
1126 subroutine xor4096d_0d(seed, DoubleRealRN, save_state)
1130 integer(i8),
intent(in) :: seed
1131 real(
dp),
intent(out) :: doublerealrn
1132 integer(i8),
optional,
dimension(n_save_state),
intent(inout) :: save_state
1134 integer(i8) :: wlen, r, s, a, b, c, d
1136 integer(i8),
save :: w
1137 integer(i8),
save :: x(0 : 63)
1138 integer(i8) :: weyl = 7046029254386353131_i8
1139 integer(i8) :: t, v, tmp
1140 integer(i8),
save :: i = -1
1143 real(
dp) :: t53 = 1.0_dp / 9007199254740992.0_dp
1158 if (
present(save_state) .and. (seed .eq. 0_i8))
then
1159 x(0 : r - 1) = save_state(1 : r)
1160 i = save_state(r + 1)
1161 w = save_state(r + 2)
1164 If ((i .lt. 0) .or. (seed .ne. 0))
then
1165 If (seed .ne. 0)
then
1173 v = ieor(v, ishft(v, 7))
1174 v = ieor(v, ishft(v, -9))
1183 else if ((huge(1_i8) - w) > weyl)
then
1186 tmp = -(huge(1_i8) - w - weyl)
1187 w = tmp - huge(1_i8) - 2_i8
1189 v = ieor(v, ishft(v, 7))
1190 v = ieor(v, ishft(v, -9))
1197 i = iand(i + 1, r - 1)
1199 v = x(iand(i + (r - s), r - 1))
1200 t = ieor(t, ishft(t, a))
1201 t = ieor(t, ishft(t, -b))
1202 v = ieor(v, ishft(v, c))
1203 v = ieor(v, ieor(t, ishft(v, -d)))
1210 Do While (v .eq. 0_i8)
1211 i = iand(i + 1, r - 1)
1213 v = x(iand(i + (r - s), r - 1))
1214 t = ieor(t, ishft(t, a))
1215 t = ieor(t, ishft(t, -b))
1216 v = ieor(v, ishft(v, c))
1217 v = ieor(v, ieor(t, ishft(v, -d)))
1224 doublerealrn = t53 * v
1226 if(
present(save_state))
then
1227 save_state(1 : r) = x(0 : r - 1)
1228 save_state(r + 1) = i
1229 save_state(r + 2) = w
1233 end subroutine xor4096d_0d
1237 subroutine xor4096d_1d(seed, DoubleRealRN, save_state)
1241 integer(i8),
dimension(:),
intent(in) :: seed
1242 real(
dp),
dimension(size(seed, 1)),
intent(out) :: doublerealrn
1243 integer(i8),
optional,
dimension(size(seed, 1), n_save_state),
intent(inout) :: save_state
1246 integer(i8) :: wlen, r, s, a, b, c, d
1247 integer(i8) :: weyl = 7046029254386353131_i8
1248 real(
dp) :: t53 = 1.0_dp / 9007199254740992.0_dp
1249 integer(i8) :: k, j, tmp
1250 integer(i8),
dimension(size(seed)) :: t, v
1251 integer(i8),
dimension(:, :),
allocatable,
save :: x
1252 integer(i8),
dimension(:),
allocatable,
save :: w
1253 integer(i8),
dimension(:),
allocatable,
save :: i
1270 if (any(seed .eq. 0_i8) .and. any(seed .ne. 0_i8))
then
1271 stop
'xor4096: seeds have to be eigther all 0 or all larger than 0'
1274 if (
present(save_state) .and. all(seed .eq. 0_i4))
then
1275 if (
allocated(x))
then
1276 if (
size(x, 1) .ne. m)
then
1281 allocate(x(m, 0 : r - 1))
1285 if (.not.
allocated(x))
then
1287 allocate(x(m, 0 : r - 1))
1290 x(:, 0 : r - 1) = save_state(:, 1 : r)
1291 i(:) = save_state(:, r + 1)
1292 w(:) = save_state(:, r + 2)
1295 if(all(seed .ne. 0_i4))
then
1296 if (
allocated(x))
then
1304 allocate(x(m, 0 : r - 1))
1309 If ((i(j) .lt. 0) .or. (seed(j) .ne. 0))
then
1310 If (seed(j) .ne. 0)
then
1318 v(j) = ieor(v(j), ishft(v(j), 7))
1319 v(j) = ieor(v(j), ishft(v(j), -9))
1326 if (w(j) < 0_i8)
then
1328 else if ((huge(1_i8) - w(j)) > weyl)
then
1331 tmp = -(huge(1_i8) - w(j) - weyl)
1332 w(j) = tmp - huge(1_i8) - 2_i8
1334 v(j) = ieor(v(j), ishft(v(j), 7))
1335 v(j) = ieor(v(j), ishft(v(j), -9))
1336 x(j, k) = v(j) + w(j)
1342 i(j) = iand(i(j) + 1, r - 1)
1344 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1345 t(j) = ieor(t(j), ishft(t(j), a))
1346 t(j) = ieor(t(j), ishft(t(j), -b))
1347 v(j) = ieor(v(j), ishft(v(j), c))
1348 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1357 Do While (v(j) .eq. 0_i8)
1358 i(j) = iand(i(j) + 1, r - 1)
1360 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1361 t(j) = ieor(t(j), ishft(t(j), a))
1362 t(j) = ieor(t(j), ishft(t(j), -b))
1363 v(j) = ieor(v(j), ishft(v(j), c))
1364 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1368 v(j) = ishft(v(j), -11)
1372 doublerealrn = t53 * v
1374 if(
present(save_state))
then
1375 save_state(:, 1 : r) = x(:, 0 : r - 1)
1376 save_state(:, r + 1) = i(:)
1377 save_state(:, r + 2) = w(:)
1381 end subroutine xor4096d_1d
1385 subroutine xor4096gf_0d(seed, SingleRealRN, save_state)
1389 integer(i4),
intent(in) :: seed
1390 real(
sp),
intent(out) :: singlerealrn
1391 integer(i4),
optional,
dimension(n_save_state),
intent(inout) :: save_state
1393 integer(i4) :: wlen, r, s, a, b, c, d
1394 integer(i4),
save :: w
1395 integer(i4),
save :: x(0 : 127)
1396 integer(i4) :: weyl = 1640531527_i4
1397 integer(i4) :: t, v, tmp
1398 integer(i4),
save :: i = -1
1400 real(
sp) :: t24 = 1.0_sp / 16777216.0_sp
1402 real(
sp) :: rn1, rn2
1403 real(
sp) :: x1, x2, y1, ww
1404 integer(i4),
save :: flag = 1
1405 real(
sp),
save :: y2
1421 if(
present(save_state) .and. (seed .eq. 0))
then
1422 x(0 : r - 1) = save_state(1 : r)
1423 i = save_state(r + 1)
1424 w = save_state(r + 2)
1425 flag = save_state(r + 3)
1426 y2 = transfer(save_state(r + 4), 1.0_sp)
1429 If ((i .lt. 0) .or. (seed .ne. 0))
then
1430 If (seed .ne. 0)
then
1438 v = ieor(v, ishft(v, 13))
1439 v = ieor(v, ishft(v, -17))
1440 v = ieor(v, ishft(v, 5))
1449 else if ((huge(1_i4) - w) > weyl)
then
1452 tmp = -(huge(1_i4) - w - weyl)
1453 w = tmp - huge(1_i4) - 2_i4
1455 v = ieor(v, ishft(v, 13))
1456 v = ieor(v, ishft(v, -17))
1457 v = ieor(v, ishft(v, 5))
1464 i = iand(i + 1, r - 1)
1466 v = x(iand(i + (r - s), r - 1))
1467 t = ieor(t, ishft(t, a))
1468 t = ieor(t, ishft(t, -b))
1469 v = ieor(v, ishft(v, c))
1470 v = ieor(v, ieor(t, ishft(v, -d)))
1476 If (flag .eq. 1)
then
1479 do while (ww .ge. 1.0_sp)
1483 Do While (v .eq. 0_i4)
1484 i = iand(i + 1, r - 1)
1486 v = x(iand(i + (r - s), r - 1))
1487 t = ieor(t, ishft(t, a))
1488 t = ieor(t, ishft(t, -b))
1489 v = ieor(v, ishft(v, c))
1490 v = ieor(v, ieor(t, ishft(v, -d)))
1500 Do While (v .eq. 0_i4)
1501 i = iand(i + 1, r - 1)
1503 v = x(iand(i + (r - s), r - 1))
1504 t = ieor(t, ishft(t, a))
1505 t = ieor(t, ishft(t, -b))
1506 v = ieor(v, ishft(v, c))
1507 v = ieor(v, ieor(t, ishft(v, -d)))
1516 x1 = 2.0_sp * rn1 - 1.0_sp
1517 x2 = 2.0_sp * rn2 - 1.0_sp
1519 ww = x1 * x1 + x2 * x2
1522 ww = sqrt((-2.0_sp * log(ww)) / ww)
1528 If (flag .eq. 1)
then
1536 if(
present(save_state))
then
1537 save_state(1 : r) = x(0 : r - 1)
1538 save_state(r + 1) = i
1539 save_state(r + 2) = w
1540 save_state(r + 3) = flag
1541 save_state(r + 4) = transfer(y2, 1_i4)
1545 end subroutine xor4096gf_0d
1549 subroutine xor4096gf_1d(seed, SingleRealRN, save_state)
1553 integer(i4),
dimension(:),
intent(in) :: seed
1554 real(
sp),
dimension(size(seed)),
intent(out) :: singlerealrn
1555 integer(i4),
optional,
dimension(size(seed), n_save_state),
intent(inout) :: save_state
1558 integer(i4) :: wlen, r, s, a, b, c, d
1559 integer(i4) :: weyl = 1640531527_i4
1560 integer(i4) :: k, j, tmp
1561 real(
sp) :: t24 = 1.0_sp / 16777216.0_sp
1562 integer(i4),
dimension(size(seed)) :: t, v
1563 integer(i4),
dimension(:, :),
allocatable,
save :: x
1564 integer(i4),
dimension(:),
allocatable,
save :: i, w
1566 real(
sp),
dimension(size(seed)) :: rn1, rn2
1567 real(
sp),
dimension(size(seed)) :: x1, x2, y1, ww
1568 real(
sp),
dimension(:),
allocatable,
save :: y2
1569 integer(i4),
dimension(:),
allocatable,
save :: flag
1587 if (any(seed .eq. 0_i4) .and. any(seed .ne. 0_i4))
then
1588 stop
'xor4096g: seeds have to be eigther all 0 or all larger than 0'
1591 if (
present(save_state) .and. all(seed .eq. 0_i4))
then
1592 if (
allocated(x))
then
1593 if (
size(x, 1) .ne. m)
then
1600 allocate(x(m, 0 : r - 1))
1606 if (.not.
allocated(x))
then
1608 allocate(x(m, 0 : r - 1))
1613 x(:, 0 : r - 1) = save_state(:, 1 : r)
1614 i(:) = save_state(:, r + 1)
1615 w(:) = save_state(:, r + 2)
1616 flag(:) = save_state(:, r + 3)
1618 y2(j) = transfer(save_state(j, r + 4), 1.0_sp)
1622 if(all(seed .ne. 0_i4))
then
1623 if (
allocated(x))
then
1633 allocate(x(m, 0 : r - 1))
1641 If ((i(j) .lt. 0) .or. (seed(j) .ne. 0))
then
1642 If (seed(j) .ne. 0)
then
1650 v(j) = ieor(v(j), ishft(v(j), 13))
1651 v(j) = ieor(v(j), ishft(v(j), -17))
1652 v(j) = ieor(v(j), ishft(v(j), 5))
1659 if (w(j) < 0_i4)
then
1661 else if ((huge(1_i4) - w(j)) > weyl)
then
1664 tmp = -(huge(1_i4) - w(j) - weyl)
1665 w(j) = tmp - huge(1_i4) - 2_i4
1667 v(j) = ieor(v(j), ishft(v(j), 13))
1668 v(j) = ieor(v(j), ishft(v(j), -17))
1669 v(j) = ieor(v(j), ishft(v(j), 5))
1670 x(j, k) = v(j) + w(j)
1676 i(j) = iand(i(j) + 1, r - 1)
1678 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1679 t(j) = ieor(t(j), ishft(t(j), a))
1680 t(j) = ieor(t(j), ishft(t(j), -b))
1681 v(j) = ieor(v(j), ishft(v(j), c))
1682 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1690 If (flag(j) .eq. 1)
then
1693 do while (ww(j) .ge. 1.0_sp)
1697 Do While (v(j) .eq. 0_i4)
1698 i(j) = iand(i(j) + 1, r - 1)
1700 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1701 t(j) = ieor(t(j), ishft(t(j), a))
1702 t(j) = ieor(t(j), ishft(t(j), -b))
1703 v(j) = ieor(v(j), ishft(v(j), c))
1704 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1708 v(j) = ishft(v(j), -8)
1714 Do While (v(j) .eq. 0_i4)
1715 i(j) = iand(i(j) + 1, r - 1)
1717 v(j) = x(j, iand(i(j) + (r - s), r - 1))
1718 t(j) = ieor(t(j), ishft(t(j), a))
1719 t(j) = ieor(t(j), ishft(t(j), -b))
1720 v(j) = ieor(v(j), ishft(v(j), c))
1721 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
1725 v(j) = ishft(v(j), -8)
1730 x1(j) = 2.0_sp * rn1(j) - 1.0_sp
1731 x2(j) = 2.0_sp * rn2(j) - 1.0_sp
1732 ww(j) = x1(j) * x1(j) + x2(j) * x2(j)
1735 ww(j) = sqrt((-2.0_sp * log(ww(j))) / ww(j))
1736 y1(j) = x1(j) * ww(j)
1737 y2(j) = x2(j) * ww(j)
1742 If (flag(j) .eq. 1)
then
1744 singlerealrn(j) = y1(j)
1747 singlerealrn(j) = y2(j)
1751 if(
present(save_state))
then
1752 save_state(:, 1 : r) = x(:, 0 : r - 1)
1753 save_state(:, r + 1) = i(:)
1754 save_state(:, r + 2) = w(:)
1755 save_state(:, r + 3) = flag(:)
1757 save_state(j, r + 4) = transfer(y2(j), 1_i4)
1762 end subroutine xor4096gf_1d
1766 subroutine xor4096gd_0d(seed, DoubleRealRN, save_state)
1770 integer(i8),
intent(in) :: seed
1771 real(
dp),
intent(out) :: doublerealrn
1772 integer(i8),
optional,
dimension(n_save_state),
intent(inout) :: save_state
1774 integer(i8) :: wlen, r, s, a, b, c, d
1776 integer(i8),
save :: w
1777 integer(i8),
save :: x(0 : 63)
1778 integer(i8) :: weyl = 7046029254386353131_i8
1779 integer(i8) :: t, v, tmp
1780 integer(i8),
save :: i = -1_i8
1783 real(
dp) :: t53 = 1.0_dp / 9007199254740992.0_dp
1785 real(
dp) :: rn1, rn2
1786 real(
dp) :: x1, x2, y1, ww
1787 real(
dp),
save :: y2
1788 integer(i8),
save :: flag = 1_i8
1804 if(
present(save_state) .and. (seed .eq. 0))
then
1805 x(0 : r - 1) = save_state(1 : r)
1806 i = save_state(r + 1)
1807 w = save_state(r + 2)
1808 flag = save_state(r + 3)
1809 y2 = transfer(save_state(r + 4), 1.0_dp)
1812 If ((i .lt. 0_i8) .or. (seed .ne. 0_i8))
then
1813 If (seed .ne. 0)
then
1821 v = ieor(v, ishft(v, 7))
1822 v = ieor(v, ishft(v, -9))
1831 else if ((huge(1_i8) - w) > weyl)
then
1834 tmp = -(huge(1_i8) - w - weyl)
1835 w = tmp - huge(1_i8) - 2_i8
1837 v = ieor(v, ishft(v, 7))
1838 v = ieor(v, ishft(v, -9))
1845 i = iand(i + 1, r - 1)
1847 v = x(iand(i + (r - s), r - 1))
1848 t = ieor(t, ishft(t, a))
1849 t = ieor(t, ishft(t, -b))
1850 v = ieor(v, ishft(v, c))
1851 v = ieor(v, ieor(t, ishft(v, -d)))
1857 If (flag .eq. 1_i8)
then
1860 do while (ww .ge. 1.0_dp)
1864 Do While (v .eq. 0_i8)
1865 i = iand(i + 1, r - 1)
1867 v = x(iand(i + (r - s), r - 1))
1868 t = ieor(t, ishft(t, a))
1869 t = ieor(t, ishft(t, -b))
1870 v = ieor(v, ishft(v, c))
1871 v = ieor(v, ieor(t, ishft(v, -d)))
1881 Do While (v .eq. 0_i8)
1882 i = iand(i + 1, r - 1)
1884 v = x(iand(i + (r - s), r - 1))
1885 t = ieor(t, ishft(t, a))
1886 t = ieor(t, ishft(t, -b))
1887 v = ieor(v, ishft(v, c))
1888 v = ieor(v, ieor(t, ishft(v, -d)))
1897 x1 = 2.0_dp * rn1 - 1.0_dp
1898 x2 = 2.0_dp * rn2 - 1.0_dp
1899 ww = x1 * x1 + x2 * x2
1902 ww = sqrt((-2.0_dp * log(ww)) / ww)
1908 If (flag .eq. 1)
then
1916 if(
present(save_state))
then
1917 save_state(1 : r) = x(0 : r - 1)
1918 save_state(r + 1) = i
1919 save_state(r + 2) = w
1920 save_state(r + 3) = flag
1921 save_state(r + 4) = transfer(y2, 1_i8)
1925 end subroutine xor4096gd_0d
1929 subroutine xor4096gd_1d(seed, DoubleRealRN, save_state)
1933 integer(i8),
dimension(:),
intent(in) :: seed
1934 real(
dp),
dimension(size(seed)),
intent(out) :: doublerealrn
1935 integer(i8),
optional,
dimension(size(seed), n_save_state),
intent(inout) :: save_state
1938 integer(i8) :: wlen, r, s, a, b, c, d
1939 integer(i8) :: weyl = 7046029254386353131_i8
1940 integer(i8) :: k, j, tmp
1941 real(
dp) :: t53 = 1.0_dp / 9007199254740992.0_dp
1942 integer(i8),
dimension(size(seed)) :: t, v
1943 integer(i8),
dimension(:, :),
allocatable,
save :: x
1944 integer(i8),
dimension(:),
allocatable,
save :: i, w
1946 real(
dp),
dimension(size(seed)) :: rn1, rn2
1947 real(
dp),
dimension(size(seed)) :: x1, x2, y1, ww
1948 real(
dp),
dimension(:),
allocatable,
save :: y2
1949 integer(i8),
dimension(:),
allocatable,
save :: flag
1967 if (any(seed .eq. 0_i8) .and. any(seed .ne. 0_i8))
then
1968 stop
'xor4096g: seeds have to be eigther all 0 or all larger than 0'
1971 if (
present(save_state) .and. all(seed .eq. 0_i8))
then
1972 if (
allocated(x))
then
1973 if (
size(x, 1) .ne. m)
then
1980 allocate(x(m, 0 : r - 1))
1986 if (.not.
allocated(x))
then
1988 allocate(x(m, 0 : r - 1))
1993 x(:, 0 : r - 1) = save_state(:, 1 : r)
1994 i(:) = save_state(:, r + 1)
1995 w(:) = save_state(:, r + 2)
1996 flag(:) = save_state(:, r + 3)
1998 y2(j) = transfer(save_state(j, r + 4), 1.0_dp)
2002 if(all(seed .ne. 0_i8))
then
2003 if (
allocated(x))
then
2013 allocate(x(m, 0 : r - 1))
2021 If ((i(j) .lt. 0) .or. (seed(j) .ne. 0))
then
2022 If (seed(j) .ne. 0)
then
2030 v(j) = ieor(v(j), ishft(v(j), 7))
2031 v(j) = ieor(v(j), ishft(v(j), -9))
2038 if (w(j) < 0_i8)
then
2040 else if ((huge(1_i8) - w(j)) > weyl)
then
2043 tmp = -(huge(1_i8) - w(j) - weyl)
2044 w(j) = tmp - huge(1_i8) - 2_i8
2046 v(j) = ieor(v(j), ishft(v(j), 7))
2047 v(j) = ieor(v(j), ishft(v(j), -9))
2048 x(j, k) = v(j) + w(j)
2054 i(j) = iand(i(j) + 1, r - 1)
2056 v(j) = x(j, iand(i(j) + (r - s), r - 1))
2057 t(j) = ieor(t(j), ishft(t(j), a))
2058 t(j) = ieor(t(j), ishft(t(j), -b))
2059 v(j) = ieor(v(j), ishft(v(j), c))
2060 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
2068 If (flag(j) .eq. 1)
then
2071 do while (ww(j) .ge. 1.0_dp)
2075 Do While (v(j) .eq. 0_i8)
2076 i(j) = iand(i(j) + 1, r - 1)
2078 v(j) = x(j, iand(i(j) + (r - s), r - 1))
2079 t(j) = ieor(t(j), ishft(t(j), a))
2080 t(j) = ieor(t(j), ishft(t(j), -b))
2081 v(j) = ieor(v(j), ishft(v(j), c))
2082 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
2086 v(j) = ishft(v(j), -11)
2092 Do While (v(j) .eq. 0_i8)
2093 i(j) = iand(i(j) + 1, r - 1)
2095 v(j) = x(j, iand(i(j) + (r - s), r - 1))
2096 t(j) = ieor(t(j), ishft(t(j), a))
2097 t(j) = ieor(t(j), ishft(t(j), -b))
2098 v(j) = ieor(v(j), ishft(v(j), c))
2099 v(j) = ieor(v(j), ieor(t(j), ishft(v(j), -d)))
2103 v(j) = ishft(v(j), -11)
2108 x1(j) = 2.0_dp * rn1(j) - 1.0_dp
2109 x2(j) = 2.0_dp * rn2(j) - 1.0_dp
2110 ww(j) = x1(j) * x1(j) + x2(j) * x2(j)
2113 ww(j) = sqrt((-2.0_dp * log(ww(j))) / ww(j))
2114 y1(j) = x1(j) * ww(j)
2115 y2(j) = x2(j) * ww(j)
2121 If (flag(j) .eq. 1)
then
2123 doublerealrn(j) = y1(j)
2126 doublerealrn(j) = y2(j)
2130 if(
present(save_state))
then
2131 save_state(:, 1 : r) = x(:, 0 : r - 1)
2132 save_state(:, r + 1) = i(:)
2133 save_state(:, r + 2) = w(:)
2134 save_state(:, r + 3) = flag(:)
2136 save_state(j, r + 4) = transfer(y2(j), 1_i8)
2141 end subroutine xor4096gd_1d
Generate seed for xor4096.
Uniform XOR4096-based RNG.
Gaussian XOR4096-based RNG.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter i8
8 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
XOR4096-based random number generator.
integer(i4), parameter, public n_save_state
Dimension of vector saving the state of a stream.