LCOV - code coverage report
Current view: top level - physics/cam - radiation_data.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 38 576 6.6 %
Date: 2024-12-17 22:39:59 Functions: 4 11 36.4 %

          Line data    Source code
       1             : !================================================================================================
       2             : ! output/input data necessary to drive radiation offline
       3             : ! Francis Vitt -- Created 15 Dec 2009
       4             : !================================================================================================
       5             : module radiation_data
       6             : 
       7             :   use shr_kind_mod,     only: r8=>shr_kind_r8
       8             :   use ppgrid,           only : pcols, pver, pverp, begchunk, endchunk
       9             :   use cam_history,      only: addfld, add_default, horiz_only, outfld
      10             :   use rad_constituents, only: rad_cnst_get_info, rad_cnst_get_gas, rad_cnst_get_aer_mmr
      11             :   use radconstants,     only: nradgas, gaslist
      12             :   use cam_history_support, only: fieldname_len, fillvalue
      13             :   use spmd_utils,       only: masterproc
      14             :   use cam_abortutils,   only: endrun
      15             : 
      16             :   use drv_input_data,only: drv_input_data_t
      17             :   use drv_input_data,only: drv_input_data_get, drv_input_2d_t, drv_input_3d_t, drv_input_4d_t, drv_input_2di_t
      18             :   use physics_types, only: physics_state
      19             :   use physics_buffer,only: physics_buffer_desc, pbuf_get_chunk
      20             : 
      21             :   implicit none
      22             :   private
      23             : 
      24             :   public :: rad_data_readnl
      25             :   public :: rad_data_register
      26             :   public :: rad_data_init
      27             :   public :: rad_data_write
      28             :   public :: rad_data_read
      29             :   public :: rad_data_enable
      30             : 
      31             :   integer :: volcgeom_ifld, volcgeom1_ifld, volcgeom2_ifld, volcgeom3_ifld
      32             :   integer :: cld_ifld,rel_ifld,rei_ifld
      33             :   integer :: dei_ifld,mu_ifld,lambdac_ifld,iciwp_ifld,iclwp_ifld
      34             :   integer :: des_ifld,icswp_ifld,cldfsnow_ifld
      35             :   integer :: cldemis_ifld, cldtau_ifld, cicewp_ifld, cliqwp_ifld, nmxrgn_ifld, pmxrgn_ifld
      36             :   integer :: qrs_ifld, qrl_ifld
      37             :   integer :: dgnumwet_ifld, qaerwat_ifld
      38             : 
      39             :   character(len=fieldname_len), parameter :: &
      40             :        lndfrc_fldn    = 'rad_lndfrc      ' , &
      41             :        icefrc_fldn    = 'rad_icefrc      ' , &
      42             :        snowh_fldn     = 'rad_snowh       ' , &
      43             :        asdir_fldn     = 'rad_asdir       ' , &
      44             :        asdif_fldn     = 'rad_asdif       ' , &
      45             :        aldir_fldn     = 'rad_aldir       ' , &
      46             :        aldif_fldn     = 'rad_aldif       ' , &
      47             :        coszen_fldn    = 'rad_coszen      ' , &
      48             :        asdir_pos_fldn = 'rad_asdir_pos   ' , &
      49             :        asdif_pos_fldn = 'rad_asdif_pos   ' , &
      50             :        aldir_pos_fldn = 'rad_aldir_pos   ' , &
      51             :        aldif_pos_fldn = 'rad_aldif_pos   ' , &
      52             :        lwup_fldn      = 'rad_lwup        ' , &
      53             :        ts_fldn        = 'rad_ts          ' , &
      54             :        temp_fldn      = 'rad_temp        ' , &
      55             :        pdel_fldn      = 'rad_pdel        ' , &
      56             :        pdeldry_fldn   = 'rad_pdeldry     ' , &
      57             :        pmid_fldn      = 'rad_pmid        ' , &
      58             :        watice_fldn    = 'rad_watice      ' , &
      59             :        watliq_fldn    = 'rad_watliq      ' , &
      60             :        watvap_fldn    = 'rad_watvap      ' , &
      61             :        zint_fldn      = 'rad_zint        ' , &
      62             :        pint_fldn      = 'rad_pint        ' , &
      63             :        cld_fldn       = 'rad_cld         ' , &
      64             :        cldemis_fldn   = 'rad_cldemis     ' , &
      65             :        cldtau_fldn    = 'rad_cldtau      ' , &
      66             :        cicewp_fldn    = 'rad_cicewp      ' , &
      67             :        cliqwp_fldn    = 'rad_cliqwp      ' , &
      68             :        nmxrgn_fldn    = 'rad_nmxrgn      ' , &
      69             :        pmxrgn_fldn    = 'rad_pmxrgn      ' , &
      70             :        cldfsnow_fldn  = 'rad_cldfsnow    ' , &
      71             :        rel_fldn       = 'rad_rel         ' , &
      72             :        rei_fldn       = 'rad_rei         ' , &
      73             :        dei_fldn       = 'rad_dei         ' , &
      74             :        des_fldn       = 'rad_des         ' , &
      75             :        mu_fldn        = 'rad_mu          ' , &
      76             :        lambdac_fldn   = 'rad_lambdac     ' , &
      77             :        iciwp_fldn     = 'rad_iciwp       ' , &
      78             :        iclwp_fldn     = 'rad_iclwp       ' , &
      79             :        icswp_fldn     = 'rad_icswp       ' , &
      80             :        qrs_fldn       = 'rad_qrs         ' , &
      81             :        qrl_fldn       = 'rad_qrl         ' , &
      82             :        volcgeom_fldn  = 'rad_volc_geom   ' , &
      83             :        volcgeom1_fldn = 'rad_volc_geom1  ' , &
      84             :        volcgeom2_fldn = 'rad_volc_geom2  ' , &
      85             :        volcgeom3_fldn = 'rad_volc_geom3  '
      86             : 
      87             :   ! for modal aerosols
      88             :   character(len=fieldname_len), allocatable :: dgnumwet_fldn(:)
      89             :   character(len=fieldname_len), allocatable :: qaerwat_fldn(:)
      90             :   integer :: nmodes=0
      91             : 
      92             :   ! rad constituents mixing ratios
      93             :   integer :: ngas, naer=0
      94             :   character(len=64), allocatable :: gasnames(:)
      95             :   character(len=64), allocatable :: aernames(:)
      96             :  
      97             :   ! control options  
      98             :   logical          :: rad_data_output = .false.
      99             :   integer          :: rad_data_histfile_num = 2
     100             :   character(len=1) :: rad_data_avgflag = 'I'
     101             : 
     102             :   ! MG microphys check
     103             :   logical :: mg_microphys
     104             : 
     105             :   logical :: fixed_dyn_heating = .false.
     106             : 
     107             :   ! for fixed dynamical heating ...
     108             :   logical :: do_fdh = .false.
     109             : 
     110             :   integer :: tcorr_idx = -1
     111             :   integer :: qrsin_idx = -1
     112             :   integer :: qrlin_idx = -1
     113             :   integer :: tropp_idx = -1
     114             : 
     115             :   logical :: enabled = .false.
     116             :   logical :: gmean_3modes = .false.
     117             : 
     118             : contains
     119             : 
     120             : 
     121             : !================================================================================================
     122             : !================================================================================================
     123        1536 :   subroutine rad_data_register
     124             :     use physics_buffer,  only: pbuf_add_field, dtype_r8
     125             : 
     126        1536 :     if ( do_fdh ) then
     127           0 :       call pbuf_add_field('tcorr', 'global',  dtype_r8, (/pcols,pver/), tcorr_idx)
     128           0 :       call pbuf_add_field('qrsin', 'physpkg', dtype_r8, (/pcols,pver/), qrsin_idx) 
     129           0 :       call pbuf_add_field('qrlin', 'physpkg', dtype_r8, (/pcols,pver/), qrlin_idx) 
     130           0 :       call pbuf_add_field('tropp', 'physpkg', dtype_r8, (/pcols/),      tropp_idx) 
     131             :     end if 
     132             : 
     133        1536 :   end subroutine rad_data_register
     134             : 
     135             : !================================================================================================
     136             : !================================================================================================
     137        1536 :   subroutine rad_data_readnl(nlfile)
     138             : 
     139             :     ! Read rad_data_nl namelist group.  Parse input.
     140             : 
     141        1536 :     use namelist_utils,  only: find_group_name
     142             :     use units,           only: getunit, freeunit
     143             :     use mpishorthand
     144             : 
     145             :     character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
     146             :     logical :: rad_data_fdh = .false.
     147             : 
     148             :     ! Local variables
     149             :     integer :: unitn, ierr, i
     150             :     character(len=*), parameter :: subname = 'rad_data_readnl'
     151             : 
     152             :     namelist /rad_data_nl/ rad_data_output, rad_data_histfile_num, rad_data_avgflag, rad_data_fdh
     153             : 
     154             :     !-----------------------------------------------------------------------------
     155             : 
     156        1536 :     if (masterproc) then
     157           2 :        unitn = getunit()
     158           2 :        open( unitn, file=trim(nlfile), status='old' )
     159           2 :        call find_group_name(unitn, 'rad_data_nl', status=ierr)
     160           2 :        if (ierr == 0) then
     161           0 :           read(unitn, rad_data_nl, iostat=ierr)
     162           0 :           if (ierr /= 0) then
     163           0 :              call endrun(subname // ':: ERROR reading namelist')
     164             :           end if
     165             :        end if
     166           2 :        close(unitn)
     167           2 :        call freeunit(unitn)
     168             :     end if
     169             : 
     170             : #ifdef SPMD
     171             :     ! Broadcast namelist variables
     172        1536 :     call mpibcast (rad_data_output,       1,   mpilog ,  0, mpicom)
     173        1536 :     call mpibcast (rad_data_fdh,          1,   mpilog ,  0, mpicom)
     174        1536 :     call mpibcast (rad_data_histfile_num, 1,   mpiint ,  0, mpicom)
     175        1536 :     call mpibcast (rad_data_avgflag,      1,   mpichar , 0, mpicom)
     176             : #endif
     177        1536 :     do_fdh = rad_data_fdh
     178        1536 :     enabled = rad_data_output
     179             : 
     180        1536 :   end subroutine rad_data_readnl
     181             : 
     182             :   !================================================================================================
     183             :   !================================================================================================
     184           0 :   subroutine rad_data_enable()
     185           0 :     enabled = .true.
     186           0 :   end subroutine rad_data_enable
     187             : 
     188             :   !================================================================================================
     189             :   !================================================================================================
     190        1536 :   subroutine rad_data_init( pbuf2d )
     191             :     use phys_control,     only: phys_getopts
     192             :     use physics_buffer, only: pbuf_get_index
     193             :     use physics_buffer, only: pbuf_set_field
     194             :     implicit none
     195             :     
     196             :     ! args
     197             :     type(physics_buffer_desc), pointer :: pbuf2d(:,:)
     198             : 
     199             :     ! local vars
     200             :     integer :: i, err
     201             :     integer :: m,l, nspec
     202             :     character(len=64) :: name
     203             :     character(len=32) :: aername =  ' '
     204             :     character(len=128):: long_name
     205             :     character(len=64) :: long_name_description
     206             :     character(len=16)  :: microp_scheme  ! microphysics scheme
     207             :     character(len=16)  :: rad_scheme
     208             :    
     209        1536 :     if (.not.enabled) return
     210             : 
     211           0 :     call phys_getopts(microp_scheme_out=microp_scheme, radiation_scheme_out=rad_scheme)
     212           0 :     mg_microphys =  (trim(microp_scheme) == 'MG')
     213             : 
     214           0 :     volcgeom_ifld = pbuf_get_index('VOLC_RAD_GEOM',errcode=err) ! might need 3 more for 3-mode inputs
     215           0 :     volcgeom1_ifld = pbuf_get_index('VOLC_RAD_GEOM1',errcode=err) ! might need 3 more for 3-mode inputs
     216           0 :     volcgeom2_ifld = pbuf_get_index('VOLC_RAD_GEOM2',errcode=err) ! might need 3 more for 3-mode inputs
     217           0 :     volcgeom3_ifld = pbuf_get_index('VOLC_RAD_GEOM3',errcode=err) ! might need 3 more for 3-mode inputs
     218             : 
     219           0 :     gmean_3modes = volcgeom1_ifld > 0 .and. volcgeom2_ifld > 0 .and. volcgeom3_ifld > 0 .and. volcgeom_ifld < 1
     220             : 
     221           0 :     if (volcgeom_ifld > 0) then
     222           0 :        call addfld(volcgeom_fldn, (/ 'lev' /), 'I','m', 'combined volcanic aerosol geometric-mode radius' )
     223             :     endif
     224           0 :     if (gmean_3modes) then
     225           0 :        call addfld(volcgeom1_fldn, (/ 'lev' /), 'I','m', 'mode 1 volcanic aerosol geometric-mode radius' )
     226           0 :        call addfld(volcgeom2_fldn, (/ 'lev' /), 'I','m', 'mode 2 volcanic aerosol geometric-mode radius' )
     227           0 :        call addfld(volcgeom3_fldn, (/ 'lev' /), 'I','m', 'mode 3 volcanic aerosol geometric-mode radius' )
     228             :     endif
     229             : 
     230           0 :     cld_ifld    = pbuf_get_index('CLD')
     231           0 :     rel_ifld    = pbuf_get_index('REL')
     232           0 :     rei_ifld    = pbuf_get_index('REI')
     233           0 :     qrs_ifld    = pbuf_get_index('QRS')
     234           0 :     qrl_ifld    = pbuf_get_index('QRL')
     235           0 :     if (mg_microphys) then
     236           0 :        dei_ifld      = pbuf_get_index('DEI')
     237           0 :        des_ifld      = pbuf_get_index('DES')
     238           0 :        mu_ifld       = pbuf_get_index('MU')
     239           0 :        lambdac_ifld  = pbuf_get_index('LAMBDAC')
     240           0 :        iciwp_ifld    = pbuf_get_index('ICIWP')
     241           0 :        iclwp_ifld    = pbuf_get_index('ICLWP')
     242           0 :        icswp_ifld    = pbuf_get_index('ICSWP')
     243           0 :        cldfsnow_ifld = pbuf_get_index('CLDFSNOW')
     244             :     else
     245           0 :        cldemis_ifld= pbuf_get_index('CLDEMIS')
     246           0 :        cldtau_ifld = pbuf_get_index('CLDTAU')
     247           0 :        cicewp_ifld = pbuf_get_index('CICEWP')
     248           0 :        cliqwp_ifld = pbuf_get_index('CLIQWP')
     249           0 :        nmxrgn_ifld = pbuf_get_index('NMXRGN')
     250           0 :        pmxrgn_ifld = pbuf_get_index('PMXRGN')
     251             :     endif
     252             :     
     253           0 :     if ( do_fdh ) then
     254           0 :        call addfld('rad_TROP_P', horiz_only,  'A','Pa','Pressure at which tropopause is defined for radiation' )
     255           0 :        call addfld('rad_TCORR',  (/ 'lev' /), 'I','K', 'Fixed dynamical heating temperature correction ' )
     256           0 :        call pbuf_set_field(pbuf2d, tcorr_idx, 0.0_r8)
     257           0 :        call pbuf_set_field(pbuf2d, qrsin_idx, 0.0_r8)
     258           0 :        call pbuf_set_field(pbuf2d, qrlin_idx, 0.0_r8)
     259           0 :        call pbuf_set_field(pbuf2d, tropp_idx, -1.0_r8)
     260             :     endif
     261             : 
     262           0 :     call rad_cnst_get_info(0, ngas=ngas, naero=naer, nmodes=nmodes)
     263             : 
     264             :     ! The code to output the gases assumes that the rad_constituents module has
     265             :     ! ordered them in the same way that they are ordered in the "gaslist" array
     266             :     ! in module radconstants, and that there are nradgas of them.  This ordering 
     267             :     ! is performed in the internal init_lists routine in rad_constituents.
     268           0 :     if (ngas /= nradgas) then
     269           0 :        call endrun('rad_data_init: ERROR: ngas /= nradgas')
     270             :     end if
     271             : 
     272           0 :     allocate( gasnames(ngas) )
     273           0 :     call rad_cnst_get_info(0, gasnames=gasnames)
     274             : 
     275           0 :     if (naer > 0) then
     276           0 :        allocate( aernames(naer) )
     277           0 :        call rad_cnst_get_info(0, aernames=aernames)
     278             :     endif
     279             : 
     280           0 :     if (nmodes>0) then
     281           0 :        allocate(dgnumwet_fldn(nmodes),qaerwat_fldn(nmodes))
     282           0 :        dgnumwet_ifld = pbuf_get_index('DGNUMWET')
     283           0 :        qaerwat_ifld  = pbuf_get_index('QAERWAT')
     284           0 :        do m = 1, nmodes
     285           0 :           write(dgnumwet_fldn(m), 1001 ) m
     286           0 :           write(qaerwat_fldn(m), 1003 ) m
     287             :        enddo
     288             :     endif
     289             : 
     290           0 :     if (.not.rad_data_output) return
     291             : 
     292             :     call addfld (lndfrc_fldn,    horiz_only,   rad_data_avgflag, 'fraction', &
     293           0 :          'radiation input: land fraction')
     294             :     call addfld (icefrc_fldn,    horiz_only,   rad_data_avgflag, 'fraction', &
     295           0 :          'radiation input: ice fraction')
     296             :     call addfld (snowh_fldn,     horiz_only,   rad_data_avgflag, 'm',        &
     297           0 :          'radiation input: water equivalent snow depth')
     298             :     call addfld (asdir_fldn,     horiz_only,   rad_data_avgflag, '1',        &
     299           0 :          'radiation input: s     hort wave direct albedo',                    flag_xyfill=.true.)
     300             :     call addfld (asdif_fldn,     horiz_only,   rad_data_avgflag, '1',        &
     301           0 :          'radiation input: s     hort wave difuse albedo',                    flag_xyfill=.true.)
     302             :     call addfld (aldir_fldn,     horiz_only,   rad_data_avgflag, '1',        &
     303           0 :          'radiation input: long wave direct albedo',                          flag_xyfill=.true.)
     304             :     call addfld (aldif_fldn,     horiz_only,   rad_data_avgflag, '1',        &
     305           0 :          'radiation input: long wave difuse albedo',                          flag_xyfill=.true.)
     306             : 
     307             :     call addfld (coszen_fldn,    horiz_only,   rad_data_avgflag, '1',        &
     308           0 :          'radiation input: cosine solar zenith when positive',                flag_xyfill=.true.)
     309             :     call addfld (asdir_pos_fldn, horiz_only,   rad_data_avgflag, '1',        &
     310           0 :          'radiation input: s     hort wave direct albedo weighted by coszen', flag_xyfill=.true.)
     311             :     call addfld (asdif_pos_fldn, horiz_only,   rad_data_avgflag, '1',        &
     312           0 :          'radiation input: s     hort wave difuse albedo weighted by coszen', flag_xyfill=.true.)
     313             :     call addfld (aldir_pos_fldn, horiz_only,   rad_data_avgflag, '1',        &
     314           0 :          'radiation input: long wave direct albedo weighted by coszen',       flag_xyfill=.true.)
     315             :     call addfld (aldif_pos_fldn, horiz_only,   rad_data_avgflag, '1',        &
     316           0 :          'radiation input: long wave difuse albedo weighted by coszen',       flag_xyfill=.true.)
     317             :     
     318             :     call addfld (lwup_fldn,      horiz_only,   rad_data_avgflag, 'W/m2',     &
     319           0 :          'radiation input: long wave up radiation flux ')
     320             :     call addfld (ts_fldn,        horiz_only,   rad_data_avgflag, 'K',        &
     321           0 :          'radiation input: surface temperature')
     322             : 
     323             :     call addfld (temp_fldn,      (/ 'lev' /),  rad_data_avgflag, 'K',        &
     324           0 :          'radiation input: midpoint temperature')
     325             :     call addfld (pdel_fldn,      (/ 'lev' /),  rad_data_avgflag, 'Pa',       &
     326           0 :          'radiation input: pressure layer thickness')
     327             :     call addfld (pdeldry_fldn,   (/ 'lev' /),  rad_data_avgflag,'Pa',        &
     328           0 :          'radiation input: dry pressure layer thickness')
     329             :     call addfld (pmid_fldn,      (/ 'lev' /),  rad_data_avgflag, 'Pa',       &
     330           0 :          'radiation input: midpoint pressure')
     331             :     call addfld (watice_fldn,    (/ 'lev' /),  rad_data_avgflag, 'kg/kg',    &
     332           0 :          'radiation input: cloud ice')
     333             :     call addfld (watliq_fldn,    (/ 'lev' /),  rad_data_avgflag, 'kg/kg',    &
     334           0 :          'radiation input: cloud liquid water')
     335             :     call addfld (watvap_fldn,    (/ 'lev' /),  rad_data_avgflag, 'kg/kg',    &
     336           0 :          'radiation input: water vapor')
     337             : 
     338             :     call addfld (zint_fldn,      (/ 'ilev' /), rad_data_avgflag, 'km',       &
     339           0 :          'radiation input: interface height')
     340             :     call addfld (pint_fldn,      (/ 'ilev' /), rad_data_avgflag, 'Pa',       &
     341           0 :          'radiation input: interface pressure')
     342             : 
     343             :     call addfld (cld_fldn,       (/ 'lev' /),  rad_data_avgflag, 'fraction', &
     344           0 :          'radiation input: cloud fraction')
     345             :     call addfld (rel_fldn,       (/ 'lev' /),  rad_data_avgflag, 'micron',   &
     346           0 :          'radiation input: effective liquid drop radius')
     347             :     call addfld (rei_fldn,       (/ 'lev' /),  rad_data_avgflag, 'micron',   &
     348           0 :          'radiation input: effective ice partical radius')
     349             :     call addfld (qrs_fldn,       (/ 'lev' /),  rad_data_avgflag, 'J/s/kg',   &
     350           0 :          'radiation input: solar heating rate')
     351             :     call addfld (qrl_fldn,       (/ 'lev' /),  rad_data_avgflag, 'J/s/kg',   &
     352           0 :          'radiation input: longwave heating rate')
     353             : 
     354           0 :     if (mg_microphys) then
     355             :        call addfld (dei_fldn,      (/ 'lev' /), rad_data_avgflag, 'micron',   &
     356           0 :             'radiation input: effective ice partical diameter')
     357             :        call addfld (des_fldn,      (/ 'lev' /), rad_data_avgflag, 'micron',   &
     358           0 :             'radiation input: effective snow partical diameter')
     359             :        call addfld (mu_fldn,       (/ 'lev' /), rad_data_avgflag, ' ',        &
     360           0 :             'radiation input: ice gamma parameter for optics (radiation)')
     361             :        call addfld (lambdac_fldn,  (/ 'lev' /), rad_data_avgflag,' ',         &
     362           0 :             'radiation input: slope of droplet distribution for optics (radiation)')
     363             :        call addfld (iciwp_fldn,    (/ 'lev' /), rad_data_avgflag, 'kg/m2',    &
     364           0 :             'radiation input: In-cloud ice water path')
     365             :        call addfld (iclwp_fldn,    (/ 'lev' /), rad_data_avgflag, 'kg/m2',    &
     366           0 :             'radiation input: In-cloud liquid water path')
     367             :        call addfld (icswp_fldn,    (/ 'lev' /), rad_data_avgflag, 'kg/m2',    &
     368           0 :             'radiation input: In-cloud snow water path')
     369             :        call addfld (cldfsnow_fldn, (/ 'lev' /), rad_data_avgflag, 'fraction', &
     370           0 :             'radiation input: cloud liquid drops + snow')
     371             :     else
     372             : 
     373             :       call addfld (nmxrgn_fldn,    horiz_only,   rad_data_avgflag, ' ',       &
     374           0 :          'radiation input: ')
     375             :       call addfld (pmxrgn_fldn,    (/ 'ilev' /), rad_data_avgflag, 'Pa',      &
     376           0 :          'radiation input: ')
     377             :       call addfld (cldemis_fldn,   (/ 'lev' /), rad_data_avgflag, ' ',        &
     378           0 :          'radiation input: cloud property ')
     379             :       call addfld (cldtau_fldn,    (/ 'lev' /), rad_data_avgflag, ' ',        &
     380           0 :          'radiation input: cloud property ')
     381             :       call addfld (cicewp_fldn,    (/ 'lev' /), rad_data_avgflag, ' ',        &
     382           0 :          'radiation input: cloud property ')
     383             :       call addfld (cliqwp_fldn,    (/ 'lev' /), rad_data_avgflag, ' ',        &
     384           0 :          'radiation input: cloud property ')
     385             :     endif
     386             : 
     387           0 :     call add_default (lndfrc_fldn,    rad_data_histfile_num, ' ')
     388           0 :     call add_default (icefrc_fldn,    rad_data_histfile_num, ' ')
     389           0 :     call add_default (snowh_fldn,     rad_data_histfile_num, ' ')
     390           0 :     call add_default (asdir_fldn,     rad_data_histfile_num, ' ')
     391           0 :     call add_default (asdif_fldn,     rad_data_histfile_num, ' ')
     392           0 :     call add_default (aldir_fldn,     rad_data_histfile_num, ' ')
     393           0 :     call add_default (aldif_fldn,     rad_data_histfile_num, ' ')
     394             : 
     395           0 :     call add_default (coszen_fldn,    rad_data_histfile_num, ' ')
     396           0 :     call add_default (asdir_pos_fldn, rad_data_histfile_num, ' ')
     397           0 :     call add_default (asdif_pos_fldn, rad_data_histfile_num, ' ')
     398           0 :     call add_default (aldir_pos_fldn, rad_data_histfile_num, ' ')
     399           0 :     call add_default (aldif_pos_fldn, rad_data_histfile_num, ' ')
     400             : 
     401           0 :     call add_default (lwup_fldn,      rad_data_histfile_num, ' ')
     402           0 :     call add_default (ts_fldn,        rad_data_histfile_num, ' ')
     403           0 :     call add_default (temp_fldn,      rad_data_histfile_num, ' ')
     404           0 :     call add_default (pdel_fldn,      rad_data_histfile_num, ' ')
     405           0 :     call add_default (pdeldry_fldn,   rad_data_histfile_num, ' ')
     406           0 :     call add_default (pmid_fldn,      rad_data_histfile_num, ' ')
     407           0 :     call add_default (watice_fldn,    rad_data_histfile_num, ' ')
     408           0 :     call add_default (watliq_fldn,    rad_data_histfile_num, ' ')
     409           0 :     call add_default (watvap_fldn,    rad_data_histfile_num, ' ')
     410           0 :     call add_default (zint_fldn,      rad_data_histfile_num, ' ')
     411           0 :     call add_default (pint_fldn,      rad_data_histfile_num, ' ')
     412             : 
     413           0 :     call add_default (cld_fldn,       rad_data_histfile_num, ' ')
     414           0 :     call add_default (rel_fldn,       rad_data_histfile_num, ' ')
     415           0 :     call add_default (rei_fldn,       rad_data_histfile_num, ' ')
     416           0 :     call add_default (qrs_fldn,       rad_data_histfile_num, ' ')
     417           0 :     call add_default (qrl_fldn,       rad_data_histfile_num, ' ')
     418             :     
     419           0 :     if (mg_microphys) then
     420           0 :        call add_default (dei_fldn,       rad_data_histfile_num, ' ')
     421           0 :        call add_default (des_fldn,       rad_data_histfile_num, ' ')
     422           0 :        call add_default (mu_fldn,        rad_data_histfile_num, ' ')
     423           0 :        call add_default (lambdac_fldn,   rad_data_histfile_num, ' ')
     424           0 :        call add_default (iciwp_fldn,     rad_data_histfile_num, ' ')
     425           0 :        call add_default (iclwp_fldn,     rad_data_histfile_num, ' ')
     426           0 :        call add_default (icswp_fldn,     rad_data_histfile_num, ' ')
     427           0 :        call add_default (cldfsnow_fldn,  rad_data_histfile_num, ' ')
     428             :     else
     429           0 :        call add_default (cldemis_fldn,   rad_data_histfile_num, ' ')
     430           0 :        call add_default (cldtau_fldn,    rad_data_histfile_num, ' ')
     431           0 :        call add_default (cicewp_fldn,    rad_data_histfile_num, ' ')
     432           0 :        call add_default (cliqwp_fldn,    rad_data_histfile_num, ' ')
     433           0 :        call add_default (nmxrgn_fldn,    rad_data_histfile_num, ' ')
     434           0 :        call add_default (pmxrgn_fldn,    rad_data_histfile_num, ' ')
     435             :     endif
     436             : 
     437             :     ! stratospheric aersols geometric mean radius
     438           0 :     if (volcgeom_ifld > 0) then
     439           0 :        call add_default (volcgeom_fldn, rad_data_histfile_num, ' ')
     440             :     endif
     441           0 :     if (gmean_3modes) then
     442           0 :        call add_default (volcgeom1_fldn, rad_data_histfile_num, ' ')
     443           0 :        call add_default (volcgeom2_fldn, rad_data_histfile_num, ' ')
     444           0 :        call add_default (volcgeom3_fldn, rad_data_histfile_num, ' ')
     445             :     endif
     446             : 
     447             :     ! rad constituents
     448             : 
     449           0 :     long_name_description = ' mass mixing ratio used in rad climate calculation'
     450             : 
     451           0 :     do i = 1, ngas
     452           0 :        long_name = trim(gasnames(i))//trim(long_name_description)
     453           0 :        name = 'rad_'//gasnames(i)
     454           0 :        call addfld(trim(name), (/ 'lev' /), rad_data_avgflag, 'kg/kg', trim(long_name))
     455           0 :        call add_default (trim(name), rad_data_histfile_num, ' ')
     456             :     end do
     457             :     
     458           0 :     if (naer > 0) then
     459             : 
     460           0 :        do i = 1, naer
     461           0 :           long_name = trim(aernames(i))//trim(long_name_description)
     462           0 :           name = 'rad_'//aernames(i)
     463           0 :           call addfld(trim(name), (/ 'lev' /), rad_data_avgflag, 'kg/kg', trim(long_name))
     464           0 :           call add_default (trim(name), rad_data_histfile_num, ' ')
     465             :        end do
     466             :     endif
     467           0 :     if (nmodes>0) then
     468             : 
     469             :        ! for modal aerosol model
     470           0 :        do m = 1, nmodes
     471           0 :           write(long_name, 1002) m
     472           0 :           call addfld ( dgnumwet_fldn(m), (/ 'lev' /), rad_data_avgflag, '', trim(long_name) )
     473           0 :           call add_default (dgnumwet_fldn(m), rad_data_histfile_num, ' ')
     474             : 
     475           0 :           write(long_name, 1004) m
     476           0 :           call addfld ( qaerwat_fldn(m),  (/ 'lev' /), rad_data_avgflag, '', trim(long_name) )
     477           0 :           call add_default (qaerwat_fldn(m), rad_data_histfile_num, ' ')
     478             : 
     479             :           ! get mode info
     480           0 :           call rad_cnst_get_info(0, m, nspec=nspec)
     481             :           ! aerosol species loop
     482           0 :           do l = 1, nspec
     483           0 :              call rad_cnst_get_info(0,m,l, spec_name=aername)
     484           0 :              name = 'rad_'//trim(aername)
     485           0 :              call addfld(trim(name),      (/ 'lev' /), rad_data_avgflag, 'kg/kg', trim(long_name))
     486           0 :              call add_default (trim(name), rad_data_histfile_num, ' ')
     487             :           end do
     488             :        end do
     489             :     endif
     490             : 
     491             :  1001 format ( 'rad_dgnumwet_', I1 )
     492             :  1002 format ( 'radiation input: DGNUMWET for mode ', I1 )
     493             :  1003 format ( 'rad_qaerwat_', I1 )
     494             :  1004 format ( 'radiation input: QAERWAT for mode ', I1 )
     495             : 
     496        1536 :   end subroutine rad_data_init
     497             : 
     498             :   !================================================================================================
     499             :   !================================================================================================
     500     1492272 :   subroutine rad_data_write(  pbuf, state, cam_in, coszen )
     501             : 
     502        1536 :     use physics_types,    only: physics_state
     503             :     use camsrfexch,       only: cam_in_t     
     504             :     use constituents,     only: cnst_get_ind
     505             :     use physics_buffer,   only: pbuf_get_field, pbuf_old_tim_idx
     506             :     use drv_input_data,   only: drv_input_data_freq
     507             :     use physconst,        only: cpair
     508             : 
     509             :     implicit none
     510             :     type(physics_buffer_desc), pointer :: pbuf(:)
     511             :     
     512             :     type(physics_state), intent(in), target :: state
     513             :     type(cam_in_t),      intent(in) :: cam_in
     514             :     real(r8),            intent(in) :: coszen(pcols)
     515             : 
     516             :     ! Local variables
     517             :     integer :: i, k
     518             :     integer :: m,l, nspec
     519             :     character(len=32) :: name, aername
     520     1492272 :     real(r8), pointer :: mmr(:,:)
     521             : 
     522             :     integer :: lchnk, itim_old, ifld
     523             :     integer :: ixcldice              ! cloud ice water index
     524             :     integer :: ixcldliq              ! cloud liquid water index
     525             :     integer :: icol
     526             :     integer :: ncol
     527             :     
     528             :     ! surface albedoes weighted by (positive cosine zenith angle)
     529             :     real(r8):: coszrs_pos(pcols)    ! = max(coszrs,0)
     530             :     real(r8):: asdir_pos (pcols)    !
     531             :     real(r8):: asdif_pos (pcols)    !
     532             :     real(r8):: aldir_pos (pcols)    !
     533             :     real(r8):: aldif_pos (pcols)    !
     534             : 
     535     1492272 :     real(r8), pointer, dimension(:,:)  :: ptr
     536     1492272 :     integer , pointer, dimension(:)    :: iptr1d
     537             :     real(r8),          dimension(pcols) :: rptr1d
     538             : 
     539             :     ! for Fixed Dynamical Heating
     540     1492272 :     real(r8), pointer, dimension(:,:) :: tcorr
     541     1492272 :     real(r8), pointer, dimension(:,:) :: qrsin
     542     1492272 :     real(r8), pointer, dimension(:,:) :: qrlin
     543     1492272 :     real(r8), pointer, dimension(:)   :: tropp
     544     1492272 :     real(r8), pointer, dimension(:,:) :: qrs
     545     1492272 :     real(r8), pointer, dimension(:,:) :: qrl
     546     1492272 :     real(r8), pointer, dimension(:,:,:) :: dgnumwet_ptr
     547     1492272 :     real(r8), pointer, dimension(:,:,:) :: qaerwat_ptr
     548             : 
     549     1492272 :     if (.not.enabled) return
     550           0 :     call pbuf_get_field(pbuf, qrs_ifld, qrs )    
     551           0 :     call pbuf_get_field(pbuf, qrl_ifld, qrl )
     552             : 
     553           0 :     lchnk = state%lchnk
     554           0 :     ncol = state%ncol
     555             : 
     556             :    ! store temperature correction above tropopause in pbuf for Fixed Dynamical Heating
     557           0 :     if(do_fdh) then
     558             :        
     559           0 :        call pbuf_get_field(pbuf, tcorr_idx, tcorr)
     560           0 :        call pbuf_get_field(pbuf, qrsin_idx, qrsin)
     561           0 :        call pbuf_get_field(pbuf, qrlin_idx, qrlin)
     562           0 :        call pbuf_get_field(pbuf, tropp_idx, tropp)
     563           0 :        do k = 1, pver
     564           0 :           do i = 1, ncol
     565           0 :              if ( state%pmid(i,k) < tropp(i)) then
     566           0 :                 tcorr(i,k) = tcorr(i,k) + drv_input_data_freq*(qrs(i,k) - qrsin(i,k) + qrl(i,k) - qrlin(i,k)) /cpair 
     567             :              endif
     568             :           enddo
     569             :        enddo
     570             : 
     571           0 :        call outfld('rad_TROP_P', tropp(:ncol), ncol, lchnk)
     572           0 :        call outfld('rad_TCORR', tcorr(:ncol,:), ncol, lchnk)
     573             : 
     574             :     end if
     575             : 
     576           0 :     if (.not.rad_data_output) return
     577             : 
     578           0 :     call outfld(qrs_fldn, qrs, pcols, lchnk )
     579           0 :     call outfld(qrl_fldn, qrl, pcols, lchnk )
     580             : 
     581             :     ! get index of (liquid+ice) cloud water
     582           0 :     call cnst_get_ind('CLDICE', ixcldice)
     583           0 :     call cnst_get_ind('CLDLIQ', ixcldliq)
     584             : 
     585           0 :     do icol = 1, ncol
     586           0 :        coszrs_pos(icol)  = max(coszen(icol),0._r8)
     587             :     enddo
     588           0 :     asdir_pos(:ncol)  = cam_in%asdir(:ncol) * coszrs_pos(:ncol)
     589           0 :     asdif_pos(:ncol)  = cam_in%asdif(:ncol) * coszrs_pos(:ncol)
     590           0 :     aldir_pos(:ncol)  = cam_in%aldir(:ncol) * coszrs_pos(:ncol)
     591           0 :     aldif_pos(:ncol)  = cam_in%aldif(:ncol) * coszrs_pos(:ncol)
     592             : 
     593           0 :     call outfld(lndfrc_fldn, cam_in%landfrac,  pcols, lchnk)
     594           0 :     call outfld(icefrc_fldn, cam_in%icefrac,   pcols, lchnk)
     595           0 :     call outfld(snowh_fldn,  cam_in%snowhland, pcols, lchnk)
     596           0 :     call outfld(temp_fldn,   state%t,               pcols, lchnk   )
     597           0 :     call outfld(pdel_fldn,   state%pdel,            pcols, lchnk   )
     598           0 :     call outfld(pdeldry_fldn,state%pdeldry,         pcols, lchnk   )
     599           0 :     call outfld(watice_fldn, state%q(:,:,ixcldice), pcols, lchnk   )
     600           0 :     call outfld(watliq_fldn, state%q(:,:,ixcldliq), pcols, lchnk   )
     601           0 :     call outfld(watvap_fldn, state%q(:,:,1),        pcols, lchnk   )
     602           0 :     call outfld(zint_fldn,   state%zi,              pcols, lchnk   )
     603           0 :     call outfld(pint_fldn,   state%pint,            pcols, lchnk   )
     604           0 :     call outfld(pmid_fldn,   state%pmid,            pcols, lchnk   )
     605             : 
     606           0 :     call outfld(asdir_fldn, cam_in%asdir, pcols, lchnk   )
     607           0 :     call outfld(asdif_fldn, cam_in%asdif, pcols, lchnk   )
     608           0 :     call outfld(aldir_fldn, cam_in%aldir, pcols, lchnk   )
     609           0 :     call outfld(aldif_fldn, cam_in%aldif, pcols, lchnk   )
     610             : 
     611           0 :     call outfld(coszen_fldn, coszrs_pos, pcols, lchnk   )
     612           0 :     call outfld(asdir_pos_fldn, asdir_pos, pcols, lchnk   )
     613           0 :     call outfld(asdif_pos_fldn, asdif_pos, pcols, lchnk   )
     614           0 :     call outfld(aldir_pos_fldn, aldir_pos, pcols, lchnk   )
     615           0 :     call outfld(aldif_pos_fldn, aldif_pos, pcols, lchnk   )
     616             : 
     617           0 :     call outfld(lwup_fldn,  cam_in%lwup,  pcols, lchnk   )
     618           0 :     call outfld(ts_fldn,    cam_in%ts,    pcols, lchnk   )
     619             : 
     620           0 :     itim_old = pbuf_old_tim_idx()
     621             : 
     622           0 :     call pbuf_get_field(pbuf, cld_ifld,    ptr, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
     623           0 :     call outfld(cld_fldn,    ptr, pcols, lchnk )
     624             : 
     625           0 :     call pbuf_get_field(pbuf, rel_ifld,    ptr )
     626           0 :     call outfld(rel_fldn,    ptr, pcols, lchnk )
     627             : 
     628           0 :     call pbuf_get_field(pbuf, rei_ifld,    ptr )
     629           0 :     call outfld(rei_fldn,    ptr, pcols, lchnk )
     630             :     
     631           0 :     if (mg_microphys) then
     632             : 
     633           0 :        call pbuf_get_field(pbuf,  dei_ifld, ptr     )
     634           0 :        call outfld(dei_fldn,      ptr, pcols, lchnk   )       
     635             : 
     636           0 :        call pbuf_get_field(pbuf,  des_ifld, ptr     )
     637           0 :        call outfld(des_fldn,      ptr, pcols, lchnk   )       
     638             : 
     639           0 :        call pbuf_get_field(pbuf,  mu_ifld, ptr      )
     640           0 :        call outfld(mu_fldn,       ptr, pcols, lchnk   ) 
     641             : 
     642           0 :        call pbuf_get_field(pbuf,  lambdac_ifld, ptr )
     643           0 :        call outfld(lambdac_fldn,  ptr, pcols, lchnk   )       
     644             : 
     645           0 :        call pbuf_get_field(pbuf,  iciwp_ifld, ptr   )
     646           0 :        call outfld(iciwp_fldn,    ptr, pcols, lchnk   )       
     647             : 
     648           0 :        call pbuf_get_field(pbuf,  iclwp_ifld, ptr   )
     649           0 :        call outfld(iclwp_fldn,    ptr, pcols, lchnk   )       
     650             : 
     651           0 :        call pbuf_get_field(pbuf,  icswp_ifld, ptr   )
     652           0 :        call outfld(icswp_fldn,    ptr, pcols, lchnk   )       
     653             : 
     654           0 :        call pbuf_get_field(pbuf,  cldfsnow_ifld, ptr, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
     655           0 :        call outfld(cldfsnow_fldn, ptr, pcols, lchnk   )
     656             : 
     657             :     else
     658             : 
     659           0 :        call pbuf_get_field(pbuf, cldemis_ifld,    ptr )
     660           0 :        call outfld(cldemis_fldn,   ptr, pcols, lchnk )
     661             : 
     662           0 :        call pbuf_get_field(pbuf, cldtau_ifld,    ptr )
     663           0 :        call outfld(cldtau_fldn,    ptr, pcols, lchnk )
     664             : 
     665           0 :        call pbuf_get_field(pbuf, cicewp_ifld,    ptr )
     666           0 :        call outfld(cicewp_fldn,    ptr, pcols, lchnk )
     667             : 
     668           0 :        call pbuf_get_field(pbuf, cliqwp_ifld,    ptr )
     669           0 :        call outfld(cliqwp_fldn,    ptr, pcols, lchnk )
     670             : 
     671           0 :        call pbuf_get_field(pbuf, nmxrgn_ifld,    iptr1d )
     672           0 :        rptr1d = dble(iptr1d)
     673           0 :        call outfld(nmxrgn_fldn,    rptr1d, pcols, lchnk )
     674             : 
     675           0 :        call pbuf_get_field(pbuf, pmxrgn_ifld,    ptr )
     676           0 :        call outfld(pmxrgn_fldn,    ptr, pcols, lchnk )
     677             : 
     678             :     endif
     679             : 
     680             :     ! output mixing ratio of rad constituents 
     681             : 
     682           0 :     do i = 1, ngas
     683           0 :        name = 'rad_'//gasnames(i)
     684           0 :        call rad_cnst_get_gas(0, gaslist(i), state, pbuf, mmr)
     685           0 :        call outfld(trim(name), mmr, pcols, lchnk)
     686             :     end do
     687             : 
     688           0 :     if ( naer>0 ) then
     689             :        ! bulk aerosol model
     690           0 :        do i = 1, naer
     691           0 :           name = 'rad_'//aernames(i)
     692           0 :           call rad_cnst_get_aer_mmr(0, i, state, pbuf, mmr)
     693           0 :           call outfld(trim(name), mmr, pcols, lchnk)
     694             :        end do
     695             :     endif
     696           0 :     if (nmodes>0) then
     697             : 
     698           0 :        call pbuf_get_field(pbuf, dgnumwet_ifld, dgnumwet_ptr)
     699           0 :        call pbuf_get_field(pbuf, qaerwat_ifld, qaerwat_ptr)
     700             : 
     701             :        ! for modal aerosol model
     702           0 :        do m = 1, nmodes
     703           0 :           ptr => dgnumwet_ptr(:,:,m)
     704           0 :           call outfld( dgnumwet_fldn(m), ptr, pcols, lchnk )
     705           0 :           ptr => qaerwat_ptr(:,:,m)
     706           0 :           call outfld( qaerwat_fldn(m),  ptr, pcols, lchnk )
     707             : 
     708             :           ! get mode info
     709           0 :           call rad_cnst_get_info(0, m, nspec=nspec)
     710             :           ! aerosol species loop
     711           0 :           do l = 1, nspec
     712           0 :              call rad_cnst_get_info(0,m,l, spec_name=aername)
     713           0 :              call rad_cnst_get_aer_mmr(0, m, l, 'a', state, pbuf, mmr)
     714           0 :              name = 'rad_'//aername
     715           0 :              call outfld(trim(name), mmr, pcols, lchnk)
     716             :           enddo
     717             :        enddo
     718             :     endif
     719             : 
     720             :     ! stratospheric aersols geometric mean radius
     721           0 :     if (volcgeom_ifld > 0) then
     722           0 :        call pbuf_get_field(pbuf, volcgeom_ifld, ptr)
     723           0 :        call outfld(volcgeom_fldn, ptr, pcols, lchnk)
     724             :     endif
     725           0 :     if (gmean_3modes) then
     726           0 :        call pbuf_get_field(pbuf, volcgeom1_ifld, ptr)
     727           0 :        call outfld(volcgeom1_fldn, ptr, pcols, lchnk)
     728           0 :        call pbuf_get_field(pbuf, volcgeom2_ifld, ptr)
     729           0 :        call outfld(volcgeom2_fldn, ptr, pcols, lchnk)
     730           0 :        call pbuf_get_field(pbuf, volcgeom3_ifld, ptr)
     731           0 :        call outfld(volcgeom3_fldn, ptr, pcols, lchnk)
     732             :     endif
     733             : 
     734     1492272 :   end subroutine rad_data_write
     735             : 
     736             : !=================================================================================
     737             : !=================================================================================
     738           0 :   subroutine rad_data_read(indata, phys_state, pbuf2d, cam_in, recno )
     739             : 
     740     1492272 :     use camsrfexch,       only: cam_in_t
     741             :     use physics_buffer,   only: pbuf_get_field, pbuf_old_tim_idx
     742             :     use constituents,     only: cnst_get_ind
     743             :     use tropopause,       only: tropopause_find_cam, TROP_ALG_HYBSTOB, TROP_ALG_CLIMATE
     744             : 
     745             :     implicit none
     746             : 
     747             :     type(drv_input_data_t), intent(inout) :: indata
     748             :     type(physics_buffer_desc), pointer         :: pbuf2d(:,:)
     749             :     type(physics_state), target, intent(inout) :: phys_state(begchunk:endchunk)
     750             :     type(cam_in_t),      target, intent(inout) :: cam_in(begchunk:endchunk)
     751             :     integer,             intent(in)            :: recno
     752             : 
     753             : ! local vars
     754           0 :     type(physics_buffer_desc), pointer :: pbuf(:)
     755             : 
     756           0 :     type(drv_input_3d_t) :: cld_ptrs(begchunk:endchunk)
     757           0 :     type(drv_input_3d_t) :: cldfsnow_ptrs(begchunk:endchunk)
     758             : 
     759           0 :     type(drv_input_3d_t) :: rel_ptrs(begchunk:endchunk)
     760           0 :     type(drv_input_3d_t) :: rei_ptrs(begchunk:endchunk)
     761           0 :     type(drv_input_3d_t) :: dei_ptrs(begchunk:endchunk)
     762           0 :     type(drv_input_3d_t) :: des_ptrs(begchunk:endchunk)
     763           0 :     type(drv_input_3d_t) :: mu_ptrs(begchunk:endchunk)
     764           0 :     type(drv_input_3d_t) :: lambdac_ptrs(begchunk:endchunk)
     765           0 :     type(drv_input_3d_t) :: iciwp_ptrs(begchunk:endchunk)
     766           0 :     type(drv_input_3d_t) :: iclwp_ptrs(begchunk:endchunk)
     767           0 :     type(drv_input_3d_t) :: icswp_ptrs(begchunk:endchunk)
     768             : 
     769           0 :     type(drv_input_3d_t) :: qrs_ptrs(begchunk:endchunk)
     770           0 :     type(drv_input_3d_t) :: qrl_ptrs(begchunk:endchunk)
     771             : 
     772           0 :     type(drv_input_3d_t) :: watvap_ptrs(begchunk:endchunk)
     773           0 :     type(drv_input_3d_t) :: watliq_ptrs(begchunk:endchunk)
     774           0 :     type(drv_input_3d_t) :: watice_ptrs(begchunk:endchunk)
     775             : 
     776           0 :     type(drv_input_3d_t) :: zi_ptrs(begchunk:endchunk)
     777           0 :     type(drv_input_3d_t) :: pint_ptrs(begchunk:endchunk)
     778           0 :     type(drv_input_3d_t) :: lnpint_ptrs(begchunk:endchunk)
     779             : 
     780           0 :     type(drv_input_3d_t) :: temp_ptrs(begchunk:endchunk)
     781           0 :     type(drv_input_3d_t) :: pdel_ptrs(begchunk:endchunk)
     782           0 :     type(drv_input_3d_t) :: pdeldry_ptrs(begchunk:endchunk)
     783           0 :     type(drv_input_3d_t) :: lnpmid_ptrs(begchunk:endchunk)
     784           0 :     type(drv_input_3d_t) :: pmid_ptrs(begchunk:endchunk)
     785             : 
     786           0 :     type(drv_input_2d_t) :: lndfrac_ptrs(begchunk:endchunk)
     787           0 :     type(drv_input_2d_t) :: icefrac_ptrs(begchunk:endchunk)
     788           0 :     type(drv_input_2d_t) :: snowhland_ptrs(begchunk:endchunk)
     789           0 :     type(drv_input_2d_t) :: asdir_ptrs(begchunk:endchunk)
     790           0 :     type(drv_input_2d_t) :: asdif_ptrs(begchunk:endchunk)
     791           0 :     type(drv_input_2d_t) :: aldir_ptrs(begchunk:endchunk)
     792           0 :     type(drv_input_2d_t) :: aldif_ptrs(begchunk:endchunk)
     793             : 
     794           0 :     type(drv_input_2di_t):: nmxrgn_ptrs(begchunk:endchunk)
     795           0 :     type(drv_input_3d_t) :: pmxrgn_ptrs(begchunk:endchunk)
     796             : 
     797           0 :     type(drv_input_3d_t) :: cldemis_ptrs(begchunk:endchunk)
     798           0 :     type(drv_input_3d_t) :: cldtau_ptrs(begchunk:endchunk)
     799           0 :     type(drv_input_3d_t) :: cicewp_ptrs(begchunk:endchunk)
     800           0 :     type(drv_input_3d_t) :: cliqwp_ptrs(begchunk:endchunk)
     801             : 
     802           0 :     type(drv_input_2d_t) :: lwup_ptrs(begchunk:endchunk)
     803           0 :     type(drv_input_2d_t) :: ts_ptrs(begchunk:endchunk)
     804             : 
     805           0 :     type(drv_input_3d_t) :: volcgeom_ptrs(begchunk:endchunk)
     806           0 :     type(drv_input_3d_t) :: volcgeom1_ptrs(begchunk:endchunk)
     807           0 :     type(drv_input_3d_t) :: volcgeom2_ptrs(begchunk:endchunk)
     808           0 :     type(drv_input_3d_t) :: volcgeom3_ptrs(begchunk:endchunk)
     809             : 
     810             :     integer :: i, k, c, ncol, itim
     811             : 
     812             :     integer :: ixcldice   ! cloud ice water index
     813             :     integer :: ixcldliq   ! cloud liquid water index
     814             : 
     815             :     ! for Fixed Dynamical Heating
     816           0 :     real(r8), pointer, dimension(:,:) :: tcorr
     817           0 :     real(r8), pointer, dimension(:,:) :: qrsin
     818           0 :     real(r8), pointer, dimension(:,:) :: qrlin
     819           0 :     real(r8), pointer, dimension(:)   :: tropp
     820             :     integer :: troplev(pcols)
     821             : 
     822             :     ! for modal aerosols
     823           0 :     type(drv_input_4d_t) :: dgnumwet_ptrs(begchunk:endchunk)
     824           0 :     type(drv_input_4d_t) :: qaerwat_ptrs(begchunk:endchunk)
     825             : 
     826             :     ! get index of (liquid+ice) cloud water
     827           0 :     call cnst_get_ind('CLDICE', ixcldice)
     828           0 :     call cnst_get_ind('CLDLIQ', ixcldliq)
     829             : 
     830             :     ! phys buffer time index
     831           0 :     itim = pbuf_old_tim_idx()
     832             : 
     833             :     ! setup the data pointers
     834             : !$OMP PARALLEL DO PRIVATE (C,pbuf)
     835           0 :     do c=begchunk,endchunk
     836           0 :        pbuf => pbuf_get_chunk(pbuf2d, c)
     837             : 
     838           0 :        watvap_ptrs (c)%array => phys_state(c)%q(:,:,1)
     839           0 :        watliq_ptrs (c)%array => phys_state(c)%q(:,:,ixcldliq)
     840           0 :        watice_ptrs (c)%array => phys_state(c)%q(:,:,ixcldice)
     841             : 
     842           0 :        zi_ptrs     (c)%array => phys_state(c)%zi
     843           0 :        pint_ptrs   (c)%array => phys_state(c)%pint
     844           0 :        lnpint_ptrs (c)%array => phys_state(c)%lnpint
     845             : 
     846           0 :        temp_ptrs   (c)%array => phys_state(c)%t
     847           0 :        pdel_ptrs   (c)%array => phys_state(c)%pdel
     848           0 :        pdeldry_ptrs(c)%array => phys_state(c)%pdeldry
     849           0 :        lnpmid_ptrs (c)%array => phys_state(c)%lnpmid
     850           0 :        pmid_ptrs   (c)%array => phys_state(c)%pmid
     851             : 
     852           0 :        lndfrac_ptrs  (c)%array => cam_in(c)%landfrac
     853           0 :        icefrac_ptrs  (c)%array => cam_in(c)%icefrac
     854           0 :        snowhland_ptrs(c)%array => cam_in(c)%snowhland
     855           0 :        asdir_ptrs    (c)%array => cam_in(c)%asdir
     856           0 :        asdif_ptrs    (c)%array => cam_in(c)%asdif
     857           0 :        aldir_ptrs    (c)%array => cam_in(c)%aldir
     858           0 :        aldif_ptrs    (c)%array => cam_in(c)%aldif
     859           0 :        lwup_ptrs     (c)%array => cam_in(c)%lwup
     860           0 :        ts_ptrs       (c)%array => cam_in(c)%ts
     861             : 
     862           0 :        call pbuf_get_field(pbuf, cld_ifld, cld_ptrs   (c)%array, start=(/1,1,itim/), kount=(/pcols,pver,1/) )
     863           0 :        call pbuf_get_field(pbuf, rel_ifld,   rel_ptrs(c)%array )
     864           0 :        call pbuf_get_field(pbuf, rei_ifld,   rei_ptrs(c)%array )
     865             : 
     866           0 :        call pbuf_get_field(pbuf, qrs_ifld,   qrs_ptrs(c)%array )
     867           0 :        call pbuf_get_field(pbuf, qrl_ifld,   qrl_ptrs(c)%array )
     868             : 
     869           0 :        if (mg_microphys) then
     870           0 :           call pbuf_get_field(pbuf, dei_ifld,   dei_ptrs(c)%array )
     871           0 :           call pbuf_get_field(pbuf, des_ifld,   des_ptrs(c)%array )
     872           0 :           call pbuf_get_field(pbuf, mu_ifld,    mu_ptrs     (c)%array )
     873           0 :           call pbuf_get_field(pbuf, lambdac_ifld, lambdac_ptrs(c)%array )
     874           0 :           call pbuf_get_field(pbuf, iciwp_ifld, iciwp_ptrs  (c)%array )
     875           0 :           call pbuf_get_field(pbuf, iclwp_ifld, iclwp_ptrs  (c)%array )
     876           0 :           call pbuf_get_field(pbuf, icswp_ifld, icswp_ptrs  (c)%array )
     877           0 :           call pbuf_get_field(pbuf, cldfsnow_ifld, cldfsnow_ptrs(c)%array, start=(/1,1,itim/), kount=(/pcols,pver,1/) )
     878             :        else
     879           0 :           call pbuf_get_field(pbuf, nmxrgn_ifld,   nmxrgn_ptrs(c)%array )
     880           0 :           call pbuf_get_field(pbuf, pmxrgn_ifld,   pmxrgn_ptrs(c)%array )
     881           0 :           call pbuf_get_field(pbuf, cldemis_ifld,  cldemis_ptrs(c)%array )
     882           0 :           call pbuf_get_field(pbuf, cldtau_ifld,   cldtau_ptrs(c)%array )
     883           0 :           call pbuf_get_field(pbuf, cicewp_ifld,   cicewp_ptrs(c)%array )
     884           0 :           call pbuf_get_field(pbuf, cliqwp_ifld,   cliqwp_ptrs(c)%array )
     885             :        endif
     886             : 
     887           0 :        if (nmodes>0) then
     888           0 :           call pbuf_get_field(pbuf, dgnumwet_ifld, dgnumwet_ptrs(c)%array )
     889           0 :           call pbuf_get_field(pbuf, qaerwat_ifld, qaerwat_ptrs(c)%array )
     890             :        endif
     891             : 
     892             :        ! stratospheric aersols geometric mean radius
     893           0 :        if (volcgeom_ifld > 0) then
     894           0 :           call pbuf_get_field(pbuf, volcgeom_ifld, volcgeom_ptrs(c)%array )
     895             :        endif
     896           0 :        if (gmean_3modes) then
     897           0 :           call pbuf_get_field(pbuf, volcgeom1_ifld, volcgeom1_ptrs(c)%array )
     898           0 :           call pbuf_get_field(pbuf, volcgeom2_ifld, volcgeom2_ptrs(c)%array )
     899           0 :           call pbuf_get_field(pbuf, volcgeom3_ifld, volcgeom3_ptrs(c)%array )
     900             :        endif
     901             : 
     902             :     enddo
     903             : 
     904             :     
     905           0 :     if (nmodes>0) then
     906           0 :        call get_aeromode_data( indata, dgnumwet_fldn, recno, dgnumwet_ptrs )
     907           0 :        call get_aeromode_data( indata, qaerwat_fldn, recno, qaerwat_ptrs )
     908             :     endif
     909             : 
     910             :     ! get the 2D data
     911             : 
     912           0 :     call drv_input_data_get( indata, lndfrc_fldn, recno, lndfrac_ptrs )
     913           0 :     call drv_input_data_get( indata, icefrc_fldn, recno, icefrac_ptrs )
     914           0 :     call drv_input_data_get( indata, snowh_fldn,  recno, snowhland_ptrs )
     915           0 :     call drv_input_data_get( indata, asdir_fldn,  recno, asdir_ptrs )
     916           0 :     call drv_input_data_get( indata, asdif_fldn,  recno, asdif_ptrs )
     917           0 :     call drv_input_data_get( indata, aldir_fldn,  recno, aldir_ptrs )
     918           0 :     call drv_input_data_get( indata, aldif_fldn,  recno, aldif_ptrs )
     919           0 :     call drv_input_data_get( indata, lwup_fldn,   recno, lwup_ptrs )
     920           0 :     call drv_input_data_get( indata, ts_fldn,     recno, ts_ptrs )
     921             : 
     922             :     ! get the 3D data
     923             : 
     924           0 :     call drv_input_data_get( indata, cld_fldn,    'lev', pver, recno, cld_ptrs )
     925           0 :     call drv_input_data_get( indata, rel_fldn,    'lev', pver, recno, rel_ptrs )
     926           0 :     call drv_input_data_get( indata, rei_fldn,    'lev', pver, recno, rei_ptrs )
     927           0 :     call drv_input_data_get( indata, qrs_fldn,    'lev', pver, recno, qrs_ptrs )
     928           0 :     call drv_input_data_get( indata, qrl_fldn,    'lev', pver, recno, qrl_ptrs )
     929             : 
     930           0 :     if (mg_microphys) then
     931           0 :        call drv_input_data_get( indata, dei_fldn,    'lev', pver, recno, dei_ptrs )
     932           0 :        call drv_input_data_get( indata, des_fldn,    'lev', pver, recno, des_ptrs )
     933           0 :        call drv_input_data_get( indata, mu_fldn,     'lev', pver, recno, mu_ptrs )
     934           0 :        call drv_input_data_get( indata, lambdac_fldn,'lev', pver, recno, lambdac_ptrs )
     935           0 :        call drv_input_data_get( indata, iciwp_fldn,  'lev', pver, recno, iciwp_ptrs )
     936           0 :        call drv_input_data_get( indata, iclwp_fldn,  'lev', pver, recno, iclwp_ptrs )
     937           0 :        call drv_input_data_get( indata, icswp_fldn,  'lev', pver, recno, icswp_ptrs )
     938           0 :        call drv_input_data_get( indata, cldfsnow_fldn,'lev',pver, recno, cldfsnow_ptrs )
     939             :     else
     940           0 :        call drv_input_data_get( indata, nmxrgn_fldn, recno, nmxrgn_ptrs )
     941           0 :        call drv_input_data_get( indata, pmxrgn_fldn, 'ilev',pverp,recno, pmxrgn_ptrs )
     942           0 :        call drv_input_data_get( indata, cldemis_fldn,'lev', pver, recno, cldemis_ptrs )
     943           0 :        call drv_input_data_get( indata, cldtau_fldn, 'lev', pver, recno, cldtau_ptrs )
     944           0 :        call drv_input_data_get( indata, cicewp_fldn, 'lev', pver, recno, cicewp_ptrs )
     945           0 :        call drv_input_data_get( indata, cliqwp_fldn, 'lev', pver, recno, cliqwp_ptrs )
     946             :     endif
     947             : 
     948             :     ! stratospheric aersols geometric mean radius
     949           0 :     if (volcgeom_ifld > 0) then
     950           0 :        call drv_input_data_get( indata, volcgeom_fldn, 'lev', pver, recno, volcgeom_ptrs )
     951             :     endif
     952           0 :     if (gmean_3modes) then
     953           0 :        call drv_input_data_get( indata, volcgeom1_fldn, 'lev', pver, recno, volcgeom1_ptrs )
     954           0 :        call drv_input_data_get( indata, volcgeom2_fldn, 'lev', pver, recno, volcgeom2_ptrs )
     955           0 :        call drv_input_data_get( indata, volcgeom3_fldn, 'lev', pver, recno, volcgeom3_ptrs )
     956             :     endif
     957             : 
     958           0 :     call drv_input_data_get( indata, watvap_fldn, 'lev', pver, recno, watvap_ptrs )
     959           0 :     call drv_input_data_get( indata, watliq_fldn, 'lev', pver, recno, watliq_ptrs )
     960           0 :     call drv_input_data_get( indata, watice_fldn, 'lev', pver, recno, watice_ptrs )
     961           0 :     call drv_input_data_get( indata, temp_fldn,   'lev', pver, recno, temp_ptrs )
     962           0 :     call drv_input_data_get( indata, pdel_fldn,   'lev', pver, recno, pdel_ptrs )
     963           0 :     call drv_input_data_get( indata, pdeldry_fldn,'lev', pver, recno, pdeldry_ptrs )
     964           0 :     call drv_input_data_get( indata, pmid_fldn,   'lev', pver, recno, pmid_ptrs )
     965             : 
     966           0 :     call drv_input_data_get( indata, zint_fldn,   'ilev',pverp,recno, zi_ptrs )
     967           0 :     call drv_input_data_get( indata, pint_fldn,   'ilev',pverp,recno, pint_ptrs )
     968             : 
     969           0 :     do c=begchunk,endchunk
     970           0 :        ncol = phys_state(c)%ncol
     971           0 :        if (all(pmid_ptrs(c)%array(:ncol,:) > 0._r8 )) then
     972           0 :           do i=1,ncol
     973           0 :              lnpmid_ptrs(c)%array(i,:) = log(pmid_ptrs(c)%array(i,:))
     974           0 :              lnpint_ptrs(c)%array(i,:) = log(pint_ptrs(c)%array(i,:))
     975             :           enddo
     976             :        endif
     977             : 
     978             :        ! adjust temperatue input above tropopause for Fixed Dynamical Heating ....
     979           0 :        if (do_fdh) then
     980           0 :           pbuf => pbuf_get_chunk(pbuf2d, c)
     981             : 
     982           0 :           call pbuf_get_field(pbuf, tropp_idx, tropp)
     983           0 :           call pbuf_get_field(pbuf, tcorr_idx, tcorr)
     984           0 :           call pbuf_get_field(pbuf, qrsin_idx, qrsin)
     985           0 :           call pbuf_get_field(pbuf, qrlin_idx, qrlin)
     986             : 
     987             :           !REMOVECAM - no longer need this when CAM is retired and pcols no longer exists
     988           0 :           troplev(:) = 0
     989           0 :           tropp(:) = 0._r8
     990             :           !REMOVECAM_END
     991           0 :           call tropopause_find_cam(phys_state(c), troplev, tropP=tropp, primary=TROP_ALG_CLIMATE, &
     992           0 :                                backup=TROP_ALG_CLIMATE)
     993             : 
     994           0 :           qrsin(:,:) = qrs_ptrs(c)%array(:,:)
     995           0 :           qrlin(:,:) = qrl_ptrs(c)%array(:,:)
     996             : 
     997           0 :           do k = 1, pver
     998           0 :              do i = 1, ncol
     999           0 :                 if ( phys_state(c)%pmid(i,k) < tropp(i) ) then
    1000           0 :                    temp_ptrs(c)%array(i,k) = temp_ptrs(c)%array(i,k) + tcorr(i,k)
    1001             :                 endif
    1002             :              enddo
    1003             :           enddo
    1004             :        endif
    1005             : 
    1006             :     enddo
    1007             : 
    1008           0 :     call get_rad_cnst_data(indata, phys_state, pbuf2d, recno)
    1009             : 
    1010           0 :   end subroutine rad_data_read
    1011             : 
    1012             : !================================================================================================
    1013             : ! Private routines
    1014             : !================================================================================================
    1015             : 
    1016             : 
    1017             :   !================================================================================================
    1018             :   !================================================================================================
    1019           0 :   subroutine get_aeromode_data(indata, infld_names, recno, chunk_ptrs)
    1020           0 :     use drv_input_data, only: drv_input_data_read
    1021             : 
    1022             :     type(drv_input_data_t), intent(inout) :: indata
    1023             :     character(len=*),    intent(in)    :: infld_names(nmodes)
    1024             :     integer,             intent(in)    :: recno
    1025             :     type(drv_input_4d_t),   intent(inout) :: chunk_ptrs(begchunk:endchunk)
    1026             : 
    1027           0 :     real(r8) :: data (pcols, pver, begchunk:endchunk)
    1028             : 
    1029             :     integer :: c, n
    1030             : 
    1031           0 :     do n = 1,nmodes
    1032             : 
    1033           0 :        data = drv_input_data_read( indata, infld_names(n), 'lev', pver, recno )
    1034           0 :        do c=begchunk,endchunk
    1035           0 :           chunk_ptrs(c)%array(:,:,n) = data(:,:,c)
    1036             :        enddo
    1037             : 
    1038             :     enddo
    1039             : 
    1040           0 :   end subroutine get_aeromode_data
    1041             : 
    1042             :   !================================================================================================
    1043             :   !================================================================================================
    1044           0 :   subroutine get_rad_cnst_data(indata, state, pbuf2d, recno)
    1045             : 
    1046           0 :     use physics_types,    only: physics_state
    1047             :     use physics_buffer,   only: physics_buffer_desc
    1048             :     use rad_constituents, only: rad_cnst_get_info
    1049             : 
    1050             :     implicit none
    1051             : 
    1052             :     ! Arguments
    1053             :     type(drv_input_data_t), intent(inout) :: indata
    1054             :     type(physics_buffer_desc), pointer :: pbuf2d(:,:)
    1055             :     type(physics_state), intent(inout) :: state(begchunk:endchunk)
    1056             :     integer,             intent(in)    :: recno
    1057             : 
    1058             :     ! Local variables
    1059             :     integer :: i, ncol
    1060             :     integer :: m, l, nspec
    1061             :     integer :: idx
    1062             :     character(len=32) :: aername
    1063             : 
    1064             :     !-----------------------------------------------------------------------------
    1065             : 
    1066             :     ! read in mixing ratio of rad constituents 
    1067             : 
    1068           0 :     do i = 1,ngas
    1069           0 :        call read_rad_gas_data(indata, gasnames(i), i, state, pbuf2d, recno )
    1070             :     enddo
    1071             : 
    1072           0 :     do i = 1,naer
    1073           0 :        call read_rad_aer_data(indata, aernames(i), i, state, pbuf2d, recno )
    1074             :     enddo
    1075             :     
    1076             :     ! aerosol mode loop
    1077           0 :     do m = 1, nmodes
    1078             : 
    1079             :        ! get mode info
    1080           0 :        call rad_cnst_get_info(0, m, nspec=nspec)
    1081             :        ! aerosol species loop
    1082           0 :        do l = 1, nspec
    1083           0 :           call rad_cnst_get_info(0,m,l, spec_name=aername)
    1084           0 :           call read_rad_mam_data( indata, aername, m, l, state, pbuf2d, recno )
    1085             :        end do
    1086             :     end do
    1087             : 
    1088           0 :   end subroutine get_rad_cnst_data
    1089             : 
    1090             :   !=================================================================================
    1091             :   !=================================================================================
    1092           0 :   subroutine read_rad_gas_data(indata, name, idx, state, pbuf2d, recno )
    1093           0 :     use rad_constituents, only: rad_cnst_get_gas
    1094             :     use drv_input_data,   only: drv_input_data_read
    1095             : 
    1096             :     type(drv_input_data_t), intent(inout) :: indata
    1097             :     character(len=32),   intent(in)    :: name
    1098             :     integer,             intent(in)    :: idx
    1099             :     type(physics_state),target, intent(inout) :: state(begchunk:endchunk)
    1100             :     type(physics_buffer_desc), pointer, dimension(:,:) :: pbuf2d
    1101             :     integer,             intent(in)    :: recno
    1102             : 
    1103           0 :     type(physics_buffer_desc), pointer, dimension(:) :: phys_buffer_chunk
    1104             :     character(len=32) :: radname
    1105             :     integer            :: c, ncol
    1106           0 :     real(r8)          :: mass(pcols,pver,begchunk:endchunk)
    1107           0 :     real(r8), pointer :: mmr_ptr(:,:)
    1108             : 
    1109           0 :     radname = 'rad_'//trim(name)
    1110           0 :     mass = drv_input_data_read( indata, radname, 'lev', pver, recno )
    1111             : 
    1112           0 :     do c = begchunk,endchunk
    1113           0 :        ncol = state(c)%ncol
    1114           0 :        phys_buffer_chunk => pbuf_get_chunk(pbuf2d, c)
    1115           0 :        call rad_cnst_get_gas(0, gaslist(idx), state(c), phys_buffer_chunk, mmr_ptr)
    1116           0 :        mmr_ptr(:ncol,:) = mass(:ncol,:,c)
    1117             :     enddo
    1118             : 
    1119           0 :   end subroutine read_rad_gas_data
    1120             : 
    1121             :   !=================================================================================
    1122             :   !=================================================================================
    1123           0 :   subroutine read_rad_aer_data(indata, name, idx, state, pbuf2d, recno )
    1124           0 :     use rad_constituents, only: rad_cnst_get_aer_mmr
    1125             :     use drv_input_data,   only: drv_input_data_read
    1126             : 
    1127             :     type(drv_input_data_t), intent(inout) :: indata
    1128             :     character(len=32),   intent(in)    :: name
    1129             :     integer,             intent(in)    :: idx
    1130             :     type(physics_state),target, intent(inout) :: state(begchunk:endchunk)
    1131             :     type(physics_buffer_desc), pointer, dimension(:,:) :: pbuf2d
    1132             :     integer,             intent(in)    :: recno
    1133             : 
    1134           0 :     type(physics_buffer_desc), pointer, dimension(:) :: phys_buffer_chunk
    1135             :     character(len=32) :: radname
    1136             :     integer :: c, ncol
    1137           0 :     real(r8)          :: mass(pcols,pver,begchunk:endchunk)
    1138           0 :     real(r8), pointer :: mmr_ptr(:,:)
    1139             : 
    1140           0 :     radname = 'rad_'//trim(name)
    1141           0 :     mass = drv_input_data_read( indata, radname, 'lev', pver, recno )
    1142             : 
    1143           0 :     do c = begchunk,endchunk
    1144           0 :        ncol = state(c)%ncol
    1145           0 :        phys_buffer_chunk => pbuf_get_chunk(pbuf2d, c)
    1146           0 :        call rad_cnst_get_aer_mmr(0, idx, state(c), phys_buffer_chunk, mmr_ptr)
    1147           0 :        mmr_ptr(:ncol,:) = mass(:ncol,:,c)
    1148             :     enddo
    1149             : 
    1150           0 :   end subroutine read_rad_aer_data
    1151             : 
    1152             :   !=================================================================================
    1153             :   !=================================================================================
    1154           0 :   subroutine read_rad_mam_data(indata, name, mode_idx, spec_idx, state, pbuf2d, recno )
    1155           0 :     use rad_constituents, only: rad_cnst_get_aer_mmr
    1156             :     use drv_input_data,   only: drv_input_data_read
    1157             : 
    1158             :     type(drv_input_data_t), intent(inout) :: indata
    1159             :     character(len=32),   intent(in)    :: name
    1160             :     integer,             intent(in)    :: mode_idx
    1161             :     integer,             intent(in)    :: spec_idx
    1162             :     type(physics_state),target, intent(inout) :: state(begchunk:endchunk)
    1163             :     type(physics_buffer_desc), pointer, dimension(:,:) :: pbuf2d
    1164             :     integer,             intent(in)    :: recno
    1165             : 
    1166           0 :     type(physics_buffer_desc), pointer, dimension(:) :: phys_buffer_chunk
    1167             :     character(len=32) :: radname
    1168             :     integer :: c, ncol
    1169           0 :     real(r8)          :: mass(pcols,pver,begchunk:endchunk)
    1170           0 :     real(r8), pointer :: mmr_ptr(:,:)
    1171             : 
    1172           0 :     radname = 'rad_'//trim(name)
    1173           0 :     mass = drv_input_data_read( indata, radname, 'lev', pver, recno )
    1174             : 
    1175           0 :     do c = begchunk,endchunk
    1176           0 :        ncol = state(c)%ncol
    1177           0 :        phys_buffer_chunk => pbuf_get_chunk(pbuf2d, c)
    1178           0 :        call rad_cnst_get_aer_mmr(0, mode_idx, spec_idx, 'a', state(c), phys_buffer_chunk, mmr_ptr)
    1179           0 :        mmr_ptr(:ncol,:) = mass(:ncol,:,c)
    1180             :     enddo
    1181             : 
    1182           0 :   end subroutine read_rad_mam_data
    1183             : 
    1184             : end module radiation_data

Generated by: LCOV version 1.14