From daf5462848ebd3420da9077b8548f0c184dee53d Mon Sep 17 00:00:00 2001 From: Joseph Carton-Kelly <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:53:26 +0100 Subject: [PATCH 01/13] Added plumbing to allow ratio to be transferred from namelists in UM and back --- .../core/interface/ukca_config_specification_mod.F90 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/control/core/interface/ukca_config_specification_mod.F90 b/src/control/core/interface/ukca_config_specification_mod.F90 index 9213f95..de35dd2 100644 --- a/src/control/core/interface/ukca_config_specification_mod.F90 +++ b/src/control/core/interface/ukca_config_specification_mod.F90 @@ -443,7 +443,9 @@ 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 REAL :: mode_incld_so2_rfrac ! Fraction of in-cloud oxidised SO2 @@ -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 From 335fb3e05680d6bd2fe2f6cb5cff837963030399 Mon Sep 17 00:00:00 2001 From: Joseph Carton-Kelly <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 31 Mar 2026 09:57:48 +0100 Subject: [PATCH 02/13] more plumbing plus a check to make sure ratio adds up to one and defaults to all sulphate --- src/control/core/top_level/ukca_setup_mod.F90 | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/control/core/top_level/ukca_setup_mod.F90 b/src/control/core/top_level/ukca_setup_mod.F90 index affe86e..3dbde98 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 @@ -599,6 +601,8 @@ SUBROUTINE ukca_setup(error_code, & LOGICAL :: l_nr_scheme_selected ! True if N-R solver required for chemistry 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 @@ -1312,6 +1316,9 @@ SUBROUTINE ukca_setup(error_code, & glomap_config%acc_cor_scav_scaling = acc_cor_scav_scaling END IF + + IF (PRESENT(solinsol_hygro_ratio)) & + glomap_config%solinsol_hygro_ratio(:) = solinsol_hygro_ratio(:) ! -- GLOMAP deposition configuration options -- @@ -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() From 37d746fadddd6628fec1ae26e0cdf5d5aefd23c2 Mon Sep 17 00:00:00 2001 From: Joseph Carton-Kelly <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:02:56 +0100 Subject: [PATCH 03/13] Introduced ratio for hygroscopicity routine, allowing growth to be distributed between species --- .../core/aerosols/glomap/ukca_volume_mode.F90 | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 2e90de8..3190781 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,16 @@ 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 +372,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 +387,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 From 3a351f66d989d3c64b011fce3ea16ceec6b1ec93 Mon Sep 17 00:00:00 2001 From: Joseph Carton-Kelly <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 7 Apr 2026 11:38:18 +0100 Subject: [PATCH 04/13] Updated styling to match UMDP better and improve readability --- .../core/aerosols/glomap/ukca_volume_mode.F90 | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 3190781..4ee0b03 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -352,10 +352,14 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! 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)) + 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 From 3af1d9f8fdef6cc248c3eae0601e6d75fb9c533e Mon Sep 17 00:00:00 2001 From: Joseph Carton-Kelly <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:38:58 +0100 Subject: [PATCH 05/13] umdp3_fixer.py run and files tidied --- .../core/interface/ukca_config_specification_mod.F90 | 2 +- src/control/core/top_level/ukca_setup_mod.F90 | 8 ++++---- src/science/core/aerosols/glomap/ukca_volume_mode.F90 | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/control/core/interface/ukca_config_specification_mod.F90 b/src/control/core/interface/ukca_config_specification_mod.F90 index de35dd2..6c79b4f 100644 --- a/src/control/core/interface/ukca_config_specification_mod.F90 +++ b/src/control/core/interface/ukca_config_specification_mod.F90 @@ -445,7 +445,7 @@ MODULE ukca_config_specification_mod ! 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 REAL :: mode_incld_so2_rfrac ! Fraction of in-cloud oxidised SO2 diff --git a/src/control/core/top_level/ukca_setup_mod.F90 b/src/control/core/top_level/ukca_setup_mod.F90 index 3dbde98..5c59cf9 100644 --- a/src/control/core/top_level/ukca_setup_mod.F90 +++ b/src/control/core/top_level/ukca_setup_mod.F90 @@ -601,7 +601,7 @@ SUBROUTINE ukca_setup(error_code, & LOGICAL :: l_nr_scheme_selected ! True if N-R solver required for chemistry 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 @@ -1316,9 +1316,9 @@ SUBROUTINE ukca_setup(error_code, & glomap_config%acc_cor_scav_scaling = acc_cor_scav_scaling END IF - + IF (PRESENT(solinsol_hygro_ratio)) & - glomap_config%solinsol_hygro_ratio(:) = solinsol_hygro_ratio(:) + glomap_config%solinsol_hygro_ratio(:) = solinsol_hygro_ratio(:) ! -- GLOMAP deposition configuration options -- @@ -1742,7 +1742,7 @@ SUBROUTINE ukca_setup(error_code, & ELSE glomap_config%solinsol_hygro_ratio(:) = [1.0, 0.0, 0.0, 0.0] END IF -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 4ee0b03..88e11c9 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -352,13 +352,13 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! 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) = glomap_config%solinsol_hygro_ratio(1)* & (mdcopy(:,imode,cp_su)) - mdcopy(:,imode,cp_cl) = glomap_config%solinsol_hygro_ratio(2)* & + 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_bc) = glomap_config%solinsol_hygro_ratio(3)* & (mdcopy(:,imode,cp_su)) - mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & + mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & (mdcopy(:,imode,cp_su)) END IF From 2fdb5c449091b2e61fa650cea73b4750dec5af98 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Wed, 15 Apr 2026 12:45:22 +0100 Subject: [PATCH 06/13] Added myself to contributors list --- CONTRIBUTORS.md | 1 + 1 file changed, 1 insertion(+) 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 | From f99165d07d49273a1587394630d792011d26e1c2 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Wed, 22 Apr 2026 08:20:10 +0100 Subject: [PATCH 07/13] Corrected bug to use md not mdcopy and removed bc from routine --- .../core/aerosols/glomap/ukca_volume_mode.F90 | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 88e11c9..211c5a8 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_bc, & - 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 @@ -351,15 +351,15 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & END DO ! 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)* & - (mdcopy(:,imode,cp_su)) + (md(:,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)) + (md(:,imode,cp_su)) mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & - (mdcopy(:,imode,cp_su)) + (md(:,imode,cp_su)) END IF IF (component(imode,cp_su)) THEN ! assume all H2SO4 --> SO4 From 84ca6a5b70a6b0279bb689fe73d80bdd1b2f5963 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 28 Apr 2026 09:07:05 +0100 Subject: [PATCH 08/13] updated description of ratio to make clear it only impacts wet part of aerosol --- src/control/core/interface/ukca_config_specification_mod.F90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/control/core/interface/ukca_config_specification_mod.F90 b/src/control/core/interface/ukca_config_specification_mod.F90 index 6c79b4f..ca6e8ae 100644 --- a/src/control/core/interface/ukca_config_specification_mod.F90 +++ b/src/control/core/interface/ukca_config_specification_mod.F90 @@ -445,6 +445,8 @@ MODULE ukca_config_specification_mod ! 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 From f6495b1a9dd1feee29be0e5166953d9e46ac7420 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 28 Apr 2026 09:09:01 +0100 Subject: [PATCH 09/13] updated to make mdcopy use consistent - won't impact output as all variables that now use mdcopy aren't included in solinsol and the ratio --- src/science/core/aerosols/glomap/ukca_volume_mode.F90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 211c5a8..e2c4ad0 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -367,7 +367,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & END IF IF (component(imode,cp_so)) THEN - cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(md(:,imode,cp_so)/f_ao) + cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(mdcopy(:,imode,cp_so)/f_ao) ! .. Increment concentration of SO4 ions to represent the ! .. presence of hygroscopic aged organic aerosol mass in CP_SO. ! .. Assume it has uptake behaviour at fraction FHYG_AOM of SO4. @@ -399,17 +399,17 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & IF (UBOUND(component,DIM=2) >= cp_no3) THEN IF (component(imode,cp_nh4)) THEN ! assume complete dissociation - cl(:,2)=md(:,imode,cp_nh4)/avogadro ! [NH4] in moles per cc (air) + cl(:,2)=mdcopy(:,imode,cp_nh4)/avogadro ! [NH4] in moles per cc (air) END IF IF (component(imode,cp_no3)) THEN ! assume complete dissociation - cl(:,-3)=md(:,imode,cp_no3)/avogadro ! [NO3] in moles per cc (air) + cl(:,-3)=mdcopy(:,imode,cp_no3)/avogadro ! [NO3] in moles per cc (air) END IF IF (component(imode,cp_nn)) THEN ! assume complete dissociation - cl(:,3)=cl(:,3)+md(:,imode,cp_nn)/avogadro + cl(:,3)=cl(:,3)+mdcopy(:,imode,cp_nn)/avogadro ! [Na] in moles per cc (air) - cl(:,-3)=cl(:,-3)+md(:,imode,cp_nn)/avogadro + cl(:,-3)=cl(:,-3)+mdcopy(:,imode,cp_nn)/avogadro ! [NO3] in moles per cc (air) END IF From e4573338f3904bef46fc809e0bf902b16e6fd614 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 12 May 2026 11:36:43 +0100 Subject: [PATCH 10/13] Fixed bug where water content routine wouldnt run for seasalt/organic carbon --- .../core/aerosols/glomap/ukca_volume_mode.F90 | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index e2c4ad0..45c6a41 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -218,6 +218,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & INTEGER :: iimode INTEGER :: iicp INTEGER :: ierr(nbox) +INTEGER :: dim_1_comp, dim_2_comp ! dimensions to allocate for component_copy LOGICAL (KIND=log_small) :: mask(nbox) LOGICAL (KIND=log_small) :: mask_sol(nbox) LOGICAL (KIND=log_small) :: mask_nosol(nbox) @@ -241,6 +242,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & 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 +LOGICAL, ALLOCATABLE :: component_copy(:,:) REAL :: tmp1(nbox,nmodes) ! @@ -281,6 +283,14 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & soluble => glomap_variables_local%soluble x => glomap_variables_local%x +! Create component_copy which can be used for SOL/INSOL wet aerosol +! growth. It copies the values of component but can be updated later +! in the routine +dim_1_comp = SIZE(component,1) +dim_2_comp = SIZE(component,2) +ALLOCATE(component_copy(dim_1_comp,dim_2_comp)) +component_copy(:,:) = component(:,:) + !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) @@ -360,13 +370,15 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & (md(:,imode,cp_su)) mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & (md(:,imode,cp_su)) + component_copy(imode, cp_cl) = .TRUE. + component_copy(imode, cp_oc) = .TRUE. END IF - IF (component(imode,cp_su)) THEN ! assume all H2SO4 --> SO4 + IF (component_copy(imode,cp_su)) 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 + IF (component_copy(imode,cp_so)) THEN cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(mdcopy(:,imode,cp_so)/f_ao) ! .. Increment concentration of SO4 ions to represent the ! .. presence of hygroscopic aged organic aerosol mass in CP_SO. @@ -375,7 +387,7 @@ 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 + IF (component_copy(imode,cp_oc)) 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. @@ -390,23 +402,23 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! END IF - IF (component(imode,cp_cl)) THEN ! assume complete dissociation + IF (component_copy(imode,cp_cl)) 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 - IF (UBOUND(component,DIM=2) >= cp_no3) THEN + IF (UBOUND(component_copy,DIM=2) >= cp_no3) THEN - IF (component(imode,cp_nh4)) THEN ! assume complete dissociation + IF (component_copy(imode,cp_nh4)) THEN ! assume complete dissociation cl(:,2)=mdcopy(:,imode,cp_nh4)/avogadro ! [NH4] in moles per cc (air) END IF - IF (component(imode,cp_no3)) THEN ! assume complete dissociation + IF (component_copy(imode,cp_no3)) THEN ! assume complete dissociation cl(:,-3)=mdcopy(:,imode,cp_no3)/avogadro ! [NO3] in moles per cc (air) END IF - IF (component(imode,cp_nn)) THEN ! assume complete dissociation + IF (component_copy(imode,cp_nn)) THEN ! assume complete dissociation cl(:,3)=cl(:,3)+mdcopy(:,imode,cp_nn)/avogadro ! [Na] in moles per cc (air) cl(:,-3)=cl(:,-3)+mdcopy(:,imode,cp_nn)/avogadro @@ -894,6 +906,8 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & END DO END IF +DEALLOCATE(component_copy) + IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) RETURN END SUBROUTINE ukca_volume_mode From 4a08b699878e2da28fe6c3d09e7e161b8c7d0afd Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 12 May 2026 13:49:01 +0100 Subject: [PATCH 11/13] Simplified things following Dan's advice --- .../core/aerosols/glomap/ukca_volume_mode.F90 | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 45c6a41..004d9ff 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -218,7 +218,6 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & INTEGER :: iimode INTEGER :: iicp INTEGER :: ierr(nbox) -INTEGER :: dim_1_comp, dim_2_comp ! dimensions to allocate for component_copy LOGICAL (KIND=log_small) :: mask(nbox) LOGICAL (KIND=log_small) :: mask_sol(nbox) LOGICAL (KIND=log_small) :: mask_nosol(nbox) @@ -242,7 +241,6 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & 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 -LOGICAL, ALLOCATABLE :: component_copy(:,:) REAL :: tmp1(nbox,nmodes) ! @@ -283,13 +281,6 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & soluble => glomap_variables_local%soluble x => glomap_variables_local%x -! Create component_copy which can be used for SOL/INSOL wet aerosol -! growth. It copies the values of component but can be updated later -! in the routine -dim_1_comp = SIZE(component,1) -dim_2_comp = SIZE(component,2) -ALLOCATE(component_copy(dim_1_comp,dim_2_comp)) -component_copy(:,:) = component(:,:) !at this point in the code, the value of RP does not matter rp(:)=100.0e-9 ! dummy value @@ -370,16 +361,15 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & (md(:,imode,cp_su)) mdcopy(:,imode,cp_oc) = glomap_config%solinsol_hygro_ratio(4)* & (md(:,imode,cp_su)) - component_copy(imode, cp_cl) = .TRUE. - component_copy(imode, cp_oc) = .TRUE. END IF - IF (component_copy(imode,cp_su)) THEN ! assume all H2SO4 --> SO4 + 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_copy(imode,cp_so)) THEN - cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(mdcopy(:,imode,cp_so)/f_ao) + IF (component(imode,cp_so)) THEN + cl(:,-2)=cl(:,-2)+(fhyg_aom/avogadro)*(md(:,imode,cp_so)/f_ao) ! .. Increment concentration of SO4 ions to represent the ! .. presence of hygroscopic aged organic aerosol mass in CP_SO. ! .. Assume it has uptake behaviour at fraction FHYG_AOM of SO4. @@ -387,7 +377,7 @@ 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_copy(imode,cp_oc)) THEN + 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. @@ -402,26 +392,27 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! END IF - IF (component_copy(imode,cp_cl)) THEN ! assume complete dissociation + 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 - IF (UBOUND(component_copy,DIM=2) >= cp_no3) THEN + IF (UBOUND(component,DIM=2) >= cp_no3) THEN - IF (component_copy(imode,cp_nh4)) THEN ! assume complete dissociation - cl(:,2)=mdcopy(:,imode,cp_nh4)/avogadro ! [NH4] in moles per cc (air) + IF (component(imode,cp_nh4)) THEN ! assume complete dissociation + cl(:,2)=md(:,imode,cp_nh4)/avogadro ! [NH4] in moles per cc (air) END IF - IF (component_copy(imode,cp_no3)) THEN ! assume complete dissociation - cl(:,-3)=mdcopy(:,imode,cp_no3)/avogadro ! [NO3] in moles per cc (air) + IF (component(imode,cp_no3)) THEN ! assume complete dissociation + cl(:,-3)=md(:,imode,cp_no3)/avogadro ! [NO3] in moles per cc (air) END IF - IF (component_copy(imode,cp_nn)) THEN ! assume complete dissociation - cl(:,3)=cl(:,3)+mdcopy(:,imode,cp_nn)/avogadro + IF (component(imode,cp_nn)) THEN ! assume complete dissociation + cl(:,3)=cl(:,3)+md(:,imode,cp_nn)/avogadro ! [Na] in moles per cc (air) - cl(:,-3)=cl(:,-3)+mdcopy(:,imode,cp_nn)/avogadro + cl(:,-3)=cl(:,-3)+md(:,imode,cp_nn)/avogadro ! [NO3] in moles per cc (air) END IF @@ -906,8 +897,6 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & END DO END IF -DEALLOCATE(component_copy) - IF (lhook) CALL dr_hook(ModuleName//':'//RoutineName,zhook_out,zhook_handle) RETURN END SUBROUTINE ukca_volume_mode From 771b35bf78ca8e5facab3f9e1d4736c879debbe1 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 12 May 2026 14:10:31 +0100 Subject: [PATCH 12/13] fixed small bug --- src/science/core/aerosols/glomap/ukca_volume_mode.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index 004d9ff..b44ea87 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -363,7 +363,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & (md(:,imode,cp_su)) END IF - IF (component(imode,cp_su)) .OR. (glomap_config%i_mode_setup == 11) THEN + 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 @@ -377,7 +377,7 @@ 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)) .OR. (glomap_config%i_mode_setup == 11) THEN + 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. @@ -392,7 +392,7 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! END IF - IF (component(imode,cp_cl)) .OR. (glomap_config%i_mode_setup == 11) THEN + 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) From 1ec35b5ed3d5078e9517c91510cc041d45316994 Mon Sep 17 00:00:00 2001 From: JoeCartonKelly-MO <172614427+JoeCartonKelly-MO@users.noreply.github.com> Date: Tue, 12 May 2026 14:57:13 +0100 Subject: [PATCH 13/13] umdp3 checker changes --- src/science/core/aerosols/glomap/ukca_volume_mode.F90 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 index b44ea87..d38e11f 100644 --- a/src/science/core/aerosols/glomap/ukca_volume_mode.F90 +++ b/src/science/core/aerosols/glomap/ukca_volume_mode.F90 @@ -363,8 +363,8 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & (md(:,imode,cp_su)) END IF - IF (component(imode,cp_su) .OR. (glomap_config%i_mode_setup == 11)) THEN - ! assume all H2SO4 --> SO4 + 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 @@ -392,8 +392,8 @@ SUBROUTINE ukca_volume_mode( glomap_variables_local, nbox, nd, md, mdt, & ! END IF - IF (component(imode,cp_cl) .OR. (glomap_config%i_mode_setup == 11)) THEN - ! assume complete dissociation + 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