From 4b74f1b77d57cfed5d7ed027d9de12568963ef57 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 22 May 2023 13:27:00 -0600 Subject: [PATCH 01/61] aerosol optics interface for MAM modified: bld/namelist_files/namelist_definition.xml modified: src/chemistry/aerosol/aerosol_properties_mod.F90 modified: src/chemistry/aerosol/aerosol_state_mod.F90 modified: src/chemistry/aerosol/modal_aerosol_properties_mod.F90 modified: src/chemistry/aerosol/modal_aerosol_state_mod.F90 modified: src/control/runtime_opts.F90 modified: src/physics/cam/aer_rad_props.F90 modified: src/physics/cam/rad_constituents.F90 modified: src/physics/rrtmg/radiation.F90 new file: src/chemistry/aerosol/aerosol_optics_mod.F90 new file: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 new file: src/physics/cam/aerosol_optics_cam.F90 deleted: src/physics/cam/modal_aer_opt.F90 --- bld/namelist_files/namelist_definition.xml | 2 +- src/chemistry/aerosol/aerosol_optics_mod.F90 | 58 + .../aerosol/aerosol_properties_mod.F90 | 169 +- src/chemistry/aerosol/aerosol_state_mod.F90 | 147 +- .../aerosol/modal_aerosol_properties_mod.F90 | 177 +- .../aerosol/modal_aerosol_state_mod.F90 | 197 +- .../aerosol/refractive_aerosol_optics_mod.F90 | 453 +++++ src/control/runtime_opts.F90 | 4 +- src/physics/cam/aer_rad_props.F90 | 89 +- src/physics/cam/aerosol_optics_cam.F90 | 1259 +++++++++++++ src/physics/cam/modal_aer_opt.F90 | 1621 ----------------- src/physics/cam/rad_constituents.F90 | 143 +- src/physics/rrtmg/radiation.F90 | 11 +- 13 files changed, 2558 insertions(+), 1772 deletions(-) create mode 100644 src/chemistry/aerosol/aerosol_optics_mod.F90 create mode 100644 src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 create mode 100644 src/physics/cam/aerosol_optics_cam.F90 delete mode 100644 src/physics/cam/modal_aer_opt.F90 diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml index 5698285ef2..710a4bade9 100644 --- a/bld/namelist_files/namelist_definition.xml +++ b/bld/namelist_files/namelist_definition.xml @@ -5412,7 +5412,7 @@ Default: false + group="aerosol_optics_nl" valid_values="" > Full pathname of dataset for water refractive indices used in modal aerosol optics Default: none diff --git a/src/chemistry/aerosol/aerosol_optics_mod.F90 b/src/chemistry/aerosol/aerosol_optics_mod.F90 new file mode 100644 index 0000000000..ae2a04bfb1 --- /dev/null +++ b/src/chemistry/aerosol/aerosol_optics_mod.F90 @@ -0,0 +1,58 @@ +module aerosol_optics_mod + use shr_kind_mod, only: r8 => shr_kind_r8 + + implicit none + + private + public :: aerosol_optics + + !> aerosol_optics defines interfaces to optical properties of any aerosol package + !! + !! Each aerosol optics type must extend the abstract aerosol_optics class + !! to define details of how aerosol optics properties are derived from + !! aerosol states. + type, abstract :: aerosol_optics + + contains + + procedure(aeropts_sw_props),deferred :: sw_props + procedure(aeropts_lw_props),deferred :: lw_props + + end type aerosol_optics + + abstract interface + + !------------------------------------------------------------------------------ + ! returns short wave aerosol optics properties + !------------------------------------------------------------------------------ + subroutine aeropts_sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) + import :: aerosol_optics, r8 + + class(aerosol_optics), intent(in) :: self + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: ilev ! vertical level index + integer, intent(in) :: iwav ! wave length index + real(r8),intent(out) :: pext(ncol) ! parameterized specific extinction (m2/kg) + real(r8),intent(out) :: pabs(ncol) ! parameterized specific absorption (m2/kg) + real(r8),intent(out) :: palb(ncol) ! parameterized asymmetry factor + real(r8),intent(out) :: pasm(ncol) ! parameterized single scattering albedo + + end subroutine aeropts_sw_props + + !------------------------------------------------------------------------------ + ! returns long wave aerosol optics properties + !------------------------------------------------------------------------------ + subroutine aeropts_lw_props(self, ncol, ilev, iwav, pabs) + import :: aerosol_optics, r8 + + class(aerosol_optics), intent(in) :: self + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: ilev ! vertical level index + integer, intent(in) :: iwav ! wave length index + real(r8),intent(out) :: pabs(ncol) ! parameterized specific absorption (m2/kg) + + end subroutine aeropts_lw_props + + end interface + +end module aerosol_optics_mod diff --git a/src/chemistry/aerosol/aerosol_properties_mod.F90 b/src/chemistry/aerosol/aerosol_properties_mod.F90 index 1a3a89f611..f68ae07a26 100644 --- a/src/chemistry/aerosol/aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/aerosol_properties_mod.F90 @@ -35,18 +35,23 @@ module aerosol_properties_mod real(r8) :: pom_equivso4_factor_ = -huge(1._r8) contains procedure :: initialize => aero_props_init - procedure :: nbins + procedure,private :: nbins_0list + procedure(aero_nbins_rlist), deferred :: nbins_rlist + generic :: nbins => nbins_0list,nbins_rlist procedure :: ncnst_tot procedure,private :: nspecies_per_bin + procedure(aero_nspecies_rlist), deferred :: nspecies_per_bin_rlist procedure,private :: nspecies_all_bins - generic :: nspecies => nspecies_all_bins,nspecies_per_bin + generic :: nspecies => nspecies_all_bins,nspecies_per_bin,nspecies_per_bin_rlist procedure,private :: n_masses_all_bins procedure,private :: n_masses_per_bin generic :: nmasses => n_masses_all_bins,n_masses_per_bin procedure :: indexer procedure :: maxsat procedure(aero_amcube), deferred :: amcube - procedure :: alogsig + procedure :: alogsig0 + procedure(aero_alogsig_rlist), deferred :: alogsig_rlist + generic :: alogsig => alogsig0,alogsig_rlist procedure(aero_number_transported), deferred :: number_transported procedure(aero_props_get), deferred :: get procedure(aero_actfracs), deferred :: actfracs @@ -63,6 +68,7 @@ module aerosol_properties_mod procedure :: pom_equivso4_factor ! POM Hygroscopicity / Sulfate Hygroscopicity procedure(aero_soluble), deferred :: soluble procedure(aero_min_mass_mean_rad), deferred :: min_mass_mean_rad + procedure(aero_optics_params), deferred :: optics_params procedure :: final=>aero_props_final end type aerosol_properties @@ -83,16 +89,81 @@ end function aero_number_transported ! returns aerosol properties: ! density ! hygroscopicity + ! species type + ! short wave species refractive indices + ! long wave species refractive indices + ! species morphology !------------------------------------------------------------------------ - subroutine aero_props_get(self, bin_ndx, species_ndx, density, hygro) + subroutine aero_props_get(self, bin_ndx, species_ndx, list_ndx, density, hygro, & + spectype, specmorph, refindex_sw, refindex_lw) import :: aerosol_properties, r8 class(aerosol_properties), intent(in) :: self integer, intent(in) :: bin_ndx ! bin index integer, intent(in) :: species_ndx ! species index + integer, optional, intent(in) :: list_ndx ! climate or a diagnostic list number real(r8), optional, intent(out) :: density ! density (kg/m3) real(r8), optional, intent(out) :: hygro ! hygroscopicity + character(len=*), optional, intent(out) :: spectype ! species type + character(len=*), optional, intent(out) :: specmorph ! species morphology + complex(r8), pointer, optional, intent(out) :: refindex_sw(:) ! short wave species refractive indices + complex(r8), pointer, optional, intent(out) :: refindex_lw(:) ! long wave species refractive indices + end subroutine aero_props_get + !------------------------------------------------------------------------ + ! returns optics type and table parameters + !------------------------------------------------------------------------ + subroutine aero_optics_params(self, list_ndx, bin_ndx, opticstype, extpsw, abspsw, asmpsw, absplw, & + refrtabsw, refitabsw, refrtablw, refitablw, ncoef, prefr, prefi, sw_hygro_ext_wtp, & + sw_hygro_ssa_wtp, sw_hygro_asm_wtp, lw_hygro_ext_wtp, wgtpct, nwtp, & + sw_hygro_coreshell_ext, sw_hygro_coreshell_ssa, sw_hygro_coreshell_asm, lw_hygro_coreshell_ext, & + corefrac, bcdust, kap, relh, nfrac, nbcdust, nkap, nrelh ) + + import :: aerosol_properties, r8 + + class(aerosol_properties), intent(in) :: self + integer, intent(in) :: bin_ndx ! bin index + integer, intent(in) :: list_ndx ! rad climate/diags list + + character(len=*), optional, intent(out) :: opticstype + + ! refactive index table parameters + real(r8), optional, pointer :: extpsw(:,:,:,:) ! specific extinction + real(r8), optional, pointer :: abspsw(:,:,:,:) ! specific absorption + real(r8), optional, pointer :: asmpsw(:,:,:,:) ! asymmetry factor + real(r8), optional, pointer :: absplw(:,:,:,:) ! specific absorption + real(r8), optional, pointer :: refrtabsw(:,:) ! table of real refractive indices for aerosols + real(r8), optional, pointer :: refitabsw(:,:) ! table of imaginary refractive indices for aerosols + real(r8), optional, pointer :: refrtablw(:,:) ! table of real refractive indices for aerosols + real(r8), optional, pointer :: refitablw(:,:) ! table of imaginary refractive indices for aerosols + integer, optional, intent(out) :: ncoef ! number of chebychev polynomials + integer, optional, intent(out) :: prefr ! number of real refractive indices in table + integer, optional, intent(out) :: prefi ! number of imaginary refractive indices in table + + ! hygrowghtpct table parameters + real(r8), optional, pointer :: sw_hygro_ext_wtp(:,:) ! short wave extinction table + real(r8), optional, pointer :: sw_hygro_ssa_wtp(:,:) ! short wave single-scatter albedo table + real(r8), optional, pointer :: sw_hygro_asm_wtp(:,:) ! short wave asymmetry table + real(r8), optional, pointer :: lw_hygro_ext_wtp(:,:) ! long wave absorption table + real(r8), optional, pointer :: wgtpct(:) ! weight precent of H2SO4/H2O solution + integer, optional, intent(out) :: nwtp ! number of weight precent values + + ! hygrocoreshell table parameters + real(r8), optional, pointer :: sw_hygro_coreshell_ext(:,:,:,:,:) ! short wave extinction table + real(r8), optional, pointer :: sw_hygro_coreshell_ssa(:,:,:,:,:) ! short wave single-scatter albedo table + real(r8), optional, pointer :: sw_hygro_coreshell_asm(:,:,:,:,:) ! short wave asymmetry table + real(r8), optional, pointer :: lw_hygro_coreshell_ext(:,:,:,:,:) ! long wave absorption table + real(r8), optional, pointer :: corefrac(:) ! core fraction dimension values + real(r8), optional, pointer :: bcdust(:) ! bc/(bc + dust) fraction dimension values + real(r8), optional, pointer :: kap(:) ! hygroscopicity dimension values + real(r8), optional, pointer :: relh(:) ! relative humidity dimension values + integer, optional, intent(out) :: nfrac ! core fraction dimension size + integer, optional, intent(out) :: nbcdust ! bc/(bc + dust) fraction dimension size + integer, optional, intent(out) :: nkap ! hygroscopicity dimension size + integer, optional, intent(out) :: nrelh ! relative humidity dimension size + + end subroutine aero_optics_params + !------------------------------------------------------------------------ ! returns species type !------------------------------------------------------------------------ @@ -254,7 +325,46 @@ logical function aero_soluble(self,bin_ndx) end function aero_soluble - end interface + !------------------------------------------------------------------------------ + ! returns the total number of bins for a given radiation list index + !------------------------------------------------------------------------------ + function aero_nbins_rlist(self, list_ndx) result(res) + import :: aerosol_properties + class(aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + + integer :: res + + end function aero_nbins_rlist + + !------------------------------------------------------------------------------ + ! returns number of species in a bin for a given radiation list index + !------------------------------------------------------------------------------ + function aero_nspecies_rlist(self, list_ndx, bin_ndx) result(res) + import :: aerosol_properties + class(aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + integer, intent(in) :: bin_ndx ! bin number + + integer :: res + + end function aero_nspecies_rlist + + !------------------------------------------------------------------------------ + ! returns the natural log of geometric standard deviation of the number + ! distribution for radiation list number and aerosol bin + !------------------------------------------------------------------------------ + function aero_alogsig_rlist(self, list_ndx, bin_ndx) result(res) + import :: aerosol_properties, r8 + class(aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + integer, intent(in) :: bin_ndx ! bin number + + real(r8) :: res + + end function aero_alogsig_rlist + + end interface contains @@ -272,12 +382,13 @@ subroutine aero_props_init(self, nbin, ncnst, nspec, nmasses, alogsig, f1,f2, ie real(r8),intent(in) :: f2(nbin) ! eq 29 Abdul-Razzak et al 1998 integer,intent(out) :: ierr - integer :: imas,ibin,indx + integer :: imas,ibin,indx, ispc character(len=*),parameter :: prefix = 'aerosol_properties::aero_props_init: ' - real(r8), parameter :: spechygro_so4 = 0.507_r8 ! Sulfate hygroscopicity - real(r8), parameter :: spechygro_soa = 0.14_r8 ! SOA hygroscopicity - real(r8), parameter :: spechygro_pom = 0.1_r8 ! POM hygroscopicity + real(r8) :: spechygro_so4 ! Sulfate hygroscopicity + real(r8) :: spechygro_soa ! SOA hygroscopicity + real(r8) :: spechygro_pom ! POM hygroscopicity + character(len=aero_name_len) :: spectype ierr = 0 @@ -330,8 +441,31 @@ subroutine aero_props_init(self, nbin, ncnst, nspec, nmasses, alogsig, f1,f2, ie self%f1_(:) = f1(:) self%f2_(:) = f2(:) - self%soa_equivso4_factor_ = spechygro_soa/spechygro_so4 - self%pom_equivso4_factor_ = spechygro_pom/spechygro_so4 + spechygro_so4 = 0._r8 + spechygro_pom = 0._r8 + spechygro_soa = 0._r8 + + do ibin=1,nbin + do ispc = 1,nspec(ibin) + call self%species_type(ibin, ispc, spectype) + + select case ( trim(spectype) ) + case('sulfate') + call self%get(ibin, ispc, hygro=spechygro_so4) + case('p-organic') + call self%get(ibin, ispc, hygro=spechygro_pom) + case('s-organic') + call self%get(ibin, ispc, hygro=spechygro_soa) + end select + end do + end do + + if (spechygro_so4 > 0._r8 .and. spechygro_pom > 0._r8 .and. spechygro_soa > 0._r8) then + self%soa_equivso4_factor_ = spechygro_soa/spechygro_so4 + self%pom_equivso4_factor_ = spechygro_pom/spechygro_so4 + else + ierr = 99 + end if end subroutine aero_props_init @@ -422,11 +556,12 @@ end function indexer !------------------------------------------------------------------------------ ! returns the total number of bins !------------------------------------------------------------------------------ - pure integer function nbins(self) + pure function nbins_0list(self) result(nbins) class(aerosol_properties), intent(in) :: self + integer :: nbins nbins = self%nbins_ - end function nbins + end function nbins_0list !------------------------------------------------------------------------------ ! returns number of constituents (or elements) totaled across all bins @@ -440,12 +575,12 @@ end function ncnst_tot !------------------------------------------------------------------------------ ! returns the natural log of geometric standard deviation of the number distribution for aerosol bin !------------------------------------------------------------------------------ - pure real(r8) function alogsig(self, bin_ndx) + pure real(r8) function alogsig0(self, bin_ndx) class(aerosol_properties), intent(in) :: self integer, intent(in) :: bin_ndx ! bin number - alogsig = self%alogsig_(bin_ndx) - end function alogsig + alogsig0 = self%alogsig_(bin_ndx) + end function alogsig0 !------------------------------------------------------------------------------ ! returns maximum supersaturation @@ -529,4 +664,4 @@ pure real(r8) function pom_equivso4_factor(self) end function pom_equivso4_factor - end module aerosol_properties_mod +end module aerosol_properties_mod diff --git a/src/chemistry/aerosol/aerosol_state_mod.F90 b/src/chemistry/aerosol/aerosol_state_mod.F90 index 8e413f0ec1..0e036b84e9 100644 --- a/src/chemistry/aerosol/aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/aerosol_state_mod.F90 @@ -28,7 +28,9 @@ module aerosol_state_mod procedure(aero_get_transported), deferred :: get_transported procedure(aero_set_transported), deferred :: set_transported procedure(aero_get_amb_total_bin_mmr), deferred :: ambient_total_bin_mmr - procedure(aero_get_state_mmr), deferred :: get_ambient_mmr + procedure(aero_get_state_mmr), deferred :: get_ambient_mmr0 + procedure(aero_get_list_mmr), deferred :: get_ambient_mmrl + generic :: get_ambient_mmr=>get_ambient_mmr0,get_ambient_mmrl procedure(aero_get_state_mmr), deferred :: get_cldbrne_mmr procedure(aero_get_state_num), deferred :: get_ambient_num procedure(aero_get_state_num), deferred :: get_cldbrne_num @@ -47,7 +49,14 @@ module aerosol_state_mod procedure :: mass_mean_radius procedure :: watact_mfactor procedure(aero_hetfrz_size_wght), deferred :: hetfrz_size_wght - end type aerosol_state + procedure(aero_hygroscopicity), deferred :: hygroscopicity + procedure(aero_water_uptake), deferred :: water_uptake + procedure :: refractive_index_sw + procedure :: refractive_index_lw + procedure(aero_volume), deferred :: dry_volume + procedure(aero_volume), deferred :: wet_volume + procedure(aero_volume), deferred :: water_volume + end type aerosol_state ! for state fields type ptr2d_t @@ -86,6 +95,19 @@ subroutine aero_get_state_mmr(self, species_ndx, bin_ndx, mmr) real(r8), pointer :: mmr(:,:) ! mass mixing ratios end subroutine aero_get_state_mmr + !------------------------------------------------------------------------ + ! returns aerosol mass mixing ratio for a given species index, bin index + ! and raditaion climate or diagnsotic list number + !------------------------------------------------------------------------ + subroutine aero_get_list_mmr(self, list_ndx, species_ndx, bin_ndx, mmr) + import :: aerosol_state, r8 + class(aerosol_state), intent(in) :: self + integer, intent(in) :: list_ndx ! rad climate/diagnostic list index + integer, intent(in) :: species_ndx ! species index + integer, intent(in) :: bin_ndx ! bin index + real(r8), pointer :: mmr(:,:) ! mass mixing ratios + end subroutine aero_get_list_mmr + !------------------------------------------------------------------------ ! returns aerosol number mixing ratio for a given species index and bin index !------------------------------------------------------------------------ @@ -193,6 +215,55 @@ function aero_hetfrz_size_wght(self, bin_ndx, ncol, nlev) result(wght) end function aero_hetfrz_size_wght + !------------------------------------------------------------------------------ + ! returns hygroscopicity for a given radiation diagnostic list number and + ! bin number + !------------------------------------------------------------------------------ + function aero_hygroscopicity(self, list_ndx, bin_ndx) result(kappa) + import :: aerosol_state, r8 + class(aerosol_state), intent(in) :: self + integer, intent(in) :: list_ndx ! rad climate/diagnostic list index + integer, intent(in) :: bin_ndx ! bin number + + real(r8), pointer :: kappa(:,:) + + end function aero_hygroscopicity + + !------------------------------------------------------------------------------ + ! returns aerosol wet diameter and aerosol water concentration for a given + ! radiation diagnostic list number and bin number + !------------------------------------------------------------------------------ + subroutine aero_water_uptake(self, aero_props, list_idx, bin_idx, ncol, nlev, dgnumwet, qaerwat) + import :: aerosol_state, aerosol_properties, r8 + + class(aerosol_state), intent(in) :: self + class(aerosol_properties), intent(in) :: aero_props + integer, intent(in) :: list_idx ! rad climate/diags list number + integer, intent(in) :: bin_idx ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + real(r8),intent(out) :: dgnumwet(ncol,nlev) ! aerosol wet diameter (m) + real(r8),intent(out) :: qaerwat(ncol,nlev) ! aerosol water concentration (g/g) + + end subroutine aero_water_uptake + + !------------------------------------------------------------------------------ + ! aerosol volume interface + !------------------------------------------------------------------------------ + function aero_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vol) + import :: aerosol_state, aerosol_properties, r8 + + class(aerosol_state), intent(in) :: self + class(aerosol_properties), intent(in) :: aero_props + integer, intent(in) :: list_idx ! rad climate/diags list number + integer, intent(in) :: bin_idx ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + + real(r8) :: vol(ncol,nlev) ! m3/kg + + end function aero_volume + end interface contains @@ -712,4 +783,76 @@ subroutine watact_mfactor(self, bin_ndx, species_type, ncol, nlev, aero_props, end subroutine watact_mfactor + !------------------------------------------------------------------------------ + ! aerosol short wave refactive index + !------------------------------------------------------------------------------ + function refractive_index_sw(self, ncol, ilev, ilist, ibin, iwav, aero_props) result(crefin) + + class(aerosol_state), intent(in) :: self + integer, intent(in) :: ncol ! number of columes + integer, intent(in) :: ilev ! level index + integer, intent(in) :: ilist ! radiation diagnostics list index + integer, intent(in) :: ibin ! bin index + integer, intent(in) :: iwav ! wave length index + class(aerosol_properties), intent(in) :: aero_props ! aerosol properties object + + complex(r8) :: crefin(ncol) ! complex refractive index + + real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio + complex(r8), pointer :: specrefindex(:) ! species refractive index + real(r8) :: specdens ! species density (kg/m3) + integer :: ispec, icol + real(r8) :: vol(ncol) + + crefin(:ncol) = (0._r8, 0._r8) + + do ispec = 1, aero_props%nspecies(ilist,ibin) + + call self%get_ambient_mmr(ilist,ispec,ibin,specmmr) + call aero_props%get(ibin, ispec, list_ndx=ilist, density=specdens, refindex_sw=specrefindex) + + do icol = 1, ncol + vol(icol) = specmmr(icol,ilev)/specdens + crefin(icol) = crefin(icol) + vol(icol)*specrefindex(iwav) + end do + end do + + end function refractive_index_sw + + !------------------------------------------------------------------------------ + ! aerosol long wave refactive index + !------------------------------------------------------------------------------ + function refractive_index_lw(self, ncol, ilev, ilist, ibin, iwav, aero_props) result(crefin) + + class(aerosol_state), intent(in) :: self + integer, intent(in) :: ncol ! number of columes + integer, intent(in) :: ilev ! level index + integer, intent(in) :: ilist ! radiation diagnostics list index + integer, intent(in) :: ibin ! bin index + integer, intent(in) :: iwav ! wave length index + class(aerosol_properties), intent(in) :: aero_props ! aerosol properties object + + complex(r8) :: crefin(ncol) ! complex refractive index + + real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio + complex(r8), pointer :: specrefindex(:) ! species refractive index + real(r8) :: specdens ! species density (kg/m3) + integer :: ispec, icol + real(r8) :: vol(ncol) + + crefin(:ncol) = (0._r8, 0._r8) + + do ispec = 1, aero_props%nspecies(ilist,ibin) + + call self%get_ambient_mmr(ilist,ispec,ibin,specmmr) + call aero_props%get(ibin, ispec, list_ndx=ilist, density=specdens, refindex_lw=specrefindex) + + do icol = 1, ncol + vol(icol) = specmmr(icol,ilev)/specdens + crefin(icol) = crefin(icol) + vol(icol)*specrefindex(iwav) + end do + end do + + end function refractive_index_lw + end module aerosol_state_mod diff --git a/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 b/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 index 5f0ffadcbd..8de1276097 100644 --- a/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 @@ -29,6 +29,10 @@ module modal_aerosol_properties_mod procedure :: icenuc_updates_mmr procedure :: apply_number_limits procedure :: hetfrz_species + procedure :: optics_params + procedure :: nbins_rlist + procedure :: nspecies_per_bin_rlist + procedure :: alogsig_rlist procedure :: soluble procedure :: min_mass_mean_rad final :: destructor @@ -175,19 +179,143 @@ end function number_transported ! returns aerosol properties: ! density ! hygroscopicity + ! species type + ! short wave species refractive indices + ! long wave species refractive indices + ! species morphology !------------------------------------------------------------------------ - subroutine get(self, bin_ndx, species_ndx, density,hygro) + subroutine get(self, bin_ndx, species_ndx, list_ndx, density, hygro, & + spectype, specmorph, refindex_sw, refindex_lw) class(modal_aerosol_properties), intent(in) :: self integer, intent(in) :: bin_ndx ! bin index integer, intent(in) :: species_ndx ! species index + integer, optional, intent(in) :: list_ndx ! climate or a diagnostic list number real(r8), optional, intent(out) :: density ! density (kg/m3) real(r8), optional, intent(out) :: hygro ! hygroscopicity + character(len=*), optional, intent(out) :: spectype ! species type + character(len=*), optional, intent(out) :: specmorph ! species morphology + complex(r8), pointer, optional, intent(out) :: refindex_sw(:) ! short wave species refractive indices + complex(r8), pointer, optional, intent(out) :: refindex_lw(:) ! long wave species refractive indices - call rad_cnst_get_aer_props(0, bin_ndx, species_ndx, density_aer=density, hygro_aer=hygro) + integer :: ilist + + if (present(list_ndx)) then + ilist = list_ndx + else + ilist = 0 + end if + + if (present(density)) then + call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, density_aer=density) + end if + if (present(hygro)) then + call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, hygro_aer=hygro) + end if + if (present(spectype)) then + call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, spectype=spectype ) + end if + if (present(refindex_sw)) then + call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, refindex_aer_sw=refindex_sw ) + end if + if (present(refindex_lw)) then + call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, refindex_aer_lw=refindex_lw ) + end if + if (present(specmorph)) then + specmorph = 'UNKNOWN' + end if end subroutine get + !------------------------------------------------------------------------ + ! returns optics type and table parameters + !------------------------------------------------------------------------ + subroutine optics_params(self, list_ndx, bin_ndx, opticstype, extpsw, abspsw, asmpsw, absplw, & + refrtabsw, refitabsw, refrtablw, refitablw, ncoef, prefr, prefi, sw_hygro_ext_wtp, & + sw_hygro_ssa_wtp, sw_hygro_asm_wtp, lw_hygro_ext_wtp, wgtpct, nwtp, & + sw_hygro_coreshell_ext, sw_hygro_coreshell_ssa, sw_hygro_coreshell_asm, lw_hygro_coreshell_ext, & + corefrac, bcdust, kap, relh, nfrac, nbcdust, nkap, nrelh ) + + class(modal_aerosol_properties), intent(in) :: self + integer, intent(in) :: bin_ndx ! bin index + integer, intent(in) :: list_ndx ! rad climate/diags list + + character(len=*), optional, intent(out) :: opticstype + + ! refactive index table parameters + real(r8), optional, pointer :: extpsw(:,:,:,:) ! specific extinction + real(r8), optional, pointer :: abspsw(:,:,:,:) ! specific absorption + real(r8), optional, pointer :: asmpsw(:,:,:,:) ! asymmetry factor + real(r8), optional, pointer :: absplw(:,:,:,:) ! specific absorption + real(r8), optional, pointer :: refrtabsw(:,:) ! table of real refractive indices for aerosols + real(r8), optional, pointer :: refitabsw(:,:) ! table of imaginary refractive indices for aerosols + real(r8), optional, pointer :: refrtablw(:,:) ! table of real refractive indices for aerosols + real(r8), optional, pointer :: refitablw(:,:) ! table of imaginary refractive indices for aerosols + integer, optional, intent(out) :: ncoef ! number of chebychev polynomials + integer, optional, intent(out) :: prefr ! number of real refractive indices in table + integer, optional, intent(out) :: prefi ! number of imaginary refractive indices in table + + ! hygrowghtpct table parameters + real(r8), optional, pointer :: sw_hygro_ext_wtp(:,:) ! short wave extinction table + real(r8), optional, pointer :: sw_hygro_ssa_wtp(:,:) ! short wave single-scatter albedo table + real(r8), optional, pointer :: sw_hygro_asm_wtp(:,:) ! short wave asymmetry table + real(r8), optional, pointer :: lw_hygro_ext_wtp(:,:) ! long wave absorption table + real(r8), optional, pointer :: wgtpct(:) ! weight precent of H2SO4/H2O solution + integer, optional, intent(out) :: nwtp ! number of weight precent values + + ! hygrocoreshell table parameters + real(r8), optional, pointer :: sw_hygro_coreshell_ext(:,:,:,:,:) ! short wave extinction table + real(r8), optional, pointer :: sw_hygro_coreshell_ssa(:,:,:,:,:) ! short wave single-scatter albedo table + real(r8), optional, pointer :: sw_hygro_coreshell_asm(:,:,:,:,:) ! short wave asymmetry table + real(r8), optional, pointer :: lw_hygro_coreshell_ext(:,:,:,:,:) ! long wave absorption table + real(r8), optional, pointer :: corefrac(:) ! core fraction dimension values + real(r8), optional, pointer :: bcdust(:) ! bc/(bc + dust) fraction dimension values + real(r8), optional, pointer :: kap(:) ! hygroscopicity dimension values + real(r8), optional, pointer :: relh(:) ! relative humidity dimension values + integer, optional, intent(out) :: nfrac ! core fraction dimension size + integer, optional, intent(out) :: nbcdust ! bc/(bc + dust) fraction dimension size + integer, optional, intent(out) :: nkap ! hygroscopicity dimension size + integer, optional, intent(out) :: nrelh ! relative humidity dimension size + + if (present(opticstype)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, opticstype=opticstype) + end if + if (present(extpsw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, extpsw=extpsw) + end if + if (present(abspsw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, abspsw=abspsw) + end if + if (present(asmpsw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, asmpsw=asmpsw) + end if + if (present(absplw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, absplw=absplw) + end if + if (present(refrtabsw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, refrtabsw=refrtabsw) + end if + if (present(refitabsw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, refitabsw=refitabsw) + end if + if (present(refrtablw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, refrtablw=refrtablw) + end if + if (present(refitablw)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, refitablw=refitablw) + end if + if (present(ncoef)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, ncoef=ncoef) + end if + if (present(prefr)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, prefr=prefr) + end if + if (present(prefi)) then + call rad_cnst_get_mode_props(list_ndx,bin_ndx, prefi=prefi) + end if + + end subroutine optics_params + !------------------------------------------------------------------------------ ! returns radius^3 (m3) of a given bin number !------------------------------------------------------------------------------ @@ -451,4 +579,49 @@ function min_mass_mean_rad(self,bin_ndx,species_ndx) result(minrad) end function min_mass_mean_rad + !------------------------------------------------------------------------------ + ! returns the total number of bins for a given radiation list index + !------------------------------------------------------------------------------ + function nbins_rlist(self, list_ndx) result(res) + class(modal_aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + + integer :: res + + call rad_cnst_get_info(list_ndx, nmodes=res) + + end function nbins_rlist + + !------------------------------------------------------------------------------ + ! returns number of species in a bin for a given radiation list index + !------------------------------------------------------------------------------ + function nspecies_per_bin_rlist(self, list_ndx, bin_ndx) result(res) + class(modal_aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + integer, intent(in) :: bin_ndx ! bin number + + integer :: res + + call rad_cnst_get_info(list_ndx, bin_ndx, nspec=res) + + end function nspecies_per_bin_rlist + + !------------------------------------------------------------------------------ + ! returns the natural log of geometric standard deviation of the number + ! distribution for radiation list number and aerosol bin + !------------------------------------------------------------------------------ + function alogsig_rlist(self, list_ndx, bin_ndx) result(res) + class(modal_aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + integer, intent(in) :: bin_ndx ! bin number + + real(r8) :: res + + real(r8) :: sig + + call rad_cnst_get_mode_props(list_ndx, bin_ndx, sigmag=sig) + res = log(sig) + + end function alogsig_rlist + end module modal_aerosol_properties_mod diff --git a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 index 5ad51fdbe9..0646bfda90 100644 --- a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 @@ -7,6 +7,7 @@ module modal_aerosol_state_mod use physics_buffer, only: physics_buffer_desc, pbuf_get_field, pbuf_get_index use physics_types, only: physics_state use aerosol_properties_mod, only: aerosol_properties, aero_name_len + use physconst, only: rhoh2o implicit none @@ -23,7 +24,8 @@ module modal_aerosol_state_mod procedure :: get_transported procedure :: set_transported procedure :: ambient_total_bin_mmr - procedure :: get_ambient_mmr + procedure :: get_ambient_mmr0 + procedure :: get_ambient_mmrl procedure :: get_cldbrne_mmr procedure :: get_ambient_num procedure :: get_cldbrne_num @@ -33,6 +35,11 @@ module modal_aerosol_state_mod procedure :: icenuc_type_wght procedure :: update_bin procedure :: hetfrz_size_wght + procedure :: hygroscopicity + procedure :: water_uptake + procedure :: dry_volume + procedure :: wet_volume + procedure :: water_volume final :: destructor @@ -123,14 +130,28 @@ end function ambient_total_bin_mmr !------------------------------------------------------------------------------ ! returns ambient aerosol mass mixing ratio for a given species index and bin index !------------------------------------------------------------------------------ - subroutine get_ambient_mmr(self, species_ndx, bin_ndx, mmr) + subroutine get_ambient_mmr0(self, species_ndx, bin_ndx, mmr) class(modal_aerosol_state), intent(in) :: self integer, intent(in) :: species_ndx ! species index integer, intent(in) :: bin_ndx ! bin index real(r8), pointer :: mmr(:,:) ! mass mixing ratios call rad_cnst_get_aer_mmr(0, bin_ndx, species_ndx, 'a', self%state, self%pbuf, mmr) - end subroutine get_ambient_mmr + end subroutine get_ambient_mmr0 + + !------------------------------------------------------------------------------ + ! returns ambient aerosol mass mixing ratio for a given radiation diagnostics + ! list index, species index and bin index + !------------------------------------------------------------------------------ + subroutine get_ambient_mmrl(self, list_ndx, species_ndx, bin_ndx, mmr) + class(modal_aerosol_state), intent(in) :: self + integer, intent(in) :: list_ndx ! rad climate list index + integer, intent(in) :: species_ndx ! species index + integer, intent(in) :: bin_ndx ! bin index + real(r8), pointer :: mmr(:,:) ! mass mixing ratios + + call rad_cnst_get_aer_mmr(list_ndx, bin_ndx, species_ndx, 'a', self%state, self%pbuf, mmr) + end subroutine get_ambient_mmrl !------------------------------------------------------------------------------ ! returns cloud-borne aerosol number mixing ratio for a given species index and bin index @@ -399,4 +420,174 @@ function hetfrz_size_wght(self, bin_ndx, ncol, nlev) result(wght) end function hetfrz_size_wght + !------------------------------------------------------------------------------ + ! returns hygroscopicity for a given radiation diagnostic list number and + ! bin number + !------------------------------------------------------------------------------ + function hygroscopicity(self, list_ndx, bin_ndx) result(kappa) + class(modal_aerosol_state), intent(in) :: self + integer, intent(in) :: list_ndx ! rad climate list number + integer, intent(in) :: bin_ndx ! bin number + + real(r8), pointer :: kappa(:,:) + + nullify(kappa) + + end function hygroscopicity + + !------------------------------------------------------------------------------ + ! returns aerosol wet diameter and aerosol water concentration for a given + ! radiation diagnostic list number and bin number + !------------------------------------------------------------------------------ + subroutine water_uptake(self, aero_props, list_idx, bin_idx, ncol, nlev, dgnumwet, qaerwat) + use modal_aero_wateruptake, only: modal_aero_wateruptake_dr + use modal_aero_calcsize, only: modal_aero_calcsize_diag + + class(modal_aerosol_state), intent(in) :: self + class(aerosol_properties), intent(in) :: aero_props + integer, intent(in) :: list_idx ! rad climate/diags list number + integer, intent(in) :: bin_idx ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + real(r8),intent(out) :: dgnumwet(ncol,nlev) ! aerosol wet diameter (m) + real(r8),intent(out) :: qaerwat(ncol,nlev) ! aerosol water concentration (g/g) + + integer :: istat, nmodes + real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes + real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes + real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes + real(r8), pointer :: wetdens_m(:,:,:) ! + real(r8), pointer :: hygro_m(:,:,:) ! + real(r8), pointer :: dryvol_m(:,:,:) ! + real(r8), pointer :: dryrad_m(:,:,:) ! + real(r8), pointer :: drymass_m(:,:,:) ! + real(r8), pointer :: so4dryvol_m(:,:,:) ! + real(r8), pointer :: naer_m(:,:,:) ! + + nmodes = aero_props%nbins() + + if (list_idx == 0) then + ! water uptake and wet radius for the climate list has already been calculated + call pbuf_get_field(self%pbuf, pbuf_get_index('DGNUMWET'), dgnumwet_m) + call pbuf_get_field(self%pbuf, pbuf_get_index('QAERWAT'), qaerwat_m) + + dgnumwet(:ncol,:nlev) = dgnumwet_m(:ncol,:nlev,bin_idx) + qaerwat (:ncol,:nlev) = qaerwat_m(:ncol,:nlev,bin_idx) + + else + ! If doing a diagnostic calculation then need to calculate the wet radius + ! and water uptake for the diagnostic modes + allocate(dgnumdry_m(ncol,nlev,nmodes), dgnumwet_m(ncol,nlev,nmodes), & + qaerwat_m(ncol,nlev,nmodes), wetdens_m(ncol,nlev,nmodes), & + hygro_m(ncol,nlev,nmodes), dryvol_m(ncol,nlev,nmodes), & + dryrad_m(ncol,nlev,nmodes), drymass_m(ncol,nlev,nmodes), & + so4dryvol_m(ncol,nlev,nmodes), naer_m(ncol,nlev,nmodes), stat=istat) + if (istat > 0) then + dgnumwet = -huge(1._r8) + qaerwat = -huge(1._r8) + return + end if + call modal_aero_calcsize_diag(self%state, self%pbuf, list_idx, dgnumdry_m, hygro_m, & + dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) + call modal_aero_wateruptake_dr(self%state, self%pbuf, list_idx, dgnumdry_m, dgnumwet_m, & + qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & + drymass_m, so4dryvol_m, naer_m) + + dgnumwet(:ncol,:nlev) = dgnumwet_m(:ncol,:nlev,bin_idx) + qaerwat (:ncol,:nlev) = qaerwat_m(:ncol,:nlev,bin_idx) + + deallocate(dgnumdry_m) + deallocate(dgnumwet_m) + deallocate(qaerwat_m) + deallocate(wetdens_m) + deallocate(hygro_m) + deallocate(dryvol_m) + deallocate(dryrad_m) + deallocate(drymass_m) + deallocate(so4dryvol_m) + deallocate(naer_m) + endif + + + end subroutine water_uptake + + !------------------------------------------------------------------------------ + ! aerosol dry volume (m3/kg) for given radiation diagnostic list number and bin number + !------------------------------------------------------------------------------ + function dry_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vol) + + class(modal_aerosol_state), intent(in) :: self + class(aerosol_properties), intent(in) :: aero_props + + integer, intent(in) :: list_idx ! rad climate/diags list number + integer, intent(in) :: bin_idx ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + + real(r8) :: vol(ncol,nlev) ! m3/kg + + real(r8), pointer :: mmr(:,:) + real(r8) :: specdens ! species density (kg/m3) + + integer :: ispec + + vol(:,:) = 0._r8 + + do ispec = 1, aero_props%nspecies(list_idx,bin_idx) + call self%get_ambient_mmr(list_idx, ispec, bin_idx, mmr) + call aero_props%get(bin_idx, ispec, list_ndx=list_idx, density=specdens) + vol(:ncol,:) = vol(:ncol,:) + mmr(:ncol,:)/specdens + end do + + end function dry_volume + + !------------------------------------------------------------------------------ + ! aerosol wet volume (m3/kg) for given radiation diagnostic list number and bin number + !------------------------------------------------------------------------------ + function wet_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vol) + + class(modal_aerosol_state), intent(in) :: self + class(aerosol_properties), intent(in) :: aero_props + + integer, intent(in) :: list_idx ! rad climate/diags list number + integer, intent(in) :: bin_idx ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + + real(r8) :: vol(ncol,nlev) ! m3/kg + + real(r8) :: dryvol(ncol,nlev) + real(r8) :: watervol(ncol,nlev) + + dryvol = self%dry_volume(aero_props, list_idx, bin_idx, ncol, nlev) + watervol = self%water_volume(aero_props, list_idx, bin_idx, ncol, nlev) + + vol = watervol + dryvol + + end function wet_volume + + !------------------------------------------------------------------------------ + ! aerosol water volume (m3/kg) for given radiation diagnostic list number and bin number + !------------------------------------------------------------------------------ + function water_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vol) + + class(modal_aerosol_state), intent(in) :: self + class(aerosol_properties), intent(in) :: aero_props + + integer, intent(in) :: list_idx ! rad climate/diags list number + integer, intent(in) :: bin_idx ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + + real(r8) :: vol(ncol,nlev) ! m3/kg + + real(r8) :: dgnumwet(ncol,nlev) + real(r8) :: qaerwat(ncol,nlev) + + call self%water_uptake(aero_props, list_idx, bin_idx, ncol, nlev, dgnumwet, qaerwat) + + vol(:ncol,:nlev) = qaerwat(:ncol,:nlev)/rhoh2o + + end function water_volume + end module modal_aerosol_state_mod diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 new file mode 100644 index 0000000000..af662b2a5d --- /dev/null +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -0,0 +1,453 @@ +module refractive_aerosol_optics_mod + use shr_kind_mod, only: r8 => shr_kind_r8 + use aerosol_optics_mod, only: aerosol_optics + use physconst, only: rhoh2o + use aerosol_state_mod, only: aerosol_state + use aerosol_properties_mod, only: aerosol_properties + + implicit none + + private + public :: refractive_aerosol_optics + + !> refractive_aerosol_optics + !! Table look up implementation of aerosol_optics to parameterize aerosol radiative properties in terms of + !! surface mode wet radius and wet refractive index using chebychev polynomials + type, extends(aerosol_optics) :: refractive_aerosol_optics + + integer :: ibin, ilist + class(aerosol_state), pointer :: aero_state ! aerosol_state object + class(aerosol_properties), pointer :: aero_props ! aerosol_properties object + + real(r8), allocatable :: watervol(:,:) ! volume concentration of water in each mode (m3/kg) + real(r8), allocatable :: wetvol(:,:) ! volume concentration of wet mode (m3/kg) + real(r8), allocatable :: cheb(:,:,:) ! chebychef polynomials + real(r8), allocatable :: radsurf(:,:) ! aerosol surface mode radius + real(r8), allocatable :: logradsurf(:,:) ! log(aerosol surface mode radius) + + ! refractive index for water read in read_water_refindex + complex(r8), allocatable :: crefwsw(:) ! complex refractive index for water visible + complex(r8), allocatable :: crefwlw(:) ! complex refractive index for water infrared + + real(r8), pointer :: extpsw(:,:,:,:) => null() ! specific extinction + real(r8), pointer :: abspsw(:,:,:,:) => null() ! specific absorption + real(r8), pointer :: asmpsw(:,:,:,:) => null() ! asymmetry factor + real(r8), pointer :: absplw(:,:,:,:) => null() ! specific absorption + + real(r8), pointer :: refrtabsw(:,:) => null() ! table of real refractive indices for aerosols + real(r8), pointer :: refitabsw(:,:) => null() ! table of imag refractive indices for aerosols + real(r8), pointer :: refrtablw(:,:) => null() ! table of real refractive indices for aerosols + real(r8), pointer :: refitablw(:,:) => null() ! table of imag refractive indices for aerosols + + contains + + procedure :: sw_props + procedure :: lw_props + + final :: destructor + + end type refractive_aerosol_optics + + interface refractive_aerosol_optics + procedure :: constructor + end interface refractive_aerosol_optics + + ! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties + ! in terms of refractive index and wet radius + integer, parameter :: ncoef=5, prefr=7, prefi=10 !??? get from aerosol properties ???? + + real(r8), parameter :: xrmin=log(0.01e-6_r8) + real(r8), parameter :: xrmax=log(25.e-6_r8) + +contains + + !------------------------------------------------------------------------------ + !------------------------------------------------------------------------------ + function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, crefwsw, crefwlw) & + result(newobj) + + class(aerosol_properties),intent(in), target :: aero_props ! aerosol_properties object + class(aerosol_state),intent(in), target :: aero_state ! aerosol_state object + integer, intent(in) :: ilist ! climate or a diagnostic list number + integer, intent(in) :: ibin ! bin number + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: nlev ! number of levels + integer, intent(in) :: nsw ! number of short wave lengths + integer, intent(in) :: nlw ! number of long wave lengths + complex(r8), intent(in) :: crefwsw(nsw) ! complex refractive index for water visible + complex(r8), intent(in) :: crefwlw(nlw) ! complex refractive index for water infrared + + type(refractive_aerosol_optics), pointer :: newobj + + integer :: ierr, icol, ilev, ispec, nspec + real(r8) :: vol(ncol) ! volume concentration of aerosol specie (m3/kg) + real(r8) :: dryvol(ncol) ! volume concentration of aerosol mode (m3/kg) + real(r8) :: specdens ! species density (kg/m3) + real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio + real(r8) :: logsigma ! geometric standard deviation of number distribution + + real(r8) :: dgnumwet(ncol,nlev) ! aerosol wet number mode diameter (m) + real(r8) :: qaerwat(ncol,nlev) ! aerosol water (g/g) + + allocate(newobj, stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + + allocate(newobj%watervol(ncol,nlev),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + allocate(newobj%wetvol(ncol,nlev),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + allocate(newobj%cheb(ncoef,ncol,nlev),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + allocate(newobj%radsurf(ncol,nlev),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + allocate(newobj%logradsurf(ncol,nlev),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + + allocate(newobj%crefwlw(nlw),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + newobj%crefwlw(:) = crefwlw(:) + + allocate(newobj%crefwsw(nsw),stat=ierr) + if (ierr/=0) then + nullify(newobj) + return + end if + newobj%crefwsw(:) = crefwsw(:) + + call aero_state%water_uptake(aero_props, ilist, ibin, ncol, nlev, dgnumwet, qaerwat) + + nspec = aero_props%nspecies(ilist,ibin) + + logsigma=aero_props%alogsig(ilist,ibin) + + ! calc size parameter for all columns + call modal_size_parameters(ncol, nlev, logsigma, dgnumwet, newobj%radsurf, newobj%logradsurf, newobj%cheb) + + do ilev = 1, nlev + dryvol(:ncol) = 0._r8 + do ispec = 1, nspec + call aero_state%get_ambient_mmr(ilist,ispec,ibin,specmmr) + call aero_props%get(ibin, ispec, list_ndx=ilist, density=specdens) + + do icol = 1, ncol + vol(icol) = specmmr(icol,ilev)/specdens + dryvol(icol) = dryvol(icol) + vol(icol) + + newobj%watervol(icol,ilev) = qaerwat(icol,ilev)/rhoh2o + newobj%wetvol(icol,ilev) = newobj%watervol(icol,ilev) + dryvol(icol) + if (newobj%watervol(icol,ilev) < 0._r8) then + newobj%watervol(icol,ilev) = 0._r8 + newobj%wetvol(icol,ilev) = dryvol(icol) + end if + end do + end do + end do + + ! get mode properties + call aero_props%optics_params(ilist, ibin, & + refrtabsw=newobj%refrtabsw, refitabsw=newobj%refitabsw, & + refrtablw=newobj%refrtablw, refitablw=newobj%refitablw,& + extpsw=newobj%extpsw, abspsw=newobj%abspsw, asmpsw=newobj%asmpsw, & + absplw=newobj%absplw) + + newobj%aero_state => aero_state + newobj%aero_props => aero_props + newobj%ilist = ilist + newobj%ibin = ibin + + end function constructor + + !------------------------------------------------------------------------------ + ! returns short wave aerosol optics properties + !------------------------------------------------------------------------------ + subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) + + class(refractive_aerosol_optics), intent(in) :: self + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: ilev ! vertical level index + integer, intent(in) :: iwav ! wave length index + real(r8),intent(out) :: pext(ncol) ! parameterized specific extinction (m2/kg) + real(r8),intent(out) :: pabs(ncol) ! parameterized specific absorption (m2/kg) + real(r8),intent(out) :: palb(ncol) ! parameterized asymmetry factor + real(r8),intent(out) :: pasm(ncol) ! parameterized single scattering albedo + + real(r8) :: refr(ncol) ! real part of refractive index + real(r8) :: refi(ncol) ! imaginary part of refractive index + integer :: itab(ncol), jtab(ncol) + real(r8) :: ttab(ncol), utab(ncol) + real(r8) :: cext(ncol,ncoef), cabs(ncol,ncoef), casm(ncol,ncoef) + + complex(r8) :: crefin(ncol) ! complex refractive index + integer :: icol,icoef + + crefin(:ncol) = self%aero_state%refractive_index_sw(ncol, ilev, self%ilist, self%ibin, iwav, self%aero_props) + + do icol = 1, ncol + crefin(icol) = crefin(icol) + self%watervol(icol,ilev)*self%crefwsw(iwav) + crefin(icol) = crefin(icol)/max(self%wetvol(icol,ilev),1.e-60_r8) + refr(icol) = real(crefin(icol)) + refi(icol) = abs(aimag(crefin(icol))) + end do + + ! interpolate coefficients linear in refractive index + ! first call calcs itab,jtab,ttab,utab + itab(:ncol) = 0 + call binterp(self%extpsw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & + refr, refi, self%refrtabsw(:,iwav), self%refitabsw(:,iwav), & + itab, jtab, ttab, utab, cext) + call binterp(self%abspsw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & + refr, refi, self%refrtabsw(:,iwav), self%refitabsw(:,iwav), & + itab, jtab, ttab, utab, cabs) + call binterp(self%asmpsw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & + refr, refi, self%refrtabsw(:,iwav), self%refitabsw(:,iwav), & + itab, jtab, ttab, utab, casm) + + do icol = 1,ncol + + if (self%logradsurf(icol,ilev) <= xrmax) then + pext(icol) = 0.5_r8*cext(icol,1) + do icoef = 2, ncoef + pext(icol) = pext(icol) + self%cheb(icoef,icol,ilev)*cext(icol,icoef) + enddo + pext(icol) = exp(pext(icol)) + else + pext(icol) = 1.5_r8/(self%radsurf(icol,ilev)*rhoh2o) ! geometric optics + endif + + ! convert from m2/kg water to m2/kg aerosol + pext(icol) = pext(icol)*self%wetvol(icol,ilev)*rhoh2o + pabs(icol) = 0.5_r8*cabs(icol,1) + pasm(icol) = 0.5_r8*casm(icol,1) + do icoef = 2, ncoef + pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icol,icoef) + pasm(icol) = pasm(icol) + self%cheb(icoef,icol,ilev)*casm(icol,icoef) + enddo + pabs(icol) = pabs(icol)*self%wetvol(icol,ilev)*rhoh2o + pabs(icol) = max(0._r8,pabs(icol)) + pabs(icol) = min(pext(icol),pabs(icol)) + + palb(icol) = 1._r8-pabs(icol)/max(pext(icol),1.e-40_r8) + palb(icol) = 1._r8-pabs(icol)/max(pext(icol),1.e-40_r8) + + end do + + end subroutine sw_props + + !------------------------------------------------------------------------------ + ! returns long wave aerosol optics properties + !------------------------------------------------------------------------------ + subroutine lw_props(self, ncol, ilev, iwav, pabs) + + class(refractive_aerosol_optics), intent(in) :: self + integer, intent(in) :: ncol ! number of columns + integer, intent(in) :: ilev ! vertical level index + integer, intent(in) :: iwav ! wave length index + real(r8),intent(out) :: pabs(ncol) ! parameterized specific absorption (m2/kg) + + real(r8) :: refr(ncol) ! real part of refractive index + real(r8) :: refi(ncol) ! imaginary part of refractive index + integer :: itab(ncol), jtab(ncol) + real(r8) :: ttab(ncol), utab(ncol) + real(r8) :: cabs(ncol,ncoef) + + complex(r8) :: crefin(ncol) ! complex refractive index + integer :: icol, icoef + + crefin(:ncol) = self%aero_state%refractive_index_lw(ncol, ilev, self%ilist, self%ibin, iwav, self%aero_props) + + do icol = 1, ncol + crefin(icol) = crefin(icol) + self%watervol(icol,ilev)*self%crefwlw(iwav) + if (self%wetvol(icol,ilev) > 1.e-40_r8) then + crefin(icol) = crefin(icol)/self%wetvol(icol,ilev) + end if + refr(icol) = real(crefin(icol)) + refi(icol) = aimag(crefin(icol)) + end do + + ! interpolate coefficients linear in refractive index + ! first call calcs itab,jtab,ttab,utab + itab(:ncol) = 0 + call binterp(self%absplw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & + refr, refi, self%refrtablw(:,iwav), self%refitablw(:,iwav), & + itab, jtab, ttab, utab, cabs) + + do icol = 1,ncol + pabs(icol) = 0.5_r8*cabs(icol,1) + do icoef = 2, ncoef + pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icol,icoef) + end do + pabs(icol) = pabs(icol)*self%wetvol(icol,ilev)*rhoh2o + pabs(icol) = max(0._r8,pabs(icol)) + end do + + end subroutine lw_props + + + !------------------------------------------------------------------------------ + !------------------------------------------------------------------------------ + subroutine destructor(self) + + type(refractive_aerosol_optics), intent(inout) :: self + + deallocate(self%watervol) + deallocate(self%wetvol) + deallocate(self%cheb) + deallocate(self%radsurf) + deallocate(self%logradsurf) + deallocate(self%crefwsw) + deallocate(self%crefwlw) + + nullify(self%aero_state) + nullify(self%aero_props) + nullify(self%extpsw) + nullify(self%abspsw) + nullify(self%asmpsw) + nullify(self%absplw) + nullify(self%refrtabsw) + nullify(self%refitabsw) + nullify(self%refrtablw) + nullify(self%refitablw) + + end subroutine destructor + + + ! Private routines + !=============================================================================== + + !=============================================================================== + + subroutine modal_size_parameters(ncol,nlev, alnsg_amode, dgnumwet, radsurf, logradsurf, cheb) + + integer, intent(in) :: ncol,nlev + real(r8), intent(in) :: alnsg_amode ! geometric standard deviation of number distribution + real(r8), intent(in) :: dgnumwet(:,:) ! aerosol wet number mode diameter (m) + real(r8), intent(out) :: radsurf(:,:) ! aerosol surface mode radius + real(r8), intent(out) :: logradsurf(:,:) ! log(aerosol surface mode radius) + real(r8), intent(out) :: cheb(:,:,:) + + integer :: i, k, nc + real(r8) :: explnsigma + real(r8) :: xrad(ncol) ! normalized aerosol radius + + !------------------------------------------------------------------------------- + + explnsigma = exp(2.0_r8*alnsg_amode*alnsg_amode) + + ! do k = top_lev, pver + do k = 1, nlev + do i = 1, ncol + ! convert from number mode diameter to surface area + radsurf(i,k) = 0.5_r8*dgnumwet(i,k)*explnsigma + logradsurf(i,k) = log(radsurf(i,k)) + ! normalize size parameter + xrad(i) = max(logradsurf(i,k),xrmin) + xrad(i) = min(xrad(i),xrmax) + xrad(i) = (2._r8*xrad(i)-xrmax-xrmin)/(xrmax-xrmin) + ! chebyshev polynomials + cheb(1,i,k) = 1._r8 + cheb(2,i,k) = xrad(i) + do nc = 3, ncoef + cheb(nc,i,k) = 2._r8*xrad(i)*cheb(nc-1,i,k)-cheb(nc-2,i,k) + end do + end do + end do + + end subroutine modal_size_parameters + +!=============================================================================== + subroutine binterp(table,ncol,km,im,jm,x,y,xtab,ytab,ix,jy,t,u,out) + + ! bilinear interpolation of table + ! + integer, intent(in) :: ncol,km,im,jm + real(r8),intent(in) :: table(km,im,jm) + real(r8),intent(in) :: x(ncol),y(ncol), xtab(im),ytab(jm) + integer,intent(inout) :: ix(ncol), jy(ncol) + real(r8),intent(inout) :: t(ncol), u(ncol) + real(r8),intent(out) :: out(ncol,km) + + + integer :: i,j,k,ic,ip1, ixc,jyc, jp1, ip1m(ncol),jp1m(ncol) + real(r8) :: dx,dy,tu(ncol),tuc(ncol),tcu(ncol),tcuc(ncol) + + if(ix(1).gt.0) go to 30 + if(im.gt.1)then + do ic=1,ncol + do i=1,im + if(x(ic).lt.xtab(i))go to 10 + enddo +10 ix(ic)=max0(i-1,1) + ip1=min(ix(ic)+1,im) + dx=(xtab(ip1)-xtab(ix(ic))) + if(abs(dx).gt.1.e-20_r8)then + t(ic)=(x(ic)-xtab(ix(ic)))/dx + else + t(ic)=0._r8 + endif + end do + else + ix(:ncol)=1 + t(:ncol)=0._r8 + endif + if(jm.gt.1)then + do ic=1,ncol + do j=1,jm + if(y(ic).lt.ytab(j))go to 20 + enddo +20 jy(ic)=max0(j-1,1) + jp1=min(jy(ic)+1,jm) + dy=(ytab(jp1)-ytab(jy(ic))) + if(abs(dy).gt.1.e-20_r8)then + u(ic)=(y(ic)-ytab(jy(ic)))/dy + else + u(ic)=0._r8 + endif + end do + else + jy(:ncol)=1 + u(:ncol)=0._r8 + endif +30 continue + do ic=1,ncol + tu(ic)=t(ic)*u(ic) + tuc(ic)=t(ic)-tu(ic) + tcuc(ic)=1._r8-tuc(ic)-u(ic) + tcu(ic)=u(ic)-tu(ic) + jp1m(ic)=min(jy(ic)+1,jm) + ip1m(ic)=min(ix(ic)+1,im) + enddo + do ic=1,ncol + jyc=jy(ic) + ixc=ix(ic) + jp1=jp1m(ic) + ip1=ip1m(ic) + do k=1,km + out(ic,k) = tcuc(ic) * table(k,ixc,jyc) + tuc(ic) * table(k,ip1,jyc) + & + tu(ic) * table(k,ip1,jp1) + tcu(ic) * table(k,ixc,jp1) + end do + end do + return + end subroutine binterp + +end module refractive_aerosol_optics_mod diff --git a/src/control/runtime_opts.F90 b/src/control/runtime_opts.F90 index f09554244d..a4f75c08e6 100644 --- a/src/control/runtime_opts.F90 +++ b/src/control/runtime_opts.F90 @@ -64,7 +64,7 @@ subroutine read_namelist(nlfilename, single_column, scmlat, scmlon) use conv_water, only: conv_water_readnl use rad_constituents, only: rad_cnst_readnl use radiation_data, only: rad_data_readnl - use modal_aer_opt, only: modal_aer_opt_readnl + use aerosol_optics_cam, only: aerosol_optics_cam_readnl use clubb_intr, only: clubb_readnl use chemistry, only: chem_readnl use prescribed_volcaero, only: prescribed_volcaero_readnl @@ -165,7 +165,7 @@ subroutine read_namelist(nlfilename, single_column, scmlat, scmlon) call radiation_readnl(nlfilename) call rad_cnst_readnl(nlfilename) call rad_data_readnl(nlfilename) - call modal_aer_opt_readnl(nlfilename) + call aerosol_optics_cam_readnl(nlfilename) call chem_readnl(nlfilename) call lightning_readnl(nlfilename) call prescribed_volcaero_readnl(nlfilename) diff --git a/src/physics/cam/aer_rad_props.F90 b/src/physics/cam/aer_rad_props.F90 index 058f53f784..5faca8beac 100644 --- a/src/physics/cam/aer_rad_props.F90 +++ b/src/physics/cam/aer_rad_props.F90 @@ -2,7 +2,7 @@ module aer_rad_props !------------------------------------------------------------------------------------------------ ! Converts aerosol masses to bulk optical properties for sw and lw radiation -! computations. +! computations. !------------------------------------------------------------------------------------------------ use shr_kind_mod, only: r8 => shr_kind_r8 @@ -15,7 +15,7 @@ module aer_rad_props use rad_constituents, only: rad_cnst_get_info, rad_cnst_get_aer_mmr, & rad_cnst_get_aer_props use wv_saturation, only: qsat -use modal_aer_opt, only: modal_aero_sw, modal_aero_lw +use aerosol_optics_cam,only: aerosol_optics_cam_init, aerosol_optics_cam_sw, aerosol_optics_cam_lw use cam_history, only: fieldname_len, addfld, outfld, add_default, horiz_only use cam_history_support, only : fillvalue ! Placed here due to PGI bug. @@ -89,11 +89,11 @@ subroutine aer_rad_props_init() end do ! Determine default fields - if (history_amwg .or. history_dust ) then + if (history_amwg .or. history_dust ) then call add_default ('AEROD_v', 1, ' ') - endif - - if ( history_aero_optics ) then + endif + + if ( history_aero_optics ) then call add_default ('AEROD_v', 1, ' ') do i = 1, numaerosols odv_names(i) = 'ODV_'//trim(aernames(i)) @@ -101,6 +101,7 @@ subroutine aer_rad_props_init() end do endif + call aerosol_optics_cam_init() deallocate(aernames) @@ -118,7 +119,7 @@ subroutine aer_rad_props_sw(list_idx, state, pbuf, nnite, idxnite, & ! Arguments integer, intent(in) :: list_idx ! index of the climate or a diagnostic list type(physics_state), intent(in), target :: state - + type(physics_buffer_desc), pointer :: pbuf(:) integer, intent(in) :: nnite ! number of night columns integer, intent(in) :: idxnite(:) ! local column indices of night columns @@ -170,7 +171,7 @@ subroutine aer_rad_props_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: rhtrunc(pcols,pver) real(r8) :: wrh(pcols,pver) integer :: krh(pcols,pver) - + integer :: numaerosols ! number of bulk aerosols in climate/diagnostic list integer :: nmodes ! number of aerosol modes in climate/diagnostic list integer :: iaerosol ! index into bulk aerosol list @@ -215,15 +216,15 @@ subroutine aer_rad_props_sw(list_idx, state, pbuf, nnite, idxnite, & ! Contributions from modal aerosols. if (nmodes > 0) then - call modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & - tau, tau_w, tau_w_g, tau_w_f) + call aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, & + tau, tau_w, tau_w_g, tau_w_f) else tau (1:ncol,:,:) = 0._r8 tau_w (1:ncol,:,:) = 0._r8 tau_w_g(1:ncol,:,:) = 0._r8 tau_w_f(1:ncol,:,:) = 0._r8 end if - + call tropopause_find(state, troplev) ! Contributions from bulk aerosols. @@ -310,14 +311,14 @@ subroutine aer_rad_props_lw(list_idx, state, pbuf, odap_aer) ! Purpose: Compute aerosol transmissions needed in absorptivity/ ! emissivity calculations - ! lw extinction is the same representation for all + ! lw extinction is the same representation for all ! species. If this changes, this routine will need to do something ! similar to the sw with routines like get_hygro_lw_abs ! Arguments integer, intent(in) :: list_idx ! index of the climate or a diagnostic list type(physics_state), intent(in), target :: state - + type(physics_buffer_desc), pointer :: pbuf(:) real(r8), intent(out) :: odap_aer(pcols,pver,nlwbands) ! [fraction] absorption optical depth, per layer @@ -336,7 +337,7 @@ subroutine aer_rad_props_lw(list_idx, state, pbuf, odap_aer) real(r8), pointer :: lw_abs(:) real(r8), pointer :: lw_hygro_abs(:,:) real(r8), pointer :: geometric_radius(:,:) - + ! volcanic lookup table real(r8), pointer :: r_lw_abs(:,:) ! radius dependent mass-specific absorption coefficient real(r8), pointer :: r_mu(:) ! log(geometric_mean_radius) domain samples of r_lw_abs(:,:) @@ -369,7 +370,7 @@ subroutine aer_rad_props_lw(list_idx, state, pbuf, odap_aer) ! Contributions from modal aerosols. if (nmodes > 0) then - call modal_aero_lw(list_idx, state, pbuf, odap_aer) + call aerosol_optics_cam_lw(list_idx, state, pbuf, odap_aer) else odap_aer = 0._r8 end if @@ -422,13 +423,13 @@ subroutine aer_rad_props_lw(list_idx, state, pbuf, odap_aer) ! get optical properties for hygroscopic aerosols call rad_cnst_get_aer_props(list_idx, iaerosol, lw_ext=lw_abs) do bnd_idx = 1, nlwbands - do k = 1, pver + do k = 1, pver do i = 1, ncol odap_aer(i,k,bnd_idx) = odap_aer(i,k,bnd_idx) + lw_abs(bnd_idx)*aermass(i,k) end do end do end do - + case('volcanic_radius','volcanic_radius1','volcanic_radius2','volcanic_radius3') pbuf_fld = 'VOLC_RAD_GEOM ' if (len_trim(opticstype)>15) then @@ -440,7 +441,7 @@ subroutine aer_rad_props_lw(list_idx, state, pbuf, odap_aer) ! get microphysical properties for volcanic aerosols idx = pbuf_get_index(pbuf_fld) call pbuf_get_field(pbuf, idx, geometric_radius ) - + ! interpolate in radius ! caution: clip the table with no warning when outside bounds nmu = size(r_mu) @@ -509,7 +510,7 @@ subroutine get_hygro_rad_props(ncol, krh, wrh, mass, ext, ssa, asm, & - wrh(icol,ilev) * ssa(krh(icol,ilev), iswband) asm1 = (1 + wrh(icol,ilev)) * asm(krh(icol,ilev)+1,iswband) & - wrh(icol,ilev) * asm(krh(icol,ilev), iswband) - + tau (icol, ilev, iswband) = mass(icol, ilev) * ext1 tau_w (icol, ilev, iswband) = mass(icol, ilev) * ext1 * ssa1 tau_w_g(icol, ilev, iswband) = mass(icol, ilev) * ext1 * ssa1 * asm1 @@ -518,10 +519,10 @@ subroutine get_hygro_rad_props(ncol, krh, wrh, mass, ext, ssa, asm, & enddo enddo -end subroutine get_hygro_rad_props +end subroutine get_hygro_rad_props !============================================================================== - + subroutine get_nonhygro_rad_props(ncol, mass, ext, ssa, asm, & tau, tau_w, tau_w_g, tau_w_f) @@ -535,13 +536,13 @@ subroutine get_nonhygro_rad_props(ncol, mass, ext, ssa, asm, & real(r8), intent(out) :: tau (pcols, pver, nswbands) real(r8), intent(out) :: tau_w (pcols, pver, nswbands) real(r8), intent(out) :: tau_w_g(pcols, pver, nswbands) - real(r8), intent(out) :: tau_w_f(pcols, pver, nswbands) + real(r8), intent(out) :: tau_w_f(pcols, pver, nswbands) ! Local variables integer :: iswband real(r8) :: ext1, ssa1, asm1 !----------------------------------------------------------------------------- - + do iswband = 1, nswbands ext1 = ext(iswband) ssa1 = ssa(iswband) @@ -555,11 +556,11 @@ subroutine get_nonhygro_rad_props(ncol, mass, ext, ssa, asm, & end subroutine get_nonhygro_rad_props !============================================================================== - + subroutine get_volcanic_radius_rad_props(ncol, mass, pbuf_radius_name, pbuf, r_ext, r_scat, r_ascat, r_mu, & tau, tau_w, tau_w_g, tau_w_f) - + use physics_buffer, only : pbuf_get_field, pbuf_get_index ! Arguments @@ -575,7 +576,7 @@ subroutine get_volcanic_radius_rad_props(ncol, mass, pbuf_radius_name, pbuf, r_ real(r8), intent(out) :: tau (pcols, pver, nswbands) real(r8), intent(out) :: tau_w (pcols, pver, nswbands) real(r8), intent(out) :: tau_w_g(pcols, pver, nswbands) - real(r8), intent(out) :: tau_w_f(pcols, pver, nswbands) + real(r8), intent(out) :: tau_w_f(pcols, pver, nswbands) ! Local variables integer :: iswband @@ -586,7 +587,7 @@ subroutine get_volcanic_radius_rad_props(ncol, mass, pbuf_radius_name, pbuf, r_ real(r8) :: mu(pcols,pver) ! log(geometric mean radius of volcanic aerosol) integer :: kmu, nmu real(r8) :: wmu, mutrunc, r_mu_max, r_mu_min - + ! interpolated values from table real(r8) :: ext(nswbands) real(r8) :: scat(nswbands) @@ -595,10 +596,10 @@ subroutine get_volcanic_radius_rad_props(ncol, mass, pbuf_radius_name, pbuf, r_ integer :: i, k ! column level iterator !----------------------------------------------------------------------------- - tau =0._r8 - tau_w =0._r8 - tau_w_g=0._r8 - tau_w_f=0._r8 + tau =0._r8 + tau_w =0._r8 + tau_w_g=0._r8 + tau_w_f=0._r8 ! get microphysical properties for volcanic aerosols idx = pbuf_get_index(pbuf_radius_name) @@ -634,10 +635,10 @@ subroutine get_volcanic_radius_rad_props(ncol, mass, pbuf_radius_name, pbuf, r_ else g=0._r8 endif - tau (i,k,iswband) = mass(i,k) * ext(iswband) - tau_w (i,k,iswband) = mass(i,k) * scat(iswband) - tau_w_g(i,k,iswband) = mass(i,k) * ascat(iswband) - tau_w_f(i,k,iswband) = mass(i,k) * g * ascat(iswband) + tau (i,k,iswband) = mass(i,k) * ext(iswband) + tau_w (i,k,iswband) = mass(i,k) * scat(iswband) + tau_w_g(i,k,iswband) = mass(i,k) * ascat(iswband) + tau_w_f(i,k,iswband) = mass(i,k) * g * ascat(iswband) end do enddo enddo @@ -645,7 +646,7 @@ subroutine get_volcanic_radius_rad_props(ncol, mass, pbuf_radius_name, pbuf, r_ end subroutine get_volcanic_radius_rad_props !============================================================================== - + subroutine get_volcanic_rad_props(ncol, mass, ext, scat, ascat, & tau, tau_w, tau_w_g, tau_w_f) @@ -659,23 +660,23 @@ subroutine get_volcanic_rad_props(ncol, mass, ext, scat, ascat, & real(r8), intent(out) :: tau (pcols, pver, nswbands) real(r8), intent(out) :: tau_w (pcols, pver, nswbands) real(r8), intent(out) :: tau_w_g(pcols, pver, nswbands) - real(r8), intent(out) :: tau_w_f(pcols, pver, nswbands) + real(r8), intent(out) :: tau_w_f(pcols, pver, nswbands) ! Local variables integer :: iswband real(r8) :: g !----------------------------------------------------------------------------- - + do iswband = 1, nswbands if (scat(iswband).gt.0._r8) then g = ascat(iswband)/scat(iswband) else g=0._r8 endif - tau (1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * ext(iswband) - tau_w (1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * scat(iswband) - tau_w_g(1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * ascat(iswband) - tau_w_f(1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * g * ascat(iswband) + tau (1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * ext(iswband) + tau_w (1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * scat(iswband) + tau_w_g(1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * ascat(iswband) + tau_w_f(1:ncol,1:pver,iswband) = mass(1:ncol,1:pver) * g * ascat(iswband) enddo end subroutine get_volcanic_rad_props @@ -695,7 +696,7 @@ subroutine aer_vis_diag_out(lchnk, ncol, nnite, idxnite, iaer, tau, diag_idx, tr integer, intent(in) :: diag_idx ! identifies whether the aerosol optics ! is for the climate calc or a diagnostic calc integer, intent(in) :: troplev(:) ! tropopause level - + ! Local variables integer :: i real(r8) :: tmp(pcols), tmp2(pcols) @@ -718,7 +719,7 @@ subroutine aer_vis_diag_out(lchnk, ncol, nnite, idxnite, iaer, tau, diag_idx, tr do i = 1, ncol tmp2(i) = sum(tau(i,:troplev(i))) end do - call outfld('AODvstrt', tmp2, pcols, lchnk) + call outfld('AODvstrt', tmp2, pcols, lchnk) end if end subroutine aer_vis_diag_out diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 new file mode 100644 index 0000000000..92c67f4949 --- /dev/null +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -0,0 +1,1259 @@ +module aerosol_optics_cam + use shr_kind_mod, only: r8 => shr_kind_r8 + use shr_kind_mod, only: cl => shr_kind_cl + use cam_logfile, only: iulog + use radconstants, only: nswbands, nlwbands, idx_sw_diag, idx_uv_diag, idx_nir_diag + use radconstants, only: ot_length, get_lw_spectral_boundaries + use physics_types,only: physics_state + use physics_buffer,only: physics_buffer_desc + use ppgrid, only: pcols, pver + use physconst, only: rga, rair + use cam_abortutils, only: endrun + use spmd_utils, only : masterproc + use wv_saturation, only: qsat + use rad_constituents, only: n_diag, rad_cnst_get_call_list + use cam_history, only: addfld, add_default, outfld, horiz_only, fieldname_len + use cam_history_support, only: fillvalue + + use tropopause, only : tropopause_find + + use aerosol_properties_mod, only: aerosol_properties + use modal_aerosol_properties_mod, only: modal_aerosol_properties + + use aerosol_state_mod, only: aerosol_state + use modal_aerosol_state_mod,only: modal_aerosol_state + + use aerosol_optics_mod, only: aerosol_optics + use refractive_aerosol_optics_mod, only: refractive_aerosol_optics + + implicit none + + private + + public :: aerosol_optics_cam_readnl + public :: aerosol_optics_cam_init + public :: aerosol_optics_cam_final + public :: aerosol_optics_cam_sw + public :: aerosol_optics_cam_lw + + type aero_props_t + class(aerosol_properties), pointer :: obj => null() + end type aero_props_t + type aero_state_t + class(aerosol_state), pointer :: obj => null() + end type aero_state_t + + type(aero_props_t), allocatable :: aero_props(:) + + ! refractive index for water read in read_water_refindex + complex(r8) :: crefwsw(nswbands) = -huge(1._r8) ! complex refractive index for water visible + complex(r8) :: crefwlw(nlwbands) = -huge(1._r8) ! complex refractive index for water infrared + character(len=cl) :: water_refindex_file = 'NONE' ! full pathname for water refractive index dataset + + logical :: carma_active = .false. + logical :: modal_active = .false. + integer :: num_aero_models = 0 + integer :: lw10um_indx = -1 + + character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) + + type out_name + character(len=fieldname_len), allocatable :: name(:) ! nbins + end type out_name + + type(out_name), allocatable :: burden_fields(:) ! num_aero_models + type(out_name), allocatable :: aodbin_fields(:) + type(out_name), allocatable :: aoddust_fields(:) + type(out_name), allocatable :: burdendn_fields(:) ! num_aero_models + type(out_name), allocatable :: aodbindn_fields(:) + type(out_name), allocatable :: aoddustdn_fields(:) + +contains + + !=============================================================================== + subroutine aerosol_optics_cam_readnl(nlfile) + use namelist_utils, only : find_group_name + use spmd_utils, only : mpicom, masterprocid, mpi_character, mpi_success + + character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input + + integer :: unitn, ierr + character(len=*), parameter :: subname = 'aerosol_optics_cam_readnl' + + ! =================== + ! Namelist definition + ! =================== + namelist /aerosol_optics_nl/ water_refindex_file + + ! ============= + ! Read namelist + ! ============= + if (masterproc) then + open( newunit=unitn, file=trim(nlfile), status='old' ) + call find_group_name(unitn, 'aerosol_optics_nl', status=ierr) + if (ierr == 0) then + read(unitn, aerosol_optics_nl, iostat=ierr) + if (ierr /= 0) then + call endrun(subname // ':: ERROR reading namelist') + end if + end if + close(unitn) + end if + + ! ============================ + ! Broadcast namelist variables + ! ============================ + call mpi_bcast(water_refindex_file, len(water_refindex_file), mpi_character, masterprocid, mpicom, ierr) + if (ierr/=mpi_success) then + call endrun(subname // ':: ERROR mpi_bcast '//trim(water_refindex_file)) + end if + + if (masterproc) then + write(iulog,*) subname,': water_refindex_file = ',trim(water_refindex_file) + end if + + end subroutine aerosol_optics_cam_readnl + + !=============================================================================== + subroutine aerosol_optics_cam_init + use rad_constituents, only: rad_cnst_get_info + use phys_control, only: phys_getopts + use ioFileMod, only: getfil + + character(len=*), parameter :: prefix = 'aerosol_optics_cam_sw: ' + integer :: nmodes=0, nbins=0, iaermod, istat, ilist, i + + logical :: call_list(0:n_diag) + real(r8) :: lwavlen_lo(nlwbands), lwavlen_hi(nlwbands) + integer :: m, n + + character(len=30) :: fldname + character(len=128) :: lngname + logical :: history_aero_optics ! output aerosol optics diagnostics + + character(len=256) :: locfile + + call phys_getopts(history_aero_optics_out = history_aero_optics) + + num_aero_models = 0 + nbins = 0 + + call rad_cnst_get_info(0, nmodes=nmodes) + modal_active = nmodes>0 + carma_active = nbins>0 + + if (modal_active) then + num_aero_models = num_aero_models+1 + end if + if (carma_active) then + num_aero_models = num_aero_models+1 + end if + + if (num_aero_models>0) then + allocate(aero_props(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aero_props') + end if + end if + + iaermod = 0 + + if (modal_active) then + iaermod = iaermod+1 + aero_props(iaermod)%obj => modal_aerosol_properties() +!!$ else if (carma_active) then +!!$ iaermod = iaermod+1 +!!$ aero_props(iaermod)%obj => carma_aerosol_properties() + end if + + if (water_refindex_file/='NONE') then + call getfil(water_refindex_file, locfile) + call read_water_refindex(locfile) + end if + + call get_lw_spectral_boundaries(lwavlen_lo, lwavlen_hi, units='um') + do i = 1,nlwbands + if ((lwavlen_lo(i)<=10._r8) .and. (lwavlen_hi(i)>=10._r8)) then + lw10um_indx = i + end if + end do + call rad_cnst_get_call_list(call_list) + + do ilist = 0, n_diag + if (call_list(ilist)) then + call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol extinction 550 nm, day only', flag_xyfill=.true.) + call addfld ('EXTINCTUV'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol extinction 350 nm, day only', flag_xyfill=.true.) + call addfld ('EXTINCTNIR'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol extinction 1020 nm, day only', flag_xyfill=.true.) + call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol absorption, day only', flag_xyfill=.true.) + call addfld ('AODVIS'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 550 nm', flag_xyfill=.true.) + call addfld ('AODVISst'//diag(ilist), horiz_only, 'A',' ', & + 'Stratospheric aerosol optical depth 550 nm, day only', flag_xyfill=.true.) + call addfld ('AODNIRst'//diag(ilist), horiz_only, 'A',' ', & + 'Stratospheric aerosol optical depth 1020 nm, day only',flag_xyfill=.true.) + call addfld ('AODUVst'//diag(ilist), horiz_only, 'A',' ', & + 'Stratospheric aerosol optical depth 350 nm, day only', flag_xyfill=.true.) + call addfld ('AODUV'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 350 nm, day only', flag_xyfill=.true.) + call addfld ('AODNIR'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 1020 nm, day only',flag_xyfill=.true.) + call addfld ('AODABS'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol absorption optical depth 550 nm, day only', flag_xyfill=.true.) + call addfld ('AODxASYM'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 550 * asymmetry factor, day only', flag_xyfill=.true.) + call addfld ('EXTxASYM'//diag(ilist), (/ 'lev' /), 'A',' ', & + 'extinction 550 nm * asymmetry factor, day only', flag_xyfill=.true.) + call addfld ('AODTOT'//diag(ilist), horiz_only, 'A','1',& + 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) + + call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol extinction 550 nm, day only') + call addfld ('EXTINCTUVdn'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol extinction 350 nm, day only') + call addfld ('EXTINCTNIRdn'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol extinction 1020 nm, day only') + call addfld ('ABSORBdn'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol absorption, day only') + call addfld ('AODVISdn'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 550 nm') + call addfld ('AODVISstdn'//diag(ilist), horiz_only, 'A',' ', & + 'Stratospheric aerosol optical depth 550 nm, day only') + call addfld ('AODNIRstdn'//diag(ilist), horiz_only, 'A',' ', & + 'Stratospheric aerosol optical depth 1020 nm, day only') + call addfld ('AODUVstdn'//diag(ilist), horiz_only, 'A',' ', & + 'Stratospheric aerosol optical depth 350 nm, day only') + call addfld ('AODUVdn'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 350 nm, day only') + call addfld ('AODNIRdn'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 1020 nm, day only',flag_xyfill=.true.) + call addfld ('AODABSdn'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol absorption optical depth 550 nm, day only') + call addfld ('AODxASYMdn'//diag(ilist), horiz_only, 'A',' ', & + 'Aerosol optical depth 550 * asymmetry factor, day only') + call addfld ('EXTxASYMdn'//diag(ilist), (/ 'lev' /), 'A',' ', & + 'extinction 550 nm * asymmetry factor, day only', flag_xyfill=.true.) + call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1',& + 'Aerosol optical depth summed over all sw wavelenghts') + + if (lw10um_indx>0) then + call addfld('AODABSLW'//diag(ilist), (/ 'lev' /), 'A','/m',& + 'Aerosol long-wave absorption optical depth at 10 microns') + end if + call addfld ('TOTABSLW'//diag(ilist), (/ 'lev' /), 'A',' ', & + 'LW Aero total abs') + + if (history_aero_optics) then + call add_default ('EXTINCT'//diag(ilist), 1, ' ') + call add_default ('ABSORB'//diag(ilist), 1, ' ') + call add_default ('AODVIS'//diag(ilist), 1, ' ') + call add_default ('AODVISst'//diag(ilist), 1, ' ') + call add_default ('AODABS'//diag(ilist), 1, ' ') + end if + + end if + end do + + + if (num_aero_models>0) then + + allocate(burden_fields(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: burden_fields') + end if + allocate(aodbin_fields(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aodbin_fields') + end if + allocate(aoddust_fields(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aoddust_fields') + end if + + allocate(burdendn_fields(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: burdendn_fields') + end if + allocate(aodbindn_fields(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aodbindn_fields') + end if + allocate(aoddustdn_fields(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aoddustdn_fields') + end if + + do n = 1,num_aero_models + + allocate(burden_fields(n)%name(aero_props(n)%obj%nbins()), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: burden_fields(n)%name') + end if + allocate(aodbin_fields(n)%name(aero_props(n)%obj%nbins()), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aodbin_fields(n)%name') + end if + allocate(aoddust_fields(n)%name(aero_props(n)%obj%nbins()), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aoddust_fields(n)%name') + end if + + allocate(burdendn_fields(n)%name(aero_props(n)%obj%nbins()), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: burdendn_fields(n)%name') + end if + allocate(aodbindn_fields(n)%name(aero_props(n)%obj%nbins()), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aodbindn_fields(n)%name') + end if + allocate(aoddustdn_fields(n)%name(aero_props(n)%obj%nbins()), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aoddustdn_fields(n)%name') + end if + + do m = 1, aero_props(n)%obj%nbins() + + write(fldname,'(a,i2.2)') 'BURDEN', m + burden_fields(n)%name(m) = fldname + write(lngname,'(a,i2.2)') 'Aerosol burden bin ', m + call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) + if (history_aero_optics) then + call add_default (fldname, 1, ' ') + end if + + write(fldname,'(a,i2.2)') 'AOD', m + aodbin_fields(n)%name(m) = fldname + write(lngname,'(a,i2)') 'Aerosol optical depth, day only, 550 nm bin ', m + call addfld (aodbin_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) + if (history_aero_optics) then + call add_default (fldname, 1, ' ') + end if + + write(fldname,'(a,i2.2)') 'AODDUST', m + aoddust_fields(n)%name(m) = fldname + write(lngname,'(a,i2,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' + call addfld (aoddust_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) + if (history_aero_optics) then + call add_default (fldname, 1, ' ') + end if + + write(fldname,'(a,i2.2)') 'BURDENdn', m + burdendn_fields(n)%name(m) = fldname + write(lngname,'(a,i2)') 'Aerosol burden, day night, bin ', m + call addfld (burdendn_fields(n)%name(m), horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) + if (history_aero_optics) then + call add_default (fldname, 1, ' ') + end if + + write(fldname,'(a,i2.2)') 'AODdn', m + aodbindn_fields(n)%name(m) = fldname + write(lngname,'(a,i2)') 'Aerosol optical depth 550 nm, day night, bin ', m + call addfld (aodbindn_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) + if (history_aero_optics) then + call add_default (fldname, 1, ' ') + end if + + write(fldname,'(a,i2.2)') 'AODdnDUST', m + aoddustdn_fields(n)%name(m) = fldname + write(lngname,'(a,i2,a)') 'Aerosol optical depth 550 nm, day night, bin ',m,' from dust' + call addfld (aoddustdn_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) + if (history_aero_optics) then + call add_default (fldname, 1, ' ') + end if + + end do + + end do + + end if + + call addfld ('AODDUST', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from dust, day only', & + flag_xyfill=.true.) + call addfld ('AODSO4', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SO4, day only', & + flag_xyfill=.true.) + call addfld ('AODPOM', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from POM, day only', & + flag_xyfill=.true.) + call addfld ('AODSOA', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SOA, day only', & + flag_xyfill=.true.) + call addfld ('AODBC', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from BC, day only', & + flag_xyfill=.true.) + call addfld ('AODSS', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from seasalt, day only', & + flag_xyfill=.true.) + call addfld ('AODABSBC', horiz_only, 'A',' ', 'Aerosol absorption optical depth 550 nm from BC, day only',& + flag_xyfill=.true.) + call addfld ('BURDENDUST', horiz_only, 'A','kg/m2', 'Dust aerosol burden, day only' , & + flag_xyfill=.true.) + call addfld ('BURDENSO4', horiz_only, 'A','kg/m2', 'Sulfate aerosol burden, day only' , & + flag_xyfill=.true.) + call addfld ('BURDENPOM', horiz_only, 'A','kg/m2', 'POM aerosol burden, day only' , & + flag_xyfill=.true.) + call addfld ('BURDENSOA', horiz_only, 'A','kg/m2', 'SOA aerosol burden, day only' , & + flag_xyfill=.true.) + call addfld ('BURDENBC', horiz_only, 'A','kg/m2', 'Black carbon aerosol burden, day only', & + flag_xyfill=.true.) + call addfld ('BURDENSEASALT', horiz_only, 'A','kg/m2', 'Seasalt aerosol burden, day only' , & + flag_xyfill=.true.) + call addfld ('SSAVIS', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day only', & + flag_xyfill=.true.) + + call addfld ('AODDUSTdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from dust, day night', & + flag_xyfill=.true.) + call addfld ('AODSO4dn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SO4, day night', & + flag_xyfill=.true.) + call addfld ('AODPOMdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from POM, day night', & + flag_xyfill=.true.) + call addfld ('AODSOAdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SOA, day night', & + flag_xyfill=.true.) + call addfld ('AODBCdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from BC, day night', & + flag_xyfill=.true.) + call addfld ('AODSSdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from seasalt, day night', & + flag_xyfill=.true.) + call addfld ('AODABSBCdn', horiz_only, 'A',' ', 'Aerosol absorption optical depth 550 nm from BC, day night',& + flag_xyfill=.true.) + call addfld ('BURDENDUSTdn', horiz_only, 'A','kg/m2', 'Dust aerosol burden, day night' , & + flag_xyfill=.true.) + call addfld ('BURDENSO4dn', horiz_only, 'A','kg/m2', 'Sulfate aerosol burden, day night' , & + flag_xyfill=.true.) + call addfld ('BURDENPOMdn', horiz_only, 'A','kg/m2', 'POM aerosol burden, day night' , & + flag_xyfill=.true.) + call addfld ('BURDENSOAdn', horiz_only, 'A','kg/m2', 'SOA aerosol burden, day night' , & + flag_xyfill=.true.) + call addfld ('BURDENBCdn', horiz_only, 'A','kg/m2', 'Black carbon aerosol burden, day night', & + flag_xyfill=.true.) + call addfld ('BURDENSEASALTdn', horiz_only, 'A','kg/m2', 'Seasalt aerosol burden, day night' , & + flag_xyfill=.true.) + call addfld ('SSAVISdn', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day night', & + flag_xyfill=.true.) + + end subroutine aerosol_optics_cam_init + + !=============================================================================== + subroutine aerosol_optics_cam_final + + integer :: iaermod + + do iaermod = 1,num_aero_models + deallocate(aero_props(iaermod)%obj) + nullify(aero_props(iaermod)%obj) + end do + + if (allocated(aero_props)) then + deallocate(aero_props) + endif + + end subroutine aerosol_optics_cam_final + + !=============================================================================== + subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, wa, ga, fa) + + ! calculates aerosol sw radiative properties + + integer, intent(in) :: list_idx ! index of the climate or a diagnostic list + type(physics_state), intent(in), target :: state ! state variables + + type(physics_buffer_desc), pointer :: pbuf(:) + integer, intent(in) :: nnite ! number of night columns + integer, intent(in) :: idxnite(nnite) ! local column indices of night columns + + real(r8), intent(inout) :: tauxar(pcols,0:pver,nswbands) ! layer extinction optical depth + real(r8), intent(inout) :: wa(pcols,0:pver,nswbands) ! layer single-scatter albedo + real(r8), intent(inout) :: ga(pcols,0:pver,nswbands) ! asymmetry factor + real(r8), intent(inout) :: fa(pcols,0:pver,nswbands) ! forward scattered fraction + + character(len=*), parameter :: prefix = 'aerosol_optics_cam_sw: ' + + integer :: ibin, nbins + integer :: iwav, ilev + integer :: icol, istat + integer :: lchnk, ncol + + type(aero_state_t), allocatable :: aero_state(:) + + class(aerosol_optics), pointer :: aero_optics + + real(r8) :: dopaer(pcols) + real(r8) :: mass(pcols,pver) + real(r8) :: air_density(pcols,pver) + + real(r8), allocatable :: pext(:) + real(r8), allocatable :: pabs(:) + real(r8), allocatable :: palb(:) + real(r8), allocatable :: pasm(:) + + real(r8) :: relh(pcols,pver) + real(r8) :: sate(pcols,pver) ! saturation vapor pressure + real(r8) :: satq(pcols,pver) ! saturation specific humidity + + character(len=ot_length) :: opticstype + integer :: iaermod + + real(r8) :: aodvis(pcols) ! extinction optical depth in vis + real(r8) :: aoduv(pcols) ! extinction optical depth in uv + real(r8) :: aodnir(pcols) ! extinction optical depth in nir + real(r8) :: absorb(pcols,pver) + real(r8) :: aodabs(pcols) ! absorption optical depth + + real(r8) :: aodabsbc(pcols) ! absorption optical depth of BC + + real(r8) :: aodtot(pcols) + + real(r8) :: extinct(pcols,pver) + real(r8) :: extinctnir(pcols,pver) + real(r8) :: extinctuv(pcols,pver) + + real(r8) :: asymvis(pcols) ! asymmetry factor * optical depth + real(r8) :: asymext(pcols,pver) ! asymmetry factor * extinction + + real(r8) :: wetvol(pcols,pver) + real(r8) :: watervol(pcols,pver) + + real(r8) :: vol(pcols) + real(r8) :: dustvol(pcols) + + real(r8) :: scatdust(pcols) + real(r8) :: absdust(pcols) + real(r8) :: dustaodbin(pcols) + + real(r8) :: scatbc(pcols) + real(r8) :: absbc(pcols) + + real(r8) :: scatpom(pcols) + real(r8) :: abspom(pcols) + + real(r8) :: scatsslt(pcols) + real(r8) :: abssslt(pcols) + + real(r8) :: scatsoa(pcols) + real(r8) :: abssoa(pcols) + + real(r8) :: scatsulf(pcols) + real(r8) :: abssulf(pcols) + + real(r8) :: burden(pcols) + real(r8) :: burdendust(pcols), burdenso4(pcols), burdenbc(pcols), & + burdenpom(pcols), burdensoa(pcols), burdenseasalt(pcols) + + real(r8) :: hygrodust(pcols), hygrosulf(pcols), hygrobc(pcols), & + hygropom(pcols), hygrosoa(pcols), hygrosslt(pcols) + + real(r8) :: aodbin(pcols) + + complex(r8), pointer :: specrefindex(:) ! species refractive index + + class(aerosol_state), pointer :: aerostate + class(aerosol_properties), pointer :: aeroprops + integer :: ispec + real(r8) :: specdens + character(len=32) :: spectype ! species type + real(r8), pointer :: specmmr(:,:) + real(r8) :: hygro_aer ! + + real(r8) :: scath2o, absh2o, sumscat, sumabs, sumhygro + + real(r8) :: aodc ! aod of component + + ! total species AOD + real(r8) :: dustaod(pcols), sulfaod(pcols), bcaod(pcols), & + pomaod(pcols), soaaod(pcols), ssltaod(pcols) + + real(r8) :: aodvisst(pcols) ! stratospheric extinction optical depth + real(r8) :: aoduvst(pcols) ! stratospheric extinction optical depth in uv + real(r8) :: aodnirst(pcols) ! stratospheric extinction optical depth in nir + real(r8) :: ssavis(pcols) + integer :: troplev(pcols) + + nullify(aero_optics) + + call tropopause_find(state, troplev) + + lchnk = state%lchnk + ncol = state%ncol + + mass(:ncol,:) = state%pdeldry(:ncol,:)*rga + air_density(:ncol,:) = state%pmid(:ncol,:)/(rair*state%t(:ncol,:)) + + aodvis = 0._r8 + aodnir = 0._r8 + aoduv = 0._r8 + aodabs = 0._r8 + absorb = 0._r8 + aodtot = 0._r8 + tauxar = 0._r8 + extinct = 0._r8 + extinctnir = 0._r8 + extinctuv = 0._r8 + asymvis = 0.0_r8 + asymext = 0.0_r8 + ssavis = 0.0_r8 + aodvisst = 0.0_r8 + aoduvst = 0.0_r8 + aodnirst = 0.0_r8 + + burdendust = 0.0_r8 + burdenso4 = 0.0_r8 + burdenbc = 0.0_r8 + burdenpom = 0.0_r8 + burdensoa = 0.0_r8 + burdenseasalt = 0.0_r8 + + aodabsbc = 0.0_r8 + dustaod = 0.0_r8 + sulfaod = 0.0_r8 + pomaod = 0.0_r8 + soaaod = 0.0_r8 + bcaod = 0.0_r8 + ssltaod = 0.0_r8 + + if (num_aero_models<1) return + + allocate(aero_state(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aero_state') + end if + + iaermod = 0 + if (modal_active) then + iaermod = iaermod+1 + aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) +!!$ else if (carma_active) then +!!$ iaermod = iaermod+1 +!!$ aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) + end if + + allocate(pext(ncol), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: pext') + end if + allocate(pabs(ncol), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: pabs') + end if + allocate(palb(ncol), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: palb') + end if + allocate(pasm(ncol), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: pasm') + end if + + aeromodel: do iaermod = 1,num_aero_models + + aeroprops => aero_props(iaermod)%obj + aerostate => aero_state(iaermod)%obj + + nbins=aeroprops%nbins(list_idx) + + binloop: do ibin = 1, nbins + + dustaodbin(:) = 0._r8 + burden(:) = 0._r8 + aodbin(:) = 0.0_r8 + + call aeroprops%optics_params(list_idx, ibin, opticstype=opticstype) + + select case (trim(opticstype)) + case('modal') ! refractive method + aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, & + ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) +!!$ case('hygroscopic_coreshell') +!!$ ! calculate relative humidity for table lookup into rh grid +!!$ call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) +!!$ relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) +!!$ relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) +!!$ aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, & +!!$ ibin, ncol, pver, relh(:ncol,:)) +!!$ case('hygroscopic_wtp') +!!$ aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, & +!!$ ibin, ncol, pver) + case default + call endrun(prefix//'optics method not recognized') + end select + + if (associated(aero_optics)) then + + wetvol(:ncol,:pver) = aerostate%wet_volume(aeroprops, list_idx, ibin, ncol, pver) + watervol(:ncol,:pver) = aerostate%water_volume(aeroprops, list_idx, ibin, ncol, pver) + + wavelength: do iwav = 1, nswbands + + vertical: do ilev = 1, pver + + call aero_optics%sw_props(ncol, ilev, iwav, pext, pabs, palb, pasm ) + + call init_diags + + column: do icol = 1,ncol + dopaer(icol) = pext(icol)*mass(icol,ilev) + tauxar(icol,ilev,iwav) = tauxar(icol,ilev,iwav) + dopaer(icol) + wa(icol,ilev,iwav) = wa(icol,ilev,iwav) + dopaer(icol)*palb(icol) + ga(icol,ilev,iwav) = ga(icol,ilev,iwav) + dopaer(icol)*palb(icol)*pasm(icol) + fa(icol,ilev,iwav) = fa(icol,ilev,iwav) + dopaer(icol)*palb(icol)*pasm(icol)*pasm(icol) + + call update_diags + + end do column + + end do vertical + end do wavelength + + else + call endrun(prefix//'aero_optics object pointer not associated') + end if + + deallocate(aero_optics) + nullify(aero_optics) + + call output_bin_diags + + end do binloop + end do aeromodel + + call output_tot_diags + + deallocate(pext) + deallocate(pabs) + deallocate(palb) + deallocate(pasm) + + do iaermod = 1,num_aero_models + deallocate(aero_state(iaermod)%obj) + nullify(aero_state(iaermod)%obj) + end do + + deallocate(aero_state) + + contains + + !=============================================================================== + subroutine init_diags + scatdust(:ncol) = 0._r8 + absdust(:ncol) = 0._r8 + hygrodust(:ncol) = 0._r8 + scatsulf(:ncol) = 0._r8 + abssulf(:ncol) = 0._r8 + hygrosulf(:ncol) = 0._r8 + scatbc(:ncol) = 0._r8 + absbc(:ncol) = 0._r8 + hygrobc(:ncol) = 0._r8 + scatpom(:ncol) = 0._r8 + abspom(:ncol) = 0._r8 + hygropom(:ncol) = 0._r8 + scatsoa(:ncol) = 0._r8 + abssoa(:ncol) = 0._r8 + hygrosoa(:ncol) = 0._r8 + scatsslt(:ncol) = 0._r8 + abssslt(:ncol) = 0._r8 + hygrosslt(:ncol) = 0._r8 + end subroutine init_diags + + !=============================================================================== + subroutine update_diags + + integer :: ispec + + if (iwav==idx_uv_diag) then + aoduv(icol) = aoduv(icol) + dopaer(icol) + extinctuv(icol,ilev) = extinctuv(icol,ilev) + dopaer(icol)*air_density(icol,ilev)/mass(icol,ilev) + if (ilev.le.troplev(icol)) then + aoduvst(icol) = aoduvst(icol) + dopaer(icol) + end if + + else if (iwav==idx_sw_diag) then ! vis + aodvis(icol) = aodvis(icol) + dopaer(icol) + aodabs(icol) = aodabs(icol) + pabs(icol)*mass(icol,ilev) + extinct(icol,ilev) = extinct(icol,ilev) + dopaer(icol)*air_density(icol,ilev)/mass(icol,ilev) + absorb(icol,ilev) = absorb(icol,ilev) + pabs(icol)*air_density(icol,ilev) + ssavis(icol) = ssavis(icol) + dopaer(icol)*palb(icol) + asymvis(icol) = asymvis(icol) + dopaer(icol)*pasm(icol) + asymext(icol,ilev) = asymext(icol,ilev) + dopaer(icol)*pasm(icol)*air_density(icol,ilev)/mass(icol,ilev) + + aodbin(icol) = aodbin(icol) + dopaer(icol) + + if (ilev.le.troplev(icol)) then + aodvisst(icol) = aodvisst(icol) + dopaer(icol) + end if + + ! loop over species ... + + do ispec = 1, aeroprops%nspecies(list_idx,ibin) + call aeroprops%get(ibin, ispec, list_ndx=list_idx, density=specdens, & + spectype=spectype, refindex_sw=specrefindex, hygro=hygro_aer) + call aerostate%get_ambient_mmr(list_idx, ispec, ibin, specmmr) + + burden(icol) = burden(icol) + specmmr(icol,ilev)*mass(icol,ilev) + + vol(icol) = specmmr(icol,ilev)/specdens + + select case ( trim(spectype) ) + case('dust') + dustvol(icol) = vol(icol) + burdendust(icol) = burdendust(icol) + specmmr(icol,ilev)*mass(icol,ilev) + scatdust(icol) = vol(icol) * specrefindex(iwav)%re + absdust(icol) =-vol(icol) * specrefindex(iwav)%im + hygrodust(icol)= vol(icol)*hygro_aer + case('black-c') + burdenbc(icol) = burdenbc(icol) + specmmr(icol,ilev)*mass(icol,ilev) + scatbc(icol) = vol(icol) * specrefindex(iwav)%re + absbc(icol) =-vol(icol) * specrefindex(iwav)%im + hygrobc(icol)= vol(icol)*hygro_aer + case('sulfate') + burdenso4(icol) = burdenso4(icol) + specmmr(icol,ilev)*mass(icol,ilev) + scatsulf(icol) = vol(icol) * specrefindex(iwav)%re + abssulf(icol) =-vol(icol) * specrefindex(iwav)%im + hygrosulf(icol)= vol(icol)*hygro_aer + case('p-organic') + burdenpom(icol) = burdenpom(icol) + specmmr(icol,ilev)*mass(icol,ilev) + scatpom(icol) = vol(icol) * specrefindex(iwav)%re + abspom(icol) =-vol(icol) * specrefindex(iwav)%im + hygropom(icol)= vol(icol)*hygro_aer + case('s-organic') + burdensoa(icol) = burdensoa(icol) + specmmr(icol,ilev)*mass(icol,ilev) + scatsoa(icol) = vol(icol) * specrefindex(iwav)%re + abssoa(icol) = -vol(icol) * specrefindex(iwav)%im + hygrosoa(icol)= vol(icol)*hygro_aer + case('seasalt') + burdenseasalt(icol) = burdenseasalt(icol) + specmmr(icol,ilev)*mass(icol,ilev) + scatsslt(icol) = vol(icol) * specrefindex(iwav)%re + abssslt(icol) = -vol(icol) * specrefindex(iwav)%im + hygrosslt(icol)= vol(icol)*hygro_aer + end select + end do + + if (wetvol(icol,ilev)>1.e-40_r8 .and. vol(icol)>0._r8) then + + dustaodbin(icol) = dustaodbin(icol) + dopaer(icol)*dustvol(icol)/wetvol(icol,ilev) + + ! partition optical depth into contributions from each constituent + ! assume contribution is proportional to refractive index X volume + + scath2o = watervol(icol,ilev)*crefwsw(iwav)%re + absh2o = -watervol(icol,ilev)*crefwsw(iwav)%im + sumscat = scatsulf(icol) + scatpom(icol) + scatsoa(icol) + scatbc(icol) + & + scatdust(icol) + scatsslt(icol) + scath2o + sumabs = abssulf(icol) + abspom(icol) + abssoa(icol) + absbc(icol) + & + absdust(icol) + abssslt(icol) + absh2o + sumhygro = hygrosulf(icol) + hygropom(icol) + hygrosoa(icol) + hygrobc(icol) + & + hygrodust(icol) + hygrosslt(icol) + + scatdust(icol) = (scatdust(icol) + scath2o*hygrodust(icol)/sumhygro)/sumscat + absdust(icol) = (absdust(icol) + absh2o*hygrodust(icol)/sumhygro)/sumabs + + scatsulf(icol) = (scatsulf(icol) + scath2o*hygrosulf(icol)/sumhygro)/sumscat + abssulf(icol) = (abssulf(icol) + absh2o*hygrosulf(icol)/sumhygro)/sumabs + + scatpom(icol) = (scatpom(icol) + scath2o*hygropom(icol)/sumhygro)/sumscat + abspom(icol) = (abspom(icol) + absh2o*hygropom(icol)/sumhygro)/sumabs + + scatsoa(icol) = (scatsoa(icol) + scath2o*hygrosoa(icol)/sumhygro)/sumscat + abssoa(icol) = (abssoa(icol) + absh2o*hygrosoa(icol)/sumhygro)/sumabs + + scatbc(icol)= (scatbc(icol) + scath2o*hygrobc(icol)/sumhygro)/sumscat + absbc(icol) = (absbc(icol) + absh2o*hygrobc(icol)/sumhygro)/sumabs + + scatsslt(icol) = (scatsslt(icol) + scath2o*hygrosslt(icol)/sumhygro)/sumscat + abssslt(icol) = (abssslt(icol) + absh2o*hygrosslt(icol)/sumhygro)/sumabs + + + aodabsbc(icol) = aodabsbc(icol) + absbc(icol)*dopaer(icol)*(1.0_r8-palb(icol)) + + + + aodc = (absdust(icol)*(1.0_r8 - palb(icol)) + palb(icol)*scatdust(icol))*dopaer(icol) + dustaod(icol) = dustaod(icol) + aodc + + aodc = (abssulf(icol)*(1.0_r8 - palb(icol)) + palb(icol)*scatsulf(icol))*dopaer(icol) + sulfaod(icol) = sulfaod(icol) + aodc + + aodc = (abspom(icol)*(1.0_r8 - palb(icol)) + palb(icol)*scatpom(icol))*dopaer(icol) + pomaod(icol) = pomaod(icol) + aodc + + aodc = (abssoa(icol)*(1.0_r8 - palb(icol)) + palb(icol)*scatsoa(icol))*dopaer(icol) + soaaod(icol) = soaaod(icol) + aodc + + aodc = (absbc(icol)*(1.0_r8 - palb(icol)) + palb(icol)*scatbc(icol))*dopaer(icol) + bcaod(icol) = bcaod(icol) + aodc + + aodc = (abssslt(icol)*(1.0_r8 - palb(icol)) + palb(icol)*scatsslt(icol))*dopaer(icol) + ssltaod(icol) = ssltaod(icol) + aodc + + end if + else if (iwav==idx_nir_diag) then + aodnir(icol) = aodnir(icol) + dopaer(icol) + extinctnir(icol,ilev) = extinctnir(icol,ilev) + dopaer(icol)*air_density(icol,ilev)/mass(icol,ilev) + + if (ilev.le.troplev(icol)) then + aodnirst(icol) = aodnirst(icol) + dopaer(icol) + end if + + end if + + aodtot(icol) = aodtot(icol) + dopaer(icol) + + end subroutine update_diags + + !=============================================================================== + subroutine output_bin_diags + + integer :: icol + + if (list_idx == 0) then + + call outfld(burdendn_fields(iaermod)%name(ibin), burden, pcols, lchnk) + call outfld(aoddustdn_fields(iaermod)%name(ibin), dustaodbin, pcols, lchnk) + call outfld(aodbindn_fields(iaermod)%name(ibin), aodbin, pcols, lchnk) + + do icol = 1, nnite + burden(idxnite(icol)) = fillvalue + aodbin(idxnite(icol)) = fillvalue + dustaodbin(idxnite(icol)) = fillvalue + end do + + call outfld(burden_fields(iaermod)%name(ibin), burden, pcols, lchnk) + call outfld(aoddust_fields(iaermod)%name(ibin), dustaodbin, pcols, lchnk) + call outfld(aodbin_fields(iaermod)%name(ibin), aodbin, pcols, lchnk) + + endif + + end subroutine output_bin_diags + + !=============================================================================== + subroutine output_tot_diags + + integer :: icol + + call outfld('AODUVdn'//diag(list_idx), aoduv, pcols, lchnk) + call outfld('AODVISdn'//diag(list_idx), aodvis, pcols, lchnk) + call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) + + call outfld('AODNIRdn'//diag(list_idx), aodnir, pcols, lchnk) + call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) + call outfld('AODTOTdn'//diag(list_idx), aodtot, pcols, lchnk) + call outfld('EXTINCTUVdn'//diag(list_idx), extinctuv, pcols, lchnk) + call outfld('EXTINCTNIRdn'//diag(list_idx), extinctnir, pcols, lchnk) + call outfld('EXTINCTdn'//diag(list_idx), extinct, pcols, lchnk) + call outfld('ABSORBdn'//diag(list_idx), absorb, pcols, lchnk) + call outfld('EXTxASYMdn'//diag(list_idx), asymext, pcols, lchnk) + call outfld('AODxASYMdn'//diag(list_idx), asymvis, pcols, lchnk) + + call outfld('AODVISstdn'//diag(list_idx), aodvisst,pcols, lchnk) + call outfld('AODUVstdn'//diag(list_idx), aoduvst, pcols, lchnk) + call outfld('AODNIRstdn'//diag(list_idx), aodnirst,pcols, lchnk) + + do icol = 1, nnite + aodvis(idxnite(icol)) = fillvalue + aodnir(idxnite(icol)) = fillvalue + aoduv(idxnite(icol)) = fillvalue + aodabs(idxnite(icol)) = fillvalue + aodtot(idxnite(icol)) = fillvalue + extinct(idxnite(icol),:) = fillvalue + extinctnir(idxnite(icol),:) = fillvalue + extinctuv(idxnite(icol),:) = fillvalue + absorb(idxnite(icol),:) = fillvalue + asymext(idxnite(icol),:) = fillvalue + asymvis(idxnite(icol)) = fillvalue + aodabs(idxnite(icol)) = fillvalue + aodvisst(idxnite(icol)) = fillvalue + aoduvst(idxnite(icol)) = fillvalue + aodnirst(idxnite(icol)) = fillvalue + end do + + call outfld('AODUV'//diag(list_idx), aoduv, pcols, lchnk) + call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) + call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) + call outfld('AODNIR'//diag(list_idx), aodnir, pcols, lchnk) + call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) + call outfld('AODTOT'//diag(list_idx), aodtot, pcols, lchnk) + call outfld('EXTINCTUV'//diag(list_idx), extinctuv, pcols, lchnk) + call outfld('EXTINCTNIR'//diag(list_idx), extinctnir, pcols, lchnk) + call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) + call outfld('ABSORB'//diag(list_idx), absorb, pcols, lchnk) + call outfld('EXTxASYM'//diag(list_idx), asymext, pcols, lchnk) + call outfld('AODxASYM'//diag(list_idx), asymvis, pcols, lchnk) + call outfld('AODVISst'//diag(list_idx), aodvisst,pcols, lchnk) + call outfld('AODUVst'//diag(list_idx), aoduvst, pcols, lchnk) + call outfld('AODNIRst'//diag(list_idx), aodnirst,pcols, lchnk) + + ! These diagnostics are output only for climate list + if (list_idx == 0) then + do icol = 1, ncol + if (aodvis(icol) > 1.e-10_r8) then + ssavis(icol) = ssavis(icol)/aodvis(icol) + else + ssavis(icol) = 0.925_r8 + endif + end do + call outfld('SSAVISdn', ssavis, pcols, lchnk) + + call outfld('BURDENDUSTdn', burdendust, pcols, lchnk) + call outfld('BURDENSO4dn' , burdenso4, pcols, lchnk) + call outfld('BURDENPOMdn' , burdenpom, pcols, lchnk) + call outfld('BURDENSOAdn' , burdensoa, pcols, lchnk) + call outfld('BURDENBCdn' , burdenbc, pcols, lchnk) + call outfld('BURDENSEASALTdn', burdenseasalt, pcols, lchnk) + + call outfld('AODABSBCdn', aodabsbc, pcols, lchnk) + + call outfld('AODDUSTdn', dustaod, pcols, lchnk) + call outfld('AODSO4dn', sulfaod, pcols, lchnk) + call outfld('AODPOMdn', pomaod, pcols, lchnk) + call outfld('AODSOAdn', soaaod, pcols, lchnk) + call outfld('AODBCdn', bcaod, pcols, lchnk) + call outfld('AODSSdn', ssltaod, pcols, lchnk) + + + do icol = 1, nnite + + ssavis(idxnite(icol)) = fillvalue + asymvis(idxnite(icol)) = fillvalue + + burdendust(idxnite(icol)) = fillvalue + burdenso4(idxnite(icol)) = fillvalue + burdenpom(idxnite(icol)) = fillvalue + burdensoa(idxnite(icol)) = fillvalue + burdenbc(idxnite(icol)) = fillvalue + burdenseasalt(idxnite(icol)) = fillvalue + aodabsbc(idxnite(icol)) = fillvalue + + dustaod(idxnite(icol)) = fillvalue + sulfaod(idxnite(icol)) = fillvalue + pomaod(idxnite(icol)) = fillvalue + soaaod(idxnite(icol)) = fillvalue + bcaod(idxnite(icol)) = fillvalue + ssltaod(idxnite(icol)) = fillvalue + + end do + + call outfld('AODxASYM', asymvis, pcols, lchnk) + + call outfld('BURDENDUST', burdendust, pcols, lchnk) + call outfld('BURDENSO4' , burdenso4, pcols, lchnk) + call outfld('BURDENPOM' , burdenpom, pcols, lchnk) + call outfld('BURDENSOA' , burdensoa, pcols, lchnk) + call outfld('BURDENBC' , burdenbc, pcols, lchnk) + call outfld('BURDENSEASALT', burdenseasalt, pcols, lchnk) + + call outfld('AODABSBC', aodabsbc, pcols, lchnk) + + call outfld('AODDUST', dustaod, pcols, lchnk) + call outfld('AODSO4', sulfaod, pcols, lchnk) + call outfld('AODPOM', pomaod, pcols, lchnk) + call outfld('AODSOA', soaaod, pcols, lchnk) + call outfld('AODBC', bcaod, pcols, lchnk) + call outfld('AODSS', ssltaod, pcols, lchnk) + + end if + + end subroutine output_tot_diags + + end subroutine aerosol_optics_cam_sw + + !=============================================================================== + subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) + + ! calculates aerosol lw radiative properties + + integer, intent(in) :: list_idx ! index of the climate or a diagnostic list + type(physics_state), intent(in), target :: state ! state variables + + type(physics_buffer_desc), pointer :: pbuf(:) + + real(r8), intent(inout) :: tauxar(pcols,pver,nlwbands) ! layer absorption optical depth + + + real(r8) :: dopaer(pcols) + real(r8) :: mass(pcols,pver) + + character(len=*), parameter :: prefix = 'aerosol_optics_cam_lw: ' + + integer :: ibin, nbins + integer :: iwav, ilev + integer :: ncol, icol, istat + + type(aero_state_t), allocatable :: aero_state(:) + + class(aerosol_optics), pointer :: aero_optics + class(aerosol_state), pointer :: aerostate + class(aerosol_properties), pointer :: aeroprops + + real(r8), allocatable :: pabs(:) + + real(r8) :: relh(pcols,pver) + real(r8) :: sate(pcols,pver) ! saturation vapor pressure + real(r8) :: satq(pcols,pver) ! saturation specific humidity + + character(len=32) :: opticstype + integer :: iaermod + + real(r8) :: lwabs(pcols,pver) + lwabs = 0._r8 + tauxar = 0._r8 + + nullify(aero_optics) + + allocate(aero_state(num_aero_models), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: aero_state') + end if + + iaermod = 0 + if (modal_active) then + iaermod = iaermod+1 + aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) +!!$ else if (carma_active) then +!!$ iaermod = iaermod+1 +!!$ aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) + end if + + ncol = state%ncol + + mass(:ncol,:) = state%pdeldry(:ncol,:)*rga + + allocate(pabs(ncol), stat=istat) + if (istat/=0) then + call endrun(prefix//'array allocation error: pabs') + end if + + aeromodel: do iaermod = 1,num_aero_models + + aeroprops => aero_props(iaermod)%obj + aerostate => aero_state(iaermod)%obj + + nbins=aero_props(iaermod)%obj%nbins(list_idx) + + binloop: do ibin = 1, nbins + + call aeroprops%optics_params(list_idx, ibin, opticstype=opticstype) + + select case (trim(opticstype)) + case('modal') ! refractive method + aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) +!!$ case('hygroscopic_coreshell') +!!$ ! calculate relative humidity for table lookup into rh grid +!!$ call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) +!!$ relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) +!!$ relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) +!!$ aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, ibin, ncol, pver, relh(:ncol,:)) +!!$ case('hygroscopic_wtp') +!!$ aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, ibin, ncol, pver) + case default + call endrun(prefix//'optics method not recognized') + end select + + if (associated(aero_optics)) then + + wavelength: do iwav = 1, nlwbands + + vertical: do ilev = 1, pver + call aero_optics%lw_props(ncol, ilev, iwav, pabs ) + + column: do icol = 1, ncol + dopaer(icol) = pabs(icol)*mass(icol,ilev) + tauxar(icol,ilev,iwav) = tauxar(icol,ilev,iwav) + dopaer(icol) + lwabs(icol,ilev) = lwabs(icol,ilev) + pabs(icol) + end do column + + end do vertical + + end do wavelength + + else + call endrun(prefix//'aero_optics object pointer not associated') + end if + + deallocate(aero_optics) + nullify(aero_optics) + + end do binloop + end do aeromodel + + call outfld('TOTABSLW'//diag(list_idx), lwabs(:,:), pcols, state%lchnk) + + if (lw10um_indx>0) then + call outfld('AODABSLW'//diag(list_idx), tauxar(:,:,lw10um_indx), pcols, state%lchnk) + end if + + deallocate(pabs) + + do iaermod = 1,num_aero_models + deallocate(aero_state(iaermod)%obj) + nullify(aero_state(iaermod)%obj) + end do + + deallocate(aero_state) + + end subroutine aerosol_optics_cam_lw + + !=============================================================================== + ! Private routines + !=============================================================================== + + subroutine read_water_refindex(infilename) + use cam_pio_utils, only: cam_pio_openfile + use pio, only: file_desc_t, var_desc_t, pio_inq_dimlen, pio_inq_dimid, pio_inq_varid, & + pio_get_var, PIO_NOWRITE, pio_closefile + + + ! read water refractive index file and set module data + + character*(*), intent(in) :: infilename ! modal optics filename + + ! Local variables + + integer :: i, ierr + type(file_desc_t) :: ncid ! pio file handle + integer :: did ! dimension ids + integer :: dimlen ! dimension lengths + type(var_desc_t) :: vid ! variable ids + real(r8) :: refrwsw(nswbands), refiwsw(nswbands) ! real, imaginary ref index for water visible + real(r8) :: refrwlw(nlwbands), refiwlw(nlwbands) ! real, imaginary ref index for water infrared + !---------------------------------------------------------------------------- + + ! open file + call cam_pio_openfile(ncid, infilename, PIO_NOWRITE) + + ! inquire dimensions. Check that file values match parameter values. + + ierr = pio_inq_dimid(ncid, 'lw_band', did) + ierr = pio_inq_dimlen(ncid, did, dimlen) + if (dimlen .ne. nlwbands) then + write(iulog,*) 'lw_band len=', dimlen, ' from ', infilename, ' ne nlwbands=', nlwbands + call endrun('read_modal_optics: bad lw_band value') + endif + + ierr = pio_inq_dimid(ncid, 'sw_band', did) + ierr = pio_inq_dimlen(ncid, did, dimlen) + if (dimlen .ne. nswbands) then + write(iulog,*) 'sw_band len=', dimlen, ' from ', infilename, ' ne nswbands=', nswbands + call endrun('read_modal_optics: bad sw_band value') + endif + + ! read variables + ierr = pio_inq_varid(ncid, 'refindex_real_water_sw', vid) + ierr = pio_get_var(ncid, vid, refrwsw) + + ierr = pio_inq_varid(ncid, 'refindex_im_water_sw', vid) + ierr = pio_get_var(ncid, vid, refiwsw) + + ierr = pio_inq_varid(ncid, 'refindex_real_water_lw', vid) + ierr = pio_get_var(ncid, vid, refrwlw) + + ierr = pio_inq_varid(ncid, 'refindex_im_water_lw', vid) + ierr = pio_get_var(ncid, vid, refiwlw) + + ! set complex representation of refractive indices as module data + do i = 1, nswbands + crefwsw(i) = cmplx(refrwsw(i), abs(refiwsw(i)),kind=r8) + end do + do i = 1, nlwbands + crefwlw(i) = cmplx(refrwlw(i), abs(refiwlw(i)),kind=r8) + end do + + call pio_closefile(ncid) + + end subroutine read_water_refindex + +end module aerosol_optics_cam diff --git a/src/physics/cam/modal_aer_opt.F90 b/src/physics/cam/modal_aer_opt.F90 deleted file mode 100644 index 5c95c17840..0000000000 --- a/src/physics/cam/modal_aer_opt.F90 +++ /dev/null @@ -1,1621 +0,0 @@ -module modal_aer_opt - -! parameterizes aerosol coefficients using chebychev polynomial -! parameterize aerosol radiative properties in terms of -! surface mode wet radius and wet refractive index - -! Ghan and Zaveri, JGR 2007. - -! uses Wiscombe's (1979) mie scattering code - - -use shr_kind_mod, only: r8 => shr_kind_r8, shr_kind_cl -use ppgrid, only: pcols, pver, pverp -use constituents, only: pcnst -use spmd_utils, only: masterproc -use ref_pres, only: top_lev => clim_modal_aero_top_lev -use physconst, only: rhoh2o, rga, rair -use radconstants, only: nswbands, nlwbands, idx_sw_diag, idx_uv_diag, idx_nir_diag -use rad_constituents, only: n_diag, rad_cnst_get_call_list, rad_cnst_get_info, rad_cnst_get_aer_mmr, & - rad_cnst_get_aer_props, rad_cnst_get_mode_props -use physics_types, only: physics_state - -use physics_buffer, only : pbuf_get_index,physics_buffer_desc, pbuf_get_field -use pio, only: file_desc_t, var_desc_t, pio_inq_dimlen, pio_inq_dimid, pio_inq_varid, & - pio_get_var, pio_nowrite, pio_closefile -use cam_pio_utils, only: cam_pio_openfile -use cam_history, only: addfld, add_default, outfld, horiz_only -use cam_history_support, only: fillvalue -use cam_logfile, only: iulog -use perf_mod, only: t_startf, t_stopf -use cam_abortutils, only: endrun - -use modal_aero_wateruptake, only: modal_aero_wateruptake_dr -use modal_aero_calcsize, only: modal_aero_calcsize_diag - -implicit none -private -save - -public :: modal_aer_opt_readnl, modal_aer_opt_init, modal_aero_sw, modal_aero_lw - - -character(len=*), parameter :: unset_str = 'UNSET' - -! Namelist variables: -character(shr_kind_cl) :: modal_optics_file = unset_str ! full pathname for modal optics dataset -character(shr_kind_cl) :: water_refindex_file = unset_str ! full pathname for water refractive index dataset - -! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties -! in terms of refractive index and wet radius -integer, parameter :: ncoef=5, prefr=7, prefi=10 - -real(r8) :: xrmin, xrmax - -! refractive index for water read in read_water_refindex -complex(r8) :: crefwsw(nswbands) ! complex refractive index for water visible -complex(r8) :: crefwlw(nlwbands) ! complex refractive index for water infrared - -! physics buffer indices -integer :: dgnumwet_idx = -1 -integer :: qaerwat_idx = -1 - -character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', & - '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) - -!=============================================================================== -CONTAINS -!=============================================================================== - -subroutine modal_aer_opt_readnl(nlfile) - - use namelist_utils, only: find_group_name - use units, only: getunit, freeunit - use mpishorthand - - character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input - - ! Local variables - integer :: unitn, ierr - character(len=*), parameter :: subname = 'modal_aer_opt_readnl' - - namelist /modal_aer_opt_nl/ water_refindex_file - !----------------------------------------------------------------------------- - - if (masterproc) then - unitn = getunit() - open( unitn, file=trim(nlfile), status='old' ) - call find_group_name(unitn, 'modal_aer_opt_nl', status=ierr) - if (ierr == 0) then - read(unitn, modal_aer_opt_nl, iostat=ierr) - if (ierr /= 0) then - call endrun(subname // ':: ERROR reading namelist') - end if - end if - close(unitn) - call freeunit(unitn) - end if - -#ifdef SPMD - call mpibcast(water_refindex_file, len(water_refindex_file), mpichar, 0, mpicom) -#endif - - -end subroutine modal_aer_opt_readnl - -!=============================================================================== - -subroutine modal_aer_opt_init() - - use ioFileMod, only: getfil - use phys_control, only: phys_getopts - - ! Local variables - - integer :: i, m - real(r8) :: rmmin, rmmax ! min, max aerosol surface mode radius treated (m) - character(len=256) :: locfile - - logical :: history_amwg ! output the variables used by the AMWG diag package - logical :: history_aero_optics ! output aerosol optics diagnostics - logical :: history_dust ! output dust diagnostics - - logical :: call_list(0:n_diag) - integer :: ilist, nmodes, m_ncoef, m_prefr, m_prefi - integer :: errcode - - character(len=*), parameter :: routine='modal_aer_opt_init' - character(len=10) :: fldname - character(len=128) :: lngname - - !---------------------------------------------------------------------------- - - rmmin = 0.01e-6_r8 - rmmax = 25.e-6_r8 - xrmin = log(rmmin) - xrmax = log(rmmax) - - ! Check that dimension sizes in the coefficient arrays used to - ! parameterize aerosol radiative properties are consistent between this - ! module and the mode physprop files. - call rad_cnst_get_call_list(call_list) - do ilist = 0, n_diag - if (call_list(ilist)) then - call rad_cnst_get_info(ilist, nmodes=nmodes) - do m = 1, nmodes - call rad_cnst_get_mode_props(ilist, m, ncoef=m_ncoef, prefr=m_prefr, prefi=m_prefi) - if (m_ncoef /= ncoef .or. m_prefr /= prefr .or. m_prefi /= prefi) then - write(iulog,*) routine//': ERROR - file and module values do not match:' - write(iulog,*) ' ncoef:', ncoef, m_ncoef - write(iulog,*) ' prefr:', prefr, m_prefr - write(iulog,*) ' prefi:', prefi, m_prefi - call endrun(routine//': ERROR - file and module values do not match') - end if - end do - end if - end do - - ! Initialize physics buffer indices for dgnumwet and qaerwat. Note the implicit assumption - ! that the loops over modes in the optics calculations will use the values for dgnumwet and qaerwat - ! that are set in the aerosol_wet_intr code. - dgnumwet_idx = pbuf_get_index('DGNUMWET',errcode) - if (errcode < 0) then - call endrun(routine//' ERROR: cannot find physics buffer field DGNUMWET') - end if - qaerwat_idx = pbuf_get_index('QAERWAT',errcode) - if (errcode < 0) then - call endrun(routine//' ERROR: cannot find physics buffer field QAERWAT') - end if - - call getfil(water_refindex_file, locfile) - call read_water_refindex(locfile) - if (masterproc) write(iulog,*) "modal_aer_opt_init: read water refractive index file:", trim(locfile) - - call phys_getopts(history_amwg_out = history_amwg, & - history_aero_optics_out = history_aero_optics, & - history_dust_out = history_dust ) - - ! Add diagnostic fields to history output. - - call addfld ('EXTINCT', (/ 'lev' /), 'A','/m','Aerosol extinction 550 nm, day only', & - flag_xyfill=.true.) - call addfld ('EXTINCTUV', (/ 'lev' /), 'A','/m','Aerosol extinction 350 nm, day only', & - flag_xyfill=.true.) - call addfld ('EXTINCTNIR', (/ 'lev' /), 'A','/m','Aerosol extinction 1020 nm, day only', & - flag_xyfill=.true.) - call addfld ('ABSORB', (/ 'lev' /), 'A','/m','Aerosol absorption, day only', & - flag_xyfill=.true.) - call addfld ('AODVIS', horiz_only, 'A',' ','Aerosol optical depth 550 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODVISst', horiz_only, 'A',' ','Stratospheric aerosol optical depth 550 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODUV', horiz_only, 'A',' ','Aerosol optical depth 350 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODUVst', horiz_only, 'A',' ','Stratospheric aerosol optical depth 350 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODNIR', horiz_only, 'A',' ','Aerosol optical depth 1020 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODNIRst', horiz_only, 'A',' ','Stratospheric aerosol optical depth 1020 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODABS', horiz_only, 'A',' ','Aerosol absorption optical depth 550 nm, day only', & - flag_xyfill=.true.) - call addfld ('AODxASYM', horiz_only, 'A',' ','Aerosol optical depth 550 * asymmetry factor, day only',& - flag_xyfill=.true.) - call addfld ('EXTxASYM', (/ 'lev' /), 'A',' ','extinction 550 nm * asymmetry factor, day only', & - flag_xyfill=.true.) - - call addfld ('EXTINCTdn', (/ 'lev' /), 'A','/m','Aerosol extinction 550 nm, day night', & - flag_xyfill=.true.) - call addfld ('EXTINCTUVdn', (/ 'lev' /), 'A','/m','Aerosol extinction 350 nm, day night', & - flag_xyfill=.true.) - call addfld ('EXTINCTNIRdn', (/ 'lev' /), 'A','/m','Aerosol extinction 1020 nm, day night', & - flag_xyfill=.true.) - call addfld ('ABSORBdn', (/ 'lev' /), 'A','/m','Aerosol absorption, day night', & - flag_xyfill=.true.) - call addfld ('AODVISdn', horiz_only, 'A',' ','Aerosol optical depth 550 nm, day night', & - flag_xyfill=.true.) - call addfld ('AODVISstdn', horiz_only, 'A',' ','Stratospheric aerosol optical depth 550 nm, day night',& - flag_xyfill=.true.) - call addfld ('AODUVdn', horiz_only, 'A',' ','Aerosol optical depth 350 nm, day night', & - flag_xyfill=.true.) - call addfld ('AODUVstdn', horiz_only, 'A',' ','Stratospheric aerosol optical depth 350 nm, day night',& - flag_xyfill=.true.) - call addfld ('AODNIRdn', horiz_only, 'A',' ','Aerosol optical depth 1020 nm, day night', & - flag_xyfill=.true.) - call addfld ('AODNIRstdn', horiz_only, 'A',' ','Stratospheric aerosol optical depth 1020 nm, day night',& - flag_xyfill=.true.) - call addfld ('AODABSdn', horiz_only, 'A',' ','Aerosol absorption optical depth 550 nm, day night', & - flag_xyfill=.true.) - call addfld ('AODxASYMdn', horiz_only, 'A',' ','Aerosol optical depth 550 * asymmetry factor, day night',& - flag_xyfill=.true.) - call addfld ('EXTxASYMdn', (/ 'lev' /), 'A',' ','extinction 550 * asymmetry factor, day night', & - flag_xyfill=.true.) - - call rad_cnst_get_info(0, nmodes=nmodes) - - do m = 1, nmodes - - write(fldname,'(a,i1)') 'BURDEN', m - write(lngname,'(a,i1)') 'Aerosol burden, day only, mode ', m - call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then - call add_default (fldname, 1, ' ') - endif - - write(fldname,'(a,i1)') 'AODMODE', m - write(lngname,'(a,i1)') 'Aerosol optical depth, day only, 550 nm mode ', m - call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then - call add_default (fldname, 1, ' ') - endif - - write(fldname,'(a,i1)') 'AODDUST', m - write(lngname,'(a,i1,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' - call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then - call add_default (fldname, 1, ' ') - endif - - write(fldname,'(a,i1)') 'BURDENdn', m - write(lngname,'(a,i1)') 'Aerosol burden, day night, mode ', m - call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then - call add_default (fldname, 1, ' ') - endif - - write(fldname,'(a,i1)') 'AODdnMODE', m - write(lngname,'(a,i1)') 'Aerosol optical depth 550 nm, day night, mode ', m - call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then - call add_default (fldname, 1, ' ') - endif - - write(fldname,'(a,i1)') 'AODdnDUST', m - write(lngname,'(a,i1,a)') 'Aerosol optical depth 550 nm, day night, mode ',m,' from dust' - call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then - call add_default (fldname, 1, ' ') - endif - - enddo - - call addfld ('AODDUST', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from dust, day only', & - flag_xyfill=.true.) - call addfld ('AODSO4', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SO4, day only', & - flag_xyfill=.true.) - call addfld ('AODPOM', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from POM, day only', & - flag_xyfill=.true.) - call addfld ('AODSOA', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SOA, day only', & - flag_xyfill=.true.) - call addfld ('AODBC', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from BC, day only', & - flag_xyfill=.true.) - call addfld ('AODSS', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from seasalt, day only', & - flag_xyfill=.true.) - call addfld ('AODABSBC', horiz_only, 'A',' ', 'Aerosol absorption optical depth 550 nm from BC, day only',& - flag_xyfill=.true.) - call addfld ('BURDENDUST', horiz_only, 'A','kg/m2', 'Dust aerosol burden, day only' , & - flag_xyfill=.true.) - call addfld ('BURDENSO4', horiz_only, 'A','kg/m2', 'Sulfate aerosol burden, day only' , & - flag_xyfill=.true.) - call addfld ('BURDENPOM', horiz_only, 'A','kg/m2', 'POM aerosol burden, day only' , & - flag_xyfill=.true.) - call addfld ('BURDENSOA', horiz_only, 'A','kg/m2', 'SOA aerosol burden, day only' , & - flag_xyfill=.true.) - call addfld ('BURDENBC', horiz_only, 'A','kg/m2', 'Black carbon aerosol burden, day only', & - flag_xyfill=.true.) - call addfld ('BURDENSEASALT', horiz_only, 'A','kg/m2', 'Seasalt aerosol burden, day only' , & - flag_xyfill=.true.) - call addfld ('SSAVIS', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day only', & - flag_xyfill=.true.) - - call addfld ('AODDUSTdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from dust, day night', & - flag_xyfill=.true.) - call addfld ('AODSO4dn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SO4, day night', & - flag_xyfill=.true.) - call addfld ('AODPOMdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from POM, day night', & - flag_xyfill=.true.) - call addfld ('AODSOAdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from SOA, day night', & - flag_xyfill=.true.) - call addfld ('AODBCdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from BC, day night', & - flag_xyfill=.true.) - call addfld ('AODSSdn', horiz_only, 'A',' ', 'Aerosol optical depth 550 nm from seasalt, day night', & - flag_xyfill=.true.) - call addfld ('AODABSBCdn', horiz_only, 'A',' ', 'Aerosol absorption optical depth 550 nm from BC, day night',& - flag_xyfill=.true.) - call addfld ('BURDENDUSTdn', horiz_only, 'A','kg/m2', 'Dust aerosol burden, day night' , & - flag_xyfill=.true.) - call addfld ('BURDENSO4dn', horiz_only, 'A','kg/m2', 'Sulfate aerosol burden, day night' , & - flag_xyfill=.true.) - call addfld ('BURDENPOMdn', horiz_only, 'A','kg/m2', 'POM aerosol burden, day night' , & - flag_xyfill=.true.) - call addfld ('BURDENSOAdn', horiz_only, 'A','kg/m2', 'SOA aerosol burden, day night' , & - flag_xyfill=.true.) - call addfld ('BURDENBCdn', horiz_only, 'A','kg/m2', 'Black carbon aerosol burden, day night', & - flag_xyfill=.true.) - call addfld ('BURDENSEASALTdn', horiz_only, 'A','kg/m2', 'Seasalt aerosol burden, day night' , & - flag_xyfill=.true.) - call addfld ('SSAVISdn', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day night', & - flag_xyfill=.true.) - - - if (history_amwg) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') - call add_default ('AODDUST' , 1, ' ') - call add_default ('AODVIS' , 1, ' ') - end if - - if (history_dust) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST2' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') - end if - - if (history_aero_optics) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') - call add_default ('ABSORB' , 1, ' ') - call add_default ('AODMODE1' , 1, ' ') - call add_default ('AODMODE2' , 1, ' ') - call add_default ('AODMODE3' , 1, ' ') - call add_default ('AODVIS' , 1, ' ') - call add_default ('AODUV' , 1, ' ') - call add_default ('AODNIR' , 1, ' ') - call add_default ('AODABS' , 1, ' ') - call add_default ('AODABSBC' , 1, ' ') - call add_default ('AODDUST' , 1, ' ') - call add_default ('AODSO4' , 1, ' ') - call add_default ('AODPOM' , 1, ' ') - call add_default ('AODSOA' , 1, ' ') - call add_default ('AODBC' , 1, ' ') - call add_default ('AODSS' , 1, ' ') - call add_default ('BURDEN1' , 1, ' ') - call add_default ('BURDEN2' , 1, ' ') - call add_default ('BURDEN3' , 1, ' ') - call add_default ('BURDENDUST' , 1, ' ') - call add_default ('BURDENSO4' , 1, ' ') - call add_default ('BURDENPOM' , 1, ' ') - call add_default ('BURDENSOA' , 1, ' ') - call add_default ('BURDENBC' , 1, ' ') - call add_default ('BURDENSEASALT', 1, ' ') - call add_default ('SSAVIS' , 1, ' ') - call add_default ('EXTINCT' , 1, ' ') - call add_default ('AODxASYM' , 1, ' ') - call add_default ('EXTxASYM' , 1, ' ') - - call add_default ('AODdnDUST1' , 1, ' ') - call add_default ('AODdnDUST3' , 1, ' ') - call add_default ('ABSORBdn' , 1, ' ') - call add_default ('AODdnMODE1' , 1, ' ') - call add_default ('AODdnMODE2' , 1, ' ') - call add_default ('AODdnMODE3' , 1, ' ') - call add_default ('AODVISdn' , 1, ' ') - call add_default ('AODUVdn' , 1, ' ') - call add_default ('AODNIRdn' , 1, ' ') - call add_default ('AODABSdn' , 1, ' ') - call add_default ('AODABSBCdn' , 1, ' ') - call add_default ('AODDUSTdn' , 1, ' ') - call add_default ('AODSO4dn' , 1, ' ') - call add_default ('AODPOMdn' , 1, ' ') - call add_default ('AODSOAdn' , 1, ' ') - call add_default ('AODBCdn' , 1, ' ') - call add_default ('AODSSdn' , 1, ' ') - call add_default ('BURDENdn1' , 1, ' ') - call add_default ('BURDENdn2' , 1, ' ') - call add_default ('BURDENdn3' , 1, ' ') - call add_default ('BURDENDUSTdn' , 1, ' ') - call add_default ('BURDENSO4dn' , 1, ' ') - call add_default ('BURDENPOMdn' , 1, ' ') - call add_default ('BURDENSOAdn' , 1, ' ') - call add_default ('BURDENBCdn' , 1, ' ') - call add_default ('BURDENSEASALTdn', 1, ' ') - call add_default ('SSAVISdn' , 1, ' ') - call add_default ('EXTINCTdn' , 1, ' ') - call add_default ('AODxASYMdn' , 1, ' ') - call add_default ('EXTxASYMdn' , 1, ' ') - end if - - do ilist = 1, n_diag - if (call_list(ilist)) then - - call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','/m', & - 'Aerosol extinction', flag_xyfill=.true.) - call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','/m', & - 'Aerosol absorption', flag_xyfill=.true.) - call addfld ('AODVIS'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol optical depth 550 nm', flag_xyfill=.true.) - call addfld ('AODVISst'//diag(ilist), horiz_only, 'A',' ', & - 'Stratospheric aerosol optical depth 550 nm', flag_xyfill=.true.) - call addfld ('AODABS'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol absorption optical depth 550 nm', flag_xyfill=.true.) - - call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& - 'Aerosol extinction 550 nm, day night', flag_xyfill=.true.) - call addfld ('ABSORBdn'//diag(ilist), (/ 'lev' /), 'A','/m',& - 'Aerosol absorption, day night', flag_xyfill=.true.) - call addfld ('AODVISdn'//diag(ilist), horiz_only, 'A',' ',& - 'Aerosol optical depth 550 nm, day night', flag_xyfill=.true.) - call addfld ('AODVISstdn'//diag(ilist), horiz_only, 'A',' ',& - 'Stratospheric aerosol optical depth 550 nm, day night', flag_xyfill=.true.) - call addfld ('AODABSdn'//diag(ilist), horiz_only, 'A',' ',& - 'Aerosol absorption optical depth 550 nm, day night', flag_xyfill=.true.) - call addfld ('EXTxASYMdn'//diag(ilist), (/ 'lev' /), 'A',' ',& - 'extinction 550 * asymmetry factor, day night', flag_xyfill=.true.) - call addfld ('EXTxASYM'//diag(ilist), (/ 'lev' /), 'A',' ',& - 'extinction 550 nm * asymmetry factor, day only', flag_xyfill=.true.) - - if (history_aero_optics) then - call add_default ('EXTINCT'//diag(ilist), 1, ' ') - call add_default ('ABSORB'//diag(ilist), 1, ' ') - call add_default ('AODVIS'//diag(ilist), 1, ' ') - call add_default ('AODVISst'//diag(ilist), 1, ' ') - call add_default ('AODABS'//diag(ilist), 1, ' ') - end if - - end if - end do - -end subroutine modal_aer_opt_init - -!=============================================================================== - -subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & - tauxar, wa, ga, fa) - - ! calculates aerosol sw radiative properties - - use tropopause, only : tropopause_findChemTrop - - integer, intent(in) :: list_idx ! index of the climate or a diagnostic list - type(physics_state), intent(in), target :: state ! state variables - - type(physics_buffer_desc), pointer :: pbuf(:) - integer, intent(in) :: nnite ! number of night columns - integer, intent(in) :: idxnite(nnite) ! local column indices of night columns - - real(r8), intent(out) :: tauxar(pcols,0:pver,nswbands) ! layer extinction optical depth - real(r8), intent(out) :: wa(pcols,0:pver,nswbands) ! layer single-scatter albedo - real(r8), intent(out) :: ga(pcols,0:pver,nswbands) ! asymmetry factor - real(r8), intent(out) :: fa(pcols,0:pver,nswbands) ! forward scattered fraction - - ! Local variables - integer :: i, ifld, isw, k, l, m, nc, ns - integer :: lchnk ! chunk id - integer :: ncol ! number of active columns in the chunk - integer :: nmodes - integer :: nspec - integer :: troplevchem(pcols) ! Chemical tropopause level - integer :: istat - - real(r8) :: mass(pcols,pver) ! layer mass - real(r8) :: air_density(pcols,pver) ! (kg/m3) - - real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio - real(r8) :: specdens ! species density (kg/m3) - complex(r8), pointer :: specrefindex(:) ! species refractive index - character*32 :: spectype ! species type - real(r8) :: hygro_aer ! - - real(r8), pointer :: dgnumwet(:,:) ! number mode wet diameter - real(r8), pointer :: qaerwat(:,:) ! aerosol water (g/g) - - real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes - real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes - real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes - real(r8), pointer :: wetdens_m(:,:,:) ! - real(r8), pointer :: hygro_m(:,:,:) ! - real(r8), pointer :: dryvol_m(:,:,:) ! - real(r8), pointer :: dryrad_m(:,:,:) ! - real(r8), pointer :: drymass_m(:,:,:) ! - real(r8), pointer :: so4dryvol_m(:,:,:) ! - real(r8), pointer :: naer_m(:,:,:) ! - - real(r8) :: sigma_logr_aer ! geometric standard deviation of number distribution - real(r8) :: radsurf(pcols,pver) ! aerosol surface mode radius - real(r8) :: logradsurf(pcols,pver) ! log(aerosol surface mode radius) - real(r8) :: cheb(ncoef,pcols,pver) - - real(r8) :: refr(pcols) ! real part of refractive index - real(r8) :: refi(pcols) ! imaginary part of refractive index - complex(r8) :: crefin(pcols) ! complex refractive index - real(r8), pointer :: refrtabsw(:,:) ! table of real refractive indices for aerosols - real(r8), pointer :: refitabsw(:,:) ! table of imag refractive indices for aerosols - real(r8), pointer :: extpsw(:,:,:,:) ! specific extinction - real(r8), pointer :: abspsw(:,:,:,:) ! specific absorption - real(r8), pointer :: asmpsw(:,:,:,:) ! asymmetry factor - - real(r8) :: vol(pcols) ! volume concentration of aerosol specie (m3/kg) - real(r8) :: dryvol(pcols) ! volume concentration of aerosol mode (m3/kg) - real(r8) :: watervol(pcols) ! volume concentration of water in each mode (m3/kg) - real(r8) :: wetvol(pcols) ! volume concentration of wet mode (m3/kg) - - integer :: itab(pcols), jtab(pcols) - real(r8) :: ttab(pcols), utab(pcols) - real(r8) :: cext(pcols,ncoef), cabs(pcols,ncoef), casm(pcols,ncoef) - real(r8) :: pext(pcols) ! parameterized specific extinction (m2/kg) - real(r8) :: specpext(pcols) ! specific extinction (m2/kg) - real(r8) :: dopaer(pcols) ! aerosol optical depth in layer - real(r8) :: pabs(pcols) ! parameterized specific absorption (m2/kg) - real(r8) :: pasm(pcols) ! parameterized asymmetry factor - real(r8) :: palb(pcols) ! parameterized single scattering albedo - - ! Diagnostics - real(r8) :: extinct(pcols,pver) - real(r8) :: extinctnir(pcols,pver) - real(r8) :: extinctuv(pcols,pver) - real(r8) :: absorb(pcols,pver) - real(r8) :: aodvis(pcols) ! extinction optical depth - real(r8) :: aodvisst(pcols) ! stratospheric extinction optical depth - real(r8) :: aodabs(pcols) ! absorption optical depth - real(r8) :: asymvis(pcols) ! asymmetry factor * optical depth - real(r8) :: asymext(pcols,pver) ! asymmetry factor * extinction - - real(r8) :: aodabsbc(pcols) ! absorption optical depth of BC - - real(r8) :: ssavis(pcols) - real(r8) :: dustvol(pcols) ! volume concentration of dust in aerosol mode (m3/kg) - - real(r8) :: burden(pcols) - real(r8) :: burdendust(pcols), burdenso4(pcols), burdenbc(pcols), & - burdenpom(pcols), burdensoa(pcols), burdenseasalt(pcols) - - real(r8) :: aodmode(pcols) - real(r8) :: dustaodmode(pcols) ! dust aod in aerosol mode - - real(r8) :: specrefr, specrefi - real(r8) :: scatdust(pcols), scatso4(pcols), scatbc(pcols), & - scatpom(pcols), scatsoa(pcols), scatseasalt(pcols) - real(r8) :: absdust(pcols), absso4(pcols), absbc(pcols), & - abspom(pcols), abssoa(pcols), absseasalt(pcols) - real(r8) :: hygrodust(pcols), hygroso4(pcols), hygrobc(pcols), & - hygropom(pcols), hygrosoa(pcols), hygroseasalt(pcols) - - real(r8) :: scath2o, absh2o, sumscat, sumabs, sumhygro - real(r8) :: aodc ! aod of component - - ! total species AOD - real(r8) :: dustaod(pcols), so4aod(pcols), bcaod(pcols), & - pomaod(pcols), soaaod(pcols), seasaltaod(pcols) - - - - - logical :: savaervis ! true if visible wavelength (0.55 micron) - logical :: savaernir ! true if near ir wavelength (~0.88 micron) - logical :: savaeruv ! true if uv wavelength (~0.35 micron) - - real(r8) :: aoduv(pcols) ! extinction optical depth in uv - real(r8) :: aoduvst(pcols) ! stratospheric extinction optical depth in uv - real(r8) :: aodnir(pcols) ! extinction optical depth in nir - real(r8) :: aodnirst(pcols) ! stratospheric extinction optical depth in nir - - - character(len=32) :: outname - - ! debug output - integer, parameter :: nerrmax_dopaer=1000 - integer :: nerr_dopaer = 0 - real(r8) :: volf ! volume fraction of insoluble aerosol - character(len=*), parameter :: subname = 'modal_aero_sw' - !---------------------------------------------------------------------------- - - lchnk = state%lchnk - ncol = state%ncol - - ! initialize output variables - tauxar(:ncol,:,:) = 0._r8 - wa(:ncol,:,:) = 0._r8 - ga(:ncol,:,:) = 0._r8 - fa(:ncol,:,:) = 0._r8 - - ! zero'th layer does not contain aerosol - tauxar(1:ncol,0,:) = 0._r8 - wa(1:ncol,0,:) = 0.925_r8 - ga(1:ncol,0,:) = 0.850_r8 - fa(1:ncol,0,:) = 0.7225_r8 - - mass(:ncol,:) = state%pdeldry(:ncol,:)*rga - air_density(:ncol,:) = state%pmid(:ncol,:)/(rair*state%t(:ncol,:)) - - ! diagnostics for visible band summed over modes - extinct(1:ncol,:) = 0.0_r8 - absorb(1:ncol,:) = 0.0_r8 - aodvis(1:ncol) = 0.0_r8 - aodvisst(1:ncol) = 0.0_r8 - aodabs(1:ncol) = 0.0_r8 - burdendust(:ncol) = 0.0_r8 - burdenso4(:ncol) = 0.0_r8 - burdenpom(:ncol) = 0.0_r8 - burdensoa(:ncol) = 0.0_r8 - burdenbc(:ncol) = 0.0_r8 - burdenseasalt(:ncol) = 0.0_r8 - ssavis(1:ncol) = 0.0_r8 - asymvis(1:ncol) = 0.0_r8 - asymext(1:ncol,:) = 0.0_r8 - - aodabsbc(:ncol) = 0.0_r8 - dustaod(:ncol) = 0.0_r8 - so4aod(:ncol) = 0.0_r8 - pomaod(:ncol) = 0.0_r8 - soaaod(:ncol) = 0.0_r8 - bcaod(:ncol) = 0.0_r8 - seasaltaod(:ncol) = 0.0_r8 - - ! diags for other bands - extinctuv(1:ncol,:) = 0.0_r8 - extinctnir(1:ncol,:) = 0.0_r8 - aoduv(:ncol) = 0.0_r8 - aodnir(:ncol) = 0.0_r8 - aoduvst(:ncol) = 0.0_r8 - aodnirst(:ncol) = 0.0_r8 - call tropopause_findChemTrop(state, troplevchem) - - ! loop over all aerosol modes - call rad_cnst_get_info(list_idx, nmodes=nmodes) - - if (list_idx == 0) then - ! water uptake and wet radius for the climate list has already been calculated - call pbuf_get_field(pbuf, dgnumwet_idx, dgnumwet_m) - call pbuf_get_field(pbuf, qaerwat_idx, qaerwat_m) - else - ! If doing a diagnostic calculation then need to calculate the wet radius - ! and water uptake for the diagnostic modes - allocate(dgnumdry_m(pcols,pver,nmodes), dgnumwet_m(pcols,pver,nmodes), & - qaerwat_m(pcols,pver,nmodes), wetdens_m(pcols,pver,nmodes), & - hygro_m(pcols,pver,nmodes), dryvol_m(pcols,pver,nmodes), & - dryrad_m(pcols,pver,nmodes), drymass_m(pcols,pver,nmodes), & - so4dryvol_m(pcols,pver,nmodes), naer_m(pcols,pver,nmodes), stat=istat) - if (istat > 0) then - call endrun('modal_aero_sw: allocation FAILURE: arrays for diagnostic calcs') - end if - call modal_aero_calcsize_diag(state, pbuf, list_idx, dgnumdry_m, hygro_m, & - dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) - call modal_aero_wateruptake_dr(state, pbuf, list_idx, dgnumdry_m, dgnumwet_m, & - qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & - drymass_m, so4dryvol_m, naer_m) - endif - - do m = 1, nmodes - - ! diagnostics for visible band for each mode - burden(:ncol) = 0._r8 - aodmode(1:ncol) = 0.0_r8 - dustaodmode(1:ncol) = 0.0_r8 - - dgnumwet => dgnumwet_m(:,:,m) - qaerwat => qaerwat_m(:,:,m) - - ! get mode properties - call rad_cnst_get_mode_props(list_idx, m, sigmag=sigma_logr_aer, refrtabsw=refrtabsw , & - refitabsw=refitabsw, extpsw=extpsw, abspsw=abspsw, asmpsw=asmpsw) - - ! get mode info - call rad_cnst_get_info(list_idx, m, nspec=nspec) - - ! calc size parameter for all columns - call modal_size_parameters(ncol, sigma_logr_aer, dgnumwet, radsurf, logradsurf, cheb) - - do isw = 1, nswbands - savaervis = (isw .eq. idx_sw_diag) - savaeruv = (isw .eq. idx_uv_diag) - savaernir = (isw .eq. idx_nir_diag) - - do k = top_lev, pver - - ! form bulk refractive index - crefin(:ncol) = (0._r8, 0._r8) - dryvol(:ncol) = 0._r8 - dustvol(:ncol) = 0._r8 - - scatdust(:ncol) = 0._r8 - absdust(:ncol) = 0._r8 - hygrodust(:ncol) = 0._r8 - scatso4(:ncol) = 0._r8 - absso4(:ncol) = 0._r8 - hygroso4(:ncol) = 0._r8 - scatbc(:ncol) = 0._r8 - absbc(:ncol) = 0._r8 - hygrobc(:ncol) = 0._r8 - scatpom(:ncol) = 0._r8 - abspom(:ncol) = 0._r8 - hygropom(:ncol) = 0._r8 - scatsoa(:ncol) = 0._r8 - abssoa(:ncol) = 0._r8 - hygrosoa(:ncol) = 0._r8 - scatseasalt(:ncol) = 0._r8 - absseasalt(:ncol) = 0._r8 - hygroseasalt(:ncol) = 0._r8 - - ! aerosol species loop - do l = 1, nspec - call rad_cnst_get_aer_mmr(list_idx, m, l, 'a', state, pbuf, specmmr) - call rad_cnst_get_aer_props(list_idx, m, l, density_aer=specdens, & - refindex_aer_sw=specrefindex, spectype=spectype, & - hygro_aer=hygro_aer) - - do i = 1, ncol - vol(i) = specmmr(i,k)/specdens - dryvol(i) = dryvol(i) + vol(i) - crefin(i) = crefin(i) + vol(i)*specrefindex(isw) - end do - - ! compute some diagnostics for visible band only - if (savaervis) then - - specrefr = real(specrefindex(isw)) - specrefi = aimag(specrefindex(isw)) - - do i = 1, ncol - burden(i) = burden(i) + specmmr(i,k)*mass(i,k) - end do - - if (trim(spectype) == 'dust') then - do i = 1, ncol - burdendust(i) = burdendust(i) + specmmr(i,k)*mass(i,k) - dustvol(i) = vol(i) - scatdust(i) = vol(i)*specrefr - absdust(i) = -vol(i)*specrefi - hygrodust(i) = vol(i)*hygro_aer - end do - end if - - if (trim(spectype) == 'sulfate') then - do i = 1, ncol - burdenso4(i) = burdenso4(i) + specmmr(i,k)*mass(i,k) - scatso4(i) = vol(i)*specrefr - absso4(i) = -vol(i)*specrefi - hygroso4(i) = vol(i)*hygro_aer - end do - end if - if (trim(spectype) == 'black-c') then - do i = 1, ncol - burdenbc(i) = burdenbc(i) + specmmr(i,k)*mass(i,k) - scatbc(i) = vol(i)*specrefr - absbc(i) = -vol(i)*specrefi - hygrobc(i) = vol(i)*hygro_aer - end do - end if - if (trim(spectype) == 'p-organic') then - do i = 1, ncol - burdenpom(i) = burdenpom(i) + specmmr(i,k)*mass(i,k) - scatpom(i) = vol(i)*specrefr - abspom(i) = -vol(i)*specrefi - hygropom(i) = vol(i)*hygro_aer - end do - end if - if (trim(spectype) == 's-organic') then - do i = 1, ncol - burdensoa(i) = burdensoa(i) + specmmr(i,k)*mass(i,k) - scatsoa(i) = vol(i)*specrefr - abssoa(i) = -vol(i)*specrefi - hygrosoa(i) = vol(i)*hygro_aer - end do - end if - if (trim(spectype) == 'seasalt') then - do i = 1, ncol - burdenseasalt(i) = burdenseasalt(i) + specmmr(i,k)*mass(i,k) - scatseasalt(i) = vol(i)*specrefr - absseasalt(i) = -vol(i)*specrefi - hygroseasalt(i) = vol(i)*hygro_aer - end do - end if - - end if - end do ! species loop - - do i = 1, ncol - watervol(i) = qaerwat(i,k)/rhoh2o - wetvol(i) = watervol(i) + dryvol(i) - if (watervol(i) < 0._r8) then - if (abs(watervol(i)) .gt. 1.e-1_r8*wetvol(i)) then - write(iulog,'(a,2e10.2,a)') 'watervol,wetvol=', & - watervol(i), wetvol(i), ' in '//subname - end if - watervol(i) = 0._r8 - wetvol(i) = dryvol(i) - end if - - ! volume mixing - crefin(i) = crefin(i) + watervol(i)*crefwsw(isw) - crefin(i) = crefin(i)/max(wetvol(i),1.e-60_r8) - refr(i) = real(crefin(i)) - refi(i) = abs(aimag(crefin(i))) - end do - - ! call t_startf('binterp') - - ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(extpsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, cext) - call binterp(abspsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, cabs) - call binterp(asmpsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, casm) - - ! call t_stopf('binterp') - - ! parameterized optical properties - do i=1,ncol - - if (logradsurf(i,k) .le. xrmax) then - pext(i) = 0.5_r8*cext(i,1) - do nc = 2, ncoef - pext(i) = pext(i) + cheb(nc,i,k)*cext(i,nc) - enddo - pext(i) = exp(pext(i)) - else - pext(i) = 1.5_r8/(radsurf(i,k)*rhoh2o) ! geometric optics - endif - - ! convert from m2/kg water to m2/kg aerosol - specpext(i) = pext(i) - pext(i) = pext(i)*wetvol(i)*rhoh2o - pabs(i) = 0.5_r8*cabs(i,1) - pasm(i) = 0.5_r8*casm(i,1) - do nc = 2, ncoef - pabs(i) = pabs(i) + cheb(nc,i,k)*cabs(i,nc) - pasm(i) = pasm(i) + cheb(nc,i,k)*casm(i,nc) - enddo - pabs(i) = pabs(i)*wetvol(i)*rhoh2o - pabs(i) = max(0._r8,pabs(i)) - pabs(i) = min(pext(i),pabs(i)) - - palb(i) = 1._r8-pabs(i)/max(pext(i),1.e-40_r8) - palb(i) = 1._r8-pabs(i)/max(pext(i),1.e-40_r8) - - dopaer(i) = pext(i)*mass(i,k) - end do - - if (savaeruv) then - do i = 1, ncol - extinctuv(i,k) = extinctuv(i,k) + dopaer(i)*air_density(i,k)/mass(i,k) - aoduv(i) = aoduv(i) + dopaer(i) - if (k.le.troplevchem(i)) then - aoduvst(i) = aoduvst(i) + dopaer(i) - end if - end do - end if - - if (savaernir) then - do i = 1, ncol - extinctnir(i,k) = extinctnir(i,k) + dopaer(i)*air_density(i,k)/mass(i,k) - aodnir(i) = aodnir(i) + dopaer(i) - if (k.le.troplevchem(i)) then - aodnirst(i) = aodnirst(i) + dopaer(i) - end if - end do - endif - - ! Save aerosol optical depth at longest visible wavelength - ! sum over layers - if (savaervis) then - ! aerosol extinction (/m) - do i = 1, ncol - extinct(i,k) = extinct(i,k) + dopaer(i)*air_density(i,k)/mass(i,k) - absorb(i,k) = absorb(i,k) + pabs(i)*air_density(i,k) - aodvis(i) = aodvis(i) + dopaer(i) - aodabs(i) = aodabs(i) + pabs(i)*mass(i,k) - aodmode(i) = aodmode(i) + dopaer(i) - ssavis(i) = ssavis(i) + dopaer(i)*palb(i) - asymvis(i) = asymvis(i) + dopaer(i)*pasm(i) - asymext(i,k) = asymext(i,k) + dopaer(i)*pasm(i)*air_density(i,k)/mass(i,k) - if (k.le.troplevchem(i)) then - aodvisst(i) = aodvisst(i) + dopaer(i) - end if - - if (wetvol(i) > 1.e-40_r8) then - - dustaodmode(i) = dustaodmode(i) + dopaer(i)*dustvol(i)/wetvol(i) - - ! partition optical depth into contributions from each constituent - ! assume contribution is proportional to refractive index X volume - - scath2o = watervol(i)*real(crefwsw(isw)) - absh2o = -watervol(i)*aimag(crefwsw(isw)) - sumscat = scatso4(i) + scatpom(i) + scatsoa(i) + scatbc(i) + & - scatdust(i) + scatseasalt(i) + scath2o - sumabs = absso4(i) + abspom(i) + abssoa(i) + absbc(i) + & - absdust(i) + absseasalt(i) + absh2o - sumhygro = hygroso4(i) + hygropom(i) + hygrosoa(i) + hygrobc(i) + & - hygrodust(i) + hygroseasalt(i) - - scatdust(i) = (scatdust(i) + scath2o*hygrodust(i)/sumhygro)/sumscat - absdust(i) = (absdust(i) + absh2o*hygrodust(i)/sumhygro)/sumabs - - scatso4(i) = (scatso4(i) + scath2o*hygroso4(i)/sumhygro)/sumscat - absso4(i) = (absso4(i) + absh2o*hygroso4(i)/sumhygro)/sumabs - - scatpom(i) = (scatpom(i) + scath2o*hygropom(i)/sumhygro)/sumscat - abspom(i) = (abspom(i) + absh2o*hygropom(i)/sumhygro)/sumabs - - scatsoa(i) = (scatsoa(i) + scath2o*hygrosoa(i)/sumhygro)/sumscat - abssoa(i) = (abssoa(i) + absh2o*hygrosoa(i)/sumhygro)/sumabs - - scatbc(i) = (scatbc(i) + scath2o*hygrobc(i)/sumhygro)/sumscat - absbc(i) = (absbc(i) + absh2o*hygrobc(i)/sumhygro)/sumabs - - scatseasalt(i) = (scatseasalt(i) + scath2o*hygroseasalt(i)/sumhygro)/sumscat - absseasalt(i) = (absseasalt(i) + absh2o*hygroseasalt(i)/sumhygro)/sumabs - - aodabsbc(i) = aodabsbc(i) + absbc(i)*dopaer(i)*(1.0_r8-palb(i)) - - aodc = (absdust(i)*(1.0_r8 - palb(i)) + palb(i)*scatdust(i))*dopaer(i) - dustaod(i) = dustaod(i) + aodc - - aodc = (absso4(i)*(1.0_r8 - palb(i)) + palb(i)*scatso4(i))*dopaer(i) - so4aod(i) = so4aod(i) + aodc - - aodc = (abspom(i)*(1.0_r8 - palb(i)) + palb(i)*scatpom(i))*dopaer(i) - pomaod(i) = pomaod(i) + aodc - - aodc = (abssoa(i)*(1.0_r8 - palb(i)) + palb(i)*scatsoa(i))*dopaer(i) - soaaod(i) = soaaod(i) + aodc - - aodc = (absbc(i)*(1.0_r8 - palb(i)) + palb(i)*scatbc(i))*dopaer(i) - bcaod(i) = bcaod(i) + aodc - - aodc = (absseasalt(i)*(1.0_r8 - palb(i)) + palb(i)*scatseasalt(i))*dopaer(i) - seasaltaod(i) = seasaltaod(i) + aodc - - endif - - end do - endif - - do i = 1, ncol - - if ((dopaer(i) <= -1.e-10_r8) .or. (dopaer(i) >= 30._r8)) then - - if (dopaer(i) <= -1.e-10_r8) then - write(iulog,*) "ERROR: Negative aerosol optical depth & - &in this layer." - else - write(iulog,*) "WARNING: Aerosol optical depth is & - &unreasonably high in this layer." - end if - - write(iulog,*) 'dopaer(', i, ',', k, ',', m, ',', lchnk, ')=', dopaer(i) - ! write(iulog,*) 'itab,jtab,ttab,utab=',itab(i),jtab(i),ttab(i),utab(i) - write(iulog,*) 'k=', k, ' pext=', pext(i), ' specext=', specpext(i) - write(iulog,*) 'wetvol=', wetvol(i), ' dryvol=', dryvol(i), ' watervol=', watervol(i) - ! write(iulog,*) 'cext=',(cext(i,l),l=1,ncoef) - ! write(iulog,*) 'crefin=',crefin(i) - write(iulog,*) 'nspec=', nspec - ! write(iulog,*) 'cheb=', (cheb(nc,m,i,k),nc=2,ncoef) - do l = 1, nspec - call rad_cnst_get_aer_mmr(list_idx, m, l, 'a', state, pbuf, specmmr) - call rad_cnst_get_aer_props(list_idx, m, l, density_aer=specdens, & - refindex_aer_sw=specrefindex) - volf = specmmr(i,k)/specdens - write(iulog,*) 'l=', l, 'vol(l)=', volf - write(iulog,*) 'isw=', isw, 'specrefindex(isw)=', specrefindex(isw) - write(iulog,*) 'specdens=', specdens - end do - - nerr_dopaer = nerr_dopaer + 1 -! if (nerr_dopaer >= nerrmax_dopaer) then - if (dopaer(i) < -1.e-10_r8) then - write(iulog,*) '*** halting in '//subname//' after nerr_dopaer =', nerr_dopaer - call endrun('exit from '//subname) - end if - - end if - end do - - do i=1,ncol - tauxar(i,k,isw) = tauxar(i,k,isw) + dopaer(i) - wa(i,k,isw) = wa(i,k,isw) + dopaer(i)*palb(i) - ga(i,k,isw) = ga(i,k,isw) + dopaer(i)*palb(i)*pasm(i) - fa(i,k,isw) = fa(i,k,isw) + dopaer(i)*palb(i)*pasm(i)*pasm(i) - end do - - end do ! pver - - end do ! sw bands - - ! mode diagnostics - ! The diagnostics are currently only output for the climate list. Code mods will - ! be necessary to provide output for the rad_diag lists. - if (list_idx == 0) then - - write(outname,'(a,i1)') 'BURDENdn', m - call outfld(trim(outname), burden, pcols, lchnk) - - write(outname,'(a,i1)') 'AODdnMODE', m - call outfld(trim(outname), aodmode, pcols, lchnk) - - write(outname,'(a,i1)') 'AODdnDUST', m - call outfld(trim(outname), dustaodmode, pcols, lchnk) - - do i = 1, nnite - burden(idxnite(i)) = fillvalue - aodmode(idxnite(i)) = fillvalue - dustaodmode(idxnite(i)) = fillvalue - end do - - write(outname,'(a,i1)') 'BURDEN', m - call outfld(trim(outname), burden, pcols, lchnk) - - write(outname,'(a,i1)') 'AODMODE', m - call outfld(trim(outname), aodmode, pcols, lchnk) - - write(outname,'(a,i1)') 'AODDUST', m - call outfld(trim(outname), dustaodmode, pcols, lchnk) - - end if - - end do ! nmodes - - if (list_idx > 0) then - deallocate(dgnumdry_m) - deallocate(dgnumwet_m) - deallocate(qaerwat_m) - deallocate(wetdens_m) - deallocate(hygro_m) - deallocate(dryvol_m) - deallocate(dryrad_m) - deallocate(drymass_m) - deallocate(so4dryvol_m) - deallocate(naer_m) - end if - - ! Output visible band diagnostics for quantities summed over the modes - ! These fields are put out for diagnostic lists as well as the climate list. - - call outfld('EXTINCTdn'//diag(list_idx), extinct, pcols, lchnk) - call outfld('ABSORBdn'//diag(list_idx), absorb, pcols, lchnk) - call outfld('AODVISdn'//diag(list_idx), aodvis, pcols, lchnk) - call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) - call outfld('AODVISstdn'//diag(list_idx), aodvisst,pcols, lchnk) - call outfld('EXTxASYMdn'//diag(list_idx), asymext, pcols, lchnk) - - do i = 1, nnite - extinct(idxnite(i),:) = fillvalue - absorb(idxnite(i),:) = fillvalue - aodvis(idxnite(i)) = fillvalue - aodabs(idxnite(i)) = fillvalue - aodvisst(idxnite(i)) = fillvalue - asymext(idxnite(i),:) = fillvalue - end do - - call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) - call outfld('ABSORB'//diag(list_idx), absorb, pcols, lchnk) - call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) - call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) - call outfld('AODVISst'//diag(list_idx), aodvisst,pcols, lchnk) - call outfld('EXTxASYM'//diag(list_idx), asymext, pcols, lchnk) - - ! These diagnostics are output only for climate list - if (list_idx == 0) then - do i = 1, ncol - if (aodvis(i) > 1.e-10_r8) then - ssavis(i) = ssavis(i)/aodvis(i) - else - ssavis(i) = 0.925_r8 - endif - end do - - call outfld('SSAVISdn', ssavis, pcols, lchnk) - call outfld('AODxASYMdn', asymvis, pcols, lchnk) - - call outfld('EXTINCTUVdn', extinctuv, pcols, lchnk) - call outfld('EXTINCTNIRdn', extinctnir, pcols, lchnk) - call outfld('AODUVdn', aoduv, pcols, lchnk) - call outfld('AODNIRdn', aodnir, pcols, lchnk) - call outfld('AODUVstdn', aoduvst, pcols, lchnk) - call outfld('AODNIRstdn', aodnirst, pcols, lchnk) - - call outfld('BURDENDUSTdn', burdendust, pcols, lchnk) - call outfld('BURDENSO4dn' , burdenso4, pcols, lchnk) - call outfld('BURDENPOMdn' , burdenpom, pcols, lchnk) - call outfld('BURDENSOAdn' , burdensoa, pcols, lchnk) - call outfld('BURDENBCdn' , burdenbc, pcols, lchnk) - call outfld('BURDENSEASALTdn', burdenseasalt, pcols, lchnk) - - call outfld('AODABSBCdn', aodabsbc, pcols, lchnk) - - call outfld('AODDUSTdn', dustaod, pcols, lchnk) - call outfld('AODSO4dn', so4aod, pcols, lchnk) - call outfld('AODPOMdn', pomaod, pcols, lchnk) - call outfld('AODSOAdn', soaaod, pcols, lchnk) - call outfld('AODBCdn', bcaod, pcols, lchnk) - call outfld('AODSSdn', seasaltaod, pcols, lchnk) - - - do i = 1, nnite - ssavis(idxnite(i)) = fillvalue - asymvis(idxnite(i)) = fillvalue - - aoduv(idxnite(i)) = fillvalue - aodnir(idxnite(i)) = fillvalue - aoduvst(idxnite(i)) = fillvalue - aodnirst(idxnite(i)) = fillvalue - extinctuv(idxnite(i),:) = fillvalue - extinctnir(idxnite(i),:) = fillvalue - - burdendust(idxnite(i)) = fillvalue - burdenso4(idxnite(i)) = fillvalue - burdenpom(idxnite(i)) = fillvalue - burdensoa(idxnite(i)) = fillvalue - burdenbc(idxnite(i)) = fillvalue - burdenseasalt(idxnite(i)) = fillvalue - - aodabsbc(idxnite(i)) = fillvalue - - dustaod(idxnite(i)) = fillvalue - so4aod(idxnite(i)) = fillvalue - pomaod(idxnite(i)) = fillvalue - soaaod(idxnite(i)) = fillvalue - bcaod(idxnite(i)) = fillvalue - seasaltaod(idxnite(i)) = fillvalue - end do - - call outfld('SSAVIS', ssavis, pcols, lchnk) - call outfld('AODxASYM', asymvis, pcols, lchnk) - - call outfld('EXTINCTUV', extinctuv, pcols, lchnk) - call outfld('EXTINCTNIR', extinctnir, pcols, lchnk) - call outfld('AODUV', aoduv, pcols, lchnk) - call outfld('AODNIR', aodnir, pcols, lchnk) - call outfld('AODUVst', aoduvst, pcols, lchnk) - call outfld('AODNIRst', aodnirst, pcols, lchnk) - - call outfld('BURDENDUST', burdendust, pcols, lchnk) - call outfld('BURDENSO4' , burdenso4, pcols, lchnk) - call outfld('BURDENPOM' , burdenpom, pcols, lchnk) - call outfld('BURDENSOA' , burdensoa, pcols, lchnk) - call outfld('BURDENBC' , burdenbc, pcols, lchnk) - call outfld('BURDENSEASALT', burdenseasalt, pcols, lchnk) - - call outfld('AODABSBC', aodabsbc, pcols, lchnk) - - call outfld('AODDUST', dustaod, pcols, lchnk) - call outfld('AODSO4', so4aod, pcols, lchnk) - call outfld('AODPOM', pomaod, pcols, lchnk) - call outfld('AODSOA', soaaod, pcols, lchnk) - call outfld('AODBC', bcaod, pcols, lchnk) - call outfld('AODSS', seasaltaod, pcols, lchnk) - end if - -end subroutine modal_aero_sw - -!=============================================================================== - -subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) - - ! calculates aerosol lw radiative properties - - integer, intent(in) :: list_idx ! index of the climate or a diagnostic list - type(physics_state), intent(in), target :: state ! state variables - - type(physics_buffer_desc), pointer :: pbuf(:) - - real(r8), intent(out) :: tauxar(pcols,pver,nlwbands) ! layer absorption optical depth - - ! Local variables - integer :: i, ifld, ilw, k, l, m, nc, ns - integer :: lchnk ! chunk id - integer :: ncol ! number of active columns in the chunk - integer :: nmodes - integer :: nspec - integer :: istat - - real(r8), pointer :: dgnumwet(:,:) ! wet number mode diameter (m) - real(r8), pointer :: qaerwat(:,:) ! aerosol water (g/g) - - real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes - real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes - real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes - real(r8), pointer :: wetdens_m(:,:,:) ! - real(r8), pointer :: hygro_m(:,:,:) ! - real(r8), pointer :: dryvol_m(:,:,:) ! - real(r8), pointer :: dryrad_m(:,:,:) ! - real(r8), pointer :: drymass_m(:,:,:) ! - real(r8), pointer :: so4dryvol_m(:,:,:) ! - real(r8), pointer :: naer_m(:,:,:) ! - - real(r8) :: sigma_logr_aer ! geometric standard deviation of number distribution - real(r8) :: alnsg_amode ! log of geometric standard deviation of number distribution - real(r8) :: xrad(pcols) - real(r8) :: cheby(ncoef,pcols,pver) ! chebychef polynomials - - real(r8) :: mass(pcols,pver) ! layer mass - - real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio - real(r8) :: specdens ! species density (kg/m3) - complex(r8), pointer :: specrefindex(:) ! species refractive index - - real(r8) :: vol(pcols) ! volume concentration of aerosol specie (m3/kg) - real(r8) :: dryvol(pcols) ! volume concentration of aerosol mode (m3/kg) - real(r8) :: wetvol(pcols) ! volume concentration of wet mode (m3/kg) - real(r8) :: watervol(pcols) ! volume concentration of water in each mode (m3/kg) - real(r8) :: refr(pcols) ! real part of refractive index - real(r8) :: refi(pcols) ! imaginary part of refractive index - complex(r8) :: crefin(pcols) ! complex refractive index - real(r8), pointer :: refrtablw(:,:) ! table of real refractive indices for aerosols - real(r8), pointer :: refitablw(:,:) ! table of imag refractive indices for aerosols - real(r8), pointer :: absplw(:,:,:,:) ! specific absorption - - integer :: itab(pcols), jtab(pcols) - real(r8) :: ttab(pcols), utab(pcols) - real(r8) :: cabs(pcols,ncoef) - real(r8) :: pabs(pcols) ! parameterized specific absorption (m2/kg) - real(r8) :: dopaer(pcols) ! aerosol optical depth in layer - - integer, parameter :: nerrmax_dopaer=1000 - integer :: nerr_dopaer = 0 - real(r8) :: volf ! volume fraction of insoluble aerosol - - character(len=*), parameter :: subname = 'modal_aero_lw' - !---------------------------------------------------------------------------- - - lchnk = state%lchnk - ncol = state%ncol - - ! initialize output variables - tauxar(:ncol,:,:) = 0._r8 - - ! dry mass in each cell - mass(:ncol,:) = state%pdeldry(:ncol,:)*rga - - ! loop over all aerosol modes - call rad_cnst_get_info(list_idx, nmodes=nmodes) - - if (list_idx == 0) then - ! water uptake and wet radius for the climate list has already been calculated - call pbuf_get_field(pbuf, dgnumwet_idx, dgnumwet_m) - call pbuf_get_field(pbuf, qaerwat_idx, qaerwat_m) - else - ! If doing a diagnostic calculation then need to calculate the wet radius - ! and water uptake for the diagnostic modes - allocate(dgnumdry_m(pcols,pver,nmodes), dgnumwet_m(pcols,pver,nmodes), & - qaerwat_m(pcols,pver,nmodes), wetdens_m(pcols,pver,nmodes), & - hygro_m(pcols,pver,nmodes), dryvol_m(pcols,pver,nmodes), & - dryrad_m(pcols,pver,nmodes), drymass_m(pcols,pver,nmodes), & - so4dryvol_m(pcols,pver,nmodes), naer_m(pcols,pver,nmodes), stat=istat) - - if (istat > 0) then - call endrun('modal_aero_lw: allocation FAILURE: arrays for diagnostic calcs') - end if - call modal_aero_calcsize_diag(state, pbuf, list_idx, dgnumdry_m, hygro_m, & - dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) - call modal_aero_wateruptake_dr(state, pbuf, list_idx, dgnumdry_m, dgnumwet_m, & - qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & - drymass_m, so4dryvol_m, naer_m) - endif - - do m = 1, nmodes - - dgnumwet => dgnumwet_m(:,:,m) - qaerwat => qaerwat_m(:,:,m) - - ! get mode properties - call rad_cnst_get_mode_props(list_idx, m, sigmag=sigma_logr_aer, refrtablw=refrtablw , & - refitablw=refitablw, absplw=absplw) - - ! get mode info - call rad_cnst_get_info(list_idx, m, nspec=nspec) - - ! calc size parameter for all columns - ! this is the same calculation that's done in modal_size_parameters, but there - ! some intermediate results are saved and the chebyshev polynomials are stored - ! in a array with different index order. Could be unified. - do k = top_lev, pver - do i = 1, ncol - alnsg_amode = log( sigma_logr_aer ) - ! convert from number diameter to surface area - xrad(i) = log(0.5_r8*dgnumwet(i,k)) + 2.0_r8*alnsg_amode*alnsg_amode - ! normalize size parameter - xrad(i) = max(xrad(i), xrmin) - xrad(i) = min(xrad(i), xrmax) - xrad(i) = (2*xrad(i)-xrmax-xrmin)/(xrmax-xrmin) - ! chebyshev polynomials - cheby(1,i,k) = 1.0_r8 - cheby(2,i,k) = xrad(i) - do nc = 3, ncoef - cheby(nc,i,k) = 2.0_r8*xrad(i)*cheby(nc-1,i,k)-cheby(nc-2,i,k) - end do - end do - end do - - do ilw = 1, nlwbands - - do k = top_lev, pver - - ! form bulk refractive index. Use volume mixing for infrared - crefin(:ncol) = (0._r8, 0._r8) - dryvol(:ncol) = 0._r8 - - ! aerosol species loop - do l = 1, nspec - call rad_cnst_get_aer_mmr(list_idx, m, l, 'a', state, pbuf, specmmr) - call rad_cnst_get_aer_props(list_idx, m, l, density_aer=specdens, & - refindex_aer_lw=specrefindex) - - do i = 1, ncol - vol(i) = specmmr(i,k)/specdens - dryvol(i) = dryvol(i) + vol(i) - crefin(i) = crefin(i) + vol(i)*specrefindex(ilw) - end do - end do - - do i = 1, ncol - watervol(i) = qaerwat(i,k)/rhoh2o - wetvol(i) = watervol(i) + dryvol(i) - if (watervol(i) < 0.0_r8) then - if (abs(watervol(i)) .gt. 1.e-1_r8*wetvol(i)) then - write(iulog,*) 'watervol,wetvol,dryvol=',watervol(i),wetvol(i),dryvol(i),' in '//subname - end if - watervol(i) = 0._r8 - wetvol(i) = dryvol(i) - end if - - crefin(i) = crefin(i) + watervol(i)*crefwlw(ilw) - if (wetvol(i) > 1.e-40_r8) crefin(i) = crefin(i)/wetvol(i) - refr(i) = real(crefin(i)) - refi(i) = aimag(crefin(i)) - end do - - ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(absplw(:,:,:,ilw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtablw(:,ilw), refitablw(:,ilw), & - itab, jtab, ttab, utab, cabs) - - ! parameterized optical properties - do i = 1, ncol - pabs(i) = 0.5_r8*cabs(i,1) - do nc = 2, ncoef - pabs(i) = pabs(i) + cheby(nc,i,k)*cabs(i,nc) - end do - pabs(i) = pabs(i)*wetvol(i)*rhoh2o - pabs(i) = max(0._r8,pabs(i)) - dopaer(i) = pabs(i)*mass(i,k) - end do - - do i = 1, ncol - - if ((dopaer(i) <= -1.e-10_r8) .or. (dopaer(i) >= 20._r8)) then - - if (dopaer(i) <= -1.e-10_r8) then - write(iulog,*) "ERROR: Negative aerosol optical depth & - &in this layer." - else - write(iulog,*) "WARNING: Aerosol optical depth is & - &unreasonably high in this layer." - end if - - write(iulog,*) 'dopaer(',i,',',k,',',m,',',lchnk,')=', dopaer(i) - write(iulog,*) 'k=',k,' pabs=', pabs(i) - write(iulog,*) 'wetvol=',wetvol(i),' dryvol=',dryvol(i), & - ' watervol=',watervol(i) - write(iulog,*) 'cabs=', (cabs(i,l),l=1,ncoef) - write(iulog,*) 'crefin=', crefin(i) - write(iulog,*) 'nspec=', nspec - do l = 1,nspec - call rad_cnst_get_aer_mmr(list_idx, m, l, 'a', state, pbuf, specmmr) - call rad_cnst_get_aer_props(list_idx, m, l, density_aer=specdens, & - refindex_aer_lw=specrefindex) - volf = specmmr(i,k)/specdens - write(iulog,*) 'l=',l,'vol(l)=',volf - write(iulog,*) 'ilw=',ilw,' specrefindex(ilw)=',specrefindex(ilw) - write(iulog,*) 'specdens=',specdens - end do - - nerr_dopaer = nerr_dopaer + 1 - if (nerr_dopaer >= nerrmax_dopaer .or. dopaer(i) < -1.e-10_r8) then - write(iulog,*) '*** halting in '//subname//' after nerr_dopaer =', nerr_dopaer - call endrun() - end if - - end if - end do - - do i = 1, ncol - tauxar(i,k,ilw) = tauxar(i,k,ilw) + dopaer(i) - end do - - end do ! k = top_lev, pver - - end do ! nlwbands - - end do ! m = 1, nmodes - - if (list_idx > 0) then - deallocate(dgnumdry_m) - deallocate(dgnumwet_m) - deallocate(qaerwat_m) - deallocate(wetdens_m) - deallocate(hygro_m) - deallocate(dryvol_m) - deallocate(dryrad_m) - deallocate(drymass_m) - deallocate(so4dryvol_m) - deallocate(naer_m) - end if - -end subroutine modal_aero_lw - -!=============================================================================== -! Private routines -!=============================================================================== - -subroutine read_water_refindex(infilename) - - ! read water refractive index file and set module data - - character*(*), intent(in) :: infilename ! modal optics filename - - ! Local variables - - integer :: i, ierr - type(file_desc_t) :: ncid ! pio file handle - integer :: did ! dimension ids - integer :: dimlen ! dimension lengths - type(var_desc_t) :: vid ! variable ids - real(r8) :: refrwsw(nswbands), refiwsw(nswbands) ! real, imaginary ref index for water visible - real(r8) :: refrwlw(nlwbands), refiwlw(nlwbands) ! real, imaginary ref index for water infrared - !---------------------------------------------------------------------------- - - ! open file - call cam_pio_openfile(ncid, infilename, PIO_NOWRITE) - - ! inquire dimensions. Check that file values match parameter values. - - ierr = pio_inq_dimid(ncid, 'lw_band', did) - ierr = pio_inq_dimlen(ncid, did, dimlen) - if (dimlen .ne. nlwbands) then - write(iulog,*) 'lw_band len=', dimlen, ' from ', infilename, ' ne nlwbands=', nlwbands - call endrun('read_modal_optics: bad lw_band value') - endif - - ierr = pio_inq_dimid(ncid, 'sw_band', did) - ierr = pio_inq_dimlen(ncid, did, dimlen) - if (dimlen .ne. nswbands) then - write(iulog,*) 'sw_band len=', dimlen, ' from ', infilename, ' ne nswbands=', nswbands - call endrun('read_modal_optics: bad sw_band value') - endif - - ! read variables - ierr = pio_inq_varid(ncid, 'refindex_real_water_sw', vid) - ierr = pio_get_var(ncid, vid, refrwsw) - - ierr = pio_inq_varid(ncid, 'refindex_im_water_sw', vid) - ierr = pio_get_var(ncid, vid, refiwsw) - - ierr = pio_inq_varid(ncid, 'refindex_real_water_lw', vid) - ierr = pio_get_var(ncid, vid, refrwlw) - - ierr = pio_inq_varid(ncid, 'refindex_im_water_lw', vid) - ierr = pio_get_var(ncid, vid, refiwlw) - - ! set complex representation of refractive indices as module data - do i = 1, nswbands - crefwsw(i) = cmplx(refrwsw(i), abs(refiwsw(i)),kind=r8) - end do - do i = 1, nlwbands - crefwlw(i) = cmplx(refrwlw(i), abs(refiwlw(i)),kind=r8) - end do - - call pio_closefile(ncid) - -end subroutine read_water_refindex - -!=============================================================================== - -subroutine modal_size_parameters(ncol, sigma_logr_aer, dgnumwet, radsurf, logradsurf, cheb) - - integer, intent(in) :: ncol - real(r8), intent(in) :: sigma_logr_aer ! geometric standard deviation of number distribution - real(r8), intent(in) :: dgnumwet(:,:) ! aerosol wet number mode diameter (m) - real(r8), intent(out) :: radsurf(:,:) ! aerosol surface mode radius - real(r8), intent(out) :: logradsurf(:,:) ! log(aerosol surface mode radius) - real(r8), intent(out) :: cheb(:,:,:) - - integer :: i, k, nc - real(r8) :: alnsg_amode - real(r8) :: explnsigma - real(r8) :: xrad(pcols) ! normalized aerosol radius - !------------------------------------------------------------------------------- - - alnsg_amode = log(sigma_logr_aer) - explnsigma = exp(2.0_r8*alnsg_amode*alnsg_amode) - - do k = top_lev, pver - do i = 1, ncol - ! convert from number mode diameter to surface area - radsurf(i,k) = 0.5_r8*dgnumwet(i,k)*explnsigma - logradsurf(i,k) = log(radsurf(i,k)) - ! normalize size parameter - xrad(i) = max(logradsurf(i,k),xrmin) - xrad(i) = min(xrad(i),xrmax) - xrad(i) = (2._r8*xrad(i)-xrmax-xrmin)/(xrmax-xrmin) - ! chebyshev polynomials - cheb(1,i,k) = 1._r8 - cheb(2,i,k) = xrad(i) - do nc = 3, ncoef - cheb(nc,i,k) = 2._r8*xrad(i)*cheb(nc-1,i,k)-cheb(nc-2,i,k) - end do - end do - end do - -end subroutine modal_size_parameters - -!=============================================================================== - - subroutine binterp(table,ncol,km,im,jm,x,y,xtab,ytab,ix,jy,t,u,out) - - ! bilinear interpolation of table - ! - implicit none - integer im,jm,km,ncol - real(r8) table(km,im,jm),xtab(im),ytab(jm),out(pcols,km) - integer i,ix(pcols),ip1,j,jy(pcols),jp1,k,ic,ip1m(pcols),jp1m(pcols),ixc,jyc - real(r8) x(pcols),dx,t(pcols),y(pcols),dy,u(pcols),tu(pcols),tuc(pcols),tcu(pcols),tcuc(pcols) - - if(ix(1).gt.0) go to 30 - if(im.gt.1)then - do ic=1,ncol - do i=1,im - if(x(ic).lt.xtab(i))go to 10 - enddo - 10 ix(ic)=max0(i-1,1) - ip1=min(ix(ic)+1,im) - dx=(xtab(ip1)-xtab(ix(ic))) - if(abs(dx).gt.1.e-20_r8)then - t(ic)=(x(ic)-xtab(ix(ic)))/dx - else - t(ic)=0._r8 - endif - end do - else - ix(:ncol)=1 - t(:ncol)=0._r8 - endif - if(jm.gt.1)then - do ic=1,ncol - do j=1,jm - if(y(ic).lt.ytab(j))go to 20 - enddo - 20 jy(ic)=max0(j-1,1) - jp1=min(jy(ic)+1,jm) - dy=(ytab(jp1)-ytab(jy(ic))) - if(abs(dy).gt.1.e-20_r8)then - u(ic)=(y(ic)-ytab(jy(ic)))/dy - else - u(ic)=0._r8 - endif - end do - else - jy(:ncol)=1 - u(:ncol)=0._r8 - endif - 30 continue - do ic=1,ncol - tu(ic)=t(ic)*u(ic) - tuc(ic)=t(ic)-tu(ic) - tcuc(ic)=1._r8-tuc(ic)-u(ic) - tcu(ic)=u(ic)-tu(ic) - jp1m(ic)=min(jy(ic)+1,jm) - ip1m(ic)=min(ix(ic)+1,im) - enddo - do ic=1,ncol - jyc=jy(ic) - ixc=ix(ic) - jp1=jp1m(ic) - ip1=ip1m(ic) - do k=1,km - out(ic,k) = tcuc(ic) * table(k,ixc,jyc) + tuc(ic) * table(k,ip1,jyc) + & - tu(ic) * table(k,ip1,jp1) + tcu(ic) * table(k,ixc,jp1) - end do - end do - return - end subroutine binterp - -end module modal_aer_opt diff --git a/src/physics/cam/rad_constituents.F90 b/src/physics/cam/rad_constituents.F90 index ced2c35cfa..2863197669 100644 --- a/src/physics/cam/rad_constituents.F90 +++ b/src/physics/cam/rad_constituents.F90 @@ -2,9 +2,9 @@ module rad_constituents !------------------------------------------------------------------------------------------------ ! -! Provide constituent distributions and properties to the radiation and +! Provide constituent distributions and properties to the radiation and ! cloud microphysics routines. -! +! ! The logic to control which constituents are used in the climate calculations ! and which are used in diagnostic radiation calculations is contained in this module. ! @@ -115,7 +115,7 @@ module rad_constituents ! type to provide access to the data parsed from the rad_climate and rad_diag_* strings type :: rad_cnst_namelist_t integer :: ncnst - character(len= 1), pointer :: source(:) ! 'A' for state (advected), 'N' for pbuf (non-advected), + character(len= 1), pointer :: source(:) ! 'A' for state (advected), 'N' for pbuf (non-advected), ! 'M' for mode, 'Z' for zero character(len= 64), pointer :: camname(:) ! name registered in pbuf or constituents character(len=cs1), pointer :: radname(:) ! radname is the name as identfied in radiation, @@ -127,7 +127,7 @@ module rad_constituents type(rad_cnst_namelist_t) :: namelist(0:N_DIAG) ! gas, bulk aerosol, and modal components used in ! climate/diagnostic calculations -logical :: active_calls(0:N_DIAG) ! active_calls(i) is true if the i-th call to radiation is +logical :: active_calls(0:N_DIAG) ! active_calls(i) is true if the i-th call to radiation is ! specified. Note that the 0th call is for the climate ! calculation which is always made. @@ -184,7 +184,7 @@ module rad_constituents ! values for constituents with requested value of zero -real(r8), allocatable, target :: zero_cols(:,:) +real(r8), allocatable, target :: zero_cols(:,:) ! define generic interface routines interface rad_cnst_get_info @@ -299,7 +299,7 @@ subroutine rad_cnst_readnl(nlfile) ! Mode definition stings call parse_mode_defs(mode_defs, modes) - + ! Lists of externally mixed entities for climate and diagnostic calculations do i = 0,N_DIAG select case (i) @@ -331,7 +331,7 @@ subroutine rad_cnst_readnl(nlfile) ! were there any constituents specified for the nth diagnostic call? ! if so, radiation will make a call with those consituents active_calls(:) = (namelist(:)%ncnst > 0) - + ! Initialize the gas and aerosol lists with the information from the ! namelist. This is done here so that this information is available via ! the query functions at the time when the register methods are called. @@ -470,13 +470,13 @@ subroutine rad_cnst_get_gas(list_idx, gasname, state, pbuf, mmr) write(iulog,*) subname//': list_idx =', list_idx call endrun(subname//': list_idx out of bounds') endif - + lchnk = state%lchnk - ! Get index of gas in internal arrays. rad_gas_index will abort if the + ! Get index of gas in internal arrays. rad_gas_index will abort if the ! specified gasname is not recognized by the radiative transfer code. igas = rad_gas_index(trim(gasname)) - + ! Get data source source = list%gas(igas)%source idx = list%gas(igas)%idx @@ -516,10 +516,10 @@ function rad_cnst_num_name(list_idx, spc_name_in, num_name_out, mode_out, spec_o character(len= 32) :: spec_name found = .false. - + m_list => ma_list(list_idx) nmodes = m_list%nmodes - + do n = 1,nmodes mm = m_list%idx(n) nspecs = modes%comps(mm)%nspec @@ -629,7 +629,7 @@ subroutine rad_cnst_get_info(list_idx, gasnames, aernames, & ! get index of O3 in gas list igas = rad_gas_index('O3') - + ! Get data source source = g_list%gas(igas)%source @@ -1054,7 +1054,7 @@ subroutine init_mode_comps(modes) modes%comps(m)%camname_mmr_c(ispec), routine) ! get physprop ID - modes%comps(m)%idx_props(ispec) = physprop_get_id(modes%comps(m)%props(ispec)) + modes%comps(m)%idx_props(ispec) = physprop_get_id(modes%comps(m)%props(ispec)) if (modes%comps(m)%idx_props(ispec) == -1) then call endrun(routine//' : ERROR idx not found for '//trim(modes%comps(m)%props(ispec))) end if @@ -1079,7 +1079,7 @@ integer function get_cam_idx(source, name, routine) integer :: idx integer :: errcode !----------------------------------------------------------------------------- - + if (source(1:1) == 'N') then idx = pbuf_get_index(trim(name),errcode) @@ -1103,7 +1103,7 @@ integer function get_cam_idx(source, name, routine) call endrun(routine//' ERROR: invalid source for specie '//trim(name)) end if - + get_cam_idx = idx end function get_cam_idx @@ -1112,7 +1112,7 @@ end function get_cam_idx subroutine list_init1(namelist, gaslist, aerlist, ma_list) - ! Initialize the gas and bulk and modal aerosol lists with the + ! Initialize the gas and bulk and modal aerosol lists with the ! entities specified in the climate or diagnostic lists. ! This first phase initialization just sets the information that @@ -1180,7 +1180,7 @@ subroutine list_init1(namelist, gaslist, aerlist, ma_list) end if ! Add component to appropriate list (gas, modal or bulk aerosol) - if (namelist%type(ii) == 'A') then + if (namelist%type(ii) == 'A') then ! Add to bulk aerosol list ba_idx = ba_idx + 1 @@ -1189,7 +1189,7 @@ subroutine list_init1(namelist, gaslist, aerlist, ma_list) aerlist%aer(ba_idx)%camname = namelist%camname(ii) aerlist%aer(ba_idx)%physprop_file = namelist%radname(ii) - else if (namelist%type(ii) == 'M') then + else if (namelist%type(ii) == 'M') then ! Add to modal aerosol list ma_idx = ma_idx + 1 @@ -1209,7 +1209,7 @@ subroutine list_init1(namelist, gaslist, aerlist, ma_list) ! Also save the name of the physprop file ma_list%physprop_files(ma_idx) = namelist%radname(ii) - else + else ! Add to gas list @@ -1388,7 +1388,7 @@ end subroutine rad_aer_diag_init subroutine parse_mode_defs(nl_in, modes) ! Parse the mode definition specifiers. The specifiers are of the form: - ! + ! ! 'mode_name:mode_type:=', ! 'source_num_a:camname_num_a:source_num_c:camname_num_c:num_mr:+', ! 'source_mmr_a:camname_mmr_a:source_mmr_c:camname_mmr_c:spec_type:prop_file[:+]'[,] @@ -1422,7 +1422,7 @@ subroutine parse_mode_defs(nl_in, modes) ! associated field for the prop_file. There can only be one entry ! with the num_mr type in a mode definition. ! prop_file -- For aerosol species this is a filename, which is - ! identified by a ".nc" suffix. The file contains optical and + ! identified by a ".nc" suffix. The file contains optical and ! other physical properties of the aerosol. ! ! A mode definition must contain only 1 string for the number mixing ratio components @@ -1448,7 +1448,7 @@ subroutine parse_mode_defs(nl_in, modes) character(len=32) :: tmp_name_c character(len=32) :: tmp_type !------------------------------------------------------------------------- - + ! Determine number of modes defined by counting number of strings that are ! terminated by ':=' ! (algorithm stops counting at first blank element). @@ -1458,7 +1458,7 @@ subroutine parse_mode_defs(nl_in, modes) if (len_trim(nl_in(m)) == 0) exit nstr = nstr + 1 - + ! There are no fields in the input strings in which a blank character is allowed. ! To simplify the parsing go through the input strings and remove blanks. tmpstr = adjustl(nl_in(m)) @@ -1489,7 +1489,7 @@ subroutine parse_mode_defs(nl_in, modes) write(iulog,*) routine//': ERROR: cannot allocate storage for modes. nmodes=', nmodes call endrun(routine//': ERROR allocating storage for modes') end if - + mcur = 1 ! index of current string being processed @@ -1512,7 +1512,7 @@ subroutine parse_mode_defs(nl_in, modes) nspec = nspec + 1 mcur = mcur + 1 end do - + ! a mode must have at least one specie if (nspec == 0) call parse_error('mode must have at least one specie', nl_in(mbeg)) @@ -1549,7 +1549,7 @@ subroutine parse_mode_defs(nl_in, modes) ! return to first string in mode definition mcur = mbeg tmpstr = nl_in(mcur) - + ! mode name ipos = index(tmpstr, ':') if (ipos < 2) call parse_error('mode name not found', tmpstr) @@ -1693,7 +1693,7 @@ subroutine check_specie_type(str, ib, ie) character(len=*), intent(in) :: str integer, intent(in) :: ib, ie - + integer :: i do i = 1, num_spec_types @@ -1710,7 +1710,7 @@ subroutine check_mode_type(str, ib, ie) character(len=*), intent(in) :: str integer, intent(in) :: ib, ie ! begin, end character of mode type substring - + integer :: i do i = 1, num_mode_types @@ -1739,7 +1739,7 @@ subroutine parse_rad_specifier(specifier, namelist_data) ! radname -- For gases this is a name that identifies the constituent to the ! radiative transfer codes. These names are contained in the ! radconstants module. For aerosols this is a filename, which is -! identified by a ".nc" suffix. The file contains optical and +! identified by a ".nc" suffix. The file contains optical and ! other physical properties of the aerosol. ! ! This code also identifies whether the constituent is a gas or an aerosol @@ -1759,11 +1759,11 @@ subroutine parse_rad_specifier(specifier, namelist_data) character(len=cs1) :: radname(n_rad_cnst) character(len=1) :: type(n_rad_cnst) !------------------------------------------------------------------------- - + number = 0 parse_loop: do i = 1, n_rad_cnst - if ( len_trim(specifier(i)) == 0 ) then + if ( len_trim(specifier(i)) == 0 ) then exit parse_loop endif @@ -1784,12 +1784,12 @@ subroutine parse_rad_specifier(specifier, namelist_data) ! locate the ':' separating camname from radname j = scan(tmpstr, ':') - + camname(i) = tmpstr(:j-1) radname(i) = tmpstr(j+1:) ! determine the type of constituent - if (source(i) == 'M') then + if (source(i) == 'M') then type(i) = 'M' else if(index(radname(i),".nc") .gt. 0) then type(i) = 'A' @@ -1797,7 +1797,7 @@ subroutine parse_rad_specifier(specifier, namelist_data) type(i) = 'G' end if - number = number+1 + number = number+1 end do parse_loop namelist_data%ncnst = number @@ -1876,7 +1876,7 @@ end subroutine rad_cnst_get_aer_mmr_by_idx subroutine rad_cnst_get_mam_mmr_by_idx(list_idx, mode_idx, spec_idx, phase, state, pbuf, mmr) ! Return pointer to mass mixing ratio for the modal aerosol specie from the specified - ! climate or diagnostic list. + ! climate or diagnostic list. ! Arguments integer, intent(in) :: list_idx ! index of the climate or a diagnostic list @@ -1950,7 +1950,7 @@ subroutine rad_cnst_get_mam_mmr_idx(mode_idx, spec_idx, idx) ! Return constituent index of mam specie mass mixing ratio for aerosol modes in ! the climate list. - ! This is a special routine to allow direct access to information in the + ! This is a special routine to allow direct access to information in the ! constituent array inside physics parameterizations that have been passed, ! and are operating over the entire constituent array. The interstitial phase ! is assumed since that's what is contained in the constituent array. @@ -1994,7 +1994,7 @@ end subroutine rad_cnst_get_mam_mmr_idx subroutine rad_cnst_get_mode_num(list_idx, mode_idx, phase, state, pbuf, num) ! Return pointer to number mixing ratio for the aerosol mode from the specified - ! climate or diagnostic list. + ! climate or diagnostic list. ! Arguments integer, intent(in) :: list_idx ! index of the climate or a diagnostic list @@ -2061,7 +2061,7 @@ subroutine rad_cnst_get_mode_num_idx(mode_idx, cnst_idx) ! Return constituent index of mode number mixing ratio for the aerosol mode in ! the climate list. - ! This is a special routine to allow direct access to information in the + ! This is a special routine to allow direct access to information in the ! constituent array inside physics parameterizations that have been passed, ! and are operating over the entire constituent array. The interstitial phase ! is assumed since that's what is contained in the constituent array. @@ -2116,7 +2116,7 @@ integer function rad_cnst_get_aer_idx(list_idx, aer_name) type(aerlist_t), pointer :: aerlist character(len=*), parameter :: subname = "rad_cnst_get_aer_idx" !------------------------------------------------------------------------- - + if (list_idx >= 0 .and. list_idx <= N_DIAG) then aerlist => aerosollist(list_idx) else @@ -2134,7 +2134,7 @@ integer function rad_cnst_get_aer_idx(list_idx, aer_name) end do if (aer_idx == -1) call endrun(subname//": ERROR - name not found") - + rad_cnst_get_aer_idx = aer_idx end function rad_cnst_get_aer_idx @@ -2160,30 +2160,30 @@ subroutine rad_cnst_get_aer_props_by_idx(list_idx, & integer, intent(in) :: list_idx ! index of the climate or a diagnostic list integer, intent(in) :: aer_idx ! index of the aerosol character(len=ot_length), optional, intent(out) :: opticstype - real(r8), optional, pointer :: sw_hygro_ext(:,:) - real(r8), optional, pointer :: sw_hygro_ssa(:,:) - real(r8), optional, pointer :: sw_hygro_asm(:,:) - real(r8), optional, pointer :: lw_hygro_ext(:,:) + real(r8), optional, pointer :: sw_hygro_ext(:,:) + real(r8), optional, pointer :: sw_hygro_ssa(:,:) + real(r8), optional, pointer :: sw_hygro_asm(:,:) + real(r8), optional, pointer :: lw_hygro_ext(:,:) real(r8), optional, pointer :: sw_nonhygro_ext(:) real(r8), optional, pointer :: sw_nonhygro_ssa(:) real(r8), optional, pointer :: sw_nonhygro_asm(:) real(r8), optional, pointer :: sw_nonhygro_scat(:) real(r8), optional, pointer :: sw_nonhygro_ascat(:) - real(r8), optional, pointer :: lw_ext(:) + real(r8), optional, pointer :: lw_ext(:) complex(r8), optional, pointer :: refindex_aer_sw(:) complex(r8), optional, pointer :: refindex_aer_lw(:) - character(len=20), optional, intent(out) :: aername + character(len=20), optional, intent(out) :: aername real(r8), optional, intent(out) :: density_aer real(r8), optional, intent(out) :: hygro_aer - real(r8), optional, intent(out) :: dryrad_aer - real(r8), optional, intent(out) :: dispersion_aer - real(r8), optional, intent(out) :: num_to_mass_aer + real(r8), optional, intent(out) :: dryrad_aer + real(r8), optional, intent(out) :: dispersion_aer + real(r8), optional, intent(out) :: num_to_mass_aer - real(r8), optional, pointer :: r_sw_ext(:,:) - real(r8), optional, pointer :: r_sw_scat(:,:) - real(r8), optional, pointer :: r_sw_ascat(:,:) - real(r8), optional, pointer :: r_lw_abs(:,:) - real(r8), optional, pointer :: mu(:) + real(r8), optional, pointer :: r_sw_ext(:,:) + real(r8), optional, pointer :: r_sw_scat(:,:) + real(r8), optional, pointer :: r_sw_ascat(:,:) + real(r8), optional, pointer :: r_lw_abs(:,:) + real(r8), optional, pointer :: mu(:) ! Local variables integer :: id @@ -2259,31 +2259,31 @@ subroutine rad_cnst_get_mam_props_by_idx(list_idx, & integer, intent(in) :: mode_idx ! mode index integer, intent(in) :: spec_idx ! index of specie in the mode character(len=ot_length), optional, intent(out) :: opticstype - real(r8), optional, pointer :: sw_hygro_ext(:,:) - real(r8), optional, pointer :: sw_hygro_ssa(:,:) - real(r8), optional, pointer :: sw_hygro_asm(:,:) - real(r8), optional, pointer :: lw_hygro_ext(:,:) + real(r8), optional, pointer :: sw_hygro_ext(:,:) + real(r8), optional, pointer :: sw_hygro_ssa(:,:) + real(r8), optional, pointer :: sw_hygro_asm(:,:) + real(r8), optional, pointer :: lw_hygro_ext(:,:) real(r8), optional, pointer :: sw_nonhygro_ext(:) real(r8), optional, pointer :: sw_nonhygro_ssa(:) real(r8), optional, pointer :: sw_nonhygro_asm(:) real(r8), optional, pointer :: sw_nonhygro_scat(:) real(r8), optional, pointer :: sw_nonhygro_ascat(:) - real(r8), optional, pointer :: lw_ext(:) + real(r8), optional, pointer :: lw_ext(:) complex(r8), optional, pointer :: refindex_aer_sw(:) complex(r8), optional, pointer :: refindex_aer_lw(:) - real(r8), optional, pointer :: r_sw_ext(:,:) - real(r8), optional, pointer :: r_sw_scat(:,:) - real(r8), optional, pointer :: r_sw_ascat(:,:) - real(r8), optional, pointer :: r_lw_abs(:,:) - real(r8), optional, pointer :: mu(:) + real(r8), optional, pointer :: r_sw_ext(:,:) + real(r8), optional, pointer :: r_sw_scat(:,:) + real(r8), optional, pointer :: r_sw_ascat(:,:) + real(r8), optional, pointer :: r_lw_abs(:,:) + real(r8), optional, pointer :: mu(:) - character(len=20), optional, intent(out) :: aername + character(len=20), optional, intent(out) :: aername real(r8), optional, intent(out) :: density_aer real(r8), optional, intent(out) :: hygro_aer - real(r8), optional, intent(out) :: dryrad_aer - real(r8), optional, intent(out) :: dispersion_aer - real(r8), optional, intent(out) :: num_to_mass_aer + real(r8), optional, intent(out) :: dryrad_aer + real(r8), optional, intent(out) :: dispersion_aer + real(r8), optional, intent(out) :: num_to_mass_aer character(len=32), optional, intent(out) :: spectype ! Local variables @@ -2352,7 +2352,7 @@ end subroutine rad_cnst_get_mam_props_by_idx !================================================================================================ -subroutine rad_cnst_get_mode_props(list_idx, mode_idx, & +subroutine rad_cnst_get_mode_props(list_idx, mode_idx, opticstype, & extpsw, abspsw, asmpsw, absplw, refrtabsw, & refitabsw, refrtablw, refitablw, ncoef, prefr, & prefi, sigmag, dgnum, dgnumlo, dgnumhi, & @@ -2366,7 +2366,7 @@ subroutine rad_cnst_get_mode_props(list_idx, mode_idx, & ! Arguments integer, intent(in) :: list_idx ! index of the climate or a diagnostic list integer, intent(in) :: mode_idx ! mode index - + character(len=ot_length), optional, intent(out) :: opticstype real(r8), optional, pointer :: extpsw(:,:,:,:) real(r8), optional, pointer :: abspsw(:,:,:,:) real(r8), optional, pointer :: asmpsw(:,:,:,:) @@ -2407,6 +2407,7 @@ subroutine rad_cnst_get_mode_props(list_idx, mode_idx, & ! Get the physprop index for the requested mode id = mlist%idx_props(mode_idx) + if (present(opticstype)) call physprop_get(id, opticstype=opticstype) if (present(extpsw)) call physprop_get(id, extpsw=extpsw) if (present(abspsw)) call physprop_get(id, abspsw=abspsw) if (present(asmpsw)) call physprop_get(id, asmpsw=asmpsw) diff --git a/src/physics/rrtmg/radiation.F90 b/src/physics/rrtmg/radiation.F90 index 31e33b183d..4ca347d749 100644 --- a/src/physics/rrtmg/radiation.F90 +++ b/src/physics/rrtmg/radiation.F90 @@ -17,7 +17,7 @@ module radiation use time_manager, only: get_nstep, is_first_restart_step, & get_curr_calday, get_step_size -use rad_constituents, only: N_DIAG, rad_cnst_get_call_list, rad_cnst_get_info, & +use rad_constituents, only: N_DIAG, rad_cnst_get_call_list, & rad_cnst_get_gas, rad_cnst_out, oldcldoptics, & liqcldoptics, icecldoptics @@ -363,7 +363,6 @@ subroutine radiation_init(pbuf2d) use rad_solar_var, only: rad_solar_var_init use radiation_data, only: rad_data_init use cloud_rad_props, only: cloud_rad_props_init - use modal_aer_opt, only: modal_aer_opt_init use rrtmg_state, only: rrtmg_state_init use time_manager, only: is_first_step @@ -372,7 +371,7 @@ subroutine radiation_init(pbuf2d) type(physics_buffer_desc), pointer :: pbuf2d(:,:) ! local variables - integer :: icall, nmodes + integer :: icall logical :: active_calls(0:N_DIAG) integer :: nstep ! current timestep number logical :: history_amwg ! output the variables used by the AMWG diag package @@ -417,11 +416,6 @@ subroutine radiation_init(pbuf2d) history_budget_out = history_budget, & history_budget_histfile_num_out = history_budget_histfile_num) - ! Determine whether modal aerosols are affecting the climate, and if so - ! then initialize the modal aerosol optics module - call rad_cnst_get_info(0, nmodes=nmodes) - if (nmodes > 0) call modal_aer_opt_init() - ! "irad_always" is number of time steps to execute radiation continuously from start of ! initial OR restart run nstep = get_nstep() @@ -1564,4 +1558,3 @@ end subroutine calc_col_mean !=============================================================================== end module radiation - From d8b0896a761e4e80dc6c4ad780d79128b5b9cef0 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 22 May 2023 16:34:26 -0600 Subject: [PATCH 02/61] code clean up modified: src/physics/cam/aerosol_optics_cam.F90 --- src/physics/cam/aerosol_optics_cam.F90 | 59 ++++++++++++++------------ 1 file changed, 31 insertions(+), 28 deletions(-) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 92c67f4949..3a60dd0a14 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -161,9 +161,9 @@ subroutine aerosol_optics_cam_init if (modal_active) then iaermod = iaermod+1 aero_props(iaermod)%obj => modal_aerosol_properties() -!!$ else if (carma_active) then -!!$ iaermod = iaermod+1 -!!$ aero_props(iaermod)%obj => carma_aerosol_properties() + else if (carma_active) then + iaermod = iaermod+1 +! aero_props(iaermod)%obj => carma_aerosol_properties() end if if (water_refindex_file/='NONE') then @@ -618,9 +618,9 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, if (modal_active) then iaermod = iaermod+1 aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) -!!$ else if (carma_active) then -!!$ iaermod = iaermod+1 -!!$ aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) + else if (carma_active) then + iaermod = iaermod+1 +! aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) end if allocate(pext(ncol), stat=istat) @@ -659,16 +659,16 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, case('modal') ! refractive method aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, & ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) -!!$ case('hygroscopic_coreshell') -!!$ ! calculate relative humidity for table lookup into rh grid -!!$ call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) -!!$ relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) -!!$ relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) -!!$ aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, & -!!$ ibin, ncol, pver, relh(:ncol,:)) -!!$ case('hygroscopic_wtp') -!!$ aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, & -!!$ ibin, ncol, pver) + case('hygroscopic_coreshell') + ! calculate relative humidity for table lookup into rh grid + call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) + relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) + relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) + !aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, & + ! ibin, ncol, pver, relh(:ncol,:)) + case('hygroscopic_wtp') + !aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, & + ! ibin, ncol, pver) case default call endrun(prefix//'optics method not recognized') end select @@ -1103,9 +1103,9 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) if (modal_active) then iaermod = iaermod+1 aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) -!!$ else if (carma_active) then -!!$ iaermod = iaermod+1 -!!$ aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) + else if (carma_active) then + iaermod = iaermod+1 +! aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) end if ncol = state%ncol @@ -1130,15 +1130,18 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) select case (trim(opticstype)) case('modal') ! refractive method - aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) -!!$ case('hygroscopic_coreshell') -!!$ ! calculate relative humidity for table lookup into rh grid -!!$ call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) -!!$ relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) -!!$ relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) -!!$ aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, ibin, ncol, pver, relh(:ncol,:)) -!!$ case('hygroscopic_wtp') -!!$ aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, ibin, ncol, pver) + aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, & + ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) + case('hygroscopic_coreshell') + ! calculate relative humidity for table lookup into rh grid + call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) + relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) + relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) + !aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, & + ! ibin, ncol, pver, relh(:ncol,:)) + case('hygroscopic_wtp') + !aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, & + ! ibin, ncol, pver) case default call endrun(prefix//'optics method not recognized') end select From 8d71f9241b87f4048c28f02a1010fbb2c35fe7db Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 23 May 2023 10:43:02 -0600 Subject: [PATCH 03/61] initialize dustvol to zero; corections to add_default fields; minor clean up modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 modified: src/physics/cam/aerosol_optics_cam.F90 --- .../aerosol/refractive_aerosol_optics_mod.F90 | 1 - src/physics/cam/aerosol_optics_cam.F90 | 111 ++++++++++++++++-- 2 files changed, 98 insertions(+), 14 deletions(-) diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index af662b2a5d..a2ce2debeb 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -248,7 +248,6 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) pabs(icol) = min(pext(icol),pabs(icol)) palb(icol) = 1._r8-pabs(icol)/max(pext(icol),1.e-40_r8) - palb(icol) = 1._r8-pabs(icol)/max(pext(icol),1.e-40_r8) end do diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 3a60dd0a14..edcc5d478c 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -129,11 +129,15 @@ subroutine aerosol_optics_cam_init character(len=30) :: fldname character(len=128) :: lngname - logical :: history_aero_optics ! output aerosol optics diagnostics + logical :: history_aero_optics ! output aerosol optics diagnostics + logical :: history_amwg ! output the variables used by the AMWG diag package + logical :: history_dust ! output dust diagnostics character(len=256) :: locfile - call phys_getopts(history_aero_optics_out = history_aero_optics) + call phys_getopts(history_amwg_out = history_amwg, & + history_aero_optics_out = history_aero_optics, & + history_dust_out = history_dust ) num_aero_models = 0 nbins = 0 @@ -257,7 +261,6 @@ subroutine aerosol_optics_cam_init end if end do - if (num_aero_models>0) then allocate(burden_fields(num_aero_models), stat=istat) @@ -320,7 +323,7 @@ subroutine aerosol_optics_cam_init burden_fields(n)%name(m) = fldname write(lngname,'(a,i2.2)') 'Aerosol burden bin ', m call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) - if (history_aero_optics) then + if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -328,7 +331,7 @@ subroutine aerosol_optics_cam_init aodbin_fields(n)%name(m) = fldname write(lngname,'(a,i2)') 'Aerosol optical depth, day only, 550 nm bin ', m call addfld (aodbin_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (history_aero_optics) then + if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -336,7 +339,7 @@ subroutine aerosol_optics_cam_init aoddust_fields(n)%name(m) = fldname write(lngname,'(a,i2,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' call addfld (aoddust_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (history_aero_optics) then + if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -344,7 +347,7 @@ subroutine aerosol_optics_cam_init burdendn_fields(n)%name(m) = fldname write(lngname,'(a,i2)') 'Aerosol burden, day night, bin ', m call addfld (burdendn_fields(n)%name(m), horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) - if (history_aero_optics) then + if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -352,7 +355,7 @@ subroutine aerosol_optics_cam_init aodbindn_fields(n)%name(m) = fldname write(lngname,'(a,i2)') 'Aerosol optical depth 550 nm, day night, bin ', m call addfld (aodbindn_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (history_aero_optics) then + if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -360,7 +363,7 @@ subroutine aerosol_optics_cam_init aoddustdn_fields(n)%name(m) = fldname write(lngname,'(a,i2,a)') 'Aerosol optical depth 550 nm, day night, bin ',m,' from dust' call addfld (aoddustdn_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (history_aero_optics) then + if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -428,6 +431,83 @@ subroutine aerosol_optics_cam_init call addfld ('SSAVISdn', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day night', & flag_xyfill=.true.) + if (history_amwg) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') + call add_default ('AODDUST' , 1, ' ') + call add_default ('AODVIS' , 1, ' ') + end if + + if (history_dust) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST02' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') + end if + + if (history_aero_optics) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') + call add_default ('ABSORB' , 1, ' ') + call add_default ('AOD01' , 1, ' ') + call add_default ('AOD02' , 1, ' ') + call add_default ('AOD03' , 1, ' ') + call add_default ('AODVIS' , 1, ' ') + call add_default ('AODUV' , 1, ' ') + call add_default ('AODNIR' , 1, ' ') + call add_default ('AODABS' , 1, ' ') + call add_default ('AODABSBC' , 1, ' ') + call add_default ('AODDUST' , 1, ' ') + call add_default ('AODSO4' , 1, ' ') + call add_default ('AODPOM' , 1, ' ') + call add_default ('AODSOA' , 1, ' ') + call add_default ('AODBC' , 1, ' ') + call add_default ('AODSS' , 1, ' ') + call add_default ('BURDEN01' , 1, ' ') + call add_default ('BURDEN02' , 1, ' ') + call add_default ('BURDEN03' , 1, ' ') + call add_default ('BURDENDUST' , 1, ' ') + call add_default ('BURDENSO4' , 1, ' ') + call add_default ('BURDENPOM' , 1, ' ') + call add_default ('BURDENSOA' , 1, ' ') + call add_default ('BURDENBC' , 1, ' ') + call add_default ('BURDENSEASALT', 1, ' ') + call add_default ('SSAVIS' , 1, ' ') + call add_default ('EXTINCT' , 1, ' ') + call add_default ('AODxASYM' , 1, ' ') + call add_default ('EXTxASYM' , 1, ' ') + + call add_default ('AODdnDUST01' , 1, ' ') + call add_default ('AODdnDUST03' , 1, ' ') + call add_default ('ABSORBdn' , 1, ' ') + call add_default ('AODdn01' , 1, ' ') + call add_default ('AODdn02' , 1, ' ') + call add_default ('AODdn03' , 1, ' ') + call add_default ('AODVISdn' , 1, ' ') + call add_default ('AODUVdn' , 1, ' ') + call add_default ('AODNIRdn' , 1, ' ') + call add_default ('AODABSdn' , 1, ' ') + call add_default ('AODABSBCdn' , 1, ' ') + call add_default ('AODDUSTdn' , 1, ' ') + call add_default ('AODSO4dn' , 1, ' ') + call add_default ('AODPOMdn' , 1, ' ') + call add_default ('AODSOAdn' , 1, ' ') + call add_default ('AODBCdn' , 1, ' ') + call add_default ('AODSSdn' , 1, ' ') + call add_default ('BURDENdn01' , 1, ' ') + call add_default ('BURDENdn02' , 1, ' ') + call add_default ('BURDENdn03' , 1, ' ') + call add_default ('BURDENDUSTdn' , 1, ' ') + call add_default ('BURDENSO4dn' , 1, ' ') + call add_default ('BURDENPOMdn' , 1, ' ') + call add_default ('BURDENSOAdn' , 1, ' ') + call add_default ('BURDENBCdn' , 1, ' ') + call add_default ('BURDENSEASALTdn', 1, ' ') + call add_default ('SSAVISdn' , 1, ' ') + call add_default ('EXTINCTdn' , 1, ' ') + call add_default ('AODxASYMdn' , 1, ' ') + call add_default ('EXTxASYMdn' , 1, ' ') + end if + end subroutine aerosol_optics_cam_init !=============================================================================== @@ -478,10 +558,10 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, real(r8) :: mass(pcols,pver) real(r8) :: air_density(pcols,pver) - real(r8), allocatable :: pext(:) - real(r8), allocatable :: pabs(:) - real(r8), allocatable :: palb(:) - real(r8), allocatable :: pasm(:) + real(r8), allocatable :: pext(:) ! parameterized specific extinction (m2/kg) + real(r8), allocatable :: pabs(:) ! parameterized specific absorption (m2/kg) + real(r8), allocatable :: palb(:) ! parameterized single scattering albedo + real(r8), allocatable :: pasm(:) ! parameterized asymmetry factor real(r8) :: relh(pcols,pver) real(r8) :: sate(pcols,pver) ! saturation vapor pressure @@ -730,6 +810,9 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, !=============================================================================== subroutine init_diags + + dustvol(:ncol) = 0._r8 + scatdust(:ncol) = 0._r8 absdust(:ncol) = 0._r8 hygrodust(:ncol) = 0._r8 @@ -1027,6 +1110,8 @@ subroutine output_tot_diags end do + call outfld('SSAVIS', ssavis, pcols, lchnk) + call outfld('AODxASYM', asymvis, pcols, lchnk) call outfld('BURDENDUST', burdendust, pcols, lchnk) From c07a0eddf64280a6386d29b964ef7389f6936d63 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 23 May 2023 15:39:42 -0600 Subject: [PATCH 04/61] tweak to default hist fields modified: src/physics/cam/aerosol_optics_cam.F90 --- src/physics/cam/aerosol_optics_cam.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index edcc5d478c..14065f2af9 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -250,7 +250,7 @@ subroutine aerosol_optics_cam_init call addfld ('TOTABSLW'//diag(ilist), (/ 'lev' /), 'A',' ', & 'LW Aero total abs') - if (history_aero_optics) then + if (ilist>0 .and. history_aero_optics) then call add_default ('EXTINCT'//diag(ilist), 1, ' ') call add_default ('ABSORB'//diag(ilist), 1, ' ') call add_default ('AODVIS'//diag(ilist), 1, ' ') From 2dddb1d99e4592c0acf8d478f1be7e256dc3df87 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 24 May 2023 11:11:20 -0600 Subject: [PATCH 05/61] use bin names for AOD diags; some cleanup modified: src/chemistry/aerosol/aerosol_properties_mod.F90 modified: src/chemistry/aerosol/modal_aerosol_properties_mod.F90 modified: src/physics/cam/aerosol_optics_cam.F90 --- .../aerosol/aerosol_properties_mod.F90 | 14 +++++ .../aerosol/modal_aerosol_properties_mod.F90 | 16 ++++++ src/physics/cam/aerosol_optics_cam.F90 | 54 ++++--------------- 3 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/chemistry/aerosol/aerosol_properties_mod.F90 b/src/chemistry/aerosol/aerosol_properties_mod.F90 index f68ae07a26..5514f09b17 100644 --- a/src/chemistry/aerosol/aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/aerosol_properties_mod.F90 @@ -69,6 +69,7 @@ module aerosol_properties_mod procedure(aero_soluble), deferred :: soluble procedure(aero_min_mass_mean_rad), deferred :: min_mass_mean_rad procedure(aero_optics_params), deferred :: optics_params + procedure(aero_bin_name), deferred :: bin_name procedure :: final=>aero_props_final end type aerosol_properties @@ -364,6 +365,19 @@ function aero_alogsig_rlist(self, list_ndx, bin_ndx) result(res) end function aero_alogsig_rlist + !------------------------------------------------------------------------------ + ! returns name for a given radiation list number and aerosol bin + !------------------------------------------------------------------------------ + function aero_bin_name(self, list_ndx, bin_ndx) result(name) + import :: aerosol_properties, r8 + class(aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + integer, intent(in) :: bin_ndx ! bin number + + character(len=32) name + + end function aero_bin_name + end interface contains diff --git a/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 b/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 index 8de1276097..e882a28601 100644 --- a/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 @@ -35,6 +35,8 @@ module modal_aerosol_properties_mod procedure :: alogsig_rlist procedure :: soluble procedure :: min_mass_mean_rad + procedure :: bin_name + final :: destructor end type modal_aerosol_properties @@ -624,4 +626,18 @@ function alogsig_rlist(self, list_ndx, bin_ndx) result(res) end function alogsig_rlist + !------------------------------------------------------------------------------ + ! returns name for a given radiation list number and aerosol bin + !------------------------------------------------------------------------------ + function bin_name(self, list_ndx, bin_ndx) result(name) + class(modal_aerosol_properties), intent(in) :: self + integer, intent(in) :: list_ndx ! radiation list number + integer, intent(in) :: bin_ndx ! bin number + + character(len=32) name + + call rad_cnst_get_info(list_ndx, bin_ndx, mode_type=name) + + end function bin_name + end module modal_aerosol_properties_mod diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 14065f2af9..81f8424461 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -127,7 +127,7 @@ subroutine aerosol_optics_cam_init real(r8) :: lwavlen_lo(nlwbands), lwavlen_hi(nlwbands) integer :: m, n - character(len=30) :: fldname + character(len=fieldname_len) :: fldname character(len=128) :: lngname logical :: history_aero_optics ! output aerosol optics diagnostics logical :: history_amwg ! output the variables used by the AMWG diag package @@ -167,7 +167,7 @@ subroutine aerosol_optics_cam_init aero_props(iaermod)%obj => modal_aerosol_properties() else if (carma_active) then iaermod = iaermod+1 -! aero_props(iaermod)%obj => carma_aerosol_properties() + !aero_props(iaermod)%obj => carma_aerosol_properties() end if if (water_refindex_file/='NONE') then @@ -327,11 +327,11 @@ subroutine aerosol_optics_cam_init call add_default (fldname, 1, ' ') end if - write(fldname,'(a,i2.2)') 'AOD', m + fldname = 'AOD_'//trim(aero_props(n)%obj%bin_name(0,m)) aodbin_fields(n)%name(m) = fldname - write(lngname,'(a,i2)') 'Aerosol optical depth, day only, 550 nm bin ', m + lngname = 'Aerosol optical depth, day only, 550 nm, '//trim(aero_props(n)%obj%bin_name(0,m)) call addfld (aodbin_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -351,11 +351,11 @@ subroutine aerosol_optics_cam_init call add_default (fldname, 1, ' ') end if - write(fldname,'(a,i2.2)') 'AODdn', m + fldname = 'AODdn_'//trim(aero_props(n)%obj%bin_name(0,m)) aodbindn_fields(n)%name(m) = fldname - write(lngname,'(a,i2)') 'Aerosol optical depth 550 nm, day night, bin ', m + lngname = 'Aerosol optical depth 550 nm, day night, '//trim(aero_props(n)%obj%bin_name(0,m)) call addfld (aodbindn_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -448,9 +448,6 @@ subroutine aerosol_optics_cam_init call add_default ('AODDUST01' , 1, ' ') call add_default ('AODDUST03' , 1, ' ') call add_default ('ABSORB' , 1, ' ') - call add_default ('AOD01' , 1, ' ') - call add_default ('AOD02' , 1, ' ') - call add_default ('AOD03' , 1, ' ') call add_default ('AODVIS' , 1, ' ') call add_default ('AODUV' , 1, ' ') call add_default ('AODNIR' , 1, ' ') @@ -479,9 +476,6 @@ subroutine aerosol_optics_cam_init call add_default ('AODdnDUST01' , 1, ' ') call add_default ('AODdnDUST03' , 1, ' ') call add_default ('ABSORBdn' , 1, ' ') - call add_default ('AODdn01' , 1, ' ') - call add_default ('AODdn02' , 1, ' ') - call add_default ('AODdn03' , 1, ' ') call add_default ('AODVISdn' , 1, ' ') call add_default ('AODUVdn' , 1, ' ') call add_default ('AODNIRdn' , 1, ' ') @@ -700,7 +694,7 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) else if (carma_active) then iaermod = iaermod+1 -! aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) + !aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) end if allocate(pext(ncol), stat=istat) @@ -739,16 +733,6 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, case('modal') ! refractive method aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, & ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) - case('hygroscopic_coreshell') - ! calculate relative humidity for table lookup into rh grid - call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) - relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) - relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) - !aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, & - ! ibin, ncol, pver, relh(:ncol,:)) - case('hygroscopic_wtp') - !aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, & - ! ibin, ncol, pver) case default call endrun(prefix//'optics method not recognized') end select @@ -810,9 +794,7 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, !=============================================================================== subroutine init_diags - - dustvol(:ncol) = 0._r8 - + dustvol(:ncol) = 0._r8 scatdust(:ncol) = 0._r8 absdust(:ncol) = 0._r8 hygrodust(:ncol) = 0._r8 @@ -1111,18 +1093,14 @@ subroutine output_tot_diags end do call outfld('SSAVIS', ssavis, pcols, lchnk) - call outfld('AODxASYM', asymvis, pcols, lchnk) - call outfld('BURDENDUST', burdendust, pcols, lchnk) call outfld('BURDENSO4' , burdenso4, pcols, lchnk) call outfld('BURDENPOM' , burdenpom, pcols, lchnk) call outfld('BURDENSOA' , burdensoa, pcols, lchnk) call outfld('BURDENBC' , burdenbc, pcols, lchnk) call outfld('BURDENSEASALT', burdenseasalt, pcols, lchnk) - call outfld('AODABSBC', aodabsbc, pcols, lchnk) - call outfld('AODDUST', dustaod, pcols, lchnk) call outfld('AODSO4', sulfaod, pcols, lchnk) call outfld('AODPOM', pomaod, pcols, lchnk) @@ -1190,7 +1168,7 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) else if (carma_active) then iaermod = iaermod+1 -! aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) + !aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) end if ncol = state%ncol @@ -1217,16 +1195,6 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) case('modal') ! refractive method aero_optics=>refractive_aerosol_optics(aeroprops, aerostate, list_idx, ibin, & ncol, pver, nswbands, nlwbands, crefwsw, crefwlw) - case('hygroscopic_coreshell') - ! calculate relative humidity for table lookup into rh grid - call qsat(state%t(:ncol,:), state%pmid(:ncol,:), sate(:ncol,:), satq(:ncol,:), ncol, pver) - relh(:ncol,:) = state%q(1:ncol,:,1) / satq(:ncol,:) - relh(:ncol,:) = max(1.e-20_r8,relh(:ncol,:)) - !aero_optics=>hygrocoreshell_aerosol_optics(aeroprops, aerostate, list_idx, & - ! ibin, ncol, pver, relh(:ncol,:)) - case('hygroscopic_wtp') - !aero_optics=>hygrowghtpct_aerosol_optics(aeroprops, aerostate, list_idx, & - ! ibin, ncol, pver) case default call endrun(prefix//'optics method not recognized') end select From 16a723f8657efbc79fca9a10d18077f70df6a33e Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 26 May 2023 12:20:36 -0600 Subject: [PATCH 06/61] fix cam4 phys issue modified: src/physics/cam/aer_rad_props.F90 --- src/physics/cam/aer_rad_props.F90 | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/physics/cam/aer_rad_props.F90 b/src/physics/cam/aer_rad_props.F90 index 5faca8beac..3d46fe9ba8 100644 --- a/src/physics/cam/aer_rad_props.F90 +++ b/src/physics/cam/aer_rad_props.F90 @@ -53,6 +53,7 @@ subroutine aer_rad_props_init() logical :: history_aero_optics ! Output aerosol optics diagnostics logical :: history_dust ! Output dust diagnostics logical :: prog_modal_aero ! Prognostic modal aerosols present + integer :: nmodes ! number of aerosol modes !---------------------------------------------------------------------------- @@ -77,7 +78,7 @@ subroutine aer_rad_props_init() ! get names of bulk aerosols allocate(aernames(numaerosols)) - call rad_cnst_get_info(0, aernames=aernames) + call rad_cnst_get_info(0, aernames=aernames, nmodes=nmodes) ! diagnostic output for bulk aerosols ! create outfld names for visible OD @@ -101,7 +102,9 @@ subroutine aer_rad_props_init() end do endif - call aerosol_optics_cam_init() + if (nmodes > 0) then + call aerosol_optics_cam_init() + end if deallocate(aernames) From deb1531e949a19091df43ec84c72dd704745021b Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 26 May 2023 16:14:53 -0600 Subject: [PATCH 07/61] use chem trop lev; correct hist flds in use cases modified: bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml modified: bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml modified: bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml modified: bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml modified: bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml modified: bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml modified: bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml modified: bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml modified: bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml modified: bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml modified: bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml modified: bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml modified: bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml modified: src/physics/cam/aerosol_optics_cam.F90 --- .../use_cases/2000_trop_strat_vbs_cam6.xml | 6 +++--- .../use_cases/2010_trop_strat_vbs_cam6.xml | 6 +++--- .../use_cases/hist_trop_strat_nudged_cam6.xml | 12 ++++++------ .../use_cases/hist_trop_strat_vbs_cam6.xml | 6 +++--- .../use_cases/hist_trop_strat_vbsext_cam6.xml | 6 +++--- .../use_cases/hist_trop_strat_vbsfire_cam6.xml | 6 +++--- bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml | 6 +++--- .../use_cases/sd_trop_strat_vbs_cam6.xml | 6 +++--- bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml | 4 ++-- .../use_cases/waccm_tsmlt_1850_cam6.xml | 4 ++-- .../use_cases/waccm_tsmlt_2000_cam6.xml | 4 ++-- .../use_cases/waccm_tsmlt_2010_cam6.xml | 4 ++-- .../use_cases/waccm_tsmlt_hist_cam6.xml | 4 ++-- src/physics/cam/aerosol_optics_cam.F90 | 4 ++-- 14 files changed, 39 insertions(+), 39 deletions(-) diff --git a/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml index d00387437c..d0be19e0c5 100644 --- a/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml @@ -148,7 +148,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -180,8 +180,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml index ebc15d2115..a2d0f1a09b 100644 --- a/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml @@ -339,7 +339,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -371,8 +371,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml index 2875336285..3f47604ad3 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml @@ -103,7 +103,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -135,8 +135,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', @@ -204,7 +204,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -238,8 +238,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml index 98309c552e..6e7f5a8ff2 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml @@ -46,7 +46,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -78,8 +78,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml index 8d8ff90bf9..a0e99f8716 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml @@ -46,7 +46,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'O3S', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'O3S', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -81,8 +81,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml index 896609e72a..b70abab514 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml @@ -87,7 +87,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -119,8 +119,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml b/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml index 8ef3f6903d..2cdbb5308f 100644 --- a/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml +++ b/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml @@ -51,7 +51,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -85,8 +85,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', diff --git a/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml index 10cf37265a..ff8134d80f 100644 --- a/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml @@ -61,7 +61,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -93,8 +93,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_accum', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_aitken', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml b/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml index 4c862f997c..0f2457752e 100644 --- a/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml +++ b/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml @@ -68,8 +68,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_accum', 'AODdn_aitken', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml index cf01e5431a..9cc9354021 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml @@ -66,8 +66,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF', 'NO2_CLXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_accum', 'AODdn_aitken', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml index 564cfaf660..4016a1c295 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml @@ -263,8 +263,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_accum', 'AODdn_aitken', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml index 70a9f99e37..27fa70f286 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml @@ -163,8 +163,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_accum', 'AODdn_aitken', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml index 12628e4412..1f53536617 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml @@ -59,8 +59,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_accum', 'AODdn_aitken', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 81f8424461..b8fb45846e 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -15,7 +15,7 @@ module aerosol_optics_cam use cam_history, only: addfld, add_default, outfld, horiz_only, fieldname_len use cam_history_support, only: fillvalue - use tropopause, only : tropopause_find + use tropopause, only : tropopause_findChemTrop use aerosol_properties_mod, only: aerosol_properties use modal_aerosol_properties_mod, only: modal_aerosol_properties @@ -641,7 +641,7 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, nullify(aero_optics) - call tropopause_find(state, troplev) + call tropopause_findChemTrop(state, troplev) lchnk = state%lchnk ncol = state%ncol From 9a1e1c5aa63dd75aa7a57331b37477b17a61cd5c Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 30 May 2023 10:24:48 -0600 Subject: [PATCH 08/61] hygroscopicity in pom phys prop file is suspect -- revert to hard-wired hygroscopicities modified: src/chemistry/aerosol/aerosol_properties_mod.F90 --- .../aerosol/aerosol_properties_mod.F90 | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/src/chemistry/aerosol/aerosol_properties_mod.F90 b/src/chemistry/aerosol/aerosol_properties_mod.F90 index 5514f09b17..7cddece92b 100644 --- a/src/chemistry/aerosol/aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/aerosol_properties_mod.F90 @@ -396,13 +396,12 @@ subroutine aero_props_init(self, nbin, ncnst, nspec, nmasses, alogsig, f1,f2, ie real(r8),intent(in) :: f2(nbin) ! eq 29 Abdul-Razzak et al 1998 integer,intent(out) :: ierr - integer :: imas,ibin,indx, ispc + integer :: imas,ibin,indx character(len=*),parameter :: prefix = 'aerosol_properties::aero_props_init: ' - real(r8) :: spechygro_so4 ! Sulfate hygroscopicity - real(r8) :: spechygro_soa ! SOA hygroscopicity - real(r8) :: spechygro_pom ! POM hygroscopicity - character(len=aero_name_len) :: spectype + real(r8), parameter :: spechygro_so4 = 0.507_r8 ! Sulfate hygroscopicity + real(r8), parameter :: spechygro_soa = 0.14_r8 ! SOA hygroscopicity + real(r8), parameter :: spechygro_pom = 0.1_r8 ! POM hygroscopicity ierr = 0 @@ -455,31 +454,8 @@ subroutine aero_props_init(self, nbin, ncnst, nspec, nmasses, alogsig, f1,f2, ie self%f1_(:) = f1(:) self%f2_(:) = f2(:) - spechygro_so4 = 0._r8 - spechygro_pom = 0._r8 - spechygro_soa = 0._r8 - - do ibin=1,nbin - do ispc = 1,nspec(ibin) - call self%species_type(ibin, ispc, spectype) - - select case ( trim(spectype) ) - case('sulfate') - call self%get(ibin, ispc, hygro=spechygro_so4) - case('p-organic') - call self%get(ibin, ispc, hygro=spechygro_pom) - case('s-organic') - call self%get(ibin, ispc, hygro=spechygro_soa) - end select - end do - end do - - if (spechygro_so4 > 0._r8 .and. spechygro_pom > 0._r8 .and. spechygro_soa > 0._r8) then - self%soa_equivso4_factor_ = spechygro_soa/spechygro_so4 - self%pom_equivso4_factor_ = spechygro_pom/spechygro_so4 - else - ierr = 99 - end if + self%soa_equivso4_factor_ = spechygro_soa/spechygro_so4 + self%pom_equivso4_factor_ = spechygro_pom/spechygro_so4 end subroutine aero_props_init From 0a098a58f6de833ae6a2d23fa23ac9f8a5748340 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 15 Jun 2023 15:54:32 -0600 Subject: [PATCH 09/61] add O3S to waccm_ma_mam5 --- src/chemistry/pp_waccm_ma_mam5/chem_mech.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mech.in b/src/chemistry/pp_waccm_ma_mam5/chem_mech.in index 9d69d3a4f2..c959a7b5d8 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mech.in +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mech.in @@ -81,6 +81,7 @@ O, O2, O3, + O3S -> O3, OCLO -> OClO, OCS -> OCS, pom_a1 -> C, @@ -222,6 +223,7 @@ O O2 O3 + O3S OCLO OCS pom_a1 From a90ebf51394212d09a2ae65bf38f8b485db621ec Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 21 Jun 2023 14:22:21 -0600 Subject: [PATCH 10/61] front_gaussian_wdith namelist param; set O3S_Loss rate; move O3S to explicit solver modified: bld/build-namelist modified: bld/namelist_files/namelist_defaults_cam.xml modified: bld/namelist_files/namelist_definition.xml modified: src/chemistry/pp_waccm_ma_mam5/chem_mech.doc modified: src/chemistry/pp_waccm_ma_mam5/chem_mech.in modified: src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 modified: src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 modified: src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 modified: src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 modified: src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 modified: src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 modified: src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 modified: src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 modified: src/physics/cam/gw_drag.F90 --- bld/build-namelist | 1 + bld/namelist_files/namelist_defaults_cam.xml | 5 + bld/namelist_files/namelist_definition.xml | 6 + src/chemistry/pp_waccm_ma_mam5/chem_mech.doc | 67 +- src/chemistry/pp_waccm_ma_mam5/chem_mech.in | 669 +++++++------- src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 | 4 +- src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 | 63 +- src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 | 7 +- .../pp_waccm_ma_mam5/mo_lin_matrix.F90 | 62 +- .../pp_waccm_ma_mam5/mo_nln_matrix.F90 | 854 +++++++++--------- .../pp_waccm_ma_mam5/mo_prod_loss.F90 | 473 +++++----- .../pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 | 290 +++--- src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 | 54 +- src/physics/cam/gw_drag.F90 | 62 +- 14 files changed, 1327 insertions(+), 1290 deletions(-) diff --git a/bld/build-namelist b/bld/build-namelist index 8e7ea8d2b2..aaf170c91b 100755 --- a/bld/build-namelist +++ b/bld/build-namelist @@ -3619,6 +3619,7 @@ if ($do_gw_front_igw) { if ($do_gw_front or $do_gw_front_igw) { add_default($nl, 'frontgfc'); + add_default($nl, 'front_gaussian_width'); } if ($do_gw_convect_dp) { diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index d69b278d90..5cfed4a1e2 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -686,6 +686,7 @@ 3.00D-15 7.5D-16 3.0D-15 + 30.D0 @@ -3136,6 +3137,10 @@ + + 'O3S_Loss = 2.0*O_O3 + O1D_H2O + HO2_O + HO2_O3 + OH_O + OH_O3 + H_O3 + 2.0*NO2_O + 2.0*jno3_b + 2.0*CLO_O + 2.0*jcl2o2 + ', + '2.0*CLO_CLOa + 2.0*CLO_CLOb + 2.0*BRO_CLOb + 2.0*BRO_CLOc + 2.0*BRO_BRO + 2.0*BRO_O + CLO_HO2 + BRO_HO2 + S_O3' + 'O3_Prod = NO_HO2 + CH3O2_NO + HOCH2OO_NO + C2H5O2_NO + CH3CO3_NO + EO2_NO + C3H7O2_NO + PO2_NO + ', 'RO2_NO + ENEO2_NO + MACRO2_NOa + jhonitr + ', diff --git a/bld/namelist_files/namelist_definition.xml b/bld/namelist_files/namelist_definition.xml index 5698285ef2..944d37c553 100644 --- a/bld/namelist_files/namelist_definition.xml +++ b/bld/namelist_files/namelist_definition.xml @@ -1411,6 +1411,12 @@ Frontogenesis function critical threshold. Default: set by build-namelist. + +Width of gaussian used to create frontogenesis tau profile [m/s]. +Default: set by build-namelist. + + Full pathname of Beres lookup table data file for gravity waves sourced diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc b/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc index 9a7379e5b2..5712d4ca8a 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mech.doc @@ -72,37 +72,38 @@ ( 69) O ( 70) O2 ( 71) O3 - ( 72) OCLO (OClO) - ( 73) OCS (OCS) - ( 74) pom_a1 (C) - ( 75) pom_a4 (C) - ( 76) S (S) - ( 77) SF6 - ( 78) SO (SO) - ( 79) SO2 - ( 80) SO3 (SO3) - ( 81) so4_a1 (NH4HSO4) - ( 82) so4_a2 (NH4HSO4) - ( 83) so4_a3 (NH4HSO4) - ( 84) so4_a5 (NH4HSO4) - ( 85) soa_a1 (C) - ( 86) soa_a2 (C) - ( 87) SOAG (C) - ( 88) e (E) - ( 89) HO2 - ( 90) N2D (N) - ( 91) N2p (N2) - ( 92) NOp (NO) - ( 93) Np (N) - ( 94) O1D (O) - ( 95) O2_1D (O2) - ( 96) O2_1S (O2) - ( 97) O2p (O2) - ( 98) OH - ( 99) Op (O) - (100) Op2D (O) - (101) Op2P (O) - (102) H2O + ( 72) O3S (O3) + ( 73) OCLO (OClO) + ( 74) OCS (OCS) + ( 75) pom_a1 (C) + ( 76) pom_a4 (C) + ( 77) S (S) + ( 78) SF6 + ( 79) SO (SO) + ( 80) SO2 + ( 81) SO3 (SO3) + ( 82) so4_a1 (NH4HSO4) + ( 83) so4_a2 (NH4HSO4) + ( 84) so4_a3 (NH4HSO4) + ( 85) so4_a5 (NH4HSO4) + ( 86) soa_a1 (C) + ( 87) soa_a2 (C) + ( 88) SOAG (C) + ( 89) e (E) + ( 90) HO2 + ( 91) N2D (N) + ( 92) N2p (N2) + ( 93) NOp (NO) + ( 94) Np (N) + ( 95) O1D (O) + ( 96) O2_1D (O2) + ( 97) O2_1S (O2) + ( 98) O2p (O2) + ( 99) OH + (100) Op (O) + (101) Op2D (O) + (102) Op2P (O) + (103) H2O Invariant species @@ -116,6 +117,9 @@ Class List ========== + Explicit + -------- + ( 1) O3S Implicit -------- @@ -762,6 +766,7 @@ Extraneous prod/loss species d(O3)/dt = r19*M*O*O2 - j7*O3 - j8*O3 - r8*O1D*O3 - r17*O*O3 - r27*HO2*O3 - r28*H*O3 - r33*OH*O3 - r46*NO2*O3 - r54*NO*O3 - r70*CL*O3 - r102*BR*O3 - r161*S*O3 - r167*SO*O3 + d(O3S)/dt = 0 d(OCLO)/dt = r74*CLO*CLO + r104*BRO*CLO - j59*OCLO - r168*SO*OCLO d(OCS)/dt = - j88*OCS - r157*O*OCS - r158*OH*OCS diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mech.in b/src/chemistry/pp_waccm_ma_mam5/chem_mech.in index c959a7b5d8..8443364166 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mech.in +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mech.in @@ -148,7 +148,7 @@ Solution classes Explicit - + O3S End Explicit Implicit @@ -223,7 +223,6 @@ O O2 O3 - O3S OCLO OCS pom_a1 @@ -265,398 +264,398 @@ ********************************* *** odd-oxygen ********************************* -[jh2o_b] H2O + hv -> H2 + O1D -[jh2o_c] H2O + hv -> 2*H + O -[jh2o_a] H2O + hv -> OH + H -[jh2o2] H2O2 + hv -> 2*OH -[jo2_b=userdefined,] O2 + hv -> 2*O -[jo2_a=userdefined,] O2 + hv -> O + O1D -[jo3_a] O3 + hv -> O1D + O2_1D -[jo3_b] O3 + hv -> O + O2 +[jh2o_b] H2O + hv -> H2 + O1D +[jh2o_c] H2O + hv -> 2*H + O +[jh2o_a] H2O + hv -> OH + H +[jh2o2] H2O2 + hv -> 2*OH +[jo2_b=userdefined,] O2 + hv -> 2*O +[jo2_a=userdefined,] O2 + hv -> O + O1D +[jo3_a] O3 + hv -> O1D + O2_1D +[jo3_b] O3 + hv -> O + O2 ********************************* *** odd-nitrogen ********************************* -[jhno3] HNO3 + hv -> NO2 + OH -[jho2no2_a] HO2NO2 + hv -> OH + NO3 -[jho2no2_b] HO2NO2 + hv -> NO2 + HO2 -[jn2o] N2O + hv -> O1D + N2 -[jn2o5_a] N2O5 + hv -> NO2 + NO3 -[jn2o5_b] N2O5 + hv -> NO + O + NO3 -[jno=userdefined,] NO + hv -> N + O -[jno_i] NO + hv -> NOp + e -[jno2] NO2 + hv -> NO + O -[jno3_a] NO3 + hv -> NO2 + O -[jno3_b] NO3 + hv -> NO + O2 +[jhno3] HNO3 + hv -> NO2 + OH +[jho2no2_a] HO2NO2 + hv -> OH + NO3 +[jho2no2_b] HO2NO2 + hv -> NO2 + HO2 +[jn2o] N2O + hv -> O1D + N2 +[jn2o5_a] N2O5 + hv -> NO2 + NO3 +[jn2o5_b] N2O5 + hv -> NO + O + NO3 +[jno=userdefined,] NO + hv -> N + O +[jno_i] NO + hv -> NOp + e +[jno2] NO2 + hv -> NO + O +[jno3_a] NO3 + hv -> NO2 + O +[jno3_b] NO3 + hv -> NO + O2 ********************************* *** organics ********************************* -[jch2o_a] CH2O + hv -> CO + 2*H -[jch2o_b] CH2O + hv -> CO + H2 -[jch3ooh] CH3OOH + hv -> CH2O + H + OH -[jch4_a] CH4 + hv -> H + CH3O2 -[jch4_b] CH4 + hv -> 1.44*H2 + 0.18*CH2O + 0.18*O + 0.33*OH + 0.33*H + 0.44*CO2 + 0.38*CO + 0.05*H2O -[jco2] CO2 + hv -> CO + O +[jch2o_a] CH2O + hv -> CO + 2*H +[jch2o_b] CH2O + hv -> CO + H2 +[jch3ooh] CH3OOH + hv -> CH2O + H + OH +[jch4_a] CH4 + hv -> H + CH3O2 +[jch4_b] CH4 + hv -> 1.44*H2 + 0.18*CH2O + 0.18*O + 0.33*OH + 0.33*H + 0.44*CO2 + 0.38*CO + 0.05*H2O +[jco2] CO2 + hv -> CO + O ********************************* *** halogens ********************************* -[jbrcl] BRCL + hv -> BR + CL -[jbro] BRO + hv -> BR + O -[jbrono2_b] BRONO2 + hv -> BRO + NO2 -[jbrono2_a] BRONO2 + hv -> BR + NO3 -[jccl4] CCL4 + hv -> 4*CL -[jcf2clbr] CF2CLBR + hv -> BR + CL + COF2 -[jcf3br] CF3BR + hv -> BR + F + COF2 -[jcfcl3] CFC11 + hv -> 2*CL + COFCL -[jcfc113] CFC113 + hv -> 2*CL + COFCL + COF2 -[jcfc114] CFC114 + hv -> 2*CL + 2*COF2 -[jcfc115] CFC115 + hv -> CL + F + 2*COF2 -[jcf2cl2] CFC12 + hv -> 2*CL + COF2 -[jch2br2] CH2BR2 + hv -> 2*BR -[jch3br] CH3BR + hv -> BR + CH3O2 -[jch3ccl3] CH3CCL3 + hv -> 3*CL -[jch3cl] CH3CL + hv -> CL + CH3O2 -[jchbr3] CHBR3 + hv -> 3*BR -[jcl2] CL2 + hv -> 2*CL -[jcl2o2] CL2O2 + hv -> 2*CL -[jclo] CLO + hv -> CL + O -[jclono2_a] CLONO2 + hv -> CL + NO3 -[jclono2_b] CLONO2 + hv -> CLO + NO2 -[jcof2] COF2 + hv -> 2*F -[jcofcl] COFCL + hv -> F + CL -[jh2402] H2402 + hv -> 2*BR + 2*COF2 -[jhbr] HBR + hv -> BR + H -[jhcfc141b] HCFC141B + hv -> CL + COFCL -[jhcfc142b] HCFC142B + hv -> CL + COF2 -[jhcfc22] HCFC22 + hv -> CL + COF2 -[jhcl] HCL + hv -> H + CL -[jhf] HF + hv -> H + F -[jhobr] HOBR + hv -> BR + OH -[jhocl] HOCL + hv -> OH + CL -[joclo] OCLO + hv -> O + CLO -[jsf6] SF6 + hv -> sink +[jbrcl] BRCL + hv -> BR + CL +[jbro] BRO + hv -> BR + O +[jbrono2_b] BRONO2 + hv -> BRO + NO2 +[jbrono2_a] BRONO2 + hv -> BR + NO3 +[jccl4] CCL4 + hv -> 4*CL +[jcf2clbr] CF2CLBR + hv -> BR + CL + COF2 +[jcf3br] CF3BR + hv -> BR + F + COF2 +[jcfcl3] CFC11 + hv -> 2*CL + COFCL +[jcfc113] CFC113 + hv -> 2*CL + COFCL + COF2 +[jcfc114] CFC114 + hv -> 2*CL + 2*COF2 +[jcfc115] CFC115 + hv -> CL + F + 2*COF2 +[jcf2cl2] CFC12 + hv -> 2*CL + COF2 +[jch2br2] CH2BR2 + hv -> 2*BR +[jch3br] CH3BR + hv -> BR + CH3O2 +[jch3ccl3] CH3CCL3 + hv -> 3*CL +[jch3cl] CH3CL + hv -> CL + CH3O2 +[jchbr3] CHBR3 + hv -> 3*BR +[jcl2] CL2 + hv -> 2*CL +[jcl2o2] CL2O2 + hv -> 2*CL +[jclo] CLO + hv -> CL + O +[jclono2_a] CLONO2 + hv -> CL + NO3 +[jclono2_b] CLONO2 + hv -> CLO + NO2 +[jcof2] COF2 + hv -> 2*F +[jcofcl] COFCL + hv -> F + CL +[jh2402] H2402 + hv -> 2*BR + 2*COF2 +[jhbr] HBR + hv -> BR + H +[jhcfc141b] HCFC141B + hv -> CL + COFCL +[jhcfc142b] HCFC142B + hv -> CL + COF2 +[jhcfc22] HCFC22 + hv -> CL + COF2 +[jhcl] HCL + hv -> H + CL +[jhf] HF + hv -> H + F +[jhobr] HOBR + hv -> BR + OH +[jhocl] HOCL + hv -> OH + CL +[joclo] OCLO + hv -> O + CLO +[jsf6] SF6 + hv -> sink ********************************* *** ions ********************************* -[jeuv_26=userdefined,userdefined] CO2 + hv -> CO + O -[jeuv_4=userdefined,userdefined] N + hv -> Np + e -[jeuv_6=userdefined,userdefined] N2 + hv -> N2p + e -[jeuv_22=userdefined,userdefined] N2 + hv -> N + Np + e -[jeuv_23=userdefined,userdefined] N2 + hv -> N2D + Np + e -[jeuv_25=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N -[jeuv_18=userdefined,userdefined] N2 + hv -> N2p + e -[jeuv_13=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N -[jeuv_11=userdefined,userdefined] N2 + hv -> N2D + Np + e -[jeuv_10=userdefined,userdefined] N2 + hv -> N + Np + e -[jeuv_3=userdefined,userdefined] O + hv -> Op2P + e -[jeuv_16=userdefined,userdefined] O + hv -> Op2P + e -[jeuv_1=userdefined,userdefined] O + hv -> Op + e -[jeuv_14=userdefined,userdefined] O + hv -> Op + e -[jeuv_2=userdefined,userdefined] O + hv -> Op2D + e -[jeuv_15=userdefined,userdefined] O + hv -> Op2D + e -[jeuv_21=userdefined,userdefined] O2 + hv -> O + Op2P + e -[jeuv_17=userdefined,userdefined] O2 + hv -> O2p + e -[jeuv_7=userdefined,userdefined] O2 + hv -> O + Op + e -[jeuv_5=userdefined,userdefined] O2 + hv -> O2p + e -[jeuv_19=userdefined,userdefined] O2 + hv -> O + Op + e -[jeuv_24=userdefined,userdefined] O2 + hv -> 2*O -[jeuv_12=userdefined,userdefined] O2 + hv -> 2*O -[jeuv_9=userdefined,userdefined] O2 + hv -> O + Op2P + e -[jeuv_8=userdefined,userdefined] O2 + hv -> O + Op2D + e -[jeuv_20=userdefined,userdefined] O2 + hv -> O + Op2D + e +[jeuv_26=userdefined,userdefined] CO2 + hv -> CO + O +[jeuv_4=userdefined,userdefined] N + hv -> Np + e +[jeuv_6=userdefined,userdefined] N2 + hv -> N2p + e +[jeuv_22=userdefined,userdefined] N2 + hv -> N + Np + e +[jeuv_23=userdefined,userdefined] N2 + hv -> N2D + Np + e +[jeuv_25=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N +[jeuv_18=userdefined,userdefined] N2 + hv -> N2p + e +[jeuv_13=userdefined,userdefined] N2 + hv -> 1.2*N2D + 0.8*N +[jeuv_11=userdefined,userdefined] N2 + hv -> N2D + Np + e +[jeuv_10=userdefined,userdefined] N2 + hv -> N + Np + e +[jeuv_3=userdefined,userdefined] O + hv -> Op2P + e +[jeuv_16=userdefined,userdefined] O + hv -> Op2P + e +[jeuv_1=userdefined,userdefined] O + hv -> Op + e +[jeuv_14=userdefined,userdefined] O + hv -> Op + e +[jeuv_2=userdefined,userdefined] O + hv -> Op2D + e +[jeuv_15=userdefined,userdefined] O + hv -> Op2D + e +[jeuv_21=userdefined,userdefined] O2 + hv -> O + Op2P + e +[jeuv_17=userdefined,userdefined] O2 + hv -> O2p + e +[jeuv_7=userdefined,userdefined] O2 + hv -> O + Op + e +[jeuv_5=userdefined,userdefined] O2 + hv -> O2p + e +[jeuv_19=userdefined,userdefined] O2 + hv -> O + Op + e +[jeuv_24=userdefined,userdefined] O2 + hv -> 2*O +[jeuv_12=userdefined,userdefined] O2 + hv -> 2*O +[jeuv_9=userdefined,userdefined] O2 + hv -> O + Op2P + e +[jeuv_8=userdefined,userdefined] O2 + hv -> O + Op2D + e +[jeuv_20=userdefined,userdefined] O2 + hv -> O + Op2D + e ********************************* *** sulfur ********************************* -[jh2so4] H2SO4 + hv -> SO3 + H2O -[jocs] OCS + hv -> S + CO -[jso] SO + hv -> S + O -[jso2] SO2 + hv -> SO + O -[jso3] SO3 + hv -> SO2 + O +[jh2so4] H2SO4 + hv -> SO3 + H2O +[jocs] OCS + hv -> S + CO +[jso] SO + hv -> S + O +[jso2] SO2 + hv -> SO + O +[jso3] SO3 + hv -> SO2 + O End Photolysis Reactions ********************************* *** odd-oxygen ********************************* -[ag1] O2_1D -> O2 ; 0.000258 -[ag2] O2_1S -> O2 ; 0.085 -[O1D_H2] O1D + H2 -> H + OH ; 1.2e-10 -[O1D_H2O] O1D + H2O -> 2*OH ; 1.63e-10, 60 -[O1D_N2,cph=189.81] O1D + N2 -> O + N2 ; 2.15e-11, 110 -[O1D_O2,cph=32.91] O1D + O2 -> O + O2_1S ; 2.64e-11, 55 -[O1D_O2b,cph=189.81] O1D + O2 -> O + O2 ; 6.6e-12, 55 -[O1D_O3] O1D + O3 -> O2 + O2 ; 1.2e-10 -[O2_1D_N2,cph=94.3] O2_1D + N2 -> O2 + N2 ; 1e-20 -[O2_1D_O,cph=94.3] O2_1D + O -> O2 + O ; 1.3e-16 -[O2_1D_O2,cph=94.3] O2_1D + O2 -> 2*O2 ; 3.6e-18, -220 -[O2_1S_CO2] O2_1S + CO2 -> O2_1D + CO2 ; 4.2e-13 -[O2_1S_N2,cph=62.6] O2_1S + N2 -> O2_1D + N2 ; 1.8e-15, 45 -[O2_1S_O,cph=62.6] O2_1S + O -> O2_1D + O ; 8e-14 -[O2_1S_O2,cph=62.6] O2_1S + O2 -> O2_1D + O2 ; 3.9e-17 -[O2_1S_O3,cph=62.6] O2_1S + O3 -> O2_1D + O3 ; 3.5e-11, -135 -[O_O3,cph=392.19] O + O3 -> 2*O2 ; 8e-12, -2060 -[usr_O_O,cph=493.58] O + O + M -> O2 + M -[usr_O_O2,cph=101.39] O + O2 + M -> O3 + M +[ag1] O2_1D -> O2 ; 0.000258 +[ag2] O2_1S -> O2 ; 0.085 +[O1D_H2] O1D + H2 -> H + OH ; 1.2e-10 +[O1D_H2O] O1D + H2O -> 2*OH ; 1.63e-10, 60 +[O1D_N2,cph=189.81] O1D + N2 -> O + N2 ; 2.15e-11, 110 +[O1D_O2,cph=32.91] O1D + O2 -> O + O2_1S ; 2.64e-11, 55 +[O1D_O2b,cph=189.81] O1D + O2 -> O + O2 ; 6.6e-12, 55 +[O1D_O3] O1D + O3 -> O2 + O2 ; 1.2e-10 +[O2_1D_N2,cph=94.3] O2_1D + N2 -> O2 + N2 ; 1e-20 +[O2_1D_O,cph=94.3] O2_1D + O -> O2 + O ; 1.3e-16 +[O2_1D_O2,cph=94.3] O2_1D + O2 -> 2*O2 ; 3.6e-18, -220 +[O2_1S_CO2] O2_1S + CO2 -> O2_1D + CO2 ; 4.2e-13 +[O2_1S_N2,cph=62.6] O2_1S + N2 -> O2_1D + N2 ; 1.8e-15, 45 +[O2_1S_O,cph=62.6] O2_1S + O -> O2_1D + O ; 8e-14 +[O2_1S_O2,cph=62.6] O2_1S + O2 -> O2_1D + O2 ; 3.9e-17 +[O2_1S_O3,cph=62.6] O2_1S + O3 -> O2_1D + O3 ; 3.5e-11, -135 +[O_O3,cph=392.19] O + O3 -> 2*O2 ; 8e-12, -2060 +[usr_O_O,cph=493.58] O + O + M -> O2 + M +[usr_O_O2,cph=101.39] O + O2 + M -> O3 + M ********************************* *** odd-hydrogen ********************************* -[H2_O] H2 + O -> OH + H ; 1.6e-11, -4570 -[H2O2_O] H2O2 + O -> OH + HO2 ; 1.4e-12, -2000 -[H_HO2,cph=232.59] H + HO2 -> H2 + O2 ; 6.9e-12 -[H_HO2a] H + HO2 -> 2*OH ; 7.2e-11 -[H_HO2b] H + HO2 -> H2O + O ; 1.6e-12 -[H_O2,cph=203.4] H + O2 + M -> HO2 + M ; 5.3e-32, 1.8, 9.5e-11, -0.4, 0.6 -[HO2_O,cph=226.58] HO2 + O -> OH + O2 ; 3e-11, 200 -[HO2_O3,cph=120.1] HO2 + O3 -> OH + 2*O2 ; 1e-14, -490 -[H_O3,cph=194.71] H + O3 -> OH + O2 ; 1.4e-10, -470 -[OH_H2] OH + H2 -> H2O + H ; 2.8e-12, -1800 -[OH_H2O2] OH + H2O2 -> H2O + HO2 ; 1.8e-12 -[OH_HO2,cph=293.62] OH + HO2 -> H2O + O2 ; 4.8e-11, 250 -[OH_O,cph=67.67] OH + O -> H + O2 ; 1.8e-11, 180 -[OH_O3,cph=165.3] OH + O3 -> HO2 + O2 ; 1.7e-12, -940 -[OH_OH] OH + OH -> H2O + O ; 1.8e-12 -[OH_OH_M] OH + OH + M -> H2O2 + M ; 6.9e-31, 1, 2.6e-11, 0, 0.6 -[usr_HO2_HO2,cph=165.51] HO2 + HO2 -> H2O2 + O2 +[H2_O] H2 + O -> OH + H ; 1.6e-11, -4570 +[H2O2_O] H2O2 + O -> OH + HO2 ; 1.4e-12, -2000 +[H_HO2,cph=232.59] H + HO2 -> H2 + O2 ; 6.9e-12 +[H_HO2a] H + HO2 -> 2*OH ; 7.2e-11 +[H_HO2b] H + HO2 -> H2O + O ; 1.6e-12 +[H_O2,cph=203.4] H + O2 + M -> HO2 + M ; 5.3e-32, 1.8, 9.5e-11, -0.4, 0.6 +[HO2_O,cph=226.58] HO2 + O -> OH + O2 ; 3e-11, 200 +[HO2_O3,cph=120.1] HO2 + O3 -> OH + 2*O2 ; 1e-14, -490 +[H_O3,cph=194.71] H + O3 -> OH + O2 ; 1.4e-10, -470 +[OH_H2] OH + H2 -> H2O + H ; 2.8e-12, -1800 +[OH_H2O2] OH + H2O2 -> H2O + HO2 ; 1.8e-12 +[OH_HO2,cph=293.62] OH + HO2 -> H2O + O2 ; 4.8e-11, 250 +[OH_O,cph=67.67] OH + O -> H + O2 ; 1.8e-11, 180 +[OH_O3,cph=165.3] OH + O3 -> HO2 + O2 ; 1.7e-12, -940 +[OH_OH] OH + OH -> H2O + O ; 1.8e-12 +[OH_OH_M] OH + OH + M -> H2O2 + M ; 6.9e-31, 1, 2.6e-11, 0, 0.6 +[usr_HO2_HO2,cph=165.51] HO2 + HO2 -> H2O2 + O2 ********************************* *** odd-nitrogen ********************************* -[HO2NO2_OH] HO2NO2 + OH -> H2O + NO2 + O2 ; 4.5e-13, 610 -[N2D_O,cph=229.61] N2D + O -> N + O ; 7e-13 -[N2D_O2,cph=177.51] N2D + O2 -> NO + O1D ; 5e-12 -[N_NO,cph=313.75] N + NO -> N2 + O ; 2.1e-11, 100 -[N_NO2a] N + NO2 -> N2O + O ; 2.9e-12, 220 -[N_NO2b] N + NO2 -> 2*NO ; 1.45e-12, 220 -[N_NO2c] N + NO2 -> N2 + O2 ; 1.45e-12, 220 -[N_O2,cph=133.75] N + O2 -> NO + O ; 3.3e-12, -3150 -[NO2_O,cph=193.02] NO2 + O -> NO + O2 ; 5.1e-12, 210 -[NO2_O3] NO2 + O3 -> NO3 + O2 ; 1.2e-13, -2450 -[NO2_O_M] NO2 + O + M -> NO3 + M ; 2.5e-31, 1.8, 2.2e-11, 0.7, 0.6 -[NO3_HO2] NO3 + HO2 -> OH + NO2 + O2 ; 3.5e-12 -[NO3_NO] NO3 + NO -> 2*NO2 ; 1.7e-11, 125 -[NO3_O] NO3 + O -> NO2 + O2 ; 1.3e-11 -[NO3_OH] NO3 + OH -> HO2 + NO2 ; 2.2e-11 -[N_OH] N + OH -> NO + H ; 5e-11 -[NO_HO2,cph=34.47] NO + HO2 -> NO2 + OH ; 3.44e-12, 260 -[NO_O3,cph=199.17] NO + O3 -> NO2 + O2 ; 3e-12, -1500 -[NO_O_M] NO + O + M -> NO2 + M ; 9e-32, 1.5, 3e-11, 0, 0.6 -[O1D_N2Oa] O1D + N2O -> 2*NO ; 7.26e-11, 20 -[O1D_N2Ob] O1D + N2O -> N2 + O2 ; 4.64e-11, 20 -[tag_NO2_HO2] NO2 + HO2 + M -> HO2NO2 + M ; 1.9e-31, 3.4, 4e-12, 0.3, 0.6 -[tag_NO2_NO3] NO2 + NO3 + M -> N2O5 + M ; 2.4e-30, 3, 1.6e-12, -0.1, 0.6 -[tag_NO2_OH] NO2 + OH + M -> HNO3 + M ; 1.8e-30, 3, 2.8e-11, 0, 0.6 -[usr_HNO3_OH] HNO3 + OH -> NO3 + H2O -[usr_HO2NO2_M] HO2NO2 + M -> HO2 + NO2 + M -[usr_N2O5_M] N2O5 + M -> NO2 + NO3 + M +[HO2NO2_OH] HO2NO2 + OH -> H2O + NO2 + O2 ; 4.5e-13, 610 +[N2D_O,cph=229.61] N2D + O -> N + O ; 7e-13 +[N2D_O2,cph=177.51] N2D + O2 -> NO + O1D ; 5e-12 +[N_NO,cph=313.75] N + NO -> N2 + O ; 2.1e-11, 100 +[N_NO2a] N + NO2 -> N2O + O ; 2.9e-12, 220 +[N_NO2b] N + NO2 -> 2*NO ; 1.45e-12, 220 +[N_NO2c] N + NO2 -> N2 + O2 ; 1.45e-12, 220 +[N_O2,cph=133.75] N + O2 -> NO + O ; 3.3e-12, -3150 +[NO2_O,cph=193.02] NO2 + O -> NO + O2 ; 5.1e-12, 210 +[NO2_O3] NO2 + O3 -> NO3 + O2 ; 1.2e-13, -2450 +[NO2_O_M] NO2 + O + M -> NO3 + M ; 2.5e-31, 1.8, 2.2e-11, 0.7, 0.6 +[NO3_HO2] NO3 + HO2 -> OH + NO2 + O2 ; 3.5e-12 +[NO3_NO] NO3 + NO -> 2*NO2 ; 1.7e-11, 125 +[NO3_O] NO3 + O -> NO2 + O2 ; 1.3e-11 +[NO3_OH] NO3 + OH -> HO2 + NO2 ; 2.2e-11 +[N_OH] N + OH -> NO + H ; 5e-11 +[NO_HO2,cph=34.47] NO + HO2 -> NO2 + OH ; 3.44e-12, 260 +[NO_O3,cph=199.17] NO + O3 -> NO2 + O2 ; 3e-12, -1500 +[NO_O_M] NO + O + M -> NO2 + M ; 9e-32, 1.5, 3e-11, 0, 0.6 +[O1D_N2Oa] O1D + N2O -> 2*NO ; 7.26e-11, 20 +[O1D_N2Ob] O1D + N2O -> N2 + O2 ; 4.64e-11, 20 +[tag_NO2_HO2] NO2 + HO2 + M -> HO2NO2 + M ; 1.9e-31, 3.4, 4e-12, 0.3, 0.6 +[tag_NO2_NO3] NO2 + NO3 + M -> N2O5 + M ; 2.4e-30, 3, 1.6e-12, -0.1, 0.6 +[tag_NO2_OH] NO2 + OH + M -> HNO3 + M ; 1.8e-30, 3, 2.8e-11, 0, 0.6 +[usr_HNO3_OH] HNO3 + OH -> NO3 + H2O +[usr_HO2NO2_M] HO2NO2 + M -> HO2 + NO2 + M +[usr_N2O5_M] N2O5 + M -> NO2 + NO3 + M ********************************* *** odd-chlorine ********************************* -[CL_CH2O] CL + CH2O -> HCL + HO2 + CO ; 8.1e-11, -30 -[CL_CH4] CL + CH4 -> CH3O2 + HCL ; 7.1e-12, -1270 -[CL_H2] CL + H2 -> HCL + H ; 3.05e-11, -2270 -[CL_H2O2] CL + H2O2 -> HCL + HO2 ; 1.1e-11, -980 -[CL_HO2a] CL + HO2 -> HCL + O2 ; 1.4e-11, 270 -[CL_HO2b] CL + HO2 -> OH + CLO ; 3.6e-11, -375 -[CL_O3] CL + O3 -> CLO + O2 ; 2.3e-11, -200 -[CLO_CH3O2] CLO + CH3O2 -> CL + HO2 + CH2O ; 3.3e-12, -115 -[CLO_CLOa] CLO + CLO -> 2*CL + O2 ; 3e-11, -2450 -[CLO_CLOb] CLO + CLO -> CL2 + O2 ; 1e-12, -1590 -[CLO_CLOc] CLO + CLO -> CL + OCLO ; 3.5e-13, -1370 -[CLO_HO2] CLO + HO2 -> O2 + HOCL ; 2.6e-12, 290 -[CLO_NO] CLO + NO -> NO2 + CL ; 6.4e-12, 290 -[CLONO2_CL] CLONO2 + CL -> CL2 + NO3 ; 6.5e-12, 135 -[CLO_NO2_M] CLO + NO2 + M -> CLONO2 + M ; 1.8e-31, 3.4, 1.5e-11, 1.9, 0.6 -[CLONO2_O] CLONO2 + O -> CLO + NO3 ; 3.6e-12, -840 -[CLONO2_OH] CLONO2 + OH -> HOCL + NO3 ; 1.2e-12, -330 -[CLO_O] CLO + O -> CL + O2 ; 2.8e-11, 85 -[CLO_OHa] CLO + OH -> CL + HO2 ; 7.4e-12, 270 -[CLO_OHb] CLO + OH -> HCL + O2 ; 6e-13, 230 -[HCL_O] HCL + O -> CL + OH ; 1e-11, -3300 -[HCL_OH] HCL + OH -> H2O + CL ; 1.8e-12, -250 -[HOCL_CL] HOCL + CL -> HCL + CLO ; 3.4e-12, -130 -[HOCL_O] HOCL + O -> CLO + OH ; 1.7e-13 -[HOCL_OH] HOCL + OH -> H2O + CLO ; 3e-12, -500 -[O1D_CCL4] O1D + CCL4 -> 4*CL ; 2.607e-10 -[O1D_CF2CLBR] O1D + CF2CLBR -> CL + BR + COF2 ; 9.75e-11 -[O1D_CFC11] O1D + CFC11 -> 2*CL + COFCL ; 2.07e-10 -[O1D_CFC113] O1D + CFC113 -> 2*CL + COFCL + COF2 ; 2.088e-10 -[O1D_CFC114] O1D + CFC114 -> 2*CL + 2*COF2 ; 1.17e-10 -[O1D_CFC115] O1D + CFC115 -> CL + F + 2*COF2 ; 4.644e-11 -[O1D_CFC12] O1D + CFC12 -> 2*CL + COF2 ; 1.204e-10 -[O1D_HCLa] O1D + HCL -> CL + OH ; 9.9e-11 -[O1D_HCLb] O1D + HCL -> CLO + H ; 3.3e-12 -[tag_CLO_CLO_M] CLO + CLO + M -> CL2O2 + M ; 1.9e-32, 3.6, 3.7e-12, 1.6, 0.6 -[usr_CL2O2_M] CL2O2 + M -> CLO + CLO + M +[CL_CH2O] CL + CH2O -> HCL + HO2 + CO ; 8.1e-11, -30 +[CL_CH4] CL + CH4 -> CH3O2 + HCL ; 7.1e-12, -1270 +[CL_H2] CL + H2 -> HCL + H ; 3.05e-11, -2270 +[CL_H2O2] CL + H2O2 -> HCL + HO2 ; 1.1e-11, -980 +[CL_HO2a] CL + HO2 -> HCL + O2 ; 1.4e-11, 270 +[CL_HO2b] CL + HO2 -> OH + CLO ; 3.6e-11, -375 +[CL_O3] CL + O3 -> CLO + O2 ; 2.3e-11, -200 +[CLO_CH3O2] CLO + CH3O2 -> CL + HO2 + CH2O ; 3.3e-12, -115 +[CLO_CLOa] CLO + CLO -> 2*CL + O2 ; 3e-11, -2450 +[CLO_CLOb] CLO + CLO -> CL2 + O2 ; 1e-12, -1590 +[CLO_CLOc] CLO + CLO -> CL + OCLO ; 3.5e-13, -1370 +[CLO_HO2] CLO + HO2 -> O2 + HOCL ; 2.6e-12, 290 +[CLO_NO] CLO + NO -> NO2 + CL ; 6.4e-12, 290 +[CLONO2_CL] CLONO2 + CL -> CL2 + NO3 ; 6.5e-12, 135 +[CLO_NO2_M] CLO + NO2 + M -> CLONO2 + M ; 1.8e-31, 3.4, 1.5e-11, 1.9, 0.6 +[CLONO2_O] CLONO2 + O -> CLO + NO3 ; 3.6e-12, -840 +[CLONO2_OH] CLONO2 + OH -> HOCL + NO3 ; 1.2e-12, -330 +[CLO_O] CLO + O -> CL + O2 ; 2.8e-11, 85 +[CLO_OHa] CLO + OH -> CL + HO2 ; 7.4e-12, 270 +[CLO_OHb] CLO + OH -> HCL + O2 ; 6e-13, 230 +[HCL_O] HCL + O -> CL + OH ; 1e-11, -3300 +[HCL_OH] HCL + OH -> H2O + CL ; 1.8e-12, -250 +[HOCL_CL] HOCL + CL -> HCL + CLO ; 3.4e-12, -130 +[HOCL_O] HOCL + O -> CLO + OH ; 1.7e-13 +[HOCL_OH] HOCL + OH -> H2O + CLO ; 3e-12, -500 +[O1D_CCL4] O1D + CCL4 -> 4*CL ; 2.607e-10 +[O1D_CF2CLBR] O1D + CF2CLBR -> CL + BR + COF2 ; 9.75e-11 +[O1D_CFC11] O1D + CFC11 -> 2*CL + COFCL ; 2.07e-10 +[O1D_CFC113] O1D + CFC113 -> 2*CL + COFCL + COF2 ; 2.088e-10 +[O1D_CFC114] O1D + CFC114 -> 2*CL + 2*COF2 ; 1.17e-10 +[O1D_CFC115] O1D + CFC115 -> CL + F + 2*COF2 ; 4.644e-11 +[O1D_CFC12] O1D + CFC12 -> 2*CL + COF2 ; 1.204e-10 +[O1D_HCLa] O1D + HCL -> CL + OH ; 9.9e-11 +[O1D_HCLb] O1D + HCL -> CLO + H ; 3.3e-12 +[tag_CLO_CLO_M] CLO + CLO + M -> CL2O2 + M ; 1.9e-32, 3.6, 3.7e-12, 1.6, 0.6 +[usr_CL2O2_M] CL2O2 + M -> CLO + CLO + M ********************************* *** odd-bromine ********************************* -[BR_CH2O] BR + CH2O -> HBR + HO2 + CO ; 1.7e-11, -800 -[BR_HO2] BR + HO2 -> HBR + O2 ; 4.8e-12, -310 -[BR_O3] BR + O3 -> BRO + O2 ; 1.6e-11, -780 -[BRO_BRO] BRO + BRO -> 2*BR + O2 ; 1.5e-12, 230 -[BRO_CLOa] BRO + CLO -> BR + OCLO ; 9.5e-13, 550 -[BRO_CLOb] BRO + CLO -> BR + CL + O2 ; 2.3e-12, 260 -[BRO_CLOc] BRO + CLO -> BRCL + O2 ; 4.1e-13, 290 -[BRO_HO2] BRO + HO2 -> HOBR + O2 ; 4.5e-12, 460 -[BRO_NO] BRO + NO -> BR + NO2 ; 8.8e-12, 260 -[BRO_NO2_M] BRO + NO2 + M -> BRONO2 + M ; 5.2e-31, 3.2, 6.9e-12, 2.9, 0.6 -[BRONO2_O] BRONO2 + O -> BRO + NO3 ; 1.9e-11, 215 -[BRO_O] BRO + O -> BR + O2 ; 1.9e-11, 230 -[BRO_OH] BRO + OH -> BR + HO2 ; 1.7e-11, 250 -[HBR_O] HBR + O -> BR + OH ; 5.8e-12, -1500 -[HBR_OH] HBR + OH -> BR + H2O ; 5.5e-12, 200 -[HOBR_O] HOBR + O -> BRO + OH ; 1.2e-10, -430 -[O1D_CF3BR] O1D + CF3BR -> BR + F + COF2 ; 4.5e-11 -[O1D_CHBR3] O1D + CHBR3 -> 3*BR ; 4.62e-10 -[O1D_H2402] O1D + H2402 -> 2*BR + 2*COF2 ; 1.2e-10 -[O1D_HBRa] O1D + HBR -> BR + OH ; 9e-11 -[O1D_HBRb] O1D + HBR -> BRO + H ; 3e-11 +[BR_CH2O] BR + CH2O -> HBR + HO2 + CO ; 1.7e-11, -800 +[BR_HO2] BR + HO2 -> HBR + O2 ; 4.8e-12, -310 +[BR_O3] BR + O3 -> BRO + O2 ; 1.6e-11, -780 +[BRO_BRO] BRO + BRO -> 2*BR + O2 ; 1.5e-12, 230 +[BRO_CLOa] BRO + CLO -> BR + OCLO ; 9.5e-13, 550 +[BRO_CLOb] BRO + CLO -> BR + CL + O2 ; 2.3e-12, 260 +[BRO_CLOc] BRO + CLO -> BRCL + O2 ; 4.1e-13, 290 +[BRO_HO2] BRO + HO2 -> HOBR + O2 ; 4.5e-12, 460 +[BRO_NO] BRO + NO -> BR + NO2 ; 8.8e-12, 260 +[BRO_NO2_M] BRO + NO2 + M -> BRONO2 + M ; 5.2e-31, 3.2, 6.9e-12, 2.9, 0.6 +[BRONO2_O] BRONO2 + O -> BRO + NO3 ; 1.9e-11, 215 +[BRO_O] BRO + O -> BR + O2 ; 1.9e-11, 230 +[BRO_OH] BRO + OH -> BR + HO2 ; 1.7e-11, 250 +[HBR_O] HBR + O -> BR + OH ; 5.8e-12, -1500 +[HBR_OH] HBR + OH -> BR + H2O ; 5.5e-12, 200 +[HOBR_O] HOBR + O -> BRO + OH ; 1.2e-10, -430 +[O1D_CF3BR] O1D + CF3BR -> BR + F + COF2 ; 4.5e-11 +[O1D_CHBR3] O1D + CHBR3 -> 3*BR ; 4.62e-10 +[O1D_H2402] O1D + H2402 -> 2*BR + 2*COF2 ; 1.2e-10 +[O1D_HBRa] O1D + HBR -> BR + OH ; 9e-11 +[O1D_HBRb] O1D + HBR -> BRO + H ; 3e-11 ********************************* *** odd-fluorine ********************************* -[F_CH4] F + CH4 -> HF + CH3O2 ; 1.6e-10, -260 -[F_H2] F + H2 -> HF + H ; 1.4e-10, -500 -[F_H2O] F + H2O -> HF + OH ; 1.4e-11, 0 -[F_HNO3] F + HNO3 -> HF + NO3 ; 6e-12, 400 -[O1D_COF2] O1D + COF2 -> 2*F ; 2.14e-11 -[O1D_COFCL] O1D + COFCL -> F + CL ; 1.9e-10 +[F_CH4] F + CH4 -> HF + CH3O2 ; 1.6e-10, -260 +[F_H2] F + H2 -> HF + H ; 1.4e-10, -500 +[F_H2O] F + H2O -> HF + OH ; 1.4e-11, 0 +[F_HNO3] F + HNO3 -> HF + NO3 ; 6e-12, 400 +[O1D_COF2] O1D + COF2 -> 2*F ; 2.14e-11 +[O1D_COFCL] O1D + COFCL -> F + CL ; 1.9e-10 ********************************* *** organic-halogens ********************************* -[CH2BR2_CL] CH2BR2 + CL -> 2*BR + HCL ; 6.3e-12, -800 -[CH2BR2_OH] CH2BR2 + OH -> 2*BR + H2O ; 2e-12, -840 -[CH3BR_CL] CH3BR + CL -> HCL + HO2 + BR ; 1.46e-11, -1040 -[CH3BR_OH] CH3BR + OH -> BR + H2O + HO2 ; 1.42e-12, -1150 -[CH3CCL3_OH] CH3CCL3 + OH -> H2O + 3*CL ; 1.64e-12, -1520 -[CH3CL_CL] CH3CL + CL -> HO2 + CO + 2*HCL ; 2.03e-11, -1110 -[CH3CL_OH] CH3CL + OH -> CL + H2O + HO2 ; 1.96e-12, -1200 -[CHBR3_CL] CHBR3 + CL -> 3*BR + HCL ; 4.85e-12, -850 -[CHBR3_OH] CHBR3 + OH -> 3*BR ; 9e-13, -360 -[HCFC141B_OH] HCFC141B + OH -> CL + COFCL ; 1.25e-12, -1600 -[HCFC142B_OH] HCFC142B + OH -> CL + COF2 ; 1.3e-12, -1770 -[HCFC22_OH] HCFC22 + OH -> H2O + CL + COF2 ; 9.2e-13, -1560 -[O1D_CH2BR2] O1D + CH2BR2 -> 2*BR ; 2.57e-10 -[O1D_CH3BR] O1D + CH3BR -> BR ; 1.8e-10 -[O1D_HCFC141B] O1D + HCFC141B -> CL + COFCL ; 1.794e-10 -[O1D_HCFC142B] O1D + HCFC142B -> CL + COF2 ; 1.3e-10 -[O1D_HCFC22] O1D + HCFC22 -> CL + COF2 ; 7.65e-11 +[CH2BR2_CL] CH2BR2 + CL -> 2*BR + HCL ; 6.3e-12, -800 +[CH2BR2_OH] CH2BR2 + OH -> 2*BR + H2O ; 2e-12, -840 +[CH3BR_CL] CH3BR + CL -> HCL + HO2 + BR ; 1.46e-11, -1040 +[CH3BR_OH] CH3BR + OH -> BR + H2O + HO2 ; 1.42e-12, -1150 +[CH3CCL3_OH] CH3CCL3 + OH -> H2O + 3*CL ; 1.64e-12, -1520 +[CH3CL_CL] CH3CL + CL -> HO2 + CO + 2*HCL ; 2.03e-11, -1110 +[CH3CL_OH] CH3CL + OH -> CL + H2O + HO2 ; 1.96e-12, -1200 +[CHBR3_CL] CHBR3 + CL -> 3*BR + HCL ; 4.85e-12, -850 +[CHBR3_OH] CHBR3 + OH -> 3*BR ; 9e-13, -360 +[HCFC141B_OH] HCFC141B + OH -> CL + COFCL ; 1.25e-12, -1600 +[HCFC142B_OH] HCFC142B + OH -> CL + COF2 ; 1.3e-12, -1770 +[HCFC22_OH] HCFC22 + OH -> H2O + CL + COF2 ; 9.2e-13, -1560 +[O1D_CH2BR2] O1D + CH2BR2 -> 2*BR ; 2.57e-10 +[O1D_CH3BR] O1D + CH3BR -> BR ; 1.8e-10 +[O1D_HCFC141B] O1D + HCFC141B -> CL + COFCL ; 1.794e-10 +[O1D_HCFC142B] O1D + HCFC142B -> CL + COF2 ; 1.3e-10 +[O1D_HCFC22] O1D + HCFC22 -> CL + COF2 ; 7.65e-11 ********************************* *** C1 ********************************* -[CH2O_NO3] CH2O + NO3 -> CO + HO2 + HNO3 ; 6e-13, -2058 -[CH2O_O] CH2O + O -> HO2 + OH + CO ; 3.4e-11, -1600 -[CH2O_OH] CH2O + OH -> CO + H2O + H ; 5.5e-12, 125 -[CH3O2_HO2] CH3O2 + HO2 -> CH3OOH + O2 ; 4.1e-13, 750 -[CH3O2_NO] CH3O2 + NO -> CH2O + NO2 + HO2 ; 2.8e-12, 300 -[CH3OOH_OH] CH3OOH + OH -> 0.7*CH3O2 + 0.3*OH + 0.3*CH2O + H2O ; 3.8e-12, 200 -[CH4_OH] CH4 + OH -> CH3O2 + H2O ; 2.45e-12, -1775 -[O1D_CH4a] O1D + CH4 -> CH3O2 + OH ; 1.31e-10 -[O1D_CH4b] O1D + CH4 -> CH2O + H + HO2 ; 3.5e-11 -[O1D_CH4c] O1D + CH4 -> CH2O + H2 ; 9e-12 -[usr_CO_OH] CO + OH -> CO2 + HO2 +[CH2O_NO3] CH2O + NO3 -> CO + HO2 + HNO3 ; 6e-13, -2058 +[CH2O_O] CH2O + O -> HO2 + OH + CO ; 3.4e-11, -1600 +[CH2O_OH] CH2O + OH -> CO + H2O + H ; 5.5e-12, 125 +[CH3O2_HO2] CH3O2 + HO2 -> CH3OOH + O2 ; 4.1e-13, 750 +[CH3O2_NO] CH3O2 + NO -> CH2O + NO2 + HO2 ; 2.8e-12, 300 +[CH3OOH_OH] CH3OOH + OH -> 0.7*CH3O2 + 0.3*OH + 0.3*CH2O + H2O ; 3.8e-12, 200 +[CH4_OH] CH4 + OH -> CH3O2 + H2O ; 2.45e-12, -1775 +[O1D_CH4a] O1D + CH4 -> CH3O2 + OH ; 1.31e-10 +[O1D_CH4b] O1D + CH4 -> CH2O + H + HO2 ; 3.5e-11 +[O1D_CH4c] O1D + CH4 -> CH2O + H2 ; 9e-12 +[usr_CO_OH] CO + OH -> CO2 + HO2 ********************************* *** Sulfur ********************************* -[DMS_NO3] DMS + NO3 -> SO2 + HNO3 ; 1.9e-13, 520 -[DMS_OHa] DMS + OH -> SO2 ; 1.1e-11, -280 -[OCS_O] OCS + O -> SO + CO ; 2.1e-11, -2200 -[OCS_OH] OCS + OH -> SO2 + CO + H ; 7.2e-14, -1070 -[S_O2] S + O2 -> SO + O ; 2.3e-12 -[SO2_OH_M] SO2 + OH + M -> SO3 + HO2 ; 2.9e-31, 4.1, 1.7e-12, -0.2, 0.6 -[S_O3] S + O3 -> SO + O2 ; 1.2e-11 -[SO_BRO] SO + BRO -> SO2 + BR ; 5.7e-11 -[SO_CLO] SO + CLO -> SO2 + CL ; 2.8e-11 -[S_OH] S + OH -> SO + H ; 6.6e-11 -[SO_NO2] SO + NO2 -> SO2 + NO ; 1.4e-11 -[SO_O2] SO + O2 -> SO2 + O ; 1.6e-13, -2280 -[SO_O3] SO + O3 -> SO2 + O2 ; 3.4e-12, -1100 -[SO_OCLO] SO + OCLO -> SO2 + CLO ; 1.9e-12 -[SO_OH] SO + OH -> SO2 + H ; 2.6e-11, 330 -[usr_DMS_OH] DMS + OH -> 0.5*SO2 + 0.5*HO2 -[usr_SO3_H2O] SO3 + H2O -> H2SO4 +[DMS_NO3] DMS + NO3 -> SO2 + HNO3 ; 1.9e-13, 520 +[DMS_OHa] DMS + OH -> SO2 ; 1.1e-11, -280 +[OCS_O] OCS + O -> SO + CO ; 2.1e-11, -2200 +[OCS_OH] OCS + OH -> SO2 + CO + H ; 7.2e-14, -1070 +[S_O2] S + O2 -> SO + O ; 2.3e-12 +[SO2_OH_M] SO2 + OH + M -> SO3 + HO2 ; 2.9e-31, 4.1, 1.7e-12, -0.2, 0.6 +[S_O3] S + O3 -> SO + O2 ; 1.2e-11 +[SO_BRO] SO + BRO -> SO2 + BR ; 5.7e-11 +[SO_CLO] SO + CLO -> SO2 + CL ; 2.8e-11 +[S_OH] S + OH -> SO + H ; 6.6e-11 +[SO_NO2] SO + NO2 -> SO2 + NO ; 1.4e-11 +[SO_O2] SO + O2 -> SO2 + O ; 1.6e-13, -2280 +[SO_O3] SO + O3 -> SO2 + O2 ; 3.4e-12, -1100 +[SO_OCLO] SO + OCLO -> SO2 + CLO ; 1.9e-12 +[SO_OH] SO + OH -> SO2 + H ; 2.6e-11, 330 +[usr_DMS_OH] DMS + OH -> 0.5*SO2 + 0.5*HO2 +[usr_SO3_H2O] SO3 + H2O -> H2SO4 ********************************* *** Tropospheric Aerosol ********************************* -[usr_HO2_aer] HO2 -> 0.5*H2O2 -[usr_N2O5_aer] N2O5 -> 2*HNO3 -[usr_NO2_aer] NO2 -> 0.5*OH + 0.5*NO + 0.5*HNO3 -[usr_NO3_aer] NO3 -> HNO3 +[usr_HO2_aer] HO2 -> 0.5*H2O2 +[usr_N2O5_aer] N2O5 -> 2*HNO3 +[usr_NO2_aer] NO2 -> 0.5*OH + 0.5*NO + 0.5*HNO3 +[usr_NO3_aer] NO3 -> HNO3 ********************************* *** Stratospheric Aerosol ********************************* -[het1] N2O5 -> 2*HNO3 -[het10] HOCL + HCL -> CL2 + H2O -[het11] BRONO2 -> HOBR + HNO3 -[het12] N2O5 -> 2*HNO3 -[het13] CLONO2 -> HOCL + HNO3 -[het14] BRONO2 -> HOBR + HNO3 -[het15] CLONO2 + HCL -> CL2 + HNO3 -[het16] HOCL + HCL -> CL2 + H2O -[het17] HOBR + HCL -> BRCL + H2O -[het2] CLONO2 -> HOCL + HNO3 -[het3] BRONO2 -> HOBR + HNO3 -[het4] CLONO2 + HCL -> CL2 + HNO3 -[het5] HOCL + HCL -> CL2 + H2O -[het6] HOBR + HCL -> BRCL + H2O -[het7] N2O5 -> 2*HNO3 -[het8] CLONO2 -> HOCL + HNO3 -[het9] CLONO2 + HCL -> CL2 + HNO3 +[het1] N2O5 -> 2*HNO3 +[het10] HOCL + HCL -> CL2 + H2O +[het11] BRONO2 -> HOBR + HNO3 +[het12] N2O5 -> 2*HNO3 +[het13] CLONO2 -> HOCL + HNO3 +[het14] BRONO2 -> HOBR + HNO3 +[het15] CLONO2 + HCL -> CL2 + HNO3 +[het16] HOCL + HCL -> CL2 + H2O +[het17] HOBR + HCL -> BRCL + H2O +[het2] CLONO2 -> HOCL + HNO3 +[het3] BRONO2 -> HOBR + HNO3 +[het4] CLONO2 + HCL -> CL2 + HNO3 +[het5] HOCL + HCL -> CL2 + H2O +[het6] HOBR + HCL -> BRCL + H2O +[het7] N2O5 -> 2*HNO3 +[het8] CLONO2 -> HOCL + HNO3 +[het9] CLONO2 + HCL -> CL2 + HNO3 ********************************* *** Ions ********************************* -[ag247nm,cph=483.39] Op2P -> Op ; 0.047 -[ag373nm,cph=321.3] Op2D -> Op ; 7.7e-05 -[ag732nm,cph=163.06] Op2P -> Op2D ; 0.171 -[elec1,cph=82.389] NOp + e -> 0.2*N + 0.8*N2D + O -[elec2,cph=508.95] O2p + e -> 1.15*O + 0.85*O1D -[elec3,cph=354.83] N2p + e -> 1.1*N + 0.9*N2D -[ion_N2p_O2,cph=339.59] N2p + O2 -> O2p + N2 ; 6e-11 -[ion_N2p_Oa,cph=67.53] N2p + O -> NOp + N2D -[ion_N2p_Ob] N2p + O -> Op + N2 -[ion_Np_O,cph=95.55] Np + O -> Op + N ; 1e-12 -[ion_Np_O2a,cph=239.84] Np + O2 -> O2p + N ; 4e-10 -[ion_Np_O2b,cph=646.28] Np + O2 -> NOp + O ; 2e-10 -[ion_O2p_N,cph=406.16] O2p + N -> NOp + O ; 1e-10 -[ion_O2p_N2] O2p + N2 -> NOp + NO ; 5e-16 -[ion_O2p_NO,cph=271.38] O2p + NO -> NOp + O2 ; 4.4e-10 -[ion_Op_CO2] Op + CO2 -> O2p + CO ; 9e-10 -[ion_Op_N2,cph=105.04] Op + N2 -> NOp + N -[ion_Op_N2D,cph=139.9] Op + N2D -> Np + O ; 1.3e-10 -[ion_Op_O2,cph=150.11] Op + O2 -> O2p + O -[Op2D_e,cph=319.37] Op2D + e -> Op + e -[Op2D_N2,cph=128.32] Op2D + N2 -> N2p + O ; 8e-10 -[Op2D_O,cph=319.36] Op2D + O -> Op + O ; 5e-12 -[Op2D_O2,cph=469.4] Op2D + O2 -> O2p + O ; 7e-10 -[Op2P_ea,cph=163.06] Op2P + e -> Op2D + e -[Op2P_eb,cph=482.43] Op2P + e -> Op + e -[Op2P_N2a,cph=291.38] Op2P + N2 -> N2p + O ; 4.8e-10 -[Op2P_N2b,cph=67.54] Op2P + N2 -> Np + NO ; 1e-10 -[Op2P_O,cph=501.72] Op2P + O -> Op + O ; 4e-10 +[ag247nm,cph=483.39] Op2P -> Op ; 0.047 +[ag373nm,cph=321.3] Op2D -> Op ; 7.7e-05 +[ag732nm,cph=163.06] Op2P -> Op2D ; 0.171 +[elec1,cph=82.389] NOp + e -> 0.2*N + 0.8*N2D + O +[elec2,cph=508.95] O2p + e -> 1.15*O + 0.85*O1D +[elec3,cph=354.83] N2p + e -> 1.1*N + 0.9*N2D +[ion_N2p_O2,cph=339.59] N2p + O2 -> O2p + N2 ; 6e-11 +[ion_N2p_Oa,cph=67.53] N2p + O -> NOp + N2D +[ion_N2p_Ob] N2p + O -> Op + N2 +[ion_Np_O,cph=95.55] Np + O -> Op + N ; 1e-12 +[ion_Np_O2a,cph=239.84] Np + O2 -> O2p + N ; 4e-10 +[ion_Np_O2b,cph=646.28] Np + O2 -> NOp + O ; 2e-10 +[ion_O2p_N,cph=406.16] O2p + N -> NOp + O ; 1e-10 +[ion_O2p_N2] O2p + N2 -> NOp + NO ; 5e-16 +[ion_O2p_NO,cph=271.38] O2p + NO -> NOp + O2 ; 4.4e-10 +[ion_Op_CO2] Op + CO2 -> O2p + CO ; 9e-10 +[ion_Op_N2,cph=105.04] Op + N2 -> NOp + N +[ion_Op_N2D,cph=139.9] Op + N2D -> Np + O ; 1.3e-10 +[ion_Op_O2,cph=150.11] Op + O2 -> O2p + O +[Op2D_e,cph=319.37] Op2D + e -> Op + e +[Op2D_N2,cph=128.32] Op2D + N2 -> N2p + O ; 8e-10 +[Op2D_O,cph=319.36] Op2D + O -> Op + O ; 5e-12 +[Op2D_O2,cph=469.4] Op2D + O2 -> O2p + O ; 7e-10 +[Op2P_ea,cph=163.06] Op2P + e -> Op2D + e +[Op2P_eb,cph=482.43] Op2P + e -> Op + e +[Op2P_N2a,cph=291.38] Op2P + N2 -> N2p + O ; 4.8e-10 +[Op2P_N2b,cph=67.54] Op2P + N2 -> Np + NO ; 1e-10 +[Op2P_O,cph=501.72] Op2P + O -> Op + O ; 4e-10 End Reactions Ext Forcing - so4_a2 <- dataset - DMS <- dataset - bc_a4 <- dataset - num_a1 <- dataset - num_a2 <- dataset - num_a4 <- dataset + so4_a2 <- dataset + DMS <- dataset + bc_a4 <- dataset + num_a1 <- dataset + num_a2 <- dataset + num_a4 <- dataset num_a5 <- dataset - pom_a1 <- dataset - pom_a4 <- dataset - so4_a1 <- dataset + pom_a1 <- dataset + pom_a4 <- dataset + so4_a1 <- dataset so4_a5 <- dataset - CO <- dataset - NO <- dataset - NO2 <- dataset - SO2 <- dataset - bc_a1 <- dataset - N - N2D - N2p - Op - e - Np - O2p - OH + CO <- dataset + NO <- dataset + NO2 <- dataset + SO2 <- dataset + bc_a1 <- dataset + N + N2D + N2p + Op + e + Np + O2p + OH End Ext Forcing End Chemistry diff --git a/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 b/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 index f579d54563..3c74c4fd26 100644 --- a/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 @@ -9,13 +9,13 @@ module chem_mods rxntot = 311, & ! number of total reactions gascnt = 220, & ! number of gas phase reactions nabscol = 2, & ! number of absorbing column densities - gas_pcnst = 102, & ! number of "gas phase" species + gas_pcnst = 103, & ! number of "gas phase" species nfs = 2, & ! number of "fixed" species relcnt = 0, & ! number of relationship species grpcnt = 0, & ! number of group members nzcnt = 959, & ! number of non-zero matrix entries extcnt = 24, & ! number of species with external forcing - clscnt1 = 0, & ! number of species in explicit class + clscnt1 = 1, & ! number of species in explicit class clscnt2 = 0, & ! number of species in hov class clscnt3 = 0, & ! number of species in ebi class clscnt4 = 102, & ! number of species in implicit class diff --git a/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 b/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 index d596a4e593..6c5ec22920 100644 --- a/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 @@ -71,35 +71,36 @@ module m_spc_id integer, parameter :: id_O = 69 integer, parameter :: id_O2 = 70 integer, parameter :: id_O3 = 71 - integer, parameter :: id_OCLO = 72 - integer, parameter :: id_OCS = 73 - integer, parameter :: id_pom_a1 = 74 - integer, parameter :: id_pom_a4 = 75 - integer, parameter :: id_S = 76 - integer, parameter :: id_SF6 = 77 - integer, parameter :: id_SO = 78 - integer, parameter :: id_SO2 = 79 - integer, parameter :: id_SO3 = 80 - integer, parameter :: id_so4_a1 = 81 - integer, parameter :: id_so4_a2 = 82 - integer, parameter :: id_so4_a3 = 83 - integer, parameter :: id_so4_a5 = 84 - integer, parameter :: id_soa_a1 = 85 - integer, parameter :: id_soa_a2 = 86 - integer, parameter :: id_SOAG = 87 - integer, parameter :: id_e = 88 - integer, parameter :: id_HO2 = 89 - integer, parameter :: id_N2D = 90 - integer, parameter :: id_N2p = 91 - integer, parameter :: id_NOp = 92 - integer, parameter :: id_Np = 93 - integer, parameter :: id_O1D = 94 - integer, parameter :: id_O2_1D = 95 - integer, parameter :: id_O2_1S = 96 - integer, parameter :: id_O2p = 97 - integer, parameter :: id_OH = 98 - integer, parameter :: id_Op = 99 - integer, parameter :: id_Op2D = 100 - integer, parameter :: id_Op2P = 101 - integer, parameter :: id_H2O = 102 + integer, parameter :: id_O3S = 72 + integer, parameter :: id_OCLO = 73 + integer, parameter :: id_OCS = 74 + integer, parameter :: id_pom_a1 = 75 + integer, parameter :: id_pom_a4 = 76 + integer, parameter :: id_S = 77 + integer, parameter :: id_SF6 = 78 + integer, parameter :: id_SO = 79 + integer, parameter :: id_SO2 = 80 + integer, parameter :: id_SO3 = 81 + integer, parameter :: id_so4_a1 = 82 + integer, parameter :: id_so4_a2 = 83 + integer, parameter :: id_so4_a3 = 84 + integer, parameter :: id_so4_a5 = 85 + integer, parameter :: id_soa_a1 = 86 + integer, parameter :: id_soa_a2 = 87 + integer, parameter :: id_SOAG = 88 + integer, parameter :: id_e = 89 + integer, parameter :: id_HO2 = 90 + integer, parameter :: id_N2D = 91 + integer, parameter :: id_N2p = 92 + integer, parameter :: id_NOp = 93 + integer, parameter :: id_Np = 94 + integer, parameter :: id_O1D = 95 + integer, parameter :: id_O2_1D = 96 + integer, parameter :: id_O2_1S = 97 + integer, parameter :: id_O2p = 98 + integer, parameter :: id_OH = 99 + integer, parameter :: id_Op = 100 + integer, parameter :: id_Op2D = 101 + integer, parameter :: id_Op2P = 102 + integer, parameter :: id_H2O = 103 end module m_spc_id diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 index 125c4a75b8..59b51ae306 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 @@ -17,9 +17,14 @@ subroutine indprd( class, prod, nprod, y, extfrc, rxt, chnkpnts ) real(r8), intent(in) :: extfrc(chnkpnts,extcnt) real(r8), intent(inout) :: prod(chnkpnts,nprod) !-------------------------------------------------------------------- +! ... "independent" production for Explicit species +!-------------------------------------------------------------------- + if( class == 1 ) then + prod(:,1) = 0._r8 +!-------------------------------------------------------------------- ! ... "independent" production for Implicit species !-------------------------------------------------------------------- - if( class == 4 ) then + else if( class == 4 ) then prod(:,1) = + extfrc(:,16) prod(:,2) = + extfrc(:,3) prod(:,97) = 0._r8 diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 index 8e8cfedba7..14f1d2a1ef 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 @@ -222,8 +222,8 @@ subroutine linmat01( avec_len, mat, y, rxt, het_rates ) mat(k,78) = rxt(k,92) + rxt(k,100) mat(k,81) = rxt(k,93) mat(k,529) = -( rxt(k,7) + rxt(k,8) + het_rates(k,71) ) - mat(k,134) = -( rxt(k,59) + het_rates(k,72) ) - mat(k,139) = -( rxt(k,88) + het_rates(k,73) ) + mat(k,134) = -( rxt(k,59) + het_rates(k,73) ) + mat(k,139) = -( rxt(k,88) + het_rates(k,74) ) end do end subroutine linmat01 subroutine linmat02( avec_len, mat, y, rxt, het_rates ) @@ -246,57 +246,57 @@ subroutine linmat02( avec_len, mat, y, rxt, het_rates ) !---------------------------------------------- integer :: k do k = 1,avec_len - mat(k,16) = -( het_rates(k,74) ) - mat(k,17) = -( het_rates(k,75) ) - mat(k,235) = -( het_rates(k,76) ) + mat(k,16) = -( het_rates(k,75) ) + mat(k,17) = -( het_rates(k,76) ) + mat(k,235) = -( het_rates(k,77) ) mat(k,140) = rxt(k,88) mat(k,423) = rxt(k,89) - mat(k,18) = -( rxt(k,60) + het_rates(k,77) ) - mat(k,425) = -( rxt(k,89) + het_rates(k,78) ) + mat(k,18) = -( rxt(k,60) + het_rates(k,78) ) + mat(k,425) = -( rxt(k,89) + het_rates(k,79) ) mat(k,301) = rxt(k,90) - mat(k,300) = -( rxt(k,90) + het_rates(k,79) ) + mat(k,300) = -( rxt(k,90) + het_rates(k,80) ) mat(k,109) = rxt(k,91) - mat(k,108) = -( rxt(k,91) + het_rates(k,80) ) + mat(k,108) = -( rxt(k,91) + het_rates(k,81) ) mat(k,53) = rxt(k,87) - mat(k,19) = -( het_rates(k,81) ) - mat(k,20) = -( het_rates(k,82) ) - mat(k,21) = -( het_rates(k,83) ) - mat(k,22) = -( het_rates(k,84) ) - mat(k,23) = -( het_rates(k,85) ) - mat(k,24) = -( het_rates(k,86) ) - mat(k,25) = -( het_rates(k,87) ) - mat(k,323) = -( het_rates(k,88) ) + mat(k,19) = -( het_rates(k,82) ) + mat(k,20) = -( het_rates(k,83) ) + mat(k,21) = -( het_rates(k,84) ) + mat(k,22) = -( het_rates(k,85) ) + mat(k,23) = -( het_rates(k,86) ) + mat(k,24) = -( het_rates(k,87) ) + mat(k,25) = -( het_rates(k,88) ) + mat(k,323) = -( het_rates(k,89) ) mat(k,736) = rxt(k,16) mat(k,345) = rxt(k,62) mat(k,668) = rxt(k,71) + rxt(k,72) + rxt(k,73) + rxt(k,74) + rxt(k,75) & + rxt(k,76) mat(k,501) = rxt(k,77) + rxt(k,78) + rxt(k,79) + rxt(k,80) + rxt(k,81) & + rxt(k,84) + rxt(k,85) + rxt(k,86) - mat(k,555) = -( rxt(k,263) + het_rates(k,89) ) + mat(k,555) = -( rxt(k,263) + het_rates(k,90) ) mat(k,169) = rxt(k,11) + rxt(k,153) - mat(k,334) = -( het_rates(k,90) ) - mat(k,219) = -( het_rates(k,91) ) + mat(k,334) = -( het_rates(k,91) ) + mat(k,219) = -( het_rates(k,92) ) mat(k,189) = rxt(k,304) mat(k,183) = rxt(k,309) - mat(k,242) = -( het_rates(k,92) ) + mat(k,242) = -( het_rates(k,93) ) mat(k,735) = rxt(k,16) mat(k,357) = rxt(k,297) mat(k,371) = rxt(k,300) - mat(k,273) = -( het_rates(k,93) ) + mat(k,273) = -( het_rates(k,94) ) mat(k,344) = rxt(k,62) mat(k,184) = rxt(k,310) - mat(k,726) = -( rxt(k,96) + het_rates(k,94) ) + mat(k,726) = -( rxt(k,96) + het_rates(k,95) ) mat(k,951) = rxt(k,1) mat(k,514) = rxt(k,6) mat(k,535) = rxt(k,7) mat(k,105) = rxt(k,12) - mat(k,77) = -( rxt(k,92) + rxt(k,100) + het_rates(k,95) ) + mat(k,77) = -( rxt(k,92) + rxt(k,100) + het_rates(k,96) ) mat(k,522) = rxt(k,7) mat(k,79) = rxt(k,104) - mat(k,80) = -( rxt(k,93) + rxt(k,104) + het_rates(k,96) ) - mat(k,361) = -( rxt(k,297) + het_rates(k,97) ) + mat(k,80) = -( rxt(k,93) + rxt(k,104) + het_rates(k,97) ) + mat(k,361) = -( rxt(k,297) + het_rates(k,98) ) mat(k,504) = rxt(k,78) + rxt(k,80) - mat(k,858) = -( het_rates(k,98) ) + mat(k,858) = -( het_rates(k,99) ) mat(k,955) = rxt(k,3) mat(k,233) = 2.000_r8*rxt(k,4) mat(k,904) = rxt(k,9) @@ -306,20 +306,20 @@ subroutine linmat02( avec_len, mat, y, rxt, het_rates ) mat(k,253) = rxt(k,57) mat(k,270) = rxt(k,58) mat(k,646) = .500_r8*rxt(k,265) - mat(k,378) = -( rxt(k,300) + het_rates(k,99) ) + mat(k,378) = -( rxt(k,300) + het_rates(k,100) ) mat(k,672) = rxt(k,73) + rxt(k,74) mat(k,505) = rxt(k,79) + rxt(k,81) mat(k,185) = rxt(k,284) mat(k,191) = rxt(k,285) - mat(k,188) = -( rxt(k,285) + rxt(k,304) + het_rates(k,100) ) + mat(k,188) = -( rxt(k,285) + rxt(k,304) + het_rates(k,101) ) mat(k,655) = rxt(k,75) + rxt(k,76) mat(k,495) = rxt(k,85) + rxt(k,86) mat(k,182) = rxt(k,286) mat(k,181) = -( rxt(k,284) + rxt(k,286) + rxt(k,309) + rxt(k,310) & - + het_rates(k,101) ) + + het_rates(k,102) ) mat(k,654) = rxt(k,71) + rxt(k,72) mat(k,494) = rxt(k,77) + rxt(k,84) - mat(k,959) = -( rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,102) ) + mat(k,959) = -( rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,103) ) mat(k,409) = .050_r8*rxt(k,24) mat(k,54) = rxt(k,87) end do diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 index 60c42e2b51..fcd1810f01 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 @@ -22,25 +22,25 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,808) = -(rxt(k,191)*y(k,17) + rxt(k,192)*y(k,89) + rxt(k,193)*y(k,71)) + mat(k,808) = -(rxt(k,191)*y(k,17) + rxt(k,192)*y(k,90) + rxt(k,193)*y(k,71)) mat(k,486) = -rxt(k,191)*y(k,3) mat(k,563) = -rxt(k,192)*y(k,3) mat(k,538) = -rxt(k,193)*y(k,3) mat(k,927) = 4.000_r8*rxt(k,194)*y(k,5) + (rxt(k,195)+rxt(k,196))*y(k,28) & - + rxt(k,199)*y(k,61) + rxt(k,202)*y(k,69) + rxt(k,253)*y(k,78) & - + rxt(k,203)*y(k,98) - mat(k,59) = rxt(k,181)*y(k,94) - mat(k,64) = rxt(k,207)*y(k,94) - mat(k,178) = 2.000_r8*rxt(k,218)*y(k,25) + 2.000_r8*rxt(k,230)*y(k,94) & - + 2.000_r8*rxt(k,219)*y(k,98) - mat(k,216) = rxt(k,220)*y(k,25) + rxt(k,231)*y(k,94) + rxt(k,221)*y(k,98) - mat(k,165) = 3.000_r8*rxt(k,225)*y(k,25) + 3.000_r8*rxt(k,208)*y(k,94) & - + 3.000_r8*rxt(k,226)*y(k,98) + + rxt(k,199)*y(k,61) + rxt(k,202)*y(k,69) + rxt(k,253)*y(k,79) & + + rxt(k,203)*y(k,99) + mat(k,59) = rxt(k,181)*y(k,95) + mat(k,64) = rxt(k,207)*y(k,95) + mat(k,178) = 2.000_r8*rxt(k,218)*y(k,25) + 2.000_r8*rxt(k,230)*y(k,95) & + + 2.000_r8*rxt(k,219)*y(k,99) + mat(k,216) = rxt(k,220)*y(k,25) + rxt(k,231)*y(k,95) + rxt(k,221)*y(k,99) + mat(k,165) = 3.000_r8*rxt(k,225)*y(k,25) + 3.000_r8*rxt(k,208)*y(k,95) & + + 3.000_r8*rxt(k,226)*y(k,99) mat(k,786) = 2.000_r8*rxt(k,218)*y(k,16) + rxt(k,220)*y(k,18) & + 3.000_r8*rxt(k,225)*y(k,24) mat(k,616) = (rxt(k,195)+rxt(k,196))*y(k,5) - mat(k,35) = 2.000_r8*rxt(k,209)*y(k,94) - mat(k,260) = rxt(k,204)*y(k,69) + rxt(k,210)*y(k,94) + rxt(k,205)*y(k,98) + mat(k,35) = 2.000_r8*rxt(k,209)*y(k,95) + mat(k,260) = rxt(k,204)*y(k,69) + rxt(k,210)*y(k,95) + rxt(k,205)*y(k,99) mat(k,754) = rxt(k,199)*y(k,5) mat(k,687) = rxt(k,202)*y(k,5) + rxt(k,204)*y(k,45) mat(k,435) = rxt(k,253)*y(k,5) @@ -54,9 +54,9 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,448) = (rxt(k,275)+rxt(k,280))*y(k,53) mat(k,247) = (rxt(k,275)+rxt(k,280))*y(k,49) mat(k,931) = -(4._r8*rxt(k,194)*y(k,5) + (rxt(k,195) + rxt(k,196) + rxt(k,197) & - ) * y(k,28) + rxt(k,198)*y(k,89) + rxt(k,199)*y(k,61) + rxt(k,200) & - *y(k,62) + rxt(k,202)*y(k,69) + rxt(k,203)*y(k,98) + rxt(k,253) & - *y(k,78)) + ) * y(k,28) + rxt(k,198)*y(k,90) + rxt(k,199)*y(k,61) + rxt(k,200) & + *y(k,62) + rxt(k,202)*y(k,69) + rxt(k,203)*y(k,99) + rxt(k,253) & + *y(k,79)) mat(k,620) = -(rxt(k,195) + rxt(k,196) + rxt(k,197)) * y(k,5) mat(k,567) = -rxt(k,198)*y(k,5) mat(k,758) = -rxt(k,199)*y(k,5) @@ -66,7 +66,7 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,437) = -rxt(k,253)*y(k,5) mat(k,812) = rxt(k,193)*y(k,71) mat(k,209) = rxt(k,201)*y(k,69) - mat(k,262) = rxt(k,211)*y(k,94) + mat(k,262) = rxt(k,211)*y(k,95) mat(k,254) = rxt(k,206)*y(k,69) mat(k,691) = mat(k,691) + rxt(k,201)*y(k,6) + rxt(k,206)*y(k,53) mat(k,541) = rxt(k,193)*y(k,3) @@ -75,76 +75,76 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,656) = -rxt(k,201)*y(k,6) mat(k,911) = rxt(k,200)*y(k,62) mat(k,625) = rxt(k,200)*y(k,5) - mat(k,29) = -(rxt(k,180)*y(k,94)) + mat(k,29) = -(rxt(k,180)*y(k,95)) mat(k,693) = -rxt(k,180)*y(k,8) - mat(k,55) = -(rxt(k,181)*y(k,94)) + mat(k,55) = -(rxt(k,181)*y(k,95)) mat(k,698) = -rxt(k,181)*y(k,9) - mat(k,60) = -(rxt(k,207)*y(k,94)) + mat(k,60) = -(rxt(k,207)*y(k,95)) mat(k,699) = -rxt(k,207)*y(k,10) - mat(k,36) = -(rxt(k,182)*y(k,94)) + mat(k,36) = -(rxt(k,182)*y(k,95)) mat(k,695) = -rxt(k,182)*y(k,11) - mat(k,65) = -(rxt(k,183)*y(k,94)) + mat(k,65) = -(rxt(k,183)*y(k,95)) mat(k,700) = -rxt(k,183)*y(k,12) - mat(k,40) = -(rxt(k,184)*y(k,94)) + mat(k,40) = -(rxt(k,184)*y(k,95)) mat(k,696) = -rxt(k,184)*y(k,13) - mat(k,70) = -(rxt(k,185)*y(k,94)) + mat(k,70) = -(rxt(k,185)*y(k,95)) mat(k,701) = -rxt(k,185)*y(k,14) - mat(k,44) = -(rxt(k,186)*y(k,94)) + mat(k,44) = -(rxt(k,186)*y(k,95)) mat(k,697) = -rxt(k,186)*y(k,15) - mat(k,174) = -(rxt(k,218)*y(k,25) + rxt(k,219)*y(k,98) + rxt(k,230)*y(k,94)) + mat(k,174) = -(rxt(k,218)*y(k,25) + rxt(k,219)*y(k,99) + rxt(k,230)*y(k,95)) mat(k,763) = -rxt(k,218)*y(k,16) mat(k,827) = -rxt(k,219)*y(k,16) mat(k,710) = -rxt(k,230)*y(k,16) mat(k,475) = -(rxt(k,155)*y(k,25) + rxt(k,191)*y(k,3) + rxt(k,235)*y(k,63) & - + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,98)) + + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,99)) mat(k,775) = -rxt(k,155)*y(k,17) mat(k,797) = -rxt(k,191)*y(k,17) mat(k,577) = -rxt(k,235)*y(k,17) mat(k,676) = -rxt(k,236)*y(k,17) mat(k,846) = -rxt(k,237)*y(k,17) mat(k,413) = rxt(k,162)*y(k,28) + rxt(k,239)*y(k,61) - mat(k,158) = .300_r8*rxt(k,240)*y(k,98) - mat(k,397) = (rxt(k,243)+rxt(k,244))*y(k,94) + mat(k,158) = .300_r8*rxt(k,240)*y(k,99) + mat(k,397) = (rxt(k,243)+rxt(k,244))*y(k,95) mat(k,605) = rxt(k,162)*y(k,21) mat(k,743) = rxt(k,239)*y(k,21) mat(k,718) = (rxt(k,243)+rxt(k,244))*y(k,23) mat(k,846) = mat(k,846) + .300_r8*rxt(k,240)*y(k,22) - mat(k,210) = -(rxt(k,220)*y(k,25) + rxt(k,221)*y(k,98) + rxt(k,231)*y(k,94)) + mat(k,210) = -(rxt(k,220)*y(k,25) + rxt(k,221)*y(k,99) + rxt(k,231)*y(k,95)) mat(k,764) = -rxt(k,220)*y(k,18) mat(k,829) = -rxt(k,221)*y(k,18) mat(k,711) = -rxt(k,231)*y(k,18) - mat(k,48) = -(rxt(k,222)*y(k,98)) + mat(k,48) = -(rxt(k,222)*y(k,99)) mat(k,814) = -rxt(k,222)*y(k,19) - mat(k,147) = -(rxt(k,223)*y(k,25) + rxt(k,224)*y(k,98)) + mat(k,147) = -(rxt(k,223)*y(k,25) + rxt(k,224)*y(k,99)) mat(k,761) = -rxt(k,223)*y(k,20) mat(k,823) = -rxt(k,224)*y(k,20) - mat(k,411) = -(rxt(k,162)*y(k,28) + rxt(k,238)*y(k,89) + rxt(k,239)*y(k,61)) + mat(k,411) = -(rxt(k,162)*y(k,28) + rxt(k,238)*y(k,90) + rxt(k,239)*y(k,61)) mat(k,601) = -rxt(k,162)*y(k,21) mat(k,549) = -rxt(k,238)*y(k,21) mat(k,741) = -rxt(k,239)*y(k,21) - mat(k,156) = .700_r8*rxt(k,240)*y(k,98) - mat(k,394) = rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,242)*y(k,94) & - + rxt(k,241)*y(k,98) + mat(k,156) = .700_r8*rxt(k,240)*y(k,99) + mat(k,394) = rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,242)*y(k,95) & + + rxt(k,241)*y(k,99) mat(k,772) = rxt(k,156)*y(k,23) mat(k,292) = rxt(k,212)*y(k,23) mat(k,715) = rxt(k,242)*y(k,23) mat(k,842) = .700_r8*rxt(k,240)*y(k,22) + rxt(k,241)*y(k,23) - mat(k,155) = -(rxt(k,240)*y(k,98)) + mat(k,155) = -(rxt(k,240)*y(k,99)) mat(k,824) = -rxt(k,240)*y(k,22) - mat(k,410) = rxt(k,238)*y(k,89) + mat(k,410) = rxt(k,238)*y(k,90) mat(k,543) = rxt(k,238)*y(k,21) - mat(k,393) = -(rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,241)*y(k,98) & - + (rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,94)) + mat(k,393) = -(rxt(k,156)*y(k,25) + rxt(k,212)*y(k,39) + rxt(k,241)*y(k,99) & + + (rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,95)) mat(k,771) = -rxt(k,156)*y(k,23) mat(k,291) = -rxt(k,212)*y(k,23) mat(k,841) = -rxt(k,241)*y(k,23) mat(k,714) = -(rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,23) - mat(k,161) = -(rxt(k,208)*y(k,94) + rxt(k,225)*y(k,25) + rxt(k,226)*y(k,98)) + mat(k,161) = -(rxt(k,208)*y(k,95) + rxt(k,225)*y(k,25) + rxt(k,226)*y(k,99)) mat(k,709) = -rxt(k,208)*y(k,24) mat(k,762) = -rxt(k,225)*y(k,24) mat(k,825) = -rxt(k,226)*y(k,24) mat(k,785) = -(rxt(k,155)*y(k,17) + rxt(k,156)*y(k,23) + rxt(k,157)*y(k,41) & - + rxt(k,158)*y(k,43) + (rxt(k,159) + rxt(k,160)) * y(k,89) & + + rxt(k,158)*y(k,43) + (rxt(k,159) + rxt(k,160)) * y(k,90) & + rxt(k,161)*y(k,71) + rxt(k,168)*y(k,29) + rxt(k,177)*y(k,54) & + rxt(k,218)*y(k,16) + rxt(k,220)*y(k,18) + rxt(k,223)*y(k,20) & + rxt(k,225)*y(k,24)) @@ -161,24 +161,24 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,152) = -rxt(k,223)*y(k,25) mat(k,164) = -rxt(k,225)*y(k,25) mat(k,926) = rxt(k,196)*y(k,28) - mat(k,31) = 4.000_r8*rxt(k,180)*y(k,94) - mat(k,58) = rxt(k,181)*y(k,94) - mat(k,39) = 2.000_r8*rxt(k,182)*y(k,94) - mat(k,69) = 2.000_r8*rxt(k,183)*y(k,94) - mat(k,43) = 2.000_r8*rxt(k,184)*y(k,94) - mat(k,74) = rxt(k,185)*y(k,94) - mat(k,47) = 2.000_r8*rxt(k,186)*y(k,94) - mat(k,49) = 3.000_r8*rxt(k,222)*y(k,98) - mat(k,152) = mat(k,152) + rxt(k,224)*y(k,98) + mat(k,31) = 4.000_r8*rxt(k,180)*y(k,95) + mat(k,58) = rxt(k,181)*y(k,95) + mat(k,39) = 2.000_r8*rxt(k,182)*y(k,95) + mat(k,69) = 2.000_r8*rxt(k,183)*y(k,95) + mat(k,43) = 2.000_r8*rxt(k,184)*y(k,95) + mat(k,74) = rxt(k,185)*y(k,95) + mat(k,47) = 2.000_r8*rxt(k,186)*y(k,95) + mat(k,49) = 3.000_r8*rxt(k,222)*y(k,99) + mat(k,152) = mat(k,152) + rxt(k,224)*y(k,99) mat(k,419) = rxt(k,162)*y(k,28) mat(k,615) = rxt(k,196)*y(k,5) + rxt(k,162)*y(k,21) + (4.000_r8*rxt(k,163) & +2.000_r8*rxt(k,165))*y(k,28) + rxt(k,167)*y(k,61) + rxt(k,172) & - *y(k,69) + rxt(k,254)*y(k,78) + rxt(k,173)*y(k,98) - mat(k,93) = rxt(k,217)*y(k,94) - mat(k,88) = rxt(k,232)*y(k,94) + rxt(k,227)*y(k,98) - mat(k,98) = rxt(k,233)*y(k,94) + rxt(k,228)*y(k,98) - mat(k,116) = rxt(k,234)*y(k,94) + rxt(k,229)*y(k,98) - mat(k,462) = rxt(k,175)*y(k,69) + rxt(k,187)*y(k,94) + rxt(k,176)*y(k,98) + *y(k,69) + rxt(k,254)*y(k,79) + rxt(k,173)*y(k,99) + mat(k,93) = rxt(k,217)*y(k,95) + mat(k,88) = rxt(k,232)*y(k,95) + rxt(k,227)*y(k,99) + mat(k,98) = rxt(k,233)*y(k,95) + rxt(k,228)*y(k,99) + mat(k,116) = rxt(k,234)*y(k,95) + rxt(k,229)*y(k,99) + mat(k,462) = rxt(k,175)*y(k,69) + rxt(k,187)*y(k,95) + rxt(k,176)*y(k,99) mat(k,753) = rxt(k,167)*y(k,28) mat(k,686) = rxt(k,172)*y(k,28) + rxt(k,175)*y(k,49) mat(k,434) = rxt(k,254)*y(k,28) @@ -200,9 +200,9 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,594) = 2.000_r8*rxt(k,189)*y(k,28) mat(k,610) = -(rxt(k,162)*y(k,21) + (4._r8*rxt(k,163) + 4._r8*rxt(k,164) & + 4._r8*rxt(k,165) + 4._r8*rxt(k,189)) * y(k,28) + rxt(k,166) & - *y(k,89) + rxt(k,167)*y(k,61) + rxt(k,169)*y(k,62) + rxt(k,172) & - *y(k,69) + (rxt(k,173) + rxt(k,174)) * y(k,98) + (rxt(k,195) & - + rxt(k,196) + rxt(k,197)) * y(k,5) + rxt(k,254)*y(k,78)) + *y(k,90) + rxt(k,167)*y(k,61) + rxt(k,169)*y(k,62) + rxt(k,172) & + *y(k,69) + (rxt(k,173) + rxt(k,174)) * y(k,99) + (rxt(k,195) & + + rxt(k,196) + rxt(k,197)) * y(k,5) + rxt(k,254)*y(k,79)) mat(k,416) = -rxt(k,162)*y(k,28) mat(k,557) = -rxt(k,166)*y(k,28) mat(k,748) = -rxt(k,167)*y(k,28) @@ -211,18 +211,18 @@ subroutine nlnmat01( avec_len, mat, y, rxt ) mat(k,851) = -(rxt(k,173) + rxt(k,174)) * y(k,28) mat(k,921) = -(rxt(k,195) + rxt(k,196) + rxt(k,197)) * y(k,28) mat(k,430) = -rxt(k,254)*y(k,28) - mat(k,780) = rxt(k,177)*y(k,54) + rxt(k,161)*y(k,71) + rxt(k,160)*y(k,89) + mat(k,780) = rxt(k,177)*y(k,54) + rxt(k,161)*y(k,71) + rxt(k,160)*y(k,90) mat(k,311) = rxt(k,170)*y(k,69) - mat(k,458) = rxt(k,188)*y(k,94) - mat(k,267) = rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,98) + mat(k,458) = rxt(k,188)*y(k,95) + mat(k,267) = rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,99) mat(k,681) = mat(k,681) + rxt(k,170)*y(k,29) + rxt(k,178)*y(k,54) mat(k,532) = rxt(k,161)*y(k,25) - mat(k,137) = rxt(k,259)*y(k,78) - mat(k,430) = mat(k,430) + rxt(k,259)*y(k,72) + mat(k,137) = rxt(k,259)*y(k,79) + mat(k,430) = mat(k,430) + rxt(k,259)*y(k,73) mat(k,557) = mat(k,557) + rxt(k,160)*y(k,25) mat(k,723) = rxt(k,188)*y(k,49) mat(k,851) = mat(k,851) + rxt(k,179)*y(k,54) - mat(k,308) = -(rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,98) & + mat(k,308) = -(rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,99) & + (rxt(k,273) + rxt(k,278) + rxt(k,283)) * y(k,49)) mat(k,768) = -rxt(k,168)*y(k,29) mat(k,667) = -rxt(k,170)*y(k,29) @@ -250,125 +250,125 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,282) = -(rxt(k,245)*y(k,98)) + mat(k,282) = -(rxt(k,245)*y(k,99)) mat(k,834) = -rxt(k,245)*y(k,31) mat(k,793) = rxt(k,191)*y(k,17) mat(k,470) = rxt(k,191)*y(k,3) + rxt(k,155)*y(k,25) + rxt(k,235)*y(k,63) & - + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,98) + + rxt(k,236)*y(k,69) + rxt(k,237)*y(k,99) mat(k,148) = rxt(k,223)*y(k,25) mat(k,767) = rxt(k,155)*y(k,17) + rxt(k,223)*y(k,20) - mat(k,197) = rxt(k,299)*y(k,99) + mat(k,197) = rxt(k,299)*y(k,100) mat(k,571) = rxt(k,235)*y(k,17) - mat(k,665) = rxt(k,236)*y(k,17) + rxt(k,248)*y(k,73) - mat(k,141) = rxt(k,248)*y(k,69) + rxt(k,249)*y(k,98) - mat(k,834) = mat(k,834) + rxt(k,237)*y(k,17) + rxt(k,249)*y(k,73) + mat(k,665) = rxt(k,236)*y(k,17) + rxt(k,248)*y(k,74) + mat(k,141) = rxt(k,248)*y(k,69) + rxt(k,249)*y(k,99) + mat(k,834) = mat(k,834) + rxt(k,237)*y(k,17) + rxt(k,249)*y(k,74) mat(k,373) = rxt(k,299)*y(k,32) - mat(k,196) = -(rxt(k,299)*y(k,99)) + mat(k,196) = -(rxt(k,299)*y(k,100)) mat(k,370) = -rxt(k,299)*y(k,32) - mat(k,281) = rxt(k,245)*y(k,98) + mat(k,281) = rxt(k,245)*y(k,99) mat(k,828) = rxt(k,245)*y(k,31) - mat(k,82) = -(rxt(k,216)*y(k,94)) + mat(k,82) = -(rxt(k,216)*y(k,95)) mat(k,703) = -rxt(k,216)*y(k,33) - mat(k,56) = rxt(k,181)*y(k,94) - mat(k,61) = rxt(k,207)*y(k,94) - mat(k,66) = rxt(k,183)*y(k,94) - mat(k,41) = 2.000_r8*rxt(k,184)*y(k,94) - mat(k,71) = 2.000_r8*rxt(k,185)*y(k,94) - mat(k,45) = rxt(k,186)*y(k,94) - mat(k,33) = 2.000_r8*rxt(k,209)*y(k,94) - mat(k,94) = rxt(k,233)*y(k,94) + rxt(k,228)*y(k,98) - mat(k,112) = rxt(k,234)*y(k,94) + rxt(k,229)*y(k,98) + mat(k,56) = rxt(k,181)*y(k,95) + mat(k,61) = rxt(k,207)*y(k,95) + mat(k,66) = rxt(k,183)*y(k,95) + mat(k,41) = 2.000_r8*rxt(k,184)*y(k,95) + mat(k,71) = 2.000_r8*rxt(k,185)*y(k,95) + mat(k,45) = rxt(k,186)*y(k,95) + mat(k,33) = 2.000_r8*rxt(k,209)*y(k,95) + mat(k,94) = rxt(k,233)*y(k,95) + rxt(k,228)*y(k,99) + mat(k,112) = rxt(k,234)*y(k,95) + rxt(k,229)*y(k,99) mat(k,703) = mat(k,703) + rxt(k,181)*y(k,9) + rxt(k,207)*y(k,10) + rxt(k,183) & *y(k,12) + 2.000_r8*rxt(k,184)*y(k,13) + 2.000_r8*rxt(k,185) & *y(k,14) + rxt(k,186)*y(k,15) + 2.000_r8*rxt(k,209)*y(k,42) & + rxt(k,233)*y(k,47) + rxt(k,234)*y(k,48) mat(k,815) = rxt(k,228)*y(k,47) + rxt(k,229)*y(k,48) - mat(k,90) = -(rxt(k,217)*y(k,94)) + mat(k,90) = -(rxt(k,217)*y(k,95)) mat(k,705) = -rxt(k,217)*y(k,34) - mat(k,37) = rxt(k,182)*y(k,94) - mat(k,67) = rxt(k,183)*y(k,94) - mat(k,86) = rxt(k,232)*y(k,94) + rxt(k,227)*y(k,98) + mat(k,37) = rxt(k,182)*y(k,95) + mat(k,67) = rxt(k,183)*y(k,95) + mat(k,86) = rxt(k,232)*y(k,95) + rxt(k,227)*y(k,99) mat(k,705) = mat(k,705) + rxt(k,182)*y(k,11) + rxt(k,183)*y(k,12) & + rxt(k,232)*y(k,46) mat(k,817) = rxt(k,227)*y(k,46) - mat(k,128) = -(rxt(k,246)*y(k,63) + (rxt(k,247) + rxt(k,261)) * y(k,98)) + mat(k,128) = -(rxt(k,246)*y(k,63) + (rxt(k,247) + rxt(k,261)) * y(k,99)) mat(k,570) = -rxt(k,246)*y(k,35) mat(k,821) = -(rxt(k,247) + rxt(k,261)) * y(k,35) - mat(k,290) = -(rxt(k,212)*y(k,23) + rxt(k,213)*y(k,41) + rxt(k,214)*y(k,102) & + mat(k,290) = -(rxt(k,212)*y(k,23) + rxt(k,213)*y(k,41) + rxt(k,214)*y(k,103) & + rxt(k,215)*y(k,51)) mat(k,390) = -rxt(k,212)*y(k,39) mat(k,864) = -rxt(k,213)*y(k,39) mat(k,936) = -rxt(k,214)*y(k,39) mat(k,887) = -rxt(k,215)*y(k,39) - mat(k,62) = rxt(k,207)*y(k,94) - mat(k,72) = rxt(k,185)*y(k,94) - mat(k,83) = 2.000_r8*rxt(k,216)*y(k,94) - mat(k,91) = rxt(k,217)*y(k,94) + mat(k,62) = rxt(k,207)*y(k,95) + mat(k,72) = rxt(k,185)*y(k,95) + mat(k,83) = 2.000_r8*rxt(k,216)*y(k,95) + mat(k,91) = rxt(k,217)*y(k,95) mat(k,713) = rxt(k,207)*y(k,10) + rxt(k,185)*y(k,14) + 2.000_r8*rxt(k,216) & *y(k,33) + rxt(k,217)*y(k,34) - mat(k,439) = -((rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,89) + rxt(k,116) & + mat(k,439) = -((rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,90) + rxt(k,116) & *y(k,70) + rxt(k,119)*y(k,71)) mat(k,550) = -(rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,40) mat(k,507) = -rxt(k,116)*y(k,40) mat(k,527) = -rxt(k,119)*y(k,40) - mat(k,473) = rxt(k,237)*y(k,98) - mat(k,395) = rxt(k,243)*y(k,94) + mat(k,473) = rxt(k,237)*y(k,99) + mat(k,395) = rxt(k,243)*y(k,95) mat(k,773) = rxt(k,157)*y(k,41) mat(k,293) = rxt(k,213)*y(k,41) mat(k,867) = rxt(k,157)*y(k,25) + rxt(k,213)*y(k,39) + rxt(k,111)*y(k,69) & - + rxt(k,94)*y(k,94) + rxt(k,120)*y(k,98) - mat(k,257) = rxt(k,211)*y(k,94) - mat(k,452) = rxt(k,188)*y(k,94) - mat(k,350) = rxt(k,143)*y(k,98) - mat(k,674) = rxt(k,111)*y(k,41) + rxt(k,123)*y(k,98) - mat(k,144) = rxt(k,249)*y(k,98) - mat(k,237) = rxt(k,255)*y(k,98) - mat(k,426) = rxt(k,260)*y(k,98) + + rxt(k,94)*y(k,95) + rxt(k,120)*y(k,99) + mat(k,257) = rxt(k,211)*y(k,95) + mat(k,452) = rxt(k,188)*y(k,95) + mat(k,350) = rxt(k,143)*y(k,99) + mat(k,674) = rxt(k,111)*y(k,41) + rxt(k,123)*y(k,99) + mat(k,144) = rxt(k,249)*y(k,99) + mat(k,237) = rxt(k,255)*y(k,99) + mat(k,426) = rxt(k,260)*y(k,99) mat(k,716) = rxt(k,243)*y(k,23) + rxt(k,94)*y(k,41) + rxt(k,211)*y(k,45) & + rxt(k,188)*y(k,49) mat(k,844) = rxt(k,237)*y(k,17) + rxt(k,120)*y(k,41) + rxt(k,143)*y(k,55) & - + rxt(k,123)*y(k,69) + rxt(k,249)*y(k,73) + rxt(k,255)*y(k,76) & - + rxt(k,260)*y(k,78) - mat(k,882) = -(rxt(k,94)*y(k,94) + rxt(k,111)*y(k,69) + rxt(k,120)*y(k,98) & + + rxt(k,123)*y(k,69) + rxt(k,249)*y(k,74) + rxt(k,255)*y(k,77) & + + rxt(k,260)*y(k,79) + mat(k,882) = -(rxt(k,94)*y(k,95) + rxt(k,111)*y(k,69) + rxt(k,120)*y(k,99) & + rxt(k,157)*y(k,25) + rxt(k,213)*y(k,39)) mat(k,731) = -rxt(k,94)*y(k,41) mat(k,689) = -rxt(k,111)*y(k,41) mat(k,859) = -rxt(k,120)*y(k,41) mat(k,788) = -rxt(k,157)*y(k,41) mat(k,296) = -rxt(k,213)*y(k,41) - mat(k,407) = rxt(k,244)*y(k,94) - mat(k,445) = rxt(k,113)*y(k,89) + mat(k,407) = rxt(k,244)*y(k,95) + mat(k,445) = rxt(k,113)*y(k,90) mat(k,565) = rxt(k,113)*y(k,40) mat(k,731) = mat(k,731) + rxt(k,244)*y(k,23) - mat(k,32) = -(rxt(k,209)*y(k,94)) + mat(k,32) = -(rxt(k,209)*y(k,95)) mat(k,694) = -rxt(k,209)*y(k,42) - mat(k,228) = -(rxt(k,112)*y(k,69) + rxt(k,121)*y(k,98) + rxt(k,158)*y(k,25)) + mat(k,228) = -(rxt(k,112)*y(k,69) + rxt(k,121)*y(k,99) + rxt(k,158)*y(k,25)) mat(k,658) = -rxt(k,112)*y(k,43) mat(k,830) = -rxt(k,121)*y(k,43) mat(k,765) = -rxt(k,158)*y(k,43) - mat(k,545) = 2.000_r8*rxt(k,127)*y(k,89) - mat(k,830) = mat(k,830) + 2.000_r8*rxt(k,126)*y(k,98) - mat(k,107) = rxt(k,262)*y(k,102) - mat(k,933) = rxt(k,262)*y(k,80) - mat(k,256) = -(rxt(k,204)*y(k,69) + rxt(k,205)*y(k,98) + (rxt(k,210) & - + rxt(k,211)) * y(k,94)) + mat(k,545) = 2.000_r8*rxt(k,127)*y(k,90) + mat(k,830) = mat(k,830) + 2.000_r8*rxt(k,126)*y(k,99) + mat(k,107) = rxt(k,262)*y(k,103) + mat(k,933) = rxt(k,262)*y(k,81) + mat(k,256) = -(rxt(k,204)*y(k,69) + rxt(k,205)*y(k,99) + (rxt(k,210) & + + rxt(k,211)) * y(k,95)) mat(k,662) = -rxt(k,204)*y(k,45) mat(k,832) = -rxt(k,205)*y(k,45) mat(k,712) = -(rxt(k,210) + rxt(k,211)) * y(k,45) - mat(k,792) = rxt(k,191)*y(k,17) + rxt(k,192)*y(k,89) + mat(k,792) = rxt(k,191)*y(k,17) + rxt(k,192)*y(k,90) mat(k,469) = rxt(k,191)*y(k,3) mat(k,547) = rxt(k,192)*y(k,3) - mat(k,85) = -(rxt(k,227)*y(k,98) + rxt(k,232)*y(k,94)) + mat(k,85) = -(rxt(k,227)*y(k,99) + rxt(k,232)*y(k,95)) mat(k,816) = -rxt(k,227)*y(k,46) mat(k,704) = -rxt(k,232)*y(k,46) - mat(k,95) = -(rxt(k,228)*y(k,98) + rxt(k,233)*y(k,94)) + mat(k,95) = -(rxt(k,228)*y(k,99) + rxt(k,233)*y(k,95)) mat(k,818) = -rxt(k,228)*y(k,47) mat(k,706) = -rxt(k,233)*y(k,47) - mat(k,113) = -(rxt(k,229)*y(k,98) + rxt(k,234)*y(k,94)) + mat(k,113) = -(rxt(k,229)*y(k,99) + rxt(k,234)*y(k,95)) mat(k,820) = -rxt(k,229)*y(k,48) mat(k,708) = -rxt(k,234)*y(k,48) - mat(k,453) = -(rxt(k,175)*y(k,69) + rxt(k,176)*y(k,98) + (rxt(k,187) & - + rxt(k,188)) * y(k,94) + (rxt(k,268) + rxt(k,274) + rxt(k,279) & + mat(k,453) = -(rxt(k,175)*y(k,69) + rxt(k,176)*y(k,99) + (rxt(k,187) & + + rxt(k,188)) * y(k,95) + (rxt(k,268) + rxt(k,274) + rxt(k,279) & ) * y(k,54) + (rxt(k,273) + rxt(k,278) + rxt(k,283)) * y(k,29) & + (rxt(k,275) + rxt(k,280)) * y(k,53)) mat(k,675) = -rxt(k,175)*y(k,49) @@ -386,8 +386,8 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) mat(k,774) = rxt(k,218)*y(k,16) + rxt(k,155)*y(k,17) + rxt(k,220)*y(k,18) & + 2.000_r8*rxt(k,223)*y(k,20) + rxt(k,156)*y(k,23) + rxt(k,225) & *y(k,24) + rxt(k,157)*y(k,41) + rxt(k,158)*y(k,43) + rxt(k,177) & - *y(k,54) + rxt(k,159)*y(k,89) - mat(k,604) = rxt(k,174)*y(k,98) + *y(k,54) + rxt(k,159)*y(k,90) + mat(k,604) = rxt(k,174)*y(k,99) mat(k,868) = rxt(k,157)*y(k,25) mat(k,229) = rxt(k,158)*y(k,25) mat(k,266) = mat(k,266) + rxt(k,177)*y(k,25) @@ -395,63 +395,63 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) mat(k,845) = mat(k,845) + rxt(k,174)*y(k,28) mat(k,387) = rxt(k,212)*y(k,39) mat(k,289) = rxt(k,212)*y(k,23) + rxt(k,213)*y(k,41) + rxt(k,215)*y(k,51) & - + rxt(k,214)*y(k,102) + + rxt(k,214)*y(k,103) mat(k,863) = rxt(k,213)*y(k,39) mat(k,886) = rxt(k,215)*y(k,39) mat(k,935) = rxt(k,214)*y(k,39) - mat(k,906) = -(rxt(k,152)*y(k,98) + rxt(k,215)*y(k,39)) + mat(k,906) = -(rxt(k,152)*y(k,99) + rxt(k,215)*y(k,39)) mat(k,860) = -rxt(k,152)*y(k,51) mat(k,297) = -rxt(k,215)*y(k,51) mat(k,489) = rxt(k,235)*y(k,63) mat(k,316) = (rxt(k,273)+rxt(k,278)+rxt(k,283))*y(k,49) mat(k,133) = rxt(k,246)*y(k,63) mat(k,466) = (rxt(k,273)+rxt(k,278)+rxt(k,283))*y(k,29) - mat(k,648) = rxt(k,151)*y(k,98) + mat(k,648) = rxt(k,151)*y(k,99) mat(k,591) = rxt(k,235)*y(k,17) + rxt(k,246)*y(k,35) mat(k,860) = mat(k,860) + rxt(k,151)*y(k,62) - mat(k,167) = -(rxt(k,128)*y(k,98)) + mat(k,167) = -(rxt(k,128)*y(k,99)) mat(k,826) = -rxt(k,128)*y(k,52) - mat(k,624) = rxt(k,149)*y(k,89) + mat(k,624) = rxt(k,149)*y(k,90) mat(k,544) = rxt(k,149)*y(k,62) mat(k,248) = -(rxt(k,206)*y(k,69) + (rxt(k,275) + rxt(k,280)) * y(k,49)) mat(k,661) = -rxt(k,206)*y(k,53) mat(k,449) = -(rxt(k,275) + rxt(k,280)) * y(k,53) - mat(k,912) = rxt(k,198)*y(k,89) + mat(k,912) = rxt(k,198)*y(k,90) mat(k,546) = rxt(k,198)*y(k,5) - mat(k,265) = -(rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,98) & + mat(k,265) = -(rxt(k,177)*y(k,25) + rxt(k,178)*y(k,69) + rxt(k,179)*y(k,99) & + (rxt(k,268) + rxt(k,274) + rxt(k,279)) * y(k,49)) mat(k,766) = -rxt(k,177)*y(k,54) mat(k,663) = -rxt(k,178)*y(k,54) mat(k,833) = -rxt(k,179)*y(k,54) mat(k,450) = -(rxt(k,268) + rxt(k,274) + rxt(k,279)) * y(k,54) - mat(k,598) = rxt(k,166)*y(k,89) - mat(k,307) = rxt(k,171)*y(k,98) + mat(k,598) = rxt(k,166)*y(k,90) + mat(k,307) = rxt(k,171)*y(k,99) mat(k,548) = rxt(k,166)*y(k,28) mat(k,833) = mat(k,833) + rxt(k,171)*y(k,29) mat(k,347) = -(rxt(k,131)*y(k,61) + (rxt(k,132) + rxt(k,133) + rxt(k,134) & - ) * y(k,62) + rxt(k,135)*y(k,70) + rxt(k,143)*y(k,98) + rxt(k,296) & - *y(k,97)) + ) * y(k,62) + rxt(k,135)*y(k,70) + rxt(k,143)*y(k,99) + rxt(k,296) & + *y(k,98)) mat(k,738) = -rxt(k,131)*y(k,55) mat(k,629) = -(rxt(k,132) + rxt(k,133) + rxt(k,134)) * y(k,55) mat(k,503) = -rxt(k,135)*y(k,55) mat(k,838) = -rxt(k,143)*y(k,55) mat(k,360) = -rxt(k,296)*y(k,55) - mat(k,670) = rxt(k,129)*y(k,90) + rxt(k,293)*y(k,93) - mat(k,503) = mat(k,503) + rxt(k,294)*y(k,93) - mat(k,325) = 1.100_r8*rxt(k,289)*y(k,91) + .200_r8*rxt(k,287)*y(k,92) + mat(k,670) = rxt(k,129)*y(k,91) + rxt(k,293)*y(k,94) + mat(k,503) = mat(k,503) + rxt(k,294)*y(k,94) + mat(k,325) = 1.100_r8*rxt(k,289)*y(k,92) + .200_r8*rxt(k,287)*y(k,93) mat(k,335) = rxt(k,129)*y(k,69) - mat(k,223) = 1.100_r8*rxt(k,289)*y(k,88) - mat(k,245) = .200_r8*rxt(k,287)*y(k,88) + mat(k,223) = 1.100_r8*rxt(k,289)*y(k,89) + mat(k,245) = .200_r8*rxt(k,287)*y(k,89) mat(k,276) = rxt(k,293)*y(k,69) + rxt(k,294)*y(k,70) - mat(k,103) = -((rxt(k,147) + rxt(k,148)) * y(k,94)) + mat(k,103) = -((rxt(k,147) + rxt(k,148)) * y(k,95)) mat(k,707) = -(rxt(k,147) + rxt(k,148)) * y(k,56) mat(k,342) = rxt(k,132)*y(k,62) mat(k,622) = rxt(k,132)*y(k,55) mat(k,623) = rxt(k,150)*y(k,63) mat(k,569) = rxt(k,150)*y(k,62) - mat(k,752) = -(rxt(k,131)*y(k,55) + rxt(k,140)*y(k,63) + rxt(k,144)*y(k,89) & + mat(k,752) = -(rxt(k,131)*y(k,55) + rxt(k,140)*y(k,63) + rxt(k,144)*y(k,90) & + rxt(k,145)*y(k,71) + rxt(k,146)*y(k,69) + rxt(k,167)*y(k,28) & - + rxt(k,199)*y(k,5) + rxt(k,239)*y(k,21) + rxt(k,298)*y(k,97)) + + rxt(k,199)*y(k,5) + rxt(k,239)*y(k,21) + rxt(k,298)*y(k,98)) mat(k,355) = -rxt(k,131)*y(k,61) mat(k,586) = -rxt(k,140)*y(k,61) mat(k,561) = -rxt(k,144)*y(k,61) @@ -462,12 +462,12 @@ subroutine nlnmat02( avec_len, mat, y, rxt ) mat(k,418) = -rxt(k,239)*y(k,61) mat(k,368) = -rxt(k,298)*y(k,61) mat(k,355) = mat(k,355) + 2.000_r8*rxt(k,133)*y(k,62) + rxt(k,135)*y(k,70) & - + rxt(k,143)*y(k,98) - mat(k,106) = 2.000_r8*rxt(k,147)*y(k,94) + + rxt(k,143)*y(k,99) + mat(k,106) = 2.000_r8*rxt(k,147)*y(k,95) mat(k,643) = 2.000_r8*rxt(k,133)*y(k,55) + rxt(k,136)*y(k,69) + rxt(k,256) & - *y(k,78) + *y(k,79) mat(k,685) = mat(k,685) + rxt(k,136)*y(k,62) - mat(k,515) = rxt(k,135)*y(k,55) + rxt(k,130)*y(k,90) + mat(k,515) = rxt(k,135)*y(k,55) + rxt(k,130)*y(k,91) mat(k,433) = rxt(k,256)*y(k,62) mat(k,341) = rxt(k,130)*y(k,70) mat(k,727) = 2.000_r8*rxt(k,147)*y(k,56) @@ -494,8 +494,8 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) do k = 1,avec_len mat(k,640) = -((rxt(k,132) + rxt(k,133) + rxt(k,134)) * y(k,55) + (rxt(k,136) & + rxt(k,138)) * y(k,69) + rxt(k,137)*y(k,71) + rxt(k,149) & - *y(k,89) + rxt(k,150)*y(k,63) + rxt(k,151)*y(k,98) + rxt(k,169) & - *y(k,28) + rxt(k,200)*y(k,5) + rxt(k,256)*y(k,78)) + *y(k,90) + rxt(k,150)*y(k,63) + rxt(k,151)*y(k,99) + rxt(k,169) & + *y(k,28) + rxt(k,200)*y(k,5) + rxt(k,256)*y(k,79)) mat(k,352) = -(rxt(k,132) + rxt(k,133) + rxt(k,134)) * y(k,62) mat(k,682) = -(rxt(k,136) + rxt(k,138)) * y(k,62) mat(k,533) = -rxt(k,137)*y(k,62) @@ -508,18 +508,18 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,922) = mat(k,922) + rxt(k,199)*y(k,61) mat(k,417) = rxt(k,239)*y(k,61) mat(k,611) = mat(k,611) + rxt(k,167)*y(k,61) - mat(k,171) = rxt(k,128)*y(k,98) + mat(k,171) = rxt(k,128)*y(k,99) mat(k,749) = rxt(k,199)*y(k,5) + rxt(k,239)*y(k,21) + rxt(k,167)*y(k,28) & + 2.000_r8*rxt(k,140)*y(k,63) + rxt(k,146)*y(k,69) + rxt(k,145) & - *y(k,71) + rxt(k,144)*y(k,89) + *y(k,71) + rxt(k,144)*y(k,90) mat(k,583) = mat(k,583) + 2.000_r8*rxt(k,140)*y(k,61) + rxt(k,141)*y(k,69) & - + rxt(k,139)*y(k,89) + rxt(k,142)*y(k,98) + + rxt(k,139)*y(k,90) + rxt(k,142)*y(k,99) mat(k,682) = mat(k,682) + rxt(k,146)*y(k,61) + rxt(k,141)*y(k,63) mat(k,533) = mat(k,533) + rxt(k,145)*y(k,61) mat(k,558) = mat(k,558) + rxt(k,144)*y(k,61) + rxt(k,139)*y(k,63) mat(k,852) = mat(k,852) + rxt(k,128)*y(k,52) + rxt(k,142)*y(k,63) - mat(k,581) = -(rxt(k,139)*y(k,89) + rxt(k,140)*y(k,61) + rxt(k,141)*y(k,69) & - + rxt(k,142)*y(k,98) + rxt(k,150)*y(k,62) + rxt(k,235)*y(k,17) & + mat(k,581) = -(rxt(k,139)*y(k,90) + rxt(k,140)*y(k,61) + rxt(k,141)*y(k,69) & + + rxt(k,142)*y(k,99) + rxt(k,150)*y(k,62) + rxt(k,235)*y(k,17) & + rxt(k,246)*y(k,35)) mat(k,556) = -rxt(k,139)*y(k,63) mat(k,747) = -rxt(k,140)*y(k,63) @@ -530,9 +530,9 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,131) = -rxt(k,246)*y(k,63) mat(k,204) = rxt(k,201)*y(k,69) mat(k,779) = rxt(k,168)*y(k,29) - mat(k,310) = rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,98) + mat(k,310) = rxt(k,168)*y(k,25) + rxt(k,170)*y(k,69) + rxt(k,171)*y(k,99) mat(k,294) = rxt(k,215)*y(k,51) - mat(k,896) = rxt(k,215)*y(k,39) + rxt(k,152)*y(k,98) + mat(k,896) = rxt(k,215)*y(k,39) + rxt(k,152)*y(k,99) mat(k,638) = mat(k,638) + rxt(k,138)*y(k,69) + rxt(k,137)*y(k,71) mat(k,680) = mat(k,680) + rxt(k,201)*y(k,6) + rxt(k,170)*y(k,29) + rxt(k,138) & *y(k,62) @@ -540,13 +540,13 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,850) = mat(k,850) + rxt(k,171)*y(k,29) + rxt(k,152)*y(k,51) mat(k,683) = -(rxt(k,108)*y(k,71) + 4._r8*rxt(k,109)*y(k,69) + rxt(k,110) & *y(k,70) + rxt(k,111)*y(k,41) + rxt(k,112)*y(k,43) + rxt(k,117) & - *y(k,89) + rxt(k,123)*y(k,98) + (rxt(k,136) + rxt(k,138) & + *y(k,90) + rxt(k,123)*y(k,99) + (rxt(k,136) + rxt(k,138) & ) * y(k,62) + rxt(k,141)*y(k,63) + rxt(k,146)*y(k,61) + rxt(k,170) & *y(k,29) + rxt(k,172)*y(k,28) + rxt(k,175)*y(k,49) + rxt(k,178) & *y(k,54) + rxt(k,201)*y(k,6) + rxt(k,202)*y(k,5) + rxt(k,204) & *y(k,45) + rxt(k,206)*y(k,53) + rxt(k,236)*y(k,17) + rxt(k,248) & - *y(k,73) + (rxt(k,291) + rxt(k,292)) * y(k,91) + rxt(k,293) & - *y(k,93)) + *y(k,74) + (rxt(k,291) + rxt(k,292)) * y(k,92) + rxt(k,293) & + *y(k,94)) mat(k,534) = -rxt(k,108)*y(k,69) mat(k,513) = -rxt(k,110)*y(k,69) mat(k,876) = -rxt(k,111)*y(k,69) @@ -568,31 +568,31 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,145) = -rxt(k,248)*y(k,69) mat(k,227) = -(rxt(k,291) + rxt(k,292)) * y(k,69) mat(k,280) = -rxt(k,293)*y(k,69) - mat(k,443) = rxt(k,115)*y(k,89) + mat(k,443) = rxt(k,115)*y(k,90) mat(k,353) = rxt(k,131)*y(k,61) + rxt(k,132)*y(k,62) + rxt(k,135)*y(k,70) & - + rxt(k,296)*y(k,97) + + rxt(k,296)*y(k,98) mat(k,750) = mat(k,750) + rxt(k,131)*y(k,55) mat(k,641) = mat(k,641) + rxt(k,132)*y(k,55) - mat(k,513) = mat(k,513) + rxt(k,135)*y(k,55) + rxt(k,250)*y(k,76) & - + rxt(k,257)*y(k,78) + rxt(k,295)*y(k,93) + (rxt(k,97)+rxt(k,98)) & - *y(k,94) + rxt(k,302)*y(k,99) + rxt(k,306)*y(k,100) + mat(k,513) = mat(k,513) + rxt(k,135)*y(k,55) + rxt(k,250)*y(k,77) & + + rxt(k,257)*y(k,79) + rxt(k,295)*y(k,94) + (rxt(k,97)+rxt(k,98)) & + *y(k,95) + rxt(k,302)*y(k,100) + rxt(k,306)*y(k,101) mat(k,240) = rxt(k,250)*y(k,70) mat(k,432) = rxt(k,257)*y(k,70) - mat(k,329) = rxt(k,287)*y(k,92) + 1.150_r8*rxt(k,288)*y(k,97) + mat(k,329) = rxt(k,287)*y(k,93) + 1.150_r8*rxt(k,288)*y(k,98) mat(k,559) = mat(k,559) + rxt(k,115)*y(k,40) - mat(k,339) = rxt(k,301)*y(k,99) - mat(k,246) = rxt(k,287)*y(k,88) + mat(k,339) = rxt(k,301)*y(k,100) + mat(k,246) = rxt(k,287)*y(k,89) mat(k,280) = mat(k,280) + rxt(k,295)*y(k,70) mat(k,725) = (rxt(k,97)+rxt(k,98))*y(k,70) - mat(k,366) = rxt(k,296)*y(k,55) + 1.150_r8*rxt(k,288)*y(k,88) - mat(k,853) = mat(k,853) + 2.000_r8*rxt(k,125)*y(k,98) - mat(k,383) = rxt(k,302)*y(k,70) + rxt(k,301)*y(k,90) + mat(k,366) = rxt(k,296)*y(k,55) + 1.150_r8*rxt(k,288)*y(k,89) + mat(k,853) = mat(k,853) + 2.000_r8*rxt(k,125)*y(k,99) + mat(k,383) = rxt(k,302)*y(k,70) + rxt(k,301)*y(k,91) mat(k,193) = rxt(k,306)*y(k,70) - mat(k,508) = -(rxt(k,97)*y(k,94) + rxt(k,102)*y(k,95) + rxt(k,110)*y(k,69) & - + rxt(k,116)*y(k,40) + rxt(k,130)*y(k,90) + rxt(k,135)*y(k,55) & - + rxt(k,250)*y(k,76) + rxt(k,257)*y(k,78) + rxt(k,290)*y(k,91) & - + (rxt(k,294) + rxt(k,295)) * y(k,93) + rxt(k,302)*y(k,99) & - + rxt(k,306)*y(k,100)) + mat(k,508) = -(rxt(k,97)*y(k,95) + rxt(k,102)*y(k,96) + rxt(k,110)*y(k,69) & + + rxt(k,116)*y(k,40) + rxt(k,130)*y(k,91) + rxt(k,135)*y(k,55) & + + rxt(k,250)*y(k,77) + rxt(k,257)*y(k,79) + rxt(k,290)*y(k,92) & + + (rxt(k,294) + rxt(k,295)) * y(k,94) + rxt(k,302)*y(k,100) & + + rxt(k,306)*y(k,101)) mat(k,719) = -rxt(k,97)*y(k,70) mat(k,78) = -rxt(k,102)*y(k,70) mat(k,677) = -rxt(k,110)*y(k,70) @@ -605,46 +605,46 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,279) = -(rxt(k,294) + rxt(k,295)) * y(k,70) mat(k,380) = -rxt(k,302)*y(k,70) mat(k,192) = -rxt(k,306)*y(k,70) - mat(k,798) = rxt(k,193)*y(k,71) + rxt(k,192)*y(k,89) + mat(k,798) = rxt(k,193)*y(k,71) + rxt(k,192)*y(k,90) mat(k,917) = 2.000_r8*rxt(k,194)*y(k,5) + (rxt(k,196)+rxt(k,197))*y(k,28) & - + rxt(k,202)*y(k,69) + rxt(k,198)*y(k,89) - mat(k,414) = rxt(k,238)*y(k,89) - mat(k,776) = rxt(k,161)*y(k,71) + rxt(k,159)*y(k,89) + + rxt(k,202)*y(k,69) + rxt(k,198)*y(k,90) + mat(k,414) = rxt(k,238)*y(k,90) + mat(k,776) = rxt(k,161)*y(k,71) + rxt(k,159)*y(k,90) mat(k,606) = (rxt(k,196)+rxt(k,197))*y(k,5) + (2.000_r8*rxt(k,163) & +2.000_r8*rxt(k,164))*y(k,28) + rxt(k,172)*y(k,69) + rxt(k,166) & - *y(k,89) + rxt(k,174)*y(k,98) - mat(k,440) = mat(k,440) + rxt(k,119)*y(k,71) + rxt(k,113)*y(k,89) - mat(k,168) = rxt(k,128)*y(k,98) + *y(k,90) + rxt(k,174)*y(k,99) + mat(k,440) = mat(k,440) + rxt(k,119)*y(k,71) + rxt(k,113)*y(k,90) + mat(k,168) = rxt(k,128)*y(k,99) mat(k,351) = mat(k,351) + rxt(k,134)*y(k,62) - mat(k,104) = rxt(k,148)*y(k,94) - mat(k,744) = rxt(k,145)*y(k,71) + rxt(k,298)*y(k,97) + mat(k,104) = rxt(k,148)*y(k,95) + mat(k,744) = rxt(k,145)*y(k,71) + rxt(k,298)*y(k,98) mat(k,635) = rxt(k,134)*y(k,55) + rxt(k,136)*y(k,69) + rxt(k,137)*y(k,71) - mat(k,578) = rxt(k,141)*y(k,69) + rxt(k,139)*y(k,89) + mat(k,578) = rxt(k,141)*y(k,69) + rxt(k,139)*y(k,90) mat(k,677) = mat(k,677) + rxt(k,202)*y(k,5) + rxt(k,172)*y(k,28) + rxt(k,136) & *y(k,62) + rxt(k,141)*y(k,63) + 2.000_r8*rxt(k,109)*y(k,69) & - + 2.000_r8*rxt(k,108)*y(k,71) + rxt(k,117)*y(k,89) + rxt(k,101) & - *y(k,95) + rxt(k,123)*y(k,98) - mat(k,508) = mat(k,508) + 2.000_r8*rxt(k,102)*y(k,95) + + 2.000_r8*rxt(k,108)*y(k,71) + rxt(k,117)*y(k,90) + rxt(k,101) & + *y(k,96) + rxt(k,123)*y(k,99) + mat(k,508) = mat(k,508) + 2.000_r8*rxt(k,102)*y(k,96) mat(k,528) = rxt(k,193)*y(k,3) + rxt(k,161)*y(k,25) + rxt(k,119)*y(k,40) & + rxt(k,145)*y(k,61) + rxt(k,137)*y(k,62) + 2.000_r8*rxt(k,108) & - *y(k,69) + rxt(k,252)*y(k,76) + rxt(k,258)*y(k,78) & - + 2.000_r8*rxt(k,118)*y(k,89) + 2.000_r8*rxt(k,99)*y(k,94) & - + rxt(k,124)*y(k,98) + *y(k,69) + rxt(k,252)*y(k,77) + rxt(k,258)*y(k,79) & + + 2.000_r8*rxt(k,118)*y(k,90) + 2.000_r8*rxt(k,99)*y(k,95) & + + rxt(k,124)*y(k,99) mat(k,238) = mat(k,238) + rxt(k,252)*y(k,71) mat(k,427) = mat(k,427) + rxt(k,258)*y(k,71) mat(k,553) = rxt(k,192)*y(k,3) + rxt(k,198)*y(k,5) + rxt(k,238)*y(k,21) & + rxt(k,159)*y(k,25) + rxt(k,166)*y(k,28) + rxt(k,113)*y(k,40) & + rxt(k,139)*y(k,63) + rxt(k,117)*y(k,69) + 2.000_r8*rxt(k,118) & - *y(k,71) + 2.000_r8*rxt(k,127)*y(k,89) + rxt(k,122)*y(k,98) + *y(k,71) + 2.000_r8*rxt(k,127)*y(k,90) + rxt(k,122)*y(k,99) mat(k,719) = mat(k,719) + rxt(k,148)*y(k,56) + 2.000_r8*rxt(k,99)*y(k,71) mat(k,78) = mat(k,78) + rxt(k,101)*y(k,69) + 2.000_r8*rxt(k,102)*y(k,70) mat(k,364) = rxt(k,298)*y(k,61) mat(k,847) = rxt(k,174)*y(k,28) + rxt(k,128)*y(k,52) + rxt(k,123)*y(k,69) & - + rxt(k,124)*y(k,71) + rxt(k,122)*y(k,89) - mat(k,529) = -(rxt(k,99)*y(k,94) + rxt(k,108)*y(k,69) + rxt(k,118)*y(k,89) & - + rxt(k,119)*y(k,40) + rxt(k,124)*y(k,98) + rxt(k,137)*y(k,62) & + + rxt(k,124)*y(k,71) + rxt(k,122)*y(k,90) + mat(k,529) = -(rxt(k,99)*y(k,95) + rxt(k,108)*y(k,69) + rxt(k,118)*y(k,90) & + + rxt(k,119)*y(k,40) + rxt(k,124)*y(k,99) + rxt(k,137)*y(k,62) & + rxt(k,145)*y(k,61) + rxt(k,161)*y(k,25) + rxt(k,193)*y(k,3) & - + rxt(k,252)*y(k,76) + rxt(k,258)*y(k,78)) + + rxt(k,252)*y(k,77) + rxt(k,258)*y(k,79)) mat(k,720) = -rxt(k,99)*y(k,71) mat(k,678) = -rxt(k,108)*y(k,71) mat(k,554) = -rxt(k,118)*y(k,71) @@ -658,49 +658,49 @@ subroutine nlnmat03( avec_len, mat, y, rxt ) mat(k,428) = -rxt(k,258)*y(k,71) mat(k,678) = mat(k,678) + rxt(k,110)*y(k,70) mat(k,509) = rxt(k,110)*y(k,69) - mat(k,134) = -(rxt(k,259)*y(k,78)) - mat(k,422) = -rxt(k,259)*y(k,72) + mat(k,134) = -(rxt(k,259)*y(k,79)) + mat(k,422) = -rxt(k,259)*y(k,73) mat(k,910) = rxt(k,195)*y(k,28) mat(k,597) = rxt(k,195)*y(k,5) + 2.000_r8*rxt(k,165)*y(k,28) - mat(k,139) = -(rxt(k,248)*y(k,69) + rxt(k,249)*y(k,98)) - mat(k,653) = -rxt(k,248)*y(k,73) - mat(k,822) = -rxt(k,249)*y(k,73) - mat(k,235) = -(rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,98)) - mat(k,497) = -rxt(k,250)*y(k,76) - mat(k,524) = -rxt(k,252)*y(k,76) - mat(k,831) = -rxt(k,255)*y(k,76) + mat(k,139) = -(rxt(k,248)*y(k,69) + rxt(k,249)*y(k,99)) + mat(k,653) = -rxt(k,248)*y(k,74) + mat(k,822) = -rxt(k,249)*y(k,74) + mat(k,235) = -(rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,99)) + mat(k,497) = -rxt(k,250)*y(k,77) + mat(k,524) = -rxt(k,252)*y(k,77) + mat(k,831) = -rxt(k,255)*y(k,77) mat(k,425) = -(rxt(k,253)*y(k,5) + rxt(k,254)*y(k,28) + rxt(k,256)*y(k,62) & - + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,72) & - + rxt(k,260)*y(k,98)) - mat(k,914) = -rxt(k,253)*y(k,78) - mat(k,602) = -rxt(k,254)*y(k,78) - mat(k,632) = -rxt(k,256)*y(k,78) - mat(k,506) = -rxt(k,257)*y(k,78) - mat(k,526) = -rxt(k,258)*y(k,78) - mat(k,136) = -rxt(k,259)*y(k,78) - mat(k,843) = -rxt(k,260)*y(k,78) - mat(k,673) = rxt(k,248)*y(k,73) - mat(k,506) = mat(k,506) + rxt(k,250)*y(k,76) - mat(k,526) = mat(k,526) + rxt(k,252)*y(k,76) + + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,73) & + + rxt(k,260)*y(k,99)) + mat(k,914) = -rxt(k,253)*y(k,79) + mat(k,602) = -rxt(k,254)*y(k,79) + mat(k,632) = -rxt(k,256)*y(k,79) + mat(k,506) = -rxt(k,257)*y(k,79) + mat(k,526) = -rxt(k,258)*y(k,79) + mat(k,136) = -rxt(k,259)*y(k,79) + mat(k,843) = -rxt(k,260)*y(k,79) + mat(k,673) = rxt(k,248)*y(k,74) + mat(k,506) = mat(k,506) + rxt(k,250)*y(k,77) + mat(k,526) = mat(k,526) + rxt(k,252)*y(k,77) mat(k,143) = rxt(k,248)*y(k,69) - mat(k,236) = rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,98) - mat(k,843) = mat(k,843) + rxt(k,255)*y(k,76) - mat(k,300) = -(rxt(k,251)*y(k,98)) - mat(k,836) = -rxt(k,251)*y(k,79) - mat(k,913) = rxt(k,253)*y(k,78) - mat(k,599) = rxt(k,254)*y(k,78) - mat(k,129) = rxt(k,246)*y(k,63) + (rxt(k,247)+.500_r8*rxt(k,261))*y(k,98) - mat(k,627) = rxt(k,256)*y(k,78) + mat(k,236) = rxt(k,250)*y(k,70) + rxt(k,252)*y(k,71) + rxt(k,255)*y(k,99) + mat(k,843) = mat(k,843) + rxt(k,255)*y(k,77) + mat(k,300) = -(rxt(k,251)*y(k,99)) + mat(k,836) = -rxt(k,251)*y(k,80) + mat(k,913) = rxt(k,253)*y(k,79) + mat(k,599) = rxt(k,254)*y(k,79) + mat(k,129) = rxt(k,246)*y(k,63) + (rxt(k,247)+.500_r8*rxt(k,261))*y(k,99) + mat(k,627) = rxt(k,256)*y(k,79) mat(k,572) = rxt(k,246)*y(k,35) - mat(k,500) = rxt(k,257)*y(k,78) - mat(k,525) = rxt(k,258)*y(k,78) - mat(k,135) = rxt(k,259)*y(k,78) - mat(k,142) = rxt(k,249)*y(k,98) + mat(k,500) = rxt(k,257)*y(k,79) + mat(k,525) = rxt(k,258)*y(k,79) + mat(k,135) = rxt(k,259)*y(k,79) + mat(k,142) = rxt(k,249)*y(k,99) mat(k,424) = rxt(k,253)*y(k,5) + rxt(k,254)*y(k,28) + rxt(k,256)*y(k,62) & - + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,72) & - + rxt(k,260)*y(k,98) + + rxt(k,257)*y(k,70) + rxt(k,258)*y(k,71) + rxt(k,259)*y(k,73) & + + rxt(k,260)*y(k,99) mat(k,836) = mat(k,836) + (rxt(k,247)+.500_r8*rxt(k,261))*y(k,35) & - + rxt(k,249)*y(k,73) + rxt(k,260)*y(k,78) + + rxt(k,249)*y(k,74) + rxt(k,260)*y(k,79) end do end subroutine nlnmat03 subroutine nlnmat04( avec_len, mat, y, rxt ) @@ -721,86 +721,86 @@ subroutine nlnmat04( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,108) = -(rxt(k,262)*y(k,102)) - mat(k,934) = -rxt(k,262)*y(k,80) - mat(k,299) = rxt(k,251)*y(k,98) - mat(k,819) = rxt(k,251)*y(k,79) - mat(k,323) = -(rxt(k,287)*y(k,92) + rxt(k,288)*y(k,97) + rxt(k,289)*y(k,91)) - mat(k,243) = -rxt(k,287)*y(k,88) - mat(k,358) = -rxt(k,288)*y(k,88) - mat(k,221) = -rxt(k,289)*y(k,88) + mat(k,108) = -(rxt(k,262)*y(k,103)) + mat(k,934) = -rxt(k,262)*y(k,81) + mat(k,299) = rxt(k,251)*y(k,99) + mat(k,819) = rxt(k,251)*y(k,80) + mat(k,323) = -(rxt(k,287)*y(k,93) + rxt(k,288)*y(k,98) + rxt(k,289)*y(k,92)) + mat(k,243) = -rxt(k,287)*y(k,89) + mat(k,358) = -rxt(k,288)*y(k,89) + mat(k,221) = -rxt(k,289)*y(k,89) mat(k,555) = -((rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,40) + rxt(k,117) & - *y(k,69) + rxt(k,118)*y(k,71) + rxt(k,122)*y(k,98) & - + 4._r8*rxt(k,127)*y(k,89) + rxt(k,139)*y(k,63) + rxt(k,144) & + *y(k,69) + rxt(k,118)*y(k,71) + rxt(k,122)*y(k,99) & + + 4._r8*rxt(k,127)*y(k,90) + rxt(k,139)*y(k,63) + rxt(k,144) & *y(k,61) + rxt(k,149)*y(k,62) + (rxt(k,159) + rxt(k,160) & ) * y(k,25) + rxt(k,166)*y(k,28) + rxt(k,192)*y(k,3) + rxt(k,198) & *y(k,5) + rxt(k,238)*y(k,21)) - mat(k,442) = -(rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,89) - mat(k,679) = -rxt(k,117)*y(k,89) - mat(k,530) = -rxt(k,118)*y(k,89) - mat(k,849) = -rxt(k,122)*y(k,89) - mat(k,580) = -rxt(k,139)*y(k,89) - mat(k,746) = -rxt(k,144)*y(k,89) - mat(k,637) = -rxt(k,149)*y(k,89) - mat(k,778) = -(rxt(k,159) + rxt(k,160)) * y(k,89) - mat(k,608) = -rxt(k,166)*y(k,89) - mat(k,800) = -rxt(k,192)*y(k,89) - mat(k,919) = -rxt(k,198)*y(k,89) - mat(k,415) = -rxt(k,238)*y(k,89) + mat(k,442) = -(rxt(k,113) + rxt(k,114) + rxt(k,115)) * y(k,90) + mat(k,679) = -rxt(k,117)*y(k,90) + mat(k,530) = -rxt(k,118)*y(k,90) + mat(k,849) = -rxt(k,122)*y(k,90) + mat(k,580) = -rxt(k,139)*y(k,90) + mat(k,746) = -rxt(k,144)*y(k,90) + mat(k,637) = -rxt(k,149)*y(k,90) + mat(k,778) = -(rxt(k,159) + rxt(k,160)) * y(k,90) + mat(k,608) = -rxt(k,166)*y(k,90) + mat(k,800) = -rxt(k,192)*y(k,90) + mat(k,919) = -rxt(k,198)*y(k,90) + mat(k,415) = -rxt(k,238)*y(k,90) mat(k,800) = mat(k,800) + rxt(k,191)*y(k,17) - mat(k,919) = mat(k,919) + rxt(k,203)*y(k,98) + mat(k,919) = mat(k,919) + rxt(k,203)*y(k,99) mat(k,478) = rxt(k,191)*y(k,3) + rxt(k,155)*y(k,25) + rxt(k,235)*y(k,63) & + rxt(k,236)*y(k,69) - mat(k,213) = rxt(k,220)*y(k,25) + rxt(k,221)*y(k,98) - mat(k,151) = rxt(k,223)*y(k,25) + rxt(k,224)*y(k,98) + mat(k,213) = rxt(k,220)*y(k,25) + rxt(k,221)*y(k,99) + mat(k,151) = rxt(k,223)*y(k,25) + rxt(k,224)*y(k,99) mat(k,415) = mat(k,415) + rxt(k,162)*y(k,28) + rxt(k,239)*y(k,61) - mat(k,399) = rxt(k,243)*y(k,94) + mat(k,399) = rxt(k,243)*y(k,95) mat(k,778) = mat(k,778) + rxt(k,155)*y(k,17) + rxt(k,220)*y(k,18) & + rxt(k,223)*y(k,20) + rxt(k,158)*y(k,43) - mat(k,608) = mat(k,608) + rxt(k,162)*y(k,21) + rxt(k,173)*y(k,98) - mat(k,286) = rxt(k,245)*y(k,98) - mat(k,130) = .500_r8*rxt(k,261)*y(k,98) + mat(k,608) = mat(k,608) + rxt(k,162)*y(k,21) + rxt(k,173)*y(k,99) + mat(k,286) = rxt(k,245)*y(k,99) + mat(k,130) = .500_r8*rxt(k,261)*y(k,99) mat(k,442) = mat(k,442) + rxt(k,116)*y(k,70) - mat(k,230) = rxt(k,158)*y(k,25) + rxt(k,112)*y(k,69) + rxt(k,121)*y(k,98) + mat(k,230) = rxt(k,158)*y(k,25) + rxt(k,112)*y(k,69) + rxt(k,121)*y(k,99) mat(k,746) = mat(k,746) + rxt(k,239)*y(k,21) - mat(k,580) = mat(k,580) + rxt(k,235)*y(k,17) + rxt(k,142)*y(k,98) + mat(k,580) = mat(k,580) + rxt(k,235)*y(k,17) + rxt(k,142)*y(k,99) mat(k,679) = mat(k,679) + rxt(k,236)*y(k,17) + rxt(k,112)*y(k,43) mat(k,510) = rxt(k,116)*y(k,40) - mat(k,530) = mat(k,530) + rxt(k,124)*y(k,98) - mat(k,302) = rxt(k,251)*y(k,98) + mat(k,530) = mat(k,530) + rxt(k,124)*y(k,99) + mat(k,302) = rxt(k,251)*y(k,99) mat(k,721) = rxt(k,243)*y(k,23) mat(k,849) = mat(k,849) + rxt(k,203)*y(k,5) + rxt(k,221)*y(k,18) + rxt(k,224) & *y(k,20) + rxt(k,173)*y(k,28) + rxt(k,245)*y(k,31) & + .500_r8*rxt(k,261)*y(k,35) + rxt(k,121)*y(k,43) + rxt(k,142) & - *y(k,63) + rxt(k,124)*y(k,71) + rxt(k,251)*y(k,79) - mat(k,334) = -(rxt(k,129)*y(k,69) + rxt(k,130)*y(k,70) + rxt(k,301)*y(k,99)) - mat(k,669) = -rxt(k,129)*y(k,90) - mat(k,502) = -rxt(k,130)*y(k,90) - mat(k,375) = -rxt(k,301)*y(k,90) - mat(k,669) = mat(k,669) + rxt(k,291)*y(k,91) - mat(k,324) = .900_r8*rxt(k,289)*y(k,91) + .800_r8*rxt(k,287)*y(k,92) - mat(k,222) = rxt(k,291)*y(k,69) + .900_r8*rxt(k,289)*y(k,88) - mat(k,244) = .800_r8*rxt(k,287)*y(k,88) - mat(k,219) = -(rxt(k,289)*y(k,88) + rxt(k,290)*y(k,70) + (rxt(k,291) & + *y(k,63) + rxt(k,124)*y(k,71) + rxt(k,251)*y(k,80) + mat(k,334) = -(rxt(k,129)*y(k,69) + rxt(k,130)*y(k,70) + rxt(k,301)*y(k,100)) + mat(k,669) = -rxt(k,129)*y(k,91) + mat(k,502) = -rxt(k,130)*y(k,91) + mat(k,375) = -rxt(k,301)*y(k,91) + mat(k,669) = mat(k,669) + rxt(k,291)*y(k,92) + mat(k,324) = .900_r8*rxt(k,289)*y(k,92) + .800_r8*rxt(k,287)*y(k,93) + mat(k,222) = rxt(k,291)*y(k,69) + .900_r8*rxt(k,289)*y(k,89) + mat(k,244) = .800_r8*rxt(k,287)*y(k,89) + mat(k,219) = -(rxt(k,289)*y(k,89) + rxt(k,290)*y(k,70) + (rxt(k,291) & + rxt(k,292)) * y(k,69)) - mat(k,320) = -rxt(k,289)*y(k,91) - mat(k,496) = -rxt(k,290)*y(k,91) - mat(k,657) = -(rxt(k,291) + rxt(k,292)) * y(k,91) - mat(k,242) = -(rxt(k,287)*y(k,88)) - mat(k,321) = -rxt(k,287)*y(k,92) - mat(k,343) = rxt(k,296)*y(k,97) - mat(k,735) = rxt(k,298)*y(k,97) - mat(k,660) = rxt(k,291)*y(k,91) - mat(k,498) = rxt(k,295)*y(k,93) + mat(k,320) = -rxt(k,289)*y(k,92) + mat(k,496) = -rxt(k,290)*y(k,92) + mat(k,657) = -(rxt(k,291) + rxt(k,292)) * y(k,92) + mat(k,242) = -(rxt(k,287)*y(k,89)) + mat(k,321) = -rxt(k,287)*y(k,93) + mat(k,343) = rxt(k,296)*y(k,98) + mat(k,735) = rxt(k,298)*y(k,98) + mat(k,660) = rxt(k,291)*y(k,92) + mat(k,498) = rxt(k,295)*y(k,94) mat(k,220) = rxt(k,291)*y(k,69) mat(k,272) = rxt(k,295)*y(k,70) mat(k,357) = rxt(k,296)*y(k,55) + rxt(k,298)*y(k,61) mat(k,273) = -(rxt(k,293)*y(k,69) + (rxt(k,294) + rxt(k,295)) * y(k,70)) - mat(k,664) = -rxt(k,293)*y(k,93) - mat(k,499) = -(rxt(k,294) + rxt(k,295)) * y(k,93) - mat(k,332) = rxt(k,301)*y(k,99) - mat(k,372) = rxt(k,301)*y(k,90) - mat(k,726) = -(rxt(k,94)*y(k,41) + rxt(k,95)*y(k,102) + (rxt(k,97) + rxt(k,98) & + mat(k,664) = -rxt(k,293)*y(k,94) + mat(k,499) = -(rxt(k,294) + rxt(k,295)) * y(k,94) + mat(k,332) = rxt(k,301)*y(k,100) + mat(k,372) = rxt(k,301)*y(k,91) + mat(k,726) = -(rxt(k,94)*y(k,41) + rxt(k,95)*y(k,103) + (rxt(k,97) + rxt(k,98) & ) * y(k,70) + rxt(k,99)*y(k,71) + (rxt(k,147) + rxt(k,148) & ) * y(k,56) + rxt(k,180)*y(k,8) + rxt(k,181)*y(k,9) + rxt(k,182) & *y(k,11) + rxt(k,183)*y(k,12) + rxt(k,184)*y(k,13) + rxt(k,185) & @@ -810,66 +810,66 @@ subroutine nlnmat04( avec_len, mat, y, rxt ) *y(k,33) + rxt(k,217)*y(k,34) + rxt(k,230)*y(k,16) + rxt(k,231) & *y(k,18) + rxt(k,232)*y(k,46) + rxt(k,233)*y(k,47) + rxt(k,234) & *y(k,48) + (rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,23)) - mat(k,877) = -rxt(k,94)*y(k,94) - mat(k,951) = -rxt(k,95)*y(k,94) - mat(k,514) = -(rxt(k,97) + rxt(k,98)) * y(k,94) - mat(k,535) = -rxt(k,99)*y(k,94) - mat(k,105) = -(rxt(k,147) + rxt(k,148)) * y(k,94) - mat(k,30) = -rxt(k,180)*y(k,94) - mat(k,57) = -rxt(k,181)*y(k,94) - mat(k,38) = -rxt(k,182)*y(k,94) - mat(k,68) = -rxt(k,183)*y(k,94) - mat(k,42) = -rxt(k,184)*y(k,94) - mat(k,73) = -rxt(k,185)*y(k,94) - mat(k,46) = -rxt(k,186)*y(k,94) - mat(k,461) = -(rxt(k,187) + rxt(k,188)) * y(k,94) - mat(k,63) = -rxt(k,207)*y(k,94) - mat(k,163) = -rxt(k,208)*y(k,94) - mat(k,34) = -rxt(k,209)*y(k,94) - mat(k,259) = -(rxt(k,210) + rxt(k,211)) * y(k,94) - mat(k,84) = -rxt(k,216)*y(k,94) - mat(k,92) = -rxt(k,217)*y(k,94) - mat(k,176) = -rxt(k,230)*y(k,94) - mat(k,214) = -rxt(k,231)*y(k,94) - mat(k,87) = -rxt(k,232)*y(k,94) - mat(k,97) = -rxt(k,233)*y(k,94) - mat(k,115) = -rxt(k,234)*y(k,94) - mat(k,403) = -(rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,94) - mat(k,514) = mat(k,514) + rxt(k,130)*y(k,90) - mat(k,330) = .850_r8*rxt(k,288)*y(k,97) + mat(k,877) = -rxt(k,94)*y(k,95) + mat(k,951) = -rxt(k,95)*y(k,95) + mat(k,514) = -(rxt(k,97) + rxt(k,98)) * y(k,95) + mat(k,535) = -rxt(k,99)*y(k,95) + mat(k,105) = -(rxt(k,147) + rxt(k,148)) * y(k,95) + mat(k,30) = -rxt(k,180)*y(k,95) + mat(k,57) = -rxt(k,181)*y(k,95) + mat(k,38) = -rxt(k,182)*y(k,95) + mat(k,68) = -rxt(k,183)*y(k,95) + mat(k,42) = -rxt(k,184)*y(k,95) + mat(k,73) = -rxt(k,185)*y(k,95) + mat(k,46) = -rxt(k,186)*y(k,95) + mat(k,461) = -(rxt(k,187) + rxt(k,188)) * y(k,95) + mat(k,63) = -rxt(k,207)*y(k,95) + mat(k,163) = -rxt(k,208)*y(k,95) + mat(k,34) = -rxt(k,209)*y(k,95) + mat(k,259) = -(rxt(k,210) + rxt(k,211)) * y(k,95) + mat(k,84) = -rxt(k,216)*y(k,95) + mat(k,92) = -rxt(k,217)*y(k,95) + mat(k,176) = -rxt(k,230)*y(k,95) + mat(k,214) = -rxt(k,231)*y(k,95) + mat(k,87) = -rxt(k,232)*y(k,95) + mat(k,97) = -rxt(k,233)*y(k,95) + mat(k,115) = -rxt(k,234)*y(k,95) + mat(k,403) = -(rxt(k,242) + rxt(k,243) + rxt(k,244)) * y(k,95) + mat(k,514) = mat(k,514) + rxt(k,130)*y(k,91) + mat(k,330) = .850_r8*rxt(k,288)*y(k,98) mat(k,340) = rxt(k,130)*y(k,70) - mat(k,367) = .850_r8*rxt(k,288)*y(k,88) + mat(k,367) = .850_r8*rxt(k,288)*y(k,89) mat(k,77) = -(rxt(k,101)*y(k,69) + rxt(k,102)*y(k,70)) - mat(k,651) = -rxt(k,101)*y(k,95) - mat(k,492) = -rxt(k,102)*y(k,95) - mat(k,194) = rxt(k,103)*y(k,96) - mat(k,651) = mat(k,651) + rxt(k,105)*y(k,96) - mat(k,492) = mat(k,492) + rxt(k,106)*y(k,96) - mat(k,522) = rxt(k,107)*y(k,96) + mat(k,651) = -rxt(k,101)*y(k,96) + mat(k,492) = -rxt(k,102)*y(k,96) + mat(k,194) = rxt(k,103)*y(k,97) + mat(k,651) = mat(k,651) + rxt(k,105)*y(k,97) + mat(k,492) = mat(k,492) + rxt(k,106)*y(k,97) + mat(k,522) = rxt(k,107)*y(k,97) mat(k,79) = rxt(k,103)*y(k,32) + rxt(k,105)*y(k,69) + rxt(k,106)*y(k,70) & + rxt(k,107)*y(k,71) mat(k,80) = -(rxt(k,103)*y(k,32) + rxt(k,105)*y(k,69) + rxt(k,106)*y(k,70) & + rxt(k,107)*y(k,71)) - mat(k,195) = -rxt(k,103)*y(k,96) - mat(k,652) = -rxt(k,105)*y(k,96) - mat(k,493) = -rxt(k,106)*y(k,96) - mat(k,523) = -rxt(k,107)*y(k,96) - mat(k,493) = mat(k,493) + rxt(k,97)*y(k,94) + mat(k,195) = -rxt(k,103)*y(k,97) + mat(k,652) = -rxt(k,105)*y(k,97) + mat(k,493) = -rxt(k,106)*y(k,97) + mat(k,523) = -rxt(k,107)*y(k,97) + mat(k,493) = mat(k,493) + rxt(k,97)*y(k,95) mat(k,702) = rxt(k,97)*y(k,70) - mat(k,361) = -(rxt(k,288)*y(k,88) + rxt(k,296)*y(k,55) + rxt(k,298)*y(k,61)) - mat(k,326) = -rxt(k,288)*y(k,97) - mat(k,348) = -rxt(k,296)*y(k,97) - mat(k,739) = -rxt(k,298)*y(k,97) - mat(k,198) = rxt(k,299)*y(k,99) - mat(k,504) = rxt(k,290)*y(k,91) + rxt(k,294)*y(k,93) + rxt(k,302)*y(k,99) & - + rxt(k,306)*y(k,100) + mat(k,361) = -(rxt(k,288)*y(k,89) + rxt(k,296)*y(k,55) + rxt(k,298)*y(k,61)) + mat(k,326) = -rxt(k,288)*y(k,98) + mat(k,348) = -rxt(k,296)*y(k,98) + mat(k,739) = -rxt(k,298)*y(k,98) + mat(k,198) = rxt(k,299)*y(k,100) + mat(k,504) = rxt(k,290)*y(k,92) + rxt(k,294)*y(k,94) + rxt(k,302)*y(k,100) & + + rxt(k,306)*y(k,101) mat(k,224) = rxt(k,290)*y(k,70) mat(k,277) = rxt(k,294)*y(k,70) mat(k,377) = rxt(k,299)*y(k,32) + rxt(k,302)*y(k,70) mat(k,190) = rxt(k,306)*y(k,70) - mat(k,858) = -(rxt(k,120)*y(k,41) + rxt(k,121)*y(k,43) + rxt(k,122)*y(k,89) & + mat(k,858) = -(rxt(k,120)*y(k,41) + rxt(k,121)*y(k,43) + rxt(k,122)*y(k,90) & + rxt(k,123)*y(k,69) + rxt(k,124)*y(k,71) + (4._r8*rxt(k,125) & - + 4._r8*rxt(k,126)) * y(k,98) + rxt(k,128)*y(k,52) + rxt(k,142) & + + 4._r8*rxt(k,126)) * y(k,99) + rxt(k,128)*y(k,52) + rxt(k,142) & *y(k,63) + rxt(k,143)*y(k,55) + rxt(k,151)*y(k,62) + rxt(k,152) & *y(k,51) + rxt(k,171)*y(k,29) + (rxt(k,173) + rxt(k,174) & ) * y(k,28) + rxt(k,176)*y(k,49) + rxt(k,179)*y(k,54) + rxt(k,203) & @@ -878,66 +878,66 @@ subroutine nlnmat04( avec_len, mat, y, rxt ) *y(k,24) + rxt(k,227)*y(k,46) + rxt(k,228)*y(k,47) + rxt(k,229) & *y(k,48) + rxt(k,237)*y(k,17) + rxt(k,240)*y(k,22) + rxt(k,241) & *y(k,23) + rxt(k,245)*y(k,31) + (rxt(k,247) + rxt(k,261) & - ) * y(k,35) + rxt(k,249)*y(k,73) + rxt(k,251)*y(k,79) + rxt(k,255) & - *y(k,76) + rxt(k,260)*y(k,78)) - mat(k,881) = -rxt(k,120)*y(k,98) - mat(k,233) = -rxt(k,121)*y(k,98) - mat(k,564) = -rxt(k,122)*y(k,98) - mat(k,688) = -rxt(k,123)*y(k,98) - mat(k,539) = -rxt(k,124)*y(k,98) - mat(k,172) = -rxt(k,128)*y(k,98) - mat(k,589) = -rxt(k,142)*y(k,98) - mat(k,356) = -rxt(k,143)*y(k,98) - mat(k,646) = -rxt(k,151)*y(k,98) - mat(k,904) = -rxt(k,152)*y(k,98) - mat(k,315) = -rxt(k,171)*y(k,98) - mat(k,617) = -(rxt(k,173) + rxt(k,174)) * y(k,98) - mat(k,464) = -rxt(k,176)*y(k,98) - mat(k,270) = -rxt(k,179)*y(k,98) - mat(k,928) = -rxt(k,203)*y(k,98) - mat(k,261) = -rxt(k,205)*y(k,98) - mat(k,179) = -rxt(k,219)*y(k,98) - mat(k,217) = -rxt(k,221)*y(k,98) - mat(k,50) = -rxt(k,222)*y(k,98) - mat(k,153) = -rxt(k,224)*y(k,98) - mat(k,166) = -rxt(k,226)*y(k,98) - mat(k,89) = -rxt(k,227)*y(k,98) - mat(k,99) = -rxt(k,228)*y(k,98) - mat(k,117) = -rxt(k,229)*y(k,98) - mat(k,487) = -rxt(k,237)*y(k,98) - mat(k,159) = -rxt(k,240)*y(k,98) - mat(k,406) = -rxt(k,241)*y(k,98) - mat(k,288) = -rxt(k,245)*y(k,98) - mat(k,132) = -(rxt(k,247) + rxt(k,261)) * y(k,98) - mat(k,146) = -rxt(k,249)*y(k,98) - mat(k,304) = -rxt(k,251)*y(k,98) - mat(k,241) = -rxt(k,255)*y(k,98) - mat(k,436) = -rxt(k,260)*y(k,98) + ) * y(k,35) + rxt(k,249)*y(k,74) + rxt(k,251)*y(k,80) + rxt(k,255) & + *y(k,77) + rxt(k,260)*y(k,79)) + mat(k,881) = -rxt(k,120)*y(k,99) + mat(k,233) = -rxt(k,121)*y(k,99) + mat(k,564) = -rxt(k,122)*y(k,99) + mat(k,688) = -rxt(k,123)*y(k,99) + mat(k,539) = -rxt(k,124)*y(k,99) + mat(k,172) = -rxt(k,128)*y(k,99) + mat(k,589) = -rxt(k,142)*y(k,99) + mat(k,356) = -rxt(k,143)*y(k,99) + mat(k,646) = -rxt(k,151)*y(k,99) + mat(k,904) = -rxt(k,152)*y(k,99) + mat(k,315) = -rxt(k,171)*y(k,99) + mat(k,617) = -(rxt(k,173) + rxt(k,174)) * y(k,99) + mat(k,464) = -rxt(k,176)*y(k,99) + mat(k,270) = -rxt(k,179)*y(k,99) + mat(k,928) = -rxt(k,203)*y(k,99) + mat(k,261) = -rxt(k,205)*y(k,99) + mat(k,179) = -rxt(k,219)*y(k,99) + mat(k,217) = -rxt(k,221)*y(k,99) + mat(k,50) = -rxt(k,222)*y(k,99) + mat(k,153) = -rxt(k,224)*y(k,99) + mat(k,166) = -rxt(k,226)*y(k,99) + mat(k,89) = -rxt(k,227)*y(k,99) + mat(k,99) = -rxt(k,228)*y(k,99) + mat(k,117) = -rxt(k,229)*y(k,99) + mat(k,487) = -rxt(k,237)*y(k,99) + mat(k,159) = -rxt(k,240)*y(k,99) + mat(k,406) = -rxt(k,241)*y(k,99) + mat(k,288) = -rxt(k,245)*y(k,99) + mat(k,132) = -(rxt(k,247) + rxt(k,261)) * y(k,99) + mat(k,146) = -rxt(k,249)*y(k,99) + mat(k,304) = -rxt(k,251)*y(k,99) + mat(k,241) = -rxt(k,255)*y(k,99) + mat(k,436) = -rxt(k,260)*y(k,99) mat(k,487) = mat(k,487) + rxt(k,236)*y(k,69) - mat(k,159) = mat(k,159) + .300_r8*rxt(k,240)*y(k,98) - mat(k,406) = mat(k,406) + rxt(k,242)*y(k,94) - mat(k,787) = rxt(k,160)*y(k,89) - mat(k,295) = rxt(k,214)*y(k,102) - mat(k,444) = rxt(k,119)*y(k,71) + 2.000_r8*rxt(k,114)*y(k,89) - mat(k,881) = mat(k,881) + rxt(k,111)*y(k,69) + rxt(k,94)*y(k,94) + mat(k,159) = mat(k,159) + .300_r8*rxt(k,240)*y(k,99) + mat(k,406) = mat(k,406) + rxt(k,242)*y(k,95) + mat(k,787) = rxt(k,160)*y(k,90) + mat(k,295) = rxt(k,214)*y(k,103) + mat(k,444) = rxt(k,119)*y(k,71) + 2.000_r8*rxt(k,114)*y(k,90) + mat(k,881) = mat(k,881) + rxt(k,111)*y(k,69) + rxt(k,94)*y(k,95) mat(k,233) = mat(k,233) + rxt(k,112)*y(k,69) - mat(k,261) = mat(k,261) + rxt(k,204)*y(k,69) + rxt(k,210)*y(k,94) - mat(k,464) = mat(k,464) + rxt(k,175)*y(k,69) + rxt(k,187)*y(k,94) + mat(k,261) = mat(k,261) + rxt(k,204)*y(k,69) + rxt(k,210)*y(k,95) + mat(k,464) = mat(k,464) + rxt(k,175)*y(k,69) + rxt(k,187)*y(k,95) mat(k,253) = rxt(k,206)*y(k,69) mat(k,270) = mat(k,270) + rxt(k,178)*y(k,69) - mat(k,755) = rxt(k,144)*y(k,89) - mat(k,589) = mat(k,589) + rxt(k,139)*y(k,89) + mat(k,755) = rxt(k,144)*y(k,90) + mat(k,589) = mat(k,589) + rxt(k,139)*y(k,90) mat(k,688) = mat(k,688) + rxt(k,236)*y(k,17) + rxt(k,111)*y(k,41) & + rxt(k,112)*y(k,43) + rxt(k,204)*y(k,45) + rxt(k,175)*y(k,49) & - + rxt(k,206)*y(k,53) + rxt(k,178)*y(k,54) + rxt(k,117)*y(k,89) - mat(k,539) = mat(k,539) + rxt(k,119)*y(k,40) + rxt(k,118)*y(k,89) + + rxt(k,206)*y(k,53) + rxt(k,178)*y(k,54) + rxt(k,117)*y(k,90) + mat(k,539) = mat(k,539) + rxt(k,119)*y(k,40) + rxt(k,118)*y(k,90) mat(k,564) = mat(k,564) + rxt(k,160)*y(k,25) + 2.000_r8*rxt(k,114)*y(k,40) & + rxt(k,144)*y(k,61) + rxt(k,139)*y(k,63) + rxt(k,117)*y(k,69) & + rxt(k,118)*y(k,71) mat(k,730) = rxt(k,242)*y(k,23) + rxt(k,94)*y(k,41) + rxt(k,210)*y(k,45) & - + rxt(k,187)*y(k,49) + 2.000_r8*rxt(k,95)*y(k,102) + + rxt(k,187)*y(k,49) + 2.000_r8*rxt(k,95)*y(k,103) mat(k,858) = mat(k,858) + .300_r8*rxt(k,240)*y(k,22) - mat(k,955) = rxt(k,214)*y(k,39) + 2.000_r8*rxt(k,95)*y(k,94) + mat(k,955) = rxt(k,214)*y(k,39) + 2.000_r8*rxt(k,95)*y(k,95) end do end subroutine nlnmat04 subroutine nlnmat05( avec_len, mat, y, rxt ) @@ -958,55 +958,55 @@ subroutine nlnmat05( avec_len, mat, y, rxt ) ! ... complete matrix entries implicit species !---------------------------------------------- do k = 1,avec_len - mat(k,378) = -(rxt(k,299)*y(k,32) + rxt(k,301)*y(k,90) + rxt(k,302)*y(k,70)) - mat(k,199) = -rxt(k,299)*y(k,99) - mat(k,337) = -rxt(k,301)*y(k,99) - mat(k,505) = -rxt(k,302)*y(k,99) - mat(k,672) = rxt(k,292)*y(k,91) + rxt(k,293)*y(k,93) + rxt(k,305)*y(k,100) & - + rxt(k,311)*y(k,101) - mat(k,327) = rxt(k,303)*y(k,100) + rxt(k,308)*y(k,101) + mat(k,378) = -(rxt(k,299)*y(k,32) + rxt(k,301)*y(k,91) + rxt(k,302)*y(k,70)) + mat(k,199) = -rxt(k,299)*y(k,100) + mat(k,337) = -rxt(k,301)*y(k,100) + mat(k,505) = -rxt(k,302)*y(k,100) + mat(k,672) = rxt(k,292)*y(k,92) + rxt(k,293)*y(k,94) + rxt(k,305)*y(k,101) & + + rxt(k,311)*y(k,102) + mat(k,327) = rxt(k,303)*y(k,101) + rxt(k,308)*y(k,102) mat(k,225) = rxt(k,292)*y(k,69) mat(k,278) = rxt(k,293)*y(k,69) - mat(k,191) = rxt(k,305)*y(k,69) + rxt(k,303)*y(k,88) - mat(k,185) = rxt(k,311)*y(k,69) + rxt(k,308)*y(k,88) - mat(k,188) = -(rxt(k,303)*y(k,88) + rxt(k,305)*y(k,69) + rxt(k,306)*y(k,70)) - mat(k,319) = -rxt(k,303)*y(k,100) - mat(k,655) = -rxt(k,305)*y(k,100) - mat(k,495) = -rxt(k,306)*y(k,100) - mat(k,319) = mat(k,319) + rxt(k,307)*y(k,101) - mat(k,182) = rxt(k,307)*y(k,88) - mat(k,181) = -((rxt(k,307) + rxt(k,308)) * y(k,88) + rxt(k,311)*y(k,69)) - mat(k,318) = -(rxt(k,307) + rxt(k,308)) * y(k,101) - mat(k,654) = -rxt(k,311)*y(k,101) - mat(k,959) = -(rxt(k,95)*y(k,94) + rxt(k,214)*y(k,39) + rxt(k,262)*y(k,80)) - mat(k,734) = -rxt(k,95)*y(k,102) - mat(k,298) = -rxt(k,214)*y(k,102) - mat(k,111) = -rxt(k,262)*y(k,102) - mat(k,180) = rxt(k,219)*y(k,98) - mat(k,491) = rxt(k,237)*y(k,98) - mat(k,218) = rxt(k,221)*y(k,98) - mat(k,51) = rxt(k,222)*y(k,98) - mat(k,154) = rxt(k,224)*y(k,98) - mat(k,160) = rxt(k,240)*y(k,98) - mat(k,409) = rxt(k,241)*y(k,98) - mat(k,446) = rxt(k,115)*y(k,89) - mat(k,885) = rxt(k,120)*y(k,98) - mat(k,234) = rxt(k,121)*y(k,98) - mat(k,263) = rxt(k,205)*y(k,98) - mat(k,118) = rxt(k,229)*y(k,98) + mat(k,191) = rxt(k,305)*y(k,69) + rxt(k,303)*y(k,89) + mat(k,185) = rxt(k,311)*y(k,69) + rxt(k,308)*y(k,89) + mat(k,188) = -(rxt(k,303)*y(k,89) + rxt(k,305)*y(k,69) + rxt(k,306)*y(k,70)) + mat(k,319) = -rxt(k,303)*y(k,101) + mat(k,655) = -rxt(k,305)*y(k,101) + mat(k,495) = -rxt(k,306)*y(k,101) + mat(k,319) = mat(k,319) + rxt(k,307)*y(k,102) + mat(k,182) = rxt(k,307)*y(k,89) + mat(k,181) = -((rxt(k,307) + rxt(k,308)) * y(k,89) + rxt(k,311)*y(k,69)) + mat(k,318) = -(rxt(k,307) + rxt(k,308)) * y(k,102) + mat(k,654) = -rxt(k,311)*y(k,102) + mat(k,959) = -(rxt(k,95)*y(k,95) + rxt(k,214)*y(k,39) + rxt(k,262)*y(k,81)) + mat(k,734) = -rxt(k,95)*y(k,103) + mat(k,298) = -rxt(k,214)*y(k,103) + mat(k,111) = -rxt(k,262)*y(k,103) + mat(k,180) = rxt(k,219)*y(k,99) + mat(k,491) = rxt(k,237)*y(k,99) + mat(k,218) = rxt(k,221)*y(k,99) + mat(k,51) = rxt(k,222)*y(k,99) + mat(k,154) = rxt(k,224)*y(k,99) + mat(k,160) = rxt(k,240)*y(k,99) + mat(k,409) = rxt(k,241)*y(k,99) + mat(k,446) = rxt(k,115)*y(k,90) + mat(k,885) = rxt(k,120)*y(k,99) + mat(k,234) = rxt(k,121)*y(k,99) + mat(k,263) = rxt(k,205)*y(k,99) + mat(k,118) = rxt(k,229)*y(k,99) mat(k,468) = (rxt(k,275)+rxt(k,280))*y(k,53) + (rxt(k,268)+rxt(k,274) & - +rxt(k,279))*y(k,54) + rxt(k,176)*y(k,98) - mat(k,908) = rxt(k,152)*y(k,98) - mat(k,173) = rxt(k,128)*y(k,98) + +rxt(k,279))*y(k,54) + rxt(k,176)*y(k,99) + mat(k,908) = rxt(k,152)*y(k,99) + mat(k,173) = rxt(k,128)*y(k,99) mat(k,255) = (rxt(k,275)+rxt(k,280))*y(k,49) - mat(k,271) = (rxt(k,268)+rxt(k,274)+rxt(k,279))*y(k,49) + rxt(k,179)*y(k,98) - mat(k,568) = rxt(k,115)*y(k,40) + rxt(k,122)*y(k,98) + mat(k,271) = (rxt(k,268)+rxt(k,274)+rxt(k,279))*y(k,49) + rxt(k,179)*y(k,99) + mat(k,568) = rxt(k,115)*y(k,40) + rxt(k,122)*y(k,99) mat(k,862) = rxt(k,219)*y(k,16) + rxt(k,237)*y(k,17) + rxt(k,221)*y(k,18) & + rxt(k,222)*y(k,19) + rxt(k,224)*y(k,20) + rxt(k,240)*y(k,22) & + rxt(k,241)*y(k,23) + rxt(k,120)*y(k,41) + rxt(k,121)*y(k,43) & + rxt(k,205)*y(k,45) + rxt(k,229)*y(k,48) + rxt(k,176)*y(k,49) & + rxt(k,152)*y(k,51) + rxt(k,128)*y(k,52) + rxt(k,179)*y(k,54) & - + rxt(k,122)*y(k,89) + 2.000_r8*rxt(k,125)*y(k,98) + + rxt(k,122)*y(k,90) + 2.000_r8*rxt(k,125)*y(k,99) end do end subroutine nlnmat05 subroutine nlnmat_finit( avec_len, mat, lmat, dti ) diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 index 10c37c4a5d..4b90d14e1f 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 @@ -19,6 +19,17 @@ subroutine exp_prod_loss( ofl, ofu, prod, loss, y, & real(r8), intent(in) :: y(chnkpnts,gas_pcnst) real(r8), intent(in) :: rxt(chnkpnts,rxntot) real(r8), intent(in) :: het_rates(chnkpnts,gas_pcnst) +!-------------------------------------------------------------------- +! ... local variables +!-------------------------------------------------------------------- + integer :: k +!-------------------------------------------------------------------- +! ... loss and production for Explicit method +!-------------------------------------------------------------------- + do k = ofl,ofu + loss(k,1) = ( + het_rates(k,72))* y(k,72) + prod(k,1) = 0._r8 + end do end subroutine exp_prod_loss subroutine imp_prod_loss( avec_len, prod, loss, y, & rxt, het_rates ) @@ -46,16 +57,16 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & prod(k,1) = 0._r8 loss(k,2) = ( + het_rates(k,2))* y(k,2) prod(k,2) = 0._r8 - loss(k,97) = (rxt(k,191)* y(k,17) +rxt(k,193)* y(k,71) +rxt(k,192)* y(k,89) & + loss(k,97) = (rxt(k,191)* y(k,17) +rxt(k,193)* y(k,71) +rxt(k,192)* y(k,90) & + het_rates(k,3))* y(k,3) prod(k,97) = (rxt(k,27) +2.000_r8*rxt(k,194)*y(k,5) +rxt(k,195)*y(k,28) + & rxt(k,196)*y(k,28) +rxt(k,199)*y(k,61) +rxt(k,202)*y(k,69) + & - rxt(k,203)*y(k,98) +rxt(k,253)*y(k,78))*y(k,5) + (rxt(k,181)*y(k,9) + & + rxt(k,203)*y(k,99) +rxt(k,253)*y(k,79))*y(k,5) + (rxt(k,181)*y(k,9) + & rxt(k,207)*y(k,10) +3.000_r8*rxt(k,208)*y(k,24) + & 2.000_r8*rxt(k,209)*y(k,42) +rxt(k,210)*y(k,45) + & - 2.000_r8*rxt(k,230)*y(k,16) +rxt(k,231)*y(k,18))*y(k,94) & + 2.000_r8*rxt(k,230)*y(k,16) +rxt(k,231)*y(k,18))*y(k,95) & + (rxt(k,205)*y(k,45) +2.000_r8*rxt(k,219)*y(k,16) + & - rxt(k,221)*y(k,18) +3.000_r8*rxt(k,226)*y(k,24))*y(k,98) & + rxt(k,221)*y(k,18) +3.000_r8*rxt(k,226)*y(k,24))*y(k,99) & + (2.000_r8*rxt(k,218)*y(k,16) +rxt(k,220)*y(k,18) + & 3.000_r8*rxt(k,225)*y(k,24))*y(k,25) + (rxt(k,51) + & rxt(k,204)*y(k,69))*y(k,45) +rxt(k,26)*y(k,4) +rxt(k,29)*y(k,6) & @@ -67,78 +78,78 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & +rxt(k,197)*y(k,28)*y(k,5) loss(k,101) = (2._r8*rxt(k,194)* y(k,5) + (rxt(k,195) +rxt(k,196) + & rxt(k,197))* y(k,28) +rxt(k,199)* y(k,61) +rxt(k,200)* y(k,62) & - +rxt(k,202)* y(k,69) +rxt(k,253)* y(k,78) +rxt(k,198)* y(k,89) & - +rxt(k,203)* y(k,98) + rxt(k,27) + het_rates(k,5))* y(k,5) + +rxt(k,202)* y(k,69) +rxt(k,253)* y(k,79) +rxt(k,198)* y(k,90) & + +rxt(k,203)* y(k,99) + rxt(k,27) + het_rates(k,5))* y(k,5) prod(k,101) = (rxt(k,28) +rxt(k,201)*y(k,69))*y(k,6) +rxt(k,193)*y(k,71) & - *y(k,3) +rxt(k,211)*y(k,94)*y(k,45) +rxt(k,206)*y(k,69)*y(k,53) + *y(k,3) +rxt(k,211)*y(k,95)*y(k,45) +rxt(k,206)*y(k,69)*y(k,53) loss(k,62) = (rxt(k,201)* y(k,69) + rxt(k,28) + rxt(k,29) + rxt(k,269) & + rxt(k,272) + rxt(k,277) + het_rates(k,6))* y(k,6) prod(k,62) =rxt(k,200)*y(k,62)*y(k,5) loss(k,3) = ( + het_rates(k,7))* y(k,7) prod(k,3) = 0._r8 - loss(k,27) = (rxt(k,180)* y(k,94) + rxt(k,30) + het_rates(k,8))* y(k,8) + loss(k,27) = (rxt(k,180)* y(k,95) + rxt(k,30) + het_rates(k,8))* y(k,8) prod(k,27) = 0._r8 - loss(k,34) = (rxt(k,181)* y(k,94) + rxt(k,31) + het_rates(k,9))* y(k,9) + loss(k,34) = (rxt(k,181)* y(k,95) + rxt(k,31) + het_rates(k,9))* y(k,9) prod(k,34) = 0._r8 - loss(k,35) = (rxt(k,207)* y(k,94) + rxt(k,32) + het_rates(k,10))* y(k,10) + loss(k,35) = (rxt(k,207)* y(k,95) + rxt(k,32) + het_rates(k,10))* y(k,10) prod(k,35) = 0._r8 - loss(k,29) = (rxt(k,182)* y(k,94) + rxt(k,33) + het_rates(k,11))* y(k,11) + loss(k,29) = (rxt(k,182)* y(k,95) + rxt(k,33) + het_rates(k,11))* y(k,11) prod(k,29) = 0._r8 - loss(k,36) = (rxt(k,183)* y(k,94) + rxt(k,34) + het_rates(k,12))* y(k,12) + loss(k,36) = (rxt(k,183)* y(k,95) + rxt(k,34) + het_rates(k,12))* y(k,12) prod(k,36) = 0._r8 - loss(k,30) = (rxt(k,184)* y(k,94) + rxt(k,35) + het_rates(k,13))* y(k,13) + loss(k,30) = (rxt(k,184)* y(k,95) + rxt(k,35) + het_rates(k,13))* y(k,13) prod(k,30) = 0._r8 - loss(k,37) = (rxt(k,185)* y(k,94) + rxt(k,36) + het_rates(k,14))* y(k,14) + loss(k,37) = (rxt(k,185)* y(k,95) + rxt(k,36) + het_rates(k,14))* y(k,14) prod(k,37) = 0._r8 - loss(k,31) = (rxt(k,186)* y(k,94) + rxt(k,37) + het_rates(k,15))* y(k,15) + loss(k,31) = (rxt(k,186)* y(k,95) + rxt(k,37) + het_rates(k,15))* y(k,15) prod(k,31) = 0._r8 - loss(k,58) = (rxt(k,218)* y(k,25) +rxt(k,230)* y(k,94) +rxt(k,219)* y(k,98) & + loss(k,58) = (rxt(k,218)* y(k,25) +rxt(k,230)* y(k,95) +rxt(k,219)* y(k,99) & + rxt(k,38) + het_rates(k,16))* y(k,16) prod(k,58) = 0._r8 loss(k,86) = (rxt(k,191)* y(k,3) +rxt(k,155)* y(k,25) +rxt(k,235)* y(k,63) & - +rxt(k,236)* y(k,69) +rxt(k,237)* y(k,98) + rxt(k,20) + rxt(k,21) & + +rxt(k,236)* y(k,69) +rxt(k,237)* y(k,99) + rxt(k,20) + rxt(k,21) & + het_rates(k,17))* y(k,17) - prod(k,86) = (.180_r8*rxt(k,24) +rxt(k,243)*y(k,94) +rxt(k,244)*y(k,94)) & + prod(k,86) = (.180_r8*rxt(k,24) +rxt(k,243)*y(k,95) +rxt(k,244)*y(k,95)) & *y(k,23) + (rxt(k,162)*y(k,28) +rxt(k,239)*y(k,61))*y(k,21) & - + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,98))*y(k,22) - loss(k,63) = (rxt(k,220)* y(k,25) +rxt(k,231)* y(k,94) +rxt(k,221)* y(k,98) & + + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,99))*y(k,22) + loss(k,63) = (rxt(k,220)* y(k,25) +rxt(k,231)* y(k,95) +rxt(k,221)* y(k,99) & + rxt(k,39) + het_rates(k,18))* y(k,18) prod(k,63) = 0._r8 - loss(k,32) = (rxt(k,222)* y(k,98) + rxt(k,40) + het_rates(k,19))* y(k,19) + loss(k,32) = (rxt(k,222)* y(k,99) + rxt(k,40) + het_rates(k,19))* y(k,19) prod(k,32) = 0._r8 - loss(k,54) = (rxt(k,223)* y(k,25) +rxt(k,224)* y(k,98) + rxt(k,41) & + loss(k,54) = (rxt(k,223)* y(k,25) +rxt(k,224)* y(k,99) + rxt(k,41) & + het_rates(k,20))* y(k,20) prod(k,54) = 0._r8 - loss(k,82) = (rxt(k,162)* y(k,28) +rxt(k,239)* y(k,61) +rxt(k,238)* y(k,89) & + loss(k,82) = (rxt(k,162)* y(k,28) +rxt(k,239)* y(k,61) +rxt(k,238)* y(k,90) & + het_rates(k,21))* y(k,21) prod(k,82) = (rxt(k,23) +rxt(k,156)*y(k,25) +rxt(k,212)*y(k,39) + & - rxt(k,241)*y(k,98) +rxt(k,242)*y(k,94))*y(k,23) +rxt(k,39)*y(k,18) & - +rxt(k,41)*y(k,20) +.700_r8*rxt(k,240)*y(k,98)*y(k,22) - loss(k,55) = (rxt(k,240)* y(k,98) + rxt(k,22) + het_rates(k,22))* y(k,22) - prod(k,55) =rxt(k,238)*y(k,89)*y(k,21) + rxt(k,241)*y(k,99) +rxt(k,242)*y(k,95))*y(k,23) +rxt(k,39)*y(k,18) & + +rxt(k,41)*y(k,20) +.700_r8*rxt(k,240)*y(k,99)*y(k,22) + loss(k,55) = (rxt(k,240)* y(k,99) + rxt(k,22) + het_rates(k,22))* y(k,22) + prod(k,55) =rxt(k,238)*y(k,90)*y(k,21) loss(k,81) = (rxt(k,156)* y(k,25) +rxt(k,212)* y(k,39) + (rxt(k,242) + & - rxt(k,243) +rxt(k,244))* y(k,94) +rxt(k,241)* y(k,98) + rxt(k,23) & + rxt(k,243) +rxt(k,244))* y(k,95) +rxt(k,241)* y(k,99) + rxt(k,23) & + rxt(k,24) + het_rates(k,23))* y(k,23) prod(k,81) = 0._r8 - loss(k,56) = (rxt(k,225)* y(k,25) +rxt(k,208)* y(k,94) +rxt(k,226)* y(k,98) & + loss(k,56) = (rxt(k,225)* y(k,25) +rxt(k,208)* y(k,95) +rxt(k,226)* y(k,99) & + rxt(k,42) + het_rates(k,24))* y(k,24) prod(k,56) = 0._r8 loss(k,96) = (rxt(k,218)* y(k,16) +rxt(k,155)* y(k,17) +rxt(k,220)* y(k,18) & +rxt(k,223)* y(k,20) +rxt(k,156)* y(k,23) +rxt(k,225)* y(k,24) & +rxt(k,168)* y(k,29) +rxt(k,157)* y(k,41) +rxt(k,158)* y(k,43) & +rxt(k,177)* y(k,54) +rxt(k,161)* y(k,71) + (rxt(k,159) +rxt(k,160)) & - * y(k,89) + het_rates(k,25))* y(k,25) + * y(k,90) + het_rates(k,25))* y(k,25) prod(k,96) = (4.000_r8*rxt(k,180)*y(k,8) +rxt(k,181)*y(k,9) + & 2.000_r8*rxt(k,182)*y(k,11) +2.000_r8*rxt(k,183)*y(k,12) + & 2.000_r8*rxt(k,184)*y(k,13) +rxt(k,185)*y(k,14) + & 2.000_r8*rxt(k,186)*y(k,15) +rxt(k,187)*y(k,49) +rxt(k,217)*y(k,34) + & - rxt(k,232)*y(k,46) +rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,94) & + rxt(k,232)*y(k,46) +rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,95) & + (rxt(k,45) +rxt(k,162)*y(k,21) +2.000_r8*rxt(k,163)*y(k,28) + & rxt(k,165)*y(k,28) +rxt(k,167)*y(k,61) +rxt(k,172)*y(k,69) + & - rxt(k,173)*y(k,98) +rxt(k,196)*y(k,5) +rxt(k,254)*y(k,78))*y(k,28) & + rxt(k,173)*y(k,99) +rxt(k,196)*y(k,5) +rxt(k,254)*y(k,79))*y(k,28) & + (rxt(k,176)*y(k,49) +3.000_r8*rxt(k,222)*y(k,19) + & rxt(k,224)*y(k,20) +rxt(k,227)*y(k,46) +rxt(k,228)*y(k,47) + & - rxt(k,229)*y(k,48))*y(k,98) + (rxt(k,55) +rxt(k,175)*y(k,69))*y(k,49) & + rxt(k,229)*y(k,48))*y(k,99) + (rxt(k,55) +rxt(k,175)*y(k,69))*y(k,49) & +rxt(k,26)*y(k,4) +4.000_r8*rxt(k,30)*y(k,8) +rxt(k,31)*y(k,9) & +2.000_r8*rxt(k,33)*y(k,11) +2.000_r8*rxt(k,34)*y(k,12) & +2.000_r8*rxt(k,35)*y(k,13) +rxt(k,36)*y(k,14) +2.000_r8*rxt(k,37) & @@ -155,43 +166,43 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & loss(k,91) = ((rxt(k,195) +rxt(k,196) +rxt(k,197))* y(k,5) +rxt(k,162) & * y(k,21) + 2._r8*(rxt(k,163) +rxt(k,164) +rxt(k,165) +rxt(k,189)) & * y(k,28) +rxt(k,167)* y(k,61) +rxt(k,169)* y(k,62) +rxt(k,172) & - * y(k,69) +rxt(k,254)* y(k,78) +rxt(k,166)* y(k,89) + (rxt(k,173) + & - rxt(k,174))* y(k,98) + rxt(k,45) + het_rates(k,28))* y(k,28) - prod(k,91) = (rxt(k,160)*y(k,89) +rxt(k,161)*y(k,71) +rxt(k,177)*y(k,54)) & + * y(k,69) +rxt(k,254)* y(k,79) +rxt(k,166)* y(k,90) + (rxt(k,173) + & + rxt(k,174))* y(k,99) + rxt(k,45) + het_rates(k,28))* y(k,28) + prod(k,91) = (rxt(k,160)*y(k,90) +rxt(k,161)*y(k,71) +rxt(k,177)*y(k,54)) & *y(k,25) + (rxt(k,47) +rxt(k,170)*y(k,69))*y(k,29) & - + (rxt(k,178)*y(k,69) +rxt(k,179)*y(k,98))*y(k,54) + (rxt(k,59) + & - rxt(k,259)*y(k,78))*y(k,72) +2.000_r8*rxt(k,190)*y(k,27) & - +rxt(k,188)*y(k,94)*y(k,49) + + (rxt(k,178)*y(k,69) +rxt(k,179)*y(k,99))*y(k,54) + (rxt(k,59) + & + rxt(k,259)*y(k,79))*y(k,73) +2.000_r8*rxt(k,190)*y(k,27) & + +rxt(k,188)*y(k,95)*y(k,49) loss(k,75) = (rxt(k,168)* y(k,25) + (rxt(k,273) +rxt(k,278) +rxt(k,283)) & - * y(k,49) +rxt(k,170)* y(k,69) +rxt(k,171)* y(k,98) + rxt(k,46) & + * y(k,49) +rxt(k,170)* y(k,69) +rxt(k,171)* y(k,99) + rxt(k,46) & + rxt(k,47) + rxt(k,271) + rxt(k,276) + rxt(k,282) & + het_rates(k,29))* y(k,29) prod(k,75) =rxt(k,169)*y(k,62)*y(k,28) loss(k,4) = ( + het_rates(k,30))* y(k,30) prod(k,4) = 0._r8 - loss(k,72) = (rxt(k,245)* y(k,98) + het_rates(k,31))* y(k,31) + loss(k,72) = (rxt(k,245)* y(k,99) + het_rates(k,31))* y(k,31) prod(k,72) = (rxt(k,20) +rxt(k,21) +rxt(k,155)*y(k,25) +rxt(k,191)*y(k,3) + & - rxt(k,235)*y(k,63) +rxt(k,236)*y(k,69) +rxt(k,237)*y(k,98))*y(k,17) & - + (rxt(k,25) +rxt(k,61) +rxt(k,299)*y(k,99))*y(k,32) + (rxt(k,88) + & - rxt(k,248)*y(k,69) +rxt(k,249)*y(k,98))*y(k,73) +rxt(k,223)*y(k,25) & + rxt(k,235)*y(k,63) +rxt(k,236)*y(k,69) +rxt(k,237)*y(k,99))*y(k,17) & + + (rxt(k,25) +rxt(k,61) +rxt(k,299)*y(k,100))*y(k,32) + (rxt(k,88) + & + rxt(k,248)*y(k,69) +rxt(k,249)*y(k,99))*y(k,74) +rxt(k,223)*y(k,25) & *y(k,20) +.380_r8*rxt(k,24)*y(k,23) - loss(k,61) = (rxt(k,299)* y(k,99) + rxt(k,25) + rxt(k,61) + het_rates(k,32)) & + loss(k,61) = (rxt(k,299)* y(k,100) + rxt(k,25) + rxt(k,61) + het_rates(k,32)) & * y(k,32) - prod(k,61) =.440_r8*rxt(k,24)*y(k,23) +rxt(k,245)*y(k,98)*y(k,31) - loss(k,41) = (rxt(k,216)* y(k,94) + rxt(k,48) + het_rates(k,33))* y(k,33) + prod(k,61) =.440_r8*rxt(k,24)*y(k,23) +rxt(k,245)*y(k,99)*y(k,31) + loss(k,41) = (rxt(k,216)* y(k,95) + rxt(k,48) + het_rates(k,33))* y(k,33) prod(k,41) = (rxt(k,181)*y(k,9) +rxt(k,183)*y(k,12) + & 2.000_r8*rxt(k,184)*y(k,13) +2.000_r8*rxt(k,185)*y(k,14) + & rxt(k,186)*y(k,15) +rxt(k,207)*y(k,10) +2.000_r8*rxt(k,209)*y(k,42) + & - rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,94) + (rxt(k,53) + & - rxt(k,228)*y(k,98))*y(k,47) + (rxt(k,54) +rxt(k,229)*y(k,98))*y(k,48) & + rxt(k,233)*y(k,47) +rxt(k,234)*y(k,48))*y(k,95) + (rxt(k,53) + & + rxt(k,228)*y(k,99))*y(k,47) + (rxt(k,54) +rxt(k,229)*y(k,99))*y(k,48) & +rxt(k,31)*y(k,9) +rxt(k,32)*y(k,10) +rxt(k,34)*y(k,12) & +2.000_r8*rxt(k,35)*y(k,13) +2.000_r8*rxt(k,36)*y(k,14) +rxt(k,37) & *y(k,15) +2.000_r8*rxt(k,50)*y(k,42) - loss(k,43) = (rxt(k,217)* y(k,94) + rxt(k,49) + het_rates(k,34))* y(k,34) - prod(k,43) = (rxt(k,52) +rxt(k,227)*y(k,98) +rxt(k,232)*y(k,94))*y(k,46) & - + (rxt(k,33) +rxt(k,182)*y(k,94))*y(k,11) + (rxt(k,34) + & - rxt(k,183)*y(k,94))*y(k,12) - loss(k,51) = (rxt(k,246)* y(k,63) + (rxt(k,247) +rxt(k,261))* y(k,98) & + loss(k,43) = (rxt(k,217)* y(k,95) + rxt(k,49) + het_rates(k,34))* y(k,34) + prod(k,43) = (rxt(k,52) +rxt(k,227)*y(k,99) +rxt(k,232)*y(k,95))*y(k,46) & + + (rxt(k,33) +rxt(k,182)*y(k,95))*y(k,11) + (rxt(k,34) + & + rxt(k,183)*y(k,95))*y(k,12) + loss(k,51) = (rxt(k,246)* y(k,63) + (rxt(k,247) +rxt(k,261))* y(k,99) & + het_rates(k,35))* y(k,35) prod(k,51) = 0._r8 loss(k,5) = ( + het_rates(k,36))* y(k,36) @@ -201,83 +212,83 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & loss(k,7) = ( + het_rates(k,38))* y(k,38) prod(k,7) = 0._r8 loss(k,73) = (rxt(k,212)* y(k,23) +rxt(k,213)* y(k,41) +rxt(k,215)* y(k,51) & - +rxt(k,214)* y(k,102) + het_rates(k,39))* y(k,39) + +rxt(k,214)* y(k,103) + het_rates(k,39))* y(k,39) prod(k,73) = (rxt(k,185)*y(k,14) +rxt(k,207)*y(k,10) + & - 2.000_r8*rxt(k,216)*y(k,33) +rxt(k,217)*y(k,34))*y(k,94) +rxt(k,32) & + 2.000_r8*rxt(k,216)*y(k,33) +rxt(k,217)*y(k,34))*y(k,95) +rxt(k,32) & *y(k,10) +rxt(k,36)*y(k,14) +2.000_r8*rxt(k,48)*y(k,33) +rxt(k,49) & *y(k,34) +rxt(k,56)*y(k,50) loss(k,84) = (rxt(k,116)* y(k,70) +rxt(k,119)* y(k,71) + (rxt(k,113) + & - rxt(k,114) +rxt(k,115))* y(k,89) + het_rates(k,40))* y(k,40) + rxt(k,114) +rxt(k,115))* y(k,90) + het_rates(k,40))* y(k,40) prod(k,84) = (rxt(k,120)*y(k,41) +rxt(k,123)*y(k,69) +rxt(k,143)*y(k,55) + & - rxt(k,237)*y(k,17) +rxt(k,249)*y(k,73) +rxt(k,255)*y(k,76) + & - rxt(k,260)*y(k,78))*y(k,98) + (rxt(k,94)*y(k,94) + & + rxt(k,237)*y(k,17) +rxt(k,249)*y(k,74) +rxt(k,255)*y(k,77) + & + rxt(k,260)*y(k,79))*y(k,99) + (rxt(k,94)*y(k,95) + & rxt(k,111)*y(k,69) +rxt(k,157)*y(k,25) +rxt(k,213)*y(k,39))*y(k,41) & - + (rxt(k,23) +.330_r8*rxt(k,24) +rxt(k,243)*y(k,94))*y(k,23) & - + (rxt(k,51) +rxt(k,211)*y(k,94))*y(k,45) + (rxt(k,55) + & - rxt(k,188)*y(k,94))*y(k,49) + (2.000_r8*rxt(k,2) +rxt(k,3))*y(k,102) & + + (rxt(k,23) +.330_r8*rxt(k,24) +rxt(k,243)*y(k,95))*y(k,23) & + + (rxt(k,51) +rxt(k,211)*y(k,95))*y(k,45) + (rxt(k,55) + & + rxt(k,188)*y(k,95))*y(k,49) + (2.000_r8*rxt(k,2) +rxt(k,3))*y(k,103) & +2.000_r8*rxt(k,20)*y(k,17) +rxt(k,22)*y(k,22) +rxt(k,56)*y(k,50) loss(k,99) = (rxt(k,157)* y(k,25) +rxt(k,213)* y(k,39) +rxt(k,111)* y(k,69) & - +rxt(k,94)* y(k,94) +rxt(k,120)* y(k,98) + het_rates(k,41))* y(k,41) - prod(k,99) = (1.440_r8*rxt(k,24) +rxt(k,244)*y(k,94))*y(k,23) +rxt(k,21) & - *y(k,17) +rxt(k,113)*y(k,89)*y(k,40) +rxt(k,1)*y(k,102) - loss(k,28) = (rxt(k,209)* y(k,94) + rxt(k,50) + het_rates(k,42))* y(k,42) + +rxt(k,94)* y(k,95) +rxt(k,120)* y(k,99) + het_rates(k,41))* y(k,41) + prod(k,99) = (1.440_r8*rxt(k,24) +rxt(k,244)*y(k,95))*y(k,23) +rxt(k,21) & + *y(k,17) +rxt(k,113)*y(k,90)*y(k,40) +rxt(k,1)*y(k,103) + loss(k,28) = (rxt(k,209)* y(k,95) + rxt(k,50) + het_rates(k,42))* y(k,42) prod(k,28) = 0._r8 - loss(k,65) = (rxt(k,158)* y(k,25) +rxt(k,112)* y(k,69) +rxt(k,121)* y(k,98) & + loss(k,65) = (rxt(k,158)* y(k,25) +rxt(k,112)* y(k,69) +rxt(k,121)* y(k,99) & + rxt(k,4) + het_rates(k,43))* y(k,43) - prod(k,65) = (.500_r8*rxt(k,263) +rxt(k,127)*y(k,89))*y(k,89) & - +rxt(k,126)*y(k,98)*y(k,98) + prod(k,65) = (.500_r8*rxt(k,263) +rxt(k,127)*y(k,90))*y(k,90) & + +rxt(k,126)*y(k,99)*y(k,99) loss(k,33) = ( + rxt(k,87) + het_rates(k,44))* y(k,44) - prod(k,33) =rxt(k,262)*y(k,102)*y(k,80) - loss(k,69) = (rxt(k,204)* y(k,69) + (rxt(k,210) +rxt(k,211))* y(k,94) & - +rxt(k,205)* y(k,98) + rxt(k,51) + het_rates(k,45))* y(k,45) - prod(k,69) = (rxt(k,191)*y(k,17) +rxt(k,192)*y(k,89))*y(k,3) - loss(k,42) = (rxt(k,232)* y(k,94) +rxt(k,227)* y(k,98) + rxt(k,52) & + prod(k,33) =rxt(k,262)*y(k,103)*y(k,81) + loss(k,69) = (rxt(k,204)* y(k,69) + (rxt(k,210) +rxt(k,211))* y(k,95) & + +rxt(k,205)* y(k,99) + rxt(k,51) + het_rates(k,45))* y(k,45) + prod(k,69) = (rxt(k,191)*y(k,17) +rxt(k,192)*y(k,90))*y(k,3) + loss(k,42) = (rxt(k,232)* y(k,95) +rxt(k,227)* y(k,99) + rxt(k,52) & + het_rates(k,46))* y(k,46) prod(k,42) = 0._r8 - loss(k,44) = (rxt(k,233)* y(k,94) +rxt(k,228)* y(k,98) + rxt(k,53) & + loss(k,44) = (rxt(k,233)* y(k,95) +rxt(k,228)* y(k,99) + rxt(k,53) & + het_rates(k,47))* y(k,47) prod(k,44) = 0._r8 - loss(k,48) = (rxt(k,234)* y(k,94) +rxt(k,229)* y(k,98) + rxt(k,54) & + loss(k,48) = (rxt(k,234)* y(k,95) +rxt(k,229)* y(k,99) + rxt(k,54) & + het_rates(k,48))* y(k,48) prod(k,48) = 0._r8 loss(k,85) = ((rxt(k,273) +rxt(k,278) +rxt(k,283))* y(k,29) + (rxt(k,275) + & rxt(k,280))* y(k,53) + (rxt(k,268) +rxt(k,274) +rxt(k,279))* y(k,54) & - +rxt(k,175)* y(k,69) + (rxt(k,187) +rxt(k,188))* y(k,94) +rxt(k,176) & - * y(k,98) + rxt(k,55) + het_rates(k,49))* y(k,49) + +rxt(k,175)* y(k,69) + (rxt(k,187) +rxt(k,188))* y(k,95) +rxt(k,176) & + * y(k,99) + rxt(k,55) + het_rates(k,49))* y(k,49) prod(k,85) = (rxt(k,155)*y(k,17) +rxt(k,156)*y(k,23) +rxt(k,157)*y(k,41) + & - rxt(k,158)*y(k,43) +rxt(k,159)*y(k,89) +rxt(k,177)*y(k,54) + & + rxt(k,158)*y(k,43) +rxt(k,159)*y(k,90) +rxt(k,177)*y(k,54) + & rxt(k,218)*y(k,16) +rxt(k,220)*y(k,18) +2.000_r8*rxt(k,223)*y(k,20) + & - rxt(k,225)*y(k,24))*y(k,25) +rxt(k,174)*y(k,98)*y(k,28) + rxt(k,225)*y(k,24))*y(k,25) +rxt(k,174)*y(k,99)*y(k,28) loss(k,49) = ( + rxt(k,56) + het_rates(k,50))* y(k,50) - prod(k,49) = (rxt(k,212)*y(k,23) +rxt(k,213)*y(k,41) +rxt(k,214)*y(k,102) + & + prod(k,49) = (rxt(k,212)*y(k,23) +rxt(k,213)*y(k,41) +rxt(k,214)*y(k,103) + & rxt(k,215)*y(k,51))*y(k,39) - loss(k,100) = (rxt(k,215)* y(k,39) +rxt(k,152)* y(k,98) + rxt(k,9) & + loss(k,100) = (rxt(k,215)* y(k,39) +rxt(k,152)* y(k,99) + rxt(k,9) & + het_rates(k,51))* y(k,51) prod(k,100) = (rxt(k,271) +rxt(k,276) +rxt(k,282) +rxt(k,273)*y(k,49) + & rxt(k,278)*y(k,49) +rxt(k,283)*y(k,49))*y(k,29) & + (2.000_r8*rxt(k,264) +2.000_r8*rxt(k,267) +2.000_r8*rxt(k,270) + & 2.000_r8*rxt(k,281))*y(k,57) + (rxt(k,269) +rxt(k,272) +rxt(k,277)) & *y(k,6) + (rxt(k,266) +rxt(k,235)*y(k,17) +rxt(k,246)*y(k,35)) & - *y(k,63) + (.500_r8*rxt(k,265) +rxt(k,151)*y(k,98))*y(k,62) - loss(k,57) = (rxt(k,128)* y(k,98) + rxt(k,10) + rxt(k,11) + rxt(k,153) & + *y(k,63) + (.500_r8*rxt(k,265) +rxt(k,151)*y(k,99))*y(k,62) + loss(k,57) = (rxt(k,128)* y(k,99) + rxt(k,10) + rxt(k,11) + rxt(k,153) & + het_rates(k,52))* y(k,52) - prod(k,57) =rxt(k,149)*y(k,89)*y(k,62) + prod(k,57) =rxt(k,149)*y(k,90)*y(k,62) loss(k,68) = ((rxt(k,275) +rxt(k,280))* y(k,49) +rxt(k,206)* y(k,69) & + rxt(k,57) + het_rates(k,53))* y(k,53) - prod(k,68) = (rxt(k,269) +rxt(k,272) +rxt(k,277))*y(k,6) +rxt(k,198)*y(k,89) & + prod(k,68) = (rxt(k,269) +rxt(k,272) +rxt(k,277))*y(k,6) +rxt(k,198)*y(k,90) & *y(k,5) loss(k,70) = (rxt(k,177)* y(k,25) + (rxt(k,268) +rxt(k,274) +rxt(k,279)) & - * y(k,49) +rxt(k,178)* y(k,69) +rxt(k,179)* y(k,98) + rxt(k,58) & + * y(k,49) +rxt(k,178)* y(k,69) +rxt(k,179)* y(k,99) + rxt(k,58) & + het_rates(k,54))* y(k,54) - prod(k,70) = (rxt(k,271) +rxt(k,276) +rxt(k,282) +rxt(k,171)*y(k,98))*y(k,29) & - +rxt(k,166)*y(k,89)*y(k,28) + prod(k,70) = (rxt(k,271) +rxt(k,276) +rxt(k,282) +rxt(k,171)*y(k,99))*y(k,29) & + +rxt(k,166)*y(k,90)*y(k,28) loss(k,78) = (rxt(k,131)* y(k,61) + (rxt(k,132) +rxt(k,133) +rxt(k,134)) & - * y(k,62) +rxt(k,135)* y(k,70) +rxt(k,296)* y(k,97) +rxt(k,143) & - * y(k,98) + rxt(k,62) + het_rates(k,55))* y(k,55) - prod(k,78) = (rxt(k,129)*y(k,90) +rxt(k,293)*y(k,93))*y(k,69) & - + (.200_r8*rxt(k,287)*y(k,92) +1.100_r8*rxt(k,289)*y(k,91))*y(k,88) & - +rxt(k,15)*y(k,61) +rxt(k,294)*y(k,93)*y(k,70) +rxt(k,300)*y(k,99) - loss(k,46) = ((rxt(k,147) +rxt(k,148))* y(k,94) + rxt(k,12) & + * y(k,62) +rxt(k,135)* y(k,70) +rxt(k,296)* y(k,98) +rxt(k,143) & + * y(k,99) + rxt(k,62) + het_rates(k,55))* y(k,55) + prod(k,78) = (rxt(k,129)*y(k,91) +rxt(k,293)*y(k,94))*y(k,69) & + + (.200_r8*rxt(k,287)*y(k,93) +1.100_r8*rxt(k,289)*y(k,92))*y(k,89) & + +rxt(k,15)*y(k,61) +rxt(k,294)*y(k,94)*y(k,70) +rxt(k,300)*y(k,100) + loss(k,46) = ((rxt(k,147) +rxt(k,148))* y(k,95) + rxt(k,12) & + het_rates(k,56))* y(k,56) prod(k,46) =rxt(k,132)*y(k,62)*y(k,55) loss(k,50) = ( + rxt(k,13) + rxt(k,14) + rxt(k,154) + rxt(k,264) + rxt(k,267) & @@ -291,34 +302,34 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & prod(k,10) = 0._r8 loss(k,95) = (rxt(k,199)* y(k,5) +rxt(k,239)* y(k,21) +rxt(k,167)* y(k,28) & +rxt(k,131)* y(k,55) +rxt(k,140)* y(k,63) +rxt(k,146)* y(k,69) & - +rxt(k,145)* y(k,71) +rxt(k,144)* y(k,89) +rxt(k,298)* y(k,97) & + +rxt(k,145)* y(k,71) +rxt(k,144)* y(k,90) +rxt(k,298)* y(k,98) & + rxt(k,15) + rxt(k,16) + het_rates(k,61))* y(k,61) prod(k,95) = (rxt(k,17) +.500_r8*rxt(k,265) +2.000_r8*rxt(k,133)*y(k,55) + & - rxt(k,136)*y(k,69) +rxt(k,256)*y(k,78))*y(k,62) & - + (rxt(k,135)*y(k,70) +rxt(k,143)*y(k,98))*y(k,55) & - +2.000_r8*rxt(k,147)*y(k,94)*y(k,56) +rxt(k,14)*y(k,57) +rxt(k,19) & - *y(k,63) +rxt(k,130)*y(k,90)*y(k,70) +rxt(k,297)*y(k,97) +rxt(k,310) & - *y(k,101) + rxt(k,136)*y(k,69) +rxt(k,256)*y(k,79))*y(k,62) & + + (rxt(k,135)*y(k,70) +rxt(k,143)*y(k,99))*y(k,55) & + +2.000_r8*rxt(k,147)*y(k,95)*y(k,56) +rxt(k,14)*y(k,57) +rxt(k,19) & + *y(k,63) +rxt(k,130)*y(k,91)*y(k,70) +rxt(k,297)*y(k,98) +rxt(k,310) & + *y(k,102) loss(k,92) = (rxt(k,200)* y(k,5) +rxt(k,169)* y(k,28) + (rxt(k,132) + & rxt(k,133) +rxt(k,134))* y(k,55) +rxt(k,150)* y(k,63) + (rxt(k,136) + & - rxt(k,138))* y(k,69) +rxt(k,137)* y(k,71) +rxt(k,256)* y(k,78) & - +rxt(k,149)* y(k,89) +rxt(k,151)* y(k,98) + rxt(k,17) + rxt(k,265) & + rxt(k,138))* y(k,69) +rxt(k,137)* y(k,71) +rxt(k,256)* y(k,79) & + +rxt(k,149)* y(k,90) +rxt(k,151)* y(k,99) + rxt(k,17) + rxt(k,265) & + het_rates(k,62))* y(k,62) - prod(k,92) = (2.000_r8*rxt(k,140)*y(k,63) +rxt(k,144)*y(k,89) + & + prod(k,92) = (2.000_r8*rxt(k,140)*y(k,63) +rxt(k,144)*y(k,90) + & rxt(k,145)*y(k,71) +rxt(k,146)*y(k,69) +rxt(k,167)*y(k,28) + & rxt(k,199)*y(k,5) +rxt(k,239)*y(k,21))*y(k,61) + (rxt(k,18) + & - rxt(k,139)*y(k,89) +rxt(k,141)*y(k,69) +rxt(k,142)*y(k,98))*y(k,63) & - + (rxt(k,11) +rxt(k,153) +rxt(k,128)*y(k,98))*y(k,52) + (rxt(k,13) + & + rxt(k,139)*y(k,90) +rxt(k,141)*y(k,69) +rxt(k,142)*y(k,99))*y(k,63) & + + (rxt(k,11) +rxt(k,153) +rxt(k,128)*y(k,99))*y(k,52) + (rxt(k,13) + & rxt(k,154))*y(k,57) +rxt(k,28)*y(k,6) +rxt(k,47)*y(k,29) +rxt(k,9) & *y(k,51) loss(k,90) = (rxt(k,235)* y(k,17) +rxt(k,246)* y(k,35) +rxt(k,140)* y(k,61) & - +rxt(k,150)* y(k,62) +rxt(k,141)* y(k,69) +rxt(k,139)* y(k,89) & - +rxt(k,142)* y(k,98) + rxt(k,18) + rxt(k,19) + rxt(k,266) & + +rxt(k,150)* y(k,62) +rxt(k,141)* y(k,69) +rxt(k,139)* y(k,90) & + +rxt(k,142)* y(k,99) + rxt(k,18) + rxt(k,19) + rxt(k,266) & + het_rates(k,63))* y(k,63) prod(k,90) = (rxt(k,46) +rxt(k,168)*y(k,25) +rxt(k,170)*y(k,69) + & - rxt(k,171)*y(k,98))*y(k,29) + (rxt(k,13) +rxt(k,14) +rxt(k,154)) & + rxt(k,171)*y(k,99))*y(k,29) + (rxt(k,13) +rxt(k,14) +rxt(k,154)) & *y(k,57) + (rxt(k,29) +rxt(k,201)*y(k,69))*y(k,6) & - + (rxt(k,152)*y(k,98) +rxt(k,215)*y(k,39))*y(k,51) & + + (rxt(k,152)*y(k,99) +rxt(k,215)*y(k,39))*y(k,51) & + (rxt(k,137)*y(k,71) +rxt(k,138)*y(k,69))*y(k,62) +rxt(k,10) & *y(k,52) loss(k,11) = ( + het_rates(k,64))* y(k,64) @@ -337,97 +348,97 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & +rxt(k,206)* y(k,53) +rxt(k,178)* y(k,54) +rxt(k,146)* y(k,61) & + (rxt(k,136) +rxt(k,138))* y(k,62) +rxt(k,141)* y(k,63) & + 2._r8*rxt(k,109)* y(k,69) +rxt(k,110)* y(k,70) +rxt(k,108) & - * y(k,71) +rxt(k,248)* y(k,73) +rxt(k,117)* y(k,89) + (rxt(k,291) + & - rxt(k,292))* y(k,91) +rxt(k,293)* y(k,93) +rxt(k,123)* y(k,98) & + * y(k,71) +rxt(k,248)* y(k,74) +rxt(k,117)* y(k,90) + (rxt(k,291) + & + rxt(k,292))* y(k,92) +rxt(k,293)* y(k,94) +rxt(k,123)* y(k,99) & + rxt(k,71) + rxt(k,72) + rxt(k,73) + rxt(k,74) + rxt(k,75) & + rxt(k,76) + het_rates(k,69))* y(k,69) prod(k,93) = (2.000_r8*rxt(k,5) +rxt(k,6) +rxt(k,77) +rxt(k,79) +rxt(k,81) + & 2.000_r8*rxt(k,82) +2.000_r8*rxt(k,83) +rxt(k,84) +rxt(k,85) + & - rxt(k,86) +rxt(k,97)*y(k,94) +rxt(k,98)*y(k,94) +rxt(k,135)*y(k,55) + & - rxt(k,250)*y(k,76) +rxt(k,257)*y(k,78) +rxt(k,295)*y(k,93) + & - rxt(k,302)*y(k,99) +rxt(k,306)*y(k,100))*y(k,70) & - + (rxt(k,131)*y(k,61) +rxt(k,132)*y(k,62) +rxt(k,296)*y(k,97)) & - *y(k,55) + (rxt(k,25) +rxt(k,61))*y(k,32) + (rxt(k,287)*y(k,92) + & - 1.150_r8*rxt(k,288)*y(k,97))*y(k,88) +rxt(k,27)*y(k,5) & - +.180_r8*rxt(k,24)*y(k,23) +rxt(k,45)*y(k,28) +rxt(k,115)*y(k,89) & + rxt(k,86) +rxt(k,97)*y(k,95) +rxt(k,98)*y(k,95) +rxt(k,135)*y(k,55) + & + rxt(k,250)*y(k,77) +rxt(k,257)*y(k,79) +rxt(k,295)*y(k,94) + & + rxt(k,302)*y(k,100) +rxt(k,306)*y(k,101))*y(k,70) & + + (rxt(k,131)*y(k,61) +rxt(k,132)*y(k,62) +rxt(k,296)*y(k,98)) & + *y(k,55) + (rxt(k,25) +rxt(k,61))*y(k,32) + (rxt(k,287)*y(k,93) + & + 1.150_r8*rxt(k,288)*y(k,98))*y(k,89) +rxt(k,27)*y(k,5) & + +.180_r8*rxt(k,24)*y(k,23) +rxt(k,45)*y(k,28) +rxt(k,115)*y(k,90) & *y(k,40) +rxt(k,14)*y(k,57) +rxt(k,15)*y(k,61) +rxt(k,17)*y(k,62) & - +rxt(k,18)*y(k,63) +rxt(k,8)*y(k,71) +rxt(k,59)*y(k,72) +rxt(k,89) & - *y(k,78) +rxt(k,90)*y(k,79) +rxt(k,91)*y(k,80) +rxt(k,301)*y(k,99) & - *y(k,90) +rxt(k,96)*y(k,94) +rxt(k,125)*y(k,98)*y(k,98) +rxt(k,304) & - *y(k,100) +rxt(k,309)*y(k,101) +rxt(k,2)*y(k,102) + +rxt(k,18)*y(k,63) +rxt(k,8)*y(k,71) +rxt(k,59)*y(k,73) +rxt(k,89) & + *y(k,79) +rxt(k,90)*y(k,80) +rxt(k,91)*y(k,81) +rxt(k,301)*y(k,100) & + *y(k,91) +rxt(k,96)*y(k,95) +rxt(k,125)*y(k,99)*y(k,99) +rxt(k,304) & + *y(k,101) +rxt(k,309)*y(k,102) +rxt(k,2)*y(k,103) loss(k,87) = (rxt(k,116)* y(k,40) +rxt(k,135)* y(k,55) +rxt(k,110)* y(k,69) & - +rxt(k,250)* y(k,76) +rxt(k,257)* y(k,78) +rxt(k,130)* y(k,90) & - +rxt(k,290)* y(k,91) + (rxt(k,294) +rxt(k,295))* y(k,93) +rxt(k,97) & - * y(k,94) +rxt(k,102)* y(k,95) +rxt(k,302)* y(k,99) +rxt(k,306) & - * y(k,100) + rxt(k,5) + rxt(k,6) + rxt(k,77) + rxt(k,78) + rxt(k,79) & + +rxt(k,250)* y(k,77) +rxt(k,257)* y(k,79) +rxt(k,130)* y(k,91) & + +rxt(k,290)* y(k,92) + (rxt(k,294) +rxt(k,295))* y(k,94) +rxt(k,97) & + * y(k,95) +rxt(k,102)* y(k,96) +rxt(k,302)* y(k,100) +rxt(k,306) & + * y(k,101) + rxt(k,5) + rxt(k,6) + rxt(k,77) + rxt(k,78) + rxt(k,79) & + rxt(k,80) + rxt(k,81) + rxt(k,82) + rxt(k,83) + rxt(k,84) & + rxt(k,85) + rxt(k,86) + het_rates(k,70))* y(k,70) - prod(k,87) = (rxt(k,8) +2.000_r8*rxt(k,99)*y(k,94) + & - 2.000_r8*rxt(k,108)*y(k,69) +2.000_r8*rxt(k,118)*y(k,89) + & - rxt(k,119)*y(k,40) +rxt(k,124)*y(k,98) +rxt(k,137)*y(k,62) + & + prod(k,87) = (rxt(k,8) +2.000_r8*rxt(k,99)*y(k,95) + & + 2.000_r8*rxt(k,108)*y(k,69) +2.000_r8*rxt(k,118)*y(k,90) + & + rxt(k,119)*y(k,40) +rxt(k,124)*y(k,99) +rxt(k,137)*y(k,62) + & rxt(k,145)*y(k,61) +rxt(k,161)*y(k,25) +rxt(k,193)*y(k,3) + & - rxt(k,252)*y(k,76) +rxt(k,258)*y(k,78))*y(k,71) & - + (rxt(k,113)*y(k,40) +rxt(k,117)*y(k,69) +rxt(k,122)*y(k,98) + & - rxt(k,127)*y(k,89) +rxt(k,139)*y(k,63) +rxt(k,159)*y(k,25) + & + rxt(k,252)*y(k,77) +rxt(k,258)*y(k,79))*y(k,71) & + + (rxt(k,113)*y(k,40) +rxt(k,117)*y(k,69) +rxt(k,122)*y(k,99) + & + rxt(k,127)*y(k,90) +rxt(k,139)*y(k,63) +rxt(k,159)*y(k,25) + & rxt(k,166)*y(k,28) +rxt(k,192)*y(k,3) +rxt(k,198)*y(k,5) + & - rxt(k,238)*y(k,21))*y(k,89) + (rxt(k,101)*y(k,95) + & - rxt(k,109)*y(k,69) +rxt(k,123)*y(k,98) +rxt(k,136)*y(k,62) + & + rxt(k,238)*y(k,21))*y(k,90) + (rxt(k,101)*y(k,96) + & + rxt(k,109)*y(k,69) +rxt(k,123)*y(k,99) +rxt(k,136)*y(k,62) + & rxt(k,141)*y(k,63) +rxt(k,172)*y(k,28) +rxt(k,202)*y(k,5))*y(k,69) & - + (rxt(k,163)*y(k,28) +rxt(k,164)*y(k,28) +rxt(k,174)*y(k,98) + & + + (rxt(k,163)*y(k,28) +rxt(k,164)*y(k,28) +rxt(k,174)*y(k,99) + & rxt(k,196)*y(k,5) +rxt(k,197)*y(k,5))*y(k,28) + (rxt(k,92) + & - rxt(k,100) +2.000_r8*rxt(k,102)*y(k,70))*y(k,95) +rxt(k,194)*y(k,5) & - *y(k,5) +rxt(k,128)*y(k,98)*y(k,52) +rxt(k,134)*y(k,62)*y(k,55) & - +rxt(k,148)*y(k,94)*y(k,56) +rxt(k,298)*y(k,97)*y(k,61) +rxt(k,19) & - *y(k,63) +rxt(k,93)*y(k,96) + rxt(k,100) +2.000_r8*rxt(k,102)*y(k,70))*y(k,96) +rxt(k,194)*y(k,5) & + *y(k,5) +rxt(k,128)*y(k,99)*y(k,52) +rxt(k,134)*y(k,62)*y(k,55) & + +rxt(k,148)*y(k,95)*y(k,56) +rxt(k,298)*y(k,98)*y(k,61) +rxt(k,19) & + *y(k,63) +rxt(k,93)*y(k,97) loss(k,88) = (rxt(k,193)* y(k,3) +rxt(k,161)* y(k,25) +rxt(k,119)* y(k,40) & +rxt(k,145)* y(k,61) +rxt(k,137)* y(k,62) +rxt(k,108)* y(k,69) & - +rxt(k,252)* y(k,76) +rxt(k,258)* y(k,78) +rxt(k,118)* y(k,89) & - +rxt(k,99)* y(k,94) +rxt(k,124)* y(k,98) + rxt(k,7) + rxt(k,8) & + +rxt(k,252)* y(k,77) +rxt(k,258)* y(k,79) +rxt(k,118)* y(k,90) & + +rxt(k,99)* y(k,95) +rxt(k,124)* y(k,99) + rxt(k,7) + rxt(k,8) & + het_rates(k,71))* y(k,71) prod(k,88) =rxt(k,110)*y(k,70)*y(k,69) - loss(k,52) = (rxt(k,259)* y(k,78) + rxt(k,59) + het_rates(k,72))* y(k,72) + loss(k,52) = (rxt(k,259)* y(k,79) + rxt(k,59) + het_rates(k,73))* y(k,73) prod(k,52) = (rxt(k,165)*y(k,28) +rxt(k,195)*y(k,5))*y(k,28) - loss(k,53) = (rxt(k,248)* y(k,69) +rxt(k,249)* y(k,98) + rxt(k,88) & - + het_rates(k,73))* y(k,73) + loss(k,53) = (rxt(k,248)* y(k,69) +rxt(k,249)* y(k,99) + rxt(k,88) & + + het_rates(k,74))* y(k,74) prod(k,53) = 0._r8 - loss(k,16) = ( + het_rates(k,74))* y(k,74) + loss(k,16) = ( + het_rates(k,75))* y(k,75) prod(k,16) = 0._r8 - loss(k,17) = ( + het_rates(k,75))* y(k,75) + loss(k,17) = ( + het_rates(k,76))* y(k,76) prod(k,17) = 0._r8 - loss(k,66) = (rxt(k,250)* y(k,70) +rxt(k,252)* y(k,71) +rxt(k,255)* y(k,98) & - + het_rates(k,76))* y(k,76) - prod(k,66) =rxt(k,88)*y(k,73) +rxt(k,89)*y(k,78) - loss(k,18) = ( + rxt(k,60) + het_rates(k,77))* y(k,77) + loss(k,66) = (rxt(k,250)* y(k,70) +rxt(k,252)* y(k,71) +rxt(k,255)* y(k,99) & + + het_rates(k,77))* y(k,77) + prod(k,66) =rxt(k,88)*y(k,74) +rxt(k,89)*y(k,79) + loss(k,18) = ( + rxt(k,60) + het_rates(k,78))* y(k,78) prod(k,18) = 0._r8 loss(k,83) = (rxt(k,253)* y(k,5) +rxt(k,254)* y(k,28) +rxt(k,256)* y(k,62) & - +rxt(k,257)* y(k,70) +rxt(k,258)* y(k,71) +rxt(k,259)* y(k,72) & - +rxt(k,260)* y(k,98) + rxt(k,89) + het_rates(k,78))* y(k,78) - prod(k,83) = (rxt(k,250)*y(k,70) +rxt(k,252)*y(k,71) +rxt(k,255)*y(k,98)) & - *y(k,76) +rxt(k,248)*y(k,73)*y(k,69) +rxt(k,90)*y(k,79) - loss(k,74) = (rxt(k,251)* y(k,98) + rxt(k,90) + het_rates(k,79))* y(k,79) + +rxt(k,257)* y(k,70) +rxt(k,258)* y(k,71) +rxt(k,259)* y(k,73) & + +rxt(k,260)* y(k,99) + rxt(k,89) + het_rates(k,79))* y(k,79) + prod(k,83) = (rxt(k,250)*y(k,70) +rxt(k,252)*y(k,71) +rxt(k,255)*y(k,99)) & + *y(k,77) +rxt(k,248)*y(k,74)*y(k,69) +rxt(k,90)*y(k,80) + loss(k,74) = (rxt(k,251)* y(k,99) + rxt(k,90) + het_rates(k,80))* y(k,80) prod(k,74) = (rxt(k,253)*y(k,5) +rxt(k,254)*y(k,28) +rxt(k,256)*y(k,62) + & - rxt(k,257)*y(k,70) +rxt(k,258)*y(k,71) +rxt(k,259)*y(k,72) + & - rxt(k,260)*y(k,98))*y(k,78) + (rxt(k,246)*y(k,63) + & - rxt(k,247)*y(k,98) +.500_r8*rxt(k,261)*y(k,98))*y(k,35) & - +rxt(k,249)*y(k,98)*y(k,73) +rxt(k,91)*y(k,80) - loss(k,47) = (rxt(k,262)* y(k,102) + rxt(k,91) + het_rates(k,80))* y(k,80) - prod(k,47) =rxt(k,87)*y(k,44) +rxt(k,251)*y(k,98)*y(k,79) - loss(k,19) = ( + het_rates(k,81))* y(k,81) + rxt(k,257)*y(k,70) +rxt(k,258)*y(k,71) +rxt(k,259)*y(k,73) + & + rxt(k,260)*y(k,99))*y(k,79) + (rxt(k,246)*y(k,63) + & + rxt(k,247)*y(k,99) +.500_r8*rxt(k,261)*y(k,99))*y(k,35) & + +rxt(k,249)*y(k,99)*y(k,74) +rxt(k,91)*y(k,81) + loss(k,47) = (rxt(k,262)* y(k,103) + rxt(k,91) + het_rates(k,81))* y(k,81) + prod(k,47) =rxt(k,87)*y(k,44) +rxt(k,251)*y(k,99)*y(k,80) + loss(k,19) = ( + het_rates(k,82))* y(k,82) prod(k,19) = 0._r8 - loss(k,20) = ( + het_rates(k,82))* y(k,82) + loss(k,20) = ( + het_rates(k,83))* y(k,83) prod(k,20) = 0._r8 - loss(k,21) = ( + het_rates(k,83))* y(k,83) + loss(k,21) = ( + het_rates(k,84))* y(k,84) prod(k,21) = 0._r8 - loss(k,22) = ( + het_rates(k,84))* y(k,84) + loss(k,22) = ( + het_rates(k,85))* y(k,85) prod(k,22) = 0._r8 - loss(k,23) = ( + het_rates(k,85))* y(k,85) + loss(k,23) = ( + het_rates(k,86))* y(k,86) prod(k,23) = 0._r8 - loss(k,24) = ( + het_rates(k,86))* y(k,86) + loss(k,24) = ( + het_rates(k,87))* y(k,87) prod(k,24) = 0._r8 - loss(k,25) = ( + het_rates(k,87))* y(k,87) + loss(k,25) = ( + het_rates(k,88))* y(k,88) prod(k,25) = 0._r8 - loss(k,76) = (rxt(k,289)* y(k,91) +rxt(k,287)* y(k,92) +rxt(k,288)* y(k,97) & - + het_rates(k,88))* y(k,88) + loss(k,76) = (rxt(k,289)* y(k,92) +rxt(k,287)* y(k,93) +rxt(k,288)* y(k,98) & + + het_rates(k,89))* y(k,89) prod(k,76) = (rxt(k,77) +rxt(k,78) +rxt(k,79) +rxt(k,80) +rxt(k,81) + & rxt(k,84) +rxt(k,85) +rxt(k,86))*y(k,70) + (rxt(k,71) +rxt(k,72) + & rxt(k,73) +rxt(k,74) +rxt(k,75) +rxt(k,76))*y(k,69) +rxt(k,62) & @@ -436,32 +447,32 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & + (rxt(k,159) +rxt(k,160))* y(k,25) +rxt(k,166)* y(k,28) & + (rxt(k,113) +rxt(k,114) +rxt(k,115))* y(k,40) +rxt(k,144)* y(k,61) & +rxt(k,149)* y(k,62) +rxt(k,139)* y(k,63) +rxt(k,117)* y(k,69) & - +rxt(k,118)* y(k,71) + 2._r8*rxt(k,127)* y(k,89) +rxt(k,122) & - * y(k,98) + rxt(k,263) + het_rates(k,89))* y(k,89) + +rxt(k,118)* y(k,71) + 2._r8*rxt(k,127)* y(k,90) +rxt(k,122) & + * y(k,99) + rxt(k,263) + het_rates(k,90))* y(k,90) prod(k,89) = (rxt(k,121)*y(k,43) +rxt(k,124)*y(k,71) +rxt(k,142)*y(k,63) + & rxt(k,173)*y(k,28) +rxt(k,203)*y(k,5) +rxt(k,221)*y(k,18) + & - rxt(k,224)*y(k,20) +rxt(k,245)*y(k,31) +rxt(k,251)*y(k,79) + & - .500_r8*rxt(k,261)*y(k,35))*y(k,98) + (rxt(k,155)*y(k,25) + & + rxt(k,224)*y(k,20) +rxt(k,245)*y(k,31) +rxt(k,251)*y(k,80) + & + .500_r8*rxt(k,261)*y(k,35))*y(k,99) + (rxt(k,155)*y(k,25) + & rxt(k,191)*y(k,3) +rxt(k,235)*y(k,63) +rxt(k,236)*y(k,69))*y(k,17) & + (rxt(k,158)*y(k,43) +rxt(k,220)*y(k,18) +rxt(k,223)*y(k,20)) & *y(k,25) + (rxt(k,162)*y(k,28) +rxt(k,239)*y(k,61))*y(k,21) & - + (rxt(k,11) +rxt(k,153))*y(k,52) +rxt(k,243)*y(k,94)*y(k,23) & + + (rxt(k,11) +rxt(k,153))*y(k,52) +rxt(k,243)*y(k,95)*y(k,23) & +rxt(k,116)*y(k,70)*y(k,40) +rxt(k,112)*y(k,69)*y(k,43) - loss(k,77) = (rxt(k,129)* y(k,69) +rxt(k,130)* y(k,70) +rxt(k,301)* y(k,99) & - + het_rates(k,90))* y(k,90) - prod(k,77) = (.800_r8*rxt(k,287)*y(k,92) +.900_r8*rxt(k,289)*y(k,91))*y(k,88) & - +rxt(k,291)*y(k,91)*y(k,69) + loss(k,77) = (rxt(k,129)* y(k,69) +rxt(k,130)* y(k,70) +rxt(k,301)* y(k,100) & + + het_rates(k,91))* y(k,91) + prod(k,77) = (.800_r8*rxt(k,287)*y(k,93) +.900_r8*rxt(k,289)*y(k,92))*y(k,89) & + +rxt(k,291)*y(k,92)*y(k,69) loss(k,64) = ((rxt(k,291) +rxt(k,292))* y(k,69) +rxt(k,290)* y(k,70) & - +rxt(k,289)* y(k,88) + het_rates(k,91))* y(k,91) - prod(k,64) =rxt(k,304)*y(k,100) +rxt(k,309)*y(k,101) - loss(k,67) = (rxt(k,287)* y(k,88) + het_rates(k,92))* y(k,92) - prod(k,67) = (rxt(k,297) +rxt(k,296)*y(k,55) +rxt(k,298)*y(k,61))*y(k,97) & - +rxt(k,16)*y(k,61) +rxt(k,291)*y(k,91)*y(k,69) +rxt(k,295)*y(k,93) & - *y(k,70) +rxt(k,300)*y(k,99) + +rxt(k,289)* y(k,89) + het_rates(k,92))* y(k,92) + prod(k,64) =rxt(k,304)*y(k,101) +rxt(k,309)*y(k,102) + loss(k,67) = (rxt(k,287)* y(k,89) + het_rates(k,93))* y(k,93) + prod(k,67) = (rxt(k,297) +rxt(k,296)*y(k,55) +rxt(k,298)*y(k,61))*y(k,98) & + +rxt(k,16)*y(k,61) +rxt(k,291)*y(k,92)*y(k,69) +rxt(k,295)*y(k,94) & + *y(k,70) +rxt(k,300)*y(k,100) loss(k,71) = (rxt(k,293)* y(k,69) + (rxt(k,294) +rxt(k,295))* y(k,70) & - + het_rates(k,93))* y(k,93) - prod(k,71) =rxt(k,62)*y(k,55) +rxt(k,301)*y(k,99)*y(k,90) +rxt(k,310) & - *y(k,101) + + het_rates(k,94))* y(k,94) + prod(k,71) =rxt(k,62)*y(k,55) +rxt(k,301)*y(k,100)*y(k,91) +rxt(k,310) & + *y(k,102) loss(k,94) = (rxt(k,180)* y(k,8) +rxt(k,181)* y(k,9) +rxt(k,207)* y(k,10) & +rxt(k,182)* y(k,11) +rxt(k,183)* y(k,12) +rxt(k,184)* y(k,13) & +rxt(k,185)* y(k,14) +rxt(k,186)* y(k,15) +rxt(k,230)* y(k,16) & @@ -471,24 +482,24 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & * y(k,45) +rxt(k,232)* y(k,46) +rxt(k,233)* y(k,47) +rxt(k,234) & * y(k,48) + (rxt(k,187) +rxt(k,188))* y(k,49) + (rxt(k,147) + & rxt(k,148))* y(k,56) + (rxt(k,97) +rxt(k,98))* y(k,70) +rxt(k,99) & - * y(k,71) +rxt(k,95)* y(k,102) + rxt(k,96) + het_rates(k,94)) & - * y(k,94) - prod(k,94) = (rxt(k,6) +rxt(k,130)*y(k,90))*y(k,70) +rxt(k,12)*y(k,56) & - +rxt(k,7)*y(k,71) +.850_r8*rxt(k,288)*y(k,97)*y(k,88) +rxt(k,1) & - *y(k,102) + * y(k,71) +rxt(k,95)* y(k,103) + rxt(k,96) + het_rates(k,95)) & + * y(k,95) + prod(k,94) = (rxt(k,6) +rxt(k,130)*y(k,91))*y(k,70) +rxt(k,12)*y(k,56) & + +rxt(k,7)*y(k,71) +.850_r8*rxt(k,288)*y(k,98)*y(k,89) +rxt(k,1) & + *y(k,103) loss(k,39) = (rxt(k,101)* y(k,69) +rxt(k,102)* y(k,70) + rxt(k,92) & - + rxt(k,100) + het_rates(k,95))* y(k,95) + + rxt(k,100) + het_rates(k,96))* y(k,96) prod(k,39) = (rxt(k,104) +rxt(k,103)*y(k,32) +rxt(k,105)*y(k,69) + & - rxt(k,106)*y(k,70) +rxt(k,107)*y(k,71))*y(k,96) +rxt(k,7)*y(k,71) + rxt(k,106)*y(k,70) +rxt(k,107)*y(k,71))*y(k,97) +rxt(k,7)*y(k,71) loss(k,40) = (rxt(k,103)* y(k,32) +rxt(k,105)* y(k,69) +rxt(k,106)* y(k,70) & - +rxt(k,107)* y(k,71) + rxt(k,93) + rxt(k,104) + het_rates(k,96)) & - * y(k,96) - prod(k,40) =rxt(k,97)*y(k,94)*y(k,70) - loss(k,79) = (rxt(k,296)* y(k,55) +rxt(k,298)* y(k,61) +rxt(k,288)* y(k,88) & - + rxt(k,297) + het_rates(k,97))* y(k,97) - prod(k,79) = (rxt(k,78) +rxt(k,80) +rxt(k,290)*y(k,91) +rxt(k,294)*y(k,93) + & - rxt(k,302)*y(k,99) +rxt(k,306)*y(k,100))*y(k,70) +rxt(k,299)*y(k,99) & - *y(k,32) + +rxt(k,107)* y(k,71) + rxt(k,93) + rxt(k,104) + het_rates(k,97)) & + * y(k,97) + prod(k,40) =rxt(k,97)*y(k,95)*y(k,70) + loss(k,79) = (rxt(k,296)* y(k,55) +rxt(k,298)* y(k,61) +rxt(k,288)* y(k,89) & + + rxt(k,297) + het_rates(k,98))* y(k,98) + prod(k,79) = (rxt(k,78) +rxt(k,80) +rxt(k,290)*y(k,92) +rxt(k,294)*y(k,94) + & + rxt(k,302)*y(k,100) +rxt(k,306)*y(k,101))*y(k,70) & + +rxt(k,299)*y(k,100)*y(k,32) loss(k,98) = (rxt(k,203)* y(k,5) +rxt(k,219)* y(k,16) +rxt(k,237)* y(k,17) & +rxt(k,221)* y(k,18) +rxt(k,222)* y(k,19) +rxt(k,224)* y(k,20) & +rxt(k,240)* y(k,22) +rxt(k,241)* y(k,23) +rxt(k,226)* y(k,24) & @@ -498,47 +509,47 @@ subroutine imp_prod_loss( avec_len, prod, loss, y, & +rxt(k,228)* y(k,47) +rxt(k,229)* y(k,48) +rxt(k,176)* y(k,49) & +rxt(k,152)* y(k,51) +rxt(k,128)* y(k,52) +rxt(k,179)* y(k,54) & +rxt(k,143)* y(k,55) +rxt(k,151)* y(k,62) +rxt(k,142)* y(k,63) & - +rxt(k,123)* y(k,69) +rxt(k,124)* y(k,71) +rxt(k,249)* y(k,73) & - +rxt(k,255)* y(k,76) +rxt(k,260)* y(k,78) +rxt(k,251)* y(k,79) & - +rxt(k,122)* y(k,89) + 2._r8*(rxt(k,125) +rxt(k,126))* y(k,98) & - + het_rates(k,98))* y(k,98) - prod(k,98) = (rxt(k,111)*y(k,41) +rxt(k,112)*y(k,43) +rxt(k,117)*y(k,89) + & + +rxt(k,123)* y(k,69) +rxt(k,124)* y(k,71) +rxt(k,249)* y(k,74) & + +rxt(k,255)* y(k,77) +rxt(k,260)* y(k,79) +rxt(k,251)* y(k,80) & + +rxt(k,122)* y(k,90) + 2._r8*(rxt(k,125) +rxt(k,126))* y(k,99) & + + het_rates(k,99))* y(k,99) + prod(k,98) = (rxt(k,111)*y(k,41) +rxt(k,112)*y(k,43) +rxt(k,117)*y(k,90) + & rxt(k,175)*y(k,49) +rxt(k,178)*y(k,54) +rxt(k,204)*y(k,45) + & rxt(k,206)*y(k,53) +rxt(k,236)*y(k,17))*y(k,69) & + (2.000_r8*rxt(k,114)*y(k,40) +rxt(k,118)*y(k,71) + & - rxt(k,139)*y(k,63) +rxt(k,144)*y(k,61) +rxt(k,160)*y(k,25))*y(k,89) & - + (rxt(k,94)*y(k,41) +2.000_r8*rxt(k,95)*y(k,102) + & - rxt(k,187)*y(k,49) +rxt(k,210)*y(k,45) +rxt(k,242)*y(k,23))*y(k,94) & - + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,98))*y(k,22) + (rxt(k,3) + & - rxt(k,214)*y(k,39))*y(k,102) +.330_r8*rxt(k,24)*y(k,23) & + rxt(k,139)*y(k,63) +rxt(k,144)*y(k,61) +rxt(k,160)*y(k,25))*y(k,90) & + + (rxt(k,94)*y(k,41) +2.000_r8*rxt(k,95)*y(k,103) + & + rxt(k,187)*y(k,49) +rxt(k,210)*y(k,45) +rxt(k,242)*y(k,23))*y(k,95) & + + (rxt(k,22) +.300_r8*rxt(k,240)*y(k,99))*y(k,22) + (rxt(k,3) + & + rxt(k,214)*y(k,39))*y(k,103) +.330_r8*rxt(k,24)*y(k,23) & +rxt(k,119)*y(k,71)*y(k,40) +2.000_r8*rxt(k,4)*y(k,43) +rxt(k,9) & *y(k,51) +rxt(k,10)*y(k,52) +rxt(k,57)*y(k,53) +rxt(k,58)*y(k,54) & +.500_r8*rxt(k,265)*y(k,62) - loss(k,80) = (rxt(k,299)* y(k,32) +rxt(k,302)* y(k,70) +rxt(k,301)* y(k,90) & - + rxt(k,300) + het_rates(k,99))* y(k,99) - prod(k,80) = (rxt(k,73) +rxt(k,74) +rxt(k,292)*y(k,91) +rxt(k,293)*y(k,93) + & - rxt(k,305)*y(k,100) +rxt(k,311)*y(k,101))*y(k,69) + (rxt(k,79) + & - rxt(k,81))*y(k,70) + (rxt(k,303)*y(k,100) +rxt(k,308)*y(k,101)) & - *y(k,88) +rxt(k,285)*y(k,100) +rxt(k,284)*y(k,101) - loss(k,60) = (rxt(k,305)* y(k,69) +rxt(k,306)* y(k,70) +rxt(k,303)* y(k,88) & - + rxt(k,285) + rxt(k,304) + het_rates(k,100))* y(k,100) + loss(k,80) = (rxt(k,299)* y(k,32) +rxt(k,302)* y(k,70) +rxt(k,301)* y(k,91) & + + rxt(k,300) + het_rates(k,100))* y(k,100) + prod(k,80) = (rxt(k,73) +rxt(k,74) +rxt(k,292)*y(k,92) +rxt(k,293)*y(k,94) + & + rxt(k,305)*y(k,101) +rxt(k,311)*y(k,102))*y(k,69) + (rxt(k,79) + & + rxt(k,81))*y(k,70) + (rxt(k,303)*y(k,101) +rxt(k,308)*y(k,102)) & + *y(k,89) +rxt(k,285)*y(k,101) +rxt(k,284)*y(k,102) + loss(k,60) = (rxt(k,305)* y(k,69) +rxt(k,306)* y(k,70) +rxt(k,303)* y(k,89) & + + rxt(k,285) + rxt(k,304) + het_rates(k,101))* y(k,101) prod(k,60) = (rxt(k,75) +rxt(k,76))*y(k,69) + (rxt(k,85) +rxt(k,86))*y(k,70) & - + (rxt(k,286) +rxt(k,307)*y(k,88))*y(k,101) - loss(k,59) = (rxt(k,311)* y(k,69) + (rxt(k,307) +rxt(k,308))* y(k,88) & + + (rxt(k,286) +rxt(k,307)*y(k,89))*y(k,102) + loss(k,59) = (rxt(k,311)* y(k,69) + (rxt(k,307) +rxt(k,308))* y(k,89) & + rxt(k,284) + rxt(k,286) + rxt(k,309) + rxt(k,310) & - + het_rates(k,101))* y(k,101) + + het_rates(k,102))* y(k,102) prod(k,59) = (rxt(k,71) +rxt(k,72))*y(k,69) + (rxt(k,77) +rxt(k,84))*y(k,70) - loss(k,102) = (rxt(k,214)* y(k,39) +rxt(k,262)* y(k,80) +rxt(k,95)* y(k,94) & - + rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,102))* y(k,102) - prod(k,102) = (rxt(k,120)*y(k,41) +rxt(k,121)*y(k,43) +rxt(k,122)*y(k,89) + & - rxt(k,125)*y(k,98) +rxt(k,128)*y(k,52) +rxt(k,152)*y(k,51) + & + loss(k,102) = (rxt(k,214)* y(k,39) +rxt(k,262)* y(k,81) +rxt(k,95)* y(k,95) & + + rxt(k,1) + rxt(k,2) + rxt(k,3) + het_rates(k,103))* y(k,103) + prod(k,102) = (rxt(k,120)*y(k,41) +rxt(k,121)*y(k,43) +rxt(k,122)*y(k,90) + & + rxt(k,125)*y(k,99) +rxt(k,128)*y(k,52) +rxt(k,152)*y(k,51) + & rxt(k,176)*y(k,49) +rxt(k,179)*y(k,54) +rxt(k,205)*y(k,45) + & rxt(k,219)*y(k,16) +rxt(k,221)*y(k,18) +rxt(k,222)*y(k,19) + & rxt(k,224)*y(k,20) +rxt(k,229)*y(k,48) +rxt(k,237)*y(k,17) + & - rxt(k,240)*y(k,22) +rxt(k,241)*y(k,23))*y(k,98) & + rxt(k,240)*y(k,22) +rxt(k,241)*y(k,23))*y(k,99) & + (rxt(k,268)*y(k,54) +rxt(k,274)*y(k,54) +rxt(k,275)*y(k,53) + & rxt(k,279)*y(k,54) +rxt(k,280)*y(k,53))*y(k,49) +.050_r8*rxt(k,24) & - *y(k,23) +rxt(k,115)*y(k,89)*y(k,40) +rxt(k,87)*y(k,44) + *y(k,23) +rxt(k,115)*y(k,90)*y(k,40) +rxt(k,87)*y(k,44) end do end subroutine imp_prod_loss end module mo_prod_loss diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 index d8f52c4676..bbe9d4d986 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 @@ -8,9 +8,9 @@ subroutine set_rates( rxt_rates, sol, ncol ) real(r8), intent(inout) :: rxt_rates(:,:,:) real(r8), intent(in) :: sol(:,:,:) integer, intent(in) :: ncol - rxt_rates(:ncol,:, 1) = rxt_rates(:ncol,:, 1)*sol(:ncol,:, 102) ! rate_const*H2O - rxt_rates(:ncol,:, 2) = rxt_rates(:ncol,:, 2)*sol(:ncol,:, 102) ! rate_const*H2O - rxt_rates(:ncol,:, 3) = rxt_rates(:ncol,:, 3)*sol(:ncol,:, 102) ! rate_const*H2O + rxt_rates(:ncol,:, 1) = rxt_rates(:ncol,:, 1)*sol(:ncol,:, 103) ! rate_const*H2O + rxt_rates(:ncol,:, 2) = rxt_rates(:ncol,:, 2)*sol(:ncol,:, 103) ! rate_const*H2O + rxt_rates(:ncol,:, 3) = rxt_rates(:ncol,:, 3)*sol(:ncol,:, 103) ! rate_const*H2O rxt_rates(:ncol,:, 4) = rxt_rates(:ncol,:, 4)*sol(:ncol,:, 43) ! rate_const*H2O2 rxt_rates(:ncol,:, 5) = rxt_rates(:ncol,:, 5)*sol(:ncol,:, 70) ! rate_const*O2 rxt_rates(:ncol,:, 6) = rxt_rates(:ncol,:, 6)*sol(:ncol,:, 70) ! rate_const*O2 @@ -66,8 +66,8 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 56) = rxt_rates(:ncol,:, 56)*sol(:ncol,:, 50) ! rate_const*HF rxt_rates(:ncol,:, 57) = rxt_rates(:ncol,:, 57)*sol(:ncol,:, 53) ! rate_const*HOBR rxt_rates(:ncol,:, 58) = rxt_rates(:ncol,:, 58)*sol(:ncol,:, 54) ! rate_const*HOCL - rxt_rates(:ncol,:, 59) = rxt_rates(:ncol,:, 59)*sol(:ncol,:, 72) ! rate_const*OCLO - rxt_rates(:ncol,:, 60) = rxt_rates(:ncol,:, 60)*sol(:ncol,:, 77) ! rate_const*SF6 + rxt_rates(:ncol,:, 59) = rxt_rates(:ncol,:, 59)*sol(:ncol,:, 73) ! rate_const*OCLO + rxt_rates(:ncol,:, 60) = rxt_rates(:ncol,:, 60)*sol(:ncol,:, 78) ! rate_const*SF6 rxt_rates(:ncol,:, 61) = rxt_rates(:ncol,:, 61)*sol(:ncol,:, 32) ! rate_const*CO2 rxt_rates(:ncol,:, 62) = rxt_rates(:ncol,:, 62)*sol(:ncol,:, 55) ! rate_const*N ! rate_const*N2 @@ -95,49 +95,49 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 85) = rxt_rates(:ncol,:, 85)*sol(:ncol,:, 70) ! rate_const*O2 rxt_rates(:ncol,:, 86) = rxt_rates(:ncol,:, 86)*sol(:ncol,:, 70) ! rate_const*O2 rxt_rates(:ncol,:, 87) = rxt_rates(:ncol,:, 87)*sol(:ncol,:, 44) ! rate_const*H2SO4 - rxt_rates(:ncol,:, 88) = rxt_rates(:ncol,:, 88)*sol(:ncol,:, 73) ! rate_const*OCS - rxt_rates(:ncol,:, 89) = rxt_rates(:ncol,:, 89)*sol(:ncol,:, 78) ! rate_const*SO - rxt_rates(:ncol,:, 90) = rxt_rates(:ncol,:, 90)*sol(:ncol,:, 79) ! rate_const*SO2 - rxt_rates(:ncol,:, 91) = rxt_rates(:ncol,:, 91)*sol(:ncol,:, 80) ! rate_const*SO3 - rxt_rates(:ncol,:, 92) = rxt_rates(:ncol,:, 92)*sol(:ncol,:, 95) ! rate_const*O2_1D - rxt_rates(:ncol,:, 93) = rxt_rates(:ncol,:, 93)*sol(:ncol,:, 96) ! rate_const*O2_1S - rxt_rates(:ncol,:, 94) = rxt_rates(:ncol,:, 94)*sol(:ncol,:, 94)*sol(:ncol,:, 41) ! rate_const*O1D*H2 - rxt_rates(:ncol,:, 95) = rxt_rates(:ncol,:, 95)*sol(:ncol,:, 94)*sol(:ncol,:, 102) ! rate_const*O1D*H2O - rxt_rates(:ncol,:, 96) = rxt_rates(:ncol,:, 96)*sol(:ncol,:, 94) ! rate_const*N2*O1D - rxt_rates(:ncol,:, 97) = rxt_rates(:ncol,:, 97)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*O1D*O2 - rxt_rates(:ncol,:, 98) = rxt_rates(:ncol,:, 98)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*O1D*O2 - rxt_rates(:ncol,:, 99) = rxt_rates(:ncol,:, 99)*sol(:ncol,:, 94)*sol(:ncol,:, 71) ! rate_const*O1D*O3 - rxt_rates(:ncol,:, 100) = rxt_rates(:ncol,:, 100)*sol(:ncol,:, 95) ! rate_const*N2*O2_1D - rxt_rates(:ncol,:, 101) = rxt_rates(:ncol,:, 101)*sol(:ncol,:, 95)*sol(:ncol,:, 69) ! rate_const*O2_1D*O - rxt_rates(:ncol,:, 102) = rxt_rates(:ncol,:, 102)*sol(:ncol,:, 95)*sol(:ncol,:, 70) ! rate_const*O2_1D*O2 - rxt_rates(:ncol,:, 103) = rxt_rates(:ncol,:, 103)*sol(:ncol,:, 96)*sol(:ncol,:, 32) ! rate_const*O2_1S*CO2 - rxt_rates(:ncol,:, 104) = rxt_rates(:ncol,:, 104)*sol(:ncol,:, 96) ! rate_const*N2*O2_1S - rxt_rates(:ncol,:, 105) = rxt_rates(:ncol,:, 105)*sol(:ncol,:, 96)*sol(:ncol,:, 69) ! rate_const*O2_1S*O - rxt_rates(:ncol,:, 106) = rxt_rates(:ncol,:, 106)*sol(:ncol,:, 96)*sol(:ncol,:, 70) ! rate_const*O2_1S*O2 - rxt_rates(:ncol,:, 107) = rxt_rates(:ncol,:, 107)*sol(:ncol,:, 96)*sol(:ncol,:, 71) ! rate_const*O2_1S*O3 + rxt_rates(:ncol,:, 88) = rxt_rates(:ncol,:, 88)*sol(:ncol,:, 74) ! rate_const*OCS + rxt_rates(:ncol,:, 89) = rxt_rates(:ncol,:, 89)*sol(:ncol,:, 79) ! rate_const*SO + rxt_rates(:ncol,:, 90) = rxt_rates(:ncol,:, 90)*sol(:ncol,:, 80) ! rate_const*SO2 + rxt_rates(:ncol,:, 91) = rxt_rates(:ncol,:, 91)*sol(:ncol,:, 81) ! rate_const*SO3 + rxt_rates(:ncol,:, 92) = rxt_rates(:ncol,:, 92)*sol(:ncol,:, 96) ! rate_const*O2_1D + rxt_rates(:ncol,:, 93) = rxt_rates(:ncol,:, 93)*sol(:ncol,:, 97) ! rate_const*O2_1S + rxt_rates(:ncol,:, 94) = rxt_rates(:ncol,:, 94)*sol(:ncol,:, 95)*sol(:ncol,:, 41) ! rate_const*O1D*H2 + rxt_rates(:ncol,:, 95) = rxt_rates(:ncol,:, 95)*sol(:ncol,:, 95)*sol(:ncol,:, 103) ! rate_const*O1D*H2O + rxt_rates(:ncol,:, 96) = rxt_rates(:ncol,:, 96)*sol(:ncol,:, 95) ! rate_const*N2*O1D + rxt_rates(:ncol,:, 97) = rxt_rates(:ncol,:, 97)*sol(:ncol,:, 95)*sol(:ncol,:, 70) ! rate_const*O1D*O2 + rxt_rates(:ncol,:, 98) = rxt_rates(:ncol,:, 98)*sol(:ncol,:, 95)*sol(:ncol,:, 70) ! rate_const*O1D*O2 + rxt_rates(:ncol,:, 99) = rxt_rates(:ncol,:, 99)*sol(:ncol,:, 95)*sol(:ncol,:, 71) ! rate_const*O1D*O3 + rxt_rates(:ncol,:, 100) = rxt_rates(:ncol,:, 100)*sol(:ncol,:, 96) ! rate_const*N2*O2_1D + rxt_rates(:ncol,:, 101) = rxt_rates(:ncol,:, 101)*sol(:ncol,:, 96)*sol(:ncol,:, 69) ! rate_const*O2_1D*O + rxt_rates(:ncol,:, 102) = rxt_rates(:ncol,:, 102)*sol(:ncol,:, 96)*sol(:ncol,:, 70) ! rate_const*O2_1D*O2 + rxt_rates(:ncol,:, 103) = rxt_rates(:ncol,:, 103)*sol(:ncol,:, 97)*sol(:ncol,:, 32) ! rate_const*O2_1S*CO2 + rxt_rates(:ncol,:, 104) = rxt_rates(:ncol,:, 104)*sol(:ncol,:, 97) ! rate_const*N2*O2_1S + rxt_rates(:ncol,:, 105) = rxt_rates(:ncol,:, 105)*sol(:ncol,:, 97)*sol(:ncol,:, 69) ! rate_const*O2_1S*O + rxt_rates(:ncol,:, 106) = rxt_rates(:ncol,:, 106)*sol(:ncol,:, 97)*sol(:ncol,:, 70) ! rate_const*O2_1S*O2 + rxt_rates(:ncol,:, 107) = rxt_rates(:ncol,:, 107)*sol(:ncol,:, 97)*sol(:ncol,:, 71) ! rate_const*O2_1S*O3 rxt_rates(:ncol,:, 108) = rxt_rates(:ncol,:, 108)*sol(:ncol,:, 69)*sol(:ncol,:, 71) ! rate_const*O*O3 rxt_rates(:ncol,:, 109) = rxt_rates(:ncol,:, 109)*sol(:ncol,:, 69)*sol(:ncol,:, 69) ! rate_const*M*O*O rxt_rates(:ncol,:, 110) = rxt_rates(:ncol,:, 110)*sol(:ncol,:, 69)*sol(:ncol,:, 70) ! rate_const*M*O*O2 rxt_rates(:ncol,:, 111) = rxt_rates(:ncol,:, 111)*sol(:ncol,:, 41)*sol(:ncol,:, 69) ! rate_const*H2*O rxt_rates(:ncol,:, 112) = rxt_rates(:ncol,:, 112)*sol(:ncol,:, 43)*sol(:ncol,:, 69) ! rate_const*H2O2*O - rxt_rates(:ncol,:, 113) = rxt_rates(:ncol,:, 113)*sol(:ncol,:, 40)*sol(:ncol,:, 89) ! rate_const*H*HO2 - rxt_rates(:ncol,:, 114) = rxt_rates(:ncol,:, 114)*sol(:ncol,:, 40)*sol(:ncol,:, 89) ! rate_const*H*HO2 - rxt_rates(:ncol,:, 115) = rxt_rates(:ncol,:, 115)*sol(:ncol,:, 40)*sol(:ncol,:, 89) ! rate_const*H*HO2 + rxt_rates(:ncol,:, 113) = rxt_rates(:ncol,:, 113)*sol(:ncol,:, 40)*sol(:ncol,:, 90) ! rate_const*H*HO2 + rxt_rates(:ncol,:, 114) = rxt_rates(:ncol,:, 114)*sol(:ncol,:, 40)*sol(:ncol,:, 90) ! rate_const*H*HO2 + rxt_rates(:ncol,:, 115) = rxt_rates(:ncol,:, 115)*sol(:ncol,:, 40)*sol(:ncol,:, 90) ! rate_const*H*HO2 rxt_rates(:ncol,:, 116) = rxt_rates(:ncol,:, 116)*sol(:ncol,:, 40)*sol(:ncol,:, 70) ! rate_const*M*H*O2 - rxt_rates(:ncol,:, 117) = rxt_rates(:ncol,:, 117)*sol(:ncol,:, 89)*sol(:ncol,:, 69) ! rate_const*HO2*O - rxt_rates(:ncol,:, 118) = rxt_rates(:ncol,:, 118)*sol(:ncol,:, 89)*sol(:ncol,:, 71) ! rate_const*HO2*O3 + rxt_rates(:ncol,:, 117) = rxt_rates(:ncol,:, 117)*sol(:ncol,:, 90)*sol(:ncol,:, 69) ! rate_const*HO2*O + rxt_rates(:ncol,:, 118) = rxt_rates(:ncol,:, 118)*sol(:ncol,:, 90)*sol(:ncol,:, 71) ! rate_const*HO2*O3 rxt_rates(:ncol,:, 119) = rxt_rates(:ncol,:, 119)*sol(:ncol,:, 40)*sol(:ncol,:, 71) ! rate_const*H*O3 - rxt_rates(:ncol,:, 120) = rxt_rates(:ncol,:, 120)*sol(:ncol,:, 98)*sol(:ncol,:, 41) ! rate_const*OH*H2 - rxt_rates(:ncol,:, 121) = rxt_rates(:ncol,:, 121)*sol(:ncol,:, 98)*sol(:ncol,:, 43) ! rate_const*OH*H2O2 - rxt_rates(:ncol,:, 122) = rxt_rates(:ncol,:, 122)*sol(:ncol,:, 98)*sol(:ncol,:, 89) ! rate_const*OH*HO2 - rxt_rates(:ncol,:, 123) = rxt_rates(:ncol,:, 123)*sol(:ncol,:, 98)*sol(:ncol,:, 69) ! rate_const*OH*O - rxt_rates(:ncol,:, 124) = rxt_rates(:ncol,:, 124)*sol(:ncol,:, 98)*sol(:ncol,:, 71) ! rate_const*OH*O3 - rxt_rates(:ncol,:, 125) = rxt_rates(:ncol,:, 125)*sol(:ncol,:, 98)*sol(:ncol,:, 98) ! rate_const*OH*OH - rxt_rates(:ncol,:, 126) = rxt_rates(:ncol,:, 126)*sol(:ncol,:, 98)*sol(:ncol,:, 98) ! rate_const*M*OH*OH - rxt_rates(:ncol,:, 127) = rxt_rates(:ncol,:, 127)*sol(:ncol,:, 89)*sol(:ncol,:, 89) ! rate_const*HO2*HO2 - rxt_rates(:ncol,:, 128) = rxt_rates(:ncol,:, 128)*sol(:ncol,:, 52)*sol(:ncol,:, 98) ! rate_const*HO2NO2*OH - rxt_rates(:ncol,:, 129) = rxt_rates(:ncol,:, 129)*sol(:ncol,:, 90)*sol(:ncol,:, 69) ! rate_const*N2D*O - rxt_rates(:ncol,:, 130) = rxt_rates(:ncol,:, 130)*sol(:ncol,:, 90)*sol(:ncol,:, 70) ! rate_const*N2D*O2 + rxt_rates(:ncol,:, 120) = rxt_rates(:ncol,:, 120)*sol(:ncol,:, 99)*sol(:ncol,:, 41) ! rate_const*OH*H2 + rxt_rates(:ncol,:, 121) = rxt_rates(:ncol,:, 121)*sol(:ncol,:, 99)*sol(:ncol,:, 43) ! rate_const*OH*H2O2 + rxt_rates(:ncol,:, 122) = rxt_rates(:ncol,:, 122)*sol(:ncol,:, 99)*sol(:ncol,:, 90) ! rate_const*OH*HO2 + rxt_rates(:ncol,:, 123) = rxt_rates(:ncol,:, 123)*sol(:ncol,:, 99)*sol(:ncol,:, 69) ! rate_const*OH*O + rxt_rates(:ncol,:, 124) = rxt_rates(:ncol,:, 124)*sol(:ncol,:, 99)*sol(:ncol,:, 71) ! rate_const*OH*O3 + rxt_rates(:ncol,:, 125) = rxt_rates(:ncol,:, 125)*sol(:ncol,:, 99)*sol(:ncol,:, 99) ! rate_const*OH*OH + rxt_rates(:ncol,:, 126) = rxt_rates(:ncol,:, 126)*sol(:ncol,:, 99)*sol(:ncol,:, 99) ! rate_const*M*OH*OH + rxt_rates(:ncol,:, 127) = rxt_rates(:ncol,:, 127)*sol(:ncol,:, 90)*sol(:ncol,:, 90) ! rate_const*HO2*HO2 + rxt_rates(:ncol,:, 128) = rxt_rates(:ncol,:, 128)*sol(:ncol,:, 52)*sol(:ncol,:, 99) ! rate_const*HO2NO2*OH + rxt_rates(:ncol,:, 129) = rxt_rates(:ncol,:, 129)*sol(:ncol,:, 91)*sol(:ncol,:, 69) ! rate_const*N2D*O + rxt_rates(:ncol,:, 130) = rxt_rates(:ncol,:, 130)*sol(:ncol,:, 91)*sol(:ncol,:, 70) ! rate_const*N2D*O2 rxt_rates(:ncol,:, 131) = rxt_rates(:ncol,:, 131)*sol(:ncol,:, 55)*sol(:ncol,:, 61) ! rate_const*N*NO rxt_rates(:ncol,:, 132) = rxt_rates(:ncol,:, 132)*sol(:ncol,:, 55)*sol(:ncol,:, 62) ! rate_const*N*NO2 rxt_rates(:ncol,:, 133) = rxt_rates(:ncol,:, 133)*sol(:ncol,:, 55)*sol(:ncol,:, 62) ! rate_const*N*NO2 @@ -146,131 +146,131 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 136) = rxt_rates(:ncol,:, 136)*sol(:ncol,:, 62)*sol(:ncol,:, 69) ! rate_const*NO2*O rxt_rates(:ncol,:, 137) = rxt_rates(:ncol,:, 137)*sol(:ncol,:, 62)*sol(:ncol,:, 71) ! rate_const*NO2*O3 rxt_rates(:ncol,:, 138) = rxt_rates(:ncol,:, 138)*sol(:ncol,:, 62)*sol(:ncol,:, 69) ! rate_const*M*NO2*O - rxt_rates(:ncol,:, 139) = rxt_rates(:ncol,:, 139)*sol(:ncol,:, 63)*sol(:ncol,:, 89) ! rate_const*NO3*HO2 + rxt_rates(:ncol,:, 139) = rxt_rates(:ncol,:, 139)*sol(:ncol,:, 63)*sol(:ncol,:, 90) ! rate_const*NO3*HO2 rxt_rates(:ncol,:, 140) = rxt_rates(:ncol,:, 140)*sol(:ncol,:, 63)*sol(:ncol,:, 61) ! rate_const*NO3*NO rxt_rates(:ncol,:, 141) = rxt_rates(:ncol,:, 141)*sol(:ncol,:, 63)*sol(:ncol,:, 69) ! rate_const*NO3*O - rxt_rates(:ncol,:, 142) = rxt_rates(:ncol,:, 142)*sol(:ncol,:, 63)*sol(:ncol,:, 98) ! rate_const*NO3*OH - rxt_rates(:ncol,:, 143) = rxt_rates(:ncol,:, 143)*sol(:ncol,:, 55)*sol(:ncol,:, 98) ! rate_const*N*OH - rxt_rates(:ncol,:, 144) = rxt_rates(:ncol,:, 144)*sol(:ncol,:, 61)*sol(:ncol,:, 89) ! rate_const*NO*HO2 + rxt_rates(:ncol,:, 142) = rxt_rates(:ncol,:, 142)*sol(:ncol,:, 63)*sol(:ncol,:, 99) ! rate_const*NO3*OH + rxt_rates(:ncol,:, 143) = rxt_rates(:ncol,:, 143)*sol(:ncol,:, 55)*sol(:ncol,:, 99) ! rate_const*N*OH + rxt_rates(:ncol,:, 144) = rxt_rates(:ncol,:, 144)*sol(:ncol,:, 61)*sol(:ncol,:, 90) ! rate_const*NO*HO2 rxt_rates(:ncol,:, 145) = rxt_rates(:ncol,:, 145)*sol(:ncol,:, 61)*sol(:ncol,:, 71) ! rate_const*NO*O3 rxt_rates(:ncol,:, 146) = rxt_rates(:ncol,:, 146)*sol(:ncol,:, 61)*sol(:ncol,:, 69) ! rate_const*M*NO*O - rxt_rates(:ncol,:, 147) = rxt_rates(:ncol,:, 147)*sol(:ncol,:, 94)*sol(:ncol,:, 56) ! rate_const*O1D*N2O - rxt_rates(:ncol,:, 148) = rxt_rates(:ncol,:, 148)*sol(:ncol,:, 94)*sol(:ncol,:, 56) ! rate_const*O1D*N2O - rxt_rates(:ncol,:, 149) = rxt_rates(:ncol,:, 149)*sol(:ncol,:, 62)*sol(:ncol,:, 89) ! rate_const*M*NO2*HO2 + rxt_rates(:ncol,:, 147) = rxt_rates(:ncol,:, 147)*sol(:ncol,:, 95)*sol(:ncol,:, 56) ! rate_const*O1D*N2O + rxt_rates(:ncol,:, 148) = rxt_rates(:ncol,:, 148)*sol(:ncol,:, 95)*sol(:ncol,:, 56) ! rate_const*O1D*N2O + rxt_rates(:ncol,:, 149) = rxt_rates(:ncol,:, 149)*sol(:ncol,:, 62)*sol(:ncol,:, 90) ! rate_const*M*NO2*HO2 rxt_rates(:ncol,:, 150) = rxt_rates(:ncol,:, 150)*sol(:ncol,:, 62)*sol(:ncol,:, 63) ! rate_const*M*NO2*NO3 - rxt_rates(:ncol,:, 151) = rxt_rates(:ncol,:, 151)*sol(:ncol,:, 62)*sol(:ncol,:, 98) ! rate_const*M*NO2*OH - rxt_rates(:ncol,:, 152) = rxt_rates(:ncol,:, 152)*sol(:ncol,:, 51)*sol(:ncol,:, 98) ! rate_const*HNO3*OH + rxt_rates(:ncol,:, 151) = rxt_rates(:ncol,:, 151)*sol(:ncol,:, 62)*sol(:ncol,:, 99) ! rate_const*M*NO2*OH + rxt_rates(:ncol,:, 152) = rxt_rates(:ncol,:, 152)*sol(:ncol,:, 51)*sol(:ncol,:, 99) ! rate_const*HNO3*OH rxt_rates(:ncol,:, 153) = rxt_rates(:ncol,:, 153)*sol(:ncol,:, 52) ! rate_const*M*HO2NO2 rxt_rates(:ncol,:, 154) = rxt_rates(:ncol,:, 154)*sol(:ncol,:, 57) ! rate_const*M*N2O5 rxt_rates(:ncol,:, 155) = rxt_rates(:ncol,:, 155)*sol(:ncol,:, 25)*sol(:ncol,:, 17) ! rate_const*CL*CH2O rxt_rates(:ncol,:, 156) = rxt_rates(:ncol,:, 156)*sol(:ncol,:, 25)*sol(:ncol,:, 23) ! rate_const*CL*CH4 rxt_rates(:ncol,:, 157) = rxt_rates(:ncol,:, 157)*sol(:ncol,:, 25)*sol(:ncol,:, 41) ! rate_const*CL*H2 rxt_rates(:ncol,:, 158) = rxt_rates(:ncol,:, 158)*sol(:ncol,:, 25)*sol(:ncol,:, 43) ! rate_const*CL*H2O2 - rxt_rates(:ncol,:, 159) = rxt_rates(:ncol,:, 159)*sol(:ncol,:, 25)*sol(:ncol,:, 89) ! rate_const*CL*HO2 - rxt_rates(:ncol,:, 160) = rxt_rates(:ncol,:, 160)*sol(:ncol,:, 25)*sol(:ncol,:, 89) ! rate_const*CL*HO2 + rxt_rates(:ncol,:, 159) = rxt_rates(:ncol,:, 159)*sol(:ncol,:, 25)*sol(:ncol,:, 90) ! rate_const*CL*HO2 + rxt_rates(:ncol,:, 160) = rxt_rates(:ncol,:, 160)*sol(:ncol,:, 25)*sol(:ncol,:, 90) ! rate_const*CL*HO2 rxt_rates(:ncol,:, 161) = rxt_rates(:ncol,:, 161)*sol(:ncol,:, 25)*sol(:ncol,:, 71) ! rate_const*CL*O3 rxt_rates(:ncol,:, 162) = rxt_rates(:ncol,:, 162)*sol(:ncol,:, 28)*sol(:ncol,:, 21) ! rate_const*CLO*CH3O2 rxt_rates(:ncol,:, 163) = rxt_rates(:ncol,:, 163)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*CLO*CLO rxt_rates(:ncol,:, 164) = rxt_rates(:ncol,:, 164)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*CLO*CLO rxt_rates(:ncol,:, 165) = rxt_rates(:ncol,:, 165)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*CLO*CLO - rxt_rates(:ncol,:, 166) = rxt_rates(:ncol,:, 166)*sol(:ncol,:, 28)*sol(:ncol,:, 89) ! rate_const*CLO*HO2 + rxt_rates(:ncol,:, 166) = rxt_rates(:ncol,:, 166)*sol(:ncol,:, 28)*sol(:ncol,:, 90) ! rate_const*CLO*HO2 rxt_rates(:ncol,:, 167) = rxt_rates(:ncol,:, 167)*sol(:ncol,:, 28)*sol(:ncol,:, 61) ! rate_const*CLO*NO rxt_rates(:ncol,:, 168) = rxt_rates(:ncol,:, 168)*sol(:ncol,:, 29)*sol(:ncol,:, 25) ! rate_const*CLONO2*CL rxt_rates(:ncol,:, 169) = rxt_rates(:ncol,:, 169)*sol(:ncol,:, 28)*sol(:ncol,:, 62) ! rate_const*M*CLO*NO2 rxt_rates(:ncol,:, 170) = rxt_rates(:ncol,:, 170)*sol(:ncol,:, 29)*sol(:ncol,:, 69) ! rate_const*CLONO2*O - rxt_rates(:ncol,:, 171) = rxt_rates(:ncol,:, 171)*sol(:ncol,:, 29)*sol(:ncol,:, 98) ! rate_const*CLONO2*OH + rxt_rates(:ncol,:, 171) = rxt_rates(:ncol,:, 171)*sol(:ncol,:, 29)*sol(:ncol,:, 99) ! rate_const*CLONO2*OH rxt_rates(:ncol,:, 172) = rxt_rates(:ncol,:, 172)*sol(:ncol,:, 28)*sol(:ncol,:, 69) ! rate_const*CLO*O - rxt_rates(:ncol,:, 173) = rxt_rates(:ncol,:, 173)*sol(:ncol,:, 28)*sol(:ncol,:, 98) ! rate_const*CLO*OH - rxt_rates(:ncol,:, 174) = rxt_rates(:ncol,:, 174)*sol(:ncol,:, 28)*sol(:ncol,:, 98) ! rate_const*CLO*OH + rxt_rates(:ncol,:, 173) = rxt_rates(:ncol,:, 173)*sol(:ncol,:, 28)*sol(:ncol,:, 99) ! rate_const*CLO*OH + rxt_rates(:ncol,:, 174) = rxt_rates(:ncol,:, 174)*sol(:ncol,:, 28)*sol(:ncol,:, 99) ! rate_const*CLO*OH rxt_rates(:ncol,:, 175) = rxt_rates(:ncol,:, 175)*sol(:ncol,:, 49)*sol(:ncol,:, 69) ! rate_const*HCL*O - rxt_rates(:ncol,:, 176) = rxt_rates(:ncol,:, 176)*sol(:ncol,:, 49)*sol(:ncol,:, 98) ! rate_const*HCL*OH + rxt_rates(:ncol,:, 176) = rxt_rates(:ncol,:, 176)*sol(:ncol,:, 49)*sol(:ncol,:, 99) ! rate_const*HCL*OH rxt_rates(:ncol,:, 177) = rxt_rates(:ncol,:, 177)*sol(:ncol,:, 54)*sol(:ncol,:, 25) ! rate_const*HOCL*CL rxt_rates(:ncol,:, 178) = rxt_rates(:ncol,:, 178)*sol(:ncol,:, 54)*sol(:ncol,:, 69) ! rate_const*HOCL*O - rxt_rates(:ncol,:, 179) = rxt_rates(:ncol,:, 179)*sol(:ncol,:, 54)*sol(:ncol,:, 98) ! rate_const*HOCL*OH - rxt_rates(:ncol,:, 180) = rxt_rates(:ncol,:, 180)*sol(:ncol,:, 94)*sol(:ncol,:, 8) ! rate_const*O1D*CCL4 - rxt_rates(:ncol,:, 181) = rxt_rates(:ncol,:, 181)*sol(:ncol,:, 94)*sol(:ncol,:, 9) ! rate_const*O1D*CF2CLBR - rxt_rates(:ncol,:, 182) = rxt_rates(:ncol,:, 182)*sol(:ncol,:, 94)*sol(:ncol,:, 11) ! rate_const*O1D*CFC11 - rxt_rates(:ncol,:, 183) = rxt_rates(:ncol,:, 183)*sol(:ncol,:, 94)*sol(:ncol,:, 12) ! rate_const*O1D*CFC113 - rxt_rates(:ncol,:, 184) = rxt_rates(:ncol,:, 184)*sol(:ncol,:, 94)*sol(:ncol,:, 13) ! rate_const*O1D*CFC114 - rxt_rates(:ncol,:, 185) = rxt_rates(:ncol,:, 185)*sol(:ncol,:, 94)*sol(:ncol,:, 14) ! rate_const*O1D*CFC115 - rxt_rates(:ncol,:, 186) = rxt_rates(:ncol,:, 186)*sol(:ncol,:, 94)*sol(:ncol,:, 15) ! rate_const*O1D*CFC12 - rxt_rates(:ncol,:, 187) = rxt_rates(:ncol,:, 187)*sol(:ncol,:, 94)*sol(:ncol,:, 49) ! rate_const*O1D*HCL - rxt_rates(:ncol,:, 188) = rxt_rates(:ncol,:, 188)*sol(:ncol,:, 94)*sol(:ncol,:, 49) ! rate_const*O1D*HCL + rxt_rates(:ncol,:, 179) = rxt_rates(:ncol,:, 179)*sol(:ncol,:, 54)*sol(:ncol,:, 99) ! rate_const*HOCL*OH + rxt_rates(:ncol,:, 180) = rxt_rates(:ncol,:, 180)*sol(:ncol,:, 95)*sol(:ncol,:, 8) ! rate_const*O1D*CCL4 + rxt_rates(:ncol,:, 181) = rxt_rates(:ncol,:, 181)*sol(:ncol,:, 95)*sol(:ncol,:, 9) ! rate_const*O1D*CF2CLBR + rxt_rates(:ncol,:, 182) = rxt_rates(:ncol,:, 182)*sol(:ncol,:, 95)*sol(:ncol,:, 11) ! rate_const*O1D*CFC11 + rxt_rates(:ncol,:, 183) = rxt_rates(:ncol,:, 183)*sol(:ncol,:, 95)*sol(:ncol,:, 12) ! rate_const*O1D*CFC113 + rxt_rates(:ncol,:, 184) = rxt_rates(:ncol,:, 184)*sol(:ncol,:, 95)*sol(:ncol,:, 13) ! rate_const*O1D*CFC114 + rxt_rates(:ncol,:, 185) = rxt_rates(:ncol,:, 185)*sol(:ncol,:, 95)*sol(:ncol,:, 14) ! rate_const*O1D*CFC115 + rxt_rates(:ncol,:, 186) = rxt_rates(:ncol,:, 186)*sol(:ncol,:, 95)*sol(:ncol,:, 15) ! rate_const*O1D*CFC12 + rxt_rates(:ncol,:, 187) = rxt_rates(:ncol,:, 187)*sol(:ncol,:, 95)*sol(:ncol,:, 49) ! rate_const*O1D*HCL + rxt_rates(:ncol,:, 188) = rxt_rates(:ncol,:, 188)*sol(:ncol,:, 95)*sol(:ncol,:, 49) ! rate_const*O1D*HCL rxt_rates(:ncol,:, 189) = rxt_rates(:ncol,:, 189)*sol(:ncol,:, 28)*sol(:ncol,:, 28) ! rate_const*M*CLO*CLO rxt_rates(:ncol,:, 190) = rxt_rates(:ncol,:, 190)*sol(:ncol,:, 27) ! rate_const*M*CL2O2 rxt_rates(:ncol,:, 191) = rxt_rates(:ncol,:, 191)*sol(:ncol,:, 3)*sol(:ncol,:, 17) ! rate_const*BR*CH2O - rxt_rates(:ncol,:, 192) = rxt_rates(:ncol,:, 192)*sol(:ncol,:, 3)*sol(:ncol,:, 89) ! rate_const*BR*HO2 + rxt_rates(:ncol,:, 192) = rxt_rates(:ncol,:, 192)*sol(:ncol,:, 3)*sol(:ncol,:, 90) ! rate_const*BR*HO2 rxt_rates(:ncol,:, 193) = rxt_rates(:ncol,:, 193)*sol(:ncol,:, 3)*sol(:ncol,:, 71) ! rate_const*BR*O3 rxt_rates(:ncol,:, 194) = rxt_rates(:ncol,:, 194)*sol(:ncol,:, 5)*sol(:ncol,:, 5) ! rate_const*BRO*BRO rxt_rates(:ncol,:, 195) = rxt_rates(:ncol,:, 195)*sol(:ncol,:, 5)*sol(:ncol,:, 28) ! rate_const*BRO*CLO rxt_rates(:ncol,:, 196) = rxt_rates(:ncol,:, 196)*sol(:ncol,:, 5)*sol(:ncol,:, 28) ! rate_const*BRO*CLO rxt_rates(:ncol,:, 197) = rxt_rates(:ncol,:, 197)*sol(:ncol,:, 5)*sol(:ncol,:, 28) ! rate_const*BRO*CLO - rxt_rates(:ncol,:, 198) = rxt_rates(:ncol,:, 198)*sol(:ncol,:, 5)*sol(:ncol,:, 89) ! rate_const*BRO*HO2 + rxt_rates(:ncol,:, 198) = rxt_rates(:ncol,:, 198)*sol(:ncol,:, 5)*sol(:ncol,:, 90) ! rate_const*BRO*HO2 rxt_rates(:ncol,:, 199) = rxt_rates(:ncol,:, 199)*sol(:ncol,:, 5)*sol(:ncol,:, 61) ! rate_const*BRO*NO rxt_rates(:ncol,:, 200) = rxt_rates(:ncol,:, 200)*sol(:ncol,:, 5)*sol(:ncol,:, 62) ! rate_const*M*BRO*NO2 rxt_rates(:ncol,:, 201) = rxt_rates(:ncol,:, 201)*sol(:ncol,:, 6)*sol(:ncol,:, 69) ! rate_const*BRONO2*O rxt_rates(:ncol,:, 202) = rxt_rates(:ncol,:, 202)*sol(:ncol,:, 5)*sol(:ncol,:, 69) ! rate_const*BRO*O - rxt_rates(:ncol,:, 203) = rxt_rates(:ncol,:, 203)*sol(:ncol,:, 5)*sol(:ncol,:, 98) ! rate_const*BRO*OH + rxt_rates(:ncol,:, 203) = rxt_rates(:ncol,:, 203)*sol(:ncol,:, 5)*sol(:ncol,:, 99) ! rate_const*BRO*OH rxt_rates(:ncol,:, 204) = rxt_rates(:ncol,:, 204)*sol(:ncol,:, 45)*sol(:ncol,:, 69) ! rate_const*HBR*O - rxt_rates(:ncol,:, 205) = rxt_rates(:ncol,:, 205)*sol(:ncol,:, 45)*sol(:ncol,:, 98) ! rate_const*HBR*OH + rxt_rates(:ncol,:, 205) = rxt_rates(:ncol,:, 205)*sol(:ncol,:, 45)*sol(:ncol,:, 99) ! rate_const*HBR*OH rxt_rates(:ncol,:, 206) = rxt_rates(:ncol,:, 206)*sol(:ncol,:, 53)*sol(:ncol,:, 69) ! rate_const*HOBR*O - rxt_rates(:ncol,:, 207) = rxt_rates(:ncol,:, 207)*sol(:ncol,:, 94)*sol(:ncol,:, 10) ! rate_const*O1D*CF3BR - rxt_rates(:ncol,:, 208) = rxt_rates(:ncol,:, 208)*sol(:ncol,:, 94)*sol(:ncol,:, 24) ! rate_const*O1D*CHBR3 - rxt_rates(:ncol,:, 209) = rxt_rates(:ncol,:, 209)*sol(:ncol,:, 94)*sol(:ncol,:, 42) ! rate_const*O1D*H2402 - rxt_rates(:ncol,:, 210) = rxt_rates(:ncol,:, 210)*sol(:ncol,:, 94)*sol(:ncol,:, 45) ! rate_const*O1D*HBR - rxt_rates(:ncol,:, 211) = rxt_rates(:ncol,:, 211)*sol(:ncol,:, 94)*sol(:ncol,:, 45) ! rate_const*O1D*HBR + rxt_rates(:ncol,:, 207) = rxt_rates(:ncol,:, 207)*sol(:ncol,:, 95)*sol(:ncol,:, 10) ! rate_const*O1D*CF3BR + rxt_rates(:ncol,:, 208) = rxt_rates(:ncol,:, 208)*sol(:ncol,:, 95)*sol(:ncol,:, 24) ! rate_const*O1D*CHBR3 + rxt_rates(:ncol,:, 209) = rxt_rates(:ncol,:, 209)*sol(:ncol,:, 95)*sol(:ncol,:, 42) ! rate_const*O1D*H2402 + rxt_rates(:ncol,:, 210) = rxt_rates(:ncol,:, 210)*sol(:ncol,:, 95)*sol(:ncol,:, 45) ! rate_const*O1D*HBR + rxt_rates(:ncol,:, 211) = rxt_rates(:ncol,:, 211)*sol(:ncol,:, 95)*sol(:ncol,:, 45) ! rate_const*O1D*HBR rxt_rates(:ncol,:, 212) = rxt_rates(:ncol,:, 212)*sol(:ncol,:, 39)*sol(:ncol,:, 23) ! rate_const*F*CH4 rxt_rates(:ncol,:, 213) = rxt_rates(:ncol,:, 213)*sol(:ncol,:, 39)*sol(:ncol,:, 41) ! rate_const*F*H2 - rxt_rates(:ncol,:, 214) = rxt_rates(:ncol,:, 214)*sol(:ncol,:, 39)*sol(:ncol,:, 102) ! rate_const*F*H2O + rxt_rates(:ncol,:, 214) = rxt_rates(:ncol,:, 214)*sol(:ncol,:, 39)*sol(:ncol,:, 103) ! rate_const*F*H2O rxt_rates(:ncol,:, 215) = rxt_rates(:ncol,:, 215)*sol(:ncol,:, 39)*sol(:ncol,:, 51) ! rate_const*F*HNO3 - rxt_rates(:ncol,:, 216) = rxt_rates(:ncol,:, 216)*sol(:ncol,:, 94)*sol(:ncol,:, 33) ! rate_const*O1D*COF2 - rxt_rates(:ncol,:, 217) = rxt_rates(:ncol,:, 217)*sol(:ncol,:, 94)*sol(:ncol,:, 34) ! rate_const*O1D*COFCL + rxt_rates(:ncol,:, 216) = rxt_rates(:ncol,:, 216)*sol(:ncol,:, 95)*sol(:ncol,:, 33) ! rate_const*O1D*COF2 + rxt_rates(:ncol,:, 217) = rxt_rates(:ncol,:, 217)*sol(:ncol,:, 95)*sol(:ncol,:, 34) ! rate_const*O1D*COFCL rxt_rates(:ncol,:, 218) = rxt_rates(:ncol,:, 218)*sol(:ncol,:, 16)*sol(:ncol,:, 25) ! rate_const*CH2BR2*CL - rxt_rates(:ncol,:, 219) = rxt_rates(:ncol,:, 219)*sol(:ncol,:, 16)*sol(:ncol,:, 98) ! rate_const*CH2BR2*OH + rxt_rates(:ncol,:, 219) = rxt_rates(:ncol,:, 219)*sol(:ncol,:, 16)*sol(:ncol,:, 99) ! rate_const*CH2BR2*OH rxt_rates(:ncol,:, 220) = rxt_rates(:ncol,:, 220)*sol(:ncol,:, 18)*sol(:ncol,:, 25) ! rate_const*CH3BR*CL - rxt_rates(:ncol,:, 221) = rxt_rates(:ncol,:, 221)*sol(:ncol,:, 18)*sol(:ncol,:, 98) ! rate_const*CH3BR*OH - rxt_rates(:ncol,:, 222) = rxt_rates(:ncol,:, 222)*sol(:ncol,:, 19)*sol(:ncol,:, 98) ! rate_const*CH3CCL3*OH + rxt_rates(:ncol,:, 221) = rxt_rates(:ncol,:, 221)*sol(:ncol,:, 18)*sol(:ncol,:, 99) ! rate_const*CH3BR*OH + rxt_rates(:ncol,:, 222) = rxt_rates(:ncol,:, 222)*sol(:ncol,:, 19)*sol(:ncol,:, 99) ! rate_const*CH3CCL3*OH rxt_rates(:ncol,:, 223) = rxt_rates(:ncol,:, 223)*sol(:ncol,:, 20)*sol(:ncol,:, 25) ! rate_const*CH3CL*CL - rxt_rates(:ncol,:, 224) = rxt_rates(:ncol,:, 224)*sol(:ncol,:, 20)*sol(:ncol,:, 98) ! rate_const*CH3CL*OH + rxt_rates(:ncol,:, 224) = rxt_rates(:ncol,:, 224)*sol(:ncol,:, 20)*sol(:ncol,:, 99) ! rate_const*CH3CL*OH rxt_rates(:ncol,:, 225) = rxt_rates(:ncol,:, 225)*sol(:ncol,:, 24)*sol(:ncol,:, 25) ! rate_const*CHBR3*CL - rxt_rates(:ncol,:, 226) = rxt_rates(:ncol,:, 226)*sol(:ncol,:, 24)*sol(:ncol,:, 98) ! rate_const*CHBR3*OH - rxt_rates(:ncol,:, 227) = rxt_rates(:ncol,:, 227)*sol(:ncol,:, 46)*sol(:ncol,:, 98) ! rate_const*HCFC141B*OH - rxt_rates(:ncol,:, 228) = rxt_rates(:ncol,:, 228)*sol(:ncol,:, 47)*sol(:ncol,:, 98) ! rate_const*HCFC142B*OH - rxt_rates(:ncol,:, 229) = rxt_rates(:ncol,:, 229)*sol(:ncol,:, 48)*sol(:ncol,:, 98) ! rate_const*HCFC22*OH - rxt_rates(:ncol,:, 230) = rxt_rates(:ncol,:, 230)*sol(:ncol,:, 94)*sol(:ncol,:, 16) ! rate_const*O1D*CH2BR2 - rxt_rates(:ncol,:, 231) = rxt_rates(:ncol,:, 231)*sol(:ncol,:, 94)*sol(:ncol,:, 18) ! rate_const*O1D*CH3BR - rxt_rates(:ncol,:, 232) = rxt_rates(:ncol,:, 232)*sol(:ncol,:, 94)*sol(:ncol,:, 46) ! rate_const*O1D*HCFC141B - rxt_rates(:ncol,:, 233) = rxt_rates(:ncol,:, 233)*sol(:ncol,:, 94)*sol(:ncol,:, 47) ! rate_const*O1D*HCFC142B - rxt_rates(:ncol,:, 234) = rxt_rates(:ncol,:, 234)*sol(:ncol,:, 94)*sol(:ncol,:, 48) ! rate_const*O1D*HCFC22 + rxt_rates(:ncol,:, 226) = rxt_rates(:ncol,:, 226)*sol(:ncol,:, 24)*sol(:ncol,:, 99) ! rate_const*CHBR3*OH + rxt_rates(:ncol,:, 227) = rxt_rates(:ncol,:, 227)*sol(:ncol,:, 46)*sol(:ncol,:, 99) ! rate_const*HCFC141B*OH + rxt_rates(:ncol,:, 228) = rxt_rates(:ncol,:, 228)*sol(:ncol,:, 47)*sol(:ncol,:, 99) ! rate_const*HCFC142B*OH + rxt_rates(:ncol,:, 229) = rxt_rates(:ncol,:, 229)*sol(:ncol,:, 48)*sol(:ncol,:, 99) ! rate_const*HCFC22*OH + rxt_rates(:ncol,:, 230) = rxt_rates(:ncol,:, 230)*sol(:ncol,:, 95)*sol(:ncol,:, 16) ! rate_const*O1D*CH2BR2 + rxt_rates(:ncol,:, 231) = rxt_rates(:ncol,:, 231)*sol(:ncol,:, 95)*sol(:ncol,:, 18) ! rate_const*O1D*CH3BR + rxt_rates(:ncol,:, 232) = rxt_rates(:ncol,:, 232)*sol(:ncol,:, 95)*sol(:ncol,:, 46) ! rate_const*O1D*HCFC141B + rxt_rates(:ncol,:, 233) = rxt_rates(:ncol,:, 233)*sol(:ncol,:, 95)*sol(:ncol,:, 47) ! rate_const*O1D*HCFC142B + rxt_rates(:ncol,:, 234) = rxt_rates(:ncol,:, 234)*sol(:ncol,:, 95)*sol(:ncol,:, 48) ! rate_const*O1D*HCFC22 rxt_rates(:ncol,:, 235) = rxt_rates(:ncol,:, 235)*sol(:ncol,:, 17)*sol(:ncol,:, 63) ! rate_const*CH2O*NO3 rxt_rates(:ncol,:, 236) = rxt_rates(:ncol,:, 236)*sol(:ncol,:, 17)*sol(:ncol,:, 69) ! rate_const*CH2O*O - rxt_rates(:ncol,:, 237) = rxt_rates(:ncol,:, 237)*sol(:ncol,:, 17)*sol(:ncol,:, 98) ! rate_const*CH2O*OH - rxt_rates(:ncol,:, 238) = rxt_rates(:ncol,:, 238)*sol(:ncol,:, 21)*sol(:ncol,:, 89) ! rate_const*CH3O2*HO2 + rxt_rates(:ncol,:, 237) = rxt_rates(:ncol,:, 237)*sol(:ncol,:, 17)*sol(:ncol,:, 99) ! rate_const*CH2O*OH + rxt_rates(:ncol,:, 238) = rxt_rates(:ncol,:, 238)*sol(:ncol,:, 21)*sol(:ncol,:, 90) ! rate_const*CH3O2*HO2 rxt_rates(:ncol,:, 239) = rxt_rates(:ncol,:, 239)*sol(:ncol,:, 21)*sol(:ncol,:, 61) ! rate_const*CH3O2*NO - rxt_rates(:ncol,:, 240) = rxt_rates(:ncol,:, 240)*sol(:ncol,:, 22)*sol(:ncol,:, 98) ! rate_const*CH3OOH*OH - rxt_rates(:ncol,:, 241) = rxt_rates(:ncol,:, 241)*sol(:ncol,:, 23)*sol(:ncol,:, 98) ! rate_const*CH4*OH - rxt_rates(:ncol,:, 242) = rxt_rates(:ncol,:, 242)*sol(:ncol,:, 94)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 - rxt_rates(:ncol,:, 243) = rxt_rates(:ncol,:, 243)*sol(:ncol,:, 94)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 - rxt_rates(:ncol,:, 244) = rxt_rates(:ncol,:, 244)*sol(:ncol,:, 94)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 - rxt_rates(:ncol,:, 245) = rxt_rates(:ncol,:, 245)*sol(:ncol,:, 31)*sol(:ncol,:, 98) ! rate_const*CO*OH + rxt_rates(:ncol,:, 240) = rxt_rates(:ncol,:, 240)*sol(:ncol,:, 22)*sol(:ncol,:, 99) ! rate_const*CH3OOH*OH + rxt_rates(:ncol,:, 241) = rxt_rates(:ncol,:, 241)*sol(:ncol,:, 23)*sol(:ncol,:, 99) ! rate_const*CH4*OH + rxt_rates(:ncol,:, 242) = rxt_rates(:ncol,:, 242)*sol(:ncol,:, 95)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 + rxt_rates(:ncol,:, 243) = rxt_rates(:ncol,:, 243)*sol(:ncol,:, 95)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 + rxt_rates(:ncol,:, 244) = rxt_rates(:ncol,:, 244)*sol(:ncol,:, 95)*sol(:ncol,:, 23) ! rate_const*O1D*CH4 + rxt_rates(:ncol,:, 245) = rxt_rates(:ncol,:, 245)*sol(:ncol,:, 31)*sol(:ncol,:, 99) ! rate_const*CO*OH rxt_rates(:ncol,:, 246) = rxt_rates(:ncol,:, 246)*sol(:ncol,:, 35)*sol(:ncol,:, 63) ! rate_const*DMS*NO3 - rxt_rates(:ncol,:, 247) = rxt_rates(:ncol,:, 247)*sol(:ncol,:, 35)*sol(:ncol,:, 98) ! rate_const*DMS*OH - rxt_rates(:ncol,:, 248) = rxt_rates(:ncol,:, 248)*sol(:ncol,:, 73)*sol(:ncol,:, 69) ! rate_const*OCS*O - rxt_rates(:ncol,:, 249) = rxt_rates(:ncol,:, 249)*sol(:ncol,:, 73)*sol(:ncol,:, 98) ! rate_const*OCS*OH - rxt_rates(:ncol,:, 250) = rxt_rates(:ncol,:, 250)*sol(:ncol,:, 76)*sol(:ncol,:, 70) ! rate_const*S*O2 - rxt_rates(:ncol,:, 251) = rxt_rates(:ncol,:, 251)*sol(:ncol,:, 79)*sol(:ncol,:, 98) ! rate_const*M*SO2*OH - rxt_rates(:ncol,:, 252) = rxt_rates(:ncol,:, 252)*sol(:ncol,:, 76)*sol(:ncol,:, 71) ! rate_const*S*O3 - rxt_rates(:ncol,:, 253) = rxt_rates(:ncol,:, 253)*sol(:ncol,:, 78)*sol(:ncol,:, 5) ! rate_const*SO*BRO - rxt_rates(:ncol,:, 254) = rxt_rates(:ncol,:, 254)*sol(:ncol,:, 78)*sol(:ncol,:, 28) ! rate_const*SO*CLO - rxt_rates(:ncol,:, 255) = rxt_rates(:ncol,:, 255)*sol(:ncol,:, 76)*sol(:ncol,:, 98) ! rate_const*S*OH - rxt_rates(:ncol,:, 256) = rxt_rates(:ncol,:, 256)*sol(:ncol,:, 78)*sol(:ncol,:, 62) ! rate_const*SO*NO2 - rxt_rates(:ncol,:, 257) = rxt_rates(:ncol,:, 257)*sol(:ncol,:, 78)*sol(:ncol,:, 70) ! rate_const*SO*O2 - rxt_rates(:ncol,:, 258) = rxt_rates(:ncol,:, 258)*sol(:ncol,:, 78)*sol(:ncol,:, 71) ! rate_const*SO*O3 - rxt_rates(:ncol,:, 259) = rxt_rates(:ncol,:, 259)*sol(:ncol,:, 78)*sol(:ncol,:, 72) ! rate_const*SO*OCLO - rxt_rates(:ncol,:, 260) = rxt_rates(:ncol,:, 260)*sol(:ncol,:, 78)*sol(:ncol,:, 98) ! rate_const*SO*OH - rxt_rates(:ncol,:, 261) = rxt_rates(:ncol,:, 261)*sol(:ncol,:, 35)*sol(:ncol,:, 98) ! rate_const*DMS*OH - rxt_rates(:ncol,:, 262) = rxt_rates(:ncol,:, 262)*sol(:ncol,:, 80)*sol(:ncol,:, 102) ! rate_const*SO3*H2O - rxt_rates(:ncol,:, 263) = rxt_rates(:ncol,:, 263)*sol(:ncol,:, 89) ! rate_const*HO2 + rxt_rates(:ncol,:, 247) = rxt_rates(:ncol,:, 247)*sol(:ncol,:, 35)*sol(:ncol,:, 99) ! rate_const*DMS*OH + rxt_rates(:ncol,:, 248) = rxt_rates(:ncol,:, 248)*sol(:ncol,:, 74)*sol(:ncol,:, 69) ! rate_const*OCS*O + rxt_rates(:ncol,:, 249) = rxt_rates(:ncol,:, 249)*sol(:ncol,:, 74)*sol(:ncol,:, 99) ! rate_const*OCS*OH + rxt_rates(:ncol,:, 250) = rxt_rates(:ncol,:, 250)*sol(:ncol,:, 77)*sol(:ncol,:, 70) ! rate_const*S*O2 + rxt_rates(:ncol,:, 251) = rxt_rates(:ncol,:, 251)*sol(:ncol,:, 80)*sol(:ncol,:, 99) ! rate_const*M*SO2*OH + rxt_rates(:ncol,:, 252) = rxt_rates(:ncol,:, 252)*sol(:ncol,:, 77)*sol(:ncol,:, 71) ! rate_const*S*O3 + rxt_rates(:ncol,:, 253) = rxt_rates(:ncol,:, 253)*sol(:ncol,:, 79)*sol(:ncol,:, 5) ! rate_const*SO*BRO + rxt_rates(:ncol,:, 254) = rxt_rates(:ncol,:, 254)*sol(:ncol,:, 79)*sol(:ncol,:, 28) ! rate_const*SO*CLO + rxt_rates(:ncol,:, 255) = rxt_rates(:ncol,:, 255)*sol(:ncol,:, 77)*sol(:ncol,:, 99) ! rate_const*S*OH + rxt_rates(:ncol,:, 256) = rxt_rates(:ncol,:, 256)*sol(:ncol,:, 79)*sol(:ncol,:, 62) ! rate_const*SO*NO2 + rxt_rates(:ncol,:, 257) = rxt_rates(:ncol,:, 257)*sol(:ncol,:, 79)*sol(:ncol,:, 70) ! rate_const*SO*O2 + rxt_rates(:ncol,:, 258) = rxt_rates(:ncol,:, 258)*sol(:ncol,:, 79)*sol(:ncol,:, 71) ! rate_const*SO*O3 + rxt_rates(:ncol,:, 259) = rxt_rates(:ncol,:, 259)*sol(:ncol,:, 79)*sol(:ncol,:, 73) ! rate_const*SO*OCLO + rxt_rates(:ncol,:, 260) = rxt_rates(:ncol,:, 260)*sol(:ncol,:, 79)*sol(:ncol,:, 99) ! rate_const*SO*OH + rxt_rates(:ncol,:, 261) = rxt_rates(:ncol,:, 261)*sol(:ncol,:, 35)*sol(:ncol,:, 99) ! rate_const*DMS*OH + rxt_rates(:ncol,:, 262) = rxt_rates(:ncol,:, 262)*sol(:ncol,:, 81)*sol(:ncol,:, 103) ! rate_const*SO3*H2O + rxt_rates(:ncol,:, 263) = rxt_rates(:ncol,:, 263)*sol(:ncol,:, 90) ! rate_const*HO2 rxt_rates(:ncol,:, 264) = rxt_rates(:ncol,:, 264)*sol(:ncol,:, 57) ! rate_const*N2O5 rxt_rates(:ncol,:, 265) = rxt_rates(:ncol,:, 265)*sol(:ncol,:, 62) ! rate_const*NO2 rxt_rates(:ncol,:, 266) = rxt_rates(:ncol,:, 266)*sol(:ncol,:, 63) ! rate_const*NO3 @@ -291,33 +291,33 @@ subroutine set_rates( rxt_rates, sol, ncol ) rxt_rates(:ncol,:, 281) = rxt_rates(:ncol,:, 281)*sol(:ncol,:, 57) ! rate_const*N2O5 rxt_rates(:ncol,:, 282) = rxt_rates(:ncol,:, 282)*sol(:ncol,:, 29) ! rate_const*CLONO2 rxt_rates(:ncol,:, 283) = rxt_rates(:ncol,:, 283)*sol(:ncol,:, 29)*sol(:ncol,:, 49) ! rate_const*CLONO2*HCL - rxt_rates(:ncol,:, 284) = rxt_rates(:ncol,:, 284)*sol(:ncol,:, 101) ! rate_const*Op2P - rxt_rates(:ncol,:, 285) = rxt_rates(:ncol,:, 285)*sol(:ncol,:, 100) ! rate_const*Op2D - rxt_rates(:ncol,:, 286) = rxt_rates(:ncol,:, 286)*sol(:ncol,:, 101) ! rate_const*Op2P - rxt_rates(:ncol,:, 287) = rxt_rates(:ncol,:, 287)*sol(:ncol,:, 92)*sol(:ncol,:, 88) ! rate_const*NOp*e - rxt_rates(:ncol,:, 288) = rxt_rates(:ncol,:, 288)*sol(:ncol,:, 97)*sol(:ncol,:, 88) ! rate_const*O2p*e - rxt_rates(:ncol,:, 289) = rxt_rates(:ncol,:, 289)*sol(:ncol,:, 91)*sol(:ncol,:, 88) ! rate_const*N2p*e - rxt_rates(:ncol,:, 290) = rxt_rates(:ncol,:, 290)*sol(:ncol,:, 91)*sol(:ncol,:, 70) ! rate_const*N2p*O2 - rxt_rates(:ncol,:, 291) = rxt_rates(:ncol,:, 291)*sol(:ncol,:, 91)*sol(:ncol,:, 69) ! rate_const*N2p*O - rxt_rates(:ncol,:, 292) = rxt_rates(:ncol,:, 292)*sol(:ncol,:, 91)*sol(:ncol,:, 69) ! rate_const*N2p*O - rxt_rates(:ncol,:, 293) = rxt_rates(:ncol,:, 293)*sol(:ncol,:, 93)*sol(:ncol,:, 69) ! rate_const*Np*O - rxt_rates(:ncol,:, 294) = rxt_rates(:ncol,:, 294)*sol(:ncol,:, 93)*sol(:ncol,:, 70) ! rate_const*Np*O2 - rxt_rates(:ncol,:, 295) = rxt_rates(:ncol,:, 295)*sol(:ncol,:, 93)*sol(:ncol,:, 70) ! rate_const*Np*O2 - rxt_rates(:ncol,:, 296) = rxt_rates(:ncol,:, 296)*sol(:ncol,:, 97)*sol(:ncol,:, 55) ! rate_const*O2p*N - rxt_rates(:ncol,:, 297) = rxt_rates(:ncol,:, 297)*sol(:ncol,:, 97) ! rate_const*N2*O2p - rxt_rates(:ncol,:, 298) = rxt_rates(:ncol,:, 298)*sol(:ncol,:, 97)*sol(:ncol,:, 61) ! rate_const*O2p*NO - rxt_rates(:ncol,:, 299) = rxt_rates(:ncol,:, 299)*sol(:ncol,:, 99)*sol(:ncol,:, 32) ! rate_const*Op*CO2 - rxt_rates(:ncol,:, 300) = rxt_rates(:ncol,:, 300)*sol(:ncol,:, 99) ! rate_const*N2*Op - rxt_rates(:ncol,:, 301) = rxt_rates(:ncol,:, 301)*sol(:ncol,:, 99)*sol(:ncol,:, 90) ! rate_const*Op*N2D - rxt_rates(:ncol,:, 302) = rxt_rates(:ncol,:, 302)*sol(:ncol,:, 99)*sol(:ncol,:, 70) ! rate_const*Op*O2 - rxt_rates(:ncol,:, 303) = rxt_rates(:ncol,:, 303)*sol(:ncol,:, 100)*sol(:ncol,:, 88) ! rate_const*Op2D*e - rxt_rates(:ncol,:, 304) = rxt_rates(:ncol,:, 304)*sol(:ncol,:, 100) ! rate_const*N2*Op2D - rxt_rates(:ncol,:, 305) = rxt_rates(:ncol,:, 305)*sol(:ncol,:, 100)*sol(:ncol,:, 69) ! rate_const*Op2D*O - rxt_rates(:ncol,:, 306) = rxt_rates(:ncol,:, 306)*sol(:ncol,:, 100)*sol(:ncol,:, 70) ! rate_const*Op2D*O2 - rxt_rates(:ncol,:, 307) = rxt_rates(:ncol,:, 307)*sol(:ncol,:, 101)*sol(:ncol,:, 88) ! rate_const*Op2P*e - rxt_rates(:ncol,:, 308) = rxt_rates(:ncol,:, 308)*sol(:ncol,:, 101)*sol(:ncol,:, 88) ! rate_const*Op2P*e - rxt_rates(:ncol,:, 309) = rxt_rates(:ncol,:, 309)*sol(:ncol,:, 101) ! rate_const*N2*Op2P - rxt_rates(:ncol,:, 310) = rxt_rates(:ncol,:, 310)*sol(:ncol,:, 101) ! rate_const*N2*Op2P - rxt_rates(:ncol,:, 311) = rxt_rates(:ncol,:, 311)*sol(:ncol,:, 101)*sol(:ncol,:, 69) ! rate_const*Op2P*O + rxt_rates(:ncol,:, 284) = rxt_rates(:ncol,:, 284)*sol(:ncol,:, 102) ! rate_const*Op2P + rxt_rates(:ncol,:, 285) = rxt_rates(:ncol,:, 285)*sol(:ncol,:, 101) ! rate_const*Op2D + rxt_rates(:ncol,:, 286) = rxt_rates(:ncol,:, 286)*sol(:ncol,:, 102) ! rate_const*Op2P + rxt_rates(:ncol,:, 287) = rxt_rates(:ncol,:, 287)*sol(:ncol,:, 93)*sol(:ncol,:, 89) ! rate_const*NOp*e + rxt_rates(:ncol,:, 288) = rxt_rates(:ncol,:, 288)*sol(:ncol,:, 98)*sol(:ncol,:, 89) ! rate_const*O2p*e + rxt_rates(:ncol,:, 289) = rxt_rates(:ncol,:, 289)*sol(:ncol,:, 92)*sol(:ncol,:, 89) ! rate_const*N2p*e + rxt_rates(:ncol,:, 290) = rxt_rates(:ncol,:, 290)*sol(:ncol,:, 92)*sol(:ncol,:, 70) ! rate_const*N2p*O2 + rxt_rates(:ncol,:, 291) = rxt_rates(:ncol,:, 291)*sol(:ncol,:, 92)*sol(:ncol,:, 69) ! rate_const*N2p*O + rxt_rates(:ncol,:, 292) = rxt_rates(:ncol,:, 292)*sol(:ncol,:, 92)*sol(:ncol,:, 69) ! rate_const*N2p*O + rxt_rates(:ncol,:, 293) = rxt_rates(:ncol,:, 293)*sol(:ncol,:, 94)*sol(:ncol,:, 69) ! rate_const*Np*O + rxt_rates(:ncol,:, 294) = rxt_rates(:ncol,:, 294)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*Np*O2 + rxt_rates(:ncol,:, 295) = rxt_rates(:ncol,:, 295)*sol(:ncol,:, 94)*sol(:ncol,:, 70) ! rate_const*Np*O2 + rxt_rates(:ncol,:, 296) = rxt_rates(:ncol,:, 296)*sol(:ncol,:, 98)*sol(:ncol,:, 55) ! rate_const*O2p*N + rxt_rates(:ncol,:, 297) = rxt_rates(:ncol,:, 297)*sol(:ncol,:, 98) ! rate_const*N2*O2p + rxt_rates(:ncol,:, 298) = rxt_rates(:ncol,:, 298)*sol(:ncol,:, 98)*sol(:ncol,:, 61) ! rate_const*O2p*NO + rxt_rates(:ncol,:, 299) = rxt_rates(:ncol,:, 299)*sol(:ncol,:, 100)*sol(:ncol,:, 32) ! rate_const*Op*CO2 + rxt_rates(:ncol,:, 300) = rxt_rates(:ncol,:, 300)*sol(:ncol,:, 100) ! rate_const*N2*Op + rxt_rates(:ncol,:, 301) = rxt_rates(:ncol,:, 301)*sol(:ncol,:, 100)*sol(:ncol,:, 91) ! rate_const*Op*N2D + rxt_rates(:ncol,:, 302) = rxt_rates(:ncol,:, 302)*sol(:ncol,:, 100)*sol(:ncol,:, 70) ! rate_const*Op*O2 + rxt_rates(:ncol,:, 303) = rxt_rates(:ncol,:, 303)*sol(:ncol,:, 101)*sol(:ncol,:, 89) ! rate_const*Op2D*e + rxt_rates(:ncol,:, 304) = rxt_rates(:ncol,:, 304)*sol(:ncol,:, 101) ! rate_const*N2*Op2D + rxt_rates(:ncol,:, 305) = rxt_rates(:ncol,:, 305)*sol(:ncol,:, 101)*sol(:ncol,:, 69) ! rate_const*Op2D*O + rxt_rates(:ncol,:, 306) = rxt_rates(:ncol,:, 306)*sol(:ncol,:, 101)*sol(:ncol,:, 70) ! rate_const*Op2D*O2 + rxt_rates(:ncol,:, 307) = rxt_rates(:ncol,:, 307)*sol(:ncol,:, 102)*sol(:ncol,:, 89) ! rate_const*Op2P*e + rxt_rates(:ncol,:, 308) = rxt_rates(:ncol,:, 308)*sol(:ncol,:, 102)*sol(:ncol,:, 89) ! rate_const*Op2P*e + rxt_rates(:ncol,:, 309) = rxt_rates(:ncol,:, 309)*sol(:ncol,:, 102) ! rate_const*N2*Op2P + rxt_rates(:ncol,:, 310) = rxt_rates(:ncol,:, 310)*sol(:ncol,:, 102) ! rate_const*N2*Op2P + rxt_rates(:ncol,:, 311) = rxt_rates(:ncol,:, 311)*sol(:ncol,:, 102)*sol(:ncol,:, 69) ! rate_const*Op2P*O end subroutine set_rates end module mo_rxt_rates_conv diff --git a/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 b/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 index 4b884922d5..adb157e52e 100644 --- a/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 +++ b/src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 @@ -31,11 +31,12 @@ subroutine set_sim_dat is_scalar = .false. is_vector = .true. - clscnt(:) = (/ 0, 0, 0, 102, 0 /) + clscnt(:) = (/ 1, 0, 0, 102, 0 /) + cls_rxt_cnt(:,1) = (/ 0, 0, 0, 1 /) cls_rxt_cnt(:,4) = (/ 8, 112, 191, 102 /) - solsym(:102) = (/ 'bc_a1 ','bc_a4 ','BR ','BRCL ','BRO ', & + solsym(:103) = (/ 'bc_a1 ','bc_a4 ','BR ','BRCL ','BRO ', & 'BRONO2 ','BRY ','CCL4 ','CF2CLBR ','CF3BR ', & 'CFC11 ','CFC113 ','CFC114 ','CFC115 ','CFC12 ', & 'CH2BR2 ','CH2O ','CH3BR ','CH3CCL3 ','CH3CL ', & @@ -49,15 +50,15 @@ subroutine set_sim_dat 'N2O ','N2O5 ','ncl_a1 ','ncl_a2 ','ncl_a3 ', & 'NO ','NO2 ','NO3 ','num_a1 ','num_a2 ', & 'num_a3 ','num_a4 ','num_a5 ','O ','O2 ', & - 'O3 ','OCLO ','OCS ','pom_a1 ','pom_a4 ', & - 'S ','SF6 ','SO ','SO2 ','SO3 ', & - 'so4_a1 ','so4_a2 ','so4_a3 ','so4_a5 ','soa_a1 ', & - 'soa_a2 ','SOAG ','e ','HO2 ','N2D ', & - 'N2p ','NOp ','Np ','O1D ','O2_1D ', & - 'O2_1S ','O2p ','OH ','Op ','Op2D ', & - 'Op2P ','H2O ' /) + 'O3 ','O3S ','OCLO ','OCS ','pom_a1 ', & + 'pom_a4 ','S ','SF6 ','SO ','SO2 ', & + 'SO3 ','so4_a1 ','so4_a2 ','so4_a3 ','so4_a5 ', & + 'soa_a1 ','soa_a2 ','SOAG ','e ','HO2 ', & + 'N2D ','N2p ','NOp ','Np ','O1D ', & + 'O2_1D ','O2_1S ','O2p ','OH ','Op ', & + 'Op2D ','Op2P ','H2O ' /) - adv_mass(:102) = (/ 12.011000_r8, 12.011000_r8, 79.904000_r8, 115.356700_r8, 95.903400_r8, & + adv_mass(:103) = (/ 12.011000_r8, 12.011000_r8, 79.904000_r8, 115.356700_r8, 95.903400_r8, & 141.908940_r8, 99.716850_r8, 153.821800_r8, 165.364506_r8, 148.910210_r8, & 137.367503_r8, 187.375310_r8, 170.921013_r8, 154.466716_r8, 120.913206_r8, & 173.833800_r8, 30.025200_r8, 94.937200_r8, 133.402300_r8, 50.485900_r8, & @@ -71,15 +72,15 @@ subroutine set_sim_dat 44.012880_r8, 108.010480_r8, 58.442468_r8, 58.442468_r8, 58.442468_r8, & 30.006140_r8, 46.005540_r8, 62.004940_r8, 1.007400_r8, 1.007400_r8, & 1.007400_r8, 1.007400_r8, 1.007400_r8, 15.999400_r8, 31.998800_r8, & - 47.998200_r8, 67.451500_r8, 60.076400_r8, 12.011000_r8, 12.011000_r8, & - 32.066000_r8, 146.056419_r8, 48.065400_r8, 64.064800_r8, 80.064200_r8, & - 115.107340_r8, 115.107340_r8, 115.107340_r8, 115.107340_r8, 12.011000_r8, & - 12.011000_r8, 12.011000_r8, 0.548567E-03_r8, 33.006200_r8, 14.006740_r8, & - 28.013480_r8, 30.006140_r8, 14.006740_r8, 15.999400_r8, 31.998800_r8, & - 31.998800_r8, 31.998800_r8, 17.006800_r8, 15.999400_r8, 15.999400_r8, & - 15.999400_r8, 18.014200_r8 /) + 47.998200_r8, 47.998200_r8, 67.451500_r8, 60.076400_r8, 12.011000_r8, & + 12.011000_r8, 32.066000_r8, 146.056419_r8, 48.065400_r8, 64.064800_r8, & + 80.064200_r8, 115.107340_r8, 115.107340_r8, 115.107340_r8, 115.107340_r8, & + 12.011000_r8, 12.011000_r8, 12.011000_r8, 0.548567E-03_r8, 33.006200_r8, & + 14.006740_r8, 28.013480_r8, 30.006140_r8, 14.006740_r8, 15.999400_r8, & + 31.998800_r8, 31.998800_r8, 31.998800_r8, 17.006800_r8, 15.999400_r8, & + 15.999400_r8, 15.999400_r8, 18.014200_r8 /) - crb_mass(:102) = (/ 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & + crb_mass(:103) = (/ 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 12.011000_r8, 12.011000_r8, 12.011000_r8, & 12.011000_r8, 24.022000_r8, 24.022000_r8, 24.022000_r8, 12.011000_r8, & 12.011000_r8, 12.011000_r8, 12.011000_r8, 24.022000_r8, 12.011000_r8, & @@ -93,16 +94,17 @@ subroutine set_sim_dat 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & - 0.000000_r8, 0.000000_r8, 12.011000_r8, 12.011000_r8, 12.011000_r8, & + 0.000000_r8, 0.000000_r8, 0.000000_r8, 12.011000_r8, 12.011000_r8, & + 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & - 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 12.011000_r8, & - 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & + 12.011000_r8, 12.011000_r8, 12.011000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, 0.000000_r8, & - 0.000000_r8, 0.000000_r8 /) + 0.000000_r8, 0.000000_r8, 0.000000_r8 /) fix_mass(: 2) = (/ 0.00000000_r8, 28.0134800_r8 /) + clsmap(: 1,1) = (/ 72 /) clsmap(:102,4) = (/ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, & 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, & 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, & @@ -110,10 +112,10 @@ subroutine set_sim_dat 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, & 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, & 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, & - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, & - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, & - 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, & - 101, 102 /) + 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, & + 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, & + 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, & + 102, 103 /) permute(:102,4) = (/ 1, 2, 97, 45, 101, 62, 3, 27, 34, 35, & 29, 36, 30, 37, 31, 58, 86, 63, 32, 54, & diff --git a/src/physics/cam/gw_drag.F90 b/src/physics/cam/gw_drag.F90 index 9788ef79ab..0f48e661af 100644 --- a/src/physics/cam/gw_drag.F90 +++ b/src/physics/cam/gw_drag.F90 @@ -72,7 +72,7 @@ module gw_drag ! Factor for SH orographic waves. real(r8) :: gw_oro_south_fac = 1._r8 - + ! Frontogenesis function critical threshold. real(r8) :: frontgfc = unset_r8 @@ -136,9 +136,6 @@ module gw_drag type(BeresSourceDesc) :: beres_dp_desc type(BeresSourceDesc) :: beres_sh_desc - ! Width of gaussian used to create frontogenesis tau profile [m/s]. - real(r8), parameter :: front_gaussian_width = 30._r8 - ! Frontogenesis wave settings. type(CMSourceDesc) :: cm_desc type(CMSourceDesc) :: cm_igw_desc @@ -183,12 +180,15 @@ module gw_drag character(len=1), parameter :: beres_dp_pf = "B" character(len=1), parameter :: beres_sh_pf = "S" - ! namelist + ! namelist logical :: history_amwg ! output the variables used by the AMWG diag package logical :: gw_lndscl_sgh = .true. ! scale SGH by land frac real(r8) :: gw_prndl = 0.25_r8 real(r8) :: gw_qbo_hdepth_scaling = 1._r8 ! heating depth scaling factor + ! Width of gaussian used to create frontogenesis tau profile [m/s]. + real(r8) :: front_gaussian_width = -huge(1._r8) + logical :: gw_top_taper=.false. real(r8), pointer :: vramp(:)=>null() @@ -232,7 +232,7 @@ subroutine gw_drag_readnl(nlfile) rdg_gamma_cd_llb, trpd_leewv_rdg_gamma, bnd_rdggm, & gw_oro_south_fac, gw_limit_tau_without_eff, & gw_lndscl_sgh, gw_prndl, gw_apply_tndmax, gw_qbo_hdepth_scaling, & - gw_top_taper + gw_top_taper, front_gaussian_width !---------------------------------------------------------------------- if (use_simple_phys) return @@ -333,6 +333,8 @@ subroutine gw_drag_readnl(nlfile) call mpi_bcast(gw_drag_file_sh, len(gw_drag_file_sh), mpi_character, mstrid, mpicom, ierr) if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: gw_drag_file_sh") + call mpi_bcast(front_gaussian_width, 1, mpi_real8, mstrid, mpicom, ierr) + if (ierr /= 0) call endrun(sub//": FATAL: mpi_bcast: front_gaussian_width") ! Check if fcrit2 was set. call shr_assert(fcrit2 /= unset_r8, & @@ -379,7 +381,7 @@ subroutine gw_init() ! temporary for restart with ridge scheme use cam_initfiles, only: bnd_topo - + use cam_pio_utils, only: cam_pio_openfile use cam_grid_support, only: cam_grid_check, cam_grid_id use cam_grid_support, only: cam_grid_get_dim_names @@ -539,7 +541,7 @@ subroutine gw_init() ! Initialize subordinate modules. call gw_common_init(pver,& - tau_0_ubc, ktop, gravit, rair, alpha, gw_prndl, & + tau_0_ubc, ktop, gravit, rair, alpha, gw_prndl, & gw_qbo_hdepth_scaling, errstring ) call shr_assert(trim(errstring) == "", "gw_common_init: "//errstring// & errMsg(__FILE__, __LINE__)) @@ -551,7 +553,7 @@ subroutine gw_init() &but effgw_oro was not set.") end if end if - + if (use_gw_oro .or. use_gw_rdg_beta .or. use_gw_rdg_gamma) then sgh_idx = pbuf_get_index('SGH') @@ -611,7 +613,7 @@ subroutine gw_init() ! Try to open topo file here. This workaround will not be needed ! once the refactored initialization sequence is on trunk. - + allocate(fh_topo) ! Error exit is from getfil if file not found. call getfil(bnd_topo, bnd_topo_loc) @@ -627,12 +629,12 @@ subroutine gw_init() rdg_mxdis(pcols,prdg,begchunk:endchunk), & rdg_anixy(pcols,prdg,begchunk:endchunk), & rdg_angll(pcols,prdg,begchunk:endchunk) ) - + call infld('GBXAR', fh_topo, dim1name, dim2name, 1, pcols, & begchunk, endchunk, rdg_gbxar, found, gridname='physgrid') if (.not. found) call endrun(sub//': ERROR: GBXAR not found on topo file') rdg_gbxar = rdg_gbxar * (rearth/1000._r8)*(rearth/1000._r8) ! transform to km^2 - + call infld('HWDTH', fh_topo, dim1name, 'nrdg', dim2name, 1, pcols, & 1, prdg, begchunk, endchunk, rdg_hwdth, found, gridname='physgrid') if (.not. found) call endrun(sub//': ERROR: HWDTH not found on topo file') @@ -707,7 +709,7 @@ subroutine gw_init() 'interface geopotential heights in GW code ' ) call addfld('ZMGW', (/ 'lev' /) , 'A' ,'m' , & 'midlayer geopotential heights in GW code ' ) - + call addfld('TAUM1_DIAG' , (/ 'ilev' /) , 'I' ,'N/m2' , & 'Ridge based momentum flux profile') call addfld('TAU1RDGBETAM' , (/ 'ilev' /) , 'I' ,'N/m2' , & @@ -749,7 +751,7 @@ subroutine gw_init() if (effgw_rdg_gamma == unset_r8) then call endrun(sub//": ERROR: Anisotropic OGW enabled, but effgw_rdg_gamma was not set.") end if - + call getfil(bnd_rdggm, bnd_rdggm_loc, iflag=1, lexist=found) if (found) then call cam_pio_openfile(fh_rdggm, bnd_rdggm_loc, PIO_NOWRITE) @@ -793,7 +795,7 @@ subroutine gw_init() call infld('ANGLL', fh_rdggm, dim1name, 'nrdg', dim2name, 1, pcols, & 1, prdg, begchunk, endchunk, rdg_angllg, found, gridname='physgrid') if (.not. found) call endrun(sub//': ERROR: ANGLL not found on bnd_rdggm') - + call pio_closefile(fh_rdggm) call addfld ('TAU1RDGGAMMAM' , (/ 'ilev' /) , 'I' ,'N/m2' , & @@ -1365,7 +1367,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) real(r8), parameter :: degree2radian = pi/180._r8 real(r8), parameter :: al0 = 82.5_r8 * degree2radian real(r8), parameter :: dlat0 = 5.0_r8 * degree2radian - + ! effective gw diffusivity at interfaces needed for output real(r8) :: egwdffi(state%ncol,pver+1) ! sum from the two types of spectral GW @@ -1451,7 +1453,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) ! Totals that accumulate over different sources. egwdffi_tot = 0._r8 flx_heat = 0._r8 - + if (use_gw_convect_dp) then !------------------------------------------------------------------ ! Convective gravity waves (Beres scheme, deep). @@ -1802,7 +1804,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) ! Efficiency of gravity wave momentum transfer. ! Take into account that wave sources are only over land. call pbuf_get_field(pbuf, sgh_idx, sgh) - + if (gw_lndscl_sgh) then where (cam_in%landfrac(:ncol) >= epsilon(1._r8)) effgw = effgw_oro * cam_in%landfrac(:ncol) @@ -1969,7 +1971,7 @@ subroutine gw_tend(state, pbuf, dt, ptend, cam_in, flx_heat) ! Write totals to history file. call outfld('EKGW', egwdffi_tot , ncol, lchnk) call outfld('TTGW', ptend%s/cpairv(:,:,lchnk), pcols, lchnk) - + call outfld('UTGW_TOTAL', ptend%u, pcols, lchnk) call outfld('VTGW_TOTAL', ptend%v, pcols, lchnk) @@ -2143,7 +2145,7 @@ subroutine gw_rdg_calc( & ! initialize accumulated momentum fluxes and tendencies taurx = 0._r8 - taury = 0._r8 + taury = 0._r8 ttrdg = 0._r8 utrdg = 0._r8 vtrdg = 0._r8 @@ -2151,36 +2153,36 @@ subroutine gw_rdg_calc( & do nn = 1, n_rdg kwvrdg = 0.001_r8 / ( hwdth(:,nn) + 0.001_r8 ) ! this cant be done every time step !!! - isoflag = 0 + isoflag = 0 effgw = effgw_rdg * ( hwdth(1:ncol,nn)* clngt(1:ncol,nn) ) / gbxar(1:ncol) effgw = min( effgw_rdg_max , effgw ) call gw_rdg_src(ncol, band_oro, p, & u, v, t, mxdis(:,nn), angll(:,nn), anixy(:,nn), kwvrdg, isoflag, zi, nm, & - src_level, tend_level, bwv_level, tlb_level, tau, ubm, ubi, xv, yv, & + src_level, tend_level, bwv_level, tlb_level, tau, ubm, ubi, xv, yv, & ubmsrc, usrc, vsrc, nsrc, rsrc, m2src, tlb, bwv, Fr1, Fr2, Frx, c) call gw_rdg_belowpeak(ncol, band_oro, rdg_cd_llb, & - t, mxdis(:,nn), anixy(:,nn), kwvrdg, & + t, mxdis(:,nn), anixy(:,nn), kwvrdg, & zi, nm, ni, rhoi, & - src_level, tau, & - ubmsrc, nsrc, rsrc, m2src, tlb, bwv, Fr1, Fr2, Frx, & + src_level, tau, & + ubmsrc, nsrc, rsrc, m2src, tlb, bwv, Fr1, Fr2, Frx, & tauoro, taudsw, hdspwv, hdspdw) call gw_rdg_break_trap(ncol, band_oro, & - zi, nm, ni, ubm, ubi, rhoi, kwvrdg , bwv, tlb, wbr, & - src_level, tlb_level, hdspwv, hdspdw, mxdis(:,nn), & - tauoro, taudsw, tau, & + zi, nm, ni, ubm, ubi, rhoi, kwvrdg , bwv, tlb, wbr, & + src_level, tlb_level, hdspwv, hdspdw, mxdis(:,nn), & + tauoro, taudsw, tau, & ldo_trapped_waves=trpd_leewv) - + call gw_drag_prof(ncol, band_oro, p, src_level, tend_level, dt, & t, vramp, & piln, rhoi, nm, ni, ubm, ubi, xv, yv, & effgw, c, kvtt, q, dse, tau, utgw, vtgw, & ttgw, qtgw, egwdffi, gwut, dttdf, dttke, & - kwvrdg=kwvrdg, & + kwvrdg=kwvrdg, & satfac_in = 1._r8, lapply_vdiff=gw_rdg_do_vdiff , tau_diag=tau_diag ) ! Add the tendencies from each ridge to the totals. From 1a0d49ca16ee067c8ec8750f382bddf6b5cb1678 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 22 Jun 2023 15:39:49 -0600 Subject: [PATCH 11/61] corrections for waccmx modified: bld/namelist_files/namelist_defaults_cam.xml modified: bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml modified: bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml modified: bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml --- bld/namelist_files/namelist_defaults_cam.xml | 6 ++ .../use_cases/sd_waccmx_ma_cam6.xml | 59 +++++++++---------- .../use_cases/waccmx_ma_2000_cam6.xml | 5 -- .../use_cases/waccmx_ma_hist_cam6.xml | 5 -- 4 files changed, 33 insertions(+), 42 deletions(-) diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index 5cfed4a1e2..1cc519172d 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -3141,6 +3141,12 @@ 'O3S_Loss = 2.0*O_O3 + O1D_H2O + HO2_O + HO2_O3 + OH_O + OH_O3 + H_O3 + 2.0*NO2_O + 2.0*jno3_b + 2.0*CLO_O + 2.0*jcl2o2 + ', '2.0*CLO_CLOa + 2.0*CLO_CLOb + 2.0*BRO_CLOb + 2.0*BRO_CLOc + 2.0*BRO_BRO + 2.0*BRO_O + CLO_HO2 + BRO_HO2 + S_O3' + + 'O3S_Loss = 2.0*O_O3 + O1D_H2O + HO2_O + HO2_O3 + OH_O + OH_O3 + H_O3 + 2.0*NO2_O + 2.0*jno3_b + 2.0*CLO_O + 2.0*jcl2o2 + ', + '2.0*CLO_CLOa + 2.0*CLO_CLOb + 2.0*BRO_CLOb + 2.0*BRO_CLOc + 2.0*BRO_BRO + 2.0*BRO_O + CLO_HO2 + BRO_HO2 + S_O3', + 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + ', + 'jeuv_14 + jeuv_15 + jeuv_16 + jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', + 'O3_Prod = NO_HO2 + CH3O2_NO + HOCH2OO_NO + C2H5O2_NO + CH3CO3_NO + EO2_NO + C3H7O2_NO + PO2_NO + ', 'RO2_NO + ENEO2_NO + MACRO2_NOa + jhonitr + ', diff --git a/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml b/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml index c67531174b..6b56c46b17 100644 --- a/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml +++ b/bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml @@ -62,11 +62,11 @@ 0, -1, -24, -24, -120, -24, -120, -240 1, 24, 7, 7, 10, 365, 73, 30 - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', - 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2' 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', 'Op2P', 'Op2D', 'Op', - 'Np', 'N2p', 'O2p', 'NOp', 'QJOULE', 'SIGMAHAL', 'SIGMAPED', 'SolIonRate_Tot', 'QRS_TOT', 'QO3', 'QCO2', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2' 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', 'Op2P', 'Op2D', 'Op', + 'Np', 'N2p', 'O2p', 'NOp', 'QJOULE', 'SIGMAHAL', 'SIGMAPED', 'SolIonRate_Tot', 'QRS_TOT', 'QO3', 'QCO2', 'QNO', 'QO3P', 'QHC2S', 'QJOULE', 'EKGW', 'TTGW', 'UTGW_TOTAL', 'T_24_COS', 'T_24_SIN', 'T_12_COS', 'T_12_SIN', 'T_08_COS', 'T_08_SIN', 'U_24_COS', 'U_24_SIN', 'U_12_COS', 'U_12_SIN', 'U_08_COS', 'U_08_SIN', @@ -75,49 +75,49 @@ 'ALATM', 'ALONM', 'AOA1', 'AOA2', 'BR', 'BRCL', 'BRO', 'BRONO2', 'CCL4', 'CF2CLBR', 'CF3BR', 'CFC11', 'CFC113', 'CFC12', 'CH2O', 'CH3BR', 'CH3CCL3', 'CH3CL', 'CH3O2', 'CH3OOH', 'CH4', 'CL', 'CL2', 'CL2O2', 'CLDHGH', 'CLDLOW', 'CLDMED', 'CLDTOT', 'CLO', 'CLONO2', 'CLOUD', 'CO', - 'DTCOND', 'DTV', 'DUV', 'DVV', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC','FSDS', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', - 'H2', 'H2O', 'H2O2', 'HBR', 'HCFC22', 'HCL', 'HNO3', 'HO2', 'HO2NO2', 'HOBR', 'HOCL', 'HORZ', - 'LANDFRAC', 'LHFLX', 'N2O', 'N2O5', 'NO2', 'NO3', 'O3', 'OCLO', 'OCNFRAC', 'OH', 'PHIS', + 'DTCOND', 'DTV', 'DUV', 'DVV', 'FLNS', 'FLNSC', 'FLNT', 'FLNTC','FSDS', 'FSNS', 'FSNSC', 'FSNT', 'FSNTC', + 'H2', 'H2O', 'H2O2', 'HBR', 'HCFC22', 'HCL', 'HNO3', 'HO2', 'HO2NO2', 'HOBR', 'HOCL', 'HORZ', + 'LANDFRAC', 'LHFLX', 'N2O', 'N2O5', 'NO2', 'NO3', 'O3', 'OCLO', 'OCNFRAC', 'OH', 'PHIS', 'PRECC', 'PRECL', 'Q', 'QFLX', 'QRL', 'QRS', 'RELHUM', 'SHFLX', 'SOLIN', 'SWCF', 'QCP', 'QTHERMAL', 'QRL_TOT', 'PSL', 'HNO3_STS', 'HNO3_NAT', 'HNO3_GAS', 'NO_Aircraft', 'NO_Lightning', 'QRS_AUR', 'QRS_CO2NIR', 'QRS_EUV', 'SAD_ICE', 'SAD_LNAT', 'SAD_SULFC', 'TREFHT', - 'VERT', 'VTGWORO', 'VTGWSPEC', 'O2_1S', 'O2_1D', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', - 'TCLY', 'TOTH', 'UIONTEND', 'VIONTEND', 'DTCORE', 'CLDLIQ', 'CLDICE', 'CONCLD', 'FRONTGF:I', - 'BTAUE', 'BTAUW', 'BTAUN', 'BTAUS', 'TAUE', 'TAUW', 'TAUN', 'TAUS', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', + 'VERT', 'VTGWORO', 'VTGWSPEC', 'O2_1S', 'O2_1D', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', + 'TCLY', 'TOTH', 'UIONTEND', 'VIONTEND', 'DTCORE', 'CLDLIQ', 'CLDICE', 'CONCLD', 'FRONTGF:I', + 'BTAUE', 'BTAUW', 'BTAUN', 'BTAUS', 'TAUE', 'TAUW', 'TAUN', 'TAUS', 'TAUGWX', 'TAUGWY', 'TAUX', 'TAUY', 'SNOWHLND', 'SNOWHICE', 'ICEFRAC', 'FSDSC', 'SFNO', 'SFCO', 'SFCH2O', 'CFC11STAR', 'TROPP_FD', 'KVH', 'KVM', 'KVT', 'Qbkgndtot', 'Z3GM', 'OpDens', 'EDens' - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H' - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', - 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'O1D', 'Op2P', 'Op2D', 'Op', 'Np', 'N2p', 'O2p', 'NOp', 'QJOULE', 'SIGMAHAL', 'SIGMAPED', 'SolIonRate_Tot', 'Z3GM', 'OpDens', 'EDens' - - - 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', - 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'QRS_TOT', - 'QO3', 'QCO2', 'QNO', 'QO3P', 'QHC2S', 'QJOULE', 'EKGW', 'TTGW', 'UTGW_TOTAL', + + + 'Z3', 'T', 'TIon', 'TElec', 'e', 'U', 'V', 'OMEGA', 'UI', 'VI', 'WI', 'ElecColDens', 'PHIM2D', 'PS', + 'PED_CONDUCTANCE', 'HALL_CONDUCTANCE', 'ED1', 'ED2', 'O', 'O2', 'H', 'NO', 'CO2', 'N', 'QRS_TOT', + 'QO3', 'QCO2', 'QNO', 'QO3P', 'QHC2S', 'QJOULE', 'EKGW', 'TTGW', 'UTGW_TOTAL', 'SolIonRate_Tot', 'Z3GM', 'OpDens', 'EDens' - - + + 'T_24_COS', 'T_24_SIN', 'T_12_COS', 'T_12_SIN', 'T_08_COS', 'T_08_SIN', 'U_24_COS', 'U_24_SIN', 'U_12_COS', 'U_12_SIN', 'U_08_COS', 'U_08_SIN', 'V_24_COS', 'V_24_SIN', 'V_12_COS', 'V_12_SIN', 'V_08_COS', 'V_08_SIN', 'OMEGA_24_COS', 'OMEGA_24_SIN', 'OMEGA_12_COS', 'OMEGA_12_SIN', 'OMEGA_08_COS', 'OMEGA_08_SIN' - + 'MSKtem','PS','PSL','VTHzm','UVzm','UWzm','Uzm','Vzm','THzm','Wzm','PHIS' - + 'PS', 'PSL', 'U', 'V', 'T', 'Z3', 'PHIS', 'FRONTGF:I', 'OMEGA', 'O3', 'REFF_AERO', 'SAD_AERO', 'so4_a1', 'so4_a2', 'so4_a3', 'AODVISstdn', 'NITROP_PD', @@ -135,9 +135,4 @@ .false. .false. - - 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + jeuv_14 + jeuv_15 + jeuv_16 +', - 'jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', - - diff --git a/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml b/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml index cb86bc0f9c..7052ac83bb 100644 --- a/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml @@ -101,9 +101,4 @@ 42 - - 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + jeuv_14 + jeuv_15 + jeuv_16 +', - 'jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', - - diff --git a/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml b/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml index 7075565589..c928b43f28 100644 --- a/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml +++ b/bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml @@ -99,9 +99,4 @@ 42 - - 'SolIonRate_Tot = jeuv_1 + jeuv_2 + jeuv_3 + jeuv_4 + jeuv_5 + jeuv_6 + jeuv_7 + jeuv_8 + jeuv_9 + jeuv_10 + jeuv_11 + jeuv_14 + jeuv_15 + jeuv_16 +', - 'jeuv_17 + jeuv_18 + jeuv_19 + jeuv_20 + jeuv_21 + jeuv_22 + jeuv_23', - - From bd71dc4f35ddb9c95344b804775e67cc62d5eed4 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 26 Jun 2023 10:57:10 -0600 Subject: [PATCH 12/61] removed references to carma aerosol objects modified: src/physics/cam/aerosol_optics_cam.F90 --- src/physics/cam/aerosol_optics_cam.F90 | 38 ++++++++++---------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index b8fb45846e..a1e6bffc59 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -43,17 +43,19 @@ module aerosol_optics_cam class(aerosol_state), pointer :: obj => null() end type aero_state_t - type(aero_props_t), allocatable :: aero_props(:) + type(aero_props_t), allocatable :: aero_props(:) ! array of aerosol properties objects to allow for + ! multiple aerosol representations in the same sim + ! such as MAM and CARMA ! refractive index for water read in read_water_refindex complex(r8) :: crefwsw(nswbands) = -huge(1._r8) ! complex refractive index for water visible complex(r8) :: crefwlw(nlwbands) = -huge(1._r8) ! complex refractive index for water infrared character(len=cl) :: water_refindex_file = 'NONE' ! full pathname for water refractive index dataset - logical :: carma_active = .false. logical :: modal_active = .false. integer :: num_aero_models = 0 - integer :: lw10um_indx = -1 + integer :: lw10um_indx = -1 ! wavelength index corresponding to 10 microns + real(r8), parameter :: lw10um = 10._r8 ! microns character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) @@ -121,7 +123,7 @@ subroutine aerosol_optics_cam_init use ioFileMod, only: getfil character(len=*), parameter :: prefix = 'aerosol_optics_cam_sw: ' - integer :: nmodes=0, nbins=0, iaermod, istat, ilist, i + integer :: nmodes=0, iaermod, istat, ilist, i logical :: call_list(0:n_diag) real(r8) :: lwavlen_lo(nlwbands), lwavlen_hi(nlwbands) @@ -140,17 +142,12 @@ subroutine aerosol_optics_cam_init history_dust_out = history_dust ) num_aero_models = 0 - nbins = 0 call rad_cnst_get_info(0, nmodes=nmodes) modal_active = nmodes>0 - carma_active = nbins>0 if (modal_active) then - num_aero_models = num_aero_models+1 - end if - if (carma_active) then - num_aero_models = num_aero_models+1 + num_aero_models = num_aero_models+1 ! count aerosol models end if if (num_aero_models>0) then @@ -165,9 +162,6 @@ subroutine aerosol_optics_cam_init if (modal_active) then iaermod = iaermod+1 aero_props(iaermod)%obj => modal_aerosol_properties() - else if (carma_active) then - iaermod = iaermod+1 - !aero_props(iaermod)%obj => carma_aerosol_properties() end if if (water_refindex_file/='NONE') then @@ -177,8 +171,8 @@ subroutine aerosol_optics_cam_init call get_lw_spectral_boundaries(lwavlen_lo, lwavlen_hi, units='um') do i = 1,nlwbands - if ((lwavlen_lo(i)<=10._r8) .and. (lwavlen_hi(i)>=10._r8)) then - lw10um_indx = i + if ((lwavlen_lo(i)<=lw10um) .and. (lwavlen_hi(i)>=lw10um)) then + lw10um_indx = i ! index corresponding to 10 microns end if end do call rad_cnst_get_call_list(call_list) @@ -544,7 +538,9 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, integer :: icol, istat integer :: lchnk, ncol - type(aero_state_t), allocatable :: aero_state(:) + type(aero_state_t), allocatable :: aero_state(:) ! array of aerosol state objects to allow for + ! multiple aerosol representations in the same sim + ! such as MAM and CARMA class(aerosol_optics), pointer :: aero_optics @@ -692,9 +688,6 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, if (modal_active) then iaermod = iaermod+1 aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) - else if (carma_active) then - iaermod = iaermod+1 - !aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) end if allocate(pext(ncol), stat=istat) @@ -1136,7 +1129,9 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) integer :: iwav, ilev integer :: ncol, icol, istat - type(aero_state_t), allocatable :: aero_state(:) + type(aero_state_t), allocatable :: aero_state(:) ! array of aerosol state objects to allow for + ! multiple aerosol representations in the same sim + ! such as MAM and CARMA class(aerosol_optics), pointer :: aero_optics class(aerosol_state), pointer :: aerostate @@ -1166,9 +1161,6 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) if (modal_active) then iaermod = iaermod+1 aero_state(iaermod)%obj => modal_aerosol_state( state, pbuf ) - else if (carma_active) then - iaermod = iaermod+1 - !aero_state(iaermod)%obj => carma_aerosol_state( state, pbuf ) end if ncol = state%ncol From 6d588186ea2a3b89f44b9d768d9b4a7d5bbc0da2 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 26 Jun 2023 11:36:27 -0600 Subject: [PATCH 13/61] misc clean up modified: src/physics/cam/aerosol_optics_cam.F90 --- src/physics/cam/aerosol_optics_cam.F90 | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index a1e6bffc59..9ab40155f6 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -10,7 +10,6 @@ module aerosol_optics_cam use physconst, only: rga, rair use cam_abortutils, only: endrun use spmd_utils, only : masterproc - use wv_saturation, only: qsat use rad_constituents, only: n_diag, rad_cnst_get_call_list use cam_history, only: addfld, add_default, outfld, horiz_only, fieldname_len use cam_history_support, only: fillvalue @@ -553,10 +552,6 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, real(r8), allocatable :: palb(:) ! parameterized single scattering albedo real(r8), allocatable :: pasm(:) ! parameterized asymmetry factor - real(r8) :: relh(pcols,pver) - real(r8) :: sate(pcols,pver) ! saturation vapor pressure - real(r8) :: satq(pcols,pver) ! saturation specific humidity - character(len=ot_length) :: opticstype integer :: iaermod @@ -615,7 +610,7 @@ subroutine aerosol_optics_cam_sw(list_idx, state, pbuf, nnite, idxnite, tauxar, class(aerosol_state), pointer :: aerostate class(aerosol_properties), pointer :: aeroprops - integer :: ispec + real(r8) :: specdens character(len=32) :: spectype ! species type real(r8), pointer :: specmmr(:,:) @@ -1139,10 +1134,6 @@ subroutine aerosol_optics_cam_lw(list_idx, state, pbuf, tauxar) real(r8), allocatable :: pabs(:) - real(r8) :: relh(pcols,pver) - real(r8) :: sate(pcols,pver) ! saturation vapor pressure - real(r8) :: satq(pcols,pver) ! saturation specific humidity - character(len=32) :: opticstype integer :: iaermod From b2b5433dd57508a2d3b589a18f531122af19d041 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 6 Jul 2023 17:31:38 -0600 Subject: [PATCH 14/61] code review changes modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 modified: src/physics/cam/aerosol_optics_cam.F90 --- .../aerosol/refractive_aerosol_optics_mod.F90 | 9 +-- src/physics/cam/aerosol_optics_cam.F90 | 62 +++++++++++++++---- 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index a2ce2debeb..d95349b800 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -54,10 +54,11 @@ module refractive_aerosol_optics_mod ! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties ! in terms of refractive index and wet radius - integer, parameter :: ncoef=5, prefr=7, prefi=10 !??? get from aerosol properties ???? + integer, parameter :: ncoef=5, prefr=7, prefi=10 - real(r8), parameter :: xrmin=log(0.01e-6_r8) - real(r8), parameter :: xrmax=log(25.e-6_r8) + ! radius limits (m) + real(r8), parameter :: xrmin=log(0.01e-6_r8) ! min log(aerosol surface mode radius) + real(r8), parameter :: xrmax=log(25.e-6_r8) ! max log(aerosol surface mode radius) contains @@ -339,7 +340,7 @@ end subroutine destructor subroutine modal_size_parameters(ncol,nlev, alnsg_amode, dgnumwet, radsurf, logradsurf, cheb) integer, intent(in) :: ncol,nlev - real(r8), intent(in) :: alnsg_amode ! geometric standard deviation of number distribution + real(r8), intent(in) :: alnsg_amode ! geometric standard deviation of number distribution real(r8), intent(in) :: dgnumwet(:,:) ! aerosol wet number mode diameter (m) real(r8), intent(out) :: radsurf(:,:) ! aerosol surface mode radius real(r8), intent(out) :: logradsurf(:,:) ! log(aerosol surface mode radius) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 9ab40155f6..60c95243b4 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -163,7 +163,9 @@ subroutine aerosol_optics_cam_init aero_props(iaermod)%obj => modal_aerosol_properties() end if - if (water_refindex_file/='NONE') then + if (water_refindex_file=='NONE') then + call endrun(prefix//'water_refindex_file must be specified') + else call getfil(water_refindex_file, locfile) call read_water_refindex(locfile) end if @@ -811,7 +813,7 @@ subroutine update_diags if (iwav==idx_uv_diag) then aoduv(icol) = aoduv(icol) + dopaer(icol) extinctuv(icol,ilev) = extinctuv(icol,ilev) + dopaer(icol)*air_density(icol,ilev)/mass(icol,ilev) - if (ilev.le.troplev(icol)) then + if (ilev<=troplev(icol)) then aoduvst(icol) = aoduvst(icol) + dopaer(icol) end if @@ -826,7 +828,7 @@ subroutine update_diags aodbin(icol) = aodbin(icol) + dopaer(icol) - if (ilev.le.troplev(icol)) then + if (ilev<=troplev(icol)) then aodvisst(icol) = aodvisst(icol) + dopaer(icol) end if @@ -938,7 +940,7 @@ subroutine update_diags aodnir(icol) = aodnir(icol) + dopaer(icol) extinctnir(icol,ilev) = extinctnir(icol,ilev) + dopaer(icol)*air_density(icol,ilev)/mass(icol,ilev) - if (ilev.le.troplev(icol)) then + if (ilev<=troplev(icol)) then aodnirst(icol) = aodnirst(icol) + dopaer(icol) end if @@ -1233,7 +1235,7 @@ end subroutine aerosol_optics_cam_lw subroutine read_water_refindex(infilename) use cam_pio_utils, only: cam_pio_openfile use pio, only: file_desc_t, var_desc_t, pio_inq_dimlen, pio_inq_dimid, pio_inq_varid, & - pio_get_var, PIO_NOWRITE, pio_closefile + pio_get_var, PIO_NOWRITE, pio_closefile, pio_noerr ! read water refractive index file and set module data @@ -1249,6 +1251,8 @@ subroutine read_water_refindex(infilename) type(var_desc_t) :: vid ! variable ids real(r8) :: refrwsw(nswbands), refiwsw(nswbands) ! real, imaginary ref index for water visible real(r8) :: refrwlw(nlwbands), refiwlw(nlwbands) ! real, imaginary ref index for water infrared + + character(len=*), parameter :: prefix = 'read_water_refindex: ' !---------------------------------------------------------------------------- ! open file @@ -1257,38 +1261,74 @@ subroutine read_water_refindex(infilename) ! inquire dimensions. Check that file values match parameter values. ierr = pio_inq_dimid(ncid, 'lw_band', did) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_dimid lw_band') + end if ierr = pio_inq_dimlen(ncid, did, dimlen) - if (dimlen .ne. nlwbands) then + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_dimlen lw_band') + end if + if (dimlen /= nlwbands) then write(iulog,*) 'lw_band len=', dimlen, ' from ', infilename, ' ne nlwbands=', nlwbands - call endrun('read_modal_optics: bad lw_band value') + call endrun(prefix//'bad lw_band value') endif ierr = pio_inq_dimid(ncid, 'sw_band', did) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_dimid sw_band') + end if ierr = pio_inq_dimlen(ncid, did, dimlen) - if (dimlen .ne. nswbands) then + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_dimlen sw_band') + end if + if (dimlen /= nswbands) then write(iulog,*) 'sw_band len=', dimlen, ' from ', infilename, ' ne nswbands=', nswbands - call endrun('read_modal_optics: bad sw_band value') + call endrun(prefix//'bad sw_band value') endif ! read variables ierr = pio_inq_varid(ncid, 'refindex_real_water_sw', vid) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_varid refindex_real_water_sw') + end if ierr = pio_get_var(ncid, vid, refrwsw) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_get_var refrwsw') + end if ierr = pio_inq_varid(ncid, 'refindex_im_water_sw', vid) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_varid refindex_im_water_sw') + end if ierr = pio_get_var(ncid, vid, refiwsw) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_get_var refiwsw') + end if ierr = pio_inq_varid(ncid, 'refindex_real_water_lw', vid) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_varid refindex_real_water_lw') + end if ierr = pio_get_var(ncid, vid, refrwlw) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_get_var refrwlw') + end if ierr = pio_inq_varid(ncid, 'refindex_im_water_lw', vid) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_inq_varid refindex_im_water_lw') + end if ierr = pio_get_var(ncid, vid, refiwlw) + if (ierr /= pio_noerr ) then + call endrun(prefix//'pio_get_var refiwlw') + end if ! set complex representation of refractive indices as module data do i = 1, nswbands - crefwsw(i) = cmplx(refrwsw(i), abs(refiwsw(i)),kind=r8) + crefwsw(i) = cmplx(refrwsw(i), abs(refiwsw(i)), kind=r8) end do do i = 1, nlwbands - crefwlw(i) = cmplx(refrwlw(i), abs(refiwlw(i)),kind=r8) + crefwlw(i) = cmplx(refrwlw(i), abs(refiwlw(i)), kind=r8) end do call pio_closefile(ncid) From 19ebc39888d81ae002623e2ca61a4389d677be5a Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 7 Jul 2023 10:36:17 -0600 Subject: [PATCH 15/61] minor misc code review changes modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 --- src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index d95349b800..b687862b7b 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -54,7 +54,9 @@ module refractive_aerosol_optics_mod ! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties ! in terms of refractive index and wet radius - integer, parameter :: ncoef=5, prefr=7, prefi=10 + integer, parameter :: ncoef = 5 ! number of chebychef coeficients + integer, parameter :: prefr = 7 ! number of real refractive indices + integer, parameter :: prefi = 10 ! number of imaginary refractive indices ! radius limits (m) real(r8), parameter :: xrmin=log(0.01e-6_r8) ! min log(aerosol surface mode radius) @@ -354,7 +356,6 @@ subroutine modal_size_parameters(ncol,nlev, alnsg_amode, dgnumwet, radsurf, logr explnsigma = exp(2.0_r8*alnsg_amode*alnsg_amode) - ! do k = top_lev, pver do k = 1, nlev do i = 1, ncol ! convert from number mode diameter to surface area From daddde9888e5aac4f324db15caae32135a6e2aef Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 18 Jul 2023 15:08:09 -0600 Subject: [PATCH 16/61] use table_interp utility module modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 new file: src/utils/table_interp_mod.F90 --- .../aerosol/refractive_aerosol_optics_mod.F90 | 149 ++++++------------ src/utils/table_interp_mod.F90 | 94 +++++++++++ 2 files changed, 138 insertions(+), 105 deletions(-) create mode 100644 src/utils/table_interp_mod.F90 diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index b687862b7b..08af52391a 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -5,6 +5,8 @@ module refractive_aerosol_optics_mod use aerosol_state_mod, only: aerosol_state use aerosol_properties_mod, only: aerosol_properties + use table_interp_mod, only: table_interp, table_interp_wghts, table_interp_updwghts + implicit none private @@ -197,41 +199,45 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) real(r8) :: refr(ncol) ! real part of refractive index real(r8) :: refi(ncol) ! imaginary part of refractive index - integer :: itab(ncol), jtab(ncol) - real(r8) :: ttab(ncol), utab(ncol) - real(r8) :: cext(ncol,ncoef), cabs(ncol,ncoef), casm(ncol,ncoef) + real(r8) :: cext(ncoef,ncol), cabs(ncoef,ncol), casm(ncoef,ncol) complex(r8) :: crefin(ncol) ! complex refractive index integer :: icol,icoef + type(table_interp_wghts) :: wghtsr(ncol) + type(table_interp_wghts) :: wghtsi(ncol) + crefin(:ncol) = self%aero_state%refractive_index_sw(ncol, ilev, self%ilist, self%ibin, iwav, self%aero_props) do icol = 1, ncol crefin(icol) = crefin(icol) + self%watervol(icol,ilev)*self%crefwsw(iwav) crefin(icol) = crefin(icol)/max(self%wetvol(icol,ilev),1.e-60_r8) + refr(icol) = real(crefin(icol)) + refr(icol) = max(refr(icol),minval(self%refrtabsw(:,iwav))) + refr(icol) = min(refr(icol),maxval(self%refrtabsw(:,iwav))) + refi(icol) = abs(aimag(crefin(icol))) + refi(icol) = max(refi(icol),minval(self%refitabsw(:,iwav))) + refi(icol) = min(refi(icol),maxval(self%refitabsw(:,iwav))) + end do ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(self%extpsw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & - refr, refi, self%refrtabsw(:,iwav), self%refitabsw(:,iwav), & - itab, jtab, ttab, utab, cext) - call binterp(self%abspsw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & - refr, refi, self%refrtabsw(:,iwav), self%refitabsw(:,iwav), & - itab, jtab, ttab, utab, cabs) - call binterp(self%asmpsw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & - refr, refi, self%refrtabsw(:,iwav), self%refitabsw(:,iwav), & - itab, jtab, ttab, utab, casm) + + call table_interp_updwghts( prefr, self%refrtabsw(:,iwav), ncol, refr(:ncol), wghtsr ) + call table_interp_updwghts( prefi, self%refitabsw(:,iwav), ncol, refi(:ncol), wghtsi ) + + cext(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%extpsw(:,:,:,iwav)) + cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%abspsw(:,:,:,iwav)) + casm(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%asmpsw(:,:,:,iwav)) do icol = 1,ncol if (self%logradsurf(icol,ilev) <= xrmax) then - pext(icol) = 0.5_r8*cext(icol,1) + pext(icol) = 0.5_r8*cext(1,icol) do icoef = 2, ncoef - pext(icol) = pext(icol) + self%cheb(icoef,icol,ilev)*cext(icol,icoef) + pext(icol) = pext(icol) + self%cheb(icoef,icol,ilev)*cext(icoef,icol) enddo pext(icol) = exp(pext(icol)) else @@ -240,11 +246,11 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) ! convert from m2/kg water to m2/kg aerosol pext(icol) = pext(icol)*self%wetvol(icol,ilev)*rhoh2o - pabs(icol) = 0.5_r8*cabs(icol,1) - pasm(icol) = 0.5_r8*casm(icol,1) + pabs(icol) = 0.5_r8*cabs(1,icol) + pasm(icol) = 0.5_r8*casm(1,icol) do icoef = 2, ncoef - pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icol,icoef) - pasm(icol) = pasm(icol) + self%cheb(icoef,icol,ilev)*casm(icol,icoef) + pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icoef,icol) + pasm(icol) = pasm(icol) + self%cheb(icoef,icol,ilev)*casm(icoef,icol) enddo pabs(icol) = pabs(icol)*self%wetvol(icol,ilev)*rhoh2o pabs(icol) = max(0._r8,pabs(icol)) @@ -269,13 +275,14 @@ subroutine lw_props(self, ncol, ilev, iwav, pabs) real(r8) :: refr(ncol) ! real part of refractive index real(r8) :: refi(ncol) ! imaginary part of refractive index - integer :: itab(ncol), jtab(ncol) - real(r8) :: ttab(ncol), utab(ncol) - real(r8) :: cabs(ncol,ncoef) + real(r8) :: cabs(ncoef,ncol) complex(r8) :: crefin(ncol) ! complex refractive index integer :: icol, icoef + type(table_interp_wghts) :: wghtsr(ncol) + type(table_interp_wghts) :: wghtsi(ncol) + crefin(:ncol) = self%aero_state%refractive_index_lw(ncol, ilev, self%ilist, self%ibin, iwav, self%aero_props) do icol = 1, ncol @@ -283,21 +290,28 @@ subroutine lw_props(self, ncol, ilev, iwav, pabs) if (self%wetvol(icol,ilev) > 1.e-40_r8) then crefin(icol) = crefin(icol)/self%wetvol(icol,ilev) end if + refr(icol) = real(crefin(icol)) + refr(icol) = max(refr(icol),minval(self%refrtablw(:,iwav))) + refr(icol) = min(refr(icol),maxval(self%refrtablw(:,iwav))) + refi(icol) = aimag(crefin(icol)) + refi(icol) = max(refi(icol),minval(self%refitablw(:,iwav))) + refi(icol) = min(refi(icol),maxval(self%refitablw(:,iwav))) + end do ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(self%absplw(:,:,:,iwav), ncol, ncoef, prefr, prefi, & - refr, refi, self%refrtablw(:,iwav), self%refitablw(:,iwav), & - itab, jtab, ttab, utab, cabs) + + call table_interp_updwghts( prefr, self%refrtablw(:,iwav), ncol, refr(:ncol), wghtsr ) + call table_interp_updwghts( prefi, self%refitablw(:,iwav), ncol, refi(:ncol), wghtsi ) + + cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%absplw(:,:,:,iwav)) do icol = 1,ncol - pabs(icol) = 0.5_r8*cabs(icol,1) + pabs(icol) = 0.5_r8*cabs(1,icol) do icoef = 2, ncoef - pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icol,icoef) + pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icoef,icol) end do pabs(icol) = pabs(icol)*self%wetvol(icol,ilev)*rhoh2o pabs(icol) = max(0._r8,pabs(icol)) @@ -376,79 +390,4 @@ subroutine modal_size_parameters(ncol,nlev, alnsg_amode, dgnumwet, radsurf, logr end subroutine modal_size_parameters -!=============================================================================== - subroutine binterp(table,ncol,km,im,jm,x,y,xtab,ytab,ix,jy,t,u,out) - - ! bilinear interpolation of table - ! - integer, intent(in) :: ncol,km,im,jm - real(r8),intent(in) :: table(km,im,jm) - real(r8),intent(in) :: x(ncol),y(ncol), xtab(im),ytab(jm) - integer,intent(inout) :: ix(ncol), jy(ncol) - real(r8),intent(inout) :: t(ncol), u(ncol) - real(r8),intent(out) :: out(ncol,km) - - - integer :: i,j,k,ic,ip1, ixc,jyc, jp1, ip1m(ncol),jp1m(ncol) - real(r8) :: dx,dy,tu(ncol),tuc(ncol),tcu(ncol),tcuc(ncol) - - if(ix(1).gt.0) go to 30 - if(im.gt.1)then - do ic=1,ncol - do i=1,im - if(x(ic).lt.xtab(i))go to 10 - enddo -10 ix(ic)=max0(i-1,1) - ip1=min(ix(ic)+1,im) - dx=(xtab(ip1)-xtab(ix(ic))) - if(abs(dx).gt.1.e-20_r8)then - t(ic)=(x(ic)-xtab(ix(ic)))/dx - else - t(ic)=0._r8 - endif - end do - else - ix(:ncol)=1 - t(:ncol)=0._r8 - endif - if(jm.gt.1)then - do ic=1,ncol - do j=1,jm - if(y(ic).lt.ytab(j))go to 20 - enddo -20 jy(ic)=max0(j-1,1) - jp1=min(jy(ic)+1,jm) - dy=(ytab(jp1)-ytab(jy(ic))) - if(abs(dy).gt.1.e-20_r8)then - u(ic)=(y(ic)-ytab(jy(ic)))/dy - else - u(ic)=0._r8 - endif - end do - else - jy(:ncol)=1 - u(:ncol)=0._r8 - endif -30 continue - do ic=1,ncol - tu(ic)=t(ic)*u(ic) - tuc(ic)=t(ic)-tu(ic) - tcuc(ic)=1._r8-tuc(ic)-u(ic) - tcu(ic)=u(ic)-tu(ic) - jp1m(ic)=min(jy(ic)+1,jm) - ip1m(ic)=min(ix(ic)+1,im) - enddo - do ic=1,ncol - jyc=jy(ic) - ixc=ix(ic) - jp1=jp1m(ic) - ip1=ip1m(ic) - do k=1,km - out(ic,k) = tcuc(ic) * table(k,ixc,jyc) + tuc(ic) * table(k,ip1,jyc) + & - tu(ic) * table(k,ip1,jp1) + tcu(ic) * table(k,ixc,jp1) - end do - end do - return - end subroutine binterp - end module refractive_aerosol_optics_mod diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 new file mode 100644 index 0000000000..ac2adc5b16 --- /dev/null +++ b/src/utils/table_interp_mod.F90 @@ -0,0 +1,94 @@ +module table_interp_mod + use shr_kind_mod, only: r8=>shr_kind_r8 + use cam_abortutils, only: endrun + + implicit none + + private + public :: table_interp + public :: table_interp_wghts + public :: table_interp_updwghts + + interface table_interp + module procedure interp2d + end interface table_interp + + type :: table_interp_wghts + real(r8) :: wt1 + real(r8) :: wt2 + integer :: ix1 + integer :: ix2 + end type table_interp_wghts + +contains + + !-------------------------------------------------------------------------- + !-------------------------------------------------------------------------- + + pure function interp2d( ncoef,ncol,nxs,nys, xwghts,ywghts, tbl ) result(res) + + integer, intent(in) :: ncoef,ncol,nxs,nys + real(r8), intent(in) :: tbl(ncoef,nxs,nys) + type(table_interp_wghts), intent(in) :: xwghts(ncol) + type(table_interp_wghts), intent(in) :: ywghts(ncol) + + real(r8) :: res(ncoef,ncol) + + real(r8) :: fx(ncoef,2) + + integer :: i + + do i = 1,ncol + + fx(:,1) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix1) & + + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix1) + fx(:,2) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix2) & + + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix2) + + res(:,i) = ywghts(i)%wt1*fx(:,1) + ywghts(i)%wt2*fx(:,2) + + end do + + + end function interp2d + + !-------------------------------------------------------------------------- + !-------------------------------------------------------------------------- + + subroutine table_interp_updwghts( ngrid, xgrid, ncols, xcols, wghts ) + integer, intent(in) :: ngrid + real(r8), intent(in) :: xgrid(ngrid) + integer, intent(in) :: ncols + real(r8), intent(in) :: xcols(ncols) + type(table_interp_wghts), intent(inout) :: wghts(ncols) + + integer :: i + + do i = 1,ncols + wghts(i)%ix2 = find_index(ngrid,xgrid,xcols(i)) + wghts(i)%ix1 = wghts(i)%ix2 - 1 + wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xcols(i)) & + /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) + wghts(i)%wt2 = 1._8 - wghts(i)%wt1 + end do + + end subroutine table_interp_updwghts + + ! private methods + !-------------------------------------------------------------------------- + !-------------------------------------------------------------------------- + + pure function find_index( nvals, vals, vx ) result(ndx) + integer, intent(in) :: nvals + real(r8), intent(in) :: vals(nvals) + real(r8), intent(in) :: vx + + integer :: ndx + + find_ndx: do ndx = 1, nvals-1 + if (vals(ndx)>vx) exit find_ndx + end do find_ndx + + end function find_index + +end module table_interp_mod From daa0a804c3c8f8c1542091a21410f64380919b40 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 19 Jul 2023 13:37:50 -0600 Subject: [PATCH 17/61] fix ChangeLog --- doc/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 9893c0a2d8..879a1724af 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -3,7 +3,7 @@ Tag name: cam6_3_119 Originator(s): fvitt Date: 19 Jul 2023 -One-line Summary: +One-line Summary: CAM-Chem namelist updates and fix issue with maximum number of chemical emissions files Github PR URL: https://github.com/ESCOMP/CAM/pull/850 Purpose of changes (include the issue number and title text for each relevant GitHub issue): From 29e641391035d0e2bc83d2260ee1e5df2a280831 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 21 Jul 2023 13:57:55 -0600 Subject: [PATCH 18/61] use updated table_interp_mod modified: src/physics/cam/modal_aer_opt.F90 modified: src/utils/table_interp_mod.F90 --- .../aerosol/refractive_aerosol_optics_mod.F90 | 69 ++++----- src/utils/table_interp_mod.F90 | 134 +++++++++++++++--- 2 files changed, 151 insertions(+), 52 deletions(-) diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index 08af52391a..730c0ed81c 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -5,7 +5,7 @@ module refractive_aerosol_optics_mod use aerosol_state_mod, only: aerosol_state use aerosol_properties_mod, only: aerosol_properties - use table_interp_mod, only: table_interp, table_interp_wghts, table_interp_updwghts + use table_interp_mod, only: table_interp, table_interp_wghts, table_interp_calcwghts implicit none @@ -41,6 +41,12 @@ module refractive_aerosol_optics_mod real(r8), pointer :: refrtablw(:,:) => null() ! table of real refractive indices for aerosols real(r8), pointer :: refitablw(:,:) => null() ! table of imag refractive indices for aerosols + ! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties + ! in terms of refractive index and wet radius + integer :: ncoef = -1 ! number of chebychef coeficients + integer :: prefr = -1 ! number of real refractive indices + integer :: prefi = -1 ! number of imaginary refractive indices + contains procedure :: sw_props @@ -54,12 +60,6 @@ module refractive_aerosol_optics_mod procedure :: constructor end interface refractive_aerosol_optics - ! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties - ! in terms of refractive index and wet radius - integer, parameter :: ncoef = 5 ! number of chebychef coeficients - integer, parameter :: prefr = 7 ! number of real refractive indices - integer, parameter :: prefi = 10 ! number of imaginary refractive indices - ! radius limits (m) real(r8), parameter :: xrmin=log(0.01e-6_r8) ! min log(aerosol surface mode radius) real(r8), parameter :: xrmax=log(25.e-6_r8) ! max log(aerosol surface mode radius) @@ -85,11 +85,11 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, type(refractive_aerosol_optics), pointer :: newobj integer :: ierr, icol, ilev, ispec, nspec - real(r8) :: vol(ncol) ! volume concentration of aerosol specie (m3/kg) - real(r8) :: dryvol(ncol) ! volume concentration of aerosol mode (m3/kg) + real(r8) :: vol(ncol) ! volume concentration of aerosol specie (m3/kg) + real(r8) :: dryvol(ncol) ! volume concentration of aerosol mode (m3/kg) real(r8) :: specdens ! species density (kg/m3) real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio - real(r8) :: logsigma ! geometric standard deviation of number distribution + real(r8) :: logsigma ! geometric standard deviation of number distribution real(r8) :: dgnumwet(ncol,nlev) ! aerosol wet number mode diameter (m) real(r8) :: qaerwat(ncol,nlev) ! aerosol water (g/g) @@ -100,6 +100,13 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, return end if + ! get mode properties + call aero_props%optics_params(ilist, ibin, & + refrtabsw=newobj%refrtabsw, refitabsw=newobj%refitabsw, & + refrtablw=newobj%refrtablw, refitablw=newobj%refitablw,& + extpsw=newobj%extpsw, abspsw=newobj%abspsw, asmpsw=newobj%asmpsw, & + absplw=newobj%absplw, ncoef=newobj%ncoef, prefr=newobj%prefr, prefi=newobj%prefi) + allocate(newobj%watervol(ncol,nlev),stat=ierr) if (ierr/=0) then nullify(newobj) @@ -110,7 +117,7 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, nullify(newobj) return end if - allocate(newobj%cheb(ncoef,ncol,nlev),stat=ierr) + allocate(newobj%cheb(newobj%ncoef,ncol,nlev),stat=ierr) if (ierr/=0) then nullify(newobj) return @@ -147,7 +154,8 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, logsigma=aero_props%alogsig(ilist,ibin) ! calc size parameter for all columns - call modal_size_parameters(ncol, nlev, logsigma, dgnumwet, newobj%radsurf, newobj%logradsurf, newobj%cheb) + call modal_size_parameters(newobj%ncoef, ncol, nlev, logsigma, dgnumwet, & + newobj%radsurf, newobj%logradsurf, newobj%cheb) do ilev = 1, nlev dryvol(:ncol) = 0._r8 @@ -169,13 +177,6 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, end do end do - ! get mode properties - call aero_props%optics_params(ilist, ibin, & - refrtabsw=newobj%refrtabsw, refitabsw=newobj%refitabsw, & - refrtablw=newobj%refrtablw, refitablw=newobj%refitablw,& - extpsw=newobj%extpsw, abspsw=newobj%abspsw, asmpsw=newobj%asmpsw, & - absplw=newobj%absplw) - newobj%aero_state => aero_state newobj%aero_props => aero_props newobj%ilist = ilist @@ -199,7 +200,7 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) real(r8) :: refr(ncol) ! real part of refractive index real(r8) :: refi(ncol) ! imaginary part of refractive index - real(r8) :: cext(ncoef,ncol), cabs(ncoef,ncol), casm(ncoef,ncol) + real(r8) :: cext(self%ncoef,ncol), cabs(self%ncoef,ncol), casm(self%ncoef,ncol) complex(r8) :: crefin(ncol) ! complex refractive index integer :: icol,icoef @@ -225,18 +226,18 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) ! interpolate coefficients linear in refractive index - call table_interp_updwghts( prefr, self%refrtabsw(:,iwav), ncol, refr(:ncol), wghtsr ) - call table_interp_updwghts( prefi, self%refitabsw(:,iwav), ncol, refi(:ncol), wghtsi ) + wghtsr = table_interp_calcwghts( self%prefr, self%refrtabsw(:,iwav), ncol, refr(:ncol) ) + wghtsi = table_interp_calcwghts( self%prefi, self%refitabsw(:,iwav), ncol, refi(:ncol) ) - cext(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%extpsw(:,:,:,iwav)) - cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%abspsw(:,:,:,iwav)) - casm(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%asmpsw(:,:,:,iwav)) + cext(:,:ncol)= table_interp( self%ncoef,ncol, self%prefr,self%prefi, wghtsr,wghtsi, self%extpsw(:,:,:,iwav)) + cabs(:,:ncol)= table_interp( self%ncoef,ncol, self%prefr,self%prefi, wghtsr,wghtsi, self%abspsw(:,:,:,iwav)) + casm(:,:ncol)= table_interp( self%ncoef,ncol, self%prefr,self%prefi, wghtsr,wghtsi, self%asmpsw(:,:,:,iwav)) do icol = 1,ncol if (self%logradsurf(icol,ilev) <= xrmax) then pext(icol) = 0.5_r8*cext(1,icol) - do icoef = 2, ncoef + do icoef = 2, self%ncoef pext(icol) = pext(icol) + self%cheb(icoef,icol,ilev)*cext(icoef,icol) enddo pext(icol) = exp(pext(icol)) @@ -248,7 +249,7 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) pext(icol) = pext(icol)*self%wetvol(icol,ilev)*rhoh2o pabs(icol) = 0.5_r8*cabs(1,icol) pasm(icol) = 0.5_r8*casm(1,icol) - do icoef = 2, ncoef + do icoef = 2, self%ncoef pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icoef,icol) pasm(icol) = pasm(icol) + self%cheb(icoef,icol,ilev)*casm(icoef,icol) enddo @@ -275,7 +276,7 @@ subroutine lw_props(self, ncol, ilev, iwav, pabs) real(r8) :: refr(ncol) ! real part of refractive index real(r8) :: refi(ncol) ! imaginary part of refractive index - real(r8) :: cabs(ncoef,ncol) + real(r8) :: cabs(self%ncoef,ncol) complex(r8) :: crefin(ncol) ! complex refractive index integer :: icol, icoef @@ -303,14 +304,14 @@ subroutine lw_props(self, ncol, ilev, iwav, pabs) ! interpolate coefficients linear in refractive index - call table_interp_updwghts( prefr, self%refrtablw(:,iwav), ncol, refr(:ncol), wghtsr ) - call table_interp_updwghts( prefi, self%refitablw(:,iwav), ncol, refi(:ncol), wghtsi ) + wghtsr = table_interp_calcwghts( self%prefr, self%refrtablw(:,iwav), ncol, refr(:ncol) ) + wghtsi = table_interp_calcwghts( self%prefi, self%refitablw(:,iwav), ncol, refi(:ncol) ) - cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, self%absplw(:,:,:,iwav)) + cabs(:,:ncol)= table_interp( self%ncoef,ncol, self%prefr,self%prefi, wghtsr,wghtsi, self%absplw(:,:,:,iwav)) do icol = 1,ncol pabs(icol) = 0.5_r8*cabs(1,icol) - do icoef = 2, ncoef + do icoef = 2, self%ncoef pabs(icol) = pabs(icol) + self%cheb(icoef,icol,ilev)*cabs(icoef,icol) end do pabs(icol) = pabs(icol)*self%wetvol(icol,ilev)*rhoh2o @@ -353,9 +354,9 @@ end subroutine destructor !=============================================================================== - subroutine modal_size_parameters(ncol,nlev, alnsg_amode, dgnumwet, radsurf, logradsurf, cheb) + subroutine modal_size_parameters(ncoef,ncol,nlev, alnsg_amode, dgnumwet, radsurf, logradsurf, cheb) - integer, intent(in) :: ncol,nlev + integer, intent(in) :: ncoef,ncol,nlev real(r8), intent(in) :: alnsg_amode ! geometric standard deviation of number distribution real(r8), intent(in) :: dgnumwet(:,:) ! aerosol wet number mode diameter (m) real(r8), intent(out) :: radsurf(:,:) ! aerosol surface mode radius diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 index ac2adc5b16..d5748ab88d 100644 --- a/src/utils/table_interp_mod.F90 +++ b/src/utils/table_interp_mod.F90 @@ -1,18 +1,24 @@ +!---------------------------------------------------------------------------- +! Utility module used for interpolation of aerosol optics table +!---------------------------------------------------------------------------- module table_interp_mod use shr_kind_mod, only: r8=>shr_kind_r8 - use cam_abortutils, only: endrun implicit none private public :: table_interp public :: table_interp_wghts - public :: table_interp_updwghts + public :: table_interp_calcwghts + ! overload the interpolation routines interface table_interp + module procedure interp1d module procedure interp2d + module procedure interp4d end interface table_interp + ! interpolation weights and indices type :: table_interp_wghts real(r8) :: wt1 real(r8) :: wt2 @@ -23,14 +29,40 @@ module table_interp_mod contains !-------------------------------------------------------------------------- + ! 1-D interpolation !-------------------------------------------------------------------------- + pure function interp1d( ncol, nxs, xwghts, tbl ) result(res) - pure function interp2d( ncoef,ncol,nxs,nys, xwghts,ywghts, tbl ) result(res) + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table size + real(r8), intent(in) :: tbl(nxs) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! interpolation weights and indices - integer, intent(in) :: ncoef,ncol,nxs,nys - real(r8), intent(in) :: tbl(ncoef,nxs,nys) - type(table_interp_wghts), intent(in) :: xwghts(ncol) - type(table_interp_wghts), intent(in) :: ywghts(ncol) + real(r8) :: res(ncol) + + integer :: i + + do i = 1,ncol + + res(i) = xwghts(i)%wt1*tbl(xwghts(i)%ix1) & + + xwghts(i)%wt2*tbl(xwghts(i)%ix2) + + end do + + end function interp1d + + !-------------------------------------------------------------------------- + ! 2-D interpolation + !-------------------------------------------------------------------------- + pure function interp2d( ncoef, ncol, nxs, nys, xwghts, ywghts, tbl ) result(res) + + integer, intent(in) :: ncoef ! number chebyshev coefficients + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table x-dimension size + integer, intent(in) :: nys ! table y-dimension size + real(r8), intent(in) :: tbl(ncoef,nxs,nys) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! x interpolation weights and indices + type(table_interp_wghts), intent(in) :: ywghts(ncol) ! y interpolation weights and indices real(r8) :: res(ncoef,ncol) @@ -40,27 +72,93 @@ pure function interp2d( ncoef,ncol,nxs,nys, xwghts,ywghts, tbl ) result(res) do i = 1,ncol - fx(:,1) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix1) & + ! interp x dir + fx(:,1) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix1) & ! @ y1 + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix1) - fx(:,2) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix2) & + fx(:,2) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix2) & ! @ y2 + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix2) + ! interp y dir res(:,i) = ywghts(i)%wt1*fx(:,1) + ywghts(i)%wt2*fx(:,2) end do - end function interp2d + !-------------------------------------------------------------------------- + ! 4-D interpolation + !-------------------------------------------------------------------------- + pure function interp4d( ncol, nxs, nys, nzs, nts, xwghts, ywghts, zwghts, twghts, tbl ) result(res) + + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table x-dimension size + integer, intent(in) :: nys ! table y-dimension size + integer, intent(in) :: nzs ! table z-dimension size + integer, intent(in) :: nts ! table t-dimension size + real(r8), intent(in) :: tbl(nxs,nys,nzs,nts) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! x interpolation weights and indices + type(table_interp_wghts), intent(in) :: ywghts(ncol) ! y interpolation weights and indices + type(table_interp_wghts), intent(in) :: zwghts(ncol) ! z interpolation weights and indices + type(table_interp_wghts), intent(in) :: twghts(ncol) ! t interpolation weights and indices + + real(r8) :: res(ncol) + + real(r8) :: fx(8) + real(r8) :: fy(4) + real(r8) :: fz(2) + + integer :: i + + do i = 1,ncol + + ! interp x dir + fx(1) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix1) & ! @ y1, z1, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix1) + fx(2) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix1) & ! @ y2, z1, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix1) + + fx(3) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix1) & ! @ y1, z2, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix1) + fx(4) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix1) & ! @ y2, z2, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix1) + + fx(5) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix2) & ! @ y1, z1, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix2) + fx(6) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix2) & ! @ y2, z1, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix2) + + fx(7) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix2) & ! @ y1, z2, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix2) + fx(8) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix2) & ! @ y2, z2, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix2) + + ! interp y dir + fy(1) = ywghts(i)%wt1*fx(1) + ywghts(i)%wt2*fx(2) ! @ z1, t1 + fy(2) = ywghts(i)%wt1*fx(3) + ywghts(i)%wt2*fx(4) ! @ z2, t1 + fy(3) = ywghts(i)%wt1*fx(5) + ywghts(i)%wt2*fx(6) ! @ z1, t2 + fy(4) = ywghts(i)%wt1*fx(7) + ywghts(i)%wt2*fx(8) ! @ z2, t2 + + ! interp z dir + fz(1) = zwghts(i)%wt1*fy(1) + zwghts(i)%wt2*fy(2) ! @ t1 + fz(2) = zwghts(i)%wt1*fy(3) + zwghts(i)%wt2*fy(4) ! @ t2 + + ! interp t dir + res(i) = twghts(i)%wt1*fz(1) + twghts(i)%wt2*fz(2) + + end do + + end function interp4d + !-------------------------------------------------------------------------- !-------------------------------------------------------------------------- + pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) + + integer, intent(in) :: ngrid ! number of grid point values + real(r8), intent(in) :: xgrid(ngrid) ! grid point values + integer, intent(in) :: ncols ! number of model columns + real(r8), intent(in) :: xcols(ncols) ! values at the model columns - subroutine table_interp_updwghts( ngrid, xgrid, ncols, xcols, wghts ) - integer, intent(in) :: ngrid - real(r8), intent(in) :: xgrid(ngrid) - integer, intent(in) :: ncols - real(r8), intent(in) :: xcols(ncols) - type(table_interp_wghts), intent(inout) :: wghts(ncols) + type(table_interp_wghts) :: wghts(ncols) ! interpolations weights at the model columns integer :: i @@ -68,11 +166,11 @@ subroutine table_interp_updwghts( ngrid, xgrid, ncols, xcols, wghts ) wghts(i)%ix2 = find_index(ngrid,xgrid,xcols(i)) wghts(i)%ix1 = wghts(i)%ix2 - 1 wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xcols(i)) & - /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) + /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) wghts(i)%wt2 = 1._8 - wghts(i)%wt1 end do - end subroutine table_interp_updwghts + end function table_interp_calcwghts ! private methods !-------------------------------------------------------------------------- From d3ca97c666bd123d7c2a64be6e3a237ee11a62c2 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 27 Jul 2023 13:45:23 -0600 Subject: [PATCH 19/61] ChangeLog draft --- doc/ChangeLog | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index 879a1724af..167633fc93 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,106 @@ =============================================================== +Tag name: cam6_3_120 +Originator(s): fvitt +Date: 28 Jul 2023 +One-line Summary: Add O3S diagnostic tracer to WACCM-MA; move gravity wave parameter to namelist +Github PR URL: https://github.com/ESCOMP/CAM/pull/851 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Make frontal gravity wave spectrum half-width a namelist variable (issue #839) + MA chemistry scheme (waccm_ma_mam4) needs O3S (issue #793) + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: + + New namelist parameter: + front_gaussian_width + Width of gaussian used to create frontogenesis tau profile [m/s]. + Defaults to 30 m/s + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: none + +List all files added and what they do: none + +List all existing files that have been modified, and describe the changes: + +M bld/namelist_files/namelist_definition.xml + - new front_gaussian_width namelist parameter + +M bld/build-namelist + - set default front_gaussian_width + +M bld/namelist_files/namelist_defaults_cam.xml + - namelist defaults: + front_gaussian_width + O3S_Loss for WACCM-MA and SolIonRate_Tot for WACCM-X + +M bld/namelist_files/use_cases/sd_waccmx_ma_cam6.xml +M bld/namelist_files/use_cases/waccmx_ma_2000_cam6.xml +M bld/namelist_files/use_cases/waccmx_ma_hist_cam6.xml + - SolIonRate_Tot set by namelist_defaults_cam.xml + +M src/chemistry/pp_waccm_ma_mam5/chem_mech.doc +M src/chemistry/pp_waccm_ma_mam5/chem_mech.in +M src/chemistry/pp_waccm_ma_mam5/chem_mods.F90 +M src/chemistry/pp_waccm_ma_mam5/m_spc_id.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_indprd.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_lin_matrix.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_nln_matrix.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_prod_loss.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_rxt_rates_conv.F90 +M src/chemistry/pp_waccm_ma_mam5/mo_sim_dat.F90 + - add diagnostic tracer O3S (explicit solver) + +M src/physics/cam/gw_drag.F90 + - move hard-wired parameter front_gaussian_width to namelist + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + +izumi/nag/aux_cam: + +izumi/gnu/aux_cam: + +CAM tag used for the baseline comparison tests if different than previous +tag: + +Summarize any changes to answers, i.e., +- what code configurations: +- what platforms/compilers: +- nature of change (roundoff; larger than roundoff but same climate; new + climate): + +If bitwise differences were observed, how did you show they were no worse +than roundoff? + +If this tag changes climate describe the run(s) done to evaluate the new +climate in enough detail that it(they) could be reproduced, i.e., +- source tag (all code used must be in the repository): +- platform/compilers: +- configure commandline: +- build-namelist command (or complete namelist): +- MSS location of output: + +MSS location of control simulations used to validate new climate: + +URL for AMWG diagnostics output used to validate new climate: + +=============================================================== +=============================================================== + Tag name: cam6_3_119 Originator(s): fvitt Date: 19 Jul 2023 From 2ce8aedd423f74e59537a0c32e87c89bedf0ac23 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 27 Jul 2023 17:37:43 -0600 Subject: [PATCH 20/61] ChangeLog update --- doc/ChangeLog | 92 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 72 insertions(+), 20 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 167633fc93..91d25fb0c9 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -70,33 +70,85 @@ appropriate machine below. All failed tests must be justified. cheyenne/intel/aux_cam: -izumi/nag/aux_cam: + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 NLCOMP + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=291 + - pre-existing failure -izumi/gnu/aux_cam: + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h NLCOMP + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + - HEMCO baseline failures due to known issue with HEMCO external -CAM tag used for the baseline comparison tests if different than previous -tag: + ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: DIFF) details: + FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes NLCOMP + FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: FIELDLIST field lists differ (otherwise bit-for-bit) + - new O3S tracer field -Summarize any changes to answers, i.e., -- what code configurations: -- what platforms/compilers: -- nature of change (roundoff; larger than roundoff but same climate; new - climate): + ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_119: DIFF + - difference are due to O3S dry dep velocity surface fields, otherwise bit-for-bit -If bitwise differences were observed, how did you show they were no worse -than roundoff? + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPX2000.cheyenne_intel.cam-outfrq3s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: NLFAIL) details: + ERP_Lh12_Vnuopc.f19_f19_mg17.FW4madSD.cheyenne_intel.cam-outfrq3h (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.QPX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: NLFAIL) details: + - namelist compare failures due to new front_gaussian_width namelist parameter -If this tag changes climate describe the run(s) done to evaluate the new -climate in enough detail that it(they) could be reproduced, i.e., -- source tag (all code used must be in the repository): -- platform/compilers: -- configure commandline: -- build-namelist command (or complete namelist): -- MSS location of output: +izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=10 + - pre-existing failure -MSS location of control simulations used to validate new climate: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_119_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + - new O3S tracer field -URL for AMWG diagnostics output used to validate new climate: + SMS_D_Ln3_Vnuopc.ne5pg3_ne5pg3_mg37.QPX2000.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + SMS_D_Ln6_Vnuopc.ne5_ne5_mg37.QPWmaC4.izumi_nag.cam-outfrq3s_physgrid_tem (Overall: NLFAIL) details: + - namelist compare failures due to new front_gaussian_width namelist parameter + +izumi/gnu/aux_cam: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC4.izumi_gnu.cam-outfrq3s_diags (Overall: NLFAIL) details: + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC4.izumi_gnu.cam-outfrq9s_apmee (Overall: NLFAIL) details: + SMS_P48x1_D_Ln9_Vnuopc.f19_f19_mg17.FW4madSD.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + - namelist compare failures due to new front_gaussian_width namelist parameter + +Summarize any changes to answers: bit-for-bit unchanged =============================================================== =============================================================== From 4754394b18fdc2619f8498ca00260cc8e4240c9c Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 28 Jul 2023 11:38:55 -0600 Subject: [PATCH 21/61] some of Jesse's change requests modified: src/chemistry/aerosol/aerosol_properties_mod.F90 modified: src/chemistry/aerosol/modal_aerosol_properties_mod.F90 modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 --- .../aerosol/aerosol_properties_mod.F90 | 16 +-- .../aerosol/modal_aerosol_properties_mod.F90 | 119 +++++++++++------- .../aerosol/refractive_aerosol_optics_mod.F90 | 10 +- 3 files changed, 86 insertions(+), 59 deletions(-) diff --git a/src/chemistry/aerosol/aerosol_properties_mod.F90 b/src/chemistry/aerosol/aerosol_properties_mod.F90 index 7cddece92b..865ee0b799 100644 --- a/src/chemistry/aerosol/aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/aerosol_properties_mod.F90 @@ -129,14 +129,14 @@ subroutine aero_optics_params(self, list_ndx, bin_ndx, opticstype, extpsw, absps character(len=*), optional, intent(out) :: opticstype ! refactive index table parameters - real(r8), optional, pointer :: extpsw(:,:,:,:) ! specific extinction - real(r8), optional, pointer :: abspsw(:,:,:,:) ! specific absorption - real(r8), optional, pointer :: asmpsw(:,:,:,:) ! asymmetry factor - real(r8), optional, pointer :: absplw(:,:,:,:) ! specific absorption - real(r8), optional, pointer :: refrtabsw(:,:) ! table of real refractive indices for aerosols - real(r8), optional, pointer :: refitabsw(:,:) ! table of imaginary refractive indices for aerosols - real(r8), optional, pointer :: refrtablw(:,:) ! table of real refractive indices for aerosols - real(r8), optional, pointer :: refitablw(:,:) ! table of imaginary refractive indices for aerosols + real(r8), optional, pointer :: extpsw(:,:,:,:) ! short wave specific extinction + real(r8), optional, pointer :: abspsw(:,:,:,:) ! short wave specific absorption + real(r8), optional, pointer :: asmpsw(:,:,:,:) ! short wave asymmetry factor + real(r8), optional, pointer :: absplw(:,:,:,:) ! long wave specific absorption + real(r8), optional, pointer :: refrtabsw(:,:) ! table of short wave real refractive indices for aerosols + real(r8), optional, pointer :: refitabsw(:,:) ! table of short wave imaginary refractive indices for aerosols + real(r8), optional, pointer :: refrtablw(:,:) ! table of long wave real refractive indices for aerosols + real(r8), optional, pointer :: refitablw(:,:) ! table of long wave imaginary refractive indices for aerosols integer, optional, intent(out) :: ncoef ! number of chebychev polynomials integer, optional, intent(out) :: prefr ! number of real refractive indices in table integer, optional, intent(out) :: prefi ! number of imaginary refractive indices in table diff --git a/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 b/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 index e882a28601..66cee40480 100644 --- a/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_properties_mod.F90 @@ -208,21 +208,10 @@ subroutine get(self, bin_ndx, species_ndx, list_ndx, density, hygro, & ilist = 0 end if - if (present(density)) then - call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, density_aer=density) - end if - if (present(hygro)) then - call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, hygro_aer=hygro) - end if - if (present(spectype)) then - call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, spectype=spectype ) - end if - if (present(refindex_sw)) then - call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, refindex_aer_sw=refindex_sw ) - end if - if (present(refindex_lw)) then - call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, refindex_aer_lw=refindex_lw ) - end if + call rad_cnst_get_aer_props(ilist, bin_ndx, species_ndx, & + density_aer=density, hygro_aer=hygro, spectype=spectype, & + refindex_aer_sw=refindex_sw, refindex_aer_lw=refindex_lw) + if (present(specmorph)) then specmorph = 'UNKNOWN' end if @@ -245,14 +234,14 @@ subroutine optics_params(self, list_ndx, bin_ndx, opticstype, extpsw, abspsw, as character(len=*), optional, intent(out) :: opticstype ! refactive index table parameters - real(r8), optional, pointer :: extpsw(:,:,:,:) ! specific extinction - real(r8), optional, pointer :: abspsw(:,:,:,:) ! specific absorption - real(r8), optional, pointer :: asmpsw(:,:,:,:) ! asymmetry factor - real(r8), optional, pointer :: absplw(:,:,:,:) ! specific absorption - real(r8), optional, pointer :: refrtabsw(:,:) ! table of real refractive indices for aerosols - real(r8), optional, pointer :: refitabsw(:,:) ! table of imaginary refractive indices for aerosols - real(r8), optional, pointer :: refrtablw(:,:) ! table of real refractive indices for aerosols - real(r8), optional, pointer :: refitablw(:,:) ! table of imaginary refractive indices for aerosols + real(r8), optional, pointer :: extpsw(:,:,:,:) ! short wave specific extinction + real(r8), optional, pointer :: abspsw(:,:,:,:) ! short wave specific absorption + real(r8), optional, pointer :: asmpsw(:,:,:,:) ! short wave asymmetry factor + real(r8), optional, pointer :: absplw(:,:,:,:) ! long wave specific absorption + real(r8), optional, pointer :: refrtabsw(:,:) ! table of short wave real refractive indices for aerosols + real(r8), optional, pointer :: refitabsw(:,:) ! table of short wave imaginary refractive indices for aerosols + real(r8), optional, pointer :: refrtablw(:,:) ! table of long wave real refractive indices for aerosols + real(r8), optional, pointer :: refitablw(:,:) ! table of long wave imaginary refractive indices for aerosols integer, optional, intent(out) :: ncoef ! number of chebychev polynomials integer, optional, intent(out) :: prefr ! number of real refractive indices in table integer, optional, intent(out) :: prefi ! number of imaginary refractive indices in table @@ -279,41 +268,77 @@ subroutine optics_params(self, list_ndx, bin_ndx, opticstype, extpsw, abspsw, as integer, optional, intent(out) :: nkap ! hygroscopicity dimension size integer, optional, intent(out) :: nrelh ! relative humidity dimension size - if (present(opticstype)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, opticstype=opticstype) + ! refactive index table parameters + call rad_cnst_get_mode_props(list_ndx, bin_ndx, & + opticstype=opticstype, & + extpsw=extpsw, & + abspsw=abspsw, & + asmpsw=asmpsw, & + absplw=absplw, & + refrtabsw=refrtabsw, & + refitabsw=refitabsw, & + refrtablw=refrtablw, & + refitablw=refitablw, & + ncoef=ncoef, & + prefr=prefr, & + prefi=prefi) + + ! hygrowghtpct table parameters + if (present(sw_hygro_ext_wtp)) then + nullify(sw_hygro_ext_wtp) + end if + if (present(sw_hygro_ssa_wtp)) then + nullify(sw_hygro_ssa_wtp) + end if + if (present(sw_hygro_asm_wtp)) then + nullify(sw_hygro_asm_wtp) + end if + if (present(lw_hygro_ext_wtp)) then + nullify(lw_hygro_ext_wtp) + end if + if (present(wgtpct)) then + nullify(wgtpct) + end if + if (present(nwtp)) then + nwtp = -1 + end if + + ! hygrocoreshell table parameters + if (present(sw_hygro_coreshell_ext)) then + nullify(sw_hygro_coreshell_ext) end if - if (present(extpsw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, extpsw=extpsw) + if (present(sw_hygro_coreshell_ssa)) then + nullify(sw_hygro_coreshell_ssa) end if - if (present(abspsw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, abspsw=abspsw) + if (present(sw_hygro_coreshell_asm)) then + nullify(sw_hygro_coreshell_asm) end if - if (present(asmpsw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, asmpsw=asmpsw) + if (present(lw_hygro_coreshell_ext)) then + nullify(lw_hygro_coreshell_ext) end if - if (present(absplw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, absplw=absplw) + if (present(corefrac)) then + nullify(corefrac) end if - if (present(refrtabsw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, refrtabsw=refrtabsw) + if (present(bcdust)) then + nullify(bcdust) end if - if (present(refitabsw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, refitabsw=refitabsw) + if (present(kap)) then + nullify(kap) end if - if (present(refrtablw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, refrtablw=refrtablw) + if (present(relh)) then + nullify(relh) end if - if (present(refitablw)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, refitablw=refitablw) + if (present(nfrac)) then + nfrac = -1 end if - if (present(ncoef)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, ncoef=ncoef) + if (present(nbcdust)) then + nbcdust = -1 end if - if (present(prefr)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, prefr=prefr) + if (present(nkap)) then + nkap = -1 end if - if (present(prefi)) then - call rad_cnst_get_mode_props(list_ndx,bin_ndx, prefi=prefi) + if (present(nrelh)) then + nrelh = -1 end if end subroutine optics_params diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index 730c0ed81c..17f6e93e2d 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -23,7 +23,7 @@ module refractive_aerosol_optics_mod real(r8), allocatable :: watervol(:,:) ! volume concentration of water in each mode (m3/kg) real(r8), allocatable :: wetvol(:,:) ! volume concentration of wet mode (m3/kg) - real(r8), allocatable :: cheb(:,:,:) ! chebychef polynomials + real(r8), allocatable :: cheb(:,:,:) ! chebychev polynomials real(r8), allocatable :: radsurf(:,:) ! aerosol surface mode radius real(r8), allocatable :: logradsurf(:,:) ! log(aerosol surface mode radius) @@ -43,7 +43,7 @@ module refractive_aerosol_optics_mod ! Dimension sizes in coefficient arrays used to parameterize aerosol radiative properties ! in terms of refractive index and wet radius - integer :: ncoef = -1 ! number of chebychef coeficients + integer :: ncoef = -1 ! number of chebychev coeficients integer :: prefr = -1 ! number of real refractive indices integer :: prefi = -1 ! number of imaginary refractive indices @@ -85,7 +85,7 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, type(refractive_aerosol_optics), pointer :: newobj integer :: ierr, icol, ilev, ispec, nspec - real(r8) :: vol(ncol) ! volume concentration of aerosol specie (m3/kg) + real(r8) :: vol(ncol) ! volume concentration of aerosol species (m3/kg) real(r8) :: dryvol(ncol) ! volume concentration of aerosol mode (m3/kg) real(r8) :: specdens ! species density (kg/m3) real(r8), pointer :: specmmr(:,:) ! species mass mixing ratio @@ -94,6 +94,8 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, real(r8) :: dgnumwet(ncol,nlev) ! aerosol wet number mode diameter (m) real(r8) :: qaerwat(ncol,nlev) ! aerosol water (g/g) + real(r8), parameter :: rh2odens = 1._r8/rhoh2o + allocate(newobj, stat=ierr) if (ierr/=0) then nullify(newobj) @@ -167,7 +169,7 @@ function constructor(aero_props, aero_state, ilist, ibin, ncol, nlev, nsw, nlw, vol(icol) = specmmr(icol,ilev)/specdens dryvol(icol) = dryvol(icol) + vol(icol) - newobj%watervol(icol,ilev) = qaerwat(icol,ilev)/rhoh2o + newobj%watervol(icol,ilev) = qaerwat(icol,ilev)*rh2odens newobj%wetvol(icol,ilev) = newobj%watervol(icol,ilev) + dryvol(icol) if (newobj%watervol(icol,ilev) < 0._r8) then newobj%watervol(icol,ilev) = 0._r8 From 54ebce566c0bb7b8f6a24e9c285fdd67c93db378 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 31 Jul 2023 11:29:20 -0600 Subject: [PATCH 22/61] r8 correction modified: src/utils/table_interp_mod.F90 --- src/utils/table_interp_mod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 index d5748ab88d..3571013455 100644 --- a/src/utils/table_interp_mod.F90 +++ b/src/utils/table_interp_mod.F90 @@ -167,7 +167,7 @@ pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) wghts(i)%ix1 = wghts(i)%ix2 - 1 wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xcols(i)) & /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) - wghts(i)%wt2 = 1._8 - wghts(i)%wt1 + wghts(i)%wt2 = 1._r8 - wghts(i)%wt1 end do end function table_interp_calcwghts From fa4a778bcc83a76768f636eb282120db6a9ee469 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 1 Aug 2023 13:58:26 -0600 Subject: [PATCH 23/61] merge in branch cam6_3_112_aeropts --- .../use_cases/2000_trop_strat_vbs_cam6.xml | 6 +- .../use_cases/2010_trop_strat_vbs_cam6.xml | 6 +- .../use_cases/hist_trop_strat_nudged_cam6.xml | 4 +- .../use_cases/hist_trop_strat_vbs_cam6.xml | 4 +- .../use_cases/hist_trop_strat_vbsext_cam6.xml | 6 +- .../hist_trop_strat_vbsfire_cam6.xml | 4 +- .../use_cases/sd_trop_strat2_cam6.xml | 6 +- .../use_cases/sd_trop_strat_vbs_cam6.xml | 4 +- .../use_cases/sd_waccm_tsmlt_cam6.xml | 4 +- .../use_cases/waccm_tsmlt_1850_cam6.xml | 4 +- .../use_cases/waccm_tsmlt_2000_cam6.xml | 4 +- .../use_cases/waccm_tsmlt_2010_cam6.xml | 4 +- .../use_cases/waccm_tsmlt_hist_cam6.xml | 4 +- .../testmods_dirs/cam/outfrq1s/shell_commands | 2 + .../testmods_dirs/cam/outfrq1s/user_nl_cam | 11 + .../testmods_dirs/cam/outfrq1s/user_nl_clm | 26 ++ .../cam/outfrq3s_mam_raddiags/shell_commands | 2 + .../cam/outfrq3s_mam_raddiags/user_nl_cam | 67 ++++ .../cam/outfrq3s_mam_raddiags/user_nl_clm | 27 ++ .../testmods_dirs/cam/outfrq9s/user_nl_cam | 1 + .../usermods_dirs/CMIP6_B1850/user_nl_cam | 80 ++-- .../CMIP6_B1850_WACCM/user_nl_cam | 8 +- .../usermods_dirs/CMIP6_BHIST/user_nl_cam | 4 +- .../CMIP6_BHIST_WACCM/user_nl_cam | 10 +- .../usermods_dirs/CMIP6_GENERIC/user_nl_cam | 4 +- src/physics/cam/modal_aer_opt.F90 | 368 ++++++++---------- src/utils/table_interp_mod.F90 | 192 +++++++++ 27 files changed, 579 insertions(+), 283 deletions(-) create mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands create mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam create mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm create mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands create mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam create mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm create mode 100644 src/utils/table_interp_mod.F90 diff --git a/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml index 0c7204fa5c..2ba0c53847 100644 --- a/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml @@ -151,7 +151,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -183,8 +183,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml index 5a1dbc0bf7..1000976390 100644 --- a/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml @@ -342,7 +342,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', 'CFC12', @@ -374,8 +374,8 @@ 'SAD_SULFC', 'SAD_TROP', 'SAD_AERO', 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', 'AODNIRstdn', - 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', 'AODNIRstdn', + 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3COCH3', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml index 0152cba659..ff2a92b3ef 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml @@ -212,8 +212,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml index 35c54956d9..f9ea8eb9eb 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml @@ -152,8 +152,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml index 8d8ff90bf9..38e1439ed0 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml @@ -46,7 +46,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', 'O3S', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'O3S', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -81,8 +81,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', diff --git a/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml b/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml index 2e14ccb9db..7219cf0322 100644 --- a/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml +++ b/bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml @@ -96,8 +96,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml b/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml index 8ef3f6903d..4075ad584c 100644 --- a/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml +++ b/bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml @@ -51,7 +51,7 @@ - 'CFC11STAR', 'AODDUST', 'AODDUST2', 'T', 'U', 'V', 'O3', 'OH', + 'CFC11STAR', 'AODDUST', 'AODDUST02', 'T', 'U', 'V', 'O3', 'OH', 'NO3', 'HO2', 'LNO_COL_PROD', 'NO2_CLXF', 'SFNO', 'SFNH3', 'BRO', 'CH3CL', 'CLO', 'CO2', 'HCL', 'HO2', 'HOCL', 'H2O', 'PHIS', 'Z3', 'BENZENE', 'C2H2', 'C2H4', 'C2H6', 'C3H8', 'CCL4', 'CFC11', 'CFC113', @@ -85,8 +85,8 @@ 'REFF_AERO', 'PDELDRY', 'RAD_ICE', 'RAD_LNAT', 'RAD_SULFC', 'H2SO4M_C', 'HNO3_GAS', 'HNO3_STS', 'HNO3_NAT', 'VEL_NAT2', 'NITROP_PD', 'NOX', 'NOY', 'CLOX', 'CLOY', 'BROX', 'BROY', 'TCLY', 'TOTH', 'MASS', 'TBRY', 'HCL_GAS', 'wet_deposition_NHx_as_N', 'wet_deposition_NOy_as_N', - 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdnMODE1', 'AODVISstdn', - 'AODNIRstdn', 'AODUVstdn', 'AODdnMODE2', 'AODdnMODE3', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODVISstdn', + 'HCL_GAS', 'dgnumwet1', 'dgnumwet2', 'dgnumwet3', 'ABSORB', 'AODVISdn', 'AODdn_aitken', 'AODVISstdn', + 'AODNIRstdn', 'AODUVstdn', 'AODdn_accum', 'AODdn_coarse', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODVISstdn', 'AODUVstdn', 'AODNIRstdn', 'AODNIRstdn', 'AODVISdn', 'AODUVdn', 'EXTINCTdn', 'EXTxASYMdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'WD_ALKNIT', 'WD_ALKOOH', 'WD_BENZOOH', 'WD_BRONO2', 'WD_BZOOH', 'WD_C2H5OH', 'WD_C2H5OOH', 'WD_C3H7OOH', 'WD_C6H5OOH', 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', diff --git a/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml b/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml index 2351b7d3df..2fe99cb0eb 100644 --- a/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml +++ b/bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml @@ -70,8 +70,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml b/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml index a95e41e322..8397165538 100644 --- a/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml +++ b/bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml @@ -68,8 +68,8 @@ 'AOA1SRC', 'AOA2SRC', 'NO2_CMXF' - 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', - 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', + 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', + 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', 'bc_c4SFWET', 'BENZENE', 'BENZO2', 'BENZOOH', 'BEPOMUC', 'BIGALD1', 'BIGALD2', 'BIGALD3', 'BIGALD4', 'BIGALD', 'BIGALK', 'BIGENE', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml index dec7c58de1..800b9b228a 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml @@ -75,8 +75,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml index b15bcd8b8d..3ad0c7db31 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml @@ -272,8 +272,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml index 82bc53d3c7..219083b1a4 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml @@ -172,8 +172,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml b/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml index b12c32010a..6ad0b14145 100644 --- a/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml @@ -68,8 +68,8 @@ 'so4_a1_CHMP','so4_a2_CHMP', 'SOAG0_CHMP', 'SOAG1_CHMP', 'SOAG2_CHMP', 'SOAG3_CHMP', 'SOAG4_CHMP', 'TOTH', 'TOT_CLD_VISTAU', 'TREFHTMN', 'TREFHTMX', 'TROP_P', 'TROP_T', 'TROP_Z', 'TTEND_TOT', 'TTGWORO', 'TTGWSDF', 'TTGWSDFORO', 'TTGWSKE', 'TTGWSKEORO', 'TS', 'TSMN:M', 'TSMX:X', 'BURDENBCdn', 'BURDENDUSTdn', 'BURDENPOMdn', 'BURDENSEASALTdn', 'BURDENSO4dn', 'BURDENSOAdn', - 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', - 'AODDUST2', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', + 'ABSORB', 'AODABSdn', 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', + 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'EXTINCTdn', 'EXTINCTNIRdn', 'EXTINCTUVdn', 'EXTxASYMdn', 'FLDSC', 'FLNR', 'FSNR', 'CME', 'CMFDQ', 'CMFMC','CMFMC_DP', 'SOLLD', 'SOLSD', 'SSAVIS', 'SST','TAQ', 'DCOCHM','DH2O2CHM', 'DHNO3CHM', 'DO3CHM', 'Dso4_a1CHM', 'Dso4_a2CHM', 'Dso4_a3CHM', diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands new file mode 100644 index 0000000000..eb40ad83e0 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands @@ -0,0 +1,2 @@ +./xmlchange ROF_NCPL=\$ATM_NCPL +./xmlchange GLC_NCPL=\$ATM_NCPL diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam new file mode 100644 index 0000000000..e72aa1a699 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam @@ -0,0 +1,11 @@ +mfilt=10,10,10,10,10,10,10,10,10,10 +ndens=1,1,1,1,1,1,1,1,1,1 +nhtfrq=1,1,1,1,1,1,1,1,1,1 +inithist='ENDOFRUN' +history_aero_optics = .true. +fincl2 = 'AODABSLW','TOTABSLW', 'EXTINCT', 'EXTINCTUV', 'EXTINCTNIR', 'AODTOTdn', + 'AODVIS', 'AODVISst', 'AODNIR', 'AODNIRst', 'AODABS', 'AODxASYM', + 'EXTINCTdn', 'EXTINCTUVdn', 'EXTINCTNIRdn', 'ABSORBdn', 'AODdn_accum', + 'AODdn_aitken', 'AODdn_coarse', 'AODdn_primary_carbon', +iradlw=1 +iradsw=1 diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm new file mode 100644 index 0000000000..b594bb42b7 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm @@ -0,0 +1,26 @@ +!---------------------------------------------------------------------------------- +! Users should add all user specific namelist changes below in the form of +! namelist_var = new_namelist_value +! +! Include namelist variables for drv_flds_in ONLY if -megan and/or -drydep options +! are set in the CLM_NAMELIST_OPTS env variable. +! +! EXCEPTIONS: +! Set use_cndv by the compset you use and the CLM_BLDNML_OPTS -dynamic_vegetation setting +! Set use_vichydro by the compset you use and the CLM_BLDNML_OPTS -vichydro setting +! Set use_cn by the compset you use and CLM_BLDNML_OPTS -bgc setting +! Set use_crop by the compset you use and CLM_BLDNML_OPTS -crop setting +! Set spinup_state by the CLM_BLDNML_OPTS -bgc_spinup setting +! Set irrigate by the CLM_BLDNML_OPTS -irrig setting +! Set dtime with L_NCPL option +! Set fatmlndfrc with LND_DOMAIN_PATH/LND_DOMAIN_FILE options +! Set finidat with RUN_REFCASE/RUN_REFDATE/RUN_REFTOD options for hybrid or branch cases +! (includes $inst_string for multi-ensemble cases) +! Set glc_grid with CISM_GRID option +! Set glc_smb with GLC_SMB option +! Set maxpatch_glcmec with GLC_NEC option +! Set glc_do_dynglacier with GLC_TWO_WAY_COUPLING env variable +!---------------------------------------------------------------------------------- +hist_nhtfrq = 1 +hist_mfilt = 10 +hist_ndens = 1 diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands new file mode 100644 index 0000000000..eb40ad83e0 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands @@ -0,0 +1,2 @@ +./xmlchange ROF_NCPL=\$ATM_NCPL +./xmlchange GLC_NCPL=\$ATM_NCPL diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam new file mode 100644 index 0000000000..2a1fa02972 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam @@ -0,0 +1,67 @@ +mfilt=1,1,1,1,1,1,1,1,1,1 +ndens=1,1,1,1,1,1,1,1,1,1 +nhtfrq=3,3,3,3,3,3,3,3,3,3 +inithist='ENDOFRUN' + +history_aero_optics = .true. + + mode_defs = + 'mam4_mode1:accum:=', 'A:num_a1:N:num_c1:num_mr:+', + 'A:so4_a1:N:so4_c1:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', + 'A:pom_a1:N:pom_c1:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc:+', + 'A:soa_a1:N:soa_c1:s-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', + 'A:bc_a1:N:bc_c1:black-c:$DIN_LOC_ROOT/atm/cam/physprops/bcpho_rrtmg_c100508.nc:+', + 'A:dst_a1:N:dst_c1:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', + 'A:ncl_a1:N:ncl_c1:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc', + 'mam4_mode2:aitken:=', 'A:num_a2:N:num_c2:num_mr:+', + 'A:so4_a2:N:so4_c2:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', + 'A:soa_a2:N:soa_c2:s-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', + 'A:ncl_a2:N:ncl_c2:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', + 'A:dst_a2:N:dst_c2:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc', + 'mam4_mode3:coarse:=', 'A:num_a3:N:num_c3:num_mr:+', + 'A:dst_a3:N:dst_c3:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', + 'A:ncl_a3:N:ncl_c3:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', + 'A:so4_a3:N:so4_c3:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc', + 'mam4_mode4:primary_carbon:=', 'A:num_a4:N:num_c4:num_mr:+', + 'A:pom_a4:N:pom_c4:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc:+', + 'A:bc_a4:N:bc_c4:black-c:$DIN_LOC_ROOT/atm/cam/physprops/bcpho_rrtmg_c100508.nc', + 'mam4_mode1_nobc:accum:=', 'A:num_a1:N:num_c1:num_mr:+', + 'A:so4_a1:N:so4_c1:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', + 'A:pom_a1:N:pom_c1:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc:+', + 'A:soa_a1:N:soa_c1:s-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', + 'A:dst_a1:N:dst_c1:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', + 'A:ncl_a1:N:ncl_c1:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc', + 'mam4_mode4_nobc:primary_carbon:=','A:num_a4:N:num_c4:num_mr:+', + 'A:pom_a4:N:pom_c4:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc' + + + rad_diag_1 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + + rad_diag_2 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', + + rad_diag_3 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', + 'M:mam4_mode2:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_aitkendust_c141106.nc', + + rad_diag_4 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', + + rad_diag_5 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', + 'M:mam4_mode4:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc' + + rad_diag_6 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', + 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', + 'M:mam4_mode4:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc' + + rad_diag_7 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', + 'M:mam4_mode2:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_aitkendust_c141106.nc', + 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', + 'M:mam4_mode4:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc' + +rad_diag_8 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', + 'M:mam4_mode1_nobc:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', + 'M:mam4_mode4_nobc:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm new file mode 100644 index 0000000000..f3ac27f1e6 --- /dev/null +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm @@ -0,0 +1,27 @@ +!---------------------------------------------------------------------------------- +! Users should add all user specific namelist changes below in the form of +! namelist_var = new_namelist_value +! +! Include namelist variables for drv_flds_in ONLY if -megan and/or -drydep options +! are set in the CLM_NAMELIST_OPTS env variable. +! +! EXCEPTIONS: +! Set use_cndv by the compset you use and the CLM_BLDNML_OPTS -dynamic_vegetation setting +! Set use_vichydro by the compset you use and the CLM_BLDNML_OPTS -vichydro setting +! Set use_cn by the compset you use and CLM_BLDNML_OPTS -bgc setting +! Set use_crop by the compset you use and CLM_BLDNML_OPTS -crop setting +! Set spinup_state by the CLM_BLDNML_OPTS -bgc_spinup setting +! Set irrigate by the CLM_BLDNML_OPTS -irrig setting +! Set dtime with L_NCPL option +! Set fatmlndfrc with LND_DOMAIN_PATH/LND_DOMAIN_FILE options +! Set finidat with RUN_REFCASE/RUN_REFDATE/RUN_REFTOD options for hybrid or branch cases +! (includes $inst_string for multi-ensemble cases) +! Set glc_grid with CISM_GRID option +! Set glc_smb with GLC_SMB option +! Set maxpatch_glcmec with GLC_NEC option +! Set glc_do_dynglacier with GLC_TWO_WAY_COUPLING env variable +!---------------------------------------------------------------------------------- +hist_nhtfrq = 3 +hist_mfilt = 1 +hist_ndens = 1 + diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam index 8482082dce..c5040bb153 100644 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam @@ -2,3 +2,4 @@ mfilt=1,1,1,1,1,1 ndens=1,1,1,1,1,1 nhtfrq=9,9,9,9,9,9 inithist='ENDOFRUN' +history_aero_optics = .true. diff --git a/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam b/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam index 45e18d1a6a..7958c8cd03 100644 --- a/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam @@ -1,64 +1,62 @@ -nhtfrq = 0, -24, -6, -3, -1, 1, -24,-120,-240 +nhtfrq = 0, -24, -6, -3, -1, 1, -24,-120,-240 -mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 +mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 ndens = 2, 2, 2, 2, 2, 2, 1, 1, 1 -fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST1:A', 'AODdnDUST2:A', - 'AODdnDUST3:A', 'AODdnMODE1:A', 'AODdnMODE2:A', 'AODdnMODE3:A', 'AODDUST2:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', - 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', - 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', - 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', - 'BURDENSOAdn:A', 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CLOX:A', 'CLOY:A', 'CME:A', 'CMFDQ:A', 'CMFMC:A', - 'CMFMC_DP:A', 'CO2:A', 'CONCLD:A', 'DF_H2O2:A', 'DF_H2SO4:A', - 'DF_SO2:A', 'dgnumwet1:A', 'dgnumwet2:A', 'dgnumwet3:A', 'DH2O2CHM:A', 'DMS:A', 'dry_deposition_NHx_as_N:A', - 'dry_deposition_NOy_as_N:A', 'Dso4_a1CHM:A', 'Dso4_a2CHM:A', 'Dso4_a3CHM:A', 'dst_a1:A', 'dst_a1DDF:A', 'dst_a1SFWET:A', 'dst_a2:A', 'dst_a2DDF:A', - 'dst_a2SFWET:A', 'dst_a3:A', 'dst_a3DDF:A', 'dst_a3SFWET:A', 'dst_c1:A', 'dst_c1DDF:A', 'dst_c1SFWET:A', 'dst_c2:A', 'dst_c2DDF:A', 'dst_c2SFWET:A', - 'dst_c3:A', 'dst_c3DDF:A', 'dst_c3SFWET:A', 'DTCORE:A', 'EVAPPREC:A', - 'EVAPQZM:A', 'EVAPTZM:A', 'EXTINCTdn:A', 'EXTINCTNIRdn:A', 'EXTINCTUVdn:A', 'EXTxASYMdn:A', 'FCTL:A', - 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FREQI:A', 'FREQL:A', 'FREQZM:A', 'FSDS:A', - 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNT:A', 'FSNTC:A', 'FSNTOAC:A', 'FSUTOA:A', - 'GS_SO2:A', 'H2O2:A', 'H2O:A', 'H2SO4:A', 'H2SO4M_C:A', 'H2SO4_sfnnuc1:A', +fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST01:A', 'AODdnDUST02:A', + 'AODdnDUST03:A', 'AODdn_aitken:A', 'AODdn_accum:A', 'AODdn_coarse:A', 'AODDUST02:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', + 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', + 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', + 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', + 'BURDENSOAdn:A', 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CLOX:A', 'CLOY:A', 'CME:A', 'CMFDQ:A', 'CMFMC:A', + 'CMFMC_DP:A', 'CO2:A', 'CONCLD:A', 'DF_H2O2:A', 'DF_H2SO4:A', + 'DF_SO2:A', 'dgnumwet1:A', 'dgnumwet2:A', 'dgnumwet3:A', 'DH2O2CHM:A', 'DMS:A', 'dry_deposition_NHx_as_N:A', + 'dry_deposition_NOy_as_N:A', 'Dso4_a1CHM:A', 'Dso4_a2CHM:A', 'Dso4_a3CHM:A', 'dst_a1:A', 'dst_a1DDF:A', 'dst_a1SFWET:A', 'dst_a2:A', 'dst_a2DDF:A', + 'dst_a2SFWET:A', 'dst_a3:A', 'dst_a3DDF:A', 'dst_a3SFWET:A', 'dst_c1:A', 'dst_c1DDF:A', 'dst_c1SFWET:A', 'dst_c2:A', 'dst_c2DDF:A', 'dst_c2SFWET:A', + 'dst_c3:A', 'dst_c3DDF:A', 'dst_c3SFWET:A', 'DTCORE:A', 'EVAPPREC:A', + 'EVAPQZM:A', 'EVAPTZM:A', 'EXTINCTdn:A', 'EXTINCTNIRdn:A', 'EXTINCTUVdn:A', 'EXTxASYMdn:A', 'FCTL:A', + 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FREQI:A', 'FREQL:A', 'FREQZM:A', 'FSDS:A', + 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNT:A', 'FSNTC:A', 'FSNTOAC:A', 'FSUTOA:A', + 'GS_SO2:A', 'H2O2:A', 'H2O:A', 'H2SO4:A', 'H2SO4M_C:A', 'H2SO4_sfnnuc1:A', 'HCL_GAS:A', 'HNO3_GAS:A', 'HNO3_NAT:A', 'HNO3_STS:A', 'HO2:A', 'ICEFRAC:A','jh2o2:A','KVH_CLUBB:A', 'LANDFRAC:A', 'LHFLX:A', 'MASS:A', - 'ncl_a1:A', 'ncl_a1DDF:A', 'ncl_a1SFWET:A', 'ncl_a2:A', 'ncl_a2DDF:A', 'ncl_a2SFWET:A', 'ncl_a3:A', 'ncl_a3DDF:A', 'ncl_a3SFWET:A', 'ncl_c1:A', + 'ncl_a1:A', 'ncl_a1DDF:A', 'ncl_a1SFWET:A', 'ncl_a2:A', 'ncl_a2DDF:A', 'ncl_a2SFWET:A', 'ncl_a3:A', 'ncl_a3DDF:A', 'ncl_a3SFWET:A', 'ncl_c1:A', 'ncl_c1DDF:A', 'ncl_c1SFWET:A', 'ncl_c2:A', 'ncl_c2DDF:A', 'ncl_c2SFWET:A', 'ncl_c3:A', 'ncl_c3DDF:A', 'ncl_c3SFWET:A', 'NITROP_PD:A', 'NO3:A', 'NOX:A', 'NOY:A', - 'num_a1:A', 'num_a1_CLXF:A', 'num_a1DDF:A', 'num_a2:A', 'num_a2_CLXF:A', 'num_a2DDF:A', 'num_a2_sfnnuc1:A', 'num_a3:A', 'num_a3DDF:A', 'num_a4:A', + 'num_a1:A', 'num_a1_CLXF:A', 'num_a1DDF:A', 'num_a2:A', 'num_a2_CLXF:A', 'num_a2DDF:A', 'num_a2_sfnnuc1:A', 'num_a3:A', 'num_a3DDF:A', 'num_a4:A', 'num_a4DDF:A', 'num_c1:A', 'num_c1DDF:A', 'num_c2:A', 'num_c2DDF:A', 'num_c3:A', 'num_c3DDF:A', 'num_c4:A', 'num_c4DDF:A', 'NUMLIQ:A', 'O3:A', - 'OH:A', 'OMEGA:A', 'OMEGAT:A', 'PBLH:A', 'PDELDRY:A', 'PHIS:A', 'pom_a1:A', 'pom_a1DDF:A', 'pom_a1SFWET:A', - 'pom_a4:A', 'pom_a4DDF:A', 'pom_a4SFWET:A', 'pom_c1:A', 'pom_c1DDF:A', 'pom_c1SFWET:A', 'pom_c4:A', 'pom_c4DDF:A', 'pom_c4SFWET:A', - 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'PTEQ:A', 'PTTEND:A', 'Q:A', 'QFLX:A', 'QRAIN:A', 'QREFHT:A', 'QRL:A', 'QRLC:A', 'QRS:A', + 'OH:A', 'OMEGA:A', 'OMEGAT:A', 'PBLH:A', 'PDELDRY:A', 'PHIS:A', 'pom_a1:A', 'pom_a1DDF:A', 'pom_a1SFWET:A', + 'pom_a4:A', 'pom_a4DDF:A', 'pom_a4SFWET:A', 'pom_c1:A', 'pom_c1DDF:A', 'pom_c1SFWET:A', 'pom_c4:A', 'pom_c4DDF:A', 'pom_c4SFWET:A', + 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'PTEQ:A', 'PTTEND:A', 'Q:A', 'QFLX:A', 'QRAIN:A', 'QREFHT:A', 'QRL:A', 'QRLC:A', 'QRS:A', 'QRSC:A', 'QSNOW:A', 'RAD_ICE:A', 'RAD_LNAT:A', 'RAD_SULFC:A', 'REFF_AERO:A', 'RELHUM:A', 'RHREFHT:A', 'SAD_AERO:A', 'SAD_ICE:A', 'SAD_LNAT:A', 'SAD_SULFC:A', 'SAD_TROP:A', 'SFbc_a4:A', - 'SFDMS:A', 'SFdst_a1:A', 'SFdst_a2:A', 'SFdst_a3:A', - 'SFncl_a1:A', 'SFncl_a2:A', 'SFncl_a3:A', 'SFnum_a1:A', 'SFnum_a2:A', - 'SFnum_a3:A', 'SFpom_a4:A', 'SFSO2:A', 'SFso4_a1:A', 'SFso4_a2:A', 'SHFLX:A', 'SO2:A', - 'SO2_CHML:A', 'SO2_CHMP:A', 'SO2_CLXF:A', 'SO2_XFRC:A', 'so4_a1:A', 'so4_a1_CHMP:A', 'so4_a1_CLXF:A', 'so4_a1DDF:A', 'so4_a1_sfgaex1:A', 'so4_a1SFWET:A', - 'so4_a2:A', 'so4_a2_CHMP:A', 'so4_a2_CLXF:A', 'so4_a2DDF:A', 'so4_a2_sfgaex1:A', 'so4_a2_sfnnuc1:A', 'so4_a2SFWET:A', 'so4_a3:A', - 'so4_a3DDF:A', 'so4_a3_sfgaex1:A', 'so4_a3SFWET:A', 'so4_c1:A', 'so4_c1AQH2SO4:A', 'so4_c1AQSO4:A', 'so4_c1DDF:A', 'so4_c1SFWET:A', 'so4_c2:A', 'so4_c2AQH2SO4:A', - 'so4_c2AQSO4:A', 'so4_c2DDF:A', 'so4_c2SFWET:A', 'so4_c3:A', 'so4_c3AQH2SO4:A', 'so4_c3AQSO4:A', 'so4_c3DDF:A', 'so4_c3SFWET:A', + 'SFDMS:A', 'SFdst_a1:A', 'SFdst_a2:A', 'SFdst_a3:A', + 'SFncl_a1:A', 'SFncl_a2:A', 'SFncl_a3:A', 'SFnum_a1:A', 'SFnum_a2:A', + 'SFnum_a3:A', 'SFpom_a4:A', 'SFSO2:A', 'SFso4_a1:A', 'SFso4_a2:A', 'SHFLX:A', 'SO2:A', + 'SO2_CHML:A', 'SO2_CHMP:A', 'SO2_CLXF:A', 'SO2_XFRC:A', 'so4_a1:A', 'so4_a1_CHMP:A', 'so4_a1_CLXF:A', 'so4_a1DDF:A', 'so4_a1_sfgaex1:A', 'so4_a1SFWET:A', + 'so4_a2:A', 'so4_a2_CHMP:A', 'so4_a2_CLXF:A', 'so4_a2DDF:A', 'so4_a2_sfgaex1:A', 'so4_a2_sfnnuc1:A', 'so4_a2SFWET:A', 'so4_a3:A', + 'so4_a3DDF:A', 'so4_a3_sfgaex1:A', 'so4_a3SFWET:A', 'so4_c1:A', 'so4_c1AQH2SO4:A', 'so4_c1AQSO4:A', 'so4_c1DDF:A', 'so4_c1SFWET:A', 'so4_c2:A', 'so4_c2AQH2SO4:A', + 'so4_c2AQSO4:A', 'so4_c2DDF:A', 'so4_c2SFWET:A', 'so4_c3:A', 'so4_c3AQH2SO4:A', 'so4_c3AQSO4:A', 'so4_c3DDF:A', 'so4_c3SFWET:A', 'SOLIN:A', 'SOLLD:A', 'SOLSD:A', 'SSAVIS:A', 'SST:A', 'T:A', 'TAQ:A', 'TAUBLJX:A', 'TAUBLJY:A', 'TAUGWX:A', 'TAUGWY:A', 'TAUX:A', 'TAUY:A', 'TBRY:A', 'TCLY:A', - 'TGCLDIWP:A', 'TGCLDLWP:A', 'TMDMS:A', 'TMQ:A', 'TMSO2:A', - 'TMso4_a1:A', 'TMso4_a2:A', 'TMso4_a3:A', 'TOT_CLD_VISTAU:A', 'TOTH:A', 'TREFHT:A', 'TREFHTMN:A', 'TREFHTMX:A', 'TROP_P:A', + 'TGCLDIWP:A', 'TGCLDLWP:A', 'TMDMS:A', 'TMQ:A', 'TMSO2:A', + 'TMso4_a1:A', 'TMso4_a2:A', 'TMso4_a3:A', 'TOT_CLD_VISTAU:A', 'TOTH:A', 'TREFHT:A', 'TREFHTMN:A', 'TREFHTMX:A', 'TROP_P:A', 'TROP_T:A', 'TROP_Z:A', 'TS:A', 'TSMN:M', 'TSMX:X', 'TTEND_TOT:A', 'TTGWORO:A', 'U10:A', 'U:A', 'UTGWORO:A', 'UU:A', 'V:A', 'VD01:A', 'VV:A', 'WD_H2O2:A', 'WD_H2SO4:A', 'WD_SO2:A', 'wet_deposition_NHx_as_N:A', 'wet_deposition_NOy_as_N:A', 'Z3:A', 'ZMDQ:A', 'ZMDT:A', 'ZMMTT:A', 'ZMMU:A' - ! 'dst_a1_SRF:A', 'dst_a3_SRF:A', 'AODABS:A', 'soa_a1:A', 'soa_a2:A', 'soa_c1:A', 'soa_c2:A', + ! 'dst_a1_SRF:A', 'dst_a3_SRF:A', 'AODABS:A', 'soa_a1:A', 'soa_a2:A', 'soa_c1:A', 'soa_c2:A', ! 'soa_a1SFWET:A', 'soa_a2SFWET:A', 'soa_c1SFWET:A', 'soa_c2SFWET:A', 'soa_a1DDF:A', 'soa_a2DDF:A', 'soa_c1DDF:A', 'soa_c2DDF:A', 'bc_a4_CLXF:A', ! 'pom_a4_CLXF:A', 'soa_a1_sfgaex1:A', 'soa_a2_sfgaex1:A', 'ADRAIN:A', 'ADSNOW:A', 'ANRAIN:A', 'ANSNOW:A', 'AQRAIN:A', 'AQSNOW:A', 'AQSO4_H2O2:A', - ! 'AQSO4_O3:A', 'AWNC:A', 'AWNI:A', 'CCN3:A', 'CLDHGH:A', 'CLDLOW:A', 'CLDMED:A', 'FICE:A', 'FREQR:A', 'FREQS:A', 'FSNTOA:A', 'FSNTOA:A', 'H2SO4_sfgaex1:A', - ! 'ICIMR:A', 'ICWMR:A', 'IWC:A', 'LWCF:A', 'PRECL:A', 'PRECSC:A', 'PRECSL:A', 'QT:A', 'RAINQM:A', 'RCM_CLUBB:A', 'RELVAR:A', 'RTP2_CLUBB:A', 'RTPTHLP_CLUBB:A', - ! 'SFSOAG:A', 'SNOWQM:A', 'SWCF:A', 'TGCLDCWP:A', 'UP2_CLUBB:A', 'UPWP_CLUBB:A', 'VP2_CLUBB:A', 'VPWP_CLUBB:A', 'VQ:A', 'VU:A', 'WP2_CLUBB:A', 'WP3_CLUBB:A', + ! 'AQSO4_O3:A', 'AWNC:A', 'AWNI:A', 'CCN3:A', 'CLDHGH:A', 'CLDLOW:A', 'CLDMED:A', 'FICE:A', 'FREQR:A', 'FREQS:A', 'FSNTOA:A', 'FSNTOA:A', 'H2SO4_sfgaex1:A', + ! 'ICIMR:A', 'ICWMR:A', 'IWC:A', 'LWCF:A', 'PRECL:A', 'PRECSC:A', 'PRECSL:A', 'QT:A', 'RAINQM:A', 'RCM_CLUBB:A', 'RELVAR:A', 'RTP2_CLUBB:A', 'RTPTHLP_CLUBB:A', + ! 'SFSOAG:A', 'SNOWQM:A', 'SWCF:A', 'TGCLDCWP:A', 'UP2_CLUBB:A', 'UPWP_CLUBB:A', 'VP2_CLUBB:A', 'VPWP_CLUBB:A', 'VQ:A', 'VU:A', 'WP2_CLUBB:A', 'WP3_CLUBB:A', ! 'WPRCP_CLUBB:A', 'WPRTP_CLUBB:A', 'WPTHLP_CLUBB:A', 'WPTHVP_CLUBB:A', 'WSUB:A', 'bc_a1_SRF:A', 'bc_a4_SRF:A', 'O3colAbove:A' fincl2 = 'ACTNL:A', 'ACTREL:A', 'BURDENBCdn:A', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', 'BURDENSOAdn:A', - 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CMFMC:A', 'CMFMC_DP:A', 'FCTL:A', 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', - 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FSDS:A', 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNTOA:A', 'FSNTOAC:A', 'LHFLX:A', 'MASS:A', 'OMEGA:A', - 'OMEGA500:A', 'PBLH:A', 'PDELDRY:A', 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'Q:A', 'QREFHT:A', 'QSNOW:A', 'RELHUM:A', 'RHREFHT:A', 'SHFLX:A', - 'SOLIN:A', 'SOLLD:A', 'SOLSD:A', 'T:A', 'T500:A', 'T700:A', 'T850:A', 'TAUBLJX:A', 'TAUBLJY:A', 'TAUGWX:A', 'TAUGWY:A', 'TAUX:A', 'TAUY:A', + 'CDNUMC:A', 'CLDICE:A', 'CLDLIQ:A', 'CLDTOT:A', 'CLOUD:A', 'CMFMC:A', 'CMFMC_DP:A', 'FCTL:A', 'FLDS:A', 'FLDSC:A', 'FLNR:A', 'FLNS:A', 'FLNSC:A', + 'FLNT:A', 'FLNTC:A', 'FLUT:A', 'FLUTC:A', 'FSDS:A', 'FSDSC:A', 'FSNR:A', 'FSNS:A', 'FSNSC:A', 'FSNTOA:A', 'FSNTOAC:A', 'LHFLX:A', 'MASS:A', 'OMEGA:A', + 'OMEGA500:A', 'PBLH:A', 'PDELDRY:A', 'PRECC:A', 'PRECT:A', 'PS:A', 'PSL:A', 'Q:A', 'QREFHT:A', 'QSNOW:A', 'RELHUM:A', 'RHREFHT:A', 'SHFLX:A', + 'SOLIN:A', 'SOLLD:A', 'SOLSD:A', 'T:A', 'T500:A', 'T700:A', 'T850:A', 'TAUBLJX:A', 'TAUBLJY:A', 'TAUGWX:A', 'TAUGWY:A', 'TAUX:A', 'TAUY:A', 'TGCLDIWP:A', 'TGCLDLWP:A', 'TMQ:A', 'TREFHT:A', 'TREFHTMN:A', 'TREFHTMX:A', 'TS:A', 'TSMN:M', 'TSMX:X', 'U:A', 'U10:A', 'UTGWORO:A', 'V:A', 'Z3:A', 'Z500:A' - - diff --git a/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam b/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam index 1b78d3bd33..033ae322f8 100644 --- a/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam @@ -2,7 +2,7 @@ nhtfrq = 0,-24,-6,-3,-1,1,-24,-120,-240 fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', - 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', + 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', @@ -20,7 +20,7 @@ fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AO 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', - 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', + 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOP', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', @@ -66,7 +66,7 @@ fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AO 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', - 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', + 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', @@ -94,7 +94,7 @@ fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AO 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCH3', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', - 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', + 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOP', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', diff --git a/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam b/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam index e9b1c0c5b0..9918e4e878 100644 --- a/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam @@ -5,8 +5,8 @@ mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 ndens = 2, 2, 2, 2, 2, 2, 1, 1, 1 -fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST1:A', 'AODdnDUST2:A', - 'AODdnDUST3:A', 'AODdnMODE1:A', 'AODdnMODE2:A', 'AODdnMODE3:A', 'AODDUST2:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', +fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST01:A', 'AODdnDUST02:A', + 'AODdnDUST03:A', 'AODdn_aitken:A', 'AODdn_accum:A', 'AODdn_coarse:A', 'AODDUST02:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', diff --git a/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam b/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam index 9a68109bc3..36485414c6 100644 --- a/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam @@ -1,8 +1,8 @@ - mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 + mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 nhtfrq = 0,-24,-6,-3,-1,1,-24,-120,-240 fincl1 = 'ABSORB', 'ACBZO2', 'ACTREL', 'ALKNIT', 'ALKO2', 'ALKOOH', 'AOA1', 'AOA_NH', 'AODABSdn', - 'AODBCdn', 'AODdnDUST1', 'AODdnDUST2', 'AODdnDUST3', 'AODdnMODE1', 'AODdnMODE2', 'AODdnMODE3', 'AODDUST2', 'AODDUST', + 'AODBCdn', 'AODdnDUST01', 'AODdnDUST02', 'AODdnDUST03', 'AODdn_aitken', 'AODdn_accum', 'AODdn_coarse', 'AODDUST02', 'AODDUST', 'AODNIRstdn', 'AODPOMdn', 'AODSO4dn', 'AODSOAdn', 'AODSSdn', 'AODUVdn', 'AODUVstdn', 'AODVIS', 'AODVISdn', 'AODVISstdn', 'AQ_SO2', 'AREA', 'AREI', 'AREL', 'bc_a1', 'bc_a1DDF', 'bc_a1SFWET', 'bc_a4', 'bc_a4_CLXF', 'bc_a4DDF', 'bc_a4SFWET', 'BCARY', 'bc_c1', 'bc_c1DDF', 'bc_c1SFWET', 'bc_c4', 'bc_c4DDF', @@ -20,7 +20,7 @@ 'DF_ALKNIT', 'DF_ALKOOH', 'DF_BENZOOH', 'DF_BZOOH', 'DF_C2H5OH', 'DF_C2H5OOH', 'DF_C3H7OOH', 'DF_C6H5OOH', 'DF_CH2O', 'DF_CH3CHO', 'DF_CH3CN', 'DF_CH3COCH3', 'DF_CH3COCHO', 'DF_CH3COOH', 'DF_CH3COOOH', 'DF_CH3OH', 'DF_CH3OOH', 'DF_CO', 'DF_EOOH', 'DF_GLYALD', 'DF_H2O2', 'DF_H2SO4', 'DF_HCN', 'DF_HCOOH', 'DF_HNO3', 'DF_HO2NO2', 'DF_HONITR', - 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOPNO3', 'DF_ISOPNOOH', 'DF_ISOPOOH', + 'DF_HPALD', 'DF_HYAC', 'DF_HYDRALD', 'DF_IEPOX', 'DF_ISOPNITA', 'DF_ISOPNITB', 'DF_ISOP', 'DF_ISOPNOOH', 'DF_ISOPOOH', 'DF_IVOC', 'DF_MACROOH', 'DF_MEKOOH', 'DF_MPAN', 'DF_NC4CH2OH', 'DF_NC4CHO', 'DF_NH3', 'DF_NH4', 'DF_NO2', 'DF_NO', 'DF_NOA', 'DF_NTERPOOH', 'DF_O3', 'DF_ONITR', 'DF_PAN', 'DF_PHENOOH', 'DF_POOH', 'DF_ROOH', 'DF_SO2', 'DF_SOAG0', 'DF_SOAG1', 'DF_SOAG2', 'DF_SOAG3', 'DF_SOAG4', 'DF_SVOC', 'DF_TERP2OOH', 'DF_TERPNIT', @@ -66,7 +66,7 @@ 'SFBIGENE', 'SFC2H2', 'SFC2H4', 'SFC2H5OH', 'SFC2H6', 'SFC3H6', 'SFC3H8', 'SFCH2O', 'SFCH3CHO', 'SFCH3CN', 'SFCH3COCH3', 'SFCH3COCHO', 'SFCH3COOH', 'SFCH3OH', 'SFCO', 'SFDMS', 'SFdst_a1', 'SFdst_a2', 'SFdst_a3', 'SFGLYALD', 'SFHCN', 'SFHCOOH', 'SFISOP', 'SFIVOC', 'SFMEK', 'SFMTERP', 'SFncl_a1', - 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO2', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', + 'SFncl_a2', 'SFncl_a3', 'SFNH3', 'SFNO', 'SFnum_a1', 'SFnum_a2', 'SFnum_a3', 'SFpom_a4', 'SFSO2', 'SFso4_a1', 'SFso4_a2', 'SFSVOC', 'SFTOLUENE', 'SFXYLENES', 'SHFLX', 'SO2', 'SO2_CHML', 'SO2_CHMP', 'SO2_CLXF', 'SO2_XFRC', 'SO3', 'so4_a1', 'so4_a1_CHMP', 'so4_a1_CLXF', 'so4_a1DDF', 'so4_a1_sfgaex1', 'so4_a1SFWET', 'so4_a2', 'so4_a2_CHMP', 'so4_a2_CLXF', 'so4_a2DDF', 'so4_a2_sfgaex1', 'so4_a2_sfnnuc1', 'so4_a2SFWET', 'so4_a3', @@ -94,7 +94,7 @@ 'WD_CH2O', 'WD_CH3CHO', 'WD_CH3CN', 'WD_CH3COCH3', 'WD_CH3COCHO', 'WD_CH3COOH', 'WD_CH3COOOH', 'WD_CH3OH', 'WD_CH3OOH', 'WD_CLONO2', 'WD_COF2', 'WD_COFCL', 'WD_EOOH', 'WD_GLYALD', 'WD_H2O2', 'WD_H2SO4', 'WD_HBR', 'WD_HCL', 'WD_HCN', 'WD_HCOOH', 'WD_HF', 'WD_HNO3', 'WD_HO2NO2', 'WD_HOBR', 'WD_HOCL', 'WD_HONITR', 'WD_HPALD', - 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOPNO3', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', + 'WD_HYAC', 'WD_HYDRALD', 'WD_IEPOX', 'WD_ISOPNITA', 'WD_ISOPNITB', 'WD_ISOP', 'WD_ISOPNOOH', 'WD_ISOPOOH', 'WD_IVOC', 'WD_MACR', 'WD_MACROOH', 'WD_MEKOOH', 'WD_MVK', 'WD_NC4CH2OH', 'WD_NC4CHO', 'WD_NDEP', 'WD_NH3', 'WD_NH4', 'WD_NHDEP', 'WD_NOA', 'WD_NTERPOOH', 'WD_ONITR', 'WD_PHENOOH', 'WD_POOH', 'WD_ROOH', 'WD_SO2', 'WD_SOAG0', 'WD_SOAG1', 'WD_SOAG2', 'WD_SOAG3', 'WD_SOAG4', 'WD_SVOC', 'WD_TERP2OOH', 'WD_TERPNIT', 'WD_TERPOOH', 'WD_TERPROD1', diff --git a/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam b/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam index 45e18d1a6a..9ae154c7bb 100644 --- a/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam +++ b/cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam @@ -4,8 +4,8 @@ mfilt = 1, 5, 20, 40, 120, 240, 365, 73, 365 ndens = 2, 2, 2, 2, 2, 2, 1, 1, 1 -fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST1:A', 'AODdnDUST2:A', - 'AODdnDUST3:A', 'AODdnMODE1:A', 'AODdnMODE2:A', 'AODdnMODE3:A', 'AODDUST2:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', +fincl1 = 'ABSORB:A', 'ACTREL:A', 'AODABSdn:A', 'AODBCdn:A', 'AODdnDUST01:A', 'AODdnDUST02:A', + 'AODdnDUST03:A', 'AODdn_aitken:A', 'AODdn_accum:A', 'AODdn_coarse:A', 'AODDUST02:A', 'AODDUST:A', 'AODNIRstdn:A', 'AODPOMdn:A', 'AODSO4dn:A', 'AODSOAdn:A', 'AODSSdn:A', 'AODUVdn:A', 'AODUVstdn:A', 'AODVIS:A', 'AODVISdn:A', 'AODVISstdn:A', 'AQ_SO2:A', 'AREA:A', 'AREI:A', 'AREL:A', 'bc_a1:A', 'bc_a1DDF:A', 'bc_a1SFWET:A', 'bc_a4:A', 'bc_a4DDF:A', 'bc_a4SFWET:A', 'bc_c1:A', 'bc_c1DDF:A', 'bc_c1SFWET:A', 'bc_c4:A', 'bc_c4DDF:A', 'bc_c4SFWET:A', 'BROX:A', 'BROY:A', 'BURDENBCdn', 'BURDENDUSTdn:A', 'BURDENPOMdn:A', 'BURDENSEASALTdn:A', 'BURDENSO4dn:A', diff --git a/src/physics/cam/modal_aer_opt.F90 b/src/physics/cam/modal_aer_opt.F90 index 5c95c17840..6de33e4807 100644 --- a/src/physics/cam/modal_aer_opt.F90 +++ b/src/physics/cam/modal_aer_opt.F90 @@ -15,7 +15,7 @@ module modal_aer_opt use spmd_utils, only: masterproc use ref_pres, only: top_lev => clim_modal_aero_top_lev use physconst, only: rhoh2o, rga, rair -use radconstants, only: nswbands, nlwbands, idx_sw_diag, idx_uv_diag, idx_nir_diag +use radconstants, only: nswbands, nlwbands, idx_sw_diag, idx_uv_diag, idx_nir_diag, get_lw_spectral_boundaries use rad_constituents, only: n_diag, rad_cnst_get_call_list, rad_cnst_get_info, rad_cnst_get_aer_mmr, & rad_cnst_get_aer_props, rad_cnst_get_mode_props use physics_types, only: physics_state @@ -33,13 +33,15 @@ module modal_aer_opt use modal_aero_wateruptake, only: modal_aero_wateruptake_dr use modal_aero_calcsize, only: modal_aero_calcsize_diag +use table_interp_mod, only: table_interp, table_interp_wghts, table_interp_calcwghts + implicit none private save public :: modal_aer_opt_readnl, modal_aer_opt_init, modal_aero_sw, modal_aero_lw - +real(r8), parameter :: rh2odens = 1._r8/rhoh2o character(len=*), parameter :: unset_str = 'UNSET' ! Namelist variables: @@ -59,6 +61,7 @@ module modal_aer_opt ! physics buffer indices integer :: dgnumwet_idx = -1 integer :: qaerwat_idx = -1 +integer :: lw10um_indx = -1 character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', & '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) @@ -115,7 +118,7 @@ subroutine modal_aer_opt_init() integer :: i, m real(r8) :: rmmin, rmmax ! min, max aerosol surface mode radius treated (m) character(len=256) :: locfile - + logical :: history_amwg ! output the variables used by the AMWG diag package logical :: history_aero_optics ! output aerosol optics diagnostics logical :: history_dust ! output dust diagnostics @@ -125,8 +128,11 @@ subroutine modal_aer_opt_init() integer :: errcode character(len=*), parameter :: routine='modal_aer_opt_init' - character(len=10) :: fldname + character(len=32) :: fldname character(len=128) :: lngname + character(len=32) :: modename + + real(r8) :: lwavlen_lo(nlwbands), lwavlen_hi(nlwbands) !---------------------------------------------------------------------------- @@ -185,6 +191,8 @@ subroutine modal_aer_opt_init() flag_xyfill=.true.) call addfld ('ABSORB', (/ 'lev' /), 'A','/m','Aerosol absorption, day only', & flag_xyfill=.true.) + call addfld ('AODTOT', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) + call addfld ('AODTOTdn', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts') call addfld ('AODVIS', horiz_only, 'A',' ','Aerosol optical depth 550 nm, day only', & flag_xyfill=.true.) call addfld ('AODVISst', horiz_only, 'A',' ','Stratospheric aerosol optical depth 550 nm, day only', & @@ -235,43 +243,47 @@ subroutine modal_aer_opt_init() do m = 1, nmodes - write(fldname,'(a,i1)') 'BURDEN', m - write(lngname,'(a,i1)') 'Aerosol burden, day only, mode ', m + call rad_cnst_get_info(0,m, mode_type=modename) + + write(fldname,'(a,i2.2)') 'BURDEN', m + write(lngname,'(a,i2.2)') 'Aerosol burden, day only, mode ', m call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODMODE', m - write(lngname,'(a,i1)') 'Aerosol optical depth, day only, 550 nm mode ', m + !write(fldname,'(a,i2.2)') 'AOD', m + fldname = 'AOD_'//trim(modename) + write(lngname,'(a,i2.2)') 'Aerosol optical depth, day only, 550 nm mode ', m call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODDUST', m - write(lngname,'(a,i1,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' + write(fldname,'(a,i2.2)') 'AODDUST', m + write(lngname,'(a,i2.2,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'BURDENdn', m - write(lngname,'(a,i1)') 'Aerosol burden, day night, mode ', m + write(fldname,'(a,i2.2)') 'BURDENdn', m + write(lngname,'(a,i2.2)') 'Aerosol burden, day night, mode ', m call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODdnMODE', m - write(lngname,'(a,i1)') 'Aerosol optical depth 550 nm, day night, mode ', m + !write(fldname,'(a,i2.2)') 'AODdn', m + fldname = 'AODdn_'//trim(modename) + write(lngname,'(a,i2.2)') 'Aerosol optical depth 550 nm, day night, mode ', m call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') endif - write(fldname,'(a,i1)') 'AODdnDUST', m - write(lngname,'(a,i1,a)') 'Aerosol optical depth 550 nm, day night, mode ',m,' from dust' + write(fldname,'(a,i2.2)') 'AODdnDUST', m + write(lngname,'(a,i2.2,a)') 'Aerosol optical depth 550 nm, day night, mode ',m,' from dust' call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) if (m>3 .and. history_aero_optics) then call add_default (fldname, 1, ' ') @@ -337,27 +349,23 @@ subroutine modal_aer_opt_init() call addfld ('SSAVISdn', horiz_only, 'A',' ', 'Aerosol single-scatter albedo, day night', & flag_xyfill=.true.) - - if (history_amwg) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') + if (history_amwg) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') call add_default ('AODDUST' , 1, ' ') call add_default ('AODVIS' , 1, ' ') end if - if (history_dust) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST2' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') + if (history_dust) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST02' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') end if - if (history_aero_optics) then - call add_default ('AODDUST1' , 1, ' ') - call add_default ('AODDUST3' , 1, ' ') + if (history_aero_optics) then + call add_default ('AODDUST01' , 1, ' ') + call add_default ('AODDUST03' , 1, ' ') call add_default ('ABSORB' , 1, ' ') - call add_default ('AODMODE1' , 1, ' ') - call add_default ('AODMODE2' , 1, ' ') - call add_default ('AODMODE3' , 1, ' ') call add_default ('AODVIS' , 1, ' ') call add_default ('AODUV' , 1, ' ') call add_default ('AODNIR' , 1, ' ') @@ -369,9 +377,9 @@ subroutine modal_aer_opt_init() call add_default ('AODSOA' , 1, ' ') call add_default ('AODBC' , 1, ' ') call add_default ('AODSS' , 1, ' ') - call add_default ('BURDEN1' , 1, ' ') - call add_default ('BURDEN2' , 1, ' ') - call add_default ('BURDEN3' , 1, ' ') + call add_default ('BURDEN01' , 1, ' ') + call add_default ('BURDEN02' , 1, ' ') + call add_default ('BURDEN03' , 1, ' ') call add_default ('BURDENDUST' , 1, ' ') call add_default ('BURDENSO4' , 1, ' ') call add_default ('BURDENPOM' , 1, ' ') @@ -382,13 +390,10 @@ subroutine modal_aer_opt_init() call add_default ('EXTINCT' , 1, ' ') call add_default ('AODxASYM' , 1, ' ') call add_default ('EXTxASYM' , 1, ' ') - - call add_default ('AODdnDUST1' , 1, ' ') - call add_default ('AODdnDUST3' , 1, ' ') + + call add_default ('AODdnDUST01' , 1, ' ') + call add_default ('AODdnDUST03' , 1, ' ') call add_default ('ABSORBdn' , 1, ' ') - call add_default ('AODdnMODE1' , 1, ' ') - call add_default ('AODdnMODE2' , 1, ' ') - call add_default ('AODdnMODE3' , 1, ' ') call add_default ('AODVISdn' , 1, ' ') call add_default ('AODUVdn' , 1, ' ') call add_default ('AODNIRdn' , 1, ' ') @@ -400,9 +405,9 @@ subroutine modal_aer_opt_init() call add_default ('AODSOAdn' , 1, ' ') call add_default ('AODBCdn' , 1, ' ') call add_default ('AODSSdn' , 1, ' ') - call add_default ('BURDENdn1' , 1, ' ') - call add_default ('BURDENdn2' , 1, ' ') - call add_default ('BURDENdn3' , 1, ' ') + call add_default ('BURDENdn01' , 1, ' ') + call add_default ('BURDENdn02' , 1, ' ') + call add_default ('BURDENdn03' , 1, ' ') call add_default ('BURDENDUSTdn' , 1, ' ') call add_default ('BURDENSO4dn' , 1, ' ') call add_default ('BURDENPOMdn' , 1, ' ') @@ -413,11 +418,11 @@ subroutine modal_aer_opt_init() call add_default ('EXTINCTdn' , 1, ' ') call add_default ('AODxASYMdn' , 1, ' ') call add_default ('EXTxASYMdn' , 1, ' ') - end if + end if do ilist = 1, n_diag if (call_list(ilist)) then - + call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','/m', & 'Aerosol extinction', flag_xyfill=.true.) call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','/m', & @@ -429,6 +434,11 @@ subroutine modal_aer_opt_init() call addfld ('AODABS'//diag(ilist), horiz_only, 'A',' ', & 'Aerosol absorption optical depth 550 nm', flag_xyfill=.true.) + call addfld ('AODTOT'//diag(ilist), horiz_only, 'A','1', & + 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) + call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1', & + 'Aerosol optical depth summed over all sw wavelenghts') + call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& 'Aerosol extinction 550 nm, day night', flag_xyfill=.true.) call addfld ('ABSORBdn'//diag(ilist), (/ 'lev' /), 'A','/m',& @@ -455,6 +465,17 @@ subroutine modal_aer_opt_init() end if end do + call get_lw_spectral_boundaries(lwavlen_lo, lwavlen_hi, units='um') + do i = 1,nlwbands + if ((lwavlen_lo(i)<=10._r8) .and. (lwavlen_hi(i)>=10._r8)) then + lw10um_indx = i + end if + end do + if (lw10um_indx>0) then + call addfld('AODABSLW', (/ 'lev' /), 'A','/m','Aerosol long-wave absorption optical depth at 10 microns') + end if + call addfld ('TOTABSLW', (/ 'lev' /), 'A',' ', 'LW Aero total abs') + end subroutine modal_aer_opt_init !=============================================================================== @@ -463,12 +484,12 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & tauxar, wa, ga, fa) ! calculates aerosol sw radiative properties - + use tropopause, only : tropopause_findChemTrop integer, intent(in) :: list_idx ! index of the climate or a diagnostic list type(physics_state), intent(in), target :: state ! state variables - + type(physics_buffer_desc), pointer :: pbuf(:) integer, intent(in) :: nnite ! number of night columns integer, intent(in) :: idxnite(nnite) ! local column indices of night columns @@ -494,7 +515,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: specdens ! species density (kg/m3) complex(r8), pointer :: specrefindex(:) ! species refractive index character*32 :: spectype ! species type - real(r8) :: hygro_aer ! + real(r8) :: hygro_aer ! real(r8), pointer :: dgnumwet(:,:) ! number mode wet diameter real(r8), pointer :: qaerwat(:,:) ! aerosol water (g/g) @@ -502,13 +523,13 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes - real(r8), pointer :: wetdens_m(:,:,:) ! - real(r8), pointer :: hygro_m(:,:,:) ! - real(r8), pointer :: dryvol_m(:,:,:) ! - real(r8), pointer :: dryrad_m(:,:,:) ! - real(r8), pointer :: drymass_m(:,:,:) ! - real(r8), pointer :: so4dryvol_m(:,:,:) ! - real(r8), pointer :: naer_m(:,:,:) ! + real(r8), pointer :: wetdens_m(:,:,:) ! + real(r8), pointer :: hygro_m(:,:,:) ! + real(r8), pointer :: dryvol_m(:,:,:) ! + real(r8), pointer :: dryrad_m(:,:,:) ! + real(r8), pointer :: drymass_m(:,:,:) ! + real(r8), pointer :: so4dryvol_m(:,:,:) ! + real(r8), pointer :: naer_m(:,:,:) ! real(r8) :: sigma_logr_aer ! geometric standard deviation of number distribution real(r8) :: radsurf(pcols,pver) ! aerosol surface mode radius @@ -529,9 +550,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: watervol(pcols) ! volume concentration of water in each mode (m3/kg) real(r8) :: wetvol(pcols) ! volume concentration of wet mode (m3/kg) - integer :: itab(pcols), jtab(pcols) - real(r8) :: ttab(pcols), utab(pcols) - real(r8) :: cext(pcols,ncoef), cabs(pcols,ncoef), casm(pcols,ncoef) + real(r8) :: cext(ncoef,pcols), cabs(ncoef,pcols), casm(ncoef,pcols) real(r8) :: pext(pcols) ! parameterized specific extinction (m2/kg) real(r8) :: specpext(pcols) ! specific extinction (m2/kg) real(r8) :: dopaer(pcols) ! aerosol optical depth in layer @@ -545,6 +564,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & real(r8) :: extinctuv(pcols,pver) real(r8) :: absorb(pcols,pver) real(r8) :: aodvis(pcols) ! extinction optical depth + real(r8) :: aodtot(pcols) ! extinction optical depth real(r8) :: aodvisst(pcols) ! stratospheric extinction optical depth real(r8) :: aodabs(pcols) ! absorption optical depth real(r8) :: asymvis(pcols) ! asymmetry factor * optical depth @@ -591,12 +611,17 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & character(len=32) :: outname + character(len=32) :: modename ! debug output integer, parameter :: nerrmax_dopaer=1000 integer :: nerr_dopaer = 0 real(r8) :: volf ! volume fraction of insoluble aerosol character(len=*), parameter :: subname = 'modal_aero_sw' + + type(table_interp_wghts) :: wghtsr(state%ncol) + type(table_interp_wghts) :: wghtsi(state%ncol) + !---------------------------------------------------------------------------- lchnk = state%lchnk @@ -621,6 +646,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & extinct(1:ncol,:) = 0.0_r8 absorb(1:ncol,:) = 0.0_r8 aodvis(1:ncol) = 0.0_r8 + aodtot(1:ncol) = 0.0_r8 aodvisst(1:ncol) = 0.0_r8 aodabs(1:ncol) = 0.0_r8 burdendust(:ncol) = 0.0_r8 @@ -633,7 +659,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & asymvis(1:ncol) = 0.0_r8 asymext(1:ncol,:) = 0.0_r8 - aodabsbc(:ncol) = 0.0_r8 + aodabsbc(:ncol) = 0.0_r8 dustaod(:ncol) = 0.0_r8 so4aod(:ncol) = 0.0_r8 pomaod(:ncol) = 0.0_r8 @@ -669,7 +695,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & call endrun('modal_aero_sw: allocation FAILURE: arrays for diagnostic calcs') end if call modal_aero_calcsize_diag(state, pbuf, list_idx, dgnumdry_m, hygro_m, & - dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) + dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) call modal_aero_wateruptake_dr(state, pbuf, list_idx, dgnumdry_m, dgnumwet_m, & qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & drymass_m, so4dryvol_m, naer_m) @@ -804,7 +830,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & end do ! species loop do i = 1, ncol - watervol(i) = qaerwat(i,k)/rhoh2o + watervol(i) = qaerwat(i,k)*rh2odens wetvol(i) = watervol(i) + dryvol(i) if (watervol(i) < 0._r8) then if (abs(watervol(i)) .gt. 1.e-1_r8*wetvol(i)) then @@ -818,24 +844,27 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! volume mixing crefin(i) = crefin(i) + watervol(i)*crefwsw(isw) crefin(i) = crefin(i)/max(wetvol(i),1.e-60_r8) - refr(i) = real(crefin(i)) - refi(i) = abs(aimag(crefin(i))) + + refr(i) = real(crefin(i)) + refr(i) = max(refr(i),minval(refrtabsw(:,isw))) + refr(i) = min(refr(i),maxval(refrtabsw(:,isw))) + + refi(i) = abs(aimag(crefin(i))) + refi(i) = max(refi(i),minval(refitabsw(:,isw))) + refi(i) = min(refi(i),maxval(refitabsw(:,isw))) + end do ! call t_startf('binterp') ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(extpsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, cext) - call binterp(abspsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, cabs) - call binterp(asmpsw(:,:,:,isw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtabsw(:,isw), refitabsw(:,isw), & - itab, jtab, ttab, utab, casm) + + wghtsr = table_interp_calcwghts( prefr, refrtabsw(:,isw), ncol, refr(:ncol) ) + wghtsi = table_interp_calcwghts( prefi, refitabsw(:,isw), ncol, refi(:ncol) ) + + cext(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, extpsw(:,:,:,isw)) + cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, abspsw(:,:,:,isw)) + casm(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, asmpsw(:,:,:,isw)) ! call t_stopf('binterp') @@ -843,9 +872,9 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & do i=1,ncol if (logradsurf(i,k) .le. xrmax) then - pext(i) = 0.5_r8*cext(i,1) + pext(i) = 0.5_r8*cext(1,i) do nc = 2, ncoef - pext(i) = pext(i) + cheb(nc,i,k)*cext(i,nc) + pext(i) = pext(i) + cheb(nc,i,k)*cext(nc,i) enddo pext(i) = exp(pext(i)) else @@ -855,20 +884,21 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! convert from m2/kg water to m2/kg aerosol specpext(i) = pext(i) pext(i) = pext(i)*wetvol(i)*rhoh2o - pabs(i) = 0.5_r8*cabs(i,1) - pasm(i) = 0.5_r8*casm(i,1) + pabs(i) = 0.5_r8*cabs(1,i) + pasm(i) = 0.5_r8*casm(1,i) do nc = 2, ncoef - pabs(i) = pabs(i) + cheb(nc,i,k)*cabs(i,nc) - pasm(i) = pasm(i) + cheb(nc,i,k)*casm(i,nc) + pabs(i) = pabs(i) + cheb(nc,i,k)*cabs(nc,i) + pasm(i) = pasm(i) + cheb(nc,i,k)*casm(nc,i) enddo pabs(i) = pabs(i)*wetvol(i)*rhoh2o pabs(i) = max(0._r8,pabs(i)) pabs(i) = min(pext(i),pabs(i)) - palb(i) = 1._r8-pabs(i)/max(pext(i),1.e-40_r8) palb(i) = 1._r8-pabs(i)/max(pext(i),1.e-40_r8) dopaer(i) = pext(i)*mass(i,k) + + aodtot(i) = aodtot(i) + dopaer(i) end do if (savaeruv) then @@ -941,7 +971,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & scatseasalt(i) = (scatseasalt(i) + scath2o*hygroseasalt(i)/sumhygro)/sumscat absseasalt(i) = (absseasalt(i) + absh2o*hygroseasalt(i)/sumhygro)/sumabs - + aodabsbc(i) = aodabsbc(i) + absbc(i)*dopaer(i)*(1.0_r8-palb(i)) aodc = (absdust(i)*(1.0_r8 - palb(i)) + palb(i)*scatdust(i))*dopaer(i) @@ -983,7 +1013,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! write(iulog,*) 'itab,jtab,ttab,utab=',itab(i),jtab(i),ttab(i),utab(i) write(iulog,*) 'k=', k, ' pext=', pext(i), ' specext=', specpext(i) write(iulog,*) 'wetvol=', wetvol(i), ' dryvol=', dryvol(i), ' watervol=', watervol(i) - ! write(iulog,*) 'cext=',(cext(i,l),l=1,ncoef) + ! write(iulog,*) 'cext=',(cext(l,i),l=1,ncoef) ! write(iulog,*) 'crefin=',crefin(i) write(iulog,*) 'nspec=', nspec ! write(iulog,*) 'cheb=', (cheb(nc,m,i,k),nc=2,ncoef) @@ -1023,28 +1053,32 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! be necessary to provide output for the rad_diag lists. if (list_idx == 0) then - write(outname,'(a,i1)') 'BURDENdn', m + call rad_cnst_get_info(0,m, mode_type=modename) + + write(outname,'(a,i2.2)') 'BURDENdn', m call outfld(trim(outname), burden, pcols, lchnk) - write(outname,'(a,i1)') 'AODdnMODE', m + !write(outname,'(a,i2.2)') 'AODdn', m + outname = 'AODdn_'//trim(modename) call outfld(trim(outname), aodmode, pcols, lchnk) - write(outname,'(a,i1)') 'AODdnDUST', m + write(outname,'(a,i2.2)') 'AODdnDUST', m call outfld(trim(outname), dustaodmode, pcols, lchnk) - + do i = 1, nnite burden(idxnite(i)) = fillvalue aodmode(idxnite(i)) = fillvalue dustaodmode(idxnite(i)) = fillvalue end do - write(outname,'(a,i1)') 'BURDEN', m + write(outname,'(a,i2.2)') 'BURDEN', m call outfld(trim(outname), burden, pcols, lchnk) - write(outname,'(a,i1)') 'AODMODE', m + !write(outname,'(a,i2.2)') 'AOD', m + outname = 'AOD_'//trim(modename) call outfld(trim(outname), aodmode, pcols, lchnk) - write(outname,'(a,i1)') 'AODDUST', m + write(outname,'(a,i2.2)') 'AODDUST', m call outfld(trim(outname), dustaodmode, pcols, lchnk) end if @@ -1071,12 +1105,14 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & call outfld('ABSORBdn'//diag(list_idx), absorb, pcols, lchnk) call outfld('AODVISdn'//diag(list_idx), aodvis, pcols, lchnk) call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) + call outfld('AODTOTdn'//diag(list_idx), aodtot, pcols, lchnk) call outfld('AODVISstdn'//diag(list_idx), aodvisst,pcols, lchnk) call outfld('EXTxASYMdn'//diag(list_idx), asymext, pcols, lchnk) - + do i = 1, nnite extinct(idxnite(i),:) = fillvalue absorb(idxnite(i),:) = fillvalue + aodtot(idxnite(i)) = fillvalue aodvis(idxnite(i)) = fillvalue aodabs(idxnite(i)) = fillvalue aodvisst(idxnite(i)) = fillvalue @@ -1086,6 +1122,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) call outfld('ABSORB'//diag(list_idx), absorb, pcols, lchnk) call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) + call outfld('AODTOT'//diag(list_idx), aodtot, pcols, lchnk) call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) call outfld('AODVISst'//diag(list_idx), aodvisst,pcols, lchnk) call outfld('EXTxASYM'//diag(list_idx), asymext, pcols, lchnk) @@ -1099,7 +1136,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ssavis(i) = 0.925_r8 endif end do - + call outfld('SSAVISdn', ssavis, pcols, lchnk) call outfld('AODxASYMdn', asymvis, pcols, lchnk) @@ -1192,7 +1229,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) integer, intent(in) :: list_idx ! index of the climate or a diagnostic list type(physics_state), intent(in), target :: state ! state variables - + type(physics_buffer_desc), pointer :: pbuf(:) real(r8), intent(out) :: tauxar(pcols,pver,nlwbands) ! layer absorption optical depth @@ -1211,7 +1248,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) real(r8), pointer :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes real(r8), pointer :: dgnumwet_m(:,:,:) ! number mode wet diameter for all modes real(r8), pointer :: qaerwat_m(:,:,:) ! aerosol water (g/g) for all modes - real(r8), pointer :: wetdens_m(:,:,:) ! + real(r8), pointer :: wetdens_m(:,:,:) ! real(r8), pointer :: hygro_m(:,:,:) ! real(r8), pointer :: dryvol_m(:,:,:) ! real(r8), pointer :: dryrad_m(:,:,:) ! @@ -1241,9 +1278,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) real(r8), pointer :: refitablw(:,:) ! table of imag refractive indices for aerosols real(r8), pointer :: absplw(:,:,:,:) ! specific absorption - integer :: itab(pcols), jtab(pcols) - real(r8) :: ttab(pcols), utab(pcols) - real(r8) :: cabs(pcols,ncoef) + real(r8) :: cabs(ncoef,pcols) real(r8) :: pabs(pcols) ! parameterized specific absorption (m2/kg) real(r8) :: dopaer(pcols) ! aerosol optical depth in layer @@ -1252,8 +1287,19 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) real(r8) :: volf ! volume fraction of insoluble aerosol character(len=*), parameter :: subname = 'modal_aero_lw' + + real(r8) :: radsurf(pcols,pver) ! aerosol surface mode radius + real(r8) :: logradsurf(pcols,pver) ! log(aerosol surface mode radius) + + real(r8) :: lwabs(pcols,pver) + + type(table_interp_wghts) :: wghtsr(state%ncol) + type(table_interp_wghts) :: wghtsi(state%ncol) + !---------------------------------------------------------------------------- + lwabs = 0.0_r8 + lchnk = state%lchnk ncol = state%ncol @@ -1283,7 +1329,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) call endrun('modal_aero_lw: allocation FAILURE: arrays for diagnostic calcs') end if call modal_aero_calcsize_diag(state, pbuf, list_idx, dgnumdry_m, hygro_m, & - dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) + dryvol_m, dryrad_m, drymass_m, so4dryvol_m, naer_m) call modal_aero_wateruptake_dr(state, pbuf, list_idx, dgnumdry_m, dgnumwet_m, & qaerwat_m, wetdens_m, hygro_m, dryvol_m, dryrad_m, & drymass_m, so4dryvol_m, naer_m) @@ -1302,26 +1348,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) call rad_cnst_get_info(list_idx, m, nspec=nspec) ! calc size parameter for all columns - ! this is the same calculation that's done in modal_size_parameters, but there - ! some intermediate results are saved and the chebyshev polynomials are stored - ! in a array with different index order. Could be unified. - do k = top_lev, pver - do i = 1, ncol - alnsg_amode = log( sigma_logr_aer ) - ! convert from number diameter to surface area - xrad(i) = log(0.5_r8*dgnumwet(i,k)) + 2.0_r8*alnsg_amode*alnsg_amode - ! normalize size parameter - xrad(i) = max(xrad(i), xrmin) - xrad(i) = min(xrad(i), xrmax) - xrad(i) = (2*xrad(i)-xrmax-xrmin)/(xrmax-xrmin) - ! chebyshev polynomials - cheby(1,i,k) = 1.0_r8 - cheby(2,i,k) = xrad(i) - do nc = 3, ncoef - cheby(nc,i,k) = 2.0_r8*xrad(i)*cheby(nc-1,i,k)-cheby(nc-2,i,k) - end do - end do - end do + call modal_size_parameters(ncol, sigma_logr_aer, dgnumwet, radsurf, logradsurf, cheby) do ilw = 1, nlwbands @@ -1345,7 +1372,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) end do do i = 1, ncol - watervol(i) = qaerwat(i,k)/rhoh2o + watervol(i) = qaerwat(i,k)*rh2odens wetvol(i) = watervol(i) + dryvol(i) if (watervol(i) < 0.0_r8) then if (abs(watervol(i)) .gt. 1.e-1_r8*wetvol(i)) then @@ -1357,26 +1384,34 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) crefin(i) = crefin(i) + watervol(i)*crefwlw(ilw) if (wetvol(i) > 1.e-40_r8) crefin(i) = crefin(i)/wetvol(i) + refr(i) = real(crefin(i)) + refr(i) = max(refr(i),minval(refrtablw(:,ilw))) + refr(i) = min(refr(i),maxval(refrtablw(:,ilw))) + refi(i) = aimag(crefin(i)) + refi(i) = max(refi(i),minval(refitablw(:,ilw))) + refi(i) = min(refi(i),maxval(refitablw(:,ilw))) + end do ! interpolate coefficients linear in refractive index - ! first call calcs itab,jtab,ttab,utab - itab(:ncol) = 0 - call binterp(absplw(:,:,:,ilw), ncol, ncoef, prefr, prefi, & - refr, refi, refrtablw(:,ilw), refitablw(:,ilw), & - itab, jtab, ttab, utab, cabs) + + wghtsr = table_interp_calcwghts( prefr, refrtablw(:,ilw), ncol, refr(:ncol) ) + wghtsi = table_interp_calcwghts( prefi, refitablw(:,ilw), ncol, refi(:ncol) ) + + cabs(:,:ncol)= table_interp( ncoef,ncol, prefr,prefi, wghtsr,wghtsi, absplw(:,:,:,ilw)) ! parameterized optical properties do i = 1, ncol - pabs(i) = 0.5_r8*cabs(i,1) + pabs(i) = 0.5_r8*cabs(1,i) do nc = 2, ncoef - pabs(i) = pabs(i) + cheby(nc,i,k)*cabs(i,nc) + pabs(i) = pabs(i) + cheby(nc,i,k)*cabs(nc,i) end do pabs(i) = pabs(i)*wetvol(i)*rhoh2o pabs(i) = max(0._r8,pabs(i)) dopaer(i) = pabs(i)*mass(i,k) + lwabs(i,k) = lwabs(i,k) + pabs(i) end do do i = 1, ncol @@ -1395,7 +1430,7 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) write(iulog,*) 'k=',k,' pabs=', pabs(i) write(iulog,*) 'wetvol=',wetvol(i),' dryvol=',dryvol(i), & ' watervol=',watervol(i) - write(iulog,*) 'cabs=', (cabs(i,l),l=1,ncoef) + write(iulog,*) 'cabs=', (cabs(l,i),l=1,ncoef) write(iulog,*) 'crefin=', crefin(i) write(iulog,*) 'nspec=', nspec do l = 1,nspec @@ -1440,6 +1475,12 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) deallocate(naer_m) end if + call outfld('TOTABSLW', lwabs(:,:), pcols, lchnk) + + if (lw10um_indx>0) then + call outfld('AODABSLW', tauxar(:,:,lw10um_indx), pcols, lchnk) + end if + end subroutine modal_aero_lw !=============================================================================== @@ -1547,75 +1588,4 @@ subroutine modal_size_parameters(ncol, sigma_logr_aer, dgnumwet, radsurf, lograd end subroutine modal_size_parameters -!=============================================================================== - - subroutine binterp(table,ncol,km,im,jm,x,y,xtab,ytab,ix,jy,t,u,out) - - ! bilinear interpolation of table - ! - implicit none - integer im,jm,km,ncol - real(r8) table(km,im,jm),xtab(im),ytab(jm),out(pcols,km) - integer i,ix(pcols),ip1,j,jy(pcols),jp1,k,ic,ip1m(pcols),jp1m(pcols),ixc,jyc - real(r8) x(pcols),dx,t(pcols),y(pcols),dy,u(pcols),tu(pcols),tuc(pcols),tcu(pcols),tcuc(pcols) - - if(ix(1).gt.0) go to 30 - if(im.gt.1)then - do ic=1,ncol - do i=1,im - if(x(ic).lt.xtab(i))go to 10 - enddo - 10 ix(ic)=max0(i-1,1) - ip1=min(ix(ic)+1,im) - dx=(xtab(ip1)-xtab(ix(ic))) - if(abs(dx).gt.1.e-20_r8)then - t(ic)=(x(ic)-xtab(ix(ic)))/dx - else - t(ic)=0._r8 - endif - end do - else - ix(:ncol)=1 - t(:ncol)=0._r8 - endif - if(jm.gt.1)then - do ic=1,ncol - do j=1,jm - if(y(ic).lt.ytab(j))go to 20 - enddo - 20 jy(ic)=max0(j-1,1) - jp1=min(jy(ic)+1,jm) - dy=(ytab(jp1)-ytab(jy(ic))) - if(abs(dy).gt.1.e-20_r8)then - u(ic)=(y(ic)-ytab(jy(ic)))/dy - else - u(ic)=0._r8 - endif - end do - else - jy(:ncol)=1 - u(:ncol)=0._r8 - endif - 30 continue - do ic=1,ncol - tu(ic)=t(ic)*u(ic) - tuc(ic)=t(ic)-tu(ic) - tcuc(ic)=1._r8-tuc(ic)-u(ic) - tcu(ic)=u(ic)-tu(ic) - jp1m(ic)=min(jy(ic)+1,jm) - ip1m(ic)=min(ix(ic)+1,im) - enddo - do ic=1,ncol - jyc=jy(ic) - ixc=ix(ic) - jp1=jp1m(ic) - ip1=ip1m(ic) - do k=1,km - out(ic,k) = tcuc(ic) * table(k,ixc,jyc) + tuc(ic) * table(k,ip1,jyc) + & - tu(ic) * table(k,ip1,jp1) + tcu(ic) * table(k,ixc,jp1) - end do - end do - return - end subroutine binterp - end module modal_aer_opt diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 new file mode 100644 index 0000000000..3571013455 --- /dev/null +++ b/src/utils/table_interp_mod.F90 @@ -0,0 +1,192 @@ +!---------------------------------------------------------------------------- +! Utility module used for interpolation of aerosol optics table +!---------------------------------------------------------------------------- +module table_interp_mod + use shr_kind_mod, only: r8=>shr_kind_r8 + + implicit none + + private + public :: table_interp + public :: table_interp_wghts + public :: table_interp_calcwghts + + ! overload the interpolation routines + interface table_interp + module procedure interp1d + module procedure interp2d + module procedure interp4d + end interface table_interp + + ! interpolation weights and indices + type :: table_interp_wghts + real(r8) :: wt1 + real(r8) :: wt2 + integer :: ix1 + integer :: ix2 + end type table_interp_wghts + +contains + + !-------------------------------------------------------------------------- + ! 1-D interpolation + !-------------------------------------------------------------------------- + pure function interp1d( ncol, nxs, xwghts, tbl ) result(res) + + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table size + real(r8), intent(in) :: tbl(nxs) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! interpolation weights and indices + + real(r8) :: res(ncol) + + integer :: i + + do i = 1,ncol + + res(i) = xwghts(i)%wt1*tbl(xwghts(i)%ix1) & + + xwghts(i)%wt2*tbl(xwghts(i)%ix2) + + end do + + end function interp1d + + !-------------------------------------------------------------------------- + ! 2-D interpolation + !-------------------------------------------------------------------------- + pure function interp2d( ncoef, ncol, nxs, nys, xwghts, ywghts, tbl ) result(res) + + integer, intent(in) :: ncoef ! number chebyshev coefficients + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table x-dimension size + integer, intent(in) :: nys ! table y-dimension size + real(r8), intent(in) :: tbl(ncoef,nxs,nys) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! x interpolation weights and indices + type(table_interp_wghts), intent(in) :: ywghts(ncol) ! y interpolation weights and indices + + real(r8) :: res(ncoef,ncol) + + real(r8) :: fx(ncoef,2) + + integer :: i + + do i = 1,ncol + + ! interp x dir + fx(:,1) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix1) & ! @ y1 + + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix1) + fx(:,2) = xwghts(i)%wt1*tbl(:,xwghts(i)%ix1,ywghts(i)%ix2) & ! @ y2 + + xwghts(i)%wt2*tbl(:,xwghts(i)%ix2,ywghts(i)%ix2) + + ! interp y dir + res(:,i) = ywghts(i)%wt1*fx(:,1) + ywghts(i)%wt2*fx(:,2) + + end do + + end function interp2d + + !-------------------------------------------------------------------------- + ! 4-D interpolation + !-------------------------------------------------------------------------- + pure function interp4d( ncol, nxs, nys, nzs, nts, xwghts, ywghts, zwghts, twghts, tbl ) result(res) + + integer, intent(in) :: ncol ! number of model columns + integer, intent(in) :: nxs ! table x-dimension size + integer, intent(in) :: nys ! table y-dimension size + integer, intent(in) :: nzs ! table z-dimension size + integer, intent(in) :: nts ! table t-dimension size + real(r8), intent(in) :: tbl(nxs,nys,nzs,nts) ! table values to be interpolated + type(table_interp_wghts), intent(in) :: xwghts(ncol) ! x interpolation weights and indices + type(table_interp_wghts), intent(in) :: ywghts(ncol) ! y interpolation weights and indices + type(table_interp_wghts), intent(in) :: zwghts(ncol) ! z interpolation weights and indices + type(table_interp_wghts), intent(in) :: twghts(ncol) ! t interpolation weights and indices + + real(r8) :: res(ncol) + + real(r8) :: fx(8) + real(r8) :: fy(4) + real(r8) :: fz(2) + + integer :: i + + do i = 1,ncol + + ! interp x dir + fx(1) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix1) & ! @ y1, z1, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix1) + fx(2) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix1) & ! @ y2, z1, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix1) + + fx(3) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix1) & ! @ y1, z2, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix1) + fx(4) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix1) & ! @ y2, z2, t1 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix1) + + fx(5) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix2) & ! @ y1, z1, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix1,twghts(i)%ix2) + fx(6) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix2) & ! @ y2, z1, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix1,twghts(i)%ix2) + + fx(7) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix2) & ! @ y1, z2, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix1,zwghts(i)%ix2,twghts(i)%ix2) + fx(8) = xwghts(i)%wt1*tbl(xwghts(i)%ix1,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix2) & ! @ y2, z2, t2 + + xwghts(i)%wt2*tbl(xwghts(i)%ix2,ywghts(i)%ix2,zwghts(i)%ix2,twghts(i)%ix2) + + ! interp y dir + fy(1) = ywghts(i)%wt1*fx(1) + ywghts(i)%wt2*fx(2) ! @ z1, t1 + fy(2) = ywghts(i)%wt1*fx(3) + ywghts(i)%wt2*fx(4) ! @ z2, t1 + fy(3) = ywghts(i)%wt1*fx(5) + ywghts(i)%wt2*fx(6) ! @ z1, t2 + fy(4) = ywghts(i)%wt1*fx(7) + ywghts(i)%wt2*fx(8) ! @ z2, t2 + + ! interp z dir + fz(1) = zwghts(i)%wt1*fy(1) + zwghts(i)%wt2*fy(2) ! @ t1 + fz(2) = zwghts(i)%wt1*fy(3) + zwghts(i)%wt2*fy(4) ! @ t2 + + ! interp t dir + res(i) = twghts(i)%wt1*fz(1) + twghts(i)%wt2*fz(2) + + end do + + end function interp4d + + !-------------------------------------------------------------------------- + !-------------------------------------------------------------------------- + pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) + + integer, intent(in) :: ngrid ! number of grid point values + real(r8), intent(in) :: xgrid(ngrid) ! grid point values + integer, intent(in) :: ncols ! number of model columns + real(r8), intent(in) :: xcols(ncols) ! values at the model columns + + type(table_interp_wghts) :: wghts(ncols) ! interpolations weights at the model columns + + integer :: i + + do i = 1,ncols + wghts(i)%ix2 = find_index(ngrid,xgrid,xcols(i)) + wghts(i)%ix1 = wghts(i)%ix2 - 1 + wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xcols(i)) & + /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) + wghts(i)%wt2 = 1._r8 - wghts(i)%wt1 + end do + + end function table_interp_calcwghts + + ! private methods + !-------------------------------------------------------------------------- + !-------------------------------------------------------------------------- + + pure function find_index( nvals, vals, vx ) result(ndx) + integer, intent(in) :: nvals + real(r8), intent(in) :: vals(nvals) + real(r8), intent(in) :: vx + + integer :: ndx + + find_ndx: do ndx = 1, nvals-1 + if (vals(ndx)>vx) exit find_ndx + end do find_ndx + + end function find_index + +end module table_interp_mod From f773283753c2e4d709670dfb2745152a7bc43788 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 1 Aug 2023 14:36:42 -0600 Subject: [PATCH 24/61] clean up modified: src/physics/cam/modal_aer_opt.F90 deleted: cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands deleted: cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam deleted: cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm deleted: cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands deleted: cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam deleted: cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm --- .../testmods_dirs/cam/outfrq1s/shell_commands | 2 - .../testmods_dirs/cam/outfrq1s/user_nl_cam | 11 --- .../testmods_dirs/cam/outfrq1s/user_nl_clm | 26 ------- .../cam/outfrq3s_mam_raddiags/shell_commands | 2 - .../cam/outfrq3s_mam_raddiags/user_nl_cam | 67 ------------------- .../cam/outfrq3s_mam_raddiags/user_nl_clm | 27 -------- src/physics/cam/modal_aer_opt.F90 | 13 ++-- 7 files changed, 6 insertions(+), 142 deletions(-) delete mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands delete mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam delete mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm delete mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands delete mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam delete mode 100644 cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands deleted file mode 100644 index eb40ad83e0..0000000000 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/shell_commands +++ /dev/null @@ -1,2 +0,0 @@ -./xmlchange ROF_NCPL=\$ATM_NCPL -./xmlchange GLC_NCPL=\$ATM_NCPL diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam deleted file mode 100644 index e72aa1a699..0000000000 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_cam +++ /dev/null @@ -1,11 +0,0 @@ -mfilt=10,10,10,10,10,10,10,10,10,10 -ndens=1,1,1,1,1,1,1,1,1,1 -nhtfrq=1,1,1,1,1,1,1,1,1,1 -inithist='ENDOFRUN' -history_aero_optics = .true. -fincl2 = 'AODABSLW','TOTABSLW', 'EXTINCT', 'EXTINCTUV', 'EXTINCTNIR', 'AODTOTdn', - 'AODVIS', 'AODVISst', 'AODNIR', 'AODNIRst', 'AODABS', 'AODxASYM', - 'EXTINCTdn', 'EXTINCTUVdn', 'EXTINCTNIRdn', 'ABSORBdn', 'AODdn_accum', - 'AODdn_aitken', 'AODdn_coarse', 'AODdn_primary_carbon', -iradlw=1 -iradsw=1 diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm b/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm deleted file mode 100644 index b594bb42b7..0000000000 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq1s/user_nl_clm +++ /dev/null @@ -1,26 +0,0 @@ -!---------------------------------------------------------------------------------- -! Users should add all user specific namelist changes below in the form of -! namelist_var = new_namelist_value -! -! Include namelist variables for drv_flds_in ONLY if -megan and/or -drydep options -! are set in the CLM_NAMELIST_OPTS env variable. -! -! EXCEPTIONS: -! Set use_cndv by the compset you use and the CLM_BLDNML_OPTS -dynamic_vegetation setting -! Set use_vichydro by the compset you use and the CLM_BLDNML_OPTS -vichydro setting -! Set use_cn by the compset you use and CLM_BLDNML_OPTS -bgc setting -! Set use_crop by the compset you use and CLM_BLDNML_OPTS -crop setting -! Set spinup_state by the CLM_BLDNML_OPTS -bgc_spinup setting -! Set irrigate by the CLM_BLDNML_OPTS -irrig setting -! Set dtime with L_NCPL option -! Set fatmlndfrc with LND_DOMAIN_PATH/LND_DOMAIN_FILE options -! Set finidat with RUN_REFCASE/RUN_REFDATE/RUN_REFTOD options for hybrid or branch cases -! (includes $inst_string for multi-ensemble cases) -! Set glc_grid with CISM_GRID option -! Set glc_smb with GLC_SMB option -! Set maxpatch_glcmec with GLC_NEC option -! Set glc_do_dynglacier with GLC_TWO_WAY_COUPLING env variable -!---------------------------------------------------------------------------------- -hist_nhtfrq = 1 -hist_mfilt = 10 -hist_ndens = 1 diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands deleted file mode 100644 index eb40ad83e0..0000000000 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/shell_commands +++ /dev/null @@ -1,2 +0,0 @@ -./xmlchange ROF_NCPL=\$ATM_NCPL -./xmlchange GLC_NCPL=\$ATM_NCPL diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam deleted file mode 100644 index 2a1fa02972..0000000000 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_cam +++ /dev/null @@ -1,67 +0,0 @@ -mfilt=1,1,1,1,1,1,1,1,1,1 -ndens=1,1,1,1,1,1,1,1,1,1 -nhtfrq=3,3,3,3,3,3,3,3,3,3 -inithist='ENDOFRUN' - -history_aero_optics = .true. - - mode_defs = - 'mam4_mode1:accum:=', 'A:num_a1:N:num_c1:num_mr:+', - 'A:so4_a1:N:so4_c1:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', - 'A:pom_a1:N:pom_c1:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc:+', - 'A:soa_a1:N:soa_c1:s-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', - 'A:bc_a1:N:bc_c1:black-c:$DIN_LOC_ROOT/atm/cam/physprops/bcpho_rrtmg_c100508.nc:+', - 'A:dst_a1:N:dst_c1:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', - 'A:ncl_a1:N:ncl_c1:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc', - 'mam4_mode2:aitken:=', 'A:num_a2:N:num_c2:num_mr:+', - 'A:so4_a2:N:so4_c2:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', - 'A:soa_a2:N:soa_c2:s-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', - 'A:ncl_a2:N:ncl_c2:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', - 'A:dst_a2:N:dst_c2:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc', - 'mam4_mode3:coarse:=', 'A:num_a3:N:num_c3:num_mr:+', - 'A:dst_a3:N:dst_c3:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', - 'A:ncl_a3:N:ncl_c3:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc:+', - 'A:so4_a3:N:so4_c3:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc', - 'mam4_mode4:primary_carbon:=', 'A:num_a4:N:num_c4:num_mr:+', - 'A:pom_a4:N:pom_c4:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc:+', - 'A:bc_a4:N:bc_c4:black-c:$DIN_LOC_ROOT/atm/cam/physprops/bcpho_rrtmg_c100508.nc', - 'mam4_mode1_nobc:accum:=', 'A:num_a1:N:num_c1:num_mr:+', - 'A:so4_a1:N:so4_c1:sulfate:$DIN_LOC_ROOT/atm/cam/physprops/sulfate_rrtmg_c080918.nc:+', - 'A:pom_a1:N:pom_c1:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc:+', - 'A:soa_a1:N:soa_c1:s-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocphi_rrtmg_c100508.nc:+', - 'A:dst_a1:N:dst_c1:dust:$DIN_LOC_ROOT/atm/cam/physprops/dust_aeronet_rrtmg_c141106.nc:+', - 'A:ncl_a1:N:ncl_c1:seasalt:$DIN_LOC_ROOT/atm/cam/physprops/ssam_rrtmg_c100508.nc', - 'mam4_mode4_nobc:primary_carbon:=','A:num_a4:N:num_c4:num_mr:+', - 'A:pom_a4:N:pom_c4:p-organic:$DIN_LOC_ROOT/atm/cam/physprops/ocpho_rrtmg_c130709.nc' - - - rad_diag_1 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - - rad_diag_2 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', - - rad_diag_3 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', - 'M:mam4_mode2:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_aitkendust_c141106.nc', - - rad_diag_4 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', - - rad_diag_5 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', - 'M:mam4_mode4:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc' - - rad_diag_6 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', - 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', - 'M:mam4_mode4:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc' - - rad_diag_7 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode1:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', - 'M:mam4_mode2:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode2_rrtmg_aitkendust_c141106.nc', - 'M:mam4_mode3:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode3_rrtmg_aeronetdust_sig1.2_dgnl.40_c150219.nc', - 'M:mam4_mode4:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc' - -rad_diag_8 = 'A:Q:H2O', 'N:O2:O2', 'N:CO2:CO2', 'N:ozone:O3', 'N:N2O:N2O', 'N:CH4:CH4', 'N:CFC11:CFC11', 'N:CFC12:CFC12', - 'M:mam4_mode1_nobc:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode1_rrtmg_aeronetdust_sig1.6_dgnh.48_c140304.nc', - 'M:mam4_mode4_nobc:$DIN_LOC_ROOT/atm/cam/physprops/mam4_mode4_rrtmg_c130628.nc', diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm b/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm deleted file mode 100644 index f3ac27f1e6..0000000000 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq3s_mam_raddiags/user_nl_clm +++ /dev/null @@ -1,27 +0,0 @@ -!---------------------------------------------------------------------------------- -! Users should add all user specific namelist changes below in the form of -! namelist_var = new_namelist_value -! -! Include namelist variables for drv_flds_in ONLY if -megan and/or -drydep options -! are set in the CLM_NAMELIST_OPTS env variable. -! -! EXCEPTIONS: -! Set use_cndv by the compset you use and the CLM_BLDNML_OPTS -dynamic_vegetation setting -! Set use_vichydro by the compset you use and the CLM_BLDNML_OPTS -vichydro setting -! Set use_cn by the compset you use and CLM_BLDNML_OPTS -bgc setting -! Set use_crop by the compset you use and CLM_BLDNML_OPTS -crop setting -! Set spinup_state by the CLM_BLDNML_OPTS -bgc_spinup setting -! Set irrigate by the CLM_BLDNML_OPTS -irrig setting -! Set dtime with L_NCPL option -! Set fatmlndfrc with LND_DOMAIN_PATH/LND_DOMAIN_FILE options -! Set finidat with RUN_REFCASE/RUN_REFDATE/RUN_REFTOD options for hybrid or branch cases -! (includes $inst_string for multi-ensemble cases) -! Set glc_grid with CISM_GRID option -! Set glc_smb with GLC_SMB option -! Set maxpatch_glcmec with GLC_NEC option -! Set glc_do_dynglacier with GLC_TWO_WAY_COUPLING env variable -!---------------------------------------------------------------------------------- -hist_nhtfrq = 3 -hist_mfilt = 1 -hist_ndens = 1 - diff --git a/src/physics/cam/modal_aer_opt.F90 b/src/physics/cam/modal_aer_opt.F90 index 6de33e4807..bbd9cb9ee5 100644 --- a/src/physics/cam/modal_aer_opt.F90 +++ b/src/physics/cam/modal_aer_opt.F90 @@ -191,8 +191,6 @@ subroutine modal_aer_opt_init() flag_xyfill=.true.) call addfld ('ABSORB', (/ 'lev' /), 'A','/m','Aerosol absorption, day only', & flag_xyfill=.true.) - call addfld ('AODTOT', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) - call addfld ('AODTOTdn', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts') call addfld ('AODVIS', horiz_only, 'A',' ','Aerosol optical depth 550 nm, day only', & flag_xyfill=.true.) call addfld ('AODVISst', horiz_only, 'A',' ','Stratospheric aerosol optical depth 550 nm, day only', & @@ -239,6 +237,11 @@ subroutine modal_aer_opt_init() call addfld ('EXTxASYMdn', (/ 'lev' /), 'A',' ','extinction 550 * asymmetry factor, day night', & flag_xyfill=.true.) + call addfld ('AODTOT', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts', & + flag_xyfill=.true.) + call addfld ('AODTOTdn', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts', & + flag_xyfill=.true.) + call rad_cnst_get_info(0, nmodes=nmodes) do m = 1, nmodes @@ -252,7 +255,6 @@ subroutine modal_aer_opt_init() call add_default (fldname, 1, ' ') endif - !write(fldname,'(a,i2.2)') 'AOD', m fldname = 'AOD_'//trim(modename) write(lngname,'(a,i2.2)') 'Aerosol optical depth, day only, 550 nm mode ', m call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) @@ -274,7 +276,6 @@ subroutine modal_aer_opt_init() call add_default (fldname, 1, ' ') endif - !write(fldname,'(a,i2.2)') 'AODdn', m fldname = 'AODdn_'//trim(modename) write(lngname,'(a,i2.2)') 'Aerosol optical depth 550 nm, day night, mode ', m call addfld (fldname, horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) @@ -437,7 +438,7 @@ subroutine modal_aer_opt_init() call addfld ('AODTOT'//diag(ilist), horiz_only, 'A','1', & 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1', & - 'Aerosol optical depth summed over all sw wavelenghts') + 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& 'Aerosol extinction 550 nm, day night', flag_xyfill=.true.) @@ -1058,7 +1059,6 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & write(outname,'(a,i2.2)') 'BURDENdn', m call outfld(trim(outname), burden, pcols, lchnk) - !write(outname,'(a,i2.2)') 'AODdn', m outname = 'AODdn_'//trim(modename) call outfld(trim(outname), aodmode, pcols, lchnk) @@ -1074,7 +1074,6 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & write(outname,'(a,i2.2)') 'BURDEN', m call outfld(trim(outname), burden, pcols, lchnk) - !write(outname,'(a,i2.2)') 'AOD', m outname = 'AOD_'//trim(modename) call outfld(trim(outname), aodmode, pcols, lchnk) From ddd90303849d2af921b505513250be23d97f5dc9 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 2 Aug 2023 10:08:01 -0600 Subject: [PATCH 25/61] do not extrapolate beyond the edges of the table modified: src/physics/cam/modal_aer_opt.F90 modified: src/utils/table_interp_mod.F90 --- src/physics/cam/modal_aer_opt.F90 | 18 ++---------------- src/utils/table_interp_mod.F90 | 19 ++++++++++++++++--- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/physics/cam/modal_aer_opt.F90 b/src/physics/cam/modal_aer_opt.F90 index bbd9cb9ee5..a42d87b87d 100644 --- a/src/physics/cam/modal_aer_opt.F90 +++ b/src/physics/cam/modal_aer_opt.F90 @@ -845,15 +845,8 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & ! volume mixing crefin(i) = crefin(i) + watervol(i)*crefwsw(isw) crefin(i) = crefin(i)/max(wetvol(i),1.e-60_r8) - - refr(i) = real(crefin(i)) - refr(i) = max(refr(i),minval(refrtabsw(:,isw))) - refr(i) = min(refr(i),maxval(refrtabsw(:,isw))) - - refi(i) = abs(aimag(crefin(i))) - refi(i) = max(refi(i),minval(refitabsw(:,isw))) - refi(i) = min(refi(i),maxval(refitabsw(:,isw))) - + refr(i) = real(crefin(i)) + refi(i) = abs(aimag(crefin(i))) end do ! call t_startf('binterp') @@ -1383,15 +1376,8 @@ subroutine modal_aero_lw(list_idx, state, pbuf, tauxar) crefin(i) = crefin(i) + watervol(i)*crefwlw(ilw) if (wetvol(i) > 1.e-40_r8) crefin(i) = crefin(i)/wetvol(i) - refr(i) = real(crefin(i)) - refr(i) = max(refr(i),minval(refrtablw(:,ilw))) - refr(i) = min(refr(i),maxval(refrtablw(:,ilw))) - refi(i) = aimag(crefin(i)) - refi(i) = max(refi(i),minval(refitablw(:,ilw))) - refi(i) = min(refi(i),maxval(refitablw(:,ilw))) - end do ! interpolate coefficients linear in refractive index diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 index 3571013455..776ef2c15c 100644 --- a/src/utils/table_interp_mod.F90 +++ b/src/utils/table_interp_mod.F90 @@ -1,5 +1,7 @@ !---------------------------------------------------------------------------- ! Utility module used for interpolation of aerosol optics table +! NOTE: Results will be set to table edges for interpolations beyond +! the edges -- no extropolations !---------------------------------------------------------------------------- module table_interp_mod use shr_kind_mod, only: r8=>shr_kind_r8 @@ -161,11 +163,22 @@ pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) type(table_interp_wghts) :: wghts(ncols) ! interpolations weights at the model columns integer :: i + real(r8) :: xs(ncols) + + xs(:) = xcols(:) + + ! do not extrapolate beyond the edges of the table + where(xs < xgrid(1)) + xs = xgrid(1) + end where + where(xs > xgrid(ngrid)) + xs = xgrid(ngrid) + end where do i = 1,ncols - wghts(i)%ix2 = find_index(ngrid,xgrid,xcols(i)) + wghts(i)%ix2 = find_index(ngrid,xgrid,xs(i)) wghts(i)%ix1 = wghts(i)%ix2 - 1 - wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xcols(i)) & + wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xs(i)) & /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) wghts(i)%wt2 = 1._r8 - wghts(i)%wt1 end do @@ -183,7 +196,7 @@ pure function find_index( nvals, vals, vx ) result(ndx) integer :: ndx - find_ndx: do ndx = 1, nvals-1 + find_ndx: do ndx = 2, nvals-1 if (vals(ndx)>vx) exit find_ndx end do find_ndx From cd63ce68752e667dfbc41e2f487414f81ccf7b4b Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 2 Aug 2023 10:09:51 -0600 Subject: [PATCH 26/61] do not extrapolate beyond the edges of the table modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 modified: src/utils/table_interp_mod.F90 --- .../aerosol/refractive_aerosol_optics_mod.F90 | 12 ------------ src/utils/table_interp_mod.F90 | 19 ++++++++++++++++--- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index 17f6e93e2d..d4827d3db7 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -215,15 +215,8 @@ subroutine sw_props(self, ncol, ilev, iwav, pext, pabs, palb, pasm) do icol = 1, ncol crefin(icol) = crefin(icol) + self%watervol(icol,ilev)*self%crefwsw(iwav) crefin(icol) = crefin(icol)/max(self%wetvol(icol,ilev),1.e-60_r8) - refr(icol) = real(crefin(icol)) - refr(icol) = max(refr(icol),minval(self%refrtabsw(:,iwav))) - refr(icol) = min(refr(icol),maxval(self%refrtabsw(:,iwav))) - refi(icol) = abs(aimag(crefin(icol))) - refi(icol) = max(refi(icol),minval(self%refitabsw(:,iwav))) - refi(icol) = min(refi(icol),maxval(self%refitabsw(:,iwav))) - end do ! interpolate coefficients linear in refractive index @@ -295,12 +288,7 @@ subroutine lw_props(self, ncol, ilev, iwav, pabs) end if refr(icol) = real(crefin(icol)) - refr(icol) = max(refr(icol),minval(self%refrtablw(:,iwav))) - refr(icol) = min(refr(icol),maxval(self%refrtablw(:,iwav))) - refi(icol) = aimag(crefin(icol)) - refi(icol) = max(refi(icol),minval(self%refitablw(:,iwav))) - refi(icol) = min(refi(icol),maxval(self%refitablw(:,iwav))) end do diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 index 3571013455..776ef2c15c 100644 --- a/src/utils/table_interp_mod.F90 +++ b/src/utils/table_interp_mod.F90 @@ -1,5 +1,7 @@ !---------------------------------------------------------------------------- ! Utility module used for interpolation of aerosol optics table +! NOTE: Results will be set to table edges for interpolations beyond +! the edges -- no extropolations !---------------------------------------------------------------------------- module table_interp_mod use shr_kind_mod, only: r8=>shr_kind_r8 @@ -161,11 +163,22 @@ pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) type(table_interp_wghts) :: wghts(ncols) ! interpolations weights at the model columns integer :: i + real(r8) :: xs(ncols) + + xs(:) = xcols(:) + + ! do not extrapolate beyond the edges of the table + where(xs < xgrid(1)) + xs = xgrid(1) + end where + where(xs > xgrid(ngrid)) + xs = xgrid(ngrid) + end where do i = 1,ncols - wghts(i)%ix2 = find_index(ngrid,xgrid,xcols(i)) + wghts(i)%ix2 = find_index(ngrid,xgrid,xs(i)) wghts(i)%ix1 = wghts(i)%ix2 - 1 - wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xcols(i)) & + wghts(i)%wt1 = (xgrid(wghts(i)%ix2)-xs(i)) & /(xgrid(wghts(i)%ix2)-xgrid(wghts(i)%ix1)) wghts(i)%wt2 = 1._r8 - wghts(i)%wt1 end do @@ -183,7 +196,7 @@ pure function find_index( nvals, vals, vx ) result(ndx) integer :: ndx - find_ndx: do ndx = 1, nvals-1 + find_ndx: do ndx = 2, nvals-1 if (vals(ndx)>vx) exit find_ndx end do find_ndx From d4a5cdf7ea334df43944367402f1d4dc170cd4a3 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 2 Aug 2023 12:43:09 -0600 Subject: [PATCH 27/61] revert change to outfrq9s/user_nl_cam --- cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam | 1 - 1 file changed, 1 deletion(-) diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam index c5040bb153..8482082dce 100644 --- a/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam +++ b/cime_config/testdefs/testmods_dirs/cam/outfrq9s/user_nl_cam @@ -2,4 +2,3 @@ mfilt=1,1,1,1,1,1 ndens=1,1,1,1,1,1 nhtfrq=9,9,9,9,9,9 inithist='ENDOFRUN' -history_aero_optics = .true. From d32706c26f0c996354e0b5577cf9af0f9fc82228 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 2 Aug 2023 13:12:53 -0600 Subject: [PATCH 28/61] ChangeLog draft --- doc/ChangeLog | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index 91d25fb0c9..33c0efa909 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,114 @@ =============================================================== +Tag name: +Originator(s): fvitt +Date: +One-line Summary: Aerosol optics updates +Github PR URL: + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + +Generalization of the aerosol optics has resulted in answer changes. Here these answer changing +code modifications (in modal_aer_opt) are merged in separately which are as follows: + - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) + - use rh2odens parameter -- answer changing (roundoff) + - use model_size_parameters subroutine in modal_aero_lw rather than + using separate code block to compute the chebychev parameters -- answer changing (roundoff) + +Updates to aerosol optics diagnostics: + - generalize history field names that will work for many bins used in a sectional aerosol model + - add AODTOT SW diagnostic + - add AODABSLW (at 10 microns) and TOTABSLW diagnostics + +Change in results are near roundoff level + +closes #865 + +Describe any changes made to build system: + +Describe any changes made to the namelist: + +List any changes to the defaults for the boundary datasets: + +Describe any substantial timing or memory changes: + +Code reviewed by: + +List all files eliminated: + +List all files added and what they do: +A src/utils/table_interp_mod.F90 + - utility module for interpolation of aerosol optics tables + +List all existing files that have been modified, and describe the changes: + +M src/physics/cam/modal_aer_opt.F90 + - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) + - use rh2odens parameter -- answer changing (roundoff) + - use model_size_parameters subroutine in modal_aero_lw rather than + using separate code block to compute the chebychev parameters -- answer changing (roundoff) + - generalize history field names that will work for many bins used in a sectional aerosol model + - add AODTOT SW diagnostic + - add AODABSLW (at 10 microns) and TOTABSLW diagnostics + +M bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbsext_cam6.xml +M bld/namelist_files/use_cases/hist_trop_strat_vbsfire_cam6.xml +M bld/namelist_files/use_cases/sd_trop_strat2_cam6.xml +M bld/namelist_files/use_cases/sd_trop_strat_vbs_cam6.xml +M bld/namelist_files/use_cases/sd_waccm_tsmlt_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_1850_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_2000_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_2010_cam6.xml +M bld/namelist_files/use_cases/waccm_tsmlt_hist_cam6.xml +M cime_config/usermods_dirs/CMIP6_B1850/user_nl_cam +M cime_config/usermods_dirs/CMIP6_B1850_WACCM/user_nl_cam +M cime_config/usermods_dirs/CMIP6_BHIST/user_nl_cam +M cime_config/usermods_dirs/CMIP6_BHIST_WACCM/user_nl_cam +M cime_config/usermods_dirs/CMIP6_GENERIC/user_nl_cam + - adjust history field names + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + +izumi/nag/aux_cam: + +izumi/gnu/aux_cam: + +CAM tag used for the baseline comparison tests if different than previous +tag: + +Summarize any changes to answers, i.e., +- what code configurations: +- what platforms/compilers: +- nature of change (roundoff; larger than roundoff but same climate; new + climate): + +If bitwise differences were observed, how did you show they were no worse +than roundoff? + +If this tag changes climate describe the run(s) done to evaluate the new +climate in enough detail that it(they) could be reproduced, i.e., +- source tag (all code used must be in the repository): +- platform/compilers: +- configure commandline: +- build-namelist command (or complete namelist): +- MSS location of output: + +MSS location of control simulations used to validate new climate: + +URL for AMWG diagnostics output used to validate new climate: + +=============================================================== +=============================================================== + Tag name: cam6_3_120 Originator(s): fvitt Date: 28 Jul 2023 From 5c1b1378679a675507259dd8feec8f438e5dc2a6 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 2 Aug 2023 16:52:21 -0600 Subject: [PATCH 29/61] add stub subroutine get_lw_spectral_boundaries for building simple models modified: doc/ChangeLog modified: src/physics/simple/radconstants.F90 --- doc/ChangeLog | 25 +++++++++++++------------ src/physics/simple/radconstants.F90 | 12 ++++++++++++ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 33c0efa909..c98997ae5e 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -8,21 +8,19 @@ Github PR URL: Purpose of changes (include the issue number and title text for each relevant GitHub issue): -Generalization of the aerosol optics has resulted in answer changes. Here these answer changing -code modifications (in modal_aer_opt) are merged in separately which are as follows: - - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) - - use rh2odens parameter -- answer changing (roundoff) - - use model_size_parameters subroutine in modal_aero_lw rather than + Generalization of the aerosol optics has resulted in answer changes. Here these answer changing + code modifications (in modal_aer_opt) are merged in separately which are as follows: + - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) + - use rh2odens parameter -- answer changing (roundoff) + - use model_size_parameters subroutine in modal_aero_lw rather than using separate code block to compute the chebychev parameters -- answer changing (roundoff) -Updates to aerosol optics diagnostics: - - generalize history field names that will work for many bins used in a sectional aerosol model - - add AODTOT SW diagnostic - - add AODABSLW (at 10 microns) and TOTABSLW diagnostics - -Change in results are near roundoff level + Updates to aerosol optics diagnostics: + - generalize history field names that will work for many bins used in a sectional aerosol model + - add AODTOT SW diagnostic + - add AODABSLW (at 10 microns) and TOTABSLW diagnostics -closes #865 + Change in results are near roundoff level Describe any changes made to build system: @@ -51,6 +49,9 @@ M src/physics/cam/modal_aer_opt.F90 - add AODTOT SW diagnostic - add AODABSLW (at 10 microns) and TOTABSLW diagnostics +M src/physics/simple/radconstants.F90 + - add stub subroutine get_lw_spectral_boundaries for building simple models + M bld/namelist_files/use_cases/2000_trop_strat_vbs_cam6.xml M bld/namelist_files/use_cases/2010_trop_strat_vbs_cam6.xml M bld/namelist_files/use_cases/hist_trop_strat_nudged_cam6.xml diff --git a/src/physics/simple/radconstants.F90 b/src/physics/simple/radconstants.F90 index 0649a6f730..b69fac1552 100644 --- a/src/physics/simple/radconstants.F90 +++ b/src/physics/simple/radconstants.F90 @@ -19,6 +19,7 @@ module radconstants integer, parameter, public :: ot_length = 32 public :: rad_gas_index +public :: get_lw_spectral_boundaries integer, public, parameter :: gasnamelength = 1 integer, public, parameter :: nradgas = 1 @@ -37,4 +38,15 @@ integer function rad_gas_index(gasname) end function rad_gas_index +!------------------------------------------------------------------------------ +subroutine get_lw_spectral_boundaries(low_boundaries, high_boundaries, units) + ! stub should not be called + + real(r8), intent(out) :: low_boundaries(nlwbands), high_boundaries(nlwbands) + character(*), intent(in) :: units ! requested units + + call endrun('get_lw_spectral_boundaries: ERROR: this is a stub') + +end subroutine get_lw_spectral_boundaries + end module radconstants From 3618e7e5fd720c707cad5e906af2bda1992adb99 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 3 Aug 2023 07:49:16 -0600 Subject: [PATCH 30/61] improve docs modified: doc/ChangeLog modified: src/utils/table_interp_mod.F90 --- doc/ChangeLog | 16 +++++++++------- src/utils/table_interp_mod.F90 | 19 ++++++++++++++----- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index c98997ae5e..1204ded9ff 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -4,21 +4,23 @@ Tag name: Originator(s): fvitt Date: One-line Summary: Aerosol optics updates -Github PR URL: +Github PR URL: https://github.com/ESCOMP/CAM/pull/868 Purpose of changes (include the issue number and title text for each relevant GitHub issue): + Issue #865 -- Aerosol optics answer changes + Generalization of the aerosol optics has resulted in answer changes. Here these answer changing code modifications (in modal_aer_opt) are merged in separately which are as follows: - use table_interp_mod utility rather than binterp subroutine -- answer changing (roundoff) - use rh2odens parameter -- answer changing (roundoff) - - use model_size_parameters subroutine in modal_aero_lw rather than - using separate code block to compute the chebychev parameters -- answer changing (roundoff) + - use model_size_parameters subroutine in modal_aero_lw rather than using separate + code block to compute the chebychev parameters -- answer changing (roundoff) Updates to aerosol optics diagnostics: - - generalize history field names that will work for many bins used in a sectional aerosol model - - add AODTOT SW diagnostic - - add AODABSLW (at 10 microns) and TOTABSLW diagnostics + - generalize history field names that will accumulate multiple bins of a sectional aerosol model + - add short wave diagnostic AODTOT + - add long wave diagnostics AODABSLW (at 10 microns) and TOTABSLW Change in results are near roundoff level @@ -45,7 +47,7 @@ M src/physics/cam/modal_aer_opt.F90 - use rh2odens parameter -- answer changing (roundoff) - use model_size_parameters subroutine in modal_aero_lw rather than using separate code block to compute the chebychev parameters -- answer changing (roundoff) - - generalize history field names that will work for many bins used in a sectional aerosol model + - generalize history field names that will accumulate multiple bins of a sectional aerosol model - add AODTOT SW diagnostic - add AODABSLW (at 10 microns) and TOTABSLW diagnostics diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 index 776ef2c15c..9daac52b51 100644 --- a/src/utils/table_interp_mod.F90 +++ b/src/utils/table_interp_mod.F90 @@ -152,8 +152,9 @@ pure function interp4d( ncol, nxs, nys, nzs, nts, xwghts, ywghts, zwghts, twghts end function interp4d !-------------------------------------------------------------------------- + ! determines interpolation weights and indices for given values at the model columns !-------------------------------------------------------------------------- - pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) + pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols ) result(wghts) integer, intent(in) :: ngrid ! number of grid point values real(r8), intent(in) :: xgrid(ngrid) ! grid point values @@ -188,16 +189,24 @@ end function table_interp_calcwghts ! private methods !-------------------------------------------------------------------------- !-------------------------------------------------------------------------- - - pure function find_index( nvals, vals, vx ) result(ndx) + ! determines last index of grid vals of which is greater then or equal to + ! value vx + !-------------------------------------------------------------------------- + pure function find_index( nvals, vals, vx ) result(res) integer, intent(in) :: nvals real(r8), intent(in) :: vals(nvals) real(r8), intent(in) :: vx + integer :: res integer :: ndx - find_ndx: do ndx = 2, nvals-1 - if (vals(ndx)>vx) exit find_ndx + res = -1 + + find_ndx: do ndx = 2, nvals + if (vals(ndx)>=vx) then + res = ndx + exit find_ndx + end if end do find_ndx end function find_index From 741d5360eba956f048823fefaddec654646c58e4 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 3 Aug 2023 10:18:56 -0600 Subject: [PATCH 31/61] improve docs and index finder modified: src/utils/table_interp_mod.F90 --- src/utils/table_interp_mod.F90 | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/utils/table_interp_mod.F90 b/src/utils/table_interp_mod.F90 index 776ef2c15c..9daac52b51 100644 --- a/src/utils/table_interp_mod.F90 +++ b/src/utils/table_interp_mod.F90 @@ -152,8 +152,9 @@ pure function interp4d( ncol, nxs, nys, nzs, nts, xwghts, ywghts, zwghts, twghts end function interp4d !-------------------------------------------------------------------------- + ! determines interpolation weights and indices for given values at the model columns !-------------------------------------------------------------------------- - pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols) result(wghts ) + pure function table_interp_calcwghts( ngrid, xgrid, ncols, xcols ) result(wghts) integer, intent(in) :: ngrid ! number of grid point values real(r8), intent(in) :: xgrid(ngrid) ! grid point values @@ -188,16 +189,24 @@ end function table_interp_calcwghts ! private methods !-------------------------------------------------------------------------- !-------------------------------------------------------------------------- - - pure function find_index( nvals, vals, vx ) result(ndx) + ! determines last index of grid vals of which is greater then or equal to + ! value vx + !-------------------------------------------------------------------------- + pure function find_index( nvals, vals, vx ) result(res) integer, intent(in) :: nvals real(r8), intent(in) :: vals(nvals) real(r8), intent(in) :: vx + integer :: res integer :: ndx - find_ndx: do ndx = 2, nvals-1 - if (vals(ndx)>vx) exit find_ndx + res = -1 + + find_ndx: do ndx = 2, nvals + if (vals(ndx)>=vx) then + res = ndx + exit find_ndx + end if end do find_ndx end function find_index From 7d054bf616db2ba78c8c16688aa4809b3048e595 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 3 Aug 2023 15:36:38 -0600 Subject: [PATCH 32/61] rh2odens parameter modified: src/chemistry/aerosol/modal_aerosol_state_mod.F90 --- src/chemistry/aerosol/modal_aerosol_state_mod.F90 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 index 0646bfda90..c58cac0c8a 100644 --- a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 @@ -49,6 +49,8 @@ module modal_aerosol_state_mod procedure :: constructor end interface modal_aerosol_state + real(r8), parameter :: rh2odens = 1._r8/rhoh2o + contains !------------------------------------------------------------------------------ @@ -586,7 +588,10 @@ function water_volume(self, aero_props, list_idx, bin_idx, ncol, nlev) result(vo call self%water_uptake(aero_props, list_idx, bin_idx, ncol, nlev, dgnumwet, qaerwat) - vol(:ncol,:nlev) = qaerwat(:ncol,:nlev)/rhoh2o + vol(:ncol,:nlev) = qaerwat(:ncol,:nlev)*rh2odens + where (vol<0._r8) + vol = 0._r8 + end where end function water_volume From 3725a042455bd1fbfb89a5f03bac8e8aed580ed2 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 4 Aug 2023 09:29:06 -0600 Subject: [PATCH 33/61] Corrections to namelist settings modified: bld/build-namelist modified: bld/namelist_files/namelist_defaults_cam.xml modified: bld/namelist_files/use_cases/2000_cam6.xml modified: bld/namelist_files/use_cases/2010_cam6.xml modified: bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml modified: bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml --- bld/build-namelist | 30 +++++++++---------- bld/namelist_files/namelist_defaults_cam.xml | 2 +- bld/namelist_files/use_cases/2000_cam6.xml | 24 +++++++-------- bld/namelist_files/use_cases/2010_cam6.xml | 24 +++++++-------- .../use_cases/waccm_sc_2000_cam6.xml | 24 +++++++-------- .../use_cases/waccm_sc_2010_cam6.xml | 24 +++++++-------- 6 files changed, 64 insertions(+), 64 deletions(-) diff --git a/bld/build-namelist b/bld/build-namelist index 5ab175590d..efd42d4949 100755 --- a/bld/build-namelist +++ b/bld/build-namelist @@ -2342,18 +2342,18 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam if ($chem eq 'trop_mam4' or $chem eq 'waccm_sc_mam4'or $chem eq 'ghg_mam4') { # SOA yields (used for the interactive emissions) have been calculated based on the VBS yields in CAM-chem. # Duseong S. Jo, et al. to be submitted to GMD, 2023 -- see https://github.com/ESCOMP/CAM/pull/727 discussion for additional detail. - my %soae_fctrs = ('BENZENE_an_srf_file' => '3.4192D0', - 'BENZENE_bb_srf_file' => '3.4192D0', - 'ISOP_bb_srf_file' => '0.9058D0', - 'MTERP_bb_srf_file' => '5.8638D0', - 'TOLUENE_an_srf_file' => '9.4429D0', - 'TOLUENE_bb_srf_file' => '9.4429D0', - 'XYLENES_an_srf_file' => '7.3804D0', - 'XYLENES_bb_srf_file' => '7.3804D0', - 'IVOC_an_srf_file' => '8.6158D0', - 'IVOC_bb_srf_file' => '8.6158D0', - 'SVOC_an_srf_file' => '16.7388D0', - 'SVOC_bb_srf_file' => '16.7388D0'); + my %soae_fctrs = ('BENZENE_an_srf_file' => '2.5592D0', + 'BENZENE_bb_srf_file' => '2.5592D0', + 'ISOP_bb_srf_file' => '0.5954D0', + 'MTERP_bb_srf_file' => '5.1004D0', + 'TOLUENE_an_srf_file' => '8.2367D0', + 'TOLUENE_bb_srf_file' => '8.2367D0', + 'XYLENES_an_srf_file' => '6.5013D0', + 'XYLENES_bb_srf_file' => '6.5013D0', + 'IVOC_an_srf_file' => '8.5371D0', + 'IVOC_bb_srf_file' => '8.5371D0', + 'SVOC_an_srf_file' => '16.650D0', + 'SVOC_bb_srf_file' => '16.650D0'); foreach my $id (sort keys %soae_fctrs) { my $rel_filepath = get_default_value($id, \%verhash); my $abs_filepath = set_abs_filepath($rel_filepath, $inputdata_rootdir); @@ -2436,12 +2436,12 @@ if (($chem =~ /_mam4/ or $chem =~ /_mam5/) and ($phys =~ /cam6/ or $phys =~ /cam # MEGAN emissions if (($chem eq 'trop_mam4' or $chem eq 'waccm_sc_mam4' or $chem eq 'ghg_mam4') and !$aqua_mode and !$scam){ - my $val = "'SOAE = 0.9058*isoprene + 5.8638*(carene_3 + pinene_a + thujene_a + bornene +'," + my $val = "'SOAE = 0.5954*isoprene + 5.1004*(carene_3 + pinene_a + thujene_a + bornene +'," . "' terpineol_4 + terpineol_a + terpinyl_ACT_a + myrtenal + sabinene + pinene_b + camphene +'," . "' fenchene_a + limonene + phellandrene_a + terpinene_a + terpinene_g + terpinolene +'," . "' phellandrene_b + linalool + ionone_b + geranyl_acetone + neryl_acetone + jasmone +'," . "' verbenene + ipsenol + myrcene + ocimene_t_b + ocimene_al + ocimene_c_b + 2met_nonatriene) + '," - . "' 13.4042*(farnescene_a + caryophyllene_b + acoradiene + aromadendrene + bergamotene_a +'," + . "' 12.3942*(farnescene_a + caryophyllene_b + acoradiene + aromadendrene + bergamotene_a +'," . "' bergamotene_b + bisabolene_a + bisabolene_b + bourbonene_b + cadinene_d + cadinene_g +'," . "' cedrene_a + copaene_a + cubebene_a + cubebene_b + elemene_b + farnescene_b +'," . "' germacrene_B + germacrene_D + gurjunene_b + humulene_a + humulene_g + isolongifolene +'," @@ -4606,7 +4606,7 @@ sub check_user_input { my $nl = shift; # namelist object - # When HEMCO is being used any emissions or external forcings specified by the + # When HEMCO is being used any emissions or external forcings specified by the # srf_emis_specifier and ext_frc_specifier variables will be ignored at runtime. # Check here that these variable are not set if the compset definition sets # use_hemco=.true. diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index 33aac231ab..149b9c2e8c 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -123,7 +123,7 @@ atm/cam/inic/se/f.e22.FCnudged.ne0CONUSne30x8_ne0CONUSne30x8_mt12.cam6_2_032.002.cam.i.2013-01-01-00000_c200623.nc atm/cam/inic/se/f.e22.FCnudged.ne30_ne30_mg17.release-cesm2.2.0_spinup.2010_2020.001.cam.i.2011-01-01-00000_L58_c220310.nc atm/cam/inic/se/FCMTHIST_ne30pg3_1980-01-01_c221214.nc -atm/cam/inic/fv/FC2000mam5_f10_0002-01-01_c221214.nc +atm/cam/inic/fv/FC2000mam5_f10_0002-01-01_c221214.nc atm/cam/inic/se/FLT_L58_ne30pg3_IC_c220623.nc atm/cam/inic/se/cam7_FMT_ne30pg3_mg17_L93_c221118.nc diff --git a/bld/namelist_files/use_cases/2000_cam6.xml b/bld/namelist_files/use_cases/2000_cam6.xml index 8d119fdfef..05d019beb2 100644 --- a/bld/namelist_files/use_cases/2000_cam6.xml +++ b/bld/namelist_files/use_cases/2000_cam6.xml @@ -63,18 +63,18 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2000climo_0.9x1.25_c20170616.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_bb_surface_2000climo_0.9x1.25_c20170322.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a2_anthro-res_surface_2000climo_0.9x1.25_c20170616.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' diff --git a/bld/namelist_files/use_cases/2010_cam6.xml b/bld/namelist_files/use_cases/2010_cam6.xml index 3927830033..239f5436f6 100644 --- a/bld/namelist_files/use_cases/2010_cam6.xml +++ b/bld/namelist_files/use_cases/2010_cam6.xml @@ -58,18 +58,18 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_bb_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a2_anthro-res_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' diff --git a/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml b/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml index 8625224f69..cdb217a987 100644 --- a/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml @@ -84,18 +84,18 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2000climo_0.9x1.25_c20170616.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a1_bb_surface_2000climo_0.9x1.25_c20170322.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_so4_a2_anthro-res_surface_2000climo_0.9x1.25_c20170616.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_BENZENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_ISOP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_MTERP_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_TOLUENE_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_XYLENES_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_IVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_anthro_surface_2000climo_0.9x1.25_c20170608.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2000climo/emissions-cmip6_SVOC_bb_surface_2000climo_0.9x1.25_c20170322.nc' diff --git a/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml b/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml index d24823caab..d878ba8f6d 100644 --- a/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml +++ b/bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml @@ -84,18 +84,18 @@ 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_anthro-ag-ship_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a1 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a1_bb_surface_2010climo_0.9x1.25_c20180918.nc', 'so4_a2 -> $INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_so4_a2_anthro-res_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 4.4323D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 1.2021D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 6.6625D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 9.9042D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.3792D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 8.6865D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', - 'SOAE -> 16.8188D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 2.5592D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_BENZENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 0.5954D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_ISOP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 5.1004D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_MTERP_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.2367D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_TOLUENE_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 6.5013D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_XYLENES_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 8.5371D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_IVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_anthro_surface_2010climo_0.9x1.25_c20180918.nc', + 'SOAE -> 16.650D0*$INPUTDATA_ROOT/atm/cam/chem/emis/CMIP6_emissions_2010climo/emissions-cmip6_SVOC_bb_surface_2010climo_0.9x1.25_c20180918.nc' CYCLICAL From 8c5d08934eff4fc58b648c33c5cea10a746745b6 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 4 Aug 2023 09:45:36 -0600 Subject: [PATCH 34/61] Corrections to default 10x15 camchem ic file modified: bld/namelist_files/namelist_defaults_cam.xml --- bld/namelist_files/namelist_defaults_cam.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index 149b9c2e8c..6b583ff69d 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -78,6 +78,7 @@ atm/cam/inic/fv/f.e22.FC2010climo.f09_f09_mg17.cam6_2_022.001.cam.i.0016-01-01-00000_c200610.nc atm/cam/inic/fv/f.e22.FC2010climo.f09_f09_mg17.cam6_2_022.001.cam.i.0016-01-01-00000_c200610.nc atm/cam/inic/fv/f.e22.FC2010climo.f09_f09_mg17.cam6_2_022.001.cam.i.0016-01-01-00000_c200610.nc +atm/cam/inic/fv/FC2000mam5_f10_0002-01-01_c221214.nc atm/cam/inic/fv/cami-mam3_0000-01-01_0.9x1.25_L32_c141031.nc atm/cam/inic/fv/cami-mam3_0000-01-01_1.9x2.5_L32_c150407.nc atm/cam/inic/fv/cami-mam4_0000-01-01_10x15_L32_c170914.nc @@ -123,7 +124,6 @@ atm/cam/inic/se/f.e22.FCnudged.ne0CONUSne30x8_ne0CONUSne30x8_mt12.cam6_2_032.002.cam.i.2013-01-01-00000_c200623.nc atm/cam/inic/se/f.e22.FCnudged.ne30_ne30_mg17.release-cesm2.2.0_spinup.2010_2020.001.cam.i.2011-01-01-00000_L58_c220310.nc atm/cam/inic/se/FCMTHIST_ne30pg3_1980-01-01_c221214.nc -atm/cam/inic/fv/FC2000mam5_f10_0002-01-01_c221214.nc atm/cam/inic/se/FLT_L58_ne30pg3_IC_c220623.nc atm/cam/inic/se/cam7_FMT_ne30pg3_mg17_L93_c221118.nc From f00ebb6ea414ba076123a385c7d2f18815f09171 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 8 Aug 2023 16:49:17 -0600 Subject: [PATCH 35/61] ChangeLog update --- doc/ChangeLog | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index 91d25fb0c9..611f05a8dc 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,163 @@ =============================================================== +Tag name: cam6_3_121 +Originator(s): fvitt +Date: 8 Aug 2023 +One-line Summary: Update SOAE emissions factors +Github PR URL: https://github.com/ESCOMP/CAM/pull/870 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Corrections to default namelist settings for: + - SAOE emissions factors #860 + - 10x15 CAMChem IC file #867 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M bld/build-namelist +M bld/namelist_files/use_cases/2000_cam6.xml +M bld/namelist_files/use_cases/2010_cam6.xml +M bld/namelist_files/use_cases/waccm_sc_2000_cam6.xml +M bld/namelist_files/use_cases/waccm_sc_2010_cam6.xml + - update SAOE emissions factors + +M bld/namelist_files/namelist_defaults_cam.xml + - correction to default 10x15 CAMChem IC file + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=284 + PEND ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 COMPARE_base_rest + - pre-existing failures + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details: + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase NLCOMP + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev NLCOMP + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: DIFF) details: + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 NLCOMP + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: DIFF) details: + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 NLCOMP + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: DIFF) details: + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m NLCOMP + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging NLCOMP + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs NLCOMP + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_120: DIFF + - expected baseline failures due to update SAOE emissions factors + + SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: NLFAIL) details: + FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 NLCOMP + - expected namelist compare failures due to update SAOE emissions factors + +izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=16 + PEND DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae COMPARE_base_da + - pre-existing failure + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 (Overall: DIFF) details: + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 NLCOMP + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase (Overall: DIFF) details: + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase NLCOMP + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_nag: DIFF + - expected baseline failures due to update SAOE emissions factors + +izumi/gnu/aux_cam: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: DIFF) details: + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 NLCOMP + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_gnu: DIFF + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_120_gnu: DIFF + - expected baseline failures due to update SAOE emissions factors + +Summarize any changes to answers: larger than roundoff + +=============================================================== +=============================================================== + Tag name: cam6_3_120 Originator(s): fvitt Date: 28 Jul 2023 From 4c502c3912a52c1198f970755f7a5c4e25cb1506 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 8 Aug 2023 16:58:40 -0600 Subject: [PATCH 36/61] ChangeLog update --- doc/ChangeLog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 611f05a8dc..486c6cbdde 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -9,8 +9,8 @@ Github PR URL: https://github.com/ESCOMP/CAM/pull/870 Purpose of changes (include the issue number and title text for each relevant GitHub issue): Corrections to default namelist settings for: - - SAOE emissions factors #860 - - 10x15 CAMChem IC file #867 + - SAOE emissions factors (issue: Need to adjust SAOE emissions factors #860) + - 10x15 CAMChem IC file (issue: Unusable namelist default? #867) Describe any changes made to build system: N/A From 40d519145ddac201ebdc8db80459331e466cde4f Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 10 Aug 2023 08:53:08 -0600 Subject: [PATCH 37/61] code review change requests modified: src/physics/cam/modal_aer_opt.F90 --- src/physics/cam/modal_aer_opt.F90 | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/physics/cam/modal_aer_opt.F90 b/src/physics/cam/modal_aer_opt.F90 index a42d87b87d..136c188a1e 100644 --- a/src/physics/cam/modal_aer_opt.F90 +++ b/src/physics/cam/modal_aer_opt.F90 @@ -237,9 +237,9 @@ subroutine modal_aer_opt_init() call addfld ('EXTxASYMdn', (/ 'lev' /), 'A',' ','extinction 550 * asymmetry factor, day night', & flag_xyfill=.true.) - call addfld ('AODTOT', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts', & + call addfld ('AODTOT', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelengths ', & flag_xyfill=.true.) - call addfld ('AODTOTdn', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelenghts', & + call addfld ('AODTOTdn', horiz_only, 'A','1','Aerosol optical depth summed over all sw wavelengths, day night', & flag_xyfill=.true.) call rad_cnst_get_info(0, nmodes=nmodes) @@ -436,9 +436,9 @@ subroutine modal_aer_opt_init() 'Aerosol absorption optical depth 550 nm', flag_xyfill=.true.) call addfld ('AODTOT'//diag(ilist), horiz_only, 'A','1', & - 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) + 'Aerosol optical depth summed over all sw wavelengths', flag_xyfill=.true.) call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1', & - 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) + 'Aerosol optical depth summed over all sw wavelengths, day night', flag_xyfill=.true.) call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& 'Aerosol extinction 550 nm, day night', flag_xyfill=.true.) @@ -996,21 +996,16 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & if ((dopaer(i) <= -1.e-10_r8) .or. (dopaer(i) >= 30._r8)) then if (dopaer(i) <= -1.e-10_r8) then - write(iulog,*) "ERROR: Negative aerosol optical depth & - &in this layer." + write(iulog,*) "ERROR: Negative aerosol optical depth in this layer." else - write(iulog,*) "WARNING: Aerosol optical depth is & - &unreasonably high in this layer." + write(iulog,*) "WARNING: Aerosol optical depth is unreasonably high in this layer." end if write(iulog,*) 'dopaer(', i, ',', k, ',', m, ',', lchnk, ')=', dopaer(i) - ! write(iulog,*) 'itab,jtab,ttab,utab=',itab(i),jtab(i),ttab(i),utab(i) write(iulog,*) 'k=', k, ' pext=', pext(i), ' specext=', specpext(i) write(iulog,*) 'wetvol=', wetvol(i), ' dryvol=', dryvol(i), ' watervol=', watervol(i) - ! write(iulog,*) 'cext=',(cext(l,i),l=1,ncoef) - ! write(iulog,*) 'crefin=',crefin(i) write(iulog,*) 'nspec=', nspec - ! write(iulog,*) 'cheb=', (cheb(nc,m,i,k),nc=2,ncoef) + do l = 1, nspec call rad_cnst_get_aer_mmr(list_idx, m, l, 'a', state, pbuf, specmmr) call rad_cnst_get_aer_props(list_idx, m, l, density_aer=specdens, & @@ -1022,7 +1017,7 @@ subroutine modal_aero_sw(list_idx, state, pbuf, nnite, idxnite, & end do nerr_dopaer = nerr_dopaer + 1 -! if (nerr_dopaer >= nerrmax_dopaer) then + if (dopaer(i) < -1.e-10_r8) then write(iulog,*) '*** halting in '//subname//' after nerr_dopaer =', nerr_dopaer call endrun('exit from '//subname) From b601d5a44b50c31128a5e688335a4eb68637f863 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 10 Aug 2023 14:50:33 -0600 Subject: [PATCH 38/61] ChangeLog update --- doc/ChangeLog | 30 ++++++------------------------ 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index ac1d0a35ad..69cf44991e 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,8 +1,8 @@ =============================================================== -Tag name: +Tag name: cam6_3_122 Originator(s): fvitt -Date: +Date: 11 Aug 2023 One-line Summary: Aerosol optics updates Github PR URL: https://github.com/ESCOMP/CAM/pull/868 @@ -85,29 +85,11 @@ izumi/nag/aux_cam: izumi/gnu/aux_cam: -CAM tag used for the baseline comparison tests if different than previous -tag: - -Summarize any changes to answers, i.e., -- what code configurations: -- what platforms/compilers: -- nature of change (roundoff; larger than roundoff but same climate; new - climate): - -If bitwise differences were observed, how did you show they were no worse -than roundoff? + NOTE: Independent testing showed that the combination of round-off level changes + to modal_aer_opt (listed above) results in near round-off level changes in the + aerosol optics (~12-16 significant digits of agreement). -If this tag changes climate describe the run(s) done to evaluate the new -climate in enough detail that it(they) could be reproduced, i.e., -- source tag (all code used must be in the repository): -- platform/compilers: -- configure commandline: -- build-namelist command (or complete namelist): -- MSS location of output: - -MSS location of control simulations used to validate new climate: - -URL for AMWG diagnostics output used to validate new climate: +Summarize any changes to answers: near roundoff =============================================================== =============================================================== From 6532cf6530bde32b893641002c553271e3d89622 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 10 Aug 2023 16:17:16 -0600 Subject: [PATCH 39/61] Fix memory issue, default PE layout for FMTHIST modified: Externals.cfg modified: bld/namelist_files/namelist_defaults_cam.xml modified: cime_config/config_compsets.xml modified: cime_config/config_pes.xml modified: cime_config/testdefs/testlist_cam.xml modified: src/chemistry/utils/tracer_data.F90 --- Externals.cfg | 2 +- bld/namelist_files/namelist_defaults_cam.xml | 2 +- cime_config/config_compsets.xml | 4 +-- cime_config/config_pes.xml | 27 ++++++++++++++++++++ cime_config/testdefs/testlist_cam.xml | 18 +++++++++++++ src/chemistry/utils/tracer_data.F90 | 20 +++------------ 6 files changed, 53 insertions(+), 20 deletions(-) diff --git a/Externals.cfg b/Externals.cfg index fcc9322e56..9badad437d 100644 --- a/Externals.cfg +++ b/Externals.cfg @@ -1,5 +1,5 @@ [ccs_config] -tag = ccs_config_cesm0.0.72 +tag = ccs_config_cesm0.0.73 protocol = git repo_url = https://github.com/ESMCI/ccs_config_cesm local_path = ccs_config diff --git a/bld/namelist_files/namelist_defaults_cam.xml b/bld/namelist_files/namelist_defaults_cam.xml index 6b583ff69d..656a1b1ab6 100644 --- a/bld/namelist_files/namelist_defaults_cam.xml +++ b/bld/namelist_files/namelist_defaults_cam.xml @@ -123,7 +123,7 @@ atm/cam/inic/se/f.e22.FCnudged.ne0CONUSne30x8_ne0CONUSne30x8_mt12.cam6_2_032.002.cam.i.2013-01-01-00000_c200623.nc atm/cam/inic/se/f.e22.FCnudged.ne0CONUSne30x8_ne0CONUSne30x8_mt12.cam6_2_032.002.cam.i.2013-01-01-00000_c200623.nc atm/cam/inic/se/f.e22.FCnudged.ne30_ne30_mg17.release-cesm2.2.0_spinup.2010_2020.001.cam.i.2011-01-01-00000_L58_c220310.nc -atm/cam/inic/se/FCMTHIST_ne30pg3_1980-01-01_c221214.nc +atm/cam/inic/se/f.cam6_3_112.FCMTHIST_v0c.ne30.non-ogw-ubcT-effgw0.7.001.cam.i.1998-01-01-00000_c230810.nc atm/cam/inic/se/FLT_L58_ne30pg3_IC_c220623.nc atm/cam/inic/se/cam7_FMT_ne30pg3_mg17_L93_c221118.nc diff --git a/cime_config/config_compsets.xml b/cime_config/config_compsets.xml index 23aada6520..eedcf65e38 100644 --- a/cime_config/config_compsets.xml +++ b/cime_config/config_compsets.xml @@ -62,12 +62,12 @@ - FLTHIST_v0d + FLTHIST HIST_CAM%DEV%LT%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV - FMTHIST_v0d + FMTHIST HIST_CAM%DEV%MT%GHGMAM4_CLM51%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV diff --git a/cime_config/config_pes.xml b/cime_config/config_pes.xml index 316bd8435d..dae8cc032e 100644 --- a/cime_config/config_pes.xml +++ b/cime_config/config_pes.xml @@ -333,6 +333,33 @@ + + none + + -8 + -8 + -8 + -8 + -8 + -8 + + + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 0 + 0 + 0 + 0 + 0 + + none diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml index 73219c0c07..b9d844ebf5 100644 --- a/cime_config/testdefs/testlist_cam.xml +++ b/cime_config/testdefs/testlist_cam.xml @@ -1589,6 +1589,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/chemistry/utils/tracer_data.F90 b/src/chemistry/utils/tracer_data.F90 index 861a4cd7eb..f1eeb00e17 100644 --- a/src/chemistry/utils/tracer_data.F90 +++ b/src/chemistry/utils/tracer_data.F90 @@ -92,10 +92,10 @@ module tracer_data real(r8) :: one_yr = 0 real(r8) :: curr_mod_time ! model time - calendar day real(r8) :: next_mod_time ! model time - calendar day - next time step - integer :: nlon - integer :: nlat - integer :: nlev - integer :: nilev + integer :: nlon = 0 + integer :: nlat = 0 + integer :: nlev = 0 + integer :: nilev = 0 integer :: ps_coords(3) ! LATDIM | LONDIM | TIMDIM integer :: ps_order(3) ! LATDIM | LONDIM | TIMDIM real(r8), pointer, dimension(:) :: lons => null() @@ -104,7 +104,6 @@ module tracer_data real(r8), pointer, dimension(:) :: ilevs => null() real(r8), pointer, dimension(:) :: hyam => null() real(r8), pointer, dimension(:) :: hybm => null() - real(r8), pointer, dimension(:,:) :: ps => null() real(r8), pointer, dimension(:) :: hyai => null() real(r8), pointer, dimension(:) :: hybi => null() real(r8), pointer, dimension(:,:) :: weight_x => null(), weight_y => null() @@ -340,12 +339,6 @@ subroutine trcdata_init( specifier, filename, filelist, datapath, flds, file, & lat_dimid = old_dimid endif - allocate( file%ps(file%nlon,file%nlat), stat=astat ) - if( astat /= 0 ) then - write(iulog,*) 'trcdata_init: file%ps allocation error = ',astat - call endrun('trcdata_init: failed to allocate x array') - end if - call pio_seterrorhandling(File%curr_fileid, PIO_BCAST_ERROR, oldmethod=err_handling) ierr = pio_inq_varid( file%curr_fileid, 'PS', file%ps_id ) file%has_ps = (ierr==PIO_NOERR) @@ -435,11 +428,6 @@ subroutine trcdata_init( specifier, filename, filelist, datapath, flds, file, & ierr = pio_get_var( file%curr_fileid, varid, file%hybi ) endif - allocate( file %ps (pcols,begchunk:endchunk), stat=astat ) - if( astat/= 0 ) then - write(iulog,*) 'trcdata_init: failed to allocate file%ps array; error = ',astat - call endrun - end if allocate( file%ps_in(1)%data(pcols,begchunk:endchunk), stat=astat ) if( astat/= 0 ) then write(iulog,*) 'trcdata_init: failed to allocate file%ps_in(1)%data array; error = ',astat From 36766c5f59c59999f0e641e74df90f67a5782b84 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 10 Aug 2023 16:53:27 -0600 Subject: [PATCH 40/61] ChangeLog update --- doc/ChangeLog | 216 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 210 insertions(+), 6 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 69cf44991e..590913931e 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -24,17 +24,17 @@ Purpose of changes (include the issue number and title text for each relevant Gi Change in results are near roundoff level -Describe any changes made to build system: +Describe any changes made to build system: N/A -Describe any changes made to the namelist: +Describe any changes made to the namelist: N/A -List any changes to the defaults for the boundary datasets: +List any changes to the defaults for the boundary datasets: N/A -Describe any substantial timing or memory changes: +Describe any substantial timing or memory changes: N/A -Code reviewed by: +Code reviewed by: cacraigucar nusbaume -List all files eliminated: +List all files eliminated: N/A List all files added and what they do: A src/utils/table_interp_mod.F90 @@ -80,10 +80,214 @@ then copy the lines from the td.*.status files for the failed tests to the appropriate machine below. All failed tests must be justified. cheyenne/intel/aux_cam: + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 NLCOMP + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=293 + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h NLCOMP + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + - pre-existing failures + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details: + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase NLCOMP + FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp NLCOMP + FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: DIFF) details: + FAIL ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: DIFF) details: + FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP + FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev NLCOMP + FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: DIFF) details: + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 NLCOMP + FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: DIFF) details: + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 NLCOMP + FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC5.cheyenne_intel.cam-scm_prep (Overall: DIFF) details: + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC5.cheyenne_intel.cam-scm_prep BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase (Overall: DIFF) details: + FAIL SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase NLCOMP + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: + FAIL SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d NLCOMP + FAIL SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: DIFF) details: + FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 NLCOMP + FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: DIFF) details: + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m NLCOMP + FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging NLCOMP + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: DIFF) details: + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs NLCOMP + FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + - expected baseline failures due to changes in aerosol optics + - namelist compare failures due changes in aerosol optics diagnostics field names izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=10 + - pre-existing failures + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: DIFF) details: + FAIL ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 (Overall: DIFF) details: + FAIL ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm (Overall: DIFF) details: + FAIL SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: FIELDLIST field lists differ (otherwise bit-for-bit) + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase (Overall: DIFF) details: + FAIL SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s (Overall: DIFF) details: + FAIL SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: DIFF) details: + FAIL TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 (Overall: DIFF) details: + FAIL TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_nag: DIFF + - expected baseline failures due to changes in aerosol optics izumi/gnu/aux_cam: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s (Overall: DIFF) details: + FAIL ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 (Overall: DIFF) details: + FAIL PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: DIFF) details: + FAIL SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac (Overall: DIFF) details: + FAIL SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac BASELINE /fs/cgd/csm/models/atm/cam/pretag_bl/cam6_3_121_gnu: DIFF + - expected baseline failures due to changes in aerosol optics + - namelist compare failures due changes in aerosol optics diagnostics field names NOTE: Independent testing showed that the combination of round-off level changes to modal_aer_opt (listed above) results in near round-off level changes in the From bfaa23e089ef83554a5732c499a95f456fed8777 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 11 Aug 2023 11:09:25 -0600 Subject: [PATCH 41/61] ChangeLog update --- doc/ChangeLog | 30 ++++-------------------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 590913931e..4975d373eb 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -80,9 +80,6 @@ then copy the lines from the td.*.status files for the failed tests to the appropriate machine below. All failed tests must be justified. cheyenne/intel/aux_cam: - ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: - FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 NLCOMP - FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=293 ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest @@ -90,13 +87,13 @@ cheyenne/intel/aux_cam: SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h NLCOMP FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: PEND) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 NLCOMP - pre-existing failures ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: DIFF) details: - FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase NLCOMP FAIL ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: DIFF) details: - FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp NLCOMP FAIL ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase (Overall: DIFF) details: FAIL ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF @@ -105,44 +102,33 @@ cheyenne/intel/aux_cam: ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: FAIL ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: DIFF) details: FAIL ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: DIFF) details: FAIL ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP FAIL ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 NLCOMP FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s NLCOMP FAIL ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: DIFF) details: - FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev NLCOMP FAIL ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: DIFF) details: - FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 NLCOMP FAIL ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: DIFF) details: - FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 NLCOMP FAIL ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: FAIL ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF @@ -159,7 +145,6 @@ cheyenne/intel/aux_cam: FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s NLCOMP FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s NLCOMP FAIL SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: FAIL SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF @@ -175,7 +160,6 @@ cheyenne/intel/aux_cam: SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: FAIL SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s NLCOMP FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: FAIL SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s NLCOMP @@ -184,33 +168,27 @@ cheyenne/intel/aux_cam: FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s NLCOMP FAIL SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: - FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s NLCOMP FAIL SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d NLCOMP FAIL SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: - FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d NLCOMP FAIL SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: DIFF) details: FAIL SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d NLCOMP FAIL SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: DIFF) details: - FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 NLCOMP FAIL SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: DIFF) details: - FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m NLCOMP FAIL SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: DIFF) details: - FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging NLCOMP FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: DIFF) details: FAIL SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: DIFF) details: - FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs NLCOMP FAIL SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_121: DIFF - - expected baseline failures due to changes in aerosol optics - - namelist compare failures due changes in aerosol optics diagnostics field names + - expected baseline failures due to changes in aerosol optics + - namelist compare failures due changes in aerosol optics diagnostics field names izumi/nag/aux_cam: DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: From acf694ea78d956edc5497cdf2cecb8cb85119a48 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Fri, 11 Aug 2023 11:29:18 -0600 Subject: [PATCH 42/61] minor corrections modified: src/physics/cam/aerosol_optics_cam.F90 --- src/physics/cam/aerosol_optics_cam.F90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 60c95243b4..5e0aa88f84 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -207,7 +207,7 @@ subroutine aerosol_optics_cam_init call addfld ('EXTxASYM'//diag(ilist), (/ 'lev' /), 'A',' ', & 'extinction 550 nm * asymmetry factor, day only', flag_xyfill=.true.) call addfld ('AODTOT'//diag(ilist), horiz_only, 'A','1',& - 'Aerosol optical depth summed over all sw wavelenghts', flag_xyfill=.true.) + 'Aerosol optical depth summed over all sw wavelengths', flag_xyfill=.true.) call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& 'Aerosol extinction 550 nm, day only') @@ -236,7 +236,7 @@ subroutine aerosol_optics_cam_init call addfld ('EXTxASYMdn'//diag(ilist), (/ 'lev' /), 'A',' ', & 'extinction 550 nm * asymmetry factor, day only', flag_xyfill=.true.) call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1',& - 'Aerosol optical depth summed over all sw wavelenghts') + 'Aerosol optical depth summed over all sw wavelengths, day only') if (lw10um_indx>0) then call addfld('AODABSLW'//diag(ilist), (/ 'lev' /), 'A','/m',& From d70a8b22b3329e34c9961d600ac66c7251d270be Mon Sep 17 00:00:00 2001 From: James Edwards Date: Mon, 14 Aug 2023 15:39:05 -0600 Subject: [PATCH 43/61] improves history write performance; --- src/control/cam_history.F90 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/control/cam_history.F90 b/src/control/cam_history.F90 index 51c357e68b..4cafd3d6c1 100644 --- a/src/control/cam_history.F90 +++ b/src/control/cam_history.F90 @@ -2818,7 +2818,18 @@ subroutine fldlst () do f=nflds(t)-1,1,-1 do ff=1,f - if (tape(t)%hlist(ff)%field%name > tape(t)%hlist(ff+1)%field%name) then + if (tape(t)%hlist(ff)%field%numlev > tape(t)%hlist(ff+1)%field%numlev) then + tmp = tape(t)%hlist(ff) + tape(t)%hlist(ff ) = tape(t)%hlist(ff+1) + tape(t)%hlist(ff+1) = tmp + end if + + end do + + do ff=1,f + + if ((tape(t)%hlist(ff)%field%numlev == tape(t)%hlist(ff+1)%field%numlev) .and. & + (tape(t)%hlist(ff)%field%name > tape(t)%hlist(ff+1)%field%name)) then tmp = tape(t)%hlist(ff) tape(t)%hlist(ff ) = tape(t)%hlist(ff+1) From a567f399dd7fcc202401218827e13c0a37dd5124 Mon Sep 17 00:00:00 2001 From: Cheryl Craig Date: Tue, 15 Aug 2023 15:46:29 -0600 Subject: [PATCH 44/61] Update ALI-ARMS external --- Externals_CAM.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Externals_CAM.cfg b/Externals_CAM.cfg index 7b246381a9..cc99360e56 100644 --- a/Externals_CAM.cfg +++ b/Externals_CAM.cfg @@ -51,7 +51,7 @@ required = True local_path = src/physics/ali_arms protocol = git repo_url = https://github.com/ESCOMP/ALI-ARMS -tag = ALI_ARMS_v1.0.0 +tag = ALI_ARMS_v1.0.1 required = True [atmos_phys] From 72f3f801578bda7d07a0b6ca5d53aef47a2dc2a1 Mon Sep 17 00:00:00 2001 From: Cheryl Craig Date: Tue, 15 Aug 2023 16:33:39 -0600 Subject: [PATCH 45/61] Preliminary ChangeLog --- doc/ChangeLog | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index 4975d373eb..1d70e403b8 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,50 @@ =============================================================== +Tag name: cam6_3_123 +Originator(s): cacraig, jedwards, fvitt +Date: August 16, 2023 +One-line Summary: Fix Derecho bugs +Github PR URL: https://github.com/ESCOMP/CAM/pull/878 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + - cam_history field order: https://github.com/ESCOMP/CAM/issues/876 + - build failure on derecho: https://github.com/ESCOMP/ALI-ARMS/issues/2 + +Describe any changes made to build system: N/A + +Describe any changes made to the namelist: N/A + +List any changes to the defaults for the boundary datasets: N/A + +Describe any substantial timing or memory changes: N/A + +Code reviewed by: nusbaume + +List all files eliminated: N/A + +List all files added and what they do: N/A + +List all existing files that have been modified, and describe the changes: +M Externals_CAM.cfg + - Update ALI-ARMS external + +M src/control/cam_history.F90 + - Improve history writing for derecho + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + +izumi/nag/aux_cam: + +izumi/gnu/aux_cam: + +=============================================================== +=============================================================== + Tag name: cam6_3_122 Originator(s): fvitt Date: 11 Aug 2023 From 6b4b303207d896960125cb946ae2362996ca8079 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 16 Aug 2023 10:51:09 -0600 Subject: [PATCH 46/61] Zero bergso above trop_lev; better PE layouts for ERP tests modified: cime_config/config_pes.xml modified: src/physics/cam_dev/micro_pumas_cam.F90 --- cime_config/config_pes.xml | 29 ++++++++++++++++++++++++- src/physics/cam_dev/micro_pumas_cam.F90 | 2 ++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/cime_config/config_pes.xml b/cime_config/config_pes.xml index dae8cc032e..42fe06d64a 100644 --- a/cime_config/config_pes.xml +++ b/cime_config/config_pes.xml @@ -333,7 +333,7 @@ - + none -8 @@ -360,6 +360,33 @@ 0 + + none + + -12 + -12 + -12 + -12 + -12 + -12 + + + 1 + 1 + 1 + 1 + 1 + 1 + + + 0 + 0 + 0 + 0 + 0 + 0 + + none diff --git a/src/physics/cam_dev/micro_pumas_cam.F90 b/src/physics/cam_dev/micro_pumas_cam.F90 index ebe8b43976..32923101a6 100644 --- a/src/physics/cam_dev/micro_pumas_cam.F90 +++ b/src/physics/cam_dev/micro_pumas_cam.F90 @@ -2498,6 +2498,7 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf) !Copy pbuf field from proc_rates back to pbuf pointer bergstot(:ncol,top_lev:) = proc_rates%bergstot(:ncol,1:nlev) + bergstot(:ncol,1:top_lev-1) = 0._r8 ! ------------------------------------------------------ ! ! ------------------------------------------------------ ! @@ -2628,6 +2629,7 @@ subroutine micro_pumas_cam_tend(state, ptend, dtime, pbuf) nmultgo_grid(:ncol,:top_lev-1) = 0._r8 nmultrgo_grid(:ncol,:top_lev-1) = 0._r8 npsacwgo_grid(:ncol,:top_lev-1) = 0._r8 + bergso_grid(:ncol,:top_lev-1) = 0._r8 ! These pbuf fields need to be assigned. There is no corresponding subcol_field_avg ! as they are reset before being used, so it would be a needless calculation From cfdb2ae6114cf667b177c33364f545662bfe4456 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 16 Aug 2023 11:13:20 -0600 Subject: [PATCH 47/61] Adjustments to regression tests modified: cime_config/testdefs/testlist_cam.xml --- cime_config/testdefs/testlist_cam.xml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml index b9d844ebf5..5ee5f95aa7 100644 --- a/cime_config/testdefs/testlist_cam.xml +++ b/cime_config/testdefs/testlist_cam.xml @@ -1591,14 +1591,23 @@ - + - + + + + + + + + + + @@ -1607,6 +1616,15 @@ + + + + + + + + + From 2c4d36e986eb8af7eed81d39c497ea768bd7c212 Mon Sep 17 00:00:00 2001 From: Cheryl Craig Date: Wed, 16 Aug 2023 14:10:35 -0600 Subject: [PATCH 48/61] Final ChangeLog for cam6_3_123 --- doc/ChangeLog | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 1d70e403b8..bf2db678b4 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -36,11 +36,20 @@ platform, and checkin with these failures has been OK'd by the gatekeeper, then copy the lines from the td.*.status files for the failed tests to the appropriate machine below. All failed tests must be justified. -cheyenne/intel/aux_cam: +cheyenne/intel/aux_cam: all BFB except: + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_122: DIFF + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=272 + PEND ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 COMPARE_base_rest + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_122: DIFF + - pre-existing failures -izumi/nag/aux_cam: +izumi/nag/aux_cam: all BFB -izumi/gnu/aux_cam: +izumi/gnu/aux_cam: all BFB =============================================================== =============================================================== From eb970c539f251cb35b9fe6c4da34653d093c1b51 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 16 Aug 2023 15:35:30 -0600 Subject: [PATCH 49/61] restrict log message to masterproc modified: src/dynamics/se/dyn_comp.F90 --- src/dynamics/se/dyn_comp.F90 | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dynamics/se/dyn_comp.F90 b/src/dynamics/se/dyn_comp.F90 index 6504eb75cd..38603c637b 100644 --- a/src/dynamics/se/dyn_comp.F90 +++ b/src/dynamics/se/dyn_comp.F90 @@ -763,8 +763,10 @@ subroutine dyn_init(dyn_in, dyn_out) (hvcoord%hyam(:)+hvcoord%hybm(:))*hvcoord%ps0,km_sponge_factor,& kmvis_ref,kmcnd_ref,rho_ref) - write(iulog,*) "Molecular viscoity and thermal conductivity reference profile" - write(iulog,*) "k, p, z, km_sponge_factor, kmvis_ref/rho_ref, kmcnd_ref/(cp*rho_ref):" + if (masterproc) then + write(iulog,*) "Molecular viscoity and thermal conductivity reference profile" + write(iulog,*) "k, p, z, km_sponge_factor, kmvis_ref/rho_ref, kmcnd_ref/(cp*rho_ref):" + end if do k=1,nlev ! only apply molecular viscosity where viscosity is > 1000 m/s^2 if (MIN(kmvis_ref(k)/rho_ref(k),kmcnd_ref(k)/(cpair*rho_ref(k)))>1000.0_r8) then From 21c4f6f12ee2c27a26e651a7d7d0c737edc3e968 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 22 Aug 2023 08:39:34 -0600 Subject: [PATCH 50/61] minor fixes modified: cime_config/testdefs/testlist_cam.xml modified: src/dynamics/se/dyn_comp.F90 --- cime_config/testdefs/testlist_cam.xml | 8 ++++---- src/dynamics/se/dyn_comp.F90 | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml index 5ee5f95aa7..e339bd4afc 100644 --- a/cime_config/testdefs/testlist_cam.xml +++ b/cime_config/testdefs/testlist_cam.xml @@ -1595,7 +1595,7 @@ - + @@ -1604,7 +1604,7 @@ - + @@ -1613,7 +1613,7 @@ - + @@ -1622,7 +1622,7 @@ - + diff --git a/src/dynamics/se/dyn_comp.F90 b/src/dynamics/se/dyn_comp.F90 index 38603c637b..683565267c 100644 --- a/src/dynamics/se/dyn_comp.F90 +++ b/src/dynamics/se/dyn_comp.F90 @@ -764,7 +764,7 @@ subroutine dyn_init(dyn_in, dyn_out) kmvis_ref,kmcnd_ref,rho_ref) if (masterproc) then - write(iulog,*) "Molecular viscoity and thermal conductivity reference profile" + write(iulog,*) "Molecular viscosity and thermal conductivity reference profile" write(iulog,*) "k, p, z, km_sponge_factor, kmvis_ref/rho_ref, kmcnd_ref/(cp*rho_ref):" end if do k=1,nlev From bde9720fab59b8f1bf939be208418b785b7241a4 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 23 Aug 2023 09:13:36 -0600 Subject: [PATCH 51/61] ChangeLog draft --- doc/ChangeLog | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index bf2db678b4..1d979ffe70 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,115 @@ =============================================================== +Tag name: cam6_3_124 +Originator(s): fvitt +Date: 23 Aug 2023 +One-line Summary: Fix issues exposed by FMTHIST; add regression tests for FLTHIST and FMTHIST +Github PR URL: https://github.com/ESCOMP/CAM/pull/872 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Fix memory issue in code that reads input data on the native unstructured grid. + Fix floating point exception issue in aerosol wet deposition caused by undefined values in + BERGSO (conversion of cloud water to snow) above above pumus active region + + Address github issues: + Increase PE layout for MT runs #812 + Introduce regression tests for FLTHIST and FMTHIST #841 + +Describe any changes made to build system: + +Describe any changes made to the namelist: + +List any changes to the defaults for the boundary datasets: + +Describe any substantial timing or memory changes: + +Code reviewed by: cacraigucar nusbaume + +List all files eliminated: + +List all files added and what they do: + +List all existing files that have been modified, and describe the changes: +M Externals.cfg +M bld/namelist_files/namelist_defaults_cam.xml + - default spun-up IC file for L93 ne30 CAM-Chem-SE + +M cime_config/config_compsets.xml + - remove "_v0d" from FLTHIST and FMTHIST compset short names + +M cime_config/config_pes.xml + - set default PE layouts for FLTHIST and FMTHIST compsets + +M cime_config/testdefs/testlist_cam.xml + - add cheyenne regression tests for FLTHIST and FMTHIST compsets + +M src/chemistry/utils/tracer_data.F90 + - remove unused ps field that was allocated using undefined sizes when + the input file was on the native unsctructured model grid + +M src/dynamics/se/dyn_comp.F90 + - write "Molecular viscosity" message only if masterproc + +M src/physics/cam_dev/micro_pumas_cam.F90 + - zero bergo field above top_lev + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: +aux_cam_20230822154526: 61 tests + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + FAIL SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_123: DIFF + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + FAIL ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 RUN time=287 + PEND ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 COMPARE_base_rest + - pre-extisting failures + + ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_123: ERROR BFAIL baseline directory '/glade/p/cesm/amwg/cesm_baselines/cam6_3_123/ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.cheyenne_intel.cam-outfrq9s' does not exist + SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s (Overall: DIFF) details: + FAIL SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s NLCOMP + FAIL SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_123: ERROR BFAIL baseline directory '/glade/p/cesm/amwg/cesm_baselines/cam6_3_123/SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s' does not exist + - new tests + + +izumi/nag/aux_cam: + +izumi/gnu/aux_cam: + +CAM tag used for the baseline comparison tests if different than previous +tag: + +Summarize any changes to answers, i.e., +- what code configurations: +- what platforms/compilers: +- nature of change (roundoff; larger than roundoff but same climate; new + climate): + +If bitwise differences were observed, how did you show they were no worse +than roundoff? + +If this tag changes climate describe the run(s) done to evaluate the new +climate in enough detail that it(they) could be reproduced, i.e., +- source tag (all code used must be in the repository): +- platform/compilers: +- configure commandline: +- build-namelist command (or complete namelist): +- MSS location of output: + +MSS location of control simulations used to validate new climate: + +URL for AMWG diagnostics output used to validate new climate: + +=============================================================== +=============================================================== + Tag name: cam6_3_123 Originator(s): cacraig, jedwards, fvitt Date: August 16, 2023 From f39a204a6d36f619359db091645f520e4eaa7d4a Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 23 Aug 2023 13:40:47 -0600 Subject: [PATCH 52/61] ChangeLog update --- doc/ChangeLog | 30 +++++------------------------- 1 file changed, 5 insertions(+), 25 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 1d979ffe70..9d6fd22886 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -78,34 +78,14 @@ aux_cam_20230822154526: 61 tests FAIL SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s BASELINE /glade/p/cesm/amwg/cesm_baselines/cam6_3_123: ERROR BFAIL baseline directory '/glade/p/cesm/amwg/cesm_baselines/cam6_3_123/SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s' does not exist - new tests - izumi/nag/aux_cam: + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + FAIL DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae RUN time=10 + - pre-extisting failure -izumi/gnu/aux_cam: - -CAM tag used for the baseline comparison tests if different than previous -tag: - -Summarize any changes to answers, i.e., -- what code configurations: -- what platforms/compilers: -- nature of change (roundoff; larger than roundoff but same climate; new - climate): - -If bitwise differences were observed, how did you show they were no worse -than roundoff? - -If this tag changes climate describe the run(s) done to evaluate the new -climate in enough detail that it(they) could be reproduced, i.e., -- source tag (all code used must be in the repository): -- platform/compilers: -- configure commandline: -- build-namelist command (or complete namelist): -- MSS location of output: - -MSS location of control simulations used to validate new climate: +izumi/gnu/aux_cam: All PASS -URL for AMWG diagnostics output used to validate new climate: +Summarize any changes to answers: bit-for-bit unchanged =============================================================== =============================================================== From 7289b7a75a15b89f69df142826cf232668cfb8ef Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 23 Aug 2023 13:57:51 -0600 Subject: [PATCH 53/61] ChangeLog update --- doc/ChangeLog | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 9d6fd22886..672f32bfc4 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -8,7 +8,7 @@ Github PR URL: https://github.com/ESCOMP/CAM/pull/872 Purpose of changes (include the issue number and title text for each relevant GitHub issue): - Fix memory issue in code that reads input data on the native unstructured grid. + Fix memory issue in code that reads input data on the native unstructured model grid. Fix floating point exception issue in aerosol wet deposition caused by undefined values in BERGSO (conversion of cloud water to snow) above above pumus active region @@ -16,19 +16,19 @@ Purpose of changes (include the issue number and title text for each relevant Gi Increase PE layout for MT runs #812 Introduce regression tests for FLTHIST and FMTHIST #841 -Describe any changes made to build system: +Describe any changes made to build system: n/a -Describe any changes made to the namelist: +Describe any changes made to the namelist: n/a -List any changes to the defaults for the boundary datasets: +List any changes to the defaults for the boundary datasets: n/a -Describe any substantial timing or memory changes: +Describe any substantial timing or memory changes: n/a Code reviewed by: cacraigucar nusbaume -List all files eliminated: +List all files eliminated: n/a -List all files added and what they do: +List all files added and what they do: n/a List all existing files that have been modified, and describe the changes: M Externals.cfg From 781349a84deda86fcca92b409b37833bd43daf58 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Wed, 23 Aug 2023 14:00:23 -0600 Subject: [PATCH 54/61] ChangeLog update --- doc/ChangeLog | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 672f32bfc4..90c1a34aff 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -60,7 +60,6 @@ then copy the lines from the td.*.status files for the failed tests to the appropriate machine below. All failed tests must be justified. cheyenne/intel/aux_cam: -aux_cam_20230822154526: 61 tests ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: FAIL ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s COMPARE_base_rest SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: From 8b4138f0ed4665460cb191546cd5e7a4100529a2 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Thu, 24 Aug 2023 15:43:37 -0600 Subject: [PATCH 55/61] Some of Matt's change requests modified: src/chemistry/aerosol/aerosol_state_mod.F90 modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 modified: src/physics/cam/aerosol_optics_cam.F90 --- src/chemistry/aerosol/aerosol_state_mod.F90 | 8 ++++---- .../aerosol/refractive_aerosol_optics_mod.F90 | 4 +--- src/physics/cam/aerosol_optics_cam.F90 | 14 ++++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/chemistry/aerosol/aerosol_state_mod.F90 b/src/chemistry/aerosol/aerosol_state_mod.F90 index 0e036b84e9..04dc30e893 100644 --- a/src/chemistry/aerosol/aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/aerosol_state_mod.F90 @@ -92,7 +92,7 @@ subroutine aero_get_state_mmr(self, species_ndx, bin_ndx, mmr) class(aerosol_state), intent(in) :: self integer, intent(in) :: species_ndx ! species index integer, intent(in) :: bin_ndx ! bin index - real(r8), pointer :: mmr(:,:) ! mass mixing ratios + real(r8), pointer :: mmr(:,:) ! mass mixing ratios (ncol,nlev) end subroutine aero_get_state_mmr !------------------------------------------------------------------------ @@ -105,7 +105,7 @@ subroutine aero_get_list_mmr(self, list_ndx, species_ndx, bin_ndx, mmr) integer, intent(in) :: list_ndx ! rad climate/diagnostic list index integer, intent(in) :: species_ndx ! species index integer, intent(in) :: bin_ndx ! bin index - real(r8), pointer :: mmr(:,:) ! mass mixing ratios + real(r8), pointer :: mmr(:,:) ! mass mixing ratios (ncol,nlev) end subroutine aero_get_list_mmr !------------------------------------------------------------------------ @@ -115,7 +115,7 @@ subroutine aero_get_state_num(self, bin_ndx, num) import :: aerosol_state, r8 class(aerosol_state), intent(in) :: self integer, intent(in) :: bin_ndx ! bin index - real(r8), pointer :: num(:,:) ! number densities + real(r8), pointer :: num(:,:) ! number densities (ncol,nlev) end subroutine aero_get_state_num !------------------------------------------------------------------------ @@ -225,7 +225,7 @@ function aero_hygroscopicity(self, list_ndx, bin_ndx) result(kappa) integer, intent(in) :: list_ndx ! rad climate/diagnostic list index integer, intent(in) :: bin_ndx ! bin number - real(r8), pointer :: kappa(:,:) + real(r8), pointer :: kappa(:,:) ! hygroscopicity (ncol,nlev) end function aero_hygroscopicity diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index d4827d3db7..a7e3c3a183 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -283,9 +283,7 @@ subroutine lw_props(self, ncol, ilev, iwav, pabs) do icol = 1, ncol crefin(icol) = crefin(icol) + self%watervol(icol,ilev)*self%crefwlw(iwav) - if (self%wetvol(icol,ilev) > 1.e-40_r8) then - crefin(icol) = crefin(icol)/self%wetvol(icol,ilev) - end if + crefin(icol) = crefin(icol)/max(self%wetvol(icol,ilev), 1.e-40) refr(icol) = real(crefin(icol)) refi(icol) = aimag(crefin(icol)) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 5e0aa88f84..630dae42a5 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -318,7 +318,7 @@ subroutine aerosol_optics_cam_init burden_fields(n)%name(m) = fldname write(lngname,'(a,i2.2)') 'Aerosol burden bin ', m call addfld (fldname, horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -334,7 +334,7 @@ subroutine aerosol_optics_cam_init aoddust_fields(n)%name(m) = fldname write(lngname,'(a,i2,a)') 'Aerosol optical depth, day only, 550 nm mode ',m,' from dust' call addfld (aoddust_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -342,7 +342,7 @@ subroutine aerosol_optics_cam_init burdendn_fields(n)%name(m) = fldname write(lngname,'(a,i2)') 'Aerosol burden, day night, bin ', m call addfld (burdendn_fields(n)%name(m), horiz_only, 'A', 'kg/m2', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -358,7 +358,7 @@ subroutine aerosol_optics_cam_init aoddustdn_fields(n)%name(m) = fldname write(lngname,'(a,i2,a)') 'Aerosol optical depth 550 nm, day night, bin ',m,' from dust' call addfld (aoddustdn_fields(n)%name(m), horiz_only, 'A', ' ', lngname, flag_xyfill=.true.) - if (m>3 .and. history_aero_optics) then + if (history_aero_optics) then call add_default (fldname, 1, ' ') end if @@ -505,8 +505,10 @@ subroutine aerosol_optics_cam_final integer :: iaermod do iaermod = 1,num_aero_models - deallocate(aero_props(iaermod)%obj) - nullify(aero_props(iaermod)%obj) + if (associated(aero_props(iaermod)%obj)) then + deallocate(aero_props(iaermod)%obj) + nullify(aero_props(iaermod)%obj) + end if end do if (allocated(aero_props)) then From 15e832ce38de64b525aa9ee04eab8a38d6fcf8e5 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 28 Aug 2023 08:07:07 -0600 Subject: [PATCH 56/61] more code reviewers requests modified: src/chemistry/aerosol/aerosol_properties_mod.F90 modified: src/chemistry/aerosol/aerosol_state_mod.F90 modified: src/chemistry/aerosol/modal_aerosol_state_mod.F90 modified: src/physics/cam/aerosol_optics_cam.F90 --- .../aerosol/aerosol_properties_mod.F90 | 10 ++++----- src/chemistry/aerosol/aerosol_state_mod.F90 | 6 ++--- .../aerosol/modal_aerosol_state_mod.F90 | 22 +++++++++---------- src/physics/cam/aerosol_optics_cam.F90 | 13 +++++------ 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/chemistry/aerosol/aerosol_properties_mod.F90 b/src/chemistry/aerosol/aerosol_properties_mod.F90 index 865ee0b799..aadd56f87d 100644 --- a/src/chemistry/aerosol/aerosol_properties_mod.F90 +++ b/src/chemistry/aerosol/aerosol_properties_mod.F90 @@ -49,9 +49,9 @@ module aerosol_properties_mod procedure :: indexer procedure :: maxsat procedure(aero_amcube), deferred :: amcube - procedure :: alogsig0 + procedure :: alogsig_0list procedure(aero_alogsig_rlist), deferred :: alogsig_rlist - generic :: alogsig => alogsig0,alogsig_rlist + generic :: alogsig => alogsig_0list,alogsig_rlist procedure(aero_number_transported), deferred :: number_transported procedure(aero_props_get), deferred :: get procedure(aero_actfracs), deferred :: actfracs @@ -565,12 +565,12 @@ end function ncnst_tot !------------------------------------------------------------------------------ ! returns the natural log of geometric standard deviation of the number distribution for aerosol bin !------------------------------------------------------------------------------ - pure real(r8) function alogsig0(self, bin_ndx) + pure real(r8) function alogsig_0list(self, bin_ndx) class(aerosol_properties), intent(in) :: self integer, intent(in) :: bin_ndx ! bin number - alogsig0 = self%alogsig_(bin_ndx) - end function alogsig0 + alogsig_0list = self%alogsig_(bin_ndx) + end function alogsig_0list !------------------------------------------------------------------------------ ! returns maximum supersaturation diff --git a/src/chemistry/aerosol/aerosol_state_mod.F90 b/src/chemistry/aerosol/aerosol_state_mod.F90 index 04dc30e893..b0e8d24a1e 100644 --- a/src/chemistry/aerosol/aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/aerosol_state_mod.F90 @@ -28,9 +28,9 @@ module aerosol_state_mod procedure(aero_get_transported), deferred :: get_transported procedure(aero_set_transported), deferred :: set_transported procedure(aero_get_amb_total_bin_mmr), deferred :: ambient_total_bin_mmr - procedure(aero_get_state_mmr), deferred :: get_ambient_mmr0 - procedure(aero_get_list_mmr), deferred :: get_ambient_mmrl - generic :: get_ambient_mmr=>get_ambient_mmr0,get_ambient_mmrl + procedure(aero_get_state_mmr), deferred :: get_ambient_mmr_0list + procedure(aero_get_list_mmr), deferred :: get_ambient_mmr_rlist + generic :: get_ambient_mmr=>get_ambient_mmr_0list,get_ambient_mmr_rlist procedure(aero_get_state_mmr), deferred :: get_cldbrne_mmr procedure(aero_get_state_num), deferred :: get_ambient_num procedure(aero_get_state_num), deferred :: get_cldbrne_num diff --git a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 index c58cac0c8a..398b272a27 100644 --- a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 @@ -24,8 +24,8 @@ module modal_aerosol_state_mod procedure :: get_transported procedure :: set_transported procedure :: ambient_total_bin_mmr - procedure :: get_ambient_mmr0 - procedure :: get_ambient_mmrl + procedure :: get_ambient_mmr_0list + procedure :: get_ambient_mmr_rlist procedure :: get_cldbrne_mmr procedure :: get_ambient_num procedure :: get_cldbrne_num @@ -132,28 +132,28 @@ end function ambient_total_bin_mmr !------------------------------------------------------------------------------ ! returns ambient aerosol mass mixing ratio for a given species index and bin index !------------------------------------------------------------------------------ - subroutine get_ambient_mmr0(self, species_ndx, bin_ndx, mmr) + subroutine get_ambient_mmr_0list(self, species_ndx, bin_ndx, mmr) class(modal_aerosol_state), intent(in) :: self integer, intent(in) :: species_ndx ! species index integer, intent(in) :: bin_ndx ! bin index - real(r8), pointer :: mmr(:,:) ! mass mixing ratios + real(r8), pointer :: mmr(:,:) ! mass mixing ratios (ncol,nlev) call rad_cnst_get_aer_mmr(0, bin_ndx, species_ndx, 'a', self%state, self%pbuf, mmr) - end subroutine get_ambient_mmr0 + end subroutine get_ambient_mmr_0list !------------------------------------------------------------------------------ ! returns ambient aerosol mass mixing ratio for a given radiation diagnostics ! list index, species index and bin index !------------------------------------------------------------------------------ - subroutine get_ambient_mmrl(self, list_ndx, species_ndx, bin_ndx, mmr) + subroutine get_ambient_mmr_rlist(self, list_ndx, species_ndx, bin_ndx, mmr) class(modal_aerosol_state), intent(in) :: self integer, intent(in) :: list_ndx ! rad climate list index integer, intent(in) :: species_ndx ! species index integer, intent(in) :: bin_ndx ! bin index - real(r8), pointer :: mmr(:,:) ! mass mixing ratios + real(r8), pointer :: mmr(:,:) ! mass mixing ratios (ncol,nlev) call rad_cnst_get_aer_mmr(list_ndx, bin_ndx, species_ndx, 'a', self%state, self%pbuf, mmr) - end subroutine get_ambient_mmrl + end subroutine get_ambient_mmr_rlist !------------------------------------------------------------------------------ ! returns cloud-borne aerosol number mixing ratio for a given species index and bin index @@ -428,10 +428,10 @@ end function hetfrz_size_wght !------------------------------------------------------------------------------ function hygroscopicity(self, list_ndx, bin_ndx) result(kappa) class(modal_aerosol_state), intent(in) :: self - integer, intent(in) :: list_ndx ! rad climate list number - integer, intent(in) :: bin_ndx ! bin number + integer, intent(in) :: list_ndx ! rad climate list number + integer, intent(in) :: bin_ndx ! bin number - real(r8), pointer :: kappa(:,:) + real(r8), pointer :: kappa(:,:) ! hygroscopicity (ncol,nlev) nullify(kappa) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 630dae42a5..31118ea10b 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -9,7 +9,7 @@ module aerosol_optics_cam use ppgrid, only: pcols, pver use physconst, only: rga, rair use cam_abortutils, only: endrun - use spmd_utils, only : masterproc + use spmd_utils, only: masterproc use rad_constituents, only: n_diag, rad_cnst_get_call_list use cam_history, only: addfld, add_default, outfld, horiz_only, fieldname_len use cam_history_support, only: fillvalue @@ -79,6 +79,7 @@ subroutine aerosol_optics_cam_readnl(nlfile) character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input integer :: unitn, ierr + character(len=cl) :: errmsg character(len=*), parameter :: subname = 'aerosol_optics_cam_readnl' ! =================== @@ -95,7 +96,8 @@ subroutine aerosol_optics_cam_readnl(nlfile) if (ierr == 0) then read(unitn, aerosol_optics_nl, iostat=ierr) if (ierr /= 0) then - call endrun(subname // ':: ERROR reading namelist') + write(errmsg,'(2a,i10)') subname,':: ERROR reading namelist, error code: ',ierr + call endrun(errmsg) end if end if close(unitn) @@ -121,7 +123,7 @@ subroutine aerosol_optics_cam_init use phys_control, only: phys_getopts use ioFileMod, only: getfil - character(len=*), parameter :: prefix = 'aerosol_optics_cam_sw: ' + character(len=*), parameter :: prefix = 'aerosol_optics_cam_init: ' integer :: nmodes=0, iaermod, istat, ilist, i logical :: call_list(0:n_diag) @@ -134,7 +136,7 @@ subroutine aerosol_optics_cam_init logical :: history_amwg ! output the variables used by the AMWG diag package logical :: history_dust ! output dust diagnostics - character(len=256) :: locfile + character(len=cl) :: locfile call phys_getopts(history_amwg_out = history_amwg, & history_aero_optics_out = history_aero_optics, & @@ -985,9 +987,7 @@ subroutine output_tot_diags call outfld('AODUVdn'//diag(list_idx), aoduv, pcols, lchnk) call outfld('AODVISdn'//diag(list_idx), aodvis, pcols, lchnk) call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) - call outfld('AODNIRdn'//diag(list_idx), aodnir, pcols, lchnk) - call outfld('AODABSdn'//diag(list_idx), aodabs, pcols, lchnk) call outfld('AODTOTdn'//diag(list_idx), aodtot, pcols, lchnk) call outfld('EXTINCTUVdn'//diag(list_idx), extinctuv, pcols, lchnk) call outfld('EXTINCTNIRdn'//diag(list_idx), extinctnir, pcols, lchnk) @@ -1022,7 +1022,6 @@ subroutine output_tot_diags call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) call outfld('AODNIR'//diag(list_idx), aodnir, pcols, lchnk) - call outfld('AODABS'//diag(list_idx), aodabs, pcols, lchnk) call outfld('AODTOT'//diag(list_idx), aodtot, pcols, lchnk) call outfld('EXTINCTUV'//diag(list_idx), extinctuv, pcols, lchnk) call outfld('EXTINCTNIR'//diag(list_idx), extinctnir, pcols, lchnk) From b085542e8a1b129c9cd9fb6e1f6f29f39fdcb202 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Mon, 28 Aug 2023 11:04:01 -0600 Subject: [PATCH 57/61] specify cloud-borne mmr dimensions in comment modified: src/chemistry/aerosol/modal_aerosol_state_mod.F90 --- src/chemistry/aerosol/modal_aerosol_state_mod.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 index 398b272a27..8f50e5b7e9 100644 --- a/src/chemistry/aerosol/modal_aerosol_state_mod.F90 +++ b/src/chemistry/aerosol/modal_aerosol_state_mod.F90 @@ -162,7 +162,7 @@ subroutine get_cldbrne_mmr(self, species_ndx, bin_ndx, mmr) class(modal_aerosol_state), intent(in) :: self integer, intent(in) :: species_ndx ! species index integer, intent(in) :: bin_ndx ! bin index - real(r8), pointer :: mmr(:,:) ! mass mixing ratios + real(r8), pointer :: mmr(:,:) ! mass mixing ratios (ncol,nlev) call rad_cnst_get_aer_mmr(0, bin_ndx, species_ndx, 'c', self%state, self%pbuf, mmr) end subroutine get_cldbrne_mmr From cbe401a6a8714ca368e83de685476ec11eca9abf Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 29 Aug 2023 08:09:51 -0600 Subject: [PATCH 58/61] impose floor for radsurf modified: src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 --- src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 index a7e3c3a183..a789db0383 100644 --- a/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 +++ b/src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 @@ -61,8 +61,10 @@ module refractive_aerosol_optics_mod end interface refractive_aerosol_optics ! radius limits (m) - real(r8), parameter :: xrmin=log(0.01e-6_r8) ! min log(aerosol surface mode radius) - real(r8), parameter :: xrmax=log(25.e-6_r8) ! max log(aerosol surface mode radius) + real(r8), parameter :: radmin = 0.01e-6_r8 ! min aerosol surface mode radius (m) + real(r8), parameter :: radmax = 25.e-6_r8 ! max aerosol surface mode radius (m) + real(r8), parameter :: xrmin=log(radmin) ! min log(aerosol surface mode radius) + real(r8), parameter :: xrmax=log(radmax) ! max log(aerosol surface mode radius) contains @@ -362,7 +364,7 @@ subroutine modal_size_parameters(ncoef,ncol,nlev, alnsg_amode, dgnumwet, radsurf do k = 1, nlev do i = 1, ncol ! convert from number mode diameter to surface area - radsurf(i,k) = 0.5_r8*dgnumwet(i,k)*explnsigma + radsurf(i,k) = max(0.5_r8*dgnumwet(i,k)*explnsigma,radmin) logradsurf(i,k) = log(radsurf(i,k)) ! normalize size parameter xrad(i) = max(logradsurf(i,k),xrmin) From f3b788e2752c61147d56d35d9d80d007796b62af Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 29 Aug 2023 09:19:11 -0600 Subject: [PATCH 59/61] restore flag_xyfill for some optics diagnostics modified: src/physics/cam/aerosol_optics_cam.F90 --- src/physics/cam/aerosol_optics_cam.F90 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/physics/cam/aerosol_optics_cam.F90 b/src/physics/cam/aerosol_optics_cam.F90 index 31118ea10b..eb094446c8 100644 --- a/src/physics/cam/aerosol_optics_cam.F90 +++ b/src/physics/cam/aerosol_optics_cam.F90 @@ -212,29 +212,29 @@ subroutine aerosol_optics_cam_init 'Aerosol optical depth summed over all sw wavelengths', flag_xyfill=.true.) call addfld ('EXTINCTdn'//diag(ilist), (/ 'lev' /), 'A','/m',& - 'Aerosol extinction 550 nm, day only') + 'Aerosol extinction 550 nm, day only', flag_xyfill=.true.) call addfld ('EXTINCTUVdn'//diag(ilist), (/ 'lev' /), 'A','/m',& - 'Aerosol extinction 350 nm, day only') + 'Aerosol extinction 350 nm, day only', flag_xyfill=.true.) call addfld ('EXTINCTNIRdn'//diag(ilist), (/ 'lev' /), 'A','/m',& - 'Aerosol extinction 1020 nm, day only') + 'Aerosol extinction 1020 nm, day only', flag_xyfill=.true.) call addfld ('ABSORBdn'//diag(ilist), (/ 'lev' /), 'A','/m',& - 'Aerosol absorption, day only') + 'Aerosol absorption, day only', flag_xyfill=.true.) call addfld ('AODVISdn'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol optical depth 550 nm') + 'Aerosol optical depth 550 nm', flag_xyfill=.true.) call addfld ('AODVISstdn'//diag(ilist), horiz_only, 'A',' ', & - 'Stratospheric aerosol optical depth 550 nm, day only') + 'Stratospheric aerosol optical depth 550 nm, day only', flag_xyfill=.true.) call addfld ('AODNIRstdn'//diag(ilist), horiz_only, 'A',' ', & - 'Stratospheric aerosol optical depth 1020 nm, day only') + 'Stratospheric aerosol optical depth 1020 nm, day only', flag_xyfill=.true.) call addfld ('AODUVstdn'//diag(ilist), horiz_only, 'A',' ', & - 'Stratospheric aerosol optical depth 350 nm, day only') + 'Stratospheric aerosol optical depth 350 nm, day only', flag_xyfill=.true.) call addfld ('AODUVdn'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol optical depth 350 nm, day only') + 'Aerosol optical depth 350 nm, day only', flag_xyfill=.true.) call addfld ('AODNIRdn'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol optical depth 1020 nm, day only',flag_xyfill=.true.) + 'Aerosol optical depth 1020 nm, day only', flag_xyfill=.true.) call addfld ('AODABSdn'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol absorption optical depth 550 nm, day only') + 'Aerosol absorption optical depth 550 nm, day only', flag_xyfill=.true.) call addfld ('AODxASYMdn'//diag(ilist), horiz_only, 'A',' ', & - 'Aerosol optical depth 550 * asymmetry factor, day only') + 'Aerosol optical depth 550 * asymmetry factor, day only', flag_xyfill=.true.) call addfld ('EXTxASYMdn'//diag(ilist), (/ 'lev' /), 'A',' ', & 'extinction 550 nm * asymmetry factor, day only', flag_xyfill=.true.) call addfld ('AODTOTdn'//diag(ilist), horiz_only, 'A','1',& From fe7aeaa1cb7d93b5f7cb163fd097e98edbf9fc84 Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 29 Aug 2023 12:44:10 -0600 Subject: [PATCH 60/61] update ChangeLog --- doc/ChangeLog | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) diff --git a/doc/ChangeLog b/doc/ChangeLog index 90c1a34aff..1a8c03424a 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -1,5 +1,176 @@ =============================================================== +Tag name: cam6_3_125 +Originator(s): fvitt +Date: 29 Aug 2023 +One-line Summary: Generalize aerosol optics +Github PR URL: https://github.com/ESCOMP/CAM/pull/824 + +Purpose of changes (include the issue number and title text for each relevant GitHub issue): + + Issue #816 -- Refactor aerosol optics to use abstract aerosol optics class + +Describe any changes made to build system: + +Describe any changes made to the namelist: + +List any changes to the defaults for the boundary datasets: + +Describe any substantial timing or memory changes: + +Code reviewed by: + +List all files eliminated: + +D src/physics/cam/modal_aer_opt.F90 + - replaced by generalized aer_rad_props module + +List all files added and what they do: + +A src/chemistry/aerosol/aerosol_optics_mod.F90 + - abstract interface to aerosol optics + +A src/chemistry/aerosol/refractive_aerosol_optics_mod.F90 + - index of refaction based aerosol optics + +A src/physics/cam/aerosol_optics_cam.F90 + - generalized aerosol optics module + +List all existing files that have been modified, and describe the changes: + +M bld/namelist_files/namelist_definition.xml + - modal_aer_opt_nl group renamed as aerosol_optics_nl + +M src/chemistry/aerosol/aerosol_properties_mod.F90 +M src/chemistry/aerosol/modal_aerosol_properties_mod.F90 + - add methods for optical parameters + +M src/chemistry/aerosol/aerosol_state_mod.F90 +M src/chemistry/aerosol/modal_aerosol_state_mod.F90 + - add methods for optics + +M src/control/runtime_opts.F90 + - modal_aer_opt --> aerosol_optics_cam + +M src/physics/cam/aer_rad_props.F90 + - modal_aer_opt --> aerosol_optics_cam + +M src/physics/cam/rad_constituents.F90 + - add opticstype arg to rad_cnst_get_mode_props + +M src/physics/rrtmg/radiation.F90 + - remove modal_aer_opt_init call + +If there were any failures reported from running test_driver.sh on any test +platform, and checkin with these failures has been OK'd by the gatekeeper, +then copy the lines from the td.*.status files for the failed tests to the +appropriate machine below. All failed tests must be justified. + +cheyenne/intel/aux_cam: + + ERP_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.FW2000climo.cheyenne_intel.cam-outfrq9s_wcm_ne30 (Overall: FAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq9s (Overall: FAIL) details: + SMS_Lh12_Vnuopc.f09_f09_mg17.FCSD_HCO.cheyenne_intel.cam-outfrq3h (Overall: DIFF) details: + - pre-existing failures + + ERC_D_Ln9_P144x1_Vnuopc.ne16pg3_ne16pg3_mg17.QPC6HIST.cheyenne_intel.cam-outfrq3s_ttrac_usecase (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq3s_cosp (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne16_ne16_mg17.QPC5HIST.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + ERP_D_Ln9.ne30pg3_ne30pg3_mg17.FLTHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.f09_f09_mg17.QSC6.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.f19_f19_mg17.QPC6.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_D_Ln9_Vnuopc.ne30pg3_ne30pg3_mg17.F2000dev.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ld3_Vnuopc.f09_f09_mg17.FWHIST.cheyenne_intel.cam-reduced_hist1d (Overall: NLFAIL) details: + ERP_Ln9_P24x3_Vnuopc.f45_f45_mg37.QPWmaC6.cheyenne_intel.cam-outfrq9s_mee_fluxes (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.C96_C96_mg17.F2000climo.cheyenne_intel.cam-outfrq9s_mg3 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F1850.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000climo.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2000dev.cheyenne_intel.cam-outfrq9s_mg3 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f09_f09_mg17.FHIST_BDRD.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.f19_f19_mg17.FWsc1850.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne30_ne30_mg17.FCnudged.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ld3_Vnuopc.f10_f10_mg37.F1850.cheyenne_intel.cam-outfrq1d_14dec_ghg_cam_dev (Overall: NLFAIL) details: + ERS_Ln9_P288x1_Vnuopc.mpasa120_mpasa120.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa120 (Overall: NLFAIL) details: + ERS_Ln9_P36x1_Vnuopc.mpasa480_mpasa480.F2000climo.cheyenne_intel.cam-outfrq9s_mpasa480 (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.f09_f09_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + ERS_Ln9_Vnuopc.f19_f19_mg17.FXSD.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC5.cheyenne_intel.cam-scm_prep (Overall: NLFAIL) details: + SMS_D_Ld2_Vnuopc.f19_f19_mg17.QPC5HIST.cheyenne_intel.cam-volc_usecase (Overall: NLFAIL) details: + SMS_D_Ln9.ne30pg3_ne30pg3_mg17.FMTHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCts2nudged.cheyenne_intel.cam-outfrq9s_leapday (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FCvbsxHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f09_f09_mg17.FSD.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FWma2000climo.cheyenne_intel.cam-outfrq9s_waccm_ma_mam4 (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.FXHIST.cheyenne_intel.cam-outfrq9s_amie (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC2000climo.cheyenne_intel.cam-outfrq3s_usecase (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f19_f19_mg17.QPC5M7.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne16_ne16_mg17.FX2000.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne0ARCTICne30x4_ne0ARCTICne30x4_mt12.FHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne0CONUSne30x8_ne0CONUSne30x8_mt12.FCHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc_P720x1.ne30pg3_ne30pg3_mg17.FCLTHIST.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.T42_T42.FSCAM.cheyenne_intel.cam-outfrq9s (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f09_f09_mg17.FW2000climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.f19_f19.F2000dev.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld1_Vnuopc.ne30pg3_ne30pg3_mg17.FC2010climo.cheyenne_intel.cam-outfrq1d (Overall: NLFAIL) details: + SMS_Ld5_Vnuopc.f09_f09_mg17.PC6.cheyenne_intel.cam-cam6_port_f09 (Overall: NLFAIL) details: + SMS_Lm13_Vnuopc.f10_f10_mg37.F2000climo.cheyenne_intel.cam-outfrq1m (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f09_f09_mg17.F2010climo.cheyenne_intel.cam-nudging (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f09_f09_mg17.FW1850.cheyenne_intel.cam-reduced_hist3s (Overall: NLFAIL) details: + SMS_Ln9_Vnuopc.f19_f19.F2000climo.cheyenne_intel.cam-silhs (Overall: NLFAIL) details: + - modal_aer_opt_nl namelist group renamed as aerosol_optics_nl + +izumi/nag/aux_cam: + + DAE_Vnuopc.f45_f45_mg37.FHS94.izumi_nag.cam-dae (Overall: FAIL) details: + - pre-existing failure + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-carma_sea_salt (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_cosp (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_subcol (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_am (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_convmic (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s_cospsathist (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC6.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPWmaC6.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-outfrq3s_ttrac (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: NLFAIL) details: + ERI_D_Ln18_Vnuopc.f19_f19_mg17.QPC6.izumi_nag.cam-ghgrmp_e8 (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC6.izumi_nag.cam-outfrq9s_clubbmf (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_nag.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + SMS_D_Ld2_Vnuopc.f45_f45_mg37.PC5.izumi_nag.cam-outfrq24h_port (Overall: NLFAIL) details: + SMS_D_Ln7_Vnuopc.T42_T42_mg17.QPSCAMC5.izumi_nag.cam-scmarm (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-rad_diag_mam (Overall: NLFAIL) details: + SMS_P48x1_D_Ln3_Vnuopc.f09_f09_mg17.QPC6HIST.izumi_nag.cam-outfrq3s_co2cycle_usecase (Overall: NLFAIL) details: + SUB_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s (Overall: NLFAIL) details: + TMC_D_Vnuopc.f10_f10_mg37.QPC5.izumi_nag.cam-outfrq3s_eoyttrac (Overall: NLFAIL) details: + TMC_D_Vnuopc.T5_T5_mg37.QPC5.izumi_nag.cam-ghgrmp_e8 (Overall: NLFAIL) details: + - modal_aer_opt_nl namelist group renamed as aerosol_optics_nl + +izumi/gnu/aux_cam: + + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPC5.izumi_gnu.cam-outfrq3s_unicon (Overall: NLFAIL) details: + ERC_D_Ln9_Vnuopc.f10_f10_mg37.QPSPCAMM.izumi_gnu.cam-outfrq3s (Overall: NLFAIL) details: + ERP_Ln9_Vnuopc.ne5_ne5_mg37.QPC5.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal0 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal1 (Overall: NLFAIL) details: + PLB_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-ttrac_loadbal3 (Overall: NLFAIL) details: + SCT_D_Ln7_Vnuopc.T42_T42_mg17.QPC6.izumi_gnu.cam-scm_prep_c6 (Overall: NLFAIL) details: + SMS_D_Ln9.f10_f10_mg37.2000_CAM%DEV%GHGMAM4_CLM50%SP_CICE%PRES_DOCN%DOM_MOSART_SGLC_SWAV_SESP.izumi_gnu.cam-outfrq9s (Overall: NLFAIL) details: + SMS_D_Ln9_Vnuopc.ne5pg3_ne5pg3_mg37.QPC5.izumi_gnu.cam-outfrq3s_ttrac (Overall: NLFAIL) details: + - modal_aer_opt_nl namelist group renamed as aerosol_optics_nl + +Summarize any changes to answers: bit-for-bit unchanged + +=============================================================== +=============================================================== + Tag name: cam6_3_124 Originator(s): fvitt Date: 23 Aug 2023 From aeece27795d2ae71a48f84cd2b07cf1643e4ee7d Mon Sep 17 00:00:00 2001 From: Francis Vitt Date: Tue, 29 Aug 2023 13:35:12 -0600 Subject: [PATCH 61/61] ChangeLog update --- doc/ChangeLog | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/ChangeLog b/doc/ChangeLog index 1a8c03424a..bfc4e3f9ef 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -3,22 +3,25 @@ Tag name: cam6_3_125 Originator(s): fvitt Date: 29 Aug 2023 -One-line Summary: Generalize aerosol optics +One-line Summary: Introduce abstract interface to aerosol optics Github PR URL: https://github.com/ESCOMP/CAM/pull/824 Purpose of changes (include the issue number and title text for each relevant GitHub issue): - Issue #816 -- Refactor aerosol optics to use abstract aerosol optics class + Issue #816 -- Refactor aerosol optics to use abstract aerosol optics class which can be + extended for different aerosol representations such as MAM and CARMA -Describe any changes made to build system: +Describe any changes made to build system: n/a Describe any changes made to the namelist: -List any changes to the defaults for the boundary datasets: + Namelist group "modal_aer_opt_nl" is renamed as "aerosol_optics_nl" -Describe any substantial timing or memory changes: +List any changes to the defaults for the boundary datasets: n/a -Code reviewed by: +Describe any substantial timing or memory changes: n/a + +Code reviewed by: cacraigucar mattldawson nusbaume List all files eliminated: