2016-02-29 7 views
0

Я пытаюсь использовать ran1 из Numerical Recipes в моем коде FORTRAN 90. Я думаю, что общий способ состоит в том, чтобы скомпилировать старую подпрограмму отдельно, а затем использовать объектный файл. Но здесь я хочу знать, какие изменения необходимо использовать непосредственно в моем коде.Использование ran1 FORTRAN 77 подпрограмма в FORTRAN 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-летним ребенком. Когда я помещаю внутри модуля, я получаю много ошибок, например 'error # 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) 

(преобразован в свободной форме, можно найти в книге для оригинала)

Во-вторых, цикл представляет собой странное сочетание петли делать с цифровой меткой и сделать петлю с 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 находится в разделе «ЧИСЛЕННЫЕ РЕЦЕПТЫ В ФОРТРАНЕ 77». Книга также добавляет комментарии к строке, которые не должны копироваться как часть кода. (нет комментариев в книге, поэтому они не являются действительными исправлениями или комментариями бесплатной формы) – agentp

Смежные вопросы