我正在尝试使用旧的Fortran代码来处理数据。我没有使用Fortran的经验,也无法解决我认为与数字类型有关的问题。
我正在使用的部分代码在此问题的底部。我很确定,但不确定,倒数第二行(也是本文的倒数第二行)是问题所在。
首先,我这样做:
gfortran -g cpt_ir_.f90 -o cpt_ir_.o
./cpt_ir_.o < di.in
导致此错误:
Backtrace for this error:
#0 0x2B794A134467
#1 0x2B794A134AAE
#2 0x2B794ABC724F
#3 0x2B794A1FB8AB
#4 0x2B794A1F7613
#5 0x2B794A1F934E
#6 0x2B794A1FDF86
#7 0x40128A in MAIN__ at cpt_ir_.f90:29
Segmentation fault
我搜索了堆栈溢出,并看到了建议执行以下操作以获取更多信息:
gfortran -g -fcheck=all -Wall cpt_ir_.f90
输出直接显示在下面。 Fmax ...行是我在本文结尾处粘贴的代码的最后一行(代码中还有其他类似的行)。但是,我看到它显示为警告,而不是错误。因此,尽管我在这里进行的处理似乎是the错误,但也许还有另一个问题,上面的命令没有显示。
cpt_ir_.f90:66.5:
Fmax=N*((4000.0/(2.0*Pi))*(2.0*Pi*timestep*1.0-15.0*29979245800.0))
1
Warning: Possible change of value in conversion from REAL(8) to INTEGER(4) at (1)
我在堆栈溢出处遇到了使用以下标志的建议:
-fdefault-integer-8 -fno-range-check
我做了如下操作:
gfortran -g -fdefault-integer-8 -fno-range-check cpt_ir_.f90 -o cpt_ir_.o
我不确定我是否做得正确。我也一一尝试。无论如何,没有变化,我得到了同样的错误。我还尝试手动更改问题行中的数字,如本文最后一行所示。这也无济于事-我收到一个错误,即最大整数对于int而言太大。
[如果有人可以指出正确的方向,我将非常感激。如果对此问题有更多合适的标签,也请随时更改我的标签。
cpt_ir_.f90:
!
!
IMPLICIT NONE
INTEGER, PARAMETER :: dp=KIND(0.0D0)
REAL(KIND=dp), DIMENSION(:), ALLOCATABLE :: correlation
REAL(KIND=dp) :: integral,omega,Pi,timestep
REAL(KIND=dp), DIMENSION(3,1000000) :: dipder,dip
REAL(KIND=dp), DIMENSION(3) :: m_vec
INTEGER :: N,I,J,Nmax,Fmax
CHARACTER(LEN=100) :: line,filename
Pi=4.0D0*ATAN(1.0D0)
READ(5,*) filename
READ(5,*) timestep
OPEN(10,FILE=filename)
N=0
DO
READ(10,'(A100)',END=999) line
IF (INDEX(line,' XXX').NE.0) THEN
! N=N+1
READ(line(45:),*) dip(:,N)
ENDIF
IF (INDEX(line,' XXX').NE.0) THEN
N=N+1
READ(line(45:),*) dipder(:,N)
ENDIF
ENDDO
999 CONTINUE
CLOSE(10)
Nmax=N/10
print *, Nmax
ALLOCATE(correlation(0:Nmax))
correlation=0.0_dp
DO I=1,N-Nmax
DO J=I,I+Nmax
correlation(J-I)=correlation(J-I)+DOT_PRODUCT(dipder(:,I),dipder(:,J))
ENDDO
ENDDO
DO I=0,Nmax
correlation(I)=correlation(I)/(REAL(N-I,kind=dp)*REAL(N,kind=dp))
ENDDO
OPEN(UNIT=10,FILE="dip_dip_correlation.time")
write(10,*) "XXX"
DO I=-Nmax,Nmax
write(10,*) I*timestep,correlation(ABS(I))/correlation(0)
ENDDO
CLOSE(10)
OPEN(UNIT=10,FILE="XXX")
write(10,*) "XXX"
!Fmax up to 4000 cm^-1
Fmax=N*((4000D0/(2*Pi))*(2.0D0*Pi*timestep*1.0D-15*29979245800.0))
! My try: Fmax=N*((4000.0/(2.0*Pi))*(2.0*Pi*timestep*1.0-15.0*29979245800.0))
您的电话一目了然
READ(line(45:),*) dip(:,N)
是第一个问题。注释掉N=N+1
行,使N =0。Fortran索引为'1',表示除非另有说明,否则Fortran数组从1开始。因此,dip的第二维从1开始,您正在尝试设置不存在的'zeroth'元素。