[讨论]FORTRAN77非标函数和高斯随机数
[size]最近在改一个FORTRAN77的老程序,遇到非标准函数LGBUF(扩展I/Obuffer的)和GRAN(产生高斯随机数的),cvf里没有类似功能的函数啊,怎么办啊,附上部分源程序,GRAN()函数我自己编了一个,大家看下对不:
PROGRAM FTURB
DIMENSION LABL(10),LBUF(128)
COMPLEX X(512),Y(512)
COMMON N1M,N2M,N3M,INPUT,ICART
INTEGER*4 N1M,N2M,N3M
CALL LGBUF(LBUF,128)
INPUT=1
ICART=34
ROOT2=SQRT(2.)
WRITE(INPUT,9999)
9999 FORMAT(11HOUTPUT LU=?)
READ(INPUT,9998) LUOUT
9998 FORMAT(I4)
WRITE(INPUT,9997)
9997 FORMAT(7HN1MAX=?)
READ(INPUT,9998) N1MAX
WRITE(INPUT,9996)
9996 FORMAT(7HN2MAX=?)
READ(INPUT,9998) N2MAX
WRITE(INPUT,9995)
9995 FORMAT(7HN3MAX=?)
READ(INPUT,9998) N3MAX
WRITE(INPUT,9994)
9994 FORMAT(5HFS1=?)
READ(INPUT,9993) FS1
9993 FORMAT(F10.0)
WRITE(INPUT,9992)
9992 FORMAT(5HFS2=?)
READ(INPUT,9993) FS2
WRITE(INPUT,9991)
9991 FORMAT(5HFS3=?)
READ(INPUT,9993) FS3
WRITE(INPUT,9986)
9986 FORMAT(38H ENTER VELOCITY COMPONENT (1, 2, OR 3))
READ(1,9985) II
9985 FORMAT(I1)
N1M=N1MAX
N2M=N2MAX
N3M=N3MAX
MREC=N1MAX*N2MAX*N3MAX/32
MREC=N1M*N2M*N3M/32
WRITE(1,8887) MREC
8887 FORMAT(7HMAXREC=,I7,25H ENTER FILE TO BE OPENED)
READ(1,8886) (LABL(I),I=1,10)
8886 FORMAT(10A2)
OPEN(ICART,FILE=LABL,IOSTAT=IOS,STATUS='NEW',ERR=99,RECL=256,
* BLOCKSIZE=64,BUFFERCOUNT=128,BUFFERED='YES',
* FORM='UNFORMATTED',ACCESS='DIRECT',MAXREC=MREC)
DF1=FS1/FLOAT(N1MAX)
DF2=FS2/FLOAT(N2MAX)
DF3=FS3/FLOAT(N3MAX)
N1D2=N1MAX/2
N2D2=N2MAX/2
N3D2=N3MAX/2
DDDF=DF1*DF2*DF3
X1MAX=FLOAT(N1MAX)
X2MAX=FLOAT(N2MAX)
X3MAX=FLOAT(N3MAX)
FFF=FS1*FS2*FS3
SIGXK=SQRT(X1MAX*X2MAX*X3MAX/2.)/FFF
P=PHIU(0.,0.,0.,II)
SUM=P
H=SQRT(FFF*P)
X(1)=SIGXK*ROOT2*H*CMPLX(GRAN(),0. )
。。。。
FUNCTION GRAN()
REAL XX,GRAN
PI=4.*ATAN(1.)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(XX)
GRAN=SQRT(-2*LOG(XX))*COS(2**XX)
RETURN
END
[/size]
PROGRAM FTURB
DIMENSION LABL(10),LBUF(128)
COMPLEX X(512),Y(512)
COMMON N1M,N2M,N3M,INPUT,ICART
INTEGER*4 N1M,N2M,N3M
CALL LGBUF(LBUF,128)
INPUT=1
ICART=34
ROOT2=SQRT(2.)
WRITE(INPUT,9999)
9999 FORMAT(11HOUTPUT LU=?)
READ(INPUT,9998) LUOUT
9998 FORMAT(I4)
WRITE(INPUT,9997)
9997 FORMAT(7HN1MAX=?)
READ(INPUT,9998) N1MAX
WRITE(INPUT,9996)
9996 FORMAT(7HN2MAX=?)
READ(INPUT,9998) N2MAX
WRITE(INPUT,9995)
9995 FORMAT(7HN3MAX=?)
READ(INPUT,9998) N3MAX
WRITE(INPUT,9994)
9994 FORMAT(5HFS1=?)
READ(INPUT,9993) FS1
9993 FORMAT(F10.0)
WRITE(INPUT,9992)
9992 FORMAT(5HFS2=?)
READ(INPUT,9993) FS2
WRITE(INPUT,9991)
9991 FORMAT(5HFS3=?)
READ(INPUT,9993) FS3
WRITE(INPUT,9986)
9986 FORMAT(38H ENTER VELOCITY COMPONENT (1, 2, OR 3))
READ(1,9985) II
9985 FORMAT(I1)
N1M=N1MAX
N2M=N2MAX
N3M=N3MAX
MREC=N1MAX*N2MAX*N3MAX/32
MREC=N1M*N2M*N3M/32
WRITE(1,8887) MREC
8887 FORMAT(7HMAXREC=,I7,25H ENTER FILE TO BE OPENED)
READ(1,8886) (LABL(I),I=1,10)
8886 FORMAT(10A2)
OPEN(ICART,FILE=LABL,IOSTAT=IOS,STATUS='NEW',ERR=99,RECL=256,
* BLOCKSIZE=64,BUFFERCOUNT=128,BUFFERED='YES',
* FORM='UNFORMATTED',ACCESS='DIRECT',MAXREC=MREC)
DF1=FS1/FLOAT(N1MAX)
DF2=FS2/FLOAT(N2MAX)
DF3=FS3/FLOAT(N3MAX)
N1D2=N1MAX/2
N2D2=N2MAX/2
N3D2=N3MAX/2
DDDF=DF1*DF2*DF3
X1MAX=FLOAT(N1MAX)
X2MAX=FLOAT(N2MAX)
X3MAX=FLOAT(N3MAX)
FFF=FS1*FS2*FS3
SIGXK=SQRT(X1MAX*X2MAX*X3MAX/2.)/FFF
P=PHIU(0.,0.,0.,II)
SUM=P
H=SQRT(FFF*P)
X(1)=SIGXK*ROOT2*H*CMPLX(GRAN(),0. )
。。。。
FUNCTION GRAN()
REAL XX,GRAN
PI=4.*ATAN(1.)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(XX)
GRAN=SQRT(-2*LOG(XX))*COS(2**XX)
RETURN
END
[/size]
[此贴子已经被作者于2012-5-11 10:59:05编辑过]