From e66493a84b46078938de7f21d5ff04b6b7ea2645 Mon Sep 17 00:00:00 2001 From: "guoqing.ge" Date: Fri, 19 Jun 2026 15:39:01 -0600 Subject: [PATCH] Safeguard invalid scalar indices to prevent segmentation faults during LBC/IC genereation --- .../mpas_init_atm_cases.F | 76 +++++++++---------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/core_init_atmosphere/mpas_init_atm_cases.F b/src/core_init_atmosphere/mpas_init_atm_cases.F index d1c8868a5d..4a6aa699aa 100644 --- a/src/core_init_atmosphere/mpas_init_atm_cases.F +++ b/src/core_init_atmosphere/mpas_init_atm_cases.F @@ -7256,8 +7256,8 @@ subroutine init_atm_case_gfs(block, mesh, nCells, nEdges, nVertLevels, fg, state if (associated(index_smoke_fine ) ) sorted_arrQ11(:,:) = -999.0 if (associated(index_dust_fine ) ) sorted_arrQ12(:,:) = -999.0 if (associated(index_dust_coarse ) ) sorted_arrQ13(:,:) = -999.0 - scalars(index_nwfa,:,iCell) = 0._RKIND - scalars(index_nifa,:,iCell) = 0._RKIND + if (index_nwfa > 0) scalars(index_nwfa,:,iCell) = 0._RKIND + if (index_nifa > 0) scalars(index_nifa,:,iCell) = 0._RKIND scalars(index_qc,:,iCell) = 0._RKIND scalars(index_qr,:,iCell) = 0._RKIND scalars(index_qi,:,iCell) = 0._RKIND @@ -7342,9 +7342,9 @@ subroutine init_atm_case_gfs(block, mesh, nCells, nEdges, nVertLevels, fg, state do k = nVertLevels, 1, -1 target_z = 0.5 * (zgrid(k,iCell) + zgrid(k+1,iCell)) - scalars(index_nwfa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_nwfa > 0) scalars(index_nwfa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ9(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_nifa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_nifa > 0) scalars(index_nifa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ10(:,1:nfglevels_actual-1), order=1, extrap=0) scalars(index_qc,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ1(:,1:nfglevels_actual-1), order=1, extrap=0) @@ -8567,18 +8567,18 @@ subroutine init_atm_case_lbc(timestamp, block, mesh, nCells, nEdges, nVertLevels if (associated(index_smoke_fine )) sorted_arrQ11(:,:) = -999.0 if (associated(index_dust_fine )) sorted_arrQ12(:,:) = -999.0 if (associated(index_dust_coarse )) sorted_arrQ13(:,:) = -999.0 - scalars(index_nwfa,:,iCell) = 0._RKIND - scalars(index_nifa,:,iCell) = 0._RKIND - scalars(index_qc,:,iCell) = 0._RKIND - scalars(index_qr,:,iCell) = 0._RKIND - scalars(index_qi,:,iCell) = 0._RKIND - scalars(index_qs,:,iCell) = 0._RKIND - scalars(index_qg,:,iCell) = 0._RKIND - scalars(index_nc,:,iCell) = 0._RKIND - scalars(index_ni,:,iCell) = 0._RKIND - scalars(index_nr,:,iCell) = 0._RKIND - scalars(index_ns,:,iCell) = 0._RKIND - scalars(index_ng,:,iCell) = 0._RKIND + if (index_nwfa > 0) scalars(index_nwfa,:,iCell) = 0._RKIND + if (index_nifa > 0) scalars(index_nifa,:,iCell) = 0._RKIND + if (index_qc > 0) scalars(index_qc,:,iCell) = 0._RKIND + if (index_qr > 0) scalars(index_qr,:,iCell) = 0._RKIND + if (index_qi > 0) scalars(index_qi,:,iCell) = 0._RKIND + if (index_qs > 0) scalars(index_qs,:,iCell) = 0._RKIND + if (index_qg > 0) scalars(index_qg,:,iCell) = 0._RKIND + if (index_nc > 0) scalars(index_nc,:,iCell) = 0._RKIND + if (index_ni > 0) scalars(index_ni,:,iCell) = 0._RKIND + if (index_nr > 0) scalars(index_nr,:,iCell) = 0._RKIND + if (index_ns > 0) scalars(index_ns,:,iCell) = 0._RKIND + if (index_ng > 0) scalars(index_ng,:,iCell) = 0._RKIND ! Chemistry if (associated(index_smoke_fine )) then if (index_smoke_fine > 0 ) scalars(index_smoke_fine,:,iCell) = 0._RKIND @@ -8653,25 +8653,25 @@ subroutine init_atm_case_lbc(timestamp, block, mesh, nCells, nEdges, nVertLevels if (associated(index_dust_coarse )) call mpas_quicksort(nfglevels_actual, sorted_arrQ13) do k = nVertLevels, 1, -1 target_z = 0.5 * (zgrid(k,iCell) + zgrid(k+1,iCell)) - scalars(index_nwfa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_nwfa > 0) scalars(index_nwfa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ9(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_nifa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_nifa > 0) scalars(index_nifa,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ10(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_qc,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_qc > 0) scalars(index_qc,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ1(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_qr,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_qr > 0) scalars(index_qr,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ2(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_qi,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_qi > 0) scalars(index_qi,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ3(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_qs,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_qs > 0) scalars(index_qs,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ4(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_qg,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_qg > 0) scalars(index_qg,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ5(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_nc,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_nc > 0) scalars(index_nc,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ6(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_ni,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_ni > 0) scalars(index_ni,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ7(:,1:nfglevels_actual-1), order=1, extrap=0) - scalars(index_nr,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & + if (index_nr > 0) scalars(index_nr,k,iCell) = vertical_interp(target_z, nfglevels_actual-1, & sorted_arrQ8(:,1:nfglevels_actual-1), order=1, extrap=0) ! JLS if ( associated(index_smoke_fine )) then @@ -8687,18 +8687,18 @@ subroutine init_atm_case_lbc(timestamp, block, mesh, nCells, nEdges, nVertLevels sorted_arrQ13(:,1:nfglevels_actual-1), order=1, extrap=0) endif if (target_z < z_fg(1,iCell) .and. k < nVertLevels) then - scalars(index_nwfa,k,iCell) = scalars(index_nwfa,k+1,iCell) - scalars(index_nifa,k,iCell) = scalars(index_nifa,k+1,iCell) - scalars(index_qc,k,iCell) = scalars(index_qc,k+1,iCell) - scalars(index_qr,k,iCell) = scalars(index_qr,k+1,iCell) - scalars(index_qi,k,iCell) = scalars(index_qi,k+1,iCell) - scalars(index_qs,k,iCell) = scalars(index_qs,k+1,iCell) - scalars(index_qg,k,iCell) = scalars(index_qg,k+1,iCell) - scalars(index_nc,k,iCell) = scalars(index_nc,k+1,iCell) - scalars(index_ni,k,iCell) = scalars(index_ni,k+1,iCell) - scalars(index_nr,k,iCell) = scalars(index_nr,k+1,iCell) - scalars(index_ns,k,iCell) = scalars(index_ns,k+1,iCell) - scalars(index_ng,k,iCell) = scalars(index_ng,k+1,iCell) + if (index_nwfa > 0) scalars(index_nwfa,k,iCell) = scalars(index_nwfa,k+1,iCell) + if (index_nifa > 0) scalars(index_nifa,k,iCell) = scalars(index_nifa,k+1,iCell) + if (index_qc > 0) scalars(index_qc,k,iCell) = scalars(index_qc,k+1,iCell) + if (index_qr > 0) scalars(index_qr,k,iCell) = scalars(index_qr,k+1,iCell) + if (index_qi > 0) scalars(index_qi,k,iCell) = scalars(index_qi,k+1,iCell) + if (index_qs > 0) scalars(index_qs,k,iCell) = scalars(index_qs,k+1,iCell) + if (index_qg > 0) scalars(index_qg,k,iCell) = scalars(index_qg,k+1,iCell) + if (index_nc > 0) scalars(index_nc,k,iCell) = scalars(index_nc,k+1,iCell) + if (index_ni > 0) scalars(index_ni,k,iCell) = scalars(index_ni,k+1,iCell) + if (index_nr > 0) scalars(index_nr,k,iCell) = scalars(index_nr,k+1,iCell) + if (index_ns > 0) scalars(index_ns,k,iCell) = scalars(index_ns,k+1,iCell) + if (index_ng > 0) scalars(index_ng,k,iCell) = scalars(index_ng,k+1,iCell) ! Chemistry if ( associated(index_smoke_fine )) then if (index_smoke_fine > 0 ) scalars(index_smoke_fine,k,iCell) = scalars(index_smoke_fine,k+1,iCell)