X-Git-Url: http://mmka.chem.univ.gda.pl/gitweb/?a=blobdiff_plain;f=source%2Funres%2Fsrc_Eshel%2Frandgens.f;fp=source%2Funres%2Fsrc_Eshel%2Frandgens.f;h=0daeb355d1120c341f2d180766553400b455487b;hb=d101c97dea752458d76055fdbae49c26fff03c1f;hp=0000000000000000000000000000000000000000;hpb=325eda160c9ad2982501e091ca40606a29043712;p=unres.git diff --git a/source/unres/src_Eshel/randgens.f b/source/unres/src_Eshel/randgens.f new file mode 100644 index 0000000..0daeb35 --- /dev/null +++ b/source/unres/src_Eshel/randgens.f @@ -0,0 +1,99 @@ +C $Date: 1994/10/04 16:19:52 $ +C $Revision: 2.1 $ +C +C +C See help for RANDOMV on the PSFSHARE disk to understand these +C subroutines. This is the VS Fortran version of this code. +C +C + SUBROUTINE VRND(VEC,N) + INTEGER A(250) + COMMON /VRANDD/ A, I, I147 + INTEGER LOOP,I,I147,VEC(N) + DO 23000 LOOP=1,N + I=I+1 + IF(.NOT.(I.GE.251))GOTO 23002 + I=1 +23002 CONTINUE + I147=I147+1 + IF(.NOT.(I147.GE.251))GOTO 23004 + I147=1 +23004 CONTINUE + A(I)=IEOR(A(I147),A(I)) + VEC(LOOP)=A(I) +23000 CONTINUE + RETURN + END +C +C + DOUBLE PRECISION FUNCTION RNDV(IDUM) + DOUBLE PRECISION RM1,RM2,R(99) + INTEGER IA1,IC1,M1, IA2,IC2,M2, IA3,IC3,M3, IDUM + SAVE + DATA IA1,IC1,M1/1279,351762,1664557/ + DATA IA2,IC2,M2/2011,221592,1048583/ + DATA IA3,IC3,M3/15551,6150,29101/ + IF(.NOT.(IDUM.LT.0))GOTO 23006 + IX1 = MOD(-IDUM,M1) + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IX1,M2) + IX1 = MOD(IA1*IX1+IC1,M1) + IX3 = MOD(IX1,M3) + RM1 = 1./DBLE(M1) + RM2 = 1./DBLE(M2) + DO 23008 J = 1,99 + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IA2*IX2+IC2,M2) + R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1 +23008 CONTINUE +23006 CONTINUE + IX1 = MOD(IA1*IX1+IC1,M1) + IX2 = MOD(IA2*IX2+IC2,M2) + IX3 = MOD(IA3*IX3+IC3,M3) + J = 1+(99*IX3)/M3 + RNDV = R(J) + R(J) = (DBLE(IX1)+DBLE(IX2)*RM2)*RM1 + IDUM = IX1 + RETURN + END +C +C + SUBROUTINE VRNDST(SEED) + INTEGER A(250),LOOP,IDUM,SEED + DOUBLE PRECISION RNDV + COMMON /VRANDD/ A, I, I147 + I=0 + I147=103 + IDUM=SEED + DO 23010 LOOP=1,250 + A(LOOP)=INT(RNDV(IDUM)*2147483647) +23010 CONTINUE + RETURN + END +C +C + SUBROUTINE VRNDIN(IODEV) + INTEGER IODEV, A(250) + COMMON/VRANDD/ A, I, I147 + READ(IODEV) A, I, I147 + RETURN + END +C +C + SUBROUTINE VRNDOU(IODEV) +C This corresponds to VRNDOUT in the APFTN64 version + INTEGER IODEV, A(250) + COMMON/VRANDD/ A, I, I147 + WRITE(IODEV) A, I, I147 + RETURN + END + FUNCTION RNUNF(N) + INTEGER IRAN1(2000) + DATA FCTOR /2147483647.0D0/ +C We get only one random number, here! DR 9/1/92 + CALL VRND(IRAN1,1) + RNUNF= DBLE( IRAN1(1) ) / FCTOR +C****************************** +C write(6,*) 'rnunf in rnunf = ',rnunf + RETURN + END