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