저는 오래된 과학자에게 몇 가지 문제를 돕고 있으며 발견 한 프로그램이 1 개 있고 이 약 20 세가 수정되었습니다. 전, 그리고 32 비트 운영 체제로 \ 2 실행 파일로 잘 실행하지만 그게 dos에서 실행해야합니다! 나는 프로그래머가 아니지만 좋은 하드웨어이다. & 소프트웨어 맨이다. 나는이 문제에 대해 어리 석다. 컴파일러 watcom77, silverfrost ftn95, gfortran, g77 및 f80의 2 가지 버전을 다운로드했다. Watcom 은 구식 컴파일러를 찾고 silverfrost가 열어 디버그 등을 수행하지만 모든 서브 루틴을 "real"에서 "complex"및 vice-vesa로 변경하고 g77은 완벽하게 설치하는 것 같습니다 (도서관 링크 등)하지만 심지어 컴파일 test.f programs.My 문제는 1; 코드를 "있는 그대로"또는 "업그레이드"하려면 다시 컴파일 하시겠습니까? 프로그램은 xconvlv INTEGER N, N2, Mos 2 용으로 컴파일 된 오래된 fortran 2/4 66 프로그램을 다시 컴파일하면 DOS에서 실행해야합니다.
PARAMETER (N=2048,N2=2048,M=128)
INTEGER i,isign
REAL data(n),respns(m),resp(n),ans(n2),t3(n),DUMMY
OPEN(UNIT=1, FILE='C:\QKBAS20\FDATA1.DAT')
DO 1 i=1,N
READ(1,*) T3(i), data(i), DUMMY
continue
CLOSE(UNIT-1)
do 12 i=1,N
respns(i)=data(i)
resp(i)=respns(i)
continue
isign=-1
call convlv(data,N,resp,M,isign,ans)
OPEN(UNIT=1,FILE='C:\QKBAS20\FDATA9.DAT')
DO 14 i=1,N
WRITE(1,*) T3(i), ans(i)
continue
END
SUBROUTINE CONVLV(data,n,respns,m,isign,ans)
INTEGER isign,m,n,NMAX
REAL data(n),respns(n)
COMPLEX ans(n)
PARAMETER (NMAX=4096)
* uses realft, twofft
INTEGER i,no2
COMPLEX fft (NMAX)
do 11 i=1, (m-1)/2
respns(n+1-i)=respns(m+1-i)
continue
do 12 i=(m+3)/2,n-(m-1)/2
respns(i)=0.0
continue
call twofft (data,respns,fft,ans,n)
no2=n/2
do 13 i=1,no2+1
if (isign.eq.1) then
ans(i)=fft(i)*ans(i)/no2
else if (isign.eq.-1) then
if (abs(ans(i)) .eq.0.0) pause
ans(i)=fft(i)/ans(i)/no2
else
pause 'no meaning for isign in convlv'
endif
continue
ans(1)=cmplx(real (ans(1)),real (ans(no2+1)))
call realft(ans,n,-1)
return
END
SUBROUTINE realft(data,n,isign)
INTEGER isign,n
REAL data(n)
* uses four1
INTEGER i,i1,i2,i3,i4,n2p3
REAL c1,c2,hli,hir,h2i,h2r,wis,wrs
DOUBLE PRECISION theta,wi,wpi,wpr,wr,wtemp
theta=3.141592653589793d0/dble(n/2)
cl=0.5
if (isign.eq.1) then
c2=-0.5
call four1(data,n/2,+1)
else
c2=0.5
theta=-theta
endif
(etc.,etc., etc.)
SUBROUTINE twofft(data,data2,fft1,fft2,n)
INTEGER n
REAL data1(n,data2(n)
COMPLEX fft1(n), fft2(n)
* uses four1
INTEGER j,n2
COMPLEX h1,h2,c1,c2
c1=cmplx(0.5,0.0)
c2=cmplx(0.0,-0.5)
do 11 j=1,n
fft1(j)=cmplx(data1(j),data2(j)
continue
call four1 (fft1,n,1)
fft2(1)=cmplx(aimag(fft1(1)),0.0)
fft1(1)=cmplx(real(fft1(1)),0.0)
n2=n+2
do 12 j=2,n/2+1
h1=c1*(fft1(j)+conjg(fft1(n2-j)))
h2=c2*(fft1(j)-conjg(fft1(n2-j)))
fft1(j)=h1
fft1(n2-j)=conjg(h1)
fft2(j)=h2
fft2(n2-j)=conjg(h2)
continue
return
END
SUBROUTINE four1(data,nn,isign)
INTEGER isign,nn
REAL data(2*nn)
INTEGER i,istep,j,m,mmax,n
REAL tempi,tempr
DOUBLE PRECISION theta, wi,wpi,wpr,wr,wtemp
n=2*nn
j=1
do 11 i=1,n,2
if(j.gt.i)then
tempr=data(j)
tempi=data(j+1)
(etc.,etc.,etc.,)
continue
mmax=istep
goto 2
endif
return
END
코드의 약 3 페이지입니다 누군가에 훨씬 쉽게 하는 전자 메일 수 whould이 4 개 서브 루틴이있는 경우 자신이 나를 도울 수 . 내 전자 메일은 [email protected]이거나, 누군가가 이것을 다시 컴파일 할 수있는 "작동하는" 컴파일러를 어디서 얻을 수 있는지 말해 줄 수 있습니까? 고맙습니다, 고맙습니다. 고맙습니다. 감사합니다. 내가 얻는 오류는 있습니다. 1. 다른 프로 시저에서 CONVLV를 호출하면 첫 번째 인수는 REAL (kind = 1) 유형이고 이제는 COMPLEX (kind = 1) 입니다. 2. 다른 프로 시저에서 REALFT를 호출 할 때. .. COMPLEX (kind = 1) 이제 REAL (kind = 1) 3. 복합체 (kind-1)에서 TWOFFT를 호출하면 현재 REAL (kind = 1) 4입니다. FOUR1에 대한 이전 호출에서 첫 번째 인수는 유형 REAL (kind = 1) 이었으며 이제는 COMPLEX (kind = 1)입니다.
ypur 응답에 감사드립니다. 여기에 acsess violtions가 있습니다. –