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(10,file=‘C:\yxk\shuju\hgt500,grd’)
Read(10) hgt(I,j,k,l) ##(错误,只有二进制数据才可以不带格式说明)
Open(10,file=‘C:\yxk\shuju\hgt500,grd’,form=‘binary’)
Read(10) hgt(I,j,k,l) ##(正确)
Open(10,file=‘C:\yxk\shuju\hgt500,txt’)
Read(10,*) hgt(I,j,k,l) ##(正确,*表示默认格式)
也可以写为 Read(10,”(1x,3F6.2)”) hgt(I,j,k,l) ## 表示读入的数据有格式
Open(10,file=‘C:\yxk\shuju\hgt500,dat’)
Read(10,100) 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]
主要原因就是数组名与变量名重名,这个一定要牢记,编程初始阶段确实容易犯这个错误。