3#if defined OPT_PERTURBATION || defined FORCING_SV
4# define ENERGYNORM_SCALE
6#if defined STOCHASTIC_OPT
8# define ENERGYNORM_SCALE
13# define IR_RANGE IstrT,IendT
14# define IU_RANGE IstrP,IendT
15# define JR_RANGE JstrT,JendT
16# define JV_RANGE JstrP,JendT
18# define IR_RANGE Istr,Iend
19# define IU_RANGE IstrU,Iend
20# define JR_RANGE Jstr,Jend
21# define JV_RANGE JstrV,Jend
48# ifdef STOCH_OPT_WHITE
51 PUBLIC :: ad_so_pack_red
72 SUBROUTINE c_norm2 (ng, model, Mstr, Mend, &
73 & EvalueR, EvalueI, EvectorR, EvectorI, &
104 integer,
intent(in) :: ng, model
105 integer,
intent(in) :: Mstr, Mend
107 real(r8),
intent(in) :: EvalueR
108 real(r8),
intent(in) :: EvalueI
111 real(r8),
intent(in) :: EvectorR(Mstr:)
112 real(r8),
intent(in) :: EvectorI(Mstr:)
113 real(r8),
intent(in) :: state(Mstr:)
115 real(r8),
intent(in) :: EvectorR(Mstr:Mend)
116 real(r8),
intent(in) :: EvectorI(Mstr:Mend)
117 real(r8),
intent(in) :: state(Mstr:Mend)
119 real(r8),
intent(out) :: norm2
125 real(r8) :: cff, my_norm2
128 character (len=3) :: op_handle
139 cff=state(is)+evaluer*evectorr(is)+ &
140 & evaluei*evectori(is)
141 my_norm2=my_norm2+cff*cff
162 CALL mp_reduce (ng, model, 1, norm2, op_handle)
171# if defined HESSIAN_FSV || defined HESSIAN_SO || defined HESSIAN_SV
174 & Evalue, Evector, state, norm2)
200 integer,
intent(in) :: ng, model
201 integer,
intent(in) :: Mstr, Mend
203 real(r8),
intent(in) :: Evalue
206 real(r8),
intent(in) :: Evector(Mstr:)
207 real(r8),
intent(in) :: state(Mstr:)
209 real(r8),
intent(in) :: Evector(Mstr:Mend)
210 real(r8),
intent(in) :: state(Mstr:Mend)
212 real(r8),
intent(out) :: norm2
218 real(r8) :: cff, my_norm2
229 cff=state(is)+evalue*evector(is)
230 my_norm2=my_norm2+cff*cff
244 SUBROUTINE r_norm2 (ng, model, Mstr, Mend, &
245 & Evalue, Evector, state, norm2)
274 integer,
intent(in) :: ng, model
275 integer,
intent(in) :: Mstr, Mend
277 real(r8),
intent(in) :: Evalue
280 real(r8),
intent(in) :: Evector(Mstr:)
281 real(r8),
intent(in) :: state(Mstr:)
283 real(r8),
intent(in) :: Evector(Mstr:Mend)
284 real(r8),
intent(in) :: state(Mstr:Mend)
286 real(r8),
intent(out) :: norm2
292 real(r8) :: cff, my_norm2
295 character (len=3) :: op_handle
306 cff=state(is)+evalue*evector(is)
307 my_norm2=my_norm2+cff*cff
328 CALL mp_reduce (ng, model, 1, norm2, op_handle)
338# if defined ADJOINT && defined FORCING_SV
340 SUBROUTINE ad_pack (ng, tile, Mstr, Mend, ad_state)
364 integer,
intent(in) :: ng, tile
365 integer,
intent(in) :: Mstr, Mend
367 real(r8),
intent(out) :: ad_state(Mstr:)
369 real(r8),
intent(out) :: ad_state(Mstr:Mend)
374 character (len=*),
parameter :: MyFile = &
375 & __FILE__//
", ad_pack"
384 & lbi, ubi, lbj, ubj, &
385 & imins, imaxs, jmins, jmaxs, &
393 & mstr, mend, ad_state, &
396 &
grid(ng) % IJwaterR, &
397 &
grid(ng) % IJwaterU, &
398 &
grid(ng) % IJwaterV, &
399 &
grid(ng) % rmask, &
400 &
grid(ng) % umask, &
401 &
grid(ng) % vmask, &
409 &
forces(ng) % ad_stflx, &
411 &
ocean(ng) % f_ubar, &
412 &
ocean(ng) % f_vbar, &
413 &
ocean(ng) % f_zeta, &
414 &
forces(ng) % ad_sustr, &
435 & LBi, UBi, LBj, UBj, &
436 & IminS, ImaxS, JminS, JmaxS, &
441 & Mstr, Mend, ad_state, &
443 & IJwaterR, IJwaterU, IJwaterV, &
444 & rmask, umask, vmask, &
449 & f_t, f_u, f_v, ad_stflx, &
452 & f_zeta, ad_sustr, ad_svstr)
477 integer,
intent(in) :: ng, tile
478 integer,
intent(in) :: LBi, UBi, LBj, UBj
479 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
480 integer,
intent(in) :: Mstr, Mend
481 integer,
intent(in) :: kstp
483 integer,
intent(in) :: nstp
488 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
489 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
490 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
492 real(r8),
intent(in) :: rmask(LBi:,LBj:)
493 real(r8),
intent(in) :: umask(LBi:,LBj:)
494 real(r8),
intent(in) :: vmask(LBi:,LBj:)
496 real(r8),
intent(in) :: h(LBi:,LBj:)
498 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
500 real(r8),
intent(inout) :: f_t(LBi:,LBj:,:,:)
501 real(r8),
intent(inout) :: f_u(LBi:,LBj:,:)
502 real(r8),
intent(inout) :: f_v(LBi:,LBj:,:)
503 real(r8),
intent(inout) :: ad_stflx(LBi:,LBj:,:)
505 real(r8),
intent(inout) :: f_ubar(LBi:,LBj:)
506 real(r8),
intent(inout) :: f_vbar(LBi:,LBj:)
507 real(r8),
intent(inout) :: f_zeta(LBi:,LBj:)
508 real(r8),
intent(inout) :: ad_sustr(LBi:,LBj:)
509 real(r8),
intent(inout) :: ad_svstr(LBi:,LBj:)
510 real(r8),
intent(out) :: ad_state(Mstr:)
513 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
514 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
515 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
517 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
518 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
519 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
521 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
523 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
525 real(r8),
intent(inout) :: f_t(LBi:UBi,LBj:UBj,N(ng),NT(ng))
526 real(r8),
intent(inout) :: f_u(LBi:UBi,LBj:UBj,N(ng))
527 real(r8),
intent(inout) :: f_v(LBi:UBi,LBj:UBj,N(ng))
528 real(r8),
intent(inout) :: ad_stflx(LBi:UBi,LBj:UBj,NT(ng))
530 real(r8),
intent(inout) :: f_ubar(LBi:UBi,LBj:UBj)
531 real(r8),
intent(inout) :: f_vbar(LBi:UBi,LBj:UBj)
532 real(r8),
intent(inout) :: f_zeta(LBi:UBi,LBj:UBj)
533 real(r8),
intent(inout) :: ad_sustr(LBi:UBi,LBj:UBj)
534 real(r8),
intent(inout) :: ad_svstr(LBi:UBi,LBj:UBj)
535 real(r8),
intent(out) :: ad_state(Mstr:Mend)
541 integer :: Imax, Ioff, Jmax, Joff
543 integer :: Uoff, Voff
544 integer :: i, iadd, icount, is, itrc, j, k
547 integer,
dimension(7+2*NT(ng)) :: offset
549 integer,
dimension(7+2*(NT(ng)+1)) :: offset
552 real(r8),
parameter :: Aspv = 0.0_r8
554 real(r8) :: cff, scale
557 real(r8) :: cff1, cff2
558 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
559 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
562# include "set_bounds.h"
583 & lbi, ubi, lbj, ubj, &
589 & lbi, ubi, lbj, ubj, &
595 & lbi, ubi, lbj, ubj, 1, n(ng), &
599 & lbi, ubi, lbj, ubj, 1, n(ng), 1, nt(ng), &
607 & lbi, ubi, lbj, ubj, f_zeta)
610 & lbi, ubi, lbj, ubj, f_ubar)
612 & lbi, ubi, lbj, ubj, f_vbar)
615 & lbi, ubi, lbj, ubj, 1, n(ng), f_u)
617 & lbi, ubi, lbj, ubj, 1, n(ng), f_v)
620 & lbi, ubi, lbj, ubj, 1, n(ng), &
703 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
707 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
720 & (
lm(ng)+2)*(
mm(ng)+1)
723 & (
lm(ng)+2)*(
mm(ng)+2)
737 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
741 iadd=
lm(ng)*
mm(ng)*n(ng)
829# ifdef ENERGYNORM_SCALE
830 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
837 IF (rmask(i,j).gt.0.0_r8)
THEN
838 is=ijwaterr(i,j)+offset(
isfsur)
839 ad_state(is)=scale*f_zeta(i,j)
845 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
846 ad_state(is)=scale*f_zeta(i,j)
869# ifdef ENERGYNORM_SCALE
876# ifdef ENERGYNORM_SCALE
877 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
880 IF (umask(i,j).gt.0.0_r8)
THEN
881 is=ijwateru(i,j)+offset(
isubar)
882 ad_state(is)=scale*f_ubar(i,j)
888 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
889 ad_state(is)=scale*f_ubar(i,j)
910# ifdef ENERGYNORM_SCALE
917# ifdef ENERGYNORM_SCALE
918 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
921 IF (vmask(i,j).gt.0.0_r8)
THEN
922 is=ijwaterv(i,j)+offset(
isvbar)
923 ad_state(is)=scale*f_vbar(i,j)
929 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
930 ad_state(is)=scale*f_vbar(i,j)
952 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i-1,j,k))
953 dc(i,0)=dc(i,0)+dc(i,k)
968 f_u(i,j,k)=f_u(i,j,k)+dc(i,k)*cf(i,0)
988# ifdef ENERGYNORM_SCALE
997 iadd=(k-1)*imax*jmax+offset(
isuvel)
1001# ifdef ENERGYNORM_SCALE
1002 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
1005 IF (umask(i,j).gt.0.0_r8)
THEN
1006 is=ijwateru(i,j)+iadd
1007 ad_state(is)=scale*f_u(i,j,k)
1013 is=(i-ioff)+(j-joff)*imax+iadd
1014 ad_state(is)=scale*f_u(i,j,k)
1029 IF (j.ge.jstrm)
THEN
1036 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i,j-1,k))
1037 dc(i,0)=dc(i,0)+dc(i,k)
1044 cff2=cff2*vmask(i,j)
1052 f_v(i,j,k)=f_v(i,j,k)+dc(i,k)*cf(i,0)
1073# ifdef ENERGYNORM_SCALE
1082 iadd=(k-1)*imax*jmax+offset(
isvvel)
1086# ifdef ENERGYNORM_SCALE
1087 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
1090 IF (vmask(i,j).gt.0.0_r8)
THEN
1091 is=ijwaterv(i,j)+iadd
1092 ad_state(is)=scale*f_v(i,j,k)
1098 is=(i+ioff)+(j-joff)*imax+iadd
1099 ad_state(is)=scale*f_v(i,j,k)
1124# ifdef ENERGYNORM_SCALE
1125 IF (itrc.eq.
itemp)
THEN
1127 ELSE IF (itrc.eq.
isalt)
THEN
1139 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
1143# ifdef ENERGYNORM_SCALE
1144 scale=1.0_r8/sqrt(cff*hz(i,j,k))
1147 IF (rmask(i,j).gt.0.0_r8)
THEN
1148 is=ijwaterr(i,j)+iadd
1149 ad_state(is)=scale*f_t(i,j,k,itrc)
1150 f_t(i,j,k,itrc)=0.0_r8
1152 f_t(i,j,k,itrc)=0.0_r8
1155 is=(i+ioff)+(j-joff)*imax+iadd
1156 ad_state(is)=scale*f_t(i,j,k,itrc)
1157 f_t(i,j,k,itrc)=0.0_r8
1184 IF (umask(i,j).gt.0.0_r8)
THEN
1185 is=ijwateru(i,j)+offset(
isustr)
1186 ad_state(is)=scale*ad_sustr(i,j)
1189 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
1190 ad_state(is)=scale*ad_sustr(i,j)
1214 IF (vmask(i,j).gt.0.0_r8)
THEN
1215 is=ijwaterv(i,j)+offset(
isvstr)
1216 ad_state(is)=scale*ad_svstr(i,j)
1219 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
1220 ad_state(is)=scale*ad_svstr(i,j)
1249 IF (rmask(i,j).gt.0.0_r8)
THEN
1250 is=ijwaterr(i,j)+offset(
istsur(itrc))
1251 ad_state(is)=scale*ad_stflx(i,j,itrc)
1254 is=(i+ioff)+(j-joff)*imax+offset(
istsur(itrc))
1255 ad_state(is)=scale*ad_stflx(i,j,itrc)
1266# elif defined SO_SEMI
1268 SUBROUTINE ad_pack (ng, tile, Mstr, Mend, ad_state)
1290 integer,
intent(in) :: ng, tile
1291 integer,
intent(in) :: Mstr, Mend
1292# ifdef ASSUMED_SHAPE
1293 real(r8),
intent(out) :: ad_state(Mstr:)
1295 real(r8),
intent(out) :: ad_state(Mstr:Mend)
1300 character (len=*),
parameter :: MyFile = &
1301 & __FILE__//
", ad_pack"
1310 & lbi, ubi, lbj, ubj, &
1311 & imins, imaxs, jmins, jmaxs, &
1317 &
grid(ng) % IJwaterR, &
1318 &
grid(ng) % IJwaterU, &
1319 &
grid(ng) % IJwaterV, &
1320 &
grid(ng) % rmask, &
1321 &
grid(ng) % umask, &
1322 &
grid(ng) % vmask, &
1327 & mstr, mend, ad_state)
1348 & LBi, UBi, LBj, UBj, &
1349 & IminS, ImaxS, JminS, JmaxS, &
1355 & IJwaterR, IJwaterU, IJwaterV, &
1356 & rmask, umask, vmask, &
1358 & Mstr, Mend, ad_state)
1370 integer,
intent(in) :: ng, tile
1371 integer,
intent(in) :: LBi, UBi, LBj, UBj
1372 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
1373 integer,
intent(in) :: Mstr, Mend
1374 integer,
intent(in) :: kstp
1376 integer,
intent(in) :: nstp
1379# ifdef ASSUMED_SHAPE
1381 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
1382 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
1383 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
1385 real(r8),
intent(in) :: rmask(LBi:,LBj:)
1386 real(r8),
intent(in) :: umask(LBi:,LBj:)
1387 real(r8),
intent(in) :: vmask(LBi:,LBj:)
1389 real(r8),
intent(out) :: ad_state(Mstr:)
1392 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
1393 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
1394 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
1396 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
1397 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
1398 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
1400 real(r8),
intent(out) :: ad_state(Mstr:Mend)
1406 integer :: Imax, Ioff, Jmax, Joff
1408 integer :: Uoff, Voff
1409 integer :: i, iadd, is, itrc, j, k
1411 integer,
dimension(7+2*NT(ng)) :: offset
1413 real(r8),
parameter :: Aspv = 0.0_r8
1415 real(r8) :: cff, scale
1417# include "set_bounds.h"
1507 iadd=(
lm(ng)+2)*(
mm(ng)+1)*
n(ng)
1511 iadd=(
lm(ng)+2)*(
mm(ng)+2)*
n(ng)
1524 & (
lm(ng)+2)*(
mm(ng)+1)
1527 & (
lm(ng)+2)*(
mm(ng)+2)
1541 iadd=
lm(ng)*(
mm(ng)-voff)*
n(ng)
1545 iadd=
lm(ng)*
mm(ng)*
n(ng)
1633# ifdef ENERGYNORM_SCALE
1634 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
1641 IF (rmask(i,j).gt.0.0_r8)
THEN
1642 is=ijwaterr(i,j)+offset(
isfsur)
1643 ad_state(is)=scale*
ocean(ng)%ad_zeta(i,j,kstp)
1646 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
1647 ad_state(is)=scale*
ocean(ng)%ad_zeta(i,j,kstp)
1669# ifdef ENERGYNORM_SCALE
1677 IF (umask(i,j).gt.0.0_r8)
THEN
1678 is=ijwateru(i,j)+offset(
isubar)
1679 ad_state(is)=scale*
ocean(ng)%ad_ubar(i,j,kstp)
1682 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
1683 ad_state(is)=scale*
ocean(ng)%ad_ubar(i,j,kstp)
1703# ifdef ENERGYNORM_SCALE
1711 IF (vmask(i,j).gt.0.0_r8)
THEN
1712 is=ijwaterv(i,j)+offset(
isvbar)
1713 ad_state(is)=scale*
ocean(ng)%ad_vbar(i,j,kstp)
1716 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
1717 ad_state(is)=scale*
ocean(ng)%ad_vbar(i,j,kstp)
1741# ifdef ENERGYNORM_SCALE
1750 iadd=(k-1)*imax*jmax+offset(
isuvel)
1755 IF (umask(i,j).gt.0.0_r8)
THEN
1756 is=ijwateru(i,j)+iadd
1757 ad_state(is)=scale*
ocean(ng)%ad_u(i,j,k,nstp)
1760 is=(i-ioff)+(j-joff)*imax+iadd
1761 ad_state(is)=scale*
ocean(ng)%ad_u(i,j,k,nstp)
1784# ifdef ENERGYNORM_SCALE
1793 iadd=(k-1)*imax*jmax+offset(
isvvel)
1798 IF (vmask(i,j).gt.0.0_r8)
THEN
1799 is=ijwaterv(i,j)+iadd
1800 ad_state(is)=scale*
ocean(ng)%ad_v(i,j,k,nstp)
1803 is=(i+ioff)+(j-joff)*imax+iadd
1804 ad_state(is)=scale*
ocean(ng)%ad_v(i,j,k,nstp)
1828# ifdef ENERGYNORM_SCALE
1829 IF (itrc.eq.
itemp)
THEN
1831 ELSE IF (itrc.eq.
isalt)
THEN
1843 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
1848 IF (rmask(i,j).gt.0.0_r8)
THEN
1849 is=ijwaterr(i,j)+iadd
1850 ad_state(is)=scale*
ocean(ng)%ad_t(i,j,k,nstp,itrc)
1853 is=(i+ioff)+(j-joff)*imax+iadd
1854 ad_state(is)=scale*
ocean(ng)%ad_t(i,j,k,nstp,itrc)
1881 IF (umask(i,j).gt.0.0_r8)
THEN
1882 is=ijwateru(i,j)+offset(
isustr)
1883 ad_state(is)=scale*
forces(ng)%ad_sustr(i,j)
1886 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
1887 ad_state(is)=scale*
forces(ng)%ad_sustr(i,j)
1911 IF (vmask(i,j).gt.0.0_r8)
THEN
1912 is=ijwaterv(i,j)+offset(
isvstr)
1913 ad_state(is)=scale*
forces(ng)%ad_svstr(i,j)
1916 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
1917 ad_state(is)=scale*
forces(ng)%ad_svstr(i,j)
1946 IF (rmask(i,j).gt.0.0_r8)
THEN
1947 is=ijwaterr(i,j)+offset(
istsur(itrc))
1948 ad_state(is)=scale*
forces(ng)%ad_stflx(i,j,itrc)
1951 is=(i+ioff)+(j-joff)*imax+offset(
istsur(itrc))
1952 ad_state(is)=scale*
forces(ng)%ad_stflx(i,j,itrc)
1963# elif defined STOCHASTIC_OPT
1964# ifdef STOCH_OPT_WHITE
1966 SUBROUTINE ad_so_pack (ng, tile, Mstr, Mend, IntTrap, ad_state)
1990 integer,
intent(in) :: ng, tile
1991 integer,
intent(in) :: Mstr, Mend
1992 integer,
intent(in) :: IntTrap
1993# ifdef ASSUMED_SHAPE
1994 real(r8),
intent(out) :: ad_state(Mstr:)
1996 real(r8),
intent(out) :: ad_state(Mstr:Mend)
2001 character (len=*),
parameter :: MyFile = &
2002 & __FILE__//
", ad_so_pack"
2010 CALL ad_so_pack_tile (ng, tile, &
2011 & lbi, ubi, lbj, ubj, &
2012 & imins, imaxs, jmins, jmaxs, &
2021 & mstr, mend, ad_state, &
2024 &
grid(ng) % IJwaterR, &
2025 &
grid(ng) % IJwaterU, &
2026 &
grid(ng) % IJwaterV, &
2027 &
grid(ng) % rmask, &
2028 &
grid(ng) % umask, &
2029 &
grid(ng) % vmask, &
2034 &
ocean(ng) % ad_t, &
2035 &
ocean(ng) % ad_u, &
2036 &
ocean(ng) % ad_v, &
2037 &
forces(ng) % ad_stflx, &
2039 &
ocean(ng) % ad_ubar, &
2040 &
ocean(ng) % ad_vbar, &
2042 &
ocean(ng) % ad_zeta, &
2043 &
forces(ng) % ad_sustr, &
2060 END SUBROUTINE ad_so_pack
2063 SUBROUTINE ad_so_pack_tile (ng, tile, &
2064 & LBi, UBi, LBj, UBj, &
2065 & IminS, ImaxS, JminS, JmaxS, &
2071 & Mstr, Mend, ad_state, &
2073 & IJwaterR, IJwaterU, IJwaterV, &
2074 & rmask, umask, vmask, &
2079 & ad_t, ad_u, ad_v, ad_stflx, &
2081 & ad_ubar, ad_vbar, &
2083 & ad_zeta, ad_sustr, ad_svstr)
2096 integer,
intent(in) :: ng, tile
2097 integer,
intent(in) :: LBi, UBi, LBj, UBj
2098 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
2099 integer,
intent(in) :: Mstr, Mend
2100 integer,
intent(in) :: kstp
2101 integer,
intent(in) :: IntTrap
2103 integer,
intent(in) :: nstp
2106# ifdef ASSUMED_SHAPE
2108 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
2109 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
2110 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
2112 real(r8),
intent(in) :: rmask(LBi:,LBj:)
2113 real(r8),
intent(in) :: umask(LBi:,LBj:)
2114 real(r8),
intent(in) :: vmask(LBi:,LBj:)
2116 real(r8),
intent(in) :: h(LBi:,LBj:)
2118 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
2120 real(r8),
intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
2121 real(r8),
intent(inout) :: ad_u(LBi:,LBj:,:,:)
2122 real(r8),
intent(inout) :: ad_v(LBi:,LBj:,:,:)
2123 real(r8),
intent(inout) :: ad_stflx(LBi:,LBj:,:)
2125 real(r8),
intent(inout) :: ad_ubar(LBi:,LBj:,:)
2126 real(r8),
intent(inout) :: ad_vbar(LBi:,LBj:,:)
2128 real(r8),
intent(inout) :: ad_zeta(LBi:,LBj:,:)
2129 real(r8),
intent(inout) :: ad_sustr(LBi:,LBj:)
2130 real(r8),
intent(inout) :: ad_svstr(LBi:,LBj:)
2131 real(r8),
intent(out) :: ad_state(Mstr:)
2134 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
2135 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
2136 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
2138 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
2139 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
2140 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
2142 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
2144 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
2146 real(r8),
intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
2147 real(r8),
intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
2148 real(r8),
intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
2149 real(r8),
intent(inout) :: ad_stflx(LBi:UBi,LBj:UBj,NT(ng))
2151 real(r8),
intent(inout) :: ad_ubar(LBi:UBi,LBj:UBj,:)
2152 real(r8),
intent(inout) :: ad_vbar(LBi:UBi,LBj:UBj,:)
2154 real(r8),
intent(inout) :: ad_zeta(LBi:UBi,LBj:UBj,:)
2155 real(r8),
intent(inout) :: ad_sustr(LBi:UBi,LBj:UBj)
2156 real(r8),
intent(inout) :: ad_svstr(LBi:UBi,LBj:UBj)
2157 real(r8),
intent(out) :: ad_state(Mstr:Mend)
2163 integer :: Imax, Ioff, Jmax, Joff
2165 integer :: Uoff, Voff
2166 integer :: i, iadd, icount, is, itrc, j, k
2169 integer,
dimension(7+2*NT(ng)) :: offset
2171 integer,
dimension(7+2*(NT(ng)+1)) :: offset
2174 real(r8),
parameter :: Aspv = 0.0_r8
2176 real(r8) :: cff, cff1, scale
2178# include "set_bounds.h"
2199 IF (inttrap.eq.1)
THEN
2201 storage(ng)%ad_Work(is)=0.0_r8
2276 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
2280 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
2293 & (
lm(ng)+2)*(
mm(ng)+1)
2296 & (
lm(ng)+2)*(
mm(ng)+2)
2310 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
2314 iadd=
lm(ng)*
mm(ng)*n(ng)
2389 IF ((inttrap.eq.1).or.(inttrap.eq.
nintervals+1))
THEN
2408# ifdef ENERGYNORM_SCALE
2409 scale=scale/sqrt(0.5_r8*
g*
rho0)
2414 IF (rmask(i,j).gt.0.0_r8)
THEN
2415 is=ijwaterr(i,j)+offset(
isfsur)
2416 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2417 & scale*ad_zeta(i,j,kstp)
2418 storage(ng)%ad_Work(is)=ad_state(is)
2421 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
2422 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2423 & scale*ad_zeta(i,j,kstp)
2424 storage(ng)%ad_Work(is)=ad_state(is)
2446# ifdef ENERGYNORM_SCALE
2451# ifdef ENERGYNORM_SCALE
2452 scale=cff1/sqrt(cff*(h(i-1,j)+h(i,j)))
2457 IF (umask(i,j).gt.0.0_r8)
THEN
2458 is=ijwateru(i,j)+offset(
isubar)
2459 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2460 & scale*ad_ubar(i,j,kstp)
2461 storage(ng)%ad_Work(is)=ad_state(is)
2464 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
2465 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2466 & scale*ad_ubar(i,j,kstp)
2467 storage(ng)%ad_Work(is)=ad_state(is)
2487# ifdef ENERGYNORM_SCALE
2492# ifdef ENERGYNORM_SCALE
2493 scale=cff1/sqrt(cff*(h(i,j-1)+h(i,j)))
2498 IF (vmask(i,j).gt.0.0_r8)
THEN
2499 is=ijwaterv(i,j)+offset(
isvbar)
2500 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2501 & scale*ad_vbar(i,j,kstp)
2502 storage(ng)%ad_Work(is)=ad_state(is)
2505 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
2506 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2507 & scale*ad_vbar(i,j,kstp)
2508 storage(ng)%ad_Work(is)=ad_state(is)
2532# ifdef ENERGYNORM_SCALE
2539 iadd=(k-1)*imax*jmax+offset(
isuvel)
2544 IF (umask(i,j).gt.0.0_r8)
THEN
2545# ifdef ENERGYNORM_SCALE
2546 scale=cff1/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
2550 is=ijwateru(i,j)+iadd
2551 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2552 & scale*ad_u(i,j,k,nstp)
2553 storage(ng)%ad_Work(is)=ad_state(is)
2556# ifdef ENERGYNORM_SCALE
2557 scale=cff1/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
2561 is=(i-ioff)+(j-joff)*imax+iadd
2562 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2563 & scale*ad_u(i,j,k,nstp)
2564 storage(ng)%ad_Work(is)=ad_state(is)
2587# ifdef ENERGYNORM_SCALE
2594 iadd=(k-1)*imax*jmax+offset(
isvvel)
2599 IF (vmask(i,j).gt.0.0_r8)
THEN
2600# ifdef ENERGYNORM_SCALE
2601 scale=cff1/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
2605 is=ijwaterv(i,j)+iadd
2606 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2607 & scale*ad_v(i,j,k,nstp)
2608 storage(ng)%ad_Work(is)=ad_state(is)
2611# ifdef ENERGYNORM_SCALE
2612 scale=cff1/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
2616 is=(i+ioff)+(j-joff)*imax+iadd
2617 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2618 & scale*ad_v(i,j,k,nstp)
2619 storage(ng)%ad_Work(is)=ad_state(is)
2643# ifdef ENERGYNORM_SCALE
2644 IF (itrc.eq.
itemp)
THEN
2646 ELSE IF (itrc.eq.
isalt)
THEN
2656 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
2661 IF (rmask(i,j).gt.0.0_r8)
THEN
2662# ifdef ENERGYNORM_SCALE
2663 scale=cff1/sqrt(cff*hz(i,j,k))
2668 is=ijwaterr(i,j)+iadd
2669 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2670 & scale*ad_t(i,j,k,nstp,itrc)
2671 storage(ng)%ad_Work(is)=ad_state(is)
2674# ifdef ENERGYNORM_SCALE
2675 scale=cff1/sqrt(cff*hz(i,j,k))
2679 is=(i+ioff)+(j-joff)*imax+iadd
2680 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2681 & scale*ad_t(i,j,k,nstp,itrc)
2682 storage(ng)%ad_Work(is)=ad_state(is)
2709 IF (umask(i,j).gt.0.0_r8)
THEN
2710 is=ijwateru(i,j)+offset(
isustr)
2711 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2712 & scale*ad_sustr(i,j)
2713 storage(ng)%ad_Work(is)=ad_state(is)
2716 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
2717 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2718 & scale*ad_sustr(i,j)
2719 storage(ng)%ad_Work(is)=ad_state(is)
2743 IF (vmask(i,j).gt.0.0_r8)
THEN
2744 is=ijwaterv(i,j)+offset(
isvstr)
2745 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2746 & scale*ad_svstr(i,j)
2747 storage(ng)%ad_Work(is)=ad_state(is)
2750 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
2751 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2752 & scale*ad_svstr(i,j)
2753 storage(ng)%ad_Work(is)=ad_state(is)
2782 IF (rmask(i,j).gt.0.0_r8)
THEN
2783 is=ijwaterr(i,j)+offset(
istsur(itrc))
2784 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2785 & scale*ad_stflx(i,j,itrc)
2786 storage(ng)%ad_Work(is)=ad_state(is)
2789 is=(i+ioff)+(j-joff)*imax+offset(
istsur(itrc))
2790 ad_state(is)=
storage(ng)%ad_Work(is)+ &
2791 & scale*ad_stflx(i,j,itrc)
2792 storage(ng)%ad_Work(is)=ad_state(is)
2801 END SUBROUTINE ad_so_pack_tile
2805 SUBROUTINE ad_so_pack_red (ng, tile, Mstr, Mend, IntTrap, &
2830 integer,
intent(in) :: ng, tile
2831 integer,
intent(in) :: Mstr, Mend
2832 integer,
intent(in) :: IntTrap
2833# ifdef ASSUMED_SHAPE
2834 real(r8),
intent(out) :: ad_state(Mstr:)
2836 real(r8),
intent(out) :: ad_state(Mstr:Mend)
2841 character (len=*),
parameter :: MyFile = &
2842 & __FILE__//
", ad_so_pack_red"
2850 CALL ad_so_pack_red_tile (ng, tile, &
2851 & lbi, ubi, lbj, ubj, &
2852 & imins, imaxs, jmins, jmaxs, &
2861 & mstr, mend, ad_state, &
2864 &
grid(ng) % IJwaterR, &
2865 &
grid(ng) % IJwaterU, &
2866 &
grid(ng) % IJwaterV, &
2867 &
grid(ng) % rmask, &
2868 &
grid(ng) % umask, &
2869 &
grid(ng) % vmask, &
2874 &
ocean(ng) % ad_t, &
2875 &
ocean(ng) % ad_u, &
2876 &
ocean(ng) % ad_v, &
2877 &
forces(ng) % ad_stflx, &
2879 &
ocean(ng) % ad_ubar, &
2880 &
ocean(ng) % ad_vbar, &
2882 &
ocean(ng) % ad_zeta, &
2883 &
forces(ng) % ad_sustr, &
2900 END SUBROUTINE ad_so_pack_red
2903 SUBROUTINE ad_so_pack_red_tile (ng, tile, &
2904 & LBi, UBi, LBj, UBj, &
2905 & IminS, ImaxS, JminS, JmaxS, &
2911 & Mstr, Mend, ad_state, &
2913 & IJwaterR, IJwaterU, IJwaterV, &
2914 & rmask, umask, vmask, &
2919 & ad_t, ad_u, ad_v, ad_stflx, &
2921 & ad_ubar, ad_vbar, &
2923 & ad_zeta, ad_sustr, ad_svstr)
2934# if defined PIO_LIB && defined DISTRIBUTE
2948 integer,
intent(in) :: ng, tile
2949 integer,
intent(in) :: LBi, UBi, LBj, UBj
2950 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
2951 integer,
intent(in) :: Mstr, Mend
2952 integer,
intent(in) :: kstp
2953 integer,
intent(in) :: IntTrap
2955 integer,
intent(in) :: nstp
2958# ifdef ASSUMED_SHAPE
2960 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
2961 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
2962 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
2964 real(r8),
intent(in) :: rmask(LBi:,LBj:)
2965 real(r8),
intent(in) :: umask(LBi:,LBj:)
2966 real(r8),
intent(in) :: vmask(LBi:,LBj:)
2968 real(r8),
intent(in) :: h(LBi:,LBj:)
2970 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
2972 real(r8),
intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
2973 real(r8),
intent(inout) :: ad_u(LBi:,LBj:,:,:)
2974 real(r8),
intent(inout) :: ad_v(LBi:,LBj:,:,:)
2975 real(r8),
intent(inout) :: ad_stflx(LBi:,LBj:,:)
2977 real(r8),
intent(inout) :: ad_ubar(LBi:,LBj:,:)
2978 real(r8),
intent(inout) :: ad_vbar(LBi:,LBj:,:)
2980 real(r8),
intent(inout) :: ad_zeta(LBi:,LBj:,:)
2981 real(r8),
intent(inout) :: ad_sustr(LBi:,LBj:)
2982 real(r8),
intent(inout) :: ad_svstr(LBi:,LBj:)
2983 real(r8),
intent(out) :: ad_state(Mstr:)
2986 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
2987 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
2988 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
2990 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
2991 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
2992 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
2994 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
2996 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
2998 real(r8),
intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
2999 real(r8),
intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
3000 real(r8),
intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
3001 real(r8),
intent(inout) :: ad_stflx(LBi:UBi,LBj:UBj,NT(ng))
3003 real(r8),
intent(inout) :: ad_ubar(LBi:UBi,LBj:UBj,:)
3004 real(r8),
intent(inout) :: ad_vbar(LBi:UBi,LBj:UBj,:)
3006 real(r8),
intent(inout) :: ad_zeta(LBi:UBi,LBj:UBj,:)
3007 real(r8),
intent(inout) :: ad_sustr(LBi:UBi,LBj:UBj)
3008 real(r8),
intent(inout) :: ad_svstr(LBi:UBi,LBj:UBj)
3009 real(r8),
intent(out) :: ad_state(Mstr:Mend)
3015 integer :: Imax, Ioff, Jmax, Joff
3017 integer :: Uoff, Voff
3018 integer :: i, iadd, icount, ifield, is, itrc, j, k
3019 integer :: Fcount, Irec, Nrec
3020 integer :: gtype, status
3021 integer :: Vsize(4), ntAD, ntTL, Iinp
3024 integer,
dimension(7+2*NT(ng)) :: offset
3026 integer,
dimension(7+2*(NT(ng)+1)) :: offset
3029 real(r8),
parameter :: Aspv = 0.0_r8
3033 real(r8) :: Fmin, Fmax
3034 real(r8) :: cff, cff1, afac, scalev
3036 character (len=*),
parameter :: MyFile = &
3037 & __FILE__//
", ad_so_pack_red_tile"
3039# if defined PIO_LIB && defined DISTRIBUTE
3041 TYPE (IO_Desc_t),
pointer :: ioDesc
3044# include "set_bounds.h"
3065 IF (inttrap.eq.1)
THEN
3067 storage(ng)%ad_Work(is)=0.0_r8
3142 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
3146 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
3161 & (
lm(ng)+2)*(
mm(ng)+2)
3175 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
3179 iadd=
lm(ng)*
mm(ng)*n(ng)
3266 nttl=(inttrap-1)*
nadj(ng)+1
3267 fcount=
adm(ng)%Fcount
3268 nrec=
adm(ng)%Nrec(fcount)
3270 adrec_loop :
DO irec=1,nrec
3274 ntad=(nrec-irec)*
nadj(ng)+1
3275 CALL sp_bcoef (ng, ntad, nttl, afac)
3281 SELECT CASE (
adm(ng)%IOtype)
3288 & lbi, ubi, lbj, ubj, &
3289 & scale, fmin, fmax, &
3291 &
grid(ng) % rmask, &
3293 & ad_zeta(:,:,iinp))
3295 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3297 & irec, trim(
adm(ng)%name)
3303# if defined PIO_LIB && defined DISTRIBUTE
3305 IF (kind(ad_zeta).eq.8)
THEN
3314 & lbi, ubi, lbj, ubj, &
3315 & scale, fmin, fmax, &
3317 &
grid(ng) % rmask, &
3319 & ad_zeta(:,:,iinp))
3322 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
3324 & irec, trim(
adm(ng)%name)
3345# if defined ENERGYNORM_SCALE
3346 scalev=scalev/sqrt(0.5_r8*
g*
rho0)
3351 IF (rmask(i,j).gt.0.0_r8)
THEN
3352 is=ijwaterr(i,j)+offset(
isfsur)
3353 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3354 & scalev*ad_zeta(i,j,iinp)
3355 storage(ng)%ad_Work(is)=ad_state(is)
3358 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
3359 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3360 & scalev*ad_zeta(i,j,iinp)
3361 storage(ng)%ad_Work(is)=ad_state(is)
3372 SELECT CASE (
adm(ng)%IOtype)
3379 & lbi, ubi, lbj, ubj, &
3380 & scale, fmin, fmax, &
3382 &
grid(ng) % umask, &
3384 & ad_ubar(:,:,iinp))
3386 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3388 & irec, trim(
adm(ng)%name)
3394# if defined PIO_LIB && defined DISTRIBUTE
3396 IF (kind(ad_ubar).eq.8)
THEN
3405 & lbi, ubi, lbj, ubj, &
3406 & scale, fmin, fmax, &
3408 &
grid(ng) % umask, &
3410 & ad_ubar(:,:,iinp))
3413 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
3415 & irec, trim(
adm(ng)%name)
3435# if defined ENERGYNORM_SCALE
3440# if defined ENERGYNORM_SCALE
3441 scalev=afac/sqrt(cff*(h(i-1,j)+h(i,j)))
3446 IF (umask(i,j).gt.0.0_r8)
THEN
3447 is=ijwateru(i,j)+offset(
isubar)
3448 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3449 & scalev*ad_ubar(i,j,iinp)
3450 storage(ng)%ad_Work(is)=ad_state(is)
3453 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
3454 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3455 & scalev*ad_ubar(i,j,iinp)
3456 storage(ng)%ad_Work(is)=ad_state(is)
3465 SELECT CASE (
adm(ng)%IOtype)
3472 & lbi, ubi, lbj, ubj, &
3473 & scale, fmin, fmax, &
3475 &
grid(ng) % vmask, &
3477 & ad_vbar(:,:,iinp))
3479 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3481 & irec, trim(
adm(ng)%name)
3487# if defined PIO_LIB && defined DISTRIBUTE
3489 IF (kind(ad_vbar).eq.8)
THEN
3498 & lbi, ubi, lbj, ubj, &
3499 & scale, fmin, fmax, &
3501 &
grid(ng) % vmask, &
3503 & ad_vbar(:,:,iinp))
3506 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
3508 & irec, trim(
adm(ng)%name)
3528# if defined ENERGYNORM_SCALE
3533# if defined ENERGYNORM_SCALE
3534 scalev=afac/sqrt(cff*(h(i,j-1)+h(i,j)))
3539 IF (vmask(i,j).gt.0.0_r8)
THEN
3540 is=ijwaterv(i,j)+offset(
isvbar)
3541 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3542 & scalev*ad_vbar(i,j,iinp)
3543 storage(ng)%ad_Work(is)=ad_state(is)
3546 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
3547 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3548 & scalev*ad_vbar(i,j,iinp)
3549 storage(ng)%ad_Work(is)=ad_state(is)
3560 SELECT CASE (
adm(ng)%IOtype)
3567 & lbi, ubi, lbj, ubj, 1, n(ng), &
3568 & scale, fmin, fmax, &
3570 &
grid(ng) % umask, &
3574 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3576 & irec, trim(
adm(ng)%name)
3582# if defined PIO_LIB && defined DISTRIBUTE
3584 IF (kind(ad_u).eq.8)
THEN
3593 & lbi, ubi, lbj, ubj, 1, n(ng), &
3594 & scale, fmin, fmax, &
3596 &
grid(ng) % umask, &
3601 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
3603 & irec, trim(
adm(ng)%name)
3625# if defined ENERGYNORM_SCALE
3632 iadd=(k-1)*imax*jmax+offset(
isuvel)
3637 IF (umask(i,j).gt.0.0_r8)
THEN
3638# if defined ENERGYNORM_SCALE
3639 scalev=afac/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
3643 is=ijwateru(i,j)+iadd
3644 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3645 & scalev*ad_u(i,j,k,iinp)
3646 storage(ng)%ad_Work(is)=ad_state(is)
3649# if defined ENERGYNORM_SCALE
3650 scalev=afac/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
3654 is=(i-ioff)+(j-joff)*imax+iadd
3655 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3656 & scalev*ad_u(i,j,k,iinp)
3657 storage(ng)%ad_Work(is)=ad_state(is)
3667 SELECT CASE (
adm(ng)%IOtype)
3674 & lbi, ubi, lbj, ubj, 1, n(ng), &
3675 & scale, fmin, fmax, &
3677 &
grid(ng) % vmask, &
3681 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3683 & irec, trim(
adm(ng)%name)
3689# if defined PIO_LIB && defined DISTRIBUTE
3691 IF (kind(ad_v).eq.8)
THEN
3700 & lbi, ubi, lbj, ubj, 1, n(ng), &
3701 & scale, fmin, fmax, &
3703 &
grid(ng) % vmask, &
3708 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
3710 & irec, trim(
adm(ng)%name)
3732# if defined ENERGYNORM_SCALE
3739 iadd=(k-1)*imax*jmax+offset(
isvvel)
3744 IF (vmask(i,j).gt.0.0_r8)
THEN
3745# if defined ENERGYNORM_SCALE
3746 scalev=afac/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
3750 is=ijwaterv(i,j)+iadd
3751 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3752 & scalev*ad_v(i,j,k,iinp)
3753 storage(ng)%ad_Work(is)=ad_state(is)
3756# if defined ENERGYNORM_SCALE
3757 scalev=afac/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
3761 is=(i+ioff)+(j-joff)*imax+iadd
3762 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3763 & scalev*ad_v(i,j,k,iinp)
3764 storage(ng)%ad_Work(is)=ad_state(is)
3775 IF (
scalars(ng)%Fstate(ifield))
THEN
3776 SELECT CASE (
adm(ng)%IOtype)
3781 &
adm(ng)%Tid(itrc), irec, &
3783 & lbi, ubi, lbj, ubj, 1, n(ng), &
3784 & scale, fmin, fmax, &
3786 &
grid(ng) % rmask, &
3788 & ad_t(:,:,:,iinp,itrc))
3791 & __line__, myfile))
THEN
3793 & irec, trim(
adm(ng)%name)
3799# if defined PIO_LIB && defined DISTRIBUTE
3801 IF (kind(ad_t).eq.8)
THEN
3807 &
adm(ng)%pioFile,
vname(1,ifield), &
3808 &
adm(ng)%pioTrc(itrc), irec, &
3810 & lbi, ubi, lbj, ubj, 1, n(ng), &
3811 & scale, fmin, fmax, &
3813 &
grid(ng) % rmask, &
3815 & ad_t(:,:,:,iinp,itrc))
3819 & __line__, myfile))
THEN
3821 & irec, trim(
adm(ng)%name)
3843# if defined ENERGYNORM_SCALE
3844 IF (itrc.eq.
itemp)
THEN
3846 ELSE IF (itrc.eq.
isalt)
THEN
3856 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
3861 IF (rmask(i,j).gt.0.0_r8)
THEN
3862# if defined ENERGYNORM_SCALE
3863 scalev=afac/sqrt(cff*hz(i,j,k))
3867 is=ijwaterr(i,j)+iadd
3868 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3869 & scalev*ad_t(i,j,k,iinp,itrc)
3870 storage(ng)%ad_Work(is)=ad_state(is)
3873# if defined ENERGYNORM_SCALE
3874 scalev=afac/sqrt(cff*hz(i,j,k))
3878 is=(i+ioff)+(j-joff)*imax+iadd
3879 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3880 & scalev*ad_t(i,j,k,iinp,itrc)
3881 storage(ng)%ad_Work(is)=ad_state(is)
3893 SELECT CASE (
adm(ng)%IOtype)
3900 & lbi, ubi, lbj, ubj, &
3901 & scale, fmin, fmax, &
3903 &
grid(ng) % umask, &
3907 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3909 & irec, trim(
adm(ng)%name)
3915# if defined PIO_LIB && defined DISTRIBUTE
3917 IF (kind(ad_sustr).eq.8)
THEN
3926 & lbi, ubi, lbj, ubj, &
3927 & scale, fmin, fmax, &
3929 &
grid(ng) % umask, &
3934 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
3936 & irec, trim(
adm(ng)%name)
3959 IF (umask(i,j).gt.0.0_r8)
THEN
3960 is=ijwateru(i,j)+offset(
isustr)
3961 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3962 & afac*ad_sustr(i,j)
3963 storage(ng)%ad_Work(is)=ad_state(is)
3966 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
3967 ad_state(is)=
storage(ng)%ad_Work(is)+ &
3968 & afac*ad_sustr(i,j)
3969 storage(ng)%ad_Work(is)=ad_state(is)
3978 SELECT CASE (
adm(ng)%IOtype)
3985 & lbi, ubi, lbj, ubj, &
3986 & scale, fmin, fmax, &
3988 &
grid(ng) % vmask, &
3992 IF (
founderror(status, nf90_noerr, __line__, myfile))
THEN
3994 & irec, trim(
adm(ng)%name)
4000# if defined PIO_LIB && defined DISTRIBUTE
4002 IF (kind(ad_svstr).eq.8)
THEN
4011 & lbi, ubi, lbj, ubj, &
4012 & scale, fmin, fmax, &
4014 &
grid(ng) % vmask, &
4019 IF (
founderror(status, pio_noerr, __line__, myfile))
THEN
4021 & irec, trim(
adm(ng)%name)
4044 IF (vmask(i,j).gt.0.0_r8)
THEN
4045 is=ijwaterv(i,j)+offset(
isvstr)
4046 ad_state(is)=
storage(ng)%ad_Work(is)+ &
4047 & afac*ad_svstr(i,j)
4048 storage(ng)%ad_Work(is)=ad_state(is)
4051 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
4052 ad_state(is)=
storage(ng)%ad_Work(is)+ &
4053 & afac*ad_svstr(i,j)
4054 storage(ng)%ad_Work(is)=ad_state(is)
4066 IF (
scalars(ng)%Fstate(ifield))
THEN
4067 SELECT CASE (
adm(ng)%IOtype)
4072 &
adm(ng)%Vid(ifield), irec, &
4074 & lbi, ubi, lbj, ubj, &
4075 & scale, fmin, fmax, &
4077 &
grid(ng) % rmask, &
4079 & ad_stflx(:,:,itrc))
4082 & __line__, myfile))
THEN
4084 & irec, trim(
adm(ng)%name)
4090# if defined PIO_LIB && defined DISTRIBUTE
4092 IF (kind(ad_stflx).eq.8)
THEN
4098 &
adm(ng)%pioFile,
vname(1,ifield), &
4099 &
adm(ng)%pioVar(ifield), irec, &
4101 & lbi, ubi, lbj, ubj, &
4102 & scale, fmin, fmax, &
4104 &
grid(ng) % rmask, &
4106 & ad_stflx(:,:,itrc))
4110 & __line__, myfile))
THEN
4112 & irec, trim(
adm(ng)%name)
4137 IF (rmask(i,j).gt.0.0_r8)
THEN
4138 is=ijwaterr(i,j)+offset(
istsur(itrc))
4139 ad_state(is)=
storage(ng)%ad_Work(is)+ &
4140 & afac*ad_stflx(i,j,itrc)
4141 storage(ng)%ad_Work(is)=ad_state(is)
4144 is=(i+ioff)+(j-joff)*imax+offset(
istsur(itrc))
4145 ad_state(is)=
storage(ng)%ad_Work(is)+ &
4146 & afac*ad_stflx(i,j,itrc)
4147 storage(ng)%ad_Work(is)=ad_state(is)
4156 10
FORMAT (/,
' AD_SO_PACK_RED - error while reading variable: ',a,2x,&
4157 &
'at time record = ',i3,/,17x,
'in input NetCDF file: ',a)
4160 END SUBROUTINE ad_so_pack_red_tile
4164# elif defined ADJOINT
4166 SUBROUTINE ad_pack (ng, tile, Mstr, Mend, ad_state)
4189 integer,
intent(in) :: ng, tile
4190 integer,
intent(in) :: Mstr, Mend
4191# ifdef ASSUMED_SHAPE
4192 real(r8),
intent(out) :: ad_state(Mstr:)
4194 real(r8),
intent(out) :: ad_state(Mstr:Mend)
4199 character (len=*),
parameter :: MyFile = &
4200 & __FILE__//
", ad_pack"
4209 & lbi, ubi, lbj, ubj, &
4210 & imins, imaxs, jmins, jmaxs, &
4218 & mstr, mend, ad_state, &
4221 &
grid(ng) % IJwaterR, &
4222 &
grid(ng) % IJwaterU, &
4223 &
grid(ng) % IJwaterV, &
4224 &
grid(ng) % rmask, &
4225 &
grid(ng) % umask, &
4226 &
grid(ng) % vmask, &
4231 &
ocean(ng) % ad_t, &
4232 &
ocean(ng) % ad_u, &
4233 &
ocean(ng) % ad_v, &
4235 &
ocean(ng) % ad_ubar, &
4236 &
ocean(ng) % ad_vbar, &
4238 &
ocean(ng) % ad_zeta)
4258 & LBi, UBi, LBj, UBj, &
4259 & IminS, ImaxS, JminS, JmaxS, &
4264 & Mstr, Mend, ad_state, &
4266 & IJwaterR, IJwaterU, IJwaterV, &
4267 & rmask, umask, vmask, &
4272 & ad_t, ad_u, ad_v, &
4274 & ad_ubar, ad_vbar, &
4286 integer,
intent(in) :: ng, tile
4287 integer,
intent(in) :: LBi, UBi, LBj, UBj
4288 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
4289 integer,
intent(in) :: Mstr, Mend
4290 integer,
intent(in) :: kstp
4292 integer,
intent(in) :: nstp
4295# ifdef ASSUMED_SHAPE
4297 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
4298 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
4299 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
4301 real(r8),
intent(in) :: rmask(LBi:,LBj:)
4302 real(r8),
intent(in) :: umask(LBi:,LBj:)
4303 real(r8),
intent(in) :: vmask(LBi:,LBj:)
4305 real(r8),
intent(in) :: h(LBi:,LBj:)
4307 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
4309 real(r8),
intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
4310 real(r8),
intent(inout) :: ad_u(LBi:,LBj:,:,:)
4311 real(r8),
intent(inout) :: ad_v(LBi:,LBj:,:,:)
4313 real(r8),
intent(inout) :: ad_ubar(LBi:,LBj:,:)
4314 real(r8),
intent(inout) :: ad_vbar(LBi:,LBj:,:)
4316 real(r8),
intent(inout) :: ad_zeta(LBi:,LBj:,:)
4317 real(r8),
intent(out) :: ad_state(Mstr:)
4320 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
4321 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
4322 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
4324 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
4325 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
4326 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
4328 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
4330 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
4332 real(r8),
intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
4333 real(r8),
intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
4334 real(r8),
intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
4336 real(r8),
intent(inout) :: ad_ubar(LBi:UBi,LBj:UBj,:)
4337 real(r8),
intent(inout) :: ad_vbar(LBi:UBi,LBj:UBj,:)
4339 real(r8),
intent(inout) :: ad_zeta(LBi:UBi,LBj:UBj,:)
4340 real(r8),
intent(out) :: ad_state(Mstr:Mend)
4346 integer :: Imax, Ioff, Jmax, Joff
4348 integer :: Uoff, Voff
4349 integer :: i, iadd, is, itrc, j, k
4351 integer,
dimension(5+NT(ng)) :: offset
4353 real(r8),
parameter :: Aspv = 0.0_r8
4355 real(r8) :: cff, scale
4357# include "set_bounds.h"
4414 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
4417 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
4423 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
4426 iadd=
lm(ng)*
mm(ng)*n(ng)
4461# ifdef ENERGYNORM_SCALE
4462 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
4469 IF (rmask(i,j).gt.0.0_r8)
THEN
4470 is=ijwaterr(i,j)+offset(
isfsur)
4471 ad_state(is)=scale*ad_zeta(i,j,kstp)
4474 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
4475 ad_state(is)=scale*ad_zeta(i,j,kstp)
4495# ifdef ENERGYNORM_SCALE
4502# ifdef ENERGYNORM_SCALE
4503 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
4506 IF (umask(i,j).gt.0.0_r8)
THEN
4507 is=ijwateru(i,j)+offset(
isubar)
4508 ad_state(is)=scale*ad_ubar(i,j,kstp)
4511 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
4512 ad_state(is)=scale*ad_ubar(i,j,kstp)
4530# ifdef ENERGYNORM_SCALE
4537# ifdef ENERGYNORM_SCALE
4538 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
4541 IF (vmask(i,j).gt.0.0_r8)
THEN
4542 is=ijwaterv(i,j)+offset(
isvbar)
4543 ad_state(is)=scale*ad_vbar(i,j,kstp)
4546 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
4547 ad_state(is)=scale*ad_vbar(i,j,kstp)
4568# ifdef ENERGYNORM_SCALE
4577 iadd=(k-1)*imax*jmax+offset(
isuvel)
4582 IF (umask(i,j).gt.0.0_r8)
THEN
4583# ifdef ENERGYNORM_SCALE
4584 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
4586 is=ijwateru(i,j)+iadd
4587 ad_state(is)=scale*ad_u(i,j,k,nstp)
4590# ifdef ENERGYNORM_SCALE
4591 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
4593 is=(i-ioff)+(j-joff)*imax+iadd
4594 ad_state(is)=scale*ad_u(i,j,k,nstp)
4615# ifdef ENERGYNORM_SCALE
4624 iadd=(k-1)*imax*jmax+offset(
isvvel)
4629 IF (vmask(i,j).gt.0.0_r8)
THEN
4630# ifdef ENERGYNORM_SCALE
4631 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
4633 is=ijwaterv(i,j)+iadd
4634 ad_state(is)=scale*ad_v(i,j,k,nstp)
4637# ifdef ENERGYNORM_SCALE
4638 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
4640 is=(i+ioff)+(j-joff)*imax+iadd
4641 ad_state(is)=scale*ad_v(i,j,k,nstp)
4664# ifdef ENERGYNORM_SCALE
4665 IF (itrc.eq.
itemp)
THEN
4667 ELSE IF (itrc.eq.
isalt)
THEN
4679 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
4684 IF (rmask(i,j).gt.0.0_r8)
THEN
4685# ifdef ENERGYNORM_SCALE
4686 scale=1.0_r8/sqrt(cff*hz(i,j,k))
4688 is=ijwaterr(i,j)+iadd
4689 ad_state(is)=scale*ad_t(i,j,k,nstp,itrc)
4692# ifdef ENERGYNORM_SCALE
4693 scale=1.0_r8/sqrt(cff*hz(i,j,k))
4695 is=(i+ioff)+(j-joff)*imax+iadd
4696 ad_state(is)=scale*ad_t(i,j,k,nstp,itrc)
4709# if defined ADJOINT && (defined SO_SEMI || defined STOCHASTIC_OPT)
4735 integer,
intent(in) :: ng, tile
4736 integer,
intent(in) :: Mstr, Mend
4737# ifdef ASSUMED_SHAPE
4738 real(r8),
intent(in) :: state(Mstr:)
4740 real(r8),
intent(in) :: state(Mstr:Mend)
4745 character (len=*),
parameter :: MyFile = &
4746 & __FILE__//
", ad_unpak"
4765 & lbi, ubi, lbj, ubj, &
4766 & imins, imaxs, jmins, jmaxs, &
4767# ifdef STOCHASTIC_OPT
4776 &
grid(ng) % IJwaterR, &
4777 &
grid(ng) % IJwaterU, &
4778 &
grid(ng) % IJwaterV, &
4779 &
grid(ng) % rmask, &
4780 &
grid(ng) % umask, &
4781 &
grid(ng) % vmask, &
4783# ifdef ENERGYNORM_SCALE
4792 & mstr, mend, state)
4804 & LBi, UBi, LBj, UBj, &
4805 & IminS, ImaxS, JminS, JmaxS, &
4811 & IJwaterR, IJwaterU, IJwaterV, &
4812 & rmask, umask, vmask, &
4814# ifdef ENERGYNORM_SCALE
4820 & Mstr, Mend, state)
4832 integer,
intent(in) :: ng, tile
4833 integer,
intent(in) :: LBi, UBi, LBj, UBj
4834 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
4835 integer,
intent(in) :: kout
4837 integer,
intent(in) :: nout
4839 integer,
intent(in) :: Mstr, Mend
4841# ifdef ASSUMED_SHAPE
4843 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
4844 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
4845 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
4847 real(r8),
intent(in) :: rmask(LBi:,LBj:)
4848 real(r8),
intent(in) :: umask(LBi:,LBj:)
4849 real(r8),
intent(in) :: vmask(LBi:,LBj:)
4851# ifdef ENERGYNORM_SCALE
4852 real(r8),
intent(in) :: h(LBi:,LBj:)
4854 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
4857 real(r8),
intent(in) :: state(Mstr:)
4860 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
4861 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
4862 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
4864 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
4865 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
4866 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
4868# ifdef ENERGYNORM_SCALE
4869 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
4871 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
4874 real(r8),
intent(in) :: state(Mstr:Mend)
4880 integer :: Imax, Ioff, Jmax, Joff
4882 integer :: Uoff, Voff
4883 integer :: i, iadd, icount, is, itrc, j, k
4887 integer,
dimension(7+2*NT(ng)) :: offset
4889 integer,
dimension(7+2*(NT(ng)+1)) :: offset
4892 integer,
dimension(5) :: offset
4895 real(r8) :: cff, scale
4897# include "set_bounds.h"
4974 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
4978 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
4991 & (
lm(ng)+2)*(
mm(ng)+1)
4994 & (
lm(ng)+2)*(
mm(ng)+2)
5008 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
5012 iadd=
lm(ng)*
mm(ng)*n(ng)
5100# ifdef ENERGYNORM_SCALE
5101 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
5108 IF (rmask(i,j).gt.0.0_r8)
THEN
5109 is=ijwaterr(i,j)+offset(
isfsur)
5110 ocean(ng)%ad_zeta(i,j,kout)=scale*state(is)
5112 ocean(ng)%ad_zeta(i,j,kout)=0.0_r8
5115 is=(i-ioff)+(j-joff)*imax+offset(
isfsur)
5116 ocean(ng)%ad_zeta(i,j,kout)=scale*state(is)
5138# ifdef ENERGYNORM_SCALE
5145# ifdef ENERGYNORM_SCALE
5146 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
5149 IF (umask(i,j).gt.0.0_r8)
THEN
5150 is=ijwateru(i,j)+offset(
isubar)
5151 ocean(ng)%ad_ubar(i,j,kout)=scale*state(is)
5153 ocean(ng)%ubar(i,j,kout)=0.0_r8
5156 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
5157 ocean(ng)%ad_ubar(i,j,kout)=scale*state(is)
5177# ifdef ENERGYNORM_SCALE
5184# ifdef ENERGYNORM_SCALE
5185 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
5188 IF (vmask(i,j).gt.0.0_r8)
THEN
5189 is=ijwaterv(i,j)+offset(
isvbar)
5190 ocean(ng)%ad_vbar(i,j,kout)=scale*state(is)
5192 ocean(ng)%ad_vbar(i,j,kout)=0.0_r8
5195 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
5196 ocean(ng)%ad_vbar(i,j,kout)=scale*state(is)
5220# ifdef ENERGYNORM_SCALE
5229 iadd=(k-1)*imax*jmax+offset(
isuvel)
5234 IF (umask(i,j).gt.0.0_r8)
THEN
5235# ifdef ENERGYNORM_SCALE
5236 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
5238 is=ijwateru(i,j)+iadd
5239 ocean(ng)%ad_u(i,j,k,nout)=scale*state(is)
5241 ocean(ng)%ad_u(i,j,k,nout)=0.0_r8
5244# ifdef ENERGYNORM_SCALE
5245 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
5247 is=(i-ioff)+(j-joff)*imax+iadd
5248 ocean(ng)%ad_u(i,j,k,nout)=scale*state(is)
5271# ifdef ENERGYNORM_SCALE
5280 iadd=(k-1)*imax*jmax+offset(
isvvel)
5285 IF (vmask(i,j).gt.0.0_r8)
THEN
5286# ifdef ENERGYNORM_SCALE
5287 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
5289 is=ijwaterv(i,j)+iadd
5290 ocean(ng)%ad_v(i,j,k,nout)=scale*state(is)
5292 ocean(ng)%ad_v(i,j,k,nout)=0.0_r8
5295# ifdef ENERGYNORM_SCALE
5296 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
5298 is=(i+ioff)+(j-joff)*imax+iadd
5299 ocean(ng)%ad_v(i,j,k,nout)=scale*state(is)
5323# ifdef ENERGYNORM_SCALE
5324 IF (itrc.eq.
itemp)
THEN
5326 ELSE IF (itrc.eq.
isalt)
THEN
5338 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
5343 IF (rmask(i,j).gt.0.0_r8)
THEN
5344# ifdef ENERGYNORM_SCALE
5345 scale=1.0_r8/sqrt(cff*hz(i,j,k))
5347 is=ijwaterr(i,j)+iadd
5348 ocean(ng)%ad_t(i,j,k,nout,itrc)=scale*state(is)
5350 ocean(ng)%ad_t(i,j,k,nout,itrc)=0.0_r8
5353# ifdef ENERGYNORM_SCALE
5354 scale=1.0_r8/sqrt(cff*hz(i,j,k))
5356 is=(i+ioff)+(j-joff)*imax+iadd
5357 ocean(ng)%ad_t(i,j,k,nout,itrc)=scale*state(is)
5384 IF (umask(i,j).gt.0.0_r8)
THEN
5385 is=ijwateru(i,j)+offset(
isustr)
5386 forces(ng)%ad_sustr(i,j)=scale*state(is)
5388 forces(ng)%ad_sustr(i,j)=0.0_r8
5391 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
5392 forces(ng)%ad_sustr(i,j)=scale*state(is)
5416 IF (vmask(i,j).gt.0.0_r8)
THEN
5417 is=ijwaterv(i,j)+offset(
isvstr)
5418 forces(ng)%ad_svstr(i,j)=scale*state(is)
5420 forces(ng)%ad_svstr(i,j)=0.0_r8
5423 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
5424 forces(ng)%ad_svstr(i,j)=scale*state(is)
5453 IF (rmask(i,j).gt.0.0_r8)
THEN
5454 is=ijwaterr(i,j)+offset(
istvar(itrc))
5455 forces(ng)%ad_stflx(i,j,itrc)=scale*state(is)
5457 forces(ng)%ad_stflx(i,j,itrc)=0.0_r8
5460 is=(i+ioff)+(j-joff)*imax+offset(
istvar(itrc))
5461 forces(ng)%ad_stflx(i,j,itrc)=scale*state(is)
5472# elif defined ADJOINT
5474 SUBROUTINE ad_unpack (ng, tile, Mstr, Mend, state)
5498 integer,
intent(in) :: ng, tile
5499 integer,
intent(in) :: Mstr, Mend
5500# ifdef ASSUMED_SHAPE
5501 real(r8),
intent(in) :: state(Mstr:)
5503 real(r8),
intent(in) :: state(Mstr:Mend)
5508 character (len=*),
parameter :: MyFile = &
5509 & __FILE__//
", ad_unpack"
5527 & lbi, ubi, lbj, ubj, &
5528 & imins, imaxs, jmins, jmaxs, &
5536 & mstr, mend, state, &
5539 &
grid(ng) % IJwaterR, &
5540 &
grid(ng) % IJwaterU, &
5541 &
grid(ng) % IJwaterV, &
5542 &
grid(ng) % rmask, &
5543 &
grid(ng) % umask, &
5544 &
grid(ng) % vmask, &
5549 &
ocean(ng) % ad_t, &
5550 &
ocean(ng) % ad_u, &
5551 &
ocean(ng) % ad_v, &
5553 &
ocean(ng) % ad_ubar, &
5554 &
ocean(ng) % ad_vbar, &
5556 &
ocean(ng) % ad_zeta)
5566 & LBi, UBi, LBj, UBj, &
5567 & IminS, ImaxS, JminS, JmaxS, &
5572 & Mstr, Mend, state, &
5574 & IJwaterR, IJwaterU, IJwaterV, &
5575 & rmask, umask, vmask, &
5580 & ad_t, ad_u, ad_v, &
5582 & ad_ubar, ad_vbar, &
5594 integer,
intent(in) :: ng, tile
5595 integer,
intent(in) :: LBi, UBi, LBj, UBj
5596 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
5597 integer,
intent(in) :: Mstr, Mend
5598 integer,
intent(in) :: knew
5600 integer,
intent(in) :: nstp
5603# ifdef ASSUMED_SHAPE
5605 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
5606 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
5607 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
5609 real(r8),
intent(in) :: rmask(LBi:,LBj:)
5610 real(r8),
intent(in) :: umask(LBi:,LBj:)
5611 real(r8),
intent(in) :: vmask(LBi:,LBj:)
5613 real(r8),
intent(in) :: state(Mstr:)
5614 real(r8),
intent(in) :: h(LBi:,LBj:)
5616 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
5618 real(r8),
intent(inout) :: ad_t(LBi:,LBj:,:,:,:)
5619 real(r8),
intent(inout) :: ad_u(LBi:,LBj:,:,:)
5620 real(r8),
intent(inout) :: ad_v(LBi:,LBj:,:,:)
5622 real(r8),
intent(inout) :: ad_ubar(LBi:,LBj:,:)
5623 real(r8),
intent(inout) :: ad_vbar(LBi:,LBj:,:)
5625 real(r8),
intent(inout) :: ad_zeta(LBi:,LBj:,:)
5628 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
5629 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
5630 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
5632 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
5633 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
5634 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
5636 real(r8),
intent(in) :: state(Mstr:Mend)
5637 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
5639 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
5641 real(r8),
intent(inout) :: ad_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
5642 real(r8),
intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
5643 real(r8),
intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
5645 real(r8),
intent(inout) :: ad_ubar(LBi:UBi,LBj:UBj,:)
5646 real(r8),
intent(inout) :: ad_vbar(LBi:UBi,LBj:UBj,:)
5648 real(r8),
intent(inout) :: ad_zeta(LBi:UBi,LBj:UBj,:)
5654 integer :: Imax, Ioff, Jmax, Joff
5656 integer :: Uoff, Voff
5657 integer :: i, iadd, is, itrc, j, k
5659 integer,
dimension(5+NT(ng)) :: offset
5661 real(r8) :: cff, scale
5663# include "set_bounds.h"
5707 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
5710 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
5716 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
5719 iadd=
lm(ng)*
mm(ng)*n(ng)
5754# if defined ENERGYNORM_SCALE
5755 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
5762 IF (rmask(i,j).gt.0.0_r8)
THEN
5763 is=ijwaterr(i,j)+offset(
isfsur)
5764 ad_zeta(i,j,knew)=scale*state(is)
5766 ad_zeta(i,j,knew)=0.0_r8
5769 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
5770 ad_zeta(i,j,knew)=scale*state(is)
5789# if defined ENERGYNORM_SCALE
5796# if define ENERGYNORM_SCALE
5797 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
5800 IF (umask(i,j).gt.0.0_r8)
THEN
5801 is=ijwateru(i,j)+offset(
isubar)
5802 ad_ubar(i,j,knew)=scale*state(is)
5804 ad_ubar(i,j,knew)=0.0_r8
5807 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
5808 ad_ubar(i,j,knew)=scale*state(is)
5826# if defined ENERGYNORM_SCALE
5833# if defined ENERGYNORM_SCALE
5834 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
5837 IF (vmask(i,j).gt.0.0_r8)
THEN
5838 is=ijwaterv(i,j)+offset(
isvbar)
5839 ad_vbar(i,j,knew)=scale*state(is)
5841 ad_vbar(i,j,knew)=0.0_r8
5844 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
5845 ad_vbar(i,j,knew)=scale*state(is)
5866# if defined ENERGYNORM_SCALE
5875 iadd=(k-1)*imax*jmax+offset(
isuvel)
5880 IF (umask(i,j).gt.0.0_r8)
THEN
5881# if defined ENERGYNORM_SCALE
5882 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
5884 is=ijwateru(i,j)+iadd
5885 ad_u(i,j,k,nstp)=scale*state(is)
5887 ad_u(i,j,k,nstp)=0.0_r8
5890# if defined ENERGYNORM_SCALE
5891 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
5893 is=(i-ioff)+(j-joff)*imax+iadd
5894 ad_u(i,j,k,nstp)=scale*state(is)
5915# if defined ENERGYNORM_SCALE
5924 iadd=(k-1)*imax*jmax+offset(
isvvel)
5929 IF (vmask(i,j).gt.0.0_r8)
THEN
5930# if defined ENERGYNORM_SCALE
5931 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
5933 is=ijwaterv(i,j)+iadd
5934 ad_v(i,j,k,nstp)=scale*state(is)
5936 ad_v(i,j,k,nstp)=0.0_r8
5939# if defined ENERGYNORM_SCALE
5940 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
5942 is=(i+ioff)+(j-joff)*imax+iadd
5943 ad_v(i,j,k,nstp)=scale*state(is)
5966# if defined ENERGYNORM_SCALE
5967 IF (itrc.eq.
itemp)
THEN
5969 ELSE IF (itrc.eq.
isalt)
THEN
5981 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
5986 IF (rmask(i,j).gt.0.0_r8)
THEN
5987# if defined ENERGYNORM_SCALE
5988 scale=1.0_r8/sqrt(cff*hz(i,j,k))
5990 is=ijwaterr(i,j)+iadd
5991 ad_t(i,j,k,nstp,itrc)=scale*state(is)
5993 ad_t(i,j,k,nstp,itrc)=0.0_r8
5996# if defined ENERGYNORM_SCALE
5997 scale=1.0_r8/sqrt(cff*hz(i,j,k))
5999 is=(i+ioff)+(j-joff)*imax+iadd
6000 ad_t(i,j,k,nstp,itrc)=scale*state(is)
6014 SUBROUTINE tl_pack (ng, tile, Mstr, Mend, tl_state)
6037 integer,
intent(in) :: ng, tile
6038 integer,
intent(in) :: Mstr, Mend
6039# ifdef ASSUMED_SHAPE
6040 real(r8),
intent(out) :: tl_state(Mstr:)
6042 real(r8),
intent(out) :: tl_state(Mstr:Mend)
6047 character (len=*),
parameter :: MyFile = &
6048 & __FILE__//
", tl_pack"
6056 & lbi, ubi, lbj, ubj, &
6057 & imins, imaxs, jmins, jmaxs, &
6065 & mstr, mend, tl_state, &
6068 &
grid(ng) % IJwaterR, &
6069 &
grid(ng) % IJwaterU, &
6070 &
grid(ng) % IJwaterV, &
6071 &
grid(ng) % rmask, &
6072 &
grid(ng) % umask, &
6073 &
grid(ng) % vmask, &
6078 &
ocean(ng) % tl_t, &
6079 &
ocean(ng) % tl_u, &
6080 &
ocean(ng) % tl_v, &
6082 &
ocean(ng) % tl_ubar, &
6083 &
ocean(ng) % tl_vbar, &
6085 &
ocean(ng) % tl_zeta)
6105 & LBi, UBi, LBj, UBj, &
6106 & IminS, ImaxS, JminS, JmaxS, &
6107 & krhs, kstp, knew, &
6111 & Mstr, Mend, tl_state, &
6113 & IJwaterR, IJwaterU, IJwaterV, &
6114 & rmask, umask, vmask, &
6119 & tl_t, tl_u, tl_v, &
6121 & tl_ubar, tl_vbar, &
6133 integer,
intent(in) :: ng, tile
6134 integer,
intent(in) :: LBi, UBi, LBj, UBj
6135 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
6136 integer,
intent(in) :: Mstr, Mend
6137 integer,
intent(in) :: krhs, kstp, knew
6139 integer,
intent(in) :: nstp
6142# ifdef ASSUMED_SHAPE
6144 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
6145 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
6146 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
6148 real(r8),
intent(in) :: rmask(LBi:,LBj:)
6149 real(r8),
intent(in) :: umask(LBi:,LBj:)
6150 real(r8),
intent(in) :: vmask(LBi:,LBj:)
6152 real(r8),
intent(in) :: h(LBi:,LBj:)
6154 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
6156 real(r8),
intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
6157 real(r8),
intent(inout) :: tl_u(LBi:,LBj:,:,:)
6158 real(r8),
intent(inout) :: tl_v(LBi:,LBj:,:,:)
6160 real(r8),
intent(inout) :: tl_ubar(LBi:,LBj:,:)
6161 real(r8),
intent(inout) :: tl_vbar(LBi:,LBj:,:)
6163 real(r8),
intent(inout) :: tl_zeta(LBi:,LBj:,:)
6165 real(r8),
intent(out) :: tl_state(Mstr:)
6168 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
6169 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
6170 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
6172 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
6173 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
6174 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
6176 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
6178 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
6180 real(r8),
intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
6181 real(r8),
intent(inout) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
6182 real(r8),
intent(inout) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
6184 real(r8),
intent(inout) :: tl_ubar(LBi:UBi,LBj:UBj,:)
6185 real(r8),
intent(inout) :: tl_vbar(LBi:UBi,LBj:UBj,:)
6187 real(r8),
intent(inout) :: tl_zeta(LBi:UBi,LBj:UBj,:)
6189 real(r8),
intent(out) :: tl_state(Mstr:Mend)
6195 integer :: Imax, Ioff, Jmax, Joff
6197 integer :: Uoff, Voff
6198 integer :: i, iadd, is, itrc, j, k
6200 integer,
dimension(5+NT(ng)) :: offset
6202 real(r8),
parameter :: Aspv = 0.0_r8
6204 real(r8) :: cff, scale
6206# include "set_bounds.h"
6263 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
6266 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
6273 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
6276 iadd=
lm(ng)*
mm(ng)*n(ng)
6311# ifdef ENERGYNORM_SCALE
6312 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
6319 IF (rmask(i,j).gt.0.0_r8)
THEN
6320 is=ijwaterr(i,j)+offset(
isfsur)
6321 tl_state(is)=scale*tl_zeta(i,j,knew)
6324 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
6325 tl_state(is)=scale*tl_zeta(i,j,knew)
6344# ifdef ENERGYNORM_SCALE
6351# ifdef ENERGYNORM_SCALE
6352 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
6355 IF (umask(i,j).gt.0.0_r8)
THEN
6356 is=ijwateru(i,j)+offset(
isubar)
6357 tl_state(is)=scale*tl_ubar(i,j,knew)
6360 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
6361 tl_state(is)=scale*tl_ubar(i,j,knew)
6379# ifdef ENERGYNORM_SCALE
6386# ifdef ENERGYNORM_SCALE
6387 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
6390 IF (vmask(i,j).gt.0.0_r8)
THEN
6391 is=ijwaterv(i,j)+offset(
isvbar)
6392 tl_state(is)=scale*tl_vbar(i,j,knew)
6395 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
6396 tl_state(is)=scale*tl_vbar(i,j,knew)
6417# ifdef ENERGYNORM_SCALE
6426 iadd=(k-1)*imax*jmax+offset(
isuvel)
6431 IF (umask(i,j).gt.0.0_r8)
THEN
6432# ifdef ENERGYNORM_SCALE
6433 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
6435 is=ijwateru(i,j)+iadd
6436 tl_state(is)=scale*tl_u(i,j,k,nstp)
6439# ifdef ENERGYNORM_SCALE
6440 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
6442 is=(i-ioff)+(j-joff)*imax+iadd
6443 tl_state(is)=scale*tl_u(i,j,k,nstp)
6464# ifdef ENERGYNORM_SCALE
6473 iadd=(k-1)*imax*jmax+offset(
isvvel)
6478 IF (vmask(i,j).gt.0.0_r8)
THEN
6479# ifdef ENERGYNORM_SCALE
6480 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
6482 is=ijwaterv(i,j)+iadd
6483 tl_state(is)=scale*tl_v(i,j,k,nstp)
6486# ifdef ENERGYNORM_SCALE
6487 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
6489 is=(i+ioff)+(j-joff)*imax+iadd
6490 tl_state(is)=scale*tl_v(i,j,k,nstp)
6513# ifdef ENERGYNORM_SCALE
6514 IF (itrc.eq.
itemp)
THEN
6516 ELSE IF (itrc.eq.
isalt)
THEN
6528 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
6533 IF (rmask(i,j).gt.0.0_r8)
THEN
6534# ifdef ENERGYNORM_SCALE
6535 scale=1.0_r8/sqrt(cff*hz(i,j,k))
6537 is=ijwaterr(i,j)+iadd
6538 tl_state(is)=scale*tl_t(i,j,k,nstp,itrc)
6541# ifdef ENERGYNORM_SCALE
6542 scale=1.0_r8/sqrt(cff*hz(i,j,k))
6544 is=(i+ioff)+(j-joff)*imax+iadd
6545 tl_state(is)=scale*tl_t(i,j,k,nstp,itrc)
6557# if defined TANGENT && (defined STOCHASTIC_OPT || \
6558 defined hessian_sv )
6585 integer,
intent(in) :: ng, tile
6586 integer,
intent(in) :: Mstr, Mend
6587# ifdef ASSUMED_SHAPE
6588 real(r8),
intent(in) :: state(Mstr:)
6590 real(r8),
intent(in) :: state(Mstr:Mend)
6595 character (len=*),
parameter :: MyFile = &
6596 & __FILE__//
", tl_unpack"
6614 & lbi, ubi, lbj, ubj, &
6615 & imins, imaxs, jmins, jmaxs, &
6623 & mstr, mend, state, &
6626 &
grid(ng) % IJwaterR, &
6627 &
grid(ng) % IJwaterU, &
6628 &
grid(ng) % IJwaterV, &
6629 &
grid(ng) % rmask, &
6630 &
grid(ng) % umask, &
6631 &
grid(ng) % vmask, &
6636 &
ocean(ng) % tl_t, &
6637 &
ocean(ng) % tl_u, &
6638 &
ocean(ng) % tl_v, &
6640 &
ocean(ng) % tl_ubar, &
6641 &
ocean(ng) % tl_vbar, &
6643 &
ocean(ng) % tl_zeta, &
6645 &
forces(ng) % tl_stflx, &
6647 &
forces(ng) % tl_sustr, &
6659 & LBi, UBi, LBj, UBj, &
6660 & IminS, ImaxS, JminS, JmaxS, &
6665 & Mstr, Mend, state, &
6667 & IJwaterR, IJwaterU, IJwaterV, &
6668 & rmask, umask, vmask, &
6673 & tl_t, tl_u, tl_v, &
6675 & tl_ubar, tl_vbar, &
6681 & tl_sustr, tl_svstr)
6693 integer,
intent(in) :: ng, tile
6694 integer,
intent(in) :: LBi, UBi, LBj, UBj
6695 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
6696 integer,
intent(in) :: Mstr, Mend
6697 integer,
intent(in) :: kstp
6699 integer,
intent(in) :: nstp
6702# ifdef ASSUMED_SHAPE
6704 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
6705 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
6706 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
6708 real(r8),
intent(in) :: rmask(LBi:,LBj:)
6709 real(r8),
intent(in) :: umask(LBi:,LBj:)
6710 real(r8),
intent(in) :: vmask(LBi:,LBj:)
6712 real(r8),
intent(in) :: state(Mstr:)
6713 real(r8),
intent(in) :: h(LBi:,LBj:)
6715 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
6717 real(r8),
intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
6718 real(r8),
intent(inout) :: tl_u(LBi:,LBj:,:,:)
6719 real(r8),
intent(inout) :: tl_v(LBi:,LBj:,:,:)
6720 real(r8),
intent(inout) :: tl_stflx(LBi:,LBj:,:)
6722 real(r8),
intent(inout) :: tl_ubar(LBi:,LBj:,:)
6723 real(r8),
intent(inout) :: tl_vbar(LBi:,LBj:,:)
6725 real(r8),
intent(inout) :: tl_zeta(LBi:,LBj:,:)
6726 real(r8),
intent(inout) :: tl_sustr(LBi:,LBj:)
6727 real(r8),
intent(inout) :: tl_svstr(LBi:,LBj:)
6730 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
6731 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
6732 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
6734 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
6735 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
6736 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
6738 real(r8),
intent(in) :: state(Mstr:Mend)
6739 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
6741 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
6743 real(r8),
intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
6744 real(r8),
intent(inout) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
6745 real(r8),
intent(inout) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
6746 real(r8),
intent(inout) :: tl_stflx(LBi:UBi,LBj:UBj,NT(ng))
6748 real(r8),
intent(inout) :: tl_ubar(LBi:UBi,LBj:UBj,:)
6749 real(r8),
intent(inout) :: tl_vbar(LBi:UBi,LBj:UBj,:)
6751 real(r8),
intent(inout) :: tl_zeta(LBi:UBi,LBj:UBj,:)
6752 real(r8),
intent(inout) :: tl_sustr(LBi:UBi,LBj:UBj)
6753 real(r8),
intent(inout) :: tl_svstr(LBi:UBi,LBj:UBj)
6759 integer :: Imax, Ioff, Jmax, Joff
6761 integer :: Uoff, Voff
6762 integer :: i, iadd, icount, is, itrc, j, k
6765 integer,
dimension(7+2*NT(ng)) :: offset
6767 integer,
dimension(7+2*(NT(ng)+1)) :: offset
6770 real(r8) :: cff, scale
6772# include "set_bounds.h"
6849 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
6853 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
6866 & (
lm(ng)+2)*(
mm(ng)+1)
6869 & (
lm(ng)+2)*(
mm(ng)+2)
6883 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
6887 iadd=
lm(ng)*
mm(ng)*n(ng)
6975# ifdef ENERGYNORM_SCALE
6976 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
6983 IF (rmask(i,j).gt.0.0_r8)
THEN
6984 is=ijwaterr(i,j)+offset(
isfsur)
6985 tl_zeta(i,j,kstp)=scale*state(is)
6987 tl_zeta(i,j,kstp)=0.0_r8
6990 is=(i-ioff)+(j-joff)*imax+offset(
isfsur)
6991 tl_zeta(i,j,kstp)=scale*state(is)
7013# ifdef ENERGYNORM_SCALE
7020# ifdef ENERGYNORM_SCALE
7021 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
7024 IF (umask(i,j).gt.0.0_r8)
THEN
7025 is=ijwateru(i,j)+offset(
isubar)
7026 tl_ubar(i,j,kstp)=scale*state(is)
7028 tl_ubar(i,j,kstp)=0.0_r8
7031 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
7032 tl_ubar(i,j,kstp)=scale*state(is)
7052# ifdef ENERGYNORM_SCALE
7059# ifdef ENERGYNORM_SCALE
7060 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
7063 IF (vmask(i,j).gt.0.0_r8)
THEN
7064 is=ijwaterv(i,j)+offset(
isvbar)
7065 tl_vbar(i,j,kstp)=scale*state(is)
7067 tl_vbar(i,j,kstp)=0.0_r8
7070 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
7071 tl_vbar(i,j,kstp)=scale*state(is)
7095# ifdef ENERGYNORM_SCALE
7104 iadd=(k-1)*imax*jmax+offset(
isuvel)
7109 IF (umask(i,j).gt.0.0_r8)
THEN
7110# ifdef ENERGYNORM_SCALE
7111 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
7113 is=ijwateru(i,j)+iadd
7114 tl_u(i,j,k,nstp)=scale*state(is)
7116 tl_u(i,j,k,nstp)=0.0_r8
7119# ifdef ENERGYNORM_SCALE
7120 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
7122 is=(i-ioff)+(j-joff)*imax+iadd
7123 tl_u(i,j,k,nstp)=scale*state(is)
7146# ifdef ENERGYNORM_SCALE
7155 iadd=(k-1)*imax*jmax+offset(
isvvel)
7160 IF (vmask(i,j).gt.0.0_r8)
THEN
7161# ifdef ENERGYNORM_SCALE
7162 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
7164 is=ijwaterv(i,j)+iadd
7165 tl_v(i,j,k,nstp)=scale*state(is)
7167 tl_v(i,j,k,nstp)=0.0_r8
7170# ifdef ENERGYNORM_SCALE
7171 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
7173 is=(i+ioff)+(j-joff)*imax+iadd
7174 tl_v(i,j,k,nstp)=scale*state(is)
7198# ifdef ENERGYNORM_SCALE
7199 IF (itrc.eq.
itemp)
THEN
7201 ELSE IF (itrc.eq.
isalt)
THEN
7213 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
7218 IF (rmask(i,j).gt.0.0_r8)
THEN
7219# ifdef ENERGYNORM_SCALE
7220 scale=1.0_r8/sqrt(cff*hz(i,j,k))
7222 is=ijwaterr(i,j)+iadd
7223 tl_t(i,j,k,nstp,itrc)=scale*state(is)
7225 tl_t(i,j,k,nstp,itrc)=0.0_r8
7228# ifdef ENERGYNORM_SCALE
7229 scale=1.0_r8/sqrt(cff*hz(i,j,k))
7231 is=(i+ioff)+(j-joff)*imax+iadd
7232 tl_t(i,j,k,nstp,itrc)=scale*state(is)
7259 IF (umask(i,j).gt.0.0_r8)
THEN
7260 is=ijwateru(i,j)+offset(
isustr)
7261 tl_sustr(i,j)=scale*state(is)
7263 tl_sustr(i,j)=0.0_r8
7266 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
7267 tl_sustr(i,j)=scale*state(is)
7291 IF (vmask(i,j).gt.0.0_r8)
THEN
7292 is=ijwaterv(i,j)+offset(
isvstr)
7293 tl_svstr(i,j)=scale*state(is)
7295 tl_svstr(i,j)=0.0_r8
7298 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
7299 tl_svstr(i,j)=scale*state(is)
7328 IF (rmask(i,j).gt.0.0_r8)
THEN
7329 is=ijwaterr(i,j)+offset(
istsur(itrc))
7330 tl_stflx(i,j,itrc)=scale*state(is)
7332 tl_stflx(i,j,itrc)=0.0_r8
7335 is=(i+ioff)+(j-joff)*imax+offset(
istsur(itrc))
7336 tl_stflx(i,j,itrc)=scale*state(is)
7347# elif defined TANGENT && defined FORCING_SV
7349 SUBROUTINE tl_unpack (ng, tile, Mstr, Mend, state)
7374 integer,
intent(in) :: ng, tile
7375 integer,
intent(in) :: Mstr, Mend
7376# ifdef ASSUMED_SHAPE
7377 real(r8),
intent(in) :: state(Mstr:)
7379 real(r8),
intent(in) :: state(Mstr:Mend)
7384 character (len=*),
parameter :: MyFile = &
7385 & __FILE__//
", tl_unpack"
7403 & lbi, ubi, lbj, ubj, &
7404 & imins, imaxs, jmins, jmaxs, &
7412 & mstr, mend, state, &
7415 &
grid(ng) % IJwaterR, &
7416 &
grid(ng) % IJwaterU, &
7417 &
grid(ng) % IJwaterV, &
7418 &
grid(ng) % rmask, &
7419 &
grid(ng) % umask, &
7420 &
grid(ng) % vmask, &
7425 &
ocean(ng) % f_t, &
7426 &
ocean(ng) % f_u, &
7427 &
ocean(ng) % f_v, &
7429 &
ocean(ng) % f_ubar, &
7430 &
ocean(ng) % f_vbar, &
7431 &
ocean(ng) % f_zeta, &
7433 &
forces(ng) % tl_stflx, &
7435 &
forces(ng) % tl_sustr, &
7447 & LBi, UBi, LBj, UBj, &
7448 & IminS, ImaxS, JminS, JmaxS, &
7453 & Mstr, Mend, state, &
7455 & IJwaterR, IJwaterU, IJwaterV, &
7456 & rmask, umask, vmask, &
7468 & tl_sustr, tl_svstr)
7493 integer,
intent(in) :: ng, tile
7494 integer,
intent(in) :: LBi, UBi, LBj, UBj
7495 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
7496 integer,
intent(in) :: Mstr, Mend
7497 integer,
intent(in) :: kstp
7499 integer,
intent(in) :: nstp
7502# ifdef ASSUMED_SHAPE
7504 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
7505 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
7506 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
7508 real(r8),
intent(in) :: rmask(LBi:,LBj:)
7509 real(r8),
intent(in) :: umask(LBi:,LBj:)
7510 real(r8),
intent(in) :: vmask(LBi:,LBj:)
7512 real(r8),
intent(in) :: state(Mstr:)
7513 real(r8),
intent(in) :: h(LBi:,LBj:)
7515 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
7517 real(r8),
intent(inout) :: f_t(LBi:,LBj:,:,:)
7518 real(r8),
intent(inout) :: f_u(LBi:,LBj:,:)
7519 real(r8),
intent(inout) :: f_v(LBi:,LBj:,:)
7520 real(r8),
intent(inout) :: tl_stflx(LBi:,LBj:,:)
7522 real(r8),
intent(inout) :: f_ubar(LBi:,LBj:)
7523 real(r8),
intent(inout) :: f_vbar(LBi:,LBj:)
7524 real(r8),
intent(inout) :: f_zeta(LBi:,LBj:)
7525 real(r8),
intent(inout) :: tl_sustr(LBi:,LBj:)
7526 real(r8),
intent(inout) :: tl_svstr(LBi:,LBj:)
7529 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
7530 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
7531 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
7533 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
7534 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
7535 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
7537 real(r8),
intent(in) :: state(Mstr:Mend)
7538 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
7540 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
7542 real(r8),
intent(inout) :: f_t(LBi:UBi,LBj:UBj,N(ng),NT(ng))
7543 real(r8),
intent(inout) :: f_u(LBi:UBi,LBj:UBj,N(ng))
7544 real(r8),
intent(inout) :: f_v(LBi:UBi,LBj:UBj,N(ng))
7545 real(r8),
intent(inout) :: tl_stflx(LBi:UBi,LBj:UBj,NT(ng))
7547 real(r8),
intent(inout) :: f_ubar(LBi:UBi,LBj:UBj)
7548 real(r8),
intent(inout) :: f_vbar(LBi:UBi,LBj:UBj)
7549 real(r8),
intent(inout) :: f_zeta(LBi:UBi,LBj:UBj)
7550 real(r8),
intent(inout) :: tl_sustr(LBi:UBi,LBj:UBj)
7551 real(r8),
intent(inout) :: tl_svstr(LBi:UBi,LBj:UBj)
7557 integer :: Imax, Ioff, Jmax, Joff
7559 integer :: Uoff, Voff
7560 integer :: i, iadd, icount, is, itrc, j, k
7563 integer,
dimension(7+2*NT(ng)) :: offset
7565 integer,
dimension(7+2*(NT(ng)+1)) :: offset
7568 real(r8) :: cff, scale
7571 real(r8) :: cff1, cff2
7572 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: CF
7573 real(r8),
dimension(IminS:ImaxS,0:N(ng)) :: DC
7576# include "set_bounds.h"
7653 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
7657 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
7670 & (
lm(ng)+2)*(
mm(ng)+1)
7673 & (
lm(ng)+2)*(
mm(ng)+2)
7687 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
7691 iadd=
lm(ng)*
mm(ng)*n(ng)
7779# ifdef ENERGYNORM_SCALE
7780 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
7787 IF (rmask(i,j).gt.0.0_r8)
THEN
7788 is=ijwaterr(i,j)+offset(
isfsur)
7789 f_zeta(i,j)=scale*state(is)
7794 is=(i-ioff)+(j-joff)*imax+offset(
isfsur)
7795 f_zeta(i,j)=scale*state(is)
7817# ifdef ENERGYNORM_SCALE
7824# ifdef ENERGYNORM_SCALE
7825 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
7828 IF (umask(i,j).gt.0.0_r8)
THEN
7829 is=ijwateru(i,j)+offset(
isubar)
7830 f_ubar(i,j)=scale*state(is)
7835 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
7836 f_ubar(i,j)=scale*state(is)
7856# ifdef ENERGYNORM_SCALE
7863# ifdef ENERGYNORM_SCALE
7864 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
7867 IF (vmask(i,j).gt.0.0_r8)
THEN
7868 is=ijwaterv(i,j)+offset(
isvbar)
7869 f_vbar(i,j)=scale*state(is)
7874 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
7875 f_vbar(i,j)=scale*state(is)
7899# ifdef ENERGYNORM_SCALE
7908 iadd=(k-1)*imax*jmax+offset(
isuvel)
7912# ifdef ENERGYNORM_SCALE
7913 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
7916 IF (umask(i,j).gt.0.0_r8)
THEN
7917 is=ijwateru(i,j)+iadd
7918 f_u(i,j,k)=scale*state(is)
7923 is=(i-ioff)+(j-joff)*imax+iadd
7924 f_u(i,j,k)=scale*state(is)
7939 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i-1,j,k))
7940 dc(i,0)=dc(i,0)+dc(i,k)
7941 cf(i,0)=cf(i,0)+dc(i,k)*f_u(i,j,k)
7948 cff2=cff2*umask(i,j)
7971# ifdef ENERGYNORM_SCALE
7980 iadd=(k-1)*imax*jmax+offset(
isvvel)
7984# ifdef ENERGYNORM_SCALE
7985 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
7988 IF (vmask(i,j).gt.0.0_r8)
THEN
7989 is=ijwaterv(i,j)+iadd
7990 f_v(i,j,k)=scale*state(is)
7995 is=(i+ioff)+(j-joff)*imax+iadd
7996 f_v(i,j,k)=scale*state(is)
8005 IF (j.ge.jstrm)
THEN
8012 dc(i,k)=0.5_r8*(hz(i,j,k)+hz(i,j-1,k))
8013 dc(i,0)=dc(i,0)+dc(i,k)
8014 cf(i,0)=cf(i,0)+dc(i,k)*f_v(i,j,k)
8021 cff2=cff2*vmask(i,j)
8046# ifdef ENERGYNORM_SCALE
8047 IF (itrc.eq.
itemp)
THEN
8049 ELSE IF (itrc.eq.
isalt)
THEN
8061 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
8065# ifdef ENERGYNORM_SCALE
8066 scale=1.0_r8/sqrt(cff*hz(i,j,k))
8069 IF (rmask(i,j).gt.0.0_r8)
THEN
8070 is=ijwaterr(i,j)+iadd
8071 f_t(i,j,k,itrc)=scale*state(is)
8073 f_t(i,j,k,itrc)=0.0_r8
8076 is=(i+ioff)+(j-joff)*imax+iadd
8077 f_t(i,j,k,itrc)=scale*state(is)
8092 & lbi, ubi, lbj, ubj, f_zeta)
8095 & lbi, ubi, lbj, ubj, f_ubar)
8097 & lbi, ubi, lbj, ubj, f_vbar)
8100 & lbi, ubi, lbj, ubj, 1, n(ng), f_u)
8102 & lbi, ubi, lbj, ubj, 1, n(ng), f_v)
8105 & lbi, ubi, lbj, ubj, 1, n(ng), &
8113 & lbi, ubi, lbj, ubj, &
8119 & lbi, ubi, lbj, ubj, &
8125 & lbi, ubi, lbj, ubj, 1, n(ng), &
8129 & lbi, ubi, lbj, ubj, 1, n(ng), 1, nt(ng), &
8154 IF (umask(i,j).gt.0.0_r8)
THEN
8155 is=ijwateru(i,j)+offset(
isustr)
8156 tl_sustr(i,j)=scale*state(is)
8158 tl_sustr(i,j)=0.0_r8
8161 is=(i-ioff)+(j-joff)*imax+offset(
isustr)
8162 tl_sustr(i,j)=scale*state(is)
8186 IF (vmask(i,j).gt.0.0_r8)
THEN
8187 is=ijwaterv(i,j)+offset(
isvstr)
8188 tl_svstr(i,j)=scale*state(is)
8190 tl_svstr(i,j)=0.0_r8
8193 is=(i+ioff)+(j-joff)*imax+offset(
isvstr)
8194 tl_svstr(i,j)=scale*state(is)
8223 IF (rmask(i,j).gt.0.0_r8)
THEN
8224 is=ijwaterr(i,j)+offset(
istsur(itrc))
8225 tl_stflx(i,j,itrc)=scale*state(is)
8227 tl_stflx(i,j,itrc)=0.0_r8
8230 is=(i+ioff)+(j-joff)*imax+offset(
istsur(itrc))
8231 tl_stflx(i,j,itrc)=scale*state(is)
8242# elif defined TANGENT
8244 SUBROUTINE tl_unpack (ng, tile, Mstr, Mend, state)
8268 integer,
intent(in) :: ng, tile
8269 integer,
intent(in) :: Mstr, Mend
8270# ifdef ASSUMED_SHAPE
8271 real(r8),
intent(in) :: state(Mstr:)
8273 real(r8),
intent(in) :: state(Mstr:Mend)
8278 character (len=*),
parameter :: MyFile = &
8279 & __FILE__//
", tl_unpack"
8297 & lbi, ubi, lbj, ubj, &
8298 & imins, imaxs, jmins, jmaxs, &
8306 & mstr, mend, state, &
8309 &
grid(ng) % IJwaterR, &
8310 &
grid(ng) % IJwaterU, &
8311 &
grid(ng) % IJwaterV, &
8312 &
grid(ng) % rmask, &
8313 &
grid(ng) % umask, &
8314 &
grid(ng) % vmask, &
8319 &
ocean(ng) % tl_t, &
8320 &
ocean(ng) % tl_u, &
8321 &
ocean(ng) % tl_v, &
8323 &
ocean(ng) % tl_ubar, &
8324 &
ocean(ng) % tl_vbar, &
8326 &
ocean(ng) % tl_zeta)
8336 & LBi, UBi, LBj, UBj, &
8337 & IminS, ImaxS, JminS, JmaxS, &
8342 & Mstr, Mend, state, &
8344 & IJwaterR, IJwaterU, IJwaterV, &
8345 & rmask, umask, vmask, &
8350 & tl_t, tl_u, tl_v, &
8352 & tl_ubar, tl_vbar, &
8364 integer,
intent(in) :: ng, tile
8365 integer,
intent(in) :: LBi, UBi, LBj, UBj
8366 integer,
intent(in) :: IminS, ImaxS, JminS, JmaxS
8367 integer,
intent(in) :: Mstr, Mend
8368 integer,
intent(in) :: kstp
8370 integer,
intent(in) :: nstp
8373# ifdef ASSUMED_SHAPE
8375 integer,
intent(in) :: IJwaterR(LBi:,LBj:)
8376 integer,
intent(in) :: IJwaterU(LBi:,LBj:)
8377 integer,
intent(in) :: IJwaterV(LBi:,LBj:)
8379 real(r8),
intent(in) :: rmask(LBi:,LBj:)
8380 real(r8),
intent(in) :: umask(LBi:,LBj:)
8381 real(r8),
intent(in) :: vmask(LBi:,LBj:)
8383 real(r8),
intent(in) :: state(Mstr:)
8384 real(r8),
intent(in) :: h(LBi:,LBj:)
8386 real(r8),
intent(in) :: Hz(LBi:,LBj:,:)
8388 real(r8),
intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
8389 real(r8),
intent(inout) :: tl_u(LBi:,LBj:,:,:)
8390 real(r8),
intent(inout) :: tl_v(LBi:,LBj:,:,:)
8392 real(r8),
intent(inout) :: tl_ubar(LBi:,LBj:,:)
8393 real(r8),
intent(inout) :: tl_vbar(LBi:,LBj:,:)
8395 real(r8),
intent(inout) :: tl_zeta(LBi:,LBj:,:)
8398 integer,
intent(in) :: IJwaterR(LBi:UBi,LBj:UBj)
8399 integer,
intent(in) :: IJwaterU(LBi:UBi,LBj:UBj)
8400 integer,
intent(in) :: IJwaterV(LBi:UBi,LBj:UBj)
8402 real(r8),
intent(in) :: rmask(LBi:UBi,LBj:UBj)
8403 real(r8),
intent(in) :: umask(LBi:UBi,LBj:UBj)
8404 real(r8),
intent(in) :: vmask(LBi:UBi,LBj:UBj)
8406 real(r8),
intent(in) :: state(Mstr:Mend)
8407 real(r8),
intent(in) :: h(LBi:UBi,LBj:UBj)
8409 real(r8),
intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
8411 real(r8),
intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
8412 real(r8),
intent(inout) :: tl_u(LBi:UBi,LBj:UBj,N(ng),2)
8413 real(r8),
intent(inout) :: tl_v(LBi:UBi,LBj:UBj,N(ng),2)
8415 real(r8),
intent(inout) :: tl_ubar(LBi:UBi,LBj:UBj,:)
8416 real(r8),
intent(inout) :: tl_vbar(LBi:UBi,LBj:UBj,:)
8418 real(r8),
intent(inout) :: tl_zeta(LBi:UBi,LBj:UBj,:)
8424 integer :: Imax, Ioff, Jmax, Joff
8426 integer :: Uoff, Voff
8427 integer :: i, iadd, is, itrc, j, k
8429 integer,
dimension(5+NT(ng)) :: offset
8431 real(r8) :: cff, scale
8433# include "set_bounds.h"
8477 iadd=(
lm(ng)+2)*(
mm(ng)+1)*n(ng)
8480 iadd=(
lm(ng)+2)*(
mm(ng)+2)*n(ng)
8486 iadd=
lm(ng)*(
mm(ng)-voff)*n(ng)
8489 iadd=
lm(ng)*
mm(ng)*n(ng)
8524# ifdef ENERGYNORM_SCALE
8525 scale=1.0_r8/sqrt(0.5_r8*
g*
rho0)
8532 IF (rmask(i,j).gt.0.0_r8)
THEN
8533 is=ijwaterr(i,j)+offset(
isfsur)
8534 tl_zeta(i,j,kstp)=scale*state(is)
8536 tl_zeta(i,j,kstp)=0.0_r8
8539 is=(i+ioff)+(j-joff)*imax+offset(
isfsur)
8540 tl_zeta(i,j,kstp)=scale*state(is)
8560# ifdef ENERGYNORM_SCALE
8567# ifdef ENERGYNORM_SCALE
8568 scale=1.0_r8/sqrt(cff*(h(i-1,j)+h(i,j)))
8571 IF (umask(i,j).gt.0.0_r8)
THEN
8572 is=ijwateru(i,j)+offset(
isubar)
8573 tl_ubar(i,j,kstp)=scale*state(is)
8575 tl_ubar(i,j,kstp)=0.0_r8
8578 is=(i-ioff)+(j-joff)*imax+offset(
isubar)
8579 tl_ubar(i,j,kstp)=scale*state(is)
8597# ifdef ENERGYNORM_SCALE
8604# ifdef ENERGYNORM_SCALE
8605 scale=1.0_r8/sqrt(cff*(h(i,j-1)+h(i,j)))
8608 IF (vmask(i,j).gt.0.0_r8)
THEN
8609 is=ijwaterv(i,j)+offset(
isvbar)
8610 tl_vbar(i,j,kstp)=scale*state(is)
8612 tl_vbar(i,j,kstp)=0.0_r8
8615 is=(i+ioff)+(j-joff)*imax+offset(
isvbar)
8616 tl_vbar(i,j,kstp)=scale*state(is)
8638# ifdef ENERGYNORM_SCALE
8647 iadd=(k-1)*imax*jmax+offset(
isuvel)
8652 IF (umask(i,j).gt.0.0_r8)
THEN
8653# ifdef ENERGYNORM_SCALE
8654 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
8656 is=ijwateru(i,j)+iadd
8657 tl_u(i,j,k,nstp)=scale*state(is)
8659 tl_u(i,j,k,nstp)=0.0_r8
8662# ifdef ENERGYNORM_SCALE
8663 scale=1.0_r8/sqrt(cff*(hz(i-1,j,k)+hz(i,j,k)))
8665 is=(i-ioff)+(j-joff)*imax+iadd
8666 tl_u(i,j,k,nstp)=scale*state(is)
8687# ifdef ENERGYNORM_SCALE
8696 iadd=(k-1)*imax*jmax+offset(
isvvel)
8701 IF (vmask(i,j).gt.0.0_r8)
THEN
8702# ifdef ENERGYNORM_SCALE
8703 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
8705 is=ijwaterv(i,j)+iadd
8706 tl_v(i,j,k,nstp)=scale*state(is)
8708 tl_v(i,j,k,nstp)=0.0_r8
8711# ifdef ENERGYNORM_SCALE
8712 scale=1.0_r8/sqrt(cff*(hz(i,j-1,k)+hz(i,j,k)))
8714 is=(i+ioff)+(j-joff)*imax+iadd
8715 tl_v(i,j,k,nstp)=scale*state(is)
8738# ifdef ENERGYNORM_SCALE
8739 IF (itrc.eq.
itemp)
THEN
8741 ELSE IF (itrc.eq.
isalt)
THEN
8753 iadd=(k-1)*imax*jmax+offset(
istvar(itrc))
8758 IF (rmask(i,j).gt.0.0_r8)
THEN
8759# ifdef ENERGYNORM_SCALE
8760 scale=1.0_r8/sqrt(cff*hz(i,j,k))
8762 is=ijwaterr(i,j)+iadd
8763 tl_t(i,j,k,nstp,itrc)=scale*state(is)
8765 tl_t(i,j,k,nstp,itrc)=0.0_r8
8768# ifdef ENERGYNORM_SCALE
8769 scale=1.0_r8/sqrt(cff*hz(i,j,k))
8771 is=(i+ioff)+(j-joff)*imax+iadd
8772 tl_t(i,j,k,nstp,itrc)=scale*state(is)
8785# ifdef SO_SEMI_WHITE
8807 integer,
intent(in) :: ng, tile
8808 integer,
intent(in) :: Mstr, Mend
8809# ifdef ASSUMED_SHAPE
8810 real(r8),
intent(in) :: state(Mstr:)
8811 real(r8),
intent(out) :: ad_state(Mstr:)
8813 real(r8),
intent(in) :: state(Mstr:Mend)
8814 real(r8),
intent(out) :: ad_state(Mstr:Mend)
8819 integer :: NSUB, is, rec
8821 real(r8) :: SOnorm, my_SOnorm, my_TRnorm
8822 real(r8) :: SOnorm1, my_SOnorm1
8823 real(r8) :: cff, cff1, cff2
8826 real(r8),
dimension(3) :: rbuffer
8828 character (len=3),
dimension(3) :: op_handle
8846 WRITE (stdout,
'(/)')
8854 cff=real((
nadj(ng)-1)*(2*
nadj(ng)-1),r8)/real(6*
nadj(ng),r8)
8856 cff2=0.5_r8*real((
nadj(ng)-1))-cff
8861 my_sonorm=my_sonorm+ &
8862 &
storage(ng)%so_state(is,rec)*state(is)
8865 IF (rec.ne.
nsemi(ng))
THEN
8867 my_sonorm1=my_sonorm1+ &
8868 &
storage(ng)%so_state(is,rec+1)*state(is)
8869 my_trnorm=my_trnorm+ &
8870 & cff1*
storage(ng)%so_state(is,rec)* &
8871 &
storage(ng)%so_state(is,rec)+ &
8872 & 2.0_r8*cff2*
storage(ng)%so_state(is,rec )* &
8873 &
storage(ng)%so_state(is,rec+1)+ &
8874 & cff*
storage(ng)%so_state(is,rec+1)* &
8875 &
storage(ng)%so_state(is,rec+1)
8879 my_trnorm=my_trnorm+ &
8880 &
storage(ng)%so_state(is,rec)* &
8881 &
storage(ng)%so_state(is,rec)
8890 IF (
domain(ng)%SouthWest_Corner(tile).and. &
8891 &
domain(ng)%NorthEast_Corner(tile))
THEN
8905 sonorm=sonorm+my_sonorm
8906 sonorm1=sonorm1+my_sonorm1
8925 WRITE (stdout,10) rec, sonorm, sonorm1
8926 10
FORMAT (3x,
'Rec = ',i2.2,2x,
'SOnorm = ',1p,e15.8,0p, &
8927 & 2x,
'SOnorm1 = ',1p,e15.8)
8932 IF (rec.ne.
nsemi(ng))
THEN
8934 ad_state(is)=ad_state(is)+ &
8935 & cff1*sonorm *
storage(ng)%so_state(is,rec )+ &
8936 & cff2*sonorm1*
storage(ng)%so_state(is,rec )+ &
8937 & cff2*sonorm *
storage(ng)%so_state(is,rec+1)+ &
8938 & cff *sonorm1*
storage(ng)%so_state(is,rec+1)
8942 ad_state(is)=ad_state(is)+ &
8943 & sonorm*
storage(ng)%so_state(is,rec)
8953 IF (
domain(ng)%SouthWest_Corner(tile).and. &
8954 &
domain(ng)%NorthEast_Corner(tile))
THEN
9001 integer,
intent(in) :: ng, tile
9002 integer,
intent(in) :: Mstr, Mend
9003# ifdef ASSUMED_SHAPE
9004 real(r8),
intent(in) :: state(Mstr:)
9005 real(r8),
intent(out) :: ad_state(Mstr:)
9007 real(r8),
intent(in) :: state(Mstr:Mend)
9008 real(r8),
intent(out) :: ad_state(Mstr:Mend)
9013 integer :: NSUB, is, ntAD, ntTL, rec, rec1
9015 real(r8) :: SOnorm, my_TRnorm
9017 real(r8),
dimension(Nsemi(ng)) :: Bcoef
9018 real(r8),
dimension(Nsemi(ng)) :: SOdotprod
9019 real(r8),
dimension(Nsemi(ng)) :: my_dotprod
9022 character (len=3),
dimension(Nsemi(ng)) :: op_handle
9040 my_dotprod(rec)=0.0_r8
9042 my_dotprod(rec)=my_dotprod(rec)+ &
9043 &
storage(ng)%so_state(is,rec)*state(is)
9052 IF (
domain(ng)%SouthWest_Corner(tile).and. &
9053 &
domain(ng)%NorthEast_Corner(tile))
THEN
9062 sodotprod(rec)=0.0_r8
9066 sodotprod(rec)=sodotprod(rec)+my_dotprod(rec)
9073 op_handle(rec)=
'SUM'
9089 ntad=(rec-1)*
nadj(ng)+1
9092 nttl=(rec1-1)*
nadj(ng)+1
9093 CALL sp_bcoef (ng, ntad, nttl, bcoef(rec1))
9094 sonorm=sonorm+bcoef(rec1)*sodotprod(rec1)
9096 my_trnorm=my_trnorm+ &
9097 &
storage(ng)%so_state(is,rec )*bcoef(rec1)* &
9098 &
storage(ng)%so_state(is,rec1)
9105 WRITE (
stdout,10) rec, sodotprod(rec), bcoef(rec), sonorm
9106 10
FORMAT (1x,
'Rec = ',i2.2,1x,
'SOdotprod = ',1p,e13.6,0p, &
9107 & 1x,
'Bcoef = ',1p,e13.6,0p,1x,
'SOnorm = ',1p,e13.6)
9113 ad_state(is)=ad_state(is)+ &
9114 & sonorm*
storage(ng)%so_state(is,rec)
9123 IF (
domain(ng)%SouthWest_Corner(tile).and. &
9124 &
domain(ng)%NorthEast_Corner(tile))
THEN
9150# if defined SO_SEMI || !defined STOCH_OPT_WHITE
9169 integer,
intent(in) :: ng, ntAD, ntTL
9171 real(r8),
intent(out):: Bcoef
9175 integer :: i, it1, it2
9177 real(r8) :: Acoef, Acoef1, Acoef2, df1, rov
9189 rov=1.0_r8/real(
nadj(ng),r8)
9191 IF ((ntad.gt.1).and.(ntad.lt.
ntimes(ng)+1))
THEN
9194 CALL sp_acoef (ng, it1, nttl, acoef)
9197 CALL sp_acoef (ng, it1+i, nttl, acoef1)
9198 CALL sp_acoef (ng, it2+i, nttl, acoef2)
9200 bcoef=bcoef+(1.0_r8-df1)*acoef1+df1*acoef2
9202 ELSE IF (ntad.eq.1)
THEN
9206 CALL sp_acoef (ng, 1+i, nttl, acoef1)
9208 bcoef=bcoef+(1.0_r8-df1)*acoef1
9210 ELSE IF (ntad.eq.
ntimes(ng)+1)
THEN
9216 bcoef=bcoef+df1*acoef1
9239 integer,
intent(in) :: ng, ntAD, ntTL
9241 real(r8),
intent(out):: Acoef
9245 integer :: i, idf1, idf2, idf4
9247 real(r8) :: df3, rov
9258 rov=1.0_r8/real(
nadj(ng),r8)
9259 IF ((nttl.gt.1).and.(nttl.lt.
ntimes(ng)+1))
THEN
9262 idf1=iabs(ntad-nttl-i)+1
9263 idf2=iabs(ntad-(nttl-
nadj(ng))-i)+1
9265 acoef=acoef+
sp_autoc(ng,idf1)*(1.0_r8-df3)+ &
9268 idf4=iabs(ntad-nttl)+1
9270 ELSE IF (nttl.eq.1)
THEN
9273 idf1=iabs(ntad-1-i)+1
9275 acoef=acoef+
sp_autoc(ng,idf1)*(1.0_r8-df3)
9279 ELSE IF (nttl.eq.
ntimes(ng)+1)
THEN
9286 idf4=iabs(ntad-
ntimes(ng)-1)+1
9308 integer,
intent(in) :: ng, idf
9340 END MODULE packing_mod
subroutine ad_exchange_u2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_v2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_v3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)
subroutine ad_exchange_r3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)
subroutine ad_exchange_u3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, ad_a)
subroutine mp_gather_state(ng, model, mstr, mend, asize, a, awrk)
subroutine mp_scatter_state(ng, model, mstr, mend, asize, a, awrk)
subroutine exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_u2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_v2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
subroutine exchange_u3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
subroutine exchange_r3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
subroutine exchange_v3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
type(t_forces), dimension(:), allocatable forces
type(t_grid), dimension(:), allocatable grid
type(t_io), dimension(:), allocatable adm
integer, parameter io_nf90
integer, parameter io_pio
integer, dimension(:), allocatable nwaterv
integer, dimension(:), allocatable idtsur
integer, dimension(:), allocatable nwateru
integer, dimension(:), allocatable istvar
character(len=maxlen), dimension(6, 0:nv) vname
integer, dimension(:), allocatable istsur
integer, dimension(:), allocatable nwaterr
type(t_ocean), dimension(:), allocatable ocean
integer, dimension(:), allocatable n
integer, dimension(:), allocatable mstate
integer, dimension(:), allocatable ntilex
integer, parameter r3dvar
integer, parameter u3dvar
type(t_domain), dimension(:), allocatable domain
integer, dimension(:), allocatable lm
integer, parameter u2dvar
integer, dimension(:), allocatable nsemi
integer, dimension(:), allocatable ntilee
integer, dimension(:), allocatable nt
integer, dimension(:), allocatable mm
integer, parameter r2dvar
integer, parameter v2dvar
integer, parameter v3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_r3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_u3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_u2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_u3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_r2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_u2dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_v2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_v3dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_r3dvar
type(io_desc_t), dimension(:), pointer iodesc_dp_r2dvar
type(io_desc_t), dimension(:), pointer iodesc_sp_v2dvar
integer, dimension(:), allocatable ntimes
real(dp), dimension(:), allocatable dt
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(r8), dimension(:), allocatable tcoef
type(t_scalars), dimension(:), allocatable scalars
real(r8), dimension(:), allocatable trnorm
integer, dimension(:), allocatable nadj
real(r8), dimension(:), allocatable so_decay
real(r8), dimension(:), allocatable scoef
integer, dimension(:), allocatable kstp
integer, dimension(:), allocatable knew
integer, dimension(:), allocatable krhs
integer, dimension(:), allocatable nstp
type(t_storage), dimension(:), allocatable storage
real(r8), dimension(:), allocatable swork
subroutine ad_mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine ad_mp_exchange4d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c)
subroutine mp_exchange4d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, nghost, ew_periodic, ns_periodic, a, b, c)
subroutine ad_mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, ad_a, ad_b, ad_c, ad_d)
subroutine mp_exchange2d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, nghost, ew_periodic, ns_periodic, a, b, c, d)
subroutine mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, a, b, c, d)
logical function, public founderror(flag, noerr, line, routine)
subroutine so_semi_white(ng, tile, mstr, mend, state, ad_state)
subroutine sp_bcoef(ng, ntad, nttl, bcoef)
subroutine ad_unpack(ng, tile, mstr, mend, state)
subroutine tl_pack_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, krhs, kstp, knew, nstp, mstr, mend, tl_state, ijwaterr, ijwateru, ijwaterv, rmask, umask, vmask, h, hz, tl_t, tl_u, tl_v, tl_zeta)
subroutine sp_acoef(ng, ntad, nttl, acoef)
subroutine ad_unpack_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kout, nout, ijwaterr, ijwateru, ijwaterv, rmask, umask, vmask, h, hz, mstr, mend, state)
subroutine so_semi_red(ng, tile, mstr, mend, state, ad_state)
subroutine tl_pack(ng, tile, mstr, mend, tl_state)
subroutine tl_unpack(ng, tile, mstr, mend, state)
real(r8) function sp_autoc(ng, idf)
subroutine ad_pack(ng, tile, mstr, mend, ad_state)
subroutine c_norm2(ng, model, mstr, mend, evaluer, evaluei, evectorr, evectori, state, norm2)
subroutine tl_unpack_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kstp, nstp, mstr, mend, state, ijwaterr, ijwateru, ijwaterv, rmask, umask, vmask, h, hz, tl_t, tl_u, tl_v, tl_zeta, tl_stflx, tl_sustr, tl_svstr)
subroutine r_norm2(ng, model, mstr, mend, evalue, evector, state, norm2)
subroutine ad_pack_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, kstp, nstp, mstr, mend, ad_state, ijwaterr, ijwateru, ijwaterv, rmask, umask, vmask, h, hz, f_t, f_u, f_v, ad_stflx, f_ubar, f_vbar, f_zeta, ad_sustr, ad_svstr)
recursive subroutine wclock_off(ng, model, region, line, routine)
recursive subroutine wclock_on(ng, model, region, line, routine)