气象信息系统工程 - fortran语言篇
《气象信息系统工程》一命速通Hands on Fortran & OpenGrads
Fortran与OpenGrads
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 nonereal 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 马格努斯经验公式计算饱和水汽压
其中
program main implicit nonereal e0, e1, e2, e3, t parameter:: e0=6.11e1=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月', av5300 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