3#if defined TL_IOMS && defined FOUR_DVAR
33# if defined PIO_LIB && defined DISTRIBUTE
45 integer,
intent(in) :: ng
49 character (len=*),
parameter :: myfile = &
56 SELECT CASE (
irp(ng)%IOtype)
60# if defined PIO_LIB && defined DISTRIBUTE
70 10
FORMAT (
' RP_DEF_INI - Illegal output type, io_type = ',i0, &
71 & /,14x,
'Check KeyWord ''OUT_LIB'' in ''roms.in''.')
84 integer,
intent(in) :: ng
88 logical :: ldefine = .false.
89# ifdef ADJUST_BOUNDARY
90 logical :: got_iorj, got_boundary, got_obc_adjust
92# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
93 logical :: got_frc_adjust
95 logical :: got_var(
nv)
97 integer,
parameter :: natt = 25
99 integer :: i, j, ifield, itrc, status
101# ifdef ADJUST_BOUNDARY
102 integer :: iorjdim, brecdim
104# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
108# ifdef ADJUST_BOUNDARY
114# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
115 integer :: t4dfrc(4), u4dfrc(4), v4dfrc(4)
120 character (len=256) :: ncname
121 character (len=MaxLen) :: vinfo(natt)
123 character (len=*),
parameter :: myfile = &
124 & __FILE__//
", rp_def_ini_nf90"
128# if defined ADJUST_BOUNDARY || \
129 defined adjust_stflux || defined adjust_wstress
150 & ncid =
irp(ng)%ncid)
156 & ncid =
irp(ng)%ncid)
166# ifdef ADJUST_BOUNDARY
200# ifdef ADJUST_WSTRESS
209# if defined ADJUST_STFLUX && defined SOLVE3D
213 got_var(
idtsur(itrc))=.true.
221# ifdef ADJUST_BOUNDARY
233# ifdef ADJUST_WSTRESS
234 IF (.not.got_var(
idusms)) ldefine=.true.
235 IF (.not.got_var(
idvsms)) ldefine=.true.
237# if defined ADJUST_STFLUX && defined SOLVE3D
240 IF (.not.got_var(
idtsur(itrc))) ldefine=.true.
259 define:
IF (ldefine)
THEN
261# ifdef ADJUST_BOUNDARY
264 got_obc_adjust=.false.
266# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
267 got_frc_adjust=.false.
270 SELECT CASE (trim(adjustl(
dim_name(i))))
289# ifdef ADJUST_BOUNDARY
297# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
300 got_frc_adjust=.true.
302# ifdef ADJUST_BOUNDARY
305 got_obc_adjust=.true.
311# ifdef ADJUST_BOUNDARY
312 IF (.not.got_boundary)
THEN
317 IF (.not.got_iorj)
THEN
323# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
324 IF (.not.got_frc_adjust)
THEN
326 &
nfrec(ng), frecdim)
330# ifdef ADJUST_BOUNDARY
331 IF (.not.got_obc_adjust)
THEN
333 &
nbrec(ng), brecdim)
340# ifdef ADJUST_BOUNDARY
359# ifdef ADJUST_WSTRESS
368# ifdef ADJUST_WSTRESS
395# ifdef ADJUST_BOUNDARY
401 vinfo( 1)=
vname(1,ifield)
402 vinfo( 2)=
vname(2,ifield)
403 vinfo( 3)=
vname(3,ifield)
404 vinfo(14)=
vname(4,ifield)
406 vinfo(21)=
vname(6,ifield)
407 aval(5)=real(
iinfo(1,ifield,ng),r8)
409 &
nf_fout, 4, t2dobc, aval, vinfo, ncname, &
410 & setfillval = .false.)
418 vinfo( 1)=
vname(1,ifield)
419 vinfo( 2)=
vname(2,ifield)
420 vinfo( 3)=
vname(3,ifield)
421 vinfo(14)=
vname(4,ifield)
423 vinfo(21)=
vname(6,ifield)
424 aval(5)=real(
iinfo(1,ifield,ng),r8)
426 &
nf_fout, 4, t2dobc, aval, vinfo, ncname, &
427 & setfillval = .false.)
435 vinfo( 1)=
vname(1,ifield)
436 vinfo( 2)=
vname(2,ifield)
437 vinfo( 3)=
vname(3,ifield)
438 vinfo(14)=
vname(4,ifield)
440 vinfo(21)=
vname(6,ifield)
441 aval(5)=real(
iinfo(1,ifield,ng),r8)
443 &
nf_fout, 4, t2dobc, aval, vinfo, ncname, &
444 & setfillval = .false.)
454 vinfo( 1)=
vname(1,ifield)
455 vinfo( 2)=
vname(2,ifield)
456 vinfo( 3)=
vname(3,ifield)
457 vinfo(14)=
vname(4,ifield)
459 vinfo(21)=
vname(6,ifield)
460 aval(5)=real(
iinfo(1,ifield,ng),r8)
462 &
nf_fout, 5, t3dobc, aval, vinfo, ncname, &
463 & setfillval = .false.)
471 vinfo( 1)=
vname(1,ifield)
472 vinfo( 2)=
vname(2,ifield)
473 vinfo( 3)=
vname(3,ifield)
474 vinfo(14)=
vname(4,ifield)
476 vinfo(21)=
vname(6,ifield)
477 aval(5)=real(
iinfo(1,ifield,ng),r8)
479 &
nf_fout, 5, t3dobc, aval, vinfo, ncname, &
480 & setfillval = .false.)
489 vinfo( 1)=
vname(1,ifield)
490 vinfo( 2)=
vname(2,ifield)
491 vinfo( 3)=
vname(3,ifield)
492 vinfo(14)=
vname(4,ifield)
494 vinfo(21)=
vname(6,ifield)
495 aval(5)=real(
iinfo(1,ifield,ng),r8)
497 &
nf_fout, 5, t3dobc, aval, vinfo, ncname, &
498 & setfillval = .false.)
504# ifdef ADJUST_WSTRESS
508 IF (.not.got_var(
idusms))
THEN
512# if defined WRITE_WATER && defined MASKING
516 vinfo(22)=
'coordinates'
519 &
nf_fout, 4, u4dfrc, aval, vinfo, ncname)
525 IF (.not.got_var(
idvsms))
THEN
529# if defined WRITE_WATER && defined MASKING
533 vinfo(22)=
'coordinates'
536 &
nf_fout, 4, v4dfrc, aval, vinfo, ncname)
540# if defined ADJUST_STFLUX && defined SOLVE3D
549 IF (itrc.eq.
itemp)
THEN
550 vinfo(11)=
'upward flux, cooling'
551 vinfo(12)=
'downward flux, heating'
552 ELSE IF (itrc.eq.
isalt)
THEN
553 vinfo(11)=
'upward flux, freshening (net precipitation)'
554 vinfo(12)=
'downward flux, salting (net evaporation)'
556# if defined WRITE_WATER && defined MASKING
560 vinfo(22)=
'coordinates'
564 & 4, t4dfrc, aval, vinfo, ncname)
588# if !(defined ADJUST_STFLUX || defined ADJUST_WSTRESS)
594 WRITE (
stdout,10) trim(ncname)
601 & ncid =
irp(ng)%ncid)
607 & ncid =
irp(ng)%ncid)
633# ifdef ADJUST_BOUNDARY
647# ifdef ADJUST_WSTRESS
662# ifdef ADJUST_BOUNDARY
672# if defined BVF_MIXING || defined LMD_MIXING || \
673 defined gls_mixing || defined my25_mixing
689 got_var(
idtvar(itrc))=.true.
691# ifdef ADJUST_BOUNDARY
700 got_var(
idtsur(itrc))=.true.
711 IF (.not.got_var(
idtime))
THEN
717 IF (.not.got_var(
idfsur))
THEN
723 IF (.not.got_var(
idubar))
THEN
729 IF (.not.got_var(
idvbar))
THEN
735# ifdef ADJUST_BOUNDARY
758# ifdef ADJUST_WSTRESS
759 IF (.not.got_var(
idusms))
THEN
765 IF (.not.got_var(
idvsms))
THEN
773 IF (.not.got_var(
iduvel))
THEN
779 IF (.not.got_var(
idvvel))
THEN
785# ifdef ADJUST_BOUNDARY
801# ifdef ADJUST_BOUNDARY
820 IF (.not.got_var(
idtvar(itrc)))
THEN
826# ifdef ADJUST_BOUNDARY
850 fcount=
irp(ng)%Fcount
854 10
FORMAT (/,
' RP_DEF_INI_NF90 - unable to open initial NetCDF', &
856 20
FORMAT (/,
' RP_DEF_INI_NF90 - unable to put in define mode', &
857 &
' initial NetCDF file: ',a)
858 30
FORMAT (/,
' RP_DEF_INI_NF90 - unable to find variable: ',a,2x, &
864# if defined PIO_LIB && defined DISTRIBUTE
874 integer,
intent(in) :: ng
878 logical :: ldefine = .false.
879# ifdef ADJUST_BOUNDARY
880 logical :: got_iorj, got_boundary, got_obc_adjust
882# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
883 logical :: got_frc_adjust
885 logical :: got_var(
nv)
887 integer,
parameter :: natt = 25
889 integer :: i, j, ifield, itrc, status
891# ifdef ADJUST_BOUNDARY
892 integer :: iorjdim, brecdim
894# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
898# ifdef ADJUST_BOUNDARY
904# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
905 integer :: t4dfrc(4), u4dfrc(4), v4dfrc(4)
910 character (len=256) :: ncname
911 character (len=MaxLen) :: vinfo(natt)
913 character (len=*),
parameter :: myfile = &
914 & __FILE__//
", rp_def_ini_pio"
918# if defined ADJUST_BOUNDARY || \
919 defined adjust_stflux || defined adjust_wstress
940 & piofile =
irp(ng)%pioFile)
946 & piofile =
irp(ng)%pioFile)
956# ifdef ADJUST_BOUNDARY
957 IF (trim(var_name(i)).eq. &
961 ELSE IF (trim(var_name(i)).eq. &
965 ELSE IF (trim(var_name(i)).eq. &
970 ELSE IF (trim(var_name(i)).eq. &
974 ELSE IF (trim(var_name(i)).eq. &
982 IF (trim(var_name(i)).eq. &
990# ifdef ADJUST_WSTRESS
991 IF (trim(var_name(i)).eq.trim(
vname(1,
idusms)))
THEN
994 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvsms)))
THEN
999# if defined ADJUST_STFLUX && defined SOLVE3D
1002 IF (trim(var_name(i)).eq.trim(
vname(1,
idtsur(itrc))))
THEN
1003 got_var(
idtsur(itrc))=.true.
1011# ifdef ADJUST_BOUNDARY
1023# ifdef ADJUST_WSTRESS
1024 IF (.not.got_var(
idusms)) ldefine=.true.
1025 IF (.not.got_var(
idvsms)) ldefine=.true.
1027# if defined ADJUST_STFLUX && defined SOLVE3D
1030 IF (.not.got_var(
idtsur(itrc))) ldefine=.true.
1049 define:
IF (ldefine)
THEN
1051# ifdef ADJUST_BOUNDARY
1053 got_boundary=.false.
1054 got_obc_adjust=.false.
1056# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
1057 got_frc_adjust=.false.
1060 SELECT CASE (trim(adjustl(dim_name(i))))
1062 dimids( 1)=dim_id(i)
1064 dimids( 2)=dim_id(i)
1066 dimids( 3)=dim_id(i)
1068 dimids( 5)=dim_id(i)
1070 dimids( 6)=dim_id(i)
1072 dimids( 7)=dim_id(i)
1075 dimids( 9)=dim_id(i)
1077 dimids(10)=dim_id(i)
1079# ifdef ADJUST_BOUNDARY
1081 dimids(14)=dim_id(i)
1087# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
1090 got_frc_adjust=.true.
1092# ifdef ADJUST_BOUNDARY
1095 got_obc_adjust=.true.
1101# ifdef ADJUST_BOUNDARY
1102 IF (.not.got_boundary)
THEN
1104 &
'boundary', 4, dimids(14))
1107 IF (.not.got_iorj)
THEN
1109 &
'IorJ',
iobounds(ng)%IorJ, iorjdim)
1113# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
1114 IF (.not.got_frc_adjust)
THEN
1116 &
'frc_adjust',
nfrec(ng), frecdim)
1120# ifdef ADJUST_BOUNDARY
1121 IF (.not.got_obc_adjust)
THEN
1123 &
'obc_adjust',
nbrec(ng), brecdim)
1130# ifdef ADJUST_BOUNDARY
1132 t2dobc(2)=dimids(14)
1134 t2dobc(4)=dimids(12)
1137 t3dobc(2)=dimids( 9)
1138 t3dobc(3)=dimids(14)
1140 t3dobc(5)=dimids(12)
1143# ifdef ADJUST_STFLUX
1144 t4dfrc(1)=dimids( 1)
1145 t4dfrc(2)=dimids( 5)
1147 t4dfrc(4)=dimids(12)
1149# ifdef ADJUST_WSTRESS
1153 u4dfrc(1)=dimids( 2)
1154 u4dfrc(2)=dimids( 6)
1156 u4dfrc(4)=dimids(12)
1158# ifdef ADJUST_WSTRESS
1162 v4dfrc(1)=dimids( 3)
1163 v4dfrc(2)=dimids( 7)
1165 v4dfrc(4)=dimids(12)
1171 DO j=1,len(vinfo(1))
1185# ifdef ADJUST_BOUNDARY
1191 vinfo( 1)=
vname(1,ifield)
1192 vinfo( 2)=
vname(2,ifield)
1193 vinfo( 3)=
vname(3,ifield)
1194 vinfo(14)=
vname(4,ifield)
1196 vinfo(21)=
vname(6,ifield)
1197 aval(5)=real(
iinfo(1,ifield,ng),r8)
1203 & 4, t2dobc, aval, vinfo, ncname, &
1204 & setfillval = .false.)
1212 vinfo( 1)=
vname(1,ifield)
1213 vinfo( 2)=
vname(2,ifield)
1214 vinfo( 3)=
vname(3,ifield)
1215 vinfo(14)=
vname(4,ifield)
1217 vinfo(21)=
vname(6,ifield)
1218 aval(5)=real(
iinfo(1,ifield,ng),r8)
1224 & 4, t2dobc, aval, vinfo, ncname, &
1225 & setfillval = .false.)
1233 vinfo( 1)=
vname(1,ifield)
1234 vinfo( 2)=
vname(2,ifield)
1235 vinfo( 3)=
vname(3,ifield)
1236 vinfo(14)=
vname(4,ifield)
1238 vinfo(21)=
vname(6,ifield)
1239 aval(5)=real(
iinfo(1,ifield,ng),r8)
1245 & 4, t2dobc, aval, vinfo, ncname, &
1246 & setfillval = .false.)
1256 vinfo( 1)=
vname(1,ifield)
1257 vinfo( 2)=
vname(2,ifield)
1258 vinfo( 3)=
vname(3,ifield)
1259 vinfo(14)=
vname(4,ifield)
1261 vinfo(21)=
vname(6,ifield)
1262 aval(5)=real(
iinfo(1,ifield,ng),r8)
1268 & 5, t3dobc, aval, vinfo, ncname, &
1269 & setfillval = .false.)
1277 vinfo( 1)=
vname(1,ifield)
1278 vinfo( 2)=
vname(2,ifield)
1279 vinfo( 3)=
vname(3,ifield)
1280 vinfo(14)=
vname(4,ifield)
1282 vinfo(21)=
vname(6,ifield)
1283 aval(5)=real(
iinfo(1,ifield,ng),r8)
1289 & 5, t3dobc, aval, vinfo, ncname, &
1290 & setfillval = .false.)
1299 vinfo( 1)=
vname(1,ifield)
1300 vinfo( 2)=
vname(2,ifield)
1301 vinfo( 3)=
vname(3,ifield)
1302 vinfo(14)=
vname(4,ifield)
1304 vinfo(21)=
vname(6,ifield)
1305 aval(5)=real(
iinfo(1,ifield,ng),r8)
1311 & 5, t3dobc, aval, vinfo, ncname, &
1312 & setfillval = .false.)
1318# ifdef ADJUST_WSTRESS
1322 IF (.not.got_var(
idusms))
THEN
1326# if defined WRITE_WATER && defined MASKING
1330 vinfo(22)=
'coordinates'
1337 & 4, u4dfrc, aval, vinfo, ncname)
1343 IF (.not.got_var(
idvsms))
THEN
1347# if defined WRITE_WATER && defined MASKING
1351 vinfo(22)=
'coordinates'
1358 & 4, v4dfrc, aval, vinfo, ncname)
1362# if defined ADJUST_STFLUX && defined SOLVE3D
1371 IF (itrc.eq.
itemp)
THEN
1372 vinfo(11)=
'upward flux, cooling'
1373 vinfo(12)=
'downward flux, heating'
1374 ELSE IF (itrc.eq.
isalt)
THEN
1375 vinfo(11)=
'upward flux, freshening (net precipitation)'
1376 vinfo(12)=
'downward flux, salting (net evaporation)'
1378# if defined WRITE_WATER && defined MASKING
1379 vinfo(20)=
'mask_rho'
1382 vinfo(22)=
'coordinates'
1389 & 4, t4dfrc, aval, vinfo, ncname)
1413# if !(defined ADJUST_STFLUX || defined ADJUST_WSTRESS)
1419 WRITE (
stdout,10) trim(ncname)
1426 & piofile =
irp(ng)%pioFile)
1432 & piofile =
irp(ng)%pioFile)
1446 IF (trim(var_name(i)).eq.trim(
vname(1,
idtime)))
THEN
1451 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idfsur)))
THEN
1456 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idubar)))
THEN
1461 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvbar)))
THEN
1466# ifdef ADJUST_BOUNDARY
1467 ELSE IF (trim(var_name(i)).eq. &
1473 ELSE IF (trim(var_name(i)).eq. &
1479 ELSE IF (trim(var_name(i)).eq. &
1486# ifdef ADJUST_WSTRESS
1487 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idusms)))
THEN
1492 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvsms)))
THEN
1499 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
iduvel)))
THEN
1504 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvvel)))
THEN
1509# ifdef ADJUST_BOUNDARY
1510 ELSE IF (trim(var_name(i)).eq. &
1516 ELSE IF (trim(var_name(i)).eq. &
1523# if defined BVF_MIXING || defined LMD_MIXING || \
1524 defined gls_mixing || defined my25_mixing
1525 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvvis)))
THEN
1530 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idtdif)))
THEN
1535 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idsdif)))
THEN
1545 IF (trim(var_name(i)).eq.trim(
vname(1,
idtvar(itrc))))
THEN
1546 got_var(
idtvar(itrc))=.true.
1550# ifdef ADJUST_BOUNDARY
1551 ELSE IF (trim(var_name(i)).eq. &
1558# ifdef ADJUST_STFLUX
1559 ELSE IF (trim(var_name(i)).eq. &
1561 got_var(
idtsur(itrc))=.true.
1574 IF (.not.got_var(
idtime))
THEN
1580 IF (.not.got_var(
idfsur))
THEN
1586 IF (.not.got_var(
idubar))
THEN
1592 IF (.not.got_var(
idvbar))
THEN
1598# ifdef ADJUST_BOUNDARY
1621# ifdef ADJUST_WSTRESS
1622 IF (.not.got_var(
idusms))
THEN
1628 IF (.not.got_var(
idvsms))
THEN
1636 IF (.not.got_var(
iduvel))
THEN
1642 IF (.not.got_var(
idvvel))
THEN
1648# ifdef ADJUST_BOUNDARY
1664# ifdef ADJUST_BOUNDARY
1683 IF (.not.got_var(
idtvar(itrc)))
THEN
1689# ifdef ADJUST_BOUNDARY
1699# ifdef ADJUST_STFLUX
1712 irp(ng)%Rindex=rec_size
1713 fcount=
irp(ng)%Fcount
1714 irp(ng)%Nrec(fcount)=rec_size
1717 10
FORMAT (/,
' RP_DEF_INI_PIO - unable to open initial NetCDF', &
1719 20
FORMAT (/,
' RP_DEF_INI_PIO - unable to put in define mode', &
1720 &
' initial NetCDF file: ',a)
1721 30
FORMAT (/,
' RP_DEF_INI_PIO - unable to find variable: ',a,2x, &
type(t_io), dimension(:), allocatable irp
character(len=256) sourcefile
integer, parameter io_nf90
integer, dimension(:), allocatable idsbry
integer, parameter io_pio
integer, dimension(:), allocatable idtsur
integer, dimension(:), allocatable idtvar
integer, dimension(:), allocatable istvar
character(len=maxlen), dimension(6, 0:nv) vname
integer, dimension(:,:,:), allocatable iinfo
integer, parameter ndimid
subroutine, public netcdf_redef(ng, model, ncname, ncid)
integer, dimension(mdims) dim_id
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)
character(len=100), dimension(mvars) var_name
integer, dimension(mvars) var_id
subroutine, public netcdf_inq_var(ng, model, ncname, ncid, myvarname, searchvar, varid, nvardim, nvaratt)
integer, parameter u2dobc
integer, parameter v3dobc
integer, parameter r2dobc
integer, parameter r3dvar
integer, parameter r3dobc
integer, parameter v2dobc
type(t_iobounds), dimension(:), allocatable iobounds
integer, parameter u3dobc
integer, parameter u3dvar
integer, parameter u2dvar
integer, parameter w3dvar
integer, dimension(:), allocatable nt
integer, parameter r2dvar
integer, parameter v2dvar
integer, parameter v3dvar
subroutine, public pio_netcdf_redef(ng, model, ncname, piofile)
integer, parameter pio_fout
type(var_desc_t), dimension(:), pointer var_desc
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)
logical, dimension(:,:,:), allocatable lobc
logical, dimension(:,:), allocatable lstflux
integer, dimension(:), allocatable nfrec
logical, dimension(:), allocatable ldefirp
integer, dimension(:), allocatable nbrec
subroutine, public rp_def_ini(ng)
subroutine, private rp_def_ini_nf90(ng)
subroutine, private rp_def_ini_pio(ng)
logical function, public founderror(flag, noerr, line, routine)