11 type(nemsio_gfile) :: gfile
12 character(255) cin,cindx
13 real,
allocatable :: data(:,:)
16 integer nrec,im,jm,lm,idate(7),nfhour,tlmeta,nsoil,fieldsize
17 real(4),
allocatable :: lat1(:),lat(:),lon1(:)
18 real(8),
allocatable :: slat(:)
19 character(16),
allocatable:: recname(:),reclevtyp(:)
20 integer,
allocatable:: reclev(:)
24 character(16) reclevtyp_sht
25 character(32) ctldate,varname
26 character(35) sweep_blanks
28 real lon_stt,lat_stt,lon_intl,lat_intl
29 integer i,n,j,krec,iret,io_unit,idrt,nmeta
33 call nemsio_init(iret=iret)
34 if(iret/=0) print *,
'ERROR: nemsio_init '
41 print *,
'filename is cin=',trim(cin)
42 if(trim(cin)==
'')
then
43 print *,
'usage: mknemsioctl input_nemsio_file_name'
47 if(trim(cindx)==
'')
then
48 cindx=trim(cin)//
'.ctl'
51 call nemsio_open(gfile,trim(cin),
'READ',iret=iret)
52 if(iret/=0) print *,
'Error: open nemsio file,',trim(cin),
' iret=',iret
54 call nemsio_getfilehead(gfile,iret=iret,nrec=nrec,dimx=im,dimy=jm, &
55 dimz=lm,idate=idate,nfhour=nfhour,nmeta=nmeta, &
56 nsoil=nsoil,idrt=idrt,tlmeta=tlmeta)
59 allocate(recname(nrec),reclevtyp(nrec),reclev(nrec))
60 allocate(lat1(fieldsize),lat(jm),lon1(fieldsize))
61 call nemsio_getfilehead(gfile,iret=iret,recname=recname, &
62 reclevtyp=reclevtyp,reclev=reclev,lat=lat1,lon=lon1)
64 call nemsio_close(gfile,iret=iret)
66 call nemsio_finalize()
73 call cmonth(idate(2),cmon)
74 write(ctldate,
'(i2.2,a,i2.2,a3,i4.4)')idate(4),
'Z',idate(3) &
81 lon_intl=lon1(2)-lon1(1)
83 lat(j) = lat1(1+(j-1)*im)
86 call splat8(idrt,jm,slat)
87 radi=180.0/(4.*atan(1.0))
89 lat(j) = asin(slat(j)) * radi
92 lon_intl=360./real(jm)
97 lon_intl=lon1(2)-lon1(1)
99 lat_intl=abs(lat1(1+im)-lat1(1))
105 if (mod(jm,2) == 0)
then
106 lat_intl=180.0/real(jm)
107 lat_stt=-90.0+0.5*lat_intl
109 lat_intl=180.0/real(jm-1)
112 lon_intl=360./real(im)
118 open(io_unit,file=trim(cindx),form=
'formatted')
120 write(io_unit,105)trim(cin)
127 if (lat1(1)>lat1(im+1))
then
137 write(io_unit,108)tlmeta
139 write(io_unit,111)im,lon_stt,lon_intl
142 write(io_unit,113)(lat(i),i=jm,1,-1)
144 write(io_unit,120)jm,lat_stt,lat_intl
148 write(io_unit,115)1,trim(ctldate),nfhour
150 write(io_unit,116)1,trim(ctldate)
154 105
FORMAT(
'dset ^',a)
155 106
FORMAT(
'undef 9.99E+20')
156 107
FORMAT(
'options big_endian sequential yrev')
157 1077
FORMAT(
'options big_endian sequential')
158 108
FORMAT(
'fileheader',i12.0)
159 109
FORMAT(
'title gfs nemsioi file')
161 111
FORMAT(
'xdef ',i6,
' linear ',f9.6,
' ',f9.6)
162 112
FORMAT(
'ydef ',i6,
' levels')
165 114
FORMAT(
'zdef ',i6,
' linear 1 1')
166 115
FORMAT(
'tdef ',i6,
' linear ',a12,
' ',i6,
'hr')
167 116
FORMAT(
'tdef ',i6,
' linear ',a12,
' 1yr')
169 120
FORMAT(
'ydef ',i6,
' linear ',f13.6,
' ',f9.6)
173 if(reclev(n)==1)
then
178 WRITE(io_unit,
'(A,I6)')
'VARS ',krec
182 reclevtyp_sht=reclevtyp(n)
183 if(trim(reclevtyp_sht) ==
"convect-cld bot")
then
185 elseif (trim(reclevtyp_sht) ==
"convect-cld top")
then
187 elseif (trim(reclevtyp_sht) ==
"high cld bot")
then
189 elseif (trim(reclevtyp_sht) ==
"high cld top")
then
191 elseif (trim(reclevtyp_sht) ==
"mid cld bot")
then
193 elseif (trim(reclevtyp_sht) ==
"mid cld top")
then
195 elseif (trim(reclevtyp_sht) ==
"low cld bot")
then
197 elseif (trim(reclevtyp_sht) ==
"low cld top")
then
199 elseif (trim(reclevtyp_sht) ==
"convect-cld laye")
then
201 elseif (trim(reclevtyp_sht) ==
"bndary-layer cld")
then
202 reclevtyp_sht=
"bdrlc"
203 elseif (trim(reclevtyp_sht) ==
"atmos col")
then
205 elseif (trim(reclevtyp_sht) ==
"high cld lay")
then
207 elseif (trim(reclevtyp_sht) ==
"mid cld lay")
then
209 elseif (trim(reclevtyp_sht) ==
"low cld lay")
then
211 elseif (trim(reclevtyp_sht) ==
"2 m above gnd")
then
213 elseif (trim(reclevtyp_sht) ==
"10 m above gnd")
then
216 varname=sweep_blanks(trim(recname(n))//trim(reclevtyp_sht))
217 if(trim(reclevtyp(n))==
'mid layer')
then
218 write(io_unit,
'(a16,i3,a)')varname,lm,
' 99 model layer'
220 elseif(trim(reclevtyp(n))==
'soil layer')
then
221 write(io_unit,
'(a16,i3,a)')varname,nsoil,
' 99 soil layer'
223 elseif(trim(reclevtyp(n))==
'2 m above gnd')
then
224 recname(n)=trim(recname(n))//
'2m'
225 write(io_unit,
'(a16,a7,a)')varname,
' 0 99 ',trim(reclevtyp(n))
227 elseif(trim(reclevtyp(n))==
'10 m above gnd')
then
228 recname(n)=trim(recname(n))//
'10m'
229 write(io_unit,
'(a16,a7,a)')varname,
' 0 99 ',trim(reclevtyp(n))
232 write(io_unit,
'(a16,a7,a)')varname,
' 0 99 ',trim(reclevtyp(n))
237 write(io_unit,
'(A8)')
'endvars'
243 deallocate(recname,reclevtyp,reclev,lat,lat1,lon1)
251 SUBROUTINE cmonth(IMON,CMON)
257 INTEGER,
INTENT(IN) :: IMON
258 CHARACTER(LEN=3) :: CMON
291 END SUBROUTINE cmonth
294 sUBROUTINE splat4(IDRT,JMAX,ASLAT)
297 integer,
intent(in) :: idrt,jmax
298 real(4),
intent(out) :: ASLAT(JMAX)
299 INTEGER,
PARAMETER:: KD=selected_real_kind(15,45)
300 REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
301 REAL(KIND=kd):: aslatd(jmax/2),sp,spmax,eps=10.d0*epsilon(sp)
302 integer,
PARAMETER:: JZ=50
304 DATA bz / 2.4048255577d0, 5.5200781103d0, &
305 8.6537279129d0, 11.7915344391d0, 14.9309177086d0, 18.0710639679d0, &
306 21.2116366299d0, 24.3524715308d0, 27.4934791320d0, 30.6346064684d0, &
307 33.7758202136d0, 36.9170983537d0, 40.0584257646d0, 43.1997917132d0, &
308 46.3411883717d0, 49.4826098974d0, 52.6240518411d0, 55.7655107550d0, &
309 58.9069839261d0, 62.0484691902d0, 65.1899648002d0, 68.3314693299d0, &
310 71.4729816036d0, 74.6145006437d0, 77.7560256304d0, 80.8975558711d0, &
311 84.0390907769d0, 87.1806298436d0, 90.3221726372d0, 93.4637187819d0, &
312 96.6052679510d0, 99.7468198587d0, 102.888374254d0, 106.029930916d0, &
313 109.171489649d0, 112.313050280d0, 115.454612653d0, 118.596176630d0, &
314 121.737742088d0, 124.879308913d0, 128.020877005d0, 131.162446275d0, &
315 134.304016638d0, 137.445588020d0, 140.587160352d0, 143.728733573d0, &
316 146.870307625d0, 150.011882457d0, 153.153458019d0, 156.295034268d0 /
317 REAL(8):: DLT,D1=1.d0
318 INTEGER(4):: JHE,JHO,J0=0
319 real(8),
PARAMETER :: PI=3.14159265358979d0,c=(1.d0-(2.d0/pi)**2)*0.25d0
327 r=1.d0/sqrt((jmax+0.5d0)**2+c)
329 aslatd(j)=cos(bz(j)*r)
332 aslatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
335 DO WHILE(spmax.GT.eps)
345 pk(j)=((2*n-1)*aslatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
349 sp=pk(j)*(1.d0-aslatd(j)**2)/(jmax*(pkm1(j)-aslatd(j)*pk(j)))
350 aslatd(j)=aslatd(j)-sp
351 spmax=max(spmax,abs(sp))
357 aslat(jmax+1-j)=-aslat(j)
364 ELSEIF(idrt.EQ.0)
THEN
371 aslat(j)=cos((j-1)*dlt)
375 aslat(jmax+1-j)=-aslat(j)
382 ELSEIF(idrt.EQ.256)
THEN
389 aslat(j)=cos((j-0.5)*dlt)
393 aslat(jmax+1-j)=-aslat(j)
400 end subroutine splat4
403 SUBROUTINE splat8(IDRT,JMAX,ASLAT)
406 integer,
intent(in) :: idrt,jmax
407 real(8),
intent(out) :: ASLAT(JMAX)
408 INTEGER,
PARAMETER:: KD=selected_real_kind(15,45)
409 REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
410 REAL(KIND=kd):: aslatd(jmax/2),sp,spmax,eps=10.d0*epsilon(sp)
411 integer,
PARAMETER:: JZ=50
413 DATA bz / 2.4048255577d0, 5.5200781103d0, &
414 8.6537279129d0, 11.7915344391d0, 14.9309177086d0, 18.0710639679d0, &
415 21.2116366299d0, 24.3524715308d0, 27.4934791320d0, 30.6346064684d0, &
416 33.7758202136d0, 36.9170983537d0, 40.0584257646d0, 43.1997917132d0, &
417 46.3411883717d0, 49.4826098974d0, 52.6240518411d0, 55.7655107550d0, &
418 58.9069839261d0, 62.0484691902d0, 65.1899648002d0, 68.3314693299d0, &
419 71.4729816036d0, 74.6145006437d0, 77.7560256304d0, 80.8975558711d0, &
420 84.0390907769d0, 87.1806298436d0, 90.3221726372d0, 93.4637187819d0, &
421 96.6052679510d0, 99.7468198587d0, 102.888374254d0, 106.029930916d0, &
422 109.171489649d0, 112.313050280d0, 115.454612653d0, 118.596176630d0, &
423 121.737742088d0, 124.879308913d0, 128.020877005d0, 131.162446275d0, &
424 134.304016638d0, 137.445588020d0, 140.587160352d0, 143.728733573d0, &
425 146.870307625d0, 150.011882457d0, 153.153458019d0, 156.295034268d0 /
426 REAL(8):: DLT,D1=1.d0
427 INTEGER(4):: JHE,JHO,J0=0
428 real(8),
PARAMETER :: PI=3.14159265358979d0,c=(1.d0-(2.d0/pi)**2)*0.25d0
436 r=1.d0/sqrt((jmax+0.5d0)**2+c)
438 aslatd(j)=cos(bz(j)*r)
441 aslatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
444 DO WHILE(spmax.GT.eps)
454 pk(j)=((2*n-1)*aslatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
458 sp=pk(j)*(1.d0-aslatd(j)**2)/(jmax*(pkm1(j)-aslatd(j)*pk(j)))
459 aslatd(j)=aslatd(j)-sp
460 spmax=max(spmax,abs(sp))
466 aslat(jmax+1-j)=-aslat(j)
473 ELSEIF(idrt.EQ.0)
THEN
480 aslat(j)=cos((j-1)*dlt)
484 aslat(jmax+1-j)=-aslat(j)
491 ELSEIF(idrt.EQ.256)
THEN
498 aslat(j)=cos((j-0.5d0)*dlt)
502 aslat(jmax+1-j)=-aslat(j)
509 end subroutine splat8
512 character(35) function sweep_blanks(in_str)
517 character(*),
intent(in) :: in_str
518 character(35) :: out_str
523 do j=1, len_trim(in_str)
526 if (ch .eq.
"-")
then
527 out_str = trim(out_str) //
"_"
528 else if (ch .ne.
" ")
then
529 out_str = trim(out_str) // ch
531 sweep_blanks = out_str
533 end function sweep_blanks