Skip to content

Commit 7494ba3

Browse files
smileMchenmgduda
authored andcommitted
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.
1 parent 447de92 commit 7494ba3

1 file changed

Lines changed: 36 additions & 20 deletions

File tree

src/core_atmosphere/physics/mpas_atmphys_driver_radiation_sw.F

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -459,9 +459,6 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i
459459
swupbc_p(i,j) = 0.0_RKIND
460460
swupt_p(i,j) = 0.0_RKIND
461461
swuptc_p(i,j) = 0.0_RKIND
462-
swddir_p(i,j) = 0.0_RKIND
463-
swddni_p(i,j) = 0.0_RKIND
464-
swddif_p(i,j) = 0.0_RKIND
465462
enddo
466463

467464
do k = kts,kte
@@ -472,21 +469,28 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i
472469
enddo
473470

474471
aer_opt = 0
475-
do n = 1,nbndsw
476-
do j = jts,jte
477-
do k = kts,kte
478-
do i = its,ite
479-
tauaer_p(i,k,j,n) = 0._RKIND
480-
ssaaer_p(i,k,j,n) = 1._RKIND
481-
asyaer_p(i,k,j,n) = 0._RKIND
482-
enddo
483-
enddo
484-
enddo
485-
enddo
486472

487473
radiation_sw_select: select case (trim(radt_sw_scheme))
488474

489475
case("rrtmg_sw")
476+
do j = jts,jte
477+
do i = its,ite
478+
swddir_p(i,j) = 0.0_RKIND
479+
swddni_p(i,j) = 0.0_RKIND
480+
swddif_p(i,j) = 0.0_RKIND
481+
enddo
482+
enddo
483+
do n = 1,nbndsw
484+
do j = jts,jte
485+
do k = kts,kte
486+
do i = its,ite
487+
tauaer_p(i,k,j,n) = 0._RKIND
488+
ssaaer_p(i,k,j,n) = 1._RKIND
489+
asyaer_p(i,k,j,n) = 0._RKIND
490+
enddo
491+
enddo
492+
enddo
493+
enddo
490494
microp_select: select case(microp_scheme)
491495
case("mp_thompson","mp_thompson_aerosols","mp_wsm6")
492496
if(config_microp_re) then
@@ -705,12 +709,15 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i
705709
end subroutine radiation_sw_from_MPAS
706710

707711
!=================================================================================================================
708-
subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
712+
subroutine radiation_sw_to_MPAS(configs,diag_physics,tend_physics,its,ite)
709713
!=================================================================================================================
710714

711715
!input arguments:
712716
type(mpas_pool_type),intent(inout):: diag_physics
713717
type(mpas_pool_type),intent(inout):: tend_physics
718+
type(mpas_pool_type),intent(in):: configs
719+
!local pointers:
720+
character(len=StrKIND),pointer:: radt_sw_scheme
714721

715722
integer,intent(in):: its,ite
716723

@@ -743,8 +750,9 @@ subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
743750
call mpas_pool_get_array(diag_physics,'swddif' ,swddif )
744751
call mpas_pool_get_array(tend_physics,'rthratensw',rthratensw)
745752

746-
do j = jts,jte
753+
call mpas_pool_get_config(configs,'config_radt_sw_scheme',radt_sw_scheme)
747754

755+
do j = jts,jte
748756
do i = its,ite
749757
coszr(i) = coszr_p(i,j)
750758
gsw(i) = gsw_p(i,j)
@@ -757,11 +765,18 @@ subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
757765
swupbc(i) = swupbc_p(i,j)
758766
swupt(i) = swupt_p(i,j)
759767
swuptc(i) = swuptc_p(i,j)
760-
swddir(i) = swddir_p(i,j)
761-
swddni(i) = swddni_p(i,j)
762-
swddif(i) = swddif_p(i,j)
763768
enddo
764769

770+
radiation_sw_select: select case (trim(radt_sw_scheme))
771+
case("rrtmg_sw")
772+
do i = its,ite
773+
swddir(i) = swddir_p(i,j)
774+
swddni(i) = swddni_p(i,j)
775+
swddif(i) = swddif_p(i,j)
776+
enddo
777+
case default
778+
end select radiation_sw_select
779+
765780
do k = kts,kte
766781
do i = its,ite
767782
rthratensw(k,i) = rthratensw_p(i,k,j)
@@ -981,7 +996,8 @@ subroutine driver_radiation_sw(itimestep,configs,mesh,state,time_lev,diag_physic
981996
end select radiation_sw_select
982997

983998
!copy local arrays to MPAS grid:
984-
call radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
999+
!mchen call radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
1000+
call radiation_sw_to_MPAS(configs,diag_physics,tend_physics,its,ite)
9851001

9861002
!call mpas_log_write('--- end subroutine driver_radiation_sw.')
9871003

0 commit comments

Comments
 (0)