93 DENS_dt, MOMX_dt, MOMY_dt, MOMZ_dt, ETot_dt, & ! (out)
94 ddens_, momx_, momy_, momz_, etot_, dpres_, &
95 dens_hyd, pres_hyd, pres_hyd_ref, therm_hyd, &
96 coriolis, rtot, cvtot, cptot, dphyddx, dphyddy, &
97 element3d_operation, dx, dy, dz, sx, sy, sz, lift, &
98 lmesh, elem, lmesh2d, elem2d )
110 type(
sparsemat),
intent(in) :: dx, dy, dz, sx, sy, sz, lift
111 real(rp),
intent(out) :: dens_dt(elem%np,lmesh%nea)
112 real(rp),
intent(out) :: momx_dt(elem%np,lmesh%nea)
113 real(rp),
intent(out) :: momy_dt(elem%np,lmesh%nea)
114 real(rp),
intent(out) :: momz_dt(elem%np,lmesh%nea)
115 real(rp),
intent(out) :: etot_dt(elem%np,lmesh%nea)
116 real(rp),
intent(in) :: ddens_(elem%np,lmesh%nea)
117 real(rp),
intent(in) :: momx_(elem%np,lmesh%nea)
118 real(rp),
intent(in) :: momy_(elem%np,lmesh%nea)
119 real(rp),
intent(in) :: momz_(elem%np,lmesh%nea)
120 real(rp),
intent(in) :: etot_(elem%np,lmesh%nea)
121 real(rp),
intent(in) :: dpres_(elem%np,lmesh%nea)
122 real(rp),
intent(in) :: dens_hyd(elem%np,lmesh%nea)
123 real(rp),
intent(in) :: pres_hyd(elem%np,lmesh%nea)
124 real(rp),
intent(in) :: pres_hyd_ref(elem%np,lmesh%nea)
125 real(rp),
intent(in) :: therm_hyd(elem%np,lmesh%nea)
126 real(rp),
intent(in) :: coriolis(elem2d%np,lmesh2d%nea)
127 real(rp),
intent(in) :: rtot(elem%np,lmesh%nea)
128 real(rp),
intent(in) :: cvtot(elem%np,lmesh%nea)
129 real(rp),
intent(in) :: cptot(elem%np,lmesh%nea)
130 real(rp),
intent(in) :: dphyddx(elem%np,lmesh%nea)
131 real(rp),
intent(in) :: dphyddy(elem%np,lmesh%nea)
133 real(rp) :: fx(elem%np), fy(elem%np), fz(elem%np), liftdelflx(elem%np)
134 real(rp) :: dpres_hyd(elem%np), gradphyd_x(elem%np), gradphyd_y(elem%np)
135 real(rp) :: del_flux(elem%nfptot,lmesh%ne,
prgvar_num)
136 real(rp) :: del_flux_hyd(elem%nfptot,lmesh%ne,2)
137 real(rp) :: rdens_(elem%np), u_(elem%np), v_(elem%np), w_(elem%np), wt_(elem%np)
138 real(rp) :: cori(elem%np)
139 real(rp) :: drho(elem%np)
140 real(rp) :: gsqrtv(elem%np), rgsqrtv(elem%np)
144 real(rp) :: gamm, rgamm
146 real(rp) :: rovp0, p0ovr
148 real(rp) :: enthalpy_(elem%np)
151 call prof_rapstart(
'cal_dyn_tend_bndflux', 3)
152 call get_ebnd_flux( &
153 del_flux, del_flux_hyd, &
154 ddens_, momx_, momy_, momz_, etot_, dpres_, dens_hyd, pres_hyd, &
155 rtot, cvtot, cptot, &
156 lmesh%Gsqrt, lmesh%GI3(:,:,1), lmesh%GI3(:,:,2), lmesh%zlev(:,:), &
157 lmesh%normal_fn(:,:,1), lmesh%normal_fn(:,:,2), lmesh%normal_fn(:,:,3), &
158 lmesh%vmapM, lmesh%vmapP, &
159 lmesh, elem, lmesh2d, elem2d )
160 call prof_rapend(
'cal_dyn_tend_bndflux', 3)
163 call prof_rapstart(
'cal_dyn_tend_interior', 3)
165 rgamm = cvdry / cpdry
166 rp0 = 1.0_rp / pres00
168 p0ovr = pres00 / rdry
176 do ke = lmesh%NeS, lmesh%NeE
178 ke2d = lmesh%EMap3Dto2D(ke)
179 cori(:) = coriolis(elem%IndexH2Dto3D(:),ke2d)
181 gsqrtv(:) = lmesh%Gsqrt(:,ke) / lmesh%GsqrtH(elem%IndexH2Dto3D,ke2d)
182 rgsqrtv(:) = 1.0_rp / gsqrtv(:)
185 rdens_(:) = 1.0_rp / (ddens_(:,ke) + dens_hyd(:,ke))
186 u_(:) = momx_(:,ke) * rdens_(:)
187 v_(:) = momy_(:,ke) * rdens_(:)
188 w_(:) = momz_(:,ke) * rdens_(:)
189 wt_(:) = w_(:) * rgsqrtv(:) + lmesh%GI3(:,ke,1) * u_(:) + lmesh%GI3(:,ke,2) * v_(:)
196 enthalpy_(:) = etot_(:,ke) + pres_hyd(:,ke) + dpres_(:,ke)
202 dpres_hyd(:) = pres_hyd(:,ke) - pres_hyd_ref(:,ke)
206 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,1), liftdelflx)
207 gradphyd_x(:) = lmesh%Escale(:,ke,1,1) * fx(:) &
208 + lmesh%Escale(:,ke,3,3) * fz(:) &
213 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux_hyd(:,ke,2), liftdelflx)
214 gradphyd_y(:) = lmesh%Escale(:,ke,2,2) * fy(:) &
215 + lmesh%Escale(:,ke,3,3) * fz(:) &
221 call sparsemat_matmul(dz, lmesh%Gsqrt(:,ke) * ( ddens_(:,ke) + dens_hyd(:,ke) ) * wt_(:), fz)
222 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,dens_vid), liftdelflx)
224 dens_dt(:,ke) = - ( &
225 lmesh%Escale(:,ke,1,1) * fx(:) &
226 + lmesh%Escale(:,ke,2,2) * fy(:) &
227 + lmesh%Escale(:,ke,3,3) * fz(:) &
228 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
231 call sparsemat_matmul(dx, lmesh%Gsqrt(:,ke) * ( u_(:) * momx_(:,ke) + dpres_(:,ke) ), fx)
234 + lmesh%GI3(:,ke,1) * dpres_(:,ke) ), fz)
235 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momx_vid), liftdelflx)
238 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
239 + lmesh%Escale(:,ke,2,2) * fy(:) &
240 + lmesh%Escale(:,ke,3,3) * fz(:) &
241 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
242 - gradphyd_x(:) * rgsqrtv(:) &
243 + cori(:) * momy_(:,ke)
247 call sparsemat_matmul(dy, lmesh%Gsqrt(:,ke) * ( v_(:) * momy_(:,ke) + dpres_(:,ke) ), fy)
249 + lmesh%GI3(:,ke,2) * dpres_(:,ke) ), fz)
250 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momy_vid), liftdelflx)
253 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
254 + lmesh%Escale(:,ke,2,2) * fy(:) &
255 + lmesh%Escale(:,ke,3,3) * fz(:) &
256 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
257 - gradphyd_y(:) * rgsqrtv(:) &
258 - cori(:) * momx_(:,ke)
264 + rgsqrtv(:) * dpres_(:,ke) ), fz)
265 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,momz_vid), liftdelflx)
268 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
269 + lmesh%Escale(:,ke,2,2) * fy(:) &
270 + lmesh%Escale(:,ke,3,3) * fz(:) &
271 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke) &
278 call sparsemat_matmul(lift, lmesh%Fscale(:,ke) * del_flux(:,ke,etot_vid), liftdelflx)
281 - ( lmesh%Escale(:,ke,1,1) * fx(:) &
282 + lmesh%Escale(:,ke,2,2) * fy(:) &
283 + lmesh%Escale(:,ke,3,3) * fz(:) &
284 + liftdelflx(:) ) / lmesh%Gsqrt(:,ke)
287 call prof_rapend(
'cal_dyn_tend_interior', 3)