36 & LBi, UBi, LBj, UBj, &
37 & IminS, ImaxS, JminS, JmaxS, &
39 & rmask, umask, vmask, &
42 & rmask_wet, umask_wet, vmask_wet, &
45 & Huon, Hvom, oHz, t, &
55 integer,
intent(in) :: ng, tile
56 integer,
intent(in) :: lbi, ubi, lbj, ubj
57 integer,
intent(in) :: imins, imaxs, jmins, jmaxs
61 real(r8),
intent(in) :: rmask(lbi:,lbj:)
62 real(r8),
intent(in) :: umask(lbi:,lbj:)
63 real(r8),
intent(in) :: vmask(lbi:,lbj:)
66 real(r8),
intent(in) :: rmask_wet(lbi:,lbj:)
67 real(r8),
intent(in) :: umask_wet(lbi:,lbj:)
68 real(r8),
intent(in) :: vmask_wet(lbi:,lbj:)
70 real(r8),
intent(in) :: pm(lbi:,lbj:)
71 real(r8),
intent(in) :: pn(lbi:,lbj:)
72 real(r8),
intent(in) :: huon(lbi:,lbj:)
73 real(r8),
intent(in) :: hvom(lbi:,lbj:)
74 real(r8),
intent(in) :: ohz(imins:,jmins:)
75 real(r8),
intent(in) :: t(lbi:,lbj:)
76 real(r8),
intent(out) :: fx(imins:,jmins:)
77 real(r8),
intent(out) :: fe(imins:,jmins:)
80 real(r8),
intent(in) :: rmask(lbi:ubi,lbj:ubj)
81 real(r8),
intent(in) :: umask(lbi:ubi,lbj:ubj)
82 real(r8),
intent(in) :: vmask(lbi:ubi,lbj:ubj)
85 real(r8),
intent(in) :: rmask_wet(lbi:ubi,lbj:ubj)
86 real(r8),
intent(in) :: umask_wet(lbi:ubi,lbj:ubj)
87 real(r8),
intent(in) :: vmask_wet(lbi:ubi,lbj:ubj)
89 real(r8),
intent(in) :: pm(lbi:ubi,lbj:ubj)
90 real(r8),
intent(in) :: pn(lbi:ubi,lbj:ubj)
91 real(r8),
intent(in) :: huon(lbi:ubi,lbj:ubj)
92 real(r8),
intent(in) :: hvom(lbi:ubi,lbj:ubj)
93 real(r8),
intent(in) :: ohz(imins:imaxs,jmins:jmaxs)
94 real(r8),
intent(in) :: t(lbi:ubi,lbj:ubj)
95 real(r8),
intent(out) :: fx(imins:imaxs,jmins:jmaxs)
96 real(r8),
intent(out) :: fe(imins:imaxs,jmins:jmaxs)
101 integer :: i, is, j, k, ii, jj
103 real(r8) ::
cc1 = 0.25_r8
104 real(r8) ::
cc2 = 0.5_r8
105 real(r8) ::
cc3 = 1.0_r8/12.0_r8
106 real(r8) :: eps1 = 1.0e-12_r8
108 real(r8) :: cff, cff1
109 real(r8) :: betal, betar, betad, betau
110 real(r8) :: rl, rr, rd, ru, rkal, rkar, rkad, rkau
111 real(r8) :: a1, b1, sw_eta, sw_xi
113 real(r8),
dimension(IminS:ImaxS) :: gradx, kax, okax
114 real(r8),
dimension(JminS:JmaxS) :: grade, kae, okae
116# include "set_bounds.h"
125 cff=0.125_r8*(pm(i-1,j)+pm(i,j))*(pn(i-1,j)+pn(i,j))*
dt(ng)
126 cff1=cff*(ohz(i-1,j)+ohz(i,j))
127 gradx(i)=t(i,j)-t(i-1,j)
128 kax(i)=1.0_r8-abs(huon(i,j)*cff1)
130 gradx(i)=gradx(i)*umask(i,j)
131 kax(i)=kax(i)*umask(i,j)
135 IF (
domain(ng)%Western_Edge(tile))
THEN
136 IF (huon(istr,j).ge.0.0_r8)
THEN
141 IF (
domain(ng)%Eastern_Edge(tile))
THEN
142 IF (huon(iend+1,j).lt.0.0_r8)
THEN
149 IF (kax(i).le.eps1)
THEN
152 okax(i)=1.0_r8/max(kax(i),eps1)
154 IF (huon(i,j).ge.0.0_r8)
THEN
155 IF (abs(gradx(i)).le.eps1)
THEN
159 rl=gradx(i-1)/gradx(i)
160 rkal=kax(i-1)*okax(i)
165 cff=0.5_r8*max(0.0_r8, &
166 & min(2.0_r8, 2.0_r8*rl*rkal, betal))* &
174 IF (abs(gradx(i)).le.eps1)
THEN
178 rr=gradx(i+1)/gradx(i)
179 rkar=kax(i+1)*okax(i)
184 cff=0.5_r8*max(0.0_r8, &
185 & min(2.0_r8, 2.0_r8*rr*rkar, betar))* &
193 fx(i,j)=sw_xi*huon(i,j)
199 cff=0.125_r8*(pn(i,j)+pn(i,j-1))*(pm(i,j)+pm(i,j-1))*
dt(ng)
200 cff1=cff*(ohz(i,j)+ohz(i,j-1))
201 grade(j)=t(i,j)-t(i,j-1)
202 kae(j)=1.0_r8-abs(hvom(i,j)*cff1)
204 grade(j)=grade(j)*vmask(i,j)
205 kae(j)=kae(j)*vmask(i,j)
209 IF (
domain(ng)%Southern_Edge(tile))
THEN
210 IF (hvom(i,jstr).ge.0.0_r8)
THEN
215 IF (
domain(ng)%Northern_Edge(tile))
THEN
216 IF (hvom(i,jend+1).lt.0.0_r8)
THEN
223 IF (kae(j).le.eps1)
THEN
226 okae(j)=1.0_r8/max(kae(j),eps1)
228 IF (hvom(i,j).ge.0.0_r8)
THEN
229 IF (abs(grade(j)).le.eps1)
THEN
233 rd=grade(j-1)/grade(j)
234 rkad=kae(j-1)*okae(j)
239 cff=0.5_r8*max(0.0_r8, &
240 & min(2.0_r8, 2.0_r8*rd*rkad, betad))* &
248 IF (abs(grade(j)).le.eps1)
THEN
252 ru=grade(j+1)/grade(j)
253 rkau=kae(j+1)*okae(j)
258 cff=0.5*max(0.0_r8, &
259 & min(2.0_r8, 2.0_r8*ru*rkau, betau))* &
267 fe(i,j)=sw_eta*hvom(i,j)
subroutine, public hsimt_tvd_tile(ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, rmask, umask, vmask, rmask_wet, umask_wet, vmask_wet, pm, pn, huon, hvom, ohz, t, fx, fe)