!====================== program ctl2grd !====================== integer(1) :: nodata, i_fast integer :: x_dim,y_dim character(250) :: fn_ctl,fn_dat character(250) :: arg nodata = 122; i_fast = 110; fn_ctl = 'ctl.txt'; fn_dat = 'ct_monthly.dat'; x_dim = 1440; y_dim = 181; i = 0; do while (.true.) i = i + 1; if (i.gt.iargc()) exit; call getarg(i, arg) if (arg(1:2).eq.'-i') then i = i + 1; if (i.gt.iargc()) exit; call getarg(i, fn_ctl) elseif (arg(1:2).eq.'-o') then i = i + 1; if (i.gt.iargc()) exit; call getarg(i, fn_dat) elseif (arg(1:2).eq.'-9') then i = i + 1; if (i.gt.iargc()) exit; call getarg(i, arg) read (arg,*) nodata elseif (arg(1:2).eq.'-f') then i = i + 1; if (i.gt.iargc()) exit; call getarg(i, arg) read (arg,*) i_fast elseif (arg(1:2).eq.'-d') then i = i + 1; if (i.gt.iargc()) exit; call getarg(i, arg) read (arg,*) x_dim,y_dim end if end do call read_ctl(fn_ctl,fn_dat,x_dim,y_dim,nodata,i_fast) end program ctl2grd !=================================================== subroutine write_grd(unit,x,x_dim,y_dim,iyy,imm,idd) !=================================================== integer :: unit,x_dim,y_dim,iyy,imm,idd integer(1) :: x(x_dim,y_dim) integer(2) :: dummy2 character(10) :: date_tag dummy2 = Z'0a0d' write (date_tag,'(i2.2,a1,i2.2,a1,i4.4)') idd,'.',imm,'.',iyy write (unit) date_tag,dummy2 do j = 1, y_dim write (unit) x(:,j),dummy2 end do return end subroutine write_grd !=========================================================== subroutine read_ctl(fn_ctl,fn_dat,x_dim,y_dim,nodata,i_fast) !=========================================================== character(*) :: fn_ctl, fn_dat integer :: x_dim,y_dim integer(1) :: nodata,i_fast integer :: iyy,imm,idd integer(1), allocatable :: buf(:,:), dat(:,:) character(250) :: fn,fn_buf(10000) allocate (buf(x_dim,y_dim)); allocate (dat(x_dim,y_dim)); open (1,file=fn_ctl,action='read',form='formatted',STATUS='old') n = 0; do while (.true.) read (1,'(a)',iostat=ios) fn; if (ios.ne.0) exit; l = len_trim(fn); if (l.le.2.or.fn(1:1).eq.';'.or.fn(1:1).eq.'!'.or.fn(1:1).eq.'#') cycle; n = n + 1; fn_buf(n) = fn; end do close (1); open (2,file=fn_dat,action='write',FORM='unformatted',access='stream',STATUS='unknown') do k = 1, n fn = fn_buf(k); open (1,file=fn,action='read',FORM='unformatted',access='stream',STATUS='old'); read (1,iostat=ios) buf; if (ios.ne.0) exit; close(1); l = len_trim(fn); read (fn(l-11:l-4),'(i4,2i2)') iyy,imm,idd; write (*,'(a)') fn(1:l) dat = buf where (buf.ge.99.or.buf.lt.0) dat = nodata end where where (buf.eq.97) dat = 100 end where where (buf.eq.98) dat = i_fast end where call write_grd(2,dat,x_dim,y_dim,iyy,imm,idd) end do return end subroutine read_ctl