-
Notifications
You must be signed in to change notification settings - Fork 49
remove Zhao-Carr cloud schemes and combine Xu-Randall cloud fraction calculation #337
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: ufs/dev
Are you sure you want to change the base?
Conversation
|
@Qingfu-Liu Thanks for making these changes.
Could we create a new module, say physics/Radiation/radiation_cloud_fraction.F90, which contains a single Xu-Randall cloud fraction routine that both RRTMG (physics/Radiation/radiation_clouds.f) and RRTMGP (physics/Interstitials/UFS_SCM_NEPTUNE/GFS_rrtmgp_cloud_mp.F90) uses? |
|
@dustinswales OK. I will make the changes. Thanks. |
|
@dustinswales I cross-checked the code between cld_frac_XuRandall (RRTMGP) and cloud_fraction_XuRandall (RRTMG), there is small differences between the two: |
physics/Radiation/radiation_clouds.f
Outdated
| cldtot(i,k) = 1. | ||
| else | ||
| onemrh= max( 1.e-10, 1.0-rhly(i,k) ) | ||
| clwm = clwmin / max( 0.01, plyr(i,k)*0.001 ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Qingfu-Liu I don't understand the need for this line? (clwmin =0 above)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes. we can remove this line here. Should we change the line 806 in GFS_rrtmgp_cloud_mp.F90 as:
tem2 = max(min(tem1*(cld_mr-clwm), 50.0 ), 0.0 ), where clwm=0. in RRTMG
My guess is that clwm=clwt when you change the code for RRTMGP
physics/Radiation/radiation_clouds.f
Outdated
| endif | ||
| tem1 = xrc3 / tem1 | ||
|
|
||
| value = max( min( tem1*(clwf(i,k)-clwm), 50.0 ), 0.0 ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Qingfu-Liu If clwm = 0, then why subtract it from here.
|
@Qingfu-Liu I don't want to make the call here, but I "think" the GP formulation is correct, and the G formulation is not. At least when looking back at https://journals.ametsoc.org/view/journals/atsc/53/21/1520-0469_1996_053_3084_ascpfu_2_0_co_2.xml?tab_body=pdf. |
|
@dustinswales I will do some more research. From the code, the two cloud fraction calculations for RRTMG and RRTMGP are different. |
|
@Qingfu-Liu As you pointed out, the algorithms are nearly the same, with small differences in the exponent. So whatever way is "correct", it will impact the other and cause answer changes. But they should be the same. |
|
@dustinswales I have modified the RRTMG code to make the Xu-Randall subroutine elemental and can be used for RRTMGP ( slightly modify the input variables). I will upload the code after the regression tests |
|
@dustinswales I uploaded the new code and change the RRTMG Xu-Randall subroutine to be a function and elemental, and can be called in the RRTMGP scheme with extra input control variable "factor". |
|
@Qingfu-Liu Thanks for doing this.
Ultimately, I think FactorG=FactorGP, but this will not give us B4B reproducibility for the RRTMGP test if we adopt this here. |
|
@dustinswales I have removed the cld_frac_XuRandall function from RRTMGP scheme, and replaced the function from module_radiation_clouds. The regression tests from RRTMGP (two suites in the default rt.conf) produce binary identical results. |
| ! Xu-Randall (1996) cloud-fraction. | ||
| cld_cnv_frac(iCol,iLay) = cld_frac_XuRandall(p_lay(iCol,iLay), & | ||
| qs_lay(iCol,iLay), relhum(iCol,iLay), qc+qi, alpha0) | ||
| play_pa = p_lay(iCol,iLay) *0.01 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we need to declare this local pressure var?
Can't you just pass p_lay(iCol,iLay) *0.01 into cld_frac_XuRandall?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we can change this
| integer :: iCol, iLay | ||
| real(kind_phys) :: tem1, deltaP, clwc, qc, qi | ||
| real(kind_phys) :: tem1, deltaP, clwc, qc, qi, play_pa | ||
| real(kind_phys) :: lambda = 0.50 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isn't lambda a constant for the cld_frac_XuRandall()?
Can we move is back in there?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Lambda =0.25, 0.49 and 0.50 see file: ccpp/data/GFS_typedefs.F90 variable name xr_exp
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ya, @dustinswales, this is new. There was a PR that tuned this for UFS, but NRL wanted the tuning to be optional, so it became a host-controlled variable.
Description of Changes:
Tests Conducted:
Regression tests are conducted on Ursa, and the results are binary identical
Dependencies:
No dependence
Documentation:
No new document (not needed)
Issue (optional):
No issues. The changes remove Zhao-Carr cloud schemes which are no longer used, and combine some similar subroutines