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