我想用fortran阅读日本宇宙航空研究开发机构制作的紫外线辐射数据。该数据是2000至2010年的每日和每月时间分辨率,空间分辨率为~5 km。这个问题值得回答,因为这些数据可能对许多环境/健康项目有用,并且可以免费获得,并且可以通过以下方式正确确认来源和共享任何后续出版物的预印本:
ftp://suzaku.eorc.jaxa.jp/pub/GLI/glical/Global_05km/monthly/uvb/
有一个自述文件,它提供了有关如何使用fortran读取数据的说明,如下所示:
_le文件说明
标题
Read header (size= pixel size *2byte):
character head*14400
read(10,rec=1) head
read(head,'(2i6,2f8.2,f8.4,2e12.5,a1,a8,a1,a40)')
& npixel,nline,lon_min,lat_max,reso,slope,offset,',',
& para,',',outfile
读取数据(例如,fortran77)
parameter(nl=7200, ml=3601)
... open file by "unformatted", "recl=nl*2(byte)" (,"bytereclen")
integer*2 i2buf(nl,ml)
do m=1,ml
read(10,rec=1+m) (i2buf(n,m), n=1,nl)
do n=1,nl
par=i2buf(n,m)*slope+offset
write(6,*) 'PAR[Ein/m^2/day]=',par
enddo
enddo
斜率值
par__le:每日PAR [Ein / m ^ 2 /天] = DN * 0.01
dpar_le:直接PAR = DN * 0.01
swr__le:每日平均短波辐射[W / m ^ 2] = DN * 0.01
tip__le:中午瞬时PAR的透射率= DN * 0.0001
uva__le:每日平均UVA [W / m ^ 2] = DN * 0.001
uvb__le:每日平均UVB [W / m ^ 2] = DN * 0.0001
rpar_le:PAR范围表面反射率(冠层/固体表面TOP)= DN * 0.0001(仅限月数据)
错误值
-1作为带符号的短整数(int16)
65535为无符号短整数(uint16)
到目前为止的进展
我已经在mac OSX上成功下载并安装了gfortran。我已经下载了一个测试文件(MOD02SSH_A20000224Av6_v601_7200_3601_uvb__le.gz)并对其进行了解压缩。我创建了一个程序文件:
PROGRAM readuvr
IMPLICIT NONE
!some code
END PROGRAM
然后,我将在命令行中键入以下内容以创建可执行文件并运行它以提取数据。
gfortran -o executable
./executable
作为fortran的完全初学者,我的问题是:我如何使用提供的指令来构建可以读取数据并将其输出到文本文件的程序?
答案 0 :(得分:0)
implicit none
character*80 para,outfile
character(len=:),allocatable::header,infile
integer npixel,nline,blen,i
c note kind=2 is not standard. This needs to be a 2-byte integer.
integer(kind=2),allocatable :: data(:,:)
real lon_min,lat_max,reso,slope,off
c header is plain text, so first open formatted and
c directly read header data
infile='MOD02SSH_A20000224Av6_v601_7200_3601_uvb__le'
open(10,file=infile)
read(10,*)npixel,nline,lon_min,lat_max,reso,slope,off,
$ para,outfile
close(10)
write(*,*)npixel,nline,lon_min,lat_max,reso,slope,off,
$ trim(para),' ',trim(outfile)
blen=2*npixel
allocate(character(len=blen)::header)
allocate(data(npixel,nline))
if( sizeof(data(1,1)).ne.2 )then
write(*,*)'error kind=2 did not give a 2 byte integer'
stop
endif
c now close and reopen for binary read.
c direct access approach:
open(20,file=infile,access='direct',recl=blen/4)
c note the granularity of the recl= specifier is not standard.
c ifort uses 4 bytes. (note this will break if npixel is not even )
read(20,rec=1)header
write(*,*)trim(header)
do i=1,nline
read(20,rec=i+1)data(:,i)
enddo
c note streams if available is simpler: (we don't need to know rec len )
c open(20,file=infile,access='stream')
c read(20)header,data
end
这实际上并未经过验证,因为我没有可比较的已知文件内容。