LCOV - code coverage report
Current view: top level - physics/cam - cam_diagnostics.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 791 1086 72.8 %
Date: 2024-12-17 22:39:59 Functions: 28 30 93.3 %

          Line data    Source code
       1             : module cam_diagnostics
       2             : 
       3             : !---------------------------------------------------------------------------------
       4             : ! Module to compute a variety of diagnostics quantities for history files
       5             : !---------------------------------------------------------------------------------
       6             : 
       7             : use shr_kind_mod,    only: r8 => shr_kind_r8
       8             : use camsrfexch,      only: cam_in_t, cam_out_t
       9             : use cam_control_mod, only: moist_physics
      10             : use physics_types,   only: physics_state, physics_tend, physics_ptend
      11             : use ppgrid,          only: pcols, pver, begchunk, endchunk
      12             : use physics_buffer,  only: physics_buffer_desc, pbuf_add_field, dtype_r8
      13             : use physics_buffer,  only: dyn_time_lvls, pbuf_get_field, pbuf_get_index, pbuf_old_tim_idx
      14             : 
      15             : use cam_history,     only: outfld, write_inithist, hist_fld_active, inithist_all, write_camiop
      16             : use cam_history_support, only: max_fieldname_len
      17             : use constituents,    only: pcnst, cnst_name, cnst_longname, cnst_cam_outfld
      18             : use constituents,    only: ptendnam, apcnst, bpcnst, cnst_get_ind
      19             : use dycore,          only: dycore_is
      20             : use phys_control,    only: phys_getopts
      21             : use wv_saturation,   only: qsat, qsat_water, svp_ice_vect
      22             : use time_manager,    only: is_first_step
      23             : 
      24             : use scamMod,         only: single_column, wfld
      25             : use cam_abortutils,  only: endrun
      26             : 
      27             : implicit none
      28             : private
      29             : save
      30             : 
      31             : ! Public interfaces
      32             : 
      33             : public :: &
      34             :    diag_readnl,              &! read namelist options
      35             :    diag_register,            &! register pbuf space
      36             :    diag_init,                &! initialization
      37             :    diag_allocate,            &! allocate memory for module variables
      38             :    diag_deallocate,          &! deallocate memory for module variables
      39             :    diag_conv_tend_ini,       &! initialize convective tendency calcs
      40             :    diag_phys_writeout,       &! output diagnostics of the dynamics
      41             :    diag_clip_tend_writeout,  &! output diagnostics for clipping
      42             :    diag_phys_tend_writeout,  &! output physics tendencies
      43             :    diag_state_b4_phys_write, &! output state before physics execution
      44             :    diag_conv,                &! output diagnostics of convective processes
      45             :    diag_surf,                &! output diagnostics of the surface
      46             :    diag_export,              &! output export state
      47             :    diag_physvar_ic,          &
      48             :    nsurf
      49             : 
      50             : integer, public, parameter                                 :: num_stages = 8
      51             : character (len = max_fieldname_len), dimension(num_stages) :: stage = (/"phBF","phBP","phAP","phAM","dyBF","dyBP","dyAP","dyAM"/)
      52             : character (len = 45),dimension(num_stages) :: stage_txt = (/&
      53             :      " before energy fixer                     ",& !phBF - physics energy
      54             :      " before parameterizations                ",& !phBF - physics energy
      55             :      " after parameterizations                 ",& !phAP - physics energy
      56             :      " after dry mass correction               ",& !phAM - physics energy
      57             :      " before energy fixer (dycore)            ",& !dyBF - dynamics energy
      58             :      " before parameterizations (dycore)       ",& !dyBF - dynamics energy
      59             :      " after parameterizations (dycore)        ",& !dyAP - dynamics energy
      60             :      " after dry mass correction (dycore)      " & !dyAM - dynamics energy
      61             :      /)
      62             : 
      63             : ! Private data
      64             : 
      65             : integer :: dqcond_num                     ! number of constituents to compute convective
      66             : character(len=16) :: dcconnam(pcnst)      ! names of convection tendencies
      67             :                                           ! tendencies for
      68             : real(r8), allocatable :: dtcond(:,:,:)    ! temperature tendency due to convection
      69             : type dqcond_t
      70             :    real(r8), allocatable :: cnst(:,:,:)   ! constituent tendency due to convection
      71             : end type dqcond_t
      72             : type(dqcond_t), allocatable :: dqcond(:)
      73             : 
      74             : character(len=8) :: diag_cnst_conv_tend = 'q_only' ! output constituent tendencies due to convection
      75             :                                                    ! 'none', 'q_only' or 'all'
      76             : 
      77             : integer, parameter :: surf_100000 = 1
      78             : integer, parameter :: surf_092500 = 2
      79             : integer, parameter :: surf_085000 = 3
      80             : integer, parameter :: surf_070000 = 4
      81             : integer, parameter :: nsurf = 4
      82             : 
      83             : logical          :: history_amwg                   ! output the variables used by the AMWG diag package
      84             : logical          :: history_vdiag                  ! output the variables used by the AMWG variability diag package
      85             : logical          :: history_eddy                   ! output the eddy variables
      86             : logical          :: history_budget                 ! output tendencies and state variables for CAM4
      87             :                                                    ! temperature, water vapor, cloud ice and cloud
      88             :                                                    ! liquid budgets.
      89             : integer          :: history_budget_histfile_num    ! output history file number for budget fields
      90             : logical          :: history_waccm                  ! outputs typically used for WACCM
      91             : 
      92             : ! Physics buffer indices
      93             : 
      94             : integer  ::      psl_idx    = 0
      95             : integer  ::      relhum_idx = 0
      96             : integer  ::      qcwat_idx  = 0
      97             : integer  ::      tcwat_idx  = 0
      98             : integer  ::      lcwat_idx  = 0
      99             : integer  ::      cld_idx    = 0
     100             : integer  ::      concld_idx = 0
     101             : integer  ::      tke_idx    = 0
     102             : integer  ::      kvm_idx    = 0
     103             : integer  ::      kvh_idx    = 0
     104             : integer  ::      cush_idx   = 0
     105             : integer  ::      t_ttend_idx = 0
     106             : integer  ::      t_utend_idx = 0
     107             : integer  ::      t_vtend_idx = 0
     108             : 
     109             : integer  ::      prec_dp_idx  = 0
     110             : integer  ::      snow_dp_idx  = 0
     111             : integer  ::      prec_sh_idx  = 0
     112             : integer  ::      snow_sh_idx  = 0
     113             : integer  ::      prec_sed_idx = 0
     114             : integer  ::      snow_sed_idx = 0
     115             : integer  ::      prec_pcw_idx = 0
     116             : integer  ::      snow_pcw_idx = 0
     117             : 
     118             : 
     119             : integer :: tpert_idx=-1, qpert_idx=-1, pblh_idx=-1
     120             : 
     121             : integer :: trefmxav_idx = -1, trefmnav_idx = -1
     122             : 
     123             : contains
     124             : 
     125             : !==============================================================================
     126             : 
     127        1536 :   subroutine diag_readnl(nlfile)
     128             :     use namelist_utils,  only: find_group_name
     129             :     use units,           only: getunit, freeunit
     130             :     use spmd_utils,      only: masterproc, masterprocid, mpi_character, mpicom
     131             : 
     132             :     character(len=*), intent(in) :: nlfile  ! filepath for file containing namelist input
     133             : 
     134             :     ! Local variables
     135             :     integer :: unitn, ierr
     136             :     character(len=*), parameter :: subname = 'diag_readnl'
     137             : 
     138             :     namelist /cam_diag_opts/ diag_cnst_conv_tend
     139             :     !--------------------------------------------------------------------------
     140             : 
     141        1536 :     if (masterproc) then
     142           2 :       unitn = getunit()
     143           2 :       open( unitn, file=trim(nlfile), status='old' )
     144           2 :       call find_group_name(unitn, 'cam_diag_opts', status=ierr)
     145           2 :       if (ierr == 0) then
     146           0 :         read(unitn, cam_diag_opts, iostat=ierr)
     147           0 :         if (ierr /= 0) then
     148           0 :           call endrun(subname // ':: ERROR reading namelist')
     149             :         end if
     150             :       end if
     151           2 :       close(unitn)
     152           2 :       call freeunit(unitn)
     153             :     end if
     154             : 
     155             :     ! Broadcast namelist variables
     156        1536 :     call mpi_bcast(diag_cnst_conv_tend, len(diag_cnst_conv_tend), mpi_character, masterprocid, mpicom, ierr)
     157             : 
     158        1536 :   end subroutine diag_readnl
     159             : 
     160             : !==============================================================================
     161             : 
     162        1536 :   subroutine diag_register_dry()
     163             : 
     164        1536 :     call pbuf_add_field('PSL', 'physpkg', dtype_r8, (/pcols/), psl_idx)
     165             : 
     166             :     ! Request physics buffer space for fields that persist across timesteps.
     167        6144 :     call pbuf_add_field('T_TTEND', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), t_ttend_idx)
     168        6144 :     call pbuf_add_field('T_UTEND', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), t_utend_idx)
     169        6144 :     call pbuf_add_field('T_VTEND', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), t_vtend_idx)
     170        1536 :   end subroutine diag_register_dry
     171             : 
     172        1536 :   subroutine diag_register_moist()
     173             :     ! Request physics buffer space for fields that persist across timesteps.
     174        1536 :     call pbuf_add_field('TREFMXAV', 'global', dtype_r8, (/pcols/), trefmxav_idx)
     175        1536 :     call pbuf_add_field('TREFMNAV', 'global', dtype_r8, (/pcols/), trefmnav_idx)
     176        1536 :   end subroutine diag_register_moist
     177             : 
     178        1536 :   subroutine diag_register()
     179        1536 :     call diag_register_dry()
     180        1536 :     if (moist_physics) then
     181        1536 :       call diag_register_moist()
     182             :     end if
     183        1536 :   end subroutine diag_register
     184             : 
     185             : !==============================================================================
     186             : 
     187        1536 :   subroutine diag_init_dry(pbuf2d)
     188             :     ! Declare the history fields for which this module contains outfld calls.
     189             : 
     190             :     use cam_history,        only: addfld, add_default, horiz_only
     191             :     use cam_history,        only: register_vector_field
     192             :     use tidal_diag,         only: tidal_diag_init
     193             :     use cam_budget,         only: cam_budget_em_snapshot, cam_budget_em_register, thermo_budget_history
     194             : 
     195             :     type(physics_buffer_desc), pointer, intent(in) :: pbuf2d(:,:)
     196             : 
     197             :     integer :: istage
     198             :     ! outfld calls in diag_phys_writeout
     199        3072 :     call addfld (cnst_name(1), (/ 'lev' /), 'A', 'kg/kg',    cnst_longname(1))
     200        1536 :     call addfld ('NSTEP',      horiz_only,  'A', 'timestep', 'Model timestep')
     201        1536 :     call addfld ('PHIS',       horiz_only,  'I', 'm2/s2',    'Surface geopotential')
     202             : 
     203        1536 :     call addfld ('PS',         horiz_only,  'A', 'Pa',       'Surface pressure')
     204        3072 :     call addfld ('T',          (/ 'lev' /), 'A', 'K',        'Temperature')
     205        3072 :     call addfld ('U',          (/ 'lev' /), 'A', 'm/s',      'Zonal wind')
     206        3072 :     call addfld ('V',          (/ 'lev' /), 'A', 'm/s',      'Meridional wind')
     207             : 
     208        1536 :     call register_vector_field('U','V')
     209             : 
     210             :     ! State before physics
     211        3072 :     call addfld ('TBP',     (/ 'lev' /), 'A','K',             'Temperature (before physics)')
     212        3072 :     call addfld ('UBP',     (/ 'lev' /), 'A','m/s',           'Zonal wind (before physics)')
     213        3072 :     call addfld ('VBP',     (/ 'lev' /), 'A','m/s',           'Meridional Wind (before physics)')
     214        1536 :     call register_vector_field('UBP','VBP')
     215        3072 :     call addfld (bpcnst(1), (/ 'lev' /), 'A','kg/kg',         trim(cnst_longname(1))//' (before physics)')
     216             :     ! State after physics
     217        3072 :     call addfld ('TAP',     (/ 'lev' /), 'A','K',             'Temperature (after physics)'       )
     218        3072 :     call addfld ('UAP',     (/ 'lev' /), 'A','m/s',           'Zonal wind (after physics)'        )
     219        3072 :     call addfld ('VAP',     (/ 'lev' /), 'A','m/s',           'Meridional wind (after physics)'   )
     220             : 
     221        1536 :     call register_vector_field('UAP','VAP')
     222             : 
     223        3072 :     call addfld (apcnst(1), (/ 'lev' /), 'A','kg/kg',         trim(cnst_longname(1))//' (after physics)')
     224        1536 :     if (.not.dycore_is('EUL')) then
     225        1536 :       call addfld ('TFIX',    horiz_only,  'A', 'K/s',        'T fixer (T equivalent of Energy correction)')
     226             :     end if
     227        3072 :     call addfld ('TTEND_TOT', (/ 'lev' /), 'A', 'K/s',        'Total temperature tendency')
     228             : 
     229             :     ! outfld calls in diag_phys_tend_writeout
     230        3072 :     call addfld ('UTEND_TOT', (/ 'lev' /), 'A', 'm/s2',       'Total zonal wind tendency')
     231        3072 :     call addfld ('VTEND_TOT', (/ 'lev' /), 'A', 'm/s2',       'Total meridional wind tendency')
     232        1536 :     call register_vector_field('UTEND_TOT','VTEND_TOT')
     233             : 
     234             :     ! Debugging negative water output fields
     235        3072 :     call addfld ('INEGCLPTEND ', (/ 'lev' /), 'A', 'kg/kg/s', 'Cloud ice tendency due to clipping neg values after microp')
     236        3072 :     call addfld ('LNEGCLPTEND ', (/ 'lev' /), 'A', 'kg/kg/s', 'Cloud liq tendency due to clipping neg values after microp')
     237        3072 :     call addfld ('VNEGCLPTEND ', (/ 'lev' /), 'A', 'kg/kg/s', 'Vapor tendency due to clipping neg values after microp')
     238             : 
     239        3072 :     call addfld ('Z3',         (/ 'lev' /), 'A', 'm',         'Geopotential Height (above sea level)')
     240        1536 :     call addfld ('Z1000',      horiz_only,  'A', 'm',         'Geopotential Z at 1000 mbar pressure surface')
     241        1536 :     call addfld ('Z700',       horiz_only,  'A', 'm',         'Geopotential Z at 700 mbar pressure surface')
     242        1536 :     call addfld ('Z500',       horiz_only,  'A', 'm',         'Geopotential Z at 500 mbar pressure surface')
     243        1536 :     call addfld ('Z300',       horiz_only,  'A', 'm',         'Geopotential Z at 300 mbar pressure surface')
     244        1536 :     call addfld ('Z200',       horiz_only,  'A', 'm',         'Geopotential Z at 200 mbar pressure surface')
     245        1536 :     call addfld ('Z100',       horiz_only,  'A', 'm',         'Geopotential Z at 100 mbar pressure surface')
     246        1536 :     call addfld ('Z050',       horiz_only,  'A', 'm',         'Geopotential Z at 50 mbar pressure surface')
     247             : 
     248        3072 :     call addfld ('ZZ',         (/ 'lev' /), 'A', 'm2',        'Eddy height variance' )
     249        3072 :     call addfld ('VZ',         (/ 'lev' /), 'A', 'm2/s',      'Meridional transport of geopotential height')
     250        3072 :     call addfld ('VT',         (/ 'lev' /), 'A', 'K m/s   ',  'Meridional heat transport')
     251        3072 :     call addfld ('VU',         (/ 'lev' /), 'A', 'm2/s2',     'Meridional flux of zonal momentum' )
     252        3072 :     call addfld ('VV',         (/ 'lev' /), 'A', 'm2/s2',     'Meridional velocity squared' )
     253        3072 :     call addfld ('OMEGAV',     (/ 'lev' /), 'A', 'm Pa/s2 ',  'Vertical flux of meridional momentum' )
     254        3072 :     call addfld ('OMGAOMGA',   (/ 'lev' /), 'A', 'Pa2/s2',    'Vertical flux of vertical momentum' )
     255             : 
     256        3072 :     call addfld ('UU',         (/ 'lev' /), 'A', 'm2/s2',     'Zonal velocity squared' )
     257        3072 :     call addfld ('WSPEED',     (/ 'lev' /), 'X', 'm/s',       'Horizontal total wind speed maximum' )
     258        1536 :     call addfld ('WSPDSRFMX',  horiz_only,  'X', 'm/s',       'Horizontal total wind speed maximum at surface layer midpoint' )
     259        1536 :     call addfld ('WSPDSRFAV',  horiz_only,  'A', 'm/s',       'Horizontal total wind speed average at surface layer midpoint' )
     260             : 
     261        3072 :     call addfld ('OMEGA',      (/ 'lev' /), 'A', 'Pa/s',      'Vertical velocity (pressure)')
     262        3072 :     call addfld ('OMEGAT',     (/ 'lev' /), 'A', 'K Pa/s  ',  'Vertical heat flux' )
     263        3072 :     call addfld ('OMEGAU',     (/ 'lev' /), 'A', 'm Pa/s2 ',  'Vertical flux of zonal momentum' )
     264        1536 :     call addfld ('OMEGA850',   horiz_only,  'A', 'Pa/s',      'Vertical velocity at 850 mbar pressure surface')
     265        1536 :     call addfld ('OMEGA500',   horiz_only,  'A', 'Pa/s',      'Vertical velocity at 500 mbar pressure surface')
     266             : 
     267        1536 :     call addfld ('PSL',        horiz_only,  'A', 'Pa','Sea level pressure')
     268             : 
     269        1536 :     call addfld ('T1000',      horiz_only,  'A', 'K','Temperature at 1000 mbar pressure surface')
     270        1536 :     call addfld ('T925',       horiz_only,  'A', 'K','Temperature at 925 mbar pressure surface')
     271        1536 :     call addfld ('T850',       horiz_only,  'A', 'K','Temperature at 850 mbar pressure surface')
     272        1536 :     call addfld ('T700',       horiz_only,  'A', 'K','Temperature at 700 mbar pressure surface')
     273        1536 :     call addfld ('T500',       horiz_only,  'A', 'K','Temperature at 500 mbar pressure surface')
     274        1536 :     call addfld ('T400',       horiz_only,  'A', 'K','Temperature at 400 mbar pressure surface')
     275        1536 :     call addfld ('T300',       horiz_only,  'A', 'K','Temperature at 300 mbar pressure surface')
     276        1536 :     call addfld ('T200',       horiz_only,  'A', 'K','Temperature at 200 mbar pressure surface')
     277        1536 :     call addfld ('T010',       horiz_only,  'A', 'K','Temperature at 10 mbar pressure surface')
     278             : 
     279        1536 :     call addfld ('T7001000',   horiz_only,  'A', 'K','Temperature difference 700 mb - 1000 mb')
     280        1536 :     call addfld ('TH7001000',  horiz_only,  'A', 'K','Theta difference 700 mb - 1000 mb')
     281        1536 :     call addfld ('THE7001000', horiz_only,  'A', 'K','ThetaE difference 700 mb - 1000 mb')
     282             : 
     283        1536 :     call addfld ('T8501000',   horiz_only,  'A', 'K','Temperature difference 850 mb - 1000 mb')
     284        1536 :     call addfld ('TH8501000',  horiz_only,  'A', 'K','Theta difference 850 mb - 1000 mb')
     285        1536 :     call addfld ('T9251000',   horiz_only,  'A', 'K','Temperature difference 925 mb - 1000 mb')
     286        1536 :     call addfld ('TH9251000',  horiz_only,  'A', 'K','Theta difference 925 mb - 1000 mb')
     287             : 
     288        3072 :     call addfld ('TT',         (/ 'lev' /), 'A', 'K2','Eddy temperature variance' )
     289             : 
     290        1536 :     call addfld ('U850',       horiz_only,  'A', 'm/s','Zonal wind at 850 mbar pressure surface')
     291        1536 :     call addfld ('U500',       horiz_only,  'A', 'm/s','Zonal wind at 500 mbar pressure surface')
     292        1536 :     call addfld ('U250',       horiz_only,  'A', 'm/s','Zonal wind at 250 mbar pressure surface')
     293        1536 :     call addfld ('U200',       horiz_only,  'A', 'm/s','Zonal wind at 200 mbar pressure surface')
     294        1536 :     call addfld ('U010',       horiz_only,  'A', 'm/s','Zonal wind at  10 mbar pressure surface')
     295        1536 :     call addfld ('V850',       horiz_only,  'A', 'm/s','Meridional wind at 850 mbar pressure surface')
     296        1536 :     call addfld ('V500',       horiz_only,  'A', 'm/s','Meridional wind at 500 mbar pressure surface')
     297        1536 :     call addfld ('V250',       horiz_only,  'A', 'm/s','Meridional wind at 250 mbar pressure surface')
     298        1536 :     call addfld ('V200',       horiz_only,  'A', 'm/s','Meridional wind at 200 mbar pressure surface')
     299             : 
     300        1536 :     call register_vector_field('U850', 'V850')
     301        1536 :     call register_vector_field('U500', 'V500')
     302        1536 :     call register_vector_field('U250', 'V250')
     303        1536 :     call register_vector_field('U200', 'V200')
     304             : 
     305        1536 :     call addfld ('UBOT',       horiz_only,  'A', 'm/s','Lowest model level zonal wind')
     306        1536 :     call addfld ('VBOT',       horiz_only,  'A', 'm/s','Lowest model level meridional wind')
     307        1536 :     call register_vector_field('UBOT', 'VBOT')
     308             : 
     309        1536 :     call addfld ('ZBOT',       horiz_only,  'A', 'm','Lowest model level height')
     310             : 
     311        1536 :     call addfld ('ATMEINT',    horiz_only,  'A', 'J/m2','Vertically integrated total atmospheric energy ')
     312             : 
     313        1536 :     if (history_amwg) then
     314        1536 :       call add_default ('PHIS    '  , 1, ' ')
     315        1536 :       call add_default ('PS      '  , 1, ' ')
     316        1536 :       call add_default ('T       '  , 1, ' ')
     317        1536 :       call add_default ('U       '  , 1, ' ')
     318        1536 :       call add_default ('V       '  , 1, ' ')
     319        1536 :       call add_default ('Z3      '  , 1, ' ')
     320        1536 :       call add_default ('OMEGA   '  , 1, ' ')
     321        1536 :       call add_default ('VT      ', 1, ' ')
     322        1536 :       call add_default ('VU      ', 1, ' ')
     323        1536 :       call add_default ('VV      ', 1, ' ')
     324        1536 :       call add_default ('UU      ', 1, ' ')
     325        1536 :       call add_default ('OMEGAT  ', 1, ' ')
     326        1536 :       call add_default ('PSL     ', 1, ' ')
     327             :     end if
     328             : 
     329        1536 :     if (history_vdiag) then
     330           0 :       call add_default ('U200', 2, ' ')
     331           0 :       call add_default ('V200', 2, ' ')
     332           0 :       call add_default ('U850', 2, ' ')
     333           0 :       call add_default ('U200', 3, ' ')
     334           0 :       call add_default ('U850', 3, ' ')
     335           0 :       call add_default ('OMEGA500', 3, ' ')
     336             :     end if
     337             : 
     338        1536 :     if (history_eddy) then
     339           0 :       call add_default ('VT      ', 1, ' ')
     340           0 :       call add_default ('VU      ', 1, ' ')
     341           0 :       call add_default ('VV      ', 1, ' ')
     342           0 :       call add_default ('UU      ', 1, ' ')
     343           0 :       call add_default ('OMEGAT  ', 1, ' ')
     344           0 :       call add_default ('OMEGAU  ', 1, ' ')
     345           0 :       call add_default ('OMEGAV  ', 1, ' ')
     346             :     endif
     347             : 
     348        1536 :     if ( history_budget ) then
     349           0 :       call add_default ('PHIS    '  , history_budget_histfile_num, ' ')
     350           0 :       call add_default ('PS      '  , history_budget_histfile_num, ' ')
     351           0 :       call add_default ('T       '  , history_budget_histfile_num, ' ')
     352           0 :       call add_default ('U       '  , history_budget_histfile_num, ' ')
     353           0 :       call add_default ('V       '  , history_budget_histfile_num, ' ')
     354           0 :       call add_default ('TTEND_TOT' , history_budget_histfile_num, ' ')
     355           0 :       call add_default ('UTEND_TOT' , history_budget_histfile_num, ' ')
     356           0 :       call add_default ('VTEND_TOT' , history_budget_histfile_num, ' ')
     357             : 
     358             :       ! State before physics (FV)
     359           0 :       call add_default ('TBP     '  , history_budget_histfile_num, ' ')
     360           0 :       call add_default ('UBP     '  , history_budget_histfile_num, ' ')
     361           0 :       call add_default ('VBP     '  , history_budget_histfile_num, ' ')
     362           0 :       call add_default (bpcnst(1)   , history_budget_histfile_num, ' ')
     363             :       ! State after physics (FV)
     364           0 :       call add_default ('TAP     '  , history_budget_histfile_num, ' ')
     365           0 :       call add_default ('UAP     '  , history_budget_histfile_num, ' ')
     366           0 :       call add_default ('VAP     '  , history_budget_histfile_num, ' ')
     367           0 :       call add_default (apcnst(1)   , history_budget_histfile_num, ' ')
     368           0 :       if (.not.dycore_is('EUL')) then
     369           0 :         call add_default ('TFIX    '    , history_budget_histfile_num, ' ')
     370             :       end if
     371             :     end if
     372             : 
     373        1536 :     if (history_waccm) then
     374           0 :       call add_default ('PHIS', 7, ' ')
     375           0 :       call add_default ('PS', 7, ' ')
     376           0 :       call add_default ('PSL', 7, ' ')
     377             :     end if
     378             : 
     379             :     ! outfld calls in diag_phys_tend_writeout
     380        3072 :     call addfld ('PTTEND',          (/ 'lev' /), 'A', 'K/s','T total physics tendency')
     381        3072 :     call addfld ('UTEND_PHYSTOT',   (/ 'lev' /), 'A', 'm/s2','U total physics tendency')
     382        3072 :     call addfld ('VTEND_PHYSTOT',   (/ 'lev' /), 'A', 'm/s2','V total physics tendency')
     383        1536 :     call register_vector_field('UTEND_PHYSTOT','VTEND_PHYSTOT')
     384        1536 :     if ( history_budget ) then
     385           0 :       call add_default ('PTTEND'          , history_budget_histfile_num, ' ')
     386           0 :       call add_default ('UTEND_PHYSTOT'   , history_budget_histfile_num, ' ')
     387           0 :       call add_default ('VTEND_PHYSTOT'   , history_budget_histfile_num, ' ')
     388             :     end if
     389             : 
     390             :     ! create history variables for fourier coefficients of the diurnal
     391             :     ! and semidiurnal tide in T, U, V, and Z3
     392        1536 :     call tidal_diag_init()
     393             : 
     394        3072 :     call addfld( 'CPAIRV', (/ 'lev' /), 'I', 'J/K/kg', 'Variable specific heat cap air' )
     395        3072 :     call addfld( 'RAIRV', (/ 'lev' /), 'I', 'J/K/kg', 'Variable dry air gas constant' )
     396             : 
     397        1536 :     if (thermo_budget_history) then
     398             :        !
     399             :        ! energy diagnostics addflds for vars_stage combinations plus e_m_snapshots
     400             :        !
     401           0 :        do istage = 1, num_stages
     402           0 :           call cam_budget_em_snapshot(TRIM(ADJUSTL(stage(istage))),'phy',longname=TRIM(ADJUSTL(stage_txt(istage))))
     403             :        end do
     404             : 
     405             :        ! Create budgets that are a sum/dif of 2 stages
     406             : 
     407           0 :        call cam_budget_em_register('dEdt_param_efix_physE','phAP','phBF','phy','dif',longname='dE/dt CAM physics + energy fixer using physics E formula (phAP-phBF)')
     408           0 :        call cam_budget_em_register('dEdt_param_efix_dynE' ,'dyAP','dyBF','phy','dif',longname='dE/dt CAM physics + energy fixer using dycore E formula (dyAP-dyBF)')
     409           0 :        call cam_budget_em_register('dEdt_param_physE'     ,'phAP','phBP','phy','dif',longname='dE/dt CAM physics using physics E formula (phAP-phBP)')
     410           0 :        call cam_budget_em_register('dEdt_param_dynE'      ,'dyAP','dyBP','phy','dif',longname='dE/dt CAM physics using dycore E (dyAP-dyBP)')
     411           0 :        call cam_budget_em_register('dEdt_dme_adjust_physE','phAM','phAP','phy','dif',longname='dE/dt dry mass adjustment using physics E formula (phAM-phAP)')
     412           0 :        call cam_budget_em_register('dEdt_dme_adjust_dynE' ,'dyAM','dyAP','phy','dif',longname='dE/dt dry mass adjustment using dycore E (dyAM-dyAP)')
     413           0 :        call cam_budget_em_register('dEdt_efix_physE'      ,'phBP','phBF','phy','dif',longname='dE/dt energy fixer using physics E formula (phBP-phBF)')
     414           0 :        call cam_budget_em_register('dEdt_efix_dynE'       ,'dyBP','dyBF','phy','dif',longname='dE/dt energy fixer using dycore E formula (dyBP-dyBF)')
     415           0 :        call cam_budget_em_register('dEdt_phys_tot_physE'  ,'phAM','phBF','phy','dif',longname='dE/dt physics total using physics E formula (phAM-phBF)')
     416           0 :        call cam_budget_em_register('dEdt_phys_tot_dynE'   ,'dyAM','dyBF','phy','dif',longname='dE/dt physics total using dycore E (dyAM-dyBF)')
     417             :     endif
     418        1536 :   end subroutine diag_init_dry
     419             : 
     420        1536 :   subroutine diag_init_moist(pbuf2d)
     421             : 
     422             :     ! Declare the history fields for which this module contains outfld calls.
     423             : 
     424        1536 :     use cam_history,        only: addfld, add_default, horiz_only
     425             :     use constituent_burden, only: constituent_burden_init
     426             :     use physics_buffer,     only: pbuf_set_field
     427             : 
     428             :     type(physics_buffer_desc), pointer, intent(in) :: pbuf2d(:,:)
     429             : 
     430             :     integer :: m
     431             :     integer :: ixcldice, ixcldliq ! constituent indices for cloud liquid and ice water.
     432             :     integer :: ierr
     433             :     ! column burdens for all constituents except water vapor
     434        1536 :     call constituent_burden_init
     435             : 
     436        1536 :     call cnst_get_ind('CLDLIQ', ixcldliq, abort=.false.)
     437        1536 :     call cnst_get_ind('CLDICE', ixcldice, abort=.false.)
     438             : 
     439             :     ! outfld calls in diag_phys_writeout
     440        3072 :     call addfld ('OMEGAQ',     (/ 'lev' /), 'A', 'kgPa/kgs', 'Vertical water transport' )
     441        3072 :     call addfld ('VQ',         (/ 'lev' /), 'A', 'm/skg/kg',  'Meridional water transport')
     442        3072 :     call addfld ('QQ',         (/ 'lev' /), 'A', 'kg2/kg2',   'Eddy moisture variance')
     443             : 
     444        3072 :     call addfld ('MQ',         (/ 'lev' /), 'A', 'kg/m2','Water vapor mass in layer')
     445        1536 :     call addfld ('TMQ',        horiz_only,  'A', 'kg/m2','Total (vertically integrated) precipitable water')
     446        3072 :     call addfld ('RELHUM',     (/ 'lev' /), 'A', 'percent','Relative humidity')
     447        3072 :     call addfld ('RHW',        (/ 'lev' /), 'A', 'percent','Relative humidity with respect to liquid')
     448        3072 :     call addfld ('RHI',        (/ 'lev' /), 'A', 'percent','Relative humidity with respect to ice')
     449        3072 :     call addfld ('RHCFMIP',    (/ 'lev' /), 'A', 'percent','Relative humidity with respect to water above 273 K, ice below 273 K')
     450             : 
     451        1536 :     call addfld ('IVT',        horiz_only,  'A', 'kg/m/s','Total (vertically integrated) vapor transport')
     452        1536 :     call addfld ('uIVT',       horiz_only,  'A', 'kg/m/s','u-component (vertically integrated) vapor transport')
     453        1536 :     call addfld ('vIVT',       horiz_only,  'A', 'kg/m/s','v-component (vertically integrated) vapor transport')
     454             : 
     455        1536 :     call addfld ('THE8501000', horiz_only,  'A', 'K','ThetaE difference 850 mb - 1000 mb')
     456        1536 :     call addfld ('THE9251000', horiz_only,  'A', 'K','ThetaE difference 925 mb - 1000 mb')
     457             : 
     458        1536 :     call addfld ('Q1000',      horiz_only,  'A', 'kg/kg','Specific Humidity at 1000 mbar pressure surface')
     459        1536 :     call addfld ('Q925',       horiz_only,  'A', 'kg/kg','Specific Humidity at 925 mbar pressure surface')
     460        1536 :     call addfld ('Q850',       horiz_only,  'A', 'kg/kg','Specific Humidity at 850 mbar pressure surface')
     461        1536 :     call addfld ('Q200',       horiz_only,  'A', 'kg/kg','Specific Humidity at 200 mbar pressure surface')
     462        1536 :     call addfld ('QBOT',       horiz_only,  'A', 'kg/kg','Lowest model level water vapor mixing ratio')
     463             : 
     464        1536 :     call addfld ('PSDRY',      horiz_only,  'A', 'Pa', 'Dry surface pressure')
     465        3072 :     call addfld ('PMID',       (/ 'lev' /), 'A', 'Pa', 'Pressure at layer midpoints')
     466        3072 :     call addfld ('PINT',       (/ 'ilev' /), 'A', 'Pa', 'Pressure at layer interfaces')
     467        3072 :     call addfld ('PDELDRY',    (/ 'lev' /), 'A', 'Pa', 'Dry pressure difference between levels')
     468        3072 :     call addfld ('PDEL',       (/ 'lev' /), 'A', 'Pa', 'Pressure difference between levels')
     469             : 
     470             :     ! outfld calls in diag_conv
     471             : 
     472        3072 :     call addfld ('DTCOND',       (/ 'lev' /), 'A','K/s','T tendency - moist processes')
     473        3072 :     call addfld ('DTCOND_24_COS',(/ 'lev' /), 'A','K/s','T tendency - moist processes 24hr. cos coeff.')
     474        3072 :     call addfld ('DTCOND_24_SIN',(/ 'lev' /), 'A','K/s','T tendency - moist processes 24hr. sin coeff.')
     475        3072 :     call addfld ('DTCOND_12_COS',(/ 'lev' /), 'A','K/s','T tendency - moist processes 12hr. cos coeff.')
     476        3072 :     call addfld ('DTCOND_12_SIN',(/ 'lev' /), 'A','K/s','T tendency - moist processes 12hr. sin coeff.')
     477        3072 :     call addfld ('DTCOND_08_COS',(/ 'lev' /), 'A','K/s','T tendency - moist processes  8hr. cos coeff.')
     478        3072 :     call addfld ('DTCOND_08_SIN',(/ 'lev' /), 'A','K/s','T tendency - moist processes  8hr. sin coeff.')
     479             : 
     480        1536 :     call addfld ('PRECL',    horiz_only, 'A', 'm/s','Large-scale (stable) precipitation rate (liq + ice)'                )
     481        1536 :     call addfld ('PRECC',    horiz_only, 'A', 'm/s','Convective precipitation rate (liq + ice)'                          )
     482        1536 :     call addfld ('PRECT',    horiz_only, 'A', 'm/s','Total (convective and large-scale) precipitation rate (liq + ice)'  )
     483        1536 :     call addfld ('PREC_PCW', horiz_only, 'A', 'm/s','LS_pcw precipitation rate')
     484        1536 :     call addfld ('PREC_zmc', horiz_only, 'A', 'm/s','CV_zmc precipitation rate')
     485        1536 :     call addfld ('PRECTMX',  horiz_only, 'X','m/s','Maximum (convective and large-scale) precipitation rate (liq+ice)'   )
     486        1536 :     call addfld ('PRECSL',   horiz_only, 'A', 'm/s','Large-scale (stable) snow rate (water equivalent)'                  )
     487        1536 :     call addfld ('PRECSC',   horiz_only, 'A', 'm/s','Convective snow rate (water equivalent)'                            )
     488        1536 :     call addfld ('PRECCav',  horiz_only, 'A', 'm/s','Average large-scale precipitation (liq + ice)'                      )
     489        1536 :     call addfld ('PRECLav',  horiz_only, 'A', 'm/s','Average convective precipitation  (liq + ice)'                      )
     490             : 
     491             :     ! outfld calls in diag_surf
     492             : 
     493        1536 :     call addfld ('SHFLX',    horiz_only, 'A', 'W/m2','Surface sensible heat flux')
     494        1536 :     call addfld ('LHFLX',    horiz_only, 'A', 'W/m2','Surface latent heat flux')
     495        1536 :     call addfld ('QFLX',     horiz_only, 'A', 'kg/m2/s','Surface water flux')
     496             : 
     497        1536 :     call addfld ('TAUX',     horiz_only, 'A', 'N/m2','Zonal surface stress')
     498        1536 :     call addfld ('TAUY',     horiz_only, 'A', 'N/m2','Meridional surface stress')
     499        1536 :     call addfld ('TREFHT',   horiz_only, 'A', 'K','Reference height temperature')
     500        1536 :     call addfld ('TREFHTMN', horiz_only, 'M','K','Minimum reference height temperature over output period')
     501        1536 :     call addfld ('TREFHTMX', horiz_only, 'X','K','Maximum reference height temperature over output period')
     502        1536 :     call addfld ('QREFHT',   horiz_only, 'A', 'kg/kg','Reference height humidity')
     503        1536 :     call addfld ('U10',      horiz_only, 'A', 'm/s','10m wind speed')
     504        1536 :     call addfld ('UGUST',    horiz_only, 'A', 'm/s','Gustiness term added to U10')
     505        1536 :     call addfld ('U10WITHGUSTS',horiz_only, 'A', 'm/s','10m wind speed with gustiness added')
     506        1536 :     call addfld ('RHREFHT',  horiz_only, 'A', 'fraction','Reference height relative humidity')
     507             : 
     508        1536 :     call addfld ('LANDFRAC', horiz_only, 'A', 'fraction','Fraction of sfc area covered by land')
     509        1536 :     call addfld ('ICEFRAC',  horiz_only, 'A', 'fraction','Fraction of sfc area covered by sea-ice')
     510        1536 :     call addfld ('OCNFRAC',  horiz_only, 'A', 'fraction','Fraction of sfc area covered by ocean')
     511             : 
     512        1536 :     call addfld ('TREFMNAV', horiz_only, 'A', 'K','Average of TREFHT daily minimum')
     513        1536 :     call addfld ('TREFMXAV', horiz_only, 'A', 'K','Average of TREFHT daily maximum')
     514             : 
     515        1536 :     call addfld ('TS',       horiz_only, 'A', 'K','Surface temperature (radiative)')
     516        1536 :     call addfld ('TSMN',     horiz_only, 'M','K','Minimum surface temperature over output period')
     517        1536 :     call addfld ('TSMX',     horiz_only, 'X','K','Maximum surface temperature over output period')
     518        1536 :     call addfld ('SNOWHLND', horiz_only, 'A', 'm','Water equivalent snow depth')
     519        1536 :     call addfld ('SNOWHICE', horiz_only, 'A', 'm','Snow depth over ice', fill_value = 1.e30_r8)
     520        1536 :     call addfld ('TBOT',     horiz_only, 'A', 'K','Lowest model level temperature')
     521             : 
     522        1536 :     call addfld ('ASDIR',    horiz_only, 'A', '1','albedo: shortwave, direct')
     523        1536 :     call addfld ('ASDIF',    horiz_only, 'A', '1','albedo: shortwave, diffuse')
     524        1536 :     call addfld ('ALDIR',    horiz_only, 'A', '1','albedo: longwave, direct')
     525        1536 :     call addfld ('ALDIF',    horiz_only, 'A', '1','albedo: longwave, diffuse')
     526        1536 :     call addfld ('SST',      horiz_only, 'A', 'K','sea surface temperature')
     527             : 
     528             : 
     529             :     ! outfld calls in diag_phys_tend_writeout
     530             : 
     531        3072 :     call addfld (ptendnam(       1),(/ 'lev' /), 'A', 'kg/kg/s',trim(cnst_name(       1))//' total physics tendency '      )
     532             : 
     533        1536 :     if (ixcldliq > 0) then
     534        3072 :        call addfld (ptendnam(ixcldliq),(/ 'lev' /), 'A', 'kg/kg/s',trim(cnst_name(ixcldliq))//' total physics tendency '      )
     535             :     end if
     536        1536 :     if (ixcldice > 0) then
     537        3072 :       call addfld (ptendnam(ixcldice),(/ 'lev' /), 'A', 'kg/kg/s',trim(cnst_name(ixcldice))//' total physics tendency ')
     538             :     end if
     539             : 
     540             :     ! outfld calls in diag_physvar_ic
     541             : 
     542        3072 :     call addfld ('QCWAT&IC',  (/ 'lev' /),  'I','kg/kg','q associated with cloud water'                   )
     543        3072 :     call addfld ('TCWAT&IC',  (/ 'lev' /),  'I','kg/kg','T associated with cloud water'                   )
     544        3072 :     call addfld ('LCWAT&IC',  (/ 'lev' /),  'I','kg/kg','Cloud water (ice + liq'                          )
     545        3072 :     call addfld ('CLOUD&IC',  (/ 'lev' /),  'I','fraction','Cloud fraction'                               )
     546        3072 :     call addfld ('CONCLD&IC', (/ 'lev' /),  'I','fraction','Convective cloud fraction'                    )
     547        3072 :     call addfld ('TKE&IC',    (/ 'ilev' /), 'I','m2/s2','Turbulent Kinetic Energy'                        )
     548        1536 :     call addfld ('CUSH&IC',   horiz_only,   'I','m','Convective Scale Height'                             )
     549        3072 :     call addfld ('KVH&IC',    (/ 'ilev' /), 'I','m2/s','Vertical diffusion diffusivities (heat/moisture)' )
     550        3072 :     call addfld ('KVM&IC',    (/ 'ilev' /), 'I','m2/s','Vertical diffusion diffusivities (momentum)'      )
     551        1536 :     call addfld ('PBLH&IC',   horiz_only,   'I','m','PBL height'                                          )
     552        1536 :     call addfld ('TPERT&IC',  horiz_only,   'I','K','Perturbation temperature (eddies in PBL)'            )
     553        1536 :     call addfld ('QPERT&IC',  horiz_only,   'I','kg/kg','Perturbation specific humidity (eddies in PBL)'  )
     554             : 
     555             :     ! CAM export state
     556        1536 :     call addfld('a2x_BCPHIWET', horiz_only, 'A', 'kg/m2/s', 'wetdep of hydrophilic black carbon')
     557        1536 :     call addfld('a2x_BCPHIDRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophilic black carbon')
     558        1536 :     call addfld('a2x_BCPHODRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophobic black carbon')
     559        1536 :     call addfld('a2x_OCPHIWET', horiz_only, 'A', 'kg/m2/s', 'wetdep of hydrophilic organic carbon')
     560        1536 :     call addfld('a2x_OCPHIDRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophilic organic carbon')
     561        1536 :     call addfld('a2x_OCPHODRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophobic organic carbon')
     562        1536 :     call addfld('a2x_DSTWET1',  horiz_only, 'A',  'kg/m2/s', 'wetdep of dust (bin1)')
     563        1536 :     call addfld('a2x_DSTDRY1',  horiz_only, 'A',  'kg/m2/s', 'drydep of dust (bin1)')
     564        1536 :     call addfld('a2x_DSTWET2',  horiz_only, 'A',  'kg/m2/s', 'wetdep of dust (bin2)')
     565        1536 :     call addfld('a2x_DSTDRY2',  horiz_only, 'A',  'kg/m2/s', 'drydep of dust (bin2)')
     566        1536 :     call addfld('a2x_DSTWET3',  horiz_only, 'A',  'kg/m2/s', 'wetdep of dust (bin3)')
     567        1536 :     call addfld('a2x_DSTDRY3',  horiz_only, 'A',  'kg/m2/s', 'drydep of dust (bin3)')
     568        1536 :     call addfld('a2x_DSTWET4',  horiz_only, 'A',  'kg/m2/s', 'wetdep of dust (bin4)')
     569        1536 :     call addfld('a2x_DSTDRY4',  horiz_only, 'A',  'kg/m2/s', 'drydep of dust (bin4)')
     570             : 
     571             :     ! defaults
     572        1536 :     if (history_amwg) then
     573        1536 :       call add_default (cnst_name(1), 1, ' ')
     574        1536 :       call add_default ('VQ      ', 1, ' ')
     575        1536 :       call add_default ('TMQ     ', 1, ' ')
     576        1536 :       call add_default ('PSL     ', 1, ' ')
     577        1536 :       call add_default ('RELHUM  ', 1, ' ')
     578             : 
     579        1536 :       call add_default ('DTCOND  ', 1, ' ')
     580        1536 :       call add_default ('PRECL   ', 1, ' ')
     581        1536 :       call add_default ('PRECC   ', 1, ' ')
     582        1536 :       call add_default ('PRECSL  ', 1, ' ')
     583        1536 :       call add_default ('PRECSC  ', 1, ' ')
     584        1536 :       call add_default ('SHFLX   ', 1, ' ')
     585        1536 :       call add_default ('LHFLX   ', 1, ' ')
     586        1536 :       call add_default ('QFLX    ', 1, ' ')
     587        1536 :       call add_default ('TAUX    ', 1, ' ')
     588        1536 :       call add_default ('TAUY    ', 1, ' ')
     589        1536 :       call add_default ('TREFHT  ', 1, ' ')
     590        1536 :       call add_default ('LANDFRAC', 1, ' ')
     591        1536 :       call add_default ('OCNFRAC ', 1, ' ')
     592        1536 :       call add_default ('QREFHT  ', 1, ' ')
     593        1536 :       call add_default ('U10     ', 1, ' ')
     594        1536 :       call add_default ('ICEFRAC ', 1, ' ')
     595        1536 :       call add_default ('TS      ', 1, ' ')
     596        1536 :       call add_default ('TSMN    ', 1, ' ')
     597        1536 :       call add_default ('TSMX    ', 1, ' ')
     598        1536 :       call add_default ('SNOWHLND', 1, ' ')
     599        1536 :       call add_default ('SNOWHICE', 1, ' ')
     600             :     end if
     601             : 
     602        1536 :     if (dycore_is('SE')) then
     603        1536 :       call add_default ('PSDRY', 1, ' ')
     604        1536 :       call add_default ('PMID',  1, ' ')
     605             :    end if
     606             : 
     607        1536 :     if (dycore_is('MPAS')) then
     608           0 :       call add_default ('PINT', 1, ' ')
     609           0 :       call add_default ('PMID',  1, ' ')
     610           0 :       call add_default ('PDEL',  1, ' ')
     611             :    end if
     612             : 
     613        1536 :     if (history_eddy) then
     614           0 :       call add_default ('VQ      ', 1, ' ')
     615             :     endif
     616             : 
     617        1536 :     if ( history_budget ) then
     618           0 :       call add_default (cnst_name(1), history_budget_histfile_num, ' ')
     619           0 :       call add_default ('PTTEND'          , history_budget_histfile_num, ' ')
     620           0 :       call add_default ('UTEND_PHYSTOT'   , history_budget_histfile_num, ' ')
     621           0 :       call add_default ('VTEND_PHYSTOT'   , history_budget_histfile_num, ' ')
     622           0 :       call add_default (ptendnam(       1), history_budget_histfile_num, ' ')
     623           0 :       if (ixcldliq > 0) then
     624           0 :          call add_default (ptendnam(ixcldliq), history_budget_histfile_num, ' ')
     625             :       end if
     626           0 :       if (ixcldice > 0) then
     627           0 :         call add_default (ptendnam(ixcldice), history_budget_histfile_num, ' ')
     628             :       end if
     629           0 :       if( history_budget_histfile_num > 1 ) then
     630           0 :         call add_default ('DTCOND  '         , history_budget_histfile_num, ' ')
     631             :       end if
     632             :     end if
     633             : 
     634        1536 :     if (history_vdiag) then
     635           0 :       call add_default ('PRECT   ', 2, ' ')
     636           0 :       call add_default ('PRECT   ', 3, ' ')
     637           0 :       call add_default ('PRECT   ', 4, ' ')
     638             :     end if
     639             : 
     640             :     ! Initial file - Optional fields
     641        1536 :     if (inithist_all.or.single_column) then
     642           0 :       call add_default ('CONCLD&IC  ',0, 'I')
     643           0 :       call add_default ('QCWAT&IC   ',0, 'I')
     644           0 :       call add_default ('TCWAT&IC   ',0, 'I')
     645           0 :       call add_default ('LCWAT&IC   ',0, 'I')
     646           0 :       call add_default ('PBLH&IC    ',0, 'I')
     647           0 :       call add_default ('TPERT&IC   ',0, 'I')
     648           0 :       call add_default ('QPERT&IC   ',0, 'I')
     649           0 :       call add_default ('CLOUD&IC   ',0, 'I')
     650           0 :       call add_default ('TKE&IC     ',0, 'I')
     651           0 :       call add_default ('CUSH&IC    ',0, 'I')
     652           0 :       call add_default ('KVH&IC     ',0, 'I')
     653           0 :       call add_default ('KVM&IC     ',0, 'I')
     654             :     end if
     655             : 
     656             :     ! determine number of constituents for which convective tendencies must be computed
     657        1536 :     if (history_budget) then
     658           0 :       dqcond_num = pcnst
     659             :     else
     660        1536 :       if (diag_cnst_conv_tend == 'none')   dqcond_num = 0
     661        1536 :       if (diag_cnst_conv_tend == 'q_only') dqcond_num = 1
     662        1536 :       if (diag_cnst_conv_tend == 'all')    dqcond_num = pcnst
     663             :     end if
     664             : 
     665        3072 :     do m = 1, dqcond_num
     666        3072 :       dcconnam(m) = 'DC'//cnst_name(m)
     667             :     end do
     668             : 
     669        1536 :     if ((diag_cnst_conv_tend == 'q_only') .or. (diag_cnst_conv_tend == 'all') .or. history_budget) then
     670        3072 :       call addfld (dcconnam(1),(/ 'lev' /),'A', 'kg/kg/s',trim(cnst_name(1))//' tendency due to moist processes')
     671        1536 :       if ( diag_cnst_conv_tend == 'q_only' .or. diag_cnst_conv_tend == 'all' ) then
     672        1536 :         call add_default (dcconnam(1),                           1, ' ')
     673             :       end if
     674        1536 :       if( history_budget ) then
     675           0 :         call add_default (dcconnam(1), history_budget_histfile_num, ' ')
     676             :       end if
     677        1536 :       if (diag_cnst_conv_tend == 'all' .or. history_budget) then
     678           0 :         do m = 2, pcnst
     679           0 :           call addfld (dcconnam(m),(/ 'lev' /),'A', 'kg/kg/s',trim(cnst_name(m))//' tendency due to moist processes')
     680           0 :           if( diag_cnst_conv_tend == 'all' ) then
     681           0 :             call add_default (dcconnam(m),                           1, ' ')
     682             :           end if
     683           0 :           if( history_budget .and. (m == ixcldliq .or. m == ixcldice) ) then
     684             :             call add_default (dcconnam(m), history_budget_histfile_num, ' ')
     685             :           end if
     686             :         end do
     687             :       end if
     688             :     end if
     689             : 
     690             :     ! Pbuf field indices for collecting output data
     691        1536 :     relhum_idx = pbuf_get_index('RELHUM',  errcode=ierr)
     692        1536 :     qcwat_idx  = pbuf_get_index('QCWAT',  errcode=ierr)
     693        1536 :     tcwat_idx  = pbuf_get_index('TCWAT',  errcode=ierr)
     694        1536 :     lcwat_idx  = pbuf_get_index('LCWAT',  errcode=ierr)
     695        1536 :     cld_idx    = pbuf_get_index('CLD',    errcode=ierr)
     696        1536 :     concld_idx = pbuf_get_index('CONCLD', errcode=ierr)
     697             : 
     698        1536 :     tke_idx  = pbuf_get_index('tke',  errcode=ierr)
     699        1536 :     kvm_idx  = pbuf_get_index('kvm',  errcode=ierr)
     700        1536 :     kvh_idx  = pbuf_get_index('kvh',  errcode=ierr)
     701        1536 :     cush_idx = pbuf_get_index('cush', errcode=ierr)
     702             : 
     703        1536 :     pblh_idx  = pbuf_get_index('pblh',  errcode=ierr)
     704        1536 :     tpert_idx = pbuf_get_index('tpert', errcode=ierr)
     705        1536 :     qpert_idx = pbuf_get_index('qpert', errcode=ierr)
     706             : 
     707        1536 :     prec_dp_idx  = pbuf_get_index('PREC_DP',  errcode=ierr)
     708        1536 :     snow_dp_idx  = pbuf_get_index('SNOW_DP',  errcode=ierr)
     709        1536 :     prec_sh_idx  = pbuf_get_index('PREC_SH',  errcode=ierr)
     710        1536 :     snow_sh_idx  = pbuf_get_index('SNOW_SH',  errcode=ierr)
     711        1536 :     prec_sed_idx = pbuf_get_index('PREC_SED', errcode=ierr)
     712        1536 :     snow_sed_idx = pbuf_get_index('SNOW_SED', errcode=ierr)
     713        1536 :     prec_pcw_idx = pbuf_get_index('PREC_PCW', errcode=ierr)
     714        1536 :     snow_pcw_idx = pbuf_get_index('SNOW_PCW', errcode=ierr)
     715             : 
     716        1536 :     if (is_first_step()) then
     717         768 :       call pbuf_set_field(pbuf2d, trefmxav_idx, -1.0e36_r8)
     718         768 :       call pbuf_set_field(pbuf2d, trefmnav_idx,  1.0e36_r8)
     719             :     end if
     720             : 
     721        1536 :   end subroutine diag_init_moist
     722             : 
     723        1536 :   subroutine diag_init(pbuf2d)
     724             : 
     725             :     ! Declare the history fields for which this module contains outfld calls.
     726             : 
     727             :     type(physics_buffer_desc), pointer, intent(in) :: pbuf2d(:,:)
     728             : 
     729             :     ! ----------------------------
     730             :     ! determine default variables
     731             :     ! ----------------------------
     732             :     call phys_getopts(history_amwg_out   = history_amwg    , &
     733             :          history_vdiag_out  = history_vdiag   , &
     734             :          history_eddy_out   = history_eddy    , &
     735             :          history_budget_out = history_budget  , &
     736             :          history_budget_histfile_num_out = history_budget_histfile_num, &
     737        1536 :          history_waccm_out  = history_waccm)
     738             : 
     739        1536 :     call diag_init_dry(pbuf2d)
     740        1536 :     if (moist_physics) then
     741        1536 :       call diag_init_moist(pbuf2d)
     742             :     end if
     743             : 
     744        1536 :   end subroutine diag_init
     745             : 
     746             : !===============================================================================
     747             : 
     748      370944 :   subroutine diag_allocate_dry()
     749             :     use infnan, only: nan, assignment(=)
     750             : 
     751             :     ! Allocate memory for module variables.
     752             :     ! Done at the begining of a physics step at same point as the pbuf allocate
     753             :     ! for variables with "physpkg" scope.
     754             : 
     755             :     ! Local variables
     756             :     character(len=*), parameter :: sub = 'diag_allocate_dry'
     757             :     character(len=128)          :: errmsg
     758             :     integer                     :: istat
     759             : 
     760     1112832 :     allocate(dtcond(pcols,pver,begchunk:endchunk), stat=istat)
     761      370944 :     if ( istat /= 0 ) then
     762           0 :       write(errmsg, '(2a,i0)') sub, ': allocate failed, stat = ',istat
     763           0 :       call endrun (errmsg)
     764             :     end if
     765      370944 :     dtcond = nan
     766      370944 :   end subroutine diag_allocate_dry
     767             : 
     768      370944 :   subroutine diag_allocate_moist()
     769             :     use infnan, only: nan, assignment(=)
     770             : 
     771             :     ! Allocate memory for module variables.
     772             :     ! Done at the begining of a physics step at same point as the pbuf allocate
     773             :     ! for variables with "physpkg" scope.
     774             : 
     775             :     ! Local variables
     776             :     character(len=*), parameter :: sub = 'diag_allocate_moist'
     777             :     character(len=128)          :: errmsg
     778             :     integer                     :: i, istat
     779             : 
     780      370944 :     if (dqcond_num > 0) then
     781     1483776 :       allocate(dqcond(dqcond_num))
     782      741888 :       do i = 1, dqcond_num
     783     1112832 :         allocate(dqcond(i)%cnst(pcols,pver,begchunk:endchunk), stat=istat)
     784      370944 :         if ( istat /= 0 ) then
     785           0 :           write(errmsg, '(2a,i0)') sub, ': allocate failed, stat = ',istat
     786           0 :           call endrun (errmsg)
     787             :         end if
     788      741888 :         dqcond(i)%cnst = nan
     789             :       end do
     790             :     end if
     791             : 
     792      370944 :   end subroutine diag_allocate_moist
     793             : 
     794      370944 :   subroutine diag_allocate()
     795             : 
     796      370944 :     call diag_allocate_dry()
     797      370944 :     if (moist_physics) then
     798      370944 :       call diag_allocate_moist()
     799             :     end if
     800             : 
     801      370944 :   end subroutine diag_allocate
     802             : 
     803             : !===============================================================================
     804             : 
     805      369408 :   subroutine diag_deallocate_dry()
     806             :     ! Deallocate memory for module variables.
     807             :     ! Done at the end of a physics step at same point as the pbuf deallocate for
     808             :     ! variables with "physpkg" scope.
     809             : 
     810             :     ! Local variables
     811             :     character(len=*), parameter :: sub = 'diag_deallocate_dry'
     812             :     integer :: istat
     813             : 
     814      369408 :     deallocate(dtcond, stat=istat)
     815           0 :     if ( istat /= 0 ) call endrun (sub//': ERROR: deallocate failed')
     816      369408 :   end subroutine diag_deallocate_dry
     817             : 
     818      369408 :   subroutine diag_deallocate_moist()
     819             : 
     820             :     ! Deallocate memory for module variables.
     821             :     ! Done at the end of a physics step at same point as the pbuf deallocate for
     822             :     ! variables with "physpkg" scope.
     823             : 
     824             :     ! Local variables
     825             :     character(len=*), parameter :: sub = 'diag_deallocate_moist'
     826             :     integer :: i, istat
     827             : 
     828      369408 :     if (dqcond_num > 0) then
     829      738816 :       do i = 1, dqcond_num
     830      369408 :         deallocate(dqcond(i)%cnst, stat=istat)
     831      369408 :         if ( istat /= 0 ) call endrun (sub//': ERROR: deallocate failed')
     832             :       end do
     833      738816 :       deallocate(dqcond, stat=istat)
     834           0 :       if ( istat /= 0 ) call endrun (sub//': ERROR: deallocate failed')
     835             :     end if
     836      369408 :   end subroutine diag_deallocate_moist
     837             : 
     838      369408 :   subroutine diag_deallocate()
     839             : 
     840      369408 :     call diag_deallocate_dry()
     841      369408 :     if (moist_physics) then
     842      369408 :       call diag_deallocate_moist()
     843             :     end if
     844             : 
     845      369408 :   end subroutine diag_deallocate
     846             : 
     847             : !===============================================================================
     848             : 
     849     1495368 :   subroutine diag_conv_tend_ini(state,pbuf)
     850             : 
     851             :     ! Initialize convective tendency calcs.
     852             : 
     853             :     ! Arguments:
     854             :     type(physics_state), intent(in) :: state
     855             :     type(physics_buffer_desc), pointer :: pbuf(:)
     856             : 
     857             :     ! Local variables:
     858             : 
     859             :     integer :: i, k, m, lchnk, ncol
     860     1495368 :     real(r8), pointer, dimension(:,:) :: t_ttend
     861     1495368 :     real(r8), pointer, dimension(:,:) :: t_utend
     862     1495368 :     real(r8), pointer, dimension(:,:) :: t_vtend
     863             : 
     864     1495368 :     lchnk = state%lchnk
     865     1495368 :     ncol  = state%ncol
     866             : 
     867   140564592 :     do k = 1, pver
     868  2323627992 :       do i = 1, ncol
     869  2322132624 :         dtcond(i,k,lchnk) = state%t(i,k)
     870             :       end do
     871             :     end do
     872             : 
     873     2990736 :     do m = 1, dqcond_num
     874   142059960 :       do k = 1, pver
     875  2323627992 :         do i = 1, ncol
     876  2322132624 :           dqcond(m)%cnst(i,k,lchnk) = state%q(i,k,m)
     877             :         end do
     878             :       end do
     879             :     end do
     880             : 
     881             :     !! initialize to pbuf T_TTEND to temperature at first timestep
     882     1495368 :     if (is_first_step()) then
     883        6192 :       do m = 1, dyn_time_lvls
     884       12384 :         call pbuf_get_field(pbuf, t_ttend_idx, t_ttend, start=(/1,1,m/), kount=(/pcols,pver,1/))
     885     4810824 :         t_ttend(:ncol,:) = state%t(:ncol,:)
     886       12384 :         call pbuf_get_field(pbuf, t_utend_idx, t_utend, start=(/1,1,m/), kount=(/pcols,pver,1/))
     887     4810824 :         t_utend(:ncol,:) = state%u(:ncol,:)
     888       12384 :         call pbuf_get_field(pbuf, t_vtend_idx, t_vtend, start=(/1,1,m/), kount=(/pcols,pver,1/))
     889     4813920 :         t_vtend(:ncol,:) = state%v(:ncol,:)
     890             :       end do
     891             :     end if
     892             : 
     893     1495368 :   end subroutine diag_conv_tend_ini
     894             : 
     895             : !===============================================================================
     896             : 
     897     1489176 :   subroutine diag_phys_writeout_dry(state, pbuf, p_surf_t)
     898             : 
     899             :     !-----------------------------------------------------------------------
     900             :     !
     901             :     ! Purpose: output dry physics diagnostics
     902             :     !
     903             :     !-----------------------------------------------------------------------
     904             :     use physconst,            only: gravit, rga, rair, cappa
     905             :     use time_manager,         only: get_nstep
     906             :     use interpolate_data,     only: vertinterp
     907             :     use tidal_diag,           only: tidal_diag_write
     908             :     use air_composition,      only: cpairv, rairv
     909             :     use cam_diagnostic_utils, only: cpslec
     910             :     !-----------------------------------------------------------------------
     911             :     !
     912             :     ! Arguments
     913             :     !
     914             :     type(physics_state), intent(inout) :: state
     915             :     type(physics_buffer_desc), pointer :: pbuf(:)
     916             :     real(r8),            intent(out)   :: p_surf_t(pcols, nsurf)  ! data interpolated to a pressure surface
     917             :     !
     918             :     !---------------------------Local workspace-----------------------------
     919             :     !
     920             :     real(r8) :: ftem(pcols,pver)  ! temporary workspace
     921             :     real(r8) :: z3(pcols,pver)    ! geo-potential height
     922             :     real(r8) :: p_surf(pcols)     ! data interpolated to a pressure surface
     923             :     real(r8) :: timestep(pcols)   ! used for outfld call
     924             : 
     925     1489176 :     real(r8), pointer :: psl(:)   ! Sea Level Pressure
     926             : 
     927             :     integer  :: i, k, m, lchnk, ncol, nstep
     928             :     !
     929             :     !-----------------------------------------------------------------------
     930             :     !
     931     1489176 :     lchnk = state%lchnk
     932     1489176 :     ncol  = state%ncol
     933             : 
     934             :     ! Output NSTEP for debugging
     935     2978352 :     nstep = get_nstep()
     936    24865776 :     timestep(:ncol) = nstep
     937     1489176 :     call outfld ('NSTEP   ',timestep, pcols, lchnk)
     938             : 
     939     1489176 :     call outfld('T       ',state%t , pcols   ,lchnk   )
     940     1489176 :     call outfld('PS      ',state%ps, pcols   ,lchnk   )
     941     1489176 :     call outfld('U       ',state%u , pcols   ,lchnk   )
     942     1489176 :     call outfld('V       ',state%v , pcols   ,lchnk   )
     943             : 
     944     1489176 :     call outfld('PHIS    ',state%phis,    pcols,   lchnk     )
     945             : 
     946     1489176 :     if (write_camiop) call outfld('phis    ',state%phis,    pcols,   lchnk     )
     947             : 
     948   543653136 :     call outfld( 'CPAIRV', cpairv(:ncol,:,lchnk), ncol, lchnk )
     949   543653136 :     call outfld( 'RAIRV', rairv(:ncol,:,lchnk), ncol, lchnk )
     950             : 
     951    62545392 :     do m = 1, pcnst
     952    62545392 :       if (cnst_cam_outfld(m)) then
     953    16380936 :         call outfld(cnst_name(m), state%q(1,1,m), pcols, lchnk)
     954             :       end if
     955             :     end do
     956             : 
     957             :     !
     958             :     ! Add height of surface to midpoint height above surface
     959             :     !
     960   139982544 :     do k = 1, pver
     961  2314006344 :       z3(:ncol,k) = state%zm(:ncol,k) + state%phis(:ncol)*rga
     962             :     end do
     963     1489176 :     call outfld('Z3      ',z3,pcols,lchnk)
     964             :     !
     965             :     ! Output Z3 on pressure surfaces
     966             :     !
     967     1489176 :     if (hist_fld_active('Z1000')) then
     968             :       call vertinterp(ncol, pcols, pver, state%pmid, 100000._r8, z3, p_surf, &
     969           0 :           extrapolate='Z', ln_interp=.true., ps=state%ps, phis=state%phis, tbot=state%t(:,pver))
     970           0 :       call outfld('Z1000    ', p_surf, pcols, lchnk)
     971             :     end if
     972     1489176 :     if (hist_fld_active('Z700')) then
     973             :       call vertinterp(ncol, pcols, pver, state%pmid, 70000._r8, z3, p_surf, &
     974           0 :           extrapolate='Z', ln_interp=.true., ps=state%ps, phis=state%phis, tbot=state%t(:,pver))
     975           0 :       call outfld('Z700    ', p_surf, pcols, lchnk)
     976             :     end if
     977     1489176 :     if (hist_fld_active('Z500')) then
     978             :       call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, z3, p_surf, &
     979           0 :           extrapolate='Z', ln_interp=.true., ps=state%ps, phis=state%phis, tbot=state%t(:,pver))
     980           0 :       call outfld('Z500    ', p_surf, pcols, lchnk)
     981             :     end if
     982     1489176 :     if (hist_fld_active('Z300')) then
     983           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 30000._r8, z3, p_surf, ln_interp=.true.)
     984           0 :       call outfld('Z300    ', p_surf, pcols, lchnk)
     985             :     end if
     986     1489176 :     if (hist_fld_active('Z200')) then
     987           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 20000._r8, z3, p_surf, ln_interp=.true.)
     988           0 :       call outfld('Z200    ', p_surf, pcols, lchnk)
     989             :     end if
     990     1489176 :     if (hist_fld_active('Z100')) then
     991           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 10000._r8, z3, p_surf, ln_interp=.true.)
     992           0 :       call outfld('Z100    ', p_surf, pcols, lchnk)
     993             :     end if
     994     1489176 :     if (hist_fld_active('Z050')) then
     995           0 :       call vertinterp(ncol, pcols, pver, state%pmid,  5000._r8, z3, p_surf, ln_interp=.true.)
     996           0 :       call outfld('Z050    ', p_surf, pcols, lchnk)
     997             :     end if
     998             :     !
     999             :     ! Quadratic height fiels Z3*Z3
    1000             :     !
    1001  2314006344 :     ftem(:ncol,:) = z3(:ncol,:)*z3(:ncol,:)
    1002     1489176 :     call outfld('ZZ      ',ftem,pcols,lchnk)
    1003             : 
    1004  2314006344 :     ftem(:ncol,:) = z3(:ncol,:)*state%v(:ncol,:)
    1005     1489176 :     call outfld('VZ      ',ftem,  pcols,lchnk)
    1006             :     !
    1007             :     ! Meridional advection fields
    1008             :     !
    1009  2314006344 :     ftem(:ncol,:) = state%v(:ncol,:)*state%t(:ncol,:)
    1010     1489176 :     call outfld ('VT      ',ftem    ,pcols   ,lchnk     )
    1011             : 
    1012  2314006344 :     ftem(:ncol,:) = state%v(:ncol,:)**2
    1013     1489176 :     call outfld ('VV      ',ftem    ,pcols   ,lchnk     )
    1014             : 
    1015  2314006344 :     ftem(:ncol,:) = state%v(:ncol,:) * state%u(:ncol,:)
    1016     1489176 :     call outfld ('VU      ',ftem    ,pcols   ,lchnk     )
    1017             :     !
    1018             :     ! zonal advection
    1019             :     !
    1020  2314006344 :     ftem(:ncol,:) = state%u(:ncol,:)**2
    1021     1489176 :     call outfld ('UU      ',ftem    ,pcols   ,lchnk     )
    1022             : 
    1023             :     ! Wind speed
    1024  2314006344 :     ftem(:ncol,:) = sqrt( state%u(:ncol,:)**2 + state%v(:ncol,:)**2)
    1025     1489176 :     call outfld ('WSPEED  ',ftem    ,pcols   ,lchnk     )
    1026     1489176 :     call outfld ('WSPDSRFMX',ftem(:,pver)   ,pcols   ,lchnk     )
    1027     1489176 :     call outfld ('WSPDSRFAV',ftem(:,pver)   ,pcols   ,lchnk     )
    1028             : 
    1029             :     ! Vertical velocity and advection
    1030             : 
    1031     1489176 :     if (single_column) then
    1032           0 :       call outfld('OMEGA   ',wfld,    pcols,   lchnk     )
    1033             :     else
    1034     1489176 :       call outfld('OMEGA   ',state%omega,    pcols,   lchnk     )
    1035             :     endif
    1036             : 
    1037     1489176 :     if (write_camiop) call outfld('omega   ',state%omega,    pcols,   lchnk     )
    1038             : 
    1039  2314006344 :     ftem(:ncol,:) = state%omega(:ncol,:)*state%t(:ncol,:)
    1040     1489176 :     call outfld('OMEGAT  ',ftem,    pcols,   lchnk     )
    1041  2314006344 :     ftem(:ncol,:) = state%omega(:ncol,:)*state%u(:ncol,:)
    1042     1489176 :     call outfld('OMEGAU  ',ftem,    pcols,   lchnk     )
    1043  2314006344 :     ftem(:ncol,:) = state%omega(:ncol,:)*state%v(:ncol,:)
    1044     1489176 :     call outfld('OMEGAV  ',ftem,    pcols,   lchnk     )
    1045  2314006344 :     ftem(:ncol,:) = state%omega(:ncol,:)*state%omega(:ncol,:)
    1046     1489176 :     call outfld('OMGAOMGA',ftem,    pcols,   lchnk     )
    1047             :     !
    1048             :     ! Output omega at 850 and 500 mb pressure levels
    1049             :     !
    1050     1489176 :     if (hist_fld_active('OMEGA850')) then
    1051           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%omega, p_surf)
    1052           0 :       call outfld('OMEGA850', p_surf, pcols, lchnk)
    1053             :     end if
    1054     1489176 :     if (hist_fld_active('OMEGA500')) then
    1055           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, state%omega, p_surf)
    1056           0 :       call outfld('OMEGA500', p_surf, pcols, lchnk)
    1057             :     end if
    1058             : 
    1059             :     ! Sea level pressure
    1060     1489176 :     call pbuf_get_field(pbuf, psl_idx, psl)
    1061     1489176 :     call cpslec(ncol, state%pmid, state%phis, state%ps, state%t, psl, gravit, rair)
    1062     1489176 :     call outfld('PSL', psl, pcols, lchnk)
    1063             : 
    1064             :     ! Output T,u,v fields on pressure surfaces
    1065             :     !
    1066     1489176 :     if (hist_fld_active('T850')) then
    1067             :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%t, p_surf, &
    1068           0 :           extrapolate='T', ps=state%ps, phis=state%phis)
    1069           0 :       call outfld('T850    ', p_surf, pcols, lchnk )
    1070             :     end if
    1071     1489176 :     if (hist_fld_active('T500')) then
    1072             :       call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, state%t, p_surf, &
    1073           0 :           extrapolate='T', ps=state%ps, phis=state%phis)
    1074           0 :       call outfld('T500    ', p_surf, pcols, lchnk )
    1075             :     end if
    1076     1489176 :     if (hist_fld_active('T400')) then
    1077             :       call vertinterp(ncol, pcols, pver, state%pmid, 40000._r8, state%t, p_surf, &
    1078           0 :           extrapolate='T', ps=state%ps, phis=state%phis)
    1079           0 :       call outfld('T400    ', p_surf, pcols, lchnk )
    1080             :     end if
    1081     1489176 :     if (hist_fld_active('T300')) then
    1082           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 30000._r8, state%t, p_surf)
    1083           0 :       call outfld('T300    ', p_surf, pcols, lchnk )
    1084             :     end if
    1085     1489176 :     if (hist_fld_active('T200')) then
    1086           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 20000._r8, state%t, p_surf)
    1087           0 :       call outfld('T200    ', p_surf, pcols, lchnk )
    1088             :     end if
    1089     1489176 :     if (hist_fld_active('U850')) then
    1090           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%u, p_surf)
    1091           0 :       call outfld('U850    ', p_surf, pcols, lchnk )
    1092             :     end if
    1093     1489176 :     if (hist_fld_active('U500')) then
    1094           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, state%u, p_surf)
    1095           0 :       call outfld('U500    ', p_surf, pcols, lchnk )
    1096             :     end if
    1097     1489176 :     if (hist_fld_active('U250')) then
    1098           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 25000._r8, state%u, p_surf)
    1099           0 :       call outfld('U250    ', p_surf, pcols, lchnk )
    1100             :     end if
    1101     1489176 :     if (hist_fld_active('U200')) then
    1102           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 20000._r8, state%u, p_surf)
    1103           0 :       call outfld('U200    ', p_surf, pcols, lchnk )
    1104             :     end if
    1105     1489176 :     if (hist_fld_active('U010')) then
    1106           0 :       call vertinterp(ncol, pcols, pver, state%pmid,  1000._r8, state%u, p_surf)
    1107           0 :       call outfld('U010    ', p_surf, pcols, lchnk )
    1108             :     end if
    1109     1489176 :     if (hist_fld_active('V850')) then
    1110           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%v, p_surf)
    1111           0 :       call outfld('V850    ', p_surf, pcols, lchnk )
    1112             :     end if
    1113     1489176 :     if (hist_fld_active('V500')) then
    1114           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, state%v, p_surf)
    1115           0 :       call outfld('V500    ', p_surf, pcols, lchnk )
    1116             :     end if
    1117     1489176 :     if (hist_fld_active('V250')) then
    1118           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 25000._r8, state%v, p_surf)
    1119           0 :       call outfld('V250    ', p_surf, pcols, lchnk )
    1120             :     end if
    1121     1489176 :     if (hist_fld_active('V200')) then
    1122           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 20000._r8, state%v, p_surf)
    1123           0 :       call outfld('V200    ', p_surf, pcols, lchnk )
    1124             :     end if
    1125             : 
    1126  2314006344 :     ftem(:ncol,:) = state%t(:ncol,:)*state%t(:ncol,:)
    1127     1489176 :     call outfld('TT      ',ftem    ,pcols   ,lchnk   )
    1128             :     !
    1129             :     ! Output U, V, T, P and Z at bottom level
    1130             :     !
    1131     1489176 :     call outfld ('UBOT    ', state%u(1,pver)  ,  pcols, lchnk)
    1132     1489176 :     call outfld ('VBOT    ', state%v(1,pver)  ,  pcols, lchnk)
    1133     1489176 :     call outfld ('ZBOT    ', state%zm(1,pver) , pcols, lchnk)
    1134             : 
    1135             :     !! Boundary layer atmospheric stability, temperature, water vapor diagnostics
    1136             : 
    1137   102753144 :     p_surf_t = -99.0_r8 ! Uninitialized to impossible value
    1138             :     if  (hist_fld_active('T1000')     .or. &
    1139             :          hist_fld_active('T9251000')  .or. &
    1140             :          hist_fld_active('TH9251000') .or. &
    1141             :          hist_fld_active('T8501000')  .or. &
    1142             :          hist_fld_active('TH8501000') .or. &
    1143     1489176 :          hist_fld_active('T7001000')  .or. &
    1144             :          hist_fld_active('TH7001000')) then
    1145           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 100000._r8, state%t, p_surf_t(:,surf_100000))
    1146             :     end if
    1147             : 
    1148             :     if ( hist_fld_active('T925')       .or. &
    1149     1489176 :          hist_fld_active('T9251000')   .or. &
    1150             :          hist_fld_active('TH9251000')) then
    1151           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 92500._r8, state%t, p_surf_t(:,surf_092500))
    1152             :     end if
    1153             : 
    1154             : !!! at 1000 mb and 925 mb
    1155     1489176 :     if (hist_fld_active('T1000')) then
    1156           0 :       call outfld('T1000    ', p_surf_t(:,surf_100000), pcols, lchnk )
    1157             :     end if
    1158             : 
    1159     1489176 :     if (hist_fld_active('T925')) then
    1160           0 :       call outfld('T925    ', p_surf_t(:,surf_092500), pcols, lchnk )
    1161             :     end if
    1162             : 
    1163     1489176 :     if (hist_fld_active('T9251000')) then
    1164           0 :       p_surf = p_surf_t(:,surf_092500) - p_surf_t(:,surf_100000)
    1165           0 :       call outfld('T9251000    ', p_surf, pcols, lchnk )
    1166             :     end if
    1167             : 
    1168     1489176 :     if (hist_fld_active('TH9251000')) then
    1169           0 :       p_surf = (p_surf_t(:,surf_092500)*(1000.0_r8/925.0_r8)**cappa) - (p_surf_t(:,surf_100000)*(1.0_r8)**cappa)
    1170           0 :       call outfld('TH9251000    ', p_surf, pcols, lchnk )
    1171             :     end if
    1172             : 
    1173     1489176 :     if (hist_fld_active('T8501000')  .or. &
    1174             :          hist_fld_active('TH8501000')) then
    1175           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%t, p_surf_t(:,surf_085000))
    1176             :     end if
    1177             : 
    1178             : !!! at 1000 mb and 850 mb
    1179     1489176 :     if (hist_fld_active('T8501000')) then
    1180           0 :       p_surf = p_surf_t(:,surf_085000)-p_surf_t(:,surf_100000)
    1181           0 :       call outfld('T8501000    ', p_surf, pcols, lchnk )
    1182             :     end if
    1183             : 
    1184     1489176 :     if (hist_fld_active('TH8501000')) then
    1185           0 :       p_surf = (p_surf_t(:,surf_085000)*(1000.0_r8/850.0_r8)**cappa)-(p_surf_t(:,surf_100000)*(1.0_r8)**cappa)
    1186           0 :       call outfld('TH8501000    ', p_surf, pcols, lchnk )
    1187             :     end if
    1188             : 
    1189             :     if (hist_fld_active('T7001000')  .or. &
    1190     1489176 :          hist_fld_active('TH7001000') .or. &
    1191             :          hist_fld_active('T700')) then
    1192           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 70000._r8, state%t, p_surf_t(:,surf_070000))
    1193             :     end if
    1194             : 
    1195             : !!! at 700 mb
    1196     1489176 :     if (hist_fld_active('T700')) then
    1197           0 :       call outfld('T700    ', p_surf_t(:,surf_070000), pcols, lchnk )
    1198             :     end if
    1199             : 
    1200             : !!! at 1000 mb and 700 mb
    1201     1489176 :     if (hist_fld_active('T7001000')) then
    1202           0 :       p_surf = p_surf_t(:,surf_070000)-p_surf_t(:,surf_100000)
    1203           0 :       call outfld('T7001000    ', p_surf, pcols, lchnk )
    1204             :     end if
    1205             : 
    1206     1489176 :     if (hist_fld_active('TH7001000')) then
    1207           0 :       p_surf = (p_surf_t(:,surf_070000)*(1000.0_r8/700.0_r8)**cappa)-(p_surf_t(:,surf_100000)*(1.0_r8)**cappa)
    1208           0 :       call outfld('TH7001000    ', p_surf, pcols, lchnk )
    1209             :     end if
    1210             : 
    1211     1489176 :     if (hist_fld_active('T010')) then
    1212           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 1000._r8, state%t, p_surf)
    1213           0 :       call outfld('T010           ', p_surf, pcols, lchnk )
    1214             :     end if
    1215             : 
    1216             :     !---------------------------------------------------------
    1217             :     ! tidal diagnostics
    1218             :     !---------------------------------------------------------
    1219     1489176 :     call tidal_diag_write(state)
    1220             : 
    1221     1489176 :     return
    1222     2978352 :   end subroutine diag_phys_writeout_dry
    1223             : 
    1224             : !===============================================================================
    1225             : 
    1226     1489176 :   subroutine diag_phys_writeout_moist(state, pbuf, p_surf_t)
    1227             : 
    1228             :     !-----------------------------------------------------------------------
    1229             :     !
    1230             :     ! Purpose: record dynamics variables on physics grid
    1231             :     !
    1232             :     !-----------------------------------------------------------------------
    1233     1489176 :     use physconst,          only: gravit, rga, rair, cpair, latvap, rearth, cappa
    1234             :     use interpolate_data,   only: vertinterp
    1235             :     use constituent_burden, only: constituent_burden_comp
    1236             :     use co2_cycle,          only: c_i, co2_transport
    1237             :     !-----------------------------------------------------------------------
    1238             :     !
    1239             :     ! Arguments
    1240             :     !
    1241             :     type(physics_state), intent(inout) :: state
    1242             :     type(physics_buffer_desc), pointer :: pbuf(:)
    1243             :     real(r8),            intent(inout) :: p_surf_t(pcols, nsurf)  ! data interpolated to a pressure surface
    1244             :     !
    1245             :     !---------------------------Local workspace-----------------------------
    1246             :     !
    1247             :     real(r8) :: ftem(pcols,pver) ! temporary workspace
    1248             :     real(r8) :: ftem1(pcols,pver) ! another temporary workspace
    1249             :     real(r8) :: ftem2(pcols,pver) ! another temporary workspace
    1250             :     real(r8) :: p_surf(pcols)    ! data interpolated to a pressure surface
    1251             :     real(r8) :: p_surf_q1(pcols)    ! data interpolated to a pressure surface
    1252             :     real(r8) :: p_surf_q2(pcols)    ! data interpolated to a pressure surface
    1253             :     real(r8) :: tem2(pcols,pver) ! temporary workspace
    1254             :     real(r8) :: esl(pcols,pver)   ! saturation vapor pressures
    1255             :     real(r8) :: esi(pcols,pver)   !
    1256             : 
    1257     1489176 :     real(r8), pointer :: ftem_ptr(:,:)
    1258             : 
    1259             :     integer :: i, k, m, lchnk, ncol
    1260             :     integer :: ixq, ierr
    1261             :     !
    1262             :     !-----------------------------------------------------------------------
    1263             :     !
    1264     1489176 :     lchnk = state%lchnk
    1265     1489176 :     ncol  = state%ncol
    1266             : 
    1267     1489176 :     call cnst_get_ind('Q', ixq)
    1268             : 
    1269     1489176 :     if (co2_transport()) then
    1270           0 :       do m = 1,4
    1271           0 :         call outfld(trim(cnst_name(c_i(m)))//'_BOT', state%q(1,pver,c_i(m)), pcols, lchnk)
    1272             :       end do
    1273             :     end if
    1274             : 
    1275             :     ! column burdens of all constituents except water vapor
    1276     1489176 :     call constituent_burden_comp(state)
    1277             : 
    1278     1489176 :     call outfld('PSDRY',   state%psdry,   pcols, lchnk)
    1279     1489176 :     call outfld('PMID',    state%pmid,    pcols, lchnk)
    1280     1489176 :     call outfld('PINT',    state%pint,    pcols, lchnk)
    1281     1489176 :     call outfld('PDELDRY', state%pdeldry, pcols, lchnk)
    1282     1489176 :     call outfld('PDEL',    state%pdel,    pcols, lchnk)
    1283             : 
    1284             :     !
    1285             :     ! Meridional advection fields
    1286             :     !
    1287  2314006344 :     ftem(:ncol,:) = state%v(:ncol,:)*state%q(:ncol,:,ixq)
    1288     1489176 :     call outfld ('VQ      ',ftem    ,pcols   ,lchnk     )
    1289             : 
    1290  2314006344 :     ftem(:ncol,:) = state%q(:ncol,:,1)*state%q(:ncol,:,ixq)
    1291     1489176 :     call outfld ('QQ      ',ftem    ,pcols   ,lchnk     )
    1292             : 
    1293             :     ! Vertical velocity and advection
    1294  2314006344 :     ftem(:ncol,:) = state%omega(:ncol,:)*state%q(:ncol,:,ixq)
    1295     1489176 :     call outfld('OMEGAQ  ',ftem,    pcols,   lchnk     )
    1296             :     !
    1297             :     ! Mass of q, by layer and vertically integrated
    1298             :     !
    1299  2314006344 :     ftem(:ncol,:) = state%q(:ncol,:,ixq) * state%pdel(:ncol,:) * rga
    1300     1489176 :     call outfld ('MQ      ',ftem    ,pcols   ,lchnk     )
    1301             : 
    1302   138493368 :     do k=2,pver
    1303  2289140568 :       ftem(:ncol,1) = ftem(:ncol,1) + ftem(:ncol,k)
    1304             :     end do
    1305     1489176 :     call outfld ('TMQ     ',ftem, pcols   ,lchnk     )
    1306             :     !
    1307             :     ! Integrated vapor transport calculation
    1308             :     !
    1309             :     !compute uq*dp/g and vq*dp/g
    1310  2314006344 :     ftem1(:ncol,:) = state%q(:ncol,:,ixq) * state%u(:ncol,:) *state%pdel(:ncol,:) * rga
    1311  2314006344 :     ftem2(:ncol,:) = state%q(:ncol,:,ixq) * state%v(:ncol,:) *state%pdel(:ncol,:) * rga
    1312             : 
    1313   138493368 :     do k=2,pver
    1314  2287651392 :        ftem1(:ncol,1) = ftem1(:ncol,1) + ftem1(:ncol,k)
    1315  2289140568 :        ftem2(:ncol,1) = ftem2(:ncol,1) + ftem2(:ncol,k)
    1316             :     end do
    1317             :     ! compute ivt
    1318    24865776 :     ftem(:ncol,1) = sqrt( ftem1(:ncol,1)**2 + ftem2(:ncol,1)**2)
    1319             : 
    1320     1489176 :     call outfld ('IVT     ',ftem, pcols   ,lchnk     )
    1321             : 
    1322             :     ! output uq*dp/g
    1323     1489176 :     call outfld ('uIVT     ',ftem1, pcols   ,lchnk     )
    1324             : 
    1325             :     ! output vq*dp/g
    1326     1489176 :     call outfld ('vIVT     ',ftem2, pcols   ,lchnk     )
    1327             :     !
    1328             :     ! Relative humidity
    1329             :     !
    1330     1489176 :     if (hist_fld_active('RELHUM')) then
    1331     1489176 :        if (relhum_idx > 0) then
    1332           0 :           call pbuf_get_field(pbuf, relhum_idx, ftem_ptr)
    1333           0 :           ftem(:ncol,:) = ftem_ptr(:ncol,:)
    1334             :        else
    1335   139982544 :           do k = 1, pver
    1336   139982544 :              call qsat(state%t(1:ncol,k), state%pmid(1:ncol,k), tem2(1:ncol,k), ftem(1:ncol,k), ncol)
    1337             :           end do
    1338  2314006344 :           ftem(:ncol,:) = state%q(:ncol,:,ixq)/ftem(:ncol,:)*100._r8
    1339             :        end if
    1340     1489176 :        call outfld ('RELHUM  ',ftem    ,pcols   ,lchnk     )
    1341             :     end if
    1342             : 
    1343     1489176 :     if (hist_fld_active('RHW') .or. hist_fld_active('RHI') .or. hist_fld_active('RHCFMIP') ) then
    1344             : 
    1345             :       ! RH w.r.t liquid (water)
    1346           0 :       do k = 1, pver
    1347           0 :          call qsat_water (state%t(1:ncol,k), state%pmid(1:ncol,k), esl(1:ncol,k), ftem(1:ncol,k), ncol)
    1348             :       end do
    1349           0 :       ftem(:ncol,:) = state%q(:ncol,:,ixq)/ftem(:ncol,:)*100._r8
    1350           0 :       call outfld ('RHW  ',ftem    ,pcols   ,lchnk     )
    1351             : 
    1352             :       ! Convert to RHI (ice)
    1353           0 :       do k=1,pver
    1354           0 :          call svp_ice_vect(state%t(1:ncol,k), esi(1:ncol,k), ncol)
    1355           0 :          do i=1,ncol
    1356           0 :             ftem1(i,k)=ftem(i,k)*esl(i,k)/esi(i,k)
    1357             :          end do
    1358             :       end do
    1359           0 :       call outfld ('RHI  ',ftem1    ,pcols   ,lchnk     )
    1360             : 
    1361             :       ! use temperature to decide if you populate with ftem (liquid, above 0 C) or ftem1 (ice, below 0 C)
    1362             : 
    1363           0 :       ftem2(:ncol,:)=ftem(:ncol,:)
    1364             : 
    1365           0 :       do i=1,ncol
    1366           0 :         do k=1,pver
    1367           0 :           if (state%t(i,k) .gt. 273) then
    1368           0 :             ftem2(i,k)=ftem(i,k)  !!wrt water
    1369             :           else
    1370           0 :             ftem2(i,k)=ftem1(i,k) !!wrt ice
    1371             :           end if
    1372             :         end do
    1373             :       end do
    1374             : 
    1375           0 :       call outfld ('RHCFMIP  ',ftem2    ,pcols   ,lchnk     )
    1376             : 
    1377             :     end if
    1378             :     !
    1379             :     ! Output q field on pressure surfaces
    1380             :     !
    1381     1489176 :     if (hist_fld_active('Q850')) then
    1382           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%q(1,1,ixq), p_surf)
    1383           0 :       call outfld('Q850    ', p_surf, pcols, lchnk )
    1384             :     end if
    1385     1489176 :     if (hist_fld_active('Q200')) then
    1386           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 20000._r8, state%q(1,1,ixq), p_surf)
    1387           0 :       call outfld('Q200    ', p_surf, pcols, lchnk )
    1388             :     end if
    1389             :     !
    1390             :     ! Output Q at bottom level
    1391             :     !
    1392     1489176 :     call outfld ('QBOT    ', state%q(1,pver,ixq),  pcols, lchnk)
    1393             : 
    1394             :     ! Total energy of the atmospheric column for atmospheric heat storage calculations
    1395             : 
    1396             :     !! temporary variable to get surface geopotential in dimensions of (ncol,pver)
    1397   139982544 :     do k=1,pver
    1398  2314006344 :       ftem1(:ncol,k)=state%phis(:ncol)  !! surface geopotential in units (m2/s2)
    1399             :     end do
    1400             : 
    1401             :     !! calculate sum of sensible, kinetic, latent, and surface geopotential energy
    1402             :     !! E=CpT+PHIS+Lv*q+(0.5)*(u^2+v^2)
    1403     1489176 :     ftem(:ncol,:) = (cpair*state%t(:ncol,:) +  ftem1(:ncol,:) + latvap*state%q(:ncol,:,ixq) + &
    1404  2315495520 :          0.5_r8*(state%u(:ncol,:)**2+state%v(:ncol,:)**2))*(state%pdel(:ncol,:)/gravit)
    1405             :     !! vertically integrate
    1406   138493368 :     do k=2,pver
    1407  2289140568 :       ftem(:ncol,1) = ftem(:ncol,1) + ftem(:ncol,k)
    1408             :     end do
    1409     1489176 :     call outfld ('ATMEINT   ', ftem(:ncol,1), ncol, lchnk)
    1410             : 
    1411             :     !! Boundary layer atmospheric stability, temperature, water vapor diagnostics
    1412             : 
    1413             :     if ( hist_fld_active('THE9251000') .or. &
    1414     1489176 :          hist_fld_active('THE8501000') .or. &
    1415             :          hist_fld_active('THE7001000')) then
    1416           0 :       if (p_surf_t(1, surf_100000) < 0.0_r8) then
    1417           0 :         call vertinterp(ncol, pcols, pver, state%pmid, 100000._r8, state%t, p_surf_t(:, surf_100000))
    1418             :       end if
    1419             :     end if
    1420             : 
    1421     1489176 :     if ( hist_fld_active('TH9251000')  .or. &
    1422             :          hist_fld_active('THE9251000')) then
    1423           0 :       if (p_surf_t(1, surf_092500) < 0.0_r8) then
    1424           0 :         call vertinterp(ncol, pcols, pver, state%pmid, 92500._r8, state%t, p_surf_t(:, surf_092500))
    1425             :       end if
    1426             :     end if
    1427             : 
    1428             :     if ( hist_fld_active('Q1000')      .or. &
    1429             :          hist_fld_active('THE9251000') .or. &
    1430     1489176 :          hist_fld_active('THE8501000') .or. &
    1431             :          hist_fld_active('THE7001000')) then
    1432           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 100000._r8, state%q(1,1,ixq), p_surf_q1)
    1433             :     end if
    1434             : 
    1435     1489176 :     if (hist_fld_active('THE9251000') .or. &
    1436             :         hist_fld_active('Q925')) then
    1437           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 92500._r8, state%q(1,1,ixq), p_surf_q2)
    1438             :     end if
    1439             : 
    1440             : !!! at 1000 mb and 925 mb
    1441     1489176 :     if (hist_fld_active('Q1000')) then
    1442           0 :       call outfld('Q1000    ', p_surf_q1, pcols, lchnk )
    1443             :     end if
    1444             : 
    1445     1489176 :     if (hist_fld_active('Q925')) then
    1446           0 :       call outfld('Q925    ', p_surf_q2, pcols, lchnk )
    1447             :     end if
    1448             : 
    1449     1489176 :     if (hist_fld_active('THE9251000')) then
    1450             :       p_surf = ((p_surf_t(:, surf_092500)*(1000.0_r8/925.0_r8)**cappa) *              &
    1451             :                 exp((2500000.0_r8*p_surf_q2)/(1004.0_r8*p_surf_t(:, surf_092500)))) - &
    1452           0 :                 (p_surf_t(:,surf_100000)*(1.0_r8)**cappa)*exp((2500000.0_r8*p_surf_q1)/(1004.0_r8*p_surf_t(:,surf_100000)))
    1453           0 :       call outfld('THE9251000    ', p_surf, pcols, lchnk )
    1454             :     end if
    1455             : 
    1456     1489176 :     if (hist_fld_active('THE8501000')) then
    1457           0 :       if (p_surf_t(1, surf_085000) < 0.0_r8) then
    1458           0 :         call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%t, p_surf_t(:, surf_085000))
    1459             :       end if
    1460             :     end if
    1461             : 
    1462             : !!! at 1000 mb and 850 mb
    1463     1489176 :     if (hist_fld_active('THE8501000')) then
    1464           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 85000._r8, state%q(1,1,ixq), p_surf_q2)
    1465             :       p_surf = ((p_surf_t(:, surf_085000)*(1000.0_r8/850.0_r8)**cappa) *              &
    1466             :                 exp((2500000.0_r8*p_surf_q2)/(1004.0_r8*p_surf_t(:, surf_085000)))) - &
    1467           0 :                 (p_surf_t(:,surf_100000)*(1.0_r8)**cappa)*exp((2500000.0_r8*p_surf_q1)/(1004.0_r8*p_surf_t(:,surf_100000)))
    1468           0 :       call outfld('THE8501000    ', p_surf, pcols, lchnk )
    1469             :     end if
    1470             : 
    1471     1489176 :     if (hist_fld_active('THE7001000')) then
    1472           0 :       if (p_surf_t(1, surf_070000) < 0.0_r8) then
    1473           0 :         call vertinterp(ncol, pcols, pver, state%pmid, 70000._r8, state%t, p_surf_t(:, surf_070000))
    1474             :       end if
    1475             :     end if
    1476             : 
    1477             : !!! at 1000 mb and 700 mb
    1478     1489176 :     if (hist_fld_active('THE7001000')) then
    1479           0 :       call vertinterp(ncol, pcols, pver, state%pmid, 70000._r8, state%q(1,1,ixq), p_surf_q2)
    1480             :       p_surf = ((p_surf_t(:, surf_070000)*(1000.0_r8/700.0_r8)**cappa) *              &
    1481             :                 exp((2500000.0_r8*p_surf_q2)/(1004.0_r8*p_surf_t(:, surf_070000)))) - &
    1482           0 :                 (p_surf_t(:,surf_100000)*(1.0_r8)**cappa)*exp((2500000.0_r8*p_surf_q1)/(1004.0_r8*p_surf_t(:,surf_100000)))
    1483           0 :       call outfld('THE7001000    ', p_surf, pcols, lchnk )
    1484             :     end if
    1485             : 
    1486     1489176 :     return
    1487     2978352 :   end subroutine diag_phys_writeout_moist
    1488             : 
    1489             : !===============================================================================
    1490             : 
    1491     1489176 :   subroutine diag_phys_writeout(state, pbuf)
    1492             : 
    1493             :     !-----------------------------------------------------------------------
    1494             :     !
    1495             :     ! Arguments
    1496             :     !
    1497             :     type(physics_state), intent(inout) :: state
    1498             :     type(physics_buffer_desc), pointer :: pbuf(:)
    1499             : 
    1500             :     ! Local variable
    1501             :     real(r8) :: p_surf_t(pcols, nsurf)  ! data interpolated to a pressure surface
    1502             : 
    1503     1489176 :     call diag_phys_writeout_dry(state, pbuf, p_surf_t)
    1504             : 
    1505     1489176 :     if (moist_physics) then
    1506     1489176 :       call diag_phys_writeout_moist(state, pbuf, p_surf_t)
    1507             :     end if
    1508             : 
    1509     1489176 :   end subroutine diag_phys_writeout
    1510             : 
    1511             : !===============================================================================
    1512             : 
    1513     4467528 :   subroutine diag_clip_tend_writeout(state, ptend, ncol, lchnk, ixcldliq, ixcldice, ixq, ztodt, rtdt)
    1514             : 
    1515             :     !-----------------------------------------------------------------------
    1516             :     !
    1517             :     ! Arguments
    1518             :     !
    1519             :     type(physics_state), intent(in) :: state
    1520             :     type(physics_ptend), intent(in) :: ptend
    1521             :     integer  :: ncol
    1522             :     integer  :: lchnk
    1523             :     integer  :: ixcldliq
    1524             :     integer  :: ixcldice
    1525             :     integer  :: ixq
    1526             :     real(r8) :: ztodt
    1527             :     real(r8) :: rtdt
    1528             : 
    1529             :     ! Local variables
    1530             : 
    1531             :     ! Debugging output to look at ice tendencies due to hard clipping negative values
    1532             :     real(r8) :: preclipice(pcols,pver)
    1533             :     real(r8) :: icecliptend(pcols,pver)
    1534             :     real(r8) :: preclipliq(pcols,pver)
    1535             :     real(r8) :: liqcliptend(pcols,pver)
    1536             :     real(r8) :: preclipvap(pcols,pver)
    1537             :     real(r8) :: vapcliptend(pcols,pver)
    1538             : 
    1539             :     ! Initialize to zero
    1540     4467528 :     liqcliptend(:,:) = 0._r8
    1541     4467528 :     icecliptend(:,:) = 0._r8
    1542     4467528 :     vapcliptend(:,:) = 0._r8
    1543             : 
    1544  6942019032 :     preclipliq(:ncol,:) = state%q(:ncol,:,ixcldliq)+(ptend%q(:ncol,:,ixcldliq)*ztodt)
    1545  6942019032 :     preclipice(:ncol,:) = state%q(:ncol,:,ixcldice)+(ptend%q(:ncol,:,ixcldice)*ztodt)
    1546  6942019032 :     preclipvap(:ncol,:) = state%q(:ncol,:,ixq)+(ptend%q(:ncol,:,ixq)*ztodt)
    1547  6942019032 :     vapcliptend(:ncol,:) = (state%q(:ncol,:,ixq)-preclipvap(:ncol,:))*rtdt
    1548  6942019032 :     icecliptend(:ncol,:) = (state%q(:ncol,:,ixcldice)-preclipice(:ncol,:))*rtdt
    1549  6942019032 :     liqcliptend(:ncol,:) = (state%q(:ncol,:,ixcldliq)-preclipliq(:ncol,:))*rtdt
    1550             : 
    1551     4467528 :     call outfld('INEGCLPTEND', icecliptend, pcols, lchnk   )
    1552     4467528 :     call outfld('LNEGCLPTEND', liqcliptend, pcols, lchnk   )
    1553     4467528 :     call outfld('VNEGCLPTEND', vapcliptend, pcols, lchnk   )
    1554             : 
    1555     4467528 :   end subroutine diag_clip_tend_writeout
    1556             : 
    1557             : !===============================================================================
    1558             : 
    1559     1489176 :   subroutine diag_conv(state, ztodt, pbuf)
    1560             : 
    1561             :     !-----------------------------------------------------------------------
    1562             :     !
    1563             :     ! Output diagnostics associated with all convective processes.
    1564             :     !
    1565             :     !-----------------------------------------------------------------------
    1566             :     use tidal_diag,    only: get_tidal_coeffs
    1567             : 
    1568             :     ! Arguments:
    1569             : 
    1570             :     real(r8),            intent(in) :: ztodt   ! timestep for computing physics tendencies
    1571             :     type(physics_state), intent(in) :: state
    1572             :     type(physics_buffer_desc), pointer :: pbuf(:)
    1573             : 
    1574             :     ! convective precipitation variables
    1575     1489176 :     real(r8), pointer :: prec_dp(:)                 ! total precipitation   from ZM convection
    1576     1489176 :     real(r8), pointer :: snow_dp(:)                 ! snow from ZM   convection
    1577     1489176 :     real(r8), pointer :: prec_sh(:)                 ! total precipitation   from Hack convection
    1578     1489176 :     real(r8), pointer :: snow_sh(:)                 ! snow from   Hack   convection
    1579     1489176 :     real(r8), pointer :: prec_sed(:)                ! total precipitation   from ZM convection
    1580     1489176 :     real(r8), pointer :: snow_sed(:)                ! snow from ZM   convection
    1581     1489176 :     real(r8), pointer :: prec_pcw(:)                ! total precipitation   from Hack convection
    1582     1489176 :     real(r8), pointer :: snow_pcw(:)                ! snow from Hack   convection
    1583             : 
    1584             :     ! Local variables:
    1585             : 
    1586             :     integer :: i, k, m, lchnk, ncol
    1587             : 
    1588             :     real(r8) :: rtdt
    1589             : 
    1590             :     real(r8):: precc(pcols)                ! convective precip rate
    1591             :     real(r8):: precl(pcols)                ! stratiform precip rate
    1592             :     real(r8):: snowc(pcols)                ! convective snow rate
    1593             :     real(r8):: snowl(pcols)                ! stratiform snow rate
    1594             :     real(r8):: prect(pcols)                ! total (conv+large scale) precip rate
    1595             :     real(r8) :: dcoef(6)                   ! for tidal component of T tend
    1596             : 
    1597     1489176 :     lchnk = state%lchnk
    1598     1489176 :     ncol  = state%ncol
    1599             : 
    1600     1489176 :     rtdt = 1._r8/ztodt
    1601             : 
    1602     1489176 :     if (moist_physics) then
    1603     1489176 :       if (prec_dp_idx > 0) then
    1604     1489176 :         call pbuf_get_field(pbuf, prec_dp_idx, prec_dp)
    1605             :       else
    1606           0 :         nullify(prec_dp)
    1607             :       end if
    1608     1489176 :       if (snow_dp_idx > 0) then
    1609     1489176 :         call pbuf_get_field(pbuf, snow_dp_idx, snow_dp)
    1610             :       else
    1611           0 :         nullify(snow_dp)
    1612             :       end if
    1613     1489176 :       if (prec_sh_idx > 0) then
    1614     1489176 :         call pbuf_get_field(pbuf, prec_sh_idx, prec_sh)
    1615             :       else
    1616           0 :         nullify(prec_sh)
    1617             :       end if
    1618     1489176 :       if (snow_sh_idx > 0) then
    1619     1489176 :         call pbuf_get_field(pbuf, snow_sh_idx, snow_sh)
    1620             :       else
    1621           0 :         nullify(snow_sh)
    1622             :       end if
    1623     1489176 :       if (prec_sed_idx > 0) then
    1624     1489176 :         call pbuf_get_field(pbuf, prec_sed_idx, prec_sed)
    1625             :       else
    1626           0 :         nullify(prec_sed)
    1627             :       end if
    1628     1489176 :       if (snow_sed_idx > 0) then
    1629     1489176 :         call pbuf_get_field(pbuf, snow_sed_idx, snow_sed)
    1630             :       else
    1631           0 :         nullify(snow_sed)
    1632             :       end if
    1633     1489176 :       if (prec_pcw_idx > 0) then
    1634     1489176 :         call pbuf_get_field(pbuf, prec_pcw_idx, prec_pcw)
    1635             :       else
    1636           0 :         nullify(prec_pcw)
    1637             :       end if
    1638     1489176 :       if (snow_pcw_idx > 0) then
    1639     1489176 :         call pbuf_get_field(pbuf, snow_pcw_idx, snow_pcw)
    1640             :       else
    1641           0 :         nullify(snow_pcw)
    1642             :       end if
    1643             : 
    1644             :       ! Precipitation rates (multi-process)
    1645     1489176 :       if (associated(prec_dp) .and. associated(prec_sh)) then
    1646    24865776 :         precc(:ncol) = prec_dp(:ncol)  + prec_sh(:ncol)
    1647           0 :       else if (associated(prec_dp)) then
    1648           0 :         precc(:ncol) = prec_dp(:ncol)
    1649           0 :       else if (associated(prec_sh)) then
    1650           0 :         precc(:ncol) = prec_sh(:ncol)
    1651             :       else
    1652           0 :         precc(:ncol) = 0._r8
    1653             :       end if
    1654     1489176 :       if (associated(prec_sed) .and. associated(prec_pcw)) then
    1655    24865776 :         precl(:ncol) = prec_sed(:ncol) + prec_pcw(:ncol)
    1656           0 :       else if (associated(prec_sed)) then
    1657           0 :         precl(:ncol) = prec_sed(:ncol)
    1658           0 :       else if (associated(prec_pcw)) then
    1659           0 :         precl(:ncol) = prec_pcw(:ncol)
    1660             :       else
    1661           0 :         precl(:ncol) = 0._r8
    1662             :       end if
    1663     1489176 :       if (associated(snow_dp) .and. associated(snow_sh)) then
    1664    24865776 :         snowc(:ncol) = snow_dp(:ncol)  + snow_sh(:ncol)
    1665           0 :       else if (associated(snow_dp)) then
    1666           0 :         snowc(:ncol) = snow_dp(:ncol)
    1667           0 :       else if (associated(snow_sh)) then
    1668           0 :         snowc(:ncol) = snow_sh(:ncol)
    1669             :       else
    1670           0 :         snowc(:ncol) = 0._r8
    1671             :       end if
    1672     1489176 :       if (associated(snow_sed) .and. associated(snow_pcw)) then
    1673    24865776 :         snowl(:ncol) = snow_sed(:ncol) + snow_pcw(:ncol)
    1674           0 :       else if (associated(snow_sed)) then
    1675           0 :         snowl(:ncol) = snow_sed(:ncol)
    1676           0 :       else if (associated(snow_pcw)) then
    1677           0 :         snowl(:ncol) = snow_pcw(:ncol)
    1678             :       else
    1679           0 :         snowl(:ncol) = 0._r8
    1680             :       end if
    1681    26354952 :       prect(:ncol) = precc(:ncol)    + precl(:ncol)
    1682             : 
    1683     1489176 :       call outfld('PRECC   ', precc, pcols, lchnk )
    1684     1489176 :       call outfld('PRECL   ', precl, pcols, lchnk )
    1685     1489176 :       if (associated(prec_pcw)) then
    1686     1489176 :         call outfld('PREC_PCW', prec_pcw,pcols   ,lchnk )
    1687             :       end if
    1688     1489176 :       if (associated(prec_dp)) then
    1689     1489176 :         call outfld('PREC_zmc', prec_dp ,pcols   ,lchnk )
    1690             :       end if
    1691     1489176 :       call outfld('PRECSC  ', snowc, pcols, lchnk )
    1692     1489176 :       call outfld('PRECSL  ', snowl, pcols, lchnk )
    1693     1489176 :       call outfld('PRECT   ', prect, pcols, lchnk )
    1694     1489176 :       call outfld('PRECTMX ', prect, pcols, lchnk )
    1695             : 
    1696     1489176 :       call outfld('PRECLav ', precl, pcols, lchnk )
    1697     1489176 :       call outfld('PRECCav ', precc, pcols, lchnk )
    1698             : 
    1699     1489176 :       if (write_camiop) call outfld('Prec   ' , prect, pcols, lchnk )
    1700             : 
    1701             :       ! Total convection tendencies.
    1702             : 
    1703   139982544 :       do k = 1, pver
    1704  2314006344 :         do i = 1, ncol
    1705  2312517168 :           dtcond(i,k,lchnk) = (state%t(i,k) - dtcond(i,k,lchnk))*rtdt
    1706             :         end do
    1707             :       end do
    1708     1489176 :       call outfld('DTCOND  ', dtcond(:,:,lchnk), pcols, lchnk)
    1709             : 
    1710             :       ! output tidal coefficients
    1711     1489176 :       call get_tidal_coeffs( dcoef )
    1712  2314006344 :       call outfld( 'DTCOND_24_SIN', dtcond(:ncol,:,lchnk)*dcoef(1), ncol, lchnk )
    1713  2314006344 :       call outfld( 'DTCOND_24_COS', dtcond(:ncol,:,lchnk)*dcoef(2), ncol, lchnk )
    1714  2314006344 :       call outfld( 'DTCOND_12_SIN', dtcond(:ncol,:,lchnk)*dcoef(3), ncol, lchnk )
    1715  2314006344 :       call outfld( 'DTCOND_12_COS', dtcond(:ncol,:,lchnk)*dcoef(4), ncol, lchnk )
    1716  2314006344 :       call outfld( 'DTCOND_08_SIN', dtcond(:ncol,:,lchnk)*dcoef(5), ncol, lchnk )
    1717  2314006344 :       call outfld( 'DTCOND_08_COS', dtcond(:ncol,:,lchnk)*dcoef(6), ncol, lchnk )
    1718             : 
    1719     2978352 :       do m = 1, dqcond_num
    1720     2978352 :         if ( cnst_cam_outfld(m) ) then
    1721   139982544 :           do k = 1, pver
    1722  2314006344 :             do i = 1, ncol
    1723  2312517168 :               dqcond(m)%cnst(i,k,lchnk) = (state%q(i,k,m) - dqcond(m)%cnst(i,k,lchnk))*rtdt
    1724             :             end do
    1725             :           end do
    1726     1489176 :           call outfld(dcconnam(m), dqcond(m)%cnst(:,:,lchnk), pcols, lchnk)
    1727             :         end if
    1728             :       end do
    1729             : 
    1730             :     end if
    1731     1489176 :   end subroutine diag_conv
    1732             : 
    1733             : !===============================================================================
    1734             : 
    1735     1489176 :   subroutine diag_surf (cam_in, cam_out, state, pbuf)
    1736             : 
    1737             :     !-----------------------------------------------------------------------
    1738             :     !
    1739             :     ! Purpose: record surface diagnostics
    1740             :     !
    1741             :     !-----------------------------------------------------------------------
    1742             : 
    1743             :     use time_manager,     only: is_end_curr_day
    1744             :     use co2_cycle,        only: c_i, co2_transport
    1745             :     use constituents,     only: sflxnam
    1746             : 
    1747             :     !-----------------------------------------------------------------------
    1748             :     !
    1749             :     ! Input arguments
    1750             :     !
    1751             :     type(cam_in_t),  intent(in) :: cam_in
    1752             :     type(cam_out_t), intent(in) :: cam_out
    1753             :     type(physics_state), intent(in)    :: state
    1754             :     type(physics_buffer_desc), pointer :: pbuf(:)
    1755             :     !
    1756             :     !---------------------------Local workspace-----------------------------
    1757             :     !
    1758             :     integer :: i, k, m      ! indexes
    1759             :     integer :: lchnk        ! chunk identifier
    1760             :     integer :: ncol         ! longitude dimension
    1761             :     real(r8) tem2(pcols)    ! temporary workspace
    1762             :     real(r8) ftem(pcols)    ! temporary workspace
    1763             : 
    1764     1489176 :     real(r8), pointer :: trefmnav(:) ! daily minimum tref
    1765     1489176 :     real(r8), pointer :: trefmxav(:) ! daily maximum tref
    1766             : 
    1767             :     !
    1768             :     !-----------------------------------------------------------------------
    1769             :     !
    1770     1489176 :     lchnk = cam_in%lchnk
    1771     1489176 :     ncol  = cam_in%ncol
    1772             : 
    1773     1489176 :     if (moist_physics) then
    1774     1489176 :       call outfld('SHFLX',    cam_in%shf,       pcols, lchnk)
    1775     1489176 :       call outfld('LHFLX',    cam_in%lhf,       pcols, lchnk)
    1776     1489176 :       call outfld('QFLX',     cam_in%cflx(1,1), pcols, lchnk)
    1777             : 
    1778     1489176 :       call outfld('TAUX',     cam_in%wsx,       pcols, lchnk)
    1779     1489176 :       call outfld('TAUY',     cam_in%wsy,       pcols, lchnk)
    1780     1489176 :       call outfld('TREFHT  ', cam_in%tref,      pcols, lchnk)
    1781     1489176 :       call outfld('TREFHTMX', cam_in%tref,      pcols, lchnk)
    1782     1489176 :       call outfld('TREFHTMN', cam_in%tref,      pcols, lchnk)
    1783     1489176 :       call outfld('QREFHT',   cam_in%qref,      pcols, lchnk)
    1784     1489176 :       call outfld('U10',      cam_in%u10,       pcols, lchnk)
    1785     1489176 :       call outfld('UGUST',    cam_in%ugustOut,  pcols, lchnk)
    1786     1489176 :       call outfld('U10WITHGUSTS',cam_in%u10withGusts, pcols, lchnk)
    1787             : 
    1788             :       !
    1789             :       ! Calculate and output reference height RH (RHREFHT)
    1790     1489176 :       call qsat(cam_in%tref(1:ncol), state%ps(1:ncol), tem2(1:ncol), ftem(1:ncol), ncol)
    1791    24865776 :       ftem(:ncol) = cam_in%qref(:ncol)/ftem(:ncol)*100._r8
    1792             : 
    1793             : 
    1794     1489176 :       call outfld('RHREFHT',   ftem,      pcols, lchnk)
    1795             : 
    1796             : 
    1797     1489176 :       if (write_camiop) then
    1798           0 :          call outfld('shflx   ',cam_in%shf,   pcols,   lchnk)
    1799           0 :          call outfld('lhflx   ',cam_in%lhf,   pcols,   lchnk)
    1800           0 :          call outfld('trefht  ',cam_in%tref,  pcols,   lchnk)
    1801           0 :          call outfld('Tg', cam_in%ts, pcols, lchnk)
    1802           0 :          call outfld('Tsair',cam_in%ts, pcols, lchnk)
    1803             :       end if
    1804             :       !
    1805             :       ! Ouput ocn and ice fractions
    1806             :       !
    1807     1489176 :       call outfld('LANDFRAC', cam_in%landfrac, pcols, lchnk)
    1808     1489176 :       call outfld('ICEFRAC',  cam_in%icefrac,  pcols, lchnk)
    1809     1489176 :       call outfld('OCNFRAC',  cam_in%ocnfrac,  pcols, lchnk)
    1810             :       !
    1811             :       ! Compute daily minimum and maximum of TREF
    1812             :       !
    1813     1489176 :       call pbuf_get_field(pbuf, trefmxav_idx, trefmxav)
    1814     1489176 :       call pbuf_get_field(pbuf, trefmnav_idx, trefmnav)
    1815    24865776 :       do i = 1,ncol
    1816    23376600 :         trefmxav(i) = max(cam_in%tref(i),trefmxav(i))
    1817    24865776 :         trefmnav(i) = min(cam_in%tref(i),trefmnav(i))
    1818             :       end do
    1819     1489176 :       if (is_end_curr_day()) then
    1820       34056 :         call outfld('TREFMXAV', trefmxav,pcols,   lchnk     )
    1821       34056 :         call outfld('TREFMNAV', trefmnav,pcols,   lchnk     )
    1822      568656 :         trefmxav(:ncol) = -1.0e36_r8
    1823      568656 :         trefmnav(:ncol) =  1.0e36_r8
    1824             :       endif
    1825             : 
    1826     1489176 :       call outfld('TBOT',     cam_out%tbot,     pcols, lchnk)
    1827     1489176 :       call outfld('TS',       cam_in%ts,        pcols, lchnk)
    1828     1489176 :       call outfld('TSMN',     cam_in%ts,        pcols, lchnk)
    1829     1489176 :       call outfld('TSMX',     cam_in%ts,        pcols, lchnk)
    1830     1489176 :       call outfld('SNOWHLND', cam_in%snowhland, pcols, lchnk)
    1831     1489176 :       call outfld('SNOWHICE', cam_in%snowhice,  pcols, lchnk)
    1832     1489176 :       call outfld('ASDIR',    cam_in%asdir,     pcols, lchnk)
    1833     1489176 :       call outfld('ASDIF',    cam_in%asdif,     pcols, lchnk)
    1834     1489176 :       call outfld('ALDIR',    cam_in%aldir,     pcols, lchnk)
    1835     1489176 :       call outfld('ALDIF',    cam_in%aldif,     pcols, lchnk)
    1836     1489176 :       call outfld('SST',      cam_in%sst,       pcols, lchnk)
    1837             : 
    1838     1489176 :       if (co2_transport()) then
    1839           0 :         do m = 1,4
    1840           0 :           call outfld(sflxnam(c_i(m)), cam_in%cflx(:,c_i(m)), pcols, lchnk)
    1841             :         end do
    1842             :       end if
    1843             :     end if
    1844             : 
    1845     2978352 :   end subroutine diag_surf
    1846             : 
    1847             : !===============================================================================
    1848             : 
    1849     1495368 :   subroutine diag_export(cam_out)
    1850             : 
    1851             :     !-----------------------------------------------------------------------
    1852             :     !
    1853             :     ! Purpose: Write export state to history file
    1854             :     !
    1855             :     !-----------------------------------------------------------------------
    1856             : 
    1857             :     ! arguments
    1858             :     type(cam_out_t), intent(inout) :: cam_out
    1859             : 
    1860             :     ! Local variables:
    1861             :     integer :: lchnk        ! chunk identifier
    1862             :     logical :: atm_dep_flux ! true ==> sending deposition fluxes to coupler.
    1863             :     ! Otherwise, set them to zero.
    1864             :     !-----------------------------------------------------------------------
    1865             : 
    1866     1495368 :     lchnk = cam_out%lchnk
    1867             : 
    1868     1495368 :     call phys_getopts(atm_dep_flux_out=atm_dep_flux)
    1869             : 
    1870     1495368 :     if (.not. atm_dep_flux) then
    1871             :       ! set the fluxes to zero before outfld and sending them to the
    1872             :       ! coupler
    1873           0 :       cam_out%bcphiwet = 0.0_r8
    1874           0 :       cam_out%bcphidry = 0.0_r8
    1875           0 :       cam_out%bcphodry = 0.0_r8
    1876           0 :       cam_out%ocphiwet = 0.0_r8
    1877           0 :       cam_out%ocphidry = 0.0_r8
    1878           0 :       cam_out%ocphodry = 0.0_r8
    1879           0 :       cam_out%dstwet1  = 0.0_r8
    1880           0 :       cam_out%dstdry1  = 0.0_r8
    1881           0 :       cam_out%dstwet2  = 0.0_r8
    1882           0 :       cam_out%dstdry2  = 0.0_r8
    1883           0 :       cam_out%dstwet3  = 0.0_r8
    1884           0 :       cam_out%dstdry3  = 0.0_r8
    1885           0 :       cam_out%dstwet4  = 0.0_r8
    1886           0 :       cam_out%dstdry4  = 0.0_r8
    1887             :     end if
    1888             : 
    1889     1495368 :     if (moist_physics) then
    1890     1495368 :       call outfld('a2x_BCPHIWET', cam_out%bcphiwet, pcols, lchnk)
    1891     1495368 :       call outfld('a2x_BCPHIDRY', cam_out%bcphidry, pcols, lchnk)
    1892     1495368 :       call outfld('a2x_BCPHODRY', cam_out%bcphodry, pcols, lchnk)
    1893     1495368 :       call outfld('a2x_OCPHIWET', cam_out%ocphiwet, pcols, lchnk)
    1894     1495368 :       call outfld('a2x_OCPHIDRY', cam_out%ocphidry, pcols, lchnk)
    1895     1495368 :       call outfld('a2x_OCPHODRY', cam_out%ocphodry, pcols, lchnk)
    1896     1495368 :       call outfld('a2x_DSTWET1',  cam_out%dstwet1,  pcols, lchnk)
    1897     1495368 :       call outfld('a2x_DSTDRY1',  cam_out%dstdry1,  pcols, lchnk)
    1898     1495368 :       call outfld('a2x_DSTWET2',  cam_out%dstwet2,  pcols, lchnk)
    1899     1495368 :       call outfld('a2x_DSTDRY2',  cam_out%dstdry2,  pcols, lchnk)
    1900     1495368 :       call outfld('a2x_DSTWET3',  cam_out%dstwet3,  pcols, lchnk)
    1901     1495368 :       call outfld('a2x_DSTDRY3',  cam_out%dstdry3,  pcols, lchnk)
    1902     1495368 :       call outfld('a2x_DSTWET4',  cam_out%dstwet4,  pcols, lchnk)
    1903     1495368 :       call outfld('a2x_DSTDRY4',  cam_out%dstdry4,  pcols, lchnk)
    1904             :     end if
    1905             : 
    1906     1489176 :   end subroutine diag_export
    1907             : 
    1908             : !#######################################################################
    1909             : 
    1910     1495368 :   subroutine diag_physvar_ic (lchnk,  pbuf, cam_out, cam_in)
    1911             :     !
    1912             :     !---------------------------------------------
    1913             :     !
    1914             :     ! Purpose: record physics variables on IC file
    1915             :     !
    1916             :     !---------------------------------------------
    1917             :     !
    1918             : 
    1919             :     !
    1920             :     ! Arguments
    1921             :     !
    1922             :     integer       , intent(in) :: lchnk  ! chunk identifier
    1923             :     type(physics_buffer_desc), pointer :: pbuf(:)
    1924             : 
    1925             :     type(cam_out_t), intent(inout) :: cam_out
    1926             :     type(cam_in_t),  intent(inout) :: cam_in
    1927             :     !
    1928             :     !---------------------------Local workspace-----------------------------
    1929             :     !
    1930             :     integer  :: itim_old          ! indices
    1931             : 
    1932     1495368 :     real(r8), pointer, dimension(:,:) :: cwat_var
    1933     1495368 :     real(r8), pointer, dimension(:,:) :: conv_var_3d
    1934     1495368 :     real(r8), pointer, dimension(:  ) :: conv_var_2d
    1935     1495368 :     real(r8), pointer :: tpert(:), pblh(:), qpert(:)
    1936             :     !
    1937             :     !-----------------------------------------------------------------------
    1938             :     !
    1939     1495368 :     if( write_inithist() .and. moist_physics ) then
    1940             : 
    1941             :       !
    1942             :       ! Associate pointers with physics buffer fields
    1943             :       !
    1944           0 :       itim_old = pbuf_old_tim_idx()
    1945             : 
    1946           0 :       if (qcwat_idx > 0) then
    1947           0 :         call pbuf_get_field(pbuf, qcwat_idx, cwat_var, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
    1948           0 :         call outfld('QCWAT&IC   ',cwat_var, pcols,lchnk)
    1949             :       end if
    1950             : 
    1951           0 :       if (tcwat_idx > 0) then
    1952           0 :         call pbuf_get_field(pbuf, tcwat_idx,  cwat_var, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
    1953           0 :         call outfld('TCWAT&IC   ',cwat_var, pcols,lchnk)
    1954             :       end if
    1955             : 
    1956           0 :       if (lcwat_idx > 0) then
    1957           0 :         call pbuf_get_field(pbuf, lcwat_idx,  cwat_var, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
    1958           0 :         call outfld('LCWAT&IC   ',cwat_var, pcols,lchnk)
    1959             :       end if
    1960             : 
    1961           0 :       if (cld_idx > 0) then
    1962           0 :         call pbuf_get_field(pbuf, cld_idx,    cwat_var, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
    1963           0 :         call outfld('CLOUD&IC   ',cwat_var, pcols,lchnk)
    1964             :       end if
    1965             : 
    1966           0 :       if (concld_idx > 0) then
    1967           0 :         call pbuf_get_field(pbuf, concld_idx, cwat_var, start=(/1,1,itim_old/), kount=(/pcols,pver,1/) )
    1968           0 :         call outfld('CONCLD&IC   ',cwat_var, pcols,lchnk)
    1969             :       end if
    1970             : 
    1971           0 :       if (cush_idx > 0) then
    1972           0 :         call pbuf_get_field(pbuf, cush_idx, conv_var_2d ,(/1,itim_old/),  (/pcols,1/))
    1973           0 :         call outfld('CUSH&IC   ',conv_var_2d, pcols,lchnk)
    1974             : 
    1975             :       end if
    1976             : 
    1977           0 :       if (tke_idx > 0) then
    1978           0 :         call pbuf_get_field(pbuf, tke_idx, conv_var_3d)
    1979           0 :         call outfld('TKE&IC    ',conv_var_3d, pcols,lchnk)
    1980             :       end if
    1981             : 
    1982           0 :       if (kvm_idx > 0) then
    1983           0 :         call pbuf_get_field(pbuf, kvm_idx,  conv_var_3d)
    1984           0 :         call outfld('KVM&IC    ',conv_var_3d, pcols,lchnk)
    1985             :       end if
    1986             : 
    1987           0 :       if (kvh_idx > 0) then
    1988           0 :         call pbuf_get_field(pbuf, kvh_idx,  conv_var_3d)
    1989           0 :         call outfld('KVH&IC    ',conv_var_3d, pcols,lchnk)
    1990             :       end if
    1991             : 
    1992           0 :       if (qpert_idx > 0) then
    1993           0 :         call pbuf_get_field(pbuf, qpert_idx, qpert)
    1994           0 :         call outfld('QPERT&IC   ', qpert, pcols, lchnk)
    1995             :       end if
    1996             : 
    1997           0 :       if (pblh_idx > 0) then
    1998           0 :         call pbuf_get_field(pbuf, pblh_idx,  pblh)
    1999           0 :         call outfld('PBLH&IC    ', pblh,  pcols, lchnk)
    2000             :       end if
    2001             : 
    2002           0 :       if (tpert_idx > 0) then
    2003           0 :         call pbuf_get_field(pbuf, tpert_idx, tpert)
    2004           0 :         call outfld('TPERT&IC   ', tpert, pcols, lchnk)
    2005             :       end if
    2006             : 
    2007             :     end if
    2008             : 
    2009     1495368 :   end subroutine diag_physvar_ic
    2010             : 
    2011             : 
    2012             : !#######################################################################
    2013             : 
    2014     1489176 :   subroutine diag_phys_tend_writeout_dry(state, pbuf,  tend, ztodt)
    2015             : 
    2016             :     !---------------------------------------------------------------
    2017             :     !
    2018             :     ! Purpose:  Dump physics tendencies for temperature
    2019             :     !
    2020             :     !---------------------------------------------------------------
    2021             : 
    2022             :     use check_energy,    only: check_energy_get_integrals
    2023             :     use physconst,       only: cpair
    2024             : 
    2025             :     ! Arguments
    2026             : 
    2027             :     type(physics_state), intent(in)    :: state
    2028             : 
    2029             :     type(physics_buffer_desc), pointer :: pbuf(:)
    2030             :     type(physics_tend ), intent(in)    :: tend
    2031             :     real(r8),            intent(in)    :: ztodt             ! physics timestep
    2032             : 
    2033             :     !---------------------------Local workspace-----------------------------
    2034             : 
    2035             :     integer  :: lchnk             ! chunk index
    2036             :     integer  :: ncol              ! number of columns in chunk
    2037             :     real(r8) :: ftem2(pcols)      ! Temporary workspace for outfld variables
    2038             :     real(r8) :: ftem3(pcols,pver) ! Temporary workspace for outfld variables
    2039             :     real(r8) :: heat_glob         ! global energy integral (FV only)
    2040             :     ! CAM pointers to get variables from the physics buffer
    2041     1489176 :     real(r8), pointer, dimension(:,:) :: t_ttend
    2042     1489176 :     real(r8), pointer, dimension(:,:) :: t_utend
    2043     1489176 :     real(r8), pointer, dimension(:,:) :: t_vtend
    2044             :     integer  :: itim_old,m
    2045             : 
    2046             :     !-----------------------------------------------------------------------
    2047             : 
    2048     1489176 :     lchnk = state%lchnk
    2049     1489176 :     ncol  = state%ncol
    2050             : 
    2051             :     ! Dump out post-physics state (FV only)
    2052             : 
    2053     1489176 :     call outfld('TAP', state%t, pcols, lchnk   )
    2054     1489176 :     call outfld('UAP', state%u, pcols, lchnk   )
    2055     1489176 :     call outfld('VAP', state%v, pcols, lchnk   )
    2056             : 
    2057             :     ! Total physics tendency for Temperature
    2058             :     ! (remove global fixer tendency from total for FV and SE dycores)
    2059             : 
    2060     1489176 :     if (.not.dycore_is('EUL')) then
    2061     1489176 :       call check_energy_get_integrals( heat_glob_out=heat_glob )
    2062    24865776 :       ftem2(:ncol)  = heat_glob/cpair
    2063     1489176 :       call outfld('TFIX', ftem2, pcols, lchnk   )
    2064  2314006344 :       ftem3(:ncol,:pver)  = tend%dtdt(:ncol,:pver) - heat_glob/cpair
    2065             :     else
    2066           0 :       ftem3(:ncol,:pver)  = tend%dtdt(:ncol,:pver)
    2067             :     end if
    2068     1489176 :     call outfld('PTTEND',ftem3, pcols, lchnk )
    2069  2314006344 :     ftem3(:ncol,:pver)  = tend%dudt(:ncol,:pver)
    2070     1489176 :     call outfld('UTEND_PHYSTOT',ftem3, pcols, lchnk )
    2071  2314006344 :     ftem3(:ncol,:pver)  = tend%dvdt(:ncol,:pver)
    2072     1489176 :     call outfld('VTEND_PHYSTOT',ftem3, pcols, lchnk )
    2073             : 
    2074             :     ! Total (physics+dynamics, everything!) tendency for Temperature
    2075             : 
    2076             :     !! get temperature, U, and V stored in physics buffer
    2077     1489176 :     itim_old = pbuf_old_tim_idx()
    2078     5956704 :     call pbuf_get_field(pbuf, t_ttend_idx, t_ttend, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
    2079     5956704 :     call pbuf_get_field(pbuf, t_utend_idx, t_utend, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
    2080     5956704 :     call pbuf_get_field(pbuf, t_vtend_idx, t_vtend, start=(/1,1,itim_old/), kount=(/pcols,pver,1/))
    2081             : 
    2082             :     !! calculate and outfld the total temperature, U, and V tendencies
    2083  2314006344 :     ftem3(:ncol,:) = (state%t(:ncol,:) - t_ttend(:ncol,:))/ztodt
    2084     1489176 :     call outfld('TTEND_TOT', ftem3, pcols, lchnk)
    2085  2314006344 :     ftem3(:ncol,:) = (state%u(:ncol,:) - t_utend(:ncol,:))/ztodt
    2086     1489176 :     call outfld('UTEND_TOT', ftem3, pcols, lchnk)
    2087  2314006344 :     ftem3(:ncol,:) = (state%v(:ncol,:) - t_vtend(:ncol,:))/ztodt
    2088     1489176 :     call outfld('VTEND_TOT', ftem3, pcols, lchnk)
    2089             : 
    2090             :     !! update physics buffer with this time-step's temperature, U, and V
    2091  2314006344 :     t_ttend(:ncol,:) = state%t(:ncol,:)
    2092  2314006344 :     t_utend(:ncol,:) = state%u(:ncol,:)
    2093  2314006344 :     t_vtend(:ncol,:) = state%v(:ncol,:)
    2094             : 
    2095     2978352 :   end subroutine diag_phys_tend_writeout_dry
    2096             : 
    2097             : !#######################################################################
    2098             : 
    2099     1489176 :   subroutine diag_phys_tend_writeout_moist(state, pbuf,  tend, ztodt,         &
    2100             :        qini, cldliqini, cldiceini)
    2101             : 
    2102             :     !---------------------------------------------------------------
    2103             :     !
    2104             :     ! Purpose:  Dump physics tendencies for moisture
    2105             :     !
    2106             :     !---------------------------------------------------------------
    2107             : 
    2108             :     ! Arguments
    2109             : 
    2110             :     type(physics_state), intent(in)    :: state
    2111             : 
    2112             :     type(physics_buffer_desc), pointer :: pbuf(:)
    2113             :     type(physics_tend ), intent(in)    :: tend
    2114             :     real(r8),            intent(in)    :: ztodt                  ! physics timestep
    2115             :     real(r8),            intent(in)    :: qini      (pcols,pver) ! tracer fields at beginning of physics
    2116             :     real(r8),            intent(in)    :: cldliqini (pcols,pver) ! tracer fields at beginning of physics
    2117             :     real(r8),            intent(in)    :: cldiceini (pcols,pver) ! tracer fields at beginning of physics
    2118             : 
    2119             :     !---------------------------Local workspace-----------------------------
    2120             : 
    2121             :     integer  :: lchnk  ! chunk index
    2122             :     integer  :: ncol   ! number of columns in chunk
    2123             :     real(r8) :: ftem3(pcols,pver) ! Temporary workspace for outfld variables
    2124             :     real(r8) :: rtdt
    2125             :     integer  :: ixcldice, ixcldliq! constituent indices for cloud liquid and ice water.
    2126             : 
    2127     1489176 :     lchnk = state%lchnk
    2128     1489176 :     ncol  = state%ncol
    2129     1489176 :     rtdt  = 1._r8/ztodt
    2130     1489176 :     call cnst_get_ind('CLDLIQ', ixcldliq, abort=.false.)
    2131     1489176 :     call cnst_get_ind('CLDICE', ixcldice, abort=.false.)
    2132             : 
    2133     1489176 :     if ( cnst_cam_outfld(       1) ) then
    2134     1489176 :       call outfld (apcnst(       1), state%q(1,1,       1), pcols, lchnk)
    2135             :     end if
    2136     1489176 :     if (ixcldliq > 0) then
    2137     1489176 :       if (cnst_cam_outfld(ixcldliq)) then
    2138     1489176 :         call outfld (apcnst(ixcldliq), state%q(1,1,ixcldliq), pcols, lchnk)
    2139             :       end if
    2140             :     end if
    2141     1489176 :     if (ixcldice > 0) then
    2142     1489176 :       if ( cnst_cam_outfld(ixcldice) ) then
    2143     1489176 :         call outfld (apcnst(ixcldice), state%q(1,1,ixcldice), pcols, lchnk)
    2144             :       end if
    2145             :     end if
    2146             : 
    2147             :     ! Total physics tendency for moisture and other tracers
    2148             : 
    2149     1489176 :     if ( cnst_cam_outfld(       1) ) then
    2150  2314006344 :       ftem3(:ncol,:pver) = (state%q(:ncol,:pver,       1) - qini     (:ncol,:pver) )*rtdt
    2151     1489176 :       call outfld (ptendnam(       1), ftem3, pcols, lchnk)
    2152             :     end if
    2153     1489176 :     if (ixcldliq > 0) then
    2154     1489176 :       if (cnst_cam_outfld(ixcldliq) ) then
    2155  2314006344 :         ftem3(:ncol,:pver) = (state%q(:ncol,:pver,ixcldliq) - cldliqini(:ncol,:pver) )*rtdt
    2156     1489176 :         call outfld (ptendnam(ixcldliq), ftem3, pcols, lchnk)
    2157             :       end if
    2158             :     end if
    2159     1489176 :     if (ixcldice > 0) then
    2160     1489176 :       if ( cnst_cam_outfld(ixcldice) ) then
    2161  2314006344 :         ftem3(:ncol,:pver) = (state%q(:ncol,:pver,ixcldice) - cldiceini(:ncol,:pver) )*rtdt
    2162     1489176 :         call outfld (ptendnam(ixcldice), ftem3, pcols, lchnk)
    2163             :       end if
    2164             :     end if
    2165             : 
    2166     1489176 :   end subroutine diag_phys_tend_writeout_moist
    2167             : 
    2168             : !#######################################################################
    2169             : 
    2170     1489176 :   subroutine diag_phys_tend_writeout(state, pbuf,  tend, ztodt,               &
    2171             :        qini, cldliqini, cldiceini)
    2172             : 
    2173             :     !---------------------------------------------------------------
    2174             :     !
    2175             :     ! Purpose:  Dump physics tendencies for moisture and temperature
    2176             :     !
    2177             :     !---------------------------------------------------------------
    2178             : 
    2179             :     ! Arguments
    2180             : 
    2181             :     type(physics_state), intent(in)    :: state
    2182             : 
    2183             :     type(physics_buffer_desc), pointer :: pbuf(:)
    2184             :     type(physics_tend ), intent(in)    :: tend
    2185             :     real(r8),            intent(in)    :: ztodt                  ! physics timestep
    2186             :     real(r8),            intent(in)    :: qini      (pcols,pver) ! tracer fields at beginning of physics
    2187             :     real(r8),            intent(in)    :: cldliqini (pcols,pver) ! tracer fields at beginning of physics
    2188             :     real(r8),            intent(in)    :: cldiceini (pcols,pver) ! tracer fields at beginning of physics
    2189             : 
    2190             :     !-----------------------------------------------------------------------
    2191             : 
    2192     1489176 :     call diag_phys_tend_writeout_dry(state, pbuf, tend, ztodt)
    2193     1489176 :     if (moist_physics) then
    2194             :       call diag_phys_tend_writeout_moist(state, pbuf,  tend, ztodt,           &
    2195     1489176 :            qini, cldliqini, cldiceini)
    2196             :     end if
    2197             : 
    2198     1489176 :   end subroutine diag_phys_tend_writeout
    2199             : 
    2200             : !#######################################################################
    2201             : 
    2202     1495368 :   subroutine diag_state_b4_phys_write_dry (state)
    2203             :     !
    2204             :     !---------------------------------------------------------------
    2205             :     !
    2206             :     ! Purpose:  Dump dry state just prior to executing physics
    2207             :     !
    2208             :     !---------------------------------------------------------------
    2209             :     !
    2210             :     ! Arguments
    2211             :     !
    2212             :     type(physics_state), intent(in) :: state
    2213             :     !
    2214             :     !---------------------------Local workspace-----------------------------
    2215             :     !
    2216             :     integer :: lchnk              ! chunk index
    2217             :     !
    2218             :     !-----------------------------------------------------------------------
    2219             :     !
    2220     1495368 :     lchnk = state%lchnk
    2221             : 
    2222     1495368 :     call outfld('TBP', state%t, pcols, lchnk   )
    2223     1495368 :     call outfld('UBP', state%u, pcols, lchnk   )
    2224     1495368 :     call outfld('VBP', state%v, pcols, lchnk   )
    2225             : 
    2226     1495368 :   end subroutine diag_state_b4_phys_write_dry
    2227             : 
    2228     1495368 :   subroutine diag_state_b4_phys_write_moist (state)
    2229             :     !
    2230             :     !---------------------------------------------------------------
    2231             :     !
    2232             :     ! Purpose:  Dump moist state just prior to executing physics
    2233             :     !
    2234             :     !---------------------------------------------------------------
    2235             :     !
    2236             :     ! Arguments
    2237             :     !
    2238             :     type(physics_state), intent(in) :: state
    2239             :     !
    2240             :     !---------------------------Local workspace-----------------------------
    2241             :     !
    2242             :     integer :: ixcldice, ixcldliq ! constituent indices for cloud liquid and ice water.
    2243             :     integer :: lchnk              ! chunk index
    2244             :     !
    2245             :     !-----------------------------------------------------------------------
    2246             :     !
    2247     1495368 :     lchnk = state%lchnk
    2248             : 
    2249     1495368 :     call cnst_get_ind('CLDLIQ', ixcldliq, abort=.false.)
    2250     1495368 :     call cnst_get_ind('CLDICE', ixcldice, abort=.false.)
    2251             : 
    2252     1495368 :     if ( cnst_cam_outfld(       1) ) then
    2253     1495368 :       call outfld (bpcnst(       1), state%q(1,1,       1), pcols, lchnk)
    2254             :     end if
    2255     1495368 :     if (ixcldliq > 0) then
    2256     1495368 :       if (cnst_cam_outfld(ixcldliq)) then
    2257     1495368 :         call outfld (bpcnst(ixcldliq), state%q(1,1,ixcldliq), pcols, lchnk)
    2258             :       end if
    2259             :     end if
    2260     1495368 :     if (ixcldice > 0) then
    2261     1495368 :       if (cnst_cam_outfld(ixcldice)) then
    2262     1495368 :         call outfld (bpcnst(ixcldice), state%q(1,1,ixcldice), pcols, lchnk)
    2263             :       end if
    2264             :     end if
    2265             : 
    2266     1495368 :   end subroutine diag_state_b4_phys_write_moist
    2267             : 
    2268     1495368 :   subroutine diag_state_b4_phys_write (state)
    2269             :     !
    2270             :     !---------------------------------------------------------------
    2271             :     !
    2272             :     ! Purpose:  Dump state just prior to executing physics
    2273             :     !
    2274             :     !---------------------------------------------------------------
    2275             :     !
    2276             :     ! Arguments
    2277             :     !
    2278             :     type(physics_state), intent(in) :: state
    2279             :     !
    2280             : 
    2281     1495368 :     call diag_state_b4_phys_write_dry(state)
    2282     1495368 :     if (moist_physics) then
    2283     1495368 :       call diag_state_b4_phys_write_moist(state)
    2284             :     end if
    2285     1495368 :   end subroutine diag_state_b4_phys_write
    2286             : 
    2287           0 : end module cam_diagnostics

Generated by: LCOV version 1.14