Skip to content
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
| mo-jmanners | James Manners | Met Office | 2025-12-18 |
| t00sa | Sam Clarke-Green | Met Office | 2026-03-02 |
| Pierre-siddall | Pierre Siddall | Met Office | 2026-03-16 |
| nichollsh | Harrison Nicholls | University of Cambridge | 2026-03-24 |
4 changes: 2 additions & 2 deletions make/Mk_cmd_azure_gfortran12_debug
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
#
# Pathnames for compilers and global options for naming files
#
FORTCOMP = gfortran -c -fcheck=all,no-recursion -fbacktrace -g -Wtabs -Werror -std=f2018
LINK = gfortran -Wl,-rpath=${NETCDFF_ROOT}/lib -fcheck=all,no-recursion -fbacktrace -g -Wtabs -Werror -std=f2018
FORTCOMP = gfortran -c -fcheck=all,no-recursion -fbacktrace -g -Wtabs -Werror -std=gnu
LINK = gfortran -Wl,-rpath=${NETCDFF_ROOT}/lib -fcheck=all,no-recursion -fbacktrace -g -Wtabs -Werror -std=gnu
LIBLINK = ar rvu
INCCDF_PATH = ${NETCDFF_ROOT}/include
LIBCDF_PATH = ${NETCDFF_ROOT}/lib
Expand Down
180 changes: 132 additions & 48 deletions src/interface_core/socrates_set_spectrum.F90
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,20 @@ module socrates_set_spectrum
contains

subroutine set_spectrum(n_instances, spectrum, spectrum_name, spectral_file, &
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, l_nh3, &
l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, l_hfc125, l_hfc134a, &
l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, l_na, l_k, l_feh, l_crh, l_li, &
l_rb, l_cs, l_ph3, l_c2h2, l_hcn, l_h2s, l_ar, l_o, l_n, l_no3, l_n2o5, &
l_hono, l_ho2no2, l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, &
l_hf, l_cosso, l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, &
l_ch3cocho, l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, &
l_pan, l_ch3ono2, &
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, &
l_nh3, l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, &
l_hfc125, l_hfc134a, l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, &
l_na, l_k, l_feh, l_crh, l_li, l_rb, l_cs, l_ph3, l_c2h2, l_hcn, &
l_h2s, l_ar, l_air, l_o, l_n, l_no3, l_n2o5, l_hono, l_ho2no2, &
l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, l_hf, l_cosso, &
l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, l_ch3cocho, &
l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, l_pan, &
l_ch3ono2, l_c2h3, l_c2h4, l_oh, l_hco, l_n2o4, l_c2n2, l_n2h4, &
l_n2o3, l_si, l_sio, l_sio2, l_mg, l_mg2, l_mgo, l_tio2, l_fe, &
l_feo, l_ca, l_cao, l_alo, l_na2, l_nao, l_naoh, l_koh, l_hminus, &
l_ps, l_po, l_pn, l_ch3sh, l_ch3s, l_c2h6s, l_c2h6s2, l_c3h4, &
l_c4h3, l_sih4, l_s2, l_sf6, l_cs2, l_s8, l_cn, l_ch3cl, l_ch3f, &
l_ch3br, &
l_all_gases, wavelength_blue)

use errormessagelength_mod, only: errormessagelength
Expand All @@ -58,14 +64,21 @@ subroutine set_spectrum(n_instances, spectrum, spectrum_name, spectral_file, &
character(len=*), intent(in), optional :: spectral_file

logical, intent(in), optional :: &
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, l_nh3, &
l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, l_hfc125, l_hfc134a, &
l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, l_na, l_k, l_feh, l_crh, l_li, &
l_rb, l_cs, l_ph3, l_c2h2, l_hcn, l_h2s, l_ar, l_o, l_n, l_no3, l_n2o5, &
l_hono, l_ho2no2, l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, &
l_hf, l_cosso, l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, &
l_ch3cocho, l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, &
l_pan, l_ch3ono2, l_all_gases
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, &
l_nh3, l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, &
l_hfc125, l_hfc134a, l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, &
l_na, l_k, l_feh, l_crh, l_li, l_rb, l_cs, l_ph3, l_c2h2, l_hcn, &
l_h2s, l_ar, l_air, l_o, l_n, l_no3, l_n2o5, l_hono, l_ho2no2, &
l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, l_hf, l_cosso, &
l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, l_ch3cocho, &
l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, l_pan, &
l_ch3ono2, l_c2h3, l_c2h4, l_oh, l_hco, l_n2o4, l_c2n2, l_n2h4, &
l_n2o3, l_si, l_sio, l_sio2, l_mg, l_mg2, l_mgo, l_tio2, l_fe, &
l_feo, l_ca, l_cao, l_alo, l_na2, l_nao, l_naoh, l_koh, l_hminus, &
l_ps, l_po, l_pn, l_ch3sh, l_ch3s, l_c2h6s, l_c2h6s2, l_c3h4, &
l_c4h3, l_sih4, l_s2, l_sf6, l_cs2, l_s8, l_cn, l_ch3cl, l_ch3f, &
l_ch3br, &
l_all_gases

real(RealExt), intent(in), optional :: wavelength_blue

Expand Down Expand Up @@ -132,14 +145,21 @@ subroutine set_spectrum(n_instances, spectrum, spectrum_name, spectral_file, &
end if
! Remove gases that are not required
call compress_spectrum(spec, &
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, l_nh3, &
l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, l_hfc125, l_hfc134a, &
l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, l_na, l_k, l_feh, l_crh, l_li, &
l_rb, l_cs, l_ph3, l_c2h2, l_hcn, l_h2s, l_ar, l_o, l_n, l_no3, l_n2o5, &
l_hono, l_ho2no2, l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, &
l_hf, l_cosso, l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, &
l_ch3cocho, l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, &
l_pan, l_ch3ono2, l_all_gases)
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, &
l_nh3, l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, &
l_hfc125, l_hfc134a, l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, &
l_na, l_k, l_feh, l_crh, l_li, l_rb, l_cs, l_ph3, l_c2h2, l_hcn, &
l_h2s, l_ar, l_air, l_o, l_n, l_no3, l_n2o5, l_hono, l_ho2no2, &
l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, l_hf, l_cosso, &
l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, l_ch3cocho, &
l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, l_pan, &
l_ch3ono2, l_c2h3, l_c2h4, l_oh, l_hco, l_n2o4, l_c2n2, l_n2h4, &
l_n2o3, l_si, l_sio, l_sio2, l_mg, l_mg2, l_mgo, l_tio2, l_fe, &
l_feo, l_ca, l_cao, l_alo, l_na2, l_nao, l_naoh, l_koh, l_hminus, &
l_ps, l_po, l_pn, l_ch3sh, l_ch3s, l_c2h6s, l_c2h6s2, l_c3h4, &
l_c4h3, l_sih4, l_s2, l_sf6, l_cs2, l_s8, l_cn, l_ch3cl, l_ch3f, &
l_ch3br, &
l_all_gases)
! Map the gas k-terms and weights to the sub-bands
call map_sub_bands(spec)
end if
Expand All @@ -150,38 +170,58 @@ end subroutine set_spectrum


subroutine compress_spectrum(spec, &
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, l_nh3, &
l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, l_hfc125, l_hfc134a, &
l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, l_na, l_k, l_feh, l_crh, l_li, &
l_rb, l_cs, l_ph3, l_c2h2, l_hcn, l_h2s, l_ar, l_o, l_n, l_no3, l_n2o5, &
l_hono, l_ho2no2, l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, &
l_hf, l_cosso, l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, &
l_ch3cocho, l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, &
l_pan, l_ch3ono2, l_all_gases)
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, &
l_nh3, l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, &
l_hfc125, l_hfc134a, l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, &
l_na, l_k, l_feh, l_crh, l_li, l_rb, l_cs, l_ph3, l_c2h2, l_hcn, &
l_h2s, l_ar, l_air, l_o, l_n, l_no3, l_n2o5, l_hono, l_ho2no2, &
l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, l_hf, l_cosso, &
l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, l_ch3cocho, &
l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, l_pan, &
l_ch3ono2, l_c2h3, l_c2h4, l_oh, l_hco, l_n2o4, l_c2n2, l_n2h4, &
l_n2o3, l_si, l_sio, l_sio2, l_mg, l_mg2, l_mgo, l_tio2, l_fe, &
l_feo, l_ca, l_cao, l_alo, l_na2, l_nao, l_naoh, l_koh, l_hminus, &
l_ps, l_po, l_pn, l_ch3sh, l_ch3s, l_c2h6s, l_c2h6s2, l_c3h4, &
l_c4h3, l_sih4, l_s2, l_sf6, l_cs2, l_s8, l_cn, l_ch3cl, l_ch3f, &
l_ch3br, &
l_all_gases)

use gas_list_pcf, only: &
ip_h2o, ip_co2, ip_o3, ip_n2o, ip_co, ip_ch4, ip_o2, ip_no, ip_so2, ip_no2, &
ip_nh3, ip_hno3, ip_n2, ip_cfc11, ip_cfc12, ip_cfc113, ip_hcfc22, ip_hfc125, &
ip_hfc134a, ip_cfc114, ip_tio, ip_vo, ip_h2, ip_he, ip_ocs, ip_na, ip_k, &
ip_feh, ip_crh, ip_li, ip_rb, ip_cs, ip_ph3, ip_c2h2, ip_hcn, ip_h2s, ip_ar, &
ip_o, ip_n, ip_no3, ip_n2o5, ip_hono, ip_ho2no2, ip_h2o2, ip_c2h6, ip_ch3, &
ip_h2co, ip_ho2, ip_hdo, ip_hcl, ip_hf, ip_cosso, ip_tosso, ip_yosos, &
ip_ch3cho, ip_ch3ooh, ip_ch3coch3, ip_ch3cocho, ip_chocho, ip_c2h5cho, &
ip_hoch2cho, ip_c2h5coch3, ip_mvk, ip_macr, ip_pan, ip_ch3ono2
ip_nh3, ip_hno3, ip_n2, ip_cfc11, ip_cfc12, ip_cfc113, ip_hcfc22, &
ip_hfc125, ip_hfc134a, ip_cfc114, ip_tio, ip_vo, ip_h2, ip_he, ip_ocs, &
ip_na, ip_k, ip_feh, ip_crh, ip_li, ip_rb, ip_cs, ip_ph3, ip_c2h2, ip_hcn, &
ip_h2s, ip_ar, ip_air, ip_o, ip_n, ip_no3, ip_n2o5, ip_hono, ip_ho2no2, &
ip_h2o2, ip_c2h6, ip_ch3, ip_h2co, ip_ho2, ip_hdo, ip_hcl, ip_hf, ip_cosso, &
ip_tosso, ip_yosos, ip_ch3cho, ip_ch3ooh, ip_ch3coch3, ip_ch3cocho, &
ip_chocho, ip_c2h5cho, ip_hoch2cho, ip_c2h5coch3, ip_mvk, ip_macr, ip_pan, &
ip_ch3ono2, ip_c2h3, ip_c2h4, ip_oh, ip_hco, ip_n2o4, ip_c2n2, ip_n2h4, &
ip_n2o3, ip_si, ip_sio, ip_sio2, ip_mg, ip_mg2, ip_mgo, ip_tio2, ip_fe, &
ip_feo, ip_ca, ip_cao, ip_alo, ip_na2, ip_nao, ip_naoh, ip_koh, ip_hminus, &
ip_ps, ip_po, ip_pn, ip_ch3sh, ip_ch3s, ip_c2h6s, ip_c2h6s2, ip_c3h4, &
ip_c4h3, ip_sih4, ip_s2, ip_sf6, ip_cs2, ip_s8, ip_cn, ip_ch3cl, ip_ch3f, &
ip_ch3br

implicit none

type(StrSpecData), intent(inout) :: spec

logical, intent(in), optional :: &
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, l_nh3, &
l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, l_hfc125, l_hfc134a, &
l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, l_na, l_k, l_feh, l_crh, l_li, &
l_rb, l_cs, l_ph3, l_c2h2, l_hcn, l_h2s, l_ar, l_o, l_n, l_no3, l_n2o5, &
l_hono, l_ho2no2, l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, &
l_hf, l_cosso, l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, &
l_ch3cocho, l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, &
l_pan, l_ch3ono2, l_all_gases
l_h2o, l_co2, l_o3, l_n2o, l_co, l_ch4, l_o2, l_no, l_so2, l_no2, &
l_nh3, l_hno3, l_n2, l_cfc11, l_cfc12, l_cfc113, l_hcfc22, &
l_hfc125, l_hfc134a, l_cfc114, l_tio, l_vo, l_h2, l_he, l_ocs, &
l_na, l_k, l_feh, l_crh, l_li, l_rb, l_cs, l_ph3, l_c2h2, l_hcn, &
l_h2s, l_ar, l_air, l_o, l_n, l_no3, l_n2o5, l_hono, l_ho2no2, &
l_h2o2, l_c2h6, l_ch3, l_h2co, l_ho2, l_hdo, l_hcl, l_hf, l_cosso, &
l_tosso, l_yosos, l_ch3cho, l_ch3ooh, l_ch3coch3, l_ch3cocho, &
l_chocho, l_c2h5cho, l_hoch2cho, l_c2h5coch3, l_mvk, l_macr, l_pan, &
l_ch3ono2, l_c2h3, l_c2h4, l_oh, l_hco, l_n2o4, l_c2n2, l_n2h4, &
l_n2o3, l_si, l_sio, l_sio2, l_mg, l_mg2, l_mgo, l_tio2, l_fe, &
l_feo, l_ca, l_cao, l_alo, l_na2, l_nao, l_naoh, l_koh, l_hminus, &
l_ps, l_po, l_pn, l_ch3sh, l_ch3s, l_c2h6s, l_c2h6s2, l_c3h4, &
l_c4h3, l_sih4, l_s2, l_sf6, l_cs2, l_s8, l_cn, l_ch3cl, l_ch3f, &
l_ch3br, &
l_all_gases

integer :: i, j, i_sub, n_band_absorb
logical :: l_retain_absorb(spec%gas%n_absorb), l_retain_major
Expand Down Expand Up @@ -235,6 +275,7 @@ subroutine compress_spectrum(spec, &
retain_absorber(ip_hcn, l_hcn ) .or. &
retain_absorber(ip_h2s, l_h2s ) .or. &
retain_absorber(ip_ar, l_ar ) .or. &
retain_absorber(ip_air, l_air ) .or. &
retain_absorber(ip_o, l_o ) .or. &
retain_absorber(ip_n, l_n ) .or. &
retain_absorber(ip_no3, l_no3 ) .or. &
Expand Down Expand Up @@ -263,7 +304,50 @@ subroutine compress_spectrum(spec, &
retain_absorber(ip_mvk, l_mvk ) .or. &
retain_absorber(ip_macr, l_macr ) .or. &
retain_absorber(ip_pan, l_pan ) .or. &
retain_absorber(ip_ch3ono2, l_ch3ono2 )) then
retain_absorber(ip_ch3ono2, l_ch3ono2 ) .or. &
retain_absorber(ip_c2h3, l_c2h3 ) .or. &
retain_absorber(ip_c2h4, l_c2h4 ) .or. &
retain_absorber(ip_oh, l_oh ) .or. &
retain_absorber(ip_hco, l_hco ) .or. &
retain_absorber(ip_n2o4, l_n2o4 ) .or. &
retain_absorber(ip_c2n2, l_c2n2 ) .or. &
retain_absorber(ip_n2h4, l_n2h4 ) .or. &
retain_absorber(ip_n2o3, l_n2o3 ) .or. &
retain_absorber(ip_si, l_si ) .or. &
retain_absorber(ip_sio, l_sio ) .or. &
retain_absorber(ip_sio2, l_sio2 ) .or. &
retain_absorber(ip_mg, l_mg ) .or. &
retain_absorber(ip_mg2, l_mg2 ) .or. &
retain_absorber(ip_mgo, l_mgo ) .or. &
retain_absorber(ip_tio2, l_tio2 ) .or. &
retain_absorber(ip_fe, l_fe ) .or. &
retain_absorber(ip_feo, l_feo ) .or. &
retain_absorber(ip_ca, l_ca ) .or. &
retain_absorber(ip_cao, l_cao ) .or. &
retain_absorber(ip_alo, l_alo ) .or. &
retain_absorber(ip_na2, l_na2 ) .or. &
retain_absorber(ip_nao, l_nao ) .or. &
retain_absorber(ip_naoh, l_naoh ) .or. &
retain_absorber(ip_koh, l_koh ) .or. &
retain_absorber(ip_hminus, l_hminus ) .or. &
retain_absorber(ip_ps, l_ps ) .or. &
retain_absorber(ip_po, l_po ) .or. &
retain_absorber(ip_pn, l_pn ) .or. &
retain_absorber(ip_ch3sh, l_ch3sh ) .or. &
retain_absorber(ip_ch3s, l_ch3s ) .or. &
retain_absorber(ip_c2h6s, l_c2h6s ) .or. &
retain_absorber(ip_c2h6s2, l_c2h6s2 ) .or. &
retain_absorber(ip_c3h4, l_c3h4 ) .or. &
retain_absorber(ip_c4h3, l_c4h3 ) .or. &
retain_absorber(ip_sih4, l_sih4 ) .or. &
retain_absorber(ip_s2, l_s2 ) .or. &
retain_absorber(ip_sf6, l_sf6 ) .or. &
retain_absorber(ip_cs2, l_cs2 ) .or. &
retain_absorber(ip_s8, l_s8 ) .or. &
retain_absorber(ip_cn, l_cn ) .or. &
retain_absorber(ip_ch3cl, l_ch3cl ) .or. &
retain_absorber(ip_ch3f, l_ch3f ) .or. &
retain_absorber(ip_ch3br, l_ch3br )) then
l_retain_absorb(i)=.true.
end if
end do
Expand Down
Loading
Loading