96 integer,
intent(in) :: ng, model
98 logical,
intent(in) :: ldef
102 logical :: got_var(
nv)
104 integer,
parameter :: natt = 25
106 integer :: i, j, ifield, itrc, nvd3, nvd4
107 integer :: recdim, status, varid
109# ifdef ADJUST_BOUNDARY
110 integer :: iorjdim, brecdim
112# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
116 integer :: minnerdim, ninnerdim, nouterdim
120 integer :: t2dgrd(3), u2dgrd(3), v2dgrd(3)
121# ifdef ADJUST_BOUNDARY
125 integer :: t3dgrd(4), u3dgrd(4), v3dgrd(4), w3dgrd(4)
126# ifdef ADJUST_BOUNDARY
133# ifdef ADJUST_WSTRESS
134 integer :: u3dfrc(4), v3dfrc(4)
139 character (len=256) :: ncname
140 character (len=MaxLen) :: vinfo(natt)
142 character (len=*),
parameter :: myfile = &
143 & __FILE__//
", ad_def_his_nf90"
156 WRITE (
stdout,10) ng, trim(ncname)
158 WRITE (
stdout,20) ng, trim(ncname)
166 define :
IF (ldef)
THEN
179 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xi_rho', &
183 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xi_u', &
187 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xi_v', &
191 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xi_psi', &
195 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'eta_rho', &
199 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'eta_u', &
203 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'eta_v', &
207 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'eta_psi', &
211# ifdef ADJUST_BOUNDARY
212 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'IorJ', &
217# if defined WRITE_WATER && defined MASKING
218 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xy_rho', &
222 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xy_u', &
226 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xy_v', &
232# if defined WRITE_WATER && defined MASKING
233 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xyz_rho', &
237 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xyz_u', &
241 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xyz_v', &
245 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xyz_w', &
246 &
iobounds(ng)%xy_rho*(
n(ng)+1), dimids(23))
250 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'N', &
254 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
's_rho', &
258 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
's_w', &
259 &
n(ng)+1, dimids(10))
262 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'tracer', &
263 &
nt(ng), dimids(11))
267 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'NST', &
271 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Nbed', &
275# if defined WRITE_WATER && defined MASKING
276 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'xybed', &
287 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Nphy', &
291 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Nbac', &
295 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Ndom', &
299 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Nfec', &
305 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'boundary', &
310 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Nstate', &
315# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
316 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'frc_adjust', &
317 &
nfrec(ng), dimids(30))
321# ifdef ADJUST_BOUNDARY
322 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'obc_adjust', &
323 &
nbrec(ng), dimids(31))
328 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Ninner', &
332 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Minner', &
336 status=
def_dim(ng, model,
adm(ng)%ncid, ncname,
'Nouter', &
341 status=
def_dim(ng, model,
adm(ng)%ncid, ncname, &
343 & nf90_unlimited, dimids(12))
347# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
350# ifdef ADJUST_BOUNDARY
356# if defined WRITE_WATER && defined MASKING
366# if defined WRITE_WATER && defined MASKING
390# ifdef ADJUST_BOUNDARY
406# if defined WRITE_WATER && defined MASKING
423# ifdef ADJUST_WSTRESS
433# if defined WRITE_WATER && defined MASKING
450# ifdef ADJUST_WSTRESS
461# if defined WRITE_WATER && defined MASKING
491 CALL def_info (ng, model,
adm(ng)%ncid, ncname, dimids)
502 WRITE (vinfo( 3),
'(a,a)')
'seconds since ', trim(
rclock%string)
503 vinfo( 4)=trim(
rclock%calendar)
507 &
nf_tout, 1, (/recdim/), aval, vinfo, ncname, &
508 & setparaccess = .false.)
515 vinfo( 1)=
'Ritz_rvalue'
516 vinfo( 2)=
'real Ritz eigenvalues'
518 & 1, (/recdim/), aval, vinfo, ncname, &
519 & setparaccess = .false.)
522# if defined AFT_EIGENMODES
523 vinfo( 1)=
'Ritz_ivalue'
524 vinfo( 2)=
'imaginary Ritz eigenvalues'
526 & 1, (/recdim/), aval, vinfo, ncname, &
527 & setparaccess = .false.)
531 vinfo( 1)=
'Ritz_norm'
532 vinfo( 2)=
'Ritz eigenvectors Euclidean norm'
534 & 1, (/recdim/), aval, vinfo, ncname, &
535 & setparaccess = .false.)
545 vinfo( 2)=
'conjugate gradient beta coefficient'
549 & 2, vardim, aval, vinfo, ncname, &
550 & setparaccess = .false.)
554 vinfo( 2)=
'Lanczos algorithm delta coefficient'
558 & 2, vardim, aval, vinfo, ncname, &
559 & setparaccess = .false.)
563 vinfo( 2)=
'Lanczos recurrence eigenvectors'
567 & 2, vardim, aval, vinfo, ncname, &
568 & setparaccess = .false.)
571# ifdef ADJUST_WSTRESS
579 vinfo( 3)=
'meter2 second-2'
581# if defined WRITE_WATER && defined MASKING
584 vinfo(22)=
'coordinates'
587 &
nf_fout, nvd4, u3dfrc, aval, vinfo, ncname)
594 vinfo( 3)=
'meter2 second-2'
596# if defined WRITE_WATER && defined MASKING
599 vinfo(22)=
'coordinates'
602 &
nf_fout, nvd4, v3dfrc, aval, vinfo, ncname)
605# if defined ADJUST_STFLUX && defined SOLVE3D
615 IF (itrc.eq.
itemp)
THEN
616 vinfo( 3)=
'Celsius meter second-1'
617 vinfo(11)=
'upward flux, cooling'
618 vinfo(12)=
'downward flux, heating'
619 ELSE IF (itrc.eq.
isalt)
THEN
620 vinfo( 3)=
'meter second-1'
621 vinfo(11)=
'upward flux, freshening (net precipitation)'
622 vinfo(12)=
'downward flux, salting (net evaporation)'
625# if defined WRITE_WATER && defined MASKING
628 vinfo(22)=
'coordinates'
632 & nvd4, t3dfrc, aval, vinfo, ncname)
647 vinfo(22)=
'coordinates'
650 &
nf_fout, nvd3, t2dgrd, aval, vinfo, ncname, &
651 & setfillval = .false.)
665# if defined WRITE_WATER && defined MASKING
669 vinfo(22)=
'coordinates'
672 &
nf_fout, nvd4, t3dgrd, aval, vinfo, ncname, &
673 & setfillval = .false.)
685# if defined WRITE_WATER && defined MASKING
689 vinfo(22)=
'coordinates'
692 &
nf_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
693 & setfillval = .false.)
706# if !defined WET_DRY && (defined WRITE_WATER && defined MASKING)
710 vinfo(22)=
'coordinates'
714 &
nf_fout, nvd3, t2dgrd, aval, vinfo, ncname, &
715 & setfillval = .false.)
717 &
nf_fout, nvd3, t2dgrd, aval, vinfo, ncname)
722# ifdef ADJUST_BOUNDARY
728 vinfo( 1)=
vname(1,ifield)
729 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
731 vinfo(14)=
vname(4,ifield)
733 vinfo(21)=
vname(6,ifield)
734 aval(5)=real(
iinfo(1,ifield,ng),r8)
735 status=
def_var(ng, model,
adm(ng)%ncid,
adm(ng)%Vid(ifield), &
736 &
nf_fout, 4, t2dobc, aval, vinfo, ncname, &
737 & setfillval = .false.)
747 vinfo( 3)=
'second meter-1'
750# if defined WRITE_WATER && defined MASKING
754 vinfo(22)=
'coordinates'
757 &
nf_fout, nvd3, u2dgrd, aval, vinfo, ncname)
761# ifdef ADJUST_BOUNDARY
767 vinfo( 1)=
vname(1,ifield)
768 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
769 vinfo( 3)=
'second meter-1'
770 vinfo(14)=
vname(4,ifield)
772 vinfo(21)=
vname(6,ifield)
773 aval(5)=real(
iinfo(1,ifield,ng),r8)
774 status=
def_var(ng, model,
adm(ng)%ncid,
adm(ng)%Vid(ifield), &
775 &
nf_fout, 4, t2dobc, aval, vinfo, ncname, &
776 & setfillval = .false.)
786 vinfo( 3)=
'second meter-1'
789# if defined WRITE_WATER && defined MASKING
793 vinfo(22)=
'coordinates'
796 &
nf_fout, nvd3, v2dgrd, aval, vinfo, ncname)
800# ifdef ADJUST_BOUNDARY
806 vinfo( 1)=
vname(1,ifield)
807 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
808 vinfo( 3)=
'second meter-1'
809 vinfo(14)=
vname(4,ifield)
811 vinfo(21)=
vname(6,ifield)
812 aval(5)=real(
iinfo(1,ifield,ng),r8)
813 status=
def_var(ng, model,
adm(ng)%ncid,
adm(ng)%Vid(ifield), &
814 &
nf_fout, 4, t2dobc, aval, vinfo, ncname, &
815 & setfillval = .false.)
826 vinfo( 3)=
'second meter-1'
829# if defined WRITE_WATER && defined MASKING
833 vinfo(22)=
'coordinates'
836 &
nf_fout, nvd4, u3dgrd, aval, vinfo, ncname)
840# ifdef ADJUST_BOUNDARY
846 vinfo( 1)=
vname(1,ifield)
847 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
848 vinfo( 3)=
'second meter-1'
849 vinfo(14)=
vname(4,ifield)
851 vinfo(21)=
vname(6,ifield)
852 aval(5)=real(
iinfo(1,ifield,ng),r8)
853 status=
def_var(ng, model,
adm(ng)%ncid,
adm(ng)%Vid(ifield), &
854 &
nf_fout, 5, t3dobc, aval, vinfo, ncname, &
855 & setfillval = .false.)
865 vinfo( 3)=
'second meter-1'
868# if defined WRITE_WATER && defined MASKING
872 vinfo(22)=
'coordinates'
875 &
nf_fout, nvd4, v3dgrd, aval, vinfo, ncname)
879# ifdef ADJUST_BOUNDARY
885 vinfo( 1)=
vname(1,ifield)
886 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
887 vinfo( 3)=
'second meter-1'
888 vinfo(14)=
vname(4,ifield)
890 vinfo(21)=
vname(6,ifield)
891 aval(5)=real(
iinfo(1,ifield,ng),r8)
892 status=
def_var(ng, model,
adm(ng)%ncid,
adm(ng)%Vid(ifield), &
893 &
nf_fout, 5, t3dobc, aval, vinfo, ncname, &
894 & setfillval = .false.)
898# ifdef UV_DESTAGGERED
908# if defined WRITE_WATER && defined MASKING
912 vinfo(22)=
'coordinates'
915 &
nf_fout, nvd4, t3dgrd, aval, vinfo, ncname)
927# if defined WRITE_WATER && defined MASKING
931 vinfo(22)=
'coordinates'
934 &
nf_fout, nvd4, t3dgrd, aval, vinfo, ncname)
944 vinfo( 3)=
'meter second-1'
948 vinfo(22)=
'coordinates'
951 &
nf_fout, nvd4, w3dgrd, aval, vinfo, ncname)
964# ifdef SEDIMENT_NOT_YET
966 IF (itrc.eq.
idsed(i))
THEN
967 WRITE (vinfo(19),50) 1000.0_r8*
sd50(i,ng)
971# if defined WRITE_WATER && defined MASKING
975 vinfo(22)=
'coordinates'
978 &
nf_fout, nvd4, t3dgrd, aval, vinfo, ncname)
983# ifdef ADJUST_BOUNDARY
990 vinfo( 1)=
vname(1,ifield)
991 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
992 vinfo( 3)=
vname(3,ifield)
993 vinfo(14)=
vname(4,ifield)
997 IF (itrc.eq.
idsed(i))
THEN
998 WRITE (vinfo(19),50) 1000.0_r8*
sd50(i,ng)
1002 vinfo(21)=
vname(6,ifield)
1003 aval(5)=real(
iinfo(1,ifield,ng),r8)
1004 status=
def_var(ng, model,
adm(ng)%ncid,
adm(ng)%Vid(ifield),&
1005 &
nf_fout, 5, t3dobc, aval, vinfo, ncname, &
1006 & setfillval = .false.)
1020# if defined WRITE_WATER && defined MASKING
1021 vinfo(20)=
'mask_rho'
1024 vinfo(22)=
'coordinates'
1027 &
nf_fout, nvd4, t3dgrd, aval, vinfo, ncname)
1040 vinfo(22)=
'coordinates'
1043 &
nf_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
1044 & setfillval = .false.)
1057 vinfo(22)=
'coordinates'
1060 &
nf_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
1061 & setfillval = .false.)
1076 vinfo(22)=
'coordinates'
1079 &
nf_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
1080 & setfillval = .false.)
1084# ifndef ADJUST_STFLUX
1093 IF (itrc.eq.
itemp)
THEN
1094 vinfo(11)=
'upward flux, cooling'
1095 vinfo(12)=
'downward flux, heating'
1096 ELSE IF (itrc.eq.
isalt)
THEN
1097 vinfo(11)=
'upward flux, freshening (net precipitation)'
1098 vinfo(12)=
'downward flux, salting (net evaporation)'
1102# if defined WRITE_WATER && defined MASKING
1103 vinfo(20)=
'mask_rho'
1106 vinfo(22)=
'coordinates'
1110 & nvd3, t2dgrd, aval, vinfo, ncname)
1116# ifndef ADJUST_WSTRESS
1126# if defined WRITE_WATER && defined MASKING
1130 vinfo(22)=
'coordinates'
1133 &
nf_fout, nvd3, u2dgrd, aval, vinfo, ncname)
1145# if defined WRITE_WATER && defined MASKING
1149 vinfo(22)=
'coordinates'
1152 &
nf_fout, nvd3, v2dgrd, aval, vinfo, ncname)
1165# if defined WRITE_WATER && defined MASKING
1169 vinfo(22)=
'coordinates'
1172 &
nf_fout, nvd3, u2dgrd, aval, vinfo, ncname)
1184# if defined WRITE_WATER && defined MASKING
1188 vinfo(22)=
'coordinates'
1191 &
nf_fout, nvd3, v2dgrd, aval, vinfo, ncname)
1215 query :
IF (.not.ldef)
THEN
1222 WRITE (
stdout,60) trim(ncname)
1229 & ncid =
adm(ng)%ncid)
1235 & ncid =
adm(ng)%ncid)
1268# ifdef ADJUST_BOUNDARY
1282# ifdef ADJUST_WSTRESS
1297# ifdef ADJUST_BOUNDARY
1307# ifdef UV_DESTAGGERED
1337 got_var(
idtvar(itrc))=.true.
1339# ifdef ADJUST_BOUNDARY
1345# ifdef ADJUST_STFLUX
1348 got_var(
idtsur(itrc))=.true.
1358 IF (.not.got_var(
idtime))
THEN
1396# ifdef ADJUST_BOUNDARY
1419# ifdef ADJUST_WSTRESS
1420 IF (.not.got_var(
idusms))
THEN
1426 IF (.not.got_var(
idvsms))
THEN
1446# ifdef ADJUST_BOUNDARY
1462# ifdef UV_DESTAGGERED
1497# ifdef ADJUST_BOUNDARY
1507# ifdef ADJUST_STFLUX
1528 fcount=
adm(ng)%Fcount
1532 10
FORMAT (2x,
'AD_DEF_HIS_NF90 - creating adjoint file,',t56, &
1533 &
'Grid ',i2.2,
': ',a)
1534 20
FORMAT (2x,
'AD_DEF_HIS_NF90 - inquiring adjoint file,',t56, &
1535 &
'Grid ',i2.2,
': ',a)
1536 30
FORMAT (/,
' AD_DEF_HIS_NF90 - unable to create adjoint NetCDF', &
1538 40
FORMAT (
'adjoint',1x,a)
1539 50
FORMAT (1pe11.4,1x,
'millimeter')
1540 60
FORMAT (/,
' AD_DEF_HIS_NF90 - unable to open adjoint NetCDF', &
1542 70
FORMAT (/,
' AD_DEF_HIS_NF90 - unable to find variable: ',a,2x, &
1543 &
' in adjoint NetCDF file: ',a)
1558 integer,
intent(in) :: ng
1560 logical,
intent(in) :: ldef
1564 logical :: got_var(
nv)
1566 integer,
parameter :: natt = 25
1568 integer :: i, j, ifield, itrc, nvd3, nvd4
1569 integer :: recdim, status, varid
1571# ifdef ADJUST_BOUNDARY
1572 integer :: iorjdim, brecdim
1574# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
1578 integer :: minnerdim, ninnerdim, nouterdim
1579 integer :: vardim(2)
1581 integer :: dimids(
ndimid)
1582 integer :: t2dgrd(3), u2dgrd(3), v2dgrd(3)
1583# ifdef ADJUST_BOUNDARY
1584 integer :: t2dobc(4)
1587 integer :: t3dgrd(4), u3dgrd(4), v3dgrd(4), w3dgrd(4)
1588# ifdef ADJUST_BOUNDARY
1589 integer :: t3dobc(5)
1591# ifdef ADJUST_STFLUX
1592 integer :: t3dfrc(4)
1595# ifdef ADJUST_WSTRESS
1596 integer :: u3dfrc(4), v3dfrc(4)
1601 character (len=256) :: ncname
1602 character (len=MaxLen) :: vinfo(natt)
1604 character (len=*),
parameter :: myfile = &
1605 & __FILE__//
", ad_def_his_pio"
1607 TYPE (var_desc_t) :: vardesc
1620 WRITE (
stdout,10) ng, trim(ncname)
1622 WRITE (
stdout,20) ng, trim(ncname)
1630 define :
IF (ldef)
THEN
1643 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xi_rho', &
1647 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xi_u', &
1651 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xi_v', &
1655 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xi_psi', &
1659 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'eta_rho', &
1660 &
iobounds(ng)%eta_rho, dimids( 5))
1663 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'eta_u', &
1667 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'eta_v', &
1671 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'eta_psi', &
1672 &
iobounds(ng)%eta_psi, dimids( 8))
1675# ifdef ADJUST_BOUNDARY
1676 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'IorJ', &
1681# if defined WRITE_WATER && defined MASKING
1682 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xy_rho', &
1686 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xy_u', &
1690 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xy_v', &
1696# if defined WRITE_WATER && defined MASKING
1697 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xyz_rho', &
1698 &
iobounds(ng)%xy_rho*
n(ng), dimids(20))
1701 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xyz_u', &
1705 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xyz_v', &
1709 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xyz_w', &
1710 &
iobounds(ng)%xy_rho*(
n(ng)+1), dimids(23))
1714 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'N', &
1715 &
n(ng), dimids( 9))
1718 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
's_rho', &
1719 &
n(ng), dimids( 9))
1722 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
's_w', &
1723 &
n(ng)+1, dimids(10))
1726 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'tracer', &
1727 &
nt(ng), dimids(11))
1731 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'NST', &
1735 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Nbed', &
1739# if defined WRITE_WATER && defined MASKING
1740 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'xybed', &
1751 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Nphy', &
1755 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Nbac', &
1759 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Ndom', &
1763 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Nfec', &
1769 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'boundary', &
1774 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Nstate', &
1779# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
1780 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'frc_adjust',&
1781 &
nfrec(ng), dimids(30))
1785# ifdef ADJUST_BOUNDARY
1786 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'obc_adjust',&
1787 &
nbrec(ng), dimids(31))
1792 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Ninner', &
1796 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Minner', &
1800 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname,
'Nouter', &
1805 status=
def_dim(ng, model,
adm(ng)%pioFile, ncname, &
1807 & pio_unlimited, dimids(12))
1811# if defined ADJUST_STFLUX || defined ADJUST_WSTRESS
1814# ifdef ADJUST_BOUNDARY
1820# if defined WRITE_WATER && defined MASKING
1830# if defined WRITE_WATER && defined MASKING
1831 t2dgrd(1)=dimids(17)
1832 t2dgrd(2)=dimids(12)
1834 t3dgrd(1)=dimids(20)
1835 t3dgrd(2)=dimids(12)
1838 t2dgrd(1)=dimids( 1)
1839 t2dgrd(2)=dimids( 5)
1840 t2dgrd(3)=dimids(12)
1842 t3dgrd(1)=dimids( 1)
1843 t3dgrd(2)=dimids( 5)
1844 t3dgrd(3)=dimids( 9)
1845 t3dgrd(4)=dimids(12)
1847# ifdef ADJUST_STFLUX
1848 t3dfrc(1)=dimids( 1)
1849 t3dfrc(2)=dimids( 5)
1851 t3dfrc(4)=dimids(12)
1854# ifdef ADJUST_BOUNDARY
1856 t2dobc(2)=dimids(14)
1858 t2dobc(4)=dimids(12)
1861 t3dobc(2)=dimids( 9)
1862 t3dobc(3)=dimids(14)
1864 t3dobc(5)=dimids(12)
1870# if defined WRITE_WATER && defined MASKING
1871 u2dgrd(1)=dimids(18)
1872 u2dgrd(2)=dimids(12)
1874 u3dgrd(1)=dimids(21)
1875 u3dgrd(2)=dimids(12)
1878 u2dgrd(1)=dimids( 2)
1879 u2dgrd(2)=dimids( 6)
1880 u2dgrd(3)=dimids(12)
1882 u3dgrd(1)=dimids( 2)
1883 u3dgrd(2)=dimids( 6)
1884 u3dgrd(3)=dimids( 9)
1885 u3dgrd(4)=dimids(12)
1887# ifdef ADJUST_WSTRESS
1888 u3dfrc(1)=dimids( 2)
1889 u3dfrc(2)=dimids( 6)
1891 u3dfrc(4)=dimids(12)
1897# if defined WRITE_WATER && defined MASKING
1898 v2dgrd(1)=dimids(19)
1899 v2dgrd(2)=dimids(12)
1901 v3dgrd(1)=dimids(22)
1902 v3dgrd(2)=dimids(12)
1905 v2dgrd(1)=dimids( 3)
1906 v2dgrd(2)=dimids( 7)
1907 v2dgrd(3)=dimids(12)
1909 v3dgrd(1)=dimids( 3)
1910 v3dgrd(2)=dimids( 7)
1911 v3dgrd(3)=dimids( 9)
1912 v3dgrd(4)=dimids(12)
1914# ifdef ADJUST_WSTRESS
1915 v3dfrc(1)=dimids( 3)
1916 v3dfrc(2)=dimids( 7)
1918 v3dfrc(4)=dimids(12)
1925# if defined WRITE_WATER && defined MASKING
1926 w3dgrd(1)=dimids(23)
1927 w3dgrd(2)=dimids(12)
1929 w3dgrd(1)=dimids( 1)
1930 w3dgrd(2)=dimids( 5)
1931 w3dgrd(3)=dimids(10)
1932 w3dgrd(4)=dimids(12)
1943 DO j=1,len(vinfo(1))
1955 CALL def_info (ng, model,
adm(ng)%pioFile, ncname, dimids)
1966 WRITE (vinfo( 3),
'(a,a)')
'seconds since ', trim(
rclock%string)
1967 vinfo( 4)=trim(
rclock%calendar)
1975 &
pio_tout, 1, (/recdim/), aval, vinfo, ncname, &
1976 & setparaccess = .false.)
1983 vinfo( 1)=
'Ritz_rvalue'
1984 vinfo( 2)=
'real Ritz eigenvalues'
1986 & 1, (/recdim/), aval, vinfo, ncname, &
1987 & setparaccess = .false.)
1990# if defined AFT_EIGENMODES
1991 vinfo( 1)=
'Ritz_ivalue'
1992 vinfo( 2)=
'imaginary Ritz eigenvalues'
1994 & 1, (/recdim/), aval, vinfo, ncname, &
1995 & setparaccess = .false.)
2000 vinfo( 1)=
'Ritz_norm'
2001 vinfo( 2)=
'Ritz eigenvectors Euclidean norm'
2003 & 1, (/recdim/), aval, vinfo, ncname, &
2004 & setparaccess = .false.)
2014 vinfo( 2)=
'conjugate gradient beta coefficient'
2018 & 2, vardim, aval, vinfo, ncname, &
2019 & setparaccess = .false.)
2022 vinfo( 1)=
'cg_delta'
2023 vinfo( 2)=
'Lanczos algorithm delta coefficient'
2027 & 2, vardim, aval, vinfo, ncname, &
2028 & setparaccess = .false.)
2032 vinfo( 2)=
'Lanczos recurrence eigenvectors'
2036 & 2, vardim, aval, vinfo, ncname, &
2037 & setparaccess = .false.)
2040# ifdef ADJUST_WSTRESS
2048 vinfo( 3)=
'meter2 second-2'
2050# if defined WRITE_WATER && defined MASKING
2053 vinfo(22)=
'coordinates'
2060 &
pio_fout, nvd4, u3dfrc, aval, vinfo, ncname)
2067 vinfo( 3)=
'meter2 second-2'
2069# if defined WRITE_WATER && defined MASKING
2072 vinfo(22)=
'coordinates'
2079 &
pio_fout, nvd4, v3dfrc, aval, vinfo, ncname)
2082# if defined ADJUST_STFLUX && defined SOLVE3D
2092 IF (itrc.eq.
itemp)
THEN
2093 vinfo( 3)=
'Celsius meter second-1'
2094 vinfo(11)=
'upward flux, cooling'
2095 vinfo(12)=
'downward flux, heating'
2096 ELSE IF (itrc.eq.
isalt)
THEN
2097 vinfo( 3)=
'meter second-1'
2098 vinfo(11)=
'upward flux, freshening (net precipitation)'
2099 vinfo(12)=
'downward flux, salting (net evaporation)'
2102# if defined WRITE_WATER && defined MASKING
2103 vinfo(20)=
'mask_rho'
2105 vinfo(22)=
'coordinates'
2112 &
pio_fout, nvd4, t3dfrc, aval, vinfo, ncname)
2127 vinfo(22)=
'coordinates'
2134 &
pio_fout, nvd3, t2dgrd, aval, vinfo, ncname, &
2135 & setfillval = .false.)
2149# if defined WRITE_WATER && defined MASKING
2150 vinfo(20)=
'mask_rho'
2153 vinfo(22)=
'coordinates'
2160 &
pio_fout, nvd4, t3dgrd, aval, vinfo, ncname, &
2161 & setfillval = .false.)
2173# if defined WRITE_WATER && defined MASKING
2174 vinfo(20)=
'mask_rho'
2177 vinfo(22)=
'coordinates'
2184 &
pio_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
2185 & setfillval = .false.)
2198# if !defined WET_DRY && (defined WRITE_WATER && defined MASKING)
2199 vinfo(20)=
'mask_rho'
2202 vinfo(22)=
'coordinates'
2210 &
pio_fout, nvd3, t2dgrd, aval, vinfo, ncname, &
2211 & setfillval = .false.)
2213 &
pio_fout, nvd3, t2dgrd, aval, vinfo, ncname)
2218# ifdef ADJUST_BOUNDARY
2224 vinfo( 1)=
vname(1,ifield)
2225 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
2227 vinfo(14)=
vname(4,ifield)
2229 vinfo(21)=
vname(6,ifield)
2230 aval(5)=real(
iinfo(1,ifield,ng),r8)
2235 &
adm(ng)%pioVar(ifield)%vd, &
2236 &
pio_fout, 4, t2dobc, aval, vinfo, ncname, &
2237 & setfillval = .false.)
2247 vinfo( 3)=
'second meter-1'
2250# if defined WRITE_WATER && defined MASKING
2254 vinfo(22)=
'coordinates'
2261 &
pio_fout, nvd3, u2dgrd, aval, vinfo, ncname)
2265# ifdef ADJUST_BOUNDARY
2271 vinfo( 1)=
vname(1,ifield)
2272 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
2273 vinfo( 3)=
'second meter-1'
2274 vinfo(14)=
vname(4,ifield)
2276 vinfo(21)=
vname(6,ifield)
2277 aval(5)=real(
iinfo(1,ifield,ng),r8)
2282 &
adm(ng)%pioVar(ifield)%vd, &
2283 &
pio_fout, 4, t2dobc, aval, vinfo, ncname, &
2284 & setfillval = .false.)
2294 vinfo( 3)=
'second meter-1'
2297# if defined WRITE_WATER && defined MASKING
2301 vinfo(22)=
'coordinates'
2308 &
pio_fout, nvd3, v2dgrd, aval, vinfo, ncname)
2312# ifdef ADJUST_BOUNDARY
2318 vinfo( 1)=
vname(1,ifield)
2319 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
2320 vinfo( 3)=
'second meter-1'
2321 vinfo(14)=
vname(4,ifield)
2323 vinfo(21)=
vname(6,ifield)
2324 aval(5)=real(
iinfo(1,ifield,ng),r8)
2329 &
adm(ng)%pioVar(ifield)%vd, &
2330 &
pio_fout, 4, t2dobc, aval, vinfo, ncname, &
2331 & setfillval = .false.)
2342 vinfo( 3)=
'second meter-1'
2345# if defined WRITE_WATER && defined MASKING
2349 vinfo(22)=
'coordinates'
2356 &
pio_fout, nvd4, u3dgrd, aval, vinfo, ncname)
2360# ifdef ADJUST_BOUNDARY
2366 vinfo( 1)=
vname(1,ifield)
2367 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
2368 vinfo( 3)=
'second meter-1'
2369 vinfo(14)=
vname(4,ifield)
2371 vinfo(21)=
vname(6,ifield)
2372 aval(5)=real(
iinfo(1,ifield,ng),r8)
2377 &
adm(ng)%pioVar(ifield)%vd, &
2378 &
pio_fout, 5, t3dobc, aval, vinfo, ncname, &
2379 & setfillval = .false.)
2389 vinfo( 3)=
'second meter-1'
2392# if defined WRITE_WATER && defined MASKING
2396 vinfo(22)=
'coordinates'
2403 &
pio_fout, nvd4, v3dgrd, aval, vinfo, ncname)
2407# ifdef ADJUST_BOUNDARY
2413 vinfo( 1)=
vname(1,ifield)
2414 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
2415 vinfo( 3)=
'second meter-1'
2416 vinfo(14)=
vname(4,ifield)
2418 vinfo(21)=
vname(6,ifield)
2419 aval(5)=real(
iinfo(1,ifield,ng),r8)
2424 &
adm(ng)%pioVar(ifield)%vd, &
2425 &
pio_fout, 5, t3dobc, aval, vinfo, ncname, &
2426 & setfillval = .false.)
2430# ifdef UV_DESTAGGERED
2440# if defined WRITE_WATER && defined MASKING
2441 vinfo(20)=
'mask_rho'
2444 vinfo(22)=
'coordinates'
2451 &
pio_fout, nvd4, t3dgrd, aval, vinfo, ncname)
2463# if defined WRITE_WATER && defined MASKING
2464 vinfo(20)=
'mask_rho'
2467 vinfo(22)=
'coordinates'
2474 &
pio_fout, nvd4, t3dgrd, aval, vinfo, ncname)
2484 vinfo( 3)=
'meter second-1'
2488 vinfo(22)=
'coordinates'
2495 &
pio_fout, nvd4, v3dgrd, aval, vinfo, ncname)
2508# ifdef SEDIMENT_NOT_YET
2510 IF (itrc.eq.
idsed(i))
THEN
2511 WRITE (vinfo(19),50) 1000.0_r8*
sd50(i,ng)
2515# if defined WRITE_WATER && defined MASKING
2516 vinfo(20)=
'mask_rho'
2519 vinfo(22)=
'coordinates'
2525 &
adm(ng)%pioTrc(itrc)%vd, &
2526 &
pio_fout, nvd4, t3dgrd, aval, vinfo, ncname)
2531# ifdef ADJUST_BOUNDARY
2538 vinfo( 1)=
vname(1,ifield)
2539 WRITE (vinfo( 2),40) trim(
vname(2,ifield))
2540 vinfo( 3)=
vname(3,ifield)
2541 vinfo(14)=
vname(4,ifield)
2545 IF (itrc.eq.
idsed(i))
THEN
2546 WRITE (vinfo(19),50) 1000.0_r8*
sd50(i,ng)
2550 vinfo(21)=
vname(6,ifield)
2551 aval(5)=real(
iinfo(1,ifield,ng),r8)
2556 &
adm(ng)%pioVar(ifield)%vd, &
2557 &
pio_fout, 5, t3dobc, aval, vinfo, ncname, &
2558 & setfillval = .false.)
2572# if defined WRITE_WATER && defined MASKING
2573 vinfo(20)=
'mask_rho'
2576 vinfo(22)=
'coordinates'
2583 &
pio_fout, nvd4, t3dgrd, aval, vinfo, ncname)
2596 vinfo(22)=
'coordinates'
2603 &
pio_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
2604 & setfillval = .false.)
2617 vinfo(22)=
'coordinates'
2624 &
pio_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
2625 & setfillval = .false.)
2640 vinfo(22)=
'coordinates'
2647 &
pio_fout, nvd4, w3dgrd, aval, vinfo, ncname, &
2648 & setfillval = .false.)
2652# ifndef ADJUST_STFLUX
2661 IF (itrc.eq.
itemp)
THEN
2662 vinfo(11)=
'upward flux, cooling'
2663 vinfo(12)=
'downward flux, heating'
2664 ELSE IF (itrc.eq.
isalt)
THEN
2665 vinfo(11)=
'upward flux, freshening (net precipitation)'
2666 vinfo(12)=
'downward flux, salting (net evaporation)'
2670# if defined WRITE_WATER && defined MASKING
2671 vinfo(20)=
'mask_rho'
2674 vinfo(22)=
'coordinates'
2682 & nvd3, t2dgrd, aval, vinfo, ncname)
2688# ifndef ADJUST_WSTRESS
2698# if defined WRITE_WATER && defined MASKING
2702 vinfo(22)=
'coordinates'
2709 &
pio_fout, nvd3, u2dgrd, aval, vinfo, ncname)
2721# if defined WRITE_WATER && defined MASKING
2725 vinfo(22)=
'coordinates'
2732 &
pio_fout, nvd3, v2dgrd, aval, vinfo, ncname)
2745# if defined WRITE_WATER && defined MASKING
2749 vinfo(22)=
'coordinates'
2756 &
pio_fout, nvd3, u2dgrd, aval, vinfo, ncname)
2768# if defined WRITE_WATER && defined MASKING
2772 vinfo(22)=
'coordinates'
2779 &
pio_fout, nvd3, v2dgrd, aval, vinfo, ncname)
2794 CALL wrt_info (ng, model,
adm(ng)%pioFile, ncname)
2803 query :
IF (.not.ldef)
THEN
2810 WRITE (
stdout,60) trim(ncname)
2817 & piofile =
adm(ng)%pioFile)
2823 & piofile =
adm(ng)%pioFile)
2836 IF (trim(var_name(i)).eq.trim(
vname(1,
idtime)))
THEN
2842 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idpthr)))
THEN
2847 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idpthw)))
THEN
2853 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idfsur)))
THEN
2858 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idubar)))
THEN
2863 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvbar)))
THEN
2868# ifdef ADJUST_BOUNDARY
2869 ELSE IF (trim(var_name(i)).eq. &
2875 ELSE IF (trim(var_name(i)).eq. &
2881 ELSE IF (trim(var_name(i)).eq. &
2888# ifdef ADJUST_WSTRESS
2889 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idusms)))
THEN
2894 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvsms)))
THEN
2901 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
iduvel)))
THEN
2906 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvvel)))
THEN
2911# ifdef ADJUST_BOUNDARY
2912 ELSE IF (trim(var_name(i)).eq. &
2918 ELSE IF (trim(var_name(i)).eq. &
2925# ifdef UV_DESTAGGERED
2926 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idu3de)))
THEN
2931 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idv3dn)))
THEN
2937 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idovel)))
THEN
2942 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
iddano)))
THEN
2947 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idvvis)))
THEN
2952 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idtdif)))
THEN
2958 ELSE IF (trim(var_name(i)).eq.trim(
vname(1,
idsdif)))
THEN
2968 IF (trim(var_name(i)).eq.trim(
vname(1,
idtvar(itrc))))
THEN
2969 got_var(
idtvar(itrc))=.true.
2973# ifdef ADJUST_BOUNDARY
2974 ELSE IF (trim(var_name(i)).eq. &
2981# ifdef ADJUST_STFLUX
2982 ELSE IF (trim(var_name(i)).eq. &
2984 got_var(
idtsur(itrc))=.true.
2996 IF (.not.got_var(
idtime))
THEN
3034# ifdef ADJUST_BOUNDARY
3057# ifdef ADJUST_WSTRESS
3058 IF (.not.got_var(
idusms))
THEN
3064 IF (.not.got_var(
idvsms))
THEN
3084# ifdef ADJUST_BOUNDARY
3106# ifdef UV_DESTAGGERED
3135# ifdef ADJUST_BOUNDARY
3145# ifdef ADJUST_STFLUX
3165 adm(ng)%Rindex=min(
adm(ng)%Rindex,rec_size)
3166 fcount=
adm(ng)%Fcount
3167 adm(ng)%Nrec(fcount)=rec_size
3170 10
FORMAT (2x,
'AD_DEF_HIS_PIO - creating adjoint file,',t56, &
3171 &
'Grid ',i2.2,
': ',a)
3172 20
FORMAT (2x,
'AD_DEF_HIS_PIO - inquiring adjoint file,',t56, &
3173 &
'Grid ',i2.2,
': ',a)
3174 30
FORMAT (/,
' AD_DEF_HIS_PIO - unable to create adjoint NetCDF', &
3176 40
FORMAT (
'adjoint',1x,a)
3177 50
FORMAT (1pe11.4,1x,
'millimeter')
3178 60
FORMAT (/,
' AD_DEF_HIS_PIO - unable to open adjoint NetCDF', &
3180 70
FORMAT (/,
' AD_DEF_HIS_PIO - unable to find variable: ',a,2x, &
3181 &
' in adjoint NetCDF file: ',a)