@@ -137,7 +137,7 @@ subroutine zm_microphysics_history_convert( ncol, microp_st, pmid, temperature )
137137 !- ---------------------------------------------------------------------------
138138 ! Purpose: convert ZM microphysics prior to output
139139 !- ---------------------------------------------------------------------------
140- use zm_conv, only: zm_const
140+ use zm_conv, only: zm_const, zm_param
141141 !- ---------------------------------------------------------------------------
142142 ! Arguments
143143 integer , intent (in ) :: ncol ! number of columns in chunk
@@ -147,10 +147,13 @@ subroutine zm_microphysics_history_convert( ncol, microp_st, pmid, temperature )
147147 !- ---------------------------------------------------------------------------
148148 ! Local variables
149149 integer :: i,k
150+ integer :: msg ! number of missing moisture levels at the top of model
150151 real (r8 ) :: rho
151152 !- ---------------------------------------------------------------------------
153+ msg = zm_param% limcnv - 1 ! set this to match zm_convr()
154+
152155 do i = 1 ,ncol
153- do k = 1 ,pver
156+ do k = msg + 1 ,pver
154157 ! Interpolate variable from interface to mid-layer.
155158 if (k< pver) then
156159 microp_st% qice (i,k) = 0.5_r8 * (microp_st% qice (i,k)+ microp_st% qice (i,k+1 ))
@@ -166,36 +169,35 @@ subroutine zm_microphysics_history_convert( ncol, microp_st, pmid, temperature )
166169 microp_st% wu (i,k) = 0.5_r8 * (microp_st% wu (i,k)+ microp_st% wu (i,k+1 ))
167170 end if
168171 ! for levels at the freezing level move ice upward
169- if (k> 1 ) then
170- if ( temperature(i,k).gt. zm_const% tfreez .and. temperature(i,k-1 ).le. zm_const% tfreez ) then
171- microp_st% qice (i,k-1 ) = microp_st% qice (i,k-1 ) + microp_st% qice (i,k)
172- microp_st% qni (i,k-1 ) = microp_st% qni (i,k-1 ) + microp_st% qni (i,k)
173- microp_st% qsnow (i,k-1 ) = microp_st% qsnow (i,k-1 ) + microp_st% qsnow (i,k)
174- microp_st% qns (i,k-1 ) = microp_st% qns (i,k-1 ) + microp_st% qns (i,k)
175- microp_st% qgraupel(i,k-1 ) = microp_st% qgraupel(i,k-1 ) + microp_st% qgraupel(i,k)
176- microp_st% qng (i,k-1 ) = microp_st% qng (i,k-1 ) + microp_st% qng (i,k)
177- microp_st% qice (i,k) = 0._r8
178- microp_st% qni (i,k) = 0._r8
179- microp_st% qsnow (i,k) = 0._r8
180- microp_st% qns (i,k) = 0._r8
181- microp_st% qgraupel(i,k) = 0._r8
182- microp_st% qng (i,k) = 0._r8
183- end if
172+ if ( temperature(i,k).gt. zm_const% tfreez .and. temperature(i,k-1 ).le. zm_const% tfreez ) then
173+ microp_st% qice (i,k-1 ) = microp_st% qice (i,k-1 ) + microp_st% qice (i,k)
174+ microp_st% qni (i,k-1 ) = microp_st% qni (i,k-1 ) + microp_st% qni (i,k)
175+ microp_st% qsnow (i,k-1 ) = microp_st% qsnow (i,k-1 ) + microp_st% qsnow (i,k)
176+ microp_st% qns (i,k-1 ) = microp_st% qns (i,k-1 ) + microp_st% qns (i,k)
177+ microp_st% qgraupel(i,k-1 ) = microp_st% qgraupel(i,k-1 ) + microp_st% qgraupel(i,k)
178+ microp_st% qng (i,k-1 ) = microp_st% qng (i,k-1 ) + microp_st% qng (i,k)
179+ microp_st% qice (i,k) = 0._r8
180+ microp_st% qni (i,k) = 0._r8
181+ microp_st% qsnow (i,k) = 0._r8
182+ microp_st% qns (i,k) = 0._r8
183+ microp_st% qgraupel(i,k) = 0._r8
184+ microp_st% qng (i,k) = 0._r8
184185 end if
185186 end do ! k
186- ! Convert units from "kg/kg" to "g/m3"
187- do k = 1 ,pver
188- rho = pmid(i,k)/ (temperature(i,k)* zm_const% rdair)
189- microp_st% qice (i,k) = microp_st% qice(i,k) * rho * 1000._r8
190- microp_st% qliq (i,k) = microp_st% qliq(i,k) * rho * 1000._r8
191- microp_st% qrain (i,k) = microp_st% qrain(i,k) * rho * 1000._r8
192- microp_st% qsnow (i,k) = microp_st% qsnow(i,k) * rho * 1000._r8
193- microp_st% qgraupel(i,k) = microp_st% qgraupel(i,k) * rho * 1000._r8
194- microp_st% qni (i,k) = microp_st% qni(i,k) * rho
195- microp_st% qnl (i,k) = microp_st% qnl(i,k) * rho
196- microp_st% qnr (i,k) = microp_st% qnr(i,k) * rho
197- microp_st% qns (i,k) = microp_st% qns(i,k) * rho
198- microp_st% qng (i,k) = microp_st% qng(i,k) * rho
187+ ! Convert units
188+ do k = msg + 1 ,pver
189+ microp_st% qice (i,k) = microp_st% qice(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair * 1000._r8
190+ microp_st% qliq (i,k) = microp_st% qliq(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair * 1000._r8
191+ microp_st% qrain (i,k) = microp_st% qrain(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair * 1000._r8
192+ microp_st% qsnow (i,k) = microp_st% qsnow(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair * 1000._r8
193+ microp_st% qgraupel(i,k) = microp_st% qgraupel(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair * 1000._r8
194+ microp_st% qni (i,k) = microp_st% qni(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair
195+ microp_st% qnl (i,k) = microp_st% qnl(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair
196+ microp_st% qnr (i,k) = microp_st% qnr(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair
197+ microp_st% qns (i,k) = microp_st% qns(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair
198+ microp_st% qng (i,k) = microp_st% qng(i,k) * pmid(i,k)/ temperature(i,k)/ zm_const% rdair
199+ ! convert freezing rate to a heating rate due to freezing => [K/s]
200+ microp_st% frz (i,k) = microp_st% frz(i,k) * zm_const% latice/ zm_const% cpair
199201 end do ! k
200202 end do ! i
201203
0 commit comments