subroutine calthv use modglobal, only : lmoist,ib,ie,jb,je,kb,ke,kh,zf,zh,dzh,rlv,rd,rv,cp,eps1 use modfields, only : thl0,thl0h,ql0,ql0h,qt0,qt0h,sv0,exnf,exnh,thv0h,dthvdz use modsurfdata,only : dthldz,dqtdz implicit none integer i, j, k real qs real c1,c2,dq,dth,dthv,temp real a_dry, b_dry, a_moist, b_moist, c_liquid, epsilon, eps_I, chi_sat, chi real del_thv_sat, del_thv_dry dthvdz = 0.0 if (lmoist) then do k=kb,ke+kh do j=jb,je do i=ib,ie thv0h(i,j,k) = (thl0h(i,j,k)+rlv*ql0h(i,j,k)/(cp*exnh(k))) & *(1+(rv/rd-1)*qt0h(i,j,k)-rv/rd*ql0h(i,j,k)) end do end do end do do k=kb+1,ke do j=jb,je do i=ib,ie ! ! default thv jump computed unsaturated ! epsilon = rd/rv eps_I = 1/epsilon - 1. !cstep approx 0.608 a_dry = 1. + eps_I * qt0(i,j,k) b_dry = eps_I * thl0(i,j,k) dth = thl0(i,j,k+1)-thl0(i,j,k-1) dq = qt0(i,j,k+1)-qt0(i,j,k-1) del_thv_dry = a_dry * dth + b_dry * dq dthv = del_thv_dry if (ql0(i,j,k)> 0) then !include moist thermodynamics temp = thl0(i,j,k)*exnf(k)+(rlv/cp)*ql0(i,j,k) qs = qt0(i,j,k) - ql0(i,j,k) a_moist = (1.-qt0(i,j,k)+qs/epsilon*(1.+rlv/(rv*temp))) & /(1.+rlv**2*qs/(cp*rv*temp**2)) b_moist = a_moist*rlv/cp-temp c_liquid = a_dry * rlv / cp - thl0(i,j,k) / epsilon del_thv_sat = a_moist * dth + b_moist * dq chi = 2*chi_half*(zf(k) - zf(k-1))/(dzh(k)+dzh(k+1)) chi_sat = c_liquid * ql0(i,j,k) / (del_thv_dry - del_thv_sat) if (chi < chi_sat) then !mixed parcel is saturated dthv = del_thv_sat end if end if dthvdz(i,j,k) = dthv/(dzh(k+1)+dzh(k)) end do end do end do do j=jb,je do i=ib,ie dthvdz(i,j,kb)=0. end do end do else ! thv0h = thl0h thv0h = thl0h(:,:,kb:ke+kh) do k=kb+1,ke do j=jb,je do i=ib,ie dthvdz(i,j,k) = (thl0(i,j,k+1)-thl0(i,j,k-1))/(dzh(k+1)+dzh(k)) end do end do end do do j=jb,je do i=ib,ie dthvdz(i,j,kb)=0. end do end do end if !CvH remove WHERE !where (abs(dthvdz)<eps1) ! dthvdz = sign(eps1,dthvdz) !end where do k=kb,ke do j=jb,je do i=ib,ie if(abs(dthvdz(i,j,k)) < eps1) then dthvdz(i,j,k) = sign(eps1, dthvdz(i,j,k)) end if end do end do end do end subroutine calthv