在mac OSX上使用gfortran免费阅读可用的UVR数据

时间:2015-04-22 10:57:59

标签: macos perl fortran

我想用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的完全初学者,我的问题是:我如何使用提供的指令来构建可以读取数据并将其输出到文本文件的程序?

1 个答案:

答案 0 :(得分:0)

Fortran(f2003左右)解决方案。 (顺便说一下,链接的说明很糟糕)

      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

这实际上并未经过验证,因为我没有可比较的已知文件内容。