diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index fad5ab4..de11f63 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -6,5 +6,6 @@ | 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 | | yg460-cam | Yao Ge | University of Cambridge | 2026-04-17 | | theabro | Nathan Luke Abraham | NCAS & University of Cambridge | 2026-03-19 | diff --git a/src/control/core/interface/ukca_config_specification_mod.F90 b/src/control/core/interface/ukca_config_specification_mod.F90 index 9550b85..a32b743 100644 --- a/src/control/core/interface/ukca_config_specification_mod.F90 +++ b/src/control/core/interface/ukca_config_specification_mod.F90 @@ -444,6 +444,10 @@ 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 + ! This ratio only affects the wet + ! part of the aerosol ! -- GLOMAP deposition configuration options -- LOGICAL :: l_ddepaer ! True for aerosol dry deposition @@ -998,6 +1002,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. @@ -1124,6 +1129,7 @@ SUBROUTINE ukca_get_config( & hno3_uptake_coeff, & sigwmin, & sigma_updraught_scaling, & + solinsol_hygro_ratio, & l_cal360, & l_ukca_chem_aero, & l_ukca_mode, & @@ -1327,6 +1333,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 @@ -1754,6 +1761,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 f444ea1..9a347c1 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, & @@ -462,6 +463,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 @@ -602,6 +604,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 @@ -1322,6 +1326,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 @@ -1730,6 +1737,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..d38e11f 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -156,8 +156,8 @@ 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_so, cp_nh4, cp_no3, cp_nn + cp_su, cp_oc, cp_cl, cp_so, & + cp_nh4, cp_no3, cp_nn USE yomhook, ONLY: lhook, dr_hook USE parkind1, ONLY: jprb, jpim @@ -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) ! @@ -280,6 +281,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & soluble => glomap_variables_local%soluble x => glomap_variables_local%x + !at this point in the code, the value of RP does not matter rp(:)=100.0e-9 ! dummy value CALL ukca_vapour(nbox,t,pmid,s,rp,wts,rhosol_strat) @@ -297,6 +299,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 +351,21 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & cl(:,i)=0.0 ! set all concentrations to zero initially END DO - IF (component(imode,cp_su)) THEN ! assume all H2SO4 --> SO4 - cl(:,-2)=md(:,imode,cp_su)/avogadro ! [SO4] in moles/cc (air) + ! If SOLINSOL then redistribute sulphate md into other species + ! hygro_ratio(3) is black carbon which is important to include + ! in the ratio but isn't used in this routine + IF (glomap_config%i_mode_setup == 11) THEN + mdcopy(:,imode,cp_su) = glomap_config%solinsol_hygro_ratio(1)* & + (md(:,imode,cp_su)) + mdcopy(:,imode,cp_cl) = glomap_config%solinsol_hygro_ratio(2)* & + (md(:,imode,cp_su)) + mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & + (md(:,imode,cp_su)) + END IF + + IF (component(imode,cp_su) .OR. (glomap_config%i_mode_setup == 11)) THEN + ! assume all H2SO4 --> SO4 + cl(:,-2)=mdcopy(:,imode,cp_su)/avogadro ! [SO4] in moles/cc (air) END IF IF (component(imode,cp_so)) THEN @@ -361,8 +377,8 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! .. whereas CL needs to be in moles of aged organic (MM=0.15kg/mol). END IF - IF (component(imode,cp_oc)) THEN - cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(md(:,imode,cp_oc)/f_ao) + IF (component(imode,cp_oc) .OR. (glomap_config%i_mode_setup == 11)) THEN + 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. @@ -376,9 +392,10 @@ 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) + IF (component(imode,cp_cl) .OR. (glomap_config%i_mode_setup == 11)) THEN + ! assume complete dissociation + 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