121 module nemsio_module_mpi
129 integer,
parameter:: nemsio_lmeta1=48,nemsio_lmeta3=40
130 integer,
parameter:: nemsio_intkind=4,nemsio_intkind8=8
131 integer,
parameter:: nemsio_realkind=4,nemsio_dblekind=8
132 integer,
parameter:: nemsio_charkind=16,nemsio_charkind8=8, nemsio_charkind4=4
133 integer,
parameter:: nemsio_logickind=4
134 integer,
parameter:: nemsio_maxint=2147483647
135 real(nemsio_intkind),
parameter :: nemsio_intfill=-9999_nemsio_intkind
136 integer(nemsio_intkind8),
parameter :: nemsio_intfill8=-9999_nemsio_intkind8
137 logical(nemsio_logickind),
parameter:: nemsio_logicfill=.false.
138 real(nemsio_intkind),
parameter :: nemsio_kpds_intfill=-1_nemsio_intkind
139 real(nemsio_realkind),
parameter :: nemsio_realfill=-9999._nemsio_realkind
140 real(nemsio_dblekind),
parameter :: nemsio_dblefill=-9999._nemsio_dblekind
146 character(nemsio_charkind8) :: gtype=
' '
147 integer(nemsio_intkind):: version=nemsio_intfill
148 character(nemsio_charkind8):: gdatatype=
' '
149 character(nemsio_charkind8):: modelname=
' '
150 integer(nemsio_intkind):: nmeta=nemsio_intfill
151 integer(nemsio_intkind):: lmeta=nemsio_intfill
152 integer(nemsio_intkind):: nrec=nemsio_intfill
154 integer(nemsio_intkind):: idate(7)=nemsio_intfill
155 integer(nemsio_intkind):: nfday=nemsio_intfill
156 integer(nemsio_intkind):: nfhour=nemsio_intfill
157 integer(nemsio_intkind):: nfminute=nemsio_intfill
158 integer(nemsio_intkind):: nfsecondn=nemsio_intfill
159 integer(nemsio_intkind):: nfsecondd=nemsio_intfill
162 integer(nemsio_intkind):: dimx=nemsio_intfill
163 integer(nemsio_intkind):: dimy=nemsio_intfill
164 integer(nemsio_intkind):: dimz=nemsio_intfill
165 integer(nemsio_intkind):: nframe=nemsio_intfill
166 integer(nemsio_intkind):: nsoil=nemsio_intfill
167 integer(nemsio_intkind):: ntrac=nemsio_intfill
169 integer(nemsio_intkind) :: jcap=nemsio_intfill
170 integer(nemsio_intkind) :: ncldt=nemsio_intfill
171 integer(nemsio_intkind) :: idvc=nemsio_intfill
172 integer(nemsio_intkind) :: idsl=nemsio_intfill
173 integer(nemsio_intkind) :: idvm=nemsio_intfill
174 integer(nemsio_intkind) :: idrt=nemsio_intfill
175 real(nemsio_realkind) :: rlon_min=nemsio_realfill
176 real(nemsio_realkind) :: rlon_max=nemsio_realfill
177 real(nemsio_realkind) :: rlat_min=nemsio_realfill
178 real(nemsio_realkind) :: rlat_max=nemsio_realfill
179 logical(nemsio_logickind) :: extrameta=nemsio_logicfill
181 integer(nemsio_intkind):: nmetavari=nemsio_intfill
182 integer(nemsio_intkind):: nmetavarr=nemsio_intfill
183 integer(nemsio_intkind):: nmetavarl=nemsio_intfill
184 integer(nemsio_intkind):: nmetavarc=nemsio_intfill
185 integer(nemsio_intkind):: nmetavarr8=nemsio_intfill
186 integer(nemsio_intkind):: nmetaaryi=nemsio_intfill
187 integer(nemsio_intkind):: nmetaaryr=nemsio_intfill
188 integer(nemsio_intkind):: nmetaaryl=nemsio_intfill
189 integer(nemsio_intkind):: nmetaaryc=nemsio_intfill
190 integer(nemsio_intkind):: nmetaaryr8=nemsio_intfill
192 character(nemsio_charkind),
allocatable :: recname(:)
193 character(nemsio_charkind),
allocatable :: reclevtyp(:)
194 integer(nemsio_intkind),
allocatable :: reclev(:)
196 real(nemsio_realkind),
allocatable :: vcoord(:,:,:)
197 real(nemsio_realkind),
allocatable :: lat(:)
198 real(nemsio_realkind),
allocatable :: lon(:)
199 real(nemsio_realkind),
allocatable :: dx(:)
200 real(nemsio_realkind),
allocatable :: dy(:)
202 real(nemsio_realkind),
allocatable :: Cpi(:)
203 real(nemsio_realkind),
allocatable :: Ri(:)
205 character(nemsio_charkind),
allocatable :: variname(:)
206 integer(nemsio_intkind),
allocatable :: varival(:)
207 character(nemsio_charkind),
allocatable :: varrname(:)
208 real(nemsio_realkind),
allocatable :: varrval(:)
209 character(nemsio_charkind),
allocatable :: varr8name(:)
210 real(nemsio_dblekind),
allocatable :: varr8val(:)
211 character(nemsio_charkind),
allocatable :: varlname(:)
212 logical(nemsio_logickind),
allocatable :: varlval(:)
213 character(nemsio_charkind),
allocatable :: varcname(:)
214 character(nemsio_charkind),
allocatable :: varcval(:)
216 character(nemsio_charkind),
allocatable :: aryiname(:)
217 integer(nemsio_intkind),
allocatable :: aryilen(:)
218 integer(nemsio_intkind),
allocatable :: aryival(:,:)
219 character(nemsio_charkind),
allocatable :: aryrname(:)
220 integer(nemsio_intkind),
allocatable :: aryrlen(:)
221 real(nemsio_realkind),
allocatable :: aryrval(:,:)
222 character(nemsio_charkind),
allocatable :: arylname(:)
223 integer(nemsio_intkind),
allocatable :: aryllen(:)
224 logical(nemsio_logickind),
allocatable :: arylval(:,:)
225 character(nemsio_charkind),
allocatable :: arycname(:)
226 integer(nemsio_intkind),
allocatable :: aryclen(:)
227 character(nemsio_charkind),
allocatable :: arycval(:,:)
228 character(nemsio_charkind),
allocatable :: aryr8name(:)
229 integer(nemsio_intkind),
allocatable :: aryr8len(:)
230 real(nemsio_dblekind),
allocatable :: aryr8val(:,:)
232 character(255) :: gfname
233 character(nemsio_charkind8) :: gaction
234 integer(nemsio_intkind8) :: tlmeta=nemsio_intfill
235 integer(nemsio_intkind) :: fieldsize=nemsio_intfill
236 integer(nemsio_intkind) :: flunit=nemsio_intfill
237 integer(nemsio_intkind) :: headvarinum=nemsio_intfill
238 integer(nemsio_intkind) :: headvarrnum=nemsio_intfill
239 integer(nemsio_intkind) :: headvarcnum=nemsio_intfill
240 integer(nemsio_intkind) :: headvarlnum=nemsio_intfill
241 integer(nemsio_intkind) :: headaryinum=nemsio_intfill
242 integer(nemsio_intkind) :: headaryrnum=nemsio_intfill
243 integer(nemsio_intkind) :: headarycnum=nemsio_intfill
244 character(nemsio_charkind),
allocatable :: headvarcname(:)
245 character(nemsio_charkind),
allocatable :: headvariname(:)
246 character(nemsio_charkind),
allocatable :: headvarrname(:)
247 character(nemsio_charkind),
allocatable :: headvarlname(:)
248 character(nemsio_charkind),
allocatable :: headaryiname(:)
249 character(nemsio_charkind),
allocatable :: headaryrname(:)
250 character(nemsio_charkind),
allocatable :: headarycname(:)
251 integer(nemsio_intkind),
allocatable :: headvarival(:)
252 real(nemsio_realkind),
allocatable :: headvarrval(:)
253 character(nemsio_charkind),
allocatable :: headvarcval(:)
254 logical(nemsio_logickind),
allocatable :: headvarlval(:)
255 integer(nemsio_intkind),
allocatable :: headaryival(:,:)
256 real(nemsio_realkind),
allocatable :: headaryrval(:,:)
257 character(nemsio_charkind),
allocatable :: headarycval(:,:)
258 character,
allocatable :: cbuf(:)
259 integer(nemsio_intkind):: mbuf=0,nlen,nnum,mnum
260 integer(nemsio_intkind8) :: tlmetalat=nemsio_intfill
261 integer(nemsio_intkind8) :: tlmetalon=nemsio_intfill
262 integer(nemsio_intkind8) :: tlmetadx=nemsio_intfill
263 integer(nemsio_intkind8) :: tlmetady=nemsio_intfill
264 integer(nemsio_intkind8) :: tlmetavarival=nemsio_intfill
265 integer(nemsio_intkind8) :: tlmetaaryival=nemsio_intfill
266 character(16) :: file_endian=
''
267 logical :: do_byteswap=.false.
269 integer(nemsio_intkind) :: mpi_comm=nemsio_intfill
270 integer(nemsio_intkind) :: lead_task=nemsio_intfill
271 integer(nemsio_intkind) :: mype=nemsio_intfill
272 integer(nemsio_intkind) :: npes=nemsio_intfill
273 integer(nemsio_intkind) :: fh=nemsio_intfill
274 real(nemsio_realkind) :: fieldsize_real4=nemsio_realfill
275 real(nemsio_dblekind) :: fieldsize_real8=nemsio_realfill
283 character(nemsio_charkind8) :: gtype
284 character(nemsio_charkind8) :: modelname
285 character(nemsio_charkind8) :: gdatatype
286 integer(nemsio_intkind) :: version,nmeta,lmeta
287 integer(nemsio_intkind) :: reserve(3)
288 end type nemsio_meta1
292 integer(nemsio_intkind) :: nrec
293 integer(nemsio_intkind) :: idate(1:7),nfday,nfhour,nfminute,nfsecondn, &
294 nfsecondd,dimx,dimy,dimz,nframe,nsoil,ntrac,&
295 jcap,ncldt,idvc,idsl,idvm,idrt
296 real(nemsio_realkind) :: rlon_min,rlon_max,rlat_min,rlat_max
297 logical(nemsio_logickind) :: extrameta
298 end type nemsio_meta2
301 integer(nemsio_intkind) :: nmetavari,nmetavarr,nmetavarl,nmetavarc, &
302 nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
303 nmetavarr8,nmetaaryr8
304 end type nemsio_meta3
306 character(16) :: machine_endian=
'big_endian'
309 integer(nemsio_intkind) :: itypemeta1,itypemeta2
311 type :: nemsio_grbmeta
312 integer(nemsio_intkind) :: jf=nemsio_intfill
313 integer(nemsio_intkind) :: j=nemsio_kpds_intfill
314 logical*1,
allocatable :: lbms(:)
315 integer(nemsio_intkind) :: jpds(200)=nemsio_kpds_intfill
316 integer(nemsio_intkind) :: jgds(200)=nemsio_kpds_intfill
317 end type nemsio_grbmeta
320 interface nemsio_getheadvar
321 module procedure nemsio_getfheadvari
322 module procedure nemsio_getfheadvarr
323 module procedure nemsio_getfheadvarl
324 module procedure nemsio_getfheadvarc
325 module procedure nemsio_getfheadvarr8
326 module procedure nemsio_getfheadaryi
327 module procedure nemsio_getfheadaryr
328 module procedure nemsio_getfheadaryr8
329 module procedure nemsio_getfheadaryl
330 module procedure nemsio_getfheadaryc
331 end interface nemsio_getheadvar
333 interface nemsio_denseread
334 module procedure nemsio_denseread4
335 module procedure nemsio_denseread8
336 end interface nemsio_denseread
338 interface nemsio_densewrite
339 module procedure nemsio_densewrite4
340 module procedure nemsio_densewrite8
341 end interface nemsio_densewrite
344 integer(nemsio_intkind),
save :: fileunit(600:699)=0
347 public nemsio_intkind,nemsio_intkind8,nemsio_realkind,nemsio_dblekind
348 public nemsio_charkind,nemsio_charkind8,nemsio_logickind
349 public nemsio_init,nemsio_finalize,nemsio_open,nemsio_close
350 public nemsio_denseread,nemsio_densewrite
351 public nemsio_getfilehead,nemsio_getheadvar,nemsio_getrechead
355 subroutine nemsio_init(iret)
360 integer(nemsio_intkind),
optional,
intent(out):: iret
362 integer :: meta1_type(2),meta1_block(2),meta1_disp(2)
363 integer :: meta2_type(3),meta2_block(3),meta2_disp(3)
366 if (
present(iret))iret=1
371 meta1_type(1)=mpi_character
372 meta1_type(2)=mpi_integer
376 meta1_disp(2)=meta1_disp(1)+meta1_block(1)*1
377 call mpi_type_struct(2,meta1_block,meta1_disp,meta1_type, &
379 call mpi_type_commit(itypemeta1,ios)
385 meta2_type(1)=mpi_integer
386 meta2_type(2)=mpi_real
387 meta2_type(3)=mpi_logical
392 meta2_disp(2)=meta2_block(1)*4+meta2_disp(1)
393 meta2_disp(3)=meta2_block(2)*4+meta2_disp(2)
394 call mpi_type_struct(3,meta2_block,meta2_disp,meta2_type, &
396 call mpi_type_commit(itypemeta2,ios)
404 call chk_endianc(machine_endian)
405 if(trim(machine_endian)==
'mixed_endian')
then
406 call nemsio_stop(
'You are in mixed endian computer,stop!!!')
409 if(
present(iret)) iret=0
411 end subroutine nemsio_init
413 subroutine nemsio_finalize()
419 end subroutine nemsio_finalize
421 subroutine nemsio_open(gfile,gfname,gaction,mpi_comm, &
422 iret,gdatatype,version,mype,npes, &
423 nmeta,lmeta,modelname,nrec,idate,nfday,nfhour,nfminute,nfsecondn, &
425 dimx,dimy,dimz,nframe,nsoil,ntrac,jcap,ncldt,idvc,idsl,idvm,idrt, &
426 rlon_min,rlon_max,rlat_min,rlat_max,extrameta, &
427 nmetavari,nmetavarr,nmetavarl,nmetavarc, &
428 nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
429 nmetavarr8,nmetaaryr8, &
430 recname,reclevtyp,reclev,vcoord,lat,lon,dx,dy,cpi,ri, &
431 variname,varival,varrname,varrval,varlname,varlval,varcname,varcval, &
432 varr8name,varr8val, &
433 aryiname,aryilen,aryival,aryrname,aryrlen,aryrval, &
434 arylname,aryllen,arylval,arycname,aryclen,arycval, &
435 aryr8name,aryr8len,aryr8val )
440 type(nemsio_gfile),
intent(inout) :: gfile
441 character*(*),
intent(in) :: gfname
442 character*(*),
intent(in) :: gaction
443 integer,
intent(in) :: mpi_comm
447 integer(nemsio_intkind),
optional,
intent(out) :: iret
448 character*(*),
optional,
intent(in) :: gdatatype,modelname
449 integer(nemsio_intkind),
optional,
intent(in) :: version,nmeta,lmeta,nrec
450 integer,
optional,
intent(in) :: mype,npes
451 integer(nemsio_intkind),
optional,
intent(in) :: idate(7),nfday,nfhour, &
452 nfminute, nfsecondn,nfsecondd
453 integer(nemsio_logickind),
optional,
intent(in):: dimx,dimy,dimz,nframe, &
455 integer(nemsio_logickind),
optional,
intent(in):: jcap,ncldt,idvc,idsl, &
457 real(nemsio_realkind),
optional,
intent(in) :: rlat_min,rlat_max, &
459 logical(nemsio_logickind),
optional,
intent(in):: extrameta
460 integer(nemsio_intkind),
optional,
intent(in) :: nmetavari,nmetavarr, &
461 nmetavarl,nmetavarc,nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
462 nmetavarr8,nmetaaryr8
464 character*(*),
optional,
intent(in) :: recname(:),reclevtyp(:)
465 integer(nemsio_intkind),
optional,
intent(in) :: reclev(:)
466 real(nemsio_realkind),
optional,
intent(in) :: vcoord(:,:,:)
467 real(nemsio_realkind),
optional,
intent(in) :: lat(:),lon(:)
468 real(nemsio_realkind),
optional,
intent(in) :: dx(:),dy(:)
469 real(nemsio_realkind),
optional,
intent(in) :: Cpi(:),Ri(:)
471 character*(*),
optional,
intent(in) :: variname(:),varrname(:),&
472 varlname(:),varcname(:),varr8name(:),aryiname(:),aryrname(:), &
473 arylname(:),arycname(:),aryr8name(:)
474 integer(nemsio_intkind),
optional,
intent(in) :: aryilen(:),aryrlen(:), &
475 aryllen(:),aryclen(:),aryr8len(:)
476 integer(nemsio_intkind),
optional,
intent(in) :: varival(:),aryival(:,:)
477 real(nemsio_realkind),
optional,
intent(in) :: varrval(:),aryrval(:,:)
478 real(nemsio_dblekind),
optional,
intent(in) :: varr8val(:),aryr8val(:,:)
479 logical(nemsio_logickind),
optional,
intent(in):: varlval(:),arylval(:,:)
480 character(*),
optional,
intent(in) :: varcval(:),arycval(:,:)
487 if (
present(iret)) iret=-1
490 gfile%gaction=gaction
491 gfile%mpi_comm=mpi_comm
494 if(
present(mype))
then
497 call mpi_comm_rank(mpi_comm,gfile%mype,ios)
499 if (
present(iret))
then
507 if(
present(npes))
then
510 call mpi_comm_size(mpi_comm,gfile%npes,ios)
512 if (
present(iret))
then
524 if ( equal_str_nocase(trim(gaction),
"read").or. &
525 equal_str_nocase(trim(gaction),
"rdwr") )
then
529 if(equal_str_nocase(trim(gaction),
"read"))
then
530 call mpi_file_open(mpi_comm,gfname,mpi_mode_rdonly,mpi_info_null,gfile%fh,ios)
531 else if(equal_str_nocase(trim(gaction),
"rdwt"))
then
532 call mpi_file_open(mpi_comm,gfname,mpi_mode_rdwr,mpi_info_null,gfile%fh,ios)
535 if (
present(iret))
then
544 call nemsio_rcreate(gfile,ios)
547 if (
present(iret))
then
557 elseif (equal_str_nocase(trim(gaction),
"write"))
then
561 call mpi_file_open(mpi_comm,gfname,mpi_mode_create+mpi_mode_wronly, &
562 mpi_info_null,gfile%fh,ios)
565 if (
present(iret))
then
574 call nemsio_wcreate(gfile,ios,gdatatype=gdatatype, &
575 version=version, nmeta=nmeta,lmeta=lmeta,modelname=modelname, &
576 nrec=nrec,idate=idate,nfday=nfday,nfhour=nfhour,nfminute=nfminute,&
577 nfsecondn=nfsecondn, nfsecondd=nfsecondd, &
578 dimx=dimx,dimy=dimy,dimz=dimz,nframe=nframe,nsoil=nsoil, &
579 ntrac=ntrac,jcap=jcap,ncldt=ncldt,idvc=idvc,idsl=idsl, &
580 idvm=idvm,idrt=idrt, &
581 rlon_min=rlon_min,rlon_max=rlon_max,rlat_min=rlat_min, &
582 rlat_max=rlat_max,extrameta=extrameta, &
583 nmetavari=nmetavari,nmetavarr=nmetavarr,nmetavarr8=nmetavarr8,&
584 nmetavarl=nmetavarl,nmetavarc=nmetavarc, &
585 nmetaaryi=nmetaaryi,nmetaaryr=nmetaaryr,nmetaaryr8=nmetaaryr8,&
586 nmetaaryl=nmetaaryl,nmetaaryc=nmetaaryc, &
587 recname=recname,reclevtyp=reclevtyp, &
588 reclev=reclev,vcoord=vcoord,lat=lat,lon=lon,dx=dx,dy=dy, &
589 cpi=cpi,ri=ri,variname=variname,varival=varival,varrname=varrname,&
590 varrval=varrval,varlname=varlname,varlval=varlval, &
591 varcname=varcname,varcval=varcval, &
592 varr8name=varr8name,varr8val=varr8val, &
593 aryiname=aryiname,aryilen=aryilen,aryival=aryival, &
594 aryrname=aryrname,aryrlen=aryrlen,aryrval=aryrval, &
595 aryr8name=aryr8name,aryr8len=aryr8len,aryr8val=aryr8val, &
596 arylname=arylname,aryllen=aryllen,arylval=arylval, &
597 arycname=arycname,aryclen=aryclen,arycval=arycval )
599 if (
present(iret))
then
611 if (
present(iret))
then
620 if(.not.
allocated(gfile%headvariname).or. &
621 .not.
allocated(gfile%headvarrname).or. &
622 .not.
allocated(gfile%headvarcname).or. &
623 .not.
allocated(gfile%headvarlname).or. &
624 .not.
allocated(gfile%headaryiname).or. &
625 .not.
allocated(gfile%headaryrname) )
then
626 call nemsio_setfhead(gfile,ios)
627 if (
present(iret)) iret=ios
629 if (
present(iret))
return
636 end subroutine nemsio_open
638 subroutine nemsio_close(gfile,iret)
644 type(nemsio_gfile),
intent(inout) :: gfile
645 integer(nemsio_intkind),
optional,
intent(out) :: iret
646 integer(nemsio_intkind) :: ios
650 if (
present(iret) ) iret=-1
651 call mpi_file_close(gfile%fh,ios)
653 if (
present(iret))
then
662 call nemsio_axmeta(gfile,ios)
664 if (
present(iret))
then
671 if (
present(iret)) iret=0
673 end subroutine nemsio_close
675 subroutine nemsio_rcreate(gfile,iret)
680 type(nemsio_gfile),
intent(inout) :: gfile
681 integer(nemsio_intkind),
intent(out) :: iret
683 integer(nemsio_intkind) :: ios,nmeta,tlmeta4
684 integer(nemsio_intkind) :: iread
685 integer (kind=mpi_offset_kind) ::idisp
686 integer :: status(mpi_status_size)
687 type(nemsio_meta1) :: meta1
688 type(nemsio_meta2) :: meta2
689 type(nemsio_meta3) :: meta3
690 integer(nemsio_intkind) :: i,nummeta
691 character(nemsio_charkind8),
allocatable :: char8var(:)
700 call mpi_file_read_at(gfile%fh,idisp,meta1,1,itypemeta1,status,ios)
704 gfile%do_byteswap=.false.
706 if(meta1%lmeta/=120)
then
707 gfile%do_byteswap=.true.
708 if(gfile%do_byteswap)
call byteswap(meta1%version,nemsio_intkind,6)
710 gfile%gtype=meta1%gtype
711 gfile%gdatatype=meta1%gdatatype
712 gfile%modelname=meta1%modelname
713 gfile%version=meta1%version
714 gfile%nmeta=meta1%nmeta
715 gfile%lmeta=meta1%lmeta
716 gfile%tlmeta=nemsio_lmeta1+8
717 if ( trim(gfile%gdatatype(1:3)).ne.
"bin" &
718 .and. trim(gfile%gdatatype(1:4)).ne.
"grib" )
then
719 gfile%gdatatype=
"grib"
724 if ( gfile%gtype(1:6) .ne.
'NEMSIO' )
then
732 call mpi_file_read_at(gfile%fh,idisp,meta2,1,itypemeta2,status,ios)
733 if(gfile%do_byteswap)
then
734 call byteswap(meta2%nrec,nemsio_intkind,25)
735 call byteswap(meta2%rlon_min,nemsio_realkind,4)
736 call byteswap(meta2%extrameta,nemsio_logickind,1)
738 gfile%tlmeta=gfile%tlmeta+nemsio_intkind*25+nemsio_realkind*4+nemsio_logickind+8
740 gfile%nrec=meta2%nrec
741 gfile%idate(1:7)=meta2%idate(1:7)
742 gfile%nfday=meta2%nfday
743 gfile%nfhour=meta2%nfhour
744 gfile%nfminute=meta2%nfminute
745 gfile%nfsecondn=meta2%nfsecondn
746 gfile%nfsecondd=meta2%nfsecondd
747 gfile%dimx=meta2%dimx
748 gfile%dimy=meta2%dimy
749 gfile%dimz=meta2%dimz
750 gfile%nframe=meta2%nframe
751 gfile%nsoil=meta2%nsoil
752 gfile%ntrac=meta2%ntrac
753 gfile%jcap=meta2%jcap
754 gfile%ncldt=meta2%ncldt
755 gfile%idvc=meta2%idvc
756 gfile%idsl=meta2%idsl
757 gfile%idvm=meta2%idvm
758 gfile%idrt=meta2%idrt
759 gfile%rlon_min=meta2%rlon_min
760 gfile%rlon_max=meta2%rlon_max
761 gfile%rlat_min=meta2%rlat_min
762 gfile%rlat_max=meta2%rlat_max
763 gfile%extrameta=meta2%extrameta
764 gfile%fieldsize=(gfile%dimx+2*gfile%nframe)*(gfile%dimy+2*gfile%nframe)
776 call nemsio_almeta(gfile,ios)
777 if ( ios .ne. 0 )
then
787 iread=len(gfile%recname)*
size(gfile%recname)
788 call mpi_file_read_at(gfile%fh,idisp,gfile%recname,iread,mpi_character,status,ios)
790 gfile%tlmeta=gfile%tlmeta+iread+8
795 call mpi_file_read_at(gfile%fh,idisp,gfile%reclevtyp,iread,mpi_character,status,ios)
797 gfile%tlmeta=gfile%tlmeta+iread+8
802 iread=
size(gfile%reclev)
803 call mpi_file_read_at(gfile%fh,idisp,gfile%reclev,iread,mpi_integer,status,ios)
804 if(gfile%do_byteswap)
call byteswap(gfile%reclev,nemsio_intkind,
size(gfile%reclev))
806 gfile%tlmeta=gfile%tlmeta+kind(gfile%reclev)*iread+8
811 iread=
size(gfile%vcoord)
812 call mpi_file_read_at(gfile%fh,idisp,gfile%vcoord,iread,mpi_real,status,ios)
813 if(gfile%do_byteswap)
call byteswap(gfile%vcoord,nemsio_realkind,
size(gfile%vcoord))
815 gfile%tlmeta=gfile%tlmeta+kind(gfile%vcoord)*iread+8
820 iread=
size(gfile%lat)
821 call mpi_file_read_at(gfile%fh,idisp,gfile%lat,iread,mpi_real,status,ios)
822 if(gfile%do_byteswap)
call byteswap(gfile%lat,nemsio_realkind,
size(gfile%lat))
824 gfile%tlmeta=gfile%tlmeta+kind(gfile%lat)*iread+8
829 call mpi_file_read_at(gfile%fh,idisp,gfile%lon,iread,mpi_real,status,ios)
830 if(gfile%do_byteswap)
call byteswap(gfile%lon,nemsio_realkind,
size(gfile%lon))
832 gfile%tlmeta=gfile%tlmeta+kind(gfile%lon)*iread+8
837 call mpi_file_read_at(gfile%fh,idisp,gfile%dx,iread,mpi_real,status,ios)
838 if(gfile%do_byteswap)
call byteswap(gfile%dx,nemsio_realkind,
size(gfile%dx))
840 gfile%tlmeta=gfile%tlmeta+kind(gfile%dx)*iread+8
845 call mpi_file_read_at(gfile%fh,idisp,gfile%dy,iread,mpi_real,status,ios)
846 if(gfile%do_byteswap)
call byteswap(gfile%dy,nemsio_realkind,
size(gfile%dy))
848 gfile%tlmeta=gfile%tlmeta+kind(gfile%dy)*iread+8
853 iread=
size(gfile%cpi)
854 call mpi_file_read_at(gfile%fh,idisp,gfile%cpi,iread,mpi_real,status,ios)
855 if(gfile%do_byteswap)
call byteswap(gfile%cpi,nemsio_realkind,
size(gfile%cpi))
857 gfile%tlmeta=gfile%tlmeta+kind(gfile%cpi)*iread+8
862 call mpi_file_read_at(gfile%fh,idisp,gfile%ri,iread,mpi_real,status,ios)
863 if(gfile%do_byteswap)
call byteswap(gfile%ri,nemsio_realkind,
size(gfile%ri))
865 gfile%tlmeta=gfile%tlmeta+kind(gfile%ri)*iread+8
868 extrameta_if:
if(gfile%extrameta)
then
873 call mpi_file_read_at(gfile%fh,idisp,iread,1,mpi_integer,status,ios)
874 if(gfile%do_byteswap)
call byteswap(iread,nemsio_intkind,1)
877 call mpi_file_read_at(gfile%fh,idisp,meta3,10,mpi_integer,status,ios)
878 if(gfile%do_byteswap)
call byteswap(meta3,nemsio_intkind,10)
879 gfile%nmetavarr8=meta3%nmetavarr8
880 gfile%nmetaaryr8=meta3%nmetaaryr8
881 gfile%tlmeta=gfile%tlmeta+nemsio_lmeta3+8
882 elseif(iread/4==8)
then
883 call mpi_file_read_at(gfile%fh,idisp,meta3,8,mpi_integer,status,ios)
884 if(gfile%do_byteswap)
call byteswap(meta3,nemsio_intkind,8)
885 gfile%tlmeta=gfile%tlmeta+nemsio_lmeta3
887 gfile%nmetavari=meta3%nmetavari
888 gfile%nmetavarr=meta3%nmetavarr
889 gfile%nmetavarl=meta3%nmetavarl
890 gfile%nmetavarc=meta3%nmetavarc
891 gfile%nmetaaryi=meta3%nmetaaryi
892 gfile%nmetaaryr=meta3%nmetaaryr
893 gfile%nmetaaryl=meta3%nmetaaryl
894 gfile%nmetaaryc=meta3%nmetaaryc
901 call nemsio_alextrameta(gfile,ios)
902 if ( ios .ne. 0 )
then
908 if (gfile%nmetavari.gt.0)
then
910 iread=len(gfile%variname)*gfile%nmetavari
911 call mpi_file_read_at(gfile%fh,idisp,gfile%variname,iread,mpi_character,status,ios)
912 gfile%tlmeta=gfile%tlmeta+iread+8
915 iread=gfile%nmetavari
916 call mpi_file_read_at(gfile%fh,idisp,gfile%varival,iread,mpi_integer,status,ios)
917 if(gfile%do_byteswap) &
918 call byteswap(gfile%varival,nemsio_intkind,iread)
919 gfile%tlmetavarival=gfile%tlmeta
920 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
924 if (gfile%nmetavarr.gt.0)
then
926 iread=len(gfile%varrname)*gfile%nmetavarr
927 call mpi_file_read_at(gfile%fh,idisp,gfile%varrname,iread,mpi_character,status,ios)
928 gfile%tlmeta=gfile%tlmeta+iread+8
931 iread=gfile%nmetavarr
932 call mpi_file_read_at(gfile%fh,idisp,gfile%varrval,iread,mpi_real,status,ios)
933 if(gfile%do_byteswap) &
934 call byteswap(gfile%varrval,nemsio_realkind,iread)
935 gfile%tlmeta=gfile%tlmeta+iread*nemsio_realkind+8
939 if (gfile%nmetavarl.gt.0)
then
941 iread=len(gfile%varlname)*gfile%nmetavarl
942 call mpi_file_read_at(gfile%fh,idisp,gfile%varlname,iread,mpi_character,status,ios)
943 gfile%tlmeta=gfile%tlmeta+iread+8
946 iread=gfile%nmetavarl
947 call mpi_file_read_at(gfile%fh,idisp,gfile%varlval,iread,mpi_logical,status,ios)
948 if(gfile%do_byteswap) &
949 call byteswap(gfile%varlval,nemsio_logickind,iread)
950 gfile%tlmeta=gfile%tlmeta+iread*nemsio_logickind+8
954 if (gfile%nmetavarc.gt.0)
then
956 iread=len(gfile%varcname)*gfile%nmetavarc
957 call mpi_file_read_at(gfile%fh,idisp,gfile%varcname,iread,mpi_character,status,ios)
958 gfile%tlmeta=gfile%tlmeta+iread+8
961 iread=len(gfile%varcname)*gfile%nmetavarc
962 call mpi_file_read_at(gfile%fh,idisp,gfile%varcval,iread,mpi_character,status,ios)
963 gfile%tlmeta=gfile%tlmeta+iread+8
966 if (gfile%nmetavarr8.gt.0)
then
968 iread=len(gfile%varr8name)*gfile%nmetavarr8
969 call mpi_file_read_at(gfile%fh,idisp,gfile%varr8name,iread,mpi_character,status,ios)
970 gfile%tlmeta=gfile%tlmeta+iread+8
973 iread=gfile%nmetavarr8
974 call mpi_file_read_at(gfile%fh,idisp,gfile%varr8val,iread,mpi_real8,status,ios)
975 if(gfile%do_byteswap) &
976 call byteswap(gfile%varr8val,nemsio_dblekind,iread)
977 gfile%tlmeta=gfile%tlmeta+iread*nemsio_dblekind+8
981 if (gfile%nmetaaryi.gt.0)
then
983 iread=len(gfile%aryiname)*gfile%nmetaaryi
984 call mpi_file_read_at(gfile%fh,idisp,gfile%aryiname,iread,mpi_character,status,ios)
985 gfile%tlmeta=gfile%tlmeta+iread+8
988 iread=gfile%nmetaaryi
989 call mpi_file_read_at(gfile%fh,idisp,gfile%aryilen,iread,mpi_integer,status,ios)
990 if(gfile%do_byteswap) &
991 call byteswap(gfile%aryilen,nemsio_intkind,iread)
992 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
994 allocate(gfile%aryival(maxval(gfile%aryilen),gfile%nmetaaryi))
995 do i=1,gfile%nmetaaryi
997 iread=gfile%aryilen(i)
998 call mpi_file_read_at(gfile%fh,idisp,gfile%aryival(1:iread,i),iread,mpi_integer,status,ios)
999 if(gfile%do_byteswap) &
1000 call byteswap(gfile%aryival(:,i),nemsio_intkind,iread)
1001 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
1005 if (gfile%nmetaaryr.gt.0)
then
1006 idisp=gfile%tlmeta+4
1007 iread=len(gfile%aryrname)*gfile%nmetaaryr
1008 call mpi_file_read_at(gfile%fh,idisp,gfile%aryrname,iread,mpi_character,status,ios)
1009 gfile%tlmeta=gfile%tlmeta+iread+8
1011 idisp=gfile%tlmeta+4
1012 iread=gfile%nmetaaryr
1013 call mpi_file_read_at(gfile%fh,idisp,gfile%aryrlen,iread,mpi_integer,status,ios)
1014 if(gfile%do_byteswap) &
1015 call byteswap(gfile%aryrlen,nemsio_intkind,iread)
1016 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
1018 allocate(gfile%aryrval(maxval(gfile%aryrlen),gfile%nmetaaryr))
1019 do i=1,gfile%nmetaaryr
1020 idisp=gfile%tlmeta+4
1021 iread=gfile%aryrlen(i)
1022 call mpi_file_read_at(gfile%fh,idisp,gfile%aryrval(1:iread,i),iread,mpi_real,status,ios)
1023 if(gfile%do_byteswap) &
1024 call byteswap(gfile%aryrval(1:iread,i),nemsio_realkind,iread)
1025 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
1029 if (gfile%nmetaaryl.gt.0)
then
1030 idisp=gfile%tlmeta+4
1031 iread=len(gfile%arylname)*gfile%nmetaaryl
1032 call mpi_file_read_at(gfile%fh,idisp,gfile%arylname,iread,mpi_character,status,ios)
1033 gfile%tlmeta=gfile%tlmeta+iread+8
1035 idisp=gfile%tlmeta+4
1036 iread=gfile%nmetaaryl
1037 call mpi_file_read_at(gfile%fh,idisp,gfile%aryllen,iread,mpi_integer,status,ios)
1038 if(gfile%do_byteswap) &
1039 call byteswap(gfile%aryllen,nemsio_intkind,iread)
1040 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
1042 allocate(gfile%arylval(maxval(gfile%aryllen),gfile%nmetaaryl))
1043 do i=1,gfile%nmetaaryl
1044 idisp=gfile%tlmeta+4
1045 iread=gfile%aryllen(i)
1046 call mpi_file_read_at(gfile%fh,idisp,gfile%arylval(1:iread,i),iread,mpi_logical,status,ios)
1047 if(gfile%do_byteswap) &
1048 call byteswap(gfile%arylval(1:iread,i),nemsio_logickind,iread)
1049 gfile%tlmeta=gfile%tlmeta+iread*nemsio_logickind+8
1053 if (gfile%nmetaaryc.gt.0)
then
1054 idisp=gfile%tlmeta+4
1055 iread=len(gfile%arycname)*gfile%nmetaaryc
1056 call mpi_file_read_at(gfile%fh,idisp,gfile%arycname,iread,mpi_character,status,ios)
1057 gfile%tlmeta=gfile%tlmeta+iread+8
1059 idisp=gfile%tlmeta+4
1060 iread=gfile%nmetaaryc
1061 call mpi_file_read_at(gfile%fh,idisp,gfile%aryclen,iread,mpi_integer,status,ios)
1062 if(gfile%do_byteswap) &
1063 call byteswap(gfile%aryclen,nemsio_intkind,gfile%nmetaaryc)
1064 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
1066 allocate(gfile%arycval(maxval(gfile%aryclen),gfile%nmetaaryc))
1067 do i=1,gfile%nmetaaryc
1068 idisp=gfile%tlmeta+4
1069 iread=gfile%aryclen(i)*len(gfile%arycval)
1070 call mpi_file_read_at(gfile%fh,idisp,gfile%arycval(1:iread,i),iread,mpi_character,status,ios)
1071 gfile%tlmeta=gfile%tlmeta+iread+8
1075 if (gfile%nmetaaryr8.gt.0)
then
1076 idisp=gfile%tlmeta+4
1077 iread=len(gfile%aryr8name)*gfile%nmetaaryr8
1078 call mpi_file_read_at(gfile%fh,idisp,gfile%aryr8name,iread,mpi_character,status,ios)
1079 gfile%tlmeta=gfile%tlmeta+iread+8
1081 idisp=gfile%tlmeta+4
1082 iread=gfile%nmetaaryr8
1083 call mpi_file_read_at(gfile%fh,idisp,gfile%aryr8len,iread,mpi_integer,status,ios)
1084 if(gfile%do_byteswap) &
1085 call byteswap(gfile%aryr8len,nemsio_intkind,iread)
1086 gfile%tlmeta=gfile%tlmeta+iread*nemsio_intkind+8
1088 allocate(gfile%aryr8val(maxval(gfile%aryr8len),gfile%nmetaaryr8))
1089 do i=1,gfile%nmetaaryr8
1090 idisp=gfile%tlmeta+4
1091 iread=gfile%aryr8len(i)
1092 call mpi_file_read_at(gfile%fh,idisp,gfile%aryr8val(1:iread,i),iread,mpi_real,status,ios)
1093 if(gfile%do_byteswap) &
1094 call byteswap(gfile%aryr8val(1:iread,i),nemsio_dblekind,iread)
1095 gfile%tlmeta=gfile%tlmeta+iread*nemsio_dblekind+8
1102 call mpi_barrier(gfile%mpi_comm, ios)
1105 end subroutine nemsio_rcreate
1107 subroutine nemsio_wcreate(gfile,iret,gdatatype,version, &
1108 nmeta,lmeta,modelname,nrec,idate,nfday,nfhour,nfminute,nfsecondn, &
1110 dimx,dimy,dimz,nframe,nsoil,ntrac,jcap,ncldt,idvc,idsl,idvm,idrt, &
1111 rlon_min,rlon_max,rlat_min,rlat_max,extrameta, &
1112 nmetavari,nmetavarr,nmetavarl,nmetavarc,nmetavarr8, &
1113 nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc,nmetaaryr8, &
1114 recname,reclevtyp,reclev,vcoord,lat,lon,dx,dy,cpi,ri, &
1115 variname,varival,varrname,varrval,varlname,varlval,varcname,varcval, &
1116 varr8name,varr8val, &
1117 aryiname,aryilen,aryival,aryrname,aryrlen,aryrval, &
1118 arylname,aryllen,arylval,arycname,aryclen,arycval, &
1119 aryr8name,aryr8len,aryr8val )
1124 type(nemsio_gfile),
intent(inout) :: gfile
1125 integer(nemsio_intkind),
intent(out) :: iret
1127 character*(*),
optional,
intent(in) :: gdatatype,modelname
1128 integer(nemsio_intkind),
optional,
intent(in) :: version,nmeta,lmeta,nrec
1129 integer(nemsio_intkind),
optional,
intent(in) :: idate(7),nfday,nfhour, &
1130 nfminute,nfsecondn,nfsecondd
1131 integer(nemsio_logickind),
optional,
intent(in):: dimx,dimy,dimz,nframe, &
1133 integer(nemsio_logickind),
optional,
intent(in):: jcap,ncldt,idvc,idsl, &
1135 real(nemsio_realkind),
optional,
intent(in) :: rlat_min,rlat_max, &
1137 logical(nemsio_logickind),
optional,
intent(in):: extrameta
1138 integer(nemsio_intkind),
optional,
intent(in) :: nmetavari,nmetavarr, &
1139 nmetavarl,nmetavarc,nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc, &
1140 nmetavarr8,nmetaaryr8
1142 character*(*),
optional,
intent(in) :: recname(:),reclevtyp(:)
1143 integer(nemsio_intkind),
optional,
intent(in) :: reclev(:)
1144 real(nemsio_realkind),
optional,
intent(in) :: vcoord(:,:,:)
1145 real(nemsio_realkind),
optional,
intent(in) :: lat(:),lon(:)
1146 real(nemsio_realkind),
optional,
intent(in) :: dx(:),dy(:)
1147 real(nemsio_realkind),
optional,
intent(in) :: Cpi(:),Ri(:)
1149 character*(*),
optional,
intent(in) :: variname(:),varrname(:),&
1150 varlname(:),varcname(:),varr8name(:),aryiname(:),aryrname(:), &
1151 arylname(:),arycname(:),aryr8name(:)
1152 integer(nemsio_intkind),
optional,
intent(in) :: aryilen(:),aryrlen(:), &
1153 aryllen(:),aryclen(:),aryr8len(:)
1154 integer(nemsio_intkind),
optional,
intent(in) :: varival(:),aryival(:,:)
1155 real(nemsio_realkind),
optional,
intent(in) :: varrval(:),aryrval(:,:)
1156 real(nemsio_dblekind),
optional,
intent(in) :: varr8val(:),aryr8val(:,:)
1157 logical(nemsio_logickind),
optional,
intent(in):: varlval(:),arylval(:,:)
1158 character(*),
optional,
intent(in) :: varcval(:),arycval(:,:)
1162 real(nemsio_realkind) :: radi
1163 integer(nemsio_intkind) :: iwrite,nwrite
1164 type(nemsio_meta1) :: meta1
1165 type(nemsio_meta2) :: meta2
1166 type(nemsio_meta3) :: meta3
1167 integer(nemsio_intkind) :: i,n,ios,nummeta
1168 integer :: status(MPI_STATUS_SIZE)
1169 integer (kind=mpi_offset_kind) :: idisp
1175 gfile%gtype=
"NEMSIO"
1176 gfile%do_byteswap=.false.
1177 if(
present(gdatatype))
then
1178 if ( trim(gdatatype).ne.
'grib'.and.gdatatype(1:3).ne.
'bin'.and. &
1179 trim(gdatatype).ne.
'')
return
1180 gfile%gdatatype=gdatatype
1181 if(trim(gdatatype)==
'') gfile%gdatatype=
'grib'
1182 if(index(gfile%gdatatype,
'_be')>0)
then
1183 gfile%file_endian=
'big_endian'
1184 elseif(index(gfile%gdatatype,
'_le')>0)
then
1185 gfile%file_endian=
'little_endian'
1187 gfile%file_endian=machine_endian
1189 if(trim(machine_endian)/=trim(gfile%file_endian)) gfile%do_byteswap=.true.
1190 elseif(trim(gfile%gdatatype).eq.
'')
then
1191 gfile%gdatatype=
'grib'
1196 if(
present(modelname))
then
1197 gfile%modelname=modelname
1199 gfile%modelname=
"GFS"
1204 if(
present(version)) gfile%version=version
1205 if(
present(dimx)) gfile%dimx=dimx
1206 if(
present(dimy)) gfile%dimy=dimy
1207 if(
present(dimz)) gfile%dimz=dimz
1208 if(
present(nrec)) gfile%nrec=nrec
1209 if(
present(nmeta)) gfile%nmeta=nmeta
1210 if(gfile%nmeta==nemsio_intfill) gfile%nmeta=12
1211 if(
present(lmeta)) gfile%lmeta=lmeta
1212 if(gfile%lmeta==nemsio_intfill) &
1213 gfile%lmeta=25*nemsio_intkind+4*nemsio_realkind+nemsio_logickind
1214 if(
present(nsoil)) gfile%nsoil=nsoil
1215 if(gfile%nsoil.eq.nemsio_intfill) gfile%nsoil=4
1216 if(
present(nframe)) gfile%nframe=nframe
1217 if(gfile%nframe.eq.nemsio_intfill) gfile%nframe=0
1218 if(trim(gfile%modelname)==
'GFS')gfile%nframe=0
1219 if(
present(idate)) gfile%idate=idate
1220 if ( gfile%idate(1) .lt. 50)
then
1221 gfile%idate(1)=2000+gfile%idate(1)
1222 else if (gfile%idate(1) .lt. 100)
then
1223 gfile%idate(1)=1999+gfile%idate(1)
1225 if ( gfile%idate(1).eq.nemsio_intfill)
then
1226 print *,
'idate=',gfile%idate,
' WRONG: please provide idate(1:7)(yyyy/mm/dd/hh/min/secn/secd)!!!'
1230 if ( gfile%gtype(1:6).eq.
"NEMSIO" )
then
1231 call nemsio_gfinit(gfile,ios,recname=recname,reclevtyp=reclevtyp,reclev=reclev)
1232 if (ios .ne.0 )
then
1242 if(
present(nfday)) gfile%nfday=nfday
1243 if(
present(nfhour)) gfile%nfhour=nfhour
1244 if(
present(nfminute)) gfile%nfminute=nfminute
1245 if(
present(nfsecondn)) gfile%nfsecondn=nfsecondn
1246 if(
present(nfsecondd)) gfile%nfsecondd=nfsecondd
1247 if(
present(ntrac)) gfile%ntrac=ntrac
1248 if(gfile%ntrac.eq.nemsio_intfill) gfile%ntrac=0
1249 if(
present(ncldt)) gfile%ncldt=ncldt
1250 if(
present(jcap)) gfile%jcap=jcap
1251 if(
present(idvc)) gfile%idvc=idvc
1252 if(
present(idsl)) gfile%idsl=idsl
1253 if(
present(idvm)) gfile%idvm=idvm
1254 if(
present(idrt)) gfile%idrt=idrt
1255 if(
present(rlon_min)) gfile%rlon_min=rlon_min
1256 if(
present(rlon_max)) gfile%rlon_max=rlon_max
1257 if(
present(rlat_min)) gfile%rlat_min=rlat_min
1258 if(
present(rlat_max)) gfile%rlat_max=rlat_max
1259 if(
present(extrameta)) gfile%extrameta=extrameta
1260 if(gfile%fieldsize.eq.nemsio_intfill) &
1261 gfile%fieldsize=(gfile%dimx+2*gfile%nframe)*(gfile%dimy+2*gfile%nframe)
1262 if(gfile%mype.eq.gfile%lead_task)
then
1263 if(gfile%gdatatype(1:4).eq.
'bin4')
then
1264 call mpi_send(gfile%fieldsize*nemsio_realkind,1,mpi_integer,0,99,gfile%mpi_comm,ios)
1265 call mpi_recv(gfile%fieldsize_real4,1,mpi_real4,0,99,gfile%mpi_comm,status,ios)
1266 elseif(gfile%gdatatype(1:4).eq.
'bin8')
then
1267 call mpi_send(gfile%fieldsize*nemsio_dblekind,1,mpi_integer,0,99,gfile%mpi_comm,ios)
1268 call mpi_recv(gfile%fieldsize_real8,1,mpi_real8,0,99,gfile%mpi_comm,status,ios)
1276 if(gfile%mype.eq.gfile%lead_task)
then
1278 if( gfile%extrameta )
then
1279 if(
present(nmetavari).and.
present(variname).and.
present(varival))
then
1280 if(nmetavari.gt.0 .and.
size(variname).eq.nmetavari .and. &
1281 size(varival).eq.nmetavari)
then
1282 gfile%nmetavari=nmetavari
1283 if(
allocated(gfile%variname))
deallocate(gfile%variname)
1284 if(
allocated(gfile%varival))
deallocate(gfile%varival)
1285 allocate(gfile%variname(nmetavari),gfile%varival(nmetavari))
1286 gfile%variname=variname
1287 gfile%varival=varival
1290 if(
present(nmetavarr).and.
present(varrname).and.
present(varrval))
then
1291 if( nmetavarr.gt.0.and.
size(varrname).eq.nmetavarr .and. &
1292 size(varrval).eq.nmetavarr)
then
1293 gfile%nmetavarr=nmetavarr
1294 if(
allocated(gfile%varrname))
deallocate(gfile%varrname)
1295 if(
allocated(gfile%varrval))
deallocate(gfile%varrval)
1296 allocate(gfile%varrname(nmetavarr),gfile%varrval(nmetavarr))
1297 gfile%varrname=varrname
1298 gfile%varrval=varrval
1301 if(
present(nmetavarl).and.
present(varlname).and.
present(varlval))
then
1302 if( nmetavarl.gt.0.and.
size(varlname).eq.nmetavarl .and. &
1303 size(varlval).eq.nmetavarl)
then
1304 gfile%nmetavarl=nmetavarl
1305 if(
allocated(gfile%varlname))
deallocate(gfile%varlname)
1306 if(
allocated(gfile%varlval))
deallocate(gfile%varlval)
1307 allocate(gfile%varlname(nmetavarl),gfile%varlval(nmetavarl))
1308 gfile%varlname=varlname
1309 gfile%varlval=varlval
1312 if(
present(nmetavarc).and.
present(varcname).and.
present(varcval))
then
1313 if( nmetavarc.gt.0.and.
size(varcname).eq.nmetavarc .and. &
1314 size(varcval).eq.nmetavarc)
then
1315 gfile%nmetavarc=nmetavarc
1316 if(
allocated(gfile%varcname))
deallocate(gfile%varcname)
1317 if(
allocated(gfile%varcval))
deallocate(gfile%varcval)
1318 allocate(gfile%varcname(nmetavarc),gfile%varcval(nmetavarc))
1319 gfile%varcname=varcname
1320 gfile%varcval=varcval
1323 if(
present(nmetavarr8).and.
present(varr8name).and.
present(varr8val))
then
1324 if( nmetavarr8.gt.0.and.
size(varr8name).eq.nmetavarr8 .and. &
1325 size(varr8val).eq.nmetavarr8)
then
1326 gfile%nmetavarr8=nmetavarr8
1327 if(
allocated(gfile%varr8name))
deallocate(gfile%varr8name)
1328 if(
allocated(gfile%varr8val))
deallocate(gfile%varr8val)
1329 allocate(gfile%varr8name(nmetavarr8),gfile%varr8val(nmetavarr8))
1330 gfile%varr8name=varr8name
1331 gfile%varr8val=varr8val
1334 if(
present(nmetaaryi).and.
present(aryiname).and.
present(aryilen))
then
1335 if( nmetaaryi.gt.0.and.
size(aryiname).eq.nmetaaryi .and. &
1336 size(aryilen).eq.nmetaaryi)
then
1337 gfile%nmetaaryi=nmetaaryi
1338 if(
allocated(gfile%aryiname))
deallocate(gfile%aryiname)
1339 if(
allocated(gfile%aryilen))
deallocate(gfile%aryilen)
1340 allocate(gfile%aryiname(nmetaaryi),gfile%aryilen(nmetaaryi))
1341 gfile%aryiname=aryiname
1342 gfile%aryilen=aryilen
1343 if(
present(aryival))
then
1344 if(
size(aryival).eq.nmetaaryi*maxval(gfile%aryilen) )
then
1345 if(
allocated(gfile%aryival))
deallocate(gfile%aryival)
1346 allocate(gfile%aryival(maxval(gfile%aryilen),nmetaaryi))
1347 gfile%aryival=aryival
1352 if(
present(nmetaaryr).and.
present(aryrname).and.
present(aryrlen))
then
1353 if( nmetaaryr.gt.0.and.
size(aryrname).eq.nmetaaryr .and. &
1354 size(aryrlen).eq.nmetaaryr)
then
1355 gfile%nmetaaryr=nmetaaryr
1356 if(
allocated(gfile%aryrname))
deallocate(gfile%aryrname)
1357 if(
allocated(gfile%aryrlen))
deallocate(gfile%aryrlen)
1358 allocate(gfile%aryrname(nmetaaryr),gfile%aryrlen(nmetaaryr))
1359 gfile%aryrname=aryrname
1360 gfile%aryrlen=aryrlen
1361 if(
present(aryrval) )
then
1362 if(
size(aryrval).eq.nmetaaryr*maxval(gfile%aryrlen))
then
1363 if(
allocated(gfile%aryrval))
deallocate(gfile%aryrval)
1364 allocate(gfile%aryrval(maxval(gfile%aryrlen),nmetaaryr))
1365 gfile%aryrval=aryrval
1370 if(
present(nmetaaryl).and.
present(arylname).and.
present(aryllen))
then
1371 if( nmetaaryl.gt.0 .and.
size(arylname).eq.nmetaaryl .and. &
1372 size(aryllen).eq.nmetaaryl)
then
1373 gfile%nmetaaryl=nmetaaryl
1374 if(
allocated(gfile%arylname))
deallocate(gfile%arylname)
1375 if(
allocated(gfile%aryllen))
deallocate(gfile%aryllen)
1376 allocate(gfile%arylname(nmetaaryl),gfile%aryllen(nmetaaryl))
1377 gfile%arylname=arylname
1378 gfile%aryllen=aryllen
1379 if(
present(arylval))
then
1380 if(
size(arylval).eq.nmetaaryl*maxval(gfile%aryllen))
then
1381 if(
allocated(gfile%arylval))
deallocate(gfile%arylval)
1382 allocate(gfile%arylval(maxval(gfile%aryllen),nmetaaryl))
1383 gfile%arylval=arylval
1388 if(
present(nmetaaryc).and.
present(arycname).and.
present(aryclen))
then
1389 if( nmetaaryc.gt.0 .and.
size(arycname).eq.nmetaaryc .and. &
1390 size(aryclen).eq.nmetaaryc)
then
1391 gfile%nmetaaryc=nmetaaryc
1392 if(
allocated(gfile%arycname))
deallocate(gfile%arycname)
1393 if(
allocated(gfile%aryclen))
deallocate(gfile%aryclen)
1394 allocate(gfile%arycname(nmetaaryc),gfile%aryclen(nmetaaryc))
1395 gfile%arycname=arycname
1396 gfile%aryclen=aryclen
1397 if(
present(arycval))
then
1398 if(
size(arycval).eq.nmetaaryc*maxval(gfile%aryclen))
then
1399 if(
allocated(gfile%arycval))
deallocate(gfile%arycval)
1400 allocate(gfile%arycval(maxval(gfile%aryclen),nmetaaryc))
1401 gfile%arycval=arycval
1406 if(
present(nmetaaryr8).and.
present(aryr8name).and.
present(aryr8len))
then
1407 if( nmetaaryr8.gt.0.and.
size(aryr8name).eq.nmetaaryr8 .and. &
1408 size(aryr8len).eq.nmetaaryr8)
then
1409 gfile%nmetaaryr8=nmetaaryr8
1410 if(
allocated(gfile%aryr8name))
deallocate(gfile%aryr8name)
1411 if(
allocated(gfile%aryr8len))
deallocate(gfile%aryr8len)
1412 allocate(gfile%aryr8name(nmetaaryr8),gfile%aryr8len(nmetaaryr8))
1413 gfile%aryr8name=aryr8name
1414 gfile%aryr8len=aryr8len
1415 if(
present(aryr8val) )
then
1416 if(
size(aryr8val).eq.nmetaaryr8*maxval(gfile%aryr8len))
then
1417 if(
allocated(gfile%aryr8val))
deallocate(gfile%aryr8val)
1418 allocate(gfile%aryr8val(maxval(gfile%aryr8len),nmetaaryr8))
1419 gfile%aryr8val=aryr8val
1424 if (gfile%nmetavari+gfile%nmetavarr+gfile%nmetavarl+gfile%nmetavarc+ &
1425 gfile%nmetaaryi+gfile%nmetaaryr+gfile%nmetaaryl+gfile%nmetaaryc+ &
1426 gfile%nmetavarr8+gfile%nmetaaryr8 .lt.10*nemsio_intfill )
then
1427 print *,
'WRONG: gfile%extrameta is not compatiable with input extra meta!'
1435 call nemsio_chkgfary(gfile,ios)
1446 if(
present(recname) )
then
1447 if (gfile%nrec.eq.
size(recname))
then
1448 gfile%recname=recname
1450 print *,
'WRONG: the size of recname is not equal to the total number of the fields in the file!'
1456 if(
present(reclevtyp))
then
1457 if (gfile%nrec.eq.
size(reclevtyp))
then
1458 gfile%reclevtyp=reclevtyp
1460 print *,
'WRONG: the size of reclevtyp is not equal to the total number of the fields in the file!'
1466 if(
present(reclev) )
then
1467 if (gfile%nrec.eq.
size(reclev))
then
1470 print *,
'WRONG: the size of reclev is not equal to the total number of the fields in the file!'
1476 if(
present(vcoord) )
then
1477 if ((gfile%dimz+1)*3*2.eq.
size(vcoord))
then
1480 print *,
'WRONG: the size of vcoord is not (lm+1,3,2) !'
1486 if(
present(lat) )
then
1487 if (gfile%fieldsize.eq.
size(lat))
then
1488 if(.not.(all(lat==0.))) gfile%lat=lat
1490 print *,
'WRONG: the input size(lat) ',
size(lat),
' is not equal to: ',gfile%fieldsize
1495 if(
allocated(gfile%lat))
then
1496 gfile%rlat_max=maxval(gfile%lat)
1497 gfile%rlat_min=minval(gfile%lat)
1500 if(
present(lon) )
then
1501 if (gfile%fieldsize.eq.
size(lon))
then
1502 if(.not.(all(lon==0.)) ) gfile%lon=lon
1504 print *,
'WRONG: the input size(lon) ',
size(lon),
' is not equal to: ',gfile%fieldsize
1509 if(
allocated(gfile%lon))
then
1510 gfile%rlon_max=maxval(gfile%lon)
1511 gfile%rlon_min=minval(gfile%lon)
1514 if(
present(dx) )
then
1515 if (gfile%fieldsize.eq.
size(dx))
then
1516 if(.not.(all(dx==0.)) ) gfile%dx=dx
1518 print *,
'WRONG: the input size(dx) ',
size(dx),
' is not equal to: ',gfile%fieldsize
1524 if(
present(dy) )
then
1525 if (gfile%fieldsize.eq.
size(dy))
then
1526 if(.not.(all(dy==0.)) ) gfile%dy=dy
1528 print *,
'WRONG: the input size(dy) ',
size(dy),
' is not equal to: ',gfile%fieldsize
1534 if(
present(cpi) )
then
1535 if (gfile%ntrac+1.eq.
size(gfile%Cpi))
then
1536 if(.not.(all(cpi==0.))) gfile%Cpi = cpi
1538 print *,
'WRONG: the input size(cpi) ',
size(cpi),
' is not equal to: ',gfile%ntrac+1
1544 if(
present(ri) )
then
1545 if (gfile%ntrac+1.eq.
size(gfile%Ri))
then
1546 if(.not.(all(ri==0.))) gfile%Ri = ri
1548 print *,
'WRONG: the input size(ri) ',
size(ri),
' is not equal to: ',gfile%ntrac+1
1553 if(gfile%nmeta==nemsio_intfill) gfile%nmeta=nummeta
1560 meta1%gtype=gfile%gtype
1561 meta1%gdatatype=gfile%gdatatype
1562 meta1%modelname=gfile%modelname
1563 meta1%version=gfile%version
1564 meta1%nmeta=gfile%nmeta
1565 meta1%lmeta=gfile%lmeta
1568 iwrite=nemsio_lmeta1
1569 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1570 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1572 if(gfile%do_byteswap)
call byteswap(meta1%version,nemsio_intkind,6)
1573 call mpi_file_write_at(gfile%fh,idisp,meta1,1,itypemeta1,status,ios)
1574 if(gfile%do_byteswap)
call byteswap(meta1%version,nemsio_intkind,6)
1575 idisp=4+nemsio_lmeta1
1576 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1577 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1578 gfile%tlmeta=nemsio_lmeta1+8
1582 meta2%nrec=gfile%nrec
1583 meta2%idate(1:7)=gfile%idate(1:7)
1584 meta2%nfday=gfile%nfday
1585 meta2%nfhour=gfile%nfhour
1586 meta2%nfminute=gfile%nfminute
1587 meta2%nfsecondn=gfile%nfsecondn
1588 meta2%nfsecondd=gfile%nfsecondd
1589 meta2%dimx=gfile%dimx
1590 meta2%dimy=gfile%dimy
1591 meta2%dimz=gfile%dimz
1592 meta2%nframe=gfile%nframe
1593 meta2%nsoil=gfile%nsoil
1594 meta2%ntrac=gfile%ntrac
1595 meta2%jcap=gfile%jcap
1596 meta2%ncldt=gfile%ncldt
1597 meta2%idvc=gfile%idvc
1598 meta2%idsl=gfile%idsl
1599 meta2%idvm=gfile%idvm
1600 meta2%idrt=gfile%idrt
1601 meta2%rlon_min=gfile%rlon_min
1602 meta2%rlon_max=gfile%rlon_max
1603 meta2%rlat_min=gfile%rlat_min
1604 meta2%rlat_max=gfile%rlat_max
1605 meta2%extrameta=gfile%extrameta
1608 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1609 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1610 if(gfile%do_byteswap)
then
1611 call byteswap(meta2%nrec,nemsio_intkind,25)
1612 call byteswap(meta2%rlon_min,nemsio_realkind,4)
1613 call byteswap(meta2%extrameta,nemsio_logickind,1)
1616 call mpi_file_write_at(gfile%fh,idisp,meta2,1,itypemeta2,status,ios)
1617 if(gfile%do_byteswap)
then
1618 call byteswap(meta2%nrec,nemsio_intkind,25)
1619 call byteswap(meta2%rlon_min,nemsio_realkind,4)
1620 call byteswap(meta2%extrameta,nemsio_logickind,1)
1622 idisp=idisp+gfile%lmeta
1623 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1624 gfile%tlmeta=gfile%tlmeta+gfile%lmeta+8
1637 iwrite=nemsio_charkind*
size(gfile%recname)
1638 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1639 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1641 call mpi_file_write_at(gfile%fh,idisp,gfile%recname,iwrite,mpi_character,status,ios)
1643 idisp=idisp+nemsio_charkind*
size(gfile%recname)
1644 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1645 gfile%tlmeta=gfile%tlmeta+nemsio_charkind*
size(gfile%recname)+8
1650 iwrite=nemsio_charkind*
size(gfile%reclevtyp)
1651 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1652 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1654 call mpi_file_write_at(gfile%fh,idisp,gfile%reclevtyp,iwrite,mpi_character,status,ios)
1656 idisp=idisp+nemsio_charkind*
size(gfile%recname)
1657 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1658 gfile%tlmeta=gfile%tlmeta+nemsio_charkind*
size(gfile%reclevtyp)+8
1663 iwrite=nemsio_intkind*
size(gfile%reclev)
1664 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1665 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1667 if(gfile%do_byteswap)
call byteswap(gfile%reclev,nemsio_intkind,
size(gfile%reclev))
1668 call mpi_file_write_at(gfile%fh,idisp,gfile%reclev,
size(gfile%reclev),mpi_integer,status,ios)
1670 idisp=idisp+nemsio_intkind*
size(gfile%reclev)
1671 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1672 gfile%tlmeta=gfile%tlmeta+nemsio_intkind*
size(gfile%reclev)+8
1675 if ( nummeta>5 )
then
1677 iwrite=nemsio_realkind*
size(gfile%vcoord)
1678 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1679 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1681 if(gfile%do_byteswap)
call byteswap(gfile%vcoord,nemsio_realkind,
size(gfile%vcoord))
1682 call mpi_file_write_at(gfile%fh,idisp,gfile%vcoord,
size(gfile%vcoord),mpi_real,status,ios)
1684 if(gfile%do_byteswap)
call byteswap(gfile%vcoord,nemsio_realkind,
size(gfile%vcoord))
1685 idisp=idisp+nemsio_realkind*
size(gfile%vcoord)
1686 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1687 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%vcoord)+8
1690 if ( nummeta>6 )
then
1692 iwrite=nemsio_realkind*
size(gfile%lat)
1693 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1694 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1696 if(gfile%do_byteswap)
call byteswap(gfile%lat,nemsio_realkind,
size(gfile%lat))
1697 call mpi_file_write_at(gfile%fh,idisp,gfile%lat,gfile%fieldsize,mpi_real,status,ios)
1699 if(gfile%do_byteswap)
call byteswap(gfile%lat,nemsio_realkind,
size(gfile%lat))
1700 idisp=idisp+nemsio_realkind*
size(gfile%lat)
1701 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1702 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%lat)+8
1705 if ( nummeta>7 )
then
1707 iwrite=nemsio_realkind*
size(gfile%lon)
1708 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1709 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1711 if(gfile%do_byteswap)
call byteswap(gfile%lon,nemsio_realkind,
size(gfile%lon))
1712 call mpi_file_write_at(gfile%fh,idisp,gfile%lon,gfile%fieldsize,mpi_real,status,ios)
1714 if(gfile%do_byteswap)
call byteswap(gfile%lon,nemsio_realkind,
size(gfile%lon))
1715 idisp=idisp+nemsio_realkind*
size(gfile%lon)
1716 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1717 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%lat)+8
1721 if ( nummeta>8 )
then
1723 iwrite=nemsio_realkind*
size(gfile%dx)
1724 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1725 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1727 if(gfile%do_byteswap)
call byteswap(gfile%dx,nemsio_realkind,
size(gfile%dx))
1728 call mpi_file_write_at(gfile%fh,idisp,gfile%dx,gfile%fieldsize,mpi_real,status,ios)
1730 if(gfile%do_byteswap)
call byteswap(gfile%dx,nemsio_realkind,
size(gfile%dx))
1731 idisp=idisp+nemsio_realkind*
size(gfile%dx)
1732 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1733 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%dx)+8
1736 if ( nummeta>9 )
then
1738 iwrite=nemsio_realkind*
size(gfile%dy)
1739 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1740 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1742 if(gfile%do_byteswap)
call byteswap(gfile%dy,nemsio_realkind,
size(gfile%dy))
1743 call mpi_file_write_at(gfile%fh,idisp,gfile%dy,gfile%fieldsize,mpi_real,status,ios)
1745 if(gfile%do_byteswap)
call byteswap(gfile%dy,nemsio_realkind,
size(gfile%dy))
1746 idisp=idisp+nemsio_realkind*
size(gfile%dy)
1747 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1748 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%dy)+8
1752 if ( nummeta>10 )
then
1754 iwrite=nemsio_realkind*
size(gfile%cpi)
1755 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1756 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1758 if(gfile%do_byteswap)
call byteswap(gfile%cpi,nemsio_realkind,
size(gfile%cpi))
1759 call mpi_file_write_at(gfile%fh,idisp,gfile%cpi,
size(gfile%cpi),mpi_real,status,ios)
1761 if(gfile%do_byteswap)
call byteswap(gfile%cpi,nemsio_realkind,
size(gfile%cpi))
1762 idisp=idisp+nemsio_realkind*
size(gfile%cpi)
1763 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1764 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%cpi)+8
1767 if ( nummeta>11 )
then
1769 iwrite=nemsio_realkind*
size(gfile%ri)
1770 if(gfile%do_byteswap)
call byteswap(iwrite,nemsio_intkind,1)
1771 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1773 if(gfile%do_byteswap)
call byteswap(gfile%ri,nemsio_realkind,
size(gfile%ri))
1774 call mpi_file_write_at(gfile%fh,idisp,gfile%ri,
size(gfile%ri),mpi_real,status,ios)
1776 if(gfile%do_byteswap)
call byteswap(gfile%ri,nemsio_realkind,
size(gfile%ri))
1777 idisp=idisp+nemsio_realkind*
size(gfile%ri)
1778 call mpi_file_write_at(gfile%fh,idisp,iwrite,1,mpi_integer,status,ios)
1779 gfile%tlmeta=gfile%tlmeta+nemsio_realkind*
size(gfile%ri)+8
1784 if(gfile%extrameta)
then
1785 meta3%nmetavari=gfile%nmetavari
1786 meta3%nmetavarr=gfile%nmetavarr
1787 meta3%nmetavarl=gfile%nmetavarl
1788 meta3%nmetavarc=gfile%nmetavarc
1789 meta3%nmetaaryi=gfile%nmetaaryi
1790 meta3%nmetaaryr=gfile%nmetaaryr
1791 meta3%nmetaaryl=gfile%nmetaaryl
1792 meta3%nmetaaryc=gfile%nmetaaryc
1793 meta3%nmetavarr8=gfile%nmetavarr8
1794 meta3%nmetaaryr8=gfile%nmetaaryr8
1797 if(gfile%nmetavarr8>0.or.gfile%nmetaaryr8>0)
then
1798 iwrite=nemsio_lmeta3
1800 iwrite=nemsio_lmeta3-8
1803 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1804 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1806 if(gfile%do_byteswap) &
1807 call byteswap(meta3%nmetavari,nemsio_intkind,iwrite/4)
1808 call mpi_file_write_at(gfile%fh,idisp,meta3,iwrite/4,mpi_integer,status,ios)
1809 if(gfile%do_byteswap) &
1810 call byteswap(meta3%nmetavari,nemsio_intkind,iwrite/4)
1812 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1813 gfile%tlmeta=gfile%tlmeta+iwrite+8
1819 if (gfile%nmetavari.gt.0)
then
1821 iwrite=len(gfile%variname)*gfile%nmetavari
1823 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1824 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1826 call mpi_file_write_at(gfile%fh,idisp,gfile%variname,iwrite,mpi_character,status,ios)
1828 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1829 gfile%tlmeta=gfile%tlmeta+iwrite+8
1832 iwrite=gfile%nmetavari
1833 nwrite=iwrite*kind(gfile%varival)
1834 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1835 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1837 if(gfile%do_byteswap) &
1838 call byteswap(gfile%varival,nemsio_intkind,
size(gfile%varival))
1839 call mpi_file_write_at(gfile%fh,idisp,gfile%varival,iwrite,mpi_integer,status,ios)
1840 if(gfile%do_byteswap) &
1841 call byteswap(gfile%varival,nemsio_intkind,
size(gfile%varival))
1842 idisp=idisp+iwrite*kind(gfile%varival)
1843 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1844 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%varival)+8
1847 if (gfile%nmetavarr.gt.0)
then
1849 iwrite=len(gfile%varrname)*gfile%nmetavarr
1851 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1852 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1854 call mpi_file_write_at(gfile%fh,idisp,gfile%varrname,iwrite,mpi_character,status,ios)
1856 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1857 gfile%tlmeta=gfile%tlmeta+iwrite+8
1860 iwrite=gfile%nmetavarr
1861 nwrite=iwrite*kind(gfile%varrval)
1862 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1863 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1865 if(gfile%do_byteswap) &
1866 call byteswap(gfile%varrval,nemsio_realkind,
size(gfile%varrval))
1867 call mpi_file_write_at(gfile%fh,idisp,gfile%varrval,iwrite,mpi_real,status,ios)
1868 if(gfile%do_byteswap) &
1869 call byteswap(gfile%varrval,nemsio_realkind,
size(gfile%varrval))
1870 idisp=idisp+iwrite*kind(gfile%varrval)
1871 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1872 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%varrval)+8
1876 if (gfile%nmetavarl.gt.0)
then
1878 iwrite=len(gfile%varlname)*gfile%nmetavarl
1880 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1881 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1883 call mpi_file_write_at(gfile%fh,idisp,gfile%varlname,iwrite,mpi_character,status,ios)
1885 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1886 gfile%tlmeta=gfile%tlmeta+iwrite+8
1889 iwrite=gfile%nmetavarl
1890 nwrite=iwrite*kind(gfile%varlval)
1891 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1892 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1894 if(gfile%do_byteswap) &
1895 call byteswap(gfile%varlval,nemsio_logickind,
size(gfile%varlval))
1896 call mpi_file_write_at(gfile%fh,idisp,gfile%varlval,iwrite,mpi_logical,status,ios)
1897 if(gfile%do_byteswap) &
1898 call byteswap(gfile%varlval,nemsio_logickind,
size(gfile%varlval))
1899 idisp=idisp+iwrite*kind(gfile%varlval)
1900 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1901 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%varlval)+8
1905 if (gfile%nmetavarc.gt.0)
then
1907 iwrite=len(gfile%varcname)*gfile%nmetavarc
1909 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1910 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1912 call mpi_file_write_at(gfile%fh,idisp,gfile%varcname,iwrite,mpi_character,status,ios)
1914 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1915 gfile%tlmeta=gfile%tlmeta+iwrite+8
1919 iwrite=gfile%nmetavarc*len(gfile%varcval)
1921 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1922 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1924 call mpi_file_write_at(gfile%fh,idisp,gfile%varcval,iwrite,mpi_character,status,ios)
1926 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1927 gfile%tlmeta=gfile%tlmeta+iwrite+8
1931 if (gfile%nmetavarr8.gt.0)
then
1933 iwrite=len(gfile%varr8name)*gfile%nmetavarr8
1935 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1936 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1938 call mpi_file_write_at(gfile%fh,idisp,gfile%varr8name,iwrite,mpi_character,status,ios)
1940 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1941 gfile%tlmeta=gfile%tlmeta+iwrite+8
1944 iwrite=gfile%nmetavarr8
1945 nwrite=iwrite*kind(gfile%varr8val)
1946 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1947 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1949 if(gfile%do_byteswap) &
1950 call byteswap(gfile%varr8val,nemsio_dblekind,
size(gfile%varr8val))
1951 call mpi_file_write_at(gfile%fh,idisp,gfile%varr8val,iwrite,mpi_real8,status,ios)
1952 if(gfile%do_byteswap) &
1953 call byteswap(gfile%varr8val,nemsio_dblekind,
size(gfile%varr8val))
1954 idisp=idisp+iwrite*kind(gfile%varr8val)
1955 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1956 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%varr8val)+8
1960 if (gfile%nmetaaryi.gt.0)
then
1962 iwrite=len(gfile%aryiname)*gfile%nmetaaryi
1964 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1965 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1967 call mpi_file_write_at(gfile%fh,idisp,gfile%aryiname,iwrite,mpi_character,status,ios)
1969 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1970 gfile%tlmeta=gfile%tlmeta+iwrite+8
1973 iwrite=gfile%nmetaaryi
1974 nwrite=iwrite*kind(gfile%aryilen)
1975 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1976 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1978 if(gfile%do_byteswap) &
1979 call byteswap(gfile%aryilen,nemsio_intkind,
size(gfile%aryilen))
1980 call mpi_file_write_at(gfile%fh,idisp,gfile%aryilen,iwrite,mpi_integer,status,ios)
1981 if(gfile%do_byteswap) &
1982 call byteswap(gfile%aryilen,nemsio_intkind,
size(gfile%aryilen))
1983 idisp=idisp+iwrite*kind(gfile%aryilen)
1984 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1985 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryilen)+8
1987 do i=1,gfile%nmetaaryi
1989 iwrite=gfile%aryilen(i)
1990 nwrite=iwrite*kind(gfile%aryival)
1991 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
1992 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
1994 if(gfile%do_byteswap) &
1995 call byteswap(gfile%aryival(1:iwrite,i),nemsio_intkind,gfile%aryilen(i))
1996 call mpi_file_write_at(gfile%fh,idisp,gfile%aryival(1:iwrite,i),iwrite,mpi_integer,status,ios)
1997 if(gfile%do_byteswap) &
1998 call byteswap(gfile%aryival(1:iwrite,i),nemsio_intkind,gfile%aryilen(i))
1999 idisp=idisp+iwrite*kind(gfile%aryival)
2000 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2001 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryival)+8
2005 if (gfile%nmetaaryr.gt.0)
then
2007 iwrite=len(gfile%aryrname)*gfile%nmetaaryr
2009 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2010 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2012 call mpi_file_write_at(gfile%fh,idisp,gfile%aryrname,iwrite,mpi_character,status,ios)
2014 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2015 gfile%tlmeta=gfile%tlmeta+iwrite+8
2018 iwrite=gfile%nmetaaryr
2019 nwrite=iwrite*kind(gfile%aryrlen)
2020 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2021 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2023 if(gfile%do_byteswap) &
2024 call byteswap(gfile%aryrlen,nemsio_intkind,
size(gfile%aryrlen))
2025 call mpi_file_write_at(gfile%fh,idisp,gfile%aryrlen,iwrite,mpi_integer,status,ios)
2026 if(gfile%do_byteswap) &
2027 call byteswap(gfile%aryrlen,nemsio_intkind,
size(gfile%aryrlen))
2028 idisp=idisp+iwrite*kind(gfile%aryrlen)
2029 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2030 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryrlen)+8
2032 do i=1,gfile%nmetaaryr
2034 iwrite=gfile%aryrlen(i)
2035 nwrite=iwrite*kind(gfile%aryrval)
2036 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2037 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2039 if(gfile%do_byteswap) &
2040 call byteswap(gfile%aryrval(1:iwrite,i),nemsio_realkind,gfile%aryrlen(i))
2041 call mpi_file_write_at(gfile%fh,idisp,gfile%aryrval(1:iwrite,i),iwrite,mpi_real,status,ios)
2042 if(gfile%do_byteswap) &
2043 call byteswap(gfile%aryrval(1:iwrite,i),nemsio_realkind,gfile%aryrlen(i))
2044 idisp=idisp+iwrite*kind(gfile%aryrval)
2045 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2046 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryrval)+8
2050 if (gfile%nmetaaryl.gt.0)
then
2052 iwrite=len(gfile%arylname)*gfile%nmetaaryl
2054 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2055 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2057 call mpi_file_write_at(gfile%fh,idisp,gfile%arylname,iwrite,mpi_character,status,ios)
2059 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2060 gfile%tlmeta=gfile%tlmeta+iwrite+8
2063 iwrite=gfile%nmetaaryl
2064 nwrite=iwrite*kind(gfile%aryllen)
2065 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2066 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2068 if(gfile%do_byteswap) &
2069 call byteswap(gfile%aryllen,nemsio_intkind,
size(gfile%aryllen))
2070 call mpi_file_write_at(gfile%fh,idisp,gfile%aryllen,iwrite,mpi_integer,status,ios)
2071 if(gfile%do_byteswap) &
2072 call byteswap(gfile%aryllen,nemsio_intkind,
size(gfile%aryllen))
2073 idisp=idisp+iwrite*kind(gfile%aryllen)
2074 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2075 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryllen)+8
2077 do i=1,gfile%nmetaaryl
2079 iwrite=gfile%aryllen(i)
2080 nwrite=iwrite*kind(gfile%arylval)
2081 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2082 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2084 if(gfile%do_byteswap) &
2085 call byteswap(gfile%arylval(1:iwrite,i),nemsio_logickind,gfile%aryllen(i))
2086 call mpi_file_write_at(gfile%fh,idisp,gfile%arylval(1:iwrite,i),iwrite,mpi_logical,status,ios)
2087 if(gfile%do_byteswap) &
2088 call byteswap(gfile%arylval(1:iwrite,i),nemsio_logickind,gfile%aryllen(i))
2089 idisp=idisp+iwrite*kind(gfile%arylval)
2090 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2091 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%arylval)+8
2095 if (gfile%nmetaaryc.gt.0)
then
2097 iwrite=len(gfile%arycname)*gfile%nmetaaryc
2099 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2100 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2102 call mpi_file_write_at(gfile%fh,idisp,gfile%arycname,iwrite,mpi_character,status,ios)
2104 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2105 gfile%tlmeta=gfile%tlmeta+iwrite+8
2108 iwrite=gfile%nmetaaryc
2109 nwrite=iwrite*kind(gfile%aryclen)
2110 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2111 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2113 if(gfile%do_byteswap) &
2114 call byteswap(gfile%aryclen,nemsio_intkind,
size(gfile%aryclen))
2115 call mpi_file_write_at(gfile%fh,idisp,gfile%aryclen,iwrite,mpi_integer,status,ios)
2116 if(gfile%do_byteswap) &
2117 call byteswap(gfile%aryclen,nemsio_intkind,
size(gfile%aryclen))
2118 idisp=idisp+iwrite*kind(gfile%aryclen)
2119 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2120 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryclen)+8
2122 do i=1,gfile%nmetaaryc
2124 iwrite=gfile%aryclen(i)*len(gfile%arycval)
2126 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2127 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2129 call mpi_file_write_at(gfile%fh,idisp,gfile%arycval(1:iwrite,i),iwrite,mpi_character,status,ios)
2131 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2132 gfile%tlmeta=gfile%tlmeta+iwrite+8
2136 if (gfile%nmetaaryr8.gt.0)
then
2138 iwrite=len(gfile%aryr8name)*gfile%nmetaaryr8
2140 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2141 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2143 call mpi_file_write_at(gfile%fh,idisp,gfile%aryr8name,iwrite,mpi_character,status,ios)
2145 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2146 gfile%tlmeta=gfile%tlmeta+iwrite+8
2149 iwrite=gfile%nmetaaryr8
2150 nwrite=iwrite*kind(gfile%aryr8len)
2151 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2152 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2154 if(gfile%do_byteswap) &
2155 call byteswap(gfile%aryr8len,nemsio_intkind,
size(gfile%aryr8len))
2156 call mpi_file_write_at(gfile%fh,idisp,gfile%aryr8len,iwrite,mpi_integer,status,ios)
2157 if(gfile%do_byteswap) &
2158 call byteswap(gfile%aryr8len,nemsio_intkind,
size(gfile%aryr8len))
2159 idisp=idisp+iwrite*kind(gfile%aryr8len)
2160 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2161 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryr8len)+8
2163 do i=1,gfile%nmetaaryr8
2165 iwrite=gfile%aryr8len(i)
2166 nwrite=iwrite*kind(gfile%aryr8val)
2167 if(gfile%do_byteswap)
call byteswap(nwrite,nemsio_intkind,1)
2168 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2170 if(gfile%do_byteswap) &
2171 call byteswap(gfile%aryr8val(1:iwrite,i),nemsio_dblekind,gfile%aryr8len(i))
2172 call mpi_file_write_at(gfile%fh,idisp,gfile%aryr8val(1:iwrite,i),iwrite,mpi_real8,status,ios)
2173 if(gfile%do_byteswap) &
2174 call byteswap(gfile%aryr8val(1:iwrite,i),nemsio_dblekind,gfile%aryr8len(i))
2175 idisp=idisp+iwrite*kind(gfile%aryr8val)
2176 call mpi_file_write_at(gfile%fh,idisp,nwrite,1,mpi_integer,status,ios)
2177 gfile%tlmeta=gfile%tlmeta+iwrite*kind(gfile%aryr8val)+8
2185 call mpi_barrier(gfile%mpi_comm, ios)
2186 call mpi_bcast(gfile%tlmeta,1,mpi_integer8,gfile%lead_task,gfile%mpi_comm,ios)
2191 end subroutine nemsio_wcreate
2193 subroutine nemsio_getfilehead(gfile,iret,gtype,gdatatype,gfname,gaction, &
2194 modelname,version,nmeta,lmeta,nrec,idate,nfday,nfhour,nfminute, &
2195 nfsecondn,nfsecondd,dimx,dimy,dimz,nframe,nsoil,ntrac,ncldt,jcap,&
2196 idvc,idsl,idvm,idrt, rlon_min,rlon_max,rlat_min,rlat_max,tlmeta, &
2197 file_endian,do_byteswap, &
2198 extrameta,nmetavari,nmetavarr,nmetavarl,nmetavarc,nmetavarr8, &
2199 nmetaaryi,nmetaaryr,nmetaaryl,nmetaaryc,nmetaaryr8, &
2200 recname,reclevtyp,reclev,vcoord,lon,lat,dx,dy,cpi,ri, &
2201 variname,varival,varrname,varrval,varlname,varlval,varcname,varcval, &
2202 varr8name,varr8val, &
2203 aryiname,aryilen,aryival,aryrname,aryrlen,aryrval, &
2204 arylname,aryllen,arylval,arycname,aryclen,arycval, &
2205 aryr8name,aryr8len,aryr8val )
2211 type(nemsio_gfile),
intent(in) :: gfile
2212 integer(nemsio_intkind),
optional,
intent(out) :: iret
2213 character*(*),
optional,
intent(out) :: gtype,gdatatype,gfname, &
2215 integer(nemsio_intkind),
optional,
intent(out) :: version,nmeta,lmeta,tlmeta
2216 integer(nemsio_realkind),
optional,
intent(out):: nrec,idate(7),nfday,nfhour, &
2217 nfminute,nfsecondn,nfsecondd
2218 integer(nemsio_realkind),
optional,
intent(out):: dimx,dimy,dimz,nframe, &
2220 integer(nemsio_realkind),
optional,
intent(out):: ncldt,jcap,idvc,idsl,idvm,idrt
2221 real(nemsio_realkind),
optional,
intent(out) :: rlon_min,rlon_max,rlat_min, &
2223 character*(*),
optional,
intent(out) :: file_endian
2224 logical(nemsio_logickind),
optional,
intent(out):: do_byteswap
2225 logical(nemsio_logickind),
optional,
intent(out):: extrameta
2226 integer(nemsio_realkind),
optional,
intent(out):: nmetavari,nmetavarr, &
2227 nmetavarl,nmetavarc,nmetaaryi, &
2228 nmetaaryr,nmetaaryl,nmetaaryc, &
2229 nmetavarr8,nmetaaryr8
2230 character(*),
optional,
intent(out) :: recname(:)
2231 character(*),
optional,
intent(out) :: reclevtyp(:)
2232 integer(nemsio_intkind),
optional,
intent(out) :: reclev(:)
2233 real(nemsio_realkind),
optional,
intent(out) :: vcoord(:,:,:)
2234 real(nemsio_realkind),
optional,
intent(out) :: lat(:),lon(:)
2235 real(nemsio_realkind),
optional,
intent(out) :: dx(:),dy(:)
2236 real(nemsio_realkind),
optional,
intent(out) :: Cpi(:),Ri(:)
2237 character(*),
optional,
intent(out) :: variname(:),varrname(:)
2238 character(*),
optional,
intent(out) :: varlname(:),varcname(:)
2239 character(*),
optional,
intent(out) :: varr8name(:)
2240 character(*),
optional,
intent(out) :: aryiname(:),aryrname(:)
2241 character(*),
optional,
intent(out) :: arylname(:),arycname(:)
2242 character(*),
optional,
intent(out) :: aryr8name(:)
2243 integer(nemsio_intkind),
optional,
intent(out) :: aryilen(:),aryrlen(:)
2244 integer(nemsio_intkind),
optional,
intent(out) :: aryllen(:),aryclen(:)
2245 integer(nemsio_intkind),
optional,
intent(out) :: aryr8len(:)
2246 integer(nemsio_intkind),
optional,
intent(out) :: varival(:),aryival(:,:)
2247 real(nemsio_realkind),
optional,
intent(out) :: varrval(:),aryrval(:,:)
2248 real(nemsio_dblekind),
optional,
intent(out) :: varr8val(:),aryr8val(:,:)
2249 logical(nemsio_logickind),
optional,
intent(out):: varlval(:),arylval(:,:)
2250 character(*),
optional,
intent(out) :: varcval(:),arycval(:,:)
2253 if (
present(iret)) iret=-3
2254 if(
present(gtype)) gtype=gfile%gtype
2255 if(
present(gdatatype)) gdatatype=gfile%gdatatype
2256 if(
present(gfname)) gfname=trim(gfile%gfname)
2257 if(
present(gaction)) gaction=gfile%gaction
2258 if(
present(modelname)) modelname=gfile%modelname
2259 if(
present(version)) version=gfile%version
2260 if(
present(nmeta)) nmeta=gfile%nmeta
2261 if(
present(lmeta)) lmeta=gfile%lmeta
2262 if(
present(nrec)) nrec=gfile%nrec
2263 if(
present(nfday)) nfday=gfile%nfday
2264 if(
present(nfhour)) nfhour=gfile%nfhour
2265 if(
present(nfminute)) nfminute=gfile%nfminute
2266 if(
present(nfsecondn)) nfsecondn=gfile%nfsecondn
2267 if(
present(nfsecondd)) nfsecondd=gfile%nfsecondd
2268 if(
present(idate)) idate(1:7)=gfile%idate(1:7)
2269 if(
present(dimx)) dimx=gfile%dimx
2270 if(
present(dimy)) dimy=gfile%dimy
2271 if(
present(dimz)) dimz=gfile%dimz
2272 if(
present(nframe)) nframe=gfile%nframe
2273 if(
present(nsoil)) nsoil=gfile%nsoil
2274 if(
present(ntrac)) ntrac=gfile%ntrac
2275 if(
present(jcap)) jcap=gfile%jcap
2276 if(
present(ncldt)) ncldt=gfile%ncldt
2277 if(
present(idvc)) idvc=gfile%idvc
2278 if(
present(idsl)) idsl=gfile%idsl
2279 if(
present(idvm)) idvm=gfile%idvm
2280 if(
present(idrt)) idrt=gfile%idrt
2281 if(
present(rlon_min)) rlon_min=gfile%rlon_min
2282 if(
present(rlon_max)) rlon_max=gfile%rlon_max
2283 if(
present(rlat_min)) rlat_min=gfile%rlat_min
2284 if(
present(rlat_max)) rlat_max=gfile%rlat_max
2285 if(
present(rlat_max)) rlat_max=gfile%rlat_max
2286 if(
present(tlmeta)) tlmeta=gfile%tlmeta
2287 if(
present(file_endian)) file_endian=gfile%file_endian
2288 if(
present(do_byteswap)) do_byteswap=gfile%do_byteswap
2289 if(
present(extrameta)) extrameta=gfile%extrameta
2295 if(
present(recname) )
then
2296 if (gfile%nrec.ne.
size(recname))
then
2297 if (
present(iret))
return
2300 recname=gfile%recname
2303 if(
present(reclevtyp))
then
2304 if (gfile%nrec.ne.
size(reclevtyp))
then
2305 if (
present(iret))
return
2308 reclevtyp=gfile%reclevtyp
2311 if(
present(reclev) )
then
2312 if (gfile%nrec.ne.
size(reclev))
then
2313 if (
present(iret))
return
2320 if(
present(vcoord))
then
2321 if (
size(vcoord) .ne. (gfile%dimz+1)*2*3 )
then
2322 if (
present(iret))
return
2329 if(
present(lat) )
then
2330 if (
size(lat).ne.gfile%fieldsize)
then
2331 print *,
'WRONG: size(lat)=',
size(lat),
' is not equal to ',gfile%fieldsize
2332 if (
present(iret))
return
2339 if(
present(lon) )
then
2340 if (
size(lon).ne.gfile%fieldsize)
then
2341 print *,
'WRONG: size(lon)=',
size(lon),
' is not equal to ',gfile%fieldsize
2342 if (
present(iret))
return
2349 if(
present(dx) )
then
2352 if (
size(dx).ne.gfile%fieldsize)
then
2353 print *,
'WRONG: size(dX)=',
size(dx),
' is not equal to ',gfile%fieldsize
2354 if (
present(iret))
return
2360 if(
present(dy) )
then
2361 if (
size(dy).ne.gfile%fieldsize)
then
2362 print *,
'WRONG: size(dy)=',
size(dy),
' is not equal to ',gfile%fieldsize
2363 if (
present(iret))
return
2370 if(
present(cpi) )
then
2371 if (gfile%ntrac+1.ne.
size(cpi))
then
2372 if (
present(iret))
return
2379 if(
present(ri) )
then
2380 if (gfile%ntrac+1.ne.
size(ri))
then
2381 if (
present(iret))
return
2391 if (
present(nmetavari) ) nmetavari=gfile%nmetavari
2392 if (
present(nmetavarr) ) nmetavarr=gfile%nmetavarr
2393 if (
present(nmetavarl) ) nmetavarl=gfile%nmetavarl
2394 if (
present(nmetavarc) ) nmetavarc=gfile%nmetavarc
2395 if (
present(nmetavarr8) ) nmetavarr8=gfile%nmetavarr8
2396 if (
present(nmetaaryi) ) nmetaaryi=gfile%nmetaaryi
2397 if (
present(nmetaaryr) ) nmetaaryr=gfile%nmetaaryr
2398 if (
present(nmetaaryl) ) nmetaaryl=gfile%nmetaaryl
2399 if (
present(nmetaaryc) ) nmetaaryc=gfile%nmetaaryc
2400 if (
present(nmetaaryr8) ) nmetaaryr8=gfile%nmetaaryr8
2401 if ( gfile%nmetavari.gt.0 )
then
2402 if (
present(variname))
then
2403 if(
size(variname).eq.nmetavari)
then
2405 variname(i)=gfile%variname(i)
2409 if (
present(varival))
then
2410 if(
size(varival).eq.nmetavari) varival(1:nmetavari)=gfile%varival(1:nmetavari)
2413 if ( gfile%nmetavarr.gt.0 )
then
2414 if (
present(varrname))
then
2415 if(
size(varrname).eq.nmetavarr) varrname=gfile%varrname
2417 if (
present(varrval))
then
2418 if(
size(varrval).eq.nmetavarr) varrval=gfile%varrval
2421 if ( gfile%nmetavarl.gt.0 )
then
2422 if (
present(varlname))
then
2423 if(
size(varlname).eq.nmetavarl) varlname=gfile%varlname
2425 if (
present(varlval))
then
2426 if(
size(varlval).eq.nmetavarl) varlval=gfile%varlval
2429 if ( gfile%nmetavarc.gt.0 )
then
2430 if (
present(varcname))
then
2431 if(
size(varcname).eq.gfile%nmetavarc) varcname=gfile%varcname
2433 if (
present(varcval))
then
2434 if(
size(varcval).eq.gfile%nmetavarc) varcval=gfile%varcval
2437 if ( gfile%nmetavarr8.gt.0 )
then
2438 if (
present(varr8name))
then
2439 if(
size(varr8name).eq.gfile%nmetavarr8) varr8name=gfile%varr8name
2441 if (
present(varr8val))
then
2442 if(
size(varr8val).eq.gfile%nmetavarr8) varr8val=gfile%varr8val
2445 if ( gfile%nmetaaryi.gt.0 )
then
2446 if (
present(aryiname))
then
2447 if(
size(aryiname).eq.nmetaaryi) aryiname=gfile%aryiname
2449 if (
present(aryilen))
then
2450 if(
size(aryilen).eq.nmetaaryi) aryilen=gfile%aryilen
2452 if (
present(aryival))
then
2453 if(
size(aryival).eq.nmetaaryi*maxval(gfile%aryilen) ) &
2454 aryival=gfile%aryival
2457 if ( gfile%nmetaaryr.gt.0 )
then
2458 if (
present(aryrname))
then
2459 if(
size(aryrname).eq.nmetaaryr) aryrname=gfile%aryrname
2461 if (
present(aryrlen))
then
2462 if(
size(aryrlen).eq.nmetaaryr) aryrlen=gfile%aryrlen
2464 if (
present(aryrval))
then
2465 if(
size(aryrval).eq.nmetaaryr*maxval(gfile%aryrlen) ) &
2466 aryrval=gfile%aryrval
2469 if ( gfile%nmetaaryl.gt.0 )
then
2470 if (
present(arylname))
then
2471 if(
size(arylname).eq.nmetaaryl) arylname=gfile%arylname
2473 if (
present(aryllen))
then
2474 if(
size(aryllen).eq.nmetaaryl) aryllen=gfile%aryllen
2476 if (
present(arylval) )
then
2477 if(
size(arylval).eq.nmetaaryl*maxval(gfile%aryllen) ) &
2478 arylval=gfile%arylval
2481 if ( gfile%nmetaaryc.gt.0 )
then
2482 if (
present(arycname))
then
2483 if(
size(arycname).eq.gfile%nmetaaryc) arycname=gfile%arycname
2485 if (
present(aryclen))
then
2486 if(
size(aryclen).eq.gfile%nmetaaryc) aryclen=gfile%aryclen
2488 if (
present(arycval))
then
2489 if(
size(arycval).eq.gfile%nmetaaryc*maxval(gfile%aryclen) ) &
2490 arycval=gfile%arycval
2493 if ( gfile%nmetaaryr8.gt.0 )
then
2494 if (
present(aryr8name))
then
2495 if(
size(aryr8name).eq.gfile%nmetaaryr8) aryr8name=gfile%aryr8name
2497 if (
present(aryr8len))
then
2498 if(
size(aryr8len).eq.gfile%nmetaaryr8) aryr8len=gfile%aryr8len
2500 if (
present(aryr8val))
then
2501 if(
size(aryr8val).eq.gfile%nmetaaryr8*maxval(gfile%aryr8len) ) &
2502 aryr8val=gfile%aryr8val
2506 call mpi_barrier(gfile%mpi_comm,ios)
2507 if (
present(iret)) iret=0
2509 end subroutine nemsio_getfilehead
2511 subroutine nemsio_getfheadvari(gfile,varname,varval,iret)
2516 type(nemsio_gfile),
intent(in) :: gfile
2517 character(*),
intent(in) :: varname
2518 integer(nemsio_intkind),
intent(out) :: varval
2519 integer(nemsio_intkind),
optional,
intent(out) :: iret
2522 if(
present(iret) ) iret=-17
2523 do i=1,gfile%headvarinum
2524 if(equal_str_nocase(trim(varname),trim(gfile%headvariname(i))) )
then
2525 varval=gfile%headvarival(i)
2526 if(
present(iret) ) iret=0
2531 if(gfile%nmetavari.gt.0)
then
2532 do i=1,gfile%nmetavari
2533 if(equal_str_nocase(trim(varname),trim(gfile%variname(i))) )
then
2534 varval=gfile%varival(i)
2535 if(
present(iret) ) iret=0
2541 if(.not.
present(iret) )
call nemsio_stop
2543 end subroutine nemsio_getfheadvari
2545 subroutine nemsio_getfheadvarr(gfile,varname,varval,iret)
2550 type(nemsio_gfile),
intent(in) :: gfile
2551 character(*),
intent(in) :: varname
2552 real(nemsio_realkind),
intent(out) :: varval
2553 integer(nemsio_intkind),
optional,
intent(out) :: iret
2556 if(
present(iret) ) iret=-17
2557 do i=1,gfile%headvarrnum
2558 if(equal_str_nocase(trim(varname),trim(gfile%headvarrname(i))) )
then
2559 varval=gfile%headvarrval(i)
2560 if(
present(iret) ) iret=0
2565 if(gfile%nmetavarr.gt.0)
then
2566 do i=1,gfile%nmetavarr
2567 if(equal_str_nocase(trim(varname),trim(gfile%varrname(i))) )
then
2568 varval=gfile%varrval(i)
2569 if(
present(iret) ) iret=0
2575 if(.not.
present(iret) )
call nemsio_stop
2577 end subroutine nemsio_getfheadvarr
2579 subroutine nemsio_getfheadvarl(gfile,varname,varval,iret)
2584 type(nemsio_gfile),
intent(in) :: gfile
2585 character(*),
intent(in) :: varname
2586 logical(nemsio_logickind),
intent(out) :: varval
2587 integer(nemsio_intkind),
optional,
intent(out) :: iret
2590 if(
present(iret) ) iret=-17
2591 if(gfile%nmetavarl.gt.0)
then
2592 do i=1,gfile%nmetavarl
2593 if(equal_str_nocase(trim(varname),trim(gfile%varlname(i))) )
then
2594 varval=gfile%varlval(i)
2595 if(
present(iret) ) iret=0
2601 if(.not.
present(iret) )
call nemsio_stop
2603 end subroutine nemsio_getfheadvarl
2605 subroutine nemsio_getfheadvarc(gfile,varname,varval,iret)
2610 type(nemsio_gfile),
intent(in) :: gfile
2611 character(*),
intent(in) :: varname
2612 character(*),
intent(out) :: varval
2613 integer(nemsio_intkind),
optional,
intent(out) :: iret
2616 if(
present(iret) ) iret=-17
2617 do i=1,gfile%headvarcnum
2618 if(equal_str_nocase(trim(varname),trim(gfile%headvarcname(i))) )
then
2619 varval=gfile%headvarcval(i)
2620 if(
present(iret) ) iret=0
2625 if(gfile%nmetavarc.gt.0)
then
2626 do i=1,gfile%nmetavarc
2627 if(equal_str_nocase(trim(varname),trim(gfile%varcname(i))) )
then
2628 varval=gfile%varcval(i)
2629 if(
present(iret) ) iret=0
2635 if(.not.
present(iret) )
call nemsio_stop
2637 end subroutine nemsio_getfheadvarc
2639 subroutine nemsio_getfheadvarr8(gfile,varname,varval,iret)
2644 type(nemsio_gfile),
intent(in) :: gfile
2645 character(len=*),
intent(in) :: varname
2646 real(nemsio_dblekind),
intent(out) :: varval
2647 integer(nemsio_intkind),
optional,
intent(out) :: iret
2650 if(
present(iret) ) iret=-17
2652 if(gfile%nmetavarr8.gt.0)
then
2653 do i=1,gfile%nmetavarr8
2654 if(equal_str_nocase(trim(varname),trim(gfile%varr8name(i))) )
then
2655 varval=gfile%varr8val(i)
2656 if(
present(iret) ) iret=0
2662 if(.not.
present(iret) )
call nemsio_stop
2664 end subroutine nemsio_getfheadvarr8
2666 subroutine nemsio_getfheadaryi(gfile,varname,varval,iret)
2671 type(nemsio_gfile),
intent(in) :: gfile
2672 character(*),
intent(in) :: varname
2673 integer(nemsio_intkind),
intent(out) :: varval(:)
2674 integer(nemsio_intkind),
optional,
intent(out) :: iret
2677 if(
present(iret) ) iret=-17
2678 do i=1,gfile%headaryinum
2679 if(equal_str_nocase(trim(varname),trim(gfile%headaryiname(i))) )
then
2680 varval(:)=gfile%headaryival(1:gfile%aryilen(i),i)
2681 if(
present(iret) ) iret=0
2686 if(gfile%nmetaaryi.gt.0)
then
2687 do i=1,gfile%nmetaaryi
2688 if(equal_str_nocase(trim(varname),trim(gfile%aryiname(i))) )
then
2689 varval(:)=gfile%aryival(1:gfile%aryilen(i),i)
2690 if(
present(iret) ) iret=0
2697 if(.not.
present(iret) )
call nemsio_stop
2699 end subroutine nemsio_getfheadaryi
2701 subroutine nemsio_getfheadaryr(gfile,varname,varval,iret)
2706 type(nemsio_gfile),
intent(in) :: gfile
2707 character(*),
intent(in) :: varname
2708 real(nemsio_realkind),
intent(out) :: varval(:)
2709 integer(nemsio_intkind),
optional,
intent(out) :: iret
2712 if(
present(iret) ) iret=-17
2713 if(gfile%headaryrnum>0)
then
2714 do i=1,gfile%headaryrnum
2715 if(equal_str_nocase(trim(varname),trim(gfile%headaryrname(i))) )
then
2716 varval(:)=gfile%headaryrval(1:gfile%aryrlen(i),i)
2717 if(
present(iret) ) iret=0
2723 if(gfile%nmetaaryr.gt.0)
then
2724 do i=1,gfile%nmetaaryr
2725 if(equal_str_nocase(trim(varname),trim(gfile%aryrname(i))))
then
2726 varval(:)=gfile%aryrval(1:gfile%aryrlen(i),i)
2727 if(
present(iret) ) iret=0
2734 if(.not.
present(iret) )
call nemsio_stop
2736 end subroutine nemsio_getfheadaryr
2738 subroutine nemsio_getfheadaryl(gfile,varname,varval,iret)
2743 type(nemsio_gfile),
intent(in) :: gfile
2744 character(*),
intent(in) :: varname
2745 logical(nemsio_logickind),
intent(out) :: varval(:)
2746 integer(nemsio_intkind),
optional,
intent(out) :: iret
2749 if(
present(iret) ) iret=-17
2750 if(gfile%nmetaaryl.gt.0)
then
2751 do i=1,gfile%nmetaaryl
2752 if(equal_str_nocase(trim(varname),trim(gfile%arylname(i))))
then
2753 varval(:)=gfile%arylval(1:gfile%aryllen(i),i)
2754 if(
present(iret) ) iret=0
2761 if(.not.
present(iret) )
call nemsio_stop
2763 end subroutine nemsio_getfheadaryl
2765 subroutine nemsio_getfheadaryc(gfile,varname,varval,iret)
2770 type(nemsio_gfile),
intent(in) :: gfile
2771 character(*),
intent(in) :: varname
2772 character(*),
intent(out) :: varval(:)
2773 integer(nemsio_intkind),
optional,
intent(out) :: iret
2776 if(
present(iret) ) iret=-17
2777 if(gfile%nmetaaryc.gt.0)
then
2778 do i=1,gfile%nmetaaryc
2779 if(equal_str_nocase(trim(varname),trim(gfile%headarycname(i))) )
then
2780 varval(:)=gfile%headarycval(1:gfile%aryclen(i),i)
2781 if(
present(iret) ) iret=0
2787 if(gfile%nmetaaryc.gt.0)
then
2788 do i=1,gfile%nmetaaryc
2789 if(equal_str_nocase(trim(varname),trim(gfile%arycname(i))))
then
2790 varval(:)=gfile%arycval(1:gfile%aryclen(i),i)
2791 if(
present(iret) ) iret=0
2798 if(.not.
present(iret) )
call nemsio_stop
2800 end subroutine nemsio_getfheadaryc
2802 subroutine nemsio_getfheadaryr8(gfile,varname,varval,iret)
2807 type(nemsio_gfile),
intent(in) :: gfile
2808 character(*),
intent(in) :: varname
2809 real(nemsio_dblekind),
intent(out) :: varval(:)
2810 integer(nemsio_intkind),
optional,
intent(out) :: iret
2813 if(
present(iret) ) iret=-17
2815 if(gfile%nmetaaryr8.gt.0)
then
2816 do i=1,gfile%nmetaaryr8
2817 if(equal_str_nocase(trim(varname),trim(gfile%aryr8name(i))))
then
2818 varval(:)=gfile%aryr8val(1:gfile%aryr8len(i),i)
2819 if(
present(iret) ) iret=0
2826 if(.not.
present(iret) )
call nemsio_stop
2828 end subroutine nemsio_getfheadaryr8
2834 subroutine nemsio_searchrecv(gfile,jrec,name,levtyp,lev,iret)
2839 type(nemsio_gfile),
intent(in) :: gfile
2840 integer(nemsio_intkind),
intent(out) :: jrec
2841 character(*),
intent(in) :: name, levtyp
2842 integer(nemsio_intkind),
intent(in) :: lev
2843 integer(nemsio_intkind),
optional,
intent(out) :: iret
2849 if ( trim(name) .eq. trim(gfile%recname(i)) .and. &
2850 trim(levtyp) .eq. trim(gfile%reclevtyp(i)) .and. &
2851 lev .eq. gfile%reclev(i) )
then
2856 if ( jrec .ne.0 ) iret=0
2859 end subroutine nemsio_searchrecv
2880 subroutine nemsio_chkgfary(gfile,iret)
2885 type(nemsio_gfile),
intent(inout) :: gfile
2886 integer(nemsio_intkind),
intent(out) :: iret
2890 if ( gfile%dimx .eq. nemsio_intfill .or. gfile%dimy .eq. nemsio_intfill &
2891 .or. gfile%dimz .eq. nemsio_intfill .or. gfile%nrec .eq. nemsio_intfill &
2892 .or. gfile%idate(1) .eq.nemsio_intfill .or. gfile%ntrac .eq.nemsio_intfill )
then
2895 if (.not.
allocated(gfile%vcoord) .or.
size(gfile%vcoord).ne. &
2896 (gfile%dimz+1)*3*2 )
then
2897 call nemsio_almeta1(gfile,ios)
2898 if (ios .ne. 0)
return
2900 if (.not.
allocated(gfile%lat) .or.
size(gfile%lat).ne.gfile%fieldsize .or.&
2901 .not.
allocated(gfile%lon) .or.
size(gfile%lon).ne.gfile%fieldsize .or.&
2902 .not.
allocated(gfile%dx) .or.
size(gfile%dx).ne.gfile%fieldsize .or.&
2903 .not.
allocated(gfile%dy) .or.
size(gfile%dy).ne.gfile%fieldsize)
then
2904 call nemsio_almeta2(gfile,ios)
2905 if (ios .ne. 0)
return
2907 if (.not.
allocated(gfile%Cpi) .or.
size(gfile%Cpi).ne.gfile%ntrac+1 .or. &
2908 .not.
allocated(gfile%Ri) .or.
size(gfile%Ri).ne.gfile%ntrac+1 )
then
2909 call nemsio_almeta3(gfile,ios)
2910 if (ios .ne. 0)
return
2913 if (
allocated(gfile%recname) .and.
size(gfile%recname).eq.gfile%nrec)&
2915 if (
allocated(gfile%reclevtyp) .and.
size(gfile%reclevtyp) &
2916 .eq.gfile%nrec)
then
2917 if (
allocated(gfile%reclev) .and.
size(gfile%reclev).eq. &
2924 call nemsio_almeta4(gfile,ios)
2925 if (ios .ne. 0)
return
2927 end subroutine nemsio_chkgfary
2929 subroutine nemsio_almeta(gfile,iret)
2934 type(nemsio_gfile),
intent(inout) :: gfile
2935 integer(nemsio_intkind),
intent(out) :: iret
2936 integer ::dimvcoord1,dimvcoord2,dimnmmlev
2937 integer ::dimrecname,dimreclevtyp,dimreclev
2940 integer ::iret1,iret2,iret3,iret4
2942 dimvcoord1=gfile%dimz+1
2943 dimrecname=gfile%nrec
2944 dimreclevtyp=gfile%nrec
2945 dimreclev=gfile%nrec
2946 dimfield=gfile%fieldsize
2947 dimcpr=gfile%ntrac+1
2948 if(
allocated(gfile%recname))
deallocate(gfile%recname)
2949 if(
allocated(gfile%reclevtyp))
deallocate(gfile%reclevtyp)
2950 if(
allocated(gfile%reclev))
deallocate(gfile%reclev)
2951 if(
allocated(gfile%vcoord))
deallocate(gfile%vcoord)
2952 if(
allocated(gfile%lat))
deallocate(gfile%lat)
2953 if(
allocated(gfile%lon))
deallocate(gfile%lon)
2954 if(
allocated(gfile%dx))
deallocate(gfile%dx)
2955 if(
allocated(gfile%dy))
deallocate(gfile%dy)
2956 if(
allocated(gfile%Cpi))
deallocate(gfile%Cpi)
2957 if(
allocated(gfile%Ri))
deallocate(gfile%Ri)
2958 allocate(gfile%recname(dimrecname), gfile%reclevtyp(dimreclevtyp), &
2959 gfile%reclev(dimreclev), &
2961 allocate(gfile%vcoord(dimvcoord1,3,2) ,stat=iret2)
2962 allocate(gfile%lat(dimfield), gfile%lon(dimfield), &
2963 gfile%dx(dimfield), gfile%dy(dimfield) ,stat=iret3)
2964 allocate(gfile%Cpi(dimcpr), gfile%Ri(dimcpr), stat=iret4)
2966 iret=abs(iret1)+abs(iret2)+abs(iret3)+abs(iret4)
2968 gfile%reclev=nemsio_intfill
2971 gfile%vcoord=nemsio_realfill
2972 gfile%lat=nemsio_realfill
2973 gfile%lon=nemsio_realfill
2974 gfile%dx=nemsio_realfill
2975 gfile%dy=nemsio_realfill
2976 gfile%Cpi=nemsio_realfill
2977 gfile%Ri=nemsio_realfill
2979 if(iret.ne.0) iret=-6
2980 end subroutine nemsio_almeta
2982 subroutine nemsio_alextrameta(gfile,iret)
2987 type(nemsio_gfile),
intent(inout) :: gfile
2988 integer(nemsio_intkind),
intent(out) :: iret
2989 integer ::iret1,iret2,iret3,iret4
2992 if(gfile%extrameta)
then
2997 if(gfile%nmetavari.gt.0)
then
2998 if(
allocated(gfile%variname))
deallocate(gfile%variname)
2999 if(
allocated(gfile%varival))
deallocate(gfile%varival)
3000 allocate(gfile%variname(gfile%nmetavari), &
3001 gfile%varival(gfile%nmetavari), stat=iret1 )
3002 if(iret1.ne.0)
return
3004 if(gfile%nmetavarr.gt.0)
then
3005 if(
allocated(gfile%varrname))
deallocate(gfile%varrname)
3006 if(
allocated(gfile%varrval))
deallocate(gfile%varrval)
3007 allocate(gfile%varrname(gfile%nmetavarr), &
3008 gfile%varrval(gfile%nmetavarr), stat=iret1 )
3009 if(iret1.ne.0)
return
3011 if(gfile%nmetavarl.gt.0)
then
3012 if(
allocated(gfile%varlname))
deallocate(gfile%varlname)
3013 if(
allocated(gfile%varlval))
deallocate(gfile%varlval)
3014 allocate(gfile%varlname(gfile%nmetavarl), &
3015 gfile%varlval(gfile%nmetavarl), stat=iret1 )
3016 if(iret1.ne.0)
return
3018 if(gfile%nmetavarc.gt.0)
then
3019 if(
allocated(gfile%varcname))
deallocate(gfile%varcname)
3020 if(
allocated(gfile%varcval))
deallocate(gfile%varcval)
3021 allocate(gfile%varcname(gfile%nmetavarc), &
3022 gfile%varcval(gfile%nmetavarc), stat=iret1 )
3023 if(iret1.ne.0)
return
3025 if(gfile%nmetavarr8.gt.0)
then
3026 if(
allocated(gfile%varr8name))
deallocate(gfile%varr8name)
3027 if(
allocated(gfile%varr8val))
deallocate(gfile%varr8val)
3028 allocate(gfile%varr8name(gfile%nmetavarr8), &
3029 gfile%varr8val(gfile%nmetavarr8), stat=iret1 )
3030 if(iret1.ne.0)
return
3032 if(gfile%nmetaaryi.gt.0)
then
3033 if(
allocated(gfile%aryiname))
deallocate(gfile%aryiname)
3034 if(
allocated(gfile%aryilen))
deallocate(gfile%aryilen)
3035 if(
allocated(gfile%aryival))
deallocate(gfile%aryival)
3036 allocate(gfile%aryiname(gfile%nmetaaryi), &
3037 gfile%aryilen(gfile%nmetaaryi), stat=iret1 )
3038 if(iret1.ne.0)
return
3040 if(gfile%nmetaaryr.gt.0)
then
3041 if(
allocated(gfile%aryrname))
deallocate(gfile%aryrname)
3042 if(
allocated(gfile%aryrlen))
deallocate(gfile%aryrlen)
3043 if(
allocated(gfile%aryrval))
deallocate(gfile%aryrval)
3044 allocate(gfile%aryrname(gfile%nmetaaryr), &
3045 gfile%aryrlen(gfile%nmetaaryr), stat=iret1 )
3046 if(iret1.ne.0)
return
3048 if(gfile%nmetaaryl.gt.0)
then
3049 if(
allocated(gfile%arylname))
deallocate(gfile%arylname)
3050 if(
allocated(gfile%aryllen))
deallocate(gfile%aryllen)
3051 if(
allocated(gfile%arylval))
deallocate(gfile%arylval)
3052 allocate(gfile%arylname(gfile%nmetaaryl), &
3053 gfile%aryllen(gfile%nmetaaryl), stat=iret1 )
3054 if(iret1.ne.0)
return
3056 if(gfile%nmetaaryc.gt.0)
then
3057 if(
allocated(gfile%arycname))
deallocate(gfile%arycname)
3058 if(
allocated(gfile%aryclen))
deallocate(gfile%aryclen)
3059 if(
allocated(gfile%arycval))
deallocate(gfile%arycval)
3060 allocate(gfile%arycname(gfile%nmetaaryc), &
3061 gfile%aryclen(gfile%nmetaaryc), stat=iret1 )
3062 if(iret1.ne.0)
return
3064 if(gfile%nmetaaryr8.gt.0)
then
3065 if(
allocated(gfile%aryr8name))
deallocate(gfile%aryr8name)
3066 if(
allocated(gfile%aryr8len))
deallocate(gfile%aryr8len)
3067 if(
allocated(gfile%aryr8val))
deallocate(gfile%aryr8val)
3068 allocate(gfile%aryr8name(gfile%nmetaaryr8), &
3069 gfile%aryr8len(gfile%nmetaaryr8), stat=iret1 )
3070 if(iret1.ne.0)
return
3075 end subroutine nemsio_alextrameta
3077 subroutine nemsio_almeta1(gfile,iret)
3082 type(nemsio_gfile),
intent(inout) :: gfile
3083 integer(nemsio_intkind),
intent(out) :: iret
3084 integer :: dimvcoord1,dimnmmlev,dimnmmnsoil
3085 integer :: dimgsilev
3087 dimvcoord1=gfile%dimz+1
3088 if(
allocated(gfile%vcoord))
deallocate(gfile%vcoord)
3089 allocate(gfile%vcoord(dimvcoord1,3,2), stat=iret)
3091 gfile%vcoord=nemsio_realfill
3093 if(iret.ne.0) iret=-6
3094 end subroutine nemsio_almeta1
3096 subroutine nemsio_almeta2(gfile,iret)
3101 type(nemsio_gfile),
intent(inout) :: gfile
3102 integer(nemsio_intkind),
intent(out) :: iret
3105 dimlat=gfile%fieldsize
3106 if(
allocated(gfile%lat))
deallocate(gfile%lat)
3107 if(
allocated(gfile%lon))
deallocate(gfile%lon)
3108 if(
allocated(gfile%dx))
deallocate(gfile%dx)
3109 if(
allocated(gfile%dy))
deallocate(gfile%dy)
3110 allocate(gfile%lat(dimlat),gfile%lon(dimlat), &
3111 gfile%dx(dimlat),gfile%dy(dimlat), stat=iret)
3113 gfile%lat=nemsio_realfill
3114 gfile%lon=nemsio_realfill
3115 gfile%dx=nemsio_realfill
3116 gfile%dy=nemsio_realfill
3118 if(iret.ne.0) iret=-6
3119 end subroutine nemsio_almeta2
3121 subroutine nemsio_almeta3(gfile,iret)
3126 type(nemsio_gfile),
intent(inout) :: gfile
3127 integer(nemsio_intkind),
intent(out) :: iret
3131 if(
allocated(gfile%Cpi))
deallocate(gfile%Cpi)
3132 if(
allocated(gfile%Ri))
deallocate(gfile%Ri)
3133 allocate(gfile%Cpi(dim1d),gfile%Ri(dim1d),stat=iret)
3135 gfile%Cpi=nemsio_realfill
3136 gfile%Ri=nemsio_realfill
3138 if(iret.ne.0) iret=-6
3139 end subroutine nemsio_almeta3
3141 subroutine nemsio_almeta4(gfile,iret)
3146 type(nemsio_gfile),
intent(inout) :: gfile
3147 integer(nemsio_intkind),
intent(out) :: iret
3148 integer :: dimrecname,dimreclevtyp,dimreclev
3150 dimrecname=gfile%nrec
3151 dimreclevtyp=gfile%nrec
3152 dimreclev=gfile%nrec
3153 if(
allocated(gfile%recname))
deallocate(gfile%recname)
3154 if(
allocated(gfile%reclevtyp))
deallocate(gfile%reclevtyp)
3155 if(
allocated(gfile%reclev))
deallocate(gfile%reclev)
3156 allocate(gfile%recname(dimrecname), gfile%reclevtyp(dimreclevtyp), &
3157 gfile%reclev(dimreclev), stat=iret)
3159 gfile%reclev=nemsio_intfill
3163 if(iret.ne.0) iret=-6
3164 end subroutine nemsio_almeta4
3166 subroutine nemsio_axmeta(gfile,iret)
3171 type(nemsio_gfile),
intent(inout) :: gfile
3172 integer(nemsio_intkind),
intent(out) :: iret
3178 gfile%version=nemsio_intfill
3179 gfile%nmeta=nemsio_intfill
3180 gfile%lmeta=nemsio_intfill
3181 gfile%nrec=nemsio_intfill
3182 gfile%idate(1:7)=nemsio_intfill
3183 gfile%nfday=nemsio_intfill
3184 gfile%nfhour=nemsio_intfill
3185 gfile%nfminute=nemsio_intfill
3186 gfile%nfsecondn=nemsio_intfill
3187 gfile%nfsecondd=nemsio_intfill
3188 gfile%dimx=nemsio_intfill
3189 gfile%dimy=nemsio_intfill
3190 gfile%dimz=nemsio_intfill
3191 gfile%nframe=nemsio_intfill
3192 gfile%nsoil=nemsio_intfill
3193 gfile%ntrac=nemsio_intfill
3194 gfile%jcap=nemsio_intfill
3195 gfile%ncldt=nemsio_intfill
3196 gfile%idvc=nemsio_intfill
3197 gfile%idsl=nemsio_intfill
3198 gfile%idvm=nemsio_intfill
3199 gfile%idrt=nemsio_intfill
3200 gfile%rlon_min=nemsio_realfill
3201 gfile%rlon_max=nemsio_realfill
3202 gfile%rlat_min=nemsio_realfill
3203 gfile%rlat_max=nemsio_realfill
3204 gfile%extrameta=nemsio_logicfill
3205 gfile%nmetavari=nemsio_intfill
3206 gfile%nmetavarr=nemsio_intfill
3207 gfile%nmetavarl=nemsio_intfill
3208 gfile%nmetavarc=nemsio_intfill
3209 gfile%nmetaaryi=nemsio_intfill
3210 gfile%nmetaaryr=nemsio_intfill
3211 gfile%nmetaaryl=nemsio_intfill
3212 gfile%nmetaaryc=nemsio_intfill
3214 if(
allocated(gfile%recname))
deallocate(gfile%recname)
3215 if(
allocated(gfile%reclevtyp))
deallocate(gfile%reclevtyp)
3216 if(
allocated(gfile%reclev))
deallocate(gfile%reclev)
3217 if(
allocated(gfile%vcoord))
deallocate(gfile%vcoord)
3218 if(
allocated(gfile%lat))
deallocate(gfile%lat)
3219 if(
allocated(gfile%lon))
deallocate(gfile%lon)
3220 if(
allocated(gfile%dx))
deallocate(gfile%dx)
3221 if(
allocated(gfile%dy))
deallocate(gfile%dy)
3222 if(
allocated(gfile%Cpi))
deallocate(gfile%Cpi)
3223 if(
allocated(gfile%Ri))
deallocate(gfile%Ri)
3229 if(
allocated(gfile%cbuf))
deallocate(gfile%cbuf)
3230 if(
allocated(gfile%headvariname))
deallocate(gfile%headvariname)
3231 if(
allocated(gfile%headvarrname))
deallocate(gfile%headvarrname)
3232 if(
allocated(gfile%headvarlname))
deallocate(gfile%headvarlname)
3233 if(
allocated(gfile%headvarcname))
deallocate(gfile%headvarcname)
3234 if(
allocated(gfile%headvarival))
deallocate(gfile%headvarival)
3235 if(
allocated(gfile%headvarrval))
deallocate(gfile%headvarrval)
3236 if(
allocated(gfile%headvarlval))
deallocate(gfile%headvarlval)
3237 if(
allocated(gfile%headvarcval))
deallocate(gfile%headvarcval)
3238 if(
allocated(gfile%headaryiname))
deallocate(gfile%headaryiname)
3239 if(
allocated(gfile%headaryrname))
deallocate(gfile%headaryrname)
3240 if(
allocated(gfile%headarycname))
deallocate(gfile%headarycname)
3241 if(
allocated(gfile%headaryival))
deallocate(gfile%headaryival)
3242 if(
allocated(gfile%headaryrval))
deallocate(gfile%headaryrval)
3243 if(
allocated(gfile%headarycval))
deallocate(gfile%headarycval)
3246 end subroutine nemsio_axmeta
3248 subroutine nemsio_setfhead(gfile,iret)
3253 type(nemsio_gfile),
intent(inout) :: gfile
3254 integer(nemsio_intkind),
intent(out) :: iret
3255 integer(nemsio_intkind) i,j,k
3258 gfile%headvarinum=29
3266 allocate(gfile%headvariname(gfile%headvarinum),gfile%headvarival(gfile%headvarinum) )
3267 gfile%headvariname(1)=
'version'
3268 gfile%headvarival(1)=gfile%version
3269 gfile%headvariname(2)=
'nmeta'
3270 gfile%headvarival(2)=gfile%nmeta
3271 gfile%headvariname(3)=
'lmeta'
3272 gfile%headvarival(3)=gfile%lmeta
3273 gfile%headvariname(4)=
'nrec'
3274 gfile%headvarival(4)=gfile%nrec
3275 gfile%headvariname(5)=
'nfday'
3276 gfile%headvarival(5)=gfile%nfday
3277 gfile%headvariname(6)=
'nfhour'
3278 gfile%headvarival(6)=gfile%nfhour
3279 gfile%headvariname(7)=
'nfminute'
3280 gfile%headvarival(7)=gfile%nfminute
3281 gfile%headvariname(8)=
'nfsecondn'
3282 gfile%headvarival(8)=gfile%nfsecondn
3283 gfile%headvariname(9)=
'nfsecondd'
3284 gfile%headvarival(9)=gfile%nfsecondd
3285 gfile%headvariname(10)=
'dimx'
3286 gfile%headvarival(10)=gfile%dimx
3287 gfile%headvariname(11)=
'dimy'
3288 gfile%headvarival(11)=gfile%dimy
3289 gfile%headvariname(12)=
'dimz'
3290 gfile%headvarival(12)=gfile%dimz
3291 gfile%headvariname(13)=
'nframe'
3292 gfile%headvarival(13)=gfile%nframe
3293 gfile%headvariname(14)=
'nsoil'
3294 gfile%headvarival(14)=gfile%nsoil
3295 gfile%headvariname(15)=
'ntrac'
3296 gfile%headvarival(15)=gfile%ntrac
3297 gfile%headvariname(16)=
'jcap'
3298 gfile%headvarival(16)=gfile%jcap
3299 gfile%headvariname(17)=
'ncldt'
3300 gfile%headvarival(17)=gfile%ncldt
3301 gfile%headvariname(18)=
'idvc'
3302 gfile%headvarival(18)=gfile%idvc
3303 gfile%headvariname(19)=
'idsl'
3304 gfile%headvarival(19)=gfile%idsl
3305 gfile%headvariname(20)=
'idvm'
3306 gfile%headvarival(20)=gfile%idvm
3307 gfile%headvariname(21)=
'idrt'
3308 gfile%headvarival(21)=gfile%idrt
3309 gfile%headvariname(22)=
'nmetavari'
3310 gfile%headvarival(22)=gfile%nmetavari
3311 gfile%headvariname(23)=
'nmetavarr'
3312 gfile%headvarival(23)=gfile%nmetavarr
3313 gfile%headvariname(24)=
'nmetavarl'
3314 gfile%headvarival(24)=gfile%nmetavarl
3315 gfile%headvariname(25)=
'nmetavarc'
3316 gfile%headvarival(25)=gfile%nmetavarc
3317 gfile%headvariname(26)=
'nmetaaryi'
3318 gfile%headvarival(26)=gfile%nmetaaryi
3319 gfile%headvariname(27)=
'nmetaaryr'
3320 gfile%headvarival(27)=gfile%nmetaaryr
3321 gfile%headvariname(28)=
'nmetaaryl'
3322 gfile%headvarival(28)=gfile%nmetaaryl
3323 gfile%headvariname(29)=
'nmetaaryc'
3324 gfile%headvarival(29)=gfile%nmetaaryc
3326 allocate(gfile%headvarrname(gfile%headvarrnum),gfile%headvarrval(gfile%headvarrnum) )
3327 gfile%headvarrname(1)=
'rlon_min'
3328 gfile%headvarrval(1)=gfile%rlon_min
3329 gfile%headvarrname(2)=
'rlon_max'
3330 gfile%headvarrval(2)=gfile%rlon_max
3331 gfile%headvarrname(3)=
'rlat_min'
3332 gfile%headvarrval(3)=gfile%rlat_min
3333 gfile%headvarrname(4)=
'rlat_min'
3334 gfile%headvarrval(4)=gfile%rlat_min
3336 allocate(gfile%headvarcname(gfile%headvarcnum),gfile%headvarcval(gfile%headvarcnum) )
3337 gfile%headvarcname(1)=
'gtype'
3338 gfile%headvarcval(1)=gfile%gtype
3339 gfile%headvarcname(2)=
'modelname'
3340 gfile%headvarcval(2)=gfile%modelname
3341 gfile%headvarcname(3)=
'gdatatype'
3342 gfile%headvarcval(3)=gfile%gdatatype
3345 allocate(gfile%headvarlname(gfile%headvarlnum),gfile%headvarlval(gfile%headvarlnum) )
3346 gfile%headvarlname(1)=
'extrameta'
3347 gfile%headvarlval(1)=gfile%extrameta
3351 allocate(gfile%headaryiname(gfile%headaryinum) )
3352 allocate(gfile%headaryival(max(
size(gfile%reclev),7),gfile%headaryinum))
3353 gfile%headaryiname(1)=
'idate'
3354 gfile%headaryival(1:7,1)=gfile%idate(1:7)
3355 gfile%headaryiname(2)=
'reclev'
3356 if(
allocated(gfile%reclev)) gfile%headaryival(:,2)=gfile%reclev(:)
3360 allocate(gfile%headaryrname(gfile%headaryrnum) )
3361 allocate(gfile%headaryrval(max(gfile%fieldsize,(gfile%dimz+1)*6),gfile%headaryrnum))
3362 gfile%headaryrname(1)=
'vcoord'
3363 if(
allocated(gfile%vcoord))
then
3367 gfile%headaryrval(k+((j-1)*3+i-1)*(gfile%dimz+1),1)=gfile%vcoord(k,i,j)
3372 gfile%headaryrname(2)=
'lat'
3373 if(
allocated(gfile%lat)) gfile%headaryrval(:,2)=gfile%lat
3374 gfile%headaryrname(3)=
'lon'
3375 if(
allocated(gfile%lon)) gfile%headaryrval(:,3)=gfile%lon
3376 gfile%headaryrname(4)=
'dx'
3377 if(
allocated(gfile%dx)) gfile%headaryrval(:,4)=gfile%dx
3378 gfile%headaryrname(5)=
'dy'
3379 if(
allocated(gfile%dy)) gfile%headaryrval(:,5)=gfile%dy
3380 gfile%headaryrname(6)=
'cpi'
3381 if(
allocated(gfile%cpi)) gfile%headaryrval(1:
size(gfile%cpi),6)=gfile%cpi(:)
3382 gfile%headaryrname(7)=
'ri'
3383 if(
allocated(gfile%ri)) gfile%headaryrval(1:
size(gfile%ri),7)=gfile%ri(:)
3387 allocate(gfile%headarycname(gfile%headarycnum) )
3388 if(
size(gfile%recname)>0)
then
3389 allocate(gfile%headarycval(
size(gfile%recname),gfile%headarycnum))
3390 gfile%headarycname(1)=
'recname'
3391 if(
allocated(gfile%recname)) gfile%headarycval(:,1)=gfile%recname
3392 gfile%headarycname(2)=
'reclevtyp'
3393 if(
allocated(gfile%reclevtyp)) gfile%headarycval(:,2)=gfile%reclevtyp
3398 end subroutine nemsio_setfhead
3400 subroutine nemsio_getrechead(gfile,jrec,name,levtyp,lev,iret)
3405 type(nemsio_gfile),
intent(in) :: gfile
3406 integer(nemsio_intkind),
intent(in) :: jrec
3407 character*(*),
intent(out) :: name,levtyp
3408 integer(nemsio_intkind),
intent(out) :: lev
3409 integer(nemsio_intkind),
optional,
intent(out) :: iret
3412 if(
present(iret)) iret=-6
3413 if ( jrec.gt.0 .or. jrec.le.gfile%nrec)
then
3414 name=gfile%recname(jrec)
3415 levtyp=gfile%reclevtyp(jrec)
3416 lev=gfile%reclev(jrec)
3417 if(
present(iret)) iret=0
3420 if (
present(iret))
then
3426 end subroutine nemsio_getrechead
3428 subroutine nemsio_gfinit(gfile,iret,recname,reclevtyp,reclev)
3433 type(nemsio_gfile),
intent(inout) :: gfile
3434 integer(nemsio_intkind),
intent(out) :: iret
3435 character(nemsio_charkind),
optional,
intent(in) :: recname(:)
3436 character(nemsio_charkind*2),
optional,
intent(in):: reclevtyp(:)
3437 integer(nemsio_intkind),
optional,
intent(in) :: reclev(:)
3438 integer :: i,j,rec,rec3dopt
3439 real(nemsio_dblekind),
allocatable :: slat(:),wlat(:)
3440 real(nemsio_dblekind),
allocatable :: dx(:)
3441 real(nemsio_dblekind) :: radi
3447 gfile%version=200809
3453 gfile%extrameta=.false.
3464 end subroutine nemsio_gfinit
3466 subroutine nemsio_stop(message)
3468 character(*),
optional,
intent(in) :: message
3471 if (
present(message) ) print *,
'message'
3472 call mpi_finalize(ios)
3475 end subroutine nemsio_stop
3478 subroutine nemsio_denseread4(gfile,ista,iend,jsta,jend,data,iret)
3484 type(nemsio_gfile),
intent(inout) :: gfile
3485 integer,
intent(in) :: ista,iend,jsta,jend
3486 real(nemsio_realkind),
intent(out) :: data(:)
3487 integer,
optional,
intent(out) :: iret
3489 integer :: status(MPI_STATUS_SIZE)
3490 integer :: fieldmapsize,nfld,nfldloop,mfldrmd
3491 integer,
allocatable :: fieldmap(:)
3492 integer ios,i,j,nfldsize,fieldmapsize1,k,nstt,nend
3494 real(nemsio_dblekind),
allocatable :: tmp(:)
3498 if(
size(data)/=(iend-ista+1)*(jend-jsta+1)*gfile%nrec)
then
3499 print *,
'WRONG: data size ',
size(data),
' doesn"t match total subdomain data size', &
3500 (iend-ista+1)*(jend-jsta+1)*gfile%nrec
3504 if(gfile%gdatatype(1:4).eq.
'bin4')
then
3505 nfldsize=gfile%fieldsize+2
3506 elseif (gfile%gdatatype(1:4).eq.
'bin8')
then
3507 nfldsize=gfile%fieldsize+1
3509 nfld=min(gfile%nrec,nemsio_maxint/nfldsize)
3510 nfldloop=(gfile%nrec-1)/nfld+1
3511 mfldrmd=mod(gfile%nrec,nfld)
3515 fieldmapsize=(iend-ista+1)*(jend-jsta+1)*nfld
3516 allocate(fieldmap(fieldmapsize) )
3517 call set_mpimap_read(gfile,ista,iend,jsta,jend,fieldmap,ios)
3522 if(k<nfldloop.or.mfldrmd==0)
then
3523 nstt=(k-1)*fieldmapsize+1
3525 elseif(mfldrmd/=0)
then
3526 nstt=(k-1)*fieldmapsize+1
3527 nend=gfile%nrec*(iend-ista+1)*(jend-jsta+1)
3528 deallocate(fieldmap)
3529 fieldmapsize=(iend-ista+1)*(jend-jsta+1)*mfldrmd
3530 allocate(fieldmap(fieldmapsize) )
3532 call set_mpimap_read(gfile,ista,iend,jsta,jend,fieldmap,ios)
3536 if(gfile%gdatatype(1:4)==
'bin4')
then
3537 idispstt=int(k-1,8)*int(nfld,8)*int(gfile%fieldsize*4+8,8)
3538 call readmpi4(gfile,fieldmapsize,fieldmap,
data(nstt:nend),ios,idispstt)
3539 else if (gfile%gdatatype(1:4)==
'bin8')
then
3540 allocate(tmp(
size(data)))
3541 idispstt=int(k-1,8)*int(nfld,8)*int(gfile%fieldsize*8+8,8)
3542 call readmpi8(gfile,fieldmapsize,fieldmap,tmp(nstt:nend),ios,idispstt)
3549 if(
allocated(fieldmap))
deallocate(fieldmap)
3553 end subroutine nemsio_denseread4
3555 subroutine nemsio_denseread8(gfile,ista,iend,jsta,jend,data,iret)
3561 type(nemsio_gfile),
intent(inout) :: gfile
3562 integer,
intent(in) :: ista,iend,jsta,jend
3563 real(nemsio_dblekind),
intent(out) :: data(:)
3564 integer,
optional,
intent(out) :: iret
3566 integer :: fieldmapsize
3567 integer,
allocatable :: fieldmap(:)
3568 integer ios,i,j,nfldsize,nfld,nfldloop,mfldrmd,k,nstt,nend
3570 real(nemsio_realkind),
allocatable :: tmp(:)
3574 if(
size(data)/=(iend-ista+1)*(jend-jsta+1)*gfile%nrec)
then
3575 print *,
'WRONG: data size ',
size(data),
' doesn"t match total subdomain data size', &
3576 (iend-ista+1)*(jend-jsta+1)*gfile%nrec
3580 if(gfile%gdatatype(1:4).eq.
'bin4')
then
3581 nfldsize=gfile%fieldsize+2
3582 elseif (gfile%gdatatype(1:4).eq.
'bin8')
then
3583 nfldsize=gfile%fieldsize+1
3585 nfld=min(gfile%nrec,nemsio_maxint/nfldsize)
3586 nfldloop=(gfile%nrec-1)/nfld+1
3587 mfldrmd=mod(gfile%nrec,nfld)
3591 fieldmapsize=(iend-ista+1)*(jend-jsta+1)*nfld
3592 allocate(fieldmap(fieldmapsize) )
3593 call set_mpimap_read(gfile,ista,iend,jsta,jend,fieldmap,ios)
3598 if(k<nfldloop.or.mfldrmd==0)
then
3599 nstt=(k-1)*fieldmapsize+1
3601 elseif(mfldrmd/=0)
then
3602 nstt=(k-1)*fieldmapsize+1
3603 nend=gfile%nrec*(iend-ista+1)*(jend-jsta+1)
3604 deallocate(fieldmap)
3605 fieldmapsize=(iend-ista+1)*(jend-jsta+1)*mfldrmd
3606 allocate(fieldmap(fieldmapsize) )
3607 call set_mpimap_read(gfile,ista,iend,jsta,jend,fieldmap,ios)
3612 if(gfile%gdatatype(1:4)==
'bin4')
then
3613 allocate(tmp(
size(data)))
3614 idispstt=int(k-1,8)*int(nfld,8)*int(gfile%fieldsize*4+8,8)
3615 call readmpi4(gfile,fieldmapsize,fieldmap,tmp,ios,idispstt)
3618 elseif(gfile%gdatatype(1:4)==
'bin8')
then
3619 idispstt=int(k-1,8)*int(nfld,8)*int(gfile%fieldsize*8+8,8)
3620 call readmpi8(gfile,fieldmapsize,fieldmap,
data,ios,idispstt)
3624 if(
allocated(fieldmap))
deallocate(fieldmap)
3628 end subroutine nemsio_denseread8
3630 subroutine readmpi4(gfile,fieldmapsize,fieldmap,data,iret,idispstt)
3636 type(nemsio_gfile),
intent(inout) :: gfile
3637 integer,
intent(in) :: fieldmapsize
3638 integer,
intent(in) :: fieldmap(fieldmapsize)
3639 real(nemsio_realkind),
intent(out) :: data(fieldmapsize)
3640 integer,
optional,
intent(out) :: iret
3641 integer(8),
optional,
intent(in) :: idispstt
3643 integer(MPI_OFFSET_KIND) :: idisp
3644 integer :: filetype,ios
3645 integer :: status(MPI_STATUS_SIZE)
3648 call mpi_type_create_indexed_block(fieldmapsize,1,fieldmap, &
3649 mpi_real,filetype,ios)
3651 call mpi_type_commit(filetype,iret)
3652 if ( ios.ne.0 )
then
3653 if (
present(iret))
then
3657 call nemsio_stop(
'stop at MPI set field map!')
3662 if(
present(idispstt))
then
3663 idisp=gfile%tlmeta+4+idispstt
3665 idisp=gfile%tlmeta+4
3667 call mpi_file_set_view(gfile%fh,idisp,mpi_real4,filetype,
'native', &
3669 call mpi_file_read_all(gfile%fh,
data,fieldmapsize,mpi_real4, &
3671 if ( ios.ne.0 )
then
3672 if (
present(iret))
then
3676 call nemsio_stop(
'stop at MPI read file all for bin4!')
3679 if(gfile%do_byteswap)
call byteswap(
data,nemsio_realkind,
size(data))
3683 end subroutine readmpi4
3685 subroutine readmpi8(gfile,fieldmapsize,fieldmap,data,iret,idispstt)
3691 type(nemsio_gfile),
intent(inout) :: gfile
3692 integer,
intent(in) :: fieldmapsize
3693 integer,
intent(in) :: fieldmap(fieldmapsize)
3694 real(nemsio_dblekind),
intent(out) :: data(fieldmapsize)
3695 integer,
optional,
intent(out) :: iret
3696 integer(8),
optional,
intent(in) :: idispstt
3698 integer(MPI_OFFSET_KIND) :: idisp
3699 integer :: filetype,ios
3700 integer :: status(MPI_STATUS_SIZE)
3705 call mpi_type_create_indexed_block(fieldmapsize,1,fieldmap, &
3706 mpi_real8,filetype,ios)
3707 call mpi_type_commit(filetype,iret)
3708 if ( ios.ne.0 )
then
3709 if (
present(iret))
then
3713 call nemsio_stop(
'stop at MPI set field map!')
3718 if(
present(idispstt))
then
3719 idisp=gfile%tlmeta+4+idispstt
3721 idisp=gfile%tlmeta+4
3723 call mpi_file_set_view(gfile%fh,idisp,mpi_real8,filetype,
'native', &
3725 call mpi_file_read_all(gfile%fh,
data,fieldmapsize,mpi_real8, &
3727 if ( ios.ne.0 )
then
3728 if (
present(iret))
then
3732 call nemsio_stop(
'stop at MPI read file all for bin8!')
3738 end subroutine readmpi8
3740 subroutine set_mpimap_read(gfile,ista,iend,jsta,jend,fieldmap,iret,jrec)
3746 type(nemsio_gfile),
intent(in) :: gfile
3747 integer,
intent(in) :: ista,iend,jsta,jend
3748 integer,
intent(out) :: fieldmap(:)
3749 integer,
intent(out) :: iret
3750 integer,
optional,
intent(in) :: jrec
3752 integer i,j,k,m,jm,km,nfieldsize,nfld,krec,kstart
3756 if(gfile%gdatatype(1:4).eq.
'bin4')
then
3757 nfieldsize=gfile%fieldsize+2
3758 elseif (gfile%gdatatype(1:4).eq.
'bin8')
then
3759 nfieldsize=gfile%fieldsize+1
3762 if(
present(jrec))
then
3767 nfld=
size(fieldmap)/((iend-ista+1)*(jend-jsta+1))
3770 kstart=(krec-1)*nfieldsize
3775 if (gfile%nframe.eq.0)
then
3778 km=(k-1)*nfieldsize+kstart-1
3787 else if(gfile%nframe.gt.0)
then
3790 km=(k-1)*nfieldsize+kstart-1
3792 jm=(j-1)*(gfile%dimx+2*gfile%nframe)
3803 end subroutine set_mpimap_read
3805 subroutine set_mpimap_wrt(gfile,ista,iend,jsta,jend,fieldmap,iret,jrec)
3811 type(nemsio_gfile),
intent(in) :: gfile
3812 integer,
intent(in) :: ista,iend,jsta,jend
3813 integer,
intent(out) :: fieldmap(:)
3814 integer,
intent(out) :: iret
3815 integer,
optional,
intent(in) :: jrec
3817 integer i,j,k,m,jm,km,nfieldsize,nfld,krec,kstart,inum
3821 if(
present(jrec))
then
3826 if(gfile%mype==gfile%lead_task)
then
3827 nfld=
size(fieldmap)/((iend-ista+1)*(jend-jsta+1)+2)
3829 nfld=
size(fieldmap)/((iend-ista+1)*(jend-jsta+1))
3833 nfieldsize=gfile%fieldsize+2
3834 kstart=(krec-1)*nfieldsize
3837 if (gfile%nframe.eq.0)
then
3839 elseif(gfile%nframe.gt.0)
then
3840 inum=gfile%dimx+2*gfile%nframe
3845 km=(k-1)*nfieldsize+kstart
3846 if(gfile%mype.eq.gfile%lead_task)
then
3857 if(gfile%mype.eq.gfile%lead_task)
then
3859 fieldmap(m)=km+nfieldsize-1
3865 end subroutine set_mpimap_wrt
3867 subroutine nemsio_densewrite4(gfile,ista,iend,jsta,jend,data,jrecs,jrece,iret)
3873 type(nemsio_gfile),
intent(inout) :: gfile
3874 integer,
intent(in) :: ista,iend,jsta,jend
3875 real(nemsio_realkind),
intent(in) :: data(:)
3876 integer,
optional,
intent(in) :: jrecs,jrece
3877 integer,
optional,
intent(out) :: iret
3879 real(nemsio_dblekind),
allocatable :: data8(:)
3881 if(gfile%gdatatype(1:4)==
'bin4')
then
3882 call mpi_densewrite4(gfile,ista,iend,jsta,jend,
data,jrecs,jrece,iret)
3883 else if (gfile%gdatatype(1:4)==
'bin8')
then
3884 allocate(data8(
size(data)))
3886 call mpi_densewrite8(gfile,ista,iend,jsta,jend,data8,jrecs,jrece,iret)
3890 end subroutine nemsio_densewrite4
3892 subroutine nemsio_densewrite8(gfile,ista,iend,jsta,jend,data,jrecs,jrece,iret)
3898 type(nemsio_gfile),
intent(inout) :: gfile
3899 integer,
intent(in) :: ista,iend,jsta,jend
3900 real(nemsio_dblekind),
intent(in) :: data(:)
3901 integer,
optional,
intent(in) :: jrecs,jrece
3902 integer,
optional,
intent(out) :: iret
3904 real(nemsio_realkind),
allocatable :: data4(:)
3906 if(gfile%gdatatype(1:4)==
'bin4')
then
3907 allocate(data4(
size(data)))
3909 call mpi_densewrite4(gfile,ista,iend,jsta,jend,data4,jrecs,jrece,iret)
3911 else if (gfile%gdatatype(1:4)==
'bin8')
then
3912 call mpi_densewrite8(gfile,ista,iend,jsta,jend,
data,jrecs,jrece,iret)
3915 end subroutine nemsio_densewrite8
3918 subroutine mpi_densewrite4(gfile,ista,iend,jsta,jend,data,jrecs,jrece,iret)
3924 type(nemsio_gfile),
intent(inout) :: gfile
3925 integer,
intent(in) :: ista,iend,jsta,jend
3926 real(nemsio_realkind),
intent(in) :: data(:)
3927 integer,
optional,
intent(in) :: jrecs,jrece
3928 integer,
optional,
intent(out) :: iret
3930 integer :: i,ios,nfldsize,nfld,nfldloop,mfldrmd,k
3931 integer :: fieldmapsize,fldmapsize1,fldmapsize
3932 integer,
allocatable :: fieldmap(:)
3933 real(nemsio_realkind),
allocatable :: datatmp(:)
3934 integer irecs,irece,nfldlp,mrec,mrecs,filetype
3935 integer(8) idispstt,fielddatasize
3940 if(
present(jrecs).and.
present(jrece))
then
3947 nfldsize=gfile%fieldsize+2
3948 nfld=min(mrec,nemsio_maxint/(nfldsize*2))
3949 nfldloop=(mrec-1)/nfld+1
3950 mfldrmd=mod(mrec,nfld)
3953 if(gfile%mype==gfile%lead_task)
then
3954 fieldmapsize=((iend-ista+1)*(jend-jsta+1)+2)*nfld
3955 fldmapsize=(iend-ista+1)*(jend-jsta+1)+2
3956 fldmapsize1=(iend-ista+1)*(jend-jsta+1)
3958 fldmapsize=(iend-ista+1)*(jend-jsta+1)
3959 fieldmapsize=(iend-ista+1)*(jend-jsta+1)*nfld
3961 allocate(datatmp(fieldmapsize))
3962 allocate(fieldmap(fieldmapsize) )
3963 call set_mpimap_wrt(gfile,ista,iend,jsta,jend,fieldmap,ios)
3967 call mpi_type_create_indexed_block(fieldmapsize,1,fieldmap, &
3968 mpi_real,filetype,ios)
3969 call mpi_type_commit(filetype,ios)
3970 if ( ios.ne.0 )
then
3971 if (
present(iret))
then
3975 call nemsio_stop(
'stop: at write set type indexed block')
3983 if(k<nfldloop.or.mfldrmd==0)
then
3986 elseif(mfldrmd/=0)
then
3987 deallocate(fieldmap,datatmp)
3988 fieldmapsize=fldmapsize*mfldrmd
3989 allocate(fieldmap(fieldmapsize) )
3990 allocate(datatmp(fieldmapsize) )
3991 call set_mpimap_wrt(gfile,ista,iend,jsta,jend,fieldmap,ios)
3995 call mpi_type_create_indexed_block(fieldmapsize,1,fieldmap, &
3996 mpi_real,filetype,ios)
3997 call mpi_type_commit(filetype,ios)
3998 if ( ios.ne.0 )
then
3999 if (
present(iret))
then
4003 call nemsio_stop(
'stop: at write set type indexed block')
4013 if(gfile%mype.eq.gfile%lead_task)
then
4014 datatmp((i-1)*fldmapsize+1)=gfile%fieldsize_real4
4015 datatmp(i*fldmapsize)=datatmp(1)
4016 datatmp((i-1)*fldmapsize+2:i*fldmapsize-1)=
data((irecs+i-1)*fldmapsize1+1:(irecs+i)*fldmapsize1)
4018 datatmp((i-1)*fldmapsize+1:i*fldmapsize)=
data((irecs+i-1)*fldmapsize+1:(irecs+i)*fldmapsize)
4022 idispstt=(int(k-1,8)*int(nfld,8)+int(mrecs-1,8))*int(nfldsize*4,8)
4024 call writempi4(gfile,fieldmapsize,filetype,datatmp,iret=iret, &
4026 if (iret.ne.0)
return
4029 deallocate(fieldmap,datatmp)
4033 end subroutine mpi_densewrite4
4035 subroutine mpi_densewrite8(gfile,ista,iend,jsta,jend,data,jrecs,jrece,iret)
4041 type(nemsio_gfile),
intent(inout) :: gfile
4042 integer,
intent(in) :: ista,iend,jsta,jend
4043 real(nemsio_dblekind),
intent(in) :: data(:)
4044 integer,
optional,
intent(in) :: jrecs,jrece
4045 integer,
optional,
intent(out) :: iret
4047 integer :: i,ios,nfldsize,nfld,nfldloop,mfldrmd,k
4048 integer :: fieldmapsize,fldmapsize,fldmapsize1,fielddatasize
4049 integer,
allocatable :: fieldmap(:)
4050 real(nemsio_dblekind),
allocatable :: datatmp(:)
4051 integer irecs,irece,nfldlp,mrec,mrecs
4058 if(
present(jrecs).and.
present(jrece))
then
4065 nfldsize=gfile%fieldsize+2
4066 nfld=min(mrec,nemsio_maxint/(nfldsize*2))
4067 nfldloop=(mrec-1)/nfld+1
4068 mfldrmd=mod(mrec,nfld)
4073 if(gfile%mype==gfile%lead_task)
then
4074 fieldmapsize=((iend-ista+1)*(jend-jsta+1)+2)*nfld
4075 fldmapsize=(iend-ista+1)*(jend-jsta+1)+2
4076 fldmapsize1=(iend-ista+1)*(jend-jsta+1)
4078 fldmapsize=(iend-ista+1)*(jend-jsta+1)
4079 fieldmapsize=(iend-ista+1)*(jend-jsta+1)*nfld
4081 allocate(datatmp(fieldmapsize))
4082 allocate(fieldmap(fieldmapsize) )
4083 call set_mpimap_wrt(gfile,ista,iend,jsta,jend,fieldmap,ios)
4087 call mpi_type_create_indexed_block(fieldmapsize,1,fieldmap, &
4088 mpi_real8,filetype,ios)
4089 call mpi_type_commit(filetype,ios)
4090 if ( ios.ne.0 )
then
4091 if (
present(iret))
then
4095 call nemsio_stop(
'stop: at write set type indexed block')
4103 if(k<nfldloop.or.mfldrmd==0)
then
4106 elseif(mfldrmd/=0)
then
4107 deallocate(fieldmap,datatmp)
4108 fieldmapsize=fldmapsize*mfldrmd
4109 allocate(fieldmap(fieldmapsize) )
4110 allocate(datatmp(fieldmapsize) )
4111 call set_mpimap_wrt(gfile,ista,iend,jsta,jend,fieldmap,ios)
4115 call mpi_type_create_indexed_block(fieldmapsize,1,fieldmap, &
4116 mpi_real8,filetype,ios)
4117 call mpi_type_commit(filetype,ios)
4118 if ( ios.ne.0 )
then
4119 if (
present(iret))
then
4123 call nemsio_stop(
'stop: at write set type indexed block')
4133 if(gfile%mype.eq.gfile%lead_task)
then
4134 datatmp((i-1)*fldmapsize+1)=gfile%fieldsize_real8
4135 datatmp(i*fldmapsize+2)=datatmp(1)
4136 datatmp((i-1)*fldmapsize+2:i*fldmapsize+1)=
data((irecs+i-1)*fldmapsize1+1:(irecs+i)*fldmapsize1)
4138 datatmp((i-1)*fldmapsize+1:i*fldmapsize)=
data((irecs+i-1)*fldmapsize+1:(irecs+i)*fldmapsize)
4142 idispstt=(int(k-1,8)*int(nfld,8)+int(mrecs-1,8))*int(gfile%fieldsize*8+8,8)
4144 call writempi8(gfile,fieldmapsize,filetype,datatmp,iret=iret,idispstt=idispstt)
4147 deallocate(fieldmap,datatmp)
4151 end subroutine mpi_densewrite8
4153 subroutine writempi4(gfile,fieldmapsize,filetype,data,iret,idispstt)
4159 type(nemsio_gfile),
intent(inout) :: gfile
4160 integer,
intent(in) :: fieldmapsize
4161 integer,
intent(in) :: filetype
4162 real(nemsio_realkind),
intent(in) :: data(:)
4163 integer,
optional,
intent(out) :: iret
4164 integer(8),
optional,
intent(in) :: idispstt
4166 integer(MPI_OFFSET_KIND) :: idisp
4167 integer :: status(MPI_STATUS_SIZE)
4172 if(
present(idispstt))
then
4173 idisp=gfile%tlmeta+idispstt
4177 call mpi_file_set_view(gfile%fh,idisp,mpi_real4,filetype,
'native', &
4179 if(gfile%do_byteswap)
call byteswap(
data,nemsio_realkind,
size(data))
4180 call mpi_file_write_all(gfile%fh,
data,fieldmapsize,mpi_real4, &
4182 if(gfile%do_byteswap)
call byteswap(
data,nemsio_realkind,
size(data))
4183 if ( ios.ne.0 )
then
4184 if (
present(iret))
then
4188 call nemsio_stop(
'stop: at MPI write all for bin4')
4194 end subroutine writempi4
4196 subroutine writempi8(gfile,fieldmapsize,filetype,data,iret,idispstt)
4202 type(nemsio_gfile),
intent(inout) :: gfile
4203 integer,
intent(in) :: fieldmapsize
4204 integer,
intent(in) :: filetype
4205 real(nemsio_dblekind),
intent(in) :: data(:)
4206 integer,
optional,
intent(out) :: iret
4207 integer(8),
optional,
intent(in) :: idispstt
4209 integer(MPI_OFFSET_KIND) :: idisp
4210 integer :: status(MPI_STATUS_SIZE)
4217 if(
present(idispstt))
then
4218 idisp=gfile%tlmeta+idispstt
4222 call mpi_file_set_view(gfile%fh,idisp,mpi_real8,filetype,
'native', &
4224 if(gfile%do_byteswap)
call byteswap(
data,nemsio_dblekind,
size(data))
4225 call mpi_file_write_all(gfile%fh,
data,fieldmapsize,mpi_real8, &
4227 if ( ios.ne.0 )
then
4228 if (
present(iret))
then
4232 call nemsio_stop(
'stop: at MPI write all for bin8')
4235 if(gfile%do_byteswap)
call byteswap(
data,nemsio_dblekind,
size(data))
4239 end subroutine writempi8
4243 elemental function equal_str_nocase(str1,str2)
4249 logical :: equal_str_nocase
4250 Character (len=*) ,
intent(in) :: str1
4251 Character (len=*) ,
intent(in) :: str2
4252 integer :: i,ic1,ic2,nlen
4255 if(len(str1)/=nlen)
then
4256 equal_str_nocase=.false.
4259 equal_str_nocase=.false.
4261 ic1 = ichar(str1(i:i))
4262 if (ic1 >= 65 .and. ic1 < 91) ic1 = ic1+32
4263 ic2 = ichar(str2(i:i))
4264 if (ic2 >= 65 .and. ic2 < 91) ic2 = ic2+32
4266 equal_str_nocase=.false.
4270 equal_str_nocase=.true.
4274 end function equal_str_nocase
4278 subroutine chk_endianc(endian)
4282 character(16),
intent(out) :: endian
4284 INTEGER,
PARAMETER :: ASCII_0 = 48,ascii_1 = 49,ascii_2 = 50, &
4291 i = ascii_0 + ascii_1*256 + ascii_2*(256**2) + ascii_3*(256**3)
4296 end subroutine chk_endianc
4300 subroutine sub(endian)
4304 character(16),
intent(out) :: endian
4309 if(i .eq.
'0123')
then
4311 endian=
'little_endian'
4313 elseif (i .eq.
'3210')
then
4319 endian=
'mixed_endian'
4328 end module nemsio_module_mpi