LCOV - code coverage report
Current view: top level - control - cam_snapshot_common.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 2 414 0.5 %
Date: 2025-03-13 18:42:46 Functions: 1 22 4.5 %

          Line data    Source code
       1             : module cam_snapshot_common
       2             : !--------------------------------------------------------
       3             : ! The purpose of this module is to handle taking the "snapshot" of CAM data.
       4             : !
       5             : ! This module writes out ALL the state, tend and pbuf fields.  It also includes the cam_in and cam_out
       6             : ! fields which are used within CAM
       7             : !--------------------------------------------------------
       8             : 
       9             : use shr_kind_mod,   only: r8 => shr_kind_r8
      10             : use cam_history,    only: addfld, add_default, outfld
      11             : use cam_history,    only: cam_history_snapshot_deactivate, cam_history_snapshot_activate
      12             : use cam_history_support, only: horiz_only
      13             : use cam_abortutils, only: endrun
      14             : use physics_buffer, only: physics_buffer_desc, pbuf_get_index, pbuf_get_field, pbuf_get_field_name
      15             : use physics_types,  only: physics_state, physics_tend, physics_ptend
      16             : use camsrfexch,     only: cam_out_t, cam_in_t
      17             : use ppgrid,         only: pcols, begchunk, endchunk
      18             : use constituents,   only: pcnst
      19             : use phys_control,   only: phys_getopts
      20             : use cam_logfile,    only: iulog
      21             : 
      22             : implicit  none
      23             : 
      24             : private
      25             : 
      26             : public :: cam_snapshot_deactivate
      27             : public :: cam_snapshot_all_outfld
      28             : public :: cam_snapshot_ptend_outfld
      29             : public :: snapshot_type
      30             : public :: cam_state_snapshot_init
      31             : public :: cam_cnst_snapshot_init
      32             : public :: cam_tend_snapshot_init
      33             : public :: cam_ptend_snapshot_init
      34             : public :: cam_in_snapshot_init
      35             : public :: cam_out_snapshot_init
      36             : public :: cam_pbuf_snapshot_init
      37             : public :: snapshot_addfld
      38             : 
      39             : private :: snapshot_addfld_nd
      40             : private :: state_snapshot_all_outfld
      41             : private :: cnst_snapshot_all_outfld
      42             : private :: tend_snapshot_all_outfld
      43             : private :: cam_in_snapshot_all_outfld
      44             : private :: cam_out_snapshot_all_outfld
      45             : private :: cam_pbuf_snapshot_all_outfld
      46             : private :: fill_pbuf_info
      47             : 
      48             : 
      49             : 
      50             : ! This is the number of pbuf fields in the CAM code that are declared with the fieldname as opposed to being data driven.
      51             : integer, parameter :: npbuf_all = 327
      52             : 
      53             : type snapshot_type
      54             :   character(len=40)  :: ddt_string
      55             :   character(len=256) :: standard_name
      56             :   character(len=20)  :: dim_name
      57             :   character(len=8)   :: units
      58             : end type snapshot_type
      59             : 
      60             : type snapshot_type_nd
      61             :   character(len=40)  :: ddt_string
      62             :   character(len=256) :: standard_name
      63             :   character(len=20)  :: dim_name(6) ! hardwired 6 potential dimensions in pbuf
      64             :   character(len=8)   :: units
      65             : end type snapshot_type_nd
      66             : 
      67             : type pbuf_info_type
      68             :   character(len=40)  :: name
      69             :   character(len=256) :: standard_name
      70             :   character(len=8)   :: units
      71             :   character(len=100) :: dim_string(6) ! hardwired 6 potential dimensions in pbuf
      72             : end type pbuf_info_type
      73             : 
      74             : integer :: nstate_var
      75             : integer :: ncnst_var
      76             : integer :: ntend_var
      77             : integer :: ncam_in_var
      78             : integer :: ncam_out_var
      79             : integer :: npbuf_var
      80             : 
      81             : integer :: cam_snapshot_before_num, cam_snapshot_after_num
      82             : 
      83             : ! Note the maximum number of variables for each type
      84             : type (snapshot_type)    ::  state_snapshot(27)
      85             : type (snapshot_type)    ::  cnst_snapshot(pcnst)
      86             : type (snapshot_type)    ::  tend_snapshot(6)
      87             : type (snapshot_type)    ::  cam_in_snapshot(30)
      88             : type (snapshot_type)    ::  cam_out_snapshot(30)
      89             : type (snapshot_type_nd) ::  pbuf_snapshot(250)
      90             : 
      91             : contains
      92             : 
      93           0 : subroutine cam_snapshot_all_outfld(file_num, state, tend, cam_in, cam_out, pbuf)
      94             : 
      95             : use time_manager,   only: is_first_step
      96             : 
      97             : !--------------------------------------------------------
      98             : ! This subroutine does the outfld calls for ALL state, tend and pbuf fields.  It also includes the cam_in and cam_out
      99             : ! elements which are used within CAM
     100             : !--------------------------------------------------------
     101             : 
     102             :    integer,                            intent(in) :: file_num
     103             :    type(physics_state), intent(in) :: state
     104             :    type(physics_tend),  intent(in) :: tend
     105             :    type(cam_in_t),      intent(in) :: cam_in
     106             :    type(cam_out_t),     intent(in) :: cam_out
     107             :    type(physics_buffer_desc), pointer, intent(in) :: pbuf(:)
     108             : 
     109             : 
     110             :    integer :: lchnk
     111             : 
     112             :    ! Return if the first timestep as not all fields may be filled in and this will cause a core dump
     113           0 :    if (is_first_step()) return
     114             : 
     115             :    ! Return if not turned on
     116           0 :    if (cam_snapshot_before_num <= 0 .and. cam_snapshot_after_num <= 0) return ! No snapshot files are being requested
     117             : 
     118           0 :    lchnk = state%lchnk
     119             : 
     120             :    ! Write out all the state fields
     121           0 :    call state_snapshot_all_outfld(lchnk, file_num, state)
     122             : 
     123             :    ! Write out all the constituent fields
     124           0 :    call cnst_snapshot_all_outfld(lchnk, file_num, state%q)
     125             : 
     126             :    ! Write out all the tendency fields
     127           0 :    call tend_snapshot_all_outfld(lchnk, file_num, tend)
     128             : 
     129             :    ! Write out all the cam_in fields
     130           0 :    call cam_in_snapshot_all_outfld(lchnk, file_num, cam_in)
     131             : 
     132             :    ! Write out all the cam_out fields
     133           0 :    call cam_out_snapshot_all_outfld(lchnk, file_num, cam_out)
     134             : 
     135             :    ! Write out all the pbuf fields
     136           0 :    call cam_pbuf_snapshot_all_outfld(lchnk, file_num, pbuf)
     137             : 
     138           0 : end subroutine cam_snapshot_all_outfld
     139             : 
     140        1536 : subroutine cam_snapshot_deactivate()
     141             : 
     142             : !--------------------------------------------------------
     143             : ! This subroutine deactivates the printing of the snapshot before and after files
     144             : ! Note - this needs to be done as add_default has been called to setup the proper
     145             : !        outputting of the requested fields. The outfld calls will only write
     146             : !        one file at a time (using the same name in both files), hence the writing
     147             : !        needs to be turned off for all fields, and will be turned on individaully
     148             : !        when needed.
     149             : !--------------------------------------------------------
     150             :    integer :: i
     151             : 
     152             :    ! Return if not turned on
     153        1536 :    if (cam_snapshot_before_num <= 0 .and. cam_snapshot_after_num <= 0) return ! No snapshot files are being requested
     154             : 
     155           0 :    do i=1,nstate_var
     156           0 :       call cam_history_snapshot_deactivate(state_snapshot(i)%standard_name)
     157             :    end do
     158             : 
     159           0 :    do i=1,ncnst_var
     160           0 :       call cam_history_snapshot_deactivate(cnst_snapshot(i)%standard_name)
     161             :    end do
     162             : 
     163           0 :    do i=1,ntend_var
     164           0 :       call cam_history_snapshot_deactivate(tend_snapshot(i)%standard_name)
     165             :    end do
     166             : 
     167           0 :    do i=1,ncam_in_var
     168           0 :       call cam_history_snapshot_deactivate(cam_in_snapshot(i)%standard_name)
     169             :    end do
     170             : 
     171           0 :    do i=1,ncam_out_var
     172           0 :       call cam_history_snapshot_deactivate(cam_out_snapshot(i)%standard_name)
     173             :    end do
     174             : 
     175           0 :    do i=1,npbuf_var
     176           0 :       call cam_history_snapshot_deactivate(pbuf_snapshot(i)%standard_name)
     177             :    end do
     178             : 
     179           0 : end subroutine cam_snapshot_deactivate
     180             : 
     181             : 
     182           0 : subroutine cam_state_snapshot_init(cam_snapshot_before_num_in, cam_snapshot_after_num_in)
     183             : 
     184             : !--------------------------------------------------------
     185             : ! This subroutine does the addfld calls for state
     186             : !--------------------------------------------------------
     187             : 
     188             :    integer,intent(in) :: cam_snapshot_before_num_in, cam_snapshot_after_num_in
     189             : 
     190           0 :    nstate_var = 0
     191             : 
     192           0 :    cam_snapshot_before_num = cam_snapshot_before_num_in
     193           0 :    cam_snapshot_after_num  = cam_snapshot_after_num_in
     194             : 
     195             :    !--------------------------------------------------------
     196             :    ! Add the state variables to the output
     197             :    !--------------------------------------------------------
     198             : 
     199             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     200           0 :      'state%ps',        'state_ps',         'Pa',              horiz_only)
     201             : 
     202             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     203           0 :      'state%psdry',     'state_psdry',      'Pa',              horiz_only)
     204             : 
     205             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     206           0 :      'state%phis',      'state_phis',       'm2/m2',           horiz_only)
     207             : 
     208             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     209           0 :      'state%t',         'state_t',          'K',               'lev')
     210             : 
     211             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     212           0 :      'state%u',         'state_u',          'm s-1',           'lev')
     213             : 
     214             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     215           0 :      'state%v',         'state_v',          'm s-1',           'lev')
     216             : 
     217             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     218           0 :      'state%s',         'state_s',          ' ',               'lev')
     219             : 
     220             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     221           0 :      'state%omega',     'state_omega',      'Pa s-1',           'lev')
     222             : 
     223             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     224           0 :      'state%pmid',      'state_pmid',       'Pa',               'lev')
     225             : 
     226             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     227           0 :      'state%pmiddry',   'state_pmiddry',    'Pa',               'lev')
     228             : 
     229             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     230           0 :      'state%pdel',      'state_pdel',       'Pa',               'lev')
     231             : 
     232             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     233           0 :      'state%pdeldry',   'state_pdeldry',    'Pa',               'lev')
     234             : 
     235             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     236           0 :      'state%rpdel',     'state_rpdel',      'Pa',               'lev')
     237             : 
     238             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     239           0 :      'state%rpdeldry',  'state_rpdeldry',   'Pa',              'lev')
     240             : 
     241             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     242           0 :      'state%lnpmid',    'state_lnpmid',     'unset',           'lev')
     243             : 
     244             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     245           0 :      'state%lnpmiddry', 'state_lnpmiddry',  'unset',           'lev')
     246             : 
     247             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     248           0 :      'state%exner',     'state_exner',      'unset',            'lev')
     249             : 
     250             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     251           0 :      'state%zm',        'state_zm',         'm',                'lev')
     252             : 
     253             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     254           0 :      'state%pint',      'state_pint',       'Pa',               'ilev')
     255             : 
     256             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     257           0 :      'state%pintdry',   'state_pintdry',    'Pa',               'ilev')
     258             : 
     259             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     260           0 :      'state%lnpint',    'state_lnpint',     'unset',            'ilev')
     261             : 
     262             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     263           0 :      'state%lnpintdry', 'state_lnpintdry',  'unset',            'ilev')
     264             : 
     265             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     266           0 :      'state%zi',        'state_zi',         'm',                'ilev')
     267             : 
     268             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     269           0 :      'state%te_ini',    'state_te_ini',     'unset',            horiz_only)
     270             : 
     271             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     272           0 :      'state%te_cur',    'state_te_cur',     'unset',            horiz_only)
     273             : 
     274             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     275           0 :      'state%tw_ini',    'state_tw_ini',     'unset',            horiz_only)
     276             : 
     277             :    call snapshot_addfld( nstate_var, state_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     278           0 :      'state%tw_cur',    'state_tw_cur',     'unset',            horiz_only)
     279             : 
     280           0 : end subroutine cam_state_snapshot_init
     281             : 
     282           0 : subroutine cam_cnst_snapshot_init(cam_snapshot_before_num, cam_snapshot_after_num)
     283             : 
     284             : !--------------------------------------------------------
     285             : ! This subroutine does the addfld calls for state constituent (q) fields
     286             : !--------------------------------------------------------
     287             : 
     288             :    use constituents, only: cnst_name, cnst_longname
     289             : 
     290             :    integer, intent(in) :: cam_snapshot_before_num, cam_snapshot_after_num
     291             : 
     292             :    !--------------------------------------------------------
     293             :    ! Add the cnst variables to the output
     294             :    !--------------------------------------------------------
     295             : 
     296           0 :    ncnst_var = 0 ! Updated inside snapshot_addfld
     297             : 
     298           0 :    do while (ncnst_var < pcnst)
     299             :       call snapshot_addfld(ncnst_var, cnst_snapshot, cam_snapshot_before_num, &
     300           0 :            cam_snapshot_after_num, cnst_name(ncnst_var+1),                    &
     301           0 :            trim('cnst_'//cnst_name(ncnst_var+1)), 'kg kg-1', 'lev')
     302             :    end do
     303             : 
     304           0 : end subroutine cam_cnst_snapshot_init
     305             : 
     306           0 : subroutine cam_tend_snapshot_init(cam_snapshot_before_num, cam_snapshot_after_num)
     307             : 
     308             : !--------------------------------------------------------
     309             : ! This subroutine does the addfld calls for tend fields.
     310             : !--------------------------------------------------------
     311             : 
     312             :    integer,intent(in) :: cam_snapshot_before_num, cam_snapshot_after_num
     313             : 
     314           0 :    ntend_var = 0
     315             : 
     316             :    !--------------------------------------------------------
     317             :    ! Add the physics_tend variables to the output
     318             :    !--------------------------------------------------------
     319             : 
     320             :    call snapshot_addfld( ntend_var, tend_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     321           0 :      'tend%dtdt',        'tend_dtdt',         'K s-1',    'lev')
     322             : 
     323             :    call snapshot_addfld( ntend_var, tend_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     324           0 :      'tend%dudt',        'tend_dudt',         '',    'lev')
     325             : 
     326             :    call snapshot_addfld( ntend_var, tend_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     327           0 :      'tend%dvdt',        'tend_dvdt',         '',    'lev')
     328             : 
     329             :    call snapshot_addfld( ntend_var, tend_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     330           0 :      'tend%flx_net',        'tend_flx_net',   '',    horiz_only)
     331             : 
     332             :    call snapshot_addfld( ntend_var, tend_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     333           0 :      'tend%te_tnd',        'tend_te_tnd',   '',    horiz_only)
     334             : 
     335             :    call snapshot_addfld( ntend_var, tend_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     336           0 :      'tend%tw_tnd',        'tend_tw_tnd',   '',    horiz_only)
     337             : 
     338           0 : end subroutine cam_tend_snapshot_init
     339             : 
     340           0 : subroutine cam_ptend_snapshot_init(cam_snapshot_after_num)
     341             :    use constituents, only: cnst_name, cnst_longname
     342             : 
     343             :    !--------------------------------------------------------
     344             :    ! This subroutine does the addfld calls for ptend fields.
     345             :    !--------------------------------------------------------
     346             : 
     347             :    integer,intent(in) :: cam_snapshot_after_num
     348             : 
     349             :    integer            :: mcnst
     350             :    character(len=64)  :: fname
     351             :    character(len=128) :: lname
     352             :    character(len=32)  :: cam_take_snapshot_before
     353             :    character(len=32)  :: cam_take_snapshot_after
     354             : 
     355             :    call phys_getopts(cam_take_snapshot_before_out = cam_take_snapshot_before, &
     356           0 :         cam_take_snapshot_after_out = cam_take_snapshot_after)
     357             : 
     358           0 :    if (trim(cam_take_snapshot_before) == trim(cam_take_snapshot_after)) then
     359             : 
     360             :       !--------------------------------------------------------
     361             :       ! Add the physics_ptend variables to the output
     362             :       !--------------------------------------------------------
     363             : 
     364             :       call addfld('ptend_s', (/ 'lev' /), 'I', 'J kg-1 s-1',         &
     365           0 :            'heating rate snapshot')
     366           0 :       call add_default('ptend_s', cam_snapshot_after_num, ' ')
     367             : 
     368             :       call addfld('ptend_u', (/ 'lev' /), 'I', 'm s-1 s-1',          &
     369           0 :            'momentum tendency snapshot')
     370           0 :       call add_default('ptend_u', cam_snapshot_after_num, ' ')
     371             : 
     372             :       call addfld('ptend_v', (/ 'lev' /), 'I', 'm s-1 s-1',          &
     373           0 :            'momentum tendency snapshot')
     374           0 :       call add_default('ptend_v', cam_snapshot_after_num, ' ')
     375             : 
     376             :       call addfld('ptend_hflux_srf', horiz_only, 'I', 'W m-2',       &
     377           0 :            'net zonal stress at surface snapshot')
     378           0 :       call add_default('ptend_hflux_srf', cam_snapshot_after_num, ' ')
     379             : 
     380             :       call addfld('ptend_hflux_top', horiz_only, 'I', 'W m-2',       &
     381           0 :            'net zonal stress at top of model snapshot')
     382           0 :       call add_default('ptend_hflux_top', cam_snapshot_after_num, ' ')
     383             : 
     384             :       call addfld('ptend_taux_srf', horiz_only, 'I', 'Pa',           &
     385           0 :            'net meridional stress at surface snapshot')
     386           0 :       call add_default('ptend_taux_srf', cam_snapshot_after_num, ' ')
     387             : 
     388             :       call addfld('ptend_taux_top', horiz_only, 'I', 'Pa',           &
     389           0 :            'net zonal stress at top of model snapshot')
     390           0 :       call add_default('ptend_taux_top', cam_snapshot_after_num, ' ')
     391             : 
     392             :       call addfld('ptend_tauy_srf', horiz_only, 'I', 'Pa',           &
     393           0 :            'net meridional stress at surface snapshot')
     394           0 :       call add_default('ptend_tauy_srf', cam_snapshot_after_num, ' ')
     395             : 
     396             :       call addfld('ptend_tauy_top', horiz_only, 'I', 'Pa',           &
     397           0 :            'net meridional stress at top of model snapshot')
     398           0 :       call add_default('ptend_tauy_top', cam_snapshot_after_num, ' ')
     399             : 
     400           0 :       do mcnst = 1, pcnst
     401           0 :          fname = 'ptend_'//trim(cnst_name(mcnst))
     402           0 :          lname = 'tendency of '//trim(cnst_longname(mcnst))
     403           0 :          call addfld(trim(fname), (/ 'lev' /), 'I', 'kg kg-1 s-1', trim(lname))
     404           0 :          call add_default(trim(fname), cam_snapshot_after_num, ' ')
     405             : 
     406           0 :          fname = 'ptend_cflx_srf_'//trim(cnst_name(mcnst))
     407           0 :          lname = 'flux of '//trim(cnst_longname(mcnst))//' at surface snapshot'
     408           0 :          call addfld(trim(fname), horiz_only, 'I', 'kg m-2 s-1', trim(lname))
     409           0 :          call add_default(trim(fname), cam_snapshot_after_num, ' ')
     410             : 
     411           0 :          fname = 'ptend_cflx_top_'//trim(cnst_name(mcnst))
     412           0 :          lname = 'flux of '//trim(cnst_longname(mcnst))//' at top of model snapshot'
     413           0 :          call addfld(trim(fname), horiz_only, 'I', 'kg m-2 s-1', trim(lname))
     414           0 :          call add_default(trim(fname), cam_snapshot_after_num, ' ')
     415             :       end do
     416             : 
     417             :    end if
     418             : 
     419           0 : end subroutine cam_ptend_snapshot_init
     420             : 
     421           0 : subroutine cam_in_snapshot_init(cam_snapshot_before_num, cam_snapshot_after_num, cam_in)
     422             : 
     423             : !--------------------------------------------------------
     424             : ! This subroutine does the addfld calls for cam_in fields
     425             : !--------------------------------------------------------
     426             : 
     427             :    type(cam_in_t), intent(in) :: cam_in
     428             : 
     429             :    integer,intent(in) :: cam_snapshot_before_num, cam_snapshot_after_num
     430             : 
     431           0 :    ncam_in_var = 0
     432             : 
     433             :    !--------------------------------------------------------
     434             :    ! Add the state variables to the output
     435             :    !--------------------------------------------------------
     436             : 
     437             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     438           0 :      'cam_in%landfrac',        'cam_in_landfrac',          'unset',          horiz_only)
     439             : 
     440             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     441           0 :      'cam_in%ocnfrac',         'cam_in_ocnfrac',           'unset',          horiz_only)
     442             : 
     443             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     444           0 :      'cam_in%snowhland',       'cam_in_snowhland',         'unset',          horiz_only)
     445             : 
     446             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     447           0 :      'cam_in%ts',              'cam_in_ts',                'unset',          horiz_only)
     448             : 
     449             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     450           0 :      'cam_in%sst',             'cam_in_sst',               'unset',          horiz_only)
     451             : 
     452             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     453           0 :      'cam_in%icefrac',         'cam_in_icefrac',           'unset',          horiz_only)
     454             : 
     455             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     456           0 :      'cam_in%shf',             'cam_in_shf',               'unset',          horiz_only)
     457             : 
     458             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     459           0 :      'cam_in%cflx',            'cam_in_cflx',              'unset',          horiz_only)
     460             : 
     461             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     462           0 :      'cam_in%wsx',             'cam_in_wsx',               'unset',          horiz_only)
     463             : 
     464             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     465           0 :      'cam_in%wsy',             'cam_in_wsy',               'unset',          horiz_only)
     466             : 
     467             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     468           0 :      'cam_in%asdif',           'cam_in_asdif',             'unset',          horiz_only)
     469             : 
     470             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     471           0 :      'cam_in%aldif',           'cam_in_aldif',             'unset',          horiz_only)
     472             : 
     473             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     474           0 :      'cam_in%lwup',            'cam_in_lwup',              'unset',          horiz_only)
     475             : 
     476             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     477           0 :      'cam_in%asdir',           'cam_in_asdir',             'unset',          horiz_only)
     478             : 
     479             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     480           0 :      'cam_in%aldir',           'cam_in_aldir',             'unset',          horiz_only)
     481             : 
     482           0 :     if (associated (cam_in%meganflx)) &
     483             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     484           0 :       'cam_in%meganflx',        'cam_in_meganflx',          'unset',          horiz_only)
     485             : 
     486           0 :     if (associated (cam_in%fireflx)) &
     487             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     488           0 :       'cam_in%fireflx',         'cam_in_fireflx',           'unset',          horiz_only)
     489             : 
     490           0 :     if (associated (cam_in%fireztop)) &
     491             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     492           0 :       'cam_in%fireztop',        'cam_in_fireztop',          'unset',          horiz_only)
     493             : 
     494           0 :     if (associated (cam_in%depvel)) &
     495             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     496           0 :       'cam_in%depvel',          'cam_in_depvel',            'unset',          horiz_only)
     497             : 
     498             :    call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     499           0 :      'cam_in%lhf',             'cam_in_lhf',               'unset',          horiz_only)
     500             : 
     501           0 :     if (associated (cam_in%fv)) &
     502             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     503           0 :       'cam_in%fv',              'cam_in_fv',                'unset',          horiz_only)
     504             : 
     505           0 :     if (associated (cam_in%ram1)) &
     506             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     507           0 :       'cam_in%ram1',            'cam_in_ram1',              'unset',          horiz_only)
     508             : 
     509           0 :     if (associated (cam_in%dstflx)) &
     510             :     call snapshot_addfld( ncam_in_var, cam_in_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     511           0 :       'cam_in%dstflx',          'cam_in_dstflx',            'unset',          horiz_only)
     512             : 
     513           0 : end subroutine cam_in_snapshot_init
     514             : 
     515           0 : subroutine cam_out_snapshot_init(cam_snapshot_before_num, cam_snapshot_after_num, cam_out)
     516             : 
     517             : !--------------------------------------------------------
     518             : ! This subroutine does the addfld calls for cam_out fields
     519             : !--------------------------------------------------------
     520             : 
     521             :    type(cam_out_t),  intent(in) :: cam_out
     522             : 
     523             :    integer,          intent(in) :: cam_snapshot_before_num, cam_snapshot_after_num
     524             : 
     525           0 :    ncam_out_var = 0
     526             : 
     527             :    !--------------------------------------------------------
     528             :    ! Add the state variables to the output
     529             :    !--------------------------------------------------------
     530             : 
     531             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     532           0 :      'cam_out%precc',               'cam_out_precc',           'm s-1',          horiz_only)
     533             : 
     534             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     535           0 :      'cam_out%precl',               'cam_out_precl',           'm s-1',          horiz_only)
     536             : 
     537             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     538           0 :      'cam_out%precsc',               'cam_out_precsc',         'm s-1',          horiz_only)
     539             : 
     540             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     541           0 :      'cam_out%precsl',               'cam_out_precsl',         'm s-1',          horiz_only)
     542             : 
     543           0 :    if (associated(cam_out%nhx_nitrogen_flx)) &
     544             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     545           0 :      'cam_out%nhx_nitrogen_flx',     'cam_out_nhx_nitrogen_flx',  'kgN m2-1 sec-1', horiz_only)
     546             : 
     547           0 :    if (associated(cam_out%noy_nitrogen_flx)) &
     548             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     549           0 :      'cam_out%noy_nitrogen_flx',     'cam_out_noy_nitrogen_flx',  'kgN m2-1 sec-1', horiz_only)
     550             : 
     551             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     552           0 :      'cam_out%bcphodry',             'cam_out_bcphodry',       'kg m-2 s-1',     horiz_only)
     553             : 
     554             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     555           0 :      'cam_out%bcphidry',             'cam_out_bcphidry',       'kg m-2 s-1',     horiz_only)
     556             : 
     557             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     558           0 :      'cam_out%ocphodry',             'cam_out_ocphodry',       'kg m-2 s-1',     horiz_only)
     559             : 
     560             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     561           0 :      'cam_out%ocphidry',             'cam_out_ocphidry',       'kg m-2 s-1',     horiz_only)
     562             : 
     563             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     564           0 :      'cam_out%bcphiwet',             'cam_out_bcphiwet',       'kg m-2 s-1',     horiz_only)
     565             : 
     566             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     567           0 :      'cam_out%ocphiwet',             'cam_out_ocphiwet',       'kg m-2 s-1',     horiz_only)
     568             : 
     569             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     570           0 :      'cam_out%dstwet1',             'cam_out_dstwet1',         'kg m-2 s-1',     horiz_only)
     571             : 
     572             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     573           0 :      'cam_out%dstwet2',             'cam_out_dstwet2',         'kg m-2 s-1',     horiz_only)
     574             : 
     575             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     576           0 :      'cam_out%dstwet3',             'cam_out_dstwet3',         'kg m-2 s-1',     horiz_only)
     577             : 
     578             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     579           0 :      'cam_out%dstwet4',             'cam_out_dstwet4',         'kg m-2 s-1',     horiz_only)
     580             : 
     581             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     582           0 :      'cam_out%dstdry1',             'cam_out_dstdry1',         'kg m-2 s-1',     horiz_only)
     583             : 
     584             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     585           0 :      'cam_out%dstdry2',             'cam_out_dstdry2',         'kg m-2 s-1',     horiz_only)
     586             : 
     587             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     588           0 :      'cam_out%dstdry3',             'cam_out_dstdry3',         'kg m-2 s-1',     horiz_only)
     589             : 
     590             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     591           0 :      'cam_out%dstdry4',             'cam_out_dstdry4',         'kg m-2 s-1',     horiz_only)
     592             : 
     593             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     594           0 :      'cam_out%sols',                'cam_out_sols',            'W m-2',          horiz_only)
     595             : 
     596             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     597           0 :      'cam_out%soll',                'cam_out_soll',            'W m-2',          horiz_only)
     598             : 
     599             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     600           0 :      'cam_out%solsd',               'cam_out_solsd',           'W m-2',          horiz_only)
     601             : 
     602             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     603           0 :      'cam_out%solld',               'cam_out_solld',           'W m-2',          horiz_only)
     604             : 
     605             :    call snapshot_addfld( ncam_out_var, cam_out_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     606           0 :      'cam_out%netsw',               'cam_out_netsw',           'unset',          horiz_only)
     607             : 
     608           0 : end subroutine cam_out_snapshot_init
     609             : 
     610           0 : subroutine cam_pbuf_snapshot_init(cam_snapshot_before_num, cam_snapshot_after_num, pbuf)
     611             : 
     612             : !--------------------------------------------------------
     613             : ! This subroutine does the addfld calls for pbuf fields.
     614             : !--------------------------------------------------------
     615             : 
     616             :    use physics_buffer, only: pbuf_get_dim_strings
     617             : 
     618             :    integer,                   intent(in) :: cam_snapshot_before_num, cam_snapshot_after_num
     619             :    type(physics_buffer_desc), intent(in) :: pbuf(:)
     620             : 
     621             :    integer :: i, j, npbuf
     622           0 :    type(pbuf_info_type) :: pbuf_info(size(pbuf))
     623           0 :    character(len=40) :: const_cname(ncnst_var)
     624           0 :    character(len=40) :: dim_strings(size(pbuf),6) ! Hardwired 6 potential dimensions in pbuf
     625             : 
     626           0 :    npbuf = size(pbuf(:))
     627             : 
     628             :    !--------------------------------------------------------
     629             :    ! fill the name, standard name and units for pbuf_info
     630             :    !--------------------------------------------------------
     631             : 
     632           0 :    call fill_pbuf_info(pbuf_info, pbuf, const_cname)
     633             : 
     634             :    !--------------------------------------------------------
     635             :    ! Determine the indices for the addfld call based on the dimensions in the pbuf
     636             :    !--------------------------------------------------------
     637             : 
     638           0 :    call pbuf_get_dim_strings(pbuf, dim_strings)
     639           0 :    do i=1, npbuf
     640             :       ! If the second dimension is empty, then this is a horiz_only field
     641           0 :       if (trim(dim_strings(i,2)) == '') then
     642           0 :          pbuf_info(i)%dim_string(1) = horiz_only
     643             :       else
     644             :          ! The first dimension is the horizontal dimension and should not be used in the addfld call
     645           0 :          do j=2,6
     646           0 :             pbuf_info(i)%dim_string(j-1) = dim_strings(i,j)
     647             :          end do
     648             :       end if
     649             :    end do
     650             : 
     651             :    !--------------------------------------------------------
     652             :    ! Now that all of the information for the pbufs is stored, call the addfld
     653             :    !--------------------------------------------------------
     654           0 :    npbuf_var = 0 ! Updated inside snapshot_addfld
     655             : 
     656           0 :    do while (npbuf_var < npbuf)
     657             :       call snapshot_addfld_nd( npbuf_var, pbuf_snapshot,  cam_snapshot_before_num, cam_snapshot_after_num, &
     658           0 :         pbuf_info(npbuf_var+1)%name,   pbuf_info(npbuf_var+1)%standard_name,   pbuf_info(npbuf_var+1)%units,&
     659           0 :         pbuf_info(npbuf_var+1)%dim_string)
     660             :    end do
     661             : 
     662           0 : end subroutine cam_pbuf_snapshot_init
     663             : 
     664           0 : subroutine snapshot_addfld_nd(nddt_var, ddt_snapshot, cam_snapshot_before_num, cam_snapshot_after_num,&
     665           0 :     ddt_string, standard_name, units, dimension_string)
     666             : 
     667             :    integer,                 intent(inout)  :: nddt_var
     668             :    type (snapshot_type_nd), intent(inout) ::  ddt_snapshot(:)
     669             : 
     670             : 
     671             :    integer,          intent(in) :: cam_snapshot_before_num
     672             :    integer,          intent(in) :: cam_snapshot_after_num
     673             :    character(len=*), intent(in) :: ddt_string
     674             :    character(len=*), intent(in) :: standard_name
     675             :    character(len=*), intent(in) :: units
     676             :    character(len=*), intent(in) :: dimension_string(:)
     677             : 
     678             :    integer :: ndims
     679             : 
     680           0 :    nddt_var=nddt_var+1
     681             : 
     682           0 :    if (nddt_var > size(ddt_snapshot)) &
     683           0 :       call endrun(' ERROR in snapshot_addfld: ddt_snapshot array not allocated large enough')
     684             : 
     685           0 :    ndims = count(dimension_string /= '')
     686             : 
     687           0 :    if (trim(dimension_string(1)) == horiz_only) then
     688           0 :       call addfld(standard_name, horiz_only, 'I', units, standard_name)
     689             :    else
     690           0 :       call addfld(standard_name, dimension_string(1:ndims), 'I', units, standard_name)
     691             :    end if
     692           0 :    if (cam_snapshot_before_num > 0) call add_default(standard_name, cam_snapshot_before_num, ' ')
     693           0 :    if (cam_snapshot_after_num > 0)  call add_default(standard_name, cam_snapshot_after_num, ' ')
     694             : 
     695           0 :    ddt_snapshot(nddt_var)%ddt_string    = ddt_string
     696           0 :    ddt_snapshot(nddt_var)%standard_name = standard_name
     697           0 :    ddt_snapshot(nddt_var)%dim_name(:)   = dimension_string(:)
     698           0 :    ddt_snapshot(nddt_var)%units         = units
     699             : 
     700             : 
     701           0 : end subroutine snapshot_addfld_nd
     702             : 
     703           0 : subroutine snapshot_addfld(nddt_var, ddt_snapshot, cam_snapshot_before_num, cam_snapshot_after_num,&
     704             :     ddt_string, standard_name, units, dimension_string)
     705             : 
     706             :    integer,              intent(inout)  :: nddt_var
     707             :    type (snapshot_type), intent(inout) ::  ddt_snapshot(:)
     708             : 
     709             : 
     710             :    integer,          intent(in) :: cam_snapshot_before_num
     711             :    integer,          intent(in) :: cam_snapshot_after_num
     712             :    character(len=*), intent(in) :: ddt_string
     713             :    character(len=*), intent(in) :: standard_name
     714             :    character(len=*), intent(in) :: units
     715             :    character(len=*), intent(in) :: dimension_string
     716             : 
     717             : 
     718           0 :    nddt_var=nddt_var+1
     719             : 
     720           0 :    if (nddt_var > size(ddt_snapshot)) &
     721           0 :       call endrun(' ERROR in snapshot_addfld: ddt_snapshot array not allocated large enough')
     722             : 
     723           0 :    call addfld(standard_name, dimension_string, 'I', units, standard_name)
     724           0 :    if (cam_snapshot_before_num > 0) call add_default(standard_name, cam_snapshot_before_num, ' ')
     725           0 :    if (cam_snapshot_after_num > 0)  call add_default(standard_name, cam_snapshot_after_num, ' ')
     726             : 
     727           0 :    ddt_snapshot(nddt_var)%ddt_string    = ddt_string
     728           0 :    ddt_snapshot(nddt_var)%standard_name = standard_name
     729           0 :    ddt_snapshot(nddt_var)%dim_name      = dimension_string
     730           0 :    ddt_snapshot(nddt_var)%units         = units
     731             : 
     732             : 
     733           0 : end subroutine snapshot_addfld
     734             : 
     735           0 : subroutine state_snapshot_all_outfld(lchnk, file_num, state)
     736             : 
     737             :    integer,              intent(in)  :: lchnk
     738             :    integer,              intent(in)  :: file_num
     739             :    type(physics_state),  intent(in)  :: state
     740             : 
     741             :    integer :: i
     742             : 
     743           0 :    do i=1, nstate_var
     744             : 
     745             :       ! Turn on the writing for only the requested tape (file_num)
     746           0 :       call cam_history_snapshot_activate(trim(state_snapshot(i)%standard_name), file_num)
     747             : 
     748             :       ! Select the state field which is being written
     749             :       select case(state_snapshot(i)%ddt_string)
     750             : 
     751             :       case ('state%ps')
     752           0 :          call outfld(state_snapshot(i)%standard_name, state%ps, pcols, lchnk)
     753             : 
     754             :       case ('state%psdry')
     755           0 :          call outfld(state_snapshot(i)%standard_name, state%psdry, pcols, lchnk)
     756             : 
     757             :       case ('state%phis')
     758           0 :          call outfld(state_snapshot(i)%standard_name, state%phis, pcols, lchnk)
     759             : 
     760             :       case ('state%t')
     761           0 :          call outfld(state_snapshot(i)%standard_name, state%t, pcols, lchnk)
     762             : 
     763             :       case ('state%u')
     764           0 :          call outfld(state_snapshot(i)%standard_name, state%u, pcols, lchnk)
     765             : 
     766             :       case ('state%v')
     767           0 :          call outfld(state_snapshot(i)%standard_name, state%v, pcols, lchnk)
     768             : 
     769             :       case ('state%s')
     770           0 :          call outfld(state_snapshot(i)%standard_name, state%s, pcols, lchnk)
     771             : 
     772             :       case ('state%omega')
     773           0 :          call outfld(state_snapshot(i)%standard_name, state%omega, pcols, lchnk)
     774             : 
     775             :       case ('state%pmid')
     776           0 :          call outfld(state_snapshot(i)%standard_name, state%pmid, pcols, lchnk)
     777             : 
     778             :       case ('state%pmiddry')
     779           0 :          call outfld(state_snapshot(i)%standard_name, state%pmiddry, pcols, lchnk)
     780             : 
     781             :       case ('state%pdel')
     782           0 :          call outfld(state_snapshot(i)%standard_name, state%pdel, pcols, lchnk)
     783             : 
     784             :       case ('state%pdeldry')
     785           0 :          call outfld(state_snapshot(i)%standard_name, state%pdeldry, pcols, lchnk)
     786             : 
     787             :       case ('state%rpdel')
     788           0 :          call outfld(state_snapshot(i)%standard_name, state%rpdel, pcols, lchnk)
     789             : 
     790             :       case ('state%rpdeldry')
     791           0 :          call outfld(state_snapshot(i)%standard_name, state%rpdeldry, pcols, lchnk)
     792             : 
     793             :       case ('state%lnpmid')
     794           0 :          call outfld(state_snapshot(i)%standard_name, state%lnpmid, pcols, lchnk)
     795             : 
     796             :       case ('state%lnpmiddry')
     797           0 :          call outfld(state_snapshot(i)%standard_name, state%lnpmiddry, pcols, lchnk)
     798             : 
     799             :       case ('state%exner')
     800           0 :          call outfld(state_snapshot(i)%standard_name, state%exner, pcols, lchnk)
     801             : 
     802             :       case ('state%zm')
     803           0 :          call outfld(state_snapshot(i)%standard_name, state%zm, pcols, lchnk)
     804             : 
     805             :       case ('state%pint')
     806           0 :          call outfld(state_snapshot(i)%standard_name, state%pint, pcols, lchnk)
     807             : 
     808             :       case ('state%pintdry')
     809           0 :          call outfld(state_snapshot(i)%standard_name, state%pintdry, pcols, lchnk)
     810             : 
     811             :       case ('state%lnpint')
     812           0 :          call outfld(state_snapshot(i)%standard_name, state%lnpint, pcols, lchnk)
     813             : 
     814             :       case ('state%lnpintdry')
     815           0 :          call outfld(state_snapshot(i)%standard_name, state%lnpintdry, pcols, lchnk)
     816             : 
     817             :       case ('state%zi')
     818           0 :          call outfld(state_snapshot(i)%standard_name, state%zi, pcols, lchnk)
     819             : 
     820             :       case ('state%te_ini')
     821           0 :          call outfld(state_snapshot(i)%standard_name, state%te_ini, pcols, lchnk)
     822             : 
     823             :       case ('state%te_cur')
     824           0 :          call outfld(state_snapshot(i)%standard_name, state%te_cur, pcols, lchnk)
     825             : 
     826             :       case ('state%tw_ini')
     827           0 :          call outfld(state_snapshot(i)%standard_name, state%tw_ini, pcols, lchnk)
     828             : 
     829             :       case ('state%tw_cur')
     830           0 :          call outfld(state_snapshot(i)%standard_name, state%tw_cur, pcols, lchnk)
     831             : 
     832             :       case default
     833           0 :          call endrun('ERROR in state_snapshot_all_outfld: no match found for '//trim(state_snapshot(i)%ddt_string))
     834             : 
     835             :       end select
     836             : 
     837           0 :       call cam_history_snapshot_deactivate(trim(state_snapshot(i)%standard_name))
     838             : 
     839             :    end do
     840             : 
     841           0 : end subroutine state_snapshot_all_outfld
     842             : 
     843           0 : subroutine cam_snapshot_ptend_outfld(ptend, lchnk)
     844             : 
     845             :    use constituents, only: cnst_name, cnst_longname
     846             :    !--------------------------------------------------------
     847             :    ! This subroutine does the outfld calls for ptend fields.
     848             :    !--------------------------------------------------------
     849             : 
     850             :    type(physics_ptend), intent(in) :: ptend
     851             :    integer,             intent(in) :: lchnk
     852             : 
     853             :    integer                         :: mcnst
     854             :    character(len=128)              :: fname
     855             : 
     856             :    !--------------------------------------------------------
     857             :    ! Add the physics_ptend variables to the output
     858             :    !--------------------------------------------------------
     859             : 
     860           0 :    if (ptend%ls) then
     861           0 :       call outfld('ptend_s', ptend%s, pcols, lchnk)
     862             : 
     863           0 :       call outfld('ptend_hflux_srf', ptend%hflux_srf, pcols, lchnk)
     864             : 
     865           0 :       call outfld('ptend_hflux_top', ptend%hflux_top, pcols, lchnk)
     866             :    end if
     867             : 
     868           0 :    if (ptend%lu) then
     869           0 :       call outfld('ptend_u', ptend%u, pcols, lchnk)
     870             : 
     871           0 :       call outfld('ptend_taux_srf', ptend%taux_srf, pcols, lchnk)
     872             : 
     873           0 :       call outfld('ptend_taux_top', ptend%taux_top, pcols, lchnk)
     874             :    end if
     875             : 
     876           0 :    if (ptend%lv) then
     877           0 :       call outfld('ptend_v', ptend%v, pcols, lchnk)
     878             : 
     879           0 :       call outfld('ptend_tauy_srf', ptend%tauy_srf, pcols, lchnk)
     880             : 
     881           0 :       call outfld('ptend_tauy_top', ptend%tauy_top, pcols, lchnk)
     882             :    end if
     883             : 
     884           0 :    do mcnst = 1, pcnst
     885           0 :       if (ptend%lq(mcnst)) then
     886           0 :          fname = 'ptend_'//trim(cnst_name(mcnst))
     887           0 :          call outfld(trim(fname), ptend%q(:,:,mcnst), pcols, lchnk)
     888             : 
     889           0 :          fname = 'ptend_cflx_srf_'//trim(cnst_name(mcnst))
     890           0 :          call outfld(trim(fname), ptend%cflx_srf(:,mcnst), pcols, lchnk)
     891             : 
     892           0 :          fname = 'ptend_cflx_top_'//trim(cnst_name(mcnst))
     893           0 :          call outfld(trim(fname), ptend%cflx_top(:,mcnst), pcols, lchnk)
     894             :       end if
     895             :    end do
     896             : 
     897             : 
     898           0 : end subroutine cam_snapshot_ptend_outfld
     899             : 
     900           0 : subroutine cnst_snapshot_all_outfld(lchnk, file_num, cnst)
     901             : 
     902             :    integer,             intent(in)  :: lchnk
     903             :    integer,             intent(in)  :: file_num
     904             :    real(r8),            intent(in)  :: cnst(:,:,:)
     905             : 
     906             :    integer :: i
     907             : 
     908           0 :    do i=1, ncnst_var
     909             : 
     910             :       ! Turn on the writing for only the requested tape (file_num)
     911           0 :       call cam_history_snapshot_activate(trim(cnst_snapshot(i)%standard_name), file_num)
     912           0 :       call outfld(cnst_snapshot(i)%standard_name, cnst(:,:,i), pcols, lchnk)
     913             : 
     914             :       ! Now that the field has been written, turn off the writing for field
     915           0 :       call cam_history_snapshot_deactivate(trim(cnst_snapshot(i)%standard_name))
     916             : 
     917             :    end do
     918             : 
     919           0 : end subroutine cnst_snapshot_all_outfld
     920             : 
     921           0 : subroutine tend_snapshot_all_outfld(lchnk, file_num, tend)
     922             : 
     923             :    integer,             intent(in)  :: lchnk
     924             :    integer,             intent(in)  :: file_num
     925             :    type(physics_tend),  intent(in)  :: tend
     926             : 
     927             :    integer :: i
     928             : 
     929           0 :    do i=1, ntend_var
     930             : 
     931             :       ! Turn on the writing for only the requested tape (file_num)
     932           0 :       call cam_history_snapshot_activate(trim(tend_snapshot(i)%standard_name), file_num)
     933             : 
     934             :       ! Select the tend field which is being written
     935             :       select case(tend_snapshot(i)%ddt_string)
     936             : 
     937             :       case ('tend%dtdt')
     938           0 :          call outfld(tend_snapshot(i)%standard_name, tend%dtdt, pcols, lchnk)
     939             : 
     940             :       case ('tend%dudt')
     941           0 :          call outfld(tend_snapshot(i)%standard_name, tend%dudt, pcols, lchnk)
     942             : 
     943             :       case ('tend%dvdt')
     944           0 :          call outfld(tend_snapshot(i)%standard_name, tend%dvdt, pcols, lchnk)
     945             : 
     946             :       case ('tend%flx_net')
     947           0 :          call outfld(tend_snapshot(i)%standard_name, tend%flx_net, pcols, lchnk)
     948             : 
     949             :       case ('tend%te_tnd')
     950           0 :          call outfld(tend_snapshot(i)%standard_name, tend%te_tnd, pcols, lchnk)
     951             : 
     952             :       case ('tend%tw_tnd')
     953           0 :          call outfld(tend_snapshot(i)%standard_name, tend%tw_tnd, pcols, lchnk)
     954             : 
     955             :       case default
     956           0 :          call endrun('ERROR in tend_snapshot_all_outfld: no match found for '//trim(tend_snapshot(i)%ddt_string))
     957             : 
     958             :       end select
     959             : 
     960           0 :       call cam_history_snapshot_deactivate(trim(tend_snapshot(i)%standard_name))
     961             : 
     962             :    end do
     963             : 
     964           0 : end subroutine tend_snapshot_all_outfld
     965             : 
     966           0 : subroutine cam_in_snapshot_all_outfld(lchnk, file_num, cam_in)
     967             : 
     968             :    integer,         intent(in)  :: lchnk
     969             :    integer,         intent(in)  :: file_num
     970             :    type(cam_in_t),  intent(in)  :: cam_in
     971             : 
     972             :    integer :: i
     973             : 
     974           0 :    do i=1, ncam_in_var
     975             : 
     976             :       ! Turn on the writing for only the requested tape (file_num)
     977           0 :       call cam_history_snapshot_activate(trim(cam_in_snapshot(i)%standard_name), file_num)
     978             : 
     979             :       ! Select the cam_in field which is being written
     980             :       select case(cam_in_snapshot(i)%ddt_string)
     981             : 
     982             :       case ('cam_in%landfrac')
     983           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%landfrac, pcols, lchnk)
     984             :       case ('cam_in%ocnfrac')
     985           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%ocnfrac, pcols, lchnk)
     986             :       case ('cam_in%snowhland')
     987           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%snowhland, pcols, lchnk)
     988             :       case ('cam_in%ts')
     989           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%ts, pcols, lchnk)
     990             :       case ('cam_in%sst')
     991           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%sst, pcols, lchnk)
     992             :       case ('cam_in%icefrac')
     993           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%icefrac, pcols, lchnk)
     994             :       case ('cam_in%shf')
     995           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%shf, pcols, lchnk)
     996             :       case ('cam_in%cflx')
     997           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%cflx, pcols, lchnk)
     998             :       case ('cam_in%wsx')
     999           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%wsx, pcols, lchnk)
    1000             :       case ('cam_in%wsy')
    1001           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%wsy, pcols, lchnk)
    1002             :       case ('cam_in%asdif')
    1003           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%asdif, pcols, lchnk)
    1004             :       case ('cam_in%aldif')
    1005           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%aldif, pcols, lchnk)
    1006             :       case ('cam_in%lwup')
    1007           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%lwup, pcols, lchnk)
    1008             :       case ('cam_in%asdir')
    1009           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%asdir, pcols, lchnk)
    1010             :       case ('cam_in%aldir')
    1011           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%aldir, pcols, lchnk)
    1012             :       case ('cam_in%meganflx')
    1013           0 :          if (associated (cam_in%meganflx)) &
    1014           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%meganflx, pcols, lchnk)
    1015             :       case ('cam_in%fireflx')
    1016           0 :          if (associated (cam_in%fireflx)) &
    1017           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%fireflx, pcols, lchnk)
    1018             :       case ('cam_in%fireztop')
    1019           0 :          if (associated (cam_in%fireztop)) &
    1020           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%fireztop, pcols, lchnk)
    1021             :       case ('cam_in%depvel')
    1022           0 :          if (associated (cam_in%depvel)) &
    1023           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%depvel, pcols, lchnk)
    1024             :       case ('cam_in%lhf')
    1025           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%lhf, pcols, lchnk)
    1026             :       case ('cam_in%fv')
    1027           0 :          if (associated (cam_in%fv)) &
    1028           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%fv, pcols, lchnk)
    1029             :       case ('cam_in%ram1')
    1030           0 :          if (associated (cam_in%ram1)) &
    1031           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%ram1, pcols, lchnk)
    1032             :       case ('cam_in%dstflx')
    1033           0 :          if (associated (cam_in%dstflx)) &
    1034           0 :          call outfld(cam_in_snapshot(i)%standard_name, cam_in%dstflx, pcols, lchnk)
    1035             : 
    1036             :       case default
    1037           0 :          call endrun('ERROR in cam_in_snapshot_all_outfld: no match found for '//trim(cam_in_snapshot(i)%ddt_string))
    1038             : 
    1039             :       end select
    1040             : 
    1041           0 :       call cam_history_snapshot_deactivate(trim(cam_in_snapshot(i)%standard_name))
    1042             : 
    1043             :    end do
    1044             : 
    1045           0 : end subroutine cam_in_snapshot_all_outfld
    1046             : 
    1047           0 : subroutine cam_out_snapshot_all_outfld(lchnk, file_num, cam_out)
    1048             : 
    1049             :    integer,         intent(in)  :: lchnk
    1050             :    integer,         intent(in)  :: file_num
    1051             :    type(cam_out_t), intent(in)  :: cam_out
    1052             : 
    1053             :    integer :: i
    1054             : 
    1055           0 :    do i=1, ncam_out_var
    1056             : 
    1057             :       ! Turn on the writing for only the requested tape (file_num)
    1058           0 :       call cam_history_snapshot_activate(trim(cam_out_snapshot(i)%standard_name), file_num)
    1059             : 
    1060             :       ! Select the cam_out field which is being written
    1061             :       select case(cam_out_snapshot(i)%ddt_string)
    1062             : 
    1063             :       case ('cam_out%precc')
    1064           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%precc, pcols, lchnk)
    1065             : 
    1066             :       case ('cam_out%precl')
    1067           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%precl, pcols, lchnk)
    1068             : 
    1069             :       case ('cam_out%precsc')
    1070           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%precsc, pcols, lchnk)
    1071             : 
    1072             :       case ('cam_out%precsl')
    1073           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%precsl, pcols, lchnk)
    1074             : 
    1075             :       case ('cam_out%nhx_nitrogen_flx')
    1076           0 :          if (associated(cam_out%nhx_nitrogen_flx)) &
    1077           0 :             call outfld(cam_out_snapshot(i)%standard_name, cam_out%nhx_nitrogen_flx, pcols, lchnk)
    1078             : 
    1079             :       case ('cam_out%noy_nitrogen_flx')
    1080           0 :          if (associated(cam_out%noy_nitrogen_flx)) &
    1081           0 :             call outfld(cam_out_snapshot(i)%standard_name, cam_out%noy_nitrogen_flx, pcols, lchnk)
    1082             : 
    1083             :       case ('cam_out%bcphodry')
    1084           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%bcphodry, pcols, lchnk)
    1085             : 
    1086             :       case ('cam_out%bcphidry')
    1087           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%bcphidry, pcols, lchnk)
    1088             : 
    1089             :       case ('cam_out%ocphodry')
    1090           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%ocphodry, pcols, lchnk)
    1091             : 
    1092             :       case ('cam_out%ocphidry')
    1093           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%ocphidry, pcols, lchnk)
    1094             : 
    1095             :       case ('cam_out%bcphiwet')
    1096           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%bcphiwet, pcols, lchnk)
    1097             : 
    1098             :       case ('cam_out%ocphiwet')
    1099           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%ocphiwet, pcols, lchnk)
    1100             : 
    1101             :       case ('cam_out%dstwet1')
    1102           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstwet1, pcols, lchnk)
    1103             : 
    1104             :       case ('cam_out%dstwet2')
    1105           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstwet2, pcols, lchnk)
    1106             : 
    1107             :       case ('cam_out%dstwet3')
    1108           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstwet3, pcols, lchnk)
    1109             : 
    1110             :       case ('cam_out%dstwet4')
    1111           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstwet4, pcols, lchnk)
    1112             : 
    1113             :       case ('cam_out%dstdry1')
    1114           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstdry1, pcols, lchnk)
    1115             : 
    1116             :       case ('cam_out%dstdry2')
    1117           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstdry2, pcols, lchnk)
    1118             : 
    1119             :       case ('cam_out%dstdry3')
    1120           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstdry3, pcols, lchnk)
    1121             : 
    1122             :       case ('cam_out%dstdry4')
    1123           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%dstdry4, pcols, lchnk)
    1124             : 
    1125             :       case ('cam_out%sols')
    1126           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%sols, pcols, lchnk)
    1127             : 
    1128             :       case ('cam_out%soll')
    1129           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%soll, pcols, lchnk)
    1130             : 
    1131             :       case ('cam_out%solsd')
    1132           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%solsd, pcols, lchnk)
    1133             : 
    1134             :       case ('cam_out%solld')
    1135           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%solld, pcols, lchnk)
    1136             : 
    1137             :       case ('cam_out%flwds')
    1138           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%flwds, pcols, lchnk)
    1139             : 
    1140             :       case ('cam_out%netsw')
    1141           0 :          call outfld(cam_out_snapshot(i)%standard_name, cam_out%netsw, pcols, lchnk)
    1142             : 
    1143             :       case default
    1144           0 :          call endrun('ERROR in cam_out_snapshot_all_outfld: no match found for '//trim(cam_out_snapshot(i)%ddt_string))
    1145             : 
    1146             :       end select
    1147             : 
    1148           0 :       call cam_history_snapshot_deactivate(trim(cam_out_snapshot(i)%standard_name))
    1149             : 
    1150             :    end do
    1151             : 
    1152           0 : end subroutine cam_out_snapshot_all_outfld
    1153             : 
    1154           0 : subroutine cam_pbuf_snapshot_all_outfld(lchnk, file_num, pbuf)
    1155             :    use physics_buffer, only: pbuf_is_used
    1156             : 
    1157             :    integer,                   intent(in) :: lchnk
    1158             :    integer,                            intent(in) :: file_num
    1159             :    type(physics_buffer_desc), pointer, intent(in) :: pbuf(:)
    1160             : 
    1161             :    integer :: i, pbuf_idx, ndims
    1162           0 :    real(r8), pointer, dimension(:,:)           :: tmpptr2d
    1163           0 :    real(r8), pointer, dimension(:,:,:)         :: tmpptr3d
    1164           0 :    real(r8), pointer, dimension(:,:,:,:)       :: tmpptr4d
    1165           0 :    real(r8), pointer, dimension(:,:,:,:,:)     :: tmpptr5d
    1166             : 
    1167             : 
    1168           0 :    do i=1, npbuf_var
    1169             : 
    1170           0 :       pbuf_idx= pbuf_get_index(pbuf_snapshot(i)%ddt_string)
    1171             : 
    1172           0 :       if (pbuf_is_used(pbuf(pbuf_idx))) then
    1173             :          ! Turn on the writing for only the requested tape (file_num)
    1174           0 :          call cam_history_snapshot_activate(trim(pbuf_snapshot(i)%standard_name), file_num)
    1175             : 
    1176             :          ! Retrieve the pbuf data (dependent on the number of dimensions)
    1177           0 :          ndims = count(pbuf_snapshot(i)%dim_name(:) /= '')
    1178             : 
    1179           0 :          select case (ndims)  ! Note that dimension 5 and 6 do not work with pbuf_get_field, so these are not used here
    1180             : 
    1181             :          case (1)
    1182           0 :             call pbuf_get_field(pbuf, pbuf_idx, tmpptr2d)
    1183           0 :             call outfld(pbuf_snapshot(i)%standard_name, tmpptr2d, pcols, lchnk)
    1184             : 
    1185             :          case (2)
    1186           0 :             call pbuf_get_field(pbuf, pbuf_idx, tmpptr3d)
    1187           0 :             call outfld(pbuf_snapshot(i)%standard_name, tmpptr3d, pcols, lchnk)
    1188             : 
    1189             :          case (3)
    1190           0 :             call pbuf_get_field(pbuf, pbuf_idx, tmpptr3d)
    1191           0 :             call outfld(pbuf_snapshot(i)%standard_name, tmpptr4d, pcols, lchnk)
    1192             : 
    1193             :          case (4)
    1194           0 :             call pbuf_get_field(pbuf, pbuf_idx, tmpptr5d)
    1195           0 :             call outfld(pbuf_snapshot(i)%standard_name, tmpptr5d, pcols, lchnk)
    1196             : 
    1197             :          end select
    1198             : 
    1199             :          ! Now that the field has been written, turn off the writing for field
    1200           0 :          call cam_history_snapshot_deactivate(trim(pbuf_snapshot(i)%standard_name))
    1201             : 
    1202             : 
    1203             :       end if
    1204             : 
    1205             :    end do
    1206             : 
    1207           0 : end subroutine cam_pbuf_snapshot_all_outfld
    1208             : 
    1209           0 : subroutine fill_pbuf_info(pbuf_info, pbuf, const_cname)
    1210             : 
    1211             : !---------------------------------------------------
    1212             : ! This subroutine exists to link the pbuf name with units.  It can be expanded to include standard_names
    1213             : ! at a later date if needed.  It is a list of all the pbuf fields that are called within CAM with actual
    1214             : ! names.
    1215             : !---------------------------------------------------
    1216             : 
    1217             :      type(pbuf_info_type),   intent(inout) :: pbuf_info(:)
    1218             :      type(physics_buffer_desc), intent(in) :: pbuf(:)
    1219             :      character(len=*),          intent(in) :: const_cname(:)
    1220             : 
    1221           0 :      logical, dimension(size(pbuf)) ::  found
    1222             :      character(len=24), dimension(2,npbuf_all) :: pbuf_all
    1223             :      character(len=24) :: pbuf_name
    1224             :      integer  :: i, ipbuf
    1225             : 
    1226           0 :      found(:) = .false.
    1227             : 
    1228             :      pbuf_all(1:2,1:100) = reshape ( (/  &
    1229             :           'ACCRE_ENHAN            ','unset                  ',&
    1230             :           'ACGCME                 ','unset                  ',&
    1231             :           'ACLDY_CEN              ','unset                  ',&
    1232             :           'ACNUM                  ','unset                  ',&
    1233             :           'ACPRECL                ','unset                  ',&
    1234             :           'AIST                   ','unset                  ',&
    1235             :           'ALST                   ','unset                  ',&
    1236             :           'am_evp_st              ','unset                  ',&
    1237             :           'AMIE_efxg              ','mW/m2                  ',&
    1238             :           'AMIE_kevg              ','keV                    ',&
    1239             :           'AST                    ','1                      ',&
    1240             :           'AurIPRateSum           ','unset                  ',&
    1241             :           'awk_PBL                ','unset                  ',&
    1242             :           'bprod                  ','unset                  ',&
    1243             :           'cam3_bcphi             ','unset                  ',&
    1244             :           'cam3_bcpho             ','unset                  ',&
    1245             :           'cam3_dust1             ','unset                  ',&
    1246             :           'cam3_dust2             ','unset                  ',&
    1247             :           'cam3_dust3             ','unset                  ',&
    1248             :           'cam3_dust4             ','unset                  ',&
    1249             :           'cam3_ocphi             ','unset                  ',&
    1250             :           'cam3_ocpho             ','unset                  ',&
    1251             :           'cam3_ssam              ','unset                  ',&
    1252             :           'cam3_sscm              ','unset                  ',&
    1253             :           'cam3_sul               ','unset                  ',&
    1254             :           'CC_ni                  ','unset                  ',&
    1255             :           'CC_nl                  ','unset                  ',&
    1256             :           'CC_qi                  ','unset                  ',&
    1257             :           'CC_ql                  ','unset                  ',&
    1258             :           'CC_qlst                ','unset                  ',&
    1259             :           'CC_qv                  ','unset                  ',&
    1260             :           'CC_T                   ','unset                  ',&
    1261             :           'CICEWP                 ','unset                  ',&
    1262             :           'CLDBOT                 ','1                      ',&
    1263             :           'CLDEMIS                ','unset                  ',&
    1264             :           'CLDFGRAU               ','1                      ',&
    1265             :           'CLDFSNOW               ','1                      ',&
    1266             :           'CLD                    ','unset                  ',&
    1267             :           'CLDICEINI              ','unset                  ',&
    1268             :           'CLDLIQINI              ','unset                  ',&
    1269             :           'CLDO                   ','unset                  ',&
    1270             :           'CLDTAU                 ','unset                  ',&
    1271             :           'CLDTOP                 ','1                      ',&
    1272             :           'CLIQWP                 ','unset                  ',&
    1273             :           'CLOUD_FRAC             ','unset                  ',&
    1274             :           'CLUBB_BUFFER           ','unset                  ',&
    1275             :           'CMELIQ                 ','kg/kg/s                ',&
    1276             :           'CMFMC_SH               ','unset                  ',&
    1277             :           'cmfr_det               ','kg/m2/s                ',&
    1278             :           'CONCLD                 ','fraction               ',&
    1279             :           'CRM_CLD_RAD            ','unset                  ',&
    1280             :           'CRM_DGNUMWET           ','unset                  ',&
    1281             :           'CRM_NC                 ','/kg                    ',&
    1282             :           'CRM_NC_RAD             ','unset                  ',&
    1283             :           'CRM_NG                 ','/kg                    ',&
    1284             :           'CRM_NI                 ','/kg                    ',&
    1285             :           'CRM_NI_RAD             ','unset                  ',&
    1286             :           'CRM_NR                 ','/kg                    ',&
    1287             :           'CRM_NS                 ','/kg                    ',&
    1288             :           'CRM_NS_RAD             ','unset                  ',&
    1289             :           'CRM_QAERWAT            ','unset                  ',&
    1290             :           'CRM_QC                 ','kg/kg                  ',&
    1291             :           'CRM_QC_RAD             ','unset                  ',&
    1292             :           'CRM_QG                 ','kg/kg                  ',&
    1293             :           'CRM_QI                 ','kg/kg                  ',&
    1294             :           'CRM_QI_RAD             ','unset                  ',&
    1295             :           'CRM_QN                 ','unset                  ',&
    1296             :           'CRM_QP                 ','kg/kg                  ',&
    1297             :           'CRM_QRAD               ','unset                  ',&
    1298             :           'CRM_QR                 ','kg/kg                  ',&
    1299             :           'CRM_QS                 ','kg/kg                  ',&
    1300             :           'CRM_QS_RAD             ','unset                  ',&
    1301             :           'CRM_QT                 ','unset                  ',&
    1302             :           'CRM_QV_RAD             ','unset                  ',&
    1303             :           'CRM_T                  ',' K                     ',&
    1304             :           'CRM_T_RAD              ','unset                  ',&
    1305             :           'CRM_U                  ','m/s                    ',&
    1306             :           'CRM_V                  ','m/s                    ',&
    1307             :           'CRM_W                  ','m/s                    ',&
    1308             :           'CT                     ','unset                  ',&
    1309             :           'cu_cmfr                ','kg/m2/s                ',&
    1310             :           'cuorg                  ','unset                  ',&
    1311             :           'cu_qir                 ','kg/kg                  ',&
    1312             :           'cu_qlr                 ','kg/kg                  ',&
    1313             :           'cu_qtr                 ','kg/kg                  ',&
    1314             :           'cushavg                ','m                      ',&
    1315             :           'cush                   ','m                      ',&
    1316             :           'cu_thlr                ','K                      ',&
    1317             :           'cu_trr                 ','unset                  ',&
    1318             :           'cu_ur                  ','m/s                    ',&
    1319             :           'cu_vr                  ','m/s                    ',&
    1320             :           'CV_REFFICE             ','micron                 ',&
    1321             :           'CV_REFFLIQ             ','micron                 ',&
    1322             :           'DEGRAU                 ','unset                  ',&
    1323             :           'DEI                    ','unset                  ',&
    1324             :           'delta_qt_PBL           ','unset                  ',&
    1325             :           'delta_thl_PBL          ','unset                  ',&
    1326             :           'delta_tr_PBL           ','unset                  ',&
    1327             :           'delta_u_PBL            ','unset                  ',&
    1328           0 :           'delta_v_PBL            ','unset                  '/) ,  (/2,100/))
    1329             : 
    1330             :      pbuf_all(1:2,101:200) = reshape ( (/  &
    1331             :           'DES                    ','unset                  ',&
    1332             :           'DGNUM                  ','unset                  ',&
    1333             :           'DGNUMWET               ','unset                  ',&
    1334             :           'DIFZM                  ','kg/kg/s                ',&
    1335             :           'DLFZM                  ','kg/kg/s                ',&
    1336             :           'DNIFZM                 ','1/kg/s                 ',&
    1337             :           'DNLFZM                 ','1/kg/s                 ',&
    1338             :           'DP_CLDICE              ','unset                  ',&
    1339             :           'DP_CLDLIQ              ','unset                  ',&
    1340             :           'DP_FLXPRC              ','unset                  ',&
    1341             :           'DP_FLXSNW              ','unset                  ',&
    1342             :           'DP_FRAC                ','unset                  ',&
    1343             :           'dragblj                ','1/s                    ',&
    1344             :           'DRYMASS                ','unset                  ',&
    1345             :           'DRYRAD                 ','unset                  ',&
    1346             :           'DRYVOL                 ','unset                  ',&
    1347             :           'DTCORE                 ','K/s                    ',&
    1348             :           'evprain_st             ','unset                  ',&
    1349             :           'evpsnow_st             ','unset                  ',&
    1350             :           'FICE                   ','fraction               ',&
    1351             :           'FLNS                   ','W/m2                   ',&
    1352             :           'FLNT                   ','W/m2                   ',&
    1353             :           'FRACIS                 ','unset                  ',&
    1354             :           'FRACSOA                ','unset                  ',&
    1355             :           'FRACSOG                ','unset                  ',&
    1356             :           'FRONTGA                ','unset                  ',&
    1357             :           'FRONTGF                ','K^2/M^2/S              ',&
    1358             :           'FRZCNT                 ','unset                  ',&
    1359             :           'FRZDEP                 ','unset                  ',&
    1360             :           'FRZIMM                 ','unset                  ',&
    1361             :           'FSDS                   ','W/m2                   ',&
    1362             :           'FSNS                   ','W/m2                   ',&
    1363             :           'FSNT                   ','W/m2                   ',&
    1364             :           'HallConduct            ','unset                  ',&
    1365             :           'HYGRO                  ','unset                  ',&
    1366             :           'ICCWAT                 ','unset                  ',&
    1367             :           'ICGRAUWP               ','unset                  ',&
    1368             :           'ICIWP                  ','unset                  ',&
    1369             :           'ICIWPST                ','unset                  ',&
    1370             :           'ICLWP                  ','unset                  ',&
    1371             :           'ICLWPST                ','unset                  ',&
    1372             :           'ICSWP                  ','unset                  ',&
    1373             :           'ICWMRDP                ','kg/kg                  ',&
    1374             :           'ICWMRSH                ','kg/kg                  ',&
    1375             :           'IonRates               ','unset                  ',&
    1376             :           'ipbl                   ','unset                  ',&
    1377             :           'ISS_FRAC               ','unset                  ',&
    1378             :           'kpblh                  ','unset                  ',&
    1379             :           'ksrftms                ','unset                  ',&
    1380             :           'kvh                    ','m2/s                   ',&
    1381             :           'kvm                    ','m2/s                   ',&
    1382             :           'kvt                    ','m2/s                   ',&
    1383             :           'LAMBDAC                ','unset                  ',&
    1384             :           'LANDM                  ','unset                  ',&
    1385             :           'LCWAT                  ','unset                  ',&
    1386             :           'LD                     ','unset                  ',&
    1387             :           'LHFLX                  ','W/m2                   ',&
    1388             :           'LHFLX_RES              ','unset                  ',&
    1389             :           'LS_FLXPRC              ','kg/m2/s                ',&
    1390             :           'LS_FLXSNW              ','kg/m2/s                ',&
    1391             :           'LS_MRPRC               ','unset                  ',&
    1392             :           'LS_MRSNW               ','unset                  ',&
    1393             :           'LS_REFFRAIN            ','micron                 ',&
    1394             :           'LS_REFFSNOW            ','micron                 ',&
    1395             :           'LU                     ','unset                  ',&
    1396             :           'MAMH2SO4EQ             ','unset                  ',&
    1397             :           'MU                     ','Pa/s                   ',&
    1398             :           'NAAI_HOM               ','unset                  ',&
    1399             :           'NAAI                   ','unset                  ',&
    1400             :           'NACON                  ','unset                  ',&
    1401             :           'NAER                   ','unset                  ',&
    1402             :           'NEVAPR_DPCU            ','unset                  ',&
    1403             :           'NEVAPR                 ','unset                  ',&
    1404             :           'NEVAPR_SHCU            ','unset                  ',&
    1405             :           'NIWAT                  ','unset                  ',&
    1406             :           'NLWAT                  ','unset                  ',&
    1407             :           'NMXRGN                 ','unset                  ',&
    1408             :           'NPCCN                  ','unset                  ',&
    1409             :           'NRAIN                  ','m-3                    ',&
    1410             :           'NSNOW                  ','m-3                    ',&
    1411             :           'O3                     ','unset                  ',&
    1412             :           'pblh                   ','m                      ',&
    1413             :           'PDF_PARAMS             ','unset                  ',&
    1414             :           'PDF_PARAMS_ZM          ','unset                  ',&
    1415             :           'PedConduct             ','unset                  ',&
    1416             :           'PMXRGN                 ','unset                  ',&
    1417             :           'PRAIN                  ','unset                  ',&
    1418             :           'PREC_DP                ','unset                  ',&
    1419             :           'PREC_PCW               ','m/s                    ',&
    1420             :           'PREC_SED               ','unset                  ',&
    1421             :           'PREC_SH                ','unset                  ',&
    1422             :           'PREC_SH                ','unset                  ',&
    1423             :           'PREC_STR               ','unset                  ',&
    1424             :           'PRER_EVAP              ','unset                  ',&
    1425             :           'PSL                    ','Pa                     ',&
    1426             :           'QAERWAT                ','unset                  ',&
    1427             :           'QCWAT                  ','unset                  ',&
    1428             :           'QFLX                   ','kg/m2/s                ',&
    1429             :           'QFLX_RES               ','unset                  ',&
    1430           0 :           'QINI                   ','unset                  '  /),    (/2,100/))
    1431             : 
    1432             :      pbuf_all(1:2,201:300) = reshape ( (/  &
    1433             :           'qir_det                ','kg/kg                  ',&
    1434             :           'QIST                   ','unset                  ',&
    1435             :           'qlr_det                ','kg/kg                  ',&
    1436             :           'QLST                   ','unset                  ',&
    1437             :           'QME                    ','unset                  ',&
    1438             :           'qpert                  ','kg/kg                  ',&
    1439             :           'QRAIN                  ','kg/kg                  ',&
    1440             :           'QRL                    ','K/s                    ',&
    1441             :           'qrlin                  ','unset                  ',&
    1442             :           'QRS                    ','K/s                    ',&
    1443             :           'qrsin                  ','unset                  ',&
    1444             :           'QSATFAC                ','-                      ',&
    1445             :           'QSNOW                  ','kg/kg                  ',&
    1446             :           'QTeAur                 ','unset                  ',&
    1447             :           'qti_flx                ','unset                  ',&
    1448             :           'qtl_flx                ','unset                  ',&
    1449             :           'RAD_CLUBB              ','unset                  ',&
    1450             :           'RATE1_CW2PR_ST         ','unset                  ',&
    1451             :           'RCM                    ','unset                  ',&
    1452             :           'RE_ICE                 ','unset                  ',&
    1453             :           'REI                    ','micron                 ',&
    1454             :           'RELHUM                 ','percent                ',&
    1455             :           'REL                    ','micron                 ',&
    1456             :           'RELVAR                 ','-                      ',&
    1457             :           'RNDST                  ','unset                  ',&
    1458             :           'RPRDDP                 ','unset                  ',&
    1459             :           'RPRDSH                 ','unset                  ',&
    1460             :           'RPRDTOT                ','unset                  ',&
    1461             :           'RTM                    ','unset                  ',&
    1462             :           'rtp2_mc_zt             ','unset                  ',&
    1463             :           'RTP2_nadv              ','unset                  ',&
    1464             :           'rtpthlp_mc_zt          ','unset                  ',&
    1465             :           'RTPTHLP_nadv           ','unset                  ',&
    1466             :           'RTPTHVP                ','unset                  ',&
    1467             :           'SADICE                 ','cm2/cm3                ',&
    1468             :           'SADSNOW                ','cm2/cm3                ',&
    1469             :           'SADSULF                ','unset                  ',&
    1470             :           'SD                     ','unset                  ',&
    1471             :           'SGH30                  ','unset                  ',&
    1472             :           'SGH                    ','unset                  ',&
    1473             :           'SH_CLDICE1             ','unset                  ',&
    1474             :           'SH_CLDICE              ','unset                  ',&
    1475             :           'SH_CLDLIQ1             ','unset                  ',&
    1476             :           'SH_CLDLIQ              ','unset                  ',&
    1477             :           'SH_E_ED_RATIO          ','unset                  ',&
    1478             :           'SHFLX                  ','W/m2                   ',&
    1479             :           'SH_FLXPRC              ','unset                  ',&
    1480             :           'SHFLX_RES              ','unset                  ',&
    1481             :           'SH_FLXSNW              ','unset                  ',&
    1482             :           'SH_FRAC                ','unset                  ',&
    1483             :           'shfrc                  ','unset                  ',&
    1484             :           'smaw                   ','unset                  ',&
    1485             :           'SNOW_DP                ','unset                  ',&
    1486             :           'SNOW_PCW               ','unset                  ',&
    1487             :           'SNOW_SED               ','unset                  ',&
    1488             :           'SNOW_SH                ','unset                  ',&
    1489             :           'SNOW_STR               ','unset                  ',&
    1490             :           'SO4DRYVOL              ','unset                  ',&
    1491             :           'SSLTA                  ','kg/kg                  ',&
    1492             :           'SSLTC                  ','kg/kg                  ',&
    1493             :           'SU                     ','unset                  ',&
    1494             :           "taubljx                ",'N/m2                   ',&
    1495             :           "taubljy                ",'N/m2                   ',&
    1496             :           'tauresx                ','unset                  ',&
    1497             :           'tauresy                ','unset                  ',&
    1498             :           "tautmsx                ",'N/m2                   ',&
    1499             :           "tautmsy                ",'N/m2                   ',&
    1500             :           'TAUX                   ','N/m2                   ',&
    1501             :           'TAUX_RES               ','unset                  ',&
    1502             :           'TAUY                   ','N/m2                   ',&
    1503             :           'TAUY_RES               ','unset                  ',&
    1504             :           'tcorr                  ','unset                  ',&
    1505             :           'TCWAT                  ','unset                  ',&
    1506             :           'TElec                  ','K                      ',&
    1507             :           'TEOUT                  ','J/m2                   ',&
    1508             :           'THLM                   ','unset                  ',&
    1509             :           'thlp2_mc_zt            ','unset                  ',&
    1510             :           'THLP2_nadv             ','unset                  ',&
    1511             :           'THLPTHVP               ','unset                  ',&
    1512             :           'TIon                   ','K                      ',&
    1513             :           'TK_CRM                 ','unset                  ',&
    1514             :           'tke                    ','m2/s2                  ',&
    1515             :           'tkes                   ','m2/s2                  ',&
    1516             :           'TND_NSNOW              ','unset                  ',&
    1517             :           'TND_QSNOW              ','unset                  ',&
    1518             :           'tpert                  ','K                      ',&
    1519             :           'TREFMNAV               ','K                      ',&
    1520             :           'TREFMXAV               ','K                      ',&
    1521             :           'tropp                  ','unset                  ',&
    1522             :           'TSTCPY_SCOL            ','unset                  ',&
    1523             :           'TTEND_DP               ','unset                  ',&
    1524             :           'TTEND_SH               ','unset                  ',&
    1525             :           'T_TTEND                ','unset                  ',&
    1526             :           'turbtype               ','unset                  ',&
    1527             :           "UI                     ",'m/s                    ',&
    1528             :           'UM                     ','unset                  ',&
    1529             :           'UP2_nadv               ','unset                  ',&
    1530             :           'UPWP                   ','m^2/s^2                ',&
    1531             :           'UZM                    ','M/S                    ',&
    1532           0 :           'VI                     ','m/s                    '    /),                  (/2,100/))
    1533             : 
    1534             :      pbuf_all(1:2,301:npbuf_all) = reshape ( (/  &
    1535             :           'VM                     ','m/s                    ',&
    1536             :           'VOLC_MMR               ','unset                  ',&
    1537             :           'VOLC_RAD_GEOM          ','unset                  ',&
    1538             :           'VP2_nadv               ','unset                  ',&
    1539             :           'VPWP                   ','m^2/s^2                ',&
    1540             :           'went                   ','m/s                    ',&
    1541             :           'WETDENS_AP             ','unset                  ',&
    1542             :           "WI                     ",'m/s                    ',&
    1543             :           'WP3_nadv               ','unset                  ',&
    1544             :           'wprtp_mc_zt            ','unset                  ',&
    1545             :           'WPRTP_nadv             ','unset                  ',&
    1546             :           'wpthlp_mc_zt           ','unset                  ',&
    1547             :           'WPTHLP_nadv            ','unset                  ',&
    1548             :           'WPTHVP                 ','unset                  ',&
    1549             :           'WSEDL                  ','unset                  ',&
    1550             :           'wstarPBL               ','unset                  ',&
    1551             :           'ZM_DP                  ','unset                  ',&
    1552             :           'ZM_DSUBCLD             ','unset                  ',&
    1553             :           'ZM_DU                  ','unset                  ',&
    1554             :           'ZM_ED                  ','unset                  ',&
    1555             :           'ZM_EU                  ','unset                  ',&
    1556             :           'ZM_IDEEP               ','unset                  ',&
    1557             :           'ZM_JT                  ','unset                  ',&
    1558             :           'ZM_MAXG                ','unset                  ',&
    1559             :           'ZM_MD                  ','unset                  ',&
    1560             :           'ZM_MU                  ','unset                  ',&
    1561           0 :           'ZTODT                  ','unset                  '  /),                     (/2,27/))
    1562             : 
    1563             : ! Fields which are added with pbuf_add_field calls, but are data driven.  These are not
    1564             : ! included in the above list.  This means that these fields will not have proper units
    1565             : ! set for them
    1566             : !          'CG' // shortname,        'unset',        &
    1567             : !          'CI' // shortname,        'unset',        &
    1568             : !          'CL' // shortname,        'unset',        &
    1569             : !          ghg_names(i),             'unset',        &
    1570             : !          mmr_name1,                'unset',        &
    1571             : !          mmr_name2,                'unset',        &
    1572             : !          mmr_name3,                'unset',        &
    1573             : !          mmr_name,                 'unset',        &
    1574             : !          ozone_name,               'unset',        &
    1575             : !          pbufname,                 'unset',        &
    1576             : !          pbufname,                 'unset',        &
    1577             : !          pbuf_names(i),            'unset',        &
    1578             : !          rad_name1,                'unset',        &
    1579             : !          rad_name2,                'unset',        &
    1580             : !          rad_name3,                'unset',        &
    1581             : !          rad_name,                 'unset',        &
    1582             : !          sad_name,                 'cm2/cm3',      &
    1583             : !          volcaero_name,            'kg/kg',        &
    1584             : !          volcrad_name,             'm',            &
    1585             : !          xname_massptrcw(l,        'unset',        &
    1586             : !          xname_numptrcw,           'unset',        &
    1587             : !          aero_names(mm)
    1588             : !          cnst_names(iconst)
    1589             : 
    1590           0 :    do ipbuf = 1, size(pbuf)
    1591           0 :      pbuf_name = pbuf_get_field_name(ipbuf)
    1592           0 :      i = 1
    1593           0 :      do while ((i <= npbuf_all) .and. .not. found(ipbuf))
    1594           0 :         if (trim(pbuf_all(1,i)) == trim(pbuf_name)) then
    1595           0 :            pbuf_info(ipbuf)%name          = trim(pbuf_all(1,i))
    1596           0 :            pbuf_info(ipbuf)%standard_name = 'pbuf_'//trim(pbuf_all(1,i))
    1597           0 :            pbuf_info(ipbuf)%units         = trim(pbuf_all(2,i))
    1598           0 :            pbuf_info(ipbuf)%dim_string(:) = ' '
    1599           0 :            found(ipbuf) = .true.
    1600             :        end if
    1601           0 :         i = i+1
    1602             :       end do
    1603           0 :       if (.not. found(ipbuf)) then
    1604             : 
    1605             :          i = 1
    1606             :          ! Check if variable is a variation of constituent - then use the same units
    1607           0 :          do while ((i <= ncnst_var) .and. .not. found(ipbuf))
    1608           0 :             if (trim(const_cname(i)) == trim(pbuf_name)) then
    1609           0 :                pbuf_info(ipbuf) = pbuf_info_type(trim(const_cname(i)),trim('pbuf_'//const_cname(i)),&
    1610           0 :                                                  trim(cnst_snapshot(i)%units),      ' ')
    1611           0 :                found(ipbuf) = .true.
    1612             :             end if
    1613           0 :             i = i+1
    1614             :          end do
    1615             :       end if
    1616             : 
    1617             :         ! Found a pbuf that has not been added to this routine
    1618           0 :       if (.not. found(ipbuf)) then
    1619           0 :          write(iulog,*) 'WARNING - no units information for: '//trim(pbuf_name)
    1620             : 
    1621           0 :          pbuf_info(ipbuf)%name          = trim(pbuf_name)
    1622           0 :          pbuf_info(ipbuf)%standard_name = 'pbuf_'//trim(pbuf_name)
    1623           0 :          pbuf_info(ipbuf)%units         = 'unset'
    1624           0 :          pbuf_info(ipbuf)%dim_string(:) = ' '
    1625           0 :          found(ipbuf) = .true.
    1626             :       end if
    1627             : 
    1628             :    end do
    1629             : 
    1630           0 : end subroutine fill_pbuf_info
    1631             : 
    1632           0 : end module cam_snapshot_common

Generated by: LCOV version 1.14