From 7494ba3da1639d03a9903436c51e14276e04a854 Mon Sep 17 00:00:00 2001 From: Ming Chen Date: Mon, 5 Jan 2026 14:45:48 -0700 Subject: [PATCH] Fix segfault when CAM radiation is activated in MPAS-Atmosphere This commit fixes bugs that cause MPAS-Atmosphere to crash when the CAM radiation scheme is activated. Several arrays are allocated only when the RRTMG radiation scheme is activated. However, these arrays were being used when the CAM radiation scheme is turned on, leading to a segmentation fault. This commit fixes this issue by conditionally using these arrays only when the RRTMG scheme has been selected at runtime. --- .../mpas_atmphys_driver_radiation_sw.F | 56 ++++++++++++------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/core_atmosphere/physics/mpas_atmphys_driver_radiation_sw.F b/src/core_atmosphere/physics/mpas_atmphys_driver_radiation_sw.F index 96a4996378..e938b60ee2 100644 --- a/src/core_atmosphere/physics/mpas_atmphys_driver_radiation_sw.F +++ b/src/core_atmosphere/physics/mpas_atmphys_driver_radiation_sw.F @@ -459,9 +459,6 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i swupbc_p(i,j) = 0.0_RKIND swupt_p(i,j) = 0.0_RKIND swuptc_p(i,j) = 0.0_RKIND - swddir_p(i,j) = 0.0_RKIND - swddni_p(i,j) = 0.0_RKIND - swddif_p(i,j) = 0.0_RKIND enddo do k = kts,kte @@ -472,21 +469,28 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i enddo aer_opt = 0 - do n = 1,nbndsw - do j = jts,jte - do k = kts,kte - do i = its,ite - tauaer_p(i,k,j,n) = 0._RKIND - ssaaer_p(i,k,j,n) = 1._RKIND - asyaer_p(i,k,j,n) = 0._RKIND - enddo - enddo - enddo - enddo radiation_sw_select: select case (trim(radt_sw_scheme)) case("rrtmg_sw") + do j = jts,jte + do i = its,ite + swddir_p(i,j) = 0.0_RKIND + swddni_p(i,j) = 0.0_RKIND + swddif_p(i,j) = 0.0_RKIND + enddo + enddo + do n = 1,nbndsw + do j = jts,jte + do k = kts,kte + do i = its,ite + tauaer_p(i,k,j,n) = 0._RKIND + ssaaer_p(i,k,j,n) = 1._RKIND + asyaer_p(i,k,j,n) = 0._RKIND + enddo + enddo + enddo + enddo microp_select: select case(microp_scheme) case("mp_thompson","mp_thompson_aerosols","mp_wsm6") if(config_microp_re) then @@ -705,12 +709,15 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i end subroutine radiation_sw_from_MPAS !================================================================================================================= - subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite) + subroutine radiation_sw_to_MPAS(configs,diag_physics,tend_physics,its,ite) !================================================================================================================= !input arguments: type(mpas_pool_type),intent(inout):: diag_physics type(mpas_pool_type),intent(inout):: tend_physics + type(mpas_pool_type),intent(in):: configs +!local pointers: + character(len=StrKIND),pointer:: radt_sw_scheme integer,intent(in):: its,ite @@ -743,8 +750,9 @@ subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite) call mpas_pool_get_array(diag_physics,'swddif' ,swddif ) call mpas_pool_get_array(tend_physics,'rthratensw',rthratensw) - do j = jts,jte + call mpas_pool_get_config(configs,'config_radt_sw_scheme',radt_sw_scheme) + do j = jts,jte do i = its,ite coszr(i) = coszr_p(i,j) gsw(i) = gsw_p(i,j) @@ -757,11 +765,18 @@ subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite) swupbc(i) = swupbc_p(i,j) swupt(i) = swupt_p(i,j) swuptc(i) = swuptc_p(i,j) - swddir(i) = swddir_p(i,j) - swddni(i) = swddni_p(i,j) - swddif(i) = swddif_p(i,j) enddo + radiation_sw_select: select case (trim(radt_sw_scheme)) + case("rrtmg_sw") + do i = its,ite + swddir(i) = swddir_p(i,j) + swddni(i) = swddni_p(i,j) + swddif(i) = swddif_p(i,j) + enddo + case default + end select radiation_sw_select + do k = kts,kte do i = its,ite rthratensw(k,i) = rthratensw_p(i,k,j) @@ -981,7 +996,8 @@ subroutine driver_radiation_sw(itimestep,configs,mesh,state,time_lev,diag_physic end select radiation_sw_select !copy local arrays to MPAS grid: - call radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite) +!mchen call radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite) + call radiation_sw_to_MPAS(configs,diag_physics,tend_physics,its,ite) !call mpas_log_write('--- end subroutine driver_radiation_sw.')