------------------------------
List of the following files:
------------------------------
oaflux3.read.sh
------------------------------
Machine info
------------------------------
localhost
/work2/am/2017.Heavy.Rain/APHRO.vs.OA.Fortran
Mon Oct 16 18:32:59 JST 2017
======================
oaflux3.read.sh
======================
#!/bin/bash
#
# Description:
#
src=oaflux3.read.f90
exe=$(basename $src .f90).exe
nml=$(basename $src .f90).nml
ctl=$(basename $src .f90).ctl
yyyy=1985
indir=/misc/raid112MANDA/KakenA.H28/OAFLUX3
infle=lh_oaflux_${yyyy}.nc
odir=output
ofle=lh_oaflux_${yyyy}.bin
var=lhtfl
mkdir -vp $odir
cat<<EOF>$nml
¶
yyyy=$yyyy,
indir="$indir",
infle="$infle",
odir="$odir",
ofle="$ofle",
var="$var",
&end
EOF
f90=ifort
opt="-CB -traceback -fpe0"
opt="$opt -L/usr/local/netcdf-4.1.3/lib -lnetcdf -lnetcdff -I/usr/local/netcdf-4.1.3/include"
prog_name=$(echo oaflux3.read| sed -e 's/\./_/g')
cat <<EOF>oaflux3.read.f90
program ${prog_name}
include '/usr/local/netcdf-4.1.3/include/netcdf.inc'
integer yyyy,y
integer jd0,jd,yyyy1,mm1,dd1
character(len=500)::indir,infle,odir,ofle
integer,parameter::im=360, jm=180, nbyte=4
integer:: nd, nrecl
real,allocatable::flux(:,:,:)
! ncid:ファイルのID番号、 varid: 変 数のID番号
integer ncid,varid
character var*50
real,allocatable :: lon(:),lat(:)
real(8),allocatable :: time(:)
integer(2),allocatable :: sdata(:,:,:)
integer,allocatable :: dimids(:),nshape(:)
character*70 err_message
character*100 dimname !dimnameは各次元の名前。
real::scale,missing_value
namelist /para/yyyy,indir,infle,odir,ofle,var
read(*,nml=para)
allocate(lon(im),lat(jm))
y=int(yyyy)
n=(1/(y-y/4*4+1))*(1-1/(y-y/100*100+1)) + (1/(y-y/400*400+1))
nd=365+n
allocate(time(nd),sdata(im,jm,nd),flux(im,jm,nd))
print *
print '(A,I4)','Year=',yyyy
print '(A,A)','Input: ',trim(indir)//'/'//trim(infle)
sta = nf_open(trim(indir)//'/'//trim(infle), nf_nowrite, ncid)
if(sta.ne.0) then
err_message = nf_strerror(sta)
write(6,*) err_message
stop
endif
! ファイルID(ncid)からvarで設定した変数のID(varid)を得る。
sta = nf_inq_varid(ncid,var,varid)
! スケールファクターを得る。(*1)
sta = nf_get_att_real(ncid,varid,'scale_factor',scale)
print *,'scale= ',scale
! *1: scaleとは、ある変数の平均的なオーダー
! data(i,j) = sdata(i,j) * scale
! のようにして、本当のデータを得る
!欠損値
sta = nf_get_att_real(ncid,varid,'missing_value',missing_value)
print *,'missing_value= ',missing_value
! varidからndimsを得る。ndimsとは次元の数。二次元データなら2
stat = nf_inq_varndims(ncid, varid, ndims)
print *,'ndims= ', ndims
! varidからdimidsを得る。dimidsとはそれぞれの次元に対する
allocate(dimids(ndims))
stat = nf_inq_vardimid(ncid, varid, dimids)
do i=1,ndims
write(6,'("dimids(",i2,")=",i9 )') i,dimids(i)
enddo
print *
allocate(nshape(ndims))
do i=1,ndims
! dimidsからnshapeを得る。
! nshapeとはそれぞれの次元に対する最大データ数 (格子数)
stat = nf_inq_dimlen(ncid, dimids(i), nshape(i))
write(6,'("nshape(",i2,")=",i9 )') i,nshape(i)
enddo !i
print *
do i=1,ndims
stat = nf_inq_dimname(ncid, dimids(i), dimname)
write(6,'("dimname(",i2,")=",1x,a23)') i,dimname
enddo
print *
print *,'Read ',var(1:lnblnk(var))
stat = nf_get_var_int2(ncid, varid, sdata)
print *,'stat= ',stat
where(sdata >= missing_value) flux=missing_value
where(sdata < missing_value) flux=float(sdata) * scale
!print *,flux
var='lon'
print '(A)',var(1:lnblnk(var))
! ファイルID(ncid)からvarで設定した変数のID(varid)を得る。
stat = nf_inq_varid(ncid,var,varid)
print *,'varid=', varid
print *,'stat= ', stat
print *,'Read ',var(1:lnblnk(var))
stat = nf_get_var_real(ncid, varid, lon)
print *,'stat= ',stat
var='lat'
print '(A)',var(1:lnblnk(var))
! ファイルID(ncid)からvarで設定した変数のID(varid)を得る。
stat = nf_inq_varid(ncid,var,varid)
print *,'varid=', varid
print *,'stat= ', stat
print *,'Read ',var(1:lnblnk(var))
stat = nf_get_var_real(ncid, varid, lat)
print *,'stat= ',stat
print *
nrecl=im*jm*nbyte
open(21,file=trim(odir)//"/"//trim(ofle), form="unformatted", &
access='direct', recl=nrecl)
jd0=julday(yyyy,1,1)
do n=1,nd
jd=(n-1)+jd0
call caldat(jd,yyyy1,mm1,dd1)
!print *,yyyy1,mm1,dd1
write(21,rec=n)flux(:,:,n)
end do
close(21)
stop
end program ${prog_name}
INTEGER FUNCTION JULDAY(IYYY,MONTH,DD)
INTEGER,intent(inout):: IYYY,MONTH,DD
!
! NAME IN/OUT DESCRIPTION
!
! IYYY I YEAR
! MONTH I MONTH (1 TO 12)
! DD I DAY OF MONTH
!
INTEGER IGREG
PARAMETER (IGREG = 15 + 31*(10 + 12*1582))
INTEGER JY,JM,JA
!
IF (IYYY .LT. 0) IYYY = IYYY + 1
IF (MONTH .GT. 2) THEN
JY = IYYY
JM = MONTH + 1
ELSE
JY = IYYY - 1
JM = MONTH + 13
ENDIF
JULDAY = INT(365.25*JY) + INT(30.6001*JM) + DD + 1720995
IF (DD + 31*(MONTH + 12*IYYY) .GE. IGREG) THEN
JA = INT(0.01*JY)
JULDAY = JULDAY + 2 - JA + INT(0.25*JA)
ENDIF
RETURN
end function julday
subroutine caldat(JULIAN,IYYY,MONTH,DD)
! Description:
INTEGER,intent(in):: JULIAN
integer,intent(out)::IYYY,MONTH,DD
!
! NAME IN/OUT DESCRIPTION
!
! JULIAN I THE JULIAN DAY
! IYYY O THE YEAR
! MONTH O THE MONTH (1 TO 12)
! DD O THE DAY OF THE MONTH
!
INTEGER IGREG
PARAMETER (IGREG=2299161)
INTEGER JALPHA,JA,JB,JC,JD,JE
!
IF (JULIAN .GE. IGREG) THEN
JALPHA = INT(((JULIAN - 1867216) - 0.25)/36524.25)
JA = JULIAN + 1 + JALPHA - INT(0.25*JALPHA)
ELSE
JA = JULIAN
ENDIF
JB = JA + 1524
JC = INT(6680. + ((JB - 2439870) - 122.1)/365.25)
JD = 365*JC + INT(0.25*JC)
JE = INT((JB - JD)/30.6001)
DD = JB - JD - INT(30.6001*JE)
MONTH = JE - 1
IF (MONTH .GT. 12) MONTH = MONTH - 12
IYYY = JC - 4715
IF (MONTH .GT. 2) IYYY = IYYY - 1
IF (IYYY .LE. 0) IYYY = IYYY - 1
RETURN
end subroutine caldat
EOF
echo
echo Created ${src}.
echo
ls -lh ${src}
echo
echo Compiling ${src} ...
echo
echo ${f90} ${opt} ${src} -o ${exe}
echo
${f90} ${opt} ${src} -o ${exe}
if [ $? -ne 0 ]; then
echo
echo COMPILE ERROR!!!
echo
echo Terminated.
echo
exit 1
fi
echo "Done Compile."
echo
ls -lh ${exe}
echo
echo
echo ${exe} is running ...
echo
${exe} <${nml}
if [ $? -ne 0 ]; then
echo
echo ERROR in $exe: RUNTIME ERROR!!!
echo
echo Terminated.
echo
exit 1
fi
echo
echo "Done ${exe}"
echo
units=$(ncdump -h ${indir}/${infle} |grep "${var}:units" |\
sed 's/^.*"\(.*\)".*$/\1/')
#sedでダブルクォーテーションやシングルクォーテーションに囲まれた文字列を抽出する
#https://orebibou.com/2016/07/sed%E3%82%84grep%E3%81%AA%E3%81%A9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6linuxunix%E3%81%A7%E3%83%80%E3%83%96%E3%83%AB%E3%82%AF%E3%82%A9%E3%83%BC%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB/
cat <<EOF>$ctl
DSET ${odir}/${ofle}
UNDEF 32766.
OPTIONS little_endian template
TITLE OAFLUX3 ${var}
XDEF 360 LINEAR 0.5 1.0
YDEF 180 LINEAR -89.5 1.0
ZDEF 01 LEVELS 1
TDEF 365 LINEAR 01JAN${yyyy} 1dy
VARS 1
${var} 1 00 ${var} ${units}
ENDVARS
EOF
echo
echo GrADS ctl file: $ctl
echo
echo
echo Done $(basename $0).
echo
----------------------
End of oaflux3.read.sh
----------------------