Fortran 程序设计 实习02

题目要求

​ 现有南海区域内 ( 115 − 120 ˚ E , 5 − 10 ˚ N ) (115-120˚E,5-10˚N) (115120˚E510˚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˚E117.5˚E120˚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˚N4.43.53.2
7.5˚N5.84.53.6
10˚N6.64.93.3

​ 2002年5月、6月850hPa径向风场V

115˚E117.5˚E120˚E
5月5˚N1.62.01.8
7.5˚N1.41.61.1
10˚N1.30.90.3
6月5˚N2.52.72.2
7.5˚N2.52.62.0
10˚N3.13.52.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

到这里,我们就实现了本次实习所要求的全部任务了。
感谢阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值