题目要求
现有南海区域内 ( 115 − 120 ˚ E , 5 − 10 ˚ N ) (115-120˚E,5-10˚N) (115−120˚E,5−10˚N) 分辨率为 2.5 ˚ × 2.5 ˚ 2.5˚\times2.5˚ 2.5˚×2.5˚ 的 850 h P a 850hPa 850hPa 水平风场 U U U、 V V V 逐月资料,时间为2002年5月和6月。编写程序完成以下要求:
(1)利用 data
语句赋予数组初始值;
(2)计算各格点的风速度 ;
(3)输出2002年5月和6月各格点风速度,输出格式要求:从南向北、自西向东,类似于表格样式,一行为一个纬度的数据。
输入数据
2002年5月、6月850hPa纬向风场U
115˚E | 117.5˚E | 120˚E | ||
---|---|---|---|---|
5月 | 5˚N | -0.7 | -1.1 | -1.2 |
7.5˚N | -2.9 | -2.7 | -2.1 | |
10˚N | -3.4 | -3.0 | -2.5 | |
6月 | 5˚N | 4.4 | 3.5 | 3.2 |
7.5˚N | 5.8 | 4.5 | 3.6 | |
10˚N | 6.6 | 4.9 | 3.3 |
2002年5月、6月850hPa径向风场V
115˚E | 117.5˚E | 120˚E | ||
---|---|---|---|---|
5月 | 5˚N | 1.6 | 2.0 | 1.8 |
7.5˚N | 1.4 | 1.6 | 1.1 | |
10˚N | 1.3 | 0.9 | 0.3 | |
6月 | 5˚N | 2.5 | 2.7 | 2.2 |
7.5˚N | 2.5 | 2.6 | 2.0 | |
10˚N | 3.1 | 3.5 | 2.8 |
题目分析
按照题目给出的数据格式,我们需要定义若干个数组存放数据,这里由于区域是给定的,所以我们将经纬度做成两个数组存放,再做两个数组存放原始风速数据,最后做一个数组存放计算之后需要输出的数据。
数组的定义可以参照学习通内 5.1节 进行。它给出了三种可供选择的方式:
(1)integer a(-5:5),b(20),c(2,3) !缺省声明数组关键字,直接声明数组数据类型与数组大小 (2)dimension a(-5:5),b(3,5) !先声明数组大小,再声明数组的数据类型 integer a real b (3)integer,dimension :: a(-5:5) !第一种方式缺省的内容补充完整的声明方式,多重关键字定义时,需要加 :: 进行声明 real, dimension(2:25):: b,c
定义数组完成之后,我们使用data
语句对所定义的数组进行赋初始值。
data
语句赋初值的方式可以参照学习通内5.4节进行,其给出了data语句赋变量初值、数组初值的方式(1)使用data语句赋初值 data 变量列表/初值列表/ !数组定义完成之后给数组赋初值 integer a(5) data a/1,2,3,4,5/ (2)使用数组赋值符赋初值 !在定义数组的时候同时赋初值 类型说明::数组名(维数说明)=(/初值列表/) integer:: a(5)=(/1,2,3,4,5/)
到这里,我们就已经完成了数组的设定及初值的存储了,接下来我们来完成此次实习的第二个任务:计算各格点的实际风速大小。由于风场是一个矢量场,所以我们不可以直接将题目给出的两个风场直接相加,而是利用平行四边形法则对给出的径向及纬向风场做矢量相加,大小方向都是这样的。
这里我们很轻易就可以得到风速大小的计算公式如下:
w
i
n
d
(
i
,
j
)
=
u
(
i
,
j
)
2
+
v
(
i
,
j
)
2
wind(i,j)=\sqrt{u(i,j)^2+v(i,j)^2}
wind(i,j)=u(i,j)2+v(i,j)2
因为每个格点的操作都是同样的,所以我们只需要做一个二重循环,将风速计算出来就可以了。
循环结构的书写方法可以参考学习通 4.3节 进行,其给出了两种循环的书写方法。
循环结构:直到循环(DO循环)&当型循环(DO WHILE循环)
DO V=E1,E2 [,E3] !这里E1、E2是循环变量的起始值与终止值,E3是循环变量的步长,Fortran的循环隐藏了v=v+E3这个语句,可以类比C中的for(V=E1;V<E2;V=V+E3){} 循环体 END DO
DO WHILE (逻辑表达式) 循环体 END DO
已经循环次数时建议使用DO循环,不确定循环次数,需要进行判断时建议使用DO WHILE循环;
循环结构与选择结构一样可以相互嵌套。
这样我们就完成了实际风场大小的计算了,接下来我们只需要按照我们的需要进行数据输出就可以了。由于观察到表格内的数据的格式都是一位小数或没有小数,所以我们就需要对结果进行格式化输出。格式化输出可以参考以下代码:
print *,'V(单位:m/s)'
print '(3X,3f3.1)',(a(i,6),i=1,3)
do i=1,3
print '(5X,2f9.1)',b(5,i),(wind(i,j),j=2,6)
end do
到这里,我们就实现了本次实习所要求的全部任务了。
感谢阅读。