From 1e1eb5c7a472c44da6f0b2408f486eed3eaf0228 Mon Sep 17 00:00:00 2001 From: Pierre Siddall <43399998+Pierre-siddall@users.noreply.github.com> Date: Thu, 19 Mar 2026 11:43:35 +0000 Subject: [PATCH 1/5] Fix fortitude linting issues (#24) --- CONTRIBUTORS.md | 1 + src/correlated_k/corr_k.f90 | 18 ++-- src/correlated_k/corr_k_single.f90 | 124 +++++++++++++-------------- src/correlated_k/read_pt_line_90.f90 | 18 ++-- src/correlated_k/read_ref_pt_90.f90 | 2 +- src/general/make_block_19.f90 | 4 +- src/general/make_block_5.f90 | 8 +- src/general/make_block_9.f90 | 2 +- src/scatter/db_scatter_integral.f90 | 34 ++++---- src/scatter/get_db_wavelengths.f90 | 8 +- src/scatter/icedb2bin.f90 | 20 ++--- src/scatter/scatter_average_90.f90 | 16 ++-- 12 files changed, 128 insertions(+), 127 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 797addfe..9061b5b3 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -5,3 +5,4 @@ | james-bruten-mo | James Bruten | Met Office | 2025-12-09 | | mo-jmanners | James Manners | Met Office | 2025-12-18 | | t00sa | Sam Clarke-Green | Met Office | 20226-03-02 | +| Pierre-siddall | Pierre Siddall | Met Office | 20226-03-16 | diff --git a/src/correlated_k/corr_k.f90 b/src/correlated_k/corr_k.f90 index f14fb49d..6b00dd0c 100644 --- a/src/correlated_k/corr_k.f90 +++ b/src/correlated_k/corr_k.f90 @@ -24,9 +24,9 @@ PROGRAM corr_k ! ! ! Local scalars: - INTEGER :: start_time(8) + INTEGER :: start_time(8) ! Start/finish of program - INTEGER :: end_time(8) + INTEGER :: end_time(8) ! End of program INTEGER :: iu_lbl ! Unit number for input of the LbL database in HITRAN format @@ -369,7 +369,7 @@ END SUBROUTINE corr_k_single CALL open_file_in(ierr, iu_lbl, & "Give the name of the bespoke HITRAN .bpar database.") IF (ierr /= i_normal) THEN - WRITE(iu_err, '(A, i5)') 'Error in open_file_in: ', ierr + WRITE(iu_err, '(A, i5)') 'Error in open_file_in: ', ierr STOP END IF CALL read_parsum_dat @@ -401,7 +401,7 @@ END SUBROUTINE corr_k_single CALL open_file_in(ierr, iu_lbl, & "Give the name of the .uvxsc database.") IF (ierr /= i_normal) THEN - WRITE(iu_err, '(A, i5)') 'Error in open_file_in: ', ierr + WRITE(iu_err, '(A, i5)') 'Error in open_file_in: ', ierr STOP END IF EXIT @@ -480,12 +480,12 @@ END SUBROUTINE corr_k_single include_instrument_response=.TRUE. CALL read_instrument_response_90(filter, ierr) IF (ierr /= i_normal) STOP - EXIT + EXIT Inst ! ELSE IF ( (char_if == 'N') .OR. (char_if == 'n') ) THEN ! include_instrument_response=.FALSE. - EXIT + EXIT Inst ! ELSE ! @@ -529,7 +529,7 @@ END SUBROUTINE corr_k_single i_line_prof_corr, l_self_broadening, n_gas_frac, gas_frac, npd_gas_frac, & ierr) ! -! Allocate arrays for the k-fit, now that the size of the scaling +! Allocate arrays for the k-fit, now that the size of the scaling ! vector is known. ALLOCATE(w_k(npd_k_term, Spectrum%Dim%nd_band)) ALLOCATE(k_opt(npd_k_term, Spectrum%Dim%nd_band)) @@ -545,7 +545,7 @@ END SUBROUTINE corr_k_single l_fit_self_continuum .OR. l_fit_frn_continuum) THEN ! Select the weighting to be applied. CALL select_weight_ck_90(i_weight, SolarSpec, l_interactive, ierr) -! +! ! Set the output file. CALL get_free_unit(ierr, iu_k_out) IF (ierr /= i_normal) STOP @@ -554,7 +554,7 @@ END SUBROUTINE corr_k_single file_k, ierr) IF (ierr /= i_normal) STOP END IF - + ! Define the output file of detailed monitoring information. CALL get_free_unit(ierr, iu_monitor) IF (ierr /= i_normal) STOP diff --git a/src/correlated_k/corr_k_single.f90 b/src/correlated_k/corr_k_single.f90 index 62dbc02a..dbe0e766 100644 --- a/src/correlated_k/corr_k_single.f90 +++ b/src/correlated_k/corr_k_single.f90 @@ -49,7 +49,7 @@ SUBROUTINE corr_k_single & USE errormessagelength_mod, ONLY: errormessagelength USE ereport_mod, ONLY: ereport - IMPLICIT NONE + IMPLICIT NONE TYPE StrLineParam @@ -170,7 +170,7 @@ SUBROUTINE corr_k_single & ! Solar Spectrum ! LOGICAL, Intent(IN) :: include_h2o_foreign_continuum -! Flag to include the foreign-broadened H2O continuum (with a +! Flag to include the foreign-broadened H2O continuum (with a ! partial pressure of 0) with the line data LOGICAL, Intent(IN) :: l_use_h2o_frn_param ! Flag to use foreign broadened H2O continuum parametrisation @@ -354,7 +354,7 @@ SUBROUTINE corr_k_single & ! including all k-terms REAL (RealK), Pointer :: trans_pt_k(:, :, :) ! Actual transmissions for a single k-term only (used when fitting -! a scaling function) at the supplied range of pressures and +! a scaling function) at the supplied range of pressures and ! temperatures REAL (RealK), Pointer :: trans_calc(:) ! Calculated transmissions @@ -375,7 +375,7 @@ SUBROUTINE corr_k_single & REAL (RealK), Dimension(:), Allocatable :: u_c ! Pathlengths for continuum absorption REAL (RealK), Pointer, Dimension(:, :) :: u_fit_c -! Products of the mass of absorber and the partial pressure in +! Products of the mass of absorber and the partial pressure in ! continua REAL (RealK), Dimension(:), Allocatable :: trans_c ! Continuum transmissions @@ -402,7 +402,7 @@ SUBROUTINE corr_k_single & ! In order to apply a line transmission weighting to continuum absorption ! transmissions the column mass of the weighting gas is needed. This is ! calculated as u_gas = max_path_wgt*sqrt(u_cont/max_path) for self- -! broadened continua (l_wgt_scale_sqrt == .TRUE.) and +! broadened continua (l_wgt_scale_sqrt == .TRUE.) and ! as u_gas = max_path_wgt*u_cont/max_path if a foreign-broadened continuum ! (l_wgt_scale_sqrt == .FALSE.). u_wgt_scale is used to store the quantity ! max_path_wgt/sqrt(max_path) or max_path_wgt/max_path. @@ -410,7 +410,7 @@ SUBROUTINE corr_k_single & INTEGER :: i_index_c ! Variable indicating the type of the continuum REAL (RealK) :: k_ave_tmp(nd_k_term) -! Mean k-value across the band: temporary value at conditions +! Mean k-value across the band: temporary value at conditions ! other than the reference REAL (RealK) :: k_opt_tmp(nd_k_term) ! Optimal k-value across the band: temporary value at conditions @@ -445,7 +445,7 @@ SUBROUTINE corr_k_single & REAL :: start_band, finish_band, timer1, timer2 ! Timers - + LOGICAL :: l_debug = .FALSE. ! LOGICAL :: l_debug = .TRUE. LOGICAL :: l_output_reference_weight = .FALSE. @@ -459,7 +459,7 @@ SUBROUTINE corr_k_single & INTERFACE ! SUBROUTINE rad_weight_90(i_weight, nu, SolarSpec, T, weight) -! Function to calculate the array of radiant weightings +! Function to calculate the array of radiant weightings ! USE def_solarspec ! @@ -991,7 +991,7 @@ END SUBROUTINE write_fit_90 "Wavenumbers of min and max lines are: ", & hitran_data(1) % frequency, & hitran_data(num_lines_in_band) % frequency -! +! ! Set aside space for the adjusted line parameters: ! this will be reused each time T and p change. ALLOCATE(adj_line_parm(num_lines_in_band)) @@ -1078,7 +1078,7 @@ END SUBROUTINE write_fit_90 DEALLOCATE(xsc(i)%data) END DO DEALLOCATE(xsc) - + END IF IF (l_fit_cont_data .AND. l_cont_line_abs_weight) THEN @@ -1218,7 +1218,7 @@ END SUBROUTINE write_fit_90 kabs = max_p_calc/(max_path*kabs_rank2) END WHERE END IF - + ! Read mapping, g-points and reference k-term weights CALL input_map_band_cdf @@ -1447,14 +1447,14 @@ END SUBROUTINE write_fit_90 ELSE wgt=wgt_sv END IF - + IF (l_fit_cont_data .AND. l_cont_line_abs_weight) & kabs_lines=kabs_all_lines(1:n_nu,ipt) - + IF (ipt == ipt_ref) THEN wgt_ref(1:n_nu) = nu_inc * wgt(1:n_nu) END IF - + ! Perform the appropriate fits. IF (l_fit_self_continuum) THEN kabs=kabs_all(1:n_nu,ipt) @@ -1496,12 +1496,12 @@ END SUBROUTINE write_fit_90 END IF END IF ENDDO - + IF (l_fit_frn_continuum) k_cont => k_opt_frn(ib) IF (l_fit_self_continuum) k_cont => k_opt_self(ib) - + IF (l_scale_pT) THEN -! +! IF (l_fit_line_data) THEN SELECT CASE(i_scale_function) CASE (IP_scale_power_law, IP_scale_power_quad, & @@ -1528,7 +1528,7 @@ END SUBROUTINE write_fit_90 END IF END IF END IF - + IF (l_fit_line_data .AND. l_scale_pT) DEALLOCATE(trans_pt_k) END IF @@ -1647,7 +1647,7 @@ END SUBROUTINE write_fit_90 i_scale_function, scale_cont(:, :, ib)) DEALLOCATE(trans_app_c) ENDIF - + IF (l_fit_cont_data .AND. l_cont_line_abs_weight) & kabs_all=kabs_all_lines IF (.NOT.l_lbl_exist) CALL output_lbl_band_cdf @@ -1669,7 +1669,7 @@ END SUBROUTINE write_fit_90 DEALLOCATE(hitran_data, STAT = alloc_status) IF (alloc_status /= 0) THEN WRITE(*,"(a)") "Error deallocating array for HITRAN line data" - EXIT + EXIT bands ENDIF ENDIF @@ -1691,7 +1691,7 @@ END SUBROUTINE write_fit_90 IF (l_lbl_exist) DEALLOCATE(nu_wgt_all) DEALLOCATE(band_min) DEALLOCATE(band_max) - + CALL close_lbl_files CALL close_map_files @@ -1894,7 +1894,7 @@ END SUBROUTINE access_cia_int SUBROUTINE fit_transparent_int ! ! - IMPLICIT NONE + IMPLICIT NONE ! n_k(ib)=1 w_k(1, ib)=1.0_RealK @@ -1944,13 +1944,13 @@ END SUBROUTINE fit_transparent_int ! SUBROUTINE set_wgt_int - IMPLICIT NONE + IMPLICIT NONE ! Set up the array of wavenumbers at the weighting points within the ! band. The band should contain a whole number of intervals (band limits ! have been adjusted in the calling routine if required). Care is taken ! to ensure excluded bands are properly dealt with. - + ! Calculate band width band_width = band_max(ib) - band_min(ib) DO jx = 1, n_band_exclude(ib) @@ -2013,7 +2013,7 @@ SUBROUTINE apply_response_int USE spline_evaluate_mod, ONLY: spline_evaluate ! ! - IMPLICIT NONE + IMPLICIT NONE ! IF (include_instrument_response) THEN DO i=1, n_nu @@ -2021,7 +2021,7 @@ SUBROUTINE apply_response_int filter%wavenumber, filter%response, filter%d2_response, & nu_wgt(i), response_0) IF (ierr == i_err_range) THEN -! The filter function is taken to be 0 outside +! The filter function is taken to be 0 outside ! the explicit range. We therefore zero the response and ! recover from the error. response_0 = 0.0 @@ -2291,7 +2291,7 @@ SUBROUTINE calc_cia_abs_int DO j = 1, n_nu ! Lookup wavenumer in cm-1 waveno = nu_wgt(j) * 0.01_RealK - + ! Reset interpolation quantities t_cia = 0.0_RealK n_t_cia = 0 @@ -2376,7 +2376,7 @@ END SUBROUTINE calc_k_opt_ref SUBROUTINE ck_trans_fit - IMPLICIT NONE + IMPLICIT NONE ! Integrate the sorted weightings across the band. integ_wgt=nu_inc * SUM(wgt(1:n_nu)) @@ -2391,7 +2391,7 @@ SUBROUTINE ck_trans_fit umin=umin_kopt IF (k_opt(n_k(ib),ib) > 0.0_RealK) umin = & MAX(umin_kopt, -LOG(1.0_RealK-tol)/k_opt(n_k(ib),ib)) -! Optimization over paths is likely to be simpler with +! Optimization over paths is likely to be simpler with ! fewer k-terms. n_path=2*n_k(ib)+1 DO i=1, n_path @@ -2480,7 +2480,7 @@ END SUBROUTINE ck_fit_k SUBROUTINE calc_self_trans_int ! ! - IMPLICIT NONE + IMPLICIT NONE ! ! Local variables INTEGER :: i_pp @@ -2521,9 +2521,9 @@ END SUBROUTINE exponent_fit_90 ! FUNCTION trans_k_dist(n_nu, k, nu_inc, wgt, integ_wgt, n_path, u) & RESULT (trans) -! +! USE realtype_rd -! +! INTEGER, Intent(IN) :: n_nu INTEGER, Intent(IN) :: n_path REAL (RealK), Intent(IN), Dimension(n_nu) :: k @@ -2531,10 +2531,10 @@ FUNCTION trans_k_dist(n_nu, k, nu_inc, wgt, integ_wgt, n_path, u) & REAL (RealK), Intent(IN), Dimension(n_nu) :: wgt REAL (RealK), Intent(IN) :: integ_wgt REAL (RealK), Intent(IN), Dimension(n_path) :: u -! +! REAL (RealK), Dimension(n_path) :: trans - -! + +! END FUNCTION trans_k_dist ! ! @@ -2547,7 +2547,7 @@ END FUNCTION trans_k_dist trans_line = & trans_k_dist(n_nu, kabs, nu_inc, wgt, integ_wgt, n_path_c, u_c) ! -! The continuum is calculated at a range of partial pressures up to +! The continuum is calculated at a range of partial pressures up to ! the saturation value. e_sat = sat_vap_press(t_calc(ipt), p_calc(ipt)) ALLOCATE(k_self(n_nu)) @@ -2558,7 +2558,7 @@ END FUNCTION trans_k_dist !$OMP NUM_THREADS(n_omp_threads) DO i_pp = 1, n_pp ! - pp = e_sat * REAL(i_pp, RealK) / REAL(n_pp, RealK) + pp = e_sat * REAL(i_pp, RealK) / REAL(n_pp, RealK) ! ! Calculate the self-broadened continuum coefficients at this ! partial pressure. @@ -2578,7 +2578,7 @@ END FUNCTION trans_k_dist il = 1 + (i_pp - 1) * n_path_c ih = i_pp * n_path_c trans_fit_c(il:ih, ipt) = trans_c / (trans_line + TINY(trans_line) ) -! Eventually, the continuum coefficient will be in units of +! Eventually, the continuum coefficient will be in units of ! m5/(mol.kg). u_fit_c(il:ih, ipt) = u_c * & ( pp / (molar_gas_constant * t_calc(ipt)) ) @@ -2619,7 +2619,7 @@ END SUBROUTINE calc_self_trans_int SUBROUTINE calc_frn_trans_int ! ! - IMPLICIT NONE + IMPLICIT NONE ! ! Local variables INTEGER :: i_pp @@ -2660,9 +2660,9 @@ END SUBROUTINE exponent_fit_90 ! FUNCTION trans_k_dist(n_nu, k, nu_inc, wgt, integ_wgt, n_path, u) & RESULT (trans) -! +! USE realtype_rd -! +! INTEGER, Intent(IN) :: n_nu INTEGER, Intent(IN) :: n_path REAL (RealK), Intent(IN), Dimension(n_nu) :: k @@ -2670,10 +2670,10 @@ FUNCTION trans_k_dist(n_nu, k, nu_inc, wgt, integ_wgt, n_path, u) & REAL (RealK), Intent(IN), Dimension(n_nu) :: wgt REAL (RealK), Intent(IN) :: integ_wgt REAL (RealK), Intent(IN), Dimension(n_path) :: u -! +! REAL (RealK), Dimension(n_path) :: trans - -! + +! END FUNCTION trans_k_dist ! ! @@ -2686,7 +2686,7 @@ END FUNCTION trans_k_dist trans_line = & trans_k_dist(n_nu, kabs, nu_inc, wgt, integ_wgt, n_path_c, u_c) ! -! The continuum is calculated at a range of partial pressures up to +! The continuum is calculated at a range of partial pressures up to ! the saturation value. e_sat = sat_vap_press(t_calc(ipt), p_calc(ipt)) ALLOCATE(k_frn(n_nu)) @@ -2697,7 +2697,7 @@ END FUNCTION trans_k_dist !$OMP NUM_THREADS(n_omp_threads) DO i_pp = 1, n_pp ! - pp = e_sat * REAL(i_pp, RealK) / REAL(n_pp, RealK) + pp = e_sat * REAL(i_pp, RealK) / REAL(n_pp, RealK) ! ! Calculate the foreign-broadened continuum coefficients at this ! partial pressure. @@ -2717,7 +2717,7 @@ END FUNCTION trans_k_dist il = 1 + (i_pp - 1) * n_path_c ih = i_pp * n_path_c trans_fit_c(il:ih, ipt) = trans_c / (trans_line + TINY(trans_line) ) -! Eventually, the continuum coefficient will be in units of +! Eventually, the continuum coefficient will be in units of ! m5/(mol.kg). u_fit_c(il:ih, ipt) = u_c * & ( (p_calc(ipt) - pp) / (molar_gas_constant * t_calc(ipt)) ) @@ -2758,7 +2758,7 @@ END SUBROUTINE calc_frn_trans_int SUBROUTINE fit_scale_line_int ! ! - IMPLICIT NONE + IMPLICIT NONE ! DO ik=1, n_k(ib) ! @@ -2844,11 +2844,11 @@ SUBROUTINE fit_scale_line_int2 IF (l_debug) & print*,'Fitting 2 scaling functions split at pressure: ', & p_calc(index_k_ref) - + err_norm_old=err_norm - + ! Fit 2 scaling functions, one either side of the maximum k. - + ! Ininitialize the parameters of the first scaling function. SELECT CASE(i_scale_function2) CASE (IP_scale_power_law) @@ -2861,7 +2861,7 @@ SUBROUTINE fit_scale_line_int2 scale_vector(1:4, ik, ib) = & (/ 1.0_RealK, -2.0_RealK, 0.0_RealK, 0.0_RealK /) END SELECT - + ! Now if the absorption coefficient for the term is 0, there is ! no optimal scaling function, so no scaling function can be ! determined. We relate this to the machine's precision. @@ -2885,7 +2885,7 @@ SUBROUTINE fit_scale_line_int2 ENDIF err_norm=rms_residual*(index_k_ref-1) ENDIF - + ! Ininitialize the parameters of the second scaling function. SELECT CASE(i_scale_function2) CASE (IP_scale_power_law) @@ -2919,7 +2919,7 @@ SUBROUTINE fit_scale_line_int2 ENDIF err_norm=err_norm + rms_residual*(n_pt_pair-index_k_ref) ENDIF - + IF (err_norm < err_norm_old) THEN ! Set reference P, T, and absorption for each k-term: scale_vector(n_scale_variable(i_scale_function2)*2+1,ik,ib) = & @@ -2940,7 +2940,7 @@ END SUBROUTINE fit_scale_line_int2 SUBROUTINE fit_scale_cont_int ! ! - IMPLICIT NONE + IMPLICIT NONE ! WRITE(iu_monitor, '(/a, /a)') & "===================", & @@ -3006,7 +3006,7 @@ SUBROUTINE input_lbl_band_cdf_init ! Allocate array with all wavenumbers ALLOCATE(nu_wgt_all(dim_len)) -! Read and get step in wavenumber array +! Read and get step in wavenumber array CALL nf(nf90_inq_varid(ncidin_lbl,'nu',varid)) CALL nf(nf90_get_att(ncidin_lbl,varid,'step',nu_inc)) CALL nf(nf90_get_var(ncidin_lbl,varid,nu_wgt_all)) @@ -3033,7 +3033,7 @@ SUBROUTINE input_lbl_band_cdf_init END DO ! Read pressures and temperatures - CALL nf(nf90_inq_varid(ncidin_lbl,'p_calc',varid)) + CALL nf(nf90_inq_varid(ncidin_lbl,'p_calc',varid)) CALL nf(nf90_get_var(ncidin_lbl,varid,p_calc_in)) CALL nf(nf90_inq_varid(ncidin_lbl,'t_calc',varid)) CALL nf(nf90_get_var(ncidin_lbl,varid,t_calc_in)) @@ -3052,7 +3052,7 @@ SUBROUTINE input_lbl_band_cdf_init IF (l_self_broadening) THEN ! Read gas fractions - CALL nf(nf90_inq_varid(ncidin_lbl,'gas_frac',varid)) + CALL nf(nf90_inq_varid(ncidin_lbl,'gas_frac',varid)) CALL nf(nf90_get_var(ncidin_lbl,varid,gas_frac_in)) ! Check gas fractions in lbl file @@ -3339,7 +3339,7 @@ SUBROUTINE output_map_band_cdf_init INTEGER :: dimid1, dimid2, dimid3, dimid4 ! dimension ID INTEGER :: varid ! variable ID INTEGER :: n_nu_band(n_selected_band) ! number of frequency points - LOGICAL :: l_map_exist ! flag for mapping file existing + LOGICAL :: l_map_exist ! flag for mapping file existing ! Calculate total number of frequency points DO ibb=1, n_selected_band @@ -3585,17 +3585,17 @@ SUBROUTINE close_lbl_files END SUBROUTINE close_lbl_files SUBROUTINE close_map_files - + use netcdf IMPLICIT NONE - + ! Close files IF (l_load_map) THEN CALL nf(nf90_close(ncidin_map)) ELSE IF (l_save_map) THEN CALL nf(nf90_close(ncidout_map)) ENDIF - + END SUBROUTINE close_map_files Subroutine nf(status) diff --git a/src/correlated_k/read_pt_line_90.f90 b/src/correlated_k/read_pt_line_90.f90 index bf828420..8626d3ad 100644 --- a/src/correlated_k/read_pt_line_90.f90 +++ b/src/correlated_k/read_pt_line_90.f90 @@ -102,16 +102,16 @@ SUBROUTINE read_pt_line_90 & 'Specify pressure and corresponding temperatures (*END to finish)' ENDIF ! - l_next= .TRUE. + l_next= .TRUE. ! The next line will be read until l_next is false. Input: DO - IF (.NOT.l_next) EXIT + IF (.NOT.l_next) EXIT Input READ(iu_pt, '(a)', IOSTAT=ios) line IF (ios /= 0) THEN WRITE(iu_err, "(a)") "Erroneous input" IF ( l_interactive .AND. (.NOT.l_file) ) THEN WRITE(iu_stdout, '(a)') "Please re-enter this line." - CYCLE + CYCLE Input ELSE ierr=i_err_fatal RETURN @@ -156,19 +156,19 @@ SUBROUTINE read_pt_line_90 & j=2 Process: DO ! - IF (j >= length) EXIT + IF (j >= length) EXIT Process ! IF ( (list(j-1:j-1) == ' ') .AND. (list(j:j) /= ' ') ) THEN ! Beginning of word found. begin=j n_word=n_word+1 -! Check for termination of input: a line begins with 'F' +! Check for termination of input: a line begins with 'F' ! or 'f' or the directive "*END" IF (n_word == 1) THEN IF ( (list(j:j) == 'f') .OR. & (list(j:j) == 'f') .OR. & - (list(j:j+3) == '*END') ) THEN - l_finish= .TRUE. + (list(j:j+3) == '*END') ) THEN + l_finish= .TRUE. RETURN ENDIF ENDIF @@ -188,7 +188,7 @@ SUBROUTINE read_pt_line_90 & ELSE WRITE(iu_stdout, '(a)') 'Please re-enter the list.' l_reread=.TRUE. - EXIT + EXIT Process ENDIF ENDIF word(1:n_char_word) = ' ' @@ -204,7 +204,7 @@ SUBROUTINE read_pt_line_90 & ELSE WRITE(iu_stdout, '(/a/)') 'Please re-enter' l_reread=.TRUE. - EXIT + EXIT Process ENDIF ENDIF ENDIF diff --git a/src/correlated_k/read_ref_pt_90.f90 b/src/correlated_k/read_ref_pt_90.f90 index c64ce1ba..86d0bc11 100644 --- a/src/correlated_k/read_ref_pt_90.f90 +++ b/src/correlated_k/read_ref_pt_90.f90 @@ -93,7 +93,7 @@ SUBROUTINE read_ref_pt_90 & Input: DO READ(iu_file_in, '(a)', IOSTAT=ios) line ! - IF (ios /= 0) EXIT + IF (ios /= 0) EXIT Input ! ! Lines of valid data begin with the directive *REF. IF (line(1:4) == '*REF') THEN diff --git a/src/general/make_block_19.f90 b/src/general/make_block_19.f90 index 6804198f..5c7fedcc 100644 --- a/src/general/make_block_19.f90 +++ b/src/general/make_block_19.f90 @@ -140,7 +140,7 @@ SUBROUTINE make_block_19(Spectrum, ierr) END IF END DO inner READ(iu_esft, '(15x, i5, //)', IOSTAT=ios) i_input_type - IF (ios < 0) EXIT + IF (ios < 0) EXIT outer IF (i_input_type /= it_file_cont_gen_fit) THEN WRITE(*, '(/a)') & '***error: the esft data have an invalid file type.' @@ -267,7 +267,7 @@ SUBROUTINE make_block_19(Spectrum, ierr) arr_tmp_real_4d DEALLOCATE(arr_tmp_real_4d) END IF - + READ(iu_esft, '(6(1PE13.6))', IOSTAT=ios) & (Spectrum%ContGen%t_lookup_cont(it), & it=1, Spectrum%ContGen%n_t_lookup_cont) diff --git a/src/general/make_block_5.f90 b/src/general/make_block_5.f90 index bfc97d42..e7145893 100644 --- a/src/general/make_block_5.f90 +++ b/src/general/make_block_5.f90 @@ -76,7 +76,7 @@ SUBROUTINE make_block_5(Spectrum, ierr) REAL (RealK), ALLOCATABLE :: arr_tmp_real_6d(:, :, :, :, :, :) ! Temporary arrays used when resizing existing arrays REAL (RealK) :: t_lookup_pressure -! Single pressure used for temperature lookup tables +! Single pressure used for temperature lookup tables ! Alias pointers to dimensions to the actual structure. nd_band => Spectrum%Dim%nd_band @@ -200,7 +200,7 @@ SUBROUTINE make_block_5(Spectrum, ierr) END IF END DO inner READ(iu_esft, '(15x, i5, //)', IOSTAT=ios) i_input_type - IF (ios < 0) EXIT + IF (ios < 0) EXIT outer IF (i_input_type == it_file_line_fit .OR. & i_input_type == it_file_line_fit_self) THEN READ(iu_esft, '(14x, i5, 21x, i5)') i_band, i_index @@ -281,7 +281,7 @@ SUBROUTINE make_block_5(Spectrum, ierr) Spectrum%Gas%i_scat(nd_k_term_alloc+1:,:,:) = 0 DEALLOCATE(arr_tmp_int_3d) - ALLOCATE(arr_tmp_real_3d(nd_k_term_alloc, nd_band, nd_species)) + ALLOCATE(arr_tmp_real_3d(nd_k_term_alloc, nd_band, nd_species)) arr_tmp_real_3d = Spectrum%Gas%k DEALLOCATE(Spectrum%Gas%k) ALLOCATE(Spectrum%Gas%k(nd_k_term, nd_band, nd_species)) @@ -508,7 +508,7 @@ SUBROUTINE make_block_5(Spectrum, ierr) DEALLOCATE(arr_tmp_real_4d) ELSE ALLOCATE(Spectrum%Gas%k_t_lookup_gas(Spectrum%Dim%nd_t_lookup_gas, & - nd_k_term, nd_species, nd_band)) + nd_k_term, nd_species, nd_band)) END IF END IF diff --git a/src/general/make_block_9.f90 b/src/general/make_block_9.f90 index d12b099b..c434e5a5 100644 --- a/src/general/make_block_9.f90 +++ b/src/general/make_block_9.f90 @@ -121,7 +121,7 @@ SUBROUTINE make_block_9(Spectrum, ierr) END IF END DO inner READ(iu_esft, '(15x, i5, //)', IOSTAT=ios) i_input_type - IF (ios < 0) EXIT + IF (ios < 0) EXIT outer IF (i_input_type /= it_file_cont_fit) THEN WRITE(*, '(/a)') & '*** error: the input file is of an invalid type.' diff --git a/src/scatter/db_scatter_integral.f90 b/src/scatter/db_scatter_integral.f90 index a602f18d..cdaa939c 100644 --- a/src/scatter/db_scatter_integral.f90 +++ b/src/scatter/db_scatter_integral.f90 @@ -9,7 +9,7 @@ SUBROUTINE db_scatter_integral & (nd_wavelength, nd_size_scat, & SizeDist,wavelength_index,n_wavelength,wavelength,DBGeom, & ice_db_mono_info, & - n_angle,mu_angle, & + n_angle,mu_angle, & panel_ratio, & extinction, scattering, asymmetry, l_stokes, i_stokes, & nd_scatt_angle, & @@ -19,27 +19,27 @@ SUBROUTINE db_scatter_integral & ) ! ! Method: -! The extinction, the scattering and the asymmetry are +! The extinction, the scattering and the asymmetry are ! initialized to 0. Initial estimates of these quantities are ! made and the range of integration is extended until further ! extension does not sensibly alter these estimates. This is ! done by dividing the range of integration into panels and -! adding new panels as required. the resolution within a panel +! adding new panels as required. the resolution within a panel ! is then increased until the integrals converge. ! ! ! ! Modules used USE realtype_rd - USE def_size_dist - USE def_std_io_icf - USE prec_integral_tcf - USE scatter_algorithm_pcf - USE shape_particle_pcf - USE error_pcf - USE rad_ccf, ONLY: pi - USE def_db_crystal_geometry - USE def_db_ss_mono + USE def_size_dist + USE def_std_io_icf + USE prec_integral_tcf + USE scatter_algorithm_pcf + USE shape_particle_pcf + USE error_pcf + USE rad_ccf, ONLY: pi + USE def_db_crystal_geometry + USE def_db_ss_mono ! ! IMPLICIT NONE @@ -48,7 +48,7 @@ SUBROUTINE db_scatter_integral & ! ! Dummy arguments ! - INTEGER, Intent(IN) :: n_wavelength + INTEGER, Intent(IN) :: n_wavelength ! Number of wavelengths ! ! Sizes of dummy arrays: @@ -252,7 +252,7 @@ END FUNCTION volume_particle ! until the inclusion of further panels makes little change in the ! estimate of the integral. ! - Set_range: DO ; IF ( .NOT.(l_add_upper .OR. l_add_lower) ) EXIT + Set_range: DO ; IF ( .NOT.(l_add_upper .OR. l_add_lower) ) EXIT Set_range ! IF (l_add_upper) THEN dimen_panel_low = dimen_high @@ -280,7 +280,7 @@ END FUNCTION volume_particle ! IF (number_point > 0.0_RealK) THEN ! The scattering code is not called if there are -! no particles at this size. +! no particles at this size. CALL db_interp_ss_mono(nd_wavelength, & nd_scatt_angle, nd_size_scat, & dimen(i), & @@ -378,7 +378,7 @@ END FUNCTION volume_particle IF (number_point > 0.0_RealK) THEN ! The scattering code is not called if there are -! no particles at this size. +! no particles at this size. CALL db_interp_ss_mono(nd_wavelength, & nd_scatt_angle, nd_size_scat, & dimen(i), & @@ -407,7 +407,7 @@ END FUNCTION volume_particle y(i, 4:3+n_angle) = number_point * s(1:n_angle) ! ! - y(i, 1) = number_point * extinction_point + y(i, 1) = number_point * extinction_point y(i, 2) = number_point * scattering_point y(i, 3) = asymmetry_point * y(i, 2) ! diff --git a/src/scatter/get_db_wavelengths.f90 b/src/scatter/get_db_wavelengths.f90 index a8ef01e5..0013e5e5 100644 --- a/src/scatter/get_db_wavelengths.f90 +++ b/src/scatter/get_db_wavelengths.f90 @@ -31,7 +31,7 @@ SUBROUTINE get_db_wavelengths & INTEGER, Intent(In) :: nd_wavelength ! Size allocated for array of wavelengths INTEGER, Intent(In) :: nd_size_scat -! Size allocated for the number of scattering +! Size allocated for the number of scattering ! entries at each wavelength ! INTEGER, Intent(IN) :: iu_db_input @@ -61,7 +61,7 @@ SUBROUTINE get_db_wavelengths & INTEGER :: n_block ! Number of blocks of scattering data INTEGER :: i_block -! Loop variable +! Loop variable LOGICAL :: new_wavelength ! Flag that states if a new wavelength ! has been read from the database @@ -119,7 +119,7 @@ SUBROUTINE get_db_wavelengths & db_record(j_pt_wl, n_rec_block(j_pt_wl)) = i_block+1 ! ! -! Check if number of scattering angles is consistent +! Check if number of scattering angles is consistent ! throughout the records IF (i_block == 1) n_angle = ice_sct%n_angle IF ( ice_sct%n_angle /= n_angle .AND. i_block > 1 ) THEN @@ -133,7 +133,7 @@ SUBROUTINE get_db_wavelengths & ! Advance to the next block i_block = i_block+1 ! Stop at the last block. - IF (i_block > n_block) EXIT + IF (i_block > n_block) EXIT process_block ! ENDDO process_block ! diff --git a/src/scatter/icedb2bin.f90 b/src/scatter/icedb2bin.f90 index 50710370..e2a7a3e8 100644 --- a/src/scatter/icedb2bin.f90 +++ b/src/scatter/icedb2bin.f90 @@ -9,19 +9,19 @@ PROGRAM icedb2bin ! ! Description: -! This program receives the ASCII database of scattering +! This program receives the ASCII database of scattering ! properties and convertis it to a direct access unformatted ! file for use in calculating single scattering properties ! averaged over distributions. ! ! Method: ! The file is opened and read to determine how many blocks -! of data for a specific size and wavelength are contained +! of data for a specific size and wavelength are contained ! within it. An unformatted direct access file is then -! opened and the data are written to it. +! opened and the data are written to it. ! ! Note: -! The initial data are expected to be supplied in the +! The initial data are expected to be supplied in the ! following units: ! Wavelength: Micron ! Mean maximum dimension: Micron @@ -117,10 +117,10 @@ PROGRAM icedb2bin ! Read through the input to find the number of blocks of data. ! In the current format the first element of an entry is the wavelength. n_block=0 - count_block: DO + count_block: DO READ(iunit_in, '(A)', IOSTAT=ios) line ! Conventionally negative errors denote an end of the file. - IF (ios < 0) EXIT + IF (ios < 0) EXIT count_block IF (line(17:28) == "; Wavelength") n_block=n_block+1 ENDDO count_block REWIND(iunit_in) @@ -168,13 +168,13 @@ PROGRAM icedb2bin n_angle=0 READ(iunit_in, '()') read_phase: DO -! If the line contains the string "; Wavelength" it signals -! the start of the next block, or the block may be at the end +! If the line contains the string "; Wavelength" it signals +! the start of the next block, or the block may be at the end ! of the file. READ(iunit_in, '(A)', IOSTAT=ios) line IF ( (ios < 0).OR.(line(17:28) == '; Wavelength') ) THEN BACKSPACE(iunit_in) - EXIT + EXIT read_phase ENDIF n_angle=n_angle+1 IF (n_angle > npd_sct_db_angle) THEN @@ -256,7 +256,7 @@ PROGRAM icedb2bin ! Advance the count of the number of blocks. i_block=i_block+1 ! Stop at the last block. - IF (i_block > n_block) EXIT + IF (i_block > n_block) EXIT process_block ! ENDDO process_block ! diff --git a/src/scatter/scatter_average_90.f90 b/src/scatter/scatter_average_90.f90 index 1003777b..e4e731cf 100644 --- a/src/scatter/scatter_average_90.f90 +++ b/src/scatter/scatter_average_90.f90 @@ -14,9 +14,9 @@ PROGRAM scatter_average_90 ! file. Optionally, the data may be fitted. ! ! Method: -! A file containing blocks of monochromatic single +! A file containing blocks of monochromatic single ! scattering properties is read in. These monochromatic -! values are averaged across the bands given in a +! values are averaged across the bands given in a ! spectral file. The averaged values may be written to ! a file or fitted using a recognized parametrization. ! @@ -322,7 +322,7 @@ END SUBROUTINE cloud_fit_90 ! IF ( (char_yn == 'y') .OR. (char_yn == 'Y') ) THEN ! -! The data are checked to ensure that they are all for +! The data are checked to ensure that they are all for ! the same type of scatterer. DO i=2, n_block IF (i_scatter_type(i) /= i_scatter_type(1)) THEN @@ -359,7 +359,7 @@ END SUBROUTINE cloud_fit_90 ! ELSE IF ( (char_yn == 'n') .OR. (char_yn == 'N') ) THEN STOP - ELSE + ELSE ! WRITE(iu_err, '(a)') '+++ Illegal response.' IF (l_interactive) THEN @@ -397,12 +397,12 @@ SUBROUTINE get_inst_response_int include_instrument_response=.TRUE. CALL read_instrument_response_90(filter, ierr) IF (ierr /= i_normal) STOP - EXIT + EXIT Inst ! ELSE IF ( (char_if == 'N') .OR. (char_if == 'n') ) THEN ! include_instrument_response=.FALSE. - EXIT + EXIT Inst ! ELSE ! @@ -415,7 +415,7 @@ SUBROUTINE get_inst_response_int ! ENDIF ! - ENDDO Inst + ENDDO Inst ! ! ! @@ -480,7 +480,7 @@ SUBROUTINE calculate_means_int ! Effective albedo of single scattering ! ! -! +! ! Calculate the mean scattering. mean_scattering = 0.0_RealK DO k = 0, n_int_weight From 8e9aabd7077b7afd0f0c2ed468a338b4395d5d9e Mon Sep 17 00:00:00 2001 From: Pierre Siddall <43399998+Pierre-siddall@users.noreply.github.com> Date: Thu, 19 Mar 2026 14:20:08 +0000 Subject: [PATCH 2/5] Add initial QA checks to CI/CD pipeline. (#23) --- .fortitude.toml | 6 ++++++ .github/workflows/lint-fortran.yaml | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 .fortitude.toml create mode 100644 .github/workflows/lint-fortran.yaml diff --git a/.fortitude.toml b/.fortitude.toml new file mode 100644 index 00000000..894e0fd1 --- /dev/null +++ b/.fortitude.toml @@ -0,0 +1,6 @@ +[check] +select=["E000","C031","C032","C043","C051", +"C082","C141","OB011","OB021","OB051", +"OB061","MOD001","PORT011","PORT012","PORT021", +"FORT001","FORT002","FORT003","FORT004","FORT005"] +ignore=["C091"] diff --git a/.github/workflows/lint-fortran.yaml b/.github/workflows/lint-fortran.yaml new file mode 100644 index 00000000..b5ae2b56 --- /dev/null +++ b/.github/workflows/lint-fortran.yaml @@ -0,0 +1,16 @@ +# ----------------------------------------------------------------------------- +# (C) Crown copyright Met Office. All rights reserved. +# The file LICENCE, distributed with this code, contains details of the terms +# under which the code may be used. +# ----------------------------------------------------------------------------- + +name: Lint Fortran + +on: + pull_request: + +jobs: + fortitude-lint: + uses: MetOffice/growss/.github/workflows/fortran-lint.yaml@main + with: + runner: "ubuntu-24.04" From 0967a5867e05f9818fcf44b79775d614d0b7578c Mon Sep 17 00:00:00 2001 From: Pierre Siddall <43399998+Pierre-siddall@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:59:49 +0100 Subject: [PATCH 3/5] Add codeowners (#28) --- .github/CODEOWNERS | 7 +++++++ CONTRIBUTORS.md | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..a6778e18 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,7 @@ +# This CODEOWNERS file includes a codeowner +# who serves as a valid point of contact for +# discussing changes and seeking approval for work + +**/ @mo-jmanners +**/cosp_control @Petzi1 +**/cosp_github @Petzi1 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 9061b5b3..ac424394 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -4,5 +4,5 @@ | ----------- | --------- | ----------- | ---- | | james-bruten-mo | James Bruten | Met Office | 2025-12-09 | | mo-jmanners | James Manners | Met Office | 2025-12-18 | -| t00sa | Sam Clarke-Green | Met Office | 20226-03-02 | -| Pierre-siddall | Pierre Siddall | Met Office | 20226-03-16 | +| t00sa | Sam Clarke-Green | Met Office | 2026-03-02 | +| Pierre-siddall | Pierre Siddall | Met Office | 2026-03-16 | From df27ed64bcbaf74be6b5144da08fca8611828472 Mon Sep 17 00:00:00 2001 From: Harrison Nicholls <32022679+nichollsh@users.noreply.github.com> Date: Tue, 5 May 2026 10:05:01 +0100 Subject: [PATCH 4/5] Update gas list (and gas data) with additional species (#27) Co-authored-by: James Manners --- CONTRIBUTORS.md | 1 + src/interface_core/socrates_set_spectrum.F90 | 180 +- src/radiance_core/def_control.F90 | 92 +- src/radiance_core/gas_list_pcf.F90 | 1675 ++++++++++++++---- 4 files changed, 1533 insertions(+), 415 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index ac424394..b01b911c 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -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 | diff --git a/src/interface_core/socrates_set_spectrum.F90 b/src/interface_core/socrates_set_spectrum.F90 index 3295847c..fded282c 100644 --- a/src/interface_core/socrates_set_spectrum.F90 +++ b/src/interface_core/socrates_set_spectrum.F90 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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. & @@ -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 diff --git a/src/radiance_core/def_control.F90 b/src/radiance_core/def_control.F90 index 70245e25..cb1e2483 100644 --- a/src/radiance_core/def_control.F90 +++ b/src/radiance_core/def_control.F90 @@ -144,6 +144,8 @@ MODULE def_control ! Flag for absorption by nitrogen LOGICAL :: l_ar = .FALSE. ! Flag for absorption by argon + LOGICAL :: l_air = .FALSE. +! Flag for absorption by dry air LOGICAL :: l_o = .FALSE. ! Flag for absorption by atomic oxygen LOGICAL :: l_n = .FALSE. @@ -184,8 +186,8 @@ MODULE def_control ! Flag for absorption by OSO-S LOGICAL :: l_h2s = .FALSE. ! Flag for absorption by Hydrogen sulphide - LOGICAL :: l_cocs = .FALSE. -! Flag for absorption by Carbonyl sulphide + LOGICAL :: l_ocs = .FALSE. +! Flag for absorption by carbonyl sulphide LOGICAL :: l_ch3cho = .FALSE. ! Flag for absorption by Acetaldehyde LOGICAL :: l_ch3ooh = .FALSE. @@ -210,6 +212,92 @@ MODULE def_control ! Flag for absorption by peroxyacetyl nitrate (PAN) LOGICAL :: l_ch3ono2 = .FALSE. ! Flag for absorption by methylnitrate + LOGICAL :: l_c2h3 = .FALSE. +! Flag for absorption by vinyl radical + LOGICAL :: l_c2h4 = .FALSE. +! Flag for absorption by ethylene + LOGICAL :: l_oh = .FALSE. +! Flag for absorption by hydroxyl radical + LOGICAL :: l_hco = .FALSE. +! Flag for absorption by formyl radical + LOGICAL :: l_n2o4 = .FALSE. +! Flag for absorption by dinitrogen tetroxide + LOGICAL :: l_c2n2 = .FALSE. +! Flag for absorption by cyanogen + LOGICAL :: l_n2h4 = .FALSE. +! Flag for absorption by hydrazine + LOGICAL :: l_n2o3 = .FALSE. +! Flag for absorption by dinitrogen trioxide + LOGICAL :: l_si = .FALSE. +! Flag for absorption by silicon + LOGICAL :: l_sio = .FALSE. +! Flag for absorption by silicon monoxide + LOGICAL :: l_sio2 = .FALSE. +! Flag for absorption by silicon dioxide + LOGICAL :: l_mg = .FALSE. +! Flag for absorption by atomic magnesium + LOGICAL :: l_mg2 = .FALSE. +! Flag for absorption by magnesium dimer + LOGICAL :: l_mgo = .FALSE. +! Flag for absorption by magnesium oxide + LOGICAL :: l_tio2 = .FALSE. +! Flag for absorption by titanium dioxide + LOGICAL :: l_fe = .FALSE. +! Flag for absorption by atomic iron + LOGICAL :: l_feo = .FALSE. +! Flag for absorption by iron(ii) oxide + LOGICAL :: l_ca = .FALSE. +! Flag for absorption by calcium + LOGICAL :: l_cao = .FALSE. +! Flag for absorption by calcium oxide + LOGICAL :: l_alo = .FALSE. +! Flag for absorption by aluminium monoxide + LOGICAL :: l_na2 = .FALSE. +! Flag for absorption by disodium + LOGICAL :: l_nao = .FALSE. +! Flag for absorption by sodium oxide + LOGICAL :: l_naoh = .FALSE. +! Flag for absorption by sodium hydroxide + LOGICAL :: l_koh = .FALSE. +! Flag for absorption by potassium hydroxide + LOGICAL :: l_hminus = .FALSE. +! Flag for absorption by hydride anion + LOGICAL :: l_ps = .FALSE. +! Flag for absorption by phosphorus sulfide + LOGICAL :: l_po = .FALSE. +! Flag for absorption by phosphorus monoxide + LOGICAL :: l_pn = .FALSE. +! Flag for absorption by phosphorus nitride + LOGICAL :: l_ch3sh = .FALSE. +! Flag for absorption by methanethiol + LOGICAL :: l_ch3s = .FALSE. +! Flag for absorption by methylthiyl radical + LOGICAL :: l_c2h6s = .FALSE. +! Flag for absorption by dimethyl sulfide + LOGICAL :: l_c2h6s2 = .FALSE. +! Flag for absorption by dimethyl disulfide + LOGICAL :: l_c3h4 = .FALSE. +! Flag for absorption by propyne/allene + LOGICAL :: l_c4h3 = .FALSE. +! Flag for absorption by butadiynyl radical + LOGICAL :: l_sih4 = .FALSE. +! Flag for absorption by silane + LOGICAL :: l_s2 = .FALSE. +! Flag for absorption by disulfur + LOGICAL :: l_sf6 = .FALSE. +! Flag for absorption by sulfur hexafluoride + LOGICAL :: l_cs2 = .FALSE. +! Flag for absorption by carbon disulfide + LOGICAL :: l_s8 = .FALSE. +! Flag for absorption by octasulfur + LOGICAL :: l_cn = .FALSE. +! Flag for absorption by cyanogen radical + LOGICAL :: l_ch3cl = .FALSE. +! Flag for absorption by methyl chloride + LOGICAL :: l_ch3f = .FALSE. +! Flag for absorption by methyl fluoride + LOGICAL :: l_ch3br = .FALSE. +! Flag for absorption by methyl bromide LOGICAL :: l_include_gas(npd_gases) = .FALSE. ! Flags to treat radiative effect of gases diff --git a/src/radiance_core/gas_list_pcf.F90 b/src/radiance_core/gas_list_pcf.F90 index 5ecd15c3..c4a795fc 100644 --- a/src/radiance_core/gas_list_pcf.F90 +++ b/src/radiance_core/gas_list_pcf.F90 @@ -20,7 +20,7 @@ MODULE gas_list_pcf INTEGER, PRIVATE :: i -INTEGER, PARAMETER :: npd_gases = 75 +INTEGER, PARAMETER :: npd_gases = 110 ! Number of indexed gases INTEGER, PARAMETER :: IP_h2o = 1 @@ -173,6 +173,76 @@ MODULE gas_list_pcf ! Identifier for hydrazine INTEGER, PARAMETER :: IP_n2o3 = 75 ! Identifier for dinitrogen trioxide +INTEGER, PARAMETER :: IP_si = 76 +! Identifier for silicon +INTEGER, PARAMETER :: IP_sio = 77 +! Identifier for silicon monoxide +INTEGER, PARAMETER :: IP_sio2 = 78 +! Identifier for silicon dioxide +INTEGER, PARAMETER :: IP_mg = 79 +! Identifier for atomic magnesium +INTEGER, PARAMETER :: IP_mg2 = 80 +! Identifier for magnesium dimer +INTEGER, PARAMETER :: IP_mgo = 81 +! Identifier for magnesium oxide +INTEGER, PARAMETER :: IP_tio2 = 82 +! Identifier for titanium dioxide +INTEGER, PARAMETER :: IP_fe = 83 +! Identifier for atomic iron +INTEGER, PARAMETER :: IP_feo = 84 +! Identifier for iron(ii) oxide +INTEGER, PARAMETER :: IP_ca = 85 +! Identifier for calcium +INTEGER, PARAMETER :: IP_cao = 86 +! Identifier for calcium oxide +INTEGER, PARAMETER :: IP_alo = 87 +! Identifier for aluminium monoxide +INTEGER, PARAMETER :: IP_na2 = 88 +! Identifier for disodium +INTEGER, PARAMETER :: IP_nao = 89 +! Identifier for sodium oxide +INTEGER, PARAMETER :: IP_naoh = 90 +! Identifier for sodium hydroxide +INTEGER, PARAMETER :: IP_koh = 91 +! Identifier for potassium hydroxide +INTEGER, PARAMETER :: IP_hminus = 92 +! Identifier for hydride anion +INTEGER, PARAMETER :: IP_ps = 93 +! Identifier for phosphorus sulfide +INTEGER, PARAMETER :: IP_po = 94 +! Identifier for phosphorus monoxide +INTEGER, PARAMETER :: IP_pn = 95 +! Identifier for phosphorus nitride +INTEGER, PARAMETER :: IP_ch3sh = 96 +! Identifier for methanethiol +INTEGER, PARAMETER :: IP_ch3s = 97 +! Identifier for methylthiyl radical +INTEGER, PARAMETER :: IP_c2h6s = 98 +! Identifier for dimethyl sulfide +INTEGER, PARAMETER :: IP_c2h6s2 = 99 +! Identifier for dimethyl disulfide +INTEGER, PARAMETER :: IP_c3h4 = 100 +! Identifier for propyne +INTEGER, PARAMETER :: IP_c4h3 = 101 +! Identifier for butadiynyl radical +INTEGER, PARAMETER :: IP_sih4 = 102 +! Identifier for silane +INTEGER, PARAMETER :: IP_s2 = 103 +! Identifier for disulfur +INTEGER, PARAMETER :: IP_sf6 = 104 +! Identifier for sulfur hexafluoride +INTEGER, PARAMETER :: IP_cs2 = 105 +! Identifier for carbon disulfide +INTEGER, PARAMETER :: IP_s8 = 106 +! Identifier for octasulfur +INTEGER, PARAMETER :: IP_cn = 107 +! Identifier for cyanogen radical +INTEGER, PARAMETER :: IP_ch3cl = 108 +! Identifier for methyl chloride +INTEGER, PARAMETER :: IP_ch3f = 109 +! Identifier for methyl fluoride +INTEGER, PARAMETER :: IP_ch3br = 110 +! Identifier for methyl bromide ! Column headers for reading data in raw_input @@ -195,7 +265,16 @@ MODULE gas_list_pcf 'C2H5CHO ', 'HOCH2CHO ', 'C2H5COCH3 ', 'MVK ', & 'MACR ', 'PAN ', 'CH3ONO2 ', 'C2H3 ', & 'C2H4 ', 'OH ', 'HCO ', 'N2O4 ', & - 'C2N2 ', 'N2H4 ', 'N2O3 '/) + 'C2N2 ', 'N2H4 ', 'N2O3 ', 'Si ', & + 'SiO ', 'SiO2 ', 'Mg ', 'Mg2 ', & + 'MgO ', 'TiO2 ', 'Fe ', 'FeO ', & + 'Ca ', 'CaO ', 'AlO ', 'Na2 ', & + 'NaO ', 'NaOH ', 'KOH ', 'H- ', & + 'PS ', 'PO ', 'PN ', 'CH3SH ', & + 'CH3S ', 'C2H6S ', 'C2H6S2 ', 'C3H4 ', & + 'C4H3 ', 'SiH4 ', 'S2 ', 'SF6 ', & + 'CS2 ', 'S8 ', 'CN ', 'CH3Cl ', & + 'CH3F ', 'CH3Br ' /) ! File suffixes CHARACTER (LEN=12), PARAMETER :: gas_suffix(npd_gases) = (/ & @@ -217,7 +296,16 @@ MODULE gas_list_pcf 'c2h5cho ', 'hoch2cho ', 'c2h5coch3 ', 'mvk ', & 'macr ', 'pan ', 'ch3ono2 ', 'c2h3 ', & 'c2h4 ', 'oh ', 'hco ', 'n2o4 ', & - 'c2n2 ', 'n2h4 ', 'n2o3 '/) + 'c2n2 ', 'n2h4 ', 'n2o3 ', 'si ', & + 'sio ', 'sio2 ', 'mg ', 'mg2 ', & + 'mgo ', 'tio2 ', 'fe ', 'feo ', & + 'ca ', 'cao ', 'alo ', 'na2 ', & + 'nao ', 'naoh ', 'koh ', 'hminus ', & + 'ps ', 'po ', 'pn ', 'ch3sh ', & + 'ch3s ', 'c2h6s ', 'c2h6s2 ', 'c3h4 ', & + 'c4h3 ', 'sih4 ', 's2 ', 'sf6 ', & + 'cs2 ', 's8 ', 'cn ', 'ch3cl ', & + 'ch3f ', 'ch3br ' /) ! Long names CHARACTER (LEN=20), PARAMETER :: name_absorb(npd_gases) = (/ & @@ -295,7 +383,42 @@ MODULE gas_list_pcf "Dinitrogen tetroxide", & "Cyanogen ", & "Hydrazine ", & - "Dinitrogen trioxide "/) + "Dinitrogen trioxide ", & + "Silicon ", & + "Silicon monoxide ", & + "Silicon dioxide ", & + "Atomic magnesium ", & + "Magnesium dimer ", & + "Magnesium oxide ", & + "Titanium dioxide ", & + "Iron ", & + "Iron(II) oxide ", & + "Calcium ", & + "Calcium oxide ", & + "Aluminium monoxide ", & + "Disodium ", & + "Sodium oxide ", & + "Sodium hydroxide ", & + "Potassium hydroxide ", & + "Hydride anion ", & + "Phosphorus sulfide ", & + "Phosphorus monoxide ", & + "Phosphorus nitride ", & + "Methanethiol ", & + "Methylthiyl radical ", & + "Dimethyl sulfide ", & + "Dimethyl disulfide ", & + "Propyne ", & + "Butadiynyl radical ", & + "Silane ", & + "Disulfur ", & + "Sulfur hexafluoride ", & + "Carbon disulfide ", & + "Octasulfur ", & + "Cyanogen radical ", & + "Methyl chloride ", & + "Methyl fluoride ", & + "Methyl bromide " /) ! Molecular weights taken from "General Inorganic Chemistry" @@ -375,7 +498,42 @@ MODULE gas_list_pcf 91.0110_RealK, & ! 72: N2O4 (from NIST) 52.0348_RealK, & ! 73: C2N2 (from NIST) 32.0452_RealK, & ! 74: N2H4 (from NIST) - 76.0116_RealK /) ! 75: N2O3 (from NIST) + 76.0116_RealK, & ! 75: N2O3 (from NIST) + 28.0855_RealK, & ! 76: Si (from NIST) + 44.0849_RealK, & ! 77: SiO (from NIST) + 60.0843_RealK, & ! 78: SiO2 (from NIST) + 24.3050_RealK, & ! 79: Mg (from NIST) + 48.6100_RealK, & ! 80: Mg2 (from NIST) + 40.3044_RealK, & ! 81: MgO (from NIST) + 79.8660_RealK, & ! 82: TiO2 (from NIST) + 55.8450_RealK, & ! 83: Fe (from NIST) + 71.8440_RealK, & ! 84: FeO (from NIST) + 40.0780_RealK, & ! 85: Ca (from NIST) + 56.0770_RealK, & ! 86: CaO (from NIST) + 42.9809_RealK, & ! 87: AlO (from NIST) + 45.9795_RealK, & ! 88: Na2 (from NIST) + 38.9892_RealK, & ! 89: NaO (from NIST) + 39.9971_RealK, & ! 90: NaOH (from NIST) + 56.1056_RealK, & ! 91: KOH (from NIST) + 1.0085_RealK, & ! 92: H- (from NIST) + 63.0390_RealK, & ! 93: PS (from NIST) + 46.9732_RealK, & ! 94: PO (from NIST) + 44.9805_RealK, & ! 95: PN (from NIST) + 48.1070_RealK, & ! 96: CH3SH (from NIST) + 47.1000_RealK, & ! 97: CH3S (from NIST) + 62.1340_RealK, & ! 98: C2H6S (from NIST) + 94.1990_RealK, & ! 99: C2H6S2 (from NIST) + 40.0638_RealK, & ! 100: C3H4 (from NIST) + 51.0680_RealK, & ! 101: C4H3 (4*C + 3*H) + 32.1173_RealK, & ! 102: SiH4 (from NIST) + 64.1300_RealK, & ! 103: S2 (from NIST) + 146.0550_RealK, & ! 104: SF6 (from NIST) + 76.1410_RealK, & ! 105: CS2 (from NIST) + 256.5200_RealK, & ! 106: S8 (from NIST) + 26.0174_RealK, & ! 107: CN (from NIST) + 50.4880_RealK, & ! 108: CH3Cl (from NIST) + 34.0329_RealK, & ! 109: CH3F (from NIST) + 94.9390_RealK /) ! 110: CH3Br (from NIST) ! Array of identifiers in HITRAN for each gas in the radiation code. @@ -453,7 +611,43 @@ MODULE gas_list_pcf 0, & ! 71: HCO 0, & ! 72: N2O4 48, & ! 73: C2N2 - (0, i=ip_n2h4, npd_gases) /) + 0 , & ! 74: N2H4 + 0, & ! 75: N2H3 + 0 , & ! 76: Si + 0 , & ! 77: SiO + 0 , & ! 78: SiO2 + 0 , & ! 79: Mg + 0 , & ! 80: Mg2 + 0 , & ! 81: MgO + 0 , & ! 82: TiO2 + 0 , & ! 83: Fe + 0 , & ! 84: FeO + 0 , & ! 85: Ca + 0 , & ! 86: CaO + 0 , & ! 87: AlO + 0 , & ! 88: Na2 + 0 , & ! 89: NaO + 0 , & ! 90: NaOH + 0 , & ! 91: KOH + 0 , & ! 92: H- + 0 , & ! 93: PS + 0 , & ! 94: PO + 0 , & ! 95: PN + 0 , & ! 96: CH3SH + 0 , & ! 97: CH3S + 0 , & ! 98: C2H6S + 0 , & ! 99: C2H6S2 + 0 , & ! 100: C3H4 + 0 , & ! 101: C4H3 + 0 , & ! 102: SiH4 + 58 , & ! 103: S2 + 30 , & ! 104: SF6 + 53 , & ! 105: CS2 + 0 , & ! 106: S8 + 0 , & ! 107: CN + 24 , & ! 108: CH3Cl + 51 , & ! 109: CH3F + 40 /) ! 110: CH3Br ! Maximum number of specified HITRAN isotopes for a given absorber INTEGER, PARAMETER :: npd_isotopes = 3 @@ -468,79 +662,261 @@ MODULE gas_list_pcf ! Depolarization factors used to compute the Rayleigh scattering coefficients REAL (RealK), PARAMETER :: depolarization_factor(npd_gases) = (/ & - 0.0_RealK, & ! H2O - 0.0922_RealK, & ! CO2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0_RealK, & ! O3 - 0.1197_RealK, & ! N2O (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.08_RealK, & ! CO (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0_RealK, & ! CH4 - 0.06_RealK, & ! O2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0218_RealK, & ! NO (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0_RealK, & ! SO2 - 0.0_RealK, & ! NO2 - 0.0_RealK, & ! NH3 - 0.0_RealK, & ! HNO3 - 0.0305_RealK, & ! N2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0_RealK, & ! CFC11 - 0.0_RealK, & ! CFC12 - 0.0_RealK, & ! CFC113 - 0.0_RealK, & ! HCFC22 - 0.0_RealK, & ! HFC125 - 0.0_RealK, & ! HFC134a - 0.0_RealK, & ! CFC114 - 0.0_RealK, & ! TiO - 0.0_RealK, & ! VO - 0.0221_RealK, & ! H2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.025_RealK, & ! He (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0_RealK, & ! OCS - 0.0_RealK, & ! Na - 0.0_RealK, & ! K - 0.0_RealK, & ! FeH - 0.0_RealK, & ! CrH - 0.0_RealK, & ! Li - 0.0_RealK, & ! Rb - 0.0_RealK, & ! Cs - 0.0_RealK, & ! PH3 - 0.0_RealK, & ! C2H2 - 0.0_RealK, & ! HCN - 0.0_RealK, & ! H2S - 0.0006_RealK, & ! Ar (Parthasarathy, Indian J. Phys. 25, 21 (1951)) - 0.0279_RealK, & ! Dry air - 0.0_RealK, & ! O - 0.0_RealK, & ! N - (0.0_RealK, i=ip_no3, npd_gases) /) + 0.0_RealK, & ! 1: H2O + 0.0922_RealK, & ! 2: CO2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0_RealK, & ! 3: O3 + 0.1197_RealK, & ! 4: N2O (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.08_RealK, & ! 5: CO (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0_RealK, & ! 6: CH4 + 0.06_RealK, & ! 7: O2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0218_RealK, & ! 8: NO (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0_RealK, & ! 9: SO2 + 0.0_RealK, & ! 10: NO2 + 0.0_RealK, & ! 11: NH3 + 0.0_RealK, & ! 12: HNO3 + 0.0305_RealK, & ! 22: N2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0_RealK, & ! 14: CFC11 + 0.0_RealK, & ! 15: CFC12 + 0.0_RealK, & ! 16: CFC113 + 0.0_RealK, & ! 17: HCFC22 + 0.0_RealK, & ! 18: HFC125 + 0.0_RealK, & ! 19: HFC134a + 0.0_RealK, & ! 20: CFC114 + 0.0_RealK, & ! 21: TiO + 0.0_RealK, & ! 22: VO + 0.0221_RealK, & ! 23: H2 (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.025_RealK, & ! 24: He (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0_RealK, & ! 25: OCS + 0.0_RealK, & ! 26: Na + 0.0_RealK, & ! 27: K + 0.0_RealK, & ! 28: FeH + 0.0_RealK, & ! 29: CrH + 0.0_RealK, & ! 30: Li + 0.0_RealK, & ! 31: Rb + 0.0_RealK, & ! 32: Cs + 0.0_RealK, & ! 33: PH3 + 0.0_RealK, & ! 34: C2H2 + 0.0_RealK, & ! 35: HCN + 0.0_RealK, & ! 36: H2S + 0.0006_RealK, & ! 37: Ar (Parthasarathy, Indian J. Phys. 25, 21 (1951)) + 0.0279_RealK, & ! 38: Dry air + 0.0_RealK, & ! 39: O + 0.0_RealK, & ! 40: N + 0.0_RealK, & ! 41: NO3 + 0.0_RealK, & ! 42: N2O5 + 0.0_RealK, & ! 43: HONO + 0.0_RealK, & ! 44: HO2NO2 + 0.0_RealK, & ! 45: H2O2 + 0.0_RealK, & ! 46: C2H6 + 0.0_RealK, & ! 47: CH3 + 0.0_RealK, & ! 48: H2CO + 0.0_RealK, & ! 49: HO2 + 0.0_RealK, & ! 50: HDO + 0.0_RealK, & ! 51: HCl + 0.0_RealK, & ! 52: HF + 0.0_RealK, & ! 53: cis-OSSO + 0.0_RealK, & ! 54: trans-OSSO + 0.0_RealK, & ! 55: OSO-S + 0.0_RealK, & ! 56: CH3CHO + 0.0_RealK, & ! 57: CH3OOH + 0.0_RealK, & ! 58: CH3COCH3 + 0.0_RealK, & ! 59: CH3COCHO + 0.0_RealK, & ! 60: CHOCHO + 0.0_RealK, & ! 61: C2H5CHO + 0.0_RealK, & ! 62: HOCH2CHO + 0.0_RealK, & ! 63: C2H5COCH3 + 0.0_RealK, & ! 64: MVK + 0.0_RealK, & ! 65: MACR + 0.0_RealK, & ! 66: PAN + 0.0_RealK, & ! 67: CH3ONO2 + 0.0_RealK, & ! 68: C2H3 + 0.0_RealK, & ! 69: C2H4 + 0.0_RealK, & ! 70: OH + 0.0_RealK, & ! 71: HCO + 0.0_RealK, & ! 72: N2O4 + 0.0_RealK, & ! 73: C2N2 + 0.0_RealK, & ! 74: N2H4 + 0.0_RealK, & ! 75: N2H3 + 0.0_RealK, & ! 76: Si + 0.0_RealK, & ! 77: SiO + 0.0_RealK, & ! 78: SiO2 + 0.0_RealK, & ! 79: Mg + 0.0_RealK, & ! 80: Mg2 + 0.0_RealK, & ! 81: MgO + 0.0_RealK, & ! 82: TiO2 + 0.0_RealK, & ! 83: Fe + 0.0_RealK, & ! 84: FeO + 0.0_RealK, & ! 85: Ca + 0.0_RealK, & ! 86: CaO + 0.0_RealK, & ! 87: AlO + 0.0_RealK, & ! 88: Na2 + 0.0_RealK, & ! 89: NaO + 0.0_RealK, & ! 90: NaOH + 0.0_RealK, & ! 91: KOH + 0.0_RealK, & ! 92: H- + 0.0_RealK, & ! 93: PS + 0.0_RealK, & ! 94: PO + 0.0_RealK, & ! 95: PN + 0.0_RealK, & ! 96: CH3SH + 0.0_RealK, & ! 97: CH3S + 0.0_RealK, & ! 98: C2H6S + 0.0_RealK, & ! 99: C2H6S2 + 0.0_RealK, & ! 100: C3H4 + 0.0_RealK, & ! 101: C4H3 + 0.0_RealK, & ! 102: SiH4 + 0.0_RealK, & ! 103: S2 + 0.0_RealK, & ! 104: SF6 + 0.0_RealK, & ! 105: CS2 + 0.0_RealK, & ! 106: S8 + 0.0_RealK, & ! 107: CN + 0.0_RealK, & ! 108: CH3Cl + 0.0_RealK, & ! 109: CH3F + 0.0_RealK /) ! 110: CH3Br ! Minimum wavelength to consider Rayleigh scattering REAL (RealK), PARAMETER :: rayleigh_cutoff(npd_gases) = (/ & - 175.0E-09_RealK, & ! H2O ( threshold for H2O -> O(1D) + H2 ) - 167.1E-09_RealK, & ! CO2 ( threshold for CO2 -> CO + O(1D) ) - 0.0_RealK, & ! O3 - 0.0_RealK, & ! N2O - 0.0_RealK, & ! CO - 0.0_RealK, & ! CH4 - 175.0E-09_RealK, & ! O2 ( threshold for O2 -> O(3P) + O(1D) ) - 0.0_RealK, & ! NO - 0.0_RealK, & ! SO2 - 0.0_RealK, & ! NO2 - 0.0_RealK, & ! NH3 - 0.0_RealK, & ! HNO3 - 79.8E-09_RealK, & ! N2 ( threshold for N2 -> N2+ ) - (0.0_RealK, i=ip_cfc11, npd_gases) /) + 175.0E-09_RealK, & ! 1: H2O ( threshold for H2O -> O(1D) + H2 ) + 167.1E-09_RealK, & ! 2: CO2 ( threshold for CO2 -> CO + O(1D) ) + 0.0_RealK, & ! 3: O3 + 0.0_RealK, & ! 4: N2O + 0.0_RealK, & ! 5: CO + 0.0_RealK, & ! 6: CH4 + 175.0E-09_RealK, & ! 7: O2 ( threshold for O2 -> O(3P) + O(1D) ) + 0.0_RealK, & ! 8: NO + 0.0_RealK, & ! 9: SO2 + 0.0_RealK, & ! 10: NO2 + 0.0_RealK, & ! 11: NH3 + 0.0_RealK, & ! 12: HNO3 + 79.8E-09_RealK, & ! 13: N2 ( threshold for N2 -> N2+ ) + 0.0_RealK, & ! 14: CFC11 + 0.0_RealK, & ! 15: CFC12 + 0.0_RealK, & ! 16: CFC113 + 0.0_RealK, & ! 17: HCFC22 + 0.0_RealK, & ! 18: HFC125 + 0.0_RealK, & ! 19: HFC134a + 0.0_RealK, & ! 20: CFC114 + 0.0_RealK, & ! 21: TiO + 0.0_RealK, & ! 22: VO + 0.0_RealK, & ! 23: H2 + 0.0_RealK, & ! 24: He + 0.0_RealK, & ! 25: OCS + 0.0_RealK, & ! 26: Na + 0.0_RealK, & ! 27: K + 0.0_RealK, & ! 28: FeH + 0.0_RealK, & ! 29: CrH + 0.0_RealK, & ! 30: Li + 0.0_RealK, & ! 31: Rb + 0.0_RealK, & ! 32: Cs + 0.0_RealK, & ! 33: PH3 + 0.0_RealK, & ! 34: C2H2 + 0.0_RealK, & ! 35: HCN + 0.0_RealK, & ! 36: H2S + 0.0_RealK, & ! 37: Ar + 0.0_RealK, & ! 38: Dry air + 0.0_RealK, & ! 39: O + 0.0_RealK, & ! 40: N + 0.0_RealK, & ! 41: NO3 + 0.0_RealK, & ! 42: N2O5 + 0.0_RealK, & ! 43: HONO + 0.0_RealK, & ! 44: HO2NO2 + 0.0_RealK, & ! 45: H2O2 + 0.0_RealK, & ! 46: C2H6 + 0.0_RealK, & ! 47: CH3 + 0.0_RealK, & ! 48: H2CO + 0.0_RealK, & ! 49: HO2 + 0.0_RealK, & ! 50: HDO + 0.0_RealK, & ! 51: HCl + 0.0_RealK, & ! 52: HF + 0.0_RealK, & ! 53: cis-OSSO + 0.0_RealK, & ! 54: trans-OSSO + 0.0_RealK, & ! 55: OSO-S + 0.0_RealK, & ! 56: CH3CHO + 0.0_RealK, & ! 57: CH3OOH + 0.0_RealK, & ! 58: CH3COCH3 + 0.0_RealK, & ! 59: CH3COCHO + 0.0_RealK, & ! 60: CHOCHO + 0.0_RealK, & ! 61: C2H5CHO + 0.0_RealK, & ! 62: HOCH2CHO + 0.0_RealK, & ! 63: C2H5COCH3 + 0.0_RealK, & ! 64: MVK + 0.0_RealK, & ! 65: MACR + 0.0_RealK, & ! 66: PAN + 0.0_RealK, & ! 67: CH3ONO2 + 0.0_RealK, & ! 68: C2H3 + 0.0_RealK, & ! 69: C2H4 + 0.0_RealK, & ! 70: OH + 0.0_RealK, & ! 71: HCO + 0.0_RealK, & ! 72: N2O4 + 0.0_RealK, & ! 73: C2N2 + 0.0_RealK, & ! 74: N2H4 + 0.0_RealK, & ! 75: N2H3 + 0.0_RealK, & ! 76: Si + 0.0_RealK, & ! 77: SiO + 0.0_RealK, & ! 78: SiO2 + 0.0_RealK, & ! 79: Mg + 0.0_RealK, & ! 80: Mg2 + 0.0_RealK, & ! 81: MgO + 0.0_RealK, & ! 82: TiO2 + 0.0_RealK, & ! 83: Fe + 0.0_RealK, & ! 84: FeO + 0.0_RealK, & ! 85: Ca + 0.0_RealK, & ! 86: CaO + 0.0_RealK, & ! 87: AlO + 0.0_RealK, & ! 88: Na2 + 0.0_RealK, & ! 89: NaO + 0.0_RealK, & ! 90: NaOH + 0.0_RealK, & ! 91: KOH + 0.0_RealK, & ! 92: H- + 0.0_RealK, & ! 93: PS + 0.0_RealK, & ! 94: PO + 0.0_RealK, & ! 95: PN + 0.0_RealK, & ! 96: CH3SH + 0.0_RealK, & ! 97: CH3S + 0.0_RealK, & ! 98: C2H6S + 0.0_RealK, & ! 99: C2H6S2 + 0.0_RealK, & ! 100: C3H4 + 0.0_RealK, & ! 101: C4H3 + 0.0_RealK, & ! 102: SiH4 + 0.0_RealK, & ! 103: S2 + 0.0_RealK, & ! 104: SF6 + 0.0_RealK, & ! 105: CS2 + 0.0_RealK, & ! 106: S8 + 0.0_RealK, & ! 107: CN + 0.0_RealK, & ! 108: CH3Cl + 0.0_RealK, & ! 109: CH3F + 0.0_RealK /) ! 110: CH3Br ! Maximum number of photolysis products for a given absorber INTEGER, PARAMETER :: npd_products = 9 INTEGER, PARAMETER :: npd_pathway = npd_gases * (npd_products + 1) CHARACTER(LEN=56), PARAMETER :: blank = "" + ! Description of photolysis products -CHARACTER(LEN=56), PARAMETER :: photol_products(npd_products, npd_gases) & - = RESHAPE([CHARACTER(LEN=56) :: & +! 1: H2O +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_h2o(npd_products) & + = [CHARACTER(LEN=56) :: & "H2O -> O(3P) + H2 ", & "H2O -> OH(X2Pi) + H ", & "H2O -> O(1D) + H2 ", & "H2O -> OH(A2Sigma+) + H ", & "H2O -> O(3P) + H + H ", & - (blank, i=1, npd_products-5), & ! H2O + (blank, i=1, npd_products-5)] + +REAL (RealK), PARAMETER :: threshold_wavelength_h2o(npd_products) & + = [REAL(RealK) :: & + 246.0E-09_RealK, & ! H2O -> O(3P) + H2 + 242.0E-09_RealK, & ! H2O -> OH(X2Pi) + H + 175.0E-09_RealK, & ! H2O -> O(1D) + H2 + 134.0E-09_RealK, & ! H2O -> OH(A2Sigma+) + H + 129.0E-09_RealK, & ! H2O -> O(3P) + H + H + (0.0_RealK, i=1, npd_products-5)] + +! 2: CO2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_co2(npd_products) & + = [CHARACTER(LEN=56) :: & "CO2 -> CO + O(3P) ", & "CO2 -> CO + O(1D) ", & "CO2 -> CO + O(1S) ", & @@ -549,7 +925,24 @@ MODULE gas_list_pcf "CO2 -> CO + O+ ", & "CO2 -> CO+ + O(3P) ", & "CO2 -> O2 + C+ ", & - (blank, i=1, npd_products-8), & ! CO2 + (blank, i=1, npd_products-8)] + +REAL (RealK), PARAMETER :: threshold_wavelength_co2(npd_products) & + = [REAL(RealK) :: & + 227.5E-09_RealK, & ! CO2 -> CO + O(3P) + 167.1E-09_RealK, & ! CO2 -> CO + O(1D) + 128.6E-09_RealK, & ! CO2 -> CO + O(1S) + 108.2E-09_RealK, & ! CO2 -> CO(a3Pi) + O(3P) + 89.922E-09_RealK, & ! CO2 -> CO2+ + 65.026E-09_RealK, & ! CO2 -> CO + O+ + 63.693E-09_RealK, & ! CO2 -> CO+ + O + 54.655E-09_RealK, & ! CO2 -> O2 + C+ + (0.0_RealK, i=1, npd_products-8)] ! Heubner 92 + +! 3: O3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_o3(npd_products) & + = [CHARACTER(LEN=56) :: & "O3 -> O(3P) + O2(X3Sigmag-) ", & "O3 -> O(3P) + O2(a1Deltag) ", & "O3 -> O(3P) + O2(b1Sigmag+) ", & @@ -558,19 +951,72 @@ MODULE gas_list_pcf "O3 -> O(1D) + O2(b1Sigmag+) ", & "O3 -> 3 O(3P) ", & "O3 -> O(1S) + O2(a1Deltag) ", & - (blank, i=1, npd_products-8), & ! O3 + (blank, i=1, npd_products-8)] + +REAL (RealK), PARAMETER :: threshold_wavelength_o3(npd_products) & + = [REAL(RealK) :: & + 1180.0E-09_RealK, & ! O3 -> O(3P) + O2(X3Sigmag-) + 612.0E-09_RealK, & ! O3 -> O(3P) + O2(a1Deltag) + 463.0E-09_RealK, & ! O3 -> O(3P) + O2(b1Sigmag+) + 411.0E-09_RealK, & ! O3 -> O(1D) + O2(X3Sigmag-) + 310.0E-09_RealK, & ! O3 -> O(1D) + O2(a1Deltag) + 267.0E-09_RealK, & ! O3 -> O(1D) + O2(b1Sigmag+) + 201.0E-09_RealK, & ! O3 -> 3 O(3P) + 196.0E-09_RealK, & ! O3 -> O(1S) + O2(a1Deltag) + (0.0_RealK, i=1, npd_products-8)] + +! 4: N2O +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n2o(npd_products) & + = [CHARACTER(LEN=56) :: & "N2O -> N2 + O(1D) ", & "N2O -> N2 + O(3P) ", & "N2O -> N(4S) + NO(2Pi) ", & "N2O -> N2 + O(1S) ", & - (blank, i=1, npd_products-4), & ! N2O + (blank, i=1, npd_products-4)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n2o(npd_products) & + = [REAL(RealK) :: & + 336.0E-09_RealK, & ! N2O -> N2 + O(1D) + 713.0E-09_RealK, & ! N2O -> N2 + O(3P) + 248.0E-09_RealK, & ! N2O -> N(4S) + NO(2Pi) + 210.0E-09_RealK, & ! N2O -> N2 + O(1S) + (0.0_RealK, i=1, npd_products-4)] + +! 5: CO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_co(npd_products) & + = [CHARACTER(LEN=56) :: & "CO -> C + O(3P) ", & - (blank, i=1, npd_products-1), & ! CO + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_co(npd_products) & + = [REAL(RealK) :: & + 111.78E-09_RealK, & ! CO -> CO + O(3P) + (0.0_RealK, i=1, npd_products-1)] ! Huebner 92 + +! 6: CH4 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch4(npd_products) & + = [CHARACTER(LEN=56) :: & "CH4 -> CH3 + H ", & "CH4 -> CH2(1) + H2 ", & "CH4 -> CH2(3) + H + H ", & "CH4 -> CH + H2 + H ", & - (blank, i=1, npd_products-4), & ! CH4 + (blank, i=1, npd_products-4)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch4(npd_products) & + = [REAL(RealK) :: & + 277.0E-09_RealK, & ! CH4 -> CH3 + H + 237.3E-09_RealK, & ! CH4 -> CH2(1) + H2 + 132.2E-09_RealK, & ! CH4 -> CH2(3) + H + H + 137.0E-09_RealK, & ! CH4 -> CH + H2 + H + (0.0_RealK, i=1, npd_products-4)] ! Huebner 92 + +! 7: O2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_o2(npd_products) & + = [CHARACTER(LEN=56) :: & "O2 -> O(3P) + O(3P) ", & "O2 -> O(3P) + O(1D) ", & "O2 -> O(1D) + O(1D) ", & @@ -578,58 +1024,163 @@ MODULE gas_list_pcf "O2 -> O(1D) + O(1S) ", & "O2 -> O2+ ", & "O2 -> O+ + O ", & - (blank, i=1, npd_products-7), & ! O2 + (blank, i=1, npd_products-7)] + +REAL (RealK), PARAMETER :: threshold_wavelength_o2(npd_products) & + = [REAL(RealK) :: & + 242.3E-09_RealK, & ! O2 -> O(3P) + O(3P) + 175.0E-09_RealK, & ! O2 -> O(3P) + O(1D) + 137.0E-09_RealK, & ! O2 -> O(1D) + O(1D) + 132.0E-09_RealK, & ! O2 -> O(3P) + O(1S) + 110.0E-09_RealK, & ! O2 -> O(1D) + O(1S) + 102.78E-09_RealK, & ! O2 -> O2+ + 66.2E-09_RealK, & ! O2 -> O+ + O + (0.0_RealK, i=1, npd_products-7)] + +! 8: NO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_no(npd_products) & + = [CHARACTER(LEN=56) :: & "NO -> O(3P) + N(4S) ", & - (blank, i=1, npd_products-1), & ! NO + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_no(npd_products) & + = [REAL(RealK) :: & + 191.0E-09_RealK, & ! NO -> O(3P) + N(4S) + (0.0_RealK, i=1, npd_products-1)] ! Huebner 92 + +! 9: SO2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_so2(npd_products) & + = [CHARACTER(LEN=56) :: & "SO2 -> SO + O(3P) ", & - (blank, i=1, npd_products-1), & ! SO2 + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_so2(npd_products) & + = [REAL(RealK) :: & + 218.7E-09_RealK, & ! SO2 -> SO + O(3P) + (0.0_RealK, i=1, npd_products-1)] ! Becker 95 + +! 10: NO2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_no2(npd_products) & + = [CHARACTER(LEN=56) :: & "NO2 -> NO + O(3P) ", & "NO2 -> NO + O(1D) ", & - (blank, i=1, npd_products-2), & ! NO2 + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_no2(npd_products) & + = [REAL(RealK) :: & + 398.0E-09_RealK, & ! NO2 -> NO + O(3P) + 244.0E-09_RealK, & ! NO2 -> NO + O(1D) + (0.0_RealK, i=1, npd_products-2)] + +! 11: NH3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_nh3(npd_products) & + = [CHARACTER(LEN=56) :: & "NH3 -> NH2 + H ", & - (blank, i=1, npd_products-1), & ! NH3 + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_nh3(npd_products) & + = [REAL(RealK) :: & + 279.8E-09_RealK, & ! NH3 -> NH2 + H + (0.0_RealK, i=1, npd_products-1)] ! Huebner 92 + +! 12: HNO3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_hno3(npd_products) & + = [CHARACTER(LEN=56) :: & "HNO3 -> OH + NO2 ", & "HNO3 -> HONO + O(3P) ", & "HNO3 -> H + NO3 ", & "HNO3 -> OH + NO2*(12B2) ", & "HNO3 -> HONO + O(1D) ", & "HNO3 -> HONO (a3A)+ O(3P) ", & - (blank, i=1, npd_products-6), & ! HNO3 + (blank, i=1, npd_products-6)] + +REAL (RealK), PARAMETER :: threshold_wavelength_hno3(npd_products) & + = [REAL(RealK) :: & + 604.0E-09_RealK, & ! HNO3 -> OH + NO2 + 393.0E-09_RealK, & ! HNO3 -> HONO + O(3P) + 278.0E-09_RealK, & ! HNO3 -> H + NO3 + 381.0E-09_RealK, & ! HNO3 -> OH + NO2*(12B2) + 242.0E-09_RealK, & ! HNO3 -> HONO + O(1D) + 216.0E-09_RealK, & ! HNO3 -> HONO (a3A)+ O(3P) + (0.0_RealK, i=1, npd_products-6)] ! IUPAC PNOx2 + +! 13: N2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n2(npd_products) & + = [CHARACTER(LEN=56) :: & "N2 -> N + N ", & "N2 -> N2+ ", & "N2 -> N+ + N ", & - (blank, i=1, npd_products-3), & ! N2 - (blank, i=1, npd_products), & ! CFC11 - (blank, i=1, npd_products), & ! CFC12 - (blank, i=1, npd_products), & ! CFC113 - (blank, i=1, npd_products), & ! HCFC22 - (blank, i=1, npd_products), & ! HFC125 - (blank, i=1, npd_products), & ! HFC134a - (blank, i=1, npd_products), & ! CFC114 - (blank, i=1, npd_products), & ! TiO - (blank, i=1, npd_products), & ! VO + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n2(npd_products) & + = [REAL(RealK) :: & + 98.6E-09_RealK, & ! N2 -> N + N + 79.8E-09_RealK, & ! N2 -> N2+ + 51.0E-09_RealK, & ! N2 -> N+ + N + (0.0_RealK, i=1, npd_products-3)] + +! 23: H2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_h2(npd_products) & + = [CHARACTER(LEN=56) :: & "H2 -> H + H ", & - (blank, i=1, npd_products-1), & ! H2 - (blank, i=1, npd_products), & ! He + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_h2(npd_products) & + = [REAL(RealK) :: & + 276.885E-09_RealK, & ! H2 -> H + H + (0.0_RealK, i=1, npd_products-1)] ! Huebner 92 + +! 25: OCS +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ocs(npd_products) & + = [CHARACTER(LEN=56) :: & "OCS -> CO + S(3P) ", & "OCS -> CO + S(1D) ", & "OCS -> CO + S(1S) ", & - (blank, i=1, npd_products-3), & ! OCS - (blank, i=1, npd_products), & ! Na - (blank, i=1, npd_products), & ! K - (blank, i=1, npd_products), & ! FeH - (blank, i=1, npd_products), & ! CrH - (blank, i=1, npd_products), & ! Li - (blank, i=1, npd_products), & ! Rb - (blank, i=1, npd_products), & ! Cs - (blank, i=1, npd_products), & ! PH3 + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ocs(npd_products) & + = [REAL(RealK) :: & + 388.0E-09_RealK, & ! OCS -> CO + S(3P) + 285.0E-09_RealK, & ! OCS -> CO + S(1D) + 209.0E-09_RealK, & ! OCS -> CO + S(1S) + (0.0_RealK, i=1, npd_products-3)] + +! 34: C2H2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2h2(npd_products) & + = [CHARACTER(LEN=56) :: & "C2H2 -> C2H + H ", & - (blank, i=1, npd_products-1), & ! C2H2 + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2h2(npd_products) & + = [REAL(RealK) :: & + 230.6E-09_RealK, & ! C2H2 -> C2H + H + (0.0_RealK, i=1, npd_products-1)] ! Huebner 92 + +! 35: HCN +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_hcn(npd_products) & + = [CHARACTER(LEN=56) :: & "HCN -> CN + H ", & - (blank, i=1, npd_products-1), & ! HCN - (blank, i=1, npd_products), & ! H2S - (blank, i=1, npd_products), & ! Ar - (blank, i=1, npd_products), & ! Dry air + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_hcn(npd_products) & + = [REAL(RealK) :: & + 195.0E-09_RealK, & ! HCN -> CN + H + (0.0_RealK, i=1, npd_products-1)] ! Huebner 92 + +! 39: O +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_o(npd_products) & + = [CHARACTER(LEN=56) :: & "O -> O+(4S) ", & "O -> O+(2D) ", & "O -> O+(2P) ", & @@ -637,19 +1188,79 @@ MODULE gas_list_pcf "O -> O+(2Pe) ", & "O -> O++ ", & "O -> O+++ ", & - (blank, i=1, npd_products-7), & ! O + (blank, i=1, npd_products-7)] + +REAL (RealK), PARAMETER :: threshold_wavelength_o(npd_products) & + = [REAL(RealK) :: & + 91.25E-09_RealK, & ! O -> O+(4S) + 73.18E-09_RealK, & ! O -> O+(2D) + 66.58E-09_RealK, & ! O -> O+(2P) + 43.50E-09_RealK, & ! O -> O+(4Pe) + 31.00E-09_RealK, & ! O -> O+(2Pe) + 24.80E-09_RealK, & ! O -> O++ + 12.179E-09_RealK, & ! O -> O+++ + (0.0_RealK, i=1, npd_products-7)] + +! 40: N +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n(npd_products) & + = [CHARACTER(LEN=56) :: & "N -> N+ ", & "N -> N++ ", & - (blank, i=1, npd_products-2), & ! N + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n(npd_products) & + = [REAL(RealK) :: & + 85.92E-09_RealK, & ! N -> N+ + 28.00E-09_RealK, & ! N -> N++ + (0.0_RealK, i=1, npd_products-2)] + +! 41: NO3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_no3(npd_products) & + = [CHARACTER(LEN=56) :: & "NO3 -> NO + O2 ", & "NO3 -> NO2 + O(3P) ", & - (blank, i=1, npd_products-2) , & ! NO3 + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_no3(npd_products) & + = [REAL(RealK) :: & + 7320.0E-09_RealK, & ! NO3 -> NO + O2 + 574.0E-09_RealK, & ! NO3 -> NO2 + O(3P) + (0.0_RealK, i=1, npd_products-2)] ! JPL 19-5 + +! 42: N2O5 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n2o5(npd_products) & + = [CHARACTER(LEN=56) :: & "N2O5 -> NO3 + NO2 ", & "N2O5 -> NO3 + NO + O(3P) ", & - (blank, i=1, npd_products-2) , & ! N2O5 + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n2o5(npd_products) & + = [REAL(RealK) :: & + 1255.0E-09_RealK, & ! N2O5 -> NO3 + NO2 + 298.0E-09_RealK, & ! N2O5 -> NO3 + NO + O(3P) + (0.0_RealK, i=1, npd_products-2)] ! JPL 19-5 + +! 43: HONO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_hono(npd_products) & + = [CHARACTER(LEN=56) :: & "HONO -> OH + NO ", & "HONO -> H + NO2 ", & - (blank, i=1, npd_products-2) , & ! HONO + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_hono(npd_products) & + = [REAL(RealK) :: & + 579.0E-09_RealK, & ! HONO -> OH + NO + 362.0E-09_RealK, & ! HONO -> H + NO2 + (0.0_RealK, i=1, npd_products-2)] ! JPL 19-5 + +! 44: HO2NO2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ho2no2(npd_products) & + = [CHARACTER(LEN=56) :: & "HO2NO2 -> HO2 + NO2 ", & "HO2NO2 -> OH + NO3 ", & "HO2NO2 -> O(3P) + HNO3 ", & @@ -659,78 +1270,283 @@ MODULE gas_list_pcf "HO2NO2 -> H + O(3P) + NO3 ", & "HO2NO2 -> HONO + O2(1Sigma) ", & "HO2NO2 -> HONO + O2(1Lambda) ", & - (blank, i=1, npd_products-9) , & ! HO2NO2 + (blank, i=1, npd_products-9)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ho2no2(npd_products) & + = [REAL(RealK) :: & + 1207.0E-09_RealK, & ! HO2NO2 -> HO2 + NO2 + 726.0E-09_RealK, & ! HO2NO2 -> OH + NO3 + 713.0E-09_RealK, & ! HO2NO2 -> O(3P) + HNO3 + 393.0E-09_RealK, & ! HO2NO2 -> H + NO2 + O2 + 339.0E-09_RealK, & ! HO2NO2 -> HO2 + NO + O(3P) + 321.0E-09_RealK, & ! HO2NO2 -> OH + NO2 + O(3P) + 201.0E-09_RealK, & ! HO2NO2 -> H + O(3P) + NO3 + 911.0E-09_RealK, & ! HO2NO2 -> HONO + O2(1Sigma) + 1744.0E-09_RealK, & ! HO2NO2 -> HONO + O2(1Lambda) + (0.0_RealK, i=1, npd_products-9)] ! JPL 19-5 + +! 45: H2O2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_h2o2(npd_products) & + = [CHARACTER(LEN=56) :: & "H2O2 -> OH + OH ", & "H2O2 -> H2O + O(1D) ", & "H2O2 -> H + HO2 ", & - (blank, i=1, npd_products-3) , & ! H2O2 + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_h2o2(npd_products) & + = [REAL(RealK) :: & + 557.0E-09_RealK, & ! H2O2 -> OH + OH + 359.0E-09_RealK, & ! H2O2 -> H2O + O(1D) + 324.0E-09_RealK, & ! H2O2 -> H + HO2 + (0.0_RealK, i=1, npd_products-3)] ! JPL 19-5 + +! 46: C2H6 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2h6(npd_products) & + = [CHARACTER(LEN=56) :: & "C2H6 -> C2H4 + H2 ", & "C2H6 -> C2H4 + H + H ", & "C2H6 -> C2H2 + H2 + H2 ", & "C2H6 -> CH4 + CH2(1) ", & "C2H6 -> CH3 + CH3 ", & - (blank, i=1, npd_products-5) , & ! C2H6 - "CH3 -> CH2(1) + H ", & ! - (blank, i=1, npd_products-1) , & ! CH3 + (blank, i=1, npd_products-5)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2h6(npd_products) & + = [REAL(RealK) :: & + 874.3E-09_RealK, & ! C2H6 -> C2H4 + H2 : Huebner 92 + 290.0E-09_RealK, & ! C2H6 -> C2H4 + H + H :Huebner 92/Lias 70 + 428.7E-09_RealK, & ! C2H6 -> C2H2 + H2 + H2 :Chang 2020 + 272.6E-09_RealK, & ! C2H6 -> CH4 + CH2(1) :Huebner 92 + 322.0E-09_RealK, & ! C2H6 -> CH3 + CH3 :Huebner 92 + (0.0_RealK, i=1, npd_products-5)] + +! 47: CH3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch3(npd_products) & + = [CHARACTER(LEN=56) :: & + "CH3 -> CH2(1) + H ", & + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch3(npd_products) & + = [REAL(RealK) :: & + 216.0E-09_RealK, & ! CH3 -> CH2(1) + H + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero qy + +! 48: H2CO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_h2co(npd_products) & + = [CHARACTER(LEN=56) :: & "H2CO -> H + HCO ", & "H2CO -> H2 + CO ", & "H2CO -> H + H + CO ", & - (blank, i=1, npd_products-3) , & ! H2CO + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_h2co(npd_products) & + = [REAL(RealK) :: & + 330.0E-09_RealK, & ! H2CO -> H + HCO + 361.0E-09_RealK, & ! H2CO -> H2 + CO + 283.0E-09_RealK, & ! H2CO -> H + H + CO + (0.0_RealK, i=1, npd_products-3)] ! JPL 19-5 + +! 49: HO2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ho2(npd_products) & + = [CHARACTER(LEN=56) :: & "HO2 -> OH + O(3P) ", & "HO2 -> OH + O(1D) ", & - (blank, i=1, npd_products-2) , & ! HO2 - (blank, i=1, npd_products) , & ! HDO - (blank, i=1, npd_products) , & ! HCl - (blank, i=1, npd_products) , & ! HF - (blank, i=1, npd_products) , & ! cis-OSSO - (blank, i=1, npd_products) , & ! trans-OSSO - (blank, i=1, npd_products) , & ! OSO-S + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ho2(npd_products) & + = [REAL(RealK) :: & + 438.0E-09_RealK, & ! HO2 -> OH + O(3P) + 259.0E-09_RealK, & ! HO2 -> OH + O(1D) + (0.0_RealK, i=1, npd_products-2)] ! JPL 19-5 + +! 56: CH3CHO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch3cho(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3CHO -> CH3 + HCO ", & "CH3CHO -> CH4 + CO ", & "CH3CHO -> CH3CO + H ", & - (blank, i=1, npd_products-3) , & ! CH3CHO + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch3cho(npd_products) & + = [REAL(RealK) :: & + 335.0E-09_RealK, & ! CH3CHO -> CH3 + HCO + 1.0_RealK, & ! CH3CHO -> CH4 + CO + 320.0E-09_RealK, & ! CH3CHO -> CH3CO + H + (0.0_RealK, i=1, npd_products-3)] ! JPL 19-5 + +! 57: CH3OOH +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch3ooh(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3OOH -> CH3O + OH ", & "CH3OOH -> CH3 + HO2 ", & "CH3OOH -> CH3O2 + H ", & "CH3OOH -> CH3OH + O(3P) ", & - (blank, i=1, npd_products-4) , & ! CH3OOH + (blank, i=1, npd_products-4)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch3ooh(npd_products) & + = [REAL(RealK) :: & + 645.0E-09_RealK, & ! CH3OOH -> CH3O + OH + 410.0E-09_RealK, & ! CH3OOH -> CH3 + HO2 + 334.0E-09_RealK, & ! CH3OOH -> CH3O2 + H + 670.0E-09_RealK, & ! CH3OOH -> CH3OH + O(3P) + (0.0_RealK, i=1, npd_products-4)] ! JPL 19-5 + +! 58: CH3COCH3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch3coch3(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3COCH3 -> CH3CO + CH3 ", & "CH3COCH3 -> 2 CH3 + CO ", & - (blank, i=1, npd_products-2) , & ! CH3COCH3 + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch3coch3(npd_products) & + = [REAL(RealK) :: & + 338.0E-09_RealK, & ! CH3COCH3 -> CH3CO + CH3 + 299.0E-09_RealK, & ! CH3COCH3 -> 2 CH3 + CO + (0.0_RealK, i=1, npd_products-2)] ! JPL 19-5 + +! 59: CH3COCHO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch3cocho(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3COCHO -> CH3CO + HCO ", & "CH3COCHO -> CH4 + 2 CO ", & "CH3COCHO -> CH3CHO + CO ", & - (blank, i=1, npd_products-3) , & ! CH3COCHO + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch3cocho(npd_products) & + = [REAL(RealK) :: & + 422.0E-09_RealK, & ! CH3COCHO -> CH3CO + HCO + 1.0_RealK, & ! CH3COCHO -> CH4 + 2 CO + 1.0_RealK, & ! CH3COCHO -> CH3CHO + CO + (0.0_RealK, i=1, npd_products-3)] ! JPL 19-5 + +! 60: CHOCHO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_chocho(npd_products) & + = [CHARACTER(LEN=56) :: & "CHOCHO -> HCO + HCO ", & "CHOCHO -> H2 + 2 CO ", & "CHOCHO -> HCHO + CO ", & "CHOCHO -> H + CO + HCO ", & - (blank, i=1, npd_products-4) , & ! CHOCHO + (blank, i=1, npd_products-4)] + +REAL (RealK), PARAMETER :: threshold_wavelength_chocho(npd_products) & + = [REAL(RealK) :: & + 399.0E-09_RealK, & ! CHOCHO -> HCO + HCO + 1.0_RealK, & ! CHOCHO -> H2 + 2 CO + 1.0_RealK, & ! CHOCHO -> HCHO + CO + 329.0E-09_RealK, & ! CHOCHO -> H + CO + HCO + (0.0_RealK, i=1, npd_products-4)] ! JPL 19-5 + +! 61: C2H5CHO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2h5cho(npd_products) & + = [CHARACTER(LEN=56) :: & "C2H5CHO -> C2H5 + HCO ", & "C2H5CHO -> C2H6 + CO ", & "C2H5CHO -> C2H4 + HCHO ", & "C2H5CHO -> CH3 + CH2CHO ", & - (blank, i=1, npd_products-4) , & ! C2H5CHO + (blank, i=1, npd_products-4)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2h5cho(npd_products) & + = [REAL(RealK) :: & + 341.0E-09_RealK, & ! C2H5CHO -> C2H5 + HCO + 1.0_RealK, & ! C2H5CHO -> C2H6 + CO + 926.0E-09_RealK, & ! C2H5CHO -> C2H4 + HCHO + 349.0E-09_RealK, & ! C2H5CHO -> CH3 + CH2CHO + (0.0_RealK, i=1, npd_products-4)] ! JPL 19-5 + +! 62: HOCH2CHO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_hoch2cho(npd_products) & + = [CHARACTER(LEN=56) :: & "HOCH2CHO -> CH2OH + HCO ", & "HOCH2CHO -> CH3OH + CO ", & "HOCH2CHO -> OH + CH2CHO ", & "HOCH2CHO -> HOCH2CO + H ", & - (blank, i=1, npd_products-4) , & ! HOCH2CHO + (blank, i=1, npd_products-4)] + +REAL (RealK), PARAMETER :: threshold_wavelength_hoch2cho(npd_products) & + = [REAL(RealK) :: & + 347.0E-09_RealK, & ! HOCH2CHO -> CH2OH + HCO + 1910.0E-09_RealK, & ! HOCH2CHO -> CH3OH + CO + 328.0E-09_RealK, & ! HOCH2CHO -> OH + CH2CHO + 314.0E-09_RealK, & ! HOCH2CHO -> HOCH2CO + H + (0.0_RealK, i=1, npd_products-4)] + +! 63: C2H5COCH3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2h5coch3(npd_products) & + = [CHARACTER(LEN=56) :: & "C2H5COCH3 -> CH3CO + C2H5 ", & "C2H5COCH3 -> C2H5CO + CH3 ", & "C2H5COCH3 -> C2H5 + CO + CH3 ", & - (blank, i=1, npd_products-3) , & ! C2H5COCH3 + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2h5coch3(npd_products) & + = [REAL(RealK) :: & + 342.0E-09_RealK, & ! C2H5COCH3 -> CH3CO + C2H5 + 339.0E-09_RealK, & ! C2H5COCH3 -> C2H5CO + CH3 + 303.0E-09_RealK, & ! C2H5COCH3 -> C2H5 + CO + CH3 + (0.0_RealK, i=1, npd_products-3)] ! Zborowska 21 + +! 64: CH3C(O)CH=CH2 (MVK) +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_mvk(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3C(O)CH=CH2 -> CH3-CH=CH2 + CO ", & "CH3C(O)CH=CH2 -> CH=CH2 + CH3C(O) ", & "CH3C(O)CH=CH2 -> CH=CH2C(O) + CH3 ", & - (blank, i=1, npd_products-3) , & ! CH3C(O)CH=CH2 (MVK) + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_mvk(npd_products) & + = [REAL(RealK) :: & + 1.0_RealK, & ! CH3C(O)CH=CH2 -> CH3-CH=CH2 + CO + 1.0_RealK, & ! CH3C(O)CH=CH2 -> CH=CH2 + CH3C(O) + 1.0_RealK, & ! CH3C(O)CH=CH2 -> CH=CH2C(O) + CH3 + (0.0_RealK, i=1, npd_products-3)] ! JPL 19-5 + +! 65: CH2=C(CH3)CHO (MACR) +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_macr(npd_products) & + = [CHARACTER(LEN=56) :: & "CH2=C(CH3)CHO -> CH2=CCH3 + CHO ", & "CH2=C(CH3)CHO -> C3H6 + CO ", & "CH2=C(CH3)CHO -> H + CH2=C(CH3)CO ", & - (blank, i=1, npd_products-3) , & ! CH2=C(CH3)CHO (MACR) + (blank, i=1, npd_products-3)] + +REAL (RealK), PARAMETER :: threshold_wavelength_macr(npd_products) & + = [REAL(RealK) :: & + 1.0_RealK, & ! CH2=C(CH3)CHO -> CH2=CCH3 + CHO + 1.0_RealK, & ! CH2=C(CH3)CHO -> C3H6 + CO + 1.0_RealK, & ! CH2=C(CH3)CHO -> H + CH2=C(CH3)CO + (0.0_RealK, i=1, npd_products-3)] ! JPL 19-5 + +! 66: CH3C(O)OONO2 (PAN) +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_pan(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3C(O)OONO2 -> CH3C(O)OO + NO2 ", & "CH3C(O)OONO2 -> CH3C(O)O + NO3 ", & - (blank, i=1, npd_products-2) , & ! CH3C(O)OONO2 (PAN) + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_pan(npd_products) & + = [REAL(RealK) :: & + 1004.0E-09_RealK, & ! CH3C(O)OONO2 -> CH3C(O)OO + NO2 + 963.0E-09_RealK, & ! CH3C(O)OONO2 -> CH3C(O)O + NO3 + (0.0_RealK, i=1, npd_products-2)] ! IUPAC P21 + +! 67: CH3ONO2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_ch3ono2(npd_products) & + = [CHARACTER(LEN=56) :: & "CH3ONO2 -> CH3O + NO2 ", & "CH3ONO2 -> HCHO + HONO ", & "CH3ONO2 -> HCHO + NO + OH ", & @@ -739,25 +1555,117 @@ MODULE gas_list_pcf "CH3ONO2 -> CH2ONO2 + H ", & "CH3ONO2 -> CH3O + NO + O(3P) ", & "CH3ONO2 -> CH3ONO + O(1D) ", & - (blank, i=1, npd_products-8) , & ! CH3ONO2 + (blank, i=1, npd_products-8)] + +REAL (RealK), PARAMETER :: threshold_wavelength_ch3ono2(npd_products) & + = [REAL(RealK) :: & + 697.0E-09_RealK, & ! CH3ONO2 -> CH3O + NO2 + 1.0_RealK, & ! CH3ONO2 -> HCHO + HONO + 497.0E-09_RealK, & ! CH3ONO2 -> HCHO + NO + OH + 391.0E-09_RealK, & ! CH3ONO2 -> CH3ONO + O(3P) + 344.0E-09_RealK, & ! CH3ONO2 -> CH3 + NO3 + 294.0E-09_RealK, & ! CH3ONO2 -> CH2ONO2 + H + 250.0E-09_RealK, & ! CH3ONO2 -> CH3O + NO + O(3P) + 241.0E-09_RealK, & ! CH3ONO2 -> CH3ONO + O(1D) + (0.0_RealK, i=1, npd_products-8)] ! JPL 19-5 + +! 68: C2H3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2h3(npd_products) & + = [CHARACTER(LEN=56) :: & "C2H3 -> C2H2 + H ", & - (blank, i=1, npd_products-1) , & ! C2H3 - "C2H4 -> C2H2 + H2 ", & + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2h3(npd_products) & + = [REAL(RealK) :: & + 237.0E-09_RealK, & ! C2H3 -> C2H2 + H + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero qy + +! 69: C2H4 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2h4(npd_products) & + = [CHARACTER(LEN=56) :: & + "C2H4 -> C2H2 + H2 ", & "C2H4 -> C2H2 + H + H ", & - (blank, i=1, npd_products-2) , & ! C2H4 + (blank, i=1, npd_products-2)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2h4(npd_products) & + = [REAL(RealK) :: & + 720.0E-09_RealK, & ! C2H4 -> C2H2 + H2 + 196.0E-09_RealK, & ! C2H4 -> C2H2 + H + H + (0.0_RealK, i=1, npd_products-2)] ! Huebner 92 + +! 70: OH +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_oh(npd_products) & + = [CHARACTER(LEN=56) :: & "OH -> O(1D) + H ", & - (blank, i=1, npd_products-1) , & ! OH + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_oh(npd_products) & + = [REAL(RealK) :: & + 511.4E-09_RealK, & ! OH -> O(1D) + H + (0.0_RealK, i=1, npd_products-1)] ! Huebner 1992 + +! 71: HCO +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_hco(npd_products) & + = [CHARACTER(LEN=56) :: & "HCO -> H + CO ", & - (blank, i=1, npd_products-1) , & ! HCO + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_hco(npd_products) & + = [REAL(RealK) :: & + 229.0E-09_RealK, & ! HCO -> H + CO + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero xsc + +! 72: N2O4 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n2o4(npd_products) & + = [CHARACTER(LEN=56) :: & "N2O4 -> NO2 + NO2 ", & - (blank, i=1, npd_products-1) , & ! N2O4 + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n2o4(npd_products) & + = [REAL(RealK) :: & + 453.0E-09_RealK, & ! N2O4 -> NO2 + NO2 + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero xsc + +! 73: C2N2 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_c2n2(npd_products) & + = [CHARACTER(LEN=56) :: & "C2N2 -> C2 + N2 ", & - (blank, i=1, npd_products-1) , & ! C2N2 + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_c2n2(npd_products) & + = [REAL(RealK) :: & + 224.0E-09_RealK, & ! C2N2 -> C2 + N2 + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero xsc + +! 74: N2H4 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n2h4(npd_products) & + = [CHARACTER(LEN=56) :: & "N2H4 -> N2H3 + H ", & - (blank, i=1, npd_products-1) , & ! N2H4 + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n2h4(npd_products) & + = [REAL(RealK) :: & + 290.0E-09_RealK, & ! N2H4 -> N2H3 + H + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero xsc + +! 75: N2O3 +! -------------------------- +CHARACTER(LEN=56), PARAMETER :: photol_products_n2o3(npd_products) & + = [CHARACTER(LEN=56) :: & "N2O3 -> NO2 + NO ", & - (blank, i=1, npd_products-1) & ! N2O3 - ], shape=[npd_products, npd_gases] ) + (blank, i=1, npd_products-1)] + +REAL (RealK), PARAMETER :: threshold_wavelength_n2o3(npd_products) & + = [REAL(RealK) :: & + 398.0E-09_RealK, & ! N2O3 -> NO2 + NO + (0.0_RealK, i=1, npd_products-1)] ! Venot 2012-highest non zero xsc ! Name used by UKCA for photolysis pathway CHARACTER(LEN=56), PARAMETER :: photol_fldname(0:npd_products, npd_gases) & @@ -878,234 +1786,271 @@ MODULE gas_list_pcf (blank, i=0, npd_products), & ! N2O4 (blank, i=0, npd_products), & ! C2N2 (blank, i=0, npd_products), & ! N2H4 - (blank, i=0, npd_products) & ! N2O3 + (blank, i=0, npd_products), & ! N2O3 + (blank, i=0, npd_products), & ! Si + (blank, i=0, npd_products), & ! SiO + (blank, i=0, npd_products), & ! SiO2 + (blank, i=0, npd_products), & ! Mg + (blank, i=0, npd_products), & ! Mg2 + (blank, i=0, npd_products), & ! MgO + (blank, i=0, npd_products), & ! TiO2 + (blank, i=0, npd_products), & ! Fe + (blank, i=0, npd_products), & ! FeO + (blank, i=0, npd_products), & ! Ca + (blank, i=0, npd_products), & ! CaO + (blank, i=0, npd_products), & ! AlO + (blank, i=0, npd_products), & ! Na2 + (blank, i=0, npd_products), & ! NaO + (blank, i=0, npd_products), & ! NaOH + (blank, i=0, npd_products), & ! KOH + (blank, i=0, npd_products), & ! H- + (blank, i=0, npd_products), & ! PS + (blank, i=0, npd_products), & ! PO + (blank, i=0, npd_products), & ! PN + (blank, i=0, npd_products), & ! CH3SH + (blank, i=0, npd_products), & ! CH3S + (blank, i=0, npd_products), & ! C2H6S + (blank, i=0, npd_products), & ! C2H6S2 + (blank, i=0, npd_products), & ! C3H4 + (blank, i=0, npd_products), & ! C4H3 + (blank, i=0, npd_products), & ! SiH4 + (blank, i=0, npd_products), & ! S2 + (blank, i=0, npd_products), & ! SF6 + (blank, i=0, npd_products), & ! CS2 + (blank, i=0, npd_products), & ! S8 + (blank, i=0, npd_products), & ! CN + (blank, i=0, npd_products), & ! CH3Cl + (blank, i=0, npd_products), & ! CH3F + (blank, i=0, npd_products) & ! CH3Br ], shape=[npd_products+1, npd_gases] ) +CHARACTER(LEN=56), PARAMETER :: photol_products(npd_products, npd_gases) & + = RESHAPE([CHARACTER(LEN=56) :: & + photol_products_h2o, & ! 1: H2O + photol_products_co2, & ! 2: CO2 + photol_products_o3, & ! 3: O3 + photol_products_n2o, & ! 4: N2O + photol_products_co, & ! 5: CO + photol_products_ch4, & ! 6: CH4 + photol_products_o2, & ! 7: O2 + photol_products_no, & ! 8: NO + photol_products_so2, & ! 9: SO2 + photol_products_no2, & ! 10: NO2 + photol_products_nh3, & ! 11: NH3 + photol_products_hno3, & ! 12: HNO3 + photol_products_n2, & ! 13: N2 + (blank, i=1, npd_products), & ! 14: CFC11 + (blank, i=1, npd_products), & ! 15: CFC12 + (blank, i=1, npd_products), & ! 16: CFC113 + (blank, i=1, npd_products), & ! 17: HCFC22 + (blank, i=1, npd_products), & ! 18: HFC125 + (blank, i=1, npd_products), & ! 19: HFC134a + (blank, i=1, npd_products), & ! 20: CFC114 + (blank, i=1, npd_products), & ! 21: TiO + (blank, i=1, npd_products), & ! 22: VO + photol_products_h2, & ! 23: H2 + (blank, i=1, npd_products), & ! 24: He + photol_products_ocs, & ! 25: OCS + (blank, i=1, npd_products), & ! 26: Na + (blank, i=1, npd_products), & ! 27: K + (blank, i=1, npd_products), & ! 28: FeH + (blank, i=1, npd_products), & ! 29: CrH + (blank, i=1, npd_products), & ! 30: Li + (blank, i=1, npd_products), & ! 31: Rb + (blank, i=1, npd_products), & ! 32: Cs + (blank, i=1, npd_products), & ! 33: PH3 + photol_products_c2h2, & ! 34: C2H2 + photol_products_hcn, & ! 35: HCN + (blank, i=1, npd_products), & ! 36: H2S + (blank, i=1, npd_products), & ! 37: Ar + (blank, i=1, npd_products), & ! 38: Dry air + photol_products_o, & ! 39: O + photol_products_n, & ! 40: N + photol_products_no3, & ! 41: NO3 + photol_products_n2o5, & ! 42: N2O5 + photol_products_hono, & ! 43: HONO + photol_products_ho2no2, & ! 44: HO2NO2 + photol_products_h2o2, & ! 45: H2O2 + photol_products_c2h6, & ! 46: C2H6 + photol_products_ch3, & ! 47: CH3 + photol_products_h2co, & ! 48: H2CO + photol_products_ho2, & ! 49: HO2 + (blank, i=1, npd_products), & ! 50: HDO + (blank, i=1, npd_products), & ! 51: HCl + (blank, i=1, npd_products), & ! 52: HF + (blank, i=1, npd_products), & ! 53: cis-OSSO + (blank, i=1, npd_products), & ! 54: trans-OSSO + (blank, i=1, npd_products), & ! 55: OSO-S + photol_products_ch3cho, & ! 56: CH3CHO + photol_products_ch3ooh, & ! 57: CH3OOH + photol_products_ch3coch3, & ! 58: CH3COCH3 + photol_products_ch3cocho, & ! 59: CH3COCHO + photol_products_chocho, & ! 60: CHOCHO + photol_products_c2h5cho, & ! 61: C2H5CHO + photol_products_hoch2cho, & ! 62: HOCH2CHO + photol_products_c2h5coch3, & ! 63: C2H5COCH3 + photol_products_mvk, & ! 64: CH3C(O)CH=CH2 (MVK) + photol_products_macr, & ! 65: CH2=C(CH3)CHO (MACR) + photol_products_pan, & ! 66: CH3C(O)OONO2 (PAN) + photol_products_ch3ono2, & ! 67: CH3ONO2 + photol_products_c2h3, & ! 68: C2H3 + photol_products_c2h4, & ! 69: C2H4 + photol_products_oh, & ! 70: OH + photol_products_hco, & ! 71: HCO + photol_products_n2o4, & ! 72: N2O4 + photol_products_c2n2, & ! 73: C2N2 + photol_products_n2h4, & ! 74: N2H4 + photol_products_n2o3, & ! 75: N2O3 + (blank, i=1, npd_products), & ! 76: Si + (blank, i=1, npd_products), & ! 77: SiO + (blank, i=1, npd_products), & ! 78: SiO2 + (blank, i=1, npd_products), & ! 79: Mg + (blank, i=1, npd_products), & ! 80: Mg2 + (blank, i=1, npd_products), & ! 81: MgO + (blank, i=1, npd_products), & ! 82: TiO2 + (blank, i=1, npd_products), & ! 83: Fe + (blank, i=1, npd_products), & ! 84: FeO + (blank, i=1, npd_products), & ! 85: Ca + (blank, i=1, npd_products), & ! 86: CaO + (blank, i=1, npd_products), & ! 87: AlO + (blank, i=1, npd_products), & ! 88: Na2 + (blank, i=1, npd_products), & ! 89: NaO + (blank, i=1, npd_products), & ! 90: NaOH + (blank, i=1, npd_products), & ! 91: KOH + (blank, i=1, npd_products), & ! 92: H- + (blank, i=1, npd_products), & ! 93: PS + (blank, i=1, npd_products), & ! 94: PO + (blank, i=1, npd_products), & ! 95: PN + (blank, i=1, npd_products), & ! 96: CH3SH + (blank, i=1, npd_products), & ! 97: CH3S + (blank, i=1, npd_products), & ! 98: C2H6S + (blank, i=1, npd_products), & ! 99: C2H6S2 + (blank, i=1, npd_products), & ! 100: C3H4 + (blank, i=1, npd_products), & ! 101: C4H3 + (blank, i=1, npd_products), & ! 102: SiH4 + (blank, i=1, npd_products), & ! 103: S2 + (blank, i=1, npd_products), & ! 104: SF6 + (blank, i=1, npd_products), & ! 105: CS2 + (blank, i=1, npd_products), & ! 106: S8 + (blank, i=1, npd_products), & ! 107: CN + (blank, i=1, npd_products), & ! 108: CH3Cl + (blank, i=1, npd_products), & ! 109: CH3F + (blank, i=1, npd_products) & ! 110: CH3Br + ], shape=[npd_products, npd_gases] ) + ! Threshold wavelength defining energy required for photolysis REAL (RealK), PARAMETER :: threshold_wavelength(npd_products, npd_gases) & = RESHAPE ( [REAL(RealK) :: & - 246.0E-09_RealK, & ! H2O -> O(3P) + H2 - 242.0E-09_RealK, & ! H2O -> OH(X2Pi) + H - 175.0E-09_RealK, & ! H2O -> O(1D) + H2 - 134.0E-09_RealK, & ! H2O -> OH(A2Sigma+) + H - 129.0E-09_RealK, & ! H2O -> O(3P) + H + H - (0.0_RealK, i=1, npd_products-5), & ! H2O - 227.5E-09_RealK, & ! CO2 -> CO + O(3P) : Heubner 92 - 167.1E-09_RealK, & ! CO2 -> CO + O(1D) : Heubner 92 - 128.6E-09_RealK, & ! CO2 -> CO + O(1S) : Heubner 92 - 108.2E-09_RealK, & ! CO2 -> CO(a3Pi) + O(3P) : Heubner 92 - 89.922E-09_RealK, & ! CO2 -> CO2+ : Heubner 92 - 65.026E-09_RealK, & ! CO2 -> CO + O+ : Heubner 92 - 63.693E-09_RealK, & ! CO2 -> CO+ + O : Heubner 92 - 54.655E-09_RealK, & ! CO2 -> O2 + C+ : Heubner 92 - (0.0_RealK, i=1, npd_products-8), & ! CO2 - 1180.0E-09_RealK, & ! O3 -> O(3P) + O2(X3Sigmag-) - 612.0E-09_RealK, & ! O3 -> O(3P) + O2(a1Deltag) - 463.0E-09_RealK, & ! O3 -> O(3P) + O2(b1Sigmag+) - 411.0E-09_RealK, & ! O3 -> O(1D) + O2(X3Sigmag-) - 310.0E-09_RealK, & ! O3 -> O(1D) + O2(a1Deltag) - 267.0E-09_RealK, & ! O3 -> O(1D) + O2(b1Sigmag+) - 201.0E-09_RealK, & ! O3 -> 3 O(3P) - 196.0E-09_RealK, & ! O3 -> O(1S) + O2(a1Deltag) - (0.0_RealK, i=1, npd_products-8), & ! O3 - 336.0E-09_RealK, & ! N2O -> N2 + O(1D) - 713.0E-09_RealK, & ! N2O -> N2 + O(3P) - 248.0E-09_RealK, & ! N2O -> N(4S) + NO(2Pi) - 210.0E-09_RealK, & ! N2O -> N2 + O(1S) - (0.0_RealK, i=1, npd_products-4), & ! N2O - 111.78E-09_RealK, & ! CO -> CO + O(3P) :Huebner 92 - (0.0_RealK, i=1, npd_products-1), & ! CO - 277.0E-09_RealK, & ! CH4 -> CH3 + H - 237.3E-09_RealK, & ! CH4 -> CH2(1) + H2 - 132.2E-09_RealK, & ! CH4 -> CH2(3) + H + H - 137.0E-09_RealK, & ! CH4 -> CH + H2 + H - (0.0_RealK, i=1, npd_products-4), & ! CH4 :Huebner 92 - 242.3E-09_RealK, & ! O2 -> O(3P) + O(3P) - 175.0E-09_RealK, & ! O2 -> O(3P) + O(1D) - 137.0E-09_RealK, & ! O2 -> O(1D) + O(1D) - 132.0E-09_RealK, & ! O2 -> O(3P) + O(1S) - 110.0E-09_RealK, & ! O2 -> O(1D) + O(1S) - 102.78E-09_RealK, & ! O2 -> O2+ - 66.2E-09_RealK, & ! O2 -> O+ + O - (0.0_RealK, i=1, npd_products-7), & ! O2 - 191.0E-09_RealK, & ! NO -> O(3P) + N(4S) :Huebner 92 - (0.0_RealK, i=1, npd_products-1), & ! NO - 218.7E-09_RealK, & ! SO2 -> SO + O(3P) : Becker 95 - (0.0_RealK, i=1, npd_products-1), & ! SO2 - 398.0E-09_RealK, & ! NO2 -> NO + O(3P) - 244.0E-09_RealK, & ! NO2 -> NO + O(1D) - (0.0_RealK, i=1, npd_products-2), & ! NO2 - 279.8E-09_RealK, & ! NH3 -> NH2 + H :Huebner - (0.0_RealK, i=1, npd_products-1), & ! NH3 - 604.0E-09_RealK, & ! HNO3 -> OH + NO2 - 393.0E-09_RealK, & ! HNO3 -> HONO + O(3P) - 278.0E-09_RealK, & ! HNO3 -> H + NO3 - 381.0E-09_RealK, & ! HNO3 -> OH + NO2*(12B2) - 242.0E-09_RealK, & ! HNO3 -> HONO + O(1D) - 216.0E-09_RealK, & ! HNO3 -> HONO (a3A)+ O(3P) - (0.0_RealK, i=1, npd_products-6), & ! HNO3 : IUPAC PNOx2 - 98.6E-09_RealK, & ! N2 -> N + N - 79.8E-09_RealK, & ! N2 -> N2+ - 51.0E-09_RealK, & ! N2 -> N+ + N - (0.0_RealK, i=1, npd_products-3), & ! N2 - (0.0_RealK, i=1, npd_products), & ! CFC11 - (0.0_RealK, i=1, npd_products), & ! CFC12 - (0.0_RealK, i=1, npd_products), & ! CFC113 - (0.0_RealK, i=1, npd_products), & ! HCFC22 - (0.0_RealK, i=1, npd_products), & ! HFC125 - (0.0_RealK, i=1, npd_products), & ! HFC134a - (0.0_RealK, i=1, npd_products), & ! CFC114 - (0.0_RealK, i=1, npd_products), & ! TiO - (0.0_RealK, i=1, npd_products), & ! VO - 276.885E-09_RealK, & ! H2 -> H + H :Huebner 92 - (0.0_RealK, i=1, npd_products-1), & ! H2 - (0.0_RealK, i=1, npd_products), & ! He - 388.0E-09_RealK, & ! OCS -> CO + S(3P) - 285.0E-09_RealK, & ! OCS -> CO + S(1D) - 209.0E-09_RealK, & ! OCS -> CO + S(1S) - (0.0_RealK, i=1, npd_products-3), & ! OCS - (0.0_RealK, i=1, npd_products), & ! Na - (0.0_RealK, i=1, npd_products), & ! K - (0.0_RealK, i=1, npd_products), & ! FeH - (0.0_RealK, i=1, npd_products), & ! CrH - (0.0_RealK, i=1, npd_products), & ! Li - (0.0_RealK, i=1, npd_products), & ! Rb - (0.0_RealK, i=1, npd_products), & ! Cs - (0.0_RealK, i=1, npd_products), & ! PH3 - 230.6E-09_RealK, & ! C2H2 -> C2H + H :Huebner 92 - (0.0_RealK, i=1, npd_products-1), & ! C2H2 - 195.0E-09_RealK, & ! HCN -> CN + H :Huebner 92 - (0.0_RealK, i=1, npd_products-1), & ! HCN - (0.0_RealK, i=1, npd_products), & ! H2S - (0.0_RealK, i=1, npd_products), & ! Ar - (0.0_RealK, i=1, npd_products), & ! Dry air - 91.25E-09_RealK, & ! O -> O+(4S) - 73.18E-09_RealK, & ! O -> O+(2D) - 66.58E-09_RealK, & ! O -> O+(2P) - 43.50E-09_RealK, & ! O -> O+(4Pe) - 31.00E-09_RealK, & ! O -> O+(2Pe) - 24.80E-09_RealK, & ! O -> O++ - 12.179E-09_RealK, & ! O -> O+++ - (0.0_RealK, i=1, npd_products-7), & ! O - 85.92E-09_RealK, & ! N -> N+ - 28.00E-09_RealK, & ! N -> N++ - (0.0_RealK, i=1, npd_products-2), & ! N - 7320.0E-09_RealK, & ! NO3 -> NO + O2 : JPL 19-5 - 574.0E-09_RealK, & ! NO3 -> NO2 + O(3P) : JPL 19-5 - (0.0_RealK, i=1, npd_products-2), & ! NO3 - 1255.0E-09_RealK, & ! N2O5 -> NO3 + NO2 : JPL 19-5 - 298.0E-09_RealK, & ! N2O5 -> NO3 + NO + O(3P) : JPL 19-5 - (0.0_RealK, i=1, npd_products-2), & ! N2O5 - 579.0E-09_RealK, & ! HONO -> OH + NO : JPL 19-5 - 362.0E-09_RealK, & ! HONO -> H + NO2 : JPL 19-5 - (0.0_RealK, i=1, npd_products-2), & ! HONO - 1207.0E-09_RealK, & ! HO2NO2 -> HO2 + NO2 : JPL 19-5 - 726.0E-09_RealK, & ! HO2NO2 -> OH + NO3 : JPL 19-5 - 713.0E-09_RealK, & ! HO2NO2 -> O(3P) + HNO3 : JPL 19-5 - 393.0E-09_RealK, & ! HO2NO2 -> H + NO2 + O2 : JPL 19-5 - 339.0E-09_RealK, & ! HO2NO2 -> HO2 + NO + O(3P) : JPL 19-5 - 321.0E-09_RealK, & ! HO2NO2 -> OH + NO2 + O(3P) : JPL 19-5 - 201.0E-09_RealK, & ! HO2NO2 -> H + O(3P) + NO3 : JPL 19-5 - 911.0E-09_RealK, & ! HO2NO2 -> HONO + O2(1Sigma) : JPL 19-5 - 1744.0E-09_RealK, & ! HO2NO2 -> HONO + O2(1Lambda) : JPL 19-5 - (0.0_RealK, i=1, npd_products-9), & ! HO2NO2 - 557.0E-09_RealK, & ! H2O2 -> OH + OH : JPL 19-5 - 359.0E-09_RealK, & ! H2O2 -> H2O + O(1D) : JPL 19-5 - 324.0E-09_RealK, & ! H2O2 -> H + HO2 : JPL 19-5 - (0.0_RealK, i=1, npd_products-3), & ! H2O2 - 874.3E-09_RealK, & ! C2H6 -> C2H4 + H2 : Huebner 92 - 290.0E-09_RealK, & ! C2H6 -> C2H4 + H + H :Huebner 92/Lias 70 - 428.7E-09_RealK, & ! C2H6 -> C2H2 + H2 + H2 :Chang 2020 - 272.6E-09_RealK, & ! C2H6 -> CH4 + CH2(1) :Huebner 92 - 322.0E-09_RealK, & ! C2H6 -> CH3 + CH3 :Huebner 92 - (0.0_RealK, i=1, npd_products-5), & ! C2H6 - 216.0E-09_RealK, & ! CH3 -> CH2(1) + H - (0.0_RealK, i=1, npd_products-1), & ! CH3- Venot 2012-highest non zero qy - 330.0E-09_RealK, & ! H2CO -> H + HCO : JPL 19-5 - 361.0E-09_RealK, & ! H2CO -> H2 + CO : JPL 19-5 - 283.0E-09_RealK, & ! H2CO -> H + H + CO : JPL 19-5 - (0.0_RealK, i=1, npd_products-3), & ! H2CO - 438.0E-09_RealK, & ! HO2 -> OH + O(3P) : JPL 19-5 - 259.0E-09_RealK, & ! HO2 -> OH + O(1D) : JPL 19-5 - (0.0_RealK, i=1, npd_products-2), & ! HO2 - (0.0_RealK, i=1, npd_products), & ! HDO - (0.0_RealK, i=1, npd_products), & ! HCl - (0.0_RealK, i=1, npd_products), & ! HF - (0.0_RealK, i=1, npd_products), & ! cis-OSSO - (0.0_RealK, i=1, npd_products), & ! trans-OSSO - (0.0_RealK, i=1, npd_products), & ! OSO-S - 335.0E-09_RealK, & ! CH3CHO -> CH3 + HCO : JPL 19-5 - 1.0_RealK, & ! CH3CHO -> CH4 + CO : JPL 19-5 - 320.0E-09_RealK, & ! CH3CHO -> CH3CO + H : JPL 19-5 - (0.0_RealK, i=1, npd_products-3), & ! CH3CHO - 645.0E-09_RealK, & ! CH3OOH -> CH3O + OH : JPL 19-5 - 410.0E-09_RealK, & ! CH3OOH -> CH3 + HO2 : JPL 19-5 - 334.0E-09_RealK, & ! CH3OOH -> CH3O2 + H : JPL 19-5 - 670.0E-09_RealK, & ! CH3OOH -> CH3OH + O(3P) : JPL 19-5 - (0.0_RealK, i=1, npd_products-4), & ! CH3OOH - 338.0E-09_RealK, & ! CH3COCH3 -> CH3CO + CH3 : JPL 19-5 - 299.0E-09_RealK, & ! CH3COCH3 -> 2 CH3 + CO : JPL 19-5 - (0.0_RealK, i=1, npd_products-2), & ! CH3COCH3 - 422.0E-09_RealK, & ! CH3COCHO -> CH3CO + HCO : JPL 19-5 - 1.0_RealK, & ! CH3COCHO -> CH4 + 2 CO : JPL 19-5 - 1.0_RealK, & ! CH3COCHO -> CH3CHO + CO : JPL 19-5 - (0.0_RealK, i=1, npd_products-3), & ! CH3COCHO - 399.0E-09_RealK, & ! CHOCHO -> HCO + HCO : JPL 19-5 - 1.0_RealK, & ! CHOCHO -> H2 + 2 CO : JPL 19-5 - 1.0_RealK, & ! CHOCHO -> HCHO + CO : JPL 19-5 - 329.0E-09_RealK, & ! CHOCHO -> H + CO + HCO : JPL 19-5 - (0.0_RealK, i=1, npd_products-4), & ! CHOCHO - 341.0E-09_RealK, & ! C2H5CHO -> C2H5 + HCO : JPL 19-5 - 1.0_RealK, & ! C2H5CHO -> C2H6 + CO : JPL 19-5 - 926.0E-09_RealK, & ! C2H5CHO -> C2H4 + HCHO : JPL 19-5 - 349.0E-09_RealK, & ! C2H5CHO -> CH3 + CH2CHO : JPL 19-5 - (0.0_RealK, i=1, npd_products-4), & ! C2H5CHO - 347.0E-09_RealK, & ! HOCH2CHO -> CH2OH + HCO - 1910.0E-09_RealK, & ! HOCH2CHO -> CH3OH + CO - 328.0E-09_RealK, & ! HOCH2CHO -> OH + CH2CHO - 314.0E-09_RealK, & ! HOCH2CHO -> HOCH2CO + H - (0.0_RealK, i=1, npd_products-4), & ! HOCH2CHO - 342.0E-09_RealK, & ! C2H5COCH3 -> CH3CO + C2H5 - 339.0E-09_RealK, & ! C2H5COCH3 -> C2H5CO + CH3 - 303.0E-09_RealK, & ! C2H5COCH3 -> C2H5 + CO + CH3 - (0.0_RealK, i=1, npd_products-3), & ! C2H5COCH3 : Zborowska 21 - 1.0_RealK, & ! CH3C(O)CH=CH2 -> CH3-CH=CH2 + CO - 1.0_RealK, & ! CH3C(O)CH=CH2 -> CH=CH2 + CH3C(O) - 1.0_RealK, & ! CH3C(O)CH=CH2 -> CH=CH2C(O) + CH3 - (0.0_RealK, i=1, npd_products-3), & ! CH3C(O)CH=CH2 (MVK) : JPL 19-5 - 1.0_RealK, & ! CH2=C(CH3)CHO -> CH2=CCH3 + CHO - 1.0_RealK, & ! CH2=C(CH3)CHO -> C3H6 + CO - 1.0_RealK, & ! CH2=C(CH3)CHO -> H + CH2=C(CH3)CO - (0.0_RealK, i=1, npd_products-3), & ! CH2=C(CH3)CHO (MACR) : JPL 19-5 - 1004.0E-09_RealK, & ! CH3C(O)OONO2 -> CH3C(O)OO + NO2 - 963.0E-09_RealK, & ! CH3C(O)OONO2 -> CH3C(O)O + NO3 - (0.0_RealK, i=1, npd_products-2), & ! CH3C(O)OONO2 (PAN) : IUPAC P21 - 697.0E-09_RealK, & ! CH3ONO2 -> CH3O + NO2 - 1.0_RealK, & ! CH3ONO2 -> HCHO + HONO - 497.0E-09_RealK, & ! CH3ONO2 -> HCHO + NO + OH - 391.0E-09_RealK, & ! CH3ONO2 -> CH3ONO + O(3P) - 344.0E-09_RealK, & ! CH3ONO2 -> CH3 + NO3 - 294.0E-09_RealK, & ! CH3ONO2 -> CH2ONO2 + H - 250.0E-09_RealK, & ! CH3ONO2 -> CH3O + NO + O(3P) - 241.0E-09_RealK, & ! CH3ONO2 -> CH3ONO + O(1D) - (0.0_RealK, i=1, npd_products-8), & ! CH3ONO2 : JPL 19-5 - 237.0E-09_RealK, & ! C2H3 -> C2H2 + H - (0.0_RealK, i=1, npd_products-1), & ! C2H3 : Venot 2012-highest non zero qy - 720.0E-09_RealK, & ! C2H4 -> C2H2 + H2 - 196.0E-09_RealK, & ! C2H4 -> C2H2 + H + H - (0.0_RealK, i=1, npd_products-2), & ! C2H4 : Huebner 92 - 511.4E-09_RealK, & ! OH -> O(1D) + H - (0.0_RealK, i=1, npd_products-1), & ! OH : Huebner 1992 - 229.0E-09_RealK, & ! HCO -> H + CO - (0.0_RealK, i=1, npd_products-1), & ! HCO : Venot 2012-highest non zero xsc - 453.0E-09_RealK, & ! N2O4 -> NO2 + NO2 - (0.0_RealK, i=1, npd_products-1), & ! N2O4 : Venot 2012-highest non zero xsc - 224.0E-09_RealK, & ! C2N2 -> C2 + N2 - (0.0_RealK, i=1, npd_products-1), & ! C2N2 : Venot 2012-highest non zero xsc - 290.0E-09_RealK, & ! N2H4 -> N2H3 + H - (0.0_RealK, i=1, npd_products-1), & ! N2H4 : Venot 2012-highest non zero xsc - 398.0E-09_RealK, & ! N2O3 -> NO2 + NO - (0.0_RealK, i=1, npd_products-1) & ! N2O3 : Venot 2012-highest non zero xsc + threshold_wavelength_h2o, & ! 1: H2O + threshold_wavelength_co2, & ! 2: CO2 + threshold_wavelength_o3, & ! 3: O3 + threshold_wavelength_n2o, & ! 4: N2O + threshold_wavelength_co, & ! 5: CO + threshold_wavelength_ch4, & ! 6: CH4 + threshold_wavelength_o2, & ! 7: O2 + threshold_wavelength_no, & ! 8: NO + threshold_wavelength_so2, & ! 9: SO2 + threshold_wavelength_no2, & ! 10: NO2 + threshold_wavelength_nh3, & ! 11: NH3 + threshold_wavelength_hno3, & ! 12: HNO3 + threshold_wavelength_n2, & ! 13: N2 + (0.0_RealK, i=1, npd_products), & ! 14: CFC11 + (0.0_RealK, i=1, npd_products), & ! 15: CFC12 + (0.0_RealK, i=1, npd_products), & ! 16: CFC113 + (0.0_RealK, i=1, npd_products), & ! 17: HCFC22 + (0.0_RealK, i=1, npd_products), & ! 18: HFC125 + (0.0_RealK, i=1, npd_products), & ! 19: HFC134a + (0.0_RealK, i=1, npd_products), & ! 20: CFC114 + (0.0_RealK, i=1, npd_products), & ! 21: TiO + (0.0_RealK, i=1, npd_products), & ! 22: VO + threshold_wavelength_h2, & ! 23: H2 + (0.0_RealK, i=1, npd_products), & ! 24: He + threshold_wavelength_ocs, & ! 25: OCS + (0.0_RealK, i=1, npd_products), & ! 26: Na + (0.0_RealK, i=1, npd_products), & ! 27: K + (0.0_RealK, i=1, npd_products), & ! 28: FeH + (0.0_RealK, i=1, npd_products), & ! 29: CrH + (0.0_RealK, i=1, npd_products), & ! 30: Li + (0.0_RealK, i=1, npd_products), & ! 31: Rb + (0.0_RealK, i=1, npd_products), & ! 32: Cs + (0.0_RealK, i=1, npd_products), & ! 33: PH3 + threshold_wavelength_c2h2, & ! 34: C2H2 + threshold_wavelength_hcn, & ! 35: HCN + (0.0_RealK, i=1, npd_products), & ! 36: H2S + (0.0_RealK, i=1, npd_products), & ! 37: Ar + (0.0_RealK, i=1, npd_products), & ! 38: Dry air + threshold_wavelength_o, & ! 39: O + threshold_wavelength_n, & ! 40: N + threshold_wavelength_no3, & ! 41: NO3 + threshold_wavelength_n2o5, & ! 42: N2O5 + threshold_wavelength_hono, & ! 43: HONO + threshold_wavelength_ho2no2, & ! 44: HO2NO2 + threshold_wavelength_h2o2, & ! 45: H2O2 + threshold_wavelength_c2h6, & ! 46: C2H6 + threshold_wavelength_ch3, & ! 47: CH3 + threshold_wavelength_h2co, & ! 48: H2CO + threshold_wavelength_ho2, & ! 49: HO2 + (0.0_RealK, i=1, npd_products), & ! 50: HDO + (0.0_RealK, i=1, npd_products), & ! 51: HCl + (0.0_RealK, i=1, npd_products), & ! 52: HF + (0.0_RealK, i=1, npd_products), & ! 53: cis-OSSO + (0.0_RealK, i=1, npd_products), & ! 54: trans-OSSO + (0.0_RealK, i=1, npd_products), & ! 55: OSO-S + threshold_wavelength_ch3cho, & ! 56: CH3CHO + threshold_wavelength_ch3ooh, & ! 57: CH3OOH + threshold_wavelength_ch3coch3, & ! 58: CH3COCH3 + threshold_wavelength_ch3cocho, & ! 59: CH3COCHO + threshold_wavelength_chocho, & ! 60: CHOCHO + threshold_wavelength_c2h5cho, & ! 61: C2H5CHO + threshold_wavelength_hoch2cho, & ! 62: HOCH2CHO + threshold_wavelength_c2h5coch3, & ! 63: C2H5COCH3 + threshold_wavelength_mvk, & ! 64: CH3C(O)CH=CH2 (MVK) + threshold_wavelength_macr, & ! 65: CH2=C(CH3)CHO (MACR) + threshold_wavelength_pan, & ! 66: CH3C(O)OONO2 (PAN) + threshold_wavelength_ch3ono2, & ! 67: CH3ONO2 + threshold_wavelength_c2h3, & ! 68: C2H3 + threshold_wavelength_c2h4, & ! 69: C2H4 + threshold_wavelength_oh, & ! 70: OH + threshold_wavelength_hco, & ! 71: HCO + threshold_wavelength_n2o4, & ! 72: N2O4 + threshold_wavelength_c2n2, & ! 73: C2N2 + threshold_wavelength_n2h4, & ! 74: N2H4 + threshold_wavelength_n2o3, & ! 75: N2O3 + (0.0_RealK, i=1, npd_products), & ! 76: Si + (0.0_RealK, i=1, npd_products), & ! 77: SiO + (0.0_RealK, i=1, npd_products), & ! 78: SiO2 + (0.0_RealK, i=1, npd_products), & ! 79: Mg + (0.0_RealK, i=1, npd_products), & ! 80: Mg2 + (0.0_RealK, i=1, npd_products), & ! 81: MgO + (0.0_RealK, i=1, npd_products), & ! 82: TiO2 + (0.0_RealK, i=1, npd_products), & ! 83: Fe + (0.0_RealK, i=1, npd_products), & ! 84: FeO + (0.0_RealK, i=1, npd_products), & ! 85: Ca + (0.0_RealK, i=1, npd_products), & ! 86: CaO + (0.0_RealK, i=1, npd_products), & ! 87: AlO + (0.0_RealK, i=1, npd_products), & ! 88: Na2 + (0.0_RealK, i=1, npd_products), & ! 89: NaO + (0.0_RealK, i=1, npd_products), & ! 90: NaOH + (0.0_RealK, i=1, npd_products), & ! 91: KOH + (0.0_RealK, i=1, npd_products), & ! 92: H- + (0.0_RealK, i=1, npd_products), & ! 93: PS + (0.0_RealK, i=1, npd_products), & ! 94: PO + (0.0_RealK, i=1, npd_products), & ! 95: PN + (0.0_RealK, i=1, npd_products), & ! 96: CH3SH + (0.0_RealK, i=1, npd_products), & ! 97: CH3S + (0.0_RealK, i=1, npd_products), & ! 98: C2H6S + (0.0_RealK, i=1, npd_products), & ! 99: C2H6S2 + (0.0_RealK, i=1, npd_products), & ! 100: C3H4 + (0.0_RealK, i=1, npd_products), & ! 101: C4H3 + (0.0_RealK, i=1, npd_products), & ! 102: SiH4 + (0.0_RealK, i=1, npd_products), & ! 103: S2 + (0.0_RealK, i=1, npd_products), & ! 104: SF6 + (0.0_RealK, i=1, npd_products), & ! 105: CS2 + (0.0_RealK, i=1, npd_products), & ! 106: S8 + (0.0_RealK, i=1, npd_products), & ! 107: CN + (0.0_RealK, i=1, npd_products), & ! 108: CH3Cl + (0.0_RealK, i=1, npd_products), & ! 109: CH3F + (0.0_RealK, i=1, npd_products) & ! 110: CH3Br ], shape=[npd_products, npd_gases] ) ! Unless otherwise stated, data comes from JPL publication No. 15-10: @@ -1121,6 +2066,6 @@ MODULE gas_list_pcf ! * PAN: P21: https://iupac-aeris.ipsl.fr/datasheets/pdf/P21.pdf ! * Venot 2012 : Venot et al (2012) DOI: 10.1051/0004-6361/201219310 ! * Lias 70 : Lias et al (1970) DOI: 10.1063/1.1673226 -! * Chang 2020 : Chang et al (2020) DOI: 10.1039/D0SC01746A +! * Chang 2020 : Chang et al (2020) DOI: 10.1039/D0SC01746A END MODULE gas_list_pcf From 5d62a98a0599b23ea625238a63fc5408208e2c5a Mon Sep 17 00:00:00 2001 From: James Manners Date: Thu, 14 May 2026 15:04:09 +0100 Subject: [PATCH 5/5] Script to generate CMIP7 future scenario solar forcing for GA9 spectral files (#16) Co-authored-by: R Sharp --- examples/spectral_var/run_cmip7 | 93 +++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/examples/spectral_var/run_cmip7 b/examples/spectral_var/run_cmip7 index b895edcf..f052651a 100755 --- a/examples/spectral_var/run_cmip7 +++ b/examples/spectral_var/run_cmip7 @@ -3,8 +3,8 @@ # Add CMIP7 solar variability data (version 4.6) to the GA9 spectral files # This script creates the following files: # sp_sw_ga9_cmip7_picontrol_4_6 -# sp_sw_ga9_cmip7_ref_mon_4_6 -# sp_sw_ga9_cmip7_ref_day_4_6 +# sp_sw_ga9_cmip7_scenario_mon_4_6 +# sp_sw_ga9_cmip7_scenario_day_4_6 if [ ! $SOCRATES_DATA_DIR ] ; then SOCRATES_DATA_DIR=. @@ -14,34 +14,53 @@ CMIP7_DATA_DIR=${SOCRATES_DATA_DIR}/solarisheppa/cmip7 PICON_FILE='multiple_input4MIPs_solar_CMIP_SOLARIS-HEPPA-CMIP-4-6_gn.nc' MONTH_FILE='multiple_input4MIPs_solar_CMIP_SOLARIS-HEPPA-CMIP-4-6_gn_185001-202312.nc' DAILY_FILE='multiple_input4MIPs_solar_CMIP_SOLARIS-HEPPA-CMIP-4-6_gn_18500101-20231231.nc' +FUTURE_MONFILE='multiple_input4MIPs_solar_ScenarioMIP_SOLARIS-HEPPA-ScenarioMIP-4-6_gn_202201-229912.nc' +FUTURE_DAYFILE='multiple_input4MIPs_solar_ScenarioMIP_SOLARIS-HEPPA-ScenarioMIP-4-6_gn_20220101-22991231.nc' # Download CMIP7 solar variability data + +function check_for_solaris_file () { + file_name="$1" + cloud_loc="$2" + extension="$3" + url_base="https://cloud.iaa.es/index.php/s" + # ret_file_name is the name of the file to be retrieved from SOLARIS website + if [[ "$extension" == "gz" ]]; then + ret_file_name="$file_name.$extension" + else + ret_file_name="$file_name" + fi + + # if no file, then act. + if [[ ! -f $file_name ]]; then + # if the file that would be downloaded is absent, download it. + if [[ ! -f $ret_file_name ]]; then + echo "Downloading data from SOLARIS website" + echo " .... ${cloud_loc}/download/$ret_file_name" + wget $url_base/${cloud_loc}/download/$ret_file_name + fi + # if the file that has been downloaded is zipped, unzip it. + if [[ "$extension" == "gz" ]]; then + echo "Gunzipping local data" + gunzip -c $ret_file_name > $file_name + rm $ret_file_name + fi + fi +} + if [[ -r $CMIP7_DATA_DIR ]]; then echo "Gunzipping data from $CMIP7_DATA_DIR" gunzip -c ${CMIP7_DATA_DIR}/${PICON_FILE}.gz > ${PICON_FILE} gunzip -c ${CMIP7_DATA_DIR}/${MONTH_FILE}.gz > ${MONTH_FILE} gunzip -c ${CMIP7_DATA_DIR}/${DAILY_FILE}.gz > ${DAILY_FILE} + FUTURE_MONFILE=${CMIP7_DATA_DIR}/${FUTURE_MONFILE} + FUTURE_DAYFILE=${CMIP7_DATA_DIR}/${FUTURE_DAYFILE} else - for i in $(seq 1 3); do - if [[ $i == 1 ]]; then - SOLARIS_FILE=$PICON_FILE - CLOUD_LOC='XaSb85EpGNYqkEw' - elif [[ $i == 2 ]]; then - SOLARIS_FILE=$MONTH_FILE - CLOUD_LOC='n7cacmRBjk5Gb8f' - else - SOLARIS_FILE=$DAILY_FILE - CLOUD_LOC='nJFTPcnFwZ3smTo' - fi - if [[ ! -f $SOLARIS_FILE ]]; then - if [[ ! -f $SOLARIS_FILE.gz ]]; then - echo 'Downloading data from SOLARIS website' - wget https://cloud.iaa.es/index.php/s/${CLOUD_LOC}/download/$SOLARIS_FILE.gz - fi - echo "Gunzipping local data" - gunzip -c $SOLARIS_FILE.gz > $SOLARIS_FILE - fi - done + check_for_solaris_file $PICON_FILE 'XaSb85EpGNYqkEw' "gz" + check_for_solaris_file $MONTH_FILE 'n7cacmRBjk5Gb8f' "gz" + check_for_solaris_file $DAILY_FILE 'nJFTPcnFwZ3smTo' "gz" + check_for_solaris_file $FUTURE_MONFILE 'QWorEALDriYabgN' "" + check_for_solaris_file $FUTURE_DAYFILE 'j7ncYwoHXCtRwRE' "" fi echo 'Checking files are at vn4.6' @@ -52,12 +71,22 @@ if [[ $PICON_VN != 'source_version = "4.6"' ]]; then fi MONTH_VN=`ncdump -h $MONTH_FILE | grep -o 'source_version = ".*"'` if [[ $MONTH_VN != 'source_version = "4.6"' ]]; then - echo 'Monthly data is not at version 4.6: '$MONTH_VN + echo 'Monthly historical data is not at version 4.6: '$MONTH_VN exit 1 fi DAILY_VN=`ncdump -h $DAILY_FILE | grep -o 'source_version = ".*"'` if [[ $DAILY_VN != 'source_version = "4.6"' ]]; then - echo 'Daily data is not at version 4.6: '$DAILY_VN + echo 'Daily historical data is not at version 4.6: '$DAILY_VN + exit 1 +fi +FUTURE_MON_VN=`ncdump -h $FUTURE_MONFILE | grep -o 'source_version = ".*"'` +if [[ $FUTURE_MON_VN != 'source_version = "4.6"' ]]; then + echo 'Monthly future scenario data is not at version 4.6: '$FUTURE_MON_VN + exit 1 +fi +FUTURE_DAY_VN=`ncdump -h $FUTURE_DAYFILE | grep -o 'source_version = ".*"'` +if [[ $FUTURE_DAY_VN != 'source_version = "4.6"' ]]; then + echo 'Daily future scenario data is not at version 4.6: '$FUTURE_DAY_VN exit 1 fi @@ -82,7 +111,7 @@ EOF mv sp_sw_ga9_var sp_sw_ga9_cmip7_picontrol_4_6 rm $PICON_FILE -echo 'Adding monthly solar reference scenario data to spectral file' +echo 'Adding monthly solar reference & future scenario data to spectral file' prep_spec << EOF > ref_mon.log sp_sw_ga9 a @@ -92,14 +121,18 @@ y -2 6 $MONTH_FILE +3312 +6 +$FUTURE_MONFILE +2024 1 1 0 0 -1 EOF -mv sp_sw_ga9_var sp_sw_ga9_cmip7_ref_mon_4_6 +mv sp_sw_ga9_var sp_sw_ga9_cmip7_scenario_mon_4_6 rm $MONTH_FILE -echo 'Adding daily solar reference scenario data to spectral file' +echo 'Adding daily solar reference & future scenario data to spectral file' prep_spec << EOF > ref_day.log sp_sw_ga9 a @@ -109,11 +142,15 @@ y -2 6 $DAILY_FILE +100807 +6 +$FUTURE_DAYFILE +2024 1 1 0 0 -1 EOF -mv sp_sw_ga9_var sp_sw_ga9_cmip7_ref_day_4_6 +mv sp_sw_ga9_var sp_sw_ga9_cmip7_scenario_day_4_6 rm $DAILY_FILE exit 0