LCOV - code coverage report
Current view: top level - control - history_scam.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 117 0.0 %
Date: 2025-03-14 01:33:33 Functions: 0 2 0.0 %

          Line data    Source code
       1             : module history_scam
       2             : !-----------------------------------------------------------------------
       3             : !
       4             : ! Purpose: SCAM specific history code.
       5             : !
       6             : ! Public functions/subroutines:
       7             : !   bldfld, h_default
       8             : !
       9             : ! Author: anonymous from code in cam_history.F90
      10             : !-----------------------------------------------------------------------
      11             :    use shr_kind_mod, only: r8 => shr_kind_r8
      12             :    use cam_history, only: addfld, add_default, horiz_only
      13             :    use cam_grid_support, only: max_hcoordname_len
      14             : 
      15             :    implicit none
      16             : 
      17             : PRIVATE
      18             : 
      19             :    public :: scm_intht
      20             :    public :: initialize_iop_history
      21             : 
      22             : !#######################################################################
      23             : CONTAINS
      24           0 :    subroutine scm_intht()
      25             : !-----------------------------------------------------------------------
      26             : !
      27             : ! Purpose:
      28             : !
      29             : ! add master list fields to scm
      30             : !
      31             : ! Method: Call a subroutine to add each field
      32             : !
      33             : ! Author: CCM Core Group
      34             : !
      35             : !-----------------------------------------------------------------------
      36             :       use dycore,      only: dycore_is
      37             :       use cam_history, only: write_camiop
      38             : !-----------------------------------------------------------------------
      39             : !
      40             : !-----------------------------------------------------------------------
      41             : ! Local variables
      42             : !
      43             :       character(len=max_hcoordname_len) outgrid
      44             : 
      45           0 :       if (dycore_is('SE')) then
      46             :          ! for camiop mode use the GLL grid otherwise use physics grids for SCM mode output
      47           0 :          if (write_camiop) then
      48           0 :             outgrid = 'GLL'
      49             :          else
      50           0 :             outgrid = 'physgrid'
      51             :          end if
      52             :       else
      53           0 :          outgrid = 'unknown'
      54             :       end if
      55             : !
      56             : ! Call addfld to add each field to the Master Field List.
      57             : !
      58           0 :       call addfld ('TDIFF',    (/ 'lev' /), 'A', 'K','difference from observed temp',                    gridname=trim(outgrid))
      59           0 :       call addfld ('UDIFF',    (/ 'lev' /), 'A', 'K','difference from observed u wind',                  gridname=trim(outgrid))
      60           0 :       call addfld ('VDIFF',    (/ 'lev' /), 'A', 'K','difference from observed v wind',                  gridname=trim(outgrid))
      61             : 
      62           0 :       call addfld ('TOBS',     (/ 'lev' /), 'A', 'K','observed temp')
      63           0 :       call addfld ('QDIFF',    (/ 'lev' /), 'A', 'kg/kg','difference from observed water',               gridname=trim(outgrid))
      64             : 
      65           0 :       call addfld ('QOBS',     (/ 'lev' /), 'A', 'kg/kg','observed water',                               gridname='physgrid')
      66             :       call addfld ('PRECOBS',  (/ 'lev' /), 'A', 'mm/day','Total (convective and large-scale) precipitation rate',             &
      67           0 :                                                                                                          gridname='physgrid')
      68           0 :       call addfld ('DIVQ',     (/ 'lev' /), 'A', 'kg/kg/s','Q advection tendency (horizontal)',          gridname='physgrid')
      69           0 :       call addfld ('DIVQ3D',   (/ 'lev' /), 'A', 'kg/kg/s','Q advection tendency (horiz/vert combined)', gridname=trim(outgrid))
      70           0 :       call addfld ('DIVV',     (/ 'lev' /), 'A', 'm/s2','V advection tendency (horizontal)',             gridname='physgrid')
      71           0 :       call addfld ('DIVU',     (/ 'lev' /), 'A', 'm/s2','U advection tendency (horizontal)',             gridname='physgrid')
      72           0 :       call addfld ('DIVT',     (/ 'lev' /), 'A', 'K/s','T advection tendency (horizontal)',              gridname='physgrid')
      73           0 :       call addfld ('DIVT3D',   (/ 'lev' /), 'A', 'K/s','T advection tendency (horiz/vert combined)',     gridname=trim(outgrid))
      74           0 :       call addfld ('DIVU3D',   (/ 'lev' /), 'A', 'K/s','U advection tendency (horiz/vert combined)',     gridname=trim(outgrid))
      75           0 :       call addfld ('DIVV3D',   (/ 'lev' /), 'A', 'K/s','V advection tendency (horiz/vert combined)',     gridname=trim(outgrid))
      76             : 
      77           0 :       call addfld ('SHFLXOBS', horiz_only,  'A', 'W/m2','Obs Surface sensible heat flux',                gridname='physgrid')
      78           0 :       call addfld ('LHFLXOBS', horiz_only,  'A', 'W/m2','Obs Surface latent heat flux',                  gridname='physgrid')
      79           0 :       call addfld ('TRELAX',   (/ 'lev' /), 'A', 'K','t relaxation amount',                              gridname=trim(outgrid))
      80           0 :       call addfld ('QRELAX',   (/ 'lev' /), 'A', 'kg/kg','q relaxation amount',                          gridname=trim(outgrid))
      81           0 :       call addfld ('TAURELAX', (/ 'lev' /), 'A', 'seconds','relaxation time constant',                   gridname=trim(outgrid))
      82           0 :       call add_default ('TDIFF', 1, ' ')
      83           0 :       call add_default ('QDIFF', 1, ' ')
      84             : 
      85             :     ! Vertical advective forcing of 'T,u,v,qv,ql,qi,nl,ni' in forecast.F90
      86             : 
      87           0 :       call addfld ('TTEN_XYADV',   (/ 'lev' /), 'I', 'K/s',    'T  horizontal advective forcing',        gridname=trim(outgrid) )
      88           0 :       call addfld ('UTEN_XYADV',   (/ 'lev' /), 'I', 'm/s^2',  'U  horizontal advective forcing',        gridname=trim(outgrid) )
      89           0 :       call addfld ('VTEN_XYADV',   (/ 'lev' /), 'I', 'm/s^2',  'V  horizontal advective forcing',        gridname=trim(outgrid) )
      90           0 :       call addfld ('QVTEN_XYADV',  (/ 'lev' /), 'I', 'kg/kg/s','QV horizontal advective forcing',        gridname=trim(outgrid) )
      91           0 :       call addfld ('QLTEN_XYADV',  (/ 'lev' /), 'I', 'kg/kg/s','QL horizontal advective forcing',        gridname=trim(outgrid) )
      92           0 :       call addfld ('QITEN_XYADV',  (/ 'lev' /), 'I', 'kg/kg/s','QI horizontal advective forcing',        gridname=trim(outgrid) )
      93           0 :       call addfld ('NLTEN_XYADV',  (/ 'lev' /), 'I', '#/kg/s', 'NL horizontal advective forcing',        gridname=trim(outgrid) )
      94           0 :       call addfld ('NITEN_XYADV',  (/ 'lev' /), 'I', '#/kg/s', 'NI horizontal advective forcing',        gridname=trim(outgrid) )
      95             : 
      96           0 :       call addfld ('TTEN_ZADV',   (/ 'lev' /), 'I', 'K/s',    'T  vertical   advective forcing',         gridname=trim(outgrid) )
      97           0 :       call addfld ('UTEN_ZADV',   (/ 'lev' /), 'I', 'm/s^2',  'U  vertical   advective forcing',         gridname=trim(outgrid) )
      98           0 :       call addfld ('VTEN_ZADV',   (/ 'lev' /), 'I', 'm/s^2',  'V  vertical   advective forcing',         gridname=trim(outgrid) )
      99           0 :       call addfld ('QVTEN_ZADV',  (/ 'lev' /), 'I', 'kg/kg/s','QV vertical   advective forcing',         gridname=trim(outgrid) )
     100           0 :       call addfld ('QLTEN_ZADV',  (/ 'lev' /), 'I', 'kg/kg/s','QL vertical   advective forcing',         gridname=trim(outgrid) )
     101           0 :       call addfld ('QITEN_ZADV',  (/ 'lev' /), 'I', 'kg/kg/s','QI vertical   advective forcing',         gridname=trim(outgrid) )
     102           0 :       call addfld ('NLTEN_ZADV',  (/ 'lev' /), 'I', '#/kg/s', 'NL vertical   advective forcing',         gridname=trim(outgrid) )
     103           0 :       call addfld ('NITEN_ZADV',  (/ 'lev' /), 'I', '#/kg/s', 'NI vertical   advective forcing',         gridname=trim(outgrid) )
     104             : 
     105           0 :       call addfld ('TTEN_PHYS',   (/ 'lev' /), 'I', 'K/s',    'T  vertical   advective forcing',         gridname=trim(outgrid) )
     106           0 :       call addfld ('UTEN_PHYS',   (/ 'lev' /), 'I', 'm/s^2',  'U  vertical   advective forcing',         gridname=trim(outgrid) )
     107           0 :       call addfld ('VTEN_PHYS',   (/ 'lev' /), 'I', 'm/s^2',  'V  vertical   advective forcing',         gridname=trim(outgrid) )
     108           0 :       call addfld ('QVTEN_PHYS',   (/ 'lev' /), 'I','kg/kg/s','QV vertical   advective forcing',         gridname=trim(outgrid) )
     109           0 :       call addfld ('QLTEN_PHYS',   (/ 'lev' /), 'I','kg/kg/s','QL vertical   advective forcing',         gridname=trim(outgrid) )
     110           0 :       call addfld ('QITEN_PHYS',   (/ 'lev' /), 'I','kg/kg/s','QI vertical   advective forcing',         gridname=trim(outgrid) )
     111           0 :       call addfld ('NLTEN_PHYS',   (/ 'lev' /), 'I','#/kg/s', 'NL vertical   advective forcing',         gridname=trim(outgrid) )
     112           0 :       call addfld ('NITEN_PHYS',   (/ 'lev' /), 'I','#/kg/s', 'NI vertical   advective forcing',         gridname=trim(outgrid) )
     113             : 
     114           0 :    end subroutine scm_intht
     115             : !#######################################################################
     116           0 :    subroutine initialize_iop_history()
     117             : !-----------------------------------------------------------------------
     118             : !
     119             : ! Purpose: Add fields and set defaults for SCAM CAM BFB IOP initial file
     120             : ! as well as single column output history
     121             : !
     122             : ! Method: Call a subroutine to add each field
     123             : !
     124             : !-----------------------------------------------------------------------
     125             : !
     126             : ! !USES:
     127           0 :     use constituents,     only: pcnst, cnst_name
     128             :     use dycore,           only: dycore_is
     129             : ! !ARGUMENTS:
     130             :     implicit none
     131             : 
     132             : ! !LOCAL VARIABLES:
     133             :     integer m
     134             :     character(len=max_hcoordname_len) outgrid
     135             : 
     136             : !-----------------------------------------------------------------------
     137             : 
     138           0 :     if (dycore_is('SE')) then
     139           0 :        outgrid = 'GLL'
     140             :     else
     141           0 :        outgrid = 'unknown'
     142             :     end if
     143             : 
     144           0 :     if (trim(outgrid) == 'gauss_grid') then
     145           0 :        call addfld ('CLAT1&IC',  horiz_only,  'I', ' ','cos lat for bfb testing', gridname=trim(outgrid))
     146           0 :        call add_default ('CLAT1&IC',0,'I')
     147           0 :        call addfld ('CLON1&IC',  horiz_only,  'I', ' ','cos lon for bfb testing', gridname=trim(outgrid))
     148           0 :        call add_default ('CLON1&IC',0,'I')
     149           0 :        call addfld ('PHI&IC',    horiz_only,  'I', ' ','lat for bfb testing', gridname=trim(outgrid))
     150           0 :        call add_default ('PHI&IC',0,  'I')
     151           0 :        call addfld ('LAM&IC',    horiz_only,  'I', ' ','lon for bfb testing', gridname=trim(outgrid))
     152           0 :        call add_default ('LAM&IC',0,  'I')
     153             : 
     154           0 :        call addfld ('CLAT',    horiz_only,   'A', ' ',   'cos lat for bfb testing', gridname=trim(outgrid))
     155           0 :        call add_default ('CLAT',2,' ')
     156             : 
     157           0 :        call addfld ('fixmas',  horiz_only,   'A', 'percent','Mass fixer',gridname=trim(outgrid))
     158           0 :        call add_default ('fixmas',2,' ')
     159           0 :        call addfld ('beta',    horiz_only,   'A', 'percent','Energy fixer',gridname=trim(outgrid))
     160           0 :        call add_default ('beta',2,' ')
     161             :     end if
     162             : 
     163           0 :     call addfld ('q',       (/ 'lev' /),  'A', 'kg/kg',  'Q for scam',gridname=trim(outgrid))
     164           0 :     call add_default ('q',2, ' ')
     165           0 :     call addfld ('u',       (/ 'lev' /),  'A', 'm/s',    'U for scam',gridname=trim(outgrid))
     166           0 :     call add_default ('u',2,' ')
     167           0 :     call addfld ('v',       (/ 'lev' /),  'A', 'm/s',    'V for scam',gridname=trim(outgrid))
     168           0 :     call add_default ('v',2,' ')
     169           0 :     call addfld ('t',       (/ 'lev' /),  'A', 'K',      'Temperature for scam',gridname=trim(outgrid))
     170           0 :     call add_default ('t',2,' ')
     171           0 :     call addfld ('Tg',      horiz_only,   'A', 'K',      'Surface temperature (radiative) for scam',gridname='physgrid')
     172           0 :     call add_default ('Tg',2,' ')
     173           0 :     call addfld ('Ps',      horiz_only,   'A', 'Pa',     'Surface Pressure for SCAM',gridname=trim(outgrid))
     174           0 :     call add_default ('Ps',2,' ')
     175           0 :     call addfld ('divT3d',  (/ 'lev' /),  'A', 'K',      'Dynamics Residual for T',gridname=trim(outgrid))
     176           0 :     call add_default ('divT3d',2,' ')
     177           0 :     call addfld ('divU3d',  (/ 'lev' /),  'A', 'K',      'Dynamics Residual for U',gridname=trim(outgrid))
     178           0 :     call add_default ('divU3d',2,' ')
     179           0 :     call addfld ('divV3d',  (/ 'lev' /),  'A', 'K',      'Dynamics Residual for V',gridname=trim(outgrid))
     180           0 :     call add_default ('divV3d',2,' ')
     181           0 :     call addfld ('heat_glob',horiz_only, 'A', 'K/s', 'Global mean total energy difference')
     182           0 :     call add_default ('heat_glob',2,' ')
     183           0 :     do m=1,pcnst
     184           0 :        call addfld (trim(cnst_name(m))//'_dten', (/ 'lev' /), 'A', 'kg/kg', &
     185           0 :             trim(cnst_name(m))//' IOP Dynamics Residual for '//trim(cnst_name(m)),gridname=trim(outgrid))
     186           0 :        call add_default (trim(cnst_name(m))//'_dten',2,' ')
     187           0 :        if (trim(outgrid) == 'gauss_grid') then
     188             :           call addfld (trim(cnst_name(m))//'_alph', horiz_only, 'A', 'kg/kg',trim(cnst_name(m))//' alpha constituent fixer', &
     189           0 :                gridname=trim(outgrid))
     190           0 :           call add_default (trim(cnst_name(m))//'_alph',2,' ')
     191             :           call addfld (trim(cnst_name(m))//'_dqfx', (/ 'lev' /), 'A', 'kg/kg',trim(cnst_name(m))//' dqfx3 fixer',            &
     192           0 :                gridname=trim(outgrid))
     193           0 :           call add_default (trim(cnst_name(m))//'_dqfx',2,' ')
     194             :        end if
     195             :     end do
     196           0 :     call addfld ('shflx',  horiz_only,  'A', 'W/m2', 'Surface sensible heat flux for scam',gridname='physgrid')
     197           0 :     call add_default ('shflx',2,' ')
     198           0 :     call addfld ('lhflx',  horiz_only,  'A', 'W/m2', 'Surface latent heat flux for scam',gridname='physgrid')
     199           0 :     call add_default ('lhflx',2,' ')
     200           0 :     call addfld ('trefht', horiz_only,  'A', 'K',    'Reference height temperature',gridname='physgrid')
     201           0 :     call add_default ('trefht',2,' ')
     202           0 :     call addfld ('Tsair',  horiz_only,  'A', 'K',    'Reference height temperature for scam',gridname='physgrid')
     203           0 :     call add_default ('Tsair',2,' ')
     204           0 :     call addfld ('phis',   horiz_only,  'I', 'm2/s2','Surface geopotential for scam',gridname='physgrid')
     205           0 :     call add_default ('phis',2,' ')
     206             :     call addfld ('Prec',   horiz_only,  'A', 'm/s',  'Total (convective and large-scale) precipitation rate for scam',   &
     207           0 :          gridname='physgrid')
     208           0 :     call add_default ('Prec',2,' ')
     209           0 :     call addfld ('omega',  (/ 'lev' /), 'A', 'Pa/s', 'Vertical velocity (pressure)',gridname='physgrid')
     210           0 :     call add_default ('omega',2,' ')
     211             : 
     212           0 :   end subroutine initialize_iop_history
     213             : 
     214             : !#######################################################################
     215             :  end module history_scam

Generated by: LCOV version 1.14