119 KA, KS, KE, IA, IS, IE, JA, JS, JE, & ! (in)
122 temp, qtrc, cptot, cvtot, &
125 use scale_atmos_saturation,
only: &
126 atmos_saturation_pres2qsat_liq
127 use scale_const,
only: &
130 integer,
intent(in) :: ka, ks, ke
131 integer,
intent(in) :: ia, is, ie
132 integer,
intent(in) :: ja, js, je
133 real(rp),
intent(in) :: dens(ka,ia,ja)
134 real(rp),
intent(in) :: pres(ka,ia,ja)
135 real(rp),
intent(in) :: dt
136 real(rp),
intent(inout) :: temp(ka,ia,ja)
137 real(rp),
intent(inout) :: qtrc(ka,ia,ja,qa_mp)
138 real(rp),
intent(inout) :: cptot(ka,ia,ja)
139 real(rp),
intent(inout) :: cvtot(ka,ia,ja)
140 real(rp),
intent(out) :: rhoe_t(ka,ia,ja)
141 real(rp),
intent(out) :: evaporate(ka,ia,ja)
143 real(rp) :: qsat(ka,ia,ja)
148 real(rp) :: cptot_(ka)
149 real(rp) :: cvtot_(ka)
150 real(rp) :: coef1(ka)
158 call atmos_saturation_pres2qsat_liq( &
159 ka, ks, ke, ia, is, ie, ja, js, je, &
171 coef1(:) = lhv * ( lhv + ( cv_vapor - cv_water ) * temp(:,i,j) ) / ( cvtot(:,i,j) * rvap )
173 d_qc(:) = max( ( qtrc(:,i,j,i_qv) - qsat(:,i,j) ) / ( 1.0_rp + coef1 / temp(:,i,j)**2 * ( 1.0_rp - coef2 * temp(:,i,j) ) * qsat(:,i,j) ), &
176 qtrc(:,i,j,i_qv) = qtrc(:,i,j,i_qv) - d_qc(:)
177 qtrc(:,i,j,i_qc) = qtrc(:,i,j,i_qc) + d_qc(:)
179 d_cp(:) = - cp_vapor * d_qc(:) &
181 cptot_(:) = cptot(:,i,j) + d_cp(:)
183 d_cv(:) = - cv_vapor * d_qc(:) &
185 cvtot_(:) = cvtot(:,i,j) + d_cv(:)
187 d_e(:) = lhv * d_qc(:)
188 rhoe_t(:,i,j) = dens(:,i,j) * d_e(:) * rdt
191 temp(:,i,j) = ( temp(:,i,j) * cvtot(:,i,j) + d_e(:) ) / cvtot_(:)
192 cptot(:,i,j) = cptot_(:)
193 cvtot(:,i,j) = cvtot_(:)
204 DENS, RHOQ, CPtot, CVtot, RHOE, & ! (inout)
205 sflx_rain, sflx_snow, esflx, &
207 qha, qla, qia, lcmesh, elem, elem1d )
209 use scale_const,
only: &
210 undef => const_undef8
215 integer,
intent(in) :: qha
216 real(rp),
intent(inout) :: dens (elem%np,lcmesh%nez,lcmesh%ne2d)
217 real(rp),
intent(inout) :: rhoq (elem%np,lcmesh%nez,lcmesh%ne2d,qha)
218 real(rp),
intent(inout) :: cptot(elem%np,lcmesh%nez,lcmesh%ne2d)
219 real(rp),
intent(inout) :: cvtot(elem%np,lcmesh%nez,lcmesh%ne2d)
220 real(rp),
intent(inout) :: rhoe (elem%np,lcmesh%nez,lcmesh%ne2d)
221 real(rp),
intent(inout) :: sflx_rain(elem%nfp_v,lcmesh%ne2da)
222 real(rp),
intent(inout) :: sflx_snow(elem%nfp_v,lcmesh%ne2da)
223 real(rp),
intent(inout) :: esflx (elem%nfp_v,lcmesh%ne2da)
224 real(rp),
intent(in) :: temp (elem%np,lcmesh%nez,lcmesh%ne2d)
225 real(rp),
intent(in) :: dt
226 integer,
intent(in) :: qla, qia
229 real(rp) :: rhocp(elem%np,lcmesh%nez,lcmesh%ne2d)
230 real(rp) :: rhocv(elem%np,lcmesh%nez,lcmesh%ne2d)
232 real(rp) :: ddens(elem%np)
233 real(rp) :: dinternalen(elem%np)
235 real(rp) :: vint_weight(elem%nnode_v,elem%nnode_h1d**2)
236 real(rp) :: condens_vint_lc(elem%nnode_h1d**2)
237 real(rp) :: ien_vint_lc(elem%nnode_h1d**2)
239 real(rp) :: eflx(elem%np)
254 if ( iq > qla + qia )
then
257 else if ( iq > qla )
then
269 do ke2d = 1, lcmesh%Ne2D
270 do ke_z = 1, lcmesh%NeZ
271 rhocp(:,ke_z,ke2d) = cptot(:,ke_z,ke2d) * dens(:,ke_z,ke2d)
272 rhocv(:,ke_z,ke2d) = cvtot(:,ke_z,ke2d) * dens(:,ke_z,ke2d)
279 do ke2d = 1, lcmesh%Ne2D
280 do ke_z = 1, lcmesh%NeZ
281 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
283 ddens(:) = - rhoq(:,ke_z,ke2d,iq)
284 rhoq(:,ke_z,ke2d,iq) = 0.0_rp
286 do p2d=1, elem%Nnode_h1D**2
287 vint_weight(:,p2d) = 0.5_rp * elem1d%IntWeight_lgl(:) * ( lcmesh%zlev(elem%Colmask(elem%Nnode_v,p2d),ke) - lcmesh%zlev(elem%Colmask(1,p2d),ke) )
290 do p2d=1, elem%Nnode_h1D**2
291 condens_vint_lc(p2d) = sum( vint_weight(:,p2d) * ddens(elem%Colmask(:,p2d)) )
295 sflx_snow(:,ke2d) = sflx_snow(:,ke2d) &
296 + condens_vint_lc(:) * rdt
298 sflx_rain(:,ke2d) = sflx_rain(:,ke2d) &
299 + condens_vint_lc(:) * rdt
304 rhocp(:,ke_z,ke2d) = rhocp(:,ke_z,ke2d) + cp(iq) * ddens(:)
305 rhocv(:,ke_z,ke2d) = rhocv(:,ke_z,ke2d) + cv(iq) * ddens(:)
306 dens(:,ke_z,ke2d) = dens(:,ke_z,ke2d) + ddens(:)
310 dinternalen(:) = cp(iq) * ddens(:) * temp(:,ke_z,ke2d)
312 do p2d=1, elem%Nnode_h1D**2
313 ien_vint_lc(p2d) = sum( vint_weight(:,p2d) * dinternalen(elem%Colmask(:,p2d)) )
315 esflx(:,ke2d) = esflx(:,ke2d) &
316 + ien_vint_lc(:) * rdt
318 rhoe(:,ke_z,ke2d) = rhoe(:,ke_z,ke2d) + dinternalen(:)
324 do ke2d = 1, lcmesh%Ne2D
325 do ke_z = 1, lcmesh%NeZ
326 cptot(:,ke_z,ke2d) = rhocp(:,ke_z,ke2d) / dens(:,ke_z,ke2d)
327 cvtot(:,ke_z,ke2d) = rhocv(:,ke_z,ke2d) / dens(:,ke_z,ke2d)
338 MOMU_t, MOMV_t, MOMZ_t, & ! (out)
339 dens, momu, momv, momz, dens_new, &
340 rdt_mp, lcmesh, elem )
345 real(rp),
intent(out) :: momu_t(elem%np,lcmesh%nea)
346 real(rp),
intent(out) :: momv_t(elem%np,lcmesh%nea)
347 real(rp),
intent(out) :: momz_t(elem%np,lcmesh%nea)
348 real(rp),
intent(in) :: dens(elem%np,lcmesh%nez,lcmesh%ne2d)
349 real(rp),
intent(in) :: momu(elem%np,lcmesh%nez,lcmesh%ne2d)
350 real(rp),
intent(in) :: momv(elem%np,lcmesh%nez,lcmesh%ne2d)
351 real(rp),
intent(in) :: momz(elem%np,lcmesh%nez,lcmesh%ne2d)
352 real(rp),
intent(in) :: dens_new(elem%np,lcmesh%nez,lcmesh%ne2d)
353 real(rp),
intent(in) :: rdt_mp
358 real(rp) :: coef(elem%np)
363 do ke2d = 1, lcmesh%Ne2D
364 do ke_z = 1, lcmesh%NeZ
365 ke = ke2d + (ke_z-1)*lcmesh%Ne2D
366 coef(:) = ( dens_new(:,ke_z,ke2d) / dens(:,ke_z,ke2d) - 1.0_rp ) * rdt_mp
368 momu_t(:,ke) = coef(:) * momu(:,ke_z,ke2d)
369 momv_t(:,ke) = coef(:) * momv(:,ke_z,ke2d)
370 momz_t(:,ke) = coef(:) * momz(:,ke_z,ke2d)
subroutine, public atmos_phy_mp_lscond_adjustment(ka, ks, ke, ia, is, ie, ja, js, je, dens, pres, dt, temp, qtrc, cptot, cvtot, rhoe_t, evaporate)
Calculate a state after the saturation process.