Skip to content

Commit 8871bfe

Browse files
committed
Merge branch 'camrad' into release-v8.4.0 (PR #1391)
This merge fixes MPAS-A crashes when using the CAM SW radiation scheme. Several arrays are allocated only when RRTMG radiation scheme is activated. However, these arrays were being used when CAM radiation scheme is turned on, leading to segmentation fault and subsequent model crash. This merge fixes this issue by reallocating these arrays based on specific schemes. * camrad: Fix segfault when CAM radiation is activated in MPAS-Atmosphere
2 parents 3f7de93 + 8f667d5 commit 8871bfe

1 file changed

Lines changed: 37 additions & 19 deletions

File tree

src/core_atmosphere/physics/mpas_atmphys_driver_radiation_sw.F

Lines changed: 37 additions & 19 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,30 @@ 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+
484+
do n = 1,nbndsw
485+
do j = jts,jte
486+
do k = kts,kte
487+
do i = its,ite
488+
tauaer_p(i,k,j,n) = 0._RKIND
489+
ssaaer_p(i,k,j,n) = 1._RKIND
490+
asyaer_p(i,k,j,n) = 0._RKIND
491+
enddo
492+
enddo
493+
enddo
494+
enddo
495+
490496
microp_select: select case(microp_scheme)
491497
case("mp_thompson","mp_thompson_aerosols","mp_wsm6")
492498
if(config_microp_re) then
@@ -705,12 +711,15 @@ subroutine radiation_sw_from_MPAS(configs,mesh,state,time_lev,diag_physics,atm_i
705711
end subroutine radiation_sw_from_MPAS
706712

707713
!=================================================================================================================
708-
subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
714+
subroutine radiation_sw_to_MPAS(configs,diag_physics,tend_physics,its,ite)
709715
!=================================================================================================================
710716

711717
!input arguments:
712718
type(mpas_pool_type),intent(inout):: diag_physics
713719
type(mpas_pool_type),intent(inout):: tend_physics
720+
type(mpas_pool_type),intent(in):: configs
721+
!local pointers:
722+
character(len=StrKIND),pointer:: radt_sw_scheme
714723

715724
integer,intent(in):: its,ite
716725

@@ -743,6 +752,8 @@ subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
743752
call mpas_pool_get_array(diag_physics,'swddif' ,swddif )
744753
call mpas_pool_get_array(tend_physics,'rthratensw',rthratensw)
745754

755+
call mpas_pool_get_config(configs,'config_radt_sw_scheme',radt_sw_scheme)
756+
746757
do j = jts,jte
747758

748759
do i = its,ite
@@ -757,11 +768,18 @@ subroutine radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
757768
swupbc(i) = swupbc_p(i,j)
758769
swupt(i) = swupt_p(i,j)
759770
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)
763771
enddo
764772

773+
radiation_sw_select: select case (trim(radt_sw_scheme))
774+
case("rrtmg_sw")
775+
do i = its,ite
776+
swddir(i) = swddir_p(i,j)
777+
swddni(i) = swddni_p(i,j)
778+
swddif(i) = swddif_p(i,j)
779+
enddo
780+
case default
781+
end select radiation_sw_select
782+
765783
do k = kts,kte
766784
do i = its,ite
767785
rthratensw(k,i) = rthratensw_p(i,k,j)
@@ -981,7 +999,7 @@ subroutine driver_radiation_sw(itimestep,configs,mesh,state,time_lev,diag_physic
981999
end select radiation_sw_select
9821000

9831001
!copy local arrays to MPAS grid:
984-
call radiation_sw_to_MPAS(diag_physics,tend_physics,its,ite)
1002+
call radiation_sw_to_MPAS(configs,diag_physics,tend_physics,its,ite)
9851003

9861004
!call mpas_log_write('--- end subroutine driver_radiation_sw.')
9871005

0 commit comments

Comments
 (0)