forked from ESCOMP/CAM
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cam_diagnostics.F90
2238 lines (1867 loc) · 91.5 KB
/
cam_diagnostics.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
module cam_diagnostics
!---------------------------------------------------------------------------------
! Module to compute a variety of diagnostics quantities for history files
!---------------------------------------------------------------------------------
use shr_kind_mod, only: r8 => shr_kind_r8
use camsrfexch, only: cam_in_t, cam_out_t
use cam_control_mod, only: moist_physics
use physics_types, only: physics_state, physics_tend
use ppgrid, only: pcols, pver, begchunk, endchunk
use physics_buffer, only: physics_buffer_desc, pbuf_add_field, dtype_r8
use physics_buffer, only: dyn_time_lvls, pbuf_get_field, pbuf_get_index, pbuf_old_tim_idx
use cam_history, only: outfld, write_inithist, hist_fld_active, inithist_all
use constituents, only: pcnst, cnst_name, cnst_longname, cnst_cam_outfld
use constituents, only: ptendnam, dmetendnam, apcnst, bpcnst, cnst_get_ind
use dycore, only: dycore_is
use phys_control, only: phys_getopts
use wv_saturation, only: qsat, qsat_water, svp_ice
use time_manager, only: is_first_step
use scamMod, only: single_column, wfld
use cam_abortutils, only: endrun
implicit none
private
save
! Public interfaces
public :: &
diag_readnl, &! read namelist options
diag_register, &! register pbuf space
diag_init, &! initialization
diag_allocate, &! allocate memory for module variables
diag_deallocate, &! deallocate memory for module variables
diag_conv_tend_ini, &! initialize convective tendency calcs
diag_phys_writeout, &! output diagnostics of the dynamics
diag_phys_tend_writeout, &! output physics tendencies
diag_state_b4_phys_write, &! output state before physics execution
diag_conv, &! output diagnostics of convective processes
diag_surf, &! output diagnostics of the surface
diag_export, &! output export state
diag_physvar_ic, &
nsurf
! Private data
integer :: dqcond_num ! number of constituents to compute convective
character(len=16) :: dcconnam(pcnst) ! names of convection tendencies
! tendencies for
real(r8), allocatable :: dtcond(:,:,:) ! temperature tendency due to convection
type dqcond_t
real(r8), allocatable :: cnst(:,:,:) ! constituent tendency due to convection
end type dqcond_t
type(dqcond_t), allocatable :: dqcond(:)
character(len=8) :: diag_cnst_conv_tend = 'q_only' ! output constituent tendencies due to convection
! 'none', 'q_only' or 'all'
integer, parameter :: surf_100000 = 1
integer, parameter :: surf_092500 = 2
integer, parameter :: surf_085000 = 3
integer, parameter :: surf_070000 = 4
integer, parameter :: nsurf = 4
logical :: history_amwg ! output the variables used by the AMWG diag package
logical :: history_vdiag ! output the variables used by the AMWG variability diag package
logical :: history_eddy ! output the eddy variables
logical :: history_budget ! output tendencies and state variables for CAM4
! temperature, water vapor, cloud ice and cloud
! liquid budgets.
integer :: history_budget_histfile_num ! output history file number for budget fields
logical :: history_waccm ! outputs typically used for WACCM
! Physics buffer indices
integer :: psl_idx = 0
integer :: relhum_idx = 0
integer :: qcwat_idx = 0
integer :: tcwat_idx = 0
integer :: lcwat_idx = 0
integer :: cld_idx = 0
integer :: concld_idx = 0
integer :: tke_idx = 0
integer :: kvm_idx = 0
integer :: kvh_idx = 0
integer :: cush_idx = 0
integer :: t_ttend_idx = 0
integer :: prec_dp_idx = 0
integer :: snow_dp_idx = 0
integer :: prec_sh_idx = 0
integer :: snow_sh_idx = 0
integer :: prec_sed_idx = 0
integer :: snow_sed_idx = 0
integer :: prec_pcw_idx = 0
integer :: snow_pcw_idx = 0
integer :: tpert_idx=-1, qpert_idx=-1, pblh_idx=-1
integer :: trefmxav_idx = -1, trefmnav_idx = -1
contains
!==============================================================================
subroutine diag_readnl(nlfile)
use namelist_utils, only: find_group_name
use units, only: getunit, freeunit
use spmd_utils, only: masterproc, masterprocid, mpi_character, mpicom
character(len=*), intent(in) :: nlfile ! filepath for file containing namelist input
! Local variables
integer :: unitn, ierr
character(len=*), parameter :: subname = 'diag_readnl'
namelist /cam_diag_opts/ diag_cnst_conv_tend
!--------------------------------------------------------------------------
if (masterproc) then
unitn = getunit()
open( unitn, file=trim(nlfile), status='old' )
call find_group_name(unitn, 'cam_diag_opts', status=ierr)
if (ierr == 0) then
read(unitn, cam_diag_opts, iostat=ierr)
if (ierr /= 0) then
call endrun(subname // ':: ERROR reading namelist')
end if
end if
close(unitn)
call freeunit(unitn)
end if
! Broadcast namelist variables
call mpi_bcast(diag_cnst_conv_tend, len(diag_cnst_conv_tend), mpi_character, masterprocid, mpicom, ierr)
end subroutine diag_readnl
!==============================================================================
subroutine diag_register_dry()
call pbuf_add_field('PSL', 'physpkg', dtype_r8, (/pcols/), psl_idx)
! Request physics buffer space for fields that persist across timesteps.
call pbuf_add_field('T_TTEND', 'global', dtype_r8, (/pcols,pver,dyn_time_lvls/), t_ttend_idx)
end subroutine diag_register_dry
subroutine diag_register_moist()
! Request physics buffer space for fields that persist across timesteps.
call pbuf_add_field('TREFMXAV', 'global', dtype_r8, (/pcols/), trefmxav_idx)
call pbuf_add_field('TREFMNAV', 'global', dtype_r8, (/pcols/), trefmnav_idx)
end subroutine diag_register_moist
subroutine diag_register()
call diag_register_dry()
if (moist_physics) then
call diag_register_moist()
end if
end subroutine diag_register
!==============================================================================
subroutine diag_init_dry(pbuf2d)
! Declare the history fields for which this module contains outfld calls.
use cam_history, only: addfld, add_default, horiz_only
use cam_history, only: register_vector_field
use constituent_burden, only: constituent_burden_init
use physics_buffer, only: pbuf_set_field
use tidal_diag, only: tidal_diag_init
type(physics_buffer_desc), pointer, intent(in) :: pbuf2d(:,:)
integer :: k, m
integer :: ierr
! outfld calls in diag_phys_writeout
call addfld (cnst_name(1), (/ 'lev' /), 'A', 'kg/kg', cnst_longname(1))
call addfld ('NSTEP', horiz_only, 'A', 'timestep', 'Model timestep')
call addfld ('PHIS', horiz_only, 'I', 'm2/s2', 'Surface geopotential')
call addfld ('PS', horiz_only, 'A', 'Pa', 'Surface pressure')
call addfld ('T', (/ 'lev' /), 'A', 'K', 'Temperature')
call addfld ('U', (/ 'lev' /), 'A', 'm/s', 'Zonal wind')
call addfld ('V', (/ 'lev' /), 'A', 'm/s', 'Meridional wind')
call register_vector_field('U','V')
! State before physics
call addfld ('TBP', (/ 'lev' /), 'A','K', 'Temperature (before physics)')
call addfld (bpcnst(1), (/ 'lev' /), 'A','kg/kg', trim(cnst_longname(1))//' (before physics)')
! State after physics
call addfld ('TAP', (/ 'lev' /), 'A','K', 'Temperature (after physics)' )
call addfld ('UAP', (/ 'lev' /), 'A','m/s', 'Zonal wind (after physics)' )
call addfld ('VAP', (/ 'lev' /), 'A','m/s', 'Meridional wind (after physics)' )
call register_vector_field('UAP','VAP')
call addfld (apcnst(1), (/ 'lev' /), 'A','kg/kg', trim(cnst_longname(1))//' (after physics)')
if ( dycore_is('LR') .or. dycore_is('SE') ) then
call addfld ('TFIX', horiz_only, 'A', 'K/s', 'T fixer (T equivalent of Energy correction)')
end if
call addfld ('TTEND_TOT', (/ 'lev' /), 'A', 'K/s', 'Total temperature tendency')
call addfld ('Z3', (/ 'lev' /), 'A', 'm', 'Geopotential Height (above sea level)')
call addfld ('Z1000', horiz_only, 'A', 'm', 'Geopotential Z at 1000 mbar pressure surface')
call addfld ('Z700', horiz_only, 'A', 'm', 'Geopotential Z at 700 mbar pressure surface')
call addfld ('Z500', horiz_only, 'A', 'm', 'Geopotential Z at 500 mbar pressure surface')
call addfld ('Z300', horiz_only, 'A', 'm', 'Geopotential Z at 300 mbar pressure surface')
call addfld ('Z200', horiz_only, 'A', 'm', 'Geopotential Z at 200 mbar pressure surface')
call addfld ('Z100', horiz_only, 'A', 'm', 'Geopotential Z at 100 mbar pressure surface')
call addfld ('Z050', horiz_only, 'A', 'm', 'Geopotential Z at 50 mbar pressure surface')
call addfld ('ZZ', (/ 'lev' /), 'A', 'm2', 'Eddy height variance' )
call addfld ('VZ', (/ 'lev' /), 'A', 'm2/s', 'Meridional transport of geopotential height')
call addfld ('VT', (/ 'lev' /), 'A', 'K m/s ', 'Meridional heat transport')
call addfld ('VU', (/ 'lev' /), 'A', 'm2/s2', 'Meridional flux of zonal momentum' )
call addfld ('VV', (/ 'lev' /), 'A', 'm2/s2', 'Meridional velocity squared' )
call addfld ('OMEGAV', (/ 'lev' /), 'A', 'm Pa/s2 ', 'Vertical flux of meridional momentum' )
call addfld ('OMGAOMGA', (/ 'lev' /), 'A', 'Pa2/s2', 'Vertical flux of vertical momentum' )
call addfld ('UU', (/ 'lev' /), 'A', 'm2/s2', 'Zonal velocity squared' )
call addfld ('WSPEED', (/ 'lev' /), 'X', 'm/s', 'Horizontal total wind speed maximum' )
call addfld ('WSPDSRFMX', horiz_only, 'X', 'm/s', 'Horizontal total wind speed maximum at the surface' )
call addfld ('WSPDSRFAV', horiz_only, 'A', 'm/s', 'Horizontal total wind speed average at the surface' )
call addfld ('OMEGA', (/ 'lev' /), 'A', 'Pa/s', 'Vertical velocity (pressure)')
call addfld ('OMEGAT', (/ 'lev' /), 'A', 'K Pa/s ', 'Vertical heat flux' )
call addfld ('OMEGAU', (/ 'lev' /), 'A', 'm Pa/s2 ', 'Vertical flux of zonal momentum' )
call addfld ('OMEGA850', horiz_only, 'A', 'Pa/s', 'Vertical velocity at 850 mbar pressure surface')
call addfld ('OMEGA500', horiz_only, 'A', 'Pa/s', 'Vertical velocity at 500 mbar pressure surface')
call addfld ('PSL', horiz_only, 'A', 'Pa','Sea level pressure')
call addfld ('T1000', horiz_only, 'A', 'K','Temperature at 1000 mbar pressure surface')
call addfld ('T925', horiz_only, 'A', 'K','Temperature at 925 mbar pressure surface')
call addfld ('T850', horiz_only, 'A', 'K','Temperature at 850 mbar pressure surface')
call addfld ('T700', horiz_only, 'A', 'K','Temperature at 700 mbar pressure surface')
call addfld ('T500', horiz_only, 'A', 'K','Temperature at 500 mbar pressure surface')
call addfld ('T400', horiz_only, 'A', 'K','Temperature at 400 mbar pressure surface')
call addfld ('T300', horiz_only, 'A', 'K','Temperature at 300 mbar pressure surface')
call addfld ('T200', horiz_only, 'A', 'K','Temperature at 200 mbar pressure surface')
call addfld ('T010', horiz_only, 'A', 'K','Temperature at 10 mbar pressure surface')
call addfld ('T7001000', horiz_only, 'A', 'K','Temperature difference 700 mb - 1000 mb')
call addfld ('TH7001000', horiz_only, 'A', 'K','Theta difference 700 mb - 1000 mb')
call addfld ('THE7001000', horiz_only, 'A', 'K','ThetaE difference 700 mb - 1000 mb')
call addfld ('T8501000', horiz_only, 'A', 'K','Temperature difference 850 mb - 1000 mb')
call addfld ('TH8501000', horiz_only, 'A', 'K','Theta difference 850 mb - 1000 mb')
call addfld ('T9251000', horiz_only, 'A', 'K','Temperature difference 925 mb - 1000 mb')
call addfld ('TH9251000', horiz_only, 'A', 'K','Theta difference 925 mb - 1000 mb')
call addfld ('TT', (/ 'lev' /), 'A', 'K2','Eddy temperature variance' )
call addfld ('U850', horiz_only, 'A', 'm/s','Zonal wind at 850 mbar pressure surface')
call addfld ('U500', horiz_only, 'A', 'm/s','Zonal wind at 500 mbar pressure surface')
call addfld ('U250', horiz_only, 'A', 'm/s','Zonal wind at 250 mbar pressure surface')
call addfld ('U200', horiz_only, 'A', 'm/s','Zonal wind at 200 mbar pressure surface')
call addfld ('U010', horiz_only, 'A', 'm/s','Zonal wind at 10 mbar pressure surface')
call addfld ('V850', horiz_only, 'A', 'm/s','Meridional wind at 850 mbar pressure surface')
call addfld ('V500', horiz_only, 'A', 'm/s','Meridional wind at 500 mbar pressure surface')
call addfld ('V250', horiz_only, 'A', 'm/s','Meridional wind at 250 mbar pressure surface')
call addfld ('V200', horiz_only, 'A', 'm/s','Meridional wind at 200 mbar pressure surface')
call register_vector_field('U850', 'V850')
call register_vector_field('U500', 'V500')
call register_vector_field('U250', 'V250')
call register_vector_field('U200', 'V200')
call addfld ('UBOT', horiz_only, 'A', 'm/s','Lowest model level zonal wind')
call addfld ('VBOT', horiz_only, 'A', 'm/s','Lowest model level meridional wind')
call register_vector_field('UBOT', 'VBOT')
call addfld ('ZBOT', horiz_only, 'A', 'm','Lowest model level height')
call addfld ('ATMEINT', horiz_only, 'A', 'J/m2','Vertically integrated total atmospheric energy ')
if (history_amwg) then
call add_default ('PHIS ' , 1, ' ')
call add_default ('PS ' , 1, ' ')
call add_default ('T ' , 1, ' ')
call add_default ('U ' , 1, ' ')
call add_default ('V ' , 1, ' ')
call add_default ('Z3 ' , 1, ' ')
call add_default ('OMEGA ' , 1, ' ')
call add_default ('VT ', 1, ' ')
call add_default ('VU ', 1, ' ')
call add_default ('VV ', 1, ' ')
call add_default ('UU ', 1, ' ')
call add_default ('OMEGAT ', 1, ' ')
call add_default ('PSL ', 1, ' ')
end if
if (history_vdiag) then
call add_default ('U200', 2, ' ')
call add_default ('V200', 2, ' ')
call add_default ('U850', 2, ' ')
call add_default ('U200', 3, ' ')
call add_default ('U850', 3, ' ')
call add_default ('OMEGA500', 3, ' ')
end if
if (history_eddy) then
call add_default ('VT ', 1, ' ')
call add_default ('VU ', 1, ' ')
call add_default ('VV ', 1, ' ')
call add_default ('UU ', 1, ' ')
call add_default ('OMEGAT ', 1, ' ')
call add_default ('OMEGAU ', 1, ' ')
call add_default ('OMEGAV ', 1, ' ')
endif
if ( history_budget ) then
call add_default ('PHIS ' , history_budget_histfile_num, ' ')
call add_default ('PS ' , history_budget_histfile_num, ' ')
call add_default ('T ' , history_budget_histfile_num, ' ')
call add_default ('U ' , history_budget_histfile_num, ' ')
call add_default ('V ' , history_budget_histfile_num, ' ')
call add_default ('TTEND_TOT' , history_budget_histfile_num, ' ')
! State before physics (FV)
call add_default ('TBP ' , history_budget_histfile_num, ' ')
call add_default (bpcnst(1) , history_budget_histfile_num, ' ')
! State after physics (FV)
call add_default ('TAP ' , history_budget_histfile_num, ' ')
call add_default ('UAP ' , history_budget_histfile_num, ' ')
call add_default ('VAP ' , history_budget_histfile_num, ' ')
call add_default (apcnst(1) , history_budget_histfile_num, ' ')
if ( dycore_is('LR') .or. dycore_is('SE') ) then
call add_default ('TFIX ' , history_budget_histfile_num, ' ')
end if
end if
if (history_waccm) then
call add_default ('PHIS', 7, ' ')
call add_default ('PS', 7, ' ')
call add_default ('PSL', 7, ' ')
end if
! outfld calls in diag_phys_tend_writeout
call addfld ('PTTEND', (/ 'lev' /), 'A', 'K/s','T total physics tendency' )
if ( history_budget ) then
call add_default ('PTTEND' , history_budget_histfile_num, ' ')
end if
! create history variables for fourier coefficients of the diurnal
! and semidiurnal tide in T, U, V, and Z3
call tidal_diag_init()
!
! energy diagnostics
!
call addfld ('SE_pBF', horiz_only, 'A', 'J/m2','Dry Static Energy before energy fixer')
call addfld ('SE_pBP', horiz_only, 'A', 'J/m2','Dry Static Energy before parameterizations')
call addfld ('SE_pAP', horiz_only, 'A', 'J/m2','Dry Static Energy after parameterizations')
call addfld ('SE_pAM', horiz_only, 'A', 'J/m2','Dry Static Energy after dry mass correction')
call addfld ('KE_pBF', horiz_only, 'A', 'J/m2','Kinetic Energy before energy fixer')
call addfld ('KE_pBP', horiz_only, 'A', 'J/m2','Kinetic Energy before parameterizations')
call addfld ('KE_pAP', horiz_only, 'A', 'J/m2','Kinetic Energy after parameterizations')
call addfld ('KE_pAM', horiz_only, 'A', 'J/m2','Kinetic Energy after dry mass correction')
call addfld ('TT_pBF', horiz_only, 'A', 'kg/m2','Total column test tracer before energy fixer')
call addfld ('TT_pBP', horiz_only, 'A', 'kg/m2','Total column test tracer before parameterizations')
call addfld ('TT_pAP', horiz_only, 'A', 'kg/m2','Total column test tracer after parameterizations')
call addfld ('TT_pAM', horiz_only, 'A', 'kg/m2','Total column test tracer after dry mass correction')
call addfld ('WV_pBF', horiz_only, 'A', 'kg/m2','Total column water vapor before energy fixer')
call addfld ('WV_pBP', horiz_only, 'A', 'kg/m2','Total column water vapor before parameterizations')
call addfld ('WV_pAP', horiz_only, 'A', 'kg/m2','Total column water vapor after parameterizations')
call addfld ('WV_pAM', horiz_only, 'A', 'kg/m2','Total column water vapor after dry mass correction')
call addfld ('WL_pBF', horiz_only, 'A', 'kg/m2','Total column cloud water before energy fixer')
call addfld ('WL_pBP', horiz_only, 'A', 'kg/m2','Total column cloud water before parameterizations')
call addfld ('WL_pAP', horiz_only, 'A', 'kg/m2','Total column cloud water after parameterizations')
call addfld ('WL_pAM', horiz_only, 'A', 'kg/m2','Total column cloud water after dry mass correction')
call addfld ('WI_pBF', horiz_only, 'A', 'kg/m2','Total column cloud ice before energy fixer')
call addfld ('WI_pBP', horiz_only, 'A', 'kg/m2','Total column cloud ice before parameterizations')
call addfld ('WI_pAP', horiz_only, 'A', 'kg/m2','Total column cloud ice after parameterizations')
call addfld ('WI_pAM', horiz_only, 'A', 'kg/m2','Total column cloud ice after dry mass correction')
!
! Axial Angular Momentum diagnostics
!
call addfld ('MR_pBF', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column wind axial angular momentum before energy fixer')
call addfld ('MR_pBP', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column wind axial angular momentum before parameterizations')
call addfld ('MR_pAP', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column wind axial angular momentum after parameterizations')
call addfld ('MR_pAM', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column wind axial angular momentum after dry mass correction')
call addfld ('MO_pBF', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column mass axial angular momentum before energy fixer')
call addfld ('MO_pBP', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column mass axial angular momentum before parameterizations')
call addfld ('MO_pAP', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column mass axial angular momentum after parameterizations')
call addfld ('MO_pAM', horiz_only, 'A', 'kg*m2/s*rad2',&
'Total column mass axial angular momentum after dry mass correction')
end subroutine diag_init_dry
subroutine diag_init_moist(pbuf2d)
! Declare the history fields for which this module contains outfld calls.
use cam_history, only: addfld, add_default, horiz_only
use cam_history, only: register_vector_field
use constituent_burden, only: constituent_burden_init
use physics_buffer, only: pbuf_set_field
type(physics_buffer_desc), pointer, intent(in) :: pbuf2d(:,:)
integer :: k, m
integer :: ixcldice, ixcldliq ! constituent indices for cloud liquid and ice water.
integer :: ierr
! column burdens for all constituents except water vapor
call constituent_burden_init
call cnst_get_ind('CLDLIQ', ixcldliq, abort=.false.)
call cnst_get_ind('CLDICE', ixcldice, abort=.false.)
! outfld calls in diag_phys_writeout
call addfld ('OMEGAQ', (/ 'lev' /), 'A', 'kgPa/kgs', 'Vertical water transport' )
call addfld ('VQ', (/ 'lev' /), 'A', 'm/skg/kg', 'Meridional water transport')
call addfld ('QQ', (/ 'lev' /), 'A', 'kg2/kg2', 'Eddy moisture variance')
call addfld ('MQ', (/ 'lev' /), 'A', 'kg/m2','Water vapor mass in layer')
call addfld ('TMQ', horiz_only, 'A', 'kg/m2','Total (vertically integrated) precipitable water')
call addfld ('RELHUM', (/ 'lev' /), 'A', 'percent','Relative humidity')
call addfld ('RHW', (/ 'lev' /), 'A', 'percent','Relative humidity with respect to liquid')
call addfld ('RHI', (/ 'lev' /), 'A', 'percent','Relative humidity with respect to ice')
call addfld ('RHCFMIP', (/ 'lev' /), 'A', 'percent','Relative humidity with respect to water above 273 K, ice below 273 K')
call addfld ('THE8501000', horiz_only, 'A', 'K','ThetaE difference 850 mb - 1000 mb')
call addfld ('THE9251000', horiz_only, 'A', 'K','ThetaE difference 925 mb - 1000 mb')
call addfld ('Q1000', horiz_only, 'A', 'kg/kg','Specific Humidity at 1000 mbar pressure surface')
call addfld ('Q925', horiz_only, 'A', 'kg/kg','Specific Humidity at 925 mbar pressure surface')
call addfld ('Q850', horiz_only, 'A', 'kg/kg','Specific Humidity at 850 mbar pressure surface')
call addfld ('Q200', horiz_only, 'A', 'kg/kg','Specific Humidity at 700 mbar pressure surface')
call addfld ('QBOT', horiz_only, 'A', 'kg/kg','Lowest model level water vapor mixing ratio')
call addfld ('PSDRY', horiz_only, 'A', 'Pa', 'Dry surface pressure')
call addfld ('PMID', (/ 'lev' /), 'A', 'Pa', 'Pressure at layer midpoints')
call addfld ('PDELDRY', (/ 'lev' /), 'A', 'Pa', 'Dry pressure difference between levels')
! outfld calls in diag_conv
call addfld ('DTCOND', (/ 'lev' /), 'A','K/s','T tendency - moist processes')
call addfld ('DTCOND_24_COS',(/ 'lev' /), 'A','K/s','T tendency - moist processes 24hr. cos coeff.')
call addfld ('DTCOND_24_SIN',(/ 'lev' /), 'A','K/s','T tendency - moist processes 24hr. sin coeff.')
call addfld ('DTCOND_12_COS',(/ 'lev' /), 'A','K/s','T tendency - moist processes 12hr. cos coeff.')
call addfld ('DTCOND_12_SIN',(/ 'lev' /), 'A','K/s','T tendency - moist processes 12hr. sin coeff.')
call addfld ('DTCOND_08_COS',(/ 'lev' /), 'A','K/s','T tendency - moist processes 8hr. cos coeff.')
call addfld ('DTCOND_08_SIN',(/ 'lev' /), 'A','K/s','T tendency - moist processes 8hr. sin coeff.')
call addfld ('PRECL', horiz_only, 'A', 'm/s','Large-scale (stable) precipitation rate (liq + ice)' )
call addfld ('PRECC', horiz_only, 'A', 'm/s','Convective precipitation rate (liq + ice)' )
call addfld ('PRECT', horiz_only, 'A', 'm/s','Total (convective and large-scale) precipitation rate (liq + ice)' )
call addfld ('PREC_PCW', horiz_only, 'A', 'm/s','LS_pcw precipitation rate')
call addfld ('PREC_zmc', horiz_only, 'A', 'm/s','CV_zmc precipitation rate')
call addfld ('PRECTMX', horiz_only, 'X','m/s','Maximum (convective and large-scale) precipitation rate (liq+ice)' )
call addfld ('PRECSL', horiz_only, 'A', 'm/s','Large-scale (stable) snow rate (water equivalent)' )
call addfld ('PRECSC', horiz_only, 'A', 'm/s','Convective snow rate (water equivalent)' )
call addfld ('PRECCav', horiz_only, 'A', 'm/s','Average large-scale precipitation (liq + ice)' )
call addfld ('PRECLav', horiz_only, 'A', 'm/s','Average convective precipitation (liq + ice)' )
! outfld calls in diag_surf
call addfld ('SHFLX', horiz_only, 'A', 'W/m2','Surface sensible heat flux')
call addfld ('LHFLX', horiz_only, 'A', 'W/m2','Surface latent heat flux')
call addfld ('QFLX', horiz_only, 'A', 'kg/m2/s','Surface water flux')
call addfld ('TAUX', horiz_only, 'A', 'N/m2','Zonal surface stress')
call addfld ('TAUY', horiz_only, 'A', 'N/m2','Meridional surface stress')
call addfld ('TREFHT', horiz_only, 'A', 'K','Reference height temperature')
call addfld ('TREFHTMN', horiz_only, 'M','K','Minimum reference height temperature over output period')
call addfld ('TREFHTMX', horiz_only, 'X','K','Maximum reference height temperature over output period')
call addfld ('QREFHT', horiz_only, 'A', 'kg/kg','Reference height humidity')
call addfld ('U10', horiz_only, 'A', 'm/s','10m wind speed')
call addfld ('RHREFHT', horiz_only, 'A', 'fraction','Reference height relative humidity')
call addfld ('LANDFRAC', horiz_only, 'A', 'fraction','Fraction of sfc area covered by land')
call addfld ('ICEFRAC', horiz_only, 'A', 'fraction','Fraction of sfc area covered by sea-ice')
call addfld ('OCNFRAC', horiz_only, 'A', 'fraction','Fraction of sfc area covered by ocean')
call addfld ('TREFMNAV', horiz_only, 'A', 'K','Average of TREFHT daily minimum')
call addfld ('TREFMXAV', horiz_only, 'A', 'K','Average of TREFHT daily maximum')
call addfld ('TS', horiz_only, 'A', 'K','Surface temperature (radiative)')
call addfld ('TSMN', horiz_only, 'M','K','Minimum surface temperature over output period')
call addfld ('TSMX', horiz_only, 'X','K','Maximum surface temperature over output period')
call addfld ('SNOWHLND', horiz_only, 'A', 'm','Water equivalent snow depth')
call addfld ('SNOWHICE', horiz_only, 'A', 'm','Snow depth over ice', fill_value = 1.e30_r8)
call addfld ('TBOT', horiz_only, 'A', 'K','Lowest model level temperature')
call addfld ('ASDIR', horiz_only, 'A', '1','albedo: shortwave, direct')
call addfld ('ASDIF', horiz_only, 'A', '1','albedo: shortwave, diffuse')
call addfld ('ALDIR', horiz_only, 'A', '1','albedo: longwave, direct')
call addfld ('ALDIF', horiz_only, 'A', '1','albedo: longwave, diffuse')
call addfld ('SST', horiz_only, 'A', 'K','sea surface temperature')
! outfld calls in diag_phys_tend_writeout
call addfld (ptendnam( 1),(/ 'lev' /), 'A', 'kg/kg/s',trim(cnst_name( 1))//' total physics tendency ' )
if (ixcldliq > 0) then
call addfld (ptendnam(ixcldliq),(/ 'lev' /), 'A', 'kg/kg/s',trim(cnst_name(ixcldliq))//' total physics tendency ' )
end if
if (ixcldice > 0) then
call addfld (ptendnam(ixcldice),(/ 'lev' /), 'A', 'kg/kg/s',trim(cnst_name(ixcldice))//' total physics tendency ')
end if
if ( dycore_is('LR') )then
call addfld (dmetendnam( 1),(/ 'lev' /), 'A','kg/kg/s', &
trim(cnst_name( 1))//' dme adjustment tendency (FV) ')
if (ixcldliq > 0) then
call addfld (dmetendnam(ixcldliq),(/ 'lev' /), 'A','kg/kg/s', &
trim(cnst_name(ixcldliq))//' dme adjustment tendency (FV) ')
end if
if (ixcldice > 0) then
call addfld (dmetendnam(ixcldice),(/ 'lev' /), 'A','kg/kg/s', &
trim(cnst_name(ixcldice))//' dme adjustment tendency (FV) ')
end if
end if
! outfld calls in diag_physvar_ic
call addfld ('QCWAT&IC', (/ 'lev' /), 'I','kg/kg','q associated with cloud water' )
call addfld ('TCWAT&IC', (/ 'lev' /), 'I','kg/kg','T associated with cloud water' )
call addfld ('LCWAT&IC', (/ 'lev' /), 'I','kg/kg','Cloud water (ice + liq' )
call addfld ('CLOUD&IC', (/ 'lev' /), 'I','fraction','Cloud fraction' )
call addfld ('CONCLD&IC', (/ 'lev' /), 'I','fraction','Convective cloud fraction' )
call addfld ('TKE&IC', (/ 'ilev' /), 'I','m2/s2','Turbulent Kinetic Energy' )
call addfld ('CUSH&IC', horiz_only, 'I','m','Convective Scale Height' )
call addfld ('KVH&IC', (/ 'ilev' /), 'I','m2/s','Vertical diffusion diffusivities (heat/moisture)' )
call addfld ('KVM&IC', (/ 'ilev' /), 'I','m2/s','Vertical diffusion diffusivities (momentum)' )
call addfld ('PBLH&IC', horiz_only, 'I','m','PBL height' )
call addfld ('TPERT&IC', horiz_only, 'I','K','Perturbation temperature (eddies in PBL)' )
call addfld ('QPERT&IC', horiz_only, 'I','kg/kg','Perturbation specific humidity (eddies in PBL)' )
! CAM export state
call addfld('a2x_BCPHIWET', horiz_only, 'A', 'kg/m2/s', 'wetdep of hydrophilic black carbon')
call addfld('a2x_BCPHIDRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophilic black carbon')
call addfld('a2x_BCPHODRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophobic black carbon')
call addfld('a2x_OCPHIWET', horiz_only, 'A', 'kg/m2/s', 'wetdep of hydrophilic organic carbon')
call addfld('a2x_OCPHIDRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophilic organic carbon')
call addfld('a2x_OCPHODRY', horiz_only, 'A', 'kg/m2/s', 'drydep of hydrophobic organic carbon')
call addfld('a2x_DSTWET1', horiz_only, 'A', 'kg/m2/s', 'wetdep of dust (bin1)')
call addfld('a2x_DSTDRY1', horiz_only, 'A', 'kg/m2/s', 'drydep of dust (bin1)')
call addfld('a2x_DSTWET2', horiz_only, 'A', 'kg/m2/s', 'wetdep of dust (bin2)')
call addfld('a2x_DSTDRY2', horiz_only, 'A', 'kg/m2/s', 'drydep of dust (bin2)')
call addfld('a2x_DSTWET3', horiz_only, 'A', 'kg/m2/s', 'wetdep of dust (bin3)')
call addfld('a2x_DSTDRY3', horiz_only, 'A', 'kg/m2/s', 'drydep of dust (bin3)')
call addfld('a2x_DSTWET4', horiz_only, 'A', 'kg/m2/s', 'wetdep of dust (bin4)')
call addfld('a2x_DSTDRY4', horiz_only, 'A', 'kg/m2/s', 'drydep of dust (bin4)')
! defaults
if (history_amwg) then
call add_default (cnst_name(1), 1, ' ')
call add_default ('VQ ', 1, ' ')
call add_default ('TMQ ', 1, ' ')
call add_default ('PSL ', 1, ' ')
call add_default ('RELHUM ', 1, ' ')
call add_default ('DTCOND ', 1, ' ')
call add_default ('PRECL ', 1, ' ')
call add_default ('PRECC ', 1, ' ')
call add_default ('PRECSL ', 1, ' ')
call add_default ('PRECSC ', 1, ' ')
call add_default ('SHFLX ', 1, ' ')
call add_default ('LHFLX ', 1, ' ')
call add_default ('QFLX ', 1, ' ')
call add_default ('TAUX ', 1, ' ')
call add_default ('TAUY ', 1, ' ')
call add_default ('TREFHT ', 1, ' ')
call add_default ('LANDFRAC', 1, ' ')
call add_default ('OCNFRAC ', 1, ' ')
call add_default ('QREFHT ', 1, ' ')
call add_default ('U10 ', 1, ' ')
call add_default ('ICEFRAC ', 1, ' ')
call add_default ('TS ', 1, ' ')
call add_default ('TSMN ', 1, ' ')
call add_default ('TSMX ', 1, ' ')
call add_default ('SNOWHLND', 1, ' ')
call add_default ('SNOWHICE', 1, ' ')
end if
if (dycore_is('SE')) then
call add_default ('PSDRY', 1, ' ')
call add_default ('PMID', 1, ' ')
end if
if (history_eddy) then
call add_default ('VQ ', 1, ' ')
endif
if ( history_budget ) then
call add_default (cnst_name(1), history_budget_histfile_num, ' ')
call add_default ('PTTEND' , history_budget_histfile_num, ' ')
call add_default (ptendnam( 1), history_budget_histfile_num, ' ')
if (ixcldliq > 0) then
call add_default (ptendnam(ixcldliq), history_budget_histfile_num, ' ')
end if
if (ixcldice > 0) then
call add_default (ptendnam(ixcldice), history_budget_histfile_num, ' ')
end if
if ( dycore_is('LR') )then
call add_default(dmetendnam(1) , history_budget_histfile_num, ' ')
if (ixcldliq > 0) then
call add_default(dmetendnam(ixcldliq), history_budget_histfile_num, ' ')
end if
if (ixcldice > 0) then
call add_default(dmetendnam(ixcldice), history_budget_histfile_num, ' ')
end if
end if
if( history_budget_histfile_num > 1 ) then
call add_default ('DTCOND ' , history_budget_histfile_num, ' ')
end if
end if
if (history_vdiag) then
call add_default ('PRECT ', 2, ' ')
call add_default ('PRECT ', 3, ' ')
call add_default ('PRECT ', 4, ' ')
end if
! Initial file - Optional fields
if (inithist_all.or.single_column) then
call add_default ('CONCLD&IC ',0, 'I')
call add_default ('QCWAT&IC ',0, 'I')
call add_default ('TCWAT&IC ',0, 'I')
call add_default ('LCWAT&IC ',0, 'I')
call add_default ('PBLH&IC ',0, 'I')
call add_default ('TPERT&IC ',0, 'I')
call add_default ('QPERT&IC ',0, 'I')
call add_default ('CLOUD&IC ',0, 'I')
call add_default ('TKE&IC ',0, 'I')
call add_default ('CUSH&IC ',0, 'I')
call add_default ('KVH&IC ',0, 'I')
call add_default ('KVM&IC ',0, 'I')
end if
! determine number of constituents for which convective tendencies must be computed
if (history_budget) then
dqcond_num = pcnst
else
if (diag_cnst_conv_tend == 'none') dqcond_num = 0
if (diag_cnst_conv_tend == 'q_only') dqcond_num = 1
if (diag_cnst_conv_tend == 'all') dqcond_num = pcnst
end if
do m = 1, dqcond_num
dcconnam(m) = 'DC'//cnst_name(m)
end do
if ((diag_cnst_conv_tend == 'q_only') .or. (diag_cnst_conv_tend == 'all') .or. history_budget) then
call addfld (dcconnam(1),(/ 'lev' /),'A', 'kg/kg/s',trim(cnst_name(1))//' tendency due to moist processes')
if ( diag_cnst_conv_tend == 'q_only' .or. diag_cnst_conv_tend == 'all' ) then
call add_default (dcconnam(1), 1, ' ')
end if
if( history_budget ) then
call add_default (dcconnam(1), history_budget_histfile_num, ' ')
end if
if (diag_cnst_conv_tend == 'all' .or. history_budget) then
do m = 2, pcnst
call addfld (dcconnam(m),(/ 'lev' /),'A', 'kg/kg/s',trim(cnst_name(m))//' tendency due to moist processes')
if( diag_cnst_conv_tend == 'all' ) then
call add_default (dcconnam(m), 1, ' ')
end if
if( history_budget .and. (m == ixcldliq .or. m == ixcldice) ) then
call add_default (dcconnam(m), history_budget_histfile_num, ' ')
end if
end do
end if
end if
! Pbuf field indices for collecting output data
relhum_idx = pbuf_get_index('RELHUM', errcode=ierr)
qcwat_idx = pbuf_get_index('QCWAT', errcode=ierr)
tcwat_idx = pbuf_get_index('TCWAT', errcode=ierr)
lcwat_idx = pbuf_get_index('LCWAT', errcode=ierr)
cld_idx = pbuf_get_index('CLD', errcode=ierr)
concld_idx = pbuf_get_index('CONCLD', errcode=ierr)
tke_idx = pbuf_get_index('tke', errcode=ierr)
kvm_idx = pbuf_get_index('kvm', errcode=ierr)
kvh_idx = pbuf_get_index('kvh', errcode=ierr)
cush_idx = pbuf_get_index('cush', errcode=ierr)
pblh_idx = pbuf_get_index('pblh', errcode=ierr)
tpert_idx = pbuf_get_index('tpert', errcode=ierr)
qpert_idx = pbuf_get_index('qpert', errcode=ierr)
prec_dp_idx = pbuf_get_index('PREC_DP', errcode=ierr)
snow_dp_idx = pbuf_get_index('SNOW_DP', errcode=ierr)
prec_sh_idx = pbuf_get_index('PREC_SH', errcode=ierr)
snow_sh_idx = pbuf_get_index('SNOW_SH', errcode=ierr)
prec_sed_idx = pbuf_get_index('PREC_SED', errcode=ierr)
snow_sed_idx = pbuf_get_index('SNOW_SED', errcode=ierr)
prec_pcw_idx = pbuf_get_index('PREC_PCW', errcode=ierr)
snow_pcw_idx = pbuf_get_index('SNOW_PCW', errcode=ierr)
if (is_first_step()) then
call pbuf_set_field(pbuf2d, trefmxav_idx, -1.0e36_r8)
call pbuf_set_field(pbuf2d, trefmnav_idx, 1.0e36_r8)
end if
end subroutine diag_init_moist
subroutine diag_init(pbuf2d)
use cam_history, only: addfld
! Declare the history fields for which this module contains outfld calls.
type(physics_buffer_desc), pointer, intent(in) :: pbuf2d(:,:)
! ----------------------------
! determine default variables
! ----------------------------
call phys_getopts(history_amwg_out = history_amwg , &
history_vdiag_out = history_vdiag , &
history_eddy_out = history_eddy , &
history_budget_out = history_budget , &
history_budget_histfile_num_out = history_budget_histfile_num, &
history_waccm_out = history_waccm)
call diag_init_dry(pbuf2d)
if (moist_physics) then
call diag_init_moist(pbuf2d)
end if
end subroutine diag_init
!===============================================================================
subroutine diag_allocate_dry()
use infnan, only: nan, assignment(=)
! Allocate memory for module variables.
! Done at the begining of a physics step at same point as the pbuf allocate
! for variables with "physpkg" scope.
! Local variables
character(len=*), parameter :: sub = 'diag_allocate_dry'
character(len=128) :: errmsg
integer :: istat
allocate(dtcond(pcols,pver,begchunk:endchunk), stat=istat)
if ( istat /= 0 ) then
write(errmsg, '(2a,i0)') sub, ': allocate failed, stat = ',istat
call endrun (errmsg)
end if
dtcond = nan
end subroutine diag_allocate_dry
subroutine diag_allocate_moist()
use infnan, only: nan, assignment(=)
! Allocate memory for module variables.
! Done at the begining of a physics step at same point as the pbuf allocate
! for variables with "physpkg" scope.
! Local variables
character(len=*), parameter :: sub = 'diag_allocate_moist'
character(len=128) :: errmsg
integer :: i, istat
if (dqcond_num > 0) then
allocate(dqcond(dqcond_num))
do i = 1, dqcond_num
allocate(dqcond(i)%cnst(pcols,pver,begchunk:endchunk), stat=istat)
if ( istat /= 0 ) then
write(errmsg, '(2a,i0)') sub, ': allocate failed, stat = ',istat
call endrun (errmsg)
end if
dqcond(i)%cnst = nan
end do
end if
end subroutine diag_allocate_moist
subroutine diag_allocate()
call diag_allocate_dry()
if (moist_physics) then
call diag_allocate_moist()
end if
end subroutine diag_allocate
!===============================================================================
subroutine diag_deallocate_dry()
! Deallocate memory for module variables.
! Done at the end of a physics step at same point as the pbuf deallocate for
! variables with "physpkg" scope.
! Local variables
character(len=*), parameter :: sub = 'diag_deallocate_dry'
integer :: istat
deallocate(dtcond, stat=istat)
if ( istat /= 0 ) call endrun (sub//': ERROR: deallocate failed')
end subroutine diag_deallocate_dry
subroutine diag_deallocate_moist()
! Deallocate memory for module variables.
! Done at the end of a physics step at same point as the pbuf deallocate for
! variables with "physpkg" scope.
! Local variables
character(len=*), parameter :: sub = 'diag_deallocate_moist'
integer :: i, istat
if (dqcond_num > 0) then
do i = 1, dqcond_num
deallocate(dqcond(i)%cnst, stat=istat)
if ( istat /= 0 ) call endrun (sub//': ERROR: deallocate failed')
end do
deallocate(dqcond, stat=istat)
if ( istat /= 0 ) call endrun (sub//': ERROR: deallocate failed')
end if
end subroutine diag_deallocate_moist
subroutine diag_deallocate()
call diag_deallocate_dry()
if (moist_physics) then
call diag_deallocate_moist()
end if
end subroutine diag_deallocate
!===============================================================================
subroutine diag_conv_tend_ini(state,pbuf)
! Initialize convective tendency calcs.
! Arguments:
type(physics_state), intent(in) :: state
type(physics_buffer_desc), pointer :: pbuf(:)
! Local variables:
integer :: i, k, m, lchnk, ncol
real(r8), pointer, dimension(:,:) :: t_ttend
lchnk = state%lchnk
ncol = state%ncol
do k = 1, pver
do i = 1, ncol
dtcond(i,k,lchnk) = state%t(i,k)
end do
end do
do m = 1, dqcond_num
do k = 1, pver
do i = 1, ncol
dqcond(m)%cnst(i,k,lchnk) = state%q(i,k,m)
end do
end do
end do
!! initialize to pbuf T_TTEND to temperature at first timestep
if (is_first_step()) then
do m = 1, dyn_time_lvls
call pbuf_get_field(pbuf, t_ttend_idx, t_ttend, start=(/1,1,m/), kount=(/pcols,pver,1/))
t_ttend(:ncol,:) = state%t(:ncol,:)
end do
end if
end subroutine diag_conv_tend_ini
!===============================================================================
subroutine diag_phys_writeout_dry(state, pbuf, p_surf_t)
!-----------------------------------------------------------------------
!
! Purpose: output dry physics diagnostics
!
!-----------------------------------------------------------------------
use physconst, only: gravit, rga, rair, cpair, latvap, rearth, pi, cappa
use time_manager, only: get_nstep
use interpolate_data, only: vertinterp
use constituent_burden, only: constituent_burden_comp
use tidal_diag, only: tidal_diag_write
!-----------------------------------------------------------------------
!
! Arguments
!
type(physics_state), intent(inout) :: state
type(physics_buffer_desc), pointer :: pbuf(:)
real(r8), intent(out) :: p_surf_t(pcols, nsurf) ! data interpolated to a pressure surface
!
!---------------------------Local workspace-----------------------------
!
real(r8) :: ftem(pcols,pver) ! temporary workspace
real(r8) :: ftem1(pcols,pver) ! another temporary workspace
real(r8) :: ftem2(pcols,pver) ! another temporary workspace
real(r8) :: z3(pcols,pver) ! geo-potential height
real(r8) :: p_surf(pcols) ! data interpolated to a pressure surface
real(r8) :: tem2(pcols,pver) ! temporary workspace
real(r8) :: timestep(pcols) ! used for outfld call
real(r8) :: esl(pcols,pver) ! saturation vapor pressures
real(r8) :: esi(pcols,pver) !
real(r8) :: dlon(pcols) ! width of grid cell (meters)
real(r8), pointer :: psl(:) ! Sea Level Pressure
integer :: i, k, m, lchnk, ncol, nstep
!
!-----------------------------------------------------------------------
!
lchnk = state%lchnk
ncol = state%ncol
! Output NSTEP for debugging
nstep = get_nstep()
timestep(:ncol) = nstep
call outfld ('NSTEP ',timestep, pcols, lchnk)
call outfld('T ',state%t , pcols ,lchnk )
call outfld('PS ',state%ps, pcols ,lchnk )
call outfld('U ',state%u , pcols ,lchnk )
call outfld('V ',state%v , pcols ,lchnk )
call outfld('PHIS ',state%phis, pcols, lchnk )
#if (defined BFB_CAM_SCAM_IOP )
call outfld('phis ',state%phis, pcols, lchnk )
#endif
do m = 1, pcnst
if (cnst_cam_outfld(m)) then
call outfld(cnst_name(m), state%q(1,1,m), pcols, lchnk)
end if
end do
!
! Add height of surface to midpoint height above surface
!
do k = 1, pver
z3(:ncol,k) = state%zm(:ncol,k) + state%phis(:ncol)*rga
end do
call outfld('Z3 ',z3,pcols,lchnk)
!
! Output Z3 on pressure surfaces
!
if (hist_fld_active('Z1000')) then
call vertinterp(ncol, pcols, pver, state%pmid, 100000._r8, z3, p_surf, &
extrapolate='Z', ln_interp=.true., ps=state%ps, phis=state%phis, tbot=state%t(:,pver))
call outfld('Z1000 ', p_surf, pcols, lchnk)
end if
if (hist_fld_active('Z700')) then
call vertinterp(ncol, pcols, pver, state%pmid, 70000._r8, z3, p_surf, &
extrapolate='Z', ln_interp=.true., ps=state%ps, phis=state%phis, tbot=state%t(:,pver))
call outfld('Z700 ', p_surf, pcols, lchnk)
end if
if (hist_fld_active('Z500')) then
call vertinterp(ncol, pcols, pver, state%pmid, 50000._r8, z3, p_surf, &
extrapolate='Z', ln_interp=.true., ps=state%ps, phis=state%phis, tbot=state%t(:,pver))
call outfld('Z500 ', p_surf, pcols, lchnk)
end if
if (hist_fld_active('Z300')) then
call vertinterp(ncol, pcols, pver, state%pmid, 30000._r8, z3, p_surf, ln_interp=.true.)
call outfld('Z300 ', p_surf, pcols, lchnk)
end if
if (hist_fld_active('Z200')) then
call vertinterp(ncol, pcols, pver, state%pmid, 20000._r8, z3, p_surf, ln_interp=.true.)
call outfld('Z200 ', p_surf, pcols, lchnk)
end if
if (hist_fld_active('Z100')) then
call vertinterp(ncol, pcols, pver, state%pmid, 10000._r8, z3, p_surf, ln_interp=.true.)
call outfld('Z100 ', p_surf, pcols, lchnk)
end if
if (hist_fld_active('Z050')) then
call vertinterp(ncol, pcols, pver, state%pmid, 5000._r8, z3, p_surf, ln_interp=.true.)
call outfld('Z050 ', p_surf, pcols, lchnk)
end if
!
! Quadratic height fiels Z3*Z3
!
ftem(:ncol,:) = z3(:ncol,:)*z3(:ncol,:)
call outfld('ZZ ',ftem,pcols,lchnk)