From 8716e49db32a781489a33fead2401666f8e71cae Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 11 Oct 2022 14:21:35 -0600 Subject: [PATCH 01/13] NCAR/main PR #66 (Bugfix and optimization of prognostic closure for the P8 physics suite) (#592) * This is equivalent to PR66 in NCAR/fv3atm: NCAR/main PR #66 (Bugfix and optimization of prognostic closure for the P8 physics suite) --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 9c1943cbb..cd2cae792 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 9c1943cbb9176c435bd7eda83868e381a5a82e49 +Subproject commit cd2cae7921206bf770ee5fa489c2c4e9789ac7a8 From 2458535f9cdfb120f9bcf51dd01907e8d36eab00 Mon Sep 17 00:00:00 2001 From: "Samuel Trahan (NOAA contractor)" <39415369+SamuelTrahanNOAA@users.noreply.github.com> Date: Mon, 17 Oct 2022 09:07:30 -0600 Subject: [PATCH 02/13] Fix boundary issues and numerical precision trouble in RUC LSM (#587) * fixes and workarounds for uninitialized memory in fv_regional_bc * initialize kmaxfire in module_bl_mynn * smoke bug fixes for restart * remove smoke bug fixes * remove workarounds and fix remaining known bugs in ps_reg * a few more surface pressure bug fixes; now the test case runs in debug mode * ccpp/physics: module_sf_ruclsm imprecision workaround for gfortran -DDEBUG=ON * move sanity checks to lsm_ruc and add "snow on ice" check * use i-1 & j-1 for two-point averages, when available * Replace many changes with atmos_cubed_sphere PR #220 --- atmos_cubed_sphere | 2 +- ccpp/physics | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/atmos_cubed_sphere b/atmos_cubed_sphere index 153cd903f..aa42f6e13 160000 --- a/atmos_cubed_sphere +++ b/atmos_cubed_sphere @@ -1 +1 @@ -Subproject commit 153cd903f8f95a7bc41fb242fe96fd7cdd4c2b64 +Subproject commit aa42f6e135839492b0a3b80fc3f2c25d766ad437 diff --git a/ccpp/physics b/ccpp/physics index cd2cae792..ab220bf64 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit cd2cae7921206bf770ee5fa489c2c4e9789ac7a8 +Subproject commit ab220bf6481b05212042c0a3095cb181e4b2ad4a From d38ccafa4cfbdc5392dee3bb46f18bd6ce6abf07 Mon Sep 17 00:00:00 2001 From: Grant Firl Date: Tue, 18 Oct 2022 16:07:29 -0400 Subject: [PATCH 03/13] Small cloud tunings from Greg Thompson (#580) * update gitmodules and point to PR branch of ccpp/physics * Small cloud tunings from Greg Thompson (#580) Co-authored-by: Grant Firl --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index ab220bf64..d93ce1acd 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit ab220bf6481b05212042c0a3095cb181e4b2ad4a +Subproject commit d93ce1acd7bae45d0752a4543fcfd706b2b6b7fe From 324591bd2824d869dc7b6a10dcc90db1d5898cd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ufuk=20Turun=C3=A7o=C4=9Flu?= Date: Fri, 28 Oct 2022 09:09:23 -0600 Subject: [PATCH 04/13] Add support for external land component (#591) * fixes for land coupling * work to support external land component side-by-side config * fix issue with ort dbg test --- atmos_model.F90 | 70 +++++++++++++----- ccpp/data/GFS_typedefs.F90 | 77 ++++++++++--------- ccpp/data/GFS_typedefs.meta | 42 ++++++----- ccpp/physics | 2 +- cpl/module_block_data.F90 | 142 ++++++++++++++++++++++++++++++++++++ cpl/module_cplfields.F90 | 10 ++- 6 files changed, 272 insertions(+), 71 deletions(-) diff --git a/atmos_model.F90 b/atmos_model.F90 index b4caa2aaa..35e7328ac 100644 --- a/atmos_model.F90 +++ b/atmos_model.F90 @@ -1685,22 +1685,22 @@ subroutine update_atmos_chemistry(state, rc) enddo ! -- zero out accumulated fields + if (.not. GFS_control%cplflx .and. .not. GFS_control%cpllnd) then !$OMP parallel do default (none) & !$OMP shared (nj, ni, Atm_block, GFS_control, GFS_data) & !$OMP private (j, jb, i, ib, nb, ix) - do j = 1, nj - jb = j + Atm_block%jsc - 1 - do i = 1, ni - ib = i + Atm_block%isc - 1 - nb = Atm_block%blkno(ib,jb) - ix = Atm_block%ixp(ib,jb) - GFS_data(nb)%coupling%rainc_cpl(ix) = zero - if (.not.GFS_control%cplflx) then + do j = 1, nj + jb = j + Atm_block%jsc - 1 + do i = 1, ni + ib = i + Atm_block%isc - 1 + nb = Atm_block%blkno(ib,jb) + ix = Atm_block%ixp(ib,jb) + GFS_data(nb)%coupling%rainc_cpl(ix) = zero GFS_data(nb)%coupling%rain_cpl(ix) = zero GFS_data(nb)%coupling%snow_cpl(ix) = zero - end if + enddo enddo - enddo + end if if (GFS_control%debug) then ! -- diagnostics @@ -2883,7 +2883,6 @@ subroutine setup_exportdata(rc) ! Instantaneous u wind (m/s) 10 m above ground case ('inst_zonal_wind_height10m') call block_data_copy(datar82d, GFS_data(nb)%coupling%u10mi_cpl, Atm_block, nb, rc=localrc) - !call block_data_copy(datar82d, GFS_data(nb)%coupling%u10mi_cpl, Atm_block, nb, rc=localrc) ! Instantaneous v wind (m/s) 10 m above ground case ('inst_merid_wind_height10m') call block_data_copy(datar82d, GFS_data(nb)%coupling%v10mi_cpl, Atm_block, nb, rc=localrc) @@ -3005,6 +3004,9 @@ subroutine setup_exportdata(rc) ! MEAN precipitation rate (kg/m2/s) case ('mean_prec_rate') call block_data_copy(datar82d, GFS_data(nb)%coupling%rain_cpl, Atm_block, nb, scale_factor=rtimek, rc=localrc) + ! MEAN convective precipitation rate (kg/m2/s) + case ('mean_prec_rate_conv') + call block_data_copy(datar82d, GFS_Data(nb)%Coupling%rainc_cpl, Atm_block, nb, scale_factor=rtimek, rc=localrc) ! MEAN snow precipitation rate (kg/m2/s) case ('mean_fprec_rate') call block_data_copy(datar82d, GFS_data(nb)%coupling%snow_cpl, Atm_block, nb, scale_factor=rtimek, rc=localrc) @@ -3015,19 +3017,38 @@ subroutine setup_exportdata(rc) ! bottom layer temperature (t) case('inst_temp_height_lowest') call block_data_copy_or_fill(datar82d, DYCORE_data(nb)%coupling%t_bot, zeror8, Atm_block, nb, rc=localrc) + case('inst_temp_height_lowest_from_phys') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Statein%tgrs, 1, zeror8, Atm_block, nb, rc=localrc) ! bottom layer specific humidity (q) ! ! ! CHECK if tracer 1 is for specific humidity ! ! ! case('inst_spec_humid_height_lowest') call block_data_copy_or_fill(datar82d, DYCORE_data(nb)%coupling%tr_bot, 1, zeror8, Atm_block, nb, rc=localrc) + case('inst_spec_humid_height_lowest_from_phys') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Statein%qgrs, 1, GFS_Control%ntqv, zeror8, Atm_block, nb, rc=localrc) ! bottom layer zonal wind (u) case('inst_zonal_wind_height_lowest') call block_data_copy_or_fill(datar82d, DYCORE_data(nb)%coupling%u_bot, zeror8, Atm_block, nb, rc=localrc) - ! bottom layer meridionalw wind (v) + ! bottom layer meridional wind (v) case('inst_merid_wind_height_lowest') call block_data_copy_or_fill(datar82d, DYCORE_data(nb)%coupling%v_bot, zeror8, Atm_block, nb, rc=localrc) + ! bottom layer zonal wind (u) from physics + case('inst_zonal_wind_height_lowest_from_phys') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Statein%ugrs, 1, zeror8, Atm_block, nb, rc=localrc) + ! bottom layer meridional wind (v) from physics + case('inst_merid_wind_height_lowest_from_phys') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Statein%vgrs, 1, zeror8, Atm_block, nb, rc=localrc) + ! surface friction velocity + case('surface_friction_velocity') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Sfcprop%uustar, zeror8, Atm_block, nb, rc=localrc) ! bottom layer pressure (p) case('inst_pres_height_lowest') call block_data_copy_or_fill(datar82d, DYCORE_data(nb)%coupling%p_bot, zeror8, Atm_block, nb, rc=localrc) + ! bottom layer pressure (p) from physics + case('inst_pres_height_lowest_from_phys') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Statein%prsl, 1, zeror8, Atm_block, nb, rc=localrc) + ! dimensionless exner function at surface adjacent layer + case('inst_exner_function_height_lowest') + call block_data_copy_or_fill(datar82d, GFS_data(nb)%Statein%prslk, 1, zeror8, Atm_block, nb, rc=localrc) ! bottom layer height (z) case('inst_height_lowest') call block_data_copy_or_fill(datar82d, DYCORE_data(nb)%coupling%z_bot, zeror8, Atm_block, nb, rc=localrc) @@ -3105,24 +3126,37 @@ subroutine setup_exportdata(rc) GFS_data(nb)%coupling%dvsfc_cpl(ix) = zero GFS_data(nb)%coupling%dtsfc_cpl(ix) = zero GFS_data(nb)%coupling%dqsfc_cpl(ix) = zero - GFS_data(nb)%coupling%dlwsfc_cpl(ix) = zero - GFS_data(nb)%coupling%dswsfc_cpl(ix) = zero - GFS_data(nb)%coupling%rain_cpl(ix) = zero GFS_data(nb)%coupling%nlwsfc_cpl(ix) = zero - GFS_data(nb)%coupling%nswsfc_cpl(ix) = zero GFS_data(nb)%coupling%dnirbm_cpl(ix) = zero GFS_data(nb)%coupling%dnirdf_cpl(ix) = zero GFS_data(nb)%coupling%dvisbm_cpl(ix) = zero GFS_data(nb)%coupling%dvisdf_cpl(ix) = zero + enddo + enddo + if (mpp_pe() == mpp_root_pe()) print *,'zeroing coupling accumulated fields at kdt= ',GFS_control%kdt + endif !cplflx +!--- + if (GFS_control%cplflx .or. GFS_control%cpllnd) then +! zero out accumulated fields +!$omp parallel do default(shared) private(i,j,nb,ix) + do j=jsc,jec + do i=isc,iec + nb = Atm_block%blkno(i,j) + ix = Atm_block%ixp(i,j) + GFS_data(nb)%coupling%dlwsfc_cpl(ix) = zero + GFS_data(nb)%coupling%dswsfc_cpl(ix) = zero + GFS_data(nb)%coupling%rain_cpl(ix) = zero + GFS_data(nb)%coupling%rainc_cpl(ix) = zero + GFS_data(nb)%coupling%snow_cpl(ix) = zero + GFS_data(nb)%coupling%nswsfc_cpl(ix) = zero GFS_data(nb)%coupling%nnirbm_cpl(ix) = zero GFS_data(nb)%coupling%nnirdf_cpl(ix) = zero GFS_data(nb)%coupling%nvisbm_cpl(ix) = zero GFS_data(nb)%coupling%nvisdf_cpl(ix) = zero - GFS_data(nb)%coupling%snow_cpl(ix) = zero enddo enddo if (mpp_pe() == mpp_root_pe()) print *,'zeroing coupling accumulated fields at kdt= ',GFS_control%kdt - endif !cplflx + endif !cplflx or cpllnd end subroutine setup_exportdata diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index f0aae80c5..f217d1427 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -674,6 +674,7 @@ module GFS_typedefs logical :: cplwav2atm !< default no wav->atm coupling logical :: cplaqm !< default no cplaqm collection logical :: cplchm !< default no cplchm collection + logical :: cpllnd !< default no cpllnd collection logical :: rrfs_smoke !< default no rrfs_smoke collection integer :: dust_smoke_rrtmg_band_number !< band number to affect in rrtmg_pre from smoke and dust logical :: use_cice_alb !< default .false. - i.e. don't use albedo imported from the ice model @@ -2525,7 +2526,7 @@ subroutine coupling_create (Coupling, IM, Model) Coupling%tsfc_radtime = clear_val endif - if (Model%cplflx .or. Model%do_sppt .or. Model%cplchm .or. Model%ca_global) then + if (Model%cplflx .or. Model%do_sppt .or. Model%cplchm .or. Model%ca_global .or. Model%cpllnd) then allocate (Coupling%rain_cpl (IM)) allocate (Coupling%snow_cpl (IM)) Coupling%rain_cpl = clear_val @@ -2541,7 +2542,7 @@ subroutine coupling_create (Coupling, IM, Model) Coupling%v10mi_cpl = clear_val endif - if (Model%cplflx .or. Model%cplchm) then + if (Model%cplflx .or. Model%cplchm .or. Model%cpllnd) then !--- instantaneous quantities allocate (Coupling%tsfci_cpl (IM)) Coupling%tsfci_cpl = clear_val @@ -2554,6 +2555,36 @@ subroutine coupling_create (Coupling, IM, Model) ! Coupling%zorlwav_cpl = clear_val ! endif + if (Model%cplflx .or. Model%cpllnd) then + allocate (Coupling%dlwsfc_cpl (IM)) + allocate (Coupling%dswsfc_cpl (IM)) + allocate (Coupling%psurfi_cpl (IM)) + allocate (Coupling%nswsfc_cpl (IM)) + allocate (Coupling%nswsfci_cpl (IM)) + allocate (Coupling%nnirbmi_cpl (IM)) + allocate (Coupling%nnirdfi_cpl (IM)) + allocate (Coupling%nvisbmi_cpl (IM)) + allocate (Coupling%nvisdfi_cpl (IM)) + allocate (Coupling%nnirbm_cpl (IM)) + allocate (Coupling%nnirdf_cpl (IM)) + allocate (Coupling%nvisbm_cpl (IM)) + allocate (Coupling%nvisdf_cpl (IM)) + + Coupling%dlwsfc_cpl = clear_val + Coupling%dswsfc_cpl = clear_val + Coupling%psurfi_cpl = clear_val + Coupling%nswsfc_cpl = clear_val + Coupling%nswsfci_cpl = clear_val + Coupling%nnirbmi_cpl = clear_val + Coupling%nnirdfi_cpl = clear_val + Coupling%nvisbmi_cpl = clear_val + Coupling%nvisdfi_cpl = clear_val + Coupling%nnirbm_cpl = clear_val + Coupling%nnirdf_cpl = clear_val + Coupling%nvisbm_cpl = clear_val + Coupling%nvisdf_cpl = clear_val + end if + if (Model%cplflx) then !--- incoming quantities allocate (Coupling%slimskin_cpl (IM)) @@ -2608,35 +2639,21 @@ subroutine coupling_create (Coupling, IM, Model) allocate (Coupling%dvsfc_cpl (IM)) allocate (Coupling%dtsfc_cpl (IM)) allocate (Coupling%dqsfc_cpl (IM)) - allocate (Coupling%dlwsfc_cpl (IM)) - allocate (Coupling%dswsfc_cpl (IM)) allocate (Coupling%dnirbm_cpl (IM)) allocate (Coupling%dnirdf_cpl (IM)) allocate (Coupling%dvisbm_cpl (IM)) allocate (Coupling%dvisdf_cpl (IM)) allocate (Coupling%nlwsfc_cpl (IM)) - allocate (Coupling%nswsfc_cpl (IM)) - allocate (Coupling%nnirbm_cpl (IM)) - allocate (Coupling%nnirdf_cpl (IM)) - allocate (Coupling%nvisbm_cpl (IM)) - allocate (Coupling%nvisdf_cpl (IM)) Coupling%dusfc_cpl = clear_val Coupling%dvsfc_cpl = clear_val Coupling%dtsfc_cpl = clear_val Coupling%dqsfc_cpl = clear_val - Coupling%dlwsfc_cpl = clear_val - Coupling%dswsfc_cpl = clear_val Coupling%dnirbm_cpl = clear_val Coupling%dnirdf_cpl = clear_val Coupling%dvisbm_cpl = clear_val Coupling%dvisdf_cpl = clear_val Coupling%nlwsfc_cpl = clear_val - Coupling%nswsfc_cpl = clear_val - Coupling%nnirbm_cpl = clear_val - Coupling%nnirdf_cpl = clear_val - Coupling%nvisbm_cpl = clear_val - Coupling%nvisdf_cpl = clear_val !--- instantaneous quantities allocate (Coupling%dusfci_cpl (IM)) @@ -2650,14 +2667,8 @@ subroutine coupling_create (Coupling, IM, Model) allocate (Coupling%dvisbmi_cpl (IM)) allocate (Coupling%dvisdfi_cpl (IM)) allocate (Coupling%nlwsfci_cpl (IM)) - allocate (Coupling%nswsfci_cpl (IM)) - allocate (Coupling%nnirbmi_cpl (IM)) - allocate (Coupling%nnirdfi_cpl (IM)) - allocate (Coupling%nvisbmi_cpl (IM)) - allocate (Coupling%nvisdfi_cpl (IM)) allocate (Coupling%t2mi_cpl (IM)) allocate (Coupling%q2mi_cpl (IM)) - allocate (Coupling%psurfi_cpl (IM)) allocate (Coupling%oro_cpl (IM)) allocate (Coupling%slmsk_cpl (IM)) @@ -2672,14 +2683,8 @@ subroutine coupling_create (Coupling, IM, Model) Coupling%dvisbmi_cpl = clear_val Coupling%dvisdfi_cpl = clear_val Coupling%nlwsfci_cpl = clear_val - Coupling%nswsfci_cpl = clear_val - Coupling%nnirbmi_cpl = clear_val - Coupling%nnirdfi_cpl = clear_val - Coupling%nvisbmi_cpl = clear_val - Coupling%nvisdfi_cpl = clear_val Coupling%t2mi_cpl = clear_val Coupling%q2mi_cpl = clear_val - Coupling%psurfi_cpl = clear_val Coupling%oro_cpl = clear_val !< pointer to sfcprop%oro Coupling%slmsk_cpl = clear_val !< pointer to sfcprop%slmsk endif @@ -2710,17 +2715,20 @@ subroutine coupling_create (Coupling, IM, Model) if (Model%cplchm .or. Model%rrfs_smoke) then !--- outgoing instantaneous quantities allocate (Coupling%ushfsfci (IM)) - !--- accumulated convective rainfall - allocate (Coupling%rainc_cpl (IM)) ! -- instantaneous 3d fluxes of nonconvective ice and liquid precipitations allocate (Coupling%pfi_lsan (IM,Model%levs)) allocate (Coupling%pfl_lsan (IM,Model%levs)) - Coupling%rainc_cpl = clear_val Coupling%ushfsfci = clear_val Coupling%pfi_lsan = clear_val Coupling%pfl_lsan = clear_val endif + if (Model%cplchm .or. Model%rrfs_smoke .or. Model%cplflx .or. Model%cpllnd) then + !--- accumulated convective rainfall + allocate (Coupling%rainc_cpl (IM)) + Coupling%rainc_cpl = clear_val + end if + ! -- additional coupling options for air quality if (Model%cplaqm .and. .not.Model%cplflx) then !--- outgoing instantaneous quantities @@ -2929,6 +2937,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: cplwav2atm = .false. !< default no cplwav2atm coupling logical :: cplaqm = .false. !< default no cplaqm collection logical :: cplchm = .false. !< default no cplchm collection + logical :: cpllnd = .false. !< default no cpllnd collection logical :: rrfs_smoke = .false. !< default no rrfs_smoke collection integer :: dust_smoke_rrtmg_band_number = 10!< band number to affect in rrtmg_pre from smoke and dust logical :: use_cice_alb = .false. !< default no cice albedo @@ -3455,7 +3464,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & thermodyn_id, sfcpress_id, & !--- coupling parameters cplflx, cplice, cplocn2atm, cplwav, cplwav2atm, cplaqm, & - cplchm, cpl_imp_mrg, cpl_imp_dbg, rrfs_smoke, & + cplchm, cpllnd, cpl_imp_mrg, cpl_imp_dbg, rrfs_smoke, & use_cice_alb, dust_smoke_rrtmg_band_number, & #ifdef IDEA_PHYS lsidea, weimer_model, f107_kp_size, f107_kp_interval, & @@ -3777,6 +3786,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%cplwav2atm = cplwav2atm Model%cplaqm = cplaqm Model%cplchm = cplchm .or. cplaqm + Model%cpllnd = cpllnd Model%use_cice_alb = use_cice_alb Model%cpl_imp_mrg = cpl_imp_mrg Model%cpl_imp_dbg = cpl_imp_dbg @@ -5703,6 +5713,7 @@ subroutine control_print(Model) print *, ' cplwav2atm : ', Model%cplwav2atm print *, ' cplaqm : ', Model%cplaqm print *, ' cplchm : ', Model%cplchm + print *, ' cpllnd : ', Model%cpllnd print *, ' rrfs_smoke : ', Model%rrfs_smoke print *, ' use_cice_alb : ', Model%use_cice_alb print *, ' cpl_imp_mrg : ', Model%cpl_imp_mrg @@ -6324,7 +6335,7 @@ subroutine tbd_create (Tbd, IM, Model) Tbd%acvb = clear_val Tbd%acvt = clear_val - if (Model%cplflx .or. Model%cplchm) then + if (Model%cplflx .or. Model%cplchm .or. Model%cpllnd) then allocate (Tbd%drain_cpl (IM)) allocate (Tbd%dsnow_cpl (IM)) Tbd%drain_cpl = clear_val diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index ad170bc01..503263dbe 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -1969,7 +1969,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling .or. flag_for_stochastic_physics_perturbations .or. flag_for_chemistry_coupling .or. flag_for_global_cellular_automata) + active = (flag_for_surface_flux_coupling .or. flag_for_stochastic_physics_perturbations .or. flag_for_chemistry_coupling .or. flag_for_global_cellular_automata .or. flag_for_land_coupling) [rainc_cpl] standard_name = cumulative_lwe_thickness_of_convective_precipitation_amount_for_coupling long_name = total convective precipitation @@ -1977,7 +1977,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_chemistry_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_chemistry_coupling .or. flag_for_land_coupling) [snow_cpl] standard_name = cumulative_lwe_thickness_of_snow_amount_for_coupling long_name = total snow precipitation @@ -1985,7 +1985,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling .or. flag_for_stochastic_physics_perturbations .or. flag_for_chemistry_coupling .or. flag_for_global_cellular_automata) + active = (flag_for_surface_flux_coupling .or. flag_for_stochastic_physics_perturbations .or. flag_for_chemistry_coupling .or. flag_for_global_cellular_automata .or. flag_for_land_coupling) [dusfc_cpl] standard_name = cumulative_surface_x_momentum_flux_for_coupling_multiplied_by_timestep long_name = cumulative sfc x momentum flux multiplied by timestep @@ -2025,7 +2025,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [dswsfc_cpl] standard_name = cumulative_surface_downwelling_shortwave_flux_for_coupling_multiplied_by_timestep long_name = cumulative sfc downward sw flux multiplied by timestep @@ -2033,7 +2033,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [dnirbm_cpl] standard_name = cumulative_surface_downwelling_direct_nir_shortwave_flux_for_coupling_multiplied_by_timestep long_name = cumulative sfc nir beam downward sw flux multiplied by timestep @@ -2081,7 +2081,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nnirbm_cpl] standard_name = cumulative_surface_net_downwelling_direct_nir_shortwave_flux_for_coupling_multiplied_by_timestep long_name = cumulative net nir beam downward sw flux multiplied by timestep @@ -2089,7 +2089,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nnirdf_cpl] standard_name = cumulative_surface_net_downwellling_diffuse_nir_shortwave_flux_for_coupling_multiplied_by_timestep long_name = cumulative net nir diff downward sw flux multiplied by timestep @@ -2097,7 +2097,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nvisbm_cpl] standard_name = cumulative_surface_net_downwelling_direct_uv_and_vis_shortwave_flux_for_coupling_multiplied_by_timestep long_name = cumulative net uv+vis beam downward sw rad flux multiplied by timestep @@ -2105,7 +2105,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nvisdf_cpl] standard_name = cumulative_surface_net_downwelling_diffuse_uv_and_vis_shortwave_flux_for_coupling_multiplied_by_timestep long_name = cumulative net uv+vis diff downward sw rad flux multiplied by timestep @@ -2113,7 +2113,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [dusfci_cpl] standard_name = surface_x_momentum_flux_for_coupling long_name = instantaneous sfc x momentum flux @@ -2209,7 +2209,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling .or. flag_for_air_quality_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_air_quality_coupling .or. flag_for_land_coupling) [nnirbmi_cpl] standard_name = surface_net_downwelling_direct_nir_shortwave_flux_for_coupling long_name = instantaneous net nir beam sfc downward sw flux @@ -2217,7 +2217,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nnirdfi_cpl] standard_name = surface_net_downwelling_diffuse_nir_shortwave_flux_for_coupling long_name = instantaneous net nir diff sfc downward sw flux @@ -2225,7 +2225,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nvisbmi_cpl] standard_name = surface_net_downwelling_direct_uv_and_vis_shortwave_flux_for_coupling long_name = instantaneous net uv+vis beam downward sw flux @@ -2233,7 +2233,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [nvisdfi_cpl] standard_name = surface_net_downwelling_diffuse_uv_and_vis_shortwave_flux_for_coupling long_name = instantaneous net uv+vis diff downward sw flux @@ -2241,7 +2241,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_land_coupling) [t2mi_cpl] standard_name = temperature_at_2m_for_coupling long_name = instantaneous T2m @@ -2289,7 +2289,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling .or. flag_for_air_quality_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_air_quality_coupling .or. flag_for_land_coupling) [ulwsfcin_cpl] standard_name = surface_upwelling_longwave_flux_from_coupled_process long_name = surface upwelling LW flux for coupling @@ -3004,6 +3004,12 @@ units = flag dimensions = () type = logical +[cpllnd] + standard_name = flag_for_land_coupling + long_name = flag controlling cpllnd collection (default off) + units = flag + dimensions = () + type = logical [rrfs_smoke] standard_name = do_smoke_coupling long_name = flag controlling rrfs_smoke collection (default off) @@ -6768,7 +6774,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling .or. flag_for_chemistry_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_chemistry_coupling .or. flag_for_land_coupling) [dsnow_cpl] standard_name = tendency_of_lwe_thickness_of_snowfall_amount_on_dynamics_timestep_for_coupling long_name = change in show_cpl (coupling_type) @@ -6776,7 +6782,7 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys - active = (flag_for_surface_flux_coupling .or. flag_for_chemistry_coupling) + active = (flag_for_surface_flux_coupling .or. flag_for_chemistry_coupling .or. flag_for_land_coupling) [phy_fctd] standard_name = atmosphere_updraft_convective_mass_flux_at_cloud_base_by_cloud_type long_name = cloud base mass flux for CS convection diff --git a/ccpp/physics b/ccpp/physics index d93ce1acd..8c88f68d4 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit d93ce1acd7bae45d0752a4543fcfd706b2b6b7fe +Subproject commit 8c88f68d4cb491c3606a57298197b7e6480cce63 diff --git a/cpl/module_block_data.F90 b/cpl/module_block_data.F90 index ff91f6633..1149bd252 100644 --- a/cpl/module_block_data.F90 +++ b/cpl/module_block_data.F90 @@ -17,12 +17,14 @@ module module_block_data module procedure block_copy_2d_r8_to_3d_r8 module procedure block_copy_3d_r8_to_3d_r8 module procedure block_copy_1dslice_r8_to_2d_r8 + module procedure block_copy_1dslice2_r8_to_2d_r8 module procedure block_copy_3dslice_r8_to_3d_r8 module procedure block_copy_1d_r4_to_2d_r8 module procedure block_copy_2d_r4_to_2d_r8 module procedure block_copy_2d_r4_to_3d_r8 module procedure block_copy_3d_r4_to_3d_r8 module procedure block_copy_1dslice_r4_to_2d_r8 + module procedure block_copy_1dslice2_r4_to_2d_r8 module procedure block_copy_3dslice_r4_to_3d_r8 end interface block_data_copy @@ -35,9 +37,11 @@ module module_block_data module procedure block_copy_or_fill_1d_r8_to_2d_r8 module procedure block_copy_or_fill_2d_r8_to_3d_r8 module procedure block_copy_or_fill_1dslice_r8_to_2d_r8 + module procedure block_copy_or_fill_1dslice2_r8_to_2d_r8 module procedure block_copy_or_fill_1d_r4_to_2d_r8 module procedure block_copy_or_fill_2d_r4_to_3d_r8 module procedure block_copy_or_fill_1dslice_r4_to_2d_r8 + module procedure block_copy_or_fill_1dslice2_r4_to_2d_r8 end interface block_data_copy_or_fill interface block_data_combine_fractions @@ -178,6 +182,48 @@ subroutine block_copy_1dslice_r8_to_2d_r8(destin_ptr, source_ptr, slice, block, end subroutine block_copy_1dslice_r8_to_2d_r8 + ! -- copy: 1D slice to 2D + + subroutine block_copy_1dslice2_r8_to_2d_r8(destin_ptr, source_ptr, slice1, slice2, block, block_index, scale_factor, rc) + + ! -- arguments + real(ESMF_KIND_R8), pointer :: destin_ptr(:,:) + real(kind=8), pointer :: source_ptr(:,:,:) + integer, intent(in) :: slice1 + integer, intent(in) :: slice2 + type (block_control_type), intent(in) :: block + integer, intent(in) :: block_index + real(kind=8), optional, intent(in) :: scale_factor + integer, optional, intent(out) :: rc + + ! -- local variables + integer :: localrc + integer :: i, ib, ix, j, jb + real(kind=8) :: factor + + ! -- begin + localrc = ESMF_RC_PTR_NOTALLOC + if (associated(destin_ptr) .and. associated(source_ptr)) then + localrc = ESMF_RC_VAL_OUTOFRANGE + if (slice1 > 0 .and. slice1 <= size(source_ptr, dim=2) .and. slice2 > 0 .and. slice2 <= size(source_ptr, dim=3)) then + factor = 1._8 + if (present(scale_factor)) factor = scale_factor +!$omp parallel do private(ix,ib,jb,i,j) + do ix = 1, block%blksz(block_index) + ib = block%index(block_index)%ii(ix) + jb = block%index(block_index)%jj(ix) + i = ib - block%isc + 1 + j = jb - block%jsc + 1 + destin_ptr(i,j) = factor * source_ptr(ix,slice1,slice2) + enddo + localrc = ESMF_SUCCESS + end if + end if + + if (present(rc)) rc = localrc + + end subroutine block_copy_1dslice2_r8_to_2d_r8 + ! -- copy: 2D to 3D subroutine block_copy_2d_r8_to_3d_r8(destin_ptr, source_ptr, block, block_index, scale_factor, rc) @@ -568,6 +614,33 @@ subroutine block_copy_or_fill_1dslice_r8_to_2d_r8(destin_ptr, source_ptr, slice, end subroutine block_copy_or_fill_1dslice_r8_to_2d_r8 + ! -- copy/fill: 1D slice to 2D + + subroutine block_copy_or_fill_1dslice2_r8_to_2d_r8(destin_ptr, source_ptr, slice1, slice2, fill_value, block, block_index, rc) + + ! -- arguments + real(ESMF_KIND_R8), pointer :: destin_ptr(:,:) + real(kind=8), pointer :: source_ptr(:,:,:) + integer, intent(in) :: slice1 + integer, intent(in) :: slice2 + real(ESMF_KIND_R8), intent(in) :: fill_value + type (block_control_type), intent(in) :: block + integer, intent(in) :: block_index + integer, optional, intent(out) :: rc + + ! -- begin + if (present(rc)) rc = ESMF_RC_PTR_NOTALLOC + + if (associated(destin_ptr)) then + if (associated(source_ptr)) then + call block_copy_1dslice2_r8_to_2d_r8(destin_ptr, source_ptr, slice1, slice2, block, block_index, rc=rc) + else + call block_fill_2d_r8(destin_ptr, fill_value, block, block_index, rc=rc) + end if + end if + + end subroutine block_copy_or_fill_1dslice2_r8_to_2d_r8 + ! -- copy/fill: 2D to 3D subroutine block_copy_or_fill_2d_r8_to_3d_r8(destin_ptr, source_ptr, fill_value, block, block_index, rc) @@ -712,6 +785,48 @@ subroutine block_copy_1dslice_r4_to_2d_r8(destin_ptr, source_ptr, slice, block, end subroutine block_copy_1dslice_r4_to_2d_r8 + ! -- copy: 1D slice to 2D + + subroutine block_copy_1dslice2_r4_to_2d_r8(destin_ptr, source_ptr, slice1, slice2, block, block_index, scale_factor, rc) + + ! -- arguments + real(ESMF_KIND_R8), pointer :: destin_ptr(:,:) + real(kind=4), pointer :: source_ptr(:,:,:) + integer, intent(in) :: slice1 + integer, intent(in) :: slice2 + type (block_control_type), intent(in) :: block + integer, intent(in) :: block_index + real(kind=4), optional, intent(in) :: scale_factor + integer, optional, intent(out) :: rc + + ! -- local variables + integer :: localrc + integer :: i, ib, ix, j, jb + real(kind=4) :: factor + + ! -- begin + localrc = ESMF_RC_PTR_NOTALLOC + if (associated(destin_ptr) .and. associated(source_ptr)) then + localrc = ESMF_RC_VAL_OUTOFRANGE + if (slice1 > 0 .and. slice1 <= size(source_ptr, dim=2) .and. slice2 > 0 .and. slice2 <= size(source_ptr, dim=3)) then + factor = 1._4 + if (present(scale_factor)) factor = scale_factor +!$omp parallel do private(ix,ib,jb,i,j) + do ix = 1, block%blksz(block_index) + ib = block%index(block_index)%ii(ix) + jb = block%index(block_index)%jj(ix) + i = ib - block%isc + 1 + j = jb - block%jsc + 1 + destin_ptr(i,j) = factor * source_ptr(ix,slice1,slice2) + enddo + localrc = ESMF_SUCCESS + end if + end if + + if (present(rc)) rc = localrc + + end subroutine block_copy_1dslice2_r4_to_2d_r8 + ! -- copy: 2D to 3D subroutine block_copy_2d_r4_to_3d_r8(destin_ptr, source_ptr, block, block_index, scale_factor, rc) @@ -1034,6 +1149,33 @@ subroutine block_copy_or_fill_1dslice_r4_to_2d_r8(destin_ptr, source_ptr, slice, end subroutine block_copy_or_fill_1dslice_r4_to_2d_r8 + ! -- copy/fill: 1D slice to 2D + + subroutine block_copy_or_fill_1dslice2_r4_to_2d_r8(destin_ptr, source_ptr, slice1, slice2, fill_value, block, block_index, rc) + + ! -- arguments + real(ESMF_KIND_R8), pointer :: destin_ptr(:,:) + real(kind=4), pointer :: source_ptr(:,:,:) + integer, intent(in) :: slice1 + integer, intent(in) :: slice2 + real(ESMF_KIND_R8), intent(in) :: fill_value + type (block_control_type), intent(in) :: block + integer, intent(in) :: block_index + integer, optional, intent(out) :: rc + + ! -- begin + if (present(rc)) rc = ESMF_RC_PTR_NOTALLOC + + if (associated(destin_ptr)) then + if (associated(source_ptr)) then + call block_copy_1dslice2_r4_to_2d_r8(destin_ptr, source_ptr, slice1, slice2, block, block_index, rc=rc) + else + call block_fill_2d_r8(destin_ptr, fill_value, block, block_index, rc=rc) + end if + end if + + end subroutine block_copy_or_fill_1dslice2_r4_to_2d_r8 + ! -- copy/fill: 2D to 3D subroutine block_copy_or_fill_2d_r4_to_3d_r8(destin_ptr, source_ptr, fill_value, block, block_index, rc) diff --git a/cpl/module_cplfields.F90 b/cpl/module_cplfields.F90 index 48c430eaa..56eb372ad 100644 --- a/cpl/module_cplfields.F90 +++ b/cpl/module_cplfields.F90 @@ -26,7 +26,7 @@ module module_cplfields ! l : model levels (3D) ! s : surface (2D) ! t : tracers (4D) - integer, public, parameter :: NexportFields = 111 + integer, public, parameter :: NexportFields = 119 type(ESMF_Field), target, public :: exportFields(NexportFields) type(FieldInfo), dimension(NexportFields), public, parameter :: exportFieldsInfo = [ & @@ -116,6 +116,14 @@ module module_cplfields FieldInfo("leaf_area_index ", "s"), & FieldInfo("temperature_of_soil_layer ", "g"), & FieldInfo("height ", "s"), & + FieldInfo("inst_zonal_wind_height_lowest_from_phys ", "s"), & + FieldInfo("inst_merid_wind_height_lowest_from_phys ", "s"), & + FieldInfo("inst_pres_height_lowest_from_phys ", "s"), & + FieldInfo("inst_spec_humid_height_lowest_from_phys ", "s"), & + FieldInfo("mean_prec_rate_conv ", "s"), & + FieldInfo("inst_temp_height_lowest_from_phys ", "s"), & + FieldInfo("inst_exner_function_height_lowest ", "s"), & + FieldInfo("surface_friction_velocity ", "s"), & ! For JEDI From d6f5ccf898477a783e9671d857859d0e221d5633 Mon Sep 17 00:00:00 2001 From: ChunxiZhang-NOAA <49283036+ChunxiZhang-NOAA@users.noreply.github.com> Date: Tue, 1 Nov 2022 10:57:15 -0400 Subject: [PATCH 05/13] Add a new SDF named FV3_WoFS_v0 for SRW_v2.1 release (#594) * Add a new SDF named FV3_WoFS_v0 for SRW_v2.1 release * Minor bug fix to add variable nf_albd in the host model data structure (CCPP_typedefs.F90) --- ccpp/data/CCPP_typedefs.F90 | 2 + ccpp/data/CCPP_typedefs.meta | 6 +++ ccpp/physics | 2 +- ccpp/suites/suite_FV3_WoFS_v0.xml | 80 +++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 ccpp/suites/suite_FV3_WoFS_v0.xml diff --git a/ccpp/data/CCPP_typedefs.F90 b/ccpp/data/CCPP_typedefs.F90 index 694e27211..c8f402b65 100644 --- a/ccpp/data/CCPP_typedefs.F90 +++ b/ccpp/data/CCPP_typedefs.F90 @@ -222,6 +222,7 @@ module CCPP_typedefs integer :: nday !< integer :: nf_aelw !< integer :: nf_aesw !< + integer :: nf_albd !< integer :: nn !< integer :: nsamftrac !< integer :: nscav !< @@ -988,6 +989,7 @@ subroutine gfs_interstitial_create (Interstitial, IM, Model) Interstitial%nbdsw = NBDSW Interstitial%nf_aelw = NF_AELW Interstitial%nf_aesw = NF_AESW + Interstitial%nf_albd = NF_ALBD Interstitial%nspc1 = NSPC1 if (Model%oz_phys .or. Model%oz_phys_2015) then Interstitial%oz_coeffp5 = oz_coeff+5 diff --git a/ccpp/data/CCPP_typedefs.meta b/ccpp/data/CCPP_typedefs.meta index fcdaa0e8a..d9eaba7ca 100644 --- a/ccpp/data/CCPP_typedefs.meta +++ b/ccpp/data/CCPP_typedefs.meta @@ -1460,6 +1460,12 @@ units = count dimensions = () type = integer +[nf_albd] + standard_name = number_of_components_for_surface_albedo + long_name = number of IR/VIS/UV compinents for surface albedo + units = count + dimensions = () + type = integer [nn] standard_name = number_of_tracers_for_convective_transport long_name = number of tracers for convective transport diff --git a/ccpp/physics b/ccpp/physics index 8c88f68d4..aa7bff5d0 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 8c88f68d4cb491c3606a57298197b7e6480cce63 +Subproject commit aa7bff5d0da9ab02938aba373088df6df784e965 diff --git a/ccpp/suites/suite_FV3_WoFS_v0.xml b/ccpp/suites/suite_FV3_WoFS_v0.xml new file mode 100644 index 000000000..1a34ba1a1 --- /dev/null +++ b/ccpp/suites/suite_FV3_WoFS_v0.xml @@ -0,0 +1,80 @@ + + + + + + + GFS_time_vary_pre + GFS_rrtmg_setup + GFS_rad_time_vary + GFS_phys_time_vary + + + + + GFS_suite_interstitial_rad_reset + sgscloud_radpre + GFS_rrtmg_pre + GFS_radiation_surface + rad_sw_pre + rrtmg_sw + rrtmg_sw_post + rrtmg_lw_pre + rrtmg_lw + sgscloud_radpost + rrtmg_lw_post + GFS_rrtmg_post + + + + + GFS_suite_interstitial_phys_reset + GFS_suite_stateout_reset + get_prs_fv3 + GFS_suite_interstitial_1 + GFS_surface_generic_pre + GFS_surface_composites_pre + dcyc2t3 + GFS_surface_composites_inter + GFS_suite_interstitial_2 + + + + mynnsfc_wrapper + GFS_surface_loop_control_part1 + sfc_nst_pre + sfc_nst + sfc_nst_post + lsm_noah + sfc_sice + GFS_surface_loop_control_part2 + + + + GFS_surface_composites_post + sfc_diag + sfc_diag_post + GFS_surface_generic_post + mynnedmf_wrapper + GFS_GWD_generic_pre + cires_ugwp + cires_ugwp_post + GFS_GWD_generic_post + GFS_suite_stateout_update + ozphys_2015 + h2ophys + get_phi_fv3 + GFS_MP_generic_pre + mp_nssl + GFS_MP_generic_post + maximum_hourly_diagnostics + phys_tend + + + + + GFS_stochastics + + + + From 045de8301b334bba02646b21b06ef20c052a4ff2 Mon Sep 17 00:00:00 2001 From: Brian Curtis <64433609+BrianCurtis-NOAA@users.noreply.github.com> Date: Thu, 3 Nov 2022 10:31:54 -0400 Subject: [PATCH 06/13] Enable AOD diagnostics when coupled with AQM. (#593) * Enable AOD diagnostics when coupled with AQM Co-authored-by: Raffaele Montuoro --- ccpp/driver/GFS_diagnostics.F90 | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index 206dc01d0..9e7cbf49b 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -929,6 +929,22 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%fluxr(:,39) enddo +!--- air quality diagnostics --- + if (Model%cplaqm) then + if (associated(IntDiag(1)%aod)) then + idx = idx + 1 + ExtDiag(idx)%axes = 2 + ExtDiag(idx)%name = 'aod' + ExtDiag(idx)%desc = 'total aerosol optical depth at 550 nm' + ExtDiag(idx)%unit = 'numerical' + ExtDiag(idx)%mod_name = 'gfs_phys' + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var2 => IntDiag(nb)%aod + enddo + endif + endif + ! ! !--- accumulated diagnostics --- From 3c8c247775782b9c7974ebcb4d1f8ca75a117663 Mon Sep 17 00:00:00 2001 From: ChunxiZhang-NOAA <49283036+ChunxiZhang-NOAA@users.noreply.github.com> Date: Tue, 8 Nov 2022 11:10:01 -0500 Subject: [PATCH 07/13] Improve radiative fluxes and cloud cover in ccpp/physics for HR1 (#599) * Improve radiative fluxes and cloud cover in ccpp/physics for HR1 --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index aa7bff5d0..f1b918295 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit aa7bff5d0da9ab02938aba373088df6df784e965 +Subproject commit f1b9182951d8c1fd41f62c0b55af9fcfa76ba40f From 43eb02c82492a02e3109c23505b31da0a1696d29 Mon Sep 17 00:00:00 2001 From: ChunxiZhang-NOAA <49283036+ChunxiZhang-NOAA@users.noreply.github.com> Date: Mon, 14 Nov 2022 09:52:53 -0500 Subject: [PATCH 08/13] Adjust GFS diagnostic Aerosol Optical Depth (AOD) output to the exact 550nm (#597) * Adjust GFS diagnostic ADO output to the exact 550nm in ccpp/physics * Modify a few lines of code in ccpp/physics/physics/radiation_aerosols.f to make them properly indented --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index f1b918295..8c9d446d5 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit f1b9182951d8c1fd41f62c0b55af9fcfa76ba40f +Subproject commit 8c9d446d5f294e3eb38f5e91a27450b887e468d9 From f7651747cc61b2d7faa7eca3e1b9a1cdbfca9653 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Mon, 21 Nov 2022 09:59:59 -0700 Subject: [PATCH 09/13] Switch ccpp-physics submodule (#603) * Switch ccpp-physics submodue. * ccpp #17: git action ci yaml update. --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 8c9d446d5..82062de8c 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 8c9d446d5f294e3eb38f5e91a27450b887e468d9 +Subproject commit 82062de8cabe3e2f6d255f54a1fcce751aa8b7b6 From 086f70de94b9b0d063835cc7727c1d26721e08f7 Mon Sep 17 00:00:00 2001 From: dustinswales Date: Tue, 22 Nov 2022 09:33:16 -0700 Subject: [PATCH 10/13] Add convective cloud to radiation, Thompson MP only. (#589) * Add convective cloud to radiation, Thompson MP only. --- ccpp/data/GFS_typedefs.F90 | 14 ++++++++++++-- ccpp/data/GFS_typedefs.meta | 6 ++++++ ccpp/physics | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index f217d1427..41741d236 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -787,8 +787,9 @@ module GFS_typedefs real(kind_phys) :: lfnc_k !< Logistic function transition depth (Pa) real(kind_phys) :: lfnc_p0 !< Logistic function transition level (Pa) logical :: doGP_lwscat !< If true, include scattering in longwave cloud-optics, only compatible w/ GP cloud-optics - logical :: doGP_sgs_cnv !< If true, include SubGridScale convective cloud in RRTMGP - logical :: doGP_sgs_mynn !< If true, include SubGridScale MYNN-EDMF cloud in RRTMGP + logical :: doGP_sgs_cnv !< If true, include explicit SubGridScale convective cloud in RRTMGP + logical :: doGP_sgs_mynn !< If true, include explicit SubGridScale MYNN-EDMF cloud in RRTMGP + logical :: doGP_smearclds !< If true, include implicit SubGridScale clouds in RRTMGP real(kind_phys) :: minGPpres !< Minimum pressure allowed in RRTMGP. real(kind_phys) :: maxGPpres !< Maximum pressure allowed in RRTMGP. real(kind_phys) :: minGPtemp !< Minimum temperature allowed in RRTMGP. @@ -3027,6 +3028,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: doGP_lwscat = .false. !< If true, include scattering in longwave cloud-optics, only compatible w/ GP cloud-optics logical :: doGP_sgs_cnv = .false. !< If true, include SubGridScale convective cloud in RRTMGP logical :: doGP_sgs_mynn = .false. !< If true, include SubGridScale MYNN-EDMF cloud in RRTMGP + logical :: doGP_smearclds = .true. !< If true, include implicit SubGridScale clouds in RRTMGP !--- Z-C microphysical parameters integer :: imp_physics = 99 !< choice of cloud scheme real(kind=kind_phys) :: psautco(2) = (/6.0d-4,3.0d-4/) !< [in] auto conversion coeff from ice to snow @@ -3947,6 +3949,13 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & write(0,*) "Logic error, RRTMGP flag doGP_sgs_mynn only works with do_mynnedmf=.true." stop endif + if (Model%doGP_sgs_cnv .or. Model%doGP_sgs_mynn) then + write(0,*) "RRTMGP explicit cloud scheme being used." + Model%doGP_smearclds = .false. + else + write(0,*) "RRTMGP implicit cloud scheme being used." + endif + if (Model%doGP_cldoptics_PADE .and. Model%doGP_cldoptics_LUT) then write(0,*) "Logic error, Both RRTMGP cloud-optics options cannot be selected. " stop @@ -5809,6 +5818,7 @@ subroutine control_print(Model) print *, ' doGP_lwscat : ', Model%doGP_lwscat print *, ' doGP_sgs_cnv : ', Model%doGP_sgs_cnv print *, ' doGP_sgs_mynn : ', Model%doGP_sgs_cnv + print *, ' doGP_smearclds : ', Model%doGP_smearclds print *, ' iovr_convcld : ', Model%iovr_convcld endif print *, ' ' diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index 503263dbe..42d5ef29e 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -3445,6 +3445,12 @@ units = flag dimensions = () type = logical +[doGP_smearclds] + standard_name = flag_for_implicit_sgs_cloud_in_RRTMGP + long_name = logical flag to impicit SGS cloud in RRTMGP + units = flag + dimensions = () + type = logical [iovr_convcld] standard_name = flag_for_convective_cloud_overlap_method_for_radiation long_name = flag for convective cloud overlap method diff --git a/ccpp/physics b/ccpp/physics index 82062de8c..84d89f9d8 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 82062de8cabe3e2f6d255f54a1fcce751aa8b7b6 +Subproject commit 84d89f9d8e7930544f450ffc3d5e26f238ed8208 From b88f2c8666f72fb9e2bc53ad7853e84211d35392 Mon Sep 17 00:00:00 2001 From: ChunxiZhang-NOAA <49283036+ChunxiZhang-NOAA@users.noreply.github.com> Date: Tue, 29 Nov 2022 10:23:05 -0500 Subject: [PATCH 11/13] Bug fix for the NoahMP scheme (#601) * change fv3atm branch to bugfix/noahmp_hr1 and change ccpp-physics pointer --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 84d89f9d8..18d3fda36 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 84d89f9d8e7930544f450ffc3d5e26f238ed8208 +Subproject commit 18d3fda364e42606e714168dd292e59c001e771a From b36a3917e48a7df30b2abfb7ba14cbd6437c7375 Mon Sep 17 00:00:00 2001 From: ChunxiZhang-NOAA <49283036+ChunxiZhang-NOAA@users.noreply.github.com> Date: Fri, 2 Dec 2022 09:47:59 -0500 Subject: [PATCH 12/13] Bug fix for the NoahMP tiled t2m and q2m (#607) * Change ccpp-physics branch to fix_tq2m_diagnoahmp --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 18d3fda36..9d45cd1b5 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 18d3fda364e42606e714168dd292e59c001e771a +Subproject commit 9d45cd1b5a7700c20b0493122ed420be0e79baba From 92b0386f59163005f6cc629847a60ac0ba77201e Mon Sep 17 00:00:00 2001 From: lisa-bengtsson <54411948+lisa-bengtsson@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:00:05 -0700 Subject: [PATCH 13/13] Update Regression Test to include gfsv17 prototypes that are after prototype 8, and turn on prognostic closure (#598) * update TKE contribution from cu for progsigma in deep and shallow cu --- ccpp/physics | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ccpp/physics b/ccpp/physics index 9d45cd1b5..befc3364d 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 9d45cd1b5a7700c20b0493122ed420be0e79baba +Subproject commit befc3364d35172cc6133a5b0f883e9d2c0bac5a2