! @ http://scriptdemo.blogspot.com ! tested on Linux 2.6.32.26-175.fc12.i686 ! convert the byte-binary ice-concentration data file from NSIDC to ascii text format ! data description: ! http://nsidc.org/data/docs/daac/nsidc0051_gsfc_seaice.gd.html ! data download: ! ftp://sidads.colorado.edu/pub/DATASETS/nsidc0051_gsfc_nasateam_seaice/final-gsfc/ program dumpGSFCIce integer, parameter :: lenHeader=300 character(len=40) :: fname, myfmt, txtfname character(len=lenHeader) :: header integer :: numLen, j,fid,npos, nrow, ncol, getnum, myscale,nlen character(len=1),allocatable,dimension(:) :: dblock integer, allocatable,dimension(:) :: myice logical :: isDebug=.false. write(*,*) 'input the bin file name to open:' read(*,'(a)') fname write(*,*) 'input the txt file name to save:' read(*,'(a)') txtfname fid=7 open(fid,file=trim(fname),form='unformatted',access='direct',recl=4*lenHeader) read(fid,rec=1) header close(fid) ncol=getnum(header(7:12)) nrow=getnum(header(13:18)) myscale=getnum(header(121:126)) if (isDebug) then write(*,*) '------------------ begin file header info ------------------------' write(*,'(a20,a)') ' file name: ', header(127:150) write(*,'(a20,a)') ' image title: ', header(151:230) write(*,'(a20,a)') ' year: ', header(103:108) write(*,'(a20,a)') ' julian day: ', header(109:114) write(*,'(a20,a)') ' scale factor: ', header(121:126) write(*,'(a20,a)') ' instrument: ', header(55:60) write(*,'(a20,a)') ' other info: ', header(231:300) write(*,'(a20,i0)')' num of col: ', ncol write(*,'(a20,i0)')' num of row: ', nrow write(*,'(a20,i0)')' scale factor: ', myscale write(*,*) '------------------ end file header info ------------------------' endif ! declaration nlen=ncol*nrow numLen=lenHeader+nlen allocate(dblock(numLen)) allocate(myice(nlen)) open(fid,file=trim(fname),form='unformatted',access='direct',recl=4*numLen) read(fid,rec=1) dblock(:) close(fid) ! convert the 1-byte char to integer npos=lenHeader Do j=1,nlen npos=npos+1 myice(j)=ichar(dblock(npos)) Enddo deallocate(dblock) ! write the file write(myfmt,'(a,i0,a)') '(',ncol,'i4)' open(fid,file=trim(txtfname),form='formatted') write(fid,trim(myfmt)) myice close(fid) deallocate(myice) end program dumpGSFCIce function getnum(instr) character(len=6), intent(in) :: instr character(len=6) :: newstr integer :: getnum integer :: i, n logical :: isnum n=0 Do i=1,6 if (isnum(instr(i:i))) then n=n+1 newstr(n:n)=instr(i:i) endif Enddo if (n==0) then getnum=0 else read(newstr(1:n),*) getnum endif end function getnum function isnum(myc) character(len=1), intent(in) :: myc logical :: isnum isnum=.false. if ( (ichar(myc).ge.ichar('0')) .and. (ichar(myc).le.ichar('9'))) isnum=.true. end function isnum |
Thursday, September 5, 2013
[Fortran] dump the byte-binary ice concentration data from NSIDC
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment