2016-02-29 119 views
0

我试图在我的FORTRAN 90代码中使用来自Numerical Recipes的ran1。我认为一种常见的方法是分别编译旧的子程序,然后使用目标文件。但是在这里我想知道在我的代码中直接使用它需要进行哪些更改。使用FORTRAN 90中的ran1 FORTRAN 77子程序90

FUNCTION ran1(idum) 
INTEGER idum,IA,IM,IQ,IR,NTAB,NDIV 
REAL ran1,AM,EPS,RNMX 
PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836, 
! NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2e-7,RNMX=1.-EPS) 
! “Minimal” random number generator of Park and Miller with Bays-Durham shuffle and 
! added safeguards. Returns a uniform random deviate between 0.0 and 1.0 (exclusive of 
! the endpoint values). Call with idum a negative integer to initialize; thereafter, do not 
! alter idum between successive deviates in a sequence. RNMX should approximate the largest 
! floating value that is less than 1. 
INTEGER j,k,iv(NTAB),iy 
SAVE iv,iy 
DATA iv /NTAB*0/, iy /0/ 
iy = 0 
if (idum.le.0.or.iy.eq.0) then !Initialize. 
idum=max(-idum,1) 
! Be sure to prevent idum = 0. 
do 11 j=NTAB+8,1,-1 
! Load the shuffle table (after 8 warm-ups). 
k=idum/IQ 
idum=IA*(idum-k*IQ)-IR*k 
if (idum.lt.0) idum=idum+IM 
if (j.le.NTAB) iv(j)=idum! Compute idum=mod(IA*idum,IM) without overflows by 
enddo 11 
iy=iv(1) 
endif 
k=idum/IQ 
idum=IA*(idum-k*IQ)-IR*k 
! Compute idum=mod(IA*idum,IM) without overflows by 
if (idum.lt.0) idum=idum+IM  ! Schrage’s method. 
j=1+iy/NDIV 
iy=iv(j)    ! Output previously stored value and refill the shuffle table. 

iv(j)=idum 
ran1=min(AM*iy,RNMX) ! Because users don’t expect endpoint values. 
return 
END 
+0

你应该使用更新的[随机数发生器](http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/FORTRAN/fortran.html)。 –

+0

我不太确定你的问题是什么!您可以将代码放入模块中并使用它。我没有看到任何不受支持的特殊功能... –

+0

请在您与3岁小孩交谈时说话。当我把模块放入模块时,我得到了很多错误,例如错误#5082:语法错误,在期待以下之一时发现INTEGER_CONSTANT'11':; enddo 11 ' – Abolfazl

回答

2

您的代码格式不正确。看起来你是从书中手动复制的,但不完全一样。第二个问题即使在书中也存在。

首先,应该有一个续行,而不是在参数声明的二,三线

PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836, & 
    NTAB=32,NDIV=1+(IM-1)/NTAB,EPS=1.2e-7,RNMX=1.-EPS) 

评论(为游离型,看看书的原件)

其次,循环与数字标签和一个做循环DO循环的一个奇怪的组合end do

do 11 j=NTAB+8,1,-1 
... 
enddo 11 

应该是

do j=NTAB+8,1,-1 
... 
enddo 

do 11 j=NTAB+8,1,-1 
... 
11 continue 

有可能存在更多的问题。

+0

奇怪的数字'do/enddo'构造在“FORTRAN 77中的数字食谱”中。该书还对该行进行了评论,这些评论并不意味着被复制为代码的一部分。 (没有!在书评中,所以他们不是有效的固定或自由形式的评论) – agentp