From 3c8beb7490075be110b3504a92c8b02609134d11 Mon Sep 17 00:00:00 2001 From: Michael Levy Date: Wed, 3 Apr 2024 10:48:21 -0600 Subject: [PATCH] Check abio_dic_on and base_bio_on before posting There are a few diagnostics that are only defined if base_bio_on=.true. (the river flux nutrient forcing fields), and one that is only defined if abio_dic_on=.true. (the d14c forcing); some compilers won't initialize the diagnostic ids to 0 in the control structure, so we need to either explicitly initialize all the ids or only call post_data when we know the ids have been set. This commit does the latter. --- .../solo_driver/MOM_surface_forcing.F90 | 3 + src/tracer/MARBL_tracers.F90 | 68 ++++++++++--------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/config_src/drivers/solo_driver/MOM_surface_forcing.F90 b/config_src/drivers/solo_driver/MOM_surface_forcing.F90 index c3935aeba8..414f077884 100644 --- a/config_src/drivers/solo_driver/MOM_surface_forcing.F90 +++ b/config_src/drivers/solo_driver/MOM_surface_forcing.F90 @@ -1624,6 +1624,7 @@ subroutine MARBL_forcing_from_data_override(fluxes, day, G, US, CS) nhx_dep, noy_dep, atm_co2_prog, atm_co2_diag, & afracr, swnet_afracr, ifrac_n, swpen_ifrac_n, & day, G, US, 0, 0, fluxes, CS%marbl_forcing_CSp) + deallocate ( atm_co2_prog, & atm_co2_diag, & atm_fine_dust_flux, & @@ -1634,6 +1635,8 @@ subroutine MARBL_forcing_from_data_override(fluxes, day, G, US, CS) nhx_dep, & noy_dep) + call callTree_leave("MARBL_forcing_from_data_override") + end subroutine MARBL_forcing_from_data_override diff --git a/src/tracer/MARBL_tracers.F90 b/src/tracer/MARBL_tracers.F90 index 993ea0c821..78df8b6781 100644 --- a/src/tracer/MARBL_tracers.F90 +++ b/src/tracer/MARBL_tracers.F90 @@ -1756,38 +1756,42 @@ subroutine MARBL_tracers_set_forcing(day_start, G, CS) enddo ! Post Forcing to Diagnostics - if (CS%no3_riv_flux > 0 .and. CS%tracer_inds%no3_ind > 0) & - call post_data(CS%no3_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%no3_ind), CS%diag) - if (CS%po4_riv_flux > 0 .and. CS%tracer_inds%po4_ind > 0) & - call post_data(CS%po4_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%po4_ind), CS%diag) - if (CS%don_riv_flux > 0 .and. CS%tracer_inds%don_ind > 0) & - call post_data(CS%don_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%don_ind), CS%diag) - if (CS%donr_riv_flux > 0 .and. CS%tracer_inds%donr_ind > 0) & - call post_data(CS%donr_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%donr_ind), CS%diag) - if (CS%dop_riv_flux > 0 .and. CS%tracer_inds%dop_ind > 0) & - call post_data(CS%dop_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dop_ind), CS%diag) - if (CS%dopr_riv_flux > 0 .and. CS%tracer_inds%dopr_ind > 0) & - call post_data(CS%dopr_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dopr_ind), CS%diag) - if (CS%sio3_riv_flux > 0 .and. CS%tracer_inds%sio3_ind > 0) & - call post_data(CS%sio3_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%sio3_ind), CS%diag) - if (CS%fe_riv_flux > 0 .and. CS%tracer_inds%fe_ind > 0) & - call post_data(CS%fe_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%fe_ind), CS%diag) - if (CS%doc_riv_flux > 0 .and. CS%tracer_inds%doc_ind > 0) & - call post_data(CS%doc_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%doc_ind), CS%diag) - if (CS%docr_riv_flux > 0 .and. CS%tracer_inds%docr_ind > 0) & - call post_data(CS%docr_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%docr_ind), CS%diag) - if (CS%alk_riv_flux > 0 .and. CS%tracer_inds%alk_ind > 0) & - call post_data(CS%alk_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%alk_ind), CS%diag) - if (CS%alk_alt_co2_riv_flux > 0 .and. CS%tracer_inds%alk_alt_co2_ind > 0) & - call post_data(CS%alk_alt_co2_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%alk_alt_co2_ind), & - CS%diag) - if (CS%dic_riv_flux > 0 .and. CS%tracer_inds%dic_ind > 0) & - call post_data(CS%dic_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dic_ind), CS%diag) - if (CS%dic_alt_co2_riv_flux > 0 .and. CS%tracer_inds%dic_alt_co2_ind > 0) & - call post_data(CS%dic_alt_co2_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dic_alt_co2_ind), & - CS%diag) - if (CS%d14c_id > 0) & - call post_data(CS%d14c_id, CS%d14c, CS%diag) + if (CS%read_riv_fluxes) then + if (CS%no3_riv_flux > 0 .and. CS%tracer_inds%no3_ind > 0) & + call post_data(CS%no3_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%no3_ind), CS%diag) + if (CS%po4_riv_flux > 0 .and. CS%tracer_inds%po4_ind > 0) & + call post_data(CS%po4_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%po4_ind), CS%diag) + if (CS%don_riv_flux > 0 .and. CS%tracer_inds%don_ind > 0) & + call post_data(CS%don_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%don_ind), CS%diag) + if (CS%donr_riv_flux > 0 .and. CS%tracer_inds%donr_ind > 0) & + call post_data(CS%donr_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%donr_ind), CS%diag) + if (CS%dop_riv_flux > 0 .and. CS%tracer_inds%dop_ind > 0) & + call post_data(CS%dop_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dop_ind), CS%diag) + if (CS%dopr_riv_flux > 0 .and. CS%tracer_inds%dopr_ind > 0) & + call post_data(CS%dopr_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dopr_ind), CS%diag) + if (CS%sio3_riv_flux > 0 .and. CS%tracer_inds%sio3_ind > 0) & + call post_data(CS%sio3_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%sio3_ind), CS%diag) + if (CS%fe_riv_flux > 0 .and. CS%tracer_inds%fe_ind > 0) & + call post_data(CS%fe_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%fe_ind), CS%diag) + if (CS%doc_riv_flux > 0 .and. CS%tracer_inds%doc_ind > 0) & + call post_data(CS%doc_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%doc_ind), CS%diag) + if (CS%docr_riv_flux > 0 .and. CS%tracer_inds%docr_ind > 0) & + call post_data(CS%docr_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%docr_ind), CS%diag) + if (CS%alk_riv_flux > 0 .and. CS%tracer_inds%alk_ind > 0) & + call post_data(CS%alk_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%alk_ind), CS%diag) + if (CS%alk_alt_co2_riv_flux > 0 .and. CS%tracer_inds%alk_alt_co2_ind > 0) & + call post_data(CS%alk_alt_co2_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%alk_alt_co2_ind), & + CS%diag) + if (CS%dic_riv_flux > 0 .and. CS%tracer_inds%dic_ind > 0) & + call post_data(CS%dic_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dic_ind), CS%diag) + if (CS%dic_alt_co2_riv_flux > 0 .and. CS%tracer_inds%dic_alt_co2_ind > 0) & + call post_data(CS%dic_alt_co2_riv_flux, CS%RIV_FLUXES(:,:,CS%tracer_inds%dic_alt_co2_ind), & + CS%diag) + endif + if (CS%abio_dic_on) then + if (CS%d14c_id > 0) & + call post_data(CS%d14c_id, CS%d14c, CS%diag) + endif end subroutine MARBL_tracers_set_forcing