Function 我能';我不知道如何正确地将模块中的信息调用到程序中,并使计算工作正常?

Function 我能';我不知道如何正确地将模块中的信息调用到程序中,并使计算工作正常?,function,module,fortran,subroutine,Function,Module,Fortran,Subroutine,基本上,我要做的是读取一个名为“soning.txt”的文件,该文件包含100行数据。我正在读取数据,并根据数据进行不同的计算。我在计算冰点(FRZ)、700毫巴时的露点下降(Tdd700)、总量(TT)、K指数(KI)和出汗量(SW)。然后,我应该将该值输出到一个新的数据文件中。计算结果显示在代码中,似乎大部分内容都是正确的,但在编译所有内容时,我遇到了一些错误。终端错误表示符号“Tdd700”与模块“soundingcalcs”的符号冲突,即符号“T700”没有隐式类型,符号“Td700”没

基本上,我要做的是读取一个名为“soning.txt”的文件,该文件包含100行数据。我正在读取数据,并根据数据进行不同的计算。我在计算冰点(FRZ)、700毫巴时的露点下降(Tdd700)、总量(TT)、K指数(KI)和出汗量(SW)。然后,我应该将该值输出到一个新的数据文件中。计算结果显示在代码中,似乎大部分内容都是正确的,但在编译所有内容时,我遇到了一些错误。终端错误表示符号“Tdd700”与模块“soundingcalcs”的符号冲突,即符号“T700”没有隐式类型,符号“Td700”没有隐式类型,并且我的参数“T850”在“KI=KI_calc(听起来)”中存在秩不匹配。我不确定我做错了什么,我希望得到任何帮助或建议。 我的模块:

MODULE soundingcalcs

IMPLICIT NONE

 REAL ::  Tdd700, TT, T850, T500, Td850, T700, Td700
 REAL :: V850, V500, dd500, dd850

   contains

   ! This is where the internal module is located

   !##################################################################
   !This functions will calculate the K-Index.
   ! 
   !Accepts: temperature and dew point at different levels
   !Returns: KI-Index
   !#################################################################

  FUNCTION ki_calc(T850,T500,Td850,Tdd700)

  ! Calculate K-Index

  REAL, INTENT(IN) :: T850,T500,Td850,Tdd700
  REAL:: ki_calc

  ki_calc=((T850)-(T500))+(Td850)-(Tdd700)

  END FUNCTION ki_calc

  !################################################################
  !This subroutine will calculate the SWEAT Index
  !
  !Accepts: Total Totals, wind speed, dew point, and temperature
  !Returns: SWEAT Index value
  !################################################################

  SUBROUTINE sw_calc(Td850,TT,V850,V500,dd500,dd850)

  ! Calculate SWEAT Index

  REAL, INTENT(IN):: Td850,V850,V500,dd500,dd850
  REAL:: sw_value, TT

 sw_value=12.0*(Td850)+20.0*((TT)-49.0)+2.0*(V850) &
   +(V500)+125.0*(sin((dd500)-(dd850))+0.2)

  END SUBROUTINE sw_calc

 END MODULE soundingcalcs
我的主要节目:

USE soundingcalcs

IMPLICIT NONE

CHARACTER(20), PARAMETER :: datafile = "sounding.txt"
CHARACTER(20), PARAMETER :: outfile = "hw9_NEIFERT.out"
CHARACTER(3) :: stname
REAL :: lat, long, elev, pres, temp, dewp, winddir, sw_value
REAL :: windspd, FRZ=0, MW=0, windmax, Td500, SW, KI
REAL :: T700, Td700, Tdd700, TT850, T500, Td850
REAL, DIMENSION(5,100) :: sounding
REAL, PARAMETER :: pi = 3.14159
INTEGER :: OpenStat=0, InputStat=0, day, mth, yr, hr, stnum
INTEGER :: count=0, i, j, log=0
INTEGER, PARAMETER :: flag = -999

sounding=flag

! Open the GEMPAK sounding file

open (unit=2, file=datafile, status="old", iostat=OpenStat)
IF (OpenStat > 0) STOP "Can't open file"

! Read in header and then read in data as array

read (unit=2, FMT="(8x,A3,15x,I8,10x,I2,I2,I2,1x,I4)") &
   stname, stnum, yr, mth, day, hr

read (unit=2, FMT="(8x,F6.2,14x,F6.2,10x,F7.1)") &
   lat, long, elev

read (unit=2, FMT="(////)")

read (unit=2, FMT=*, iostat=InputStat) sounding

! Set counter and maximum wind speed

DO i=1,100
  temp=sounding(2,i)
  IF (temp==flag) EXIT
  count=count+1
END DO

windmax=MAXVAL(sounding(5,:))

! Find temp, dew point, wind speed, directions

DO j=1, count
  pres=sounding(1,j)
  temp=sounding(2,j)
  dewp=sounding(3,j)
  winddir=sounding(4,j)
  windspd=sounding(5,j)

 IF (temp <= 0 .AND. log == 1) THEN
    FRZ=pres
    log=2
 END IF

  IF (pres == 850) THEN
    T850=temp
    Td850=dewp
    V850=windspd
    dd850=(((winddir)*(pi))/(180))
  END IF

  IF (pres == 700) THEN
    T700=temp
    Td700=dewp
  END IF

  IF (pres == 500) THEN
    T500=temp
    Td500=dewp
    V500=windspd
    dd500=(((winddir)*(pi))/(180))
  END IF

  IF (windspd==windmax) MW=pres

END DO

! Calculate 700 millibars dew point depression

Tdd700=(T700)-(Td700)

! Calculate the Total Totals

TT=((T850)-(T500))+((Td850)-(T500))

! Convert function and subroutine module subprograms into working 
! output values

KI=ki_calc(sounding)

! Open a file to output data

open (unit=3, file=outfile, status="new", iostat=OpenStat)
IF (OpenStat > 0) STOP "Cannot open file"

! Output header and values

write (unit=3, FMT="(6x,A15,4x,A3,10x,A11,1x,I8)") "Station ID:", &
stname, "Station #:", stnum

write (unit=3, FMT="(6x,A15,2x,I2,A1,I2,A1,I2,7x,A11,1x,I4,1x,A3)") &
"Date(MM/DD/YY):", mth, "/", day, "/", yr, "Time:", hr, "Z"

write (unit=3, FMT="(/A10,1x,F6.2,1x,A3,3x,A11,1x,F6.2,1x,A3,3x,&    
A11,1x,F8.2,1x,A1)")"Latitude:", lat, "deg", "Longitude:", long, "deg",&
"Elevation:", elev, "m"

write (unit=3, FMT="(/A16,1x,F6.2,1x,A2)") "Freezing Level:",FRZ,"mb"
write (unit=3, FMT="(A16,1x,F6.2,1x,A38)") "Total Totals:", TT
write (unit=3, FMT="(A16,1x,F6.2,1x,A38)") "K-Index:",KI
write (unit=3, FMT="(A16,1x,F6.2,1x,A2)") "SWEAT Index:", sw_value
write (unit=3, FMT="(A16,1x,F6.2,1x,A2)") "Max Wind Level:", MW, "mb"

! Close files

close(3)

close(2)

END PROGRAM sound_calc
使用soundingcalcs
隐式无
字符(20),参数::datafile=“soning.txt”
字符(20),参数::outfile=“hw9_NEIFERT.out”
字符(3)::stname
真实值:纬度、经度、标高、压力、温度、露点、风径、sw_值
REAL::WindPd,FRZ=0,MW=0,windmax,Td500,西南,KI
REAL::T700、Td700、Tdd700、TT850、T500、Td850
真实尺寸(5100)::测深
实数,参数::pi=3.14159
整数::OpenStat=0,InputStat=0,天,月,年,小时,stnum
整数::计数=0,i,j,log=0
整数,参数::标志=-999
发声=旗帜
!打开GEMPAK文件
打开(单位=2,文件=datafile,status=“old”,iostat=OpenStat)
如果(OpenStat>0)停止“无法打开文件”
!读入标头,然后以数组形式读入数据
读取(单位=2,FMT=“(8x、A3、15x、I8、10x、I2、I2、I2、1x、I4)”)&
stname,stnum,yr,mth,day,hr
读取(单位=2,FMT=“(8x,F6.2,14x,F6.2,10x,F7.1)”)&
拉长
读取(单位=2,FMT=“(/)”)
读取(单位=2,FMT=*,iostat=InputStat)探测
!设置计数器和最大风速
i=1100吗
温度=测深(2,i)
如果(临时==标志)退出
计数=计数+1
结束
windmax=MAXVAL(探测(5,:))
!查找温度、露点、风速、方向
j=1,计数吗
压力=测深(1,j)
温度=测深(2,j)
dewp=测深(3,j)
winddir=测深(4,j)
windspd=测深(5,j)
如果(临时0)停止“无法打开文件”
!输出标题和值
写入(单位=3,FMT=“(6x,A15,4x,A3,10x,A11,1x,I8)”)站点ID:&
stname,“车站:”,stnum
写入(单位=3,FMT=“(6x,A15,2x,I2,A1,I2,A1,I2,7x,A11,1x,I4,1x,A3)”)&
“日期(年月日):”,mth,“/”,day,“/”,yr,“时间:”,hr,“Z”
写入(单位=3,FMT=“(/A10,1x,F6.2,1x,A3,3x,A11,1x,F6.2,1x,A3,3x,&
A11,1x,F8.2,1x,A1)“纬度:”,纬度,“度”,“经度:”,长,“度”&
标高:,标高,“m”
写入(单位=3,FMT=“(/A16,1x,F6.2,1x,A2)”)“冻结水平:”,FRZ,“mb”
写入(单位=3,FMT=“(A16,1x,F6.2,1x,A38)”)总计:,TT
写入(单位=3,FMT=“(A16,1x,F6.2,1x,A38)”)“K-Index:”,KI
写入(单位=3,FMT=“(A16,1x,F6.2,1x,A2)”)“汗水指数:”,sw_值
写入(单位=3,FMT=“(A16,1x,F6.2,1x,A2)”)“最大风速:”,兆瓦,“毫巴”
!关闭文件
关闭(3)
关闭(2)
结束程序声音计算

如果
使用该模块,则导入其所有过程、类型和变量

那么错误是什么呢

REAL :: T700, Td700, Tdd700, TT850, T500, Td850
            1
sounding.f90:2.4:

USE soundingcalcs
    2
Error: Symbol 't700' at (1) conflicts with symbol from module 'soundingcalcs', 
use-associated at (2)
说明您声明的变量名已被模块中的另一个变量使用

或者只在模块中声明变量,不导入它,或者如果需要不同的变量,请为其指定不同的名称

例如,您有:

module my_mod
    implicit none
    real :: a = 1.0
contains
    function get_a()
        real :: get_a
        get_a = a
    end function get_a
end module my_mod
然后,如果只需要该过程,则只能导入:

program my_prog
    use my_mod, only: get_a
    real :: a
    a = 3e2
    print *, a
    print *, get_a()
end program my_prog
如果在主程序中需要名为
a
的变量,并且该变量需要与模块的变量不同,并且您还需要访问该模块的变量,则可以执行以下操作:

program my_prog
    use my_mod, only: get_a, b=>a
    implicit none
    real :: a
    a = 1.0
    b = 2.0
    print *, a, get_a()
end program my_prog
第二个错误是由于秩不匹配,简单地说:函数
ki_calc
需要4个标量类型
real
的参数。但是
sounding
是一个二维数组,形状
(5100)

我不知道你想要什么,但也许是

KI=ki_calc(sounding(1, 1), sounding(2, 1), sounding(3, 1), sounding(4, 1))

(这将表明
T850==探测(1,1)
T500==探测(2,1)
,依此类推。)

+1.但是,我不认为在模块中声明更好的函数有什么意义:如果是因为防止更改,可以使用
protected
参数
属性;如果是因为名称冲突,可以使用
use::mymod,b=>a
语法。