From 79142e00dc7ee651a60442763dcb47c57df38d3e Mon Sep 17 00:00:00 2001 From: mahf708 Date: Mon, 1 Apr 2024 19:14:28 -0500 Subject: [PATCH 01/12] add vert resolved aodvis without nite fillval --- components/eam/src/physics/cam/modal_aer_opt.F90 | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index a15713275141..ab4cd9016b35 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -211,6 +211,8 @@ subroutine modal_aer_opt_init() ! Add diagnostic fields to history output. call addfld ('EXTINCT',(/ 'lev' /), 'A','/m','Aerosol extinction', flag_xyfill=.true.) + call addfld ('AER_TAU_SW_VIS', (/'lev'/), 'A', '/m', & + 'Aerosol shortwave extinction optical depth at 550 nm', flag_xyfill=.true.) call addfld ('tropopause_m',horiz_only, 'A',' m ','tropopause level in meters', flag_xyfill=.true.) call addfld ('ABSORB',(/ 'lev' /), 'A','/m','Aerosol absorption', flag_xyfill=.true.) call addfld ('AODVIS',horiz_only, 'A',' ','Aerosol optical depth 550 nm', flag_xyfill=.true., & @@ -436,6 +438,8 @@ subroutine modal_aer_opt_init() call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','1/m', & 'Aerosol extinction', flag_xyfill=.true.) + call addfld ('AER_TAU_SW_VIS'//diag(ilist), (/'lev'/), 'A', '/m', & + 'Aerosol shortwave extinction optical depth at 550 nm', flag_xyfill=.true.) call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','1/m', & 'Aerosol absorption', flag_xyfill=.true.) call addfld ('AODVIS'//diag(ilist), horiz_only, 'A',' ', & @@ -540,6 +544,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ! Diagnostics real(r8) :: extinct(pcols,pver), tropopause_m(pcols) + real(r8) :: aertauswvis(pcols, pver) real(r8) :: absorb(pcols,pver) real(r8) :: aodvis(pcols) ! extinction optical depth real(r8) :: aodall(pcols) ! extinction optical depth @@ -656,6 +661,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ! diagnostics for visible band summed over modes extinct(1:ncol,:) = 0.0_r8 + aertauswvis(1:ncol,:) = 0.0_r8 absorb(1:ncol,:) = 0.0_r8 aodvis(1:ncol) = 0.0_r8 if (is_output_interactive_volc) then @@ -1013,6 +1019,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ! aerosol extinction (/m) do i = 1, ncol extinct(i,k) = extinct(i,k) + dopaer(i)*air_density(i,k)/mass(i,k) + aertauswvis(i,k) = aertauswvis(i,k) + dopaer(i) absorb(i,k) = absorb(i,k) + pabs(i)*air_density(i,k) aodvis(i) = aodvis(i) + dopaer(i) if ((k .le. trop_level(i)) .and. (is_output_interactive_volc)) then ! in stratosphere @@ -1222,6 +1229,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ilev_tropp = trop_level(i) tropopause_m(i) = state%zm(i,ilev_tropp)!in meters extinct(i,ilev_tropp) = 0.5_r8*( extinct(i,ilev_tropp) + ext_cmip6_sw(i,ilev_tropp) ) + aertauswvis(i,ilev_tropp) = 0.5_r8*( aertauswvis(i,ilev_tropp) + aertauswvis_cmip6(i,ilev_tropp) ) enddo do k = 1, pver do i = 1, ncol @@ -1229,6 +1237,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol if (k < ilev_tropp) then !extinction is assigned read in values only for visible band above tropopause extinct(i,k) = ext_cmip6_sw(i,k) + aertauswvis(i,k) = aertauswvis_cmip6(i,k) endif enddo enddo @@ -1247,6 +1256,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol end do call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) + call outfld('AER_TAU_SW_VIS'//diag(list_idx), aertauswvis, pcols, lchnk) call outfld('tropopause_m', tropopause_m, pcols, lchnk) call outfld('ABSORB'//diag(list_idx), absorb, pcols, lchnk) call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) From c67b48a304282ae82d1160fa5ace325fb352544f Mon Sep 17 00:00:00 2001 From: mahf708 Date: Mon, 1 Apr 2024 19:33:00 -0500 Subject: [PATCH 02/12] output detailed modal aer properties --- .../eam/src/physics/cam/modal_aer_opt.F90 | 65 +++++++++++++++++-- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index ab4cd9016b35..ecdd14a8c3cd 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -18,6 +18,7 @@ module modal_aer_opt 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: get_sw_spectral_midpoints, get_lw_spectral_midpoints 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 @@ -28,6 +29,7 @@ module modal_aer_opt use cam_pio_utils, only: cam_pio_openfile use cam_history, only: addfld, horiz_only, add_default, outfld use cam_history_support, only: fillvalue +use cam_history_support, only: add_hist_coord use cam_logfile, only: iulog use perf_mod, only: t_startf, t_stopf use cam_abortutils, only: endrun @@ -67,6 +69,15 @@ module modal_aer_opt character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', & '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) +integer, dimension(14) :: rrtmg_to_rrtmgp_swbands = (/ & + 14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 & +/) +real(r8), target :: sw_band_midpoints(nswbands), sw_band_midpoints_p(nswbands), lw_band_midpoints(nlwbands) + +! A toggle to switch between rrtmg and rrtmgp +! TODO: move this to the namelist at some point? +integer :: output_aer_props_rrtmgp = 1 ! 1=rrtmgp, 0=rrtmg + !Declare the following threadprivate variables to be used for calcsize and water uptake !These are defined as module level variables to aviod allocation-deallocation in a loop real(r8), allocatable :: dgnumdry_m(:,:,:) ! number mode dry diameter for all modes @@ -138,6 +149,7 @@ subroutine modal_aer_opt_init() logical :: call_list(0:n_diag) integer :: ilist, nmodes, m_ncoef, m_prefr, m_prefi integer :: errcode, istat + integer :: i_nswband character(len=*), parameter :: routine='modal_aer_opt_init' !---------------------------------------------------------------------------- @@ -208,10 +220,30 @@ subroutine modal_aer_opt_init() if (istat .ne. 0) call endrun("Unable to allocate qaerwat_m: "//errmsg(__FILE__,__LINE__) ) !$OMP END PARALLEL + call get_sw_spectral_midpoints(sw_band_midpoints, 'cm-1') + call get_lw_spectral_midpoints(lw_band_midpoints, 'cm-1') + do i_nswband = 1, nswbands + sw_band_midpoints_p(i_nswband) = sw_band_midpoints(rrtmg_to_rrtmgp_swbands(i_nswband)) + end do + if (output_aer_props_rrtmgp == 1) then + call add_hist_coord('swband', nswbands, 'Shortwave wavenumber', '1/cm', sw_band_midpoints_p) + else + call add_hist_coord('swband', nswbands, 'Shortwave wavenumber', '1/cm', sw_band_midpoints) + end if + call add_hist_coord('lwband', nlwbands, 'Longwave wavenumber', '1/cm', lw_band_midpoints) + ! Add diagnostic fields to history output. + call addfld ('MODAL_AER_TAU_SW', (/'lev','swband'/), 'A', '1', & + 'Aerosol shortwave extinction optical depth', flag_xyfill=.true.) + call addfld ('MODAL_AER_SSA_SW', (/'lev','swband'/), 'A', '1', & + 'Aerosol shortwave single scattering albedo', flag_xyfill=.true.) + call addfld ('MODAL_AER_G_SW', (/'lev','swband'/), 'A', '1', & + 'Aerosol shortwave assymmetry parameter', flag_xyfill=.true.) + call addfld ('MODAL_AER_TAU_LW', (/'lev','lwband'/), 'A', '1', & + 'Aerosol longwave absorption optical depth', flag_xyfill=.true.) call addfld ('EXTINCT',(/ 'lev' /), 'A','/m','Aerosol extinction', flag_xyfill=.true.) - call addfld ('AER_TAU_SW_VIS', (/'lev'/), 'A', '/m', & + call addfld ('AER_TAU_SW_VIS', (/'lev'/), 'A', '1', & 'Aerosol shortwave extinction optical depth at 550 nm', flag_xyfill=.true.) call addfld ('tropopause_m',horiz_only, 'A',' m ','tropopause level in meters', flag_xyfill=.true.) call addfld ('ABSORB',(/ 'lev' /), 'A','/m','Aerosol absorption', flag_xyfill=.true.) @@ -435,10 +467,17 @@ subroutine modal_aer_opt_init() do ilist = 1, n_diag if (call_list(ilist)) then - + call addfld ('MODAL_AER_TAU_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & + 'Aerosol shortwave extinction optical depth', flag_xyfill=.true.) + call addfld ('MODAL_AER_SSA_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & + 'Aerosol shortwave single scattering albedo', flag_xyfill=.true.) + call addfld ('MODAL_AER_G_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & + 'Aerosol shortwave assymmetry parameter', flag_xyfill=.true.) + call addfld ('MODAL_AER_TAU_LW'//diag(ilist), (/'lev','lwband'/), 'A', '1', & + 'Aerosol longwave absorption optical depth', flag_xyfill=.true.) call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','1/m', & 'Aerosol extinction', flag_xyfill=.true.) - call addfld ('AER_TAU_SW_VIS'//diag(ilist), (/'lev'/), 'A', '/m', & + call addfld ('AER_TAU_SW_VIS'//diag(ilist), (/'lev'/), 'A', '1', & 'Aerosol shortwave extinction optical depth at 550 nm', flag_xyfill=.true.) call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','1/m', & 'Aerosol absorption', flag_xyfill=.true.) @@ -545,6 +584,9 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ! Diagnostics real(r8) :: extinct(pcols,pver), tropopause_m(pcols) real(r8) :: aertauswvis(pcols, pver) + real(r8) :: aertaubndsw(pcols,pver,nswbands) + real(r8) :: aerssabndsw(pcols,pver,nswbands) + real(r8) :: aerasmbndsw(pcols,pver,nswbands) real(r8) :: absorb(pcols,pver) real(r8) :: aodvis(pcols) ! extinction optical depth real(r8) :: aodall(pcols) ! extinction optical depth @@ -659,6 +701,10 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol mass(:ncol,:) = state%pdeldry(:ncol,:)*rga air_density(:ncol,:) = state%pmid(:ncol,:)/(rair*state%t(:ncol,:)) + aertaubndsw(1:ncol,:pver,:) = 0.0_r8 + aerssabndsw(1:ncol,:pver,:) = 0.0_r8 + aerasmbndsw(1:ncol,:pver,:) = 0.0_r8 + ! diagnostics for visible band summed over modes extinct(1:ncol,:) = 0.0_r8 aertauswvis(1:ncol,:) = 0.0_r8 @@ -1191,6 +1237,9 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol 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) + aertaubndsw(i,k,isw) = tauxar(i,k,isw) + aerssabndsw(i,k,isw) = wa(i,k,isw)/tauxar(i,k,isw) + aerasmbndsw(i,k,isw) = ga(i,k,isw)/wa(i,k,isw) end do end do ! pver @@ -1255,8 +1304,11 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol aodabs(idxnite(i)) = fillvalue end do + call outfld('MODAL_AER_TAU_SW'//diag(list_idx), aertau_bnd_sw, pcols, lchnk) + call outfld('MODAL_AER_SSA_SW'//diag(list_idx), aerssa_bnd_sw, pcols, lchnk) + call outfld('MODAL_AER_G_SW'//diag(list_idx), aerasm_bnd_sw, pcols, lchnk) call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) - call outfld('AER_TAU_SW_VIS'//diag(list_idx), aertauswvis, pcols, lchnk) + call outfld('AER_TAU_SW_VIS'//diag(list_idx), aertauswvis, pcols, lchnk) call outfld('tropopause_m', tropopause_m, pcols, lchnk) call outfld('ABSORB'//diag(list_idx), absorb, pcols, lchnk) call outfld('AODVIS'//diag(list_idx), aodvis, pcols, lchnk) @@ -1386,6 +1438,7 @@ subroutine modal_aero_lw(list_idx, dt, state, pbuf, tauxar, clear_rh) type(physics_buffer_desc), pointer :: pbuf(:) real(r8), intent(out) :: tauxar(pcols,pver,nlwbands) ! layer absorption optical depth + real(r8) :: aertaubndlw(pcols,pver,nlwbands) real(r8), optional, intent(in) :: clear_rh(pcols,pver) ! optional clear air relative humidity ! that gets passed to modal_aero_wateruptake_dr @@ -1440,6 +1493,7 @@ subroutine modal_aero_lw(list_idx, dt, state, pbuf, tauxar, clear_rh) ! initialize output variables tauxar(:ncol,:,:) = 0._r8 + aertaubndlw(1:ncol,:pver,:) = 0.0_r8 ! dry mass in each cell mass(:ncol,:) = state%pdeldry(:ncol,:)*rga @@ -1597,6 +1651,7 @@ subroutine modal_aero_lw(list_idx, dt, state, pbuf, tauxar, clear_rh) do i = 1, ncol tauxar(i,k,ilw) = tauxar(i,k,ilw) + dopaer(i) + aertaubndlw(i,k,ilw) = tauxar(i,k,ilw) end do end do ! k = top_lev, pver @@ -1605,6 +1660,8 @@ subroutine modal_aero_lw(list_idx, dt, state, pbuf, tauxar, clear_rh) end do ! m = 1, nmodes + call outfld('MODAL_AER_TAU_LW'//diag(list_idx), aertaubndlw, pcols, lchnk) + end subroutine modal_aero_lw !=============================================================================== From a50a87a08f227fbe9aed991ededcfea6ee0044e4 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Mon, 1 Apr 2024 19:50:07 -0500 Subject: [PATCH 03/12] re-add line and fix cmip6 volc alloc --- components/eam/src/physics/cam/modal_aer_opt.F90 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index ecdd14a8c3cd..7de4062268a3 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -467,6 +467,7 @@ subroutine modal_aer_opt_init() do ilist = 1, n_diag if (call_list(ilist)) then + call addfld ('MODAL_AER_TAU_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & 'Aerosol shortwave extinction optical depth', flag_xyfill=.true.) call addfld ('MODAL_AER_SSA_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & @@ -1278,7 +1279,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ilev_tropp = trop_level(i) tropopause_m(i) = state%zm(i,ilev_tropp)!in meters extinct(i,ilev_tropp) = 0.5_r8*( extinct(i,ilev_tropp) + ext_cmip6_sw(i,ilev_tropp) ) - aertauswvis(i,ilev_tropp) = 0.5_r8*( aertauswvis(i,ilev_tropp) + aertauswvis_cmip6(i,ilev_tropp) ) + aertauswvis(i,ilev_tropp) = 0.5_r8*( aertauswvis(i,ilev_tropp) + ext_cmip6_sw(i,ilev_tropp) ) enddo do k = 1, pver do i = 1, ncol @@ -1286,7 +1287,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol if (k < ilev_tropp) then !extinction is assigned read in values only for visible band above tropopause extinct(i,k) = ext_cmip6_sw(i,k) - aertauswvis(i,k) = aertauswvis_cmip6(i,k) + aertauswvis(i,k) = ext_cmip6_sw(i,k) endif enddo enddo From 7cccc6688b5f755e11030af7c0b99a3722aa52e9 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Mon, 1 Apr 2024 20:39:48 -0500 Subject: [PATCH 04/12] use corrected names to output fields --- components/eam/src/physics/cam/modal_aer_opt.F90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index 7de4062268a3..fb330fd174a4 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -1305,9 +1305,9 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol aodabs(idxnite(i)) = fillvalue end do - call outfld('MODAL_AER_TAU_SW'//diag(list_idx), aertau_bnd_sw, pcols, lchnk) - call outfld('MODAL_AER_SSA_SW'//diag(list_idx), aerssa_bnd_sw, pcols, lchnk) - call outfld('MODAL_AER_G_SW'//diag(list_idx), aerasm_bnd_sw, pcols, lchnk) + call outfld('MODAL_AER_TAU_SW'//diag(list_idx), aertaubndsw, pcols, lchnk) + call outfld('MODAL_AER_SSA_SW'//diag(list_idx), aerssabndsw, pcols, lchnk) + call outfld('MODAL_AER_G_SW'//diag(list_idx), aerasmbndsw, pcols, lchnk) call outfld('EXTINCT'//diag(list_idx), extinct, pcols, lchnk) call outfld('AER_TAU_SW_VIS'//diag(list_idx), aertauswvis, pcols, lchnk) call outfld('tropopause_m', tropopause_m, pcols, lchnk) From 92b27fe248876f4a44853b6167dc3ce9fb32f44c Mon Sep 17 00:00:00 2001 From: mahf708 Date: Mon, 1 Apr 2024 20:59:47 -0500 Subject: [PATCH 05/12] fix array lengths/alignment in addfld --- .../eam/src/physics/cam/modal_aer_opt.F90 | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index fb330fd174a4..803086d6f2f7 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -234,16 +234,16 @@ subroutine modal_aer_opt_init() ! Add diagnostic fields to history output. - call addfld ('MODAL_AER_TAU_SW', (/'lev','swband'/), 'A', '1', & + call addfld ('MODAL_AER_TAU_SW', (/'lev ','swband'/), 'A', '1', & 'Aerosol shortwave extinction optical depth', flag_xyfill=.true.) - call addfld ('MODAL_AER_SSA_SW', (/'lev','swband'/), 'A', '1', & + call addfld ('MODAL_AER_SSA_SW', (/'lev ','swband'/), 'A', '1', & 'Aerosol shortwave single scattering albedo', flag_xyfill=.true.) - call addfld ('MODAL_AER_G_SW', (/'lev','swband'/), 'A', '1', & + call addfld ('MODAL_AER_G_SW', (/'lev ','swband'/), 'A', '1', & 'Aerosol shortwave assymmetry parameter', flag_xyfill=.true.) - call addfld ('MODAL_AER_TAU_LW', (/'lev','lwband'/), 'A', '1', & + call addfld ('MODAL_AER_TAU_LW', (/'lev ','lwband'/), 'A', '1', & 'Aerosol longwave absorption optical depth', flag_xyfill=.true.) call addfld ('EXTINCT',(/ 'lev' /), 'A','/m','Aerosol extinction', flag_xyfill=.true.) - call addfld ('AER_TAU_SW_VIS', (/'lev'/), 'A', '1', & + call addfld ('AER_TAU_SW_VIS', (/ 'lev' /), 'A', '1', & 'Aerosol shortwave extinction optical depth at 550 nm', flag_xyfill=.true.) call addfld ('tropopause_m',horiz_only, 'A',' m ','tropopause level in meters', flag_xyfill=.true.) call addfld ('ABSORB',(/ 'lev' /), 'A','/m','Aerosol absorption', flag_xyfill=.true.) @@ -468,17 +468,17 @@ subroutine modal_aer_opt_init() do ilist = 1, n_diag if (call_list(ilist)) then - call addfld ('MODAL_AER_TAU_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & + call addfld ('MODAL_AER_TAU_SW'//diag(ilist), (/'lev ','swband'/), 'A', '1', & 'Aerosol shortwave extinction optical depth', flag_xyfill=.true.) - call addfld ('MODAL_AER_SSA_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & + call addfld ('MODAL_AER_SSA_SW'//diag(ilist), (/'lev ','swband'/), 'A', '1', & 'Aerosol shortwave single scattering albedo', flag_xyfill=.true.) - call addfld ('MODAL_AER_G_SW'//diag(ilist), (/'lev','swband'/), 'A', '1', & + call addfld ('MODAL_AER_G_SW'//diag(ilist), (/'lev ','swband'/), 'A', '1', & 'Aerosol shortwave assymmetry parameter', flag_xyfill=.true.) - call addfld ('MODAL_AER_TAU_LW'//diag(ilist), (/'lev','lwband'/), 'A', '1', & + call addfld ('MODAL_AER_TAU_LW'//diag(ilist), (/'lev ','lwband'/), 'A', '1', & 'Aerosol longwave absorption optical depth', flag_xyfill=.true.) call addfld ('EXTINCT'//diag(ilist), (/ 'lev' /), 'A','1/m', & 'Aerosol extinction', flag_xyfill=.true.) - call addfld ('AER_TAU_SW_VIS'//diag(ilist), (/'lev'/), 'A', '1', & + call addfld ('AER_TAU_SW_VIS'//diag(ilist), (/ 'lev' /), 'A', '1', & 'Aerosol shortwave extinction optical depth at 550 nm', flag_xyfill=.true.) call addfld ('ABSORB'//diag(ilist), (/ 'lev' /), 'A','1/m', & 'Aerosol absorption', flag_xyfill=.true.) From d78d274a35b9caa47b9cefc07c9a268daaf3fb46 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Mon, 1 Apr 2024 21:55:57 -0500 Subject: [PATCH 06/12] avoid div by 0 in extraction from rad products --- components/eam/src/physics/cam/modal_aer_opt.F90 | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index 803086d6f2f7..c5b25037f542 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -1239,8 +1239,16 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol 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) aertaubndsw(i,k,isw) = tauxar(i,k,isw) - aerssabndsw(i,k,isw) = wa(i,k,isw)/tauxar(i,k,isw) - aerasmbndsw(i,k,isw) = ga(i,k,isw)/wa(i,k,isw) + if (tauxar(i,k,isw) > 0._r8) then + aerssabndsw(i,k,isw) = wa(i,k,isw)/tauxar(i,k,isw) + else + aerssabndsw(i,k,isw) = 1._r8 + end if + if (wa(i,k,isw) > 0._r8) then + aerasmbndsw(i,k,isw) = ga(i,k,isw)/wa(i,k,isw) + else + aerasmbndsw(i,k,isw) = 0._r8 + end if end do end do ! pver From e66478344ebe74e3fbd7009cb4a0de90baa76033 Mon Sep 17 00:00:00 2001 From: Naser Mahfouz Date: Wed, 3 Apr 2024 14:02:38 -0400 Subject: [PATCH 07/12] avoid hardcoding nswbands in conversion array --- components/eam/src/physics/cam/modal_aer_opt.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index c5b25037f542..9ff703340e48 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -69,7 +69,7 @@ module modal_aer_opt character(len=4) :: diag(0:n_diag) = (/' ','_d1 ','_d2 ','_d3 ','_d4 ','_d5 ', & '_d6 ','_d7 ','_d8 ','_d9 ','_d10'/) -integer, dimension(14) :: rrtmg_to_rrtmgp_swbands = (/ & +integer, dimension(nswbands) :: rrtmg_to_rrtmgp_swbands = (/ & 14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 & /) real(r8), target :: sw_band_midpoints(nswbands), sw_band_midpoints_p(nswbands), lw_band_midpoints(nlwbands) From 24f2e06ac0c3e37e190aa8173e1d8015aad270a0 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Wed, 3 Apr 2024 15:09:07 -0500 Subject: [PATCH 08/12] test new outputs w eam-wcprod_F2010_spao testmod --- .github/workflows/e3sm-gh-ci-cime-tests.yml | 2 +- .../eam/wcprod_F2010_spao/readme | 1 + .../eam/wcprod_F2010_spao/shell_commands | 3 + .../eam/wcprod_F2010_spao/user_nl_eam | 60 +++++++++++++++++++ .../eam/wcprod_F2010_spao/user_nl_elm | 40 +++++++++++++ 5 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/readme create mode 100644 components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/shell_commands create mode 100644 components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam create mode 100644 components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_elm diff --git a/.github/workflows/e3sm-gh-ci-cime-tests.yml b/.github/workflows/e3sm-gh-ci-cime-tests.yml index b90ed2f01198..aae5bc749475 100644 --- a/.github/workflows/e3sm-gh-ci-cime-tests.yml +++ b/.github/workflows/e3sm-gh-ci-cime-tests.yml @@ -31,7 +31,7 @@ jobs: - SMS_P4.ne4pg2_oQU480.F2010.singularity2_gnu - REP_P4.ne4pg2_oQU480.F2010.singularity2_gnu - ERS_P4.ne4pg2_oQU480.F2010.singularity2_gnu - - ERS_P4.ne4pg2_oQU480.F2010.singularity2_gnu.eam-wcprod_F2010 + - ERS_P4.ne4pg2_oQU480.F2010.singularity2_gnu.eam-wcprod_F2010_spao - ERP_P4.ne4pg2_oQU480.F2010.singularity2_gnu - PET_P4.ne4pg2_oQU480.F2010.singularity2_gnu - PEM_P4.ne4pg2_oQU480.F2010.singularity2_gnu diff --git a/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/readme b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/readme new file mode 100644 index 000000000000..a31fafe11b16 --- /dev/null +++ b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/readme @@ -0,0 +1 @@ +Same as wcprod_F2010 but with SPA-specific outputs diff --git a/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/shell_commands b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/shell_commands new file mode 100644 index 000000000000..0067b2f35de5 --- /dev/null +++ b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/shell_commands @@ -0,0 +1,3 @@ +#!/bin/bash + +./xmlchange --append CAM_CONFIG_OPTS='-cosp' diff --git a/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam new file mode 100644 index 000000000000..d4a6064da14a --- /dev/null +++ b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam @@ -0,0 +1,60 @@ +cosp_lite = .true. + +empty_htapes = .true. + +avgflag_pertape = 'A','A','A','A','I','I','A' +nhtfrq = -24,-24,-6,-3,-1,-24,-24 +mfilt = 1,30,120,240,720,1,1 + +fincl1 = 'AODALL','AODBC','AODDUST','AODPOM','AODSO4','AODSOA','AODSS','AODVIS', + 'CLDLOW','CLDMED','CLDHGH','CLDTOT', + 'CLDHGH_CAL','CLDLOW_CAL','CLDMED_CAL','CLD_MISR','CLDTOT_CAL', + 'CLMODIS','FISCCP1_COSP','FLDS','FLNS','FLNSC','FLNT','FLUT', + 'FLUTC','FSDS','FSDSC','FSNS','FSNSC','FSNT','FSNTOA','FSNTOAC','FSNTC', + 'ICEFRAC','LANDFRAC','LWCF','OCNFRAC','OMEGA','PRECC','PRECL','PRECSC','PRECSL','PS','PSL','Q', + 'QFLX','QREFHT','RELHUM','SCO','SHFLX','SOLIN','SWCF','T','TAUX','TAUY','TCO', + 'TGCLDLWP','TMQ','TREFHT','TREFMNAV','TREFMXAV','TS','U','U10','V','Z3', + 'dst_a1DDF','dst_a3DDF','dst_c1DDF','dst_c3DDF','dst_a1SFWET','dst_a3SFWET','dst_c1SFWET','dst_c3SFWET', + 'O3','LHFLX', + 'O3_2DTDA_trop','O3_2DTDB_trop','O3_2DTDD_trop','O3_2DTDE_trop','O3_2DTDI_trop','O3_2DTDL_trop', + 'O3_2DTDN_trop','O3_2DTDO_trop','O3_2DTDS_trop','O3_2DTDU_trop','O3_2DTRE_trop','O3_2DTRI_trop', + 'O3_SRF','NO_2DTDS','NO_TDLgt','NO2_2DTDD','NO2_2DTDS','NO2_TDAcf','CO_SRF','TROPE3D_P','TROP_P', + 'CDNUMC','SFDMS','so4_a1_sfgaex1','so4_a2_sfgaex1','so4_a3_sfgaex1','so4_a5_sfgaex1','soa_a1_sfgaex1', + 'soa_a2_sfgaex1','soa_a3_sfgaex1','GS_soa_a1','GS_soa_a2','GS_soa_a3','AQSO4_H2O2','AQSO4_O3', + 'SFSO2','SO2_CLXF','SO2','DF_SO2','AQ_SO2','GS_SO2','WD_SO2','ABURDENSO4_STR','ABURDENSO4_TRO', + 'ABURDENSO4','ABURDENBC','ABURDENDUST','ABURDENMOM','ABURDENPOM','ABURDENSEASALT', + 'ABURDENSOA','AODSO4_STR','AODSO4_TRO', + 'EXTINCT','AODABS','AODABSBC','CLDICE','CLDLIQ','CLD_CAL_TMPLIQ','CLD_CAL_TMPICE','Mass_bc_srf', + 'Mass_dst_srf','Mass_mom_srf','Mass_ncl_srf','Mass_pom_srf','Mass_so4_srf','Mass_soa_srf','Mass_bc_850', + 'Mass_dst_850','Mass_mom_850','Mass_ncl_850','Mass_pom_850','Mass_so4_850','Mass_soa_850','Mass_bc_500', + 'Mass_dst_500','Mass_mom_500','Mass_ncl_500','Mass_pom_500','Mass_so4_500','Mass_soa_500','Mass_bc_330', + 'Mass_dst_330','Mass_mom_330','Mass_ncl_330','Mass_pom_330','Mass_so4_330','Mass_soa_330','Mass_bc_200', + 'Mass_dst_200','Mass_mom_200','Mass_ncl_200','Mass_pom_200','Mass_so4_200','Mass_soa_200', + 'O3_2DTDD','O3_2DCIP','O3_2DCIL','CO_2DTDS','CO_2DTDD','CO_2DCEP','CO_2DCEL','NO_2DTDD', + 'FLNTC','SAODVIS', + 'H2OLNZ', + 'dst_a1SF','dst_a3SF', + 'PHIS','CLOUD','TGCLDIWP','TGCLDCWP','AREL', + 'CLDTOT_ISCCP','MEANCLDALB_ISCCP','MEANPTOP_ISCCP','CLD_CAL', + 'CLDTOT_CAL_LIQ','CLDTOT_CAL_ICE','CLDTOT_CAL_UN', + 'CLDHGH_CAL_LIQ','CLDHGH_CAL_ICE','CLDHGH_CAL_UN', + 'CLDMED_CAL_LIQ','CLDMED_CAL_ICE','CLDMED_CAL_UN', + 'CLDLOW_CAL_LIQ','CLDLOW_CAL_ICE','CLDLOW_CAL_UN', + 'CLWMODIS','CLIMODIS' + +fincl2 = 'PS', 'FLUT','PRECT','U200','V200','U850','V850', + 'TCO','SCO','TREFHTMN','TREFHTMX','TREFHT','QREFHT' +fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500','TBOT','U850','V850','U200','V200','T200','T500','Z700' +fincl4 = 'PRECT' +fincl5 = 'O3_SRF' +fincl6 = 'CO_2DMSD','NO2_2DMSD','NO_2DMSD','O3_2DMSD','O3_2DMSD_trop' +fincl7 = 'PS', 'CCN3', 'MODAL_AER_TAU_SW', 'MODAL_AER_SSA_SW', 'MODAL_AER_G_SW', 'MODAL_AER_TAU_LW' ! change CCN3 to CCN3MAIR once #6319 is merged + +! -- chemUCI settings ------------------ +history_chemdyg_summary = .true. +history_gaschmbudget_2D = .false. +history_gaschmbudget_2D_levels = .false. +history_gaschmbudget_num = 6 !! no impact if history_gaschmbudget_2D = .false. + +! -- MAM5 settings ------------------ +is_output_interactive_volc = .true. diff --git a/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_elm b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_elm new file mode 100644 index 000000000000..cd1adab77404 --- /dev/null +++ b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_elm @@ -0,0 +1,40 @@ +hist_dov2xy = .true.,.true. +hist_fexcl1 = 'AGWDNPP','ALTMAX_LASTYEAR','AVAIL_RETRANSP','AVAILC','BAF_CROP', + 'BAF_PEATF','BIOCHEM_PMIN_TO_PLANT','CH4_SURF_AERE_SAT','CH4_SURF_AERE_UNSAT','CH4_SURF_DIFF_SAT', + 'CH4_SURF_DIFF_UNSAT','CH4_SURF_EBUL_SAT','CH4_SURF_EBUL_UNSAT','CMASS_BALANCE_ERROR','cn_scalar', + 'COL_PTRUNC','CONC_CH4_SAT','CONC_CH4_UNSAT','CONC_O2_SAT','CONC_O2_UNSAT', + 'cp_scalar','CWDC_HR','CWDC_LOSS','CWDC_TO_LITR2C','CWDC_TO_LITR3C', + 'CWDC_vr','CWDN_TO_LITR2N','CWDN_TO_LITR3N','CWDN_vr','CWDP_TO_LITR2P', + 'CWDP_TO_LITR3P','CWDP_vr','DWT_CONV_CFLUX_DRIBBLED','F_CO2_SOIL','F_CO2_SOIL_vr', + 'F_DENIT_vr','F_N2O_DENIT','F_N2O_NIT','F_NIT_vr','FCH4_DFSAT', + 'FINUNDATED_LAG','FPI_P_vr','FPI_vr','FROOTC_LOSS','HR_vr', + 'LABILEP_TO_SECONDP','LABILEP_vr','LAND_UPTAKE','LEAF_MR','leaf_npimbalance', + 'LEAFC_LOSS','LEAFC_TO_LITTER','LFC2','LITR1_HR','LITR1C_TO_SOIL1C', + 'LITR1C_vr','LITR1N_TNDNCY_VERT_TRANS','LITR1N_TO_SOIL1N','LITR1N_vr','LITR1P_TNDNCY_VERT_TRANS', + 'LITR1P_TO_SOIL1P','LITR1P_vr','LITR2_HR','LITR2C_TO_SOIL2C','LITR2C_vr', + 'LITR2N_TNDNCY_VERT_TRANS','LITR2N_TO_SOIL2N','LITR2N_vr','LITR2P_TNDNCY_VERT_TRANS','LITR2P_TO_SOIL2P', + 'LITR2P_vr','LITR3_HR','LITR3C_TO_SOIL3C','LITR3C_vr','LITR3N_TNDNCY_VERT_TRANS', + 'LITR3N_TO_SOIL3N','LITR3N_vr','LITR3P_TNDNCY_VERT_TRANS','LITR3P_TO_SOIL3P','LITR3P_vr', + 'M_LITR1C_TO_LEACHING','M_LITR2C_TO_LEACHING','M_LITR3C_TO_LEACHING','M_SOIL1C_TO_LEACHING','M_SOIL2C_TO_LEACHING', + 'M_SOIL3C_TO_LEACHING','M_SOIL4C_TO_LEACHING','NDEPLOY','NEM','nlim_m', + 'o2_decomp_depth_unsat','OCCLP_vr','PDEPLOY','PLANT_CALLOC','PLANT_NDEMAND', + 'PLANT_NDEMAND_COL','PLANT_PALLOC','PLANT_PDEMAND','PLANT_PDEMAND_COL','plim_m', + 'POT_F_DENIT','POT_F_NIT','POTENTIAL_IMMOB','POTENTIAL_IMMOB_P','PRIMP_TO_LABILEP', + 'PRIMP_vr','PROD1P_LOSS','QOVER_LAG','RETRANSN_TO_NPOOL','RETRANSP_TO_PPOOL', + 'SCALARAVG_vr','SECONDP_TO_LABILEP','SECONDP_TO_OCCLP','SECONDP_vr','SMIN_NH4_vr', + 'SMIN_NO3_vr','SMINN_TO_SOIL1N_L1','SMINN_TO_SOIL2N_L2','SMINN_TO_SOIL2N_S1','SMINN_TO_SOIL3N_L3', + 'SMINN_TO_SOIL3N_S2','SMINN_TO_SOIL4N_S3','SMINP_TO_SOIL1P_L1','SMINP_TO_SOIL2P_L2','SMINP_TO_SOIL2P_S1', + 'SMINP_TO_SOIL3P_L3','SMINP_TO_SOIL3P_S2','SMINP_TO_SOIL4P_S3','SMINP_vr','SOIL1_HR','SOIL1C_TO_SOIL2C','SOIL1C_vr','SOIL1N_TNDNCY_VERT_TRANS','SOIL1N_TO_SOIL2N','SOIL1N_vr', + 'SOIL1P_TNDNCY_VERT_TRANS','SOIL1P_TO_SOIL2P','SOIL1P_vr','SOIL2_HR','SOIL2C_TO_SOIL3C', + 'SOIL2C_vr','SOIL2N_TNDNCY_VERT_TRANS','SOIL2N_TO_SOIL3N','SOIL2N_vr','SOIL2P_TNDNCY_VERT_TRANS', + 'SOIL2P_TO_SOIL3P','SOIL2P_vr','SOIL3_HR','SOIL3C_TO_SOIL4C','SOIL3C_vr', + 'SOIL3N_TNDNCY_VERT_TRANS','SOIL3N_TO_SOIL4N','SOIL3N_vr','SOIL3P_TNDNCY_VERT_TRANS','SOIL3P_TO_SOIL4P', + 'SOIL3P_vr','SOIL4_HR','SOIL4C_vr','SOIL4N_TNDNCY_VERT_TRANS','SOIL4N_TO_SMINN', + 'SOIL4N_vr','SOIL4P_TNDNCY_VERT_TRANS','SOIL4P_TO_SMINP','SOIL4P_vr','SOLUTIONP_vr', + 'TCS_MONTH_BEGIN','TCS_MONTH_END','TOTCOLCH4','water_scalar','WF', + 'wlim_m','WOODC_LOSS','WTGQ' +hist_fincl1 = 'SNOWDP','COL_FIRE_CLOSS','NPOOL','PPOOL','TOTPRODC' +hist_fincl2 = 'H2OSNO', 'FSNO', 'QRUNOFF', 'QSNOMELT', 'FSNO_EFF', 'SNORDSL', 'SNOW', 'FSDS', 'FSR', 'FLDS', 'FIRE', 'FIRA' +hist_mfilt = 1,365 +hist_nhtfrq = -24,-24 +hist_avgflag_pertape = 'A','A' From f65349e29dee5f052ba0a5fb8f0cfaad74b53bb3 Mon Sep 17 00:00:00 2001 From: mahf708 Date: Wed, 3 Apr 2024 15:20:09 -0500 Subject: [PATCH 09/12] output bands in as wavelength in nm --- components/eam/src/physics/cam/modal_aer_opt.F90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index 9ff703340e48..49b7cb3b4db7 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -220,17 +220,17 @@ subroutine modal_aer_opt_init() if (istat .ne. 0) call endrun("Unable to allocate qaerwat_m: "//errmsg(__FILE__,__LINE__) ) !$OMP END PARALLEL - call get_sw_spectral_midpoints(sw_band_midpoints, 'cm-1') - call get_lw_spectral_midpoints(lw_band_midpoints, 'cm-1') + call get_sw_spectral_midpoints(sw_band_midpoints, 'nm') + call get_lw_spectral_midpoints(lw_band_midpoints, 'nm') do i_nswband = 1, nswbands sw_band_midpoints_p(i_nswband) = sw_band_midpoints(rrtmg_to_rrtmgp_swbands(i_nswband)) end do if (output_aer_props_rrtmgp == 1) then - call add_hist_coord('swband', nswbands, 'Shortwave wavenumber', '1/cm', sw_band_midpoints_p) + call add_hist_coord('swband', nswbands, 'Shortwave wavelength', 'nm', sw_band_midpoints_p) else - call add_hist_coord('swband', nswbands, 'Shortwave wavenumber', '1/cm', sw_band_midpoints) + call add_hist_coord('swband', nswbands, 'Shortwave wavelength', 'nm', sw_band_midpoints) end if - call add_hist_coord('lwband', nlwbands, 'Longwave wavenumber', '1/cm', lw_band_midpoints) + call add_hist_coord('lwband', nlwbands, 'Longwave wavelength', 'nm', lw_band_midpoints) ! Add diagnostic fields to history output. From 0ba5cc8b6a1a026c7828376f72c2ae6be090c89d Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 4 Apr 2024 13:35:15 -0500 Subject: [PATCH 10/12] reorder the optical properties just like the bands --- .../eam/src/physics/cam/modal_aer_opt.F90 | 36 +++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index 49b7cb3b4db7..017075c09822 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -534,6 +534,7 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol ! Local variables integer :: i, ifld, isw, k, l, m, nc, ns, ilev_tropp + integer :: isw_p integer :: lchnk ! chunk id integer :: ncol ! number of active columns in the chunk integer :: nmodes @@ -1238,22 +1239,37 @@ subroutine modal_aero_sw(list_idx, dt, state, pbuf, nnite, idxnite, is_cmip6_vol 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) - aertaubndsw(i,k,isw) = tauxar(i,k,isw) - if (tauxar(i,k,isw) > 0._r8) then - aerssabndsw(i,k,isw) = wa(i,k,isw)/tauxar(i,k,isw) + end do + + end do ! pver + + end do ! sw bands + + do isw = 1, nswbands + ! For RRTMGP-specific output, reorder the RRTMG bands, such that + ! isw becomes RRTMGP and isw_p becomes RRTMG argument --- + ! an example, for isw=1 (RRTMGP), use isw_p=14 (RRTMG). + if (output_aer_props_rrtmgp == 1) then + isw_p = rrtmg_to_rrtmgp_swbands(isw) + else + isw_p = isw + end if + do k = top_lev, pver + do i = 1, ncol + aertaubndsw(i,k,isw) = tauxar(i,k,isw_p) + if (tauxar(i,k,isw_p) > 0._r8) then + aerssabndsw(i,k,isw) = wa(i,k,isw_p)/tauxar(i,k,isw_p) else aerssabndsw(i,k,isw) = 1._r8 end if - if (wa(i,k,isw) > 0._r8) then - aerasmbndsw(i,k,isw) = ga(i,k,isw)/wa(i,k,isw) + if (wa(i,k,isw_p) > 0._r8) then + aerasmbndsw(i,k,isw) = ga(i,k,isw_p)/wa(i,k,isw_p) else aerasmbndsw(i,k,isw) = 0._r8 end if - end do - - end do ! pver - - end do ! sw bands + end do ! 1, ncol + end do ! top_lev, pver + end do ! 1, nswbands ! mode diagnostics ! The diagnostics are currently only output for the climate list. Code mods will From 7011e6eafceeb608da0f95ffae1e340786ffa9fc Mon Sep 17 00:00:00 2001 From: mahf708 Date: Sun, 5 May 2024 18:45:18 -0400 Subject: [PATCH 11/12] change CCN3 to CCN3MAIR in user_nl_eam for testing --- .../testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam index d4a6064da14a..7c2bbbb6362a 100644 --- a/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam +++ b/components/eam/cime_config/testdefs/testmods_dirs/eam/wcprod_F2010_spao/user_nl_eam @@ -48,7 +48,7 @@ fincl3 = 'PS', 'PSL','PRECT','TUQ','TVQ','UBOT','VBOT','TREFHT','FLUT','OMEGA500 fincl4 = 'PRECT' fincl5 = 'O3_SRF' fincl6 = 'CO_2DMSD','NO2_2DMSD','NO_2DMSD','O3_2DMSD','O3_2DMSD_trop' -fincl7 = 'PS', 'CCN3', 'MODAL_AER_TAU_SW', 'MODAL_AER_SSA_SW', 'MODAL_AER_G_SW', 'MODAL_AER_TAU_LW' ! change CCN3 to CCN3MAIR once #6319 is merged +fincl7 = 'PS', 'CCN3MAIR', 'MODAL_AER_TAU_SW', 'MODAL_AER_SSA_SW', 'MODAL_AER_G_SW', 'MODAL_AER_TAU_LW' ! -- chemUCI settings ------------------ history_chemdyg_summary = .true. From c5f4909088ef805815de27ce74f4c333e5b25c0d Mon Sep 17 00:00:00 2001 From: mahf708 Date: Thu, 8 Aug 2024 21:07:40 -0500 Subject: [PATCH 12/12] register new coords correctly --- .../eam/src/physics/cam/modal_aer_opt.F90 | 32 +++++++++++-------- components/eam/src/physics/cam/physpkg.F90 | 4 +++ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/components/eam/src/physics/cam/modal_aer_opt.F90 b/components/eam/src/physics/cam/modal_aer_opt.F90 index 017075c09822..c29e0e9ec50b 100644 --- a/components/eam/src/physics/cam/modal_aer_opt.F90 +++ b/components/eam/src/physics/cam/modal_aer_opt.F90 @@ -43,7 +43,7 @@ module modal_aer_opt private save -public :: modal_aer_opt_readnl, modal_aer_opt_init, modal_aero_sw, modal_aero_lw +public :: modal_aer_opt_readnl, modal_aer_opt_init, modal_aero_sw, modal_aero_lw, modal_aer_opt_coords character(len=*), parameter :: unset_str = 'UNSET' @@ -130,6 +130,23 @@ end subroutine modal_aer_opt_readnl !=============================================================================== +subroutine modal_aer_opt_coords + integer :: i_nswband + call get_sw_spectral_midpoints(sw_band_midpoints, 'nm') + call get_lw_spectral_midpoints(lw_band_midpoints, 'nm') + do i_nswband = 1, nswbands + sw_band_midpoints_p(i_nswband) = sw_band_midpoints(rrtmg_to_rrtmgp_swbands(i_nswband)) + end do + if (output_aer_props_rrtmgp == 1) then + call add_hist_coord('swband', nswbands, 'Shortwave wavelength', 'nm', sw_band_midpoints_p) + else + call add_hist_coord('swband', nswbands, 'Shortwave wavelength', 'nm', sw_band_midpoints) + end if + call add_hist_coord('lwband', nlwbands, 'Longwave wavelength', 'nm', lw_band_midpoints) +end subroutine modal_aer_opt_coords + +!=============================================================================== + subroutine modal_aer_opt_init() use ioFileMod, only: getfil @@ -149,7 +166,6 @@ subroutine modal_aer_opt_init() logical :: call_list(0:n_diag) integer :: ilist, nmodes, m_ncoef, m_prefr, m_prefi integer :: errcode, istat - integer :: i_nswband character(len=*), parameter :: routine='modal_aer_opt_init' !---------------------------------------------------------------------------- @@ -220,18 +236,6 @@ subroutine modal_aer_opt_init() if (istat .ne. 0) call endrun("Unable to allocate qaerwat_m: "//errmsg(__FILE__,__LINE__) ) !$OMP END PARALLEL - call get_sw_spectral_midpoints(sw_band_midpoints, 'nm') - call get_lw_spectral_midpoints(lw_band_midpoints, 'nm') - do i_nswband = 1, nswbands - sw_band_midpoints_p(i_nswband) = sw_band_midpoints(rrtmg_to_rrtmgp_swbands(i_nswband)) - end do - if (output_aer_props_rrtmgp == 1) then - call add_hist_coord('swband', nswbands, 'Shortwave wavelength', 'nm', sw_band_midpoints_p) - else - call add_hist_coord('swband', nswbands, 'Shortwave wavelength', 'nm', sw_band_midpoints) - end if - call add_hist_coord('lwband', nlwbands, 'Longwave wavelength', 'nm', lw_band_midpoints) - ! Add diagnostic fields to history output. call addfld ('MODAL_AER_TAU_SW', (/'lev ','swband'/), 'A', '1', & diff --git a/components/eam/src/physics/cam/physpkg.F90 b/components/eam/src/physics/cam/physpkg.F90 index 5ece67252791..826f3c8db5b6 100644 --- a/components/eam/src/physics/cam/physpkg.F90 +++ b/components/eam/src/physics/cam/physpkg.F90 @@ -176,6 +176,7 @@ subroutine phys_register use subcol_utils, only: is_subcol_on use output_aerocom_aie, only: output_aerocom_aie_register, do_aerocom_ind3 use mo_chm_diags, only: chm_diags_inti_ac + use modal_aer_opt, only: modal_aer_opt_coords !---------------------------Local variables----------------------------- ! @@ -362,6 +363,9 @@ subroutine phys_register if (.not. do_clubb_sgs .and. .not. do_shoc_sgs) call vd_register() if (do_aerocom_ind3) call output_aerocom_aie_register() + + ! add new coords to modal_aer_opt + call modal_aer_opt_coords end if