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