45# if defined PIO_LIB && defined DISTRIBUTE
57 logical,
intent(in) :: ldef
59 integer,
intent(in) :: ng
63 character (len=*),
parameter :: myfile = &
70 SELECT CASE (
flt(ng)%IOtype)
74# if defined PIO_LIB && defined DISTRIBUTE
84 10
FORMAT (
' DEF_FLOATS - Illegal output file type, io_type = ',i0, &
85 & /,14x,
'Check KeyWord ''OUT_LIB'' in ''roms.in''.')
98 integer,
intent(in) :: ng
100 logical,
intent(in) :: ldef
104 logical :: got_var(-6:
nv)
106 integer,
parameter :: natt = 25
108 integer :: fltdim, i, itrc, j, l
109 integer :: recdim, status
112 integer :: fgrd(2), start(2), total(2)
114 real(r8) :: aval(6), tinp(
nfloats(ng))
116 character (len=256) :: ncname
117 character (len=MaxLen) :: vinfo(natt)
119 character (len=*),
parameter :: myfile = &
120 & __FILE__//
", def_floats_nf90"
133 WRITE (
stdout,10) ng, trim(ncname)
135 WRITE (
stdout,20) ng, trim(ncname)
143 define :
IF (ldef)
THEN
162 &
n(ng)+1, dimids(10))
166 &
nt(ng), dimids(11))
218 & nf90_unlimited, dimids(12))
259 WRITE (vinfo( 3),
'(a,a)')
'seconds since ', trim(
rclock%string)
260 vinfo( 4)=trim(
rclock%calendar)
263 &
nf_tout, 1, (/recdim/), aval, vinfo, ncname, &
264 & setparaccess = .true.)
270 vinfo( 2)=
'x-grid floats locations'
271 vinfo( 5)=
'valid_min'
272 vinfo( 6)=
'valid_max'
274 aval(3)=real(
lm(ng)+1,r8)
275 vinfo(14)=
'Xgrid, scalar, series'
277# ifndef NO_4BYTE_REALS
278 vinfo(24)=
'_FillValue'
282 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
288 vinfo( 2)=
'Y-grid floats locations'
289 vinfo( 5)=
'valid_min'
290 vinfo( 6)=
'valid_max'
292 aval(3)=real(
mm(ng)+1,r8)
293 vinfo(14)=
'Ygrid, scalar, series'
295# ifndef NO_4BYTE_REALS
296 vinfo(24)=
'_FillValue'
300 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
308 vinfo( 2)=
'Z-grid floats locations'
309 vinfo( 5)=
'valid_min'
310 vinfo( 6)=
'valid_max'
312 aval(3)=real(
n(ng),r8)
313 vinfo(14)=
'Zgrid, scalar, series'
315# ifndef NO_4BYTE_REALS
316 vinfo(24)=
'_FillValue'
320 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
328 vinfo( 2)=
'longitude of floats trajectories'
329 vinfo( 3)=
'degree_east'
330 vinfo( 5)=
'valid_min'
331 vinfo( 6)=
'valid_max'
332 vinfo(14)=
'lon, scalar, series'
334# ifndef NO_4BYTE_REALS
335 vinfo(24)=
'_FillValue'
341 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
345 vinfo( 2)=
'latitude of floats trajectories'
346 vinfo( 3)=
'degree_north'
347 vinfo( 5)=
'valid_min'
348 vinfo( 6)=
'valid_max'
349 vinfo(14)=
'lat, scalar, series'
351# ifndef NO_4BYTE_REALS
352 vinfo(24)=
'_FillValue'
358 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
362 vinfo( 2)=
'x-location of floats trajectories'
364 vinfo(14)=
'x, scalar, series'
366# ifndef NO_4BYTE_REALS
367 vinfo(24)=
'_FillValue'
371 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
375 vinfo( 2)=
'y-location of floats trajectories'
377 vinfo(14)=
'y, scalar, series'
379# ifndef NO_4BYTE_REALS
380 vinfo(24)=
'_FillValue'
384 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
393 vinfo( 2)=
'depth of floats trajectories'
395 vinfo(14)=
'depth, scalar, series'
397# ifndef NO_4BYTE_REALS
398 vinfo(24)=
'_FillValue'
402 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
412# ifndef NO_4BYTE_REALS
413 vinfo(24)=
'_FillValue'
417 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
428# ifndef NO_4BYTE_REALS
429 vinfo(24)=
'_FillValue'
434 IF (itrc.eq.
idsed(i))
THEN
435 WRITE (vinfo(19),40) 1000.0_r8*
sd50(i,ng)
440 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
449 vinfo( 1)=
'swim_time'
450 vinfo( 2)=
'biological float swimming time'
452 vinfo(14)=
'swim_time, scalar, series'
454# ifndef NO_4BYTE_REALS
455 vinfo(24)=
'_FillValue'
459 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
465 vinfo( 2)=
'biological float vertical velocity'
467 vinfo(14)=
'w_bio, scalar, series'
469# ifndef NO_4BYTE_REALS
470 vinfo(24)=
'_FillValue'
474 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
480 vinfo( 2)=
'biological float size'
482 vinfo(14)=
'bio_size, scalar, series'
484# ifndef NO_4BYTE_REALS
485 vinfo(24)=
'_FillValue'
489 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
495 vinfo( 2)=
'biological float sinking velocity'
497 vinfo(14)=
'bio_sink, scalar, series'
499# ifndef NO_4BYTE_REALS
500 vinfo(24)=
'_FillValue'
504 &
nf_fout, 2, fgrd, aval, vinfo, ncname)
532 query :
IF (.not.ldef)
THEN
539 WRITE (
stdout,50) trim(ncname)
546 & ncid =
flt(ng)%ncid)
552 IF (trim(
dim_name(i)).eq.
'drifter')
THEN
561 & ncid =
flt(ng)%ncid)
577 ELSE IF (trim(
var_name(i)).eq.
'Xgrid')
THEN
580 ELSE IF (trim(
var_name(i)).eq.
'Ygrid')
THEN
584 ELSE IF (trim(
var_name(i)).eq.
'Zgrid')
THEN
601 ELSE IF (trim(
var_name(i)).eq.
'depth')
THEN
609 ELSE IF (trim(
var_name(i)).eq.
'swim_time')
THEN
612 ELSE IF (trim(
var_name(i)).eq.
'w_bio')
THEN
615 ELSE IF (trim(
var_name(i)).eq.
'bio_size')
THEN
618 ELSE IF (trim(
var_name(i)).eq.
'bio_sink')
THEN
626 got_var(
idtvar(itrc))=.true.
635 IF (.not.got_var(
idtime))
THEN
641 IF (.not.got_var(
idxgrd))
THEN
646 IF (.not.got_var(
idygrd))
THEN
652 IF (.not.got_var(
idzgrd))
THEN
658 IF (.not.got_var(
idglon))
THEN
667 IF (.not.got_var(
idglat))
THEN
677 IF (.not.got_var(
iddpth))
THEN
682 IF (.not.got_var(
iddano))
THEN
690 IF (.not.got_var(
idswim))
THEN
695 IF (.not.got_var(
idwbio))
THEN
700 IF (.not.got_var(
idsize))
THEN
705 IF (.not.got_var(
idwsin))
THEN
713 IF (.not.got_var(
idtvar(itrc)))
THEN
728 IF (
frrec(ng).lt.0)
THEN
746 & ncid =
flt(ng)%ncid, &
747 & start = (/1,
flt(ng)%Rindex/), &
752 IF ((tinp(l).gt.real(
n(ng),r8)).or. &
753 & (tinp(l).lt.0.0_r8))
THEN
767 & ncid =
flt(ng)%ncid, &
768 & start = (/1,
flt(ng)%Rindex/), &
773 IF ((tinp(l).gt.real(
lm(ng)+1,r8)-0.5_r8).or. &
774 & (tinp(l).lt.0.5_r8))
THEN
787 & ncid =
flt(ng)%ncid, &
788 & start = (/1,
flt(ng)%Rindex/), &
793 IF ((tinp(l).gt.real(
mm(ng)+1,r8)-0.5_r8).or. &
794 & (tinp(l).lt.0.5_r8))
THEN
807 10
FORMAT (2x,
'DEF_FLOATS_NF90 - creating floats file,',t56, &
808 &
'Grid ',i2.2,
': ',a)
809 20
FORMAT (2x,
'DEF_FLOATS_NF90 - inquiring floats file,',t56, &
810 &
'Grid ',i2.2,
': ',a)
811 30
FORMAT (/,
' DEF_FLOATS_NF90 - unable to create floats NetCDF', &
813 40
FORMAT (1pe11.4,1x,
'millimeter')
814 50
FORMAT (/,
' DEF_FLOATS_NF90 - unable to open floats NetCDF', &
816 60
FORMAT (/,
' DEF_FLOATS_NF90 - unable to find variable: ',a,2x, &
817 &
' in floats NetCDF file: ',a)
822# if defined PIO_LIB && defined DISTRIBUTE
832 integer,
intent(in) :: ng
834 logical,
intent(in) :: ldef
838 logical :: got_var(-6:
nv)
840 integer,
parameter :: natt = 25
842 integer :: fltdim, i, itrc, j, l
843 integer :: recdim, status
846 integer :: fgrd(2), start(2), total(2)
848 real(r8) :: aval(6), tinp(
nfloats(ng))
850 character (len=256) :: ncname
851 character (len=MaxLen) :: vinfo(natt)
853 character (len=*),
parameter :: myfile = &
854 & __FILE__//
", def_floats_pio"
867 WRITE (
stdout,10) ng, trim(ncname)
869 WRITE (
stdout,20) ng, trim(ncname)
877 define :
IF (ldef)
THEN
896 &
n(ng)+1, dimids(10))
900 &
nt(ng), dimids(11))
952 & pio_unlimited, dimids(12))
993 WRITE (vinfo( 3),
'(a,a)')
'seconds since ', trim(
rclock%string)
994 vinfo( 4)=trim(
rclock%calendar)
1001 &
pio_tout, 1, (/recdim/), aval, vinfo, ncname, &
1002 & setparaccess = .true.)
1008 vinfo( 2)=
'x-grid floats locations'
1009 vinfo( 5)=
'valid_min'
1010 vinfo( 6)=
'valid_max'
1012 aval(3)=real(
lm(ng)+1,r8)
1013 vinfo(14)=
'Xgrid, scalar, series'
1015# ifndef NO_4BYTE_REALS
1016 vinfo(24)=
'_FillValue'
1024 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1030 vinfo( 2)=
'Y-grid floats locations'
1031 vinfo( 5)=
'valid_min'
1032 vinfo( 6)=
'valid_max'
1034 aval(3)=real(
mm(ng)+1,r8)
1035 vinfo(14)=
'Ygrid, scalar, series'
1037# ifndef NO_4BYTE_REALS
1038 vinfo(24)=
'_FillValue'
1046 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1054 vinfo( 2)=
'Z-grid floats locations'
1055 vinfo( 5)=
'valid_min'
1056 vinfo( 6)=
'valid_max'
1058 aval(3)=real(
n(ng),r8)
1059 vinfo(14)=
'Zgrid, scalar, series'
1061# ifndef NO_4BYTE_REALS
1062 vinfo(24)=
'_FillValue'
1070 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1078 vinfo( 2)=
'longitude of floats trajectories'
1079 vinfo( 3)=
'degree_east'
1080 vinfo( 5)=
'valid_min'
1081 vinfo( 6)=
'valid_max'
1082 vinfo(14)=
'lon, scalar, series'
1084# ifndef NO_4BYTE_REALS
1085 vinfo(24)=
'_FillValue'
1095 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1099 vinfo( 2)=
'latitude of floats trajectories'
1100 vinfo( 3)=
'degree_north'
1101 vinfo( 5)=
'valid_min'
1102 vinfo( 6)=
'valid_max'
1103 vinfo(14)=
'lat, scalar, series'
1105# ifndef NO_4BYTE_REALS
1106 vinfo(24)=
'_FillValue'
1116 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1120 vinfo( 2)=
'x-location of floats trajectories'
1122 vinfo(14)=
'x, scalar, series'
1124# ifndef NO_4BYTE_REALS
1125 vinfo(24)=
'_FillValue'
1133 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1137 vinfo( 2)=
'y-location of floats trajectories'
1139 vinfo(14)=
'y, scalar, series'
1141# ifndef NO_4BYTE_REALS
1142 vinfo(24)=
'_FillValue'
1150 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1159 vinfo( 2)=
'depth of floats trajectories'
1161 vinfo(14)=
'depth, scalar, series'
1163# ifndef NO_4BYTE_REALS
1164 vinfo(24)=
'_FillValue'
1172 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1182# ifndef NO_4BYTE_REALS
1183 vinfo(24)=
'_FillValue'
1191 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1202# ifndef NO_4BYTE_REALS
1203 vinfo(24)=
'_FillValue'
1208 IF (itrc.eq.
idsed(i))
THEN
1209 WRITE (vinfo(19),40) 1000.0_r8*
sd50(i,ng)
1214 flt(ng)%pioTrc(itrc)%gtype=0
1217 &
flt(ng)%pioTrc(itrc)%vd, &
1218 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1227 vinfo( 1)=
'swim_time'
1228 vinfo( 2)=
'biological float swimming time'
1230 vinfo(14)=
'swim_time, scalar, series'
1232# ifndef NO_4BYTE_REALS
1233 vinfo(24)=
'_FillValue'
1241 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1247 vinfo( 2)=
'biological float vertical velocity'
1249 vinfo(14)=
'w_bio, scalar, series'
1251# ifndef NO_4BYTE_REALS
1252 vinfo(24)=
'_FillValue'
1260 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1265 vinfo( 1)=
'bio_size'
1266 vinfo( 2)=
'biological float size'
1268 vinfo(14)=
'bio_size, scalar, series'
1270# ifndef NO_4BYTE_REALS
1271 vinfo(24)=
'_FillValue'
1279 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1284 vinfo( 1)=
'bio_sink'
1285 vinfo( 2)=
'biological float sinking velocity'
1287 vinfo(14)=
'bio_sink, scalar, series'
1289# ifndef NO_4BYTE_REALS
1290 vinfo(24)=
'_FillValue'
1298 &
pio_fout, 2, fgrd, aval, vinfo, ncname)
1326 query :
IF (.not.ldef)
THEN
1333 WRITE (
stdout,50) trim(ncname)
1340 & piofile =
flt(ng)%pioFile)
1346 IF (trim(dim_name(i)).eq.
'drifter')
THEN
1355 & piofile =
flt(ng)%pioFile)
1368 IF (trim(var_name(i)).eq.trim(
vname(1,
idtime)))
THEN
1373 ELSE IF (trim(var_name(i)).eq.
'Xgrid')
THEN
1378 ELSE IF (trim(var_name(i)).eq.
'Ygrid')
THEN
1384 ELSE IF (trim(var_name(i)).eq.
'Zgrid')
THEN
1390 ELSE IF (
spherical.and.trim(var_name(i)).eq.
'lon')
THEN
1395 ELSE IF (
spherical.and.trim(var_name(i)).eq.
'lat')
THEN
1400 ELSE IF (.not.
spherical.and.trim(var_name(i)).eq.
'x')
THEN
1405 ELSE IF (.not.
spherical.and.trim(var_name(i)).eq.
'y')
THEN
1411 ELSE IF (trim(var_name(i)).eq.
'depth')
THEN
1416 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
iddano)))
THEN
1423 ELSE IF (trim(var_name(i)).eq.
'swim_time')
THEN
1428 ELSE IF (trim(var_name(i)).eq.
'w_bio')
THEN
1433 ELSE IF (trim(var_name(i)).eq.
'bio_size')
THEN
1438 ELSE IF (trim(var_name(i)).eq.
'bio_sink')
THEN
1447 IF (trim(var_name(i)).eq.trim(
vname(1,
idtvar(itrc))))
THEN
1448 got_var(
idtvar(itrc))=.true.
1451 flt(ng)%pioTrc(itrc)%gtype=0
1459 IF (.not.got_var(
idtime))
THEN
1465 IF (.not.got_var(
idxgrd))
THEN
1470 IF (.not.got_var(
idygrd))
THEN
1476 IF (.not.got_var(
idzgrd))
THEN
1482 IF (.not.got_var(
idglon))
THEN
1491 IF (.not.got_var(
idglat))
THEN
1501 IF (.not.got_var(
iddpth))
THEN
1506 IF (.not.got_var(
iddano))
THEN
1514 IF (.not.got_var(
idswim))
THEN
1515 IF (
master)
WRITE (
stdout,60)
'swim_time', trim(ncname)
1519 IF (.not.got_var(
idwbio))
THEN
1524 IF (.not.got_var(
idsize))
THEN
1529 IF (.not.got_var(
idwsin))
THEN
1537 IF (.not.got_var(
idtvar(itrc)))
THEN
1552 IF (
frrec(ng).lt.0)
THEN
1553 flt(ng)%Rindex=rec_size
1570 & piofile =
flt(ng)%pioFile, &
1571 & start = (/1,
flt(ng)%Rindex/), &
1576 IF ((tinp(l).gt.real(
n(ng),r8)).or. &
1577 & (tinp(l).lt.0.0_r8))
THEN
1578 drifter(ng)%bounded(l)=.false.
1591 & piofile =
flt(ng)%pioFile, &
1592 & start = (/1,
flt(ng)%Rindex/), &
1597 IF ((tinp(l).gt.real(
lm(ng)+1,r8)-0.5_r8).or. &
1598 & (tinp(l).lt.0.5_r8))
THEN
1599 drifter(ng)%bounded(l)=.false.
1611 & piofile =
flt(ng)%pioFile, &
1612 & start = (/1,
flt(ng)%Rindex/), &
1617 IF ((tinp(l).gt.real(
mm(ng)+1,r8)-0.5_r8).or. &
1618 & (tinp(l).lt.0.5_r8))
THEN
1619 drifter(ng)%bounded(l)=.false.
1631 10
FORMAT (2x,
'DEF_FLOATS_PIO - creating floats file,',t56, &
1632 &
'Grid ',i2.2,
': ',a)
1633 20
FORMAT (2x,
'DEF_FLOATS_PIO - inquiring floats file,',t56, &
1634 &
'Grid ',i2.2,
': ',a)
1635 30
FORMAT (/,
' DEF_FLOATS_PIO - unable to create floats NetCDF', &
1637 40
FORMAT (1pe11.4,1x,
'millimeter')
1638 50
FORMAT (/,
' DEF_FLOATS_PIO - unable to open floats NetCDF', &
1640 60
FORMAT (/,
' DEF_FLOATS_PIO - unable to find variable: ',a,2x, &
1641 &
' in floats NetCDF file: ',a)
subroutine, public def_floats(ng, ldef)
subroutine, private def_floats_nf90(ng, ldef)
subroutine, private def_floats_pio(ng, ldef)
integer, parameter nbands
integer, dimension(:), allocatable frrec
type(t_drifter), dimension(:), allocatable drifter
integer, dimension(:), allocatable nstatevar
type(t_io), dimension(:), allocatable flt
character(len=256) sourcefile
integer, parameter io_nf90
integer, parameter io_pio
integer, dimension(:), allocatable idtvar
character(len=maxlen), dimension(6, 0:nv) vname
integer, parameter ndimid
integer, parameter nf_tout
subroutine, public netcdf_check_dim(ng, model, ncname, ncid)
character(len=100), dimension(mdims) dim_name
subroutine, public netcdf_open(ng, model, ncname, omode, ncid)
integer, parameter nf_fout
subroutine, public netcdf_enddef(ng, model, ncname, ncid)
integer, dimension(mdims) dim_size
character(len=100), dimension(mvars) var_name
integer, dimension(mvars) var_id
subroutine, public netcdf_create(ng, model, ncname, ncid)
subroutine, public netcdf_inq_var(ng, model, ncname, ncid, myvarname, searchvar, varid, nvardim, nvaratt)
integer, dimension(:), allocatable nfloats
integer, dimension(:), allocatable n
integer, dimension(:), allocatable lm
integer, dimension(:), allocatable nt
integer, dimension(:), allocatable mm
integer, parameter pio_fout
type(var_desc_t), dimension(:), pointer var_desc
subroutine, public pio_netcdf_create(ng, model, ncname, piofile)
subroutine, public pio_netcdf_inq_var(ng, model, ncname, piofile, myvarname, searchvar, piovar, nvardim, nvaratt)
subroutine, public pio_netcdf_open(ng, model, ncname, omode, piofile)
subroutine, public pio_netcdf_check_dim(ng, model, ncname, piofile)
integer, parameter pio_tout
subroutine, public pio_netcdf_enddef(ng, model, ncname, piofile)
real(dp), parameter spval
integer, dimension(:), allocatable idsed
real(r8), dimension(:,:), allocatable sd50
logical function, public founderror(flag, noerr, line, routine)