有关于Fortran的一个问题

写的Fortran程序,发现里面出现匪夷所思的问题
(本人初上手Fortran还不太熟练)

program density
    implicit none
    open(unit=20,file="density.txt")
    real(kind=8) :: step
    !步长
    real(kind=8) :: rho0_o,   rho0_ca,    rho0_ni,    rho0_sn
    !归一化常数
    real(kind=8) :: c_o, z_o, c_ca, z_ca, c_ni, z_ni, c_sn, z_sn
    !二参数
    real(kind=8) :: r
    real(kind=8) :: rho_o, rho_ca, rho_ni, rho_sn
    !核子半径以及相应的密度
    real(kind=8) :: range_o, range_ca, range_ni, range_sn
    !核子半径的积分范围
    rho0_o=0.090592
    rho0_ca=0.086452
    rho0_ni=0.081731
    rho0_sn=0.070291
    !上一个程序得到的归一化常数填入
    range_o=4.0
    range_ca=6.0
    range_ni=8.0
    range_sn=12.0
    !核半径范围
    c_o=2.608
    z_o=0.513
    c_ca=3.766
    z_ca=0.586
    c_ni=4.3092
    z_ni=0.5169
    c_sn=5.358
    z_sn=0.550
    !二参数
    step=0.001
    !步长
    write(20,*)"density of O" 
    do r=0,range_o,step
        rho_o=rho0_o/(1+exp((r-c_o)/z_o))
        write(20,*)r,rho_o
    end do
    !O的核子密度
    write(20,*)"density of Ca" 
    do r=0,range_ca,step
        rho_ca=rho0_ca/(1+exp((r-c_ca)/z_ca))
        write(20,*)r,rho_ca
    end do
    !Ca的核子密度
    write(20,*)"density of Ni" 
    do r=0,range_ni,step
        rho_ni=rho0_ni/(1+exp((r-c_ni)/z_ni))
        write(20,*)r,rho_ni
    end do
    !Ni的核子密度
    write(20,*)"density of Sn" 
    do r=0,range_sn,step
        rho_sn=rho0_sn/(1+exp((r-c_sn)/z_sn))
        write(20,*)r,rho_sn
    end do
    !Sn的核子密度
    stop
    end program

报错是这样的:

img

这个错误通常出现在使用了未定义类型的变量或未正确声明变量类型的情况下。

可能的原因是:

变量名拼写错误。
变量没有声明。
在使用变量之前未定义变量的类型。
在使用变量之前,没有正确包含需要的头文件或模块。
您可以尝试检查您的代码中是否存在这些问题,并进行修复。

fortran代码要求,在每个单元(函数)里,所有申明代码必须在执行代码之前。你需把第三行open放在14行以后。