diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index 4a17ac96dc..52df8051b9 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -3168,21 +3168,19 @@ 3.22D0 - 3 + 1 2 4 10 9 8 5 - 2 - 3 - 3 + 2 1 - 18 - 18 - 18 - 18 + 6 +18 + 6 +18 1 3 @@ -3198,7 +3196,6 @@ 40 1 -2 8 @@ -3219,6 +3216,8 @@ 10.e15 -1 +6.e15 +6.e15 1.25e5 1.0e6 diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml index df05d5a1ee..d773052346 100644 --- a/cime_config/testdefs/testlist_cam.xml +++ b/cime_config/testdefs/testlist_cam.xml @@ -2605,15 +2605,6 @@ - - - - - - - - - diff --git a/doc/ChangeLog b/doc/ChangeLog index 2381ecdeb7..ba0b027acb 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,6 +1,41 @@ =============================================================== +Tag name: cam6_4_??? +Originator(s): pel,cchen +Date: +One-line Summary: remove increased divergence damping in SE dycore + frontogenesis fct for FV +Github PR URL: https://github.com/ESCOMP/CAM/pull/ + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + remove increased divergence damping in SE dycore: https://github.com/ESCOMP/CAM/issues/1449 + fix bug in frontogenesis function for FV dycore: https://github.com/ESCOMP/CAM/issues/1414 + (science tested by ACOM; there will be namelist changes to re-tune QBO with the fixed frontogenesis function) + remove failing WACCM6 70 level CAM6 test with SE dycore: + SMS_Ln9.ne30pg3_ne30pg3_mg17.FW2000climo.derecho_intel.cam-outfrq9s_rrtmgp + https://github.com/ESCOMP/CAM/issues/1450 + +All SE regression tests will have answer changes +All FV WACCM regression test will have answer changes + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: defaults for se_nu_p, se_hypervis_subcycle, ... changed + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: + +=============================================================== + Tag name: cam6_4_089 Originator(s): cacraig, jedwards Date: April 28, 2025 diff --git a/src/dynamics/fv/gravity_waves_sources.F90 b/src/dynamics/fv/gravity_waves_sources.F90 index dac38be64d..f17d5a22a5 100644 --- a/src/dynamics/fv/gravity_waves_sources.F90 +++ b/src/dynamics/fv/gravity_waves_sources.F90 @@ -58,6 +58,11 @@ subroutine gws_src_fnct(grid, u3,v3,pt, q3, pe, frontgf, frontga) real(r8) :: ug(grid%ifirstxy-1:grid%ilastxy+1,plev,grid%jfirstxy-1:grid%jlastxy+1) ! U-wind ghosted real(r8) :: vg(grid%ifirstxy-1:grid%ilastxy+1,plev,grid%jfirstxy-1:grid%jlastxy+1) ! V-wind ghosted + real(r8) :: pmg(grid%ifirstxy-1:grid%ilastxy+1,plev,grid%jfirstxy-1:grid%jlastxy+1) ! mid-point pressure ghosted + real(r8) :: dptdp(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) + real(r8) :: dudp(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) + real(r8) :: dvdp(grid%ifirstxy:grid%ilastxy,plev,grid%jfirstxy:grid%jlastxy) + real(r8) :: tglat ! tangent-latitude integer :: i,j,k integer :: im, ip @@ -100,6 +105,12 @@ subroutine gws_src_fnct(grid, u3,v3,pt, q3, pe, frontgf, frontga) call ghost_array(grid, u3, ug) call ghost_array(grid, v3, vg) + call ghost_array(grid, pm, pmg) + + call compute_vertical_derivative(grid,pe,pm,ptemp,dptdp) + call compute_vertical_derivative(grid,pe,pm,u3,dudp) + call compute_vertical_derivative(grid,pe,pm,v3,dvdp) + !$omp parallel do private (i,j,k) do k=1, plev do i=beglonxy, endlonxy @@ -109,14 +120,26 @@ subroutine gws_src_fnct(grid, u3,v3,pt, q3, pe, frontgf, frontga) pty(i,k,j) = ( ptg(i,k,j+1) - ptg(i,k,j-1) ) / (2._r8 * grid%dp) pty(i,k,j) = pty(i,k,j) / aearth + ! Topography correction term + pty(i,k,j) = pty(i,k,j) - dptdp(i,k,j) * & + ( pmg(i,k,j+1) - pmg(i,k,j-1) ) / (2._r8 * grid%dp) / aearth + ! U-wind uy(i,k,j) = ( ug(i,k,j+1) - ug(i,k,j-1) ) / (2._r8 * grid%dp) uy(i,k,j) = uy(i,k,j) / aearth + ! Topography correction term + uy(i,k,j) = uy(i,k,j) - dudp(i,k,j) * & + ( pmg(i,k,j+1) - pmg(i,k,j-1) ) / (2._r8 * grid%dp) / aearth + ! V-wind vy(i,k,j) = ( vg(i,k,j+1) - vg(i,k,j-1) ) / (2._r8 * grid%dp) vy(i,k,j) = vy(i,k,j) / aearth + ! Topography correction term + vy(i,k,j) = vy(i,k,j) - dvdp(i,k,j) * & + ( pmg(i,k,j+1) - pmg(i,k,j-1) ) / (2._r8 * grid%dp) / aearth + end do end do end do @@ -135,14 +158,26 @@ subroutine gws_src_fnct(grid, u3,v3,pt, q3, pe, frontgf, frontga) ptx(i,k,j) = ( ptg(ip,k,j) - ptg(im,k,j) ) / (2._r8 * grid%dl) ptx(i,k,j) = ptx(i,k,j) / (aearth * (grid%cosp(j)+1.e-3_r8)) + ! Topography correction + ptx(i,k,j) = ptx(i,k,j) - dptdp(i,k,j) * & + ( pmg(ip,k,j) - pmg(im,k,j) )/(2._r8 * grid%dl)/(aearth * (grid%cosp(j)+1.e-3_r8)) + ! U-wind ux(i,k,j) = ( ug(ip,k,j) - ug(im,k,j) ) / (2._r8 *grid%dl) + ! Topography correction ux(i,k,j) = ux(i,k,j) / (aearth * (grid%cosp(j)+1.e-3_r8)) + ! Topography correction + ux(i,k,j) = ux(i,k,j) - dudp(i,k,j) * & + ( pmg(ip,k,j) - pmg(im,k,j) )/(2._r8 * grid%dl)/(aearth * (grid%cosp(j)+1.e-3_r8)) + ! V-wind vx(i,k,j) = ( vg(ip,k,j) - vg(im,k,j) ) / (2._r8 *grid%dl) vx(i,k,j) = vx(i,k,j) / (aearth * (grid%cosp(j)+1.e-3_r8)) + ! Topography correction + vx(i,k,j) = vx(i,k,j) - dvdp(i,k,j) * & + ( pmg(ip,k,j) - pmg(im,k,j) )/(2._r8 * grid%dl)/(aearth * (grid%cosp(j)+1.e-3_r8)) end do end do end do @@ -180,6 +215,66 @@ subroutine gws_src_fnct(grid, u3,v3,pt, q3, pe, frontgf, frontga) end subroutine gws_src_fnct + subroutine compute_vertical_derivative(grid,pint,pmid,data,ddata_dp) + !--------------------------------------------------------------------------- + use dynamics_vars, only: t_fvdycore_grid + + type (t_fvdycore_grid), intent(in) :: grid ! grid for XY decomp + real(r8), intent(in ) :: pint(grid%ifirstxy:grid%ilastxy,plevp,grid%jfirstxy:grid%jlastxy) ! interface pressure + real(r8), intent(in ) :: pmid(grid%ifirstxy:grid%ilastxy ,plev,grid%jfirstxy:grid%jlastxy) ! mid-point pressure + real(r8), intent(in ) :: data(grid%ifirstxy:grid%ilastxy ,plev,grid%jfirstxy:grid%jlastxy) + real(r8), intent(out) :: ddata_dp(grid%ifirstxy:grid%ilastxy ,plev,grid%jfirstxy:grid%jlastxy) + !--------------------------------------------------------------------------- + integer :: i,j,k + real(r8) :: pint_above ! pressure interpolated to interface above the current k mid-point + real(r8) :: pint_below ! pressure interpolated to interface below the current k mid-point + real(r8) :: dint_above ! data interpolated to interface above the current k mid-point + real(r8) :: dint_below ! data interpolated to interface below the current k mid-point + integer :: beglatxy, endlatxy, beglonxy, endlonxy + !--------------------------------------------------------------------------- + beglatxy = grid%jfirstxy + endlatxy = grid%jlastxy + beglonxy = grid%ifirstxy + endlonxy = grid%ilastxy + + !$omp parallel do private (i,j,k,pint_above,pint_below,dint_above,dint_below) + do j = beglatxy, endlatxy + do k = 2, plev-1 + do i = beglonxy, endlonxy + pint_above = pint(i,k,j) + pint_below = pint(i,k+1,j) + dint_above = ( data(i,k-1,j) + data(i,k,j) ) / 2.0_r8 + dint_below = ( data(i,k+1,j) + data(i,k,j) ) / 2.0_r8 + ddata_dp(i,k,j) = ( dint_above - dint_below ) / ( pint_above - pint_below ) + end do + end do + end do + + k = 1 + !$omp parallel do private (i,j,pint_above,pint_below,dint_above,dint_below) + do j = beglatxy, endlatxy + do i = beglonxy, endlonxy + pint_above = pmid(i,k,j) + pint_below = pint(i,k+1,j) + dint_above = data(i,k,j) + dint_below = ( data(i,k+1,j) + data(i,k,j) ) / 2.0_r8 + ddata_dp(i,k,j) = ( dint_above - dint_below ) / ( pint_above - pint_below ) + end do + end do + + k = plev + !$omp parallel do private (i,j,pint_above,pint_below,dint_above,dint_below) + do j = beglatxy, endlatxy + do i = beglonxy, endlonxy + pint_above = pint(i,k,j) + pint_below = pmid(i,k,j) + dint_above = ( data(i,k-1,j) + data(i,k,j) ) / 2.0_r8 + dint_below = data(i,k,j) + ddata_dp(i,k,j) = ( dint_above - dint_below ) / ( pint_above - pint_below ) + end do + end do + end subroutine compute_vertical_derivative + subroutine ghost_array(grid, x, xg) ! subroutine added by Francis Vitt -- 7 July 2008 diff --git a/src/dynamics/se/dycore/global_norms_mod.F90 b/src/dynamics/se/dycore/global_norms_mod.F90 index e4701c9d37..2fb4f1634c 100644 --- a/src/dynamics/se/dycore/global_norms_mod.F90 +++ b/src/dynamics/se/dycore/global_norms_mod.F90 @@ -578,7 +578,7 @@ subroutine print_cfl(elem,hybrid,nets,nete,dtnu,ptop,pmid,& call automatically_set_viscosity_coefficients(hybrid,ne,max_min_dx,min_min_dx,nu_p ,1.0_r8 ,'_p ') call automatically_set_viscosity_coefficients(hybrid,ne,max_min_dx,min_min_dx,nu ,1.0_r8,' ') - call automatically_set_viscosity_coefficients(hybrid,ne,max_min_dx,min_min_dx,nu_div,2.5_r8 ,'_div') + call automatically_set_viscosity_coefficients(hybrid,ne,max_min_dx,min_min_dx,nu_div,1.0_r8 ,'_div') if (nu_q<0) nu_q = nu_p ! necessary for consistency if (nu_t<0) nu_t = nu_p ! temperature damping is always equal to nu_p @@ -639,11 +639,7 @@ subroutine print_cfl(elem,hybrid,nets,nete,dtnu,ptop,pmid,& ! ! if user or namelist is not specifying sponge del4 settings here are best guesses (empirically determined) ! - if (top_042_090km) then - if (sponge_del4_lev <0) sponge_del4_lev = 4 - if (sponge_del4_nu_fac <0) sponge_del4_nu_fac = 3.375_r8 !max value without having to increase subcycling of div4 - if (sponge_del4_nu_div_fac<0) sponge_del4_nu_div_fac = 3.375_r8 !max value without having to increase subcycling of div4 - else if (top_090_140km.or.top_140_600km) then ! defaults for waccm(x) + if (top_090_140km.or.top_140_600km) then ! defaults for waccm(x) if (sponge_del4_lev <0) sponge_del4_lev = 20 if (sponge_del4_nu_fac <0) sponge_del4_nu_fac = 5.0_r8 if (sponge_del4_nu_div_fac<0) sponge_del4_nu_div_fac = 10.0_r8 diff --git a/src/dynamics/se/dycore/prim_state_mod.F90 b/src/dynamics/se/dycore/prim_state_mod.F90 index 3075c0e125..5f59ce3968 100644 --- a/src/dynamics/se/dycore/prim_state_mod.F90 +++ b/src/dynamics/se/dycore/prim_state_mod.F90 @@ -27,6 +27,7 @@ subroutine prim_printstate(elem, tl,hybrid,nets,nete, fvm, omega_cn) use se_dyn_time_mod, only: tstep use control_mod, only: rsplit, qsplit use perf_mod, only: t_startf, t_stopf + use hycoef, only: hyai, ps0 type (element_t), intent(inout) :: elem(:) type (TimeLevel_t), target, intent(in) :: tl type (hybrid_t), intent(in) :: hybrid @@ -62,7 +63,7 @@ subroutine prim_printstate(elem, tl,hybrid,nets,nete, fvm, omega_cn) ! moist surface pressure if (use_cslam) then do ie=nets,nete - moist_ps_fvm(:,:,ie)=SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3) + moist_ps_fvm(:,:,ie)=SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3)+hyai(1)*ps0 do q=dry_air_species_num+1,thermodynamic_active_species_num m_cnst = thermodynamic_active_species_idx(q) do k=1,nlev @@ -134,8 +135,8 @@ subroutine prim_printstate(elem, tl,hybrid,nets,nete, fvm, omega_cn) max_local(ie,5) = 0.0_r8 end if if (use_cslam) then - min_local(ie,6) = MINVAL(SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3)) - max_local(ie,6) = MAXVAL(SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3)) + min_local(ie,6) = MINVAL(SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3))+hyai(1)*ps0 + max_local(ie,6) = MAXVAL(SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3))+hyai(1)*ps0 min_local(ie,7) = MINVAL(moist_ps_fvm(:,:,ie)) max_local(ie,7) = MINVAL(moist_ps_fvm(:,:,ie)) min_local(ie,8) = MINVAL(elem(ie)%state%psdry(:,:)) @@ -207,7 +208,7 @@ subroutine prim_printstate(elem, tl,hybrid,nets,nete, fvm, omega_cn) tmp_fvm(:,:,q,ie) = SUM(fvm(ie)%c(1:nc,1:nc,:,q)*fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3) end do q=statediag_numtrac+1 - tmp_fvm(:,:,q,ie) = SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3) + tmp_fvm(:,:,q,ie) = SUM(fvm(ie)%dp_fvm(1:nc,1:nc,:),DIM=3)+hyai(1)*ps0 q=statediag_numtrac+2 tmp_fvm(:,:,q,ie) = moist_ps_fvm(:,:,ie) end do @@ -291,7 +292,9 @@ subroutine prim_printstate(elem, tl,hybrid,nets,nete, fvm, omega_cn) 101 format (A12,A23,A23,A23,A23) #ifdef waccm_debug - call prim_printstate_cslam_gamma(elem, tl,hybrid,nets,nete, fvm) + if (use_cslam) then + call prim_printstate_cslam_gamma(elem, tl,hybrid,nets,nete, fvm) + end if #endif call prim_printstate_U(elem, tl,hybrid,nets,nete, fvm) end subroutine prim_printstate