From f7cff42710333117dc27e429d7cff6f3e245599d Mon Sep 17 00:00:00 2001 From: Robert Jacob Date: Mon, 1 May 2017 21:55:25 -0500 Subject: [PATCH] Revert "Merge branch 'steveghan/atm/iediagnostics' into next (PR #1400)" This reverts commit 4abe4baed67752eb498666b87e41c227eb344714, reversing changes made to 5982c83364c1b110e4d71e4c4404a31e24deccd3. --- components/cam/bld/build-namelist | 4 - .../namelist_files/namelist_defaults_cam.xml | 3 - .../namelist_files/namelist_definition.xml | 6 - .../cam/src/physics/cam/micro_mg_cam.F90 | 31 - components/cam/src/physics/cam/ndrop.F90 | 50 -- .../src/physics/cam/output_aerocom_aie.F90 | 659 ------------------ .../cam/src/physics/cam/phys_control.F90 | 6 - components/cam/src/physics/cam/physpkg.F90 | 14 - components/cam/src/physics/cam/radiation.F90 | 5 +- .../cam/src/physics/rrtmg/radiation.F90 | 61 +- 10 files changed, 4 insertions(+), 835 deletions(-) delete mode 100644 components/cam/src/physics/cam/output_aerocom_aie.F90 diff --git a/components/cam/bld/build-namelist b/components/cam/bld/build-namelist index 54e31b88398a..a7a04ca5598b 100755 --- a/components/cam/bld/build-namelist +++ b/components/cam/bld/build-namelist @@ -3491,10 +3491,6 @@ if ($clubb_sgs =~ /$TRUE/io) { add_default($nl, 'relvar_fix'); } -add_default($nl, 'do_aerocom_ind3'); -my $aerocom_ind3 = $nl->get_value('do_aerocom_ind3'); - - #in-cloud scav tuning for cloud-borne aerosol if ($chem =~ /_mam/) { add_default($nl, 'sol_facti_cloud_borne'); diff --git a/components/cam/bld/namelist_files/namelist_defaults_cam.xml b/components/cam/bld/namelist_files/namelist_defaults_cam.xml index b8537f832da0..37a1f7e6a1d3 100644 --- a/components/cam/bld/namelist_files/namelist_defaults_cam.xml +++ b/components/cam/bld/namelist_files/namelist_defaults_cam.xml @@ -818,9 +818,6 @@ .false. - .false. - .true. - RK MG diff --git a/components/cam/bld/namelist_files/namelist_definition.xml b/components/cam/bld/namelist_files/namelist_definition.xml index 6d0398a02e6e..fbd2548d4eb1 100644 --- a/components/cam/bld/namelist_files/namelist_definition.xml +++ b/components/cam/bld/namelist_files/namelist_definition.xml @@ -2686,12 +2686,6 @@ Switch for CLUBB_SGS Default: FALSE - -Switch for AeroCom diagnostics -Default: FALSE - - Type of shallow convection scheme employed. 'Hack' for Hack shallow convection; diff --git a/components/cam/src/physics/cam/micro_mg_cam.F90 b/components/cam/src/physics/cam/micro_mg_cam.F90 index 65e418eb8491..8f5115dd4cbe 100644 --- a/components/cam/src/physics/cam/micro_mg_cam.F90 +++ b/components/cam/src/physics/cam/micro_mg_cam.F90 @@ -1056,9 +1056,6 @@ subroutine micro_mg_cam_tend(state, ptend, dtime, pbuf) use physics_buffer, only: pbuf_col_type_index use subcol, only: subcol_field_avg - use output_aerocom_aie, only: do_aerocom_ind3 - - type(physics_state), intent(in) :: state type(physics_ptend), intent(out) :: ptend real(r8), intent(in) :: dtime @@ -1543,9 +1540,6 @@ subroutine micro_mg_cam_tend(state, ptend, dtime, pbuf) real(r8), pointer :: pckdptr(:,:) - integer :: autocl_idx, accretl_idx ! Aerocom IND3 - integer :: cldliqbf_idx, cldicebf_idx, numliqbf_idx, numicebf_idx - !------------------------------------------------------------------------------- call t_startf('micro_mg_cam_tend_init') @@ -1719,19 +1713,6 @@ subroutine micro_mg_cam_tend(state, ptend, dtime, pbuf) alst_mic => ast aist_mic => ast - if(do_aerocom_ind3) then - cldliqbf_idx = pbuf_get_index('cldliqbf') - cldicebf_idx = pbuf_get_index('cldicebf') - numliqbf_idx = pbuf_get_index('numliqbf') - numicebf_idx = pbuf_get_index('numicebf') - - call pbuf_set_field(pbuf, cldliqbf_idx, state%q(:, :, ixcldliq)) - call pbuf_set_field(pbuf, cldicebf_idx, state%q(:, :, ixcldice)) - call pbuf_set_field(pbuf, numliqbf_idx, state%q(:, :, ixnumliq)) - call pbuf_set_field(pbuf, numicebf_idx, state%q(:, :, ixnumice)) - end if - - ! Output initial in-cloud LWP (before microphysics) iclwpi = 0._r8 @@ -2849,18 +2830,6 @@ subroutine micro_mg_cam_tend(state, ptend, dtime, pbuf) racau_grid = min(racau_grid, 1.e10_r8) - if(do_aerocom_ind3) then - autocl_idx = pbuf_get_index('autocl') - accretl_idx = pbuf_get_index('accretl') -! call pbuf_set_field(pbuf, autocl_idx, prao) -! call pbuf_set_field(pbuf, accretl_idx, prco) -! VPRAO and VPRCO are incorreclty defined in CAM5.3 -! Here prco is autoconverion, and prao is accrection. - call pbuf_set_field(pbuf, autocl_idx, prco_grid) - call pbuf_set_field(pbuf, accretl_idx, prao_grid) - end if - - ! --------------------- ! ! History Output Fields ! ! --------------------- ! diff --git a/components/cam/src/physics/cam/ndrop.F90 b/components/cam/src/physics/cam/ndrop.F90 index 2923d0200b4a..a91cdb7377a6 100644 --- a/components/cam/src/physics/cam/ndrop.F90 +++ b/components/cam/src/physics/cam/ndrop.F90 @@ -302,8 +302,6 @@ subroutine dropmixnuc( & ! assume cloud presence controlled by cloud fraction ! doesn't distinguish between warm, cold clouds - use output_aerocom_aie , only: do_aerocom_ind3 - ! arguments type(physics_state), target, intent(in) :: state type(physics_ptend), intent(out) :: ptend @@ -423,16 +421,6 @@ subroutine dropmixnuc( & real(r8), allocatable :: coltend(:,:) ! column tendency for diagnostic output real(r8), allocatable :: coltend_cw(:,:) ! column tendency real(r8) :: ccn(pcols,pver,psat) ! number conc of aerosols activated at supersat - integer :: ccn3d_idx - real(r8), pointer :: ccn3d(:, :) - -!+++ AeroCOM IND3 output - real(r8) :: ccn3col(pcols), ccn4col(pcols) - real(r8) :: ccn3bl(pcols), ccn4bl(pcols) - real(r8) :: zi2(pver+1), zm2(pver) - integer :: idx1000 - logical :: zmflag - !------------------------------------------------------------------------------- @@ -452,10 +440,6 @@ subroutine dropmixnuc( & call pbuf_get_field(pbuf, kvh_idx, kvh) - if(do_aerocom_ind3) then - ccn3d_idx = pbuf_get_index('ccn3d') - call pbuf_get_field(pbuf, ccn3d_idx, ccn3d) - end if arg = 1.0_r8 @@ -1093,40 +1077,6 @@ subroutine dropmixnuc( & call outfld(ccn_name(l), ccn(1,1,l), pcols, lchnk) enddo - if(do_aerocom_ind3) then - ccn3d(:ncol, :) = ccn(:ncol, :, 4) - ccn3col = 0.0_r8; ccn4col = 0.0_r8 - do i=1, ncol - do k=1, pver - ccn3col(i) = ccn3col(i) + ccn(i,k,3) * 1.0e6* & - pdel(i,k)/gravit/(pmid(i,k)/(temp(i,k)*rair)) !#/cm3 --> #/m2 - ccn4col(i) = ccn4col(i) + ccn(i,k,4) * 1.0e6* & - pdel(i,k)/gravit/(pmid(i,k)/(temp(i,k)*rair)) !#/cm3 --> #/m2 - enddo - -! calculate CCN at 1km - zi2 = 0.0 - zm2 = 0.0 - zmflag = .true. - do k=pver, 1, -1 - zi2(k) = zi2(k+1) + pdel(i,k)/gravit/(pmid(i,k)/(temp(i,k)*rair)) ! - zm2(k) = (zi2(k+1)+zi2(k))/2._r8 - if(zm2(k).gt.1000. .and. zmflag) then - idx1000 = min(k, pver-1) - zmflag = .false. - end if - end do - ccn3bl(i) = (ccn(i,idx1000,3)*(1000.-zm2(idx1000+1))+ccn(i,idx1000+1,3) * (zm2(idx1000)-1000.)) & - /(zm2(idx1000)-zm2(idx1000+1)) * 1.0e6 ! #/cm3 -->#/m3 - ccn4bl(i) = (ccn(i,idx1000,4)*(1000.-zm2(idx1000+1))+ccn(i,idx1000+1,4) * (zm2(idx1000)-1000.)) & - /(zm2(idx1000)-zm2(idx1000+1)) *1.0e6 ! #/cm3 -->#/m3 - enddo - call outfld('colccn.1', ccn3col, pcols, lchnk) - call outfld('colccn.3', ccn4col, pcols, lchnk) - call outfld('ccn.1bl', ccn3bl, pcols, lchnk) - call outfld('ccn.3bl', ccn4bl, pcols, lchnk) - end if - ! do column tendencies if (prog_modal_aero) then do m = 1, ntot_amode diff --git a/components/cam/src/physics/cam/output_aerocom_aie.F90 b/components/cam/src/physics/cam/output_aerocom_aie.F90 deleted file mode 100644 index 0a0515851380..000000000000 --- a/components/cam/src/physics/cam/output_aerocom_aie.F90 +++ /dev/null @@ -1,659 +0,0 @@ -module output_aerocom_aie -!------------------------------------------------------------------------------------------ -! -! Purpose: to output variables requried by AEROCOM AIE intercomparison. -! -! Method: to sample cloud properties at the cloud top to facilliate the comparions -! between the model and satellite observations. -! Also to sample cloud properties only at the time of satellite overpass. -! -! Author: Minghuai Wang (2008-04) -! -! Updated by Minghuai Wang on August, 2013 for the third AeroCOM AIE intercomparison (IND3) -! -!------------------------------------------------------------------------------------------ - - use shr_kind_mod, only: r8 => shr_kind_r8 - use ppgrid, only: pcols, pver, begchunk, endchunk - use cam_history, only: addfld, add_default, horiz_only, outfld - use cam_history_support, only : fillvalue - use abortutils, only: endrun - - implicit none - - private - - public :: output_aerocom_aie_init - public :: output_aerocom_aie_register - public :: aerocom_calc - public :: cloud_top_aerocom - public :: output_aerocom - - logical, public :: do_aerocom_ind3 - - real(r8) :: p0 = 1.0e5 - -! variable index for pbuf - integer :: angstrm_idx ! Angstrom coefficients - integer :: cdr_idx ! droplet effective radius at top of liquid water clouds (meter) - integer :: cdnc_idx ! droplet number concentration in top layer of liquid water clouds (#/m3) - integer :: cdnum_idx ! column-integrated droplet number concentrations - integer :: icnum_idx ! column-integrated ice crystal number concentrations - integer :: clt_idx ! fractional cover by all clouds - integer :: lcc_idx ! fractional cover by liquid water clouds - integer :: lwp_idx ! in-cloud liquid water path for liquid clouds (kg/m^2) - integer :: iwp_idx ! in-cloud ice water path for ice clouds (kg/m^2) - integer :: icr_idx ! effective radius of crystals at top of ice clouds (meter) - integer :: icc_idx ! fractional cover by ice clouds - integer :: cod_idx ! in-cloud optical depth - integer :: ccn_idx ! cloud condensation nuclei number concentration for liquid water - ! clouds where activation corresponding to CDR and CDN - integer :: ttop_idx ! Temperature at top of clouds (K) - integer :: ptop_idx ! Pressure at top fo clouds (Pa) - integer :: autoconv_idx ! Column-integrated autoconversion rate - integer :: accretn_idx ! Column-integrated autoconversion rate - integer :: rh700_idx ! relative humidity at 700 hPa - integer :: icnc_idx ! ice crystal number concentration in top layer of ice clouds (#/m3) - - integer :: intccn_idx - integer :: colrv_idx - integer :: rwp_idx - integer :: lwp2_idx - integer :: iwp2_idx - - integer :: ccn3d_idx ! - integer :: autocl_idx ! 3D autoconversion rate - integer :: accretl_idx ! 3D accreation rate - - integer :: cldo_idx ! pbuf index cloud fraction - integer :: qrain_idx ! pbuf index for grid-mean rain water - integer :: cld_tau_idx ! cloud optical depth - integer :: rel_idx ! droplet effective radius - integer :: rei_idx ! ice crystal effective radius - - integer :: cldliqbf_idx ! liquid water before microphyiscs - integer :: cldicebf_idx ! ice water before microphyiscs - integer :: numliqbf_idx ! liquid droplet number before microphyiscs - integer :: numicebf_idx ! ice crystal number before microphyiscs - - integer :: ixcldice, ixcldliq, ixnumliq, ixnumice - -CONTAINS - - subroutine output_aerocom_aie_register () - use physics_buffer, only : pbuf_add_field, dtype_r8 - - call pbuf_add_field('angstrm', 'physpkg', dtype_r8, (/pcols/), angstrm_idx) - call pbuf_add_field('cdr', 'physpkg', dtype_r8, (/pcols/), cdr_idx) - call pbuf_add_field('cdnc', 'physpkg', dtype_r8, (/pcols/), cdnc_idx) - call pbuf_add_field('cdnum', 'physpkg', dtype_r8, (/pcols/), cdnum_idx) - call pbuf_add_field('icnum', 'physpkg', dtype_r8, (/pcols/), icnum_idx) - call pbuf_add_field('clt', 'physpkg', dtype_r8, (/pcols/), clt_idx) - call pbuf_add_field('lcc', 'physpkg', dtype_r8, (/pcols/), lcc_idx) - call pbuf_add_field('lwp', 'physpkg', dtype_r8, (/pcols/), lwp_idx) - call pbuf_add_field('iwp', 'physpkg', dtype_r8, (/pcols/), iwp_idx) - call pbuf_add_field('icr', 'physpkg', dtype_r8, (/pcols/), icr_idx) - call pbuf_add_field('icc', 'physpkg', dtype_r8, (/pcols/), icc_idx) - call pbuf_add_field('cod', 'physpkg', dtype_r8, (/pcols/), cod_idx) - call pbuf_add_field('ccn', 'physpkg', dtype_r8, (/pcols/), ccn_idx) - call pbuf_add_field('ttop', 'physpkg', dtype_r8, (/pcols/), ttop_idx) - call pbuf_add_field('ptop', 'physpkg', dtype_r8, (/pcols/), ptop_idx) - - call pbuf_add_field('autoconv', 'physpkg', dtype_r8, (/pcols/), autoconv_idx) - call pbuf_add_field('accretn', 'physpkg', dtype_r8, (/pcols/), accretn_idx) - call pbuf_add_field('icnc', 'physpkg', dtype_r8, (/pcols/), icnc_idx) - call pbuf_add_field('rh700', 'physpkg', dtype_r8, (/pcols/), rh700_idx) - - call pbuf_add_field('intccn', 'physpkg', dtype_r8, (/pcols/), intccn_idx) - call pbuf_add_field('colrv', 'physpkg', dtype_r8, (/pcols/), colrv_idx) - call pbuf_add_field('rwp', 'physpkg', dtype_r8, (/pcols/), rwp_idx) - call pbuf_add_field('lwp2', 'physpkg', dtype_r8, (/pcols/), lwp2_idx) - call pbuf_add_field('iwp2', 'physpkg', dtype_r8, (/pcols/), iwp2_idx) - - call pbuf_add_field('ccn3d', 'physpkg', dtype_r8, (/pcols, pver/), ccn3d_idx) - call pbuf_add_field('autocl', 'physpkg', dtype_r8, (/pcols, pver/), autocl_idx) - call pbuf_add_field('accretl', 'physpkg', dtype_r8, (/pcols, pver/), accretl_idx) - - call pbuf_add_field('QRAIN', 'physpkg', dtype_r8, (/pcols, pver/), qrain_idx) - call pbuf_add_field('cld_tau', 'physpkg', dtype_r8, (/pcols, pver/), cld_tau_idx) - - call pbuf_add_field('cldliqbf', 'physpkg', dtype_r8, (/pcols, pver/), cldliqbf_idx) - call pbuf_add_field('cldicebf', 'physpkg', dtype_r8, (/pcols, pver/), cldicebf_idx) - call pbuf_add_field('numliqbf', 'physpkg', dtype_r8, (/pcols, pver/), numliqbf_idx) - call pbuf_add_field('numicebf', 'physpkg', dtype_r8, (/pcols, pver/), numicebf_idx) - - return - end subroutine output_aerocom_aie_register -!---------------------------------------------------------------------------------------------------- - -!==================================================================================================== - subroutine output_aerocom_aie_init () - use infnan - use physics_buffer, only : pbuf_get_index, dtype_r8 - use constituents, only: cnst_get_ind - - call addfld ('angstrm', horiz_only ,'A' , '#', 'Angstrom coefficient', flag_xyfill=.true.) - call addfld ('aerindex', horiz_only ,'A' , '#', 'Aerosol Index (Angstrom coefficient * AOD)', flag_xyfill=.true.) - call addfld ('cdr', horiz_only ,'A' , 'meter', 'Grid-cell mean droplet effective radius at top of liquid water clouds', flag_xyfill=.true.) - call addfld ('cdnc', horiz_only ,'A' , '#/m3', 'Grid-cell mean droplet number concentration at top of liquid water clouds', flag_xyfill=.true.) - call addfld ('cdnum', horiz_only ,'A' , '#/m2', 'Grid-cell mean column-integrated droplet number concentrations', flag_xyfill=.true.) - call addfld ('icnum', horiz_only ,'A' , '#/m2', 'Grid-cell mean column-integrated ice crystal number concentrations', flag_xyfill=.true.) - call addfld ('clt', horiz_only ,'A' , 'fraction','Fractional cover by all clouds', flag_xyfill=.true.) - call addfld ('lcc', horiz_only ,'A' , 'fraction','Fractional cover by liquid water clouds', flag_xyfill=.true.) - call addfld ('lwp', horiz_only ,'A' , 'kg/m2', 'Grid-cell mean liquid water path for liquid water clouds', flag_xyfill=.true.) - call addfld ('iwp', horiz_only ,'A' , 'kg/m2', 'Grid-cell mean ice water path for ice clouds', flag_xyfill=.true.) - call addfld ('icr', horiz_only ,'A' , 'meter', 'Grid-cell mean effective radius of crystals at top of ice clouds', flag_xyfill=.true.) - call addfld ('icc', horiz_only ,'A' , 'fracton','Fractional cover by ice clouds', flag_xyfill=.true.) - call addfld ('cod', horiz_only ,'A' , 'amount', 'Grid-cell mean cloud optical depth', flag_xyfill=.true.) - call addfld ('ccn', horiz_only ,'A' , '#/m3', 'CCN number concentration at 0.3% at the top layer of liquid water clouds', flag_xyfill=.true.) - call addfld ('ttop', horiz_only ,'A' , 'K', 'Temperature at top of clouds', flag_xyfill=.true.) - call addfld ('ptop', horiz_only ,'A' , 'Pa', 'Pressure at top of clouds', flag_xyfill=.true.) - call addfld ('autoconv', horiz_only ,'A' , 'kg/m2/s', 'Grid-mean surface precipitation rate', flag_xyfill=.true.) - call addfld ('accretn', horiz_only ,'A' , 'kg/m2/s', 'Grid-mean surface precipitation rate', flag_xyfill=.true.) - call addfld ('icnc', horiz_only ,'A' , '#/m3', 'Ice crystal number concentration at top of ice clouds', flag_xyfill=.true.) - call addfld ('rh700', horiz_only ,'A' , 'fraction', 'Relative humidity at 700 hPa', flag_xyfill=.true.) - - call addfld ('rwp', horiz_only ,'A' , 'kg/m2', 'Rain water path', flag_xyfill=.true.) - call addfld ('intccn', horiz_only ,'A' , '#/m2', 'Column-integrated CCN number concentration', flag_xyfill=.true.) - call addfld ('colrv', horiz_only ,'A' , 'm', 'Column-integrated volume-mean droplet effective radius', flag_xyfill=.true.) - call addfld ('lwp2', horiz_only ,'A' , 'kg/m2', 'Grid-cell mean liquid water path for liquid water clouds (new)', flag_xyfill=.true.) - call addfld ('iwp2', horiz_only ,'A' , 'kg/m2', 'Grid-cell mean ice water path for ice clouds (new)', flag_xyfill=.true.) - - call addfld ('lwpbf', horiz_only ,'A' , 'kg/m2', 'Grid-cell mean liquid water path for liquid water clouds before microphysics', flag_xyfill=.true.) - call addfld ('iwpbf', horiz_only ,'A' , 'kg/m2', 'Grid-cell mean ice water path for ice clouds before microphysics', flag_xyfill=.true.) - call addfld ('cdnumbf', horiz_only ,'A' , '#/m2', 'Grid-cell mean column-integrated droplet number concentrations before microphysics', flag_xyfill=.true.) - call addfld ('icnumbf', horiz_only ,'A' , '#/m2', 'Grid-cell mean column-integrated ice crystal number concentrations before microphysics', flag_xyfill=.true.) - - call addfld ('aod400',horiz_only ,'A' , '#', 'Aerosol optical depth at 400 nm', flag_xyfill=.true.) - call addfld ('aod700', horiz_only ,'A' , '#', 'Aerosol optical depth at 700 nm', flag_xyfill=.true.) - - call addfld('colccn.1',horiz_only ,'A' ,'#/m2', 'Column-integrated CCN concentration at S=0.1%') - call addfld('colccn.3',horiz_only ,'A' ,'#/m2', 'Column-integrated CCN concentration at S=0.3%') - call addfld('ccn.1bl',horiz_only ,'A' ,'#/m3', 'CCN concentration at S=0.1% at 1km above surface') - call addfld('ccn.3bl',horiz_only ,'A' ,'#/m3', 'CCN concentration at S=0.3% at 1km above surface') - - call addfld('lwc', (/ 'lev' /) ,'A' , 'kg/m3 ', 'Cloud liquid water content') - call addfld('iwc', (/ 'lev' /) ,'A' , 'kg/m3 ', 'Cloud ice water content') - call addfld('nc', (/ 'lev' /) ,'A' , '#/m3 ', 'Cloud liquid droplet number concentration') - call addfld('ni', (/ 'lev' /) ,'A' , '#/m3 ', 'Cloud ice crystal number concentration') - call addfld('airmass',(/ 'lev' /) ,'A' , 'kg/m2', 'Atmosphere mass content of air ') - call addfld('zaltitude', (/ 'lev' /) ,'A' , 'm', 'Altitiude from ground') - call addfld('dz', (/ 'lev' /) ,'A', 'm', 'Layer thickness') - - cldo_idx = pbuf_get_index('AST') - rel_idx = pbuf_get_index('REL') - rei_idx = pbuf_get_index('REI') - - call cnst_get_ind('CLDLIQ',ixcldliq) - call cnst_get_ind('CLDICE',ixcldice) - call cnst_get_ind('NUMLIQ',ixnumliq) - call cnst_get_ind('NUMICE',ixnumice) - - return - end subroutine output_aerocom_aie_init -!================================================================================= - -!--------------------------------------------------------------------------------- - subroutine cloud_top_aerocom(state, pbuf) -!----------------------------------------------------------------------------------- -! Purpose: to sample the variables at the cloud top for both ice and liquid clouds. -! -! Source: the original codes is provided by AEROCOM (AIE intercomparison) -! -!------------------------------------------------------------------------------------ - - use physics_types, only: physics_state - use physics_buffer, only : physics_buffer_desc, pbuf_get_field - use physconst, only: gravit, rair, cappa - use cam_logfile, only: iulog - - type(physics_state), intent(in), target :: state - type(physics_buffer_desc), pointer :: pbuf(:) - - -! Local variables - integer, parameter :: iovl = 3 ! Overlap assumption for clouds: 1, maximum; 2, random; 3, max/random. - - real(r8) :: cld (pcols,pver) ! cloud fractin, the same with cldo, except that it is 0 - real(r8) :: cldliq (pcols, pver) - real(r8) :: cldice (pcols, pver) - real(r8) :: numliq (pcols, pver) - real(r8) :: numice (pcols, pver) - real(r8) :: rhoair(pcols, pver) ! air density (kg/m3) - real(r8) :: lnd (pcols, pver) ! in-cloud droplet number concentrations - real(r8) :: ind (pcols, pver) ! in-cloud ice crystal number concentrations - real(r8) :: lwpbf (pcols) - real(r8) :: iwpbf (pcols) - real(r8) :: cdnumbf (pcols) - real(r8) :: icnumbf (pcols) - - real(r8) :: airmass (pcols, pver) - real(r8) :: zaltitude (pcols, pver) - real(r8) :: dz(pcols, pver) - real(r8) :: lwc (pcols, pver) - real(r8) :: iwc (pcols, pver) - real(r8) :: nc(pcols, pver) - real(r8) :: ni(pcols, pver) - - real(r8), pointer, dimension(:, :) :: cldo - real(r8), pointer, dimension(:, :) :: rel ! Liquid cloud particle effective radius - real(r8), pointer, dimension(:, :) :: rei ! Ice effective drop size (microns) - real(r8), pointer, dimension(:, :) :: tau ! cloud optical depth - real(r8), pointer, dimension(:, :) :: qrain ! grid-mean rain water mixing ratio - - real(r8), pointer, dimension(:) :: clt - real(r8), pointer, dimension(:) :: icc - real(r8), pointer, dimension(:) :: lcc - real(r8), pointer, dimension(:) :: ttop - real(r8), pointer, dimension(:) :: ptop - real(r8), pointer, dimension(:) :: cdr - real(r8), pointer, dimension(:) :: icr - real(r8), pointer, dimension(:) :: cdnc - real(r8), pointer, dimension(:) :: icnc - real(r8), pointer, dimension(:) :: ccn - - real(r8), pointer, dimension(:) :: cod - real(r8), pointer, dimension(:) :: lwp - real(r8), pointer, dimension(:) :: iwp - real(r8), pointer, dimension(:) :: cdnum - real(r8), pointer, dimension(:) :: icnum - real(r8), pointer, dimension(:) :: autoconv - real(r8), pointer, dimension(:) :: accretn - - real(r8), pointer, dimension(:) :: intccn - real(r8), pointer, dimension(:) :: colrv - real(r8), pointer, dimension(:) :: rwp - real(r8), pointer, dimension(:) :: lwp2 - real(r8), pointer, dimension(:) :: iwp2 - - real(r8), pointer, dimension(:, :) :: autocl - real(r8), pointer, dimension(:, :) :: accretl - real(r8), pointer, dimension(:, :) :: ccn3d - - real(r8), pointer, dimension(:, :) :: cldliqbf, cldicebf, numliqbf, numicebf - - - real(r8) :: ftmp(pcols) - real(r8) :: zi(pver+1) - real(r8) :: flag_max - real(r8) :: thres_cld, thres_cod, thres_cwp, max_cld, fr, cwp - real(r8) :: rv, t700 - real(r8) :: iiwp, ilwp, iphase, lphase - - integer :: itrue - integer :: lchnk, ncol - integer :: i, k - - thres_cld = 0.001 - thres_cwp = 1.0e-5 - max_cld = 1.0_r8 - 1.0e-9 -! thres_cod = 0.3 - thres_cod = 1.0e-5 - - lchnk = state%lchnk - ncol = state%ncol - - cldliq(:ncol, :) = state%q(:ncol,:,ixcldliq) - cldice(:ncol, :) = state%q(:ncol,:,ixcldice) - numliq(:ncol, :) = state%q(:ncol,:,ixnumliq) - numice(:ncol, :) = state%q(:ncol,:,ixnumice) - rhoair(:ncol, :) = state%pmid(:ncol,:) / (rair * state%t(:ncol,:)) - - call pbuf_get_field(pbuf, cldo_idx, cldo) - call pbuf_get_field(pbuf, qrain_idx, qrain) - call pbuf_get_field(pbuf, cld_tau_idx, tau) - call pbuf_get_field(pbuf, rel_idx, rel) - call pbuf_get_field(pbuf, rei_idx, rei) - call pbuf_get_field(pbuf, ccn3d_idx, ccn3d) - call pbuf_get_field(pbuf, autocl_idx, autocl) - call pbuf_get_field(pbuf, accretl_idx, accretl) - - call pbuf_get_field(pbuf, cldliqbf_idx, cldliqbf) - call pbuf_get_field(pbuf, cldicebf_idx, cldicebf) - call pbuf_get_field(pbuf, numliqbf_idx, numliqbf) - call pbuf_get_field(pbuf, numicebf_idx, numicebf) - - call pbuf_get_field(pbuf, clt_idx, clt) - call pbuf_get_field(pbuf, icc_idx, icc) - call pbuf_get_field(pbuf, lcc_idx, lcc) - call pbuf_get_field(pbuf, ttop_idx, ttop) - call pbuf_get_field(pbuf, ptop_idx, ptop) - call pbuf_get_field(pbuf, cdr_idx, cdr) - call pbuf_get_field(pbuf, icr_idx, icr) - call pbuf_get_field(pbuf, cdnc_idx, cdnc) - call pbuf_get_field(pbuf, icnc_idx, icnc) - call pbuf_get_field(pbuf, ccn_idx, ccn) - call pbuf_get_field(pbuf, cod_idx, cod) - call pbuf_get_field(pbuf, lwp_idx, lwp) - call pbuf_get_field(pbuf, iwp_idx, iwp) - call pbuf_get_field(pbuf, cdnum_idx, cdnum) - call pbuf_get_field(pbuf, icnum_idx, icnum) - call pbuf_get_field(pbuf, autoconv_idx, autoconv) - call pbuf_get_field(pbuf, accretn_idx, accretn) - call pbuf_get_field(pbuf, intccn_idx, intccn) - call pbuf_get_field(pbuf, colrv_idx, colrv) - call pbuf_get_field(pbuf, rwp_idx, rwp) - call pbuf_get_field(pbuf, lwp2_idx, lwp2) - call pbuf_get_field(pbuf, iwp2_idx, iwp2) - -! calcluate in-cloud droplet number concentrations -! and ice crystal number concentrations - do i=1, ncol - do k=1, pver - if(cldo(i,k).gt.thres_cld) then - lnd(i,k) = numliq(i,k) * rhoair(i,k)/cldo(i,k) - ind(i,k) = numice(i,k) * rhoair(i,k)/cldo(i,k) - else - lnd(i,k) = 0.0 - ind(i,k) = 0.0 - end if - end do - end do - - cld(:, :) = cldo(:, :) - if ( iovl.eq.2 .or.iovl.eq.3 ) then - clt(:) = 1._r8 - else - clt(:) = 0.0_r8 - end if - icc(:) = 0.0_r8 - lcc(:) = 0.0_r8 - ttop(:) = 0.0_r8 - ptop(:) = 0.0_r8 - cdr(:) = 0.0_r8 - icr(:) = 0.0_r8 - cdnc(:) = 0.0_r8 - icnc(:) = 0.0_r8 - ccn(:) = 0.0_r8 - lwp2(:) = 0.0_r8 - iwp2(:) = 0.0_r8 - - do i=1, ncol - do k=2, pver ! assumption: uppermost layer is cloud-free (k=1) - cwp = (cldliq(i,k)+cldice(i,k)) * state%pdel(i,k)/gravit - cwp = cwp/max(0.001_r8, cld(i,k)) -! if ( tau(i,k).ge.thres_cod.and.cld(i,k).ge.thres_cld ) then ! visible, not-too-small cloud - if ( cwp.ge.thres_cwp.and.cld(i,k).ge.thres_cld ) then ! not-too-small cloud, use cwp intead of tau, as at nightly grids, tau is not defined. -! flag_max is needed since the vertical integration for maximum overlap is different from -! the two others: for maximum, clt is the actual cloud cover in the level, for the two others, the actual cloud cover is 1 - clt -! ftmp is total cloud cover seen from above down to the current level -! clt is ftmp from the level just above -! ftmp - clt is thus the additional cloud fraction seen from above in this level - if (iovl.eq.1 ) then - flag_max = -1._r8 - ftmp(i) = max(clt(i), cld(i,k)) ! maximum overlap - elseif ( iovl.eq.2 ) then - flag_max = 1._r8 - ftmp(i) = clt(i) * ( 1._r8 - cld(i,k) ) ! random overlap - elseif ( iovl.eq. 3 ) then - flag_max = 1._r8 -! ftmp(i) = clt(i) * ( 1._r8 - min( max( cld(i,k), cld(i,k-1) ), max_cld) ) / & -! ( 1.0_r8 - min( cld(i,k-1), max_cld ) ) ! maximum-random overlap - fr= ( 1._r8 - min( max( cld(i,k), cld(i,k-1) ), max_cld) ) / & - ( 1.0_r8 - min( cld(i,k-1), max_cld ) ) ! maximum-random overlap - fr = min(1.0_r8, fr) - if(fr.gt.1.0_r8) then - write(6, *) 'cloud overlap', cld(i,k), cld(i, k-1), ( 1._r8 - min( max( cld(i,k), cld(i,k-1) ), max_cld) ), & - ( 1.0_r8 - min( cld(i,k-1), max_cld ) ) - call endrun('cloud overlap') - endif - fr = min(1.0_r8, fr) - ftmp(i) = clt(i) * fr - endif - - ttop(i) = ttop(i) + state%t(i,k) * ( clt(i) - ftmp(i) )*flag_max - ptop(i) = ptop(i) + state%pmid(i,k) *( clt(i) - ftmp(i) )*flag_max - - if(cldice(i,k).gt.1.0e-8) then - iphase = 1.0 - iiwp = cldice(i,k) * state%pdel(i,k)/gravit - else - iphase = 0.0 - iiwp = 0.0 - end if - - if(cldliq(i,k).gt.1.0e-8) then - lphase = 1.0 - ilwp = cldliq(i,k) * state%pdel(i,k)/gravit - else - lphase = 0.0 - ilwp = 0.0 - end if - -! ice clouds - icr(i) = icr(i) + rei(i,k) * iphase * ( clt(i) - ftmp(i) )*flag_max * 1.0e-6 ! um --> m - icc(i) = icc(i) + iphase * ( clt(i) - ftmp(i) )*flag_max - icnc(i) = icnc(i) + ind(i,k) * iphase * ( clt(i) - ftmp(i) )*flag_max - iwp2(i) = iwp2(i) + iiwp - -! liquid water clouds - cdr(i) = cdr(i) + rel(i,k) * lphase * ( clt(i) - ftmp(i) )*flag_max * 1.0e-6 ! um -> m - cdnc(i) = cdnc(i) + lnd(i,k) * lphase * ( clt(i) - ftmp(i) )*flag_max - ccn(i) = ccn(i) + ccn3d(i,k) * lphase * ( clt(i) - ftmp(i)) * flag_max * 1.0e6 ! #/cm3 --> #/m3 - lcc(i) = lcc(i) + lphase * ( clt(i) - ftmp(i) )*flag_max - lwp2(i) = lwp2(i) + ilwp - - clt(i) = ftmp(i) - else - cld(i,k) = 0.0_r8 ! reset the cloud fraction to be zero. This is necessary for maximum-random overlap - ! for cld(i, k-1) is used there. Otherwise you will find maximum-random overlap gives - ! smaller cloud fraction in some cases. - end if ! is there a visible, not-too-small cloud? - end do ! loop over k - - if ( iovl.eq.2 .or. iovl.eq.3 ) then - clt(i) = 1._r8 - clt(i) - end if -! if ( clt(i).le.thres_cld) then -! ttop(i) = fillvalue -! ptop(i) = fillvalue -! else -! ttop(i) = ttop(i)/clt(i) -! ptop(i) = ptop(i)/clt(i) -! end if -! if (lcc(i).le.thres_cld) then -! cdr(i) = fillvalue -! cdnc(i) = fillvalue -! ccn(i) = fillvalue -! lwp2(i) = fillvalue -! else -! cdr(i) = cdr(i)/lcc(i) * 1.0e-6 ! micron meter -> meter -! cdnc(i,lchnk) = cdnc(i)/lcc(i) * 1.0e6 ! #/cm3 --> #/m3 -! ccn(i) = ccn(i)/lcc(i) -! lwp2(i) = lwp2(i)/lcc(i) -! end if -! if (icc(i).le.thres_cld) then -! icr(i) = fillvalue -! icnc(i) = fillvalue -! iwp2(i) = fillvalue -! else -! icr(i) = icr(i)/icc(i) * 1.0e-6 ! micron meter -> meter -! icnc(i) = icnc(i)/icc(i) * 1.0e6 ! #/cm3 --> #/m3 -! iwp2(i) = iwp2(i)/icc(i) -! end if - end do ! loop over I - -! Diagnose other variables - do i=1, ncol - lwp(i) = 0.0 - iwp(i) = 0.0 - colrv(i) = 0.0 - cod(i) = 0.0 - intccn(i) = 0.0 - rwp(i) = 0.0 - cdnum(i) = 0.0 - icnum(i) = 0.0 - autoconv(i) = 0.0 - accretn(i) = 0.0 - lwpbf(i)=0.0 - iwpbf(i)=0.0 - cdnumbf(i)=0.0 - icnumbf(i)=0.0 - do k=1, pver - lwp(i) = lwp(i) + cldliq(i,k) * state%pdel(i,k)/gravit - iwp(i) = iwp(i) + cldice(i,k) * state%pdel(i,k)/gravit - rwp(i) = rwp(i) + qrain(i,k) * state%pdel(i,k)/gravit - cdnum(i) = cdnum(i) + numliq(i, k) * state%pdel(i,k)/gravit - icnum(i) = icnum(i) + numice(i, k) * state%pdel(i,k)/gravit - rv = min(25._r8, max(1.0_r8, (3 * cldliq(i,k)/max(4*3.14159*numliq(i,k)*1.0e3, 1.0_r8))**(1/3.) * 1.0e6)) ! micrometer - colrv(i) = colrv(i) + rv * cldliq(i,k) * state%pdel(i,k)/gravit - - cod(i) = cod(i) + tau(i,k) * cld(i,k) - intccn(i) = intccn(i)+ccn3d(i,k) * (state%pdel(i,k)/gravit/rhoair(i,k)) * 1.0e6 ! #/cm3 -->#/m2 - autoconv(i) = autoconv(i) + autocl(i,k) * state%pdel(i,k)/gravit - accretn(i) = accretn(i) + accretl(i,k) * state%pdel(i,k)/gravit - - lwpbf(i) = lwpbf(i) + cldliqbf(i,k) * state%pdel(i,k)/gravit - iwpbf(i) = iwpbf(i) + cldicebf(i,k) * state%pdel(i,k)/gravit - cdnumbf(i) = cdnumbf(i) + numliqbf(i, k) * state%pdel(i,k)/gravit - icnumbf(i) = icnumbf(i) + numicebf(i, k) * state%pdel(i,k)/gravit - - end do -! if(lcc(i).gt.thres_cld) then - -! colrv(i) = colrv(i) / max(0.00001, lwp(i)) -! cdnum(i) = cdnum(i) / max(0.00001, lwp(i)) - -! lwp(i) = lwp(i) / max(clt(i), 0.01) -! rwp(i) = rwp(i) / max(clt(i), 0.01) -! else -! lwp(i) = fillvalue -! rwp(i) = fillvalue -! colrv(i) = fillvalue -! cdnum(i) = fillvalue -! end if -! if(icc(i).gt.thres_cld) then -! iwp(i) = iwp(i) / max(clt(i), 0.01) -! else -! iwp(i) = fillvalue -! end if -! if(clt(i).gt.thres_cld) then -! cod(i) = cod(i) / max(clt(i), 0.01) -! else -! cod(i) = fillvalue -! end if - end do - - call outfld('cdr', cdr, pcols, lchnk) - call outfld('cdnc', cdnc, pcols, lchnk) - call outfld('cdnum', cdnum, pcols, lchnk) - call outfld('icnum', icnum, pcols, lchnk) - call outfld('clt', clt, pcols, lchnk) - call outfld('lcc', lcc, pcols, lchnk) - call outfld('lwp', lwp, pcols, lchnk) - call outfld('iwp', iwp, pcols, lchnk) - call outfld('icc', icc, pcols, lchnk) - call outfld('icnc', icnc, pcols, lchnk) - call outfld('icr', icr, pcols, lchnk) - call outfld('cod', cod, pcols, lchnk) - call outfld('ccn', ccn, pcols, lchnk) - call outfld('ptop', ptop, pcols, lchnk) - call outfld('ttop', ttop, pcols, lchnk) - call outfld('intccn', intccn, pcols, lchnk) - call outfld('colrv', colrv, pcols, lchnk) - call outfld('rwp', rwp, pcols, lchnk) - call outfld('lwp2', lwp2, pcols, lchnk) - call outfld('iwp2', iwp2, pcols, lchnk) - - call outfld('autoconv', autoconv, pcols, lchnk) - call outfld('accretn', accretn, pcols, lchnk) - - call outfld('lwpbf', lwpbf, pcols, lchnk) - call outfld('iwpbf', iwpbf, pcols, lchnk) - call outfld('cdnumbf', cdnumbf, pcols, lchnk) - call outfld('icnumbf', icnumbf, pcols, lchnk) - - zaltitude = 0.0 - do i=1, ncol - zi = 0.0 - do k=pver, 1, -1 - airmass(i,k) = state%pdel(i,k)/gravit ! kg/m2 - dz(i, k) = airmass(i,k)/rhoair(i,k) ! layer thickness in m - zi(k) = zi(k+1) + dz(i,k) ! layer thickness in m - zaltitude(i, k) = (zi(k+1)+zi(k))/2._r8 - lwc(i,k) = cldliq(i,k) * rhoair(i,k) ! kg/kg --> kg/m3 - iwc(i,k) = cldice(i,k) * rhoair(i,k) ! kg/kg --> kg/m3 - nc(i,k) = numliq(i,k) * rhoair(i,k) ! #/kg --> #/m3 - ni(i,k) = numice(i,k) * rhoair(i,k) ! #/kg --> #/m3 - end do - end do - call outfld('lwc', lwc, pcols, lchnk) - call outfld('iwc', iwc, pcols, lchnk) - call outfld('nc', nc, pcols, lchnk) - call outfld('ni', ni, pcols, lchnk) - call outfld('airmass', airmass, pcols, lchnk) - call outfld('zaltitude', zaltitude, pcols, lchnk) - call outfld('dz', dz, pcols, lchnk) - - return - end subroutine cloud_top_aerocom -!========================================================================== - -!-------------------------------------------------------------------------- - subroutine aerocom_calc(state, cld, rel, rei, lnd, ind, tau, cliqwp, cicewp, coszrs) -!------------------------------------------------------------------- -! calculate required variables. -!------------------------------------------------------------------ - use physics_types, only: physics_state - - implicit none -!!#include - - type(physics_state), intent(in) :: state - real(r8), intent(in) :: cld(pcols,pver) ! cloud cover - real(r8), intent(in) :: rel(pcols,pver) ! Liquid cloud particle effective radius (microns) - real(r8), intent(in) :: rei(pcols,pver) ! Ice effective drop size (microns) - real(r8), intent(in) :: lnd(pcols, pver) ! Liquid cloud number concentration (#/cm3) - real(r8), intent(in) :: ind(pcols, pver) ! Liquid cloud number concentration (#/cm3) - real(r8), intent(in) :: tau(pcols, pver) ! cloud optical depth - real(r8), intent(in) :: cliqwp(pcols,pver) ! in-cloud liquid water path (g/m2) - real(r8), intent(in) :: cicewp(pcols,pver) ! in-cloud ice water path (g/m2) - real(r8), intent(in) :: coszrs(pcols) ! cosine solar zenith angle (to tell if day or night) - -! Local variables - integer :: lchnk, ncol - integer :: i, k - - lchnk = state%lchnk - ncol = state%ncol - -! call cloud_top_aerocom(state, pbuf) - - return - end subroutine aerocom_calc -!----------------------------------------------------------------------------- - -!============================================================================= - subroutine output_aerocom (state, pbuf) - use physics_types, only: physics_state - use physics_buffer, only : physics_buffer_desc, pbuf_get_field - - type(physics_state), intent(in), target :: state - type(physics_buffer_desc), pointer :: pbuf(:) - -! Local variables - -! if(dosw) then -! call outfld('OD550', od550(:), pcols, lchnk) -! call outfld('ALBS', albs(:), pcols, lchnk) -! call outfld('RST', rst(:), pcols, lchnk) -! call outfld('RSTCS', rstcs(:), pcols, lchnk) -! call outfld('RSS', rss(:), pcols, lchnk) -! call outfld('RSSCS', rsscs(:), pcols, lchnk) -! call outfld('RSDS', rsds(:), pcols, lchnk) -! end if -! if (dolw) then -! call outfld('RLT', rlt(:), pcols, lchnk) -! call outfld('RLTCS', rltcs(:), pcols, lchnk) -! call outfld('RLS', rls(:), pcols, lchnk) -! call outfld('RLSCS', rlscs(:), pcols, lchnk) -! end if - -! call outfld('HFLS', hfls(:), pcols, lchnk) -! call outfld('HFSS', hfss(:), pcols, lchnk) - - return - end subroutine output_aerocom -!-------------------------------------------------------------------------- - -end module output_aerocom_aie diff --git a/components/cam/src/physics/cam/phys_control.F90 b/components/cam/src/physics/cam/phys_control.F90 index d09db38b5b37..9accf1f67738 100644 --- a/components/cam/src/physics/cam/phys_control.F90 +++ b/components/cam/src/physics/cam/phys_control.F90 @@ -91,7 +91,6 @@ module phys_control logical :: history_waccm = .true. ! output variables of interest for WACCM runs logical :: history_clubb = .true. ! output default CLUBB-related variables logical :: do_clubb_sgs -logical :: do_aerocom_ind3 = .false. ! true to write aerocom real(r8) :: prc_coef1 = huge(1.0_r8) real(r8) :: prc_exp = huge(1.0_r8) real(r8) :: prc_exp1 = huge(1.0_r8) @@ -177,7 +176,6 @@ subroutine phys_ctl_readnl(nlfile) use_mass_borrower, & l_ieflx_fix, & ieflx_opt, & - do_aerocom_ind3, & use_qqflx_fixer, & print_fixer_message, & use_hetfrz_classnuc, use_gw_oro, use_gw_front, use_gw_convect, & @@ -228,7 +226,6 @@ subroutine phys_ctl_readnl(nlfile) call mpibcast(history_waccm, 1 , mpilog, 0, mpicom) call mpibcast(history_clubb, 1 , mpilog, 0, mpicom) call mpibcast(do_clubb_sgs, 1 , mpilog, 0, mpicom) - call mpibcast(do_aerocom_ind3, 1 , mpilog, 0, mpicom) call mpibcast(conv_water_in_rad, 1 , mpiint, 0, mpicom) call mpibcast(do_tms, 1 , mpilog, 0, mpicom) call mpibcast(use_mass_borrower, 1 , mpilog, 0, mpicom) @@ -402,7 +399,6 @@ subroutine phys_getopts(deep_scheme_out, shallow_scheme_out, eddy_scheme_out, mi history_budget_out, history_budget_histfile_num_out, history_waccm_out, & history_clubb_out, ieflx_opt_out, conv_water_in_rad_out, cam_chempkg_out, prog_modal_aero_out, macrop_scheme_out, & do_clubb_sgs_out, do_tms_out, state_debug_checks_out, & - do_aerocom_ind3_out, & use_mass_borrower_out, & l_ieflx_fix_out, & use_qqflx_fixer_out, & @@ -442,7 +438,6 @@ subroutine phys_getopts(deep_scheme_out, shallow_scheme_out, eddy_scheme_out, mi logical, intent(out), optional :: history_waccm_out logical, intent(out), optional :: history_clubb_out logical, intent(out), optional :: do_clubb_sgs_out - logical, intent(out), optional :: do_aerocom_ind3_out logical, intent(out), optional :: micro_do_icesupersat_out integer, intent(out), optional :: ieflx_opt_out integer, intent(out), optional :: conv_water_in_rad_out @@ -505,7 +500,6 @@ subroutine phys_getopts(deep_scheme_out, shallow_scheme_out, eddy_scheme_out, mi if ( present(history_waccm_out ) ) history_waccm_out = history_waccm if ( present(history_clubb_out ) ) history_clubb_out = history_clubb if ( present(do_clubb_sgs_out ) ) do_clubb_sgs_out = do_clubb_sgs - if ( present(do_aerocom_ind3_out ) ) do_aerocom_ind3_out = do_aerocom_ind3 if ( present(micro_do_icesupersat_out )) micro_do_icesupersat_out = micro_do_icesupersat if ( present(conv_water_in_rad_out ) ) conv_water_in_rad_out = conv_water_in_rad if ( present(ieflx_opt_out ) ) ieflx_opt_out = ieflx_opt diff --git a/components/cam/src/physics/cam/physpkg.F90 b/components/cam/src/physics/cam/physpkg.F90 index 3638d5b094ef..10b440a34b18 100644 --- a/components/cam/src/physics/cam/physpkg.F90 +++ b/components/cam/src/physics/cam/physpkg.F90 @@ -146,7 +146,6 @@ subroutine phys_register use rad_constituents, only: rad_cnst_get_info ! Added to query if it is a modal aero sim or not use subcol, only: subcol_register use subcol_utils, only: is_subcol_on - use output_aerocom_aie, only: output_aerocom_aie_register, do_aerocom_ind3 !---------------------------Local variables----------------------------- ! @@ -161,7 +160,6 @@ subroutine phys_register microp_scheme_out = microp_scheme, & cld_macmic_num_steps_out = cld_macmic_num_steps, & do_clubb_sgs_out = do_clubb_sgs, & - do_aerocom_ind3_out = do_aerocom_ind3, & use_subcol_microp_out = use_subcol_microp, & state_debug_checks_out = state_debug_checks, & micro_do_icesupersat_out = micro_do_icesupersat) @@ -298,9 +296,6 @@ subroutine phys_register ! vertical diffusion if (.not. do_clubb_sgs) call vd_register() - - if (do_aerocom_ind3) call output_aerocom_aie_register() - end if ! Register diagnostics PBUF @@ -708,8 +703,6 @@ subroutine phys_init( phys_state, phys_tend, pbuf2d, cam_out ) use solar_data, only: solar_data_init use rad_solar_var, only: rad_solar_var_init use nudging, only: Nudge_Model,nudging_init - use output_aerocom_aie, only: output_aerocom_aie_init, do_aerocom_ind3 - ! Input/output arguments type(physics_state), pointer :: phys_state(:) @@ -861,8 +854,6 @@ subroutine phys_init( phys_state, phys_tend, pbuf2d, cam_out ) call sslt_rebin_init() call tropopause_init() - if(do_aerocom_ind3) call output_aerocom_aie_init() - prec_dp_idx = pbuf_get_index('PREC_DP') snow_dp_idx = pbuf_get_index('SNOW_DP') prec_sh_idx = pbuf_get_index('PREC_SH') @@ -1809,7 +1800,6 @@ subroutine tphysbc (ztodt, & use clubb_intr, only: clubb_tend_cam use sslt_rebin, only: sslt_rebin_adv use tropopause, only: tropopause_output - use output_aerocom_aie, only: do_aerocom_ind3, cloud_top_aerocom use cam_abortutils, only: endrun use subcol, only: subcol_gen, subcol_ptend_avg use subcol_utils, only: subcol_ptend_copy, is_subcol_on @@ -2624,10 +2614,6 @@ subroutine tphysbc (ztodt, & end if ! l_rad - if(do_aerocom_ind3) then - call cloud_top_aerocom(state, pbuf) - end if - ! Diagnose the location of the tropopause and its location to the history file(s). call t_startf('tropopause') call tropopause_output(state) diff --git a/components/cam/src/physics/cam/radiation.F90 b/components/cam/src/physics/cam/radiation.F90 index 51e598864138..939ddacf0538 100644 --- a/components/cam/src/physics/cam/radiation.F90 +++ b/components/cam/src/physics/cam/radiation.F90 @@ -563,7 +563,6 @@ subroutine radiation_tend(state,ptend, pbuf, & use orbit, only: zenith - ! Arguments real(r8), intent(in) :: landfrac(pcols) ! land fraction real(r8), intent(in) :: landm(pcols) ! land fraction ramp @@ -706,8 +705,7 @@ subroutine radiation_tend(state,ptend, pbuf, & call pbuf_get_field(pbuf, rel_idx, rel ) call pbuf_get_field(pbuf, rei_idx, rei ) - - + ! For CRM, make cloud equal to input observations: if (single_column.and.scm_crm_mode.and.have_cld) then do k = 1,pver @@ -854,6 +852,7 @@ subroutine radiation_tend(state,ptend, pbuf, & call outfld('FSN200C ',fsn200c,pcols,lchnk) call outfld('SWCF ',swcf ,pcols,lchnk) + !! initialize tau_cld_vistau and tau_icld_vistau as fillvalue, they will stay fillvalue for night columns tot_icld_vistau(1:pcols,1:pver)=fillvalue tot_cld_vistau(1:pcols,1:pver)=fillvalue diff --git a/components/cam/src/physics/rrtmg/radiation.F90 b/components/cam/src/physics/rrtmg/radiation.F90 index f096b0cc7882..13a274037442 100644 --- a/components/cam/src/physics/rrtmg/radiation.F90 +++ b/components/cam/src/physics/rrtmg/radiation.F90 @@ -427,8 +427,6 @@ subroutine radiation_init() sampling_seq='rad_lwsw') call addfld('FSNTOAC'//diag(icall), horiz_only, 'A', 'W/m2', 'Clearsky net solar flux at top of atmosphere', & sampling_seq='rad_lwsw') - call addfld('FSUTOAC'//diag(icall), horiz_only, 'A', 'W/m2', 'Clearsky upwelling solar flux at top of atmosphere', & - sampling_seq='rad_lwsw') call addfld('FSN200'//diag(icall), horiz_only, 'A', 'W/m2', 'Net shortwave flux at 200 mb', & sampling_seq='rad_lwsw') call addfld('FSN200C'//diag(icall), horiz_only, 'A', 'W/m2', 'Clearsky net shortwave flux at 200 mb', & @@ -461,7 +459,6 @@ subroutine radiation_init() call add_default('FSNTOA'//diag(icall), 1, ' ') call add_default('FSUTOA'//diag(icall), 1, ' ') call add_default('FSNTOAC'//diag(icall), 1, ' ') - call add_default('FSUTOAC'//diag(icall), 1, ' ') call add_default('FSNTC'//diag(icall), 1, ' ') call add_default('FSNSC'//diag(icall), 1, ' ') call add_default('FSDSC'//diag(icall), 1, ' ') @@ -618,7 +615,7 @@ subroutine radiation_tend(state,ptend, pbuf, & !----------------------------------------------------------------------- - use physics_buffer, only : physics_buffer_desc, pbuf_get_field, pbuf_old_tim_idx, pbuf_get_index, pbuf_set_field + use physics_buffer, only : physics_buffer_desc, pbuf_get_field, pbuf_old_tim_idx use phys_grid, only: get_rlat_all_p, get_rlon_all_p use physics_types, only: physics_state, physics_ptend @@ -650,7 +647,6 @@ subroutine radiation_tend(state,ptend, pbuf, & use radiation_data, only: output_rad_data use rrtmg_state, only: rrtmg_state_create, rrtmg_state_update, rrtmg_state_destroy, rrtmg_state_t, num_rrtmg_levs use orbit, only: zenith - use output_aerocom_aie , only: do_aerocom_ind3 ! Arguments real(r8), intent(in) :: landfrac(pcols) ! land fraction @@ -824,14 +820,6 @@ subroutine radiation_tend(state,ptend, pbuf, & type(rrtmg_state_t), pointer :: r_state ! contains the atm concentratiosn in layers needed for RRTMG -! AeroCOM IND3 output +++mhwang - real(r8) :: aod400(pcols) ! AOD at 400 nm - real(r8) :: aod700(pcols) ! AOD at 700 nm - real(r8) :: angstrm(pcols) ! Angstrom coefficient - real(r8) :: aerindex(pcols) ! Aerosol index - integer aod400_idx, aod700_idx, cld_tau_idx - - character(*), parameter :: name = 'radiation_tend' !---------------------------------------------------------------------- @@ -859,11 +847,7 @@ subroutine radiation_tend(state,ptend, pbuf, & call pbuf_get_field(pbuf, lu_idx, lu) call pbuf_get_field(pbuf, ld_idx, ld) end if - - if (do_aerocom_ind3) then - cld_tau_idx = pbuf_get_index('cld_tau') - end if - + ! For CRM, make cloud equal to input observations: if (single_column.and.scm_crm_mode.and.have_cld) then do k = 1,pver @@ -973,11 +957,6 @@ subroutine radiation_tend(state,ptend, pbuf, & c_cld_tau_w_g(1:nbndsw,1:ncol,:)= cld_tau_w_g(:,1:ncol,:) c_cld_tau_w_f(1:nbndsw,1:ncol,:)= cld_tau_w_f(:,1:ncol,:) endif - - if(do_aerocom_ind3) then - call pbuf_set_field(pbuf,cld_tau_idx,cld_tau(rrtmg_sw_cloudsim_band, :, :)) - end if - endif if (dolw) then @@ -1092,41 +1071,6 @@ subroutine radiation_tend(state,ptend, pbuf, & do i=1,ncol swcf(i)=fsntoa(i) - fsntoac(i) end do - - if(do_aerocom_ind3) then - aerindex = 0.0 - angstrm = 0.0 - aod400 = 0.0 - aod700 = 0.0 - do i=1, ncol - aod400(i) = sum(aer_tau(i, :, idx_sw_diag+1)) - aod700(i) = sum(aer_tau(i, :, idx_sw_diag-1)) - if(aod400(i).lt.1.0e4 .and. aod700(i).lt.1.e4 .and. & - aod400(i).gt.1.0e-10 .and. aod700(i).gt.1.0e-10) then - angstrm(i) = (log (aod400(i))-log(aod700(i)))/(log(0.700)-log(0.400)) - else - angstrm(i) = fillvalue - end if - if(angstrm(i).ne.fillvalue) then - aerindex(i) = angstrm(i)*sum(aer_tau(i,:,idx_sw_diag)) - else - aerindex(i) = fillvalue - end if - end do - do i = 1, nnite - angstrm(idxnite(i)) = fillvalue - aod400(idxnite(i)) = fillvalue - aod700(idxnite(i)) = fillvalue - aerindex(idxnite(i)) = fillvalue - end do - if(icall.eq.0) then ! only for climatology run - call outfld('angstrm', angstrm, pcols, lchnk) - call outfld('aod400', aod400, pcols, lchnk) - call outfld('aod700', aod700, pcols, lchnk) - call outfld('aerindex', aerindex, pcols, lchnk) - end if - end if - ! Dump shortwave radiation information to history tape buffer (diagnostics) ftem(:ncol,:pver) = qrs(:ncol,:pver)/cpair call outfld('QRS'//diag(icall),ftem ,pcols,lchnk) @@ -1145,7 +1089,6 @@ subroutine radiation_tend(state,ptend, pbuf, & call outfld('FSNTOA'//diag(icall),fsntoa,pcols,lchnk) call outfld('FSUTOA'//diag(icall),fsutoa,pcols,lchnk) call outfld('FSNTOAC'//diag(icall),fsntoac,pcols,lchnk) - call outfld('FSUTOAC'//diag(icall),fsntoac,pcols,lchnk) call outfld('SOLS'//diag(icall),cam_out%sols ,pcols,lchnk) call outfld('SOLL'//diag(icall),cam_out%soll ,pcols,lchnk) call outfld('SOLSD'//diag(icall),cam_out%solsd ,pcols,lchnk)