2016-02-29 149 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