diff --git a/atmos_model.F90 b/atmos_model.F90 index 6e29a696d..e6adc5ebc 100644 --- a/atmos_model.F90 +++ b/atmos_model.F90 @@ -228,8 +228,10 @@ module atmos_model_mod subroutine update_atmos_radiation_physics (Atmos) !----------------------------------------------------------------------- + implicit none type (atmos_data_type), intent(in) :: Atmos !--- local variables--- + integer :: idtend, itrac integer :: nb, jdat(8), rc, ierr if (mpp_pe() == mpp_root_pe() .and. debug) write(6,*) "statein driver" @@ -278,21 +280,40 @@ subroutine update_atmos_radiation_physics (Atmos) ! Calculate total non-physics tendencies by substracting old GFS Stateout ! variables from new/updated GFS Statein variables (gives the tendencies ! due to anything else than physics) - if (GFS_control%ldiag3d) then - do nb = 1,Atm_block%nblks - GFS_data(nb)%Intdiag%du3dt(:,:,8) = GFS_data(nb)%Intdiag%du3dt(:,:,8) & - + (GFS_data(nb)%Statein%ugrs - GFS_data(nb)%Stateout%gu0) - GFS_data(nb)%Intdiag%dv3dt(:,:,8) = GFS_data(nb)%Intdiag%dv3dt(:,:,8) & - + (GFS_data(nb)%Statein%vgrs - GFS_data(nb)%Stateout%gv0) - GFS_data(nb)%Intdiag%dt3dt(:,:,11) = GFS_data(nb)%Intdiag%dt3dt(:,:,11) & - + (GFS_data(nb)%Statein%tgrs - GFS_data(nb)%Stateout%gt0) - enddo - if (GFS_control%qdiag3d) then + if (GFS_Control%ldiag3d) then + idtend = GFS_Control%dtidx(GFS_Control%index_of_x_wind,GFS_Control%index_of_process_non_physics) + if(idtend>=1) then + do nb = 1,Atm_block%nblks + GFS_data(nb)%Intdiag%dtend(:,:,idtend) = GFS_data(nb)%Intdiag%dtend(:,:,idtend) & + + (GFS_data(nb)%Statein%ugrs - GFS_data(nb)%Stateout%gu0) + enddo + endif + + idtend = GFS_Control%dtidx(GFS_Control%index_of_y_wind,GFS_Control%index_of_process_non_physics) + if(idtend>=1) then do nb = 1,Atm_block%nblks - GFS_data(nb)%Intdiag%dq3dt(:,:,12) = GFS_data(nb)%Intdiag%dq3dt(:,:,12) & - + (GFS_data(nb)%Statein%qgrs(:,:,GFS_control%ntqv) - GFS_data(nb)%Stateout%gq0(:,:,GFS_control%ntqv)) - GFS_data(nb)%Intdiag%dq3dt(:,:,13) = GFS_data(nb)%Intdiag%dq3dt(:,:,13) & - + (GFS_data(nb)%Statein%qgrs(:,:,GFS_control%ntoz) - GFS_data(nb)%Stateout%gq0(:,:,GFS_control%ntoz)) + GFS_data(nb)%Intdiag%dtend(:,:,idtend) = GFS_data(nb)%Intdiag%dtend(:,:,idtend) & + + (GFS_data(nb)%Statein%vgrs - GFS_data(nb)%Stateout%gv0) + enddo + endif + + idtend = GFS_Control%dtidx(GFS_Control%index_of_temperature,GFS_Control%index_of_process_non_physics) + if(idtend>=1) then + do nb = 1,Atm_block%nblks + GFS_data(nb)%Intdiag%dtend(:,:,idtend) = GFS_data(nb)%Intdiag%dtend(:,:,idtend) & + + (GFS_data(nb)%Statein%tgrs - GFS_data(nb)%Stateout%gt0) + enddo + endif + + if (GFS_Control%qdiag3d) then + do itrac=1,GFS_Control%ntrac + idtend = GFS_Control%dtidx(itrac+100,GFS_Control%index_of_process_non_physics) + if(idtend>=1) then + do nb = 1,Atm_block%nblks + GFS_data(nb)%Intdiag%dtend(:,:,idtend) = GFS_data(nb)%Intdiag%dtend(:,:,idtend) & + + (GFS_data(nb)%Statein%qgrs(:,:,itrac) - GFS_data(nb)%Stateout%gq0(:,:,itrac)) + enddo + endif enddo endif endif @@ -359,6 +380,12 @@ subroutine update_atmos_radiation_physics (Atmos) endif + ! Per-timestep diagnostics must be after physics but before + ! flagging the first timestep. + if(GFS_control%print_diff_pgr) then + call atmos_timestep_diagnostics(Atmos) + endif + ! Update flag for first time step of time integration GFS_control%first_time_step = .false. @@ -367,6 +394,91 @@ end subroutine update_atmos_radiation_physics ! +!####################################################################### +! +! +! +! Calculates per-timestep, domain-wide, diagnostic, information and +! prints to stdout from master rank. Must be called after physics +! update but before first_time_step flag is cleared. +! + +! + +! +! Derived-type variable that contains fields needed by the flux exchange module. +! These fields describe the atmospheric grid and are needed to +! compute/exchange fluxes with other component models. All fields in this +! variable type are allocated for the global grid (without halo regions). +! +subroutine atmos_timestep_diagnostics(Atmos) + use mpi + implicit none + type (atmos_data_type), intent(in) :: Atmos +!--- local variables--- + integer :: i, nb, count, ierror + ! double precision ensures ranks and sums are not truncated + ! regardless of compilation settings + double precision :: pdiff, psum, pcount, maxabs, pmaxloc(7), adiff + double precision :: sendbuf(2), recvbuf(2), global_average + + if(GFS_control%print_diff_pgr) then + if(.not. GFS_control%first_time_step) then + pmaxloc = 0.0d0 + recvbuf = 0.0d0 + psum = 0.0d0 + pcount = 0.0d0 + maxabs = 0.0d0 + + ! Put pgr stats in pmaxloc, psum, and pcount: + pmaxloc(1) = GFS_Control%tile_num + do nb = 1,ATM_block%nblks + count = size(GFS_data(nb)%Statein%pgr) + do i=1,count + pdiff = GFS_data(nb)%Statein%pgr(i)-GFS_data(nb)%Intdiag%old_pgr(i) + adiff = abs(pdiff) + psum = psum+adiff + if(adiff>=maxabs) then + maxabs=adiff + pmaxloc(2:3)=(/ ATM_block%index(nb)%ii(i), ATM_block%index(nb)%jj(i) /) + pmaxloc(4:7)=(/ pdiff, GFS_data(nb)%Statein%pgr(i), & + GFS_data(nb)%Grid%xlat(i), GFS_data(nb)%Grid%xlon(i) /) + endif + enddo + pcount = pcount+count + enddo + + ! Sum pgr stats from psum/pcount and convert to hPa/hour global avg: + sendbuf(1:2) = (/ psum, pcount /) + call MPI_Allreduce(sendbuf,recvbuf,2,MPI_DOUBLE_PRECISION,MPI_SUM,GFS_Control%communicator,ierror) + global_average = recvbuf(1)/recvbuf(2) * 36.0d0/GFS_control%dtp + + ! Get the pmaxloc for the global maximum: + sendbuf(1:2) = (/ maxabs, dble(GFS_Control%me) /) + call MPI_Allreduce(sendbuf,recvbuf,1,MPI_2DOUBLE_PRECISION,MPI_MAXLOC,GFS_Control%communicator,ierror) + call MPI_Bcast(pmaxloc,size(pmaxloc),MPI_DOUBLE_PRECISION,nint(recvbuf(2)),GFS_Control%communicator,ierror) + + if(GFS_Control%me == GFS_Control%master) then +2933 format('At forecast hour ',F9.3,' mean abs pgr change is ',F16.8,' hPa/hr') +2934 format(' max abs change ',F15.10,' bar at tile=',I0,' i=',I0,' j=',I0) +2935 format(' pgr at that point',F15.10,' bar lat=',F12.6,' lon=',F12.6) + print 2933, GFS_control%fhour, global_average + print 2934, pmaxloc(4)*1d-5, nint(pmaxloc(1:3)) + print 2935, pmaxloc(5)*1d-5, pmaxloc(6:7)*57.29577951308232d0 ! 180/pi + endif + endif + ! old_pgr is updated every timestep, including the first one where stats aren't printed: + do nb = 1,ATM_block%nblks + GFS_data(nb)%Intdiag%old_pgr=GFS_data(nb)%Statein%pgr + enddo + endif + +!----------------------------------------------------------------------- +end subroutine atmos_timestep_diagnostics +! + !####################################################################### ! ! diff --git a/ccpp/data/GFS_typedefs.F90 b/ccpp/data/GFS_typedefs.F90 index 18317c040..3eacfba96 100644 --- a/ccpp/data/GFS_typedefs.F90 +++ b/ccpp/data/GFS_typedefs.F90 @@ -540,11 +540,30 @@ module GFS_typedefs real (kind=kind_phys), pointer :: pfi_lsan(:,:) => null() !< instantaneous 3D flux of ice nonconvective precipitation (kg m-2 s-1) real (kind=kind_phys), pointer :: pfl_lsan(:,:) => null() !< instantaneous 3D flux of liquid nonconvective precipitation (kg m-2 s-1) - contains procedure :: create => coupling_create !< allocate array data end type GFS_coupling_type +!---------------------------------------------------------------- +! dtend_var_label +! Information about first dimension of dtidx +!---------------------------------------------------------------- + type dtend_var_label + character(len=20) :: name + character(len=44) :: desc + character(len=32) :: unit + end type dtend_var_label + +!---------------------------------------------------------------- +! dtend_process_label +! Information about second dimension of dtidx +!---------------------------------------------------------------- + type dtend_process_label + character(len=20) :: name + character(len=44) :: desc + logical :: time_avg + character(len=20) :: mod_name + end type dtend_process_label !---------------------------------------------------------------------------------- ! GFS_control_type @@ -1124,7 +1143,41 @@ module GFS_typedefs character(len=32), pointer :: tracer_names(:) !< array of initialized tracers from dynamic core integer :: ntrac !< number of tracers integer :: ntracp1 !< number of tracers plus one + integer :: ntracp100 !< number of tracers plus one hundred integer :: nqrimef !< tracer index for mass weighted rime factor + + integer, pointer :: dtidx(:,:) => null() !< index in outermost dimension of dtend + integer :: ndtend !< size of outermost dimension of dtend + type(dtend_var_label), pointer :: dtend_var_labels(:) => null() !< information about first dim of dtidx + type(dtend_process_label), pointer :: dtend_process_labels(:) => null() !< information about second dim of dtidx + + ! Indices within inner dimension of dtidx for things that are not tracers: + integer :: index_of_temperature !< temperature in dtidx + integer :: index_of_x_wind !< x wind in dtidx + integer :: index_of_y_wind !< y wind in dtidx + + ! Indices within outer dimension of dtidx: + integer :: nprocess !< maximum value of the below index_for_process_ variables + integer :: nprocess_summed !< number of causes in dtend(:,:,dtidx(...)) to sum to make the physics tendency + integer :: index_of_process_pbl !< tracer changes caused by PBL scheme + integer :: index_of_process_dcnv !< tracer changes caused by deep convection scheme + integer :: index_of_process_scnv !< tracer changes caused by shallow convection scheme + integer :: index_of_process_mp !< tracer changes caused by microphysics scheme + integer :: index_of_process_prod_loss !< tracer changes caused by ozone production and loss + integer :: index_of_process_ozmix !< tracer changes caused by ozone mixing ratio + integer :: index_of_process_temp !< tracer changes caused by temperature + integer :: index_of_process_longwave !< tracer changes caused by long wave radiation + integer :: index_of_process_shortwave !< tracer changes caused by short wave radiation + integer :: index_of_process_orographic_gwd !< tracer changes caused by orographic gravity wave drag + integer :: index_of_process_rayleigh_damping !< tracer changes caused by Rayleigh damping + integer :: index_of_process_nonorographic_gwd !< tracer changes caused by convective gravity wave drag + integer :: index_of_process_overhead_ozone !< tracer changes caused by overhead ozone column + integer :: index_of_process_conv_trans !< tracer changes caused by convective transport + integer :: index_of_process_physics !< tracer changes caused by physics schemes + integer :: index_of_process_non_physics !< tracer changes caused by everything except physics schemes + integer :: index_of_process_photochem !< all changes to ozone + logical, pointer :: is_photochem(:) => null()!< flags for which processes should be summed as photochemical + integer :: ntqv !< tracer index for water vapor (specific humidity) integer :: ntoz !< tracer index for ozone mixing ratio integer :: ntcw !< tracer index for cloud condensate (or liquid water) @@ -1181,9 +1234,10 @@ module GFS_typedefs integer :: npsdelt !< the index of surface air pressure at the previous timestep for Z-C MP in phy_f2d integer :: ncnvwind !< the index of surface wind enhancement due to convection for MYNN SFC and RAS CNV in phy f2d -!--- debug flag +!--- debug flags logical :: debug logical :: pre_rad !< flag for testing purpose + logical :: print_diff_pgr !< print average change in pgr every timestep (does not need debug flag) !--- variables modified at each time step integer :: ipt !< index for diagnostic printout point @@ -1446,6 +1500,7 @@ module GFS_typedefs procedure :: create => radtend_create !< allocate array data end type GFS_radtend_type + !---------------------------------------------------------------- ! GFS_diag_type ! internal diagnostic type used as arguments to gbphys and grrad @@ -1580,10 +1635,12 @@ module GFS_typedefs real (kind=kind_phys), pointer :: shum_wts(:,:) => null() !< real (kind=kind_phys), pointer :: sfc_wts(:,:) => null() !< real (kind=kind_phys), pointer :: zmtnblck(:) => null() ! null() !< u momentum change due to physics - real (kind=kind_phys), pointer :: dv3dt (:,:,:) => null() !< v momentum change due to physics - real (kind=kind_phys), pointer :: dt3dt (:,:,:) => null() !< temperature change due to physics - real (kind=kind_phys), pointer :: dq3dt (:,:,:) => null() !< moisture change due to physics + + ! dtend/dtidxt: Multitudinous 3d tendencies in a 4D array: (i,k,1:100+ntrac,nprocess) + ! Sparse in outermost two dimensions. dtidx(1:100+ntrac,nprocess) maps to dtend + ! outer dimension index. + real (kind=kind_phys), pointer :: dtend (:,:,:) => null() !< tracer changes due to physics + real (kind=kind_phys), pointer :: refdmax (:) => null() !< max hourly 1-km agl reflectivity real (kind=kind_phys), pointer :: refdmax263k(:) => null() !< max hourly -10C reflectivity real (kind=kind_phys), pointer :: t02max (:) => null() !< max hourly 2m T @@ -1705,6 +1762,9 @@ module GFS_typedefs real (kind=kind_phys), pointer :: tau_tofd(:) => null() ! !---vay-2018 UGWP-diagnostics + ! Diagnostic arrays for per-timestep diagnostics + real (kind=kind_phys), pointer :: old_pgr(:) => null() !< pgr at last timestep + ! Extended output diagnostics for Thompson MP real (kind=kind_phys), pointer :: thompson_ext_diag3d (:,:,:) => null() ! extended diagnostic 3d output arrays from Thompson MP @@ -2146,6 +2206,8 @@ module GFS_typedefs real (kind=kind_phys), pointer :: f_rimef (:,:) => null() !< real (kind=kind_phys), pointer :: cwm (:,:) => null() !< + !-- 3D diagnostics + integer :: rtg_ozone_index, rtg_tke_index contains procedure :: create => interstitial_create !< allocate array data @@ -3024,6 +3086,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: ldiag3d = .false. !< flag for 3d diagnostic fields logical :: qdiag3d = .false. !< flag for 3d tracer diagnostic fields logical :: lssav = .false. !< logical flag for storing diagnostics + integer, parameter :: pat_len = 60, pat_count=100 !< dimensions of dtend_select + character(len=pat_len) :: dtend_select(pat_count) !< fglob_list() patterns to decide which 3d diagnostic fields to enable integer :: naux2d = 0 !< number of auxiliary 2d arrays to output (for debugging) integer :: naux3d = 0 !< number of auxiliary 3d arrays to output (for debugging) logical :: aux2d_time_avg(1:naux2dmax) = .false. !< flags for time averaging of auxiliary 2d arrays @@ -3462,9 +3526,10 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & logical :: iau_filter_increments = .false. !< filter IAU increments logical :: iau_drymassfixer = .false. !< IAU dry mass fixer -!--- debug flag +!--- debug flags logical :: debug = .false. logical :: pre_rad = .false. !< flag for testing purpose + logical :: print_diff_pgr = .false. !< print average change in pgr every timestep ! max and min lon and lat for critical relative humidity integer :: max_lon=5000, max_lat=2000, min_lon=192, min_lat=94 @@ -3491,8 +3556,8 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & NAMELIST /gfs_physics_nml/ & !--- general parameters - fhzero, ldiag3d, qdiag3d, lssav, naux2d, naux3d, & - aux2d_time_avg, aux3d_time_avg, fhcyc, & + fhzero, ldiag3d, qdiag3d, lssav, naux2d, dtend_select, & + naux3d, aux2d_time_avg, aux3d_time_avg, fhcyc, & thermodyn_id, sfcpress_id, & !--- coupling parameters cplflx, cplwav, cplwav2atm, cplchm, lsidea, & @@ -3592,7 +3657,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & iau_delthrs,iaufhrs,iau_inc_files,iau_filter_increments, & iau_drymassfixer, & !--- debug options - debug, pre_rad, & + debug, pre_rad, print_diff_pgr, & !--- parameter range for critical relative humidity max_lon, max_lat, min_lon, min_lat, rhcmax, & phys_version, & @@ -3610,6 +3675,16 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- convective clouds integer :: ncnvcld3d = 0 !< number of convective 3d clouds fields + integer :: itrac, ipat, ichem + logical :: have_pbl, have_dcnv, have_scnv, have_mp, have_oz_phys, have_samf, have_pbl_edmf, have_cnvtrans, have_rdamp + character(len=20) :: namestr + character(len=44) :: descstr + + ! dtend selection: default is to match all variables: + dtend_select(1)='*' + do ipat=2,pat_count + dtend_select(ipat)=' ' + enddo !--- read in the namelist #ifdef INTERNAL_FILE_NML @@ -3650,7 +3725,7 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%fhzero = fhzero Model%ldiag3d = ldiag3d Model%qdiag3d = qdiag3d - if (Model%qdiag3d .and. .not. Model%ldiag3d) then + if (qdiag3d .and. .not. ldiag3d) then write(0,*) 'Logic error in GFS_typedefs.F90: qdiag3d requires ldiag3d' stop endif @@ -3691,9 +3766,6 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & if(me==master) & write(0,*) 'FLAG: imfshalcnv_gf so scnv not generic' Model%flag_for_scnv_generic_tend=.false. - ! else if(imfshalcnv == Model%imfshalcnv_samf) then - ! write(0,*) 'FLAG: imfshalcnv_samf so scnv not generic' - ! Model%flag_for_scnv_generic_tend=.false. elseif(me==master) then write(0,*) 'NO FLAG: scnv is generic' endif @@ -3702,9 +3774,6 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & if(me==master) & write(0,*) 'FLAG: imfdeepcnv_gf so dcnv not generic' Model%flag_for_dcnv_generic_tend=.false. - ! else if(imfdeepcnv == Model%imfdeepcnv_samf) then - ! write(0,*) 'FLAG: imfdeepcnv_samf so dcnv not generic' - ! Model%flag_for_dcnv_generic_tend=.false. elseif(me==master) then write(0,*) 'NO FLAG: dcnv is generic' endif @@ -4334,13 +4403,15 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & Model%iau_drymassfixer = iau_drymassfixer if(Model%me==0) print *,' model init,iaufhrs=',Model%iaufhrs -!--- debug flag +!--- debug flags Model%debug = debug Model%pre_rad = pre_rad + Model%print_diff_pgr = print_diff_pgr !--- tracer handling Model%ntrac = size(tracer_names) Model%ntracp1 = Model%ntrac + 1 + Model%ntracp100 = Model%ntrac + 100 allocate (Model%tracer_names(Model%ntrac)) Model%tracer_names(:) = tracer_names(:) Model%ntqv = 1 @@ -4373,6 +4444,249 @@ subroutine control_initialize (Model, nlunit, fn_nml, me, master, & !--- setup aerosol scavenging factors call Model%init_scavenging(fscav_aero) + ! Tracer diagnostics indices and dimension size, which must be in + ! Model to be forwarded to the right places. + + ! Individual processes: + Model%index_of_process_pbl = 1 + Model%index_of_process_dcnv = 2 + Model%index_of_process_scnv = 3 + Model%index_of_process_mp = 4 + Model%index_of_process_prod_loss = 5 + Model%index_of_process_ozmix = 6 + Model%index_of_process_temp = 7 + Model%index_of_process_overhead_ozone = 8 + Model%index_of_process_longwave = 9 + Model%index_of_process_shortwave = 10 + Model%index_of_process_orographic_gwd = 11 + Model%index_of_process_rayleigh_damping = 12 + Model%index_of_process_nonorographic_gwd = 13 + Model%index_of_process_conv_trans = 14 + + ! Number of processes to sum (last index of prior set) + Model%nprocess_summed = 14 + + ! Sums of other processes, which must be after nprocess_summed: + Model%index_of_process_physics = 15 + Model%index_of_process_non_physics = 16 + Model%index_of_process_photochem = 17 + + ! Total number of processes (last index of prior set) + Model%nprocess = 17 + + ! List which processes should be summed as photochemical: + allocate(Model%is_photochem(Model%nprocess)) + Model%is_photochem = .false. + Model%is_photochem(Model%index_of_process_prod_loss) = .true. + Model%is_photochem(Model%index_of_process_ozmix) = .true. + Model%is_photochem(Model%index_of_process_temp) = .true. + Model%is_photochem(Model%index_of_process_overhead_ozone) = .true. + + ! Non-tracers that appear in first dimension of dtidx: + Model%index_of_temperature = 10 + Model%index_of_x_wind = 11 + Model%index_of_y_wind = 12 + + ! Last index of outermost dimension of dtend + Model%ndtend = 0 + allocate(Model%dtidx(Model%ntracp100,Model%nprocess)) + Model%dtidx = -99 + + if(ldiag3d) then + ! Flags used to turn on or off tracer "causes" + have_pbl_edmf = Model%hybedmf .or. Model%satmedmf .or. Model%do_mynnedmf + have_samf = Model%satmedmf .or. Model%trans_trac .or. Model%ras .or. Model%do_shoc + have_pbl = .true. + have_dcnv = Model%imfdeepcnv>0 !Model%ras .or. Model%cscnv .or. Model%do_deep .or. Model%hwrf_samfdeep + have_scnv = Model%imfshalcnv>0 !Model%shal_cnv + have_mp = Model%imp_physics>0 + have_oz_phys = Model%oz_phys .or. Model%oz_phys_2015 + + ! Rayleigh damping flag must match logic in rayleigh_damp.f + have_rdamp = .not. (Model%lsidea .or. Model%ral_ts <= 0.0 .or. Model%prslrd0 == 0.0) + + ! have_cnvtrans flag must match logic elsewhere in GFS_typedefs and suite interstitials. + have_cnvtrans = (have_dcnv .or. have_scnv) .and. & + (cscnv .or. satmedmf .or. trans_trac .or. ras) & + .and. Model%flag_for_scnv_generic_tend & + .and. Model%flag_for_dcnv_generic_tend + + ! Increment idtend and fill dtidx: + allocate(Model%dtend_var_labels(Model%ntracp100)) + allocate(Model%dtend_process_labels(Model%nprocess)) + + call allocate_dtend_labels_and_causes(Model) + + ! Default names of tracers just in case later code does not initialize them: + do itrac=1,Model%ntrac + write(namestr,'("tracer",I0)') itrac + write(descstr,'("tracer ",I0," of ",I0)') itrac, Model%ntrac + call label_dtend_tracer(Model,100+itrac,trim(namestr),trim(descstr),'kg kg-1 s-1') + enddo + + if(Model%ntchs>0) then + if(Model%ntchm>0) then + ! Chemical tracers are first so more specific tracer names + ! replace them. There is no straightforward way of getting + ! chemical tracer short names or descriptions, so we use + ! indices instead. + do ichem=Model%ntchs,Model%ntchs+Model%ntchm-1 + write(namestr,'("chem",I0)') ichem + write(descstr,'("chemical tracer ",I0," of ",I0)') ichem, Model%ntchm + call label_dtend_tracer(Model,100+ichem,trim(namestr),trim(descstr),'kg kg-1 s-1') + enddo + endif + + ! More specific chemical tracer names: + call label_dtend_tracer(Model,100+Model%ntchs,'so2','sulfur dioxide concentration','kg kg-1 s-1') + if(Model%ntchm>0) then + ! Need better descriptions of these. + call label_dtend_tracer(Model,100+Model%ntchm+Model%ntchs-1,'pp10','pp10 concentration','kg kg-1 s-1') + + itrac=get_tracer_index(Model%tracer_names, 'DMS', Model%me, Model%master, Model%debug) + if(itrac>0) then + call label_dtend_tracer(Model,100+itrac,'DMS','DMS concentration','kg kg-1 s-1') + endif + itrac=get_tracer_index(Model%tracer_names, 'msa', Model%me, Model%master, Model%debug) + if(itrac>0) then + call label_dtend_tracer(Model,100+itrac,'msa','msa concentration','kg kg-1 s-1') + endif + endif + endif + + call label_dtend_tracer(Model,Model%index_of_temperature,'temp','temperature','K s-1') + call label_dtend_tracer(Model,Model%index_of_x_wind,'u','x wind','m s-2') + call label_dtend_tracer(Model,Model%index_of_y_wind,'v','y wind','m s-2') + + ! Other tracer names. These were taken from GFS_typedefs.F90 with descriptions from GFS_typedefs.meta + call label_dtend_tracer(Model,100+Model%ntqv,'qv','water vapor specific humidity','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntoz,'o3','ozone concentration','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntcw,'liq_wat','cloud condensate (or liquid water)','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntiw,'ice_wat','ice water','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntrw,'rainwat','rain water','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntsw,'snowwat','snow water','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntgl,'graupel','graupel','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntclamt,'cld_amt','cloud amount integer','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntlnc,'water_nc','liquid number concentration','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntinc,'ice_nc','ice number concentration','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntrnc,'rain_nc','rain number concentration','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntsnc,'snow_nc','snow number concentration','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntgnc,'graupel_nc','graupel number concentration','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntke,'sgs_tke','turbulent kinetic energy','J s-1') + call label_dtend_tracer(Model,100+Model%nqrimef,'q_rimef','mass weighted rime factor','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntwa,'liq_aero','number concentration of water-friendly aerosols','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%ntia,'ice_aero','number concentration of ice-friendly aerosols','kg-1 s-1') + call label_dtend_tracer(Model,100+Model%nto,'o_ion','oxygen ion concentration','kg kg-1 s-1') + call label_dtend_tracer(Model,100+Model%nto2,'o2','oxygen concentration','kg kg-1 s-1') + + call label_dtend_cause(Model,Model%index_of_process_pbl,'pbl','tendency due to PBL') + call label_dtend_cause(Model,Model%index_of_process_dcnv,'deepcnv','tendency due to deep convection') + call label_dtend_cause(Model,Model%index_of_process_scnv,'shalcnv','tendency due to shallow convection') + call label_dtend_cause(Model,Model%index_of_process_mp,'mp','tendency due to microphysics') + call label_dtend_cause(Model,Model%index_of_process_prod_loss,'prodloss','tendency due to production and loss rate') + call label_dtend_cause(Model,Model%index_of_process_ozmix,'o3mix','tendency due to ozone mixing ratio') + call label_dtend_cause(Model,Model%index_of_process_temp,'temp','tendency due to temperature') + call label_dtend_cause(Model,Model%index_of_process_overhead_ozone,'o3column','tendency due to overhead ozone column') + call label_dtend_cause(Model,Model%index_of_process_photochem,'photochem','tendency due to photochemical processes') + call label_dtend_cause(Model,Model%index_of_process_physics,'phys','tendency due to physics') + call label_dtend_cause(Model,Model%index_of_process_non_physics,'nophys','tendency due to non-physics processes', & + mod_name='gfs_dyn') + call label_dtend_cause(Model,Model%index_of_process_conv_trans,'cnvtrans','tendency due to convective transport') + call label_dtend_cause(Model,Model%index_of_process_longwave,'lw','tendency due to long wave radiation') + call label_dtend_cause(Model,Model%index_of_process_shortwave,'sw','tendency due to short wave radiation') + call label_dtend_cause(Model,Model%index_of_process_orographic_gwd,'orogwd','tendency due to orographic gravity wave drag') + call label_dtend_cause(Model,Model%index_of_process_rayleigh_damping,'rdamp','tendency due to Rayleigh damping') + call label_dtend_cause(Model,Model%index_of_process_nonorographic_gwd,'cnvgwd','tendency due to convective gravity wave drag') + + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_longwave) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_shortwave) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_pbl,have_pbl) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_dcnv,have_dcnv) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_scnv,have_scnv) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_mp,have_mp) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_orographic_gwd) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_rayleigh_damping,have_rdamp) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_nonorographic_gwd) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_physics) + call fill_dtidx(Model,dtend_select,Model%index_of_temperature,Model%index_of_process_non_physics) + + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_pbl,have_pbl) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_pbl,have_pbl) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_orographic_gwd) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_orographic_gwd) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_dcnv,have_dcnv) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_dcnv,have_dcnv) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_nonorographic_gwd) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_nonorographic_gwd) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_rayleigh_damping,have_rdamp) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_rayleigh_damping,have_rdamp) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_scnv,have_scnv) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_scnv,have_scnv) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_physics) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_physics) + call fill_dtidx(Model,dtend_select,Model%index_of_x_wind,Model%index_of_process_non_physics) + call fill_dtidx(Model,dtend_select,Model%index_of_y_wind,Model%index_of_process_non_physics) + + if(qdiag3d) then + call fill_dtidx(Model,dtend_select,100+Model%ntqv,Model%index_of_process_scnv,have_scnv) + call fill_dtidx(Model,dtend_select,100+Model%ntqv,Model%index_of_process_dcnv,have_dcnv) + + if(have_cnvtrans) then + do itrac=2,Model%ntrac + if(itrac==Model%ntchs) exit ! remaining tracers are chemical + if ( itrac /= Model%ntcw .and. itrac /= Model%ntiw .and. itrac /= Model%ntclamt .and. & + itrac /= Model%ntrw .and. itrac /= Model%ntsw .and. itrac /= Model%ntrnc .and. & + itrac /= Model%ntsnc .and. itrac /= Model%ntgl .and. itrac /= Model%ntgnc) then + call fill_dtidx(Model,dtend_select,100+itrac,Model%index_of_process_scnv,have_scnv) + call fill_dtidx(Model,dtend_select,100+itrac,Model%index_of_process_dcnv,have_dcnv) + else if(Model%ntchs<=0 .or. itrac0 .and. itrac>0) then + if(Model%dtidx(itrac,icause)>0) then + return ! This tendency is already allocated. + endif + + name = 'dtend_'//trim(Model%dtend_var_labels(itrac)%name)//'_'//trim(Model%dtend_process_labels(icause)%name) + + if(fglob_list(dtend_select,trim(name))) then + Model%ndtend = Model%ndtend+1 + Model%dtidx(itrac,icause) = Model%ndtend + if(Model%me==Model%master) then + print 308,'selected',trim(Model%dtend_process_labels(icause)%mod_name), trim(name), & + trim(Model%dtend_var_labels(itrac)%desc), trim(Model%dtend_process_labels(icause)%desc), & + trim(Model%dtend_var_labels(itrac)%unit) + endif + elseif(Model%me==Model%master) then + print 308,'disabled',trim(Model%dtend_process_labels(icause)%mod_name), trim(name), & + trim(Model%dtend_var_labels(itrac)%desc), trim(Model%dtend_process_labels(icause)%desc), & + trim(Model%dtend_var_labels(itrac)%unit) + endif + endif +308 format('dtend ',A,': ',A,' ',A,' = ',A,' ',A,' (',A,')') + end subroutine fill_dtidx + + recursive function fglob(pattern,string) result(match) + ! Matches UNIX-style globs. A '*' matches 0 or more characters, + ! and a '?' matches one character. Other characters must match + ! exactly. The entire string must match, so if you want to match + ! a substring in the middle, put '*' at the ends. + ! + ! Spaces ARE significant, so make sure you trim() the inputs. + ! + ! Examples: + ! + ! fglob('dtend*_mp','dtend_temp_mp') => .true. + ! fglob('dtend*_mp','dtend_cow_mp_dog') => .false. ! entire string must match + ! fglob('c?w','cow') => .true. + ! fglob('c?w','coow') => .false. ! "?" matches one char, not two + ! fglob('c?w ','cow ') => .false. ! You forgot to trim() the inputs. + implicit none + logical :: match + character(len=*), intent(in) :: pattern,string + integer :: npat, nstr, ipat, istr, min_match, num_match + logical :: match_infinity + + npat=len(pattern) + nstr=len(string) + ipat=1 ! Next pattern character to process + istr=1 ! First string character not yet matched + outer: do while(ipat<=npat) + if_glob: if(pattern(ipat:ipat)=='*' .or. pattern(ipat:ipat)=='?') then + ! Collect sequences of * and ? to avoid pathological cases. + min_match=0 ! Number of "?" which is minimum number of chars to match + match_infinity=.false. ! Do we see a "*"? + glob_collect: do while(ipat<=npat) + if(pattern(ipat:ipat)=='*') then + match_infinity=.true. + else if(pattern(ipat:ipat)=='?') then + min_match=min_match+1 + else + exit + endif + ipat=ipat+1 + end do glob_collect + + num_match=0 + glob_match: do while(istr<=len(string)) + if(num_match>=min_match) then + if(match_infinity) then + if(fglob(pattern(ipat:npat),string(istr:nstr))) then + ! Remaining pattern matches remaining string. + match=.true. + return + else + ! Remaining pattern does NOT match, so we have + ! to consume another char. + endif + else + ! This is a sequence of "?" and we matched them all. + cycle outer + endif + else + ! Haven't consumed enough chars for all the "?" yet. + endif + istr=istr+1 + num_match=num_match+1 + enddo glob_match + ! We get here if we hit the end of the string. + if(num_matchnstr) then + ! Not enough string left to match the pattern + match=.false. + return + elseif(string(istr:istr)/=pattern(ipat:ipat)) then + ! Exact character mismatch + match=.false. + return + endif if_glob + ! Exact character match + istr=istr+1 + ipat=ipat+1 + end do outer + ! We get here if we ran out of pattern. We must also hit the end of the string. + match = istr>nstr + end function fglob + + logical function fglob_list(patterns,string) + ! Wrapper around fglob that returns .true. if ANY pattern + ! matches. Unlike fglob(), patterns and strings ARE automatically + ! trim()ed. Patterns are processed in order until one matches, one + ! is empty, or one is '*'. + implicit none + character(len=*), intent(in) :: patterns(:) + character(len=*), intent(in) :: string + integer :: i,n,s + fglob_list=.false. + s=len_trim(string) + do i=1,len(patterns) + n=len_trim(patterns(i)) + if(n<1) then + return ! end of pattern list + elseif(n==1 .and. patterns(i)(1:1)=='*') then + fglob_list=.true. ! A single "*" matches anything + return + else if(fglob(patterns(i)(1:n),string(1:s))) then + fglob_list=.true. + return + else + endif + enddo + end function fglob_list + + subroutine allocate_dtend_labels_and_causes(Model) + implicit none + type(GFS_control_type), intent(inout) :: Model + integer :: i + + allocate(Model%dtend_var_labels(Model%ntracp100)) + allocate(Model%dtend_process_labels(Model%nprocess)) + + Model%dtend_var_labels(1)%name = 'unallocated' + Model%dtend_var_labels(1)%desc = 'unallocated tracer' + Model%dtend_var_labels(1)%unit = 'kg kg-1 s-1' + + do i=2,Model%ntracp100 + Model%dtend_var_labels(i)%name = 'unknown' + Model%dtend_var_labels(i)%desc = 'unspecified tracer' + Model%dtend_var_labels(i)%unit = 'kg kg-1 s-1' + enddo + do i=1,Model%nprocess + Model%dtend_process_labels(i)%name = 'unknown' + Model%dtend_process_labels(i)%desc = 'unspecified tendency' + Model%dtend_process_labels(i)%time_avg = .true. + Model%dtend_process_labels(i)%mod_name = 'gfs_phys' + enddo + end subroutine allocate_dtend_labels_and_causes + + subroutine label_dtend_tracer(Model,itrac,name,desc,unit) + implicit none + type(GFS_control_type), intent(inout) :: Model + integer, intent(in) :: itrac + character(len=*), intent(in) :: name, desc + character(len=*), intent(in) :: unit + + if(itrac<2) then + ! Special index 1 is for unallocated tracers + return + endif + + Model%dtend_var_labels(itrac)%name = name + Model%dtend_var_labels(itrac)%desc = desc + Model%dtend_var_labels(itrac)%unit = unit + end subroutine label_dtend_tracer + + subroutine label_dtend_cause(Model,icause,name,desc,mod_name,time_avg) + implicit none + type(GFS_control_type), intent(inout) :: Model + integer, intent(in) :: icause + character(len=*), intent(in) :: name, desc + character(len=*), optional, intent(in) :: mod_name + logical, optional, intent(in) :: time_avg + + Model%dtend_process_labels(icause)%name=name + Model%dtend_process_labels(icause)%desc=desc + if(present(mod_name)) then + Model%dtend_process_labels(icause)%mod_name = mod_name + else + Model%dtend_process_labels(icause)%mod_name = "gfs_phys" + endif + if(present(time_avg)) then + Model%dtend_process_labels(icause)%time_avg = time_avg + else + Model%dtend_process_labels(icause)%time_avg = .true. + endif + end subroutine label_dtend_cause !---------------- ! GFS_diag%create !---------------- subroutine diag_create (Diag, IM, Model) + use parse_tracers, only: get_tracer_index class(GFS_diag_type) :: Diag integer, intent(in) :: IM type(GFS_control_type), intent(in) :: Model ! logical, save :: linit + logical :: have_pbl, have_dcnv, have_scnv, have_mp, have_oz_phys + + if(Model%print_diff_pgr) then + allocate(Diag%old_pgr(IM)) + Diag%old_pgr = clear_val + endif !--- Radiation allocate (Diag%fluxr (IM,Model%nfxr)) @@ -5938,22 +6480,13 @@ subroutine diag_create (Diag, IM, Model) !--- 3D diagnostics if (Model%ldiag3d) then - allocate (Diag%du3dt (IM,Model%levs,8)) - allocate (Diag%dv3dt (IM,Model%levs,8)) - allocate (Diag%dt3dt (IM,Model%levs,11)) + allocate(Diag%dtend(IM,Model%levs,Model%ndtend)) + Diag%dtend = clear_val if (Model%qdiag3d) then - allocate (Diag%dq3dt (IM,Model%levs,13)) allocate (Diag%upd_mf (IM,Model%levs)) allocate (Diag%dwn_mf (IM,Model%levs)) allocate (Diag%det_mf (IM,Model%levs)) - else - allocate (Diag%dq3dt (1,1,13)) endif - else - allocate (Diag%du3dt (1,1,8)) - allocate (Diag%dv3dt (1,1,8)) - allocate (Diag%dt3dt (1,1,11)) - allocate (Diag%dq3dt (1,1,13)) endif ! UGWP @@ -6247,11 +6780,8 @@ subroutine diag_phys_zero (Diag, Model, linit, iauwindow_center) ! if(Model%me == Model%master) print *,'in diag_phys_zero, totprcpb set to 0,kdt=',Model%kdt if (Model%ldiag3d) then - Diag%du3dt = zero - Diag%dv3dt = zero - Diag%dt3dt = zero + Diag%dtend = zero if (Model%qdiag3d) then - Diag%dq3dt = zero Diag%upd_mf = zero Diag%dwn_mf = zero Diag%det_mf = zero diff --git a/ccpp/data/GFS_typedefs.meta b/ccpp/data/GFS_typedefs.meta index e7adf66ce..42c6fc674 100644 --- a/ccpp/data/GFS_typedefs.meta +++ b/ccpp/data/GFS_typedefs.meta @@ -4512,6 +4512,162 @@ units = count dimensions = () type = integer +[ntracp100] + standard_name = number_of_tracers_plus_one_hundred + long_name = number of tracers plus one hundred + units = count + dimensions = () + type = integer +[nprocess] + standard_name = number_of_cumulative_change_processes + long_name = number of processes that cause changes in state variables + units = count + dimensions = () + type = integer +[nprocess_summed] + standard_name = number_of_physics_causes_of_tracer_changes + long_name = number of causes in dtidx per tracer summed for total physics tendency + units = count + dimensions = () + type = integer +[dtidx] + standard_name = cumulative_change_of_state_variables_outer_index + long_name = index of state-variable and process in last dimension of diagnostic tendencies array AKA cumulative_change_index + units = index + dimensions = (number_of_tracers_plus_one_hundred,number_of_cumulative_change_processes) + type = integer +[ndtend] + standard_name = cumulative_change_of_state_variables_outer_index_max + long_name = last dimension of array of diagnostic tendencies for state variables + units = count + dimensions = () + type = integer +[index_of_process_pbl] + standard_name = index_of_subgrid_scale_vertical_mixing_process_in_cumulative_change_index + long_name = index of subgrid scale vertical mixing process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_dcnv] + standard_name = index_of_deep_convection_process_process_in_cumulative_change_index + long_name = index of deep convection process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_scnv] + standard_name = index_of_shallow_convection_process_process_in_cumulative_change_index + long_name = index of shallow convection process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_mp] + standard_name = index_of_microphysics_process_process_in_cumulative_change_index + long_name = index of microphysics transport process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_prod_loss] + standard_name = index_of_production_and_loss_process_in_cumulative_change_index + long_name = index of production and loss effect in photochemistry process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_ozmix] + standard_name = index_of_ozone_mixing_ratio_process_in_cumulative_change_index + long_name = index of ozone mixing ratio effect in photochemistry process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_temp] + standard_name = index_of_temperature_process_in_cumulative_change_index + long_name = index of temperature effect in photochemistry process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_overhead_ozone] + standard_name = index_of_overhead_process_in_cumulative_change_index + long_name = index of overhead ozone effect in photochemistry process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_longwave] + standard_name = index_of_longwave_heating_process_in_cumulative_change_index + long_name = index of longwave heating process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_shortwave] + standard_name = index_of_shortwave_heating_process_in_cumulative_change_index + long_name = index of shortwave heating process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_orographic_gwd] + standard_name = index_of_orographic_gravity_wave_drag_process_in_cumulative_change_index + long_name = index of orographic gravity wave drag process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_rayleigh_damping] + standard_name = index_of_rayleigh_damping_process_in_cumulative_change_index + long_name = index of rayleigh damping process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_nonorographic_gwd] + standard_name = index_of_nonorographic_gravity_wave_drag_process_in_cumulative_change_index + long_name = index of nonorographic gravity wave drag process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_conv_trans] + standard_name = index_of_convective_transport_process_in_cumulative_change_index + long_name = index of convective transport process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_physics] + standard_name = index_of_all_physics_process_in_cumulative_change_index + long_name = index of all physics transport process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_non_physics] + standard_name = index_of_non_physics_process_in_cumulative_change_index + long_name = index of non-physics transport process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_process_photochem] + standard_name = index_of_photochemistry_process_in_cumulative_change_index + long_name = index of photochemistry process in second dimension of array cumulative change index + units = index + dimensions = () + type = integer +[is_photochem] + standard_name = flags_for_photochemistry_processes_to_sum + long_name = flags for photochemistry processes to sum as the total photochemistry process cumulative change + units = flag + dimensions = (number_of_cumulative_change_processes) + type = logical +[index_of_temperature] + standard_name = index_of_temperature_in_cumulative_change_index + long_name = index of temperature in first dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_x_wind] + standard_name = index_of_x_wind_in_cumulative_change_index + long_name = index of x-wind in first dimension of array cumulative change index + units = index + dimensions = () + type = integer +[index_of_y_wind] + standard_name = index_of_y_wind_in_cumulative_change_index + long_name = index of x-wind in first dimension of array cumulative change index + units = index + dimensions = () + type = integer [ntqv] standard_name = index_for_water_vapor long_name = tracer index for water vapor (specific humidity) @@ -4819,6 +4975,12 @@ units = flag dimensions = () type = logical +[print_diff_pgr] + standard_name = flag_to_print_pgr_differences_every_timestep + long_name = flag to print pgr differences every timestep + units = flag + dimensions = () + type = logical [ipt] standard_name = index_for_diagnostic_printout long_name = horizontal index for point used for diagnostic printout @@ -6731,325 +6893,14 @@ dimensions = (horizontal_loop_extent) type = real kind = kind_phys -[du3dt(:,:,1)] - standard_name = cumulative_change_in_x_wind_due_to_PBL - long_name = cumulative change in x wind due to PBL - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,2)] - standard_name = cumulative_change_in_x_wind_due_to_orographic_gravity_wave_drag - long_name = cumulative change in x wind due to orographic gravity wave drag - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,3)] - standard_name = cumulative_change_in_x_wind_due_to_deep_convection - long_name = cumulative change in x wind due to deep convection - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,4)] - standard_name = cumulative_change_in_x_wind_due_to_convective_gravity_wave_drag - long_name = cumulative change in x wind due to convective gravity wave drag - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,5)] - standard_name = cumulative_change_in_x_wind_due_to_rayleigh_damping - long_name = cumulative change in x wind due to Rayleigh damping - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,6)] - standard_name = cumulative_change_in_x_wind_due_to_shallow_convection - long_name = cumulative change in x wind due to shallow convection - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,7)] - standard_name = cumulative_change_in_x_wind_due_to_physics - long_name = cumulative change in x wind due to physics - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[du3dt(:,:,8)] - standard_name = cumulative_change_in_x_wind_due_to_non_physics_processes - long_name = cumulative change in x wind due to non-physics processes - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,1)] - standard_name = cumulative_change_in_y_wind_due_to_PBL - long_name = cumulative change in y wind due to PBL - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,2)] - standard_name = cumulative_change_in_y_wind_due_to_orographic_gravity_wave_drag - long_name = cumulative change in y wind due to orographic gravity wave drag - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,3)] - standard_name = cumulative_change_in_y_wind_due_to_deep_convection - long_name = cumulative change in y wind due to deep convection - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,4)] - standard_name = cumulative_change_in_y_wind_due_to_convective_gravity_wave_drag - long_name = cumulative change in y wind due to convective gravity wave drag - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys -[dv3dt(:,:,5)] - standard_name = cumulative_change_in_y_wind_due_to_rayleigh_damping - long_name = cumulative change in y wind due to Rayleigh damping - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,6)] - standard_name = cumulative_change_in_y_wind_due_to_shallow_convection - long_name = cumulative change in y wind due to shallow convection - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,7)] - standard_name = cumulative_change_in_y_wind_due_to_physics - long_name = cumulative change in y wind due to physics - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dv3dt(:,:,8)] - standard_name = cumulative_change_in_y_wind_due_to_non_physics_processes - long_name = cumulative change in y wind due to non-physics processes - units = m s-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,1)] - standard_name = cumulative_change_in_temperature_due_to_longwave_radiation - long_name = cumulative change in temperature due to longwave radiation - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,2)] - standard_name = cumulative_change_in_temperature_due_to_shortwave_radiation - long_name = cumulative change in temperature due to shortwave radiation - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,3)] - standard_name = cumulative_change_in_temperature_due_to_PBL - long_name = cumulative change in temperature due to PBL - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,4)] - standard_name = cumulative_change_in_temperature_due_to_deep_convection - long_name = cumulative change in temperature due to deep convection - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,5)] - standard_name = cumulative_change_in_temperature_due_to_shallow_convection - long_name = cumulative change in temperature due to shallow convection - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,6)] - standard_name = cumulative_change_in_temperature_due_to_microphysics - long_name = cumulative change in temperature due to microphysics - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,7)] - standard_name = cumulative_change_in_temperature_due_to_orographic_gravity_wave_drag - long_name = cumulative change in temperature due to orographic gravity wave drag - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,8)] - standard_name = cumulative_change_in_temperature_due_to_rayleigh_damping - long_name = cumulative change in temperature due to Rayleigh damping - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,9)] - standard_name = cumulative_change_in_temperature_due_to_convective_gravity_wave_drag - long_name = cumulative change in temperature due to convective gravity wave drag - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,10)] - standard_name = cumulative_change_in_temperature_due_to_physics - long_name = cumulative change in temperature due to physics - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D) -[dt3dt(:,:,11)] - standard_name = cumulative_change_in_temperature_due_to_non_physics_processes - long_name = cumulative change in temperature due to non-physics processed - units = K - dimensions = (horizontal_loop_extent,vertical_dimension) +[dtend] + standard_name = cumulative_change_of_state_variables + long_name = diagnostic tendencies for state variables + units = various + dimensions = (horizontal_loop_extent,vertical_dimension,number_of_cumulative_change_processes) type = real kind = kind_phys active = (flag_diagnostics_3D) -[dq3dt(:,:,1)] - standard_name = cumulative_change_in_water_vapor_specific_humidity_due_to_PBL - long_name = cumulative change in water vapor specific humidity due to PBL - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,2)] - standard_name = cumulative_change_in_water_vapor_specific_humidity_due_to_deep_convection - long_name = cumulative change in water vapor specific humidity due to deep convection - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,3)] - standard_name = cumulative_change_in_water_vapor_specific_humidity_due_to_shallow_convection - long_name = cumulative change in water vapor specific humidity due to shallow convection - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,4)] - standard_name = cumulative_change_in_water_vapor_specific_humidity_due_to_microphysics - long_name = cumulative change in water vapor specific humidity due to microphysics - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,5)] - standard_name = cumulative_change_in_ozone_mixing_ratio_due_to_PBL - long_name = cumulative change in ozone mixing ratio due to PBL - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,6)] - standard_name = cumulative_change_in_ozone_concentration_due_to_production_and_loss_rate - long_name = cumulative change in ozone concentration due to production and loss rate - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,7)] - standard_name = cumulative_change_in_ozone_concentration_due_to_ozone_mixing_ratio - long_name = cumulative change in ozone concentration due to ozone mixing ratio - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,8)] - standard_name = cumulative_change_in_ozone_concentration_due_to_temperature - long_name = cumulative change in ozone concentration due to temperature - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,9)] - standard_name = cumulative_change_in_ozone_concentration_due_to_overhead_ozone_column - long_name = cumulative change in ozone concentration due to overhead ozone column - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,10)] - standard_name = cumulative_change_in_water_vapor_specific_humidity_due_to_physics - long_name = cumulative change in water vapor specific humidity due to physics - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,11)] - standard_name = cumulative_change_in_ozone_concentration_due_to_physics - long_name = cumulative change in ozone concentration due to physics - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,12)] - standard_name = cumulative_change_in_water_vapor_specific_humidity_due_to_non_physics_processes - long_name = cumulative change in water vapor specific humidity due to non-physics processes - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) -[dq3dt(:,:,13)] - standard_name = cumulative_change_in_ozone_concentration_due_to_non_physics_processes - long_name = cumulative change in ozone_concentration due to non-physics processes - units = kg kg-1 - dimensions = (horizontal_loop_extent,vertical_dimension) - type = real - kind = kind_phys - active = (flag_diagnostics_3D .and. flag_tracer_diagnostics_3D) [refdmax] standard_name = maximum_reflectivity_at_1km_agl_over_maximum_hourly_time_interval long_name = maximum reflectivity at 1km agl over maximum hourly time interval @@ -7541,6 +7392,13 @@ type = real kind = kind_phys active = (number_of_3d_auxiliary_arrays > 0) +[old_pgr] + standard_name = surface_air_pressure_from_previous_timestep + long_name = surface air pressure from previous timestep + units = Pa + dimensions = (horizontal_loop_extent) + type = real + kind = kind_phys ######################################################################## [ccpp-table-properties] @@ -9480,6 +9338,13 @@ dimensions = (horizontal_loop_extent,vertical_dimension) type = real kind = kind_phys +[save_q(:,:,index_for_turbulent_kinetic_energy)] + standard_name = turbulent_kinetic_energy_save + long_name = turbulent kinetic energy before entering a physics scheme + units = kg kg-1 + dimensions = (horizontal_loop_extent,vertical_dimension) + type = real + kind = kind_phys [save_q(:,:,index_for_liquid_cloud_condensate)] standard_name = cloud_condensed_water_mixing_ratio_save long_name = ratio of mass of cloud water to mass of dry air plus vapor (without condensates) before entering a physics scheme @@ -9501,6 +9366,20 @@ dimensions = (horizontal_loop_extent,vertical_dimension) type = real kind = kind_phys +[save_q(:,:,index_for_liquid_cloud_number_concentration)] + standard_name = liquid_cloud_number_concentration_save + long_name = liquid cloud number concentration before entering a physics scheme + units = kg kg-1 + dimensions = (horizontal_loop_extent,vertical_dimension) + type = real + kind = kind_phys +[save_q(:,:,index_for_ice_cloud_number_concentration)] + standard_name = ice_cloud_number_concentration_save + long_name = ice cloud number concentration before entering a physics scheme + units = kg kg-1 + dimensions = (horizontal_loop_extent,vertical_dimension) + type = real + kind = kind_phys [save_q] standard_name = tracer_concentration_save long_name = tracer concentration before entering a physics scheme @@ -10663,6 +10542,12 @@ type = character kind = len=128 active = (flag_for_rrtmgp_radiation_scheme) +[rtg_ozone_index] + standard_name = vertically_diffused_tracer_index_of_ozone + long_name = number of tracers + units = count + dimensions = () + type = integer ######################################################################## [ccpp-table-properties] diff --git a/ccpp/driver/GFS_diagnostics.F90 b/ccpp/driver/GFS_diagnostics.F90 index a7dd9a5c4..23c830a5c 100644 --- a/ccpp/driver/GFS_diagnostics.F90 +++ b/ccpp/driver/GFS_diagnostics.F90 @@ -46,11 +46,48 @@ module GFS_diagnostics !--- public interfaces --- public GFS_externaldiag_populate - + CONTAINS !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - + + ! Helper function for GFS_externaldiag_populate to handle the massive dtend(:,:,dtidx(:,:)) array + subroutine add_dtend(Model,ExtDiag,IntDiag,idx,nblks,itrac,iprocess,desc,unit) + implicit none + type(GFS_control_type), intent(in) :: Model + type(GFS_externaldiag_type), intent(inout) :: ExtDiag(:) + type(GFS_diag_type), intent(in) :: IntDiag(:) + integer, intent(in) :: nblks, itrac, iprocess + integer, intent(inout) :: idx + real(kind=kind_phys), pointer :: dtend(:,:,:) ! Assumption: dtend is null iff all(dtidx <= 1) + character(len=*), intent(in), optional :: desc, unit + + integer :: idtend, nb + + idtend = Model%dtidx(itrac,iprocess) + if(idtend>=1) then + idx = idx + 1 + ExtDiag(idx)%axes = 3 + ExtDiag(idx)%name = 'dtend_'//trim(Model%dtend_var_labels(itrac)%name)//'_'//trim(Model%dtend_process_labels(iprocess)%name) + ExtDiag(idx)%mod_name = Model%dtend_process_labels(iprocess)%mod_name + ExtDiag(idx)%time_avg = Model%dtend_process_labels(iprocess)%time_avg + if(present(desc)) then + ExtDiag(idx)%desc = desc + else + ExtDiag(idx)%desc = trim(Model%dtend_var_labels(itrac)%desc)//' '//trim(Model%dtend_process_labels(iprocess)%desc) + endif + if(present(unit)) then + ExtDiag(idx)%unit = trim(unit) + else + ExtDiag(idx)%unit = trim(Model%dtend_var_labels(itrac)%unit) + endif + allocate (ExtDiag(idx)%data(nblks)) + do nb = 1,nblks + ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dtend(:,:,idtend) + enddo + endif + end subroutine add_dtend + !------------------------------------------------------------------------- !--- GFS_externaldiag_populate --- !------------------------------------------------------------------------- @@ -81,7 +118,8 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ! ExtDiag%data(nb)%var3(:,:) [real*8 ] pointer to 3D data [=> null() for a 2D field] ! !---------------------------------------------------------------------------------------------! - implicit none + use parse_tracers, only: get_tracer_index + implicit none ! ! --- interface variables type(GFS_externaldiag_type), intent(inout) :: ExtDiag(:) @@ -98,12 +136,13 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop type(GFS_init_type), intent(in) :: Init_parm !--- local variables - integer :: idt, idx, num, nb, nblks, NFXR + integer :: idt, idx, num, nb, nblks, NFXR, idtend, ichem, itrac, iprocess character(len=2) :: xtra real(kind=kind_phys), parameter :: cn_one = 1._kind_phys real(kind=kind_phys), parameter :: cn_100 = 100._kind_phys real(kind=kind_phys), parameter :: cn_th = 1000._kind_phys real(kind=kind_phys), parameter :: cn_hr = 3600._kind_phys + character(len=30) :: namestr, descstr NFXR = Model%NFXR nblks = size(Statein) @@ -2369,526 +2408,55 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop ! if(mpp_pe()==mpp_root_pe())print *,'in gfdl_diag_register,af shum_wts,idx=',idx -!--- three-dimensional variables that need to be handled special when writing +!--- Three-dimensional diagnostic tendencies stored in a 4D sparse +!--- array need special handling: if_ldiag3d: if(Model%ldiag3d) then - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_lw' - ExtDiag(idx)%desc = 'temperature tendency due to long wave radiation' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,1) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_sw' - ExtDiag(idx)%desc = 'temperature tendency due to short wave radiation' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,2) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_pbl' - ExtDiag(idx)%desc = 'temperature tendency due to PBL' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,3) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_deepcnv' - ExtDiag(idx)%desc = 'temperature tendency due to deep convection' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,4) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_shalcnv' - ExtDiag(idx)%desc = 'temperature tendency due to shallow convection' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,5) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_mp' - ExtDiag(idx)%desc = 'temperature tendency due to microphysics' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,6) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_orogwd' - ExtDiag(idx)%desc = 'temperature tendency due to orographic gravity wave drag' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,7) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_rdamp' - ExtDiag(idx)%desc = 'temperature tendency due to Rayleigh damping' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,8) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_cnvgwd' - ExtDiag(idx)%desc = 'temperature tendency due to convective gravity wave drag' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,9) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_phys' - ExtDiag(idx)%desc = 'temperature tendency due to physics' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,10) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dt3dt_nophys' - ExtDiag(idx)%desc = 'temperature tendency due to non-physics processes' - ExtDiag(idx)%unit = 'K s-1' - ExtDiag(idx)%mod_name = 'gfs_dyn' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dt3dt(:,:,11) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_pbl' - ExtDiag(idx)%desc = 'u momentum tendency due to PBL' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,1) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_pbl' - ExtDiag(idx)%desc = 'v momentum tendency due to PBL' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,1) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_orogwd' - ExtDiag(idx)%desc = 'u momentum tendency due to orographic gravity wave drag' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,2) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_orogwd' - ExtDiag(idx)%desc = 'v momentum tendency due to orographic gravity wave drag' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,2) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_deepcnv' - ExtDiag(idx)%desc = 'u momentum tendency due to deep convection' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,3) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_deepcnv' - ExtDiag(idx)%desc = 'v momentum tendency due to deep convection' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,3) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_cnvgwd' - ExtDiag(idx)%desc = 'u momentum tendency due to convective gravity wave drag' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,4) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_cnvgwd' - ExtDiag(idx)%desc = 'v momentum tendency due to convective gravity wave drag' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,4) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_rdamp' - ExtDiag(idx)%desc = 'u momentum tendency due to Rayleigh damping' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,5) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_damp' - ExtDiag(idx)%desc = 'v momentum tendency due to Rayleigh damping' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,5) - enddo - - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_shalcnv' - ExtDiag(idx)%desc = 'u momentum tendency due to shallow convection' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,6) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_shalcnv' - ExtDiag(idx)%desc = 'v momentum tendency due to shallow convection' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,6) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_phys' - ExtDiag(idx)%desc = 'u momentum tendency due to physics' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,7) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_phys' - ExtDiag(idx)%desc = 'v momentum tendency due to physics' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,7) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'du3dt_nophys' - ExtDiag(idx)%desc = 'u momentum tendency due to non-physics processes' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_dyn' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%du3dt(:,:,8) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dv3dt_nophys' - ExtDiag(idx)%desc = 'v momentum tendency due to non-physics processes' - ExtDiag(idx)%unit = 'm s-2' - ExtDiag(idx)%mod_name = 'gfs_dyn' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dv3dt(:,:,8) + do iprocess=1,Model%nprocess + do itrac=1,Model%ntracp100 + if(Model%dtidx(itrac,iprocess)>=1) then + call add_dtend(Model,ExtDiag,IntDiag,idx,nblks,itrac,iprocess) + endif + enddo enddo - + if_qdiag3d: if(Model%qdiag3d) then - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_pbl' - ExtDiag(idx)%desc = 'water vapor specific humidity tendency due to PBL' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,1) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_deepcnv' - ExtDiag(idx)%desc = 'water vapor specific humidity tendency due to deep convection' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,2) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_shalcnv' - ExtDiag(idx)%desc = 'water vapor specific humidity tendency due to shallow convection' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,3) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_mp' - ExtDiag(idx)%desc = 'water vapor specific humidity tendency due to microphysics' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,4) - enddo idx = idx + 1 ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3pbl' - ExtDiag(idx)%desc = 'ozone mixing ratio tendency due to PBL' - ExtDiag(idx)%unit = 'kg kg-1 s-1' + ExtDiag(idx)%name = 'upd_mf' + ExtDiag(idx)%desc = 'updraft convective mass flux' + ExtDiag(idx)%unit = 'kg m-1 s-3' ExtDiag(idx)%mod_name = 'gfs_phys' ExtDiag(idx)%time_avg = .TRUE. allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,5) + ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%upd_mf(:,:) enddo idx = idx + 1 ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3prodloss' - ExtDiag(idx)%desc = 'ozone concentration tendency due to production and loss rate' - ExtDiag(idx)%unit = 'kg kg-1 s-1' + ExtDiag(idx)%name = 'dwn_mf' + ExtDiag(idx)%desc = 'downdraft convective mass flux' + ExtDiag(idx)%unit = 'kg m-1 s-3' ExtDiag(idx)%mod_name = 'gfs_phys' ExtDiag(idx)%time_avg = .TRUE. allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,6) + ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dwn_mf(:,:) enddo idx = idx + 1 ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3mix' - ExtDiag(idx)%desc = 'ozone concentration tendency due to ozone mixing ratio' - ExtDiag(idx)%unit = 'kg kg-1 s-1' + ExtDiag(idx)%name = 'det_mf' + ExtDiag(idx)%desc = 'detrainment convective mass flux' + ExtDiag(idx)%unit = 'kg m-1 s-3' ExtDiag(idx)%mod_name = 'gfs_phys' ExtDiag(idx)%time_avg = .TRUE. allocate (ExtDiag(idx)%data(nblks)) do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,7) + ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%det_mf(:,:) enddo - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3temp' - ExtDiag(idx)%desc = 'ozone concentration tendency due to temperature' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,8) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3column' - ExtDiag(idx)%desc = 'ozone concentration tendency due to overhead ozone column' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,9) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_phys' - ExtDiag(idx)%desc = 'water vapor specific humidity tendency due to physics' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,10) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3phys' - ExtDiag(idx)%desc = 'ozone concentration tendency due to physics' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,11) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_nophys' - ExtDiag(idx)%desc = 'water vapor specific humidity tendency due to non-physics processes' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_dyn' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,12) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dq3dt_o3nophys' - ExtDiag(idx)%desc = 'ozone concentration tendency due to non-physics processes' - ExtDiag(idx)%unit = 'kg kg-1 s-1' - ExtDiag(idx)%mod_name = 'gfs_dyn' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dq3dt(:,:,13) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'upd_mf' - ExtDiag(idx)%desc = 'updraft convective mass flux' - ExtDiag(idx)%unit = 'kg m-1 s-3' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%upd_mf(:,:) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'dwn_mf' - ExtDiag(idx)%desc = 'downdraft convective mass flux' - ExtDiag(idx)%unit = 'kg m-1 s-3' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%dwn_mf(:,:) - enddo - - idx = idx + 1 - ExtDiag(idx)%axes = 3 - ExtDiag(idx)%name = 'det_mf' - ExtDiag(idx)%desc = 'detrainment convective mass flux' - ExtDiag(idx)%unit = 'kg m-1 s-3' - ExtDiag(idx)%mod_name = 'gfs_phys' - ExtDiag(idx)%time_avg = .TRUE. - allocate (ExtDiag(idx)%data(nblks)) - do nb = 1,nblks - ExtDiag(idx)%data(nb)%var3 => IntDiag(nb)%det_mf(:,:) - enddo - end if if_qdiag3d end if if_ldiag3d @@ -2898,7 +2466,7 @@ subroutine GFS_externaldiag_populate (ExtDiag, Model, Statein, Stateout, Sfcprop !rab write (xtra,'(I1)') num !rab idx = idx + 1 !rab ExtDiag(idx)%axes = 3 -!rab ExtDiag(idx)%name = 'dq3dt_'//trim(xtra) +!rab ExtDiag(idx)%name = 'dtend_'//trim(xtra) !rab ExtDiag(idx)%desc = 'moisture change due to physics '//trim(xtra)//'' !rab ExtDiag(idx)%unit = 'XXX' !rab ExtDiag(idx)%mod_name = 'gfs_phys' diff --git a/ccpp/physics b/ccpp/physics index 1792e8706..09faa73b9 160000 --- a/ccpp/physics +++ b/ccpp/physics @@ -1 +1 @@ -Subproject commit 1792e8706ceddfd8a568c228061b6788c5749e46 +Subproject commit 09faa73b9659a682e904b35ee6c6e127a4c4c2cf diff --git a/ccpp/suites/suite_FV3_CPT_v0.xml b/ccpp/suites/suite_FV3_CPT_v0.xml index 27ee83bfd..10921d8e7 100644 --- a/ccpp/suites/suite_FV3_CPT_v0.xml +++ b/ccpp/suites/suite_FV3_CPT_v0.xml @@ -88,6 +88,7 @@ cs_conv_aw_adj GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017.xml b/ccpp/suites/suite_FV3_GFS_2017.xml index 6d4fd9dbd..579f4ce88 100644 --- a/ccpp/suites/suite_FV3_GFS_2017.xml +++ b/ccpp/suites/suite_FV3_GFS_2017.xml @@ -78,6 +78,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_coupled.xml b/ccpp/suites/suite_FV3_GFS_2017_coupled.xml index baaa424f4..32af44444 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_coupled.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_coupled.xml @@ -77,6 +77,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_couplednsst.xml b/ccpp/suites/suite_FV3_GFS_2017_couplednsst.xml index 4ef773980..1ae57a5fa 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_couplednsst.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_couplednsst.xml @@ -79,6 +79,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_csawmg.xml b/ccpp/suites/suite_FV3_GFS_2017_csawmg.xml index d7cbe3c5d..cb670f777 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_csawmg.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_csawmg.xml @@ -83,6 +83,7 @@ cs_conv_aw_adj GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_csawmgshoc.xml b/ccpp/suites/suite_FV3_GFS_2017_csawmgshoc.xml index 9999d076e..a4ea0b8f0 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_csawmgshoc.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_csawmgshoc.xml @@ -83,6 +83,7 @@ cs_conv_aw_adj GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_fv3wam.xml b/ccpp/suites/suite_FV3_GFS_2017_fv3wam.xml index a9e8a7a95..c60de0529 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_fv3wam.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_fv3wam.xml @@ -76,6 +76,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp.xml b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp.xml index d5e0f0d43..5381bc907 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml index 34f5b0462..8693fd58f 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_noahmp.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional.xml b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional.xml index 8d50b9a40..de3e17c33 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional.xml @@ -83,6 +83,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional_c768.xml b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional_c768.xml index 2e4e48b07..a14e1ffbb 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional_c768.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_gfdlmp_regional_c768.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_h2ophys.xml b/ccpp/suites/suite_FV3_GFS_2017_h2ophys.xml index fdb6133e1..ab38042b5 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_h2ophys.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_h2ophys.xml @@ -79,6 +79,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_myj.xml b/ccpp/suites/suite_FV3_GFS_2017_myj.xml index bc94c9db1..aab459059 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_myj.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_myj.xml @@ -83,6 +83,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_ntiedtke.xml b/ccpp/suites/suite_FV3_GFS_2017_ntiedtke.xml index df76bc6e3..556307c47 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_ntiedtke.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_ntiedtke.xml @@ -83,6 +83,7 @@ GFS_MP_generic_post cu_ntiedtke_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_ozphys_2015.xml b/ccpp/suites/suite_FV3_GFS_2017_ozphys_2015.xml index 01a17f4d8..3599c38bc 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_ozphys_2015.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_ozphys_2015.xml @@ -78,6 +78,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_sas.xml b/ccpp/suites/suite_FV3_GFS_2017_sas.xml index 7b05d6483..d3199a8f9 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_sas.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_sas.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_satmedmf.xml b/ccpp/suites/suite_FV3_GFS_2017_satmedmf.xml index 865ccb9e3..5e85b453a 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_satmedmf.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_satmedmf.xml @@ -78,6 +78,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_satmedmf_coupled.xml b/ccpp/suites/suite_FV3_GFS_2017_satmedmf_coupled.xml index 77a3fb47e..67daf00d8 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_satmedmf_coupled.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_satmedmf_coupled.xml @@ -77,6 +77,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_satmedmfq.xml b/ccpp/suites/suite_FV3_GFS_2017_satmedmfq.xml index 1224d7a12..71c9c86d0 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_satmedmfq.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_satmedmfq.xml @@ -78,6 +78,7 @@ zhaocarr_precpd GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_shinhong.xml b/ccpp/suites/suite_FV3_GFS_2017_shinhong.xml index 84783c62b..556ae4bf3 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_shinhong.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_shinhong.xml @@ -81,6 +81,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_stretched.xml b/ccpp/suites/suite_FV3_GFS_2017_stretched.xml index bc147d0f9..afce01ff5 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_stretched.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_stretched.xml @@ -81,6 +81,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_2017_ysu.xml b/ccpp/suites/suite_FV3_GFS_2017_ysu.xml index dd9c90cc2..a9c06287c 100644 --- a/ccpp/suites/suite_FV3_GFS_2017_ysu.xml +++ b/ccpp/suites/suite_FV3_GFS_2017_ysu.xml @@ -81,6 +81,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_cpld_rasmgshoc.xml b/ccpp/suites/suite_FV3_GFS_cpld_rasmgshoc.xml index 884494f63..49aef95fd 100644 --- a/ccpp/suites/suite_FV3_GFS_cpld_rasmgshoc.xml +++ b/ccpp/suites/suite_FV3_GFS_cpld_rasmgshoc.xml @@ -77,6 +77,7 @@ m_micro_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst.xml b/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst.xml index de68b06d4..48454781d 100644 --- a/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst.xml +++ b/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst.xml @@ -79,6 +79,7 @@ m_micro_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst_flake.xml b/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst_flake.xml index 123840f0b..e271f2adb 100644 --- a/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst_flake.xml +++ b/ccpp/suites/suite_FV3_GFS_cpld_rasmgshocnsst_flake.xml @@ -80,12 +80,12 @@ m_micro_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_cpldnst_rasmgshoc.xml b/ccpp/suites/suite_FV3_GFS_cpldnst_rasmgshoc.xml index 0b0f48ada..73db27626 100644 --- a/ccpp/suites/suite_FV3_GFS_cpldnst_rasmgshoc.xml +++ b/ccpp/suites/suite_FV3_GFS_cpldnst_rasmgshoc.xml @@ -79,6 +79,7 @@ m_micro_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_rasmgshoc.xml b/ccpp/suites/suite_FV3_GFS_rasmgshoc.xml index dd3fb3fbf..f81376bc1 100644 --- a/ccpp/suites/suite_FV3_GFS_rasmgshoc.xml +++ b/ccpp/suites/suite_FV3_GFS_rasmgshoc.xml @@ -81,6 +81,7 @@ m_micro_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15.xml b/ccpp/suites/suite_FV3_GFS_v15.xml index 6daf8592c..496bee7ef 100644 --- a/ccpp/suites/suite_FV3_GFS_v15.xml +++ b/ccpp/suites/suite_FV3_GFS_v15.xml @@ -83,6 +83,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_gf.xml b/ccpp/suites/suite_FV3_GFS_v15_gf.xml index 5e1e17116..e6daf3577 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_gf.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_gf.xml @@ -84,6 +84,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_gf_thompson.xml b/ccpp/suites/suite_FV3_GFS_v15_gf_thompson.xml index a83390627..e54d98c69 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_gf_thompson.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_gf_thompson.xml @@ -81,6 +81,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_mynn.xml b/ccpp/suites/suite_FV3_GFS_v15_mynn.xml index 969369020..2b16dd46a 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_mynn.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_mynn.xml @@ -83,6 +83,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_ras.xml b/ccpp/suites/suite_FV3_GFS_v15_ras.xml index 2449ef816..c97e8ca3f 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_ras.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_ras.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_rasmgshoc.xml b/ccpp/suites/suite_FV3_GFS_v15_rasmgshoc.xml index cbdf05502..13c386267 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_rasmgshoc.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_rasmgshoc.xml @@ -78,6 +78,7 @@ m_micro_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_thompson.xml b/ccpp/suites/suite_FV3_GFS_v15_thompson.xml index a8358d870..152b87cf1 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_thompson.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_thompson.xml @@ -80,6 +80,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn.xml b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn.xml index f5dcc39f1..d4a9e8b5c 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn.xml @@ -80,6 +80,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_RRTMGP.xml b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_RRTMGP.xml index 7848e25fa..f58576648 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_RRTMGP.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_RRTMGP.xml @@ -90,6 +90,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml index 109434b56..c528363d7 100644 --- a/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml +++ b/ccpp/suites/suite_FV3_GFS_v15_thompson_mynn_lam3km.xml @@ -72,6 +72,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15p2.xml b/ccpp/suites/suite_FV3_GFS_v15p2.xml index cfca30b26..aa9a38f00 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml b/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml index 3436148b2..916111c2b 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2_RRTMGP.xml @@ -93,12 +93,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_coupled.xml b/ccpp/suites/suite_FV3_GFS_v15p2_coupled.xml index 64b6b3800..5160f6fae 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2_coupled.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2_coupled.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_couplednsst.xml b/ccpp/suites/suite_FV3_GFS_v15p2_couplednsst.xml index 39ba0e44c..8bbf1141d 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2_couplednsst.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2_couplednsst.xml @@ -84,6 +84,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15p2_no_nsst.xml b/ccpp/suites/suite_FV3_GFS_v15p2_no_nsst.xml index 562e00aaf..8ba6e524a 100644 --- a/ccpp/suites/suite_FV3_GFS_v15p2_no_nsst.xml +++ b/ccpp/suites/suite_FV3_GFS_v15p2_no_nsst.xml @@ -81,6 +81,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15plus.xml b/ccpp/suites/suite_FV3_GFS_v15plus.xml index 61f3c1e50..ce691bbc7 100644 --- a/ccpp/suites/suite_FV3_GFS_v15plus.xml +++ b/ccpp/suites/suite_FV3_GFS_v15plus.xml @@ -83,6 +83,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v15plusras.xml b/ccpp/suites/suite_FV3_GFS_v15plusras.xml index 90fd67bfc..1bbbe4ae3 100644 --- a/ccpp/suites/suite_FV3_GFS_v15plusras.xml +++ b/ccpp/suites/suite_FV3_GFS_v15plusras.xml @@ -82,6 +82,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16.xml b/ccpp/suites/suite_FV3_GFS_v16.xml index a7c90a3ae..91c1d967a 100644 --- a/ccpp/suites/suite_FV3_GFS_v16.xml +++ b/ccpp/suites/suite_FV3_GFS_v16.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_RRTMGP.xml b/ccpp/suites/suite_FV3_GFS_v16_RRTMGP.xml index 60d77fb0e..4166a8e64 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_RRTMGP.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_RRTMGP.xml @@ -93,12 +93,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_coupled.xml b/ccpp/suites/suite_FV3_GFS_v16_coupled.xml index 1a0625b0d..cd80dca84 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_coupled.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_coupled.xml @@ -82,12 +82,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_coupled_noahmp.xml b/ccpp/suites/suite_FV3_GFS_v16_coupled_noahmp.xml index 2b8d3b595..c3fc2ed06 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_coupled_noahmp.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_coupled_noahmp.xml @@ -82,12 +82,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmp.xml b/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmp.xml index bdd124307..5060faa26 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmp.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmp.xml @@ -84,12 +84,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmpUGWPv1.xml b/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmpUGWPv1.xml index b224c3551..a745a5056 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmpUGWPv1.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_coupled_nsstNoahmpUGWPv1.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_couplednsst.xml b/ccpp/suites/suite_FV3_GFS_v16_couplednsst.xml index abda9cad6..0aaaf1163 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_couplednsst.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_couplednsst.xml @@ -84,12 +84,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml b/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml index 0137150bd..0b1fe8b3c 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_csawmg.xml @@ -83,6 +83,7 @@ cs_conv_aw_adj GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_flake.xml b/ccpp/suites/suite_FV3_GFS_v16_flake.xml index f2a111000..9e3fc7545 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_flake.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_flake.xml @@ -84,6 +84,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_no_nsst.xml b/ccpp/suites/suite_FV3_GFS_v16_no_nsst.xml index 7241a0ddd..4231029ee 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_no_nsst.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_no_nsst.xml @@ -81,6 +81,7 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_noahmp.xml b/ccpp/suites/suite_FV3_GFS_v16_noahmp.xml index 367b8f55b..43b1a7279 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_noahmp.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_noahmp.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_ras.xml b/ccpp/suites/suite_FV3_GFS_v16_ras.xml index ade207f1d..fd43954ca 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_ras.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_ras.xml @@ -82,12 +82,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_thompson.xml b/ccpp/suites/suite_FV3_GFS_v16_thompson.xml index 3ae7a91d3..4cb2e54a9 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_thompson.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_thompson.xml @@ -84,12 +84,12 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFS_v16_ugwpv1.xml b/ccpp/suites/suite_FV3_GFS_v16_ugwpv1.xml index 3f573bc21..2d8ece51c 100644 --- a/ccpp/suites/suite_FV3_GFS_v16_ugwpv1.xml +++ b/ccpp/suites/suite_FV3_GFS_v16_ugwpv1.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras.xml b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras.xml index 67f0cfa02..640228132 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras_flake.xml b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras_flake.xml index f65a4d124..7e8fd184c 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras_flake.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstras_flake.xml @@ -84,12 +84,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstrasnoshal.xml b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstrasnoshal.xml index 527032e54..98a7faca0 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstrasnoshal.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstrasnoshal.xml @@ -80,12 +80,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas.xml b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas.xml index 95a5edd72..b18b457ca 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_cpldnsstsas.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_ras.xml b/ccpp/suites/suite_FV3_GFSv17alpha_ras.xml index 3776e242d..8b48ccfd9 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_ras.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_ras.xml @@ -82,12 +82,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_ras_flake.xml b/ccpp/suites/suite_FV3_GFSv17alpha_ras_flake.xml index 8aa6adca5..d1bdac439 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_ras_flake.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_ras_flake.xml @@ -83,12 +83,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GFSv17alpha_sas.xml b/ccpp/suites/suite_FV3_GFSv17alpha_sas.xml index 7f46e1e2c..6238d52f0 100644 --- a/ccpp/suites/suite_FV3_GFSv17alpha_sas.xml +++ b/ccpp/suites/suite_FV3_GFSv17alpha_sas.xml @@ -82,12 +82,12 @@ gfdl_cloud_microphys GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_SAR.xml b/ccpp/suites/suite_FV3_GSD_SAR.xml index dc2eaeb3f..092ef907e 100644 --- a/ccpp/suites/suite_FV3_GSD_SAR.xml +++ b/ccpp/suites/suite_FV3_GSD_SAR.xml @@ -74,6 +74,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_noah.xml b/ccpp/suites/suite_FV3_GSD_noah.xml index 732875d11..c4e4e5b06 100644 --- a/ccpp/suites/suite_FV3_GSD_noah.xml +++ b/ccpp/suites/suite_FV3_GSD_noah.xml @@ -85,6 +85,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_noah_mynnsfc.xml b/ccpp/suites/suite_FV3_GSD_noah_mynnsfc.xml index 7c6909b0d..3d6ff40a6 100644 --- a/ccpp/suites/suite_FV3_GSD_noah_mynnsfc.xml +++ b/ccpp/suites/suite_FV3_GSD_noah_mynnsfc.xml @@ -81,6 +81,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_v0.xml b/ccpp/suites/suite_FV3_GSD_v0.xml index 16d203bc3..d1b76b3a8 100644 --- a/ccpp/suites/suite_FV3_GSD_v0.xml +++ b/ccpp/suites/suite_FV3_GSD_v0.xml @@ -84,12 +84,12 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_v0_RRTMGP.xml b/ccpp/suites/suite_FV3_GSD_v0_RRTMGP.xml index c183db711..8aa9e5a99 100644 --- a/ccpp/suites/suite_FV3_GSD_v0_RRTMGP.xml +++ b/ccpp/suites/suite_FV3_GSD_v0_RRTMGP.xml @@ -90,12 +90,12 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend GFS_stochastics - phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml b/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml index b2145cc14..7e49d3b3d 100644 --- a/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml +++ b/ccpp/suites/suite_FV3_GSD_v0_drag_suite.xml @@ -79,6 +79,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml b/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml index 211f02093..3a1a65e85 100644 --- a/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml +++ b/ccpp/suites/suite_FV3_GSD_v0_mynnsfc.xml @@ -80,6 +80,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml b/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml index cb3b554f0..7082e799e 100644 --- a/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml +++ b/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite.xml @@ -80,6 +80,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite_noah.xml b/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite_noah.xml index 21058ba66..63090be3c 100644 --- a/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite_noah.xml +++ b/ccpp/suites/suite_FV3_GSD_v0_unified_ugwp_suite_noah.xml @@ -81,6 +81,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_HRRR.xml b/ccpp/suites/suite_FV3_HRRR.xml index 95c1d963a..8e178dfef 100644 --- a/ccpp/suites/suite_FV3_HRRR.xml +++ b/ccpp/suites/suite_FV3_HRRR.xml @@ -73,6 +73,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_RAP.xml b/ccpp/suites/suite_FV3_RAP.xml index 7362a9ee4..024ba5c87 100644 --- a/ccpp/suites/suite_FV3_RAP.xml +++ b/ccpp/suites/suite_FV3_RAP.xml @@ -79,6 +79,7 @@ GFS_MP_generic_post cu_gf_driver_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_RRFS_v1alpha.xml b/ccpp/suites/suite_FV3_RRFS_v1alpha.xml index ad982a5b0..367c23dd2 100644 --- a/ccpp/suites/suite_FV3_RRFS_v1alpha.xml +++ b/ccpp/suites/suite_FV3_RRFS_v1alpha.xml @@ -73,6 +73,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_FV3_RRFS_v1beta.xml b/ccpp/suites/suite_FV3_RRFS_v1beta.xml index e1d4088cc..09b86ba32 100644 --- a/ccpp/suites/suite_FV3_RRFS_v1beta.xml +++ b/ccpp/suites/suite_FV3_RRFS_v1beta.xml @@ -73,6 +73,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_HAFS_v0_hwrf.xml b/ccpp/suites/suite_HAFS_v0_hwrf.xml index 2caf4b074..6d5b4565b 100644 --- a/ccpp/suites/suite_HAFS_v0_hwrf.xml +++ b/ccpp/suites/suite_HAFS_v0_hwrf.xml @@ -80,6 +80,7 @@ mp_fer_hires GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/ccpp/suites/suite_HAFS_v0_hwrf_thompson.xml b/ccpp/suites/suite_HAFS_v0_hwrf_thompson.xml index 2738906b8..28bfa5fca 100644 --- a/ccpp/suites/suite_HAFS_v0_hwrf_thompson.xml +++ b/ccpp/suites/suite_HAFS_v0_hwrf_thompson.xml @@ -84,6 +84,7 @@ mp_thompson_post GFS_MP_generic_post maximum_hourly_diagnostics + phys_tend diff --git a/io/FV3GFS_io.F90 b/io/FV3GFS_io.F90 index d30f157d1..5e73ee1c7 100644 --- a/io/FV3GFS_io.F90 +++ b/io/FV3GFS_io.F90 @@ -2431,38 +2431,6 @@ subroutine fv3gfs_diag_output(time, diag, atm_block, nx, ny, levs, ntcw, ntoz, & call store_data3D(Diag(idx)%id, var3, Time, idx, Diag(idx)%intpl_method, Diag(idx)%name) #ifdef JUNK else - !--- dt3dt variables - do num = 1,6 - write(xtra,'(i1)') num - if (trim(Diag(idx)%name) == 'dt3dt_'//trim(xtra)) then - var3(1:nx,1:ny,1:levs) = RESHAPE(Gfs_diag%dt3dt(1:ngptc,levs:1:-1,num:num), (/nx,ny,levs/)) - used=send_data(Diag(idx)%id, var3, Time, is_in=is_in, js_in=js_in, ks_in=1) - endif - enddo - !--- dq3dt variables - do num = 1,5+Mdl_parms%pl_coeff - write(xtra,'(i1)') num - if (trim(Diag(idx)%name) == 'dq3dt_'//trim(xtra)) then - var3(1:nx,1:ny,1:levs) = RESHAPE(Gfs_diag%dq3dt(1:ngptc,levs:1-1,num:num), (/nx,ny,levs/)) - used=send_data(Diag(idx)%id, var3, Time, is_in=is_in, js_in=js_in, ks_in=1) - endif - enddo - !--- du3dt and dv3dt variables - do num = 1,4 - write(xtra,'(i1)') num - if (trim(Diag(idx)%name) == 'du3dt_'//trim(xtra)) then - var3(1:nx,1:ny,1:levs) = RESHAPE(Gfs_diag%du3dt(1:ngptc,levs:1:-1,num:num), (/nx,ny,levs/)) - used=send_data(Diag(idx)%id, var3, Time, is_in=is_in, js_in=js_in, ks_in=1) - endif - if (trim(Diag(idx)%name) == 'dv3dt_'//trim(xtra)) then - var3(1:nx,1:ny,1:levs) = RESHAPE(Gfs_diag%dv3dt(1:ngptc,levs:1:-1,num:num), (/nx,ny,levs/)) - used=send_data(Diag(idx)%id, var3, Time, is_in=is_in, js_in=js_in, ks_in=1) - endif - enddo - if (trim(Diag(idx)%name) == 'dqdt_v') then - var3(1:nx,1:ny,1:levs) = RESHAPE(Gfs_diag%dqdt_v(1:ngptc,levs:1:-1), (/nx,ny,levs/)) - used=send_data(Diag(idx)%id, var3, Time, is_in=is_in, js_in=js_in, ks_in=1) - endif !--- temperature tendency if (trim(Diag(idx)%name) == 'dtemp_dt') then var3(1:nx,1:ny,1:levs) = RESHAPE(Statein%tgrs(1:ngptc,levs:1:-1), (/nx,ny,levs/))