diff --git a/Registry/Registry.EM_COMMON b/Registry/Registry.EM_COMMON index aa8c9b3651..77a6004eca 100644 --- a/Registry/Registry.EM_COMMON +++ b/Registry/Registry.EM_COMMON @@ -1551,7 +1551,7 @@ state integer STEPCU - misc 1 - r "S state real RTHRATEN ikj misc 1 - rd "RTHRATEN" "THETA TENDENCY DUE TO RADIATION" "K s-1" state real RTHRATENLW ikj misc 1 - r "RTHRATLW" "UNCOUPLED THETA TENDENCY DUE TO LONG WAVE RADIATION" "K s-1" state real RTHRATENSW ikj misc 1 - r "RTHRATSW" "UNCOUPLED THETA TENDENCY DUE TO SHORT WAVE RADIATION" "K s-1" -state real CLDFRA ikj misc 1 - rh "CLDFRA" "CLOUD FRACTION" "" +state real CLDFRA ikj misc 1 - i0rh "CLDFRA" "CLOUD FRACTION" "" state real CONVCLD ij misc 1 - r "CONVCLD" "BMJ CONVECTIVE CLOUD" "kg m-2" state real CCLDFRA ikj misc 1 - r "CCLDFRA" "CONVECTIVE CLOUD FRACTION" "" state real CLDFRA_OLD ikj misc 1 - r "CLDFRA_OLD" "previous time level cldfra" "" @@ -2458,6 +2458,7 @@ rconfig integer tracer_pblmix namelist,physics max_domains 1 rconfig logical use_aero_icbc namelist,physics 1 .false. rh "use_aero_icbc" "Use GOCART climo 3D aerosols IC/BC data in Thompson-MP-Aero" "logical flag" rconfig logical use_rap_aero_icbc namelist,physics 1 .false. r "use_rap_aero_icbc" "Use GOCART climo 3D aerosols IC/BC data in Thompson-MP-Aero from RAP" "logical flag" rconfig integer use_mp_re namelist,physics 1 1 h "use_mp_re" "use effective radii computed in some mp schemes in RRTMG" "flag" +rconfig logical insert_init_cloud namelist,physics 1 .false. irh "insert_init_cloud" "Insert diagnostic initial cloud using icloud=3 method (Thompson)" "logical flag" # The following two options are hooked into various microphysics schemes to allow for ensemble perturbations of CCN and hail/graupel PSDs - GAC (AFWA) rconfig real ccn_conc namelist,physics 1 1.0E8 h "ccn_conc" "CCN concentration" "# m-3" diff --git a/dyn_em/depend.dyn_em b/dyn_em/depend.dyn_em index dee243608a..63a044d209 100644 --- a/dyn_em/depend.dyn_em +++ b/dyn_em/depend.dyn_em @@ -194,11 +194,13 @@ module_initialize_real.o : \ nest_init_utils.o \ module_polarfft.o \ ../share/module_llxy.o \ + ../frame/module_dm.o \ ../frame/module_domain.o \ ../frame/module_configure.o \ ../frame/module_state_description.o \ ../frame/module_timing.o \ ../frame/module_dm.o \ + ../phys/module_radiation_driver.o \ ../share/module_io_domain.o \ ../share/module_model_constants.o \ ../share/module_bc.o \ diff --git a/dyn_em/module_initialize_real.F b/dyn_em/module_initialize_real.F index ce53a5b8ff..80b1ab7a89 100644 --- a/dyn_em/module_initialize_real.F +++ b/dyn_em/module_initialize_real.F @@ -69,6 +69,8 @@ SUBROUTINE init_domain_rk ( grid & ) USE module_optional_input + USE module_radiation_driver, ONLY: cal_cldfra3 + USE module_dm, ONLY : wrf_dm_max_real IMPLICIT NONE ! Input space and data. No gridded meteorological data has been stored, though. @@ -121,6 +123,13 @@ SUBROUTINE init_domain_rk ( grid & INTEGER :: auto_levels_opt REAL :: max_dz, dzbot, dzstretch_s, dzstretch_u, z1, airmass + INTEGER:: i_end, j_end + REAL, ALLOCATABLE, DIMENSION(:):: temp_P, temp_T, temp_R, temp_Dz + REAL, ALLOCATABLE, DIMENSION(:):: temp_Qv, temp_Qc, temp_Qi, temp_Qs + REAL, ALLOCATABLE, DIMENSION(:):: temp_CF, temp_Nc, temp_Ni + REAL:: max_relh, temp_xland, gridkm + LOGICAL :: debug_flag = .FALSE. + REAL :: dclat ! INTEGER , PARAMETER :: nl_max = 1000 @@ -4370,6 +4379,124 @@ SUBROUTINE init_domain_rk ( grid & enddo ENDIF +!+---+-----------------------------------------------------------------+ +!..We can consider that in circumstance of a 'cold start' we can make +!.. an attempt to insert some initial clouds to get a better starting +!.. radiation representation due to clouds using the icloud3 cloud fraction +!.. scheme. +!+---+-----------------------------------------------------------------+ + + if (config_flags%insert_init_cloud .AND. & + (P_QC .gt. PARAM_FIRST_SCALAR .AND. & + P_QI .gt. PARAM_FIRST_SCALAR)) then + + ALLOCATE(temp_P(kts:kte-1)) + ALLOCATE(temp_Dz(kts:kte-1)) + ALLOCATE(temp_T(kts:kte-1)) + ALLOCATE(temp_R(kts:kte-1)) + ALLOCATE(temp_Qv(kts:kte-1)) + ALLOCATE(temp_Qc(kts:kte-1)) + ALLOCATE(temp_Nc(kts:kte-1)) + ALLOCATE(temp_Qi(kts:kte-1)) + ALLOCATE(temp_Ni(kts:kte-1)) + ALLOCATE(temp_Qs(kts:kte-1)) + ALLOCATE(temp_CF(kts:kte-1)) + + i_end = MIN(ite,ide-1) + j_end = MIN(jte,jde-1) + max_relh = 1.5 +#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) ) + max_relh = wrf_dm_max_real ( MAXVAL(grid%u_1(its:i_end,:,jts:j_end)) ) +#else + max_relh = MAXVAL ( grid%u_1(its:i_end,:,jts:j_end) ) +#endif + max_relh = max_relh*0.01 + + gridkm = SQRT(config_flags%dx*config_flags%dy)*0.001 + + !..As it occurs up above, temporarily utilizing the v_1 variable, + !.. to hold temperature, which it does when time_loop=0. + + IF ( internal_time_loop .GT. 1 ) THEN + grid%v_1 = grid%t_2+t0 + CALL theta_to_t ( grid%v_1 , grid%p_hyd , p00 , & + ids , ide , jds , jde , kds , kde , & + ims , ime , jms , jme , kms , kme , & + its , ite , jts , jte , kts , kte ) + ENDIF + + do j = jts, j_end + do i = its, i_end + IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE + debug_flag = .false. +! if (i.eq.9 .and. j.eq.9) debug_flag = .true. + + temp_xland = grid%xland(i,j) + if (grid%lakemask(i,j) .eq. 1) temp_xland = 1 + do k = kts, kte-1 + temp_Dz(k) = (grid%ph_2(i,k+1,j)+grid%phb(i,k+1,j) - (grid%ph_2(i,k,j)+grid%phb(i,k,j)))/g + temp_P(k) = grid%p_hyd(i,k,j) + temp_T(k) = grid%v_1(i,k,j) ! Around line num 1800 v_1 used to hold temperature. + temp_R(k) = 1./grid%alt(i,k,j) + temp_Qv(k) = moist(i,k,j,P_QV) + temp_Qc(k) = MAX(0., moist(i,k,j,P_QC)) + temp_Qi(k) = MAX(0., moist(i,k,j,P_QI)) + if (P_QS .gt. 1) then + temp_Qs(k) = MAX(0., moist(i,k,j,P_QS)) + else + temp_Qs(k) = 0. + endif + if (P_QNI .gt. 1) then + temp_Ni(k) = MAX(0., scalar(i,k,j,P_QNI)) + else + temp_Ni(k) = 0. + endif + if (P_QNC .gt. 1) then + temp_Nc(k) = MAX(0., scalar(i,k,j,P_QNC)) + else + temp_Nc(k) = 0. + endif + temp_CF(k) = 0. + enddo + + call cal_cldfra3(temp_CF,temp_Qv,temp_Qc,temp_Qi,temp_Qs, & + & temp_Dz, temp_P, temp_T, temp_xland, gridkm, & + & config_flags%insert_init_cloud, max_relh, & + & kts, kte-1, debug_flag) + + do k = kts, kte-1 + grid%cldfra(i,k,j) = temp_CF(k) + enddo + + if (debug_flag) then + do k = kts, kte-1 + write(*,*) ' DEBUG_column: ', temp_P(k), temp_T(k), temp_Qv(k), temp_Qc(k), temp_Qi(k), moist(i,k,j,P_QC), moist(i,k,j,P_QI) + enddo + endif + + do k = kts, kte-1 + moist(i,k,j,P_QV) = MAX(temp_Qv(k), moist(i,k,j,P_QV)) + moist(i,k,j,P_QC) = temp_Qc(k) + moist(i,k,j,P_QI) = temp_Qi(k) + enddo + + enddo + enddo + + DEALLOCATE(temp_P) + DEALLOCATE(temp_Dz) + DEALLOCATE(temp_T) + DEALLOCATE(temp_R) + DEALLOCATE(temp_Qv) + DEALLOCATE(temp_Qc) + DEALLOCATE(temp_Nc) + DEALLOCATE(temp_Qi) + DEALLOCATE(temp_Ni) + DEALLOCATE(temp_Qs) + DEALLOCATE(temp_CF) + + endif + !+---+-----------------------------------------------------------------+ !..Let us ensure that double-moment microphysics variables have numbers !.. where there is mass. Currently doing this for Thompson-MP only, but diff --git a/run/README.namelist b/run/README.namelist index 397245df1e..e397bda405 100644 --- a/run/README.namelist +++ b/run/README.namelist @@ -907,6 +907,11 @@ Namelist variables for controlling the adaptive time step option: on threshold 3 = with cloud effect, and use cloud fraction option 3, based on Sundqvist et al. (1989) (since 3.7) + insert_init_cloud = .false., ! Default + = .true., ! For use with cold start (zero cloud fields), this option will + use the icloud=3 scheme to produce initial cloud water and cloud + ice fields as well as ensure initial water vapor field matches + saturation, which retains clouds beyond the first few timesteps. swrad_scat = 1. ! scattering tuning parameter (default 1. is 1.e-5 m2/kg) (works for ra_sw_physics = 1 option only) surface_input_source = 3, ! where landuse and soil category data come from: