added source code
[unres.git] / source / unres / src_MD / src / randgens.f
1 C $Date: 1994/10/04 16:19:52 $
2 C $Revision: 2.1 $
3 C
4 C
5 C  See help for RANDOMV on the PSFSHARE disk to understand these
6 C  subroutines.  This is the VS Fortran version of this code.
7 C
8 C
9       SUBROUTINE VRND(VEC,N)
10       INTEGER A(250)
11       COMMON /VRANDD/ A, I, I147
12       INTEGER LOOP,I,I147,VEC(N)
13       DO 23000 LOOP=1,N
14       I=I+1
15       IF(.NOT.(I.GE.251))GOTO 23002
16       I=1
17 23002 CONTINUE
18       I147=I147+1
19       IF(.NOT.(I147.GE.251))GOTO 23004
20       I147=1
21 23004 CONTINUE
22       A(I)=IEOR(A(I147),A(I))
23       VEC(LOOP)=A(I)
24 23000 CONTINUE
25       RETURN
26       END
27 C
28 C
29       DOUBLE PRECISION FUNCTION RNDV(IDUM)
30       DOUBLE PRECISION RM1,RM2,R(99)
31       INTEGER IA1,IC1,M1, IA2,IC2,M2, IA3,IC3,M3, IDUM
32       SAVE
33       DATA IA1,IC1,M1/1279,351762,1664557/
34       DATA IA2,IC2,M2/2011,221592,1048583/
35       DATA IA3,IC3,M3/15551,6150,29101/
36       IF(.NOT.(IDUM.LT.0))GOTO 23006
37       IX1 = MOD(-IDUM,M1)
38       IX1 = MOD(IA1*IX1+IC1,M1)
39       IX2 = MOD(IX1,M2)
40       IX1 = MOD(IA1*IX1+IC1,M1)
41       IX3 = MOD(IX1,M3)
42       RM1 = 1./DBLE(M1)
43       RM2 = 1./DBLE(M2)
44       DO 23008 J = 1,99
45       IX1 = MOD(IA1*IX1+IC1,M1)
46       IX2 = MOD(IA2*IX2+IC2,M2)
47       R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1
48 23008 CONTINUE
49 23006 CONTINUE
50       IX1 = MOD(IA1*IX1+IC1,M1)
51       IX2 = MOD(IA2*IX2+IC2,M2)
52       IX3 = MOD(IA3*IX3+IC3,M3)
53       J = 1+(99*IX3)/M3
54       RNDV = R(J)
55       R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1
56       IDUM = IX1
57       RETURN
58       END
59 C
60 C
61       SUBROUTINE VRNDST(SEED)
62       INTEGER A(250),LOOP,IDUM,SEED
63       DOUBLE PRECISION RNDV
64       COMMON /VRANDD/ A, I, I147
65       I=0
66       I147=103
67       IDUM=SEED
68       DO 23010 LOOP=1,250
69       A(LOOP)=INT(RNDV(IDUM)*2147483647)
70 23010 CONTINUE
71       RETURN
72       END
73 C
74 C
75       SUBROUTINE VRNDIN(IODEV)
76       INTEGER IODEV, A(250)
77       COMMON/VRANDD/ A, I, I147
78       READ(IODEV) A, I, I147
79       RETURN
80       END
81 C
82 C
83       SUBROUTINE VRNDOU(IODEV)
84 C       This corresponds to VRNDOUT in the APFTN64 version
85       INTEGER IODEV, A(250)
86       COMMON/VRANDD/ A, I, I147
87       WRITE(IODEV) A, I, I147
88       RETURN
89       END
90       FUNCTION RNUNF(N)
91       INTEGER IRAN1(2000)
92       DATA FCTOR /2147483647.0D0/
93 C     We get only one random number, here!    DR  9/1/92
94       CALL VRND(IRAN1,1)
95       RNUNF= DBLE( IRAN1(1) ) / FCTOR
96 C******************************
97 C     write(6,*) 'rnunf  in rnunf = ',rnunf
98       RETURN
99       END