NCEPLIBS-nemsio  2.5.3
All Data Structures Files
nemsio_openclose.f90
Go to the documentation of this file.
1 
138 module nemsio_openclose
139 !
140  implicit none
141 !
142 !------------------------------------------------------------------------------
143 ! private variables and type needed by nemsio_gfile
144  integer,parameter:: nemsio_lmeta1=48,nemsio_lmeta3=40
145  integer,parameter,public:: nemsio_intkind=4,nemsio_intkind8=8
146  integer,parameter,public:: nemsio_realkind=4,nemsio_dblekind=8
147  integer,parameter,public:: nemsio_charkind=16,nemsio_charkind8=8,nemsio_charkind4=4
148  integer,parameter,public:: nemsio_logickind=4
149  integer(nemsio_intkind),parameter :: nemsio_intfill=-9999_nemsio_intkind
150  integer(nemsio_intkind8),parameter :: nemsio_intfill8=-9999_nemsio_intkind8
151  logical(nemsio_logickind),parameter:: nemsio_logicfill=.false.
152  real(nemsio_realkind),parameter :: nemsio_realfill=-9999._nemsio_realkind
153  real(nemsio_dblekind),parameter :: nemsio_dblefill=-9999._nemsio_dblekind
154  real(nemsio_intkind),parameter,public :: nemsio_kpds_intfill=-1_nemsio_intkind
155  real(nemsio_realkind),parameter,public :: nemsio_undef_grb=9.e20_nemsio_realkind
156 !
157  type,public :: nemsio_gfile
158  private
159  character(nemsio_charkind8) :: gtype=' '
160  integer(nemsio_intkind):: version=nemsio_intfill
161  character(nemsio_charkind8):: gdatatype=' '
162  character(nemsio_charkind8):: modelname=' '
163  integer(nemsio_intkind):: nmeta=nemsio_intfill
164  integer(nemsio_intkind):: lmeta=nemsio_intfill
165  integer(nemsio_intkind):: nrec=nemsio_intfill
166 !
167  integer(nemsio_intkind):: idate(7)=nemsio_intfill
168  integer(nemsio_intkind):: nfday=nemsio_intfill
169  integer(nemsio_intkind):: nfhour=nemsio_intfill
170  integer(nemsio_intkind):: nfminute=nemsio_intfill
171  integer(nemsio_intkind):: nfsecondn=nemsio_intfill
172  integer(nemsio_intkind):: nfsecondd=nemsio_intfill
173 ! integer(nemsio_intkind):: ifdate(7)=nemsio_intfill
174 !
175  integer(nemsio_intkind):: dimx=nemsio_intfill
176  integer(nemsio_intkind):: dimy=nemsio_intfill
177  integer(nemsio_intkind):: dimz=nemsio_intfill
178  integer(nemsio_intkind):: nframe=nemsio_intfill
179  integer(nemsio_intkind):: nsoil=nemsio_intfill
180  integer(nemsio_intkind):: ntrac=nemsio_intfill
181 !
182  integer(nemsio_intkind) :: jcap=nemsio_intfill
183  integer(nemsio_intkind) :: ncldt=nemsio_intfill
184  integer(nemsio_intkind) :: idvc=nemsio_intfill
185  integer(nemsio_intkind) :: idsl=nemsio_intfill
186  integer(nemsio_intkind) :: idvm=nemsio_intfill
187  integer(nemsio_intkind) :: idrt=nemsio_intfill
188  real(nemsio_realkind) :: rlon_min=nemsio_realfill
189  real(nemsio_realkind) :: rlon_max=nemsio_realfill
190  real(nemsio_realkind) :: rlat_min=nemsio_realfill
191  real(nemsio_realkind) :: rlat_max=nemsio_realfill
192  logical(nemsio_logickind) :: extrameta=nemsio_logicfill
193 !
194  integer(nemsio_intkind):: nmetavari=nemsio_intfill
195  integer(nemsio_intkind):: nmetavarr=nemsio_intfill
196  integer(nemsio_intkind):: nmetavarl=nemsio_intfill
197  integer(nemsio_intkind):: nmetavarc=nemsio_intfill
198  integer(nemsio_intkind):: nmetavarr8=nemsio_intfill
199  integer(nemsio_intkind):: nmetaaryi=nemsio_intfill
200  integer(nemsio_intkind):: nmetaaryr=nemsio_intfill
201  integer(nemsio_intkind):: nmetaaryl=nemsio_intfill
202  integer(nemsio_intkind):: nmetaaryc=nemsio_intfill
203  integer(nemsio_intkind):: nmetaaryr8=nemsio_intfill
204 !
205  character(nemsio_charkind),allocatable :: recname(:)
206  character(nemsio_charkind),allocatable :: reclevtyp(:)
207  integer(nemsio_intkind),allocatable :: reclev(:)
208 !
209  real(nemsio_realkind),allocatable :: vcoord(:,:,:)
210  real(nemsio_realkind),allocatable :: lat(:)
211  real(nemsio_realkind),allocatable :: lon(:)
212  real(nemsio_realkind),allocatable :: dx(:)
213  real(nemsio_realkind),allocatable :: dy(:)
214 !
215  real(nemsio_realkind),allocatable :: Cpi(:)
216  real(nemsio_realkind),allocatable :: Ri(:)
217 !
218  character(nemsio_charkind),allocatable :: variname(:)
219  integer(nemsio_intkind),allocatable :: varival(:)
220  character(nemsio_charkind),allocatable :: varrname(:)
221  real(nemsio_realkind),allocatable :: varrval(:)
222  character(nemsio_charkind),allocatable :: varr8name(:)
223  real(nemsio_dblekind),allocatable :: varr8val(:)
224  character(nemsio_charkind),allocatable :: varlname(:)
225  logical(nemsio_logickind),allocatable :: varlval(:)
226  character(nemsio_charkind),allocatable :: varcname(:)
227  character(nemsio_charkind),allocatable :: varcval(:)
228 !
229  character(nemsio_charkind),allocatable :: aryiname(:)
230  integer(nemsio_intkind),allocatable :: aryilen(:)
231  integer(nemsio_intkind),allocatable :: aryival(:,:)
232  character(nemsio_charkind),allocatable :: aryrname(:)
233  integer(nemsio_intkind),allocatable :: aryrlen(:)
234  real(nemsio_realkind),allocatable :: aryrval(:,:)
235  character(nemsio_charkind),allocatable :: arylname(:)
236  integer(nemsio_intkind),allocatable :: aryllen(:)
237  logical(nemsio_logickind),allocatable :: arylval(:,:)
238  character(nemsio_charkind),allocatable :: arycname(:)
239  integer(nemsio_intkind),allocatable :: aryclen(:)
240  character(nemsio_charkind),allocatable :: arycval(:,:)
241  character(nemsio_charkind),allocatable :: aryr8name(:)
242  integer(nemsio_intkind),allocatable :: aryr8len(:)
243  real(nemsio_dblekind),allocatable :: aryr8val(:,:)
244 
245 !
246  character(255) :: gfname
247  character(nemsio_charkind8) :: gaction
248  integer(nemsio_intkind8) :: tlmeta=nemsio_intfill
249  integer(nemsio_intkind) :: fieldsize=nemsio_intfill
250  integer(nemsio_intkind) :: flunit=nemsio_intfill
251  integer(nemsio_intkind) :: headvarinum=nemsio_intfill
252  integer(nemsio_intkind) :: headvarrnum=nemsio_intfill
253  integer(nemsio_intkind) :: headvarcnum=nemsio_intfill
254  integer(nemsio_intkind) :: headvarlnum=nemsio_intfill
255  integer(nemsio_intkind) :: headaryinum=nemsio_intfill
256  integer(nemsio_intkind) :: headaryrnum=nemsio_intfill
257  integer(nemsio_intkind) :: headarycnum=nemsio_intfill
258  character(nemsio_charkind),allocatable :: headvarcname(:)
259  character(nemsio_charkind),allocatable :: headvariname(:)
260  character(nemsio_charkind),allocatable :: headvarrname(:)
261  character(nemsio_charkind),allocatable :: headvarlname(:)
262  character(nemsio_charkind),allocatable :: headaryiname(:)
263  character(nemsio_charkind),allocatable :: headaryrname(:)
264  character(nemsio_charkind),allocatable :: headarycname(:)
265  integer(nemsio_intkind),allocatable :: headvarival(:)
266  real(nemsio_realkind),allocatable :: headvarrval(:)
267  character(nemsio_charkind),allocatable :: headvarcval(:)
268  logical(nemsio_logickind),allocatable :: headvarlval(:)
269  integer(nemsio_intkind),allocatable :: headaryival(:,:)
270  real(nemsio_realkind),allocatable :: headaryrval(:,:)
271  logical(nemsio_logickind),allocatable :: headarylval(:)
272  character(nemsio_charkind),allocatable :: headarycval(:,:)
273  integer(nemsio_intkind8) :: tlmetalat=nemsio_intfill
274  integer(nemsio_intkind8) :: tlmetalon=nemsio_intfill
275  integer(nemsio_intkind8) :: tlmetadx=nemsio_intfill
276  integer(nemsio_intkind8) :: tlmetady=nemsio_intfill
277  integer(nemsio_intkind8) :: tlmetavarival=nemsio_intfill
278  integer(nemsio_intkind8) :: tlmetaaryival=nemsio_intfill
279  character(16) :: file_endian=''
280  logical :: do_byteswap=.false.
281  integer(nemsio_intkind) :: jgds(200)=nemsio_kpds_intfill
282  integer(nemsio_intkind) :: igrid
283  end type nemsio_gfile
284 !
285 !------------------------------
286  type,public :: nemsio_grbmeta
287  integer(nemsio_intkind) :: jf=nemsio_intfill
288  integer(nemsio_intkind) :: j=nemsio_kpds_intfill
289  logical*1,allocatable :: lbms(:)
290  integer(nemsio_intkind) :: jpds(200)=nemsio_kpds_intfill
291  integer(nemsio_intkind) :: jgds(200)=nemsio_kpds_intfill
292  end type nemsio_grbmeta
293 !
294 !------------------------------------------------------------------------------
295 !
296  private
297 !
298 !
299  type :: nemsio_grbtbl_item
300  character(nemsio_charkind) :: shortname=' '
301  character(nemsio_charkind*2) :: leveltype=' '
302  integer(nemsio_intkind) :: precision,g1lev,g1param,g1level
303  end type nemsio_grbtbl_item
304 !
305  type :: nemsio_grbtbl
306  integer :: iptv
307  type(nemsio_grbtbl_item) :: item(255)
308  end type nemsio_grbtbl
309 !
310  type(nemsio_grbtbl),save :: gribtable(10)
311 !
312  character(16) :: machine_endian='big_endian'
313 
314 !------------------------------------------------------------------------------
315  integer(nemsio_intkind),save :: fileunit(600:1699)=0
316 !------------------------------------------------------------------------------
317 
318 !----- interface
319  interface nemsio_getheadvar
320  module procedure nemsio_getfheadvari
321  module procedure nemsio_getfheadvarr
322  module procedure nemsio_getfheadvarr8
323  module procedure nemsio_getfheadvarl
324  module procedure nemsio_getfheadvarc
325  module procedure nemsio_getfheadaryi
326  module procedure nemsio_getfheadaryr
327  module procedure nemsio_getfheadaryr8
328  module procedure nemsio_getfheadaryl
329  module procedure nemsio_getfheadaryc
330  end interface nemsio_getheadvar
331 !
332  interface nemsio_setheadvar
333  module procedure nemsio_setfheadvari
334  module procedure nemsio_setfheadaryi
335  end interface nemsio_setheadvar
336 !
337  interface splat
338  module procedure nemsio_splat4
339  module procedure nemsio_splat8
340  end interface splat
341 !
342 !------------------------------------------------------------
343 ! types related to the openclose
344 !------------------------------------------------------------
345 !
346  type :: nemsio_meta1
347  sequence
348  character(nemsio_charkind8) :: gtype
349  character(nemsio_charkind8) :: modelname
350  character(nemsio_charkind8) :: gdatatype
351  integer(nemsio_intkind) :: version,nmeta,lmeta
352  integer(nemsio_intkind) :: reserve(3)
353  end type nemsio_meta1
354 !
355  type :: nemsio_meta2
356  sequence
357  integer(nemsio_intkind) :: nrec
358  integer(nemsio_intkind) :: idate(1:7),nfday,nfhour,nfminute,nfsecondn, &
359  nfsecondd,dimx,dimy,dimz,nframe,nsoil,ntrac,&
360  jcap,ncldt,idvc,idsl,idvm,idrt
361  real(nemsio_realkind) :: rlon_min,rlon_max,rlat_min,rlat_max
362  logical(nemsio_logickind) :: extrameta
363  end type nemsio_meta2
364 !
365  type :: nemsio_meta3
366  integer(nemsio_intkind) :: nmetavari,nmetavarr,nmetavarl,nmetavarc, &
367  nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
368  nmetavarr8,nmetaaryr8
369  end type nemsio_meta3
370 !
371 !public mehtods
372  public nemsio_init,nemsio_finalize,nemsio_open,nemsio_close
373  public nemsio_getheadvar,nemsio_getrechead
374  public nemsio_getfilehead,nemsio_setfilehead,nemsio_setheadvar
375  public nemsio_stop
376  public nemsio_setrqst,nemsio_searchrecv
377  public equal_str_nocase
378 !
379 contains
380 !-------------------------------------------------------------------------------
381  subroutine nemsio_init(iret)
382 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
383 ! initialization
384 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
385  implicit none
386  integer(nemsio_intkind),optional,intent(out):: iret
387  integer :: ios
388 !------------------------------------------------------------
389 ! abstract: set grib table
390 !------------------------------------------------------------
391  call nemsio_setgrbtbl(ios)
392  if ( present(iret)) iret=ios
393  if ( ios.ne.0) then
394  if (present(iret)) return
395  call nemsio_stop
396  endif
397 !------------------------------------------------------------
398 ! check machine endian
399 !------------------------------------------------------------
400  call chk_endianc(machine_endian)
401  if(trim(machine_endian)=='mixed_endian') then
402  print *,'WARNING: You are in mixed endian computer!!!'
403  endif
404 !
405  end subroutine nemsio_init
406 !------------------------------------------------------------------------------
407  subroutine nemsio_finalize()
408 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
409 ! abstract: finalization
410 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
411  implicit none
412 
413  end subroutine nemsio_finalize
414 !------------------------------------------------------------------------------
415  subroutine nemsio_open(gfile,gfname,gaction,iret,gdatatype,version, &
416  nmeta,lmeta,modelname,nrec,idate,nfday,nfhour, &
417  nfminute,nfsecondn,nfsecondd, &
418  dimx,dimy,dimz,nframe,nsoil,ntrac,jcap,ncldt,idvc,idsl,idvm,idrt, &
419  rlon_min,rlon_max,rlat_min,rlat_max,extrameta, &
420  nmetavari,nmetavarr,nmetavarl,nmetavarc, &
421  nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
422  nmetavarr8,nmetaaryr8, &
423  recname,reclevtyp,reclev,vcoord,lat,lon,dx,dy,cpi,ri, &
424  variname,varival,varrname,varrval,varlname,varlval,varcname,varcval, &
425  varr8name,varr8val, &
426  aryiname,aryilen,aryival,aryrname,aryrlen,aryrval, &
427  arylname,aryllen,arylval,arycname,aryclen,arycval, &
428  aryr8name,aryr8len,aryr8val )
429 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
430 ! abstract: open nemsio file, and read/write the meta data
431 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
432  implicit none
433  type(nemsio_gfile),intent(inout) :: gfile
434  character*(*),intent(in) :: gfname
435  character*(*),intent(in) :: gaction
436 !-------------------------------------------------------------------------------
437 ! optional variables
438 !-------------------------------------------------------------------------------
439  integer(nemsio_intkind),optional,intent(out) :: iret
440  character*(*),optional,intent(in) :: gdatatype,modelname
441  integer(nemsio_intkind),optional,intent(in) :: version,nmeta,lmeta,nrec
442  integer(nemsio_intkind),optional,intent(in) :: idate(7),nfday,nfhour, &
443  nfminute, nfsecondn,nfsecondd
444  integer(nemsio_intkind),optional,intent(in) :: dimx,dimy,dimz,nframe, &
445  nsoil,ntrac
446  integer(nemsio_intkind),optional,intent(in) :: jcap,ncldt,idvc,idsl, &
447  idvm,idrt
448  real(nemsio_realkind),optional,intent(in) :: rlat_min,rlat_max, &
449  rlon_min,rlon_max
450  logical(nemsio_logickind),optional,intent(in):: extrameta
451  integer(nemsio_intkind),optional,intent(in) :: nmetavari,nmetavarr, &
452  nmetavarl,nmetavarc,nmetavarr8,nmetaaryi,nmetaaryr,nmetaaryl,&
453  nmetaaryc,nmetaaryr8
454 !
455  character*(*),optional,intent(in) :: recname(:),reclevtyp(:)
456  integer(nemsio_intkind),optional,intent(in) :: reclev(:)
457  real(nemsio_realkind),optional,intent(in) :: vcoord(:,:,:)
458  real(nemsio_realkind),optional,intent(in) :: lat(:),lon(:)
459  real(nemsio_realkind),optional,intent(in) :: dx(:),dy(:)
460  real(nemsio_realkind),optional,intent(in) :: Cpi(:),Ri(:)
461 !
462  character*(*),optional,intent(in) :: variname(:),varrname(:),&
463  varlname(:),varcname(:),varr8name(:),aryiname(:),aryrname(:), &
464  arylname(:),arycname(:),aryr8name(:)
465  integer(nemsio_intkind),optional,intent(in) :: aryilen(:),aryrlen(:), &
466  aryllen(:),aryclen(:),aryr8len(:)
467  integer(nemsio_intkind),optional,intent(in) :: varival(:),aryival(:,:)
468  real(nemsio_realkind),optional,intent(in) :: varrval(:),aryrval(:,:)
469  real(nemsio_dblekind),optional,intent(in) :: varr8val(:),aryr8val(:,:)
470  logical(nemsio_logickind),optional,intent(in):: varlval(:),arylval(:,:)
471  character(*),optional,intent(in) :: varcval(:),arycval(:,:)
472 !
473  integer(nemsio_intkind) :: ios
474 !------------------------------------------------------------
475 ! assign a unit number
476 !------------------------------------------------------------
477  if (present(iret)) iret=-1
478  call nemsio_getlu(gfile,gfname,gaction,ios)
479  if ( ios.ne.0 ) then
480  if ( present(iret)) then
481  iret=ios
482  return
483  else
484  call nemsio_stop
485  endif
486  endif
487 !------------------------------------------------------------
488 ! open and read meta data for READ
489 !------------------------------------------------------------
490 ! print *,'in rcreate, gfname=',gfname,'gaction=',lowercase(gaction)
491  gfile%gfname=gfname
492  gfile%gaction=gaction
493  if ( equal_str_nocase(trim(gaction),'read') .or. equal_str_nocase(trim(gaction),'rdwr')) then
494  if ( equal_str_nocase(trim(gaction),'read') )then
495  call baopenr(gfile%flunit,gfname,ios)
496  if ( ios.ne.0) then
497  if ( present(iret)) then
498  return
499  else
500  call nemsio_stop
501  endif
502  endif
503  else
504  call baopen(gfile%flunit,gfname,ios)
505  if ( ios.ne.0) then
506  if ( present(iret)) then
507  return
508  else
509  call nemsio_stop
510  endif
511  endif
512  endif
513 !
514 ! read meta data for gfile
515 !
516  call nemsio_rcreate(gfile,gfname,gaction,ios)
517  if ( ios.ne.0) then
518  if ( present(iret)) then
519  iret=ios
520  return
521  else
522  call nemsio_stop
523  endif
524  endif
525 !
526 ! open and write meta data for WRITE
527 !------------------------------------------------------------
528  elseif ( equal_str_nocase(trim(gaction),'write') ) then
529  call baopenwt(gfile%flunit,gfname,ios)
530  if ( ios.ne.0) then
531  if ( present(iret)) then
532  return
533  else
534  call nemsio_stop
535  endif
536  endif
537  call nemsio_wcreate(gfile,gfname,gaction,ios,gdatatype=gdatatype, &
538  version=version, nmeta=nmeta,lmeta=lmeta,modelname=modelname, &
539  nrec=nrec,idate=idate,nfday=nfday,nfhour=nfhour, &
540  nfminute=nfminute,nfsecondn=nfsecondn, nfsecondd=nfsecondd, &
541  dimx=dimx,dimy=dimy,dimz=dimz,nframe=nframe,nsoil=nsoil, &
542  ntrac=ntrac,jcap=jcap,ncldt=ncldt,idvc=idvc,idsl=idsl, &
543  idvm=idvm,idrt=idrt, rlon_min=rlon_min,rlon_max=rlon_max, &
544  rlat_min=rlat_min, rlat_max=rlat_max,extrameta=extrameta, &
545  nmetavari=nmetavari,nmetavarr=nmetavarr,nmetavarr8=nmetavarr8,&
546  nmetavarl=nmetavarl, nmetavarc=nmetavarc,nmetaaryi=nmetaaryi, &
547  nmetaaryr=nmetaaryr, nmetaaryr8=nmetaaryr8, &
548  nmetaaryl=nmetaaryl,nmetaaryc=nmetaaryc,recname=recname, &
549  reclevtyp=reclevtyp,reclev=reclev,vcoord=vcoord, &
550  lat=lat,lon=lon,dx=dx,dy=dy,cpi=cpi,ri=ri, &
551  variname=variname,varival=varival,varrname=varrname, &
552  varrval=varrval,varlname=varlname,varlval=varlval, &
553  varcname=varcname,varcval=varcval, &
554  varr8name=varr8name,varr8val=varr8val, &
555  aryiname=aryiname,aryilen=aryilen,aryival=aryival, &
556  aryrname=aryrname,aryrlen=aryrlen,aryrval=aryrval, &
557  aryr8name=aryr8name,aryr8len=aryr8len,aryr8val=aryr8val, &
558  arylname=arylname,aryllen=aryllen,arylval=arylval, &
559  arycname=arycname,aryclen=aryclen,arycval=arycval )
560  if ( ios.ne.0) then
561  if ( present(iret)) then
562  iret=ios
563  return
564  else
565  call nemsio_stop
566  endif
567  endif
568 !------------------------------------------------------------
569 ! if gaction is wrong
570 !------------------------------------------------------------
571  else
572  if ( present(iret)) then
573  return
574  else
575  call nemsio_stop
576  endif
577  endif
578 !------------------------------------------------------------
579 ! set default header
580 !------------------------------------------------------------
581  if(.not.allocated(gfile%headvariname).or. &
582  .not.allocated(gfile%headvarrname).or. &
583  .not.allocated(gfile%headvarcname).or. &
584  .not.allocated(gfile%headvarlname).or. &
585  .not.allocated(gfile%headaryiname).or. &
586  .not.allocated(gfile%headaryrname) ) then
587 
588  call nemsio_setfhead(gfile,ios)
589  if ( present(iret)) iret=ios
590  if ( ios.ne.0) then
591  if (present(iret)) return
592  call nemsio_stop
593  endif
594  endif
595 
596  iret=0
597  end subroutine nemsio_open
598 !------------------------------------------------------------------------------
599  subroutine nemsio_close(gfile,iret)
600 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
601 ! abstract: close gfile including closing the file, returning unit number,
602 ! setting file meta data empty
603 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
604  implicit none
605  type(nemsio_gfile),intent(inout) :: gfile
606  integer(nemsio_intkind),optional,intent(out) :: iret
607  integer(nemsio_intkind) :: ios
608 !------------------------------------------------------------
609 ! close the file
610 !------------------------------------------------------------
611  if ( present(iret) ) iret=-1
612  call baclose(gfile%flunit,ios)
613  if ( ios.ne.0) then
614  if ( present(iret)) then
615  return
616  else
617  call nemsio_stop
618  endif
619  endif
620 !------------------------------------------------------------
621 ! free the file unit
622 !------------------------------------------------------------
623  call nemsio_clslu(gfile,ios)
624  if ( ios.ne.0) then
625  if ( present(iret)) then
626  iret=ios
627  return
628  else
629  call nemsio_stop
630  endif
631  endif
632 !------------------------------------------------------------
633 ! empty gfile meta data
634 !------------------------------------------------------------
635  call nemsio_axmeta(gfile,ios)
636  if ( ios.ne.0) then
637  if ( present(iret)) then
638  iret=ios
639  return
640  else
641  call nemsio_stop
642  endif
643  endif
644  if ( present(iret)) iret=0
645 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
646  end subroutine nemsio_close
647 !------------------------------------------------------------------------------
648  subroutine nemsio_rcreate(gfile,gfname,gaction,iret)
649 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
650 ! abstract: read nemsio meta data
651 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
652  implicit none
653  type(nemsio_gfile),intent(inout) :: gfile
654  character*(*),intent(in) :: gfname
655  character*(*),intent(in) :: gaction
656  integer(nemsio_intkind),intent(out) :: iret
657 !local variables
658  integer(nemsio_intkind) :: ios,nmeta
659  integer(nemsio_intkind8) :: iskip,iread,nread
660  type(nemsio_meta1) :: meta1
661  type(nemsio_meta2) :: meta2
662  type(nemsio_meta3) :: meta3
663  integer(nemsio_intkind) :: i
664  character(nemsio_charkind8),allocatable :: char8var(:)
665  logical(nemsio_logickind) :: lreadcrt,ltlendian
666 !------------------------------------------------------------
667 ! read first meta data record
668 !------------------------------------------------------------
669  iret=-3
670  gfile%do_byteswap=.false.
671  iskip=0
672  iread=nemsio_lmeta1
673  call bafrreadl(gfile%flunit,iskip,iread,nread,meta1)
674  lreadcrt=meta1%lmeta==120.and.(meta1%nmeta<13.and.meta1%nmeta>0).and. &
675  (meta1%version<300000.and.meta1%version>=nemsio_intfill)
676  if(nread.lt.iread) then
677 ! control words not right, file is little endian
678  call nemsio_close(gfile,iret=iret)
679  gfile%file_endian='little_endian'
680  gfile%do_byteswap=.false.
681 !reset unit
682  ltlendian=.true.
683  call nemsio_getlu(gfile,gfname,gaction,iret,ltlendian=ltlendian)
684  if ( equal_str_nocase(trim(gaction),'read') )then
685  call baopenr(gfile%flunit,gfname,ios)
686  if(ios/=0) print *,'Cant open file ',trim(gfname),' ios=',ios
687  else if ( equal_str_nocase(trim(gaction),'rdwr') )then
688  call baopen(gfile%flunit,gfname,ios)
689  if(ios/=0) print *,'Cant open file ',trim(gfname),' ios=',ios
690  endif
691  gfile%gfname=gfname
692  gfile%gaction=gaction
693  if(trim(machine_endian)=='big_endian') gfile%do_byteswap=.true.
694  if(trim(machine_endian)=='little_endian') gfile%do_byteswap=.false.
695  call bafrreadl(gfile%flunit,iskip,iread,nread,meta1)
696  if(nread<iread) then
697  print *,'WARNING: the file probably is in mixed endian, the program will STOP!'
698  call nemsio_stop()
699  endif
700 !
701  elseif(.not.lreadcrt) then
702 ! set byteswap
703  gfile%do_byteswap=.true.
704  endif
705 ! --------------------------------------------------------------------
706 !---check endian
707 ! --------------------------------------------------------------------
708  if(gfile%do_byteswap) then
709  if(trim(machine_endian)=='big_endian')gfile%file_endian='little_endian'
710  if(trim(machine_endian)=='little_endian')gfile%file_endian='big_endian'
711  else
712  gfile%file_endian=machine_endian
713  endif
714 !
715  if(gfile%do_byteswap) call byteswap(meta1%version,nemsio_intkind,6)
716 ! --------------------------------------------------------------------
717  gfile%tlmeta=nread
718  gfile%gtype=meta1%gtype
719  gfile%version=meta1%version
720  gfile%nmeta=meta1%nmeta
721  gfile%lmeta=meta1%lmeta
722  gfile%gdatatype=meta1%gdatatype
723  gfile%modelname=meta1%modelname
724 ! print *,'in rcreate,do_byteswap=',gfile%do_byteswap,'machine_endian=', &
725 ! machine_endian,'file_endian=',gfile%file_endian,'gtype=',gfile%gtype, &
726 ! 'version=',gfile%version,gfile%nmeta,gfile%lmeta,gfile%gdatatype,gfile%modelname, &
727 ! 'reserve=',meta1%reserve
728  if ( trim(gfile%gdatatype(1:3)).ne."bin".and.trim(gfile%gdatatype(1:4)).ne."grib" ) then
729  gfile%gdatatype="grib"
730  endif
731  if ( gfile%gtype(1:6) .ne. 'NEMSIO' ) then
732  iret=-9
733  return
734  endif
735 !------------------------------------------------------------
736 ! read second meta data record
737 !------------------------------------------------------------
738  iskip=iskip+nread
739  iread=gfile%lmeta
740  call bafrreadl(gfile%flunit,iskip,iread,nread,meta2)
741 ! print *,'in rcreate,meta2 iskip=',iskip,'iread=',iread,'nread=',nread
742  if(nread.lt.iread) return
743  if(gfile%do_byteswap) then
744  call byteswap(meta2%nrec,nemsio_intkind,25)
745  call byteswap(meta2%rlon_min,nemsio_realkind,4)
746  call byteswap(meta2%extrameta,nemsio_logickind,1)
747  endif
748  gfile%tlmeta=gfile%tlmeta+nread
749 ! print *,'tlmeta2 =',gfile%tlmeta,'iskip=',iskip,'iread=',iread,'nread=',nread
750  gfile%nrec=meta2%nrec
751  gfile%idate(1:7)=meta2%idate(1:7)
752  gfile%nfday=meta2%nfday
753  gfile%nfhour=meta2%nfhour
754  gfile%nfminute=meta2%nfminute
755  gfile%nfsecondn=meta2%nfsecondn
756  gfile%nfsecondd=meta2%nfsecondd
757  gfile%dimx=meta2%dimx
758  gfile%dimy=meta2%dimy
759  gfile%dimz=meta2%dimz
760  gfile%nframe=meta2%nframe
761  gfile%nsoil=meta2%nsoil
762  gfile%ntrac=meta2%ntrac
763  gfile%jcap=meta2%jcap
764  gfile%ncldt=meta2%ncldt
765  gfile%idvc=meta2%idvc
766  gfile%idsl=meta2%idsl
767  gfile%idvm=meta2%idvm
768  gfile%idrt=meta2%idrt
769  gfile%rlon_min=meta2%rlon_min
770  gfile%rlon_max=meta2%rlon_max
771  gfile%rlat_min=meta2%rlat_min
772  gfile%rlat_max=meta2%rlat_max
773  gfile%extrameta=meta2%extrameta
774  gfile%fieldsize=(gfile%dimx+2*gfile%nframe)*(gfile%dimy+2*gfile%nframe)
775 
776  nmeta=gfile%nmeta-2
777 !------------------------------------------------------------
778 ! set up gfile required meata arrays
779 !------------------------------------------------------------
780  call nemsio_almeta(gfile,ios)
781  if ( ios .ne. 0 ) then
782  iret=ios
783  return
784  endif
785 !------------------------------------------------------------
786 ! read gfile meta data array (meta rec 3:13)
787 !------------------------------------------------------------
788 !meta3:recname
789  if(gfile%nmeta-2>0) then
790  iskip=iskip+nread
791  iread=len(gfile%recname)*size(gfile%recname)
792  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%recname)
793  if(nread.lt.iread) then
794  iread=nemsio_charkind8*size(gfile%recname)
795  allocate(char8var(size(gfile%recname)))
796  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
797  gfile%recname=char8var
798  deallocate(char8var)
799  if (nread.lt.iread) return
800  endif
801  nmeta=nmeta-1
802  gfile%tlmeta=gfile%tlmeta+nread
803  endif
804 
805  if (gfile%nmeta-3>0 ) then
806 !meta4:reclevtyp
807  iskip=iskip+nread
808  iread=len(gfile%reclevtyp)*size(gfile%reclevtyp)
809  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%reclevtyp)
810  if(nread.lt.iread) return
811  nmeta=nmeta-1
812  gfile%tlmeta=gfile%tlmeta+nread
813  endif
814 
815  if (gfile%nmeta-4 >0 ) then
816 !meta5:reclev
817  iskip=iskip+nread
818  iread=kind(gfile%reclev)*size(gfile%reclev)
819  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%reclev)
820  if(nread.lt.iread) return
821  if(gfile%do_byteswap) call byteswap(gfile%reclev,nemsio_intkind,size(gfile%reclev))
822  nmeta=nmeta-1
823  gfile%tlmeta=gfile%tlmeta+nread
824  endif
825 
826  if (gfile%nmeta-5 >0 ) then
827 !meta6:vcoord
828  iskip=iskip+nread
829  iread=kind(gfile%vcoord)*size(gfile%vcoord)
830  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%vcoord)
831  if(nread.lt.iread) return
832  if(gfile%do_byteswap) call byteswap(gfile%vcoord,nemsio_realkind,size(gfile%vcoord))
833  nmeta=nmeta-1
834  gfile%tlmeta=gfile%tlmeta+nread
835  endif
836 
837  if ( gfile%nmeta-6>0 ) then
838 !meta7:lat
839  iskip=iskip+nread
840  iread=kind(gfile%lat)*size(gfile%lat)
841  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%lat)
842  if(nread.lt.iread) return
843  if(gfile%do_byteswap) call byteswap(gfile%lat,nemsio_realkind,size(gfile%lat))
844  nmeta=nmeta-1
845  gfile%tlmetalat=gfile%tlmeta
846  gfile%tlmeta=gfile%tlmeta+nread
847  endif
848 
849  if ( gfile%nmeta-7>0 ) then
850 !meta8:lon
851  iskip=iskip+nread
852  iread=kind(gfile%lon)*size(gfile%lon)
853  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%lon)
854  if(nread.lt.iread) return
855  if(gfile%do_byteswap) call byteswap(gfile%lon,nemsio_realkind,size(gfile%lon))
856  nmeta=nmeta-1
857  gfile%tlmetalon=gfile%tlmeta
858  gfile%tlmeta=gfile%tlmeta+nread
859  endif
860 
861  if ( gfile%nmeta-8>0 ) then
862 !meta9:dx
863  iskip=iskip+nread
864  iread=kind(gfile%dx)*size(gfile%dx)
865  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%dx)
866  if(nread.lt.iread) return
867  if(gfile%do_byteswap) call byteswap(gfile%dx,nemsio_realkind,size(gfile%dx))
868  nmeta=nmeta-1
869  gfile%tlmetadx=gfile%tlmeta
870  gfile%tlmeta=gfile%tlmeta+nread
871  endif
872 
873  if ( gfile%nmeta-9>0 ) then
874 !meta10:dy
875  iskip=iskip+nread
876  iread=kind(gfile%dy)*size(gfile%dy)
877  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%dy)
878  if(nread.lt.iread) return
879  if(gfile%do_byteswap) call byteswap(gfile%dy,nemsio_realkind,size(gfile%dy))
880  nmeta=nmeta-1
881  gfile%tlmetady=gfile%tlmeta
882  gfile%tlmeta=gfile%tlmeta+nread
883  endif
884 
885  if ( gfile%nmeta-10>0 ) then
886 !meta11:cpi
887  iskip=iskip+nread
888  iread=kind(gfile%cpi)*size(gfile%Cpi)
889  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%Cpi)
890  if(nread.lt.iread) return
891  if(gfile%do_byteswap) call byteswap(gfile%Cpi,nemsio_realkind,size(gfile%Cpi))
892  nmeta=nmeta-1
893  gfile%tlmeta=gfile%tlmeta+nread
894  endif
895 
896  if ( gfile%nmeta-11>0 ) then
897 !Ri
898  iskip=iskip+nread
899  iread=kind(gfile%ri)*size(gfile%Ri)
900  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%Ri)
901  if(nread.lt.iread) return
902  if(gfile%do_byteswap) call byteswap(gfile%Ri,nemsio_realkind,size(gfile%Ri))
903  nmeta=nmeta-1
904  gfile%tlmeta=gfile%tlmeta+nread
905 ! print *,'tlmetri =',gfile%tlmeta,'nread=',nread,'ri=',gfile%ri
906  endif
907 !
908 ! if ( gfile%nmeta-12>0 ) then
909 ! print *,'nmeta=',nmeta,' WARNING:there are more meta to be read!'
910 ! endif
911 
912  if(gfile%extrameta) then
913 !------------------------------------------------------------
914 ! read out extra meta data
915 !------------------------------------------------------------
916  iskip=iskip+nread
917  iread=nemsio_lmeta3
918  call bafrreadl(gfile%flunit,iskip,iread,nread,meta3)
919  if(nread.lt.iread) then
920 !when no r8 var and ary
921  iread=nemsio_lmeta3-8
922  call bafrreadl(gfile%flunit,iskip,iread,nread,meta3)
923  if(nread.lt.iread) return
924  if(gfile%do_byteswap) call byteswap(meta3%nmetavari,nemsio_intkind,8)
925  else
926  if(gfile%do_byteswap) call byteswap(meta3%nmetavari,nemsio_intkind,10)
927  gfile%nmetavarr8=meta3%nmetavarr8
928  gfile%nmetaaryr8=meta3%nmetaaryr8
929  endif
930  gfile%tlmeta=gfile%tlmeta+nread
931 ! print *,'after meta3,iskip=',iskip,'iread=',iread,'nread=',nread,'tlmeta=',gfile%tlmeta
932  gfile%nmetavari=meta3%nmetavari
933  gfile%nmetavarr=meta3%nmetavarr
934  gfile%nmetavarl=meta3%nmetavarl
935  gfile%nmetavarc=meta3%nmetavarc
936  gfile%nmetaaryi=meta3%nmetaaryi
937  gfile%nmetaaryr=meta3%nmetaaryr
938  gfile%nmetaaryl=meta3%nmetaaryl
939  gfile%nmetaaryc=meta3%nmetaaryc
940 
941 ! print *,'before nemsio_alextramet,nvar=',gfile%nmetavari,gfile%nmetavarr,gfile%nmetavarl,&
942 ! gfile%nmetavarc,'nary=',gfile%nmetaaryi,gfile%nmetaaryr,gfile%nmetaaryl, &
943 ! gfile%nmetaaryc,'r8ivar ary=',gfile%nmetavarr8,gfile%nmetaaryr8
944  call nemsio_alextrameta(gfile,ios)
945  if ( ios .ne. 0 ) then
946  iret=ios
947  return
948  endif
949 
950 !meta var integer
951  if (gfile%nmetavari.gt.0) then
952  iskip=iskip+nread
953  iread=len(gfile%variname)*gfile%nmetavari
954  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%variname)
955 ! print *,'after get varint name,iskip=',iskip,'iread=',iread,'nread=',nread
956  if(nread.lt.iread) then
957  iread=nemsio_charkind8*gfile%nmetavari
958  allocate(char8var(gfile%nmetavari))
959  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
960  gfile%variname=char8var
961  deallocate(char8var)
962 ! print *,'after get varint name8,iskip=',iskip,'iread=',iread,'nread=',nread
963  if (nread.lt.iread) return
964  endif
965  gfile%tlmeta=gfile%tlmeta+nread
966 ! print *,'tlmetavari =',gfile%tlmeta,'nread=',nread,'iread=',iread,gfile%nmetavari
967  iskip=iskip+nread
968  iread=nemsio_intkind*gfile%nmetavari
969  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varival)
970  if(nread.lt.iread) return
971  if(gfile%do_byteswap) call byteswap(gfile%varival,nemsio_intkind,size(gfile%varival))
972  gfile%tlmetavarival=gfile%tlmeta
973  gfile%tlmeta=gfile%tlmeta+nread
974 ! print *,'tlmetavarival =',gfile%tlmetavarival,gfile%tlmeta,'nread=',nread
975  endif
976 !meta var real
977  if (gfile%nmetavarr.gt.0) then
978  iskip=iskip+nread
979  iread=len(gfile%varrname)*gfile%nmetavarr
980  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varrname)
981 ! print *,'tlmetavarr =',gfile%tlmeta,'nread=',nread,'iread=',iread,gfile%nmetavarr
982  if(nread.lt.iread) then
983  iread=nemsio_charkind8*gfile%nmetavarr
984  allocate(char8var(gfile%nmetavarr))
985  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
986  gfile%varrname=char8var
987  deallocate(char8var)
988  if (nread.lt.iread) return
989  endif
990  gfile%tlmeta=gfile%tlmeta+nread
991 ! print *,'tlmetavarr =',gfile%tlmeta,'nread=',nread,gfile%nmetavarr
992  iskip=iskip+nread
993  iread=kind(gfile%varrval)*gfile%nmetavarr
994  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varrval)
995  if(nread.lt.iread) return
996  if(gfile%do_byteswap) call byteswap(gfile%varrval,nemsio_realkind,size(gfile%varrval))
997  gfile%tlmeta=gfile%tlmeta+nread
998 ! print *,'tlmetavarrval =',gfile%tlmeta,'nread=',nread
999  endif
1000 !meta var logical
1001  if (gfile%nmetavarl.gt.0) then
1002  iskip=iskip+nread
1003  iread=len(gfile%varlname)*gfile%nmetavarl
1004  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varlname)
1005  if(nread.lt.iread) then
1006  iread=nemsio_charkind8*gfile%nmetavarl
1007  allocate(char8var(gfile%nmetavarl))
1008  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1009  gfile%varlname=char8var
1010  deallocate(char8var)
1011  if (nread.lt.iread) return
1012  endif
1013  gfile%tlmeta=gfile%tlmeta+nread
1014 ! print *,'tlmetavarl =',gfile%tlmeta,'nread=',nread,gfile%nmetavarl
1015  iskip=iskip+nread
1016  iread=nemsio_logickind*gfile%nmetavarl
1017  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varlval)
1018  if(nread.lt.iread) return
1019  if(gfile%do_byteswap) call byteswap(gfile%varlval,nemsio_logickind,size(gfile%varlval))
1020  gfile%tlmeta=gfile%tlmeta+nread
1021  endif
1022 !meta var string
1023  if (gfile%nmetavarc.gt.0) then
1024  iskip=iskip+nread
1025  iread=len(gfile%varcname)*gfile%nmetavarc
1026  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varcname)
1027  if(nread.lt.iread) then
1028  iread=nemsio_charkind8*gfile%nmetavarc
1029  allocate(char8var(gfile%nmetavarc))
1030  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1031  gfile%varcname=char8var
1032  deallocate(char8var)
1033  if (nread.lt.iread) return
1034  endif
1035  gfile%tlmeta=gfile%tlmeta+nread
1036  iskip=iskip+nread
1037  iread=len(gfile%varcval)*gfile%nmetavarc
1038  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varcval)
1039  if(nread.lt.iread) return
1040  gfile%tlmeta=gfile%tlmeta+nread
1041  endif
1042 !meta var real 8
1043  if (gfile%nmetavarr8.gt.0) then
1044  iskip=iskip+nread
1045  iread=len(gfile%varr8name)*gfile%nmetavarr8
1046  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varr8name)
1047  if(nread.lt.iread) then
1048  iread=nemsio_charkind8*gfile%nmetavarr8
1049  allocate(char8var(gfile%nmetavarr8))
1050  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1051  gfile%varr8name=char8var
1052  deallocate(char8var)
1053  if (nread.lt.iread) return
1054  endif
1055  gfile%tlmeta=gfile%tlmeta+nread
1056  iskip=iskip+nread
1057  iread=kind(gfile%varr8val)*gfile%nmetavarr8
1058  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%varr8val)
1059  if(nread.lt.iread) return
1060  if(gfile%do_byteswap) call byteswap(gfile%varr8val,nemsio_dblekind,size(gfile%varr8val))
1061  gfile%tlmeta=gfile%tlmeta+nread
1062  endif
1063 !
1064 !meta arr integeryy
1065  if (gfile%nmetaaryi.gt.0) then
1066  iskip=iskip+nread
1067  iread=len(gfile%aryiname)*gfile%nmetaaryi
1068  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryiname)
1069  if(nread.lt.iread) then
1070  iread=nemsio_charkind8*gfile%nmetaaryi
1071  allocate(char8var(gfile%nmetaaryi))
1072  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1073  gfile%aryiname=char8var
1074  deallocate(char8var)
1075  if (nread.lt.iread) return
1076  endif
1077  gfile%tlmeta=gfile%tlmeta+nread
1078 ! print *,'tlmetaaryinam =',gfile%tlmeta,'nread=',nread
1079  iskip=iskip+nread
1080  iread=kind(gfile%nmetaaryi)*gfile%nmetaaryi
1081  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryilen)
1082  if(nread.lt.iread) return
1083  if(gfile%do_byteswap) call byteswap(gfile%aryilen,nemsio_intkind,size(gfile%aryilen))
1084  gfile%tlmeta=gfile%tlmeta+nread
1085  gfile%tlmetaaryival=gfile%tlmeta
1086 ! print *,'tlmetaaryilen =',gfile%tlmeta,'nread=',nread
1087  allocate(gfile%aryival(maxval(gfile%aryilen),gfile%nmetaaryi))
1088  do i=1,gfile%nmetaaryi
1089  iskip=iskip+nread
1090  iread=kind(gfile%aryival)*gfile%aryilen(i)
1091  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryival(:,i))
1092  if(nread.lt.iread) return
1093  if(gfile%do_byteswap) call byteswap(gfile%aryival(:,i),nemsio_intkind,gfile%aryilen(i))
1094  gfile%tlmeta=gfile%tlmeta+nread
1095 
1096 ! print *,'tlmetaaryival =',gfile%tlmeta,'nread=',nread
1097  enddo
1098  endif
1099 !meta arr real4
1100  if (gfile%nmetaaryr.gt.0) then
1101  iskip=iskip+nread
1102  iread=len(gfile%aryrname)*gfile%nmetaaryr
1103  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryrname)
1104  if(nread.lt.iread) then
1105  iread=nemsio_charkind8*gfile%nmetaaryr
1106  allocate(char8var(gfile%nmetaaryr))
1107  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1108  gfile%aryrname=char8var
1109  deallocate(char8var)
1110  if (nread.lt.iread) return
1111  endif
1112  gfile%tlmeta=gfile%tlmeta+nread
1113  iskip=iskip+nread
1114  iread=kind(gfile%aryrlen)*gfile%nmetaaryr
1115  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryrlen)
1116  if(nread.lt.iread) return
1117  if(gfile%do_byteswap) call byteswap(gfile%aryrlen,nemsio_intkind,size(gfile%aryrlen))
1118  gfile%tlmeta=gfile%tlmeta+nread
1119  allocate(gfile%aryrval(maxval(gfile%aryrlen),gfile%nmetaaryr) )
1120  do i=1,gfile%nmetaaryr
1121  iskip=iskip+nread
1122  iread=kind(gfile%aryrval)*gfile%aryrlen(i)
1123  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryrval(:,i))
1124  if(nread.lt.iread) return
1125  if(gfile%do_byteswap) call byteswap(gfile%aryrval(:,i),nemsio_realkind,gfile%aryrlen(i))
1126  gfile%tlmeta=gfile%tlmeta+nread
1127  enddo
1128  endif
1129 !meta arr logical
1130  if (gfile%nmetaaryl.gt.0) then
1131  iskip=iskip+nread
1132  iread=len(gfile%arylname)*gfile%nmetaaryl
1133  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%arylname)
1134  if(nread.lt.iread) then
1135  iread=nemsio_charkind8*gfile%nmetaaryl
1136  allocate(char8var(gfile%nmetaaryl))
1137  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1138  gfile%arylname=char8var
1139  deallocate(char8var)
1140  if (nread.lt.iread) return
1141  endif
1142  gfile%tlmeta=gfile%tlmeta+nread
1143  iskip=iskip+nread
1144  iread=kind(gfile%aryllen)*gfile%nmetaaryl
1145  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryllen)
1146  if(nread.lt.iread) return
1147  if(gfile%do_byteswap) call byteswap(gfile%aryllen,nemsio_intkind,size(gfile%aryllen))
1148  gfile%tlmeta=gfile%tlmeta+nread
1149  allocate(gfile%arylval(maxval(gfile%aryllen),gfile%nmetaaryl) )
1150  do i=1,gfile%nmetaaryl
1151  iskip=iskip+nread
1152  iread=kind(gfile%arylval)*gfile%aryllen(i)
1153  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%arylval(:,i))
1154  if(nread.lt.iread) return
1155  if(gfile%do_byteswap) call byteswap(gfile%arylval(:,i),nemsio_logickind,gfile%aryllen(i))
1156  gfile%tlmeta=gfile%tlmeta+nread
1157  enddo
1158  endif
1159 !meta arr char
1160  if (gfile%nmetaaryc.gt.0) then
1161  iskip=iskip+nread
1162  iread=len(gfile%arycname)*gfile%nmetaaryc
1163  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%arycname)
1164  if(nread.lt.iread) then
1165  iread=nemsio_charkind8*gfile%nmetaaryc
1166  allocate(char8var(gfile%nmetaaryc))
1167  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1168  gfile%arycname=char8var
1169  deallocate(char8var)
1170  if (nread.lt.iread) return
1171  endif
1172  gfile%tlmeta=gfile%tlmeta+nread
1173  iskip=iskip+nread
1174  iread=kind(gfile%aryclen)*gfile%nmetaaryc
1175  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryclen)
1176  if(nread.lt.iread) return
1177  if(gfile%do_byteswap) call byteswap(gfile%aryclen,nemsio_intkind,size(gfile%aryclen))
1178  gfile%tlmeta=gfile%tlmeta+nread
1179  allocate(gfile%arycval(maxval(gfile%aryclen),gfile%nmetaaryc) )
1180  do i=1,gfile%nmetaaryc
1181  iskip=iskip+nread
1182  iread=len(gfile%arycval)*gfile%aryclen(i)
1183  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%arycval(:,i))
1184  if(nread.lt.iread) return
1185  gfile%tlmeta=gfile%tlmeta+nread
1186  enddo
1187  endif
1188 !meta arr real8
1189  if (gfile%nmetaaryr8.gt.0) then
1190  iskip=iskip+nread
1191  iread=len(gfile%aryr8name)*gfile%nmetaaryr8
1192  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryr8name)
1193  if(nread.lt.iread) then
1194  iread=nemsio_charkind8*gfile%nmetaaryr8
1195  allocate(char8var(gfile%nmetaaryr8))
1196  call bafrreadl(gfile%flunit,iskip,iread,nread,char8var)
1197  gfile%aryr8name=char8var
1198  deallocate(char8var)
1199  if (nread.lt.iread) return
1200  endif
1201  gfile%tlmeta=gfile%tlmeta+nread
1202  iskip=iskip+nread
1203  iread=kind(gfile%aryr8len)*gfile%nmetaaryr8
1204  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryr8len)
1205  if(nread.lt.iread) return
1206  if(gfile%do_byteswap) call byteswap(gfile%aryr8len,nemsio_intkind,size(gfile%aryr8len))
1207  gfile%tlmeta=gfile%tlmeta+nread
1208  allocate(gfile%aryr8val(maxval(gfile%aryr8len),gfile%nmetaaryr8) )
1209  do i=1,gfile%nmetaaryr8
1210  iskip=iskip+nread
1211  iread=kind(gfile%aryr8val)*gfile%aryr8len(i)
1212  call bafrreadl(gfile%flunit,iskip,iread,nread,gfile%aryr8val(:,i))
1213  if(nread.lt.iread) return
1214  if(gfile%do_byteswap) call byteswap(gfile%aryr8val(:,i),nemsio_dblekind,gfile%aryr8len(i))
1215  gfile%tlmeta=gfile%tlmeta+nread
1216  enddo
1217  endif
1218 !
1219 !end if extrameta
1220  endif
1221 !
1222 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
1223  iret=0
1224  end subroutine nemsio_rcreate
1225 !------------------------------------------------------------------------------
1226  subroutine nemsio_wcreate(gfile,gfname,gaction,iret,gdatatype,version, &
1227  nmeta,lmeta,modelname,nrec,idate,nfday, &
1228  nfhour,nfminute,nfsecondn,nfsecondd, &
1229  dimx,dimy,dimz,nframe,nsoil,ntrac,jcap,ncldt,idvc,idsl,idvm,idrt, &
1230  rlon_min,rlon_max,rlat_min,rlat_max,extrameta, &
1231  nmetavari,nmetavarr,nmetavarl,nmetavarc,nmetavarr8, &
1232  nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc,nmetaaryr8, &
1233  recname,reclevtyp,reclev,vcoord,lat,lon,dx,dy,cpi,ri, &
1234  variname,varival,varrname,varrval,varlname,varlval,varcname,varcval, &
1235  varr8name,varr8val, &
1236  aryiname,aryilen,aryival,aryrname,aryrlen,aryrval, &
1237  arylname,aryllen,arylval,arycname,aryclen,arycval, &
1238  aryr8name,aryr8len,aryr8val )
1239 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
1240 ! abstract: write nemsio meta data
1241 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
1242  implicit none
1243  type(nemsio_gfile),intent(inout) :: gfile
1244  character*(*),intent(in) :: gfname
1245  character*(*),intent(in) :: gaction
1246  integer(nemsio_intkind),intent(out) :: iret
1247 !optional variables
1248  character*(*),optional,intent(in) :: gdatatype,modelname
1249  integer(nemsio_intkind),optional,intent(in) :: version,nmeta,lmeta,nrec
1250  integer(nemsio_intkind),optional,intent(in) :: idate(7),nfday,nfhour, &
1251  nfminute,nfsecondn,nfsecondd
1252  integer(nemsio_intkind),optional,intent(in) :: dimx,dimy,dimz,nframe, &
1253  nsoil,ntrac
1254  integer(nemsio_intkind),optional,intent(in) :: jcap,ncldt,idvc,idsl, &
1255  idvm,idrt
1256  real(nemsio_realkind),optional,intent(in) :: rlat_min,rlat_max, &
1257  rlon_min,rlon_max
1258  logical(nemsio_logickind),optional,intent(in):: extrameta
1259  integer(nemsio_intkind),optional,intent(in) :: nmetavari,nmetavarr, &
1260  nmetavarl,nmetavarc,nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
1261  nmetavarr8,nmetaaryr8
1262 !
1263  character*(*),optional,intent(in) :: recname(:),reclevtyp(:)
1264  integer(nemsio_intkind),optional,intent(in) :: reclev(:)
1265  real(nemsio_realkind),optional,intent(in) :: vcoord(:,:,:)
1266  real(nemsio_realkind),optional,intent(in) :: lat(:),lon(:)
1267  real(nemsio_realkind),optional,intent(in) :: dx(:),dy(:)
1268  real(nemsio_realkind),optional,intent(in) :: Cpi(:),Ri(:)
1269 !
1270  character*(*),optional,intent(in) :: variname(:),varrname(:),&
1271  varlname(:),varcname(:),varr8name(:),aryiname(:),aryrname(:), &
1272  arylname(:),arycname(:),aryr8name(:)
1273  integer(nemsio_intkind),optional,intent(in) :: aryilen(:),aryrlen(:), &
1274  aryllen(:),aryclen(:),aryr8len(:)
1275  integer(nemsio_intkind),optional,intent(in) :: varival(:),aryival(:,:)
1276  real(nemsio_realkind),optional,intent(in) :: varrval(:),aryrval(:,:)
1277  real(nemsio_dblekind),optional,intent(in) :: varr8val(:),aryr8val(:,:)
1278  logical(nemsio_logickind),optional,intent(in):: varlval(:),arylval(:,:)
1279  character(*),optional,intent(in) :: varcval(:),arycval(:,:)
1280 !
1281 !--- local variables
1282 !
1283  real(nemsio_realkind) :: radi
1284  integer(nemsio_intkind8) :: iskip,iwrite,nwrite
1285  type(nemsio_meta1) :: meta1
1286  type(nemsio_meta2) :: meta2
1287  type(nemsio_meta3) :: meta3
1288  integer(nemsio_intkind) :: i,n,ios,nummeta
1289  logical :: linit,ltlendian
1290  character(nemsio_charkind8) :: tmpgdatatype
1291 !------------------------------------------------------------
1292 ! set gfile meta data to operational model (default) if it's empty
1293 !------------------------------------------------------------
1294  iret=-3
1295 !first decide file endian
1296  gfile%file_endian='big_endian'
1297  if(present(gdatatype)) then
1298  if ( trim(gdatatype(1:4)).ne.'grib'.and.gdatatype(1:3).ne.'bin'.and. &
1299  trim(gdatatype).ne.'') return
1300  gfile%gdatatype=gdatatype
1301  if(trim(gfile%gdatatype(6:7))=='be')then
1302  gfile%file_endian='big_endian'
1303  elseif(trim(gfile%gdatatype(6:7))=='le') then
1304  gfile%file_endian='little_endian'
1305  endif
1306  elseif(trim(gfile%gdatatype).eq.'') then
1307  gfile%gdatatype='grib'
1308  endif
1309  tmpgdatatype=gfile%gdatatype
1310 !
1311  if(gfile%file_endian=='little_endian') then
1312 ! file is little endian
1313  call nemsio_close(gfile,iret=iret)
1314 ! reset file unit
1315  gfile%file_endian='little_endian'
1316  gfile%gdatatype=tmpgdatatype
1317  gfile%gfname=gfname
1318  gfile%gaction=gaction
1319  ltlendian=.true.
1320  call nemsio_getlu(gfile,gfname,gaction,iret,ltlendian=ltlendian)
1321  call baopenwt(gfile%flunit,gfname,ios)
1322  if(ios/=0) print *,'Cant open file ',trim(gfile%gfname)
1323 
1324  endif
1325 !
1326 ! print *,'NEMSIO file,datatype,model is ',gfile%gtype, &
1327 ! gfile%gdatatype,gfile%modelname,idate(1:7),'machine_endian=', &
1328 ! machine_endian,'gfile%file_endian=',gfile%file_endian,'gfile%do_byteswap=',gfile%do_byteswap
1329  gfile%do_byteswap=.false.
1330  if(trim(machine_endian)/=trim(gfile%file_endian)) gfile%do_byteswap=.true.
1331  gfile%gtype="NEMSIO"
1332  if(present(modelname)) then
1333  gfile%modelname=modelname
1334  elseif(trim(gfile%gdatatype).eq.'') then
1335  gfile%modelname="GFS"
1336  endif
1337  if(present(version)) gfile%version=version
1338  if(present(dimx)) gfile%dimx=dimx
1339  if(present(dimy)) gfile%dimy=dimy
1340  if(present(dimz)) gfile%dimz=dimz
1341  if(present(nrec)) gfile%nrec=nrec
1342  if(present(nmeta)) gfile%nmeta=nmeta
1343  if(gfile%nmeta==nemsio_intfill) gfile%nmeta=12
1344  if(present(lmeta)) gfile%lmeta=lmeta
1345  if(gfile%lmeta==nemsio_intfill) &
1346  gfile%lmeta=25*nemsio_intkind+4*nemsio_realkind+nemsio_logickind
1347  if(present(nsoil)) gfile%nsoil=nsoil
1348  if(gfile%nsoil.eq.nemsio_intfill) gfile%nsoil=4
1349  if(present(idrt)) gfile%idrt=idrt
1350  if(present(nframe)) gfile%nframe=nframe
1351  if(gfile%nframe.eq.nemsio_intfill) gfile%nframe=0
1352  if(equal_str_nocase(trim(gfile%modelname),'GFS'))gfile%nframe=0
1353  if(present(idate)) gfile%idate=idate
1354  if ( gfile%idate(1) .lt. 50) then
1355  gfile%idate(1)=2000+gfile%idate(1)
1356  else if (gfile%idate(1) .lt. 100) then
1357  gfile%idate(1)=1999+gfile%idate(1)
1358  endif
1359  if ( gfile%idate(1).eq.nemsio_intfill) then
1360  print *,'idate=',gfile%idate,' ERROR: please provide idate(1:7)(yyyy/mm/dd/hh/min/secn/secd)!!!'
1361  call nemsio_stop()
1362  endif
1363 !
1364  if ( gfile%gtype(1:6).eq."NEMSIO" ) then
1365  call nemsio_gfinit(gfile,ios,recname=recname,reclevtyp=reclevtyp,reclev=reclev)
1366  if (ios .ne.0 ) then
1367  iret=ios
1368  return
1369  endif
1370  endif
1371 !
1372 !------------------------------------------------------------
1373 ! set up basic gfile meta data variables from outsides to
1374 ! define meta data array
1375 !------------------------------------------------------------
1376  if(present(nfday)) gfile%nfday=nfday
1377  if(present(nfhour)) gfile%nfhour=nfhour
1378  if(present(nfminute)) gfile%nfminute=nfminute
1379  if(present(nfsecondn)) gfile%nfsecondn=nfsecondn
1380  if(present(nfsecondd)) gfile%nfsecondd=nfsecondd
1381  if(present(ntrac)) gfile%ntrac=ntrac
1382  if(gfile%ntrac.eq.nemsio_intfill) gfile%ntrac=0
1383  if(present(ncldt)) gfile%ncldt=ncldt
1384  if(present(jcap)) gfile%jcap=jcap
1385  if(present(idvc)) gfile%idvc=idvc
1386  if(present(idsl)) gfile%idsl=idsl
1387  if(present(idvm)) gfile%idvm=idvm
1388  if(present(rlon_min)) gfile%rlon_min=rlon_min
1389  if(present(rlon_max)) gfile%rlon_max=rlon_max
1390  if(present(rlat_min)) gfile%rlat_min=rlat_min
1391  if(present(rlat_max)) gfile%rlat_max=rlat_max
1392  if(present(extrameta)) gfile%extrameta=extrameta
1393  if(gfile%fieldsize.eq.nemsio_intfill) &
1394  gfile%fieldsize=(gfile%dimx+2*gfile%nframe)*(gfile%dimy+2*gfile%nframe)
1395 !
1396  if( gfile%extrameta )then
1397  if(present(nmetavari).and.present(variname).and.present(varival)) then
1398  if(nmetavari.gt.0 .and.size(variname).eq.nmetavari .and. &
1399  size(varival).eq.nmetavari) then
1400  gfile%nmetavari=nmetavari
1401  if(allocated(gfile%variname)) deallocate(gfile%variname)
1402  if(allocated(gfile%varival)) deallocate(gfile%varival)
1403  allocate(gfile%variname(nmetavari),gfile%varival(nmetavari))
1404  gfile%variname=variname
1405  gfile%varival=varival
1406  endif
1407  endif
1408  if(present(nmetavarr).and.present(varrname).and.present(varrval)) then
1409  if( nmetavarr.gt.0.and.size(varrname).eq.nmetavarr .and. &
1410  size(varrval).eq.nmetavarr) then
1411  gfile%nmetavarr=nmetavarr
1412  if(allocated(gfile%varrname)) deallocate(gfile%varrname)
1413  if(allocated(gfile%varrval)) deallocate(gfile%varrval)
1414  allocate(gfile%varrname(nmetavarr),gfile%varrval(nmetavarr))
1415  gfile%varrname=varrname
1416  gfile%varrval=varrval
1417  endif
1418  endif
1419  if(present(nmetavarl).and.present(varlname).and.present(varlval)) then
1420  if( nmetavarl.gt.0.and.size(varlname).eq.nmetavarl .and. &
1421  size(varlval).eq.nmetavarl) then
1422  gfile%nmetavarl=nmetavarl
1423  if(allocated(gfile%varlname)) deallocate(gfile%varlname)
1424  if(allocated(gfile%varlval)) deallocate(gfile%varlval)
1425  allocate(gfile%varlname(nmetavarl),gfile%varlval(nmetavarl))
1426  gfile%varlname=varlname
1427  gfile%varlval=varlval
1428  endif
1429  endif
1430  if(present(nmetavarc).and.present(varcname).and.present(varcval)) then
1431  if( nmetavarc.gt.0.and.size(varcname).eq.nmetavarc .and. &
1432  size(varcval).eq.nmetavarc) then
1433  gfile%nmetavarc=nmetavarc
1434  if(allocated(gfile%varcname)) deallocate(gfile%varcname)
1435  if(allocated(gfile%varcval)) deallocate(gfile%varcval)
1436  allocate(gfile%varcname(nmetavarc),gfile%varcval(nmetavarc))
1437  gfile%varcname=varcname
1438  gfile%varcval=varcval
1439  endif
1440  endif
1441  if(present(nmetavarr8).and.present(varr8name).and.present(varr8val)) then
1442  if( nmetavarr8.gt.0.and.size(varr8name).eq.nmetavarr8 .and. &
1443  size(varr8val).eq.nmetavarr8) then
1444  gfile%nmetavarr8=nmetavarr8
1445  if(allocated(gfile%varr8name)) deallocate(gfile%varr8name)
1446  if(allocated(gfile%varr8val)) deallocate(gfile%varr8val)
1447  allocate(gfile%varr8name(nmetavarr8),gfile%varr8val(nmetavarr8))
1448  gfile%varr8name=varr8name
1449  gfile%varr8val=varr8val
1450  endif
1451  endif
1452  if(present(nmetaaryi).and.present(aryiname).and.present(aryilen)) then
1453  if( nmetaaryi.gt.0.and.size(aryiname).eq.nmetaaryi .and. &
1454  size(aryilen).eq.nmetaaryi) then
1455  gfile%nmetaaryi=nmetaaryi
1456  if(allocated(gfile%aryiname)) deallocate(gfile%aryiname)
1457  if(allocated(gfile%aryilen)) deallocate(gfile%aryilen)
1458  allocate(gfile%aryiname(nmetaaryi),gfile%aryilen(nmetaaryi))
1459  gfile%aryiname=aryiname
1460  gfile%aryilen=aryilen
1461  if(present(aryival)) then
1462  if(size(aryival).eq.nmetaaryi*maxval(gfile%aryilen) ) then
1463  if(allocated(gfile%aryival)) deallocate(gfile%aryival)
1464  allocate(gfile%aryival(maxval(gfile%aryilen),nmetaaryi))
1465  gfile%aryival=aryival
1466  endif
1467  endif
1468  endif
1469  endif
1470  if(present(nmetaaryr).and.present(aryrname).and.present(aryrlen)) then
1471  if( nmetaaryr.gt.0.and.size(aryrname).eq.nmetaaryr .and. &
1472  size(aryrlen).eq.nmetaaryr) then
1473  gfile%nmetaaryr=nmetaaryr
1474  if(allocated(gfile%aryrname)) deallocate(gfile%aryrname)
1475  if(allocated(gfile%aryrlen)) deallocate(gfile%aryrlen)
1476  allocate(gfile%aryrname(nmetaaryr),gfile%aryrlen(nmetaaryr))
1477  gfile%aryrname=aryrname
1478  gfile%aryrlen=aryrlen
1479  if(present(aryrval) ) then
1480  if(size(aryrval).eq.nmetaaryr*maxval(gfile%aryrlen)) then
1481  if(allocated(gfile%aryrval)) deallocate(gfile%aryrval)
1482  allocate(gfile%aryrval(maxval(gfile%aryrlen),nmetaaryr))
1483  gfile%aryrval=aryrval
1484  endif
1485  endif
1486  endif
1487  endif
1488  if(present(nmetaaryl).and.present(arylname).and.present(aryllen)) then
1489  if( nmetaaryl.gt.0 .and.size(arylname).eq.nmetaaryl .and. &
1490  size(aryllen).eq.nmetaaryl) then
1491  gfile%nmetaaryl=nmetaaryl
1492  if(allocated(gfile%arylname)) deallocate(gfile%arylname)
1493  if(allocated(gfile%aryllen)) deallocate(gfile%aryllen)
1494  allocate(gfile%arylname(nmetaaryl),gfile%aryllen(nmetaaryl))
1495  gfile%arylname=arylname
1496  gfile%aryllen=aryllen
1497  if(present(arylval)) then
1498  if(size(arylval).eq.nmetaaryl*maxval(gfile%aryllen)) then
1499  if(allocated(gfile%arylval)) deallocate(gfile%arylval)
1500  allocate(gfile%arylval(maxval(gfile%aryllen),nmetaaryl))
1501  gfile%arylval=arylval
1502  endif
1503  endif
1504  endif
1505  endif
1506  if(present(nmetaaryc).and.present(arycname).and.present(aryclen)) then
1507  if( nmetaaryc.gt.0 .and.size(arycname).eq.nmetaaryc .and. &
1508  size(aryclen).eq.nmetaaryc) then
1509  gfile%nmetaaryc=nmetaaryc
1510  if(allocated(gfile%arycname)) deallocate(gfile%arycname)
1511  if(allocated(gfile%aryclen)) deallocate(gfile%aryclen)
1512  allocate(gfile%arycname(nmetaaryc),gfile%aryclen(nmetaaryc))
1513  gfile%arycname=arycname
1514  gfile%aryclen=aryclen
1515  if(present(arycval)) then
1516  if(size(arycval).eq.nmetaaryc*maxval(gfile%aryclen)) then
1517  if(allocated(gfile%arycval)) deallocate(gfile%arycval)
1518  allocate(gfile%arycval(maxval(gfile%aryclen),nmetaaryc))
1519  gfile%arycval=arycval
1520  endif
1521  endif
1522  endif
1523  endif
1524  if(present(nmetaaryr8).and.present(aryr8name).and.present(aryr8len)) then
1525  if( nmetaaryr8.gt.0.and.size(aryr8name).eq.nmetaaryr8 .and. &
1526  size(aryr8len).eq.nmetaaryr8) then
1527  gfile%nmetaaryr8=nmetaaryr8
1528  if(allocated(gfile%aryr8name)) deallocate(gfile%aryr8name)
1529  if(allocated(gfile%aryr8len)) deallocate(gfile%aryr8len)
1530  allocate(gfile%aryr8name(nmetaaryr8),gfile%aryr8len(nmetaaryr8))
1531  gfile%aryr8name=aryr8name
1532  gfile%aryr8len=aryr8len
1533  if(present(aryr8val) ) then
1534  if(size(aryr8val).eq.nmetaaryr8*maxval(gfile%aryr8len)) then
1535  if(allocated(gfile%aryr8val)) deallocate(gfile%aryr8val)
1536  allocate(gfile%aryr8val(maxval(gfile%aryr8len),nmetaaryr8))
1537  gfile%aryr8val=aryr8val
1538  endif
1539  endif
1540  endif
1541  endif
1542  if (gfile%nmetavari+gfile%nmetavarr+gfile%nmetavarl+gfile%nmetavarc+ &
1543  gfile%nmetaaryi+gfile%nmetaaryr+gfile%nmetaaryl+gfile%nmetaaryc+ &
1544  gfile%nmetavarr8+gfile%nmetaaryr8 .lt.10*nemsio_intfill )then
1545  print *,'ERROR: gfile%extrameta is not compatiable with input extra meta!'
1546  return
1547  endif
1548  endif
1549 !------------------------------------------------------------
1550 ! check gfile meta data array size
1551 !------------------------------------------------------------
1552  call nemsio_chkgfary(gfile,ios)
1553  if (ios.ne. 0) then
1554  iret=ios
1555  return
1556  endif
1557 !------------------------------------------------------------
1558 ! continue to set gfile meta data variables tnd arrays
1559 !------------------------------------------------------------
1560 !set gfile data type to bin/grb, default set to grb
1561 !recname
1562  if(present(recname) ) then
1563  if (gfile%nrec.eq.size(recname)) then
1564  gfile%recname=recname
1565  else
1566  print *,'ERROR: the size of recname is not equal to the total number of the fields in the file!'
1567  return
1568  endif
1569  endif
1570 !reclevtyp
1571  if(present(reclevtyp)) then
1572  if (gfile%nrec.eq.size(reclevtyp)) then
1573  gfile%reclevtyp=reclevtyp
1574  else
1575  print *,'ERROR: the size of reclevtyp is not equal to the total number of the fields in the file!'
1576  return
1577  endif
1578  endif
1579 !reclev
1580  if(present(reclev) ) then
1581  if (gfile%nrec.eq.size(reclev)) then
1582  gfile%reclev=reclev
1583  else
1584  print *,'ERROR: the size of reclev is not equal to the total number of the fields in the file!'
1585  return
1586  endif
1587  endif
1588 !
1589 !vcoord vcoord(levs+1
1590  if(present(vcoord) ) then
1591  if ((gfile%dimz+1)*3*2.eq.size(vcoord)) then
1592  gfile%vcoord=vcoord
1593  else
1594  print *,'ERROR: the size of vcoord is not (lm+1,3,2) !'
1595  return
1596  endif
1597  endif
1598 !lat
1599  if(present(lat) ) then
1600 ! write(0,*)'gfile%fieldsize=',gfile%fieldsize,'size(lat)=',size(lat)
1601  if (gfile%fieldsize.eq.size(lat)) then
1602  if(.not.(all(lat==0.))) gfile%lat=lat
1603  else
1604  print *,'ERROR: the input size(lat) ',size(lat),' is not equal to: ',gfile%fieldsize
1605  return
1606  endif
1607  endif
1608  if(allocated(gfile%lat)) then
1609  gfile%rlat_max=maxval(gfile%lat)
1610  gfile%rlat_min=minval(gfile%lat)
1611  endif
1612 !lon
1613  if(present(lon) ) then
1614  if (gfile%fieldsize.eq.size(lon)) then
1615  if(.not.(all(lon==0.)) ) gfile%lon=lon
1616  else
1617  print *,'ERROR: the input size(lon) ',size(lon),' is not equal to: ',gfile%fieldsize
1618  return
1619  endif
1620  endif
1621  if(allocated(gfile%lon)) then
1622  gfile%rlon_max=maxval(gfile%lon)
1623  gfile%rlon_min=minval(gfile%lon)
1624  endif
1625 !dx
1626  if(present(dx) ) then
1627 ! write(0,*)'gfile%fieldsize=',gfile%fieldsize,'size(dx)=',size(dx)
1628  if (gfile%fieldsize.eq.size(dx)) then
1629  if(.not.(all(dx==0.)) ) gfile%dx=dx
1630  else
1631  print *,'ERROR: the input size(dx) ',size(dx),' is not equal to: ',gfile%fieldsize
1632  return
1633  endif
1634  endif
1635 !dy
1636  if(present(dy) ) then
1637  if (gfile%fieldsize.eq.size(dy)) then
1638  if(.not.(all(dy==0.)) ) gfile%dy=dy
1639  else
1640  print *,'ERROR: the input size(dy) ',size(dy),' is not equal to: ',gfile%fieldsize
1641  return
1642  endif
1643  endif
1644 !Cpi
1645  if( present(cpi) ) then
1646  if (gfile%ntrac+1.eq.size(gfile%Cpi)) then
1647  if(.not.(all(cpi==0.))) gfile%Cpi = cpi
1648  else
1649  print *,'ERROR: the input size(cpi) ',size(cpi),' is not equal to: ',gfile%ntrac+1
1650  return
1651  endif
1652 
1653  endif
1654 !Ri
1655  if( present(ri) ) then
1656  if (gfile%ntrac+1.eq.size(gfile%Ri)) then
1657  if(.not.(all(ri==0.))) gfile%Ri = ri
1658  else
1659  print *,'ERROR: the input size(ri) ',size(ri),' is not equal to: ',gfile%ntrac+1
1660  return
1661  endif
1662  endif
1663 !
1664 !------------------------------------------------------------
1665 ! write out first meta data record
1666 !------------------------------------------------------------
1667  meta1%gtype=gfile%gtype
1668  meta1%gdatatype=gfile%gdatatype
1669  meta1%modelname=gfile%modelname
1670  meta1%version=gfile%version
1671  meta1%nmeta=gfile%nmeta
1672  meta1%lmeta=gfile%lmeta
1673  meta1%reserve=0
1674  iskip=0
1675  iwrite=nemsio_lmeta1
1676  if(gfile%do_byteswap) call byteswap(meta1%version,nemsio_intkind,6)
1677  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,meta1)
1678  if(nwrite.lt.iwrite) return
1679  if(gfile%do_byteswap) call byteswap(meta1%version,nemsio_intkind,6)
1680  gfile%tlmeta=nwrite
1681 !------------------------------------------------------------
1682 ! write out second meta data record
1683 !------------------------------------------------------------
1684  meta2%nrec=gfile%nrec
1685  meta2%idate(1:7)=gfile%idate(1:7)
1686  meta2%nfday=gfile%nfday
1687  meta2%nfhour=gfile%nfhour
1688  meta2%nfminute=gfile%nfminute
1689  meta2%nfsecondn=gfile%nfsecondn
1690  meta2%nfsecondd=gfile%nfsecondd
1691  meta2%dimx=gfile%dimx
1692  meta2%dimy=gfile%dimy
1693  meta2%dimz=gfile%dimz
1694  meta2%nframe=gfile%nframe
1695  meta2%nsoil=gfile%nsoil
1696  meta2%ntrac=gfile%ntrac
1697  meta2%jcap=gfile%jcap
1698  meta2%ncldt=gfile%ncldt
1699  meta2%idvc=gfile%idvc
1700  meta2%idsl=gfile%idsl
1701  meta2%idvm=gfile%idvm
1702  meta2%idrt=gfile%idrt
1703  meta2%rlon_min=gfile%rlon_min
1704  meta2%rlon_max=gfile%rlon_max
1705  meta2%rlat_min=gfile%rlat_min
1706  meta2%rlat_max=gfile%rlat_max
1707  meta2%extrameta=gfile%extrameta
1708  iskip=iskip+nwrite
1709  iwrite=gfile%lmeta
1710  if(gfile%do_byteswap) then
1711  call byteswap(meta2%nrec,nemsio_intkind,25)
1712  call byteswap(meta2%rlon_min,nemsio_realkind,4)
1713  call byteswap(meta2%extrameta,nemsio_logickind,1)
1714  endif
1715  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,meta2)
1716  if(gfile%do_byteswap) then
1717  call byteswap(meta2%nrec,nemsio_intkind,25)
1718  call byteswap(meta2%rlon_min,nemsio_realkind,4)
1719  call byteswap(meta2%extrameta,nemsio_logickind,1)
1720  endif
1721  if(nwrite.lt.iwrite) return
1722  gfile%tlmeta=gfile%tlmeta+nwrite
1723 !------------------------------------------------------------
1724 ! write out 3rd-13th meta data record (arrays)
1725 !------------------------------------------------------------
1726 !recname
1727  if ( gfile%nmeta-2>0 ) then
1728  iskip=iskip+nwrite
1729  iwrite=len(gfile%recname)*size(gfile%recname)
1730  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%recname)
1731  if(nwrite.lt.iwrite) return
1732  gfile%tlmeta=gfile%tlmeta+nwrite
1733  endif
1734 
1735 !reclevtyp
1736  if ( gfile%nmeta-3>0 ) then
1737  iskip=iskip+nwrite
1738  iwrite=len(gfile%reclevtyp)*size(gfile%reclevtyp)
1739  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%reclevtyp)
1740  if(nwrite.lt.iwrite) return
1741  gfile%tlmeta=gfile%tlmeta+nwrite
1742  endif
1743 
1744 !reclev
1745  if ( gfile%nmeta-4>0 ) then
1746  iskip=iskip+nwrite
1747  iwrite=kind(gfile%reclev)*size(gfile%reclev)
1748  if(gfile%do_byteswap) call byteswap(gfile%reclev,nemsio_intkind,size(gfile%reclev))
1749  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%reclev)
1750  if(nwrite.lt.iwrite) return
1751  if(gfile%do_byteswap) call byteswap(gfile%reclev,nemsio_intkind,size(gfile%reclev))
1752  gfile%tlmeta=gfile%tlmeta+nwrite
1753  endif
1754 !vcoord
1755  nummeta=gfile%nmeta-5
1756  if ( nummeta.gt.0 ) then
1757  iskip=iskip+nwrite
1758  iwrite=kind(gfile%vcoord)*size(gfile%vcoord)
1759  if(gfile%do_byteswap) call byteswap(gfile%vcoord,nemsio_realkind,size(gfile%vcoord))
1760  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%vcoord)
1761  if(gfile%do_byteswap) call byteswap(gfile%vcoord,nemsio_realkind,size(gfile%vcoord))
1762  if(nwrite.lt.iwrite) return
1763  gfile%tlmeta=gfile%tlmeta+nwrite
1764 ! print *,'tlmetavcoord=',gfile%tlmeta,'nwrite=',nwrite,'nummeta=', &
1765 ! nummeta,'gfile%nmeta=',gfile%nmeta
1766  nummeta=nummeta-1
1767  endif
1768 !lat
1769  if ( nummeta.gt.0 ) then
1770  iskip=iskip+nwrite
1771  iwrite=kind(gfile%lat)*size(gfile%lat)
1772  if(gfile%do_byteswap) call byteswap(gfile%lat,nemsio_realkind,size(gfile%lat))
1773  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%lat)
1774  if(nwrite.lt.iwrite) return
1775  if(gfile%do_byteswap) call byteswap(gfile%lat,nemsio_realkind,size(gfile%lat))
1776  gfile%tlmetalat=gfile%tlmeta
1777  gfile%tlmeta=gfile%tlmeta+nwrite
1778  nummeta=nummeta-1
1779  endif
1780 !lon
1781  if ( nummeta.gt.0 ) then
1782  iskip=iskip+nwrite
1783  iwrite=kind(gfile%lon)*size(gfile%lon)
1784  if(gfile%do_byteswap) call byteswap(gfile%lon,nemsio_realkind,size(gfile%lon))
1785  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%lon)
1786  if(nwrite.lt.iwrite) return
1787  if(gfile%do_byteswap) call byteswap(gfile%lon,nemsio_realkind,size(gfile%lon))
1788  gfile%tlmetalon=gfile%tlmeta
1789  gfile%tlmeta=gfile%tlmeta+nwrite
1790  nummeta=nummeta-1
1791  endif
1792 !dx
1793  if ( nummeta.gt.0 ) then
1794  if(all(gfile%dx==0.)) gfile%dx=nemsio_realfill
1795  iskip=iskip+nwrite
1796  iwrite=kind(gfile%dx)*size(gfile%dx)
1797  if(gfile%do_byteswap) call byteswap(gfile%dx,nemsio_realkind,size(gfile%dx))
1798  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%dx)
1799  if(gfile%do_byteswap) call byteswap(gfile%dx,nemsio_realkind,size(gfile%dx))
1800  if(nwrite.lt.iwrite) return
1801  gfile%tlmetadx=gfile%tlmeta
1802  gfile%tlmeta=gfile%tlmeta+nwrite
1803  nummeta=nummeta-1
1804  endif
1805 !dy
1806  if ( nummeta.gt.0 ) then
1807  if(all(gfile%dy==0.)) gfile%dy=nemsio_realfill
1808  iskip=iskip+nwrite
1809  iwrite=kind(gfile%dy)*size(gfile%dy)
1810  if(gfile%do_byteswap) call byteswap(gfile%dy,nemsio_realkind,size(gfile%dy))
1811  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%dy)
1812  if(nwrite.lt.iwrite) return
1813  if(gfile%do_byteswap) call byteswap(gfile%dy,nemsio_realkind,size(gfile%dy))
1814  gfile%tlmetady=gfile%tlmeta
1815  gfile%tlmeta=gfile%tlmeta+nwrite
1816  nummeta=nummeta-1
1817  endif
1818 !Cpi
1819  if ( nummeta.gt.0 ) then
1820  if(all(gfile%cpi==0.)) gfile%cpi=nemsio_realfill
1821  iskip=iskip+nwrite
1822  iwrite=kind(gfile%Cpi)*size(gfile%Cpi)
1823  if(gfile%do_byteswap) call byteswap(gfile%Cpi,nemsio_realkind,size(gfile%Cpi))
1824  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%Cpi)
1825  if(nwrite.lt.iwrite) return
1826  if(gfile%do_byteswap) call byteswap(gfile%Cpi,nemsio_realkind,size(gfile%Cpi))
1827  gfile%tlmeta=gfile%tlmeta+nwrite
1828  nummeta=nummeta-1
1829  endif
1830 !Ri
1831  if ( nummeta.gt.0 ) then
1832  if(all(gfile%ri==0.)) gfile%ri=nemsio_realfill
1833  iskip=iskip+nwrite
1834  iwrite=kind(gfile%Ri)*size(gfile%Ri)
1835  if(gfile%do_byteswap) call byteswap(gfile%Ri,nemsio_realkind,size(gfile%Ri))
1836  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%Ri)
1837  if(nwrite.lt.iwrite) return
1838  if(gfile%do_byteswap) call byteswap(gfile%Ri,nemsio_realkind,size(gfile%Ri))
1839  gfile%tlmeta=gfile%tlmeta+nwrite
1840  nummeta=nummeta-1
1841  endif
1842 !------------------------------------------------------------
1843 ! write out extra meta data record
1844 !------------------------------------------------------------
1845  if(gfile%extrameta) then
1846  meta3%nmetavari=gfile%nmetavari
1847  meta3%nmetavarr=gfile%nmetavarr
1848  meta3%nmetavarl=gfile%nmetavarl
1849  meta3%nmetavarc=gfile%nmetavarc
1850  meta3%nmetaaryi=gfile%nmetaaryi
1851  meta3%nmetaaryr=gfile%nmetaaryr
1852  meta3%nmetaaryl=gfile%nmetaaryl
1853  meta3%nmetaaryc=gfile%nmetaaryc
1854  meta3%nmetavarr8=gfile%nmetavarr8
1855  meta3%nmetaaryr8=gfile%nmetaaryr8
1856  iskip=iskip+nwrite
1857  if(gfile%nmetavarr8>0.or.gfile%nmetaaryr8>0) then
1858  iwrite=nemsio_lmeta3
1859  else
1860  iwrite=nemsio_lmeta3-8
1861  endif
1862  if(gfile%do_byteswap) call byteswap(meta3%nmetavari,nemsio_intkind,10)
1863  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,meta3)
1864  if(gfile%do_byteswap) call byteswap(meta3%nmetavari,nemsio_intkind,10)
1865  if(nwrite.lt.iwrite) return
1866  gfile%tlmeta=gfile%tlmeta+nwrite
1867 !
1868 !-- write meta var integer
1869  if (gfile%nmetavari.gt.0) then
1870  iskip=iskip+nwrite
1871  iwrite=len(gfile%variname)*gfile%nmetavari
1872  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%variname)
1873 ! print *,'tlmetavari=',gfile%tlmeta,'iwrite=',iwrite,'nwrite=',nwrite
1874  if(nwrite.lt.iwrite) return
1875  gfile%tlmeta=gfile%tlmeta+nwrite
1876  iskip=iskip+nwrite
1877  iwrite=kind(gfile%varival)*gfile%nmetavari
1878  if(gfile%do_byteswap) call byteswap(gfile%varival,nemsio_intkind,size(gfile%varival))
1879  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varival)
1880 ! print *,'tlmetavarival=',gfile%tlmeta,'iwrite=',iwrite,'nwrite=',nwrite
1881  if(nwrite.lt.iwrite) return
1882  if(gfile%do_byteswap) call byteswap(gfile%varival,nemsio_intkind,size(gfile%varival))
1883  gfile%tlmetavarival=gfile%tlmeta
1884  gfile%tlmeta=gfile%tlmeta+nwrite
1885  endif
1886 !var real4
1887  if (gfile%nmetavarr.gt.0) then
1888  iskip=iskip+nwrite
1889  iwrite=len(gfile%varrname)*gfile%nmetavarr
1890  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varrname)
1891 ! print *,'tlmetavarr=',gfile%tlmeta,'iwrite=',iwrite,'nwrite=',nwrite
1892  if(nwrite.lt.iwrite) return
1893  gfile%tlmeta=gfile%tlmeta+nwrite
1894  iskip=iskip+nwrite
1895  iwrite=kind(gfile%varrval)*gfile%nmetavarr
1896  if(gfile%do_byteswap) call byteswap(gfile%varrval,nemsio_realkind,size(gfile%varrval))
1897  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varrval)
1898  if(nwrite.lt.iwrite) return
1899  if(gfile%do_byteswap) call byteswap(gfile%varrval,nemsio_realkind,size(gfile%varrval))
1900  gfile%tlmeta=gfile%tlmeta+nwrite
1901  endif
1902 !var logical
1903  if (gfile%nmetavarl.gt.0) then
1904  iskip=iskip+nwrite
1905  iwrite=len(gfile%varlname)*gfile%nmetavarl
1906  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varlname)
1907  if(nwrite.lt.iwrite) return
1908  gfile%tlmeta=gfile%tlmeta+nwrite
1909  iskip=iskip+nwrite
1910  iwrite=kind(gfile%varlval)*gfile%nmetavarl
1911  if(gfile%do_byteswap) call byteswap(gfile%varlval,nemsio_logickind,size(gfile%varlval))
1912  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varlval)
1913  if(nwrite.lt.iwrite) return
1914  if(gfile%do_byteswap) call byteswap(gfile%varlval,nemsio_logickind,size(gfile%varlval))
1915  gfile%tlmeta=gfile%tlmeta+nwrite
1916  endif
1917 !var character
1918  if (gfile%nmetavarc.gt.0) then
1919  iskip=iskip+nwrite
1920  iwrite=len(gfile%varcname)*gfile%nmetavarc
1921  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varcname)
1922  if(nwrite.lt.iwrite) return
1923  gfile%tlmeta=gfile%tlmeta+nwrite
1924  iskip=iskip+nwrite
1925  iwrite=len(gfile%varcval)*gfile%nmetavarc
1926  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varcval)
1927  if(nwrite.lt.iwrite) return
1928  gfile%tlmeta=gfile%tlmeta+nwrite
1929  endif
1930 !var real8
1931  if (gfile%nmetavarr8.gt.0) then
1932  iskip=iskip+nwrite
1933  iwrite=len(gfile%varr8name)*gfile%nmetavarr8
1934  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varr8name)
1935  if(nwrite.lt.iwrite) return
1936  gfile%tlmeta=gfile%tlmeta+nwrite
1937  iskip=iskip+nwrite
1938  iwrite=kind(gfile%varr8val)*gfile%nmetavarr8
1939  if(gfile%do_byteswap) call byteswap(gfile%varr8val,nemsio_dblekind,size(gfile%varr8val))
1940  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varr8val)
1941  if(nwrite.lt.iwrite) return
1942  if(gfile%do_byteswap) call byteswap(gfile%varr8val,nemsio_dblekind,size(gfile%varr8val))
1943  gfile%tlmeta=gfile%tlmeta+nwrite
1944  endif
1945 !meta arr integer
1946  if (gfile%nmetaaryi.gt.0) then
1947  iskip=iskip+nwrite
1948  iwrite=len(gfile%aryiname)*gfile%nmetaaryi
1949  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryiname)
1950  if(nwrite.lt.iwrite) return
1951  gfile%tlmeta=gfile%tlmeta+nwrite
1952  iskip=iskip+nwrite
1953  iwrite=kind(gfile%aryilen)*gfile%nmetaaryi
1954  if(gfile%do_byteswap) call byteswap(gfile%aryilen,nemsio_intkind,size(gfile%aryilen))
1955  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryilen)
1956  if(nwrite.lt.iwrite) return
1957  if(gfile%do_byteswap) call byteswap(gfile%aryilen,nemsio_intkind,size(gfile%aryilen))
1958  gfile%tlmeta=gfile%tlmeta+nwrite
1959  gfile%tlmetaaryival=gfile%tlmeta
1960  do i=1,gfile%nmetaaryi
1961  iskip=iskip+nwrite
1962  iwrite=kind(gfile%aryival)*gfile%aryilen(i)
1963  if(gfile%do_byteswap) call byteswap(gfile%aryival(:,i),nemsio_intkind,gfile%aryilen(i))
1964  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite, &
1965  gfile%aryival(1:gfile%aryilen(i),i))
1966  if(gfile%do_byteswap) call byteswap(gfile%aryival(:,i),nemsio_intkind,gfile%aryilen(i))
1967  if(nwrite.lt.iwrite) return
1968  gfile%tlmeta=gfile%tlmeta+nwrite
1969  enddo
1970  endif
1971 !meta arr real
1972  if (gfile%nmetaaryr.gt.0) then
1973  iskip=iskip+nwrite
1974  iwrite=len(gfile%aryrname)*gfile%nmetaaryr
1975  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryrname)
1976  if(nwrite.lt.iwrite) return
1977  gfile%tlmeta=gfile%tlmeta+nwrite
1978  iskip=iskip+nwrite
1979  iwrite=kind(gfile%aryrlen)*gfile%nmetaaryr
1980  if(gfile%do_byteswap) call byteswap(gfile%aryrlen,nemsio_intkind,size(gfile%aryrlen))
1981  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryrlen)
1982  if(nwrite.lt.iwrite) return
1983  if(gfile%do_byteswap) call byteswap(gfile%aryrlen,nemsio_intkind,size(gfile%aryrlen))
1984  gfile%tlmeta=gfile%tlmeta+nwrite
1985  do i=1,gfile%nmetaaryr
1986  iskip=iskip+nwrite
1987  iwrite=kind(gfile%aryrval)*gfile%aryrlen(i)
1988  if(gfile%do_byteswap) call byteswap(gfile%aryrval(:,i),nemsio_realkind,gfile%aryrlen(i))
1989  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite, &
1990  gfile%aryrval(1:gfile%aryrlen(i),i))
1991  if(gfile%do_byteswap) call byteswap(gfile%aryrval(:,i),nemsio_realkind,gfile%aryrlen(i))
1992  if(nwrite.lt.iwrite) return
1993  gfile%tlmeta=gfile%tlmeta+nwrite
1994  enddo
1995  endif
1996 !meta arr logical
1997  if (gfile%nmetaaryl.gt.0) then
1998  iskip=iskip+nwrite
1999  iwrite=len(gfile%arylname)*gfile%nmetaaryl
2000  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%arylname)
2001  if(nwrite.lt.iwrite) return
2002  gfile%tlmeta=gfile%tlmeta+nwrite
2003  iskip=iskip+nwrite
2004  iwrite=kind(gfile%aryllen)*gfile%nmetaaryl
2005  if(gfile%do_byteswap) call byteswap(gfile%aryllen,nemsio_intkind,size(gfile%aryllen))
2006  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryllen)
2007  if(nwrite.lt.iwrite) return
2008  if(gfile%do_byteswap) call byteswap(gfile%aryllen,nemsio_intkind,size(gfile%aryllen))
2009  gfile%tlmeta=gfile%tlmeta+nwrite
2010  do i=1,gfile%nmetaaryl
2011  iskip=iskip+nwrite
2012  iwrite=kind(gfile%arylval)*gfile%aryllen(i)
2013  if(gfile%do_byteswap) call byteswap(gfile%arylval(:,i),nemsio_logickind,gfile%aryllen(i))
2014  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite, &
2015  gfile%arylval(1:gfile%aryllen(i),i))
2016  if(nwrite.lt.iwrite) return
2017  if(gfile%do_byteswap) call byteswap(gfile%arylval(:,i),nemsio_logickind,gfile%aryllen(i))
2018  gfile%tlmeta=gfile%tlmeta+nwrite
2019  enddo
2020  endif
2021 !meta arr character array
2022  if (gfile%nmetaaryc.gt.0) then
2023  iskip=iskip+nwrite
2024  iwrite=len(gfile%arycname)*gfile%nmetaaryc
2025  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%arycname)
2026  if(nwrite.lt.iwrite) return
2027  gfile%tlmeta=gfile%tlmeta+nwrite
2028  iskip=iskip+nwrite
2029  iwrite=kind(gfile%aryclen)*gfile%nmetaaryc
2030  if(gfile%do_byteswap) call byteswap(gfile%aryclen,nemsio_intkind,size(gfile%aryclen))
2031  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryclen)
2032  if(nwrite.lt.iwrite) return
2033  if(gfile%do_byteswap) call byteswap(gfile%aryclen,nemsio_intkind,size(gfile%aryclen))
2034  gfile%tlmeta=gfile%tlmeta+nwrite
2035  do i=1,gfile%nmetaaryc
2036  iskip=iskip+nwrite
2037  iwrite=len(gfile%arycval)*gfile%aryclen(i)
2038  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite, &
2039  gfile%arycval(1:gfile%aryclen(i),i))
2040  if(nwrite.lt.iwrite) return
2041  gfile%tlmeta=gfile%tlmeta+nwrite
2042  enddo
2043  endif
2044 !meta arr real8
2045  if (gfile%nmetaaryr8.gt.0) then
2046  iskip=iskip+nwrite
2047  iwrite=len(gfile%aryr8name)*gfile%nmetaaryr8
2048  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryr8name)
2049  if(nwrite.lt.iwrite) return
2050  gfile%tlmeta=gfile%tlmeta+nwrite
2051  iskip=iskip+nwrite
2052  iwrite=kind(gfile%aryr8len)*gfile%nmetaaryr8
2053  if(gfile%do_byteswap) call byteswap(gfile%aryr8len,nemsio_intkind,size(gfile%aryr8len))
2054  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%aryr8len)
2055  if(nwrite.lt.iwrite) return
2056  if(gfile%do_byteswap) call byteswap(gfile%aryr8len,nemsio_intkind,size(gfile%aryr8len))
2057  gfile%tlmeta=gfile%tlmeta+nwrite
2058  do i=1,gfile%nmetaaryr8
2059  iskip=iskip+nwrite
2060  iwrite=kind(gfile%aryr8val)*gfile%aryr8len(i)
2061  if(gfile%do_byteswap) call byteswap(gfile%aryr8val(:,i),nemsio_dblekind,gfile%aryr8len(i))
2062  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite, &
2063  gfile%aryr8val(1:gfile%aryr8len(i),i))
2064  if(nwrite.lt.iwrite) return
2065  if(gfile%do_byteswap) call byteswap(gfile%aryr8val(:,i),nemsio_dblekind,gfile%aryr8len(i))
2066  gfile%tlmeta=gfile%tlmeta+nwrite
2067  enddo
2068  endif
2069 
2070  endif
2071 
2072  iret=0
2073 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2074  end subroutine nemsio_wcreate
2075 !------------------------------------------------------------------------------
2076  subroutine nemsio_setfheadvari(gfile,varname,varval,iret)
2077 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2078 ! abstract: reset meta data integer value from file header, ONLY for time
2079 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2080  implicit none
2081  type(nemsio_gfile),intent(inout) :: gfile
2082  character(len=*), intent(in) :: varname
2083  integer(nemsio_intkind),intent(in) :: varval
2084  integer(nemsio_intkind),optional,intent(out) :: iret
2085  integer i,j,lhead
2086  integer(nemsio_intkind8) :: iskip,iwrite,nwrite
2087  type(nemsio_meta2) :: meta2
2088 !---
2089  if(present(iret) ) iret=-17
2090  lhead=0
2091 !--- only allow change time in second meta data
2092  if (equal_str_nocase(trim(varname),'nfday')) then
2093  gfile%nfday=varval
2094  gfile%headvarival(5)=varval
2095  lhead=1
2096  else if (equal_str_nocase(trim(varname),'nfhour')) then
2097  gfile%nfhour=varval
2098  gfile%headvarival(6)=varval
2099  lhead=1
2100  else if (equal_str_nocase(trim(varname),'nfminute')) then
2101  gfile%nfminute=varval
2102  gfile%headvarival(7)=varval
2103  lhead=1
2104  else if (equal_str_nocase(trim(varname),'nfsecondd')) then
2105  gfile%nfsecondd=varval
2106  gfile%headvarival(8)=varval
2107  lhead=1
2108  else if (equal_str_nocase(trim(varname),'nfsecondn')) then
2109  gfile%nfsecondn=varval
2110  gfile%headvarival(9)=varval
2111  lhead=1
2112  endif
2113  if(lhead==1) then
2114 ! print *,'in setfhearvari,2,nfday=',gfile%nfday,'nfhour=',gfile%nfhour, &
2115 ! 'nfminute=',gfile%nfminute,'secd=',gfile%nfsecondd,'nsecn=',gfile%nfsecondn
2116 !------------------------------------------------------------
2117 ! write out second meta data record
2118 !------------------------------------------------------------
2119  meta2%nrec=gfile%nrec
2120  meta2%idate(1:7)=gfile%idate(1:7)
2121  meta2%nfday=gfile%nfday
2122  meta2%nfhour=gfile%nfhour
2123  meta2%nfminute=gfile%nfminute
2124  meta2%nfsecondn=gfile%nfsecondn
2125  meta2%nfsecondd=gfile%nfsecondd
2126  meta2%dimx=gfile%dimx
2127  meta2%dimy=gfile%dimy
2128  meta2%dimz=gfile%dimz
2129  meta2%nframe=gfile%nframe
2130  meta2%nsoil=gfile%nsoil
2131  meta2%ntrac=gfile%ntrac
2132  meta2%jcap=gfile%jcap
2133  meta2%ncldt=gfile%ncldt
2134  meta2%idvc=gfile%idvc
2135  meta2%idsl=gfile%idsl
2136  meta2%idvm=gfile%idvm
2137  meta2%idrt=gfile%idrt
2138  meta2%rlon_min=gfile%rlon_min
2139  meta2%rlon_max=gfile%rlon_max
2140  meta2%rlat_min=gfile%rlat_min
2141  meta2%rlat_max=gfile%rlat_max
2142  meta2%extrameta=gfile%extrameta
2143  iskip=nemsio_lmeta1+8
2144  iwrite=gfile%lmeta
2145  if(gfile%do_byteswap) then
2146  call byteswap(meta2%nrec,nemsio_intkind,25)
2147  call byteswap(meta2%rlon_min,nemsio_realkind,4)
2148  call byteswap(meta2%extrameta,nemsio_logickind,1)
2149  endif
2150  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,meta2)
2151  if(nwrite.lt.iwrite) return
2152  if(gfile%do_byteswap) then
2153  call byteswap(meta2%nrec,nemsio_intkind,25)
2154  call byteswap(meta2%rlon_min,nemsio_realkind,4)
2155  call byteswap(meta2%extrameta,nemsio_logickind,1)
2156  endif
2157  if(present(iret)) iret=0
2158  return
2159  endif
2160 !---
2161  if(gfile%nmetavari.gt.0) then
2162  do i=1,gfile%nmetavari
2163  if(equal_str_nocase(trim(varname),trim(gfile%variname(i))) ) then
2164  gfile%varival(i)=varval
2165  iskip=gfile%tlmetavarival
2166  iwrite=kind(gfile%varival)*gfile%nmetavari
2167  if(gfile%do_byteswap) call byteswap(gfile%varival,nemsio_intkind,size(gfile%varival))
2168  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%varival)
2169  if(nwrite.lt.iwrite) return
2170  if(gfile%do_byteswap) call byteswap(gfile%varival,nemsio_intkind,size(gfile%varival))
2171  if(present(iret)) iret=0
2172  return
2173  endif
2174  enddo
2175  endif
2176 !---
2177  if(.not.present(iret)) call nemsio_stop
2178  return
2179  end subroutine nemsio_setfheadvari
2180 !------------------------------------------------------------------------------
2181  subroutine nemsio_setfheadaryi(gfile,varname,varval,iret)
2182 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2183 ! abstract: reset meta data integer value from file header, ONLY for time
2184 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2185  implicit none
2186  type(nemsio_gfile),intent(inout) :: gfile
2187  character(len=*), intent(in) :: varname
2188  integer(nemsio_intkind),intent(in) :: varval(:)
2189  integer(nemsio_intkind),optional,intent(out) :: iret
2190  integer i,j,lhead
2191  integer(nemsio_intkind8) :: iskip,iwrite,nwrite
2192  type(nemsio_meta2) :: meta2
2193 !---
2194  if(present(iret) ) iret=-17
2195 !--- only allow to change time in second meta data
2196  if (equal_str_nocase(trim(varname),'idate')) then
2197  if(size(gfile%idate)==size(varval)) then
2198  gfile%idate(:)=varval(:)
2199  gfile%headaryival(:,1)=varval(:)
2200 !------------------------------------------------------------
2201 ! write out second meta data record
2202 !------------------------------------------------------------
2203  meta2%nrec=gfile%nrec
2204  meta2%idate(1:7)=gfile%idate(1:7)
2205  meta2%nfday=gfile%nfday
2206  meta2%nfhour=gfile%nfhour
2207  meta2%nfminute=gfile%nfminute
2208  meta2%nfsecondn=gfile%nfsecondn
2209  meta2%nfsecondd=gfile%nfsecondd
2210  meta2%dimx=gfile%dimx
2211  meta2%dimy=gfile%dimy
2212  meta2%dimz=gfile%dimz
2213  meta2%nframe=gfile%nframe
2214  meta2%nsoil=gfile%nsoil
2215  meta2%ntrac=gfile%ntrac
2216  meta2%jcap=gfile%jcap
2217  meta2%ncldt=gfile%ncldt
2218  meta2%idvc=gfile%idvc
2219  meta2%idsl=gfile%idsl
2220  meta2%idvm=gfile%idvm
2221  meta2%idrt=gfile%idrt
2222  meta2%rlon_min=gfile%rlon_min
2223  meta2%rlon_max=gfile%rlon_max
2224  meta2%rlat_min=gfile%rlat_min
2225  meta2%rlat_max=gfile%rlat_max
2226  meta2%extrameta=gfile%extrameta
2227  iskip=nemsio_lmeta1+8
2228  iwrite=gfile%lmeta
2229  if(gfile%do_byteswap) then
2230  call byteswap(meta2%nrec,nemsio_intkind,25)
2231  call byteswap(meta2%rlon_min,nemsio_realkind,4)
2232  call byteswap(meta2%extrameta,nemsio_logickind,1)
2233  endif
2234  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,meta2)
2235  if(nwrite.lt.iwrite) return
2236  if(gfile%do_byteswap) then
2237  call byteswap(meta2%nrec,nemsio_intkind,25)
2238  call byteswap(meta2%rlon_min,nemsio_realkind,4)
2239  call byteswap(meta2%extrameta,nemsio_logickind,1)
2240  endif
2241  if(present(iret)) iret=0
2242  return
2243  endif
2244  endif
2245 !---
2246  if(gfile%nmetaaryi.gt.0) then
2247  do i=1,gfile%nmetaaryi
2248  if(equal_str_nocase(trim(varname),trim(gfile%aryiname(i))) ) then
2249  if(gfile%aryilen(i)==size(varval)) then
2250  gfile%aryival(1:gfile%aryilen(i),i)=varval(1:size(varval))
2251  lhead=1
2252  exit
2253  endif
2254  endif
2255  enddo
2256  if(lhead==1) then
2257  iskip=gfile%tlmetaaryival
2258  nwrite=0
2259  do i=1,gfile%nmetaaryi
2260  iskip=iskip+nwrite
2261  iwrite=kind(gfile%aryival)*gfile%aryilen(i)
2262  if(gfile%do_byteswap) call byteswap(gfile%aryival(:,i),nemsio_intkind,gfile%aryilen(i))
2263  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite, &
2264  gfile%aryival(1:gfile%aryilen(i),i))
2265  if(nwrite.lt.iwrite) return
2266  if(gfile%do_byteswap) call byteswap(gfile%aryival(:,i),nemsio_intkind,gfile%aryilen(i))
2267  enddo
2268  if(present(iret)) iret=0
2269  return
2270  endif
2271  endif
2272 !---
2273  if(.not.present(iret)) call nemsio_stop
2274  return
2275  end subroutine nemsio_setfheadaryi
2276 !------------------------------------------------------------------------------
2277  subroutine nemsio_setfilehead(gfile,iret,lat,lon,dx,dy)
2278 !
2279 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2280 ! abstract: reset some nemsio meta data information from outside
2281 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2282 !
2283  implicit none
2284  type(nemsio_gfile),intent(inout) :: gfile
2285  integer(nemsio_intkind),optional,intent(out) :: iret
2286  real(nemsio_realkind),optional,intent(in) :: lat(:),lon(:)
2287  real(nemsio_realkind),optional,intent(in) :: dx(:),dy(:)
2288 !
2289 !--- local vars
2290  integer(nemsio_intkind8) :: iskip,iwrite,nwrite
2291 !
2292 !---
2293  if (present(iret)) iret=-3
2294 !
2295 !--- check the size first, then set the value
2296 !--- lat
2297  if(present(lat) ) then
2298  if (size(lat).ne.gfile%fieldsize) then
2299  if ( present(iret)) return
2300  call nemsio_stop
2301  else
2302  gfile%lat=lat
2303  gfile%headaryrval(:,2)=gfile%lat
2304  if(equal_str_nocase(trim(gfile%gaction),'write') .and. &
2305  gfile%tlmetalat/=nemsio_intfill8) then
2306  iskip=gfile%tlmetalat
2307  iwrite=kind(gfile%lat)*size(gfile%lat)
2308  if(gfile%do_byteswap) call byteswap(gfile%lat,nemsio_realkind,size(gfile%lat))
2309  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%lat)
2310  if(nwrite.lt.iwrite) return
2311  if(gfile%do_byteswap) call byteswap(gfile%lat,nemsio_realkind,size(gfile%lat))
2312  endif
2313  endif
2314  endif
2315 !--- lon
2316  if(present(lon) ) then
2317  if (size(lon).ne.gfile%fieldsize) then
2318  if ( present(iret)) return
2319  call nemsio_stop
2320  else
2321  gfile%lon=lon
2322  gfile%headaryrval(:,3)=gfile%lon
2323  if(equal_str_nocase(trim(gfile%gaction),'write').and. &
2324  gfile%tlmetalon/=nemsio_intfill8) then
2325  iskip=gfile%tlmetalon
2326  iwrite=kind(gfile%lon)*size(gfile%lon)
2327  if(gfile%do_byteswap) call byteswap(gfile%lon,nemsio_realkind,size(gfile%lon))
2328  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%lon)
2329  if(nwrite.lt.iwrite) return
2330  if(gfile%do_byteswap) call byteswap(gfile%lon,nemsio_realkind,size(gfile%lon))
2331  endif
2332  endif
2333  endif
2334 !--- dx
2335  if(present(dx) ) then
2336  if (size(dx).ne.gfile%fieldsize) then
2337  if ( present(iret)) return
2338  call nemsio_stop
2339  else
2340  gfile%dx=dx
2341  gfile%headaryrval(:,4)=gfile%dx
2342  if(equal_str_nocase(trim(gfile%gaction),'write').and. &
2343  gfile%tlmetadx/=nemsio_intfill8) then
2344  iskip=gfile%tlmetadx
2345  iwrite=kind(gfile%dx)*size(gfile%dx)
2346  if(gfile%do_byteswap) call byteswap(gfile%dx,nemsio_realkind,size(gfile%dx))
2347  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%dx)
2348  if(nwrite.lt.iwrite) return
2349  if(gfile%do_byteswap) call byteswap(gfile%dx,nemsio_realkind,size(gfile%dx))
2350  endif
2351  endif
2352  endif
2353 !--- dy
2354  if(present(dy) ) then
2355  if (size(dy).ne.gfile%fieldsize) then
2356  if ( present(iret)) return
2357  call nemsio_stop
2358  else
2359  gfile%dy=dy
2360  gfile%headaryrval(:,5)=gfile%dy
2361  if(equal_str_nocase(trim(gfile%gaction),'write').and. &
2362  gfile%tlmetady/=nemsio_intfill8) then
2363  iskip=gfile%tlmetady
2364  iwrite=kind(gfile%dy)*size(gfile%dy)
2365  if(gfile%do_byteswap) call byteswap(gfile%dy,nemsio_realkind,size(gfile%dy))
2366  call bafrwritel(gfile%flunit,iskip,iwrite,nwrite,gfile%dy)
2367  if(nwrite.lt.iwrite) return
2368  if(gfile%do_byteswap) call byteswap(gfile%dy,nemsio_realkind,size(gfile%dy))
2369  endif
2370  endif
2371  endif
2372 !
2373  iret=0
2374 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2375  end subroutine nemsio_setfilehead
2376 !------------------------------------------------------------------------------
2377 !------------------------------------------------------------------------------
2378  subroutine nemsio_getfilehead(gfile,iret,gtype,gdatatype,gfname,gaction, &
2379  modelname,version,nmeta,lmeta,nrec,idate,nfday,nfhour,nfminute, &
2380  nfsecondn,nfsecondd,dimx,dimy,dimz,nframe,nsoil,ntrac,ncldt,jcap, &
2381  idvc,idsl,idvm,idrt, rlon_min,rlon_max,rlat_min,rlat_max, &
2382  tlmeta,flunit, file_endian,do_byteswap, &
2383  extrameta,nmetavari,nmetavarr,nmetavarl,nmetavarc,nmetavarr8, &
2384  nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc,nmetaaryr8, &
2385  recname,reclevtyp,reclev,vcoord,lon,lat,dx,dy,cpi,ri, &
2386  variname,varival,varrname,varrval,varlname,varlval,varcname,varcval, &
2387  varr8name,varr8val, &
2388  aryiname,aryilen,aryival,aryrname,aryrlen,aryrval, &
2389  arylname,aryllen,arylval,arycname,aryclen,arycval, &
2390  aryr8name,aryr8len,aryr8val )
2391 
2392 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2393 ! abstract: get nemsio meta data information from outside
2394 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2395  implicit none
2396  type(nemsio_gfile),intent(in) :: gfile
2397  integer(nemsio_intkind),optional,intent(out) :: iret
2398  character*(*),optional,intent(out) :: gtype,gdatatype,gfname, &
2399  gaction,modelname
2400  integer(nemsio_intkind),optional,intent(out) :: version,nmeta,lmeta
2401  integer(nemsio_intkind),optional,intent(out) :: nrec,idate(7),nfday,nfhour, &
2402  nfminute,nfsecondn,nfsecondd
2403  integer(nemsio_intkind),optional,intent(out) :: dimx,dimy,dimz,nframe, &
2404  nsoil,ntrac
2405  integer(nemsio_intkind),optional,intent(out) :: ncldt,jcap,idvc,idsl,idvm,idrt
2406  real(nemsio_realkind),optional,intent(out) :: rlon_min,rlon_max,rlat_min, &
2407  rlat_max
2408  integer(nemsio_intkind),optional,intent(out) :: tlmeta
2409  integer(nemsio_intkind),optional,intent(out) :: flunit
2410  character*(*),optional,intent(out) :: file_endian
2411  logical(nemsio_logickind),optional,intent(out):: do_byteswap
2412  logical(nemsio_logickind),optional,intent(out):: extrameta
2413  integer(nemsio_intkind),optional,intent(out) :: nmetavari,nmetavarr, &
2414  nmetavarl,nmetavarc,nmetavarr8, &
2415  nmetaaryi,nmetaaryr,nmetaaryl, &
2416  nmetaaryc,nmetaaryr8
2417  character(*),optional,intent(out) :: recname(:)
2418  character(*),optional,intent(out) :: reclevtyp(:)
2419  integer(nemsio_intkind),optional,intent(out) :: reclev(:)
2420  real(nemsio_realkind),optional,intent(out) :: vcoord(:,:,:)
2421  real(nemsio_realkind),optional,intent(out) :: lat(:),lon(:)
2422  real(nemsio_realkind),optional,intent(out) :: dx(:),dy(:)
2423  real(nemsio_realkind),optional,intent(out) :: Cpi(:),Ri(:)
2424  character(*),optional,intent(out) :: variname(:),varrname(:)
2425  character(*),optional,intent(out) :: varlname(:),varcname(:)
2426  character(*),optional,intent(out) :: varr8name(:)
2427  character(*),optional,intent(out) :: aryiname(:),aryrname(:)
2428  character(*),optional,intent(out) :: arylname(:),arycname(:)
2429  character(*),optional,intent(out) :: aryr8name(:)
2430  integer(nemsio_intkind),optional,intent(out) :: aryilen(:),aryrlen(:)
2431  integer(nemsio_intkind),optional,intent(out) :: aryllen(:),aryclen(:)
2432  integer(nemsio_intkind),optional,intent(out) :: aryr8len(:)
2433  integer(nemsio_intkind),optional,intent(out) :: varival(:),aryival(:,:)
2434  real(nemsio_realkind),optional,intent(out) :: varrval(:),aryrval(:,:)
2435  real(nemsio_dblekind),optional,intent(out) :: varr8val(:),aryr8val(:,:)
2436  logical(nemsio_logickind),optional,intent(out):: varlval(:),arylval(:,:)
2437  character(*),optional,intent(out) :: varcval(:),arycval(:,:)
2438 !
2439  integer i,j
2440 !------------------------------------------------------------
2441  if (present(iret)) iret=-3
2442  if(present(gtype)) gtype=gfile%gtype
2443  if(present(gdatatype)) gdatatype=gfile%gdatatype
2444  if(present(gfname)) gfname=trim(gfile%gfname)
2445  if(present(gaction)) gaction=gfile%gaction
2446  if(present(modelname)) modelname=gfile%modelname
2447  if(present(version)) version=gfile%version
2448  if(present(nmeta)) nmeta=gfile%nmeta
2449  if(present(lmeta)) lmeta=gfile%lmeta
2450  if(present(nrec)) nrec=gfile%nrec
2451  if(present(nfday)) nfday=gfile%nfday
2452  if(present(nfhour)) nfhour=gfile%nfhour
2453  if(present(nfminute)) nfminute=gfile%nfminute
2454  if(present(nfsecondn)) nfsecondn=gfile%nfsecondn
2455  if(present(nfsecondd)) nfsecondd=gfile%nfsecondd
2456  if(present(idate)) idate=gfile%idate
2457  if(present(dimx)) dimx=gfile%dimx
2458  if(present(dimy)) dimy=gfile%dimy
2459  if(present(dimz)) dimz=gfile%dimz
2460  if(present(nframe)) nframe=gfile%nframe
2461  if(present(nsoil)) nsoil=gfile%nsoil
2462  if(present(ntrac)) ntrac=gfile%ntrac
2463  if(present(jcap)) jcap=gfile%jcap
2464  if(present(ncldt)) ncldt=gfile%ncldt
2465  if(present(idvc)) idvc=gfile%idvc
2466  if(present(idsl)) idsl=gfile%idsl
2467  if(present(idvm)) idvm=gfile%idvm
2468  if(present(idrt)) idrt=gfile%idrt
2469  if(present(rlon_min)) rlon_min=gfile%rlon_min
2470  if(present(rlon_max)) rlon_max=gfile%rlon_max
2471  if(present(rlat_min)) rlat_min=gfile%rlat_min
2472  if(present(rlat_max)) rlat_max=gfile%rlat_max
2473  if(present(rlat_max)) rlat_max=gfile%rlat_max
2474  if(present(tlmeta)) tlmeta=gfile%tlmeta
2475  if(present(file_endian)) file_endian=gfile%file_endian
2476  if(present(do_byteswap)) do_byteswap=gfile%do_byteswap
2477  if(present(extrameta)) extrameta=gfile%extrameta
2478  if(present(flunit)) flunit=gfile%flunit
2479 !
2480 !--- rec
2481  if(present(recname) ) then
2482  if (gfile%nrec.ne.size(recname)) then
2483  if ( present(iret)) return
2484  call nemsio_stop
2485  else
2486  recname=gfile%recname
2487  endif
2488  endif
2489  if(present(reclevtyp)) then
2490  if (gfile%nrec.ne.size(reclevtyp)) then
2491  if ( present(iret)) return
2492  call nemsio_stop
2493  else
2494  reclevtyp=gfile%reclevtyp
2495  endif
2496  endif
2497  if(present(reclev) ) then
2498  if (gfile%nrec.ne.size(reclev)) then
2499  if ( present(iret)) return
2500  call nemsio_stop
2501  else
2502  reclev=gfile%reclev
2503  endif
2504  endif
2505 !--- vcoord
2506  if(present(vcoord)) then
2507  if (size(vcoord) .ne. (gfile%dimz+1)*2*3 ) then
2508  if ( present(iret)) return
2509  call nemsio_stop
2510  else
2511  vcoord=gfile%vcoord
2512  endif
2513  endif
2514 !--- lat
2515  if(present(lat) ) then
2516  if (size(lat).ne.gfile%fieldsize) then
2517  print *,'ERROR: size(lat)=',size(lat),' is not equal to ',gfile%fieldsize
2518  if ( present(iret)) return
2519  call nemsio_stop
2520  else
2521  lat=gfile%lat
2522  endif
2523  endif
2524 !--- lon
2525  if(present(lon) ) then
2526  if (size(lon).ne.gfile%fieldsize) then
2527  print *,'ERROR: size(lon)=',size(lon),' is not equal to ',gfile%fieldsize
2528  if ( present(iret)) return
2529  call nemsio_stop
2530  else
2531  lon=gfile%lon
2532  endif
2533  endif
2534 !--- dx
2535  if(present(dx) ) then
2536  if (size(dx).ne.gfile%fieldsize) then
2537  print *,'ERROR: size(dX)=',size(dx),' is not equal to ',gfile%fieldsize
2538  if ( present(iret)) return
2539  call nemsio_stop
2540  else
2541  dx=gfile%dx
2542  endif
2543  endif
2544 !--- dy
2545  if(present(dy) ) then
2546  if (size(dy).ne.gfile%fieldsize) then
2547  print *,'ERROR: size(dy)=',size(dy),' is not equal to ',gfile%fieldsize
2548  if ( present(iret)) return
2549  call nemsio_stop
2550  else
2551  dy=gfile%dy
2552  endif
2553  endif
2554 !--- Cpi
2555  if(present(cpi) ) then
2556  if (gfile%ntrac+1.ne.size(cpi)) then
2557  if ( present(iret)) return
2558  call nemsio_stop
2559  else
2560  cpi=gfile%Cpi
2561  endif
2562  endif
2563 !--- Ri
2564  if(present(ri) ) then
2565  if (gfile%ntrac+1.ne.size(ri)) then
2566  if ( present(iret)) return
2567  call nemsio_stop
2568  else
2569  ri=gfile%Ri
2570  endif
2571  endif
2572 !------------------------------------------------------------------------------
2573 !*** for extra meta field
2574 !------------------------------------------------------------------------------
2575 !extrameta
2576  if(present(extrameta) ) extrameta=gfile%extrameta
2577  if (present(nmetavari) ) nmetavari=gfile%nmetavari
2578  if (present(nmetavarr) ) nmetavarr=gfile%nmetavarr
2579  if (present(nmetavarl) ) nmetavarl=gfile%nmetavarl
2580  if (present(nmetavarc) ) nmetavarc=gfile%nmetavarc
2581  if (present(nmetavarr8) ) nmetavarr8=gfile%nmetavarr8
2582  if (present(nmetaaryi) ) nmetaaryi=gfile%nmetaaryi
2583  if (present(nmetaaryr) ) nmetaaryr=gfile%nmetaaryr
2584  if (present(nmetaaryl) ) nmetaaryl=gfile%nmetaaryl
2585  if (present(nmetaaryc) ) nmetaaryc=gfile%nmetaaryc
2586  if (present(nmetaaryr8) ) nmetaaryr8=gfile%nmetaaryr8
2587  if ( gfile%nmetavari.gt.0 ) then
2588  if (present(variname)) then
2589  if( size(variname).eq.gfile%nmetavari) variname=gfile%variname
2590  endif
2591  if (present(varival)) then
2592  if(size(varival).eq.gfile%nmetavari) varival=gfile%varival
2593  endif
2594  endif
2595  if ( gfile%nmetavarr.gt.0 ) then
2596  if (present(varrname)) then
2597  if(size(varrname).eq.gfile%nmetavarr) varrname=gfile%varrname
2598  endif
2599  if (present(varrval)) then
2600  if(size(varrval).eq.gfile%nmetavarr) varrval=gfile%varrval
2601  endif
2602  endif
2603  if ( gfile%nmetavarl.gt.0 ) then
2604  if (present(varlname)) then
2605  if(size(varlname).eq.gfile%nmetavarl) varlname=gfile%varlname
2606  endif
2607  if (present(varlval)) then
2608  if(size(varlval).eq.gfile%nmetavarl) varlval=gfile%varlval
2609  endif
2610  endif
2611  if ( gfile%nmetavarc.gt.0 ) then
2612  if (present(varcname)) then
2613  if(size(varcname).eq.gfile%nmetavarc) varcname=gfile%varcname
2614  endif
2615  if (present(varcval)) then
2616  if(size(varcval).eq.gfile%nmetavarc) varcval=gfile%varcval
2617  endif
2618  endif
2619  if ( gfile%nmetavarr8.gt.0 ) then
2620  if (present(varr8name)) then
2621  if(size(varr8name).eq.gfile%nmetavarr8) varr8name=gfile%varr8name
2622  endif
2623  if (present(varr8val)) then
2624  if(size(varr8val).eq.gfile%nmetavarr8) varr8val=gfile%varr8val
2625  endif
2626  endif
2627  if ( gfile%nmetaaryi.gt.0 ) then
2628  if (present(aryiname)) then
2629  if(size(aryiname).eq.gfile%nmetaaryi) aryiname=gfile%aryiname
2630  endif
2631  if (present(aryilen)) then
2632  if(size(aryilen).eq.gfile%nmetaaryi) aryilen=gfile%aryilen
2633  endif
2634  if (present(aryival)) then
2635  if(size(aryival).eq.gfile%nmetaaryi*maxval(gfile%aryilen) ) &
2636  aryival=gfile%aryival
2637  endif
2638  endif
2639  if ( gfile%nmetaaryr.gt.0 ) then
2640  if (present(aryrname)) then
2641  if( size(aryrname).eq.gfile%nmetaaryr) aryrname=gfile%aryrname
2642  endif
2643  if (present(aryrlen)) then
2644  if(size(aryrlen).eq.gfile%nmetaaryr) aryrlen=gfile%aryrlen
2645  endif
2646  if (present(aryrval)) then
2647  if(size(aryrval).eq.gfile%nmetaaryr*maxval(gfile%aryrlen) ) &
2648  aryrval=gfile%aryrval
2649  endif
2650  endif
2651  if ( gfile%nmetaaryl.gt.0 ) then
2652  if (present(arylname)) then
2653  if(size(arylname).eq.gfile%nmetaaryl) arylname=gfile%arylname
2654  endif
2655  if (present(aryllen)) then
2656  if(size(aryllen).eq.gfile%nmetaaryl) aryllen=gfile%aryllen
2657  endif
2658  if (present(arylval)) then
2659  if(size(arylval).eq.gfile%nmetaaryl*maxval(gfile%aryllen) ) &
2660  arylval=gfile%arylval
2661  endif
2662  endif
2663  if ( gfile%nmetaaryc.gt.0 ) then
2664  if (present(arycname)) then
2665  if(size(arycname).eq.gfile%nmetaaryc) arycname=gfile%arycname
2666  endif
2667  if (present(aryclen)) then
2668  if(size(aryclen).eq.gfile%nmetaaryc) aryclen=gfile%aryclen
2669  endif
2670  if (present(arycval)) then
2671  if(size(arycval).eq.gfile%nmetaaryc*maxval(gfile%aryclen) ) &
2672  arycval=gfile%arycval
2673  endif
2674  endif
2675  if ( gfile%nmetaaryr8.gt.0 ) then
2676  if (present(aryr8name)) then
2677  if( size(aryr8name).eq.gfile%nmetaaryr8) aryr8name=gfile%aryr8name
2678  endif
2679  if (present(aryr8len)) then
2680  if(size(aryr8len).eq.gfile%nmetaaryr8) aryr8len=gfile%aryr8len
2681  endif
2682  if (present(aryr8val)) then
2683  if(size(aryr8val).eq.gfile%nmetaaryr8*maxval(gfile%aryr8len) ) &
2684  aryr8val=gfile%aryr8val
2685  endif
2686  endif
2687 
2688  if ( present(iret)) iret=0
2689 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2690  end subroutine nemsio_getfilehead
2691 !------------------------------------------------------------------------------
2692  subroutine nemsio_getfheadvari(gfile,varname,varval,iret)
2693 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2694 ! abstract: get meta data var value from file header
2695 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2696  implicit none
2697  type(nemsio_gfile),intent(in) :: gfile
2698  character(len=*), intent(in) :: varname
2699  integer(nemsio_intkind),intent(out) :: varval
2700  integer(nemsio_intkind),optional,intent(out) :: iret
2701  integer i,j
2702 !---
2703  if(present(iret) ) iret=-17
2704  do i=1,gfile%headvarinum
2705  if(equal_str_nocase(trim(varname),trim(gfile%headvariname(i))) ) then
2706  varval=gfile%headvarival(i)
2707  if(present(iret) ) iret=0
2708  return
2709  endif
2710  enddo
2711 !---
2712  if(gfile%nmetavari.gt.0) then
2713  do i=1,gfile%nmetavari
2714  if(equal_str_nocase(trim(varname),trim(gfile%variname(i))) ) then
2715  varval=gfile%varival(i)
2716  if(present(iret) ) iret=0
2717  return
2718  endif
2719  enddo
2720  endif
2721 !---
2722  if(.not.present(iret) ) call nemsio_stop
2723  return
2724  end subroutine nemsio_getfheadvari
2725 !------------------------------------------------------------------------------
2726  subroutine nemsio_getfheadvarr(gfile,varname,varval,iret)
2727 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2728 ! abstract: get meta data var value from file header
2729 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2730  implicit none
2731  type(nemsio_gfile),intent(in) :: gfile
2732  character(len=*), intent(in) :: varname
2733  real(nemsio_realkind),intent(out) :: varval
2734  integer(nemsio_intkind),optional,intent(out) :: iret
2735  integer i,j
2736 !---
2737  if(present(iret) ) iret=-17
2738  do i=1,gfile%headvarrnum
2739  if(equal_str_nocase(trim(varname),trim(gfile%headvarrname(i))) ) then
2740  varval=gfile%headvarrval(i)
2741  if(present(iret) ) iret=0
2742  return
2743  endif
2744  enddo
2745 !---
2746  if(gfile%nmetavarr.gt.0) then
2747  do i=1,gfile%nmetavarr
2748  if(equal_str_nocase(trim(varname),trim(gfile%varrname(i))) ) then
2749  varval=gfile%varrval(i)
2750  if(present(iret) ) iret=0
2751  return
2752  endif
2753  enddo
2754  endif
2755 
2756  if(.not.present(iret) ) call nemsio_stop
2757  return
2758  end subroutine nemsio_getfheadvarr
2759 !------------------------------------------------------------------------------
2760  subroutine nemsio_getfheadvarl(gfile,varname,varval,iret)
2761 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2762 ! abstract: get meta data var value from file header
2763 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2764  implicit none
2765  type(nemsio_gfile),intent(in) :: gfile
2766  character(*), intent(in) :: varname
2767  logical(nemsio_logickind),intent(out) :: varval
2768  integer(nemsio_intkind),optional,intent(out) :: iret
2769  integer i,j
2770 !---
2771  if(present(iret) ) iret=-17
2772  if(gfile%nmetavarl.gt.0) then
2773  do i=1,gfile%nmetavarl
2774  if(equal_str_nocase(trim(varname),trim(gfile%varlname(i))) ) then
2775  varval=gfile%varlval(i)
2776  if(present(iret) ) iret=0
2777  return
2778  endif
2779  enddo
2780  endif
2781 !---
2782  if(.not.present(iret) ) call nemsio_stop
2783  return
2784  end subroutine nemsio_getfheadvarl
2785 !------------------------------------------------------------------------------
2786  subroutine nemsio_getfheadvarc(gfile,varname,varval,iret)
2787 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2788 ! abstract: get meta data var value from file header
2789 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2790  implicit none
2791  type(nemsio_gfile),intent(in) :: gfile
2792  character(*), intent(in) :: varname
2793  character(*),intent(out) :: varval
2794  integer(nemsio_intkind),optional,intent(out) :: iret
2795  integer i,j
2796 !---
2797  if(present(iret) ) iret=-17
2798  do i=1,gfile%headvarcnum
2799  if(equal_str_nocase(trim(varname),trim(gfile%headvarcname(i))) ) then
2800  varval=gfile%headvarcval(i)
2801  if(present(iret) ) iret=0
2802  return
2803  endif
2804  enddo
2805 !---
2806  if(gfile%nmetavarc.gt.0) then
2807  do i=1,gfile%nmetavarc
2808  if(equal_str_nocase(trim(varname),trim(gfile%varcname(i))) ) then
2809  varval=gfile%varcval(i)
2810  if(present(iret) ) iret=0
2811  return
2812  endif
2813  enddo
2814  endif
2815 !---
2816  if(.not.present(iret) ) call nemsio_stop
2817  return
2818  end subroutine nemsio_getfheadvarc
2819 !------------------------------------------------------------------------------
2820  subroutine nemsio_getfheadvarr8(gfile,varname,varval,iret)
2821 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2822 ! abstract: get meta data var value from file header
2823 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2824  implicit none
2825  type(nemsio_gfile),intent(in) :: gfile
2826  character(len=*), intent(in) :: varname
2827  real(nemsio_dblekind),intent(out) :: varval
2828  integer(nemsio_intkind),optional,intent(out) :: iret
2829  integer i,j
2830 !---
2831  if(present(iret) ) iret=-17
2832 !---
2833  if(gfile%nmetavarr8.gt.0) then
2834  do i=1,gfile%nmetavarr8
2835  if(equal_str_nocase(trim(varname),trim(gfile%varr8name(i))) ) then
2836  varval=gfile%varr8val(i)
2837  if(present(iret) ) iret=0
2838  return
2839  endif
2840  enddo
2841  endif
2842 
2843  if(.not.present(iret) ) call nemsio_stop
2844  return
2845  end subroutine nemsio_getfheadvarr8
2846 !------------------------------------------------------------------------------
2847  subroutine nemsio_getfheadaryi(gfile,varname,varval,iret)
2848 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2849 ! abstract: get meta data var value from file header
2850 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2851  implicit none
2852  type(nemsio_gfile),intent(in) :: gfile
2853  character(*), intent(in) :: varname
2854  integer(nemsio_intkind),intent(out) :: varval(:)
2855  integer(nemsio_intkind),optional,intent(out) :: iret
2856  integer i,j,ierr
2857 !---
2858  if(present(iret) ) iret=-17
2859  do i=1,gfile%headaryinum
2860  if(equal_str_nocase(trim(varname),trim(gfile%headaryiname(i))) ) then
2861  varval(:)=gfile%headaryival(1:gfile%aryilen(i),i)
2862  if(present(iret) ) iret=0
2863  return
2864  endif
2865  enddo
2866 !---
2867  if(gfile%nmetaaryi.gt.0) then
2868  do i=1,gfile%nmetaaryi
2869  if(equal_str_nocase(trim(varname),trim(gfile%aryiname(i))) ) then
2870  varval(:)=gfile%aryival(1:gfile%aryilen(i),i)
2871  if(present(iret) ) iret=0
2872  ierr=0
2873  return
2874  endif
2875  enddo
2876  endif
2877 !---
2878  if(.not.present(iret) ) call nemsio_stop
2879  return
2880  end subroutine nemsio_getfheadaryi
2881 !------------------------------------------------------------------------------
2882  subroutine nemsio_getfheadaryr(gfile,varname,varval,iret)
2883 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2884 ! abstract: get meta data var value from file header
2885 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2886  implicit none
2887  type(nemsio_gfile),intent(in) :: gfile
2888  character(*), intent(in) :: varname
2889  real(nemsio_realkind),intent(out) :: varval(:)
2890  integer(nemsio_intkind),optional,intent(out) :: iret
2891  integer i,j,ierr
2892 !---
2893  if(present(iret) ) iret=-17
2894  if(gfile%headaryrnum>0) then
2895  do i=1,gfile%headaryrnum
2896  if(equal_str_nocase(trim(varname),trim(gfile%headaryrname(i))) ) then
2897  varval(:)=gfile%headaryrval(1:gfile%aryrlen(i),i)
2898  if(present(iret) ) iret=0
2899  return
2900  endif
2901  enddo
2902  endif
2903 !---
2904  if(gfile%nmetaaryr.gt.0) then
2905  do i=1,gfile%nmetaaryr
2906  if(equal_str_nocase(trim(varname),trim(gfile%aryrname(i)))) then
2907  varval(:)=gfile%aryrval(1:gfile%aryrlen(i),i)
2908  if(present(iret) ) iret=0
2909  ierr=0
2910  return
2911  endif
2912  enddo
2913  endif
2914 !---
2915  if(.not.present(iret) ) call nemsio_stop
2916  return
2917  end subroutine nemsio_getfheadaryr
2918 !------------------------------------------------------------------------------
2919  subroutine nemsio_getfheadaryl(gfile,varname,varval,iret)
2920 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2921 ! abstract: get meta data var value from file header
2922 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2923  implicit none
2924  type(nemsio_gfile),intent(in) :: gfile
2925  character(*), intent(in) :: varname
2926  logical(nemsio_logickind),intent(out) :: varval(:)
2927  integer(nemsio_intkind),optional,intent(out) :: iret
2928  integer i,j,ierr
2929 !---
2930  if(present(iret) ) iret=-17
2931  if(gfile%nmetaaryl.gt.0) then
2932  do i=1,gfile%nmetaaryl
2933  if(equal_str_nocase(trim(varname),trim(gfile%arylname(i)))) then
2934  varval(:)=gfile%arylval(1:gfile%aryllen(i),i)
2935  if(present(iret) ) iret=0
2936  ierr=0
2937  return
2938  endif
2939  enddo
2940  endif
2941 !---
2942  if(.not.present(iret) ) call nemsio_stop
2943  return
2944  end subroutine nemsio_getfheadaryl
2945 !------------------------------------------------------------------------------
2946  subroutine nemsio_getfheadaryc(gfile,varname,varval,iret)
2947 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2948 ! abstract: get meta data var value from file header
2949 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2950  implicit none
2951  type(nemsio_gfile),intent(in) :: gfile
2952  character(len=*), intent(in) :: varname
2953  character(*),intent(out) :: varval(:)
2954  integer(nemsio_intkind),optional,intent(out) :: iret
2955  integer i,j,ierr
2956 !---
2957  if(present(iret) ) iret=-17
2958  if(gfile%headarycnum>0) then
2959  do i=1,gfile%headarycnum
2960  if(equal_str_nocase(trim(varname),trim(gfile%headarycname(i))) ) then
2961  varval(:)=gfile%headarycval(1:gfile%aryclen(i),i)
2962  if(present(iret) ) iret=0
2963  return
2964  endif
2965  enddo
2966  endif
2967 !---
2968  if(gfile%nmetaaryc.gt.0) then
2969  do i=1,gfile%nmetaaryc
2970  if(equal_str_nocase(trim(varname),trim(gfile%arycname(i)))) then
2971  varval(:)=gfile%arycval(1:gfile%aryclen(i),i)
2972  if(present(iret) ) iret=0
2973  ierr=0
2974  return
2975  endif
2976  enddo
2977  endif
2978 !---
2979  if(.not.present(iret) ) call nemsio_stop
2980  return
2981  end subroutine nemsio_getfheadaryc
2982 !------------------------------------------------------------------------------
2983  subroutine nemsio_getfheadaryr8(gfile,varname,varval,iret)
2984 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2985 ! abstract: get meta data var value from file header
2986 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
2987  implicit none
2988  type(nemsio_gfile),intent(in) :: gfile
2989  character(*), intent(in) :: varname
2990  real(nemsio_dblekind),intent(out) :: varval(:)
2991  integer(nemsio_intkind),optional,intent(out) :: iret
2992  integer i,j,ierr
2993 !---
2994  if(present(iret) ) iret=-17
2995 !---
2996  if(gfile%nmetaaryr8.gt.0) then
2997  do i=1,gfile%nmetaaryr8
2998  if(equal_str_nocase(trim(varname),trim(gfile%aryr8name(i)))) then
2999  varval(:)=gfile%aryr8val(1:gfile%aryr8len(i),i)
3000  if(present(iret) ) iret=0
3001  ierr=0
3002  return
3003  endif
3004  enddo
3005  endif
3006 !---
3007  if(.not.present(iret) ) call nemsio_stop
3008  return
3009  end subroutine nemsio_getfheadaryr8
3010 
3011 !------------------------------------------------------------------------------
3012  subroutine nemsio_getrechead(gfile,jrec,name,levtyp,lev,iret)
3013 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3014 ! abstract: given record number, return users record name, lev typ, and levs
3015 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3016  implicit none
3017  type(nemsio_gfile),intent(in) :: gfile
3018  integer(nemsio_intkind),intent(in) :: jrec
3019  character(*),intent(inout) :: name
3020  character(*),optional,intent(inout) :: levtyp
3021  integer(nemsio_intkind),optional,intent(out) :: lev
3022  integer(nemsio_intkind),optional,intent(out) :: iret
3023  integer :: ios
3024 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3025  if( present(iret)) iret=-11
3026  if ( jrec.gt.0 .or. jrec.le.gfile%nrec) then
3027  if(gfile%nmeta>2) then
3028  name=gfile%recname(jrec)
3029  else
3030  print *,'ERROR: recname is not specified in meta data!'
3031  return
3032  endif
3033  if(present(levtyp).and.gfile%nmeta>3) then
3034  levtyp=gfile%reclevtyp(jrec)
3035  endif
3036  if(present(lev).and.gfile%nmeta>4) then
3037  lev=gfile%reclev(jrec)
3038  endif
3039  if(present(iret)) iret=0
3040  return
3041  else
3042  if ( present(iret)) then
3043  print *,'ERROR: jrec is either less than 1 or greater than gfile%nrec'
3044  return
3045  else
3046  call nemsio_stop
3047  endif
3048  endif
3049  end subroutine nemsio_getrechead
3050 !------------------------------------------------------------------------------
3051 
3052  subroutine nemsio_gfinit(gfile,iret,recname,reclevtyp,reclev)
3053 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3054 ! abstract: set gfile variables to operational model output
3055 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3056  implicit none
3057  type(nemsio_gfile),intent(inout) :: gfile
3058  integer(nemsio_intkind),intent(out) :: iret
3059  character(*),optional,intent(in) :: recname(:)
3060  character(*),optional,intent(in) :: reclevtyp(:)
3061  integer(nemsio_intkind),optional,intent(in) :: reclev(:)
3062  integer :: i,j,rec,rec3dopt
3063  real(nemsio_dblekind),allocatable :: slat(:),wlat(:)
3064  real(nemsio_dblekind),allocatable :: dx(:)
3065  real(nemsio_dblekind) :: radi
3066  logical(nemsio_logickind) :: linit=.false.,ltmp
3067 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3068 ! set operational format
3069 !
3070  iret=-8
3071  if(gfile%version==nemsio_intfill) gfile%version=200809
3072  if(gfile%nfday==nemsio_intfill) gfile%nfday=0
3073  if(gfile%nfhour==nemsio_intfill) gfile%nfhour=0
3074  if(gfile%nfminute==nemsio_intfill) gfile%nfminute=0
3075  if(gfile%nfsecondn==nemsio_intfill) gfile%nfsecondn=0
3076  if(gfile%nfsecondd==nemsio_intfill) gfile%nfsecondd=100
3077  if(gfile%nmetavari==nemsio_intfill) gfile%nmetavari=0
3078  if(gfile%nmetavarr==nemsio_intfill) gfile%nmetavarr=0
3079  if(gfile%nmetavarc==nemsio_intfill) gfile%nmetavarc=0
3080  if(gfile%nmetavarl==nemsio_intfill) gfile%nmetavarl=0
3081  if(gfile%nmetaaryi==nemsio_intfill) gfile%nmetaaryi=0
3082  if(gfile%nmetaaryr==nemsio_intfill) gfile%nmetaaryr=0
3083  if(gfile%nmetaaryl==nemsio_intfill) gfile%nmetaaryl=0
3084  if(gfile%nmetaaryc==nemsio_intfill) gfile%nmetaaryc=0
3085 
3086 ! write(0,*)'in gfinit, modelname=',gfile%modelname
3087 
3088  linit=.false.
3089  if ( equal_str_nocase(trim(gfile%modelname),'GFS')) then
3090  if(gfile%dimy.eq.nemsio_intfill) then
3091  linit=.true.
3092  gfile%dimy=576
3093  endif
3094  if(gfile%dimx.eq.nemsio_intfill) gfile%dimx=1152
3095  if(gfile%dimz.eq.nemsio_intfill) gfile%dimz=64
3096  if(gfile%nframe.eq.nemsio_intfill) gfile%nframe=0
3097  if(gfile%ntrac.eq.nemsio_intfill) gfile%ntrac=3
3098  if(gfile%nrec.eq.nemsio_intfill)gfile%nrec=2+9*gfile%dimz+35+3*gfile%nsoil
3099 !
3100  linit=linit.and.gfile%dimy==576.and.gfile%dimx==1152.and.gfile%dimz==64
3101  if(linit) then
3102  gfile%ncldt=1
3103  gfile%idsl=0
3104  gfile%idvm=0
3105  gfile%idrt=4
3106  gfile%jcap=382
3107  gfile%idvc=2
3108  gfile%extrameta=.true.
3109  gfile%nmetavari=5
3110  gfile%nmetavari=15
3111  gfile%nmetavarr=1
3112  gfile%nmetaaryi=1
3113  endif
3114  else if (equal_str_nocase(trim(gfile%modelname),'NMMB')) then
3115  if(gfile%dimx.eq.nemsio_intfill) then
3116  linit=.true.
3117  gfile%dimx=257
3118  endif
3119  if(gfile%dimy.eq.nemsio_intfill) gfile%dimy=181
3120  if(gfile%dimz.eq.nemsio_intfill) gfile%dimz=35
3121  if(gfile%nframe.eq.nemsio_intfill) gfile%nframe=1
3122  if(gfile%ntrac.eq.nemsio_intfill) gfile%ntrac=4
3123  if(gfile%nrec.eq.nemsio_intfill) &
3124  gfile%nrec=86+20*gfile%dimz+(gfile%dimz+1)+3*gfile%nsoil+4
3125  linit=linit.and.gfile%dimx==257.and.gfile%dimy==181.and.gfile%dimz==35
3126  if(linit) then
3127  gfile%extrameta=.true.
3128  gfile%nmetavari=9
3129  gfile%nmetavarr=12
3130  gfile%nmetavarl=2
3131  gfile%nmetaaryr=7
3132  gfile%rlon_min=-178.5937347
3133  gfile%rlon_max=178.5937347
3134  gfile%rlat_min=-89.49999237
3135  gfile%rlat_max=89.49999237
3136  endif
3137  else if (equal_str_nocase(trim(gfile%modelname),"GSI")) then
3138  if(gfile%dimx.eq.nemsio_intfill) then
3139  linit=.true.
3140  gfile%dimx=1152
3141  endif
3142  if(gfile%dimy.eq.nemsio_intfill) gfile%dimy=576
3143  if(gfile%dimz.eq.nemsio_intfill) gfile%dimz=64
3144  if(gfile%nrec.eq.nemsio_intfill) &
3145  gfile%nrec=10+3*gfile%dimz+gfile%ntrac*gfile%dimz
3146  linit=linit.and.gfile%dimx==1152.and.gfile%dimy==576.and.gfile%dimz==64
3147  if(linit) then
3148  gfile%jcap=382
3149  gfile%idvc=2
3150  gfile%ncldt=1
3151  gfile%idsl=0
3152  gfile%idvm=0
3153  gfile%idrt=4
3154  gfile%extrameta=.true.
3155  gfile%nmetaaryc=1
3156  endif
3157  endif
3158  if(gfile%dimx.eq.nemsio_intfill.or.gfile%dimy.eq.nemsio_intfill.or. &
3159  gfile%dimz.eq.nemsio_intfill.or.gfile%idate(1).eq.nemsio_intfill) then
3160  print *,'ERROR: please provide dimensions!'
3161  call nemsio_stop
3162  endif
3163  if(gfile%nframe.eq.nemsio_intfill) gfile%nframe=0
3164  gfile%fieldsize=(gfile%dimx+2*gfile%nframe)*(gfile%dimy+2*gfile%nframe)
3165  if(gfile%nrec.eq.nemsio_intfill) gfile%nrec=12+(3+gfile%ntrac)*gfile%dimz
3166 !
3167 ! print *,'gfinit, after set up dimension,',gfile%nrec,gfile%ntrac,gfile%fieldsize,&
3168 ! gfile%dimz
3169  if(.not.allocated(gfile%recname)) then
3170  call nemsio_almeta(gfile,iret)
3171  if ( iret.ne.0 ) return
3172  endif
3173  ltmp=(gfile%nmetavari>0.and..not.allocated(gfile%variname)) .or. &
3174  (gfile%nmetavarr>0.and..not.allocated(gfile%varrname)) .or. &
3175  (gfile%nmetavarl>0.and..not.allocated(gfile%varlname)) .or. &
3176  (gfile%nmetavarc>0.and..not.allocated(gfile%varcname)) .or. &
3177  (gfile%nmetavarr8>0.and..not.allocated(gfile%varr8name)) .or. &
3178  (gfile%nmetaaryi>0.and..not.allocated(gfile%aryiname)) .or. &
3179  (gfile%nmetaaryr>0.and..not.allocated(gfile%aryrname)) .or. &
3180  (gfile%nmetaaryl>0.and..not.allocated(gfile%arylname)) .or. &
3181  (gfile%nmetaaryc>0.and..not.allocated(gfile%arycname)) .or. &
3182  (gfile%nmetaaryr8>0.and..not.allocated(gfile%aryr8name))
3183  if(ltmp) then
3184  call nemsio_alextrameta(gfile,iret)
3185  if ( iret.ne.0 ) return
3186  endif
3187 ! print *,'gfinit, after set up allocate array size dx',size(gfile%dx),size(gfile%cpi), &
3188 ! size(gfile%variname), size(gfile%varrname),size(gfile%varlname),size(gfile%aryrname),&
3189 ! gfile%nmetavari,gfile%nmetavarr,gfile%nmetavarl,gfile%nmetaaryr,gfile%nmetaaryi
3190 !
3191  if ( equal_str_nocase(trim(gfile%modelname),'GFS').and.gfile%nmeta>=8) then
3192 !lat:
3193  if(maxval(gfile%lat)==nemsio_realfill.and.minval(gfile%lat)==nemsio_realfill) then
3194  allocate(slat(gfile%dimy))
3195  call splat(gfile%idrt,gfile%dimy,slat)
3196  radi=180.0d0/(4.d0*atan(1.d0))
3197  do i=1,gfile%dimy
3198  gfile%lat((i-1)*gfile%dimx+1:i*gfile%dimx) = asin(slat(i)) * radi
3199  enddo
3200  deallocate(slat)
3201  endif
3202 !lon:
3203  if(maxval(gfile%lon)==nemsio_realfill.and.minval(gfile%lon)==nemsio_realfill) then
3204  do i=1,gfile%dimx
3205  gfile%lon(i) = 360./gfile%dimx*(i-1)
3206  enddo
3207  do j=2,gfile%dimy
3208  gfile%lon((j-1)*gfile%dimx+1:j*gfile%dimx) = gfile%lon(1:gfile%dimx)
3209  enddo
3210  endif
3211  endif
3212 !
3213 !
3214  if ( equal_str_nocase(trim(gfile%modelname),'GFS').and.linit) then
3215  gfile%variname=(/'itrun ','iorder ','irealf ','igen ','icen2 '/)
3216  gfile%varival=(/1,2,1,82,0/)
3217  if(linit) then
3218  gfile%variname=(/'itrun ','iorder ','irealf ','igen ','latf ','lonf ','latr ','lonr ', &
3219  'icen2 ','idpp ','idvt ','idrun ','idusr ','ixgr ','nvcoord'/)
3220  gfile%varival=(/1,2,1,82,576,1152,576,1152,0,21,0,0,0,0,2/)
3221  gfile%varrname=(/'pdryini'/)
3222  gfile%varrval=(/98.29073/)
3223  gfile%aryiname(1)='iens'
3224  gfile%aryilen(1)=2
3225  allocate(gfile%aryival(maxval(gfile%aryilen),gfile%nmetaaryi))
3226  gfile%aryival(:,1)=(/0,0/)
3227 ! print *,'before gfile vcoord',size(gfile%vcoord,1),size(gfile%vcoord,2),size(gfile%vcoord,3)
3228 
3229  if(gfile%dimz==64) then
3230  gfile%vcoord(1:gfile%dimz+1,1,1)=(/2*0.0000000,0.57499999,5.7410002,21.516001,55.712002, &
3231  116.89900,214.01500,356.22299,552.71997,812.48901,1143.9880,1554.7889, &
3232  2051.1499,2637.5530,3316.2170,4086.6140,4945.0288,5884.2061,6893.1172, &
3233  7956.9082,9057.0508,10171.712,11276.348,12344.490,13348.671,14261.435, &
3234  15056.342,15708.893,16197.315,16503.145,16611.604,16511.736,16197.967, &
3235  15683.489,14993.074,14154.316,13197.065,12152.937,11054.853,9936.6143, &
3236  8832.5371,7777.1499,6804.8740,5937.0498,5167.1460,4485.4932,3883.0520, &
3237  3351.4600,2883.0381,2470.7881,2108.3660,1790.0510,1510.7111,1265.7520, &
3238  1051.0800,863.05798,698.45697,554.42401,428.43399,318.26599,221.95799, &
3239  137.78999,64.247002,0.0000000 /)
3240  gfile%vcoord(1:gfile%dimz+1,2,1)=(/1.0000000,0.99467117,0.98862660,0.98174226,0.97386760, &
3241  0.96482760,0.95443410,0.94249105,0.92879730,0.91315103,0.89535499, &
3242  0.87522358,0.85259068,0.82731885,0.79930973,0.76851469,0.73494524, &
3243  0.69868290,0.65988702,0.61879963,0.57574666,0.53113484,0.48544332, &
3244  0.43921080,0.39301825,0.34746850,0.30316412,0.26068544,0.22057019, &
3245  0.18329623,0.14926878,0.11881219,0.92166908e-01,0.69474578e-01,0.50646842e-01, &
3246  0.35441618e-01, 0.23555880e-01,0.14637120e-01,0.82940198e-02,0.41067102e-02, &
3247  0.16359100e-02,0.43106001e-03,0.36969999e-04,0.0000000*22 /)
3248  gfile%vcoord(1:gfile%dimz+1,3,1)=0.
3249  gfile%vcoord(1:gfile%dimz+1,1,2)=0.
3250  gfile%vcoord(1:gfile%dimz+1,2,2)=0.
3251  gfile%vcoord(1:gfile%dimz+1,3,2)=0.
3252 
3253  endif
3254 
3255  if(.not.present(recname).or..not.present(reclevtyp).or..not.present(reclev) )then
3256  if(size(gfile%recname).eq.2+9*gfile%dimz+35+3*gfile%nsoil) then
3257  if(trim(gfile%recname(1))=='') then
3258  rec=1
3259  gfile%recname(rec)='hgt'
3260  gfile%recname(rec+1)='pres'
3261  gfile%recname(rec+2:rec+gfile%dimz+1)='pres'
3262  gfile%recname(rec+gfile%dimz+2:rec+2*gfile%dimz+1)='dpres'
3263  gfile%recname(rec+2*gfile%dimz+2:rec+3*gfile%dimz+1)='tmp'
3264  gfile%recname(rec+3*gfile%dimz+2:rec+4*gfile%dimz+1)='ugrd'
3265  gfile%recname(rec+4*gfile%dimz+2:rec+5*gfile%dimz+1)='vgrd'
3266  gfile%recname(rec+5*gfile%dimz+2:rec+6*gfile%dimz+1)='spfh'
3267  gfile%recname(rec+6*gfile%dimz+2:rec+7*gfile%dimz+1)='o3mr'
3268  gfile%recname(rec+7*gfile%dimz+2:rec+8*gfile%dimz+1)='clwmr'
3269  gfile%recname(rec+8*gfile%dimz+2:rec+9*gfile%dimz+1)='vvel'
3270  rec=rec+9*gfile%dimz+1
3271  gfile%recname(rec+1:rec+35)=(/'slmsk ','orog ','tsea ','sheleg','tg3 ','zorl ', &
3272  'cv ','cvb ','cvt ', &
3273  'alvsf ','alvwf ','alnsf ','alnwf ','vfrac ','canopy','f10m ','t2m ', &
3274  'q2m ','vtype ','stype ','facsf ','facwf ','uustar','ffmm ','ffhh ', &
3275  'hice ','fice ','tisfc ','tprcp ','srflag','snwdph','shdmin','shdmax', &
3276  'slope ','snoalb' /)
3277  gfile%recname(rec+36:rec+35+gfile%nsoil)='stc'
3278  gfile%recname(rec+36+gfile%nsoil:rec+35+2*gfile%nsoil)='smc'
3279  gfile%recname(rec+36+2*gfile%nsoil:rec+35+3*gfile%nsoil)='slc'
3280  endif
3281  endif
3282 
3283  if(size(gfile%reclevtyp).eq.2+9*gfile%dimz+35+3*gfile%nsoil) then
3284  if(trim(gfile%reclevtyp(1))=='') then
3285  rec=1
3286  gfile%reclevtyp='sfc'
3287  gfile%reclevtyp(rec+2:rec+gfile%dimz+1)='mid layer'
3288  gfile%reclevtyp(rec+gfile%dimz+2:rec+2*gfile%dimz+1)='mid layer'
3289  gfile%reclevtyp(rec+2*gfile%dimz+2:rec+3*gfile%dimz+1)='mid layer'
3290  gfile%reclevtyp(rec+3*gfile%dimz+2:rec+4*gfile%dimz+1)='mid layer'
3291  gfile%reclevtyp(rec+4*gfile%dimz+2:rec+5*gfile%dimz+1)='mid layer'
3292  gfile%reclevtyp(rec+5*gfile%dimz+2:rec+6*gfile%dimz+1)='mid layer'
3293  gfile%reclevtyp(rec+6*gfile%dimz+2:rec+7*gfile%dimz+1)='mid layer'
3294  gfile%reclevtyp(rec+7*gfile%dimz+2:rec+8*gfile%dimz+1)='mid layer'
3295  gfile%reclevtyp(rec+8*gfile%dimz+2:rec+9*gfile%dimz+1)='mid layer'
3296  rec=rec+9*gfile%dimz+36
3297  gfile%reclevtyp(rec+1:rec+3*gfile%nsoil)='soil layer'
3298  endif
3299  endif
3300 !
3301  if(size(gfile%reclev).eq.2+9*gfile%dimz+35+3*gfile%nsoil) then
3302  if(gfile%reclev(1)==-9999) then
3303  gfile%reclev=1
3304  rec=2
3305  do j=3,11
3306  do i=1,gfile%dimz
3307  gfile%reclev(rec+(j-3)*gfile%dimz+i)=i
3308  enddo
3309  enddo
3310  rec=rec+9*gfile%dimz+35
3311  do j=1,3
3312  do i=1,gfile%nsoil
3313  gfile%reclev(rec+(j-1)*gfile%nsoil+i)=i
3314  enddo
3315  enddo
3316  endif
3317  endif
3318 !
3319  endif
3320  endif
3321  else if ( equal_str_nocase(trim(gfile%modelname),"NMMB") .and. linit) then
3322  gfile%variname=(/'mp_phys ','sfsfcphy','nphs ','nclod ', &
3323  'nheat ','nprec ','nrdlw ','nrdsw ','nsrfc ' /)
3324  gfile%varival=(/5,99,2,60,60,60,60,60,60/)
3325  gfile%varrname=(/'pdtop ','dt ','pt ','tlm0d ','tph0d ','tstart', &
3326  'aphtim','ardlw ','ardsw ','asrfc ','avcnvc','avrain' /)
3327  gfile%varrval=(/26887.10156,180.,1000.,0.,0.,0.,-1000000.0, &
3328  -1000000.0,-1000000.0,-1000000.0,0.,0./)
3329  gfile%varlname=(/'run ','global'/)
3330  gfile%varlval=(/.true.,.false. /)
3331  gfile%aryrname=(/'dsg1 ','dsg2 ','sgml1 ','sgml2 ','sg1 ','sg2 ','sldpth'/)
3332  gfile%aryrlen=(/gfile%dimz,gfile%dimz,gfile%dimz,gfile%dimz, &
3333  gfile%dimz+1,gfile%dimz+1,gfile%nsoil /)
3334  allocate(gfile%aryrval(maxval(gfile%aryrlen),gfile%nmetaaryr))
3335  if(size(gfile%aryrval,1).eq.36) then
3336  gfile%aryrval(1:35,1)=(/0.8208955079e-01,0.8582090586e-01,0.8582088351e-01, &
3337  0.8582088351e-01,0.8582091331e-01,0.8582085371e-01, &
3338  0.9328359365e-01,0.9701490402e-01,0.9701496363e-01, &
3339  0.9701490402e-01,0.1044776440,0.0000000000e+00,0.0000000000e+00, &
3340  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3341  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3342  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3343  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3344  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3345  0.0000000000e+00,0.0000000000e+00 /)
3346  gfile%aryrval(1:35,2)=(/0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3347  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3348  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.4098360986e-01, &
3349  0.4371585697e-01,0.4781420529e-01,0.4918029904e-01,0.5054645240e-01, &
3350  0.5327869952e-01,0.5464482307e-01,0.5464476347e-01,0.5464485288e-01, &
3351  0.5464485288e-01,0.5464470387e-01,0.5191260576e-01,0.5054640770e-01, &
3352  0.4918038845e-01,0.4508191347e-01,0.4371589422e-01,0.3961753845e-01, &
3353  0.3551906347e-01,0.3005468845e-01,0.2732235193e-01,0.2459019423e-01, &
3354  0.1912564039e-01,0.1639348269e-01,0.8196711540e-02 /)
3355  gfile%aryrval(1:35,3)=(/0.4104477540e-01,0.1250000000,0.2108208984,0.2966417670,0.3824626803, &
3356  0.4682835639,0.5578358173,0.6529850364,0.7500000000,0.8470149040, &
3357  0.9477611780,1.000000000,1.000000000,1.000000000,1.000000000, &
3358  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3359  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3360  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3361  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000 /)
3362  gfile%aryrval(1:35,4)=(/0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3363  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3364  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.2049180493e-01, &
3365  0.6284153461e-01,0.1086065695,0.1571038216,0.2069672048,0.2588797808, &
3366  0.3128415346,0.3674863279,0.4221311212,0.4767760038,0.5314207673, &
3367  0.5846993923,0.6359289289,0.6857923269,0.7329235077,0.7773224115, &
3368  0.8189890981,0.8565573692,0.8893442750,0.9180327654,0.9439890385, &
3369  0.9658470154,0.9836065769,0.9959016442/)
3370  gfile%aryrval(1:36,5)=(/0.0000000000e+00,0.8208955079e-01,0.1679104567,0.2537313402, &
3371  0.3395522237,0.4253731370,0.5111939907,0.6044775844,0.7014924884, &
3372  0.7985074520,0.8955223560,1.000000000,1.000000000,1.000000000, &
3373  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3374  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3375  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3376  1.000000000,1.000000000,1.000000000,1.000000000,1.000000000, &
3377  1.000000000,1.000000000 /)
3378  gfile%aryrval(1:36,6)=(/0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3379  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3380  0.0000000000e+00,0.0000000000e+00,0.0000000000e+00,0.0000000000e+00, &
3381  0.4098360986e-01,0.8469946682e-01,0.1325136721,0.1816939712, &
3382  0.2322404236,0.2855191231,0.3401639462,0.3948087096,0.4494535625, &
3383  0.5040984154,0.5587431192,0.6106557250,0.6612021327,0.7103825212, &
3384  0.7554644346,0.7991803288,0.8387978673,0.8743169308,0.9043716192, &
3385  0.9316939712,0.9562841654,0.9754098058,0.9918032885,1.000000000 /)
3386  gfile%aryrval(1,7)=0.1000000015
3387  gfile%aryrval(2,7)=0.3000000119
3388  gfile%aryrval(3,7)=0.6000000238
3389  gfile%aryrval(4,7)=1.000000000
3390  endif
3391 !
3392  gfile%dy=111282.1953
3393  allocate(dx(gfile%dimy+2*gfile%nframe))
3394  dx=0.
3395  if(size(dx).eq.183) then
3396  dx(1:183)=(/2731.143066,0.0000000000e+00,2731.143066,5461.452148,8190.078125,10916.22852, &
3397  13639.05469,16357.72461,19071.41211,21779.29102,24480.51758,27174.30469,29859.81250, &
3398  32536.22656,35202.73047,37858.51172,40502.74219,43134.64844,45753.42188,48358.25781, &
3399  50948.35938,53522.93750,56081.21094,58622.40625,61145.74609,63650.46094,66135.78906, &
3400  68600.96094,71045.23438,73467.88281,75868.14844,78245.29688,80598.62500,82927.38281, &
3401  85230.89062,87508.42969,89759.32031,91982.86719,94178.39062,96345.23438,98482.71875, &
3402  100590.2188,102667.0625,104712.6406,106726.3281,108707.5000,110655.5625,112569.9062, &
3403  114449.9844,116295.1719,118104.9531,119878.7500,121616.0312,123316.2656,124978.9453, &
3404  126603.5469,128189.5938,129736.5781,131244.0625,132711.5625,134138.6250,135524.8438, &
3405  136869.7500,138173.0000,139434.1406,140652.8125,141828.6406,142961.2812,144050.3438, &
3406  145095.5469,146096.5625,147053.0625,147964.7656,148831.4062,149652.6875,150428.4062, &
3407  151158.2969,151842.1562,152479.7500,153070.9062,153615.4219,154113.1562,154563.9375, &
3408  154967.6406,155324.1406,155633.3281,155895.1094,156109.3906,156276.1250,156395.2656, &
3409  156466.7656,156490.5938,156466.7656,156395.2656,156276.1250,156109.3906,155895.1094, &
3410  155633.3281,155324.1406,154967.6406,154563.9375,154113.1562,153615.4219,153070.9062, &
3411  152479.7500,151842.1562,151158.2969,150428.4062,149652.6875,148831.4062,147964.7656, &
3412  147053.0625,146096.5625,145095.5469,144050.3438,142961.2812,141828.6406,140652.8125, &
3413  139434.1406,138173.0000,136869.7500,135524.8438,134138.6250,132711.5625,131244.0625, &
3414  129736.5781,128189.5938,126603.5469,124978.9453,123316.2656,121616.0312,119878.7500, &
3415  118104.9531,116295.1719,114449.9844,112569.9062,110655.5625,108707.5000,106726.3281, &
3416  104712.6406,102667.0625,100590.2188,98482.71875,96345.23438,94178.39062,91982.86719, &
3417  89759.32031,87508.42969,85230.89062,82927.38281,80598.62500,78245.29688,75868.14844, &
3418  73467.88281,71045.23438,68600.96094,66135.78906,63650.46094,61145.74609,58622.40625, &
3419  56081.21094,53522.93750,50948.35938,48358.25781,45753.42188,43134.64844,40502.74219, &
3420  37858.51172,35202.73047,32536.22656,29859.81250,27174.30469,24480.51758,21779.29102, &
3421  19071.41211,16357.72461,13639.05469,10916.22852,8190.078125,5461.452148,2731.143066, &
3422  0.0000000000e+00,2731.143066 /)
3423 ! print *,'size(dx)=',size(dx),'jm+2=',gfile%dimy+2,'size(gfile%dx)=',size(gfile%dx), &
3424 ! maxval(gfile%dx),minval(gfile%dx),maxval(gfile%dy),maxval(gfile%dy),'nframe=', &
3425 ! gfile%nframe,'dimy=',gfile%dimy
3426  if(allocated(gfile%dx).and.size(gfile%dx)==183*(gfile%dimx+2*gfile%nframe)) then
3427  do i=1,gfile%dimy+2*gfile%nframe
3428  gfile%dx((i-1)*(gfile%dimx+2*gfile%nframe)+1:i*(gfile%dimx+2*gfile%nframe))=dx(i)
3429  enddo
3430  endif
3431  endif
3432  deallocate(dx)
3433 
3434  if(.not.present(recname).or..not.present(reclevtyp).or..not.present(reclev) )then
3435  if(size(gfile%recname)==86+20*gfile%dimz+(gfile%dimz+1)+3*gfile%nsoil+4) then
3436  if(trim(gfile%recname(1))=='') then
3437  rec=1
3438  gfile%recname(1)='hgt'
3439  gfile%recname(2)='glat'
3440  gfile%recname(3)='glon'
3441  gfile%recname(4)='dpres'
3442  gfile%recname(5)='vlat'
3443  gfile%recname(6)='vlon'
3444  gfile%recname(7)='acfrcv'
3445  gfile%recname(8)='acfrst'
3446  gfile%recname(9)='acprec'
3447  gfile%recname(10)='acsnom'
3448  gfile%recname(11)='acsnow'
3449  gfile%recname(12)='akhs_out'
3450  gfile%recname(13)='akms_out'
3451  gfile%recname(14)='albase'
3452  gfile%recname(15)='albedo'
3453  gfile%recname(16)='alwin'
3454  gfile%recname(17)='alwout'
3455  gfile%recname(18)='alwtoa'
3456  gfile%recname(19)='aswin'
3457  gfile%recname(20)='aswout'
3458  gfile%recname(21)='aswtoa'
3459  gfile%recname(22)='bgroff'
3460  gfile%recname(23)='cfrach'
3461  gfile%recname(24)='cfracl'
3462  gfile%recname(25)='cfracm'
3463  gfile%recname(26)='cldefi'
3464  gfile%recname(27)='cmc'
3465  gfile%recname(28)='cnvbot'
3466  gfile%recname(29)='cnvtop'
3467  gfile%recname(30)='cprate'
3468  gfile%recname(31)='cuppt'
3469  gfile%recname(32)='cuprec'
3470  gfile%recname(33)='czen'
3471  gfile%recname(34)='czmean'
3472  gfile%recname(35)='epsr'
3473  gfile%recname(36)='grnflx'
3474  gfile%recname(37)='hbotd'
3475  gfile%recname(38)='hbots'
3476  gfile%recname(39)='htopd'
3477  gfile%recname(40)='htops'
3478  gfile%recname(41)='mxsnal'
3479  gfile%recname(42)='pblh'
3480  gfile%recname(43)='potevp'
3481  gfile%recname(44)='prec'
3482  gfile%recname(45)='pshltr'
3483  gfile%recname(46)='q10'
3484  gfile%recname(47)='qsh'
3485  gfile%recname(48)='qshltr'
3486  gfile%recname(49)='qwbs'
3487  gfile%recname(50)='qz0'
3488  gfile%recname(51)='radot'
3489  gfile%recname(52)='rlwin'
3490  gfile%recname(53)='rlwtoa'
3491  gfile%recname(54)='rswin'
3492  gfile%recname(55)='rswinc'
3493  gfile%recname(56)='rswout'
3494  gfile%recname(57)='sfcevp'
3495  gfile%recname(58)='sfcexc'
3496  gfile%recname(59)='sfclhx'
3497  gfile%recname(60)='sfcshx'
3498  gfile%recname(61)='si'
3499  gfile%recname(62)='sice'
3500  gfile%recname(63)='sigt4'
3501  gfile%recname(64)='sm'
3502  gfile%recname(65)='smstav'
3503  gfile%recname(66)='smstot'
3504  gfile%recname(67)='sno'
3505  gfile%recname(68)='snopcx'
3506  gfile%recname(69)='soiltb'
3507  gfile%recname(70)='sr'
3508  gfile%recname(71)='ssroff'
3509  gfile%recname(72)='tsea'
3510  gfile%recname(73)='subshx'
3511  gfile%recname(74)='tg'
3512  gfile%recname(75)='th10'
3513  gfile%recname(76)='ths'
3514  gfile%recname(77)='thz0'
3515  gfile%recname(78)='tshltr'
3516  gfile%recname(79)='twbs'
3517  gfile%recname(80)='u10'
3518  gfile%recname(81)='uustar'
3519  gfile%recname(82)='uz0'
3520  gfile%recname(83)='v10'
3521  gfile%recname(84)='vfrac'
3522  gfile%recname(85)='vz0'
3523  gfile%recname(86)='zorl'
3524 
3525  rec=86
3526  gfile%recname(rec+1:rec+gfile%dimz)='vvel'
3527  gfile%recname(rec+gfile%dimz+1:rec+2*gfile%dimz)='dwdt'
3528  gfile%recname(rec+2*gfile%dimz+1:rec+3*gfile%dimz+1)='pres'
3529  gfile%recname(rec+3*gfile%dimz+2:rec+4*gfile%dimz+1)='omgalf'
3530  gfile%recname(rec+4*gfile%dimz+2:rec+5*gfile%dimz+1)='o3mr'
3531  gfile%recname(rec+5*gfile%dimz+2:rec+6*gfile%dimz+1)='cldfra'
3532  gfile%recname(rec+6*gfile%dimz+2:rec+7*gfile%dimz+1)='clwmr'
3533  gfile%recname(rec+7*gfile%dimz+2:rec+8*gfile%dimz+1)='exch_h'
3534  gfile%recname(rec+8*gfile%dimz+2:rec+9*gfile%dimz+1)='spfh'
3535  gfile%recname(rec+9*gfile%dimz+2:rec+10*gfile%dimz+1)='q2'
3536  gfile%recname(rec+10*gfile%dimz+2:rec+11*gfile%dimz+1)='rlwtt'
3537  gfile%recname(rec+11*gfile%dimz+2:rec+12*gfile%dimz+1)='rswtt'
3538  gfile%recname(rec+12*gfile%dimz+2:rec+13*gfile%dimz+1)='tmp'
3539  gfile%recname(rec+13*gfile%dimz+2:rec+14*gfile%dimz+1)='tcucn'
3540  gfile%recname(rec+14*gfile%dimz+2:rec+15*gfile%dimz+1)='train'
3541  gfile%recname(rec+15*gfile%dimz+2:rec+16*gfile%dimz+1)='ugrd'
3542  gfile%recname(rec+16*gfile%dimz+2:rec+17*gfile%dimz+1)='vgrd'
3543  gfile%recname(rec+17*gfile%dimz+2:rec+18*gfile%dimz+1)='xlen_mix'
3544  gfile%recname(rec+18*gfile%dimz+2:rec+19*gfile%dimz+1)='f_ice'
3545  gfile%recname(rec+19*gfile%dimz+2:rec+20*gfile%dimz+1)='f_rimef'
3546  gfile%recname(rec+20*gfile%dimz+2:rec+21*gfile%dimz+1)='f_rain'
3547  gfile%recname(rec+21*gfile%dimz+2:rec+21*gfile%dimz+gfile%nsoil+1)='sh2o'
3548  gfile%recname(rec+21*gfile%dimz+gfile%nsoil+2:rec+21*gfile%dimz+2*gfile%nsoil+1)='smc'
3549  gfile%recname(rec+21*gfile%dimz+2*gfile%nsoil+2:rec+21*gfile%dimz+3*gfile%nsoil+1)='stc'
3550  gfile%recname(rec+21*gfile%dimz+3*gfile%nsoil+2)='sltyp'
3551  gfile%recname(rec+21*gfile%dimz+3*gfile%nsoil+3)='vgtyp'
3552  gfile%recname(rec+21*gfile%dimz+3*gfile%nsoil+4)='cfrcv'
3553  gfile%recname(rec+21*gfile%dimz+3*gfile%nsoil+5)='cfrst'
3554  endif
3555  endif
3556 
3557 !define rec layer type
3558  if(size(gfile%reclevtyp)==86+20*gfile%dimz+(gfile%dimz+1)+3*gfile%nsoil+4) then
3559  if(trim(gfile%reclevtyp(1))=='') then
3560  gfile%reclevtyp='sfc'
3561  gfile%reclevtyp(4)='hybrid sig lev'
3562  gfile%reclevtyp(46)='10 m above gnd'
3563  gfile%reclevtyp(75)='10 m above gnd'
3564  gfile%reclevtyp(80)='10 m above gnd'
3565  gfile%reclevtyp(83)='10 m above gnd'
3566  rec=86
3567  gfile%reclevtyp(rec+1:rec+gfile%dimz)='mid layer'
3568  gfile%reclevtyp(rec+gfile%dimz+1:rec+2*gfile%dimz)='mid layer'
3569  gfile%reclevtyp(rec+2*gfile%dimz+1:rec+3*gfile%dimz+1)='layer'
3570  gfile%reclevtyp(rec+3*gfile%dimz+2:rec+4*gfile%dimz+1)='mid layer'
3571  gfile%reclevtyp(rec+4*gfile%dimz+2:rec+5*gfile%dimz+1)='mid layer'
3572  gfile%reclevtyp(rec+5*gfile%dimz+2:rec+6*gfile%dimz+1)='mid layer'
3573  gfile%reclevtyp(rec+6*gfile%dimz+2:rec+7*gfile%dimz+1)='mid layer'
3574  gfile%reclevtyp(rec+7*gfile%dimz+2:rec+8*gfile%dimz+1)='mid layer'
3575  gfile%reclevtyp(rec+8*gfile%dimz+2:rec+9*gfile%dimz+1)='mid layer'
3576  gfile%reclevtyp(rec+9*gfile%dimz+2:rec+10*gfile%dimz+1)='mid layer'
3577  gfile%reclevtyp(rec+10*gfile%dimz+2:rec+11*gfile%dimz+1)='mid layer'
3578  gfile%reclevtyp(rec+11*gfile%dimz+2:rec+12*gfile%dimz+1)='mid layer'
3579  gfile%reclevtyp(rec+12*gfile%dimz+2:rec+13*gfile%dimz+1)='mid layer'
3580  gfile%reclevtyp(rec+13*gfile%dimz+2:rec+14*gfile%dimz+1)='mid layer'
3581  gfile%reclevtyp(rec+14*gfile%dimz+2:rec+15*gfile%dimz+1)='mid layer'
3582  gfile%reclevtyp(rec+15*gfile%dimz+2:rec+16*gfile%dimz+1)='mid layer'
3583  gfile%reclevtyp(rec+16*gfile%dimz+2:rec+17*gfile%dimz+1)='mid layer'
3584  gfile%reclevtyp(rec+17*gfile%dimz+2:rec+18*gfile%dimz+1)='mid layer'
3585  gfile%reclevtyp(rec+18*gfile%dimz+2:rec+19*gfile%dimz+1)='mid layer'
3586  gfile%reclevtyp(rec+19*gfile%dimz+2:rec+20*gfile%dimz+1)='mid layer'
3587  gfile%reclevtyp(rec+20*gfile%dimz+2:rec+21*gfile%dimz+1)='mid layer'
3588  gfile%reclevtyp(rec+21*gfile%dimz+2)='0-10 cm down'
3589  gfile%reclevtyp(rec+21*gfile%dimz+3)='10-40 cm down'
3590  gfile%reclevtyp(rec+21*gfile%dimz+4)='40-100 cm down'
3591  gfile%reclevtyp(rec+21*gfile%dimz+5)='100-200 cm down'
3592  gfile%reclevtyp(rec+21*gfile%dimz+gfile%nsoil+2)='0-10 cm down'
3593  gfile%reclevtyp(rec+21*gfile%dimz+gfile%nsoil+3)='10-40 cm down'
3594  gfile%reclevtyp(rec+21*gfile%dimz+gfile%nsoil+4)='40-100 cm down'
3595  gfile%reclevtyp(rec+21*gfile%dimz+gfile%nsoil+5)='100-200 cm down'
3596  gfile%reclevtyp(rec+21*gfile%dimz+2*gfile%nsoil+2)='0-10 cm down'
3597  gfile%reclevtyp(rec+21*gfile%dimz+2*gfile%nsoil+3)='10-40 cm down'
3598  gfile%reclevtyp(rec+21*gfile%dimz+2*gfile%nsoil+4)='40-100 cm down'
3599  gfile%reclevtyp(rec+21*gfile%dimz+2*gfile%nsoil+5)='100-200 cm down'
3600  endif
3601  endif
3602 !
3603 !reclev
3604  if(size(gfile%reclev)==86+20*gfile%dimz+(gfile%dimz+1)+3*gfile%nsoil+4) then
3605  if(gfile%reclev(1)==-9999) then
3606  gfile%reclev=1
3607  rec=86
3608  do j=1,3
3609  do i=1,gfile%dimz
3610  gfile%reclev(rec+(j-1)*gfile%dimz+i)=i
3611  enddo
3612  enddo
3613  gfile%reclev(rec+3*gfile%dimz+1)=gfile%dimz+1
3614  do j=4,21
3615  do i=1,gfile%dimz
3616  gfile%reclev(rec+(j-1)*gfile%dimz+1+i)=i
3617  enddo
3618  enddo
3619  rec=rec+21*gfile%dimz+1
3620  do j=22,24
3621  do i=1,gfile%nsoil
3622  gfile%reclev(rec+(j-22)*gfile%nsoil+i)=i
3623  enddo
3624  enddo
3625  endif
3626  endif
3627 !
3628  endif
3629  else if ( equal_str_nocase(trim(gfile%modelname),"GSI").and.linit) then
3630 !
3631  gfile%arycname(1)='recunit'
3632  gfile%aryclen(1)=gfile%nrec
3633  allocate(gfile%arycval(maxval(gfile%aryclen),gfile%nmetaaryc))
3634  gfile%arycval(1,1)='pgm'
3635  gfile%arycval(2,1)='nondim'
3636  gfile%arycval(3:gfile%dimz+2,1)='K'
3637  gfile%arycval(gfile%dimz+3:3*gfile%dimz+2,1)='m/s '
3638  gfile%arycval(3*gfile%dimz+3:6*gfile%dimz+2,1)='kg/kg '
3639  gfile%arycval(6*gfile%dimz+3,1)='%'
3640  gfile%arycval(6*gfile%dimz+4,1)='K'
3641  gfile%arycval(6*gfile%dimz+5,1)='kg/m2 '
3642  gfile%arycval(6*gfile%dimz+6,1)='integer'
3643  gfile%arycval(6*gfile%dimz+7,1)='% '
3644  gfile%arycval(6*gfile%dimz+8,1)='integer'
3645  gfile%arycval(6*gfile%dimz+9,1)='integer'
3646  gfile%arycval(6*gfile%dimz+10,1)='m '
3647  gfile%arycval(6*gfile%dimz+11,1)='K '
3648  gfile%arycval(6*gfile%dimz+12,1)='% '
3649 
3650  if(.not.present(recname).or..not.present(reclevtyp).or..not.present(reclev) )then
3651 !
3652  if(size(gfile%recname)==10+3*gfile%dimz+gfile%ntrac*gfile%dimz .and. &
3653  size(gfile%reclevtyp)==10+3*gfile%dimz+gfile%ntrac*gfile%dimz .and. &
3654  size(gfile%reclev)==10+3*gfile%dimz+gfile%ntrac*gfile%dimz )then
3655  gfile%reclevtyp='sfc'
3656  gfile%reclev=1
3657  gfile%recname(1)='hgt'
3658  gfile%recname(2)='pres'
3659  rec=2
3660  gfile%recname(rec+1:rec+gfile%dimz)='tmp'
3661  gfile%reclevtyp(rec+1:rec+gfile%dimz)='mid layer'
3662  gfile%recname(rec+gfile%dimz+1:rec+2*gfile%dimz)='ugrd'
3663  gfile%reclevtyp(rec+gfile%dimz+1:rec+2*gfile%dimz)='mid layer'
3664  gfile%recname(rec+2*gfile%dimz+1:rec+3*gfile%dimz)='vgrd'
3665  gfile%reclevtyp(rec+2*gfile%dimz+1:rec+3*gfile%dimz)='mid layer'
3666  do i=1,3
3667  do j=1,gfile%dimz
3668  gfile%reclev(rec+(i-1)*gfile%dimz+j)=j
3669  enddo
3670  enddo
3671  do i=1,gfile%ntrac
3672  if ( i.eq.1) gfile%recname(rec+(2+i)*gfile%dimz+1:rec+(3+i)*gfile%dimz)='spfh'
3673  if ( i.eq.1) gfile%reclevtyp(rec+(2+i)*gfile%dimz+1:rec+(3+i)*gfile%dimz)='mid layer'
3674  if ( i.eq.2) gfile%recname(rec+(2+i)*gfile%dimz+1:rec+(3+i)*gfile%dimz)='o3mr'
3675  if ( i.eq.2) gfile%reclevtyp(rec+(2+i)*gfile%dimz+1:rec+(3+i)*gfile%dimz)='mid layer'
3676  if ( i.eq.3) gfile%recname(rec+(2+i)*gfile%dimz+1:rec+(3+i)*gfile%dimz)='clwmr'
3677  if ( i.eq.3) gfile%reclevtyp(rec+(2+i)*gfile%dimz+1:rec+(3+i)*gfile%dimz)='mid layer'
3678  do j=1,gfile%dimz
3679  gfile%reclev(rec+(2+i)*gfile%dimz+j)=j
3680  enddo
3681  enddo
3682  rec=rec+3*gfile%dimz+gfile%ntrac*gfile%dimz
3683  gfile%recname(rec+1)='f10m'
3684  gfile%recname(rec+2)='tsea'
3685  gfile%recname(rec+3)='sheleg'
3686  gfile%recname(rec+4)='vtype'
3687  gfile%recname(rec+5)='vfrac'
3688  gfile%recname(rec+6)='stype'
3689  gfile%recname(rec+7)='slmsk'
3690  gfile%recname(rec+8)='zorl'
3691  gfile%recname(rec+9)='stc'
3692  gfile%recname(rec+10)='smc'
3693  gfile%reclevtyp(rec+9:rec+10)='soil layer'
3694  endif
3695 !
3696  endif
3697  endif
3698 !
3699  iret=0
3700  end subroutine nemsio_gfinit
3701 
3702 
3703 ! temporary subroutines for basio file unit
3704  subroutine nemsio_getlu(gfile,gfname,gaction,iret,ltlendian)
3705 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3706 ! abstract: set unit number to the first number available between 600-699
3707 ! according to unit number array fileunit
3708 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3709  implicit none
3710  type(nemsio_gfile),intent (inout) :: gfile
3711  character*(*),intent(in) :: gfname,gaction
3712  integer,intent(out) :: iret
3713  logical,optional,intent(in) :: ltlendian
3714  integer :: i
3715  logical :: flltlendian
3716  iret=-10
3717  gfile%gfname=gfname
3718  gfile%gaction=gaction
3719  flltlendian=.false.
3720  if(present(ltlendian))flltlendian=ltlendian
3721  if(.not. flltlendian) then
3722  do i=600,999
3723  if ( fileunit(i) .eq. 0 ) then
3724  gfile%flunit=i
3725  fileunit(i)=i
3726  iret=0
3727  exit
3728  endif
3729  enddo
3730  elseif(flltlendian) then
3731  do i=1300,1699
3732  if ( fileunit(i) .eq. 0 ) then
3733  gfile%flunit=i
3734  fileunit(i)=i
3735  iret=0
3736  exit
3737  endif
3738  enddo
3739  endif
3740  end subroutine nemsio_getlu
3741 !------------------------------------------------------------------------------
3742 ! temporary subroutines for free unit number
3743  subroutine nemsio_clslu(gfile,iret)
3744 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3745 ! abstract: free unit number array index corresponding to unit number
3746 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3747  implicit none
3748  type(nemsio_gfile),intent (inout) :: gfile
3749  integer, intent(out) :: iret
3750  iret=-10
3751  if ( fileunit(gfile%flunit) .ne. 0 ) then
3752  fileunit(gfile%flunit)=0
3753  gfile%flunit=0
3754  iret=0
3755  endif
3756  end subroutine nemsio_clslu
3757 !------------------------------------------------------------------------------
3758 !
3759  subroutine nemsio_setrqst(gfile,grbmeta,iret,jrec,vname,vlevtyp,vlev,w34,idrt, &
3760  itr,zhour,ibms,precision)
3761 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3762 ! abstract: if given record number, find record name, lev typ, and levs or
3763 ! record name,lev type and lev can be got from argument list.
3764 ! with record name,lev typ and level, set up grib meta, jpds and
3765 ! jgds
3766 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3767  implicit none
3768  type(nemsio_gfile),intent(inout) :: gfile
3769  type(nemsio_grbmeta),intent(out) :: grbmeta
3770  integer(nemsio_intkind),optional,intent(in) :: jrec
3771  character(*),optional,intent(in) :: vname,vlevtyp
3772  integer(nemsio_intkind),optional,intent(in) :: vlev
3773  integer(nemsio_intkind),intent(out) :: iret
3774  integer(nemsio_intkind),optional,intent(in) :: w34
3775  integer(nemsio_intkind),optional,intent(in) :: idrt
3776  integer(nemsio_intkind),optional,intent(in) :: itr
3777  real(nemsio_realkind),optional,intent(in) :: zhour
3778  integer(nemsio_intkind),optional,intent(in) :: ibms
3779  integer(nemsio_intkind),optional,intent(in) :: precision
3780  character(255) :: name,levtyp
3781  integer :: icen,iptv,itl,jbms,jftu,jp1,jp2,jtr,jna,jnm,ios
3782  integer :: i,lev,ktbl,krec,idrt_in,itr_rw
3783 !------------------------------------------------------------
3784 ! with record number, find record name, level type and level
3785 !------------------------------------------------------------
3786  iret=-5
3787  if ( present(jrec)) then
3788  if ( jrec.gt.0 .and. jrec.le.gfile%nrec) then
3789  name=gfile%recname(jrec)
3790  levtyp=gfile%reclevtyp(jrec)
3791  lev=gfile%reclev(jrec)
3792  else
3793  return
3794  endif
3795  elseif ( present(vname) .and. present(vlevtyp) .and. present(vlev)) then
3796  name=trim(vname)
3797  levtyp=trim(vlevtyp)
3798  lev=vlev
3799  else
3800  return
3801  endif
3802 ! write(0,*)'in setrqst,name=',trim(name),trim(levtyp),lev,'jrec=',jrec
3803 !------------------------------------------------------------
3804 ! find index in grib table according to recname and reclevtyp
3805 !------------------------------------------------------------
3806  call nemsio_grbtbl_search(trim(name),trim(levtyp),ktbl,krec,ios)
3807  if(ios.ne.0) return
3808 
3809 !*** lev: for special layer
3810 ! if ( gribtable(ktbl)%item(krec)%leveltype .eq.'sfc' ) then
3811  if ( trim(gribtable(ktbl)%item(krec)%leveltype) .ne.'layer' .and. &
3812  trim(gribtable(ktbl)%item(krec)%leveltype) .ne.'mid layer' ) then
3813  lev=0
3814  endif
3815 ! write(0,*)'in searchrst,jrec=',jrec,'name=',trim(name),'levtyp=',trim(levtyp),&
3816 ! 'lev=',lev,'gribtb levtype=',gribtable(ktbl)%item(krec)%leveltype
3817 !------------------------------------------------------------
3818 ! for read, just need to set up jpds(05-07)
3819 !------------------------------------------------------------
3820 !--- read:set jpds5,6,7
3821 ! if ( lowercase(gfile%gaction)(1:4).eq."read") then
3822  if ( equal_str_nocase(trim(gfile%gaction),"read") .or. &
3823  equal_str_nocase(trim(gfile%gaction),"rdwr") ) then
3824  grbmeta%jpds(05)=gribtable(ktbl)%item(krec)%g1param
3825  grbmeta%jpds(06)=gribtable(ktbl)%item(krec)%g1level
3826  grbmeta%jpds(07)=lev
3827  if ( grbmeta%jpds(06).eq.110 ) then
3828  grbmeta%jpds(07)=256*(lev-1)+lev
3829  endif
3830  if (gribtable(ktbl)%item(krec)%g1lev.ne.0) then
3831  grbmeta%jpds(07)=gribtable(ktbl)%item(krec)%g1lev
3832  endif
3833 !
3834  itr_rw=10
3835  if(index(trim(name),"_ave")>0) itr_rw=3
3836  if(index(trim(name),"_acc")>0) itr_rw=4
3837  if(index(trim(name),"_max")>0) itr_rw=2
3838  if(index(trim(name),"_min")>0) itr_rw=2
3839  else
3840 !------------------------------------------------------------
3841 ! for write, need to set up jgds(1:25), jpds(01-20)
3842 !------------------------------------------------------------
3843  if (present(precision)) then
3844  gribtable(ktbl)%item(krec)%precision=precision
3845  endif
3846  if (present(idrt)) then
3847  idrt_in = idrt
3848  else
3849 !*** gfile idrt
3850  idrt_in=gfile%idrt
3851  endif
3852 !*** for itr
3853  jftu=1
3854  jtr=10
3855  jp1=gfile%nfhour
3856  jp2=0
3857  if(present(itr) ) then
3858  jtr=itr
3859  if(itr==3.or.itr==2.or.itr==4) then !avg
3860  if(present(zhour)) then
3861  jp1=nint(zhour)
3862  jp2=gfile%nfhour
3863  else
3864  print *,'ERROR in nemsio gribfile,itr=',itr,'need to set zhour'
3865  endif
3866  endif
3867  endif
3868  itr_rw=jtr
3869  jbms=0
3870  if(present(ibms)) jbms=ibms
3871 !
3872  icen=7
3873 !
3874  if(maxval(gfile%jgds)==nemsio_kpds_intfill.and. &
3875  minval(gfile%jgds)==nemsio_kpds_intfill ) then
3876  if ( present(w34) ) then
3877  call nemsio_makglgds(gfile,idrt_in,grbmeta%jgds,ios,w34)
3878  gfile%jgds=grbmeta%jgds
3879  else
3880  call nemsio_makglgds(gfile,idrt_in,grbmeta%jgds,ios)
3881  gfile%jgds=grbmeta%jgds
3882 ! write(0,*)'after nemsio_makglgds,idrt=',idrt_in,'ios=',ios, &
3883 ! 'jbms=',jbms
3884  endif
3885  else
3886  grbmeta%jgds=gfile%jgds
3887  endif
3888  if(ios.ne.0) return
3889  iptv=gribtable(ktbl)%iptv
3890 ! itl=1
3891  jna=0
3892  jnm=0
3893  call nemsio_makglpds(gfile,iptv,icen,jbms,&
3894  jftu,jp1,jp2,itr_rw,jna,jnm,jrec,ktbl,krec,lev,grbmeta%jpds,ios)
3895 ! write(0,*)'after nemsio_makglpds,jpds=',grbmeta%jpds(1:25),'ios=',ios, &
3896 ! 'lev=',lev
3897  if(ios.ne.0) return
3898  endif
3899 !------------------------------------------------------------
3900 ! set up grib meta lbms
3901 !------------------------------------------------------------
3902  grbmeta%jf=gfile%fieldsize
3903  allocate(grbmeta%lbms(grbmeta%jf))
3904  iret=0
3905  end subroutine nemsio_setrqst
3906 
3907  subroutine nemsio_makglgds(gfile,idrt,kgds,iret,w34)
3908 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3909 ! abstract: set up gds for grib meta
3910 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3911  implicit none
3912  type(nemsio_gfile),intent(inout) :: gfile
3913  integer(nemsio_intkind),intent(out) :: iret
3914  integer,intent(in):: idrt
3915  integer,optional,intent(in):: w34
3916  integer,intent(out):: kgds(200)
3917  real(nemsio_dblekind) :: slat8(gfile%dimy)
3918  real(nemsio_realkind) :: slat4(gfile%dimy)
3919  integer :: n,igrid
3920 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3921  iret=-5
3922  igrid=255
3923  if(idrt.eq.0.and.gfile%dimx.eq.144.and.gfile%dimy.eq.73) igrid=2
3924  if(idrt.eq.0.and.gfile%dimx.eq.360.and.gfile%dimy.eq.181) igrid=3
3925  if(idrt.eq.0.and.gfile%dimx.eq.720.and.gfile%dimy.eq.361) igrid=4
3926  if(idrt.eq.4.and.gfile%dimx.eq.192.and.gfile%dimy.eq.94) igrid=98
3927  if(idrt.eq.4.and.gfile%dimx.eq.384.and.gfile%dimy.eq.192) igrid=126
3928  if(idrt.eq.4.and.gfile%dimx.eq.512.and.gfile%dimy.eq.256) igrid=170
3929  if(idrt.eq.4.and.gfile%dimx.eq.768.and.gfile%dimy.eq.384) igrid=127
3930  gfile%igrid=igrid
3931 ! write(0,*)'in nemsio_makdglgds,idrt=',idrt,'dimx=',gfile%dimx,'dimy=',gfile%dimy
3932  kgds(1)=modulo(idrt,256)
3933  kgds(2)=gfile%dimx
3934  kgds(3)=gfile%dimy
3935  select case(idrt)
3936  case(0)
3937  kgds(4)=90000
3938  case(4)
3939 !------------------------------------------------------------
3940 ! call different split for w3_4 lib and w3_d lib
3941 !------------------------------------------------------------
3942  if (present (w34)) then
3943  call splat(idrt,gfile%dimy,slat4)
3944  kgds(4)=nint(180000./acos(-1.)*asin(slat4(1)))
3945  else
3946  call splat(idrt,gfile%dimy,slat8)
3947  kgds(4)=nint(180000./acos(-1.)*asin(slat8(1)))
3948  endif
3949  case(256)
3950  kgds(4)=90000-nint(0.5*180000./gfile%dimy)
3951  end select
3952  kgds(5)=0
3953  kgds(6)=128
3954  kgds(7)=-kgds(4)
3955  kgds(8)=-nint(360000./gfile%dimx)
3956  kgds(9)=-kgds(8)
3957  select case(idrt)
3958  case(0)
3959  kgds(10)=nint(180000./(gfile%dimy-1))
3960  case(4)
3961  kgds(10)=gfile%dimy/2
3962  case(256)
3963  kgds(10)=nint(180000./gfile%dimy)
3964  end select
3965  kgds(11)=0
3966  kgds(12)=0
3967  kgds(13:18)=-1
3968  kgds(19)=0
3969  kgds(20)=255
3970  kgds(21:)=-1
3971  iret=0
3972  end subroutine nemsio_makglgds
3973 !------------------------------------------------------------------------------
3974  subroutine nemsio_makglpds(gfile,iptv,icen,ibms,&
3975  iftu,ip1,ip2,itr,ina,inm,jrec,ktbl,krec,lev,kpds,iret)
3976 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3977 ! abstract: set up gps for grib meta
3978 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
3979  implicit none
3980  type(nemsio_gfile),intent(in) :: gfile
3981  integer,intent(in):: iptv,icen,ibms
3982  integer,intent(in):: iftu,ip1,ip2,itr,ina,inm,jrec,ktbl,krec,lev
3983  integer,intent(out):: kpds(200)
3984  integer(nemsio_intkind),intent(out) :: iret
3985  integer :: i,igen,icen2,igrid
3986 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3987  iret=-5
3988 !
3989 !igrid
3990  igrid=gfile%igrid
3991 !get igen icen2
3992  call nemsio_getheadvar(gfile,'igen',igen,iret)
3993  if (iret.ne.0 ) then
3994  if(equal_str_nocase(trim(gfile%modelname),'GFS')) then
3995  igen=82
3996  else
3997  print *,'ERROR: please specify model generating flag'
3998  return
3999  endif
4000  endif
4001  call nemsio_getheadvar(gfile,'icen2',icen2,iret)
4002  if (iret.ne.0 ) then
4003  if(equal_str_nocase(trim(gfile%modelname),'GFS')) then
4004  icen2=0
4005  else
4006  print *,'ERROR: please specify subcenter id,modelname=',gfile%modelname
4007  return
4008  endif
4009  endif
4010 !
4011  kpds(01)=icen
4012  kpds(02)=igen
4013  kpds(03)=igrid
4014  kpds(04)=128+64*ibms
4015  kpds(05)=gribtable(ktbl)%item(krec)%g1param
4016  kpds(06)=gribtable(ktbl)%item(krec)%g1level
4017  kpds(07)=lev
4018  if(gribtable(ktbl)%item(krec)%g1lev/=0)then
4019  kpds(07)=gribtable(ktbl)%item(krec)%g1lev
4020  endif
4021 !*** deal with dpres
4022  if ( kpds(06).eq.110 ) then
4023  kpds(07)=256*(lev-1)+lev
4024  endif
4025 !***
4026  kpds(08)=mod(gfile%idate(1)-1,100)+1
4027  kpds(09)=gfile%idate(2)
4028  kpds(10)=gfile%idate(3)
4029  kpds(11)=gfile%idate(4)
4030  kpds(12)=0
4031  kpds(13)=iftu
4032  kpds(14)=ip1
4033  kpds(15)=ip2
4034  kpds(16)=itr
4035  kpds(17)=ina
4036  kpds(18)=1
4037  kpds(19)=iptv
4038  kpds(20)=inm
4039  kpds(21)=(gfile%idate(1)-1)/100+1
4040  kpds(22)=gribtable(ktbl)%item(krec)%precision
4041  kpds(23)=icen2
4042  kpds(24)=0
4043  kpds(25)=0
4044  kpds(26:)=-1
4045  iret=0
4046 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4047  end subroutine nemsio_makglpds
4048 !
4049 !------------------------------------------------------------------------------
4050  subroutine nemsio_searchrecv(gfile,jrec,name,levtyp,lev,iret)
4051 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4052 ! abstract: search rec number giving rec name, levtyp and lev
4053 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4054  implicit none
4055  type(nemsio_gfile),intent(in) :: gfile
4056  integer(nemsio_intkind),intent(out) :: jrec
4057  character(*),intent(in) :: name
4058  character(*),intent(in),optional :: levtyp
4059  integer(nemsio_intkind),optional,intent(in) :: lev
4060  integer(nemsio_intkind),optional,intent(out) :: iret
4061  integer i, nsize,nlen,nlen1
4062 
4063 !------------------------------------------------------------------------------
4064  iret=-5
4065  nlen=min(len(name),len(gfile%recname))
4066  nlen1=min(len(levtyp),len(gfile%reclevtyp))
4067 !
4068  jrec=0
4069  if(size(gfile%recname)/=gfile%nrec) return
4070  if(.not.present(levtyp)) then
4071  do i=1,gfile%nrec
4072  if ( equal_str_nocase(trim(name),trim(gfile%recname(i))) ) then
4073  jrec=i
4074  exit
4075  endif
4076  enddo
4077  else if (size(gfile%reclevtyp).eq.gfile%nrec) then
4078  if(.not.present(lev)) then
4079  do i=1,gfile%nrec
4080  if ( equal_str_nocase(trim(name),trim(gfile%recname(i))) .and. &
4081  equal_str_nocase(trim(levtyp),trim(gfile%reclevtyp(i))) ) then
4082  jrec=i
4083  exit
4084  endif
4085  enddo
4086  else if(size(gfile%reclev).eq.gfile%nrec) then
4087  do i=1,gfile%nrec
4088  if ( equal_str_nocase(trim(name),trim(gfile%recname(i))) .and. &
4089  equal_str_nocase(trim(levtyp),trim(gfile%reclevtyp(i)) ) .and. &
4090  lev==gfile%reclev(i) ) then
4091  jrec=i
4092  exit
4093  endif
4094  enddo
4095  endif
4096  endif
4097  if ( jrec .ne.0 ) iret=0
4098 !
4099  return
4100  end subroutine nemsio_searchrecv
4101 !------------------------------------------------------------------------------
4102 !
4103 !----------------------------------------------------------------------------
4104  subroutine nemsio_grbtbl_search(vname,vlevtyp,ktbl,krec,iret)
4105 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4106 ! abstract: given record name, levtyp and index number in grib table
4107 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4108  implicit none
4109  character(*),intent(in) :: vname,vlevtyp
4110  integer(nemsio_intkind),intent(out) :: ktbl,krec
4111  integer(nemsio_intkind),intent(out) :: iret
4112  integer :: i,j
4113  character(16) :: lcname,lclevtyp
4114 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4115  iret=-5
4116  i=0
4117  i=index(trim(vname),"_")
4118  lcname=trim(lowercase(trim(vname)))
4119  if(i>0) lcname=trim(lowercase(trim(vname(1:i-1))))
4120  lclevtyp=trim(lowercase(trim(vlevtyp)))
4121  ktbl=0
4122  krec=0
4123 ! write(0,*)'in nemsio vname=',vname,' vlevtyp=',vlevtyp,' lcname=',trim(lcname),i
4124  do j=1,size(gribtable)
4125  do i=1,size(gribtable(j)%item)
4126  if(trim(gribtable(j)%item(i)%shortname)==trim(lcname) .and. &
4127  trim(gribtable(j)%item(i)%leveltype)==trim(lclevtyp) )then
4128  ktbl=j
4129  krec=i
4130  iret=0
4131  exit
4132  endif
4133  enddo
4134  enddo
4135 ! write(0,*)'in grbtbl_search,krec=',krec,'ktbl=',ktbl,'krec=',krec
4136  end subroutine nemsio_grbtbl_search
4137 !------------------------------------------------------------------------------
4138  subroutine nemsio_chkgfary(gfile,iret)
4139 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4140 ! abstract: check if arrays in gfile is allocated and with right size
4141 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4142  implicit none
4143  type(nemsio_gfile),intent(inout) :: gfile
4144  integer(nemsio_intkind),intent(out) :: iret
4145  integer :: ios
4146 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4147  iret=-2
4148  if ( gfile%dimx .eq. nemsio_intfill .or. gfile%dimy .eq. nemsio_intfill &
4149  .or. gfile%dimz .eq. nemsio_intfill .or. gfile%nrec .eq. nemsio_intfill ) then
4150  print *,'ERROR: dimx,dimy,dimz and nrec must be defined!'
4151  return
4152  endif
4153  if(gfile%nmeta>5) then
4154  if (.not. allocated(gfile%vcoord) .or. size(gfile%vcoord).ne. &
4155  (gfile%dimz+1)*3*2 ) then
4156  call nemsio_almeta1(gfile,ios)
4157  if (ios .ne. 0) return
4158  endif
4159  endif
4160  if(gfile%nmeta>=10) then
4161  if (.not.allocated(gfile%lat) .or. size(gfile%lat).ne.gfile%fieldsize .or.&
4162  .not.allocated(gfile%lon) .or. size(gfile%lon).ne.gfile%fieldsize .or.&
4163  .not.allocated(gfile%dx) .or. size(gfile%dx).ne.gfile%fieldsize .or.&
4164  .not.allocated(gfile%dy) .or. size(gfile%dy).ne.gfile%fieldsize) then
4165  call nemsio_almeta2(gfile,ios)
4166  if (ios .ne. 0) return
4167  endif
4168  endif
4169  if(gfile%nmeta>=12) then
4170  if(gfile%ntrac==nemsio_intfill) then
4171  print *,'ERROR: ntrac is not defined!'
4172  return
4173  endif
4174  if (.not.allocated(gfile%Cpi) .or. size(gfile%Cpi).ne.gfile%ntrac+1 .or. &
4175  .not.allocated(gfile%Ri) .or. size(gfile%Ri).ne.gfile%ntrac+1 ) then
4176  call nemsio_almeta3(gfile,ios)
4177  if (ios .ne. 0) return
4178  endif
4179  endif
4180 
4181  if(gfile%nmeta>2) then
4182  if (allocated(gfile%recname) .and. size(gfile%recname).eq.gfile%nrec)&
4183  then
4184  if (allocated(gfile%reclevtyp) .and. size(gfile%reclevtyp) &
4185  .eq.gfile%nrec) then
4186  if (allocated(gfile%reclev) .and. size(gfile%reclev).eq. &
4187  gfile%nrec) then
4188  iret=0
4189  return
4190  endif
4191  endif
4192  endif
4193 
4194  call nemsio_almeta4(gfile,ios)
4195  if (ios .ne. 0) return
4196  endif
4197  iret=0
4198  end subroutine nemsio_chkgfary
4199 !------------------------------------------------------------------------------
4200  subroutine nemsio_almeta(gfile,iret)
4201 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4202 ! abstract: allocate all the arrays in gfile
4203 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4204  implicit none
4205  type(nemsio_gfile),intent(inout) :: gfile
4206  integer(nemsio_intkind),intent(out) :: iret
4207  integer ::dimvcoord1,dimvcoord2,dimnmmlev
4208  integer ::dimrecname,dimreclevtyp,dimreclev
4209  integer ::dimfield
4210  integer ::dimcpr
4211  integer ::iret1,iret2,iret3,iret4,iret5
4212 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4213  iret=0
4214  dimvcoord1=gfile%dimz+1
4215  dimrecname=gfile%nrec
4216  dimreclevtyp=gfile%nrec
4217  dimreclev=gfile%nrec
4218  dimfield=gfile%fieldsize
4219  dimcpr=gfile%ntrac+1
4220  if(allocated(gfile%recname)) deallocate(gfile%recname)
4221  if(allocated(gfile%reclevtyp)) deallocate(gfile%reclevtyp)
4222  if(allocated(gfile%reclev)) deallocate(gfile%reclev)
4223  if(allocated(gfile%vcoord)) deallocate(gfile%vcoord)
4224  if(allocated(gfile%lat)) deallocate(gfile%lat)
4225  if(allocated(gfile%lon)) deallocate(gfile%lon)
4226  if(allocated(gfile%dx)) deallocate(gfile%dx)
4227  if(allocated(gfile%dy)) deallocate(gfile%dy)
4228  if(allocated(gfile%Cpi)) deallocate(gfile%Cpi)
4229  if(allocated(gfile%Ri)) deallocate(gfile%Ri)
4230  if(gfile%nmeta>=5)then
4231  allocate(gfile%recname(dimrecname), gfile%reclevtyp(dimreclevtyp), &
4232  gfile%reclev(dimreclev), &
4233  stat=iret1)
4234  if(iret1.eq.0) then
4235  gfile%reclev=nemsio_intfill
4236  gfile%recname=' '
4237  gfile%reclevtyp=' '
4238  endif
4239  iret=iret+abs(iret1)
4240  endif
4241  if(gfile%nmeta>=6)then
4242  allocate(gfile%vcoord(dimvcoord1,3,2) ,stat=iret2)
4243  if(iret2.eq.0) then
4244  gfile%vcoord=nemsio_realfill
4245  endif
4246  iret=iret+abs(iret2)
4247  endif
4248  if(gfile%nmeta>=8)then
4249  allocate(gfile%lat(dimfield), gfile%lon(dimfield),stat=iret3)
4250  if(iret3.eq.0) then
4251  gfile%lat=nemsio_realfill
4252  gfile%lon=nemsio_realfill
4253  endif
4254  iret=iret+abs(iret3)
4255  endif
4256  if(gfile%nmeta>=10)then
4257  allocate(gfile%dx(dimfield), gfile%dy(dimfield) ,stat=iret4)
4258  if(iret4.eq.0) then
4259  gfile%dx=nemsio_realfill
4260  gfile%dy=nemsio_realfill
4261  endif
4262  iret=iret+abs(iret4)
4263  endif
4264  if(gfile%nmeta>=12)then
4265  allocate(gfile%Cpi(dimcpr), gfile%Ri(dimcpr), stat=iret5)
4266  if(iret5.eq.0) then
4267  gfile%Cpi=nemsio_realfill
4268  gfile%Ri=nemsio_realfill
4269  endif
4270  iret=iret+abs(iret5)
4271  endif
4272 
4273  if(iret.ne.0) iret=-6
4274  end subroutine nemsio_almeta
4275 !------------------------------------------------------------------------------
4276  subroutine nemsio_alextrameta(gfile,iret)
4277 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4278 ! abstract: allocate all the arrays in gfile
4279 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4280  implicit none
4281  type(nemsio_gfile),intent(inout) :: gfile
4282  integer(nemsio_intkind),intent(out) :: iret
4283  integer ::iret1,iret2,iret3,iret4
4284 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4285  iret=-6
4286  if(gfile%extrameta) then
4287 ! print *,'nmetavari=',gfile%nmetavari,'nmetavarr=',gfile%nmetavarr, &
4288 ! 'nmetavarl=',gfile%nmetavarl,'nmetavarc=',gfile%nmetavarc, &
4289 ! 'nmetaaryi=',gfile%nmetaaryi,'nmetaaryr=',gfile%nmetaaryi, &
4290 ! 'nmetaaryl=',gfile%nmetaaryl,'nmetaaryc=',gfile%nmetaaryc
4291  if(gfile%nmetavari.gt.0) then
4292  if(allocated(gfile%variname)) deallocate(gfile%variname)
4293  if(allocated(gfile%varival)) deallocate(gfile%varival)
4294  allocate(gfile%variname(gfile%nmetavari), &
4295  gfile%varival(gfile%nmetavari), stat=iret1 )
4296  if(iret1.ne.0) return
4297  endif
4298  if(gfile%nmetavarr.gt.0) then
4299  if(allocated(gfile%varrname)) deallocate(gfile%varrname)
4300  if(allocated(gfile%varrval)) deallocate(gfile%varrval)
4301  allocate(gfile%varrname(gfile%nmetavarr), &
4302  gfile%varrval(gfile%nmetavarr), stat=iret1 )
4303  if(iret1.ne.0) return
4304  endif
4305  if(gfile%nmetavarl.gt.0) then
4306  if(allocated(gfile%varlname)) deallocate(gfile%varlname)
4307  if(allocated(gfile%varlval)) deallocate(gfile%varlval)
4308  allocate(gfile%varlname(gfile%nmetavarl), &
4309  gfile%varlval(gfile%nmetavarl), stat=iret1 )
4310  if(iret1.ne.0) return
4311  endif
4312  if(gfile%nmetavarc.gt.0) then
4313  if(allocated(gfile%varcname)) deallocate(gfile%varcname)
4314  if(allocated(gfile%varcval)) deallocate(gfile%varcval)
4315  allocate(gfile%varcname(gfile%nmetavarc), &
4316  gfile%varcval(gfile%nmetavarc), stat=iret1 )
4317  if(iret1.ne.0) return
4318  endif
4319  if(gfile%nmetavarr8.gt.0) then
4320  if(allocated(gfile%varr8name)) deallocate(gfile%varr8name)
4321  if(allocated(gfile%varr8val)) deallocate(gfile%varr8val)
4322  allocate(gfile%varr8name(gfile%nmetavarr8), &
4323  gfile%varr8val(gfile%nmetavarr8), stat=iret1 )
4324  if(iret1.ne.0) return
4325  endif
4326  if(gfile%nmetaaryi.gt.0) then
4327  if(allocated(gfile%aryiname)) deallocate(gfile%aryiname)
4328  if(allocated(gfile%aryilen)) deallocate(gfile%aryilen)
4329  if(allocated(gfile%aryival)) deallocate(gfile%aryival)
4330  allocate(gfile%aryiname(gfile%nmetaaryi), &
4331  gfile%aryilen(gfile%nmetaaryi), stat=iret1 )
4332  if(iret1.ne.0) return
4333  endif
4334  if(gfile%nmetaaryr.gt.0) then
4335  if(allocated(gfile%aryrname)) deallocate(gfile%aryrname)
4336  if(allocated(gfile%aryrlen)) deallocate(gfile%aryrlen)
4337  if(allocated(gfile%aryrval)) deallocate(gfile%aryrval)
4338  allocate(gfile%aryrname(gfile%nmetaaryr), &
4339  gfile%aryrlen(gfile%nmetaaryr), stat=iret1 )
4340  if(iret1.ne.0) return
4341  endif
4342  if(gfile%nmetaaryl.gt.0) then
4343  if(allocated(gfile%arylname)) deallocate(gfile%arylname)
4344  if(allocated(gfile%aryllen)) deallocate(gfile%aryllen)
4345  if(allocated(gfile%arylval)) deallocate(gfile%arylval)
4346  allocate(gfile%arylname(gfile%nmetaaryl), &
4347  gfile%aryllen(gfile%nmetaaryl), stat=iret1 )
4348  if(iret1.ne.0) return
4349  endif
4350  if(gfile%nmetaaryc.gt.0) then
4351  if(allocated(gfile%arycname)) deallocate(gfile%arycname)
4352  if(allocated(gfile%aryclen)) deallocate(gfile%aryclen)
4353  if(allocated(gfile%arycval)) deallocate(gfile%arycval)
4354  allocate(gfile%arycname(gfile%nmetaaryc), &
4355  gfile%aryclen(gfile%nmetaaryc), stat=iret1 )
4356  if(iret1.ne.0) return
4357  endif
4358  if(gfile%nmetaaryr8.gt.0) then
4359  if(allocated(gfile%aryr8name)) deallocate(gfile%aryr8name)
4360  if(allocated(gfile%aryr8len)) deallocate(gfile%aryr8len)
4361  if(allocated(gfile%aryr8val)) deallocate(gfile%aryr8val)
4362  allocate(gfile%aryr8name(gfile%nmetaaryr8), &
4363  gfile%aryr8len(gfile%nmetaaryr8), stat=iret1 )
4364  if(iret1.ne.0) return
4365  endif
4366  endif
4367 
4368  iret=0
4369  end subroutine nemsio_alextrameta
4370 !------------------------------------------------------------------------------
4371  subroutine nemsio_almeta1(gfile,iret)
4372 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4373 ! abstract: allocate vcoord in gfile
4374 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4375  implicit none
4376  type(nemsio_gfile),intent(inout) :: gfile
4377  integer(nemsio_intkind),intent(out) :: iret
4378  integer :: dimvcoord1,dimnmmlev,dimnmmnsoil
4379  integer :: dimgsilev
4380 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4381  dimvcoord1=gfile%dimz+1
4382  if(allocated(gfile%vcoord)) deallocate(gfile%vcoord)
4383  allocate(gfile%vcoord(dimvcoord1,3,2), stat=iret)
4384  if(iret.eq.0) then
4385  gfile%vcoord=nemsio_realfill
4386  endif
4387  if(iret.ne.0) iret=-6
4388  end subroutine nemsio_almeta1
4389 !------------------------------------------------------------------------------
4390  subroutine nemsio_almeta2(gfile,iret)
4391 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4392 ! abstract: allocate lat1d in gfile
4393 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4394  implicit none
4395  type(nemsio_gfile),intent(inout) :: gfile
4396  integer(nemsio_intkind),intent(out) :: iret
4397  integer :: dimlat
4398 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4399  dimlat=gfile%fieldsize
4400  if(allocated(gfile%lat)) deallocate(gfile%lat)
4401  if(allocated(gfile%lon)) deallocate(gfile%lon)
4402  if(allocated(gfile%dx)) deallocate(gfile%dx)
4403  if(allocated(gfile%dy)) deallocate(gfile%dy)
4404  allocate(gfile%lat(dimlat),gfile%lon(dimlat), &
4405  gfile%dx(dimlat),gfile%dy(dimlat), stat=iret)
4406  if(iret.eq.0) then
4407  gfile%lat=nemsio_realfill
4408  gfile%lon=nemsio_realfill
4409  gfile%dx=nemsio_realfill
4410  gfile%dy=nemsio_realfill
4411  endif
4412  if(iret.ne.0) iret=-6
4413  end subroutine nemsio_almeta2
4414 !------------------------------------------------------------------------------
4415  subroutine nemsio_almeta3(gfile,iret)
4416 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4417 ! abstract: allocate lon1d in gfile
4418 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4419  implicit none
4420  type(nemsio_gfile),intent(inout) :: gfile
4421  integer(nemsio_intkind),intent(out) :: iret
4422  integer :: dim1d
4423 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4424  dim1d=gfile%ntrac+1
4425  if(allocated(gfile%Cpi)) deallocate(gfile%Cpi)
4426  if(allocated(gfile%Ri)) deallocate(gfile%Ri)
4427  allocate(gfile%Cpi(dim1d),gfile%Ri(dim1d),stat=iret)
4428  if(iret.eq.0) then
4429  gfile%Cpi=nemsio_realfill
4430  gfile%Ri=nemsio_realfill
4431  endif
4432  if(iret.ne.0) iret=-6
4433  end subroutine nemsio_almeta3
4434 !------------------------------------------------------------------------------
4435  subroutine nemsio_almeta4(gfile,iret)
4436 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4437 ! abstract: allocate recnam, reclvevtyp, and reclev in gfile
4438 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4439  implicit none
4440  type(nemsio_gfile),intent(inout) :: gfile
4441  integer(nemsio_intkind),intent(out) :: iret
4442  integer :: dimrecname,dimreclevtyp,dimreclev
4443 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4444  if(gfile%nrec<0) then
4445  print *,'ERROR: Please set nrec, it is ',gfile%nrec,' now!'
4446  iret=-6
4447  return
4448  endif
4449  dimrecname=gfile%nrec
4450  dimreclevtyp=gfile%nrec
4451  dimreclev=gfile%nrec
4452  if(allocated(gfile%recname)) deallocate(gfile%recname)
4453  if(allocated(gfile%reclevtyp)) deallocate(gfile%reclevtyp)
4454  if(allocated(gfile%reclev)) deallocate(gfile%reclev)
4455  allocate(gfile%recname(dimrecname), gfile%reclevtyp(dimreclevtyp), &
4456  gfile%reclev(dimreclev), stat=iret)
4457  if(iret.eq.0) then
4458  gfile%reclev=nemsio_intfill
4459  gfile%recname=' '
4460  gfile%reclevtyp=' '
4461  endif
4462  if(iret.ne.0) iret=-6
4463  end subroutine nemsio_almeta4
4464 !------------------------------------------------------------------------------
4465  subroutine nemsio_axmeta(gfile,iret)
4466 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4467 ! abstract: empty gfile variables and decallocate arrays in gfile
4468 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4469  implicit none
4470  type(nemsio_gfile),intent(inout) :: gfile
4471  integer(nemsio_intkind),intent(out) :: iret
4472  integer(nemsio_intkind) :: ierr
4473 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4474  iret=-6
4475 !
4476  if(allocated(gfile%recname)) deallocate(gfile%recname,stat=ierr)
4477  if(allocated(gfile%reclevtyp)) deallocate(gfile%reclevtyp,stat=ierr)
4478  if(allocated(gfile%reclev)) deallocate(gfile%reclev,stat=ierr)
4479  if(allocated(gfile%vcoord)) deallocate(gfile%vcoord,stat=ierr)
4480  if(allocated(gfile%lat)) deallocate(gfile%lat,stat=ierr)
4481  if(allocated(gfile%lon)) deallocate(gfile%lon,stat=ierr)
4482  if(allocated(gfile%dx)) deallocate(gfile%dx,stat=ierr)
4483  if(allocated(gfile%dy)) deallocate(gfile%dy,stat=ierr)
4484  if(allocated(gfile%Cpi)) deallocate(gfile%Cpi,stat=ierr)
4485  if(allocated(gfile%Ri)) deallocate(gfile%Ri,stat=ierr)
4486 !
4487  if(allocated(gfile%variname)) deallocate(gfile%variname,stat=ierr)
4488  if(allocated(gfile%varival)) deallocate(gfile%varival,stat=ierr)
4489  if(allocated(gfile%varrname)) deallocate(gfile%varrname,stat=ierr)
4490  if(allocated(gfile%varrval)) deallocate(gfile%varrval,stat=ierr)
4491  if(allocated(gfile%varlname)) deallocate(gfile%varlname,stat=ierr)
4492  if(allocated(gfile%varlval)) deallocate(gfile%varlval,stat=ierr)
4493  if(allocated(gfile%varcname)) deallocate(gfile%varcname,stat=ierr)
4494  if(allocated(gfile%varcval)) deallocate(gfile%varcval,stat=ierr)
4495  if(allocated(gfile%varr8name)) deallocate(gfile%varr8name,stat=ierr)
4496  if(allocated(gfile%varr8val)) deallocate(gfile%varr8val,stat=ierr)
4497  if(allocated(gfile%aryiname)) deallocate(gfile%aryiname,stat=ierr)
4498  if(allocated(gfile%aryilen)) deallocate(gfile%aryilen,stat=ierr)
4499  if(allocated(gfile%aryival)) deallocate(gfile%aryival,stat=ierr)
4500  if(allocated(gfile%aryrname)) deallocate(gfile%aryrname,stat=ierr)
4501  if(allocated(gfile%aryrlen)) deallocate(gfile%aryrlen,stat=ierr)
4502  if(allocated(gfile%aryrval)) deallocate(gfile%aryrval,stat=ierr)
4503  if(allocated(gfile%arylname)) deallocate(gfile%arylname,stat=ierr)
4504  if(allocated(gfile%aryllen)) deallocate(gfile%aryllen,stat=ierr)
4505  if(allocated(gfile%arylval)) deallocate(gfile%arylval,stat=ierr)
4506  if(allocated(gfile%arycname)) deallocate(gfile%arycname,stat=ierr)
4507  if(allocated(gfile%aryclen)) deallocate(gfile%aryclen,stat=ierr)
4508  if(allocated(gfile%arycval)) deallocate(gfile%arycval,stat=ierr)
4509  if(allocated(gfile%aryr8name)) deallocate(gfile%aryr8name,stat=ierr)
4510  if(allocated(gfile%aryr8len)) deallocate(gfile%aryr8len,stat=ierr)
4511  if(allocated(gfile%aryr8val)) deallocate(gfile%aryr8val,stat=ierr)
4512 !
4513  if(allocated(gfile%headvariname)) deallocate(gfile%headvariname,stat=ierr)
4514  if(allocated(gfile%headvarrname)) deallocate(gfile%headvarrname,stat=ierr)
4515  if(allocated(gfile%headvarlname)) deallocate(gfile%headvarlname,stat=ierr)
4516  if(allocated(gfile%headvarcname)) deallocate(gfile%headvarcname,stat=ierr)
4517  if(allocated(gfile%headvarival)) deallocate(gfile%headvarival,stat=ierr)
4518  if(allocated(gfile%headvarrval)) deallocate(gfile%headvarrval,stat=ierr)
4519  if(allocated(gfile%headvarlval)) deallocate(gfile%headvarlval,stat=ierr)
4520  if(allocated(gfile%headvarcval)) deallocate(gfile%headvarcval,stat=ierr)
4521  if(allocated(gfile%headaryiname)) deallocate(gfile%headaryiname,stat=ierr)
4522  if(allocated(gfile%headaryrname)) deallocate(gfile%headaryrname,stat=ierr)
4523  if(allocated(gfile%headarycname)) deallocate(gfile%headarycname,stat=ierr)
4524  if(allocated(gfile%headaryival)) deallocate(gfile%headaryival,stat=ierr)
4525  if(allocated(gfile%headaryrval)) deallocate(gfile%headaryrval,stat=ierr)
4526  if(allocated(gfile%headarycval)) deallocate(gfile%headarycval,stat=ierr)
4527 !
4528  gfile%gtype=' '
4529  gfile%gdatatype=' '
4530  gfile%modelname=' '
4531  gfile%version=nemsio_intfill
4532  gfile%nmeta=nemsio_intfill
4533  gfile%lmeta=nemsio_intfill
4534  gfile%nrec=nemsio_intfill
4535  gfile%idate(1:7)=nemsio_intfill
4536  gfile%nfday=nemsio_intfill
4537  gfile%nfhour=nemsio_intfill
4538  gfile%nfminute=nemsio_intfill
4539  gfile%nfsecondn=nemsio_intfill
4540  gfile%nfsecondd=nemsio_intfill
4541  gfile%dimx=nemsio_intfill
4542  gfile%dimy=nemsio_intfill
4543  gfile%dimz=nemsio_intfill
4544  gfile%nframe=nemsio_intfill
4545  gfile%nsoil=nemsio_intfill
4546  gfile%ntrac=nemsio_intfill
4547  gfile%jcap=nemsio_intfill
4548  gfile%ncldt=nemsio_intfill
4549  gfile%idvc=nemsio_intfill
4550  gfile%idsl=nemsio_intfill
4551  gfile%idvm=nemsio_intfill
4552  gfile%idrt=nemsio_intfill
4553  gfile%rlon_min=nemsio_realfill
4554  gfile%rlon_max=nemsio_realfill
4555  gfile%rlat_min=nemsio_realfill
4556  gfile%rlat_max=nemsio_realfill
4557  gfile%extrameta=nemsio_logicfill
4558  gfile%nmetavari=nemsio_intfill
4559  gfile%nmetavarr=nemsio_intfill
4560  gfile%nmetavarl=nemsio_intfill
4561  gfile%nmetavarc=nemsio_intfill
4562  gfile%nmetavarr8=nemsio_intfill
4563  gfile%nmetaaryi=nemsio_intfill
4564  gfile%nmetaaryr=nemsio_intfill
4565  gfile%nmetaaryl=nemsio_intfill
4566  gfile%nmetaaryc=nemsio_intfill
4567  gfile%nmetaaryr8=nemsio_intfill
4568  gfile%tlmeta=nemsio_intfill
4569  gfile%tlmetalat=nemsio_intfill
4570  gfile%tlmetalon=nemsio_intfill
4571  gfile%tlmetadx=nemsio_intfill
4572  gfile%tlmetady=nemsio_intfill
4573  gfile%tlmetavarival=nemsio_intfill
4574  gfile%tlmetaaryival=nemsio_intfill
4575  gfile%file_endian=''
4576  gfile%do_byteswap=.false.
4577  gfile%jgds=nemsio_kpds_intfill
4578 !
4579  gfile%gfname=''
4580  gfile%gaction=''
4581  gfile%fieldsize=nemsio_intfill
4582  gfile%flunit=nemsio_intfill
4583  gfile%headvarinum=nemsio_intfill
4584  gfile%headvarrnum=nemsio_intfill
4585  gfile%headvarlnum=nemsio_intfill
4586  gfile%headvarcnum=nemsio_intfill
4587  gfile%headaryinum=nemsio_intfill
4588  gfile%headaryrnum=nemsio_intfill
4589  gfile%headarycnum=nemsio_intfill
4590 !
4591  iret=0
4592 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4593  end subroutine nemsio_axmeta
4594 !------------------------------------------------------------------------------
4595  subroutine nemsio_setfhead(gfile,iret)
4596 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4597 ! abstract: required file header (default)
4598 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4599  implicit none
4600  type(nemsio_gfile),intent(inout) :: gfile
4601  integer(nemsio_intkind),intent(out) :: iret
4602  integer(nemsio_intkind) i,j,k
4603 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4604  iret=-17
4605  gfile%headvarinum=31
4606  gfile%headvarrnum=4
4607  gfile%headvarlnum=1
4608  gfile%headvarcnum=3
4609 !
4610  if(gfile%nmeta>4) then
4611  gfile%headaryinum=2
4612  else
4613  gfile%headaryinum=1
4614  endif
4615 !
4616  if(gfile%nmeta>11) then
4617  gfile%headaryrnum=7
4618  elseif(gfile%nmeta>10) then
4619  gfile%headaryrnum=6
4620  elseif(gfile%nmeta>9) then
4621  gfile%headaryrnum=5
4622  elseif(gfile%nmeta>8) then
4623  gfile%headaryrnum=4
4624  elseif(gfile%nmeta>7) then
4625  gfile%headaryrnum=3
4626  elseif(gfile%nmeta>6) then
4627  gfile%headaryrnum=2
4628  elseif(gfile%nmeta>5) then
4629  gfile%headaryrnum=1
4630  endif
4631 !
4632  if(gfile%nmeta>3) then
4633  gfile%headarycnum=2
4634  elseif(gfile%nmeta>2) then
4635  gfile%headarycnum=1
4636  else
4637  gfile%headarycnum=0
4638  endif
4639 !
4640  if(.not.allocated(gfile%headvariname)) then
4641  allocate(gfile%headvariname(gfile%headvarinum),gfile%headvarival(gfile%headvarinum) )
4642  gfile%headvariname(1)='version'
4643  gfile%headvarival(1)=gfile%version
4644  gfile%headvariname(2)='nmeta'
4645  gfile%headvarival(2)=gfile%nmeta
4646  gfile%headvariname(3)='lmeta'
4647  gfile%headvarival(3)=gfile%lmeta
4648  gfile%headvariname(4)='nrec'
4649  gfile%headvarival(4)=gfile%nrec
4650  gfile%headvariname(5)='nfday'
4651  gfile%headvarival(5)=gfile%nfday
4652  gfile%headvariname(6)='nfhour'
4653  gfile%headvarival(6)=gfile%nfhour
4654  gfile%headvariname(7)='nfminute'
4655  gfile%headvarival(7)=gfile%nfminute
4656  gfile%headvariname(8)='nfsecondn'
4657  gfile%headvarival(8)=gfile%nfsecondn
4658  gfile%headvariname(9)='nfsecondd'
4659  gfile%headvarival(9)=gfile%nfsecondd
4660  gfile%headvariname(10)='dimx'
4661  gfile%headvarival(10)=gfile%dimx
4662  gfile%headvariname(11)='dimy'
4663  gfile%headvarival(11)=gfile%dimy
4664  gfile%headvariname(12)='dimz'
4665  gfile%headvarival(12)=gfile%dimz
4666  gfile%headvariname(13)='nframe'
4667  gfile%headvarival(13)=gfile%nframe
4668  gfile%headvariname(14)='nsoil'
4669  gfile%headvarival(14)=gfile%nsoil
4670  gfile%headvariname(15)='ntrac'
4671  gfile%headvarival(15)=gfile%ntrac
4672  gfile%headvariname(16)='jcap'
4673  gfile%headvarival(16)=gfile%jcap
4674  gfile%headvariname(17)='ncldt'
4675  gfile%headvarival(17)=gfile%ncldt
4676  gfile%headvariname(18)='idvc'
4677  gfile%headvarival(18)=gfile%idvc
4678  gfile%headvariname(19)='idsl'
4679  gfile%headvarival(19)=gfile%idsl
4680  gfile%headvariname(20)='idvm'
4681  gfile%headvarival(20)=gfile%idvm
4682  gfile%headvariname(21)='idrt'
4683  gfile%headvarival(21)=gfile%idrt
4684  gfile%headvariname(22)='nmetavari'
4685  gfile%headvarival(22)=gfile%nmetavari
4686  gfile%headvariname(23)='nmetavarr'
4687  gfile%headvarival(23)=gfile%nmetavarr
4688  gfile%headvariname(24)='nmetavarl'
4689  gfile%headvarival(24)=gfile%nmetavarl
4690  gfile%headvariname(25)='nmetavarc'
4691  gfile%headvarival(25)=gfile%nmetavarc
4692  gfile%headvariname(26)='nmetaaryi'
4693  gfile%headvarival(26)=gfile%nmetaaryi
4694  gfile%headvariname(27)='nmetaaryr'
4695  gfile%headvarival(27)=gfile%nmetaaryr
4696  gfile%headvariname(28)='nmetaaryl'
4697  gfile%headvarival(28)=gfile%nmetaaryl
4698  gfile%headvariname(29)='nmetaaryc'
4699  gfile%headvarival(29)=gfile%nmetaaryc
4700  gfile%headvariname(30)='nmetavarr8'
4701  gfile%headvarival(30)=gfile%nmetavarr8
4702  gfile%headvariname(31)='nmetaaryr8'
4703  gfile%headvarival(31)=gfile%nmetaaryr8
4704  endif
4705 !
4706  if(.not.allocated(gfile%headvarrname)) then
4707  allocate(gfile%headvarrname(gfile%headvarrnum),gfile%headvarrval(gfile%headvarrnum) )
4708  gfile%headvarrname(1)='rlon_min'
4709  gfile%headvarrval(1)=gfile%rlon_min
4710  gfile%headvarrname(2)='rlon_max'
4711  gfile%headvarrval(2)=gfile%rlon_max
4712  gfile%headvarrname(3)='rlat_min'
4713  gfile%headvarrval(3)=gfile%rlat_min
4714  gfile%headvarrname(4)='rlat_min'
4715  gfile%headvarrval(4)=gfile%rlat_min
4716  endif
4717 !
4718  if(.not.allocated(gfile%headvarcname)) then
4719  allocate(gfile%headvarcname(gfile%headvarcnum),gfile%headvarcval(gfile%headvarcnum) )
4720  gfile%headvarcname(1)='gtype'
4721  gfile%headvarcval(1)=gfile%gtype
4722  gfile%headvarcname(2)='modelname'
4723  gfile%headvarcval(2)=gfile%modelname
4724  gfile%headvarcname(3)='gdatatype'
4725  gfile%headvarcval(3)=gfile%gdatatype
4726  endif
4727 !head logic var
4728  if(.not.allocated(gfile%headvarlname)) then
4729  allocate(gfile%headvarlname(gfile%headvarlnum),gfile%headvarlval(gfile%headvarlnum) )
4730  gfile%headvarlname(1)='extrameta'
4731  gfile%headvarlval(1)=gfile%extrameta
4732  endif
4733 !
4734 !--- gfile%head int ary
4735  if(.not.allocated(gfile%headaryiname)) then
4736  allocate(gfile%headaryiname(gfile%headaryinum) )
4737  allocate(gfile%headaryival(max(size(gfile%reclev),7),gfile%headaryinum))
4738  gfile%headaryiname(1)='idate'
4739  gfile%headaryival(1:7,1)=gfile%idate(1:7)
4740  if(gfile%headaryinum>1) then
4741  gfile%headaryiname(2)='reclev'
4742  gfile%headaryival(:,2)=gfile%reclev(:)
4743  endif
4744  endif
4745 !
4746 !--- gfile%head real ary
4747  if(gfile%headaryrnum>0) then
4748  if(.not.allocated(gfile%headaryrname)) allocate(gfile%headaryrname(gfile%headaryrnum) )
4749  if(.not.allocated(gfile%headaryrval)) &
4750  allocate(gfile%headaryrval(max(gfile%fieldsize,(gfile%dimz+1)*6),gfile%headaryrnum))
4751  gfile%headaryrname(1)='vcoord'
4752  do j=1,2
4753  do i=1,3
4754  do k=1,gfile%dimz+1
4755  gfile%headaryrval(k+((j-1)*3+i-1)*(gfile%dimz+1),1)=gfile%vcoord(k,i,j)
4756  enddo
4757  enddo
4758  enddo
4759  if(gfile%headaryrnum>1) then
4760  gfile%headaryrname(2)='lat'
4761  gfile%headaryrval(1:size(gfile%lat),2)=gfile%lat
4762  endif
4763  if(gfile%headaryrnum>2) then
4764  gfile%headaryrname(3)='lon'
4765  gfile%headaryrval(1:size(gfile%lon),3)=gfile%lon
4766  endif
4767  if(gfile%headaryrnum>3) then
4768  gfile%headaryrname(4)='dx'
4769  gfile%headaryrval(1:size(gfile%dx),4)=gfile%dx
4770  endif
4771  if(gfile%headaryrnum>4) then
4772  gfile%headaryrname(5)='dy'
4773  gfile%headaryrval(1:size(gfile%dy),5)=gfile%dy
4774  endif
4775  if(gfile%headaryrnum>5) then
4776  gfile%headaryrname(6)='cpi'
4777  gfile%headaryrval(1:size(gfile%cpi),6)=gfile%cpi
4778  endif
4779  if(gfile%headaryrnum>6) then
4780  gfile%headaryrname(7)='ri'
4781  gfile%headaryrval(1:size(gfile%ri),7)=gfile%ri
4782  endif
4783  endif
4784 !
4785 !--- gfile%head char var
4786  if(gfile%headarycnum >0) then
4787  if(.not.allocated(gfile%headarycname)) allocate(gfile%headarycname(gfile%headarycnum) )
4788  if(.not.allocated(gfile%headarycval)) allocate(gfile%headarycval(size(gfile%recname),gfile%headarycnum))
4789  gfile%headarycname(1)='recname'
4790  gfile%headarycval(1:size(gfile%recname),1)=gfile%recname
4791  if(gfile%headarycnum >1) then
4792  gfile%headarycname(2)='reclevtyp'
4793  gfile%headarycval(1:size(gfile%reclevtyp),2)=gfile%reclevtyp
4794  endif
4795  endif
4796 !
4797  iret=0
4798  end subroutine nemsio_setfhead
4799 !------------------------------------------------------------------------------
4800  subroutine nemsio_setgrbtbl(iret)
4801 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4802 ! abstract: set up grib table
4803 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - -
4804  implicit none
4805  integer(nemsio_intkind),intent(out) :: iret
4806 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4807  iret=-7
4808  gribtable(1)%iptv=2
4809  gribtable(1)%item(1)=nemsio_grbtbl_item('hgt','sfc',1,0,7,1)
4810  gribtable(1)%item(2)=nemsio_grbtbl_item('pres','sfc',0,0,1,1)
4811  gribtable(1)%item(3)=nemsio_grbtbl_item('pres','mid layer',0,0,1,109)
4812  gribtable(1)%item(4)=nemsio_grbtbl_item('dpres','mid layer',2,0,1,110)
4813  gribtable(1)%item(5)=nemsio_grbtbl_item('tmp','mid layer',2,0,11,109)
4814  gribtable(1)%item(6)=nemsio_grbtbl_item('ugrd','mid layer',2,0,33,109)
4815  gribtable(1)%item(7)=nemsio_grbtbl_item('vgrd','mid layer',2,0,34,109)
4816  gribtable(1)%item(8)=nemsio_grbtbl_item('spfh','mid layer',7,0,51,109)
4817  gribtable(1)%item(9)=nemsio_grbtbl_item('o3mr','mid layer',9,0,154,109)
4818  gribtable(1)%item(10)=nemsio_grbtbl_item('clwmr','mid layer',7,0,153,109)
4819 !
4820  gribtable(1)%item(11)=nemsio_grbtbl_item('vvel','mid layer',6,0,39,109)
4821  gribtable(1)%item(12)=nemsio_grbtbl_item('tmp','sfc',3,0,11,1)
4822  gribtable(1)%item(13)=nemsio_grbtbl_item('soilw','0-10 cm down',4,10,144,112)
4823  gribtable(1)%item(14)=nemsio_grbtbl_item('soilw','10-40 cm down',4,2600,144,112)
4824  gribtable(1)%item(15)=nemsio_grbtbl_item('soilw','40-100 cm down',4,10340,144,112)
4825  gribtable(1)%item(16)=nemsio_grbtbl_item('soilw','100-200 cm down',4,25800,144,112)
4826  gribtable(1)%item(17)=nemsio_grbtbl_item('tmp','0-10 cm down',3,10,11,112)
4827  gribtable(1)%item(18)=nemsio_grbtbl_item('tmp','10-40 cm down',3,2600,11,112)
4828  gribtable(1)%item(19)=nemsio_grbtbl_item('tmp','40-100 cm down',3,10340,11,112)
4829  gribtable(1)%item(20)=nemsio_grbtbl_item('tmp','100-200 cm down',3,25800,11,112)
4830 !
4831  gribtable(1)%item(21)=nemsio_grbtbl_item('weasd','sfc',5,0,65,1)
4832  gribtable(1)%item(22)=nemsio_grbtbl_item('tg3','sfc',2,0,11,111)
4833  gribtable(1)%item(23)=nemsio_grbtbl_item('sfcr','sfc',4,0,83,1)
4834  gribtable(1)%item(24)=nemsio_grbtbl_item('tcdc','high cld lay',0,0,71,234)
4835  gribtable(1)%item(25)=nemsio_grbtbl_item('pres','high cld top',-1,0,1,233)
4836  gribtable(1)%item(26)=nemsio_grbtbl_item('pres','high cld bot',-1,0,1,232)
4837  gribtable(1)%item(27)=nemsio_grbtbl_item('tmp','high cld top',3,0,11,233)
4838  gribtable(1)%item(28)=nemsio_grbtbl_item('tcdc','mid cld lay',0,0,71,224)
4839  gribtable(1)%item(29)=nemsio_grbtbl_item('pres','mid cld top',-1,0,1,223)
4840  gribtable(1)%item(30)=nemsio_grbtbl_item('pres','mid cld bot',-1,0,1,222)
4841 !
4842  gribtable(1)%item(31)=nemsio_grbtbl_item('tmp','mid cld top',3,0,11,223)
4843  gribtable(1)%item(32)=nemsio_grbtbl_item('tcdc','low cld lay',0,0,71,214)
4844  gribtable(1)%item(33)=nemsio_grbtbl_item('pres','low cld top',-1,0,1,213)
4845  gribtable(1)%item(34)=nemsio_grbtbl_item('pres','low cld bot',-1,0,1,212)
4846  gribtable(1)%item(35)=nemsio_grbtbl_item('tmp','low cld top',3,0,11,213)
4847  gribtable(1)%item(36)=nemsio_grbtbl_item('tcdc','atmos col',0,0,71,200) !orog???
4848  gribtable(1)%item(37)=nemsio_grbtbl_item('tcdc','convect-cld laye',3,0,71,244) !orog???
4849  gribtable(1)%item(38)=nemsio_grbtbl_item('pres','convect-cld bot',-1,0,1,242)
4850  gribtable(1)%item(39)=nemsio_grbtbl_item('pres','convect-cld top',-1,0,1,243)
4851  gribtable(1)%item(40)=nemsio_grbtbl_item('tcdc','bndary-layer cld',3,0,71,211) !orog???
4852 !
4853  gribtable(1)%item(41)=nemsio_grbtbl_item('alvsf','sfc',3,0,176,1)
4854  gribtable(1)%item(42)=nemsio_grbtbl_item('alvwf','sfc',3,0,177,1)
4855  gribtable(1)%item(43)=nemsio_grbtbl_item('alnsf','sfc',3,0,178,1)
4856  gribtable(1)%item(44)=nemsio_grbtbl_item('alnwf','sfc',3,0,179,1)
4857  gribtable(1)%item(45)=nemsio_grbtbl_item('land','sfc',0,0,81,1)
4858  gribtable(1)%item(46)=nemsio_grbtbl_item('veg','sfc',2,0,87,1)
4859  gribtable(1)%item(47)=nemsio_grbtbl_item('cnwat','sfc',5,0,223,1)
4860  gribtable(1)%item(48)=nemsio_grbtbl_item('f10m','10 m above gnd',5,10,180,105)
4861  gribtable(1)%item(49)=nemsio_grbtbl_item('ugrd','10 m above gnd',2,10,33,105)
4862  gribtable(1)%item(50)=nemsio_grbtbl_item('vgrd','10 m above gnd',2,10,34,105)
4863 !
4864  gribtable(1)%item(51)=nemsio_grbtbl_item('tmp','2 m above gnd',3,2,11,105)
4865  gribtable(1)%item(52)=nemsio_grbtbl_item('spfh','2 m above gnd',6,2,51,105)
4866  gribtable(1)%item(53)=nemsio_grbtbl_item('vtype','sfc',1,0,225,1)
4867  gribtable(1)%item(54)=nemsio_grbtbl_item('facsf','sfc',3,0,207,1)
4868  gribtable(1)%item(55)=nemsio_grbtbl_item('facsf','sfc',3,0,208,1)
4869  gribtable(1)%item(56)=nemsio_grbtbl_item('fricv','sfc',3,0,253,1)
4870  gribtable(1)%item(57)=nemsio_grbtbl_item('ffmm','sfc',3,0,253,1) !???
4871  gribtable(1)%item(58)=nemsio_grbtbl_item('ffhh','sfc',3,0,253,1) !???
4872  gribtable(1)%item(59)=nemsio_grbtbl_item('icetk','sfc',2,0,92,1)
4873  gribtable(1)%item(60)=nemsio_grbtbl_item('icec','sfc',3,0,91,1)
4874 !
4875  gribtable(1)%item(61)=nemsio_grbtbl_item('tisfc','sfc',2,0,171,1)
4876  gribtable(1)%item(62)=nemsio_grbtbl_item('tprcp','sfc',2,0,171,1) !tprc ???
4877  gribtable(1)%item(63)=nemsio_grbtbl_item('crain','sfc',0,0,140,1) !srflag ???
4878  gribtable(1)%item(64)=nemsio_grbtbl_item('snod','sfc',6,0,66,1)
4879  gribtable(1)%item(65)=nemsio_grbtbl_item('slc','soil layer',3,130,160,112)
4880  gribtable(1)%item(66)=nemsio_grbtbl_item('shdmin','sfc',3,0,189,1)
4881  gribtable(1)%item(67)=nemsio_grbtbl_item('shdmax','sfc',3,0,190,1)
4882  gribtable(1)%item(68)=nemsio_grbtbl_item('sotyp','sfc',1,0,224,1)
4883  gribtable(1)%item(69)=nemsio_grbtbl_item('salbd','sfc',1,0,194,1)
4884 !jw gribtable(1)%item(49)=nemsio_grbtbl_item('orog','sfc',1,0,194,1) !orog???
4885 !flx
4886  gribtable(1)%item(70)=nemsio_grbtbl_item('uflx','sfc',3,0,124,1)
4887 !
4888  gribtable(1)%item(71)=nemsio_grbtbl_item('vflx','sfc',3,0,125,1)
4889  gribtable(1)%item(72)=nemsio_grbtbl_item('shtfl','sfc',0,0,122,1)
4890  gribtable(1)%item(73)=nemsio_grbtbl_item('lhtfl','sfc',0,0,121,1)
4891  gribtable(1)%item(74)=nemsio_grbtbl_item('dlwrf','sfc',0,0,205,1)
4892  gribtable(1)%item(75)=nemsio_grbtbl_item('ulwrf','sfc',0,0,212,1)
4893  gribtable(1)%item(76)=nemsio_grbtbl_item('ulwrf','nom. top',0,0,212,8)
4894  gribtable(1)%item(77)=nemsio_grbtbl_item('uswrf','nom. top',0,0,211,8)
4895  gribtable(1)%item(78)=nemsio_grbtbl_item('uswrf','sfc',0,0,211,1)
4896  gribtable(1)%item(79)=nemsio_grbtbl_item('dswrf','sfc',0,0,204,1)
4897  gribtable(1)%item(80)=nemsio_grbtbl_item('prate','sfc',6,0,59,1)
4898 
4899  gribtable(1)%item(81)=nemsio_grbtbl_item('soilm','0-200 cm down',4,200,86,112)
4900  gribtable(1)%item(82)=nemsio_grbtbl_item('vgtyp','sfc',1,0,225,1)
4901  gribtable(1)%item(83)=nemsio_grbtbl_item('cprat','sfc',6,0,214,1)
4902  gribtable(1)%item(84)=nemsio_grbtbl_item('gflux','sfc',0,0,155,1)
4903  gribtable(1)%item(85)=nemsio_grbtbl_item('tmax','2 m above gnd',1,2,15,105)
4904  gribtable(1)%item(86)=nemsio_grbtbl_item('tmin','2 m above gnd',1,2,16,105)
4905  gribtable(1)%item(87)=nemsio_grbtbl_item('watr','sfc',5,0,90,1)
4906  gribtable(1)%item(88)=nemsio_grbtbl_item('pevpr','sfc',0,0,145,1)
4907  gribtable(1)%item(89)=nemsio_grbtbl_item('cwork','atmos col',0,0,146,200)
4908  gribtable(1)%item(90)=nemsio_grbtbl_item('u-gwd','sfc',3,0,147,1)
4909 !
4910  gribtable(1)%item(91)=nemsio_grbtbl_item('v-gwd','sfc',3,0,148,1)
4911  gribtable(1)%item(92)=nemsio_grbtbl_item('hpbl','sfc',0,0,221,1)
4912  gribtable(1)%item(93)=nemsio_grbtbl_item('pwat','atmos col',1,0,54,200)
4913  gribtable(1)%item(94)=nemsio_grbtbl_item('albdo','sfc',1,0,84,1)
4914  gribtable(1)%item(95)=nemsio_grbtbl_item('cnwat','sfc',5,0,223,1)
4915  gribtable(1)%item(96)=nemsio_grbtbl_item('sfexc','sfc',4,0,208,1)
4916  gribtable(1)%item(97)=nemsio_grbtbl_item('pevpr','sfc',0,0,145,1)
4917  gribtable(1)%item(98)=nemsio_grbtbl_item('dlwrf','sfc',0,0,205,1)
4918  gribtable(1)%item(99)=nemsio_grbtbl_item('ulwrf','sfc',0,0,212,1)
4919  gribtable(1)%item(100)=nemsio_grbtbl_item('uswrf','sfc',0,0,211,1)
4920 !
4921  gribtable(1)%item(101)=nemsio_grbtbl_item('dswrf','sfc',0,0,204,1)
4922  gribtable(1)%item(102)=nemsio_grbtbl_item('ssrun','sfc',5,0,235,1)
4923  gribtable(1)%item(103)=nemsio_grbtbl_item('tmp','hybrid lev 1',3,1,11,109)
4924  gribtable(1)%item(104)=nemsio_grbtbl_item('spfh','hybrid lev 1',6,1,51,109)
4925  gribtable(1)%item(105)=nemsio_grbtbl_item('ugrd','hybrid lev 1',2,1,33,109)
4926  gribtable(1)%item(106)=nemsio_grbtbl_item('vgrd','hybrid lev 1',2,1,34,109)
4927  gribtable(1)%item(107)=nemsio_grbtbl_item('hgt','hybrid lev 1',2,1,7,109)
4928  gribtable(1)%item(108)=nemsio_grbtbl_item('evbs','sfc',0,0,199,1)
4929  gribtable(1)%item(109)=nemsio_grbtbl_item('evcw','sfc',0,0,200,1)
4930  gribtable(1)%item(110)=nemsio_grbtbl_item('trans','sfc',0,0,210,1)
4931  gribtable(1)%item(111)=nemsio_grbtbl_item('snowc','sfc',3,0,238,1)
4932  gribtable(1)%item(112)=nemsio_grbtbl_item('dswrf','nom. top',0,0,204,8)
4933  gribtable(1)%item(113)=nemsio_grbtbl_item('csulf','nom. top',0,0,162,8)
4934  gribtable(1)%item(114)=nemsio_grbtbl_item('csusf','nom. top',0,0,160,8)
4935  gribtable(1)%item(115)=nemsio_grbtbl_item('csdlf','sfc',0,0,163,1)
4936  gribtable(1)%item(116)=nemsio_grbtbl_item('csusf','sfc',0,0,160,1)
4937  gribtable(1)%item(117)=nemsio_grbtbl_item('csdsf','sfc',0,0,161,1)
4938  gribtable(1)%item(118)=nemsio_grbtbl_item('csulf','sfc',0,0,162,1)
4939  gribtable(1)%item(119)=nemsio_grbtbl_item('snohf','sfc',0,0,229,1)
4940 
4941  gribtable(1)%item(120)=nemsio_grbtbl_item('vbdsf','sfc',0,0,166,1)
4942  gribtable(1)%item(121)=nemsio_grbtbl_item('vddsf','sfc',0,0,167,1)
4943  gribtable(1)%item(122)=nemsio_grbtbl_item('nbdsf','sfc',0,0,168,1)
4944  gribtable(1)%item(123)=nemsio_grbtbl_item('nddsf','sfc',0,0,169,1)
4945  gribtable(1)%item(124)=nemsio_grbtbl_item('cpofp','sfc',0,0,194,1)
4946 !
4947 ! gribtable(1)%item(50)=nemsio_grbtbl_item('nlat','sfc',2,0,176,1)
4948 ! gribtable(1)%item(51)=nemsio_grbtbl_item('elon','sfc',2,0,177,1)
4949 ! gribtable(1)%item(52)=nemsio_grbtbl_item('nlonb','sfc',2,0,177,1) !vlat ???
4950 ! gribtable(1)%item(53)=nemsio_grbtbl_item('elonb','sfc',2,0,177,1) !vlon ???
4951 ! gribtable(1)%item(54)=nemsio_grbtbl_item('wtend','sfc',6,0,236,1) !wtend precision
4952 ! gribtable(1)%item(55)=nemsio_grbtbl_item('omgalf','sfc',6,0,154,1) !wtend precision
4953 ! gribtable(1)%item(56)=nemsio_grbtbl_item('omgalf','sfc',6,0,154,1) !wtend precision
4954 !
4955 !*** table 129
4956  gribtable(2)%iptv=129
4957  gribtable(2)%item(1)=nemsio_grbtbl_item('duvb','sfc',2,0,200,1)
4958  gribtable(2)%item(2)=nemsio_grbtbl_item('cduvb','sfc',2,0,201,1)
4959 !
4960 !*** table 130
4961  gribtable(3)%iptv=130
4962  gribtable(3)%item(1)=nemsio_grbtbl_item('sltyp','sfc',0,0,222,1)
4963  gribtable(3)%item(2)=nemsio_grbtbl_item('sbsno','sfc',0,0,198,1)
4964  gribtable(3)%item(3)=nemsio_grbtbl_item('soill','0-10 cm down',4,10,160,112)
4965  gribtable(3)%item(4)=nemsio_grbtbl_item('soill','10-40 cm down',4,2600,160,112)
4966  gribtable(3)%item(5)=nemsio_grbtbl_item('soill','40-100 cm down',4,10340,160,112)
4967  gribtable(3)%item(6)=nemsio_grbtbl_item('soill','100-200 cm down',4,25800,160,112)
4968  gribtable(3)%item(7)=nemsio_grbtbl_item('acond','sfc',4,0,179,1)
4969  gribtable(3)%item(8)=nemsio_grbtbl_item('wilt','sfc',4,0,219,1)
4970  gribtable(3)%item(9)=nemsio_grbtbl_item('fldcp','sfc',4,0,220,1)
4971 
4972 !*** table 141 (for Air Quality / GOCART)
4973  gribtable(4)%iptv=141
4974  gribtable(4)%item(1)=nemsio_grbtbl_item('du001','mid layer',9,0,240,109)
4975  gribtable(4)%item(2)=nemsio_grbtbl_item('du002','mid layer',9,0,241,109)
4976  gribtable(4)%item(3)=nemsio_grbtbl_item('du003','mid layer',9,0,242,109)
4977  gribtable(4)%item(4)=nemsio_grbtbl_item('du004','mid layer',9,0,243,109)
4978  gribtable(4)%item(5)=nemsio_grbtbl_item('du005','mid layer',9,0,244,109)
4979  gribtable(4)%item(6)=nemsio_grbtbl_item('ss001','mid layer',9,0,245,109)
4980  gribtable(4)%item(7)=nemsio_grbtbl_item('ss002','mid layer',9,0,246,109)
4981  gribtable(4)%item(8)=nemsio_grbtbl_item('ss003','mid layer',9,0,247,109)
4982  gribtable(4)%item(9)=nemsio_grbtbl_item('ss004','mid layer',9,0,248,109)
4983  gribtable(4)%item(10)=nemsio_grbtbl_item('dms','mid layer',9,0,235,109)
4984  gribtable(4)%item(11)=nemsio_grbtbl_item('so4','mid layer',9,0,234,109)
4985  gribtable(4)%item(12)=nemsio_grbtbl_item('so2','mid layer',9,0,232,109)
4986  gribtable(4)%item(13)=nemsio_grbtbl_item('msa','mid layer',9,0,233,109)
4987  gribtable(4)%item(14)=nemsio_grbtbl_item('ocphobic','mid layer',9,0,249,109)
4988  gribtable(4)%item(15)=nemsio_grbtbl_item('ocphilic','mid layer',9,0,250,109)
4989  gribtable(4)%item(16)=nemsio_grbtbl_item('bcphobic','mid layer',9,0,251,109)
4990  gribtable(4)%item(17)=nemsio_grbtbl_item('bcphilic','mid layer',9,0,252,109)
4991 !
4992  gribtable(4)%item(18)=nemsio_grbtbl_item('aod','atmos col',3,0,255,200)
4993  gribtable(4)%item(19)=nemsio_grbtbl_item('duaod','atmos col',3,0,220,200)
4994  gribtable(4)%item(20)=nemsio_grbtbl_item('bcaod','atmos col',3,0,254,200)
4995  gribtable(4)%item(21)=nemsio_grbtbl_item('ocaod','atmos col',3,0,237,200)
4996  gribtable(4)%item(22)=nemsio_grbtbl_item('suaod','atmos col',3,0,234,200)
4997  gribtable(4)%item(23)=nemsio_grbtbl_item('ssaod','atmos col',3,0,239,200)
4998 
4999  gribtable(4)%item(24)=nemsio_grbtbl_item('ss005','mid layer',9,0,253,109)
5000 !
5001 ! 2d aerosol diag fields for DU (pds5=100:128)
5002  gribtable(4)%item(25)=nemsio_grbtbl_item('duem001','atmos col',6,0,100,200)
5003  gribtable(4)%item(26)=nemsio_grbtbl_item('duem002','atmos col',6,0,101,200)
5004  gribtable(4)%item(27)=nemsio_grbtbl_item('duem003','atmos col',6,0,102,200)
5005  gribtable(4)%item(28)=nemsio_grbtbl_item('duem004','atmos col',6,0,103,200)
5006  gribtable(4)%item(29)=nemsio_grbtbl_item('duem005','atmos col',6,0,104,200)
5007  gribtable(4)%item(30)=nemsio_grbtbl_item('dusd001','atmos col',6,0,105,200)
5008  gribtable(4)%item(31)=nemsio_grbtbl_item('dusd002','atmos col',6,0,106,200)
5009  gribtable(4)%item(32)=nemsio_grbtbl_item('dusd003','atmos col',6,0,107,200)
5010  gribtable(4)%item(33)=nemsio_grbtbl_item('dusd004','atmos col',6,0,108,200)
5011  gribtable(4)%item(34)=nemsio_grbtbl_item('dusd005','atmos col',6,0,109,200)
5012  gribtable(4)%item(35)=nemsio_grbtbl_item('dudp001','atmos col',6,0,110,200)
5013  gribtable(4)%item(36)=nemsio_grbtbl_item('dudp002','atmos col',6,0,111,200)
5014  gribtable(4)%item(37)=nemsio_grbtbl_item('dudp003','atmos col',6,0,112,200)
5015  gribtable(4)%item(38)=nemsio_grbtbl_item('dudp004','atmos col',6,0,113,200)
5016  gribtable(4)%item(39)=nemsio_grbtbl_item('dudp005','atmos col',6,0,114,200)
5017  gribtable(4)%item(40)=nemsio_grbtbl_item('duwt001','atmos col',6,0,115,200)
5018  gribtable(4)%item(41)=nemsio_grbtbl_item('duwt002','atmos col',6,0,116,200)
5019  gribtable(4)%item(42)=nemsio_grbtbl_item('duwt003','atmos col',6,0,117,200)
5020  gribtable(4)%item(43)=nemsio_grbtbl_item('duwt004','atmos col',6,0,118,200)
5021  gribtable(4)%item(44)=nemsio_grbtbl_item('duwt005','atmos col',6,0,119,200)
5022  gribtable(4)%item(45)=nemsio_grbtbl_item('dusmass','atmos col',6,0,120,200)
5023  gribtable(4)%item(46)=nemsio_grbtbl_item('ducmass','atmos col',6,0,121,200)
5024  gribtable(4)%item(47)=nemsio_grbtbl_item('duexttau','atmos col',6,0,122,200)
5025  gribtable(4)%item(48)=nemsio_grbtbl_item('duscatau','atmos col',6,0,123,200)
5026  gribtable(4)%item(49)=nemsio_grbtbl_item('dusmass25','atmos col',6,0,124,200)
5027  gribtable(4)%item(50)=nemsio_grbtbl_item('ducmass25','atmos col',6,0,125,200)
5028  gribtable(4)%item(51)=nemsio_grbtbl_item('duextt25','atmos col',6,0,126,200)
5029  gribtable(4)%item(52)=nemsio_grbtbl_item('duscat25','atmos col',6,0,127,200)
5030  gribtable(4)%item(53)=nemsio_grbtbl_item('duaeridx','atmos col',6,0,128,200)
5031 !
5032 ! 2d aerosol diag fields for SU (pds5=130:159)
5033  gribtable(4)%item(54)=nemsio_grbtbl_item('suem001','atmos col',6,0,130,200)
5034  gribtable(4)%item(55)=nemsio_grbtbl_item('suem002','atmos col',6,0,131,200)
5035  gribtable(4)%item(56)=nemsio_grbtbl_item('suem003','atmos col',6,0,132,200)
5036  gribtable(4)%item(57)=nemsio_grbtbl_item('suem004','atmos col',6,0,133,200)
5037  gribtable(4)%item(58)=nemsio_grbtbl_item('sudp001','atmos col',6,0,134,200)
5038  gribtable(4)%item(59)=nemsio_grbtbl_item('sudp002','atmos col',6,0,135,200)
5039  gribtable(4)%item(60)=nemsio_grbtbl_item('sudp003','atmos col',6,0,136,200)
5040  gribtable(4)%item(61)=nemsio_grbtbl_item('sudp004','atmos col',6,0,137,200)
5041  gribtable(4)%item(62)=nemsio_grbtbl_item('suwt001','atmos col',6,0,138,200)
5042  gribtable(4)%item(63)=nemsio_grbtbl_item('suwt002','atmos col',6,0,139,200)
5043  gribtable(4)%item(64)=nemsio_grbtbl_item('suwt003','atmos col',6,0,140,200)
5044  gribtable(4)%item(65)=nemsio_grbtbl_item('suwt004','atmos col',6,0,141,200)
5045  gribtable(4)%item(66)=nemsio_grbtbl_item('so2smass','atmos col',6,0,142,200)
5046  gribtable(4)%item(67)=nemsio_grbtbl_item('so2cmass','atmos col',6,0,143,200)
5047  gribtable(4)%item(68)=nemsio_grbtbl_item('so4smass','atmos col',6,0,144,200)
5048  gribtable(4)%item(69)=nemsio_grbtbl_item('so4cmass','atmos col',6,0,145,200)
5049  gribtable(4)%item(70)=nemsio_grbtbl_item('dmssmass','atmos col',6,0,146,200)
5050  gribtable(4)%item(71)=nemsio_grbtbl_item('dmscmass','atmos col',6,0,147,200)
5051  gribtable(4)%item(72)=nemsio_grbtbl_item('supsO2','atmos col',6,0,148,200)
5052  gribtable(4)%item(73)=nemsio_grbtbl_item('supsO4g','atmos col',6,0,149,200)
5053  gribtable(4)%item(74)=nemsio_grbtbl_item('supsO4aq','atmos col',6,0,150,200)
5054  gribtable(4)%item(75)=nemsio_grbtbl_item('supsO4wt','atmos col',6,0,151,200)
5055  gribtable(4)%item(76)=nemsio_grbtbl_item('so4eman','atmos col',6,0,152,200)
5056  gribtable(4)%item(77)=nemsio_grbtbl_item('so2eman','atmos col',6,0,153,200)
5057  gribtable(4)%item(78)=nemsio_grbtbl_item('so2embb','atmos col',6,0,154,200)
5058  gribtable(4)%item(79)=nemsio_grbtbl_item('so2emvn','atmos col',6,0,155,200)
5059  gribtable(4)%item(80)=nemsio_grbtbl_item('so2emve','atmos col',6,0,156,200)
5060  gribtable(4)%item(81)=nemsio_grbtbl_item('supmsa','atmos col',6,0,157,200)
5061  gribtable(4)%item(82)=nemsio_grbtbl_item('suexttau','atmos col',6,0,158,200)
5062  gribtable(4)%item(83)=nemsio_grbtbl_item('suscatau','atmos col',6,0,159,200)
5063 
5064 ! 2d aerosol diag fields for OC/BC (pds5=160:188)
5065  gribtable(4)%item(84)=nemsio_grbtbl_item('ocem001','atmos col',6,0,160,200)
5066  gribtable(4)%item(85)=nemsio_grbtbl_item('ocem002','atmos col',6,0,161,200)
5067  gribtable(4)%item(86)=nemsio_grbtbl_item('ocdp001','atmos col',6,0,162,200)
5068  gribtable(4)%item(87)=nemsio_grbtbl_item('ocdp002','atmos col',6,0,163,200)
5069  gribtable(4)%item(88)=nemsio_grbtbl_item('ocwt001','atmos col',6,0,164,200)
5070  gribtable(4)%item(89)=nemsio_grbtbl_item('ocwt002','atmos col',6,0,165,200)
5071  gribtable(4)%item(90)=nemsio_grbtbl_item('ochyphil','atmos col',6,0,166,200)
5072  gribtable(4)%item(91)=nemsio_grbtbl_item('oceman','atmos col',6,0,167,200)
5073  gribtable(4)%item(92)=nemsio_grbtbl_item('ocembb','atmos col',6,0,168,200)
5074  gribtable(4)%item(93)=nemsio_grbtbl_item('ocembf','atmos col',6,0,169,200)
5075  gribtable(4)%item(94)=nemsio_grbtbl_item('ocembg','atmos col',6,0,170,200)
5076  gribtable(4)%item(95)=nemsio_grbtbl_item('ocsmass','atmos col',6,0,171,200)
5077  gribtable(4)%item(96)=nemsio_grbtbl_item('occmass','atmos col',6,0,172,200)
5078  gribtable(4)%item(97)=nemsio_grbtbl_item('ocexttau','atmos col',6,0,173,200)
5079  gribtable(4)%item(98)=nemsio_grbtbl_item('ocexttau','atmos col',6,0,174,200)
5080  gribtable(4)%item(99)=nemsio_grbtbl_item('bcem001','atmos col',6,0,175,200)
5081  gribtable(4)%item(100)=nemsio_grbtbl_item('bcem002','atmos col',6,0,176,200)
5082  gribtable(4)%item(101)=nemsio_grbtbl_item('bcdp001','atmos col',6,0,177,200)
5083  gribtable(4)%item(102)=nemsio_grbtbl_item('bcdp002','atmos col',6,0,178,200)
5084  gribtable(4)%item(103)=nemsio_grbtbl_item('bcwt001','atmos col',6,0,179,200)
5085  gribtable(4)%item(104)=nemsio_grbtbl_item('bcwt002','atmos col',6,0,180,200)
5086  gribtable(4)%item(105)=nemsio_grbtbl_item('bchyphil','atmos col',6,0,181,200)
5087  gribtable(4)%item(106)=nemsio_grbtbl_item('bceman','atmos col',6,0,182,200)
5088  gribtable(4)%item(107)=nemsio_grbtbl_item('bcembb','atmos col',6,0,183,200)
5089  gribtable(4)%item(108)=nemsio_grbtbl_item('bcembf','atmos col',6,0,184,200)
5090  gribtable(4)%item(109)=nemsio_grbtbl_item('bcsmass','atmos col',6,0,185,200)
5091  gribtable(4)%item(110)=nemsio_grbtbl_item('bccmass','atmos col',6,0,186,200)
5092  gribtable(4)%item(111)=nemsio_grbtbl_item('bcexttau','atmos col',6,0,187,200)
5093  gribtable(4)%item(112)=nemsio_grbtbl_item('bcscatau','atmos col',6,0,188,200)
5094 !
5095 ! 2d aerosol diag fields for SS (pds5=190:218)
5096  gribtable(4)%item(113)=nemsio_grbtbl_item('ssem001','atmos col',6,0,190,200)
5097  gribtable(4)%item(114)=nemsio_grbtbl_item('ssem002','atmos col',6,0,191,200)
5098  gribtable(4)%item(115)=nemsio_grbtbl_item('ssem003','atmos col',6,0,192,200)
5099  gribtable(4)%item(116)=nemsio_grbtbl_item('ssem004','atmos col',6,0,193,200)
5100  gribtable(4)%item(117)=nemsio_grbtbl_item('ssem005','atmos col',6,0,194,200)
5101  gribtable(4)%item(118)=nemsio_grbtbl_item('sssd001','atmos col',6,0,195,200)
5102  gribtable(4)%item(119)=nemsio_grbtbl_item('sssd002','atmos col',6,0,196,200)
5103  gribtable(4)%item(120)=nemsio_grbtbl_item('sssd003','atmos col',6,0,197,200)
5104  gribtable(4)%item(121)=nemsio_grbtbl_item('sssd004','atmos col',6,0,198,200)
5105  gribtable(4)%item(122)=nemsio_grbtbl_item('sssd005','atmos col',6,0,199,200)
5106  gribtable(4)%item(123)=nemsio_grbtbl_item('ssdp001','atmos col',6,0,200,200)
5107  gribtable(4)%item(124)=nemsio_grbtbl_item('ssdp002','atmos col',6,0,201,200)
5108  gribtable(4)%item(125)=nemsio_grbtbl_item('ssdp003','atmos col',6,0,202,200)
5109  gribtable(4)%item(126)=nemsio_grbtbl_item('ssdp004','atmos col',6,0,203,200)
5110  gribtable(4)%item(127)=nemsio_grbtbl_item('ssdp005','atmos col',6,0,204,200)
5111  gribtable(4)%item(128)=nemsio_grbtbl_item('sswt001','atmos col',6,0,205,200)
5112  gribtable(4)%item(129)=nemsio_grbtbl_item('sswt002','atmos col',6,0,206,200)
5113  gribtable(4)%item(130)=nemsio_grbtbl_item('sswt003','atmos col',6,0,207,200)
5114  gribtable(4)%item(131)=nemsio_grbtbl_item('sswt004','atmos col',6,0,208,200)
5115  gribtable(4)%item(132)=nemsio_grbtbl_item('sswt005','atmos col',6,0,209,200)
5116  gribtable(4)%item(133)=nemsio_grbtbl_item('sssmass','atmos col',6,0,210,200)
5117  gribtable(4)%item(134)=nemsio_grbtbl_item('sscmass','atmos col',6,0,211,200)
5118  gribtable(4)%item(135)=nemsio_grbtbl_item('ssexttau','atmos col',6,0,212,200)
5119  gribtable(4)%item(136)=nemsio_grbtbl_item('ssscatau','atmos col',6,0,213,200)
5120  gribtable(4)%item(137)=nemsio_grbtbl_item('sssmass25','atmos col',6,0,214,200)
5121  gribtable(4)%item(138)=nemsio_grbtbl_item('sscmass25','atmos col',6,0,215,200)
5122  gribtable(4)%item(139)=nemsio_grbtbl_item('ssextt25','atmos col',6,0,216,200)
5123  gribtable(4)%item(140)=nemsio_grbtbl_item('ssscat25','atmos col',6,0,217,200)
5124  gribtable(4)%item(141)=nemsio_grbtbl_item('ssaeridx','atmos col',6,0,218,200)
5125 !
5126 !
5127 !table 133
5128  gribtable(5)%iptv=133
5129  gribtable(5)%item(1)=nemsio_grbtbl_item('spfhmax','2 m above gnd',5,2,204,105)
5130  gribtable(5)%item(2)=nemsio_grbtbl_item('spfhmin','2 m above gnd',5,2,205,105)
5131  gribtable(5)%item(3)=nemsio_grbtbl_item('sunsd','sfc',0,0,191,1)
5132 !
5133  iret=0
5134  end subroutine nemsio_setgrbtbl
5135 !------------------------------------------------------------------------------
5136  subroutine nemsio_stop()
5137  implicit none
5138  stop
5139  end subroutine nemsio_stop
5140 !------------------------------------------------------------------------------
5141 !
5142  SUBROUTINE nemsio_splat4(IDRT,JMAX,ASLAT)
5143 !$$$
5144  implicit none
5145  integer(nemsio_intkind),intent(in) :: idrt,jmax
5146  real(4),intent(out) :: ASLAT(JMAX)
5147  INTEGER(nemsio_intkind),PARAMETER:: KD=selected_real_kind(15,45)
5148  REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
5149  REAL(KIND=kd):: aslatd(jmax/2),sp,spmax,eps=10.d0*epsilon(sp)
5150  integer,PARAMETER:: JZ=50
5151  REAL(nemsio_dblekind) BZ(JZ)
5152  DATA bz / 2.4048255577d0, 5.5200781103d0, &
5153  8.6537279129d0, 11.7915344391d0, 14.9309177086d0, 18.0710639679d0, &
5154  21.2116366299d0, 24.3524715308d0, 27.4934791320d0, 30.6346064684d0, &
5155  33.7758202136d0, 36.9170983537d0, 40.0584257646d0, 43.1997917132d0, &
5156  46.3411883717d0, 49.4826098974d0, 52.6240518411d0, 55.7655107550d0, &
5157  58.9069839261d0, 62.0484691902d0, 65.1899648002d0, 68.3314693299d0, &
5158  71.4729816036d0, 74.6145006437d0, 77.7560256304d0, 80.8975558711d0, &
5159  84.0390907769d0, 87.1806298436d0, 90.3221726372d0, 93.4637187819d0, &
5160  96.6052679510d0, 99.7468198587d0, 102.888374254d0, 106.029930916d0, &
5161  109.171489649d0, 112.313050280d0, 115.454612653d0, 118.596176630d0, &
5162  121.737742088d0, 124.879308913d0, 128.020877005d0, 131.162446275d0, &
5163  134.304016638d0, 137.445588020d0, 140.587160352d0, 143.728733573d0, &
5164  146.870307625d0, 150.011882457d0, 153.153458019d0, 156.295034268d0 /
5165  REAL(8):: DLT,D1=1.d0
5166  INTEGER(4):: JHE,JHO,J0=0
5167  real(8),PARAMETER :: PI=3.14159265358979d0,c=(1.d0-(2.d0/pi)**2)*0.25d0
5168  real(8) r
5169  integer jh,js,n,j
5170 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5171 !C GAUSSIAN LATITUDES
5172  IF(idrt.EQ.4) THEN
5173  jh=jmax/2
5174  jhe=(jmax+1)/2
5175  r=1.d0/sqrt((jmax+0.5d0)**2+c)
5176  DO j=1,min(jh,jz)
5177  aslatd(j)=cos(bz(j)*r)
5178  ENDDO
5179  DO j=jz+1,jh
5180  aslatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
5181  ENDDO
5182  spmax=1.d0
5183  DO WHILE(spmax.GT.eps)
5184  spmax=0.d0
5185  DO j=1,jh
5186  pkm1(j)=1.d0
5187  pk(j)=aslatd(j)
5188  ENDDO
5189  DO n=2,jmax
5190  DO j=1,jh
5191  pkm2(j)=pkm1(j)
5192  pkm1(j)=pk(j)
5193  pk(j)=((2*n-1)*aslatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
5194  ENDDO
5195  ENDDO
5196  DO j=1,jh
5197  sp=pk(j)*(1.d0-aslatd(j)**2)/(jmax*(pkm1(j)-aslatd(j)*pk(j)))
5198  aslatd(j)=aslatd(j)-sp
5199  spmax=max(spmax,abs(sp))
5200  ENDDO
5201  ENDDO
5202 !CDIR$ IVDEP
5203  DO j=1,jh
5204  aslat(j)=aslatd(j)
5205  aslat(jmax+1-j)=-aslat(j)
5206  ENDDO
5207  IF(jhe.GT.jh) THEN
5208  aslat(jhe)=0.d0
5209  ENDIF
5210 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5211 !C EQUALLY-SPACED LATITUDES INCLUDING POLES
5212  ELSEIF(idrt.EQ.0) THEN
5213  jh=jmax/2
5214  jhe=(jmax+1)/2
5215  jho=jhe-1
5216  dlt=pi/(jmax-1)
5217  aslat(1)=1.d0
5218  DO j=2,jh
5219  aslat(j)=cos((j-1)*dlt)
5220  ENDDO
5221 !CDIR$ IVDEP
5222  DO j=1,jh
5223  aslat(jmax+1-j)=-aslat(j)
5224  ENDDO
5225  IF(jhe.GT.jh) THEN
5226  aslat(jhe)=0.d0
5227  ENDIF
5228 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5229 !C EQUALLY-SPACED LATITUDES EXCLUDING POLES
5230  ELSEIF(idrt.EQ.256) THEN
5231  jh=jmax/2
5232  jhe=(jmax+1)/2
5233  jho=jhe
5234  dlt=pi/jmax
5235  aslat(1)=1.d0
5236  DO j=1,jh
5237  aslat(j)=cos((j-0.5)*dlt)
5238  ENDDO
5239 !CDIR$ IVDEP
5240  DO j=1,jh
5241  aslat(jmax+1-j)=-aslat(j)
5242  ENDDO
5243  IF(jhe.GT.jh) THEN
5244  aslat(jhe)=0.d0
5245  ENDIF
5246  ENDIF
5247 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5248  end subroutine nemsio_splat4
5249 !----------------------------------------------------------------------
5250  SUBROUTINE nemsio_splat8(IDRT,JMAX,ASLAT)
5251 !$$$
5252  implicit none
5253  integer(nemsio_intkind),intent(in) :: idrt,jmax
5254  real(nemsio_dblekind),intent(out) :: ASLAT(JMAX)
5255  INTEGER(nemsio_intkind),PARAMETER:: KD=selected_real_kind(15,45)
5256  REAL(KIND=kd):: pk(jmax/2),pkm1(jmax/2),pkm2(jmax/2)
5257  REAL(KIND=kd):: aslatd(jmax/2),sp,spmax,eps=10.d0*epsilon(sp)
5258  integer,PARAMETER:: JZ=50
5259  REAL(nemsio_dblekind) BZ(JZ)
5260  DATA bz / 2.4048255577d0, 5.5200781103d0, &
5261  8.6537279129d0, 11.7915344391d0, 14.9309177086d0, 18.0710639679d0, &
5262  21.2116366299d0, 24.3524715308d0, 27.4934791320d0, 30.6346064684d0, &
5263  33.7758202136d0, 36.9170983537d0, 40.0584257646d0, 43.1997917132d0, &
5264  46.3411883717d0, 49.4826098974d0, 52.6240518411d0, 55.7655107550d0, &
5265  58.9069839261d0, 62.0484691902d0, 65.1899648002d0, 68.3314693299d0, &
5266  71.4729816036d0, 74.6145006437d0, 77.7560256304d0, 80.8975558711d0, &
5267  84.0390907769d0, 87.1806298436d0, 90.3221726372d0, 93.4637187819d0, &
5268  96.6052679510d0, 99.7468198587d0, 102.888374254d0, 106.029930916d0, &
5269  109.171489649d0, 112.313050280d0, 115.454612653d0, 118.596176630d0, &
5270  121.737742088d0, 124.879308913d0, 128.020877005d0, 131.162446275d0, &
5271  134.304016638d0, 137.445588020d0, 140.587160352d0, 143.728733573d0, &
5272  146.870307625d0, 150.011882457d0, 153.153458019d0, 156.295034268d0 /
5273  REAL(8):: DLT,D1=1.d0
5274  INTEGER(4):: JHE,JHO,J0=0
5275  real(nemsio_dblekind),PARAMETER :: PI=3.14159265358979d0,c=(1.d0-(2.d0/pi)**2)*0.25d0
5276  real(nemsio_dblekind) r
5277  integer jh,js,n,j
5278 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5279 !C GAUSSIAN LATITUDES
5280  IF(idrt.EQ.4) THEN
5281  jh=jmax/2
5282  jhe=(jmax+1)/2
5283  r=1.d0/sqrt((jmax+0.5d0)**2+c)
5284  DO j=1,min(jh,jz)
5285  aslatd(j)=cos(bz(j)*r)
5286  ENDDO
5287  DO j=jz+1,jh
5288  aslatd(j)=cos((bz(jz)+(j-jz)*pi)*r)
5289  ENDDO
5290  spmax=1.d0
5291  DO WHILE(spmax.GT.eps)
5292  spmax=0.d0
5293  DO j=1,jh
5294  pkm1(j)=1.d0
5295  pk(j)=aslatd(j)
5296  ENDDO
5297  DO n=2,jmax
5298  DO j=1,jh
5299  pkm2(j)=pkm1(j)
5300  pkm1(j)=pk(j)
5301  pk(j)=((2*n-1)*aslatd(j)*pkm1(j)-(n-1)*pkm2(j))/n
5302  ENDDO
5303  ENDDO
5304  DO j=1,jh
5305  sp=pk(j)*(1.d0-aslatd(j)**2)/(jmax*(pkm1(j)-aslatd(j)*pk(j)))
5306  aslatd(j)=aslatd(j)-sp
5307  spmax=max(spmax,abs(sp))
5308  ENDDO
5309  ENDDO
5310 !CDIR$ IVDEP
5311  DO j=1,jh
5312  aslat(j)=aslatd(j)
5313  aslat(jmax+1-j)=-aslat(j)
5314  ENDDO
5315  IF(jhe.GT.jh) THEN
5316  aslat(jhe)=0.d0
5317  ENDIF
5318 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5319 !C EQUALLY-SPACED LATITUDES INCLUDING POLES
5320  ELSEIF(idrt.EQ.0) THEN
5321  jh=jmax/2
5322  jhe=(jmax+1)/2
5323  jho=jhe-1
5324  dlt=pi/(jmax-1)
5325  aslat(1)=1.d0
5326  DO j=2,jh
5327  aslat(j)=cos((j-1)*dlt)
5328  ENDDO
5329 !CDIR$ IVDEP
5330  DO j=1,jh
5331  aslat(jmax+1-j)=-aslat(j)
5332  ENDDO
5333  IF(jhe.GT.jh) THEN
5334  aslat(jhe)=0.d0
5335  ENDIF
5336 !C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5337 !C EQUALLY-SPACED LATITUDES EXCLUDING POLES
5338  ELSEIF(idrt.EQ.256) THEN
5339  jh=jmax/2
5340  jhe=(jmax+1)/2
5341  jho=jhe
5342  dlt=pi/jmax
5343  aslat(1)=1.d0
5344  DO j=1,jh
5345  aslat(j)=cos((j-0.5d0)*dlt)
5346  ENDDO
5347 !DIR$ IVDEP
5348  DO j=1,jh
5349  aslat(jmax+1-j)=-aslat(j)
5350  ENDDO
5351  IF(jhe.GT.jh) THEN
5352  aslat(jhe)=0.d0
5353  ENDIF
5354  ENDIF
5355 ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
5356  end subroutine nemsio_splat8
5357 !-----------------------------------------------------------------------
5358 !
5359  elemental function lowercase(word)
5360 !
5361 !-----------------------------------------------------------------------
5362 !
5363 ! convert a word to lower case
5364 !
5365  Character (len=32) :: lowercase
5366  Character (len=*) , intent(in) :: word
5367  integer :: i,ic,nlen
5368  nlen = len(word)
5369  if(nlen >32) then
5370  nlen=32
5371  endif
5372  lowercase(1:nlen)=word(1:nlen)
5373  do i=1,nlen
5374  ic = ichar(word(i:i))
5375  if (ic >= 65 .and. ic < 91) lowercase(i:i) = char(ic+32)
5376  end do
5377  if(nlen<32) lowercase(nlen+1:)=' '
5378 !
5379 !-----------------------------------------------------------------------
5380 !
5381  end function lowercase
5382 !
5383  elemental function equal_str_nocase(str1,str2)
5384 !
5385 !-----------------------------------------------------------------------
5386 !
5387 ! convert a word to lower case
5388 !
5389  logical :: equal_str_nocase
5390  Character (len=*) , intent(in) :: str1
5391  Character (len=*) , intent(in) :: str2
5392  integer :: i,ic1,ic2,nlen
5393  nlen = len(str2)
5394 !
5395  if(len(str1)/=nlen) then
5396  equal_str_nocase=.false.
5397  return
5398  endif
5399  equal_str_nocase=.false.
5400  do i=1,nlen
5401  ic1 = ichar(str1(i:i))
5402  if (ic1 >= 65 .and. ic1 < 91) ic1 = ic1+32
5403  ic2 = ichar(str2(i:i))
5404  if (ic2 >= 65 .and. ic2 < 91) ic2 = ic2+32
5405  if(ic1/=ic2) then
5406  equal_str_nocase=.false.
5407  return
5408  endif
5409  end do
5410  equal_str_nocase=.true.
5411 !
5412 !-----------------------------------------------------------------------
5413 !
5414  end function equal_str_nocase
5415 !
5416 !-----------------------------------------------------------------------
5417 !
5418 !
5419 !-----------------------------------------------------------------------
5420 !
5421 end module nemsio_openclose
nemsio_openclose::nemsio_gfile
Definition: nemsio_openclose.f90:157
nemsio_openclose::nemsio_grbmeta
Definition: nemsio_openclose.f90:286