annotate gcc/testsuite/gfortran.dg/implicit_pure_3.f90 @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ! { dg-do compile }
kono
parents:
diff changeset
2 ! { dg-options "-O2 -fdump-tree-optimized" }
kono
parents:
diff changeset
3 !
kono
parents:
diff changeset
4 ! PR fortran/54556
kono
parents:
diff changeset
5 !
kono
parents:
diff changeset
6 ! Contributed by Joost VandeVondele
kono
parents:
diff changeset
7 !
kono
parents:
diff changeset
8 MODULE parallel_rng_types
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 IMPLICIT NONE
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 ! Global parameters in this module
kono
parents:
diff changeset
13 INTEGER, PARAMETER :: dp=8
kono
parents:
diff changeset
14
kono
parents:
diff changeset
15 TYPE rng_stream_type
kono
parents:
diff changeset
16 PRIVATE
kono
parents:
diff changeset
17 CHARACTER(LEN=40) :: name
kono
parents:
diff changeset
18 INTEGER :: distribution_type
kono
parents:
diff changeset
19 REAL(KIND=dp), DIMENSION(3,2) :: bg,cg,ig
kono
parents:
diff changeset
20 LOGICAL :: antithetic,extended_precision
kono
parents:
diff changeset
21 REAL(KIND=dp) :: buffer
kono
parents:
diff changeset
22 LOGICAL :: buffer_filled
kono
parents:
diff changeset
23 END TYPE rng_stream_type
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 REAL(KIND=dp), DIMENSION(3,3) :: a1p0,a1p76,a1p127,&
kono
parents:
diff changeset
26 a2p0,a2p76,a2p127,&
kono
parents:
diff changeset
27 inv_a1,inv_a2
kono
parents:
diff changeset
28
kono
parents:
diff changeset
29 INTEGER, PARAMETER :: GAUSSIAN = 1,&
kono
parents:
diff changeset
30 UNIFORM = 2
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 REAL(KIND=dp), PARAMETER :: norm = 2.328306549295727688e-10_dp,&
kono
parents:
diff changeset
33 m1 = 4294967087.0_dp,&
kono
parents:
diff changeset
34 m2 = 4294944443.0_dp,&
kono
parents:
diff changeset
35 a12 = 1403580.0_dp,&
kono
parents:
diff changeset
36 a13n = 810728.0_dp,&
kono
parents:
diff changeset
37 a21 = 527612.0_dp,&
kono
parents:
diff changeset
38 a23n = 1370589.0_dp,&
kono
parents:
diff changeset
39 two17 = 131072.0_dp,& ! 2**17
kono
parents:
diff changeset
40 two53 = 9007199254740992.0_dp,& ! 2**53
kono
parents:
diff changeset
41 fact = 5.9604644775390625e-8_dp ! 1/2**24
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 CONTAINS
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 FUNCTION rn32(rng_stream) RESULT(u)
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 TYPE(rng_stream_type), POINTER :: rng_stream
kono
parents:
diff changeset
49 REAL(KIND=dp) :: u
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 INTEGER :: k
kono
parents:
diff changeset
52 REAL(KIND=dp) :: p1, p2
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 ! -------------------------------------------------------------------------
kono
parents:
diff changeset
55 ! Component 1
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 p1 = a12*rng_stream%cg(2,1) - a13n*rng_stream%cg(1,1)
kono
parents:
diff changeset
58 k = INT(p1/m1)
kono
parents:
diff changeset
59 p1 = p1 - k*m1
kono
parents:
diff changeset
60 IF (p1 < 0.0_dp) p1 = p1 + m1
kono
parents:
diff changeset
61 rng_stream%cg(1,1) = rng_stream%cg(2,1)
kono
parents:
diff changeset
62 rng_stream%cg(2,1) = rng_stream%cg(3,1)
kono
parents:
diff changeset
63 rng_stream%cg(3,1) = p1
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 ! Component 2
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 p2 = a21*rng_stream%cg(3,2) - a23n*rng_stream%cg(1,2)
kono
parents:
diff changeset
68 k = INT(p2/m2)
kono
parents:
diff changeset
69 p2 = p2 - k*m2
kono
parents:
diff changeset
70 IF (p2 < 0.0_dp) p2 = p2 + m2
kono
parents:
diff changeset
71 rng_stream%cg(1,2) = rng_stream%cg(2,2)
kono
parents:
diff changeset
72 rng_stream%cg(2,2) = rng_stream%cg(3,2)
kono
parents:
diff changeset
73 rng_stream%cg(3,2) = p2
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 ! Combination
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 IF (p1 > p2) THEN
kono
parents:
diff changeset
78 u = (p1 - p2)*norm
kono
parents:
diff changeset
79 ELSE
kono
parents:
diff changeset
80 u = (p1 - p2 + m1)*norm
kono
parents:
diff changeset
81 END IF
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 IF (rng_stream%antithetic) u = 1.0_dp - u
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 END FUNCTION rn32
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 ! *****************************************************************************
kono
parents:
diff changeset
88 FUNCTION rn53(rng_stream) RESULT(u)
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 TYPE(rng_stream_type), POINTER :: rng_stream
kono
parents:
diff changeset
91 REAL(KIND=dp) :: u
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 u = rn32(rng_stream)
kono
parents:
diff changeset
94
kono
parents:
diff changeset
95 IF (rng_stream%antithetic) THEN
kono
parents:
diff changeset
96 u = u + (rn32(rng_stream) - 1.0_dp)*fact
kono
parents:
diff changeset
97 IF (u < 0.0_dp) u = u + 1.0_dp
kono
parents:
diff changeset
98 ELSE
kono
parents:
diff changeset
99 u = u + rn32(rng_stream)*fact
kono
parents:
diff changeset
100 IF (u >= 1.0_dp) u = u - 1.0_dp
kono
parents:
diff changeset
101 END IF
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 END FUNCTION rn53
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 END MODULE
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 ! { dg-final { scan-module-absence "parallel_rng_types" "IMPLICIT_PURE" } }
kono
parents:
diff changeset
108 ! { dg-final { scan-tree-dump-times "rn32 \\(rng_stream" 3 "optimized" } }