Fortran基础篇——数据读取与变量设置

本文详细介绍了Fortran语言中数据读取的最佳实践,包括数据读取顺序、DO循环与隐式DO循环的区别及应用,文件读取格式问题解析,以及数组与变量设置的注意事项。通过具体案例,帮助读者掌握高效数据处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Fortran读数据顺序

在grads中,系统读取数据效率最高的方式为经度(Lon),维度(Lat),高度(Lev),时次(Time),所以用文件读取数据时,内循环到外循环应该依次为:
X ( L o n ) → Y ( L a t ) → Z ( L e v ) → T ( T i m e ) ( 月 , 年 ) X(Lon)→Y(Lat)→Z(Lev)→T(Time)(月,年) X(Lon)Y(Lat)Z(Lev)T(Time)()
例1:现有已知的位势高度的数据h500.dat,范围:0-40N,60~150E.现用Fortran读入,则程序如下:(nx为经度格点,ny为维度格点,mo为月数,yr为年数)

do l=1,yr
    do k=1,mo
        read(10,*)((hgt(i,j,k,l),i=1,nx),j=1,ny)
    end do
end do

2.Fortran中DO循环和隐式DO循环差别

Fortran中DO循环,读取数据时,read命令只能读取每行的第一个数字,其他的都忽略了,所以容易出错误。但是隐式DO循环或者含隐式的DO循环,则可以读取每一行的其他数据。

例2:现有位势高度的数据h500.dat,范围:0-40N,60-150E,1982.1~1985.12共48个月。其排列方式为
1982,01
5897.1 5897.3 ……
1982,02
5897.1 5897.3 ……
……
即最外层循环为年,接着为月,最里面为经度和维度的循环,从左到右先为经度,然后在纬度,在接着月循环,最后年循环(与上题分析一样)

##DO循环(不可行)
do iy=1,4
	do k=1,12
		do j=1,17
			do i=1,37
   			read(10,*) hgt(i,j,k,iy)
			end do
		end do
	end do
end do
##隐式DO循环(可行)
Read(10,*) ((((hgt(i,j,k,iy),i=1,37),j=1,17),k=1,12),iy=1,4)

由于DO循环中,每次read只能读一行中的第一个数,所以这种读法使得上述的数据不能被读取,除非这个数据只排成一列,这样每次read读下一行的第一个数,可以全部读完所有数据。除了隐式DO循环,还可以用含隐式的DO循环

do iy=1,4
	do k=1,12
   	read(10,*)  ((hgt(i,j,k,iy),i=1,37),j=1,17)
	end do
end do

读数据时,一般建议用含隐式的DO循环,即上式

例3:输出数据时,DO循环和隐式DO循环都可以输出数据,只是数据的排放方式不同,DO循环是每行输出一个值,隐式DO循环可以每行输出多个值,但是这种情况画图时基本上没问题。但是输出两个值时,情况就不一样了:

##DO循环(不可行)
do iy=1,4
	do k=1,12
		do j=1,17
			do i=1,37
  				write(10,*) hgt(i,j,k,iy)
   			write(10,*) T(i,j,k,iy)
			end do
		end do
	end do
end do
##含隐式DO循环
do iy=1,4
	do k=1,12
   	write(10,*)   ((hgt(i,j,k,iy),i=1,37),j=1,17)
   	write(10,*)   ((T(i,j,k,iy),i=1,37),j=1,17)
	end do
end do

原因是输出数据时,DO循环是先输出一个hgt的数据,在输出一个T的数据,即hgt和T的数据是交错排列的。但对于隐式的DO循环而言,则是先输出某一时刻所有经纬度的hgt,再数据所有经纬度的T数据。建议读入和输出数据时,都用上述的含隐式DO循环,即时间和高度层可以作为外循环,但是经纬度数据作为隐式DO循环

3.Fortran文件读取格式问题

Fortran读写二进制数据(grd,form=’binary’)时,可以不带格式,但是读取dat,txt数据时必须带格式,即read(10,**)或者write(10,*)。

Open(10file=‘C:\yxk\shuju\hgt500,grd’)
Read(10)  hgt(I,j,k,l)                 ##(错误,只有二进制数据才可以不带格式说明)

Open(10file=‘C:\yxk\shuju\hgt500,grd’,form=‘binary’)
Read(10)  hgt(I,j,k,l)                 ##(正确)

Open(10file=‘C:\yxk\shuju\hgt500,txt’)
Read(10*)  hgt(I,j,k,l)              ##(正确,*表示默认格式)
也可以写为   Read(10,”(1x,3F6.2))  hgt(I,j,k,l)  ## 表示读入的数据有格式

Open(10file=‘C:\yxk\shuju\hgt500,dat’)
Read(10100)  hgt(I,j,k,l)            ##(正确,100表示设定格式)
100 FORMAT(1x,3F6.2

4.Fortran数组与变量设置

在Fortran中,如果已经设置数据了,就不能再设置同名的变量了,否则则会报错。由于Fortran不区分大小写,如果之前设置了T(20,30)数组,接着设置t变量也会报错。
例5

real::hgt(37,17),hgt

运行程序,则会出现如下错误:

error #6418: This name has already been assigned a data type. [T]

主要原因就是数组名与变量名重名,这个一定要牢记,编程初始阶段确实容易犯这个错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值