《气象信息系统工程》一命速通
Hands on Fortran & OpenGrads
Fortran与OpenGrads
Fortran
program main
!example
implicit none
real st1, st2, st3, stave
st1 = 9.5
st2 = 9.0
st3 = 8.7
stave = (st1 + st2 + st3)/3.0
print *, 'stave=', stave
end
气象绘图软件:OpenGrads
用于4D
数据的分析,即经度lon
、纬度lat
、层次lev
和时间time
的4维。
使用流程:准备数据*.grd
-> 数据描述文件*.ctl
-> 脚本文件*.gs
-> 保存结果
Fortran语言基础
数据类型
整数类型 integer
实数类型 real
复数类型 complex
字符类型 character
逻辑类型 logical
常量声明
先声明类型,再用parameter
声明为常量。
program ex
implicit none
real pi
parameter(pi=3.1415926)
write(*, *) sin(pi/6)
end
合法的变量声明
REAL(KIND=4)a,b,c,d !声明KIND值为4的4个实型变量
REAL(8)e !声明KIND值为8的1个实型变量
REAL f !声明KIND值为4(缺省)的1个实型变量
REAL:g=1.23 !声明KND值为4(缺省)的1个实型变量且赋初值为1.23
变量初始化
program ex
integer:: a=1
real:: b=2.0
complex:: c=(1.0,2.0)
character(len=10)::string="FORTRAN"
write(*, *) a,b,c,string
end
作业1 马格努斯经验公式计算饱和水汽压
\[E_1 = E_0 \times 10^{\frac{7.45t}{237.3+t}} \]\[E_2 = E_0 \times e^{\frac{16.67t}{243.5+t}} \]其中\(E_0=6.11hPa\)
program main
implicit none
real e0, e1, e2, e3, t
parameter:: e0=6.11
e1=e0*10**((7.45*t)/(237.3+t))
e2=e0*exp((17.67*t)/(243.5+t))
print *, 'e1=',e1, 'e2=',e2
end
顺序结构
顺序结构:A→B
先执行A,再执行B,先上后下,先左后右(赋值语句先右后左)
表控输入
read *,a,b,c,d
可以从键盘中输入 4,4,24,10
或者中间使用4 4 24 10
则 a=3.7, b=-1.8, c=24, d=10
也可以输入2*4, 24, 10
效果类似
表控输出
print
只能是一计算机系统隐含指定的打印机(或者显示器)进行打印输出,形式为print *[, 输出表]
write
可以指定任意进行打印输出,形式为write (*,*)[, 输出表]
format格式化
program main
implicit none
integer a
a=100
print *, a
print 101, a
101 format(I4)
! 上下两种输出相同
print '(I4)', a
作业2 汛期气象站计算
输入3个气象站5个月(汛期)雨量数据,统计每个气象站的总雨量和平均雨量,计算3个站五月、六月、七月、八月、九月的平均雨量,输出每个气象站每个月的雨量、总雨量和平均雨量,以及五月、六月、七月、八月、九月的平均雨量。
program ex
implicit none
real r11, r12, r13, r14, r15, total11, av11
real r21, r22, r23, r24, r25, total21, av21
real r31, r32, r33, r34, r35, total31, av31
real av1, av2, av3, av4, av5
write (*, "(30X, ' 5月 6月 7月 8月 9月') ")
write (*, "(1X, '输入江阴气象站五个月的雨: ') ")
read (*, *) r11, r12, r13, r14, r15
write (*, "(1X, '输入定波闸气象站五个月的雨量: ') ")
read (*, *) r21, r22, r23, r24, r25
write (*, "(1X, '输入肖山气象站五个月的雨量:')")
read (*, *) r31, r32, r33, r34, r35
total11 = r11 + r12 + r13 + r14 + r15 ! 江阴总雨量
av11 = total11/5 ! 江阴平均雨量
total21 = r21 + r22 + r23 + r24 + r25 ! 定波闸总雨量
av21 = total21/5 ! 定波闸平均雨量
total31 = r31 + r32 + r33 + r34 + r35 ! 肖山总雨量
av31 = total31/5 ! 肖山平均雨量
av1 = (r11 + r21 + r31)/3 ! 5月平均雨量
av2 = (r12 + r22 + r32)/3 ! 6月平均雨量
av3 = (r13 + r23 + r33)/3 ! 7月平均雨量
av4 = (r14 + r24 + r34)/3 ! 8月平均雨量
av5 = (r15 + r25 + r35)/3 ! 9月平均雨量
write (*, "(28X, ' 5月 6月 7月 8月 9月 总雨量 平均雨量') ")
write (*, 200) '江阴气象站五个月的雨量: ', r11, r12, r13, r14, r15, total11, av11
write (*, 200) '定波闸气象站五个月的雨量: ', r21, r22, r23, r24, r25, total21, av21
write (*, 200) '肖山气象站五个月的雨量: ', r31, r32, r33, r34, r35, total31, av31
200 format(1X, A26, 5(F5.1, 2X), F6.1, 2X, F7.3)
write (*, 300) ' 5月', av1, ' 6月', av2, ' 7月', av3, ' 8月', av4, ' 9月', av5
300 format(1X, A4, '平均雨量: ', F7.3)
! 300 format(5(1X,A4, '平均雨量: ',F7.3)) ! 一行输出
end
选择结构
判断输入的 pH 值是否表示酸雨
program main
implicit none
real ph
write (*, *) 'Please enter PH value:'
read *, ph
if (ph < 5.6) then
write (*, 100) ph
else
write (*, 200) ph
end if
100 format(1X, 'PH=', F4.2, ', is acid rain!')
200 format(1X, 'PH=', F4.2, ', is not acid rain!')
end
n2
的值来判断大气的层结类型
program main
implicit none
real n2
write (*, 100)
read (*, *) n2
if (n2 .eq. 0.0) print *, '中性层结'
if (n2 .gt. 0.0) print *, '稳定层结'
if (n2 .lt. 0.0) print *, '不稳定层结'
100 format(1X, 'please input n2:')
end
循环结构
do
循环结构和 do while
循环结构
循环输入一周日最高气温,判断最高气温,并计算一周平均最高气温。2014年3月23日-29日南京日最高气温如下:
16.0 17.0 17.0 18.0 16.0 22.0 24.0(单位:℃)
program main
implicit none
real t, tmax, sum.tave
interger i
tmax = 0.0; sum = 0.0
do i = 1, 7
read *, t
sum = t + sum
if (t >= tmax) then
tmax = t
end if
end do
tave = sum/7.0
print *, 'tmax=', tmax
print *, 'tave=', tave
end
循环输入每六小时降水资料,如果发现数据小于0或者大于1000时,终止循环,并提示输入数据异常。
program main
implicit none
real precip
integer k
print *, '输入每六小时降雨量(mm):'
k = 0
read *, precip
do while (precip .ge. 0.0 .and. precip .le. 1000.0)
k = k + 1
print *, k, '降雨量(mm):', precip
read *, precip
end do
print *, '输入数据异常'
end
输入正整数n,求级数的前n项和,如果当某项绝对值≤10-5时,虽未满n项,也因满足精度而不再加入下一项。
program main
implicit none
integer:: i, n
real:: s = 0, t
read *, n
do i = 1, n
t = 1./(i*(i + 1))
s = s + t
if (abs(t) < 1.e-5) exit
end do
if (i == n + 1) i = i - 1
print *, 'sum=', s, ' term=', i
end
输入3月份气温,缺测记录为999,请统计3月份平均气温
program main
implicit none
real t, tsum, tave
integer i, num
tsum = 0.0
num = 0
do i = 1, 31
read *, t
if (t == 999.0) cycle
tsum = tsum + t
num = num + 1
end do
! if (t /= 999.0) then
! tsum = tsum + t
! num = num + 1
! end if
tave = tsum/num
print *, tave
end
作业3 江淮站点
program main
integer, parameter::ist = 5
real lat, lon
character*8 id
integer i
do i = 1, ist
write (*,"('输入站点的站号, 纬度和经度: ')")
read (*, *) id, lat, lon
if (lon > 109.0 .and. lat >= 28.0 .and. lat <= 34.0) then
write (*, *) id, lat, lon
else
write (*, *) id, '站不位于江淮地区'
end if
end do
end
数组
已知某气象台站7月17日至7月21日每天4个观测时间(即02,08,14,20时刻)的温度观测值,要求编程实现下列功能:
(1) 统计每天的平均温度。
(2) 统计7月17日至21日总的温度平均值。
(3) 输出日平均温度的最高值。
(4) 统计5天中每天4个观测时间的温度平均值。
program main
implicit none
integer, parameter :: m = 5, n = 4
real t(m, n), DAT(m), TAT(n)
data t/28.8, 29.8, 28.7, 29.9, 30.4, 32.9, 31.8, 32.3, 33.4, 32.5, &
36.8, 36.0, 35.1, 36.2, 36.5, 33.2, 31.1, 32.3, 32.7, 25.5/
integer i, j
real aver, RS, CS, MaxT
! 统计总的平均温度
aver = sum(t)/(m*n)
! 统计每天的平均温度
DAT = sum(t, dim=2)/4
! 统计4个观测时次的5天温度平均值
TAT = sum(t, dim=1)/5
! 求每天平均温度的最高值
MaxT = MAXVAL(DAT)
write (*, '(A12,5F7.2)') "日平均温度", DAT
write (*, '(A17,F7.2)') "5天总的平均温度", aver
write (*, '(A27,4F7.2)') "每个观测时次的5天平均温度", TAT
write (*, '(A18,F7.2)') "日平均温度最高值", MaxT
end
子程序
已知上海、南京、武汉三地的气温,编制外部函数子程序计算三地的平均气温
外部子程序
program main
implicit none
external average
real a, b, c, average
read *, a, b, c
print *, "三地平均气温: ", average(a, b, c)
end program
function average(x, y, z)
implicit none
real x, y, z, average
average = (x + y + z)/3 ! 函数名被赋值
end function average
program main
implicit none
external average
rel a, b, c, ave
read *, a, b, c
call average(a, b, c, ave)
print *, "三地平均气温: ", ave
end program
subroutine average(x, y, z, ave)
implicit none
real x, y, z, ave
ave = (x + y + z)/3
end subroutine average
内部子程序
program main
implicit none
real a, b, c
read *, a, b, c
print *, "三地平均气温: ", average(a, b, c)
contains
function average(x, y, z)
implicit none
real x, y, z, average
average = (x + y + z)/3
end function average
end program
program main
implicit none
external average
real a, b, c, ave
read *, a, b, c
call average(a, b, c, ave)
print *, "三地平均气温: ", ave
contains
subroutine average(x, y, z, ave)
implicit none
real x, y, z, ave
ave = (x + y + z)/3
end subroutine average
end program
虚实结合
program main
implicit none
external sub
integer ::a(5) = (/1, 2, 3, 4, 5/), b = 8
call sub(a(3), b)
print "(1x, 'a(3)=', i3/' b=', i3)", a(3), b
end program
subroutine sub(x, y)
implicit none
integer x, y
x = x + 3
y = y + 4
end subroutine sub
变量作用域和生存周期
program main
implicit none
call sub()
call sub()
call sub()
stop
end
subroutine sub()
implicit none
integer :: count = 1
save count
write (*, *) count
count = count + 1
return
end
标签:real,none,end,信息系统,write,fortran,program,implicit,气象
From: https://www.cnblogs.com/moguw/p/18280410