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