Skip to content

Commit

Permalink
Eliminate artificial supercooled water (rain and cloud) on pressure l…
Browse files Browse the repository at this point in the history
…evels (#771)

* Updates to prevent spurious supercooled rain water from appearing on pressure levels

* Updates to comments/documentation; fix to continuation line

* Fix typo in comments

* (1) Adding "IF MODELNAME" checks
(2) Slight change to freezing-temp threshold (now 273.15 K)
(3) Revised description in comments
(4) Added print statements (temporary)

* Adding "MAX" functions, as are also used in the interpolation code (earlier in MDL2P.f)

* Restating freezing temperature as "TFRZ" (= 273.15 K, from params.F) instead of local, hardcoded value

* Removing print statements; finalizing PR

* (1) Refactoring logic,
(2) Applying adjustments to all hydrometeors

* Updating entry in history log

* Re-wording comment

* For snow and graupel, use the value from the overlying model level or the interpolated value, whichever is greater.  This modified approach is reccomended by G. Thompson in order to retain larger values of snow/graupel whenever these mixing ratios increase downward across the pressure level (e.g., snow growth via cloud-drop collection prior to melting).

* Adding bug fix from Wen

* Adding checks for undefined arrays.

* Fix typo
  • Loading branch information
jaymes-kenyon authored Sep 25, 2023
1 parent 13b11f8 commit 998c2fe
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 3 deletions.
7 changes: 5 additions & 2 deletions sorc/ncep_post.fd/INITPOST_NETCDF.f
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
!> 2023-07-24 | Hui-Ya Chuang | Bug fix in tke inialization
!> 2023-08-04 | Jaymes Kenyon | Read RRFS microphysics number concentrations (cloud water, cloud ice, rain)
!> 2023-08-31 | Li(Kate Zhang)| Add condition to include/exclude processing nitrate from model output
!> 2023-09-22 | Wen Meng | Bug fix in cwm intialization
!>
!> @author Hui-Ya Chuang @date 2016-03-04
!----------------------------------------------------------------------
Expand Down Expand Up @@ -914,8 +915,10 @@ SUBROUTINE INITPOST_NETCDF(ncid2d,ncid3d)
do l=1,lm
do j=jsta,jend
do i=ista,iend
qrmax(i,j)=max(qrmax(i,j),qqr(i,j,l))
cwm(i,j,l)=qqg(i,j,l)+qqs(i,j,l)+qqr(i,j,l)+qqi(i,j,l)+qqw(i,j,l)
if(qqr(i,j,l) /= spval) then
qrmax(i,j)=max(qrmax(i,j),qqr(i,j,l))
cwm(i,j,l)=qqg(i,j,l)+qqs(i,j,l)+qqr(i,j,l)+qqi(i,j,l)+qqw(i,j,l)
endif
enddo
enddo
if(debugprint)print*,'sample l,t,q,u,v,w= ',isa,jsa,l &
Expand Down
65 changes: 64 additions & 1 deletion sorc/ncep_post.fd/MDL2P.f
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
!> 2022-12-21 | J Meng ! Adding snow density SDEN
!> 2023-02-23 | E James | Adding coarse PM from RRFS
!> 2023-08-24 | Y Mao | Add gtg_on option for GTG interpolation
!> 2023-09-12 | J Kenyon | Prevent spurious supercooled rain and cloud water
!>
!> @author T Black W/NP2 @date 1999-09-23
!--------------------------------------------------------------------------------------
Expand Down Expand Up @@ -64,7 +65,7 @@ SUBROUTINE MDL2P(iostatusD3D)
use physcons_post,only: CON_FVIRT, CON_ROG, CON_EPS, CON_EPSM1
use params_mod, only: H1M12, DBZMIN, H1, PQ0, A2, A3, A4, RHMIN, G, &
RGAMOG, RD, D608, GI, ERAD, PI, SMALL, H100, &
H99999, GAMMA
H99999, GAMMA, TFRZ
use ctlblk_mod, only: MODELNAME, LP1, ME, JSTA, JEND, LM, SPVAL, SPL, &
ALSL, JEND_M, SMFLAG, GRIB, CFLD, FLD_INFO, DATAPD,&
TD3D, IFHR, IFMIN, IM, JM, NBIN_DU, JSTA_2L, &
Expand Down Expand Up @@ -532,6 +533,68 @@ SUBROUTINE MDL2P(iostatusD3D)
QG1(I,J) = QQG(I,J,LL) + (QQG(I,J,LL)-QQG(I,J,LL-1))*FACT
QG1(I,J) = MAX(QG1(I,J),zero) ! GRAUPEL (precip ice)
! ...Prevent spurious supercooled water (rain and
! cloud water) from appearing on pressure levels
! that are located just above melting levels...
!
! Added Sep 2023 by J. Kenyon (NOAA/GSL), in response to
! a problem identified by G. Thompson (NCAR), described
! below.
!
! Consider a situation in which:
! (1) the target pressure level is contained between
! two adjacent model levels that also contain a
! melting level; i.e., the overlying model level
! is subfreezing, and the underlying model level
! is above freezing.
! (2) the temperature on the target pressure level
! (via interpolation) is subfreezing; i.e., the
! target pressure level is located "just above"
! the aforementioned melting level.
! (3) rain water exists on the underlying model level
!
! This situation is often found in a classic melting-
! snow thermal profile. The model level above the
! melting level will typically contain snow, but no
! rain. Meanwhile, the model level below the melting
! level will contain rain. Importantly, model levels in
! this situation do not contain supercooled rain, but
! interpolation onto the target pressure level will
! yield supercooled rain. In this sense, the supercooled
! rain is an artifact of interpolation. Because
! supercooled water poses a hazard to aviation, we seek
! to prevent supercooled water on pressure levels
! when none actually exists on the adjacent model levels.
!
! In the code below, we search for the condition in
! which this artifact occurs. Then, the previously
! interpolated value of Qrain is simply replaced by the
! value from the overlying (subfreezing) model level.
! The same approach is used for cloud water and cloud
! ice. However, for snow and graupel, either the value from
! the overlying model level or the interpolated value
! is used, whichever is greater. Since model-level weighting
! depends on the hydrometeor species, it is possible
! that the total condensate on the pressure level may be
! greater or less than that on both adjacent model levels
! (i.e., a slight artificial gain/loss of total condensate
! is possible). If this behavior must be avoided, simply
! use the values from the overlying model level for
! all species.
IF (MODELNAME == 'FV3R' .OR. MODELNAME == 'GFS') THEN
IF ( TSL(I,J) <= TFRZ .AND. & ! This pressure level is subfreezing and located just above a melting level;
T(I,J,LL-1) <= TFRZ .AND. & ! i.e., the overlying model level is subfreezing,
T(I,J,LL) > TFRZ ) THEN ! but the underlying model level is above freezing.
IF (QW1(I,J)<SPVAL) QW1(I,J) = MAX(QQW(I,J,LL-1),zero) ! For cloud water, cloud ice, and rain,
IF (QI1(I,J)<SPVAL) QI1(I,J) = MAX(QQI(I,J,LL-1),zero) ! use the value from the overlying (subfreezing) model
IF (QR1(I,J)<SPVAL) QR1(I,J) = MAX(QQR(I,J,LL-1),zero) ! level.
IF (QS1(I,J)<SPVAL) QS1(I,J) = MAX(QQS(I,J,LL-1),QS1(I,J))! For snow and graupel, use the value from the overlying
IF (QG1(I,J)<SPVAL) QG1(I,J) = MAX(QQG(I,J,LL-1),QG1(I,J))! level or the interpolated value, whichever is greater.
IF (C1D(I,J)<SPVAL) C1D(I,J) = QG1(I,J)+QS1(I,J)+QR1(I,J)+QI1(I,J)+QW1(I,J) ! Recalculate total condensate
ENDIF
ENDIF
! End of code to prevent spurious supercooled water
IF(DBZ(I,J,LL) < SPVAL .AND. DBZ(I,J,LL-1) < SPVAL) &
DBZ1(I,J) = DBZ(I,J,LL) + (DBZ(I,J,LL)-DBZ(I,J,LL-1))*FACT
DBZ1(I,J) = MAX(DBZ1(I,J),DBZmin)
Expand Down

0 comments on commit 998c2fe

Please sign in to comment.