diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index c81a200..1f46717 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -6,3 +6,4 @@ | andrewcoughtrie | Andrew Coughtrie | Met Office | 2026-02-10 | | jennyhickson | Jenny Hickson | Met Office | 2026-03-02 | | Pierre-siddall | Pierre Siddall | Met Office | 2026-03-13 | +| JoeCartonKelly-MO | Joseph Carton-Kelly | Met Office | 2026-04-15 | diff --git a/src/control/core/interface/ukca_config_specification_mod.F90 b/src/control/core/interface/ukca_config_specification_mod.F90 index 9213f95..6c79b4f 100644 --- a/src/control/core/interface/ukca_config_specification_mod.F90 +++ b/src/control/core/interface/ukca_config_specification_mod.F90 @@ -443,6 +443,8 @@ MODULE ukca_config_specification_mod REAL :: acc_cor_scav_scaling ! Scaling factor for scavenging ! parameters for the accumulation and ! coarse modes + REAL :: solinsol_hygro_ratio(4) ! SOL/INSOL hygroscopicity ratios + ! cp_su, cp_cl, cp_bc, cp_oc ! -- GLOMAP deposition configuration options -- LOGICAL :: l_ddepaer ! True for aerosol dry deposition @@ -996,6 +998,7 @@ SUBROUTINE init_ukca_configuration() glomap_config%l_dust_mp_ageing = .FALSE. glomap_config%dry_depvel_acc_scaling = rmdi glomap_config%acc_cor_scav_scaling = rmdi +glomap_config%solinsol_hygro_ratio(:) = rmdi ! -- GLOMAP deposition configuration options -- glomap_config%l_ddepaer = .FALSE. @@ -1122,6 +1125,7 @@ SUBROUTINE ukca_get_config( & hno3_uptake_coeff, & sigwmin, & sigma_updraught_scaling, & + solinsol_hygro_ratio, & l_cal360, & l_ukca_chem_aero, & l_ukca_mode, & @@ -1324,6 +1328,7 @@ SUBROUTINE ukca_get_config( & REAL, OPTIONAL, INTENT(OUT) :: ph_fit_coeff_b REAL, OPTIONAL, INTENT(OUT) :: ph_fit_intercept REAL, OPTIONAL, INTENT(OUT) :: hno3_uptake_coeff +REAL, OPTIONAL, INTENT(OUT) :: solinsol_hygro_ratio(4) LOGICAL, OPTIONAL, INTENT(OUT) :: l_cal360 LOGICAL, OPTIONAL, INTENT(OUT) :: l_ukca_chem_aero @@ -1748,6 +1753,8 @@ SUBROUTINE ukca_get_config( & IF (PRESENT(mode_incld_so2_rfrac)) & mode_incld_so2_rfrac = glomap_config%mode_incld_so2_rfrac IF (PRESENT(l_aero_rainout)) l_aero_rainout = glomap_config%l_aero_rainout +IF (PRESENT(solinsol_hygro_ratio)) solinsol_hygro_ratio(:) = & + glomap_config%solinsol_hygro_ratio(:) IF (PRESENT(l_cv_rainout)) l_cv_rainout = glomap_config%l_cv_rainout IF (PRESENT(i_mode_nucscav)) i_mode_nucscav = glomap_config%i_mode_nucscav IF (PRESENT(l_impc_scav)) l_impc_scav = glomap_config%l_impc_scav diff --git a/src/control/core/top_level/ukca_setup_mod.F90 b/src/control/core/top_level/ukca_setup_mod.F90 index affe86e..5c59cf9 100644 --- a/src/control/core/top_level/ukca_setup_mod.F90 +++ b/src/control/core/top_level/ukca_setup_mod.F90 @@ -129,6 +129,7 @@ SUBROUTINE ukca_setup(error_code, & ph_fit_intercept, & sigwmin, & sigma_updraught_scaling, & + solinsol_hygro_ratio, & const_rmol, & const_tfs, & const_rho_water, & @@ -461,6 +462,7 @@ SUBROUTINE ukca_setup(error_code, & REAL, OPTIONAL, INTENT(IN) :: sigwmin REAL, OPTIONAL, INTENT(IN) :: hno3_uptake_coeff REAL, OPTIONAL, INTENT(IN) :: sigma_updraught_scaling +REAL, OPTIONAL, INTENT(IN) :: solinsol_hygro_ratio(4) REAL, OPTIONAL, INTENT(IN) :: const_rmol REAL, OPTIONAL, INTENT(IN) :: const_tfs REAL, OPTIONAL, INTENT(IN) :: const_rho_water @@ -600,6 +602,8 @@ SUBROUTINE ukca_setup(error_code, & LOGICAL :: l_strat_scheme_selected ! True if a Stratospheric scheme is ! selected for chemistry +REAL :: sum_solinsol_hygro_ratio ! Sum of solinsol hygroscopicity ratios (=1) + INTEGER (KIND=jpim), PARAMETER :: zhook_in = 0 ! DrHook tracing entry INTEGER (KIND=jpim), PARAMETER :: zhook_out = 1 ! DrHook tracing exit REAL (KIND=jprb) :: zhook_handle ! DrHook tracing @@ -1313,6 +1317,9 @@ SUBROUTINE ukca_setup(error_code, & END IF + IF (PRESENT(solinsol_hygro_ratio)) & + glomap_config%solinsol_hygro_ratio(:) = solinsol_hygro_ratio(:) + ! -- GLOMAP deposition configuration options -- ! Dry deposition @@ -1721,6 +1728,22 @@ SUBROUTINE ukca_setup(error_code, & END IF +! Ensure the sum of solinsol_hygro_ratio is 1 +IF (ukca_config%l_ukca_mode .AND. & + glomap_config%i_mode_setup == 11) THEN + sum_solinsol_hygro_ratio = 0.0 + DO i = 1,4 + sum_solinsol_hygro_ratio = sum_solinsol_hygro_ratio + & + glomap_config%solinsol_hygro_ratio(i) + END DO + IF (PRESENT(solinsol_hygro_ratio)) THEN + glomap_config%solinsol_hygro_ratio(:) = & + glomap_config%solinsol_hygro_ratio(:) / sum_solinsol_hygro_ratio + ELSE + glomap_config%solinsol_hygro_ratio(:) = [1.0, 0.0, 0.0, 0.0] + END IF +END IF + ! Initialise chemical definition arrays CALL ukca_chem1_init() diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 2e90de8..88e11c9 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -156,7 +156,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & USE ukca_config_constants_mod, ONLY: rho_water, avogadro, rho_so4 USE ukca_mode_setup, ONLY: nmodes, nanion, ncation, & - cp_su, cp_oc, cp_cl, & + cp_su, cp_oc, cp_cl, cp_bc, & cp_so, cp_nh4, cp_no3, cp_nn USE yomhook, ONLY: lhook, dr_hook @@ -240,6 +240,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & REAL :: mmwrhow REAL :: f_ao REAL :: cl(nbox,-nanion:ncation) !ION CONCS (MOL/CC OF AIR) +REAL :: mdcopy(nbox,nmodes,glomap_variables_local%ncp) !Redistributes ions for solinsol REAL :: tmp1(nbox,nmodes) ! @@ -297,6 +298,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & denom(:)=0.0 ! define on all points to avoid error denom2(:)=0.0 +mdcopy(:,:,:) = md(:,:,:) ! assigning md input values to mdcopy ! Correct relative humidities to lie within the range of 10-90% corrh(:)=rh(:) @@ -348,8 +350,20 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & cl(:,i)=0.0 ! set all concentrations to zero initially END DO + ! If SOLINSOL then redistribute sulphate md into other species + IF (glomap_config%i_mode_setup == 11) THEN + mdcopy(:,imode,cp_su) = glomap_config%solinsol_hygro_ratio(1)* & + (mdcopy(:,imode,cp_su)) + mdcopy(:,imode,cp_cl) = glomap_config%solinsol_hygro_ratio(2)* & + (mdcopy(:,imode,cp_su)) + mdcopy(:,imode,cp_bc) = glomap_config%solinsol_hygro_ratio(3)* & + (mdcopy(:,imode,cp_su)) + mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & + (mdcopy(:,imode,cp_su)) + END IF + IF (component(imode,cp_su)) THEN ! assume all H2SO4 --> SO4 - cl(:,-2)=md(:,imode,cp_su)/avogadro ! [SO4] in moles/cc (air) + cl(:,-2)=mdcopy(:,imode,cp_su)/avogadro ! [SO4] in moles/cc (air) END IF IF (component(imode,cp_so)) THEN @@ -362,7 +376,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & END IF IF (component(imode,cp_oc)) THEN - cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(md(:,imode,cp_oc)/f_ao) + cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(mdcopy(:,imode,cp_oc)/f_ao) ! .. Increment concentration of SO4 ions to represent the ! .. presence of hygroscopic aged organic aerosol mass in CP_OC. ! .. Assume it has uptake behaviour at fraction FHYG_AOM of SO4. @@ -377,8 +391,8 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & END IF IF (component(imode,cp_cl)) THEN ! assume complete dissociation - cl(:,3)=md(:,imode,cp_cl)/avogadro ! [Na] in moles per cc (air) - cl(:,-4)=md(:,imode,cp_cl)/avogadro ! [Cl] in moles per cc (air) + cl(:,3)=mdcopy(:,imode,cp_cl)/avogadro ! [Na] in moles per cc (air) + cl(:,-4)=mdcopy(:,imode,cp_cl)/avogadro ! [Cl] in moles per cc (air) END IF ! Nitrate scheme