!***********************************************************************
!* GNU Lesser General Public License
!*
!* This file is part of the FV3 dynamical core.
!*
!* The FV3 dynamical core is free software: you can redistribute it
!* and/or modify it under the terms of the
!* GNU Lesser General Public License as published by the
!* Free Software Foundation, either version 3 of the License, or
!* (at your option) any later version.
!*
!* The FV3 dynamical core is distributed in the hope that it will be
!* useful, but WITHOUT ANYWARRANTY; without even the implied warranty
!* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!* See the GNU General Public License for more details.
!*
!* You should have received a copy of the GNU Lesser General Public
!* License along with the FV3 dynamical core.
!* If not, see .
!***********************************************************************
!>@ The module 'fv_diagnostics' contains routines to compute diagnosic fields.
module fv_diagnostics_mod
!
!
! Module Name |
! Functions Included |
!
!
! a2b_edge_mod |
! a2b_ord2, a2b_ord4 |
!
!
! constants_mod |
! grav, rdgas, rvgas, pi=>pi_8, radius, kappa, WTMAIR, WTMCO2,
! omega, hlv, cp_air, cp_vapor |
!
!
! diag_manager_mod |
! diag_axis_init, register_diag_field,
! register_static_field, send_data, diag_grid_init |
!
!
! field_manager_mod |
! MODEL_ATMOS |
!
!
! fms_mod |
! write_version_number |
!
!
! fv_arrays_mod |
! fv_atmos_type, fv_grid_type, fv_diag_type, fv_grid_bounds_type,
! R_GRIDmax_step |
!
!
! fv_eta_mod |
! get_eta_level, gw_1d |
!
!
! fv_grid_utils_mod |
! g_sum |
!
!
! fv_io_mod |
! fv_io_read_tracers |
!
!
! fv_mp_mod |
! mp_reduce_sum, mp_reduce_min, mp_reduce_max, is_master |
!
!
! fv_mapz_mod |
! E_Flux, moist_cv |
!
!
! fv_sg_mod |
! qsmith |
!
!
! fv_surf_map_mod |
! zs_g |
!
!
! fv_timing_mod |
! timing_on, timing_off |
!
!
! gfdl_mp_mod |
! wqs1, qsmith_init, c_liq |
!
!
! mpp_mod |
! mpp_error, FATAL, stdlog, mpp_pe, mpp_root_pe, mpp_sum, mpp_max, NOTE |
!
!
! mpp_domains_mod |
! domain2d, mpp_update_domains, DGRID_NE |
!
>
!
! sat_vapor_pres_mod |
! compute_qs, lookup_es |
!
!
! time_manager_mod |
! time_type, get_date, get_time |
!
!
! tracer_manager_mod |
! get_tracer_names, get_number_tracers, get_tracer_index, set_tracer_profile |
!
!
#ifdef OVERLOAD_R4
use constantsR4_mod, only: grav, rdgas, rvgas, pi=>pi_8, radius, kappa, WTMAIR, WTMCO2, &
omega, hlv, cp_air, cp_vapor, TFREEZE
#else
use constants_mod, only: grav, rdgas, rvgas, pi=>pi_8, radius, kappa, WTMAIR, WTMCO2, &
omega, hlv, cp_air, cp_vapor, TFREEZE
#endif
use fms_mod, only: write_version_number
use time_manager_mod, only: time_type, get_date, get_time
use mpp_domains_mod, only: domain2d, mpp_update_domains, DGRID_NE, NORTH, EAST
use diag_manager_mod, only: diag_axis_init, register_diag_field, &
register_static_field, send_data, diag_grid_init, &
diag_field_add_attribute
use fv_arrays_mod, only: fv_atmos_type, fv_grid_type, fv_diag_type, fv_grid_bounds_type, &
R_GRID
use fv_mapz_mod, only: E_Flux, moist_cv, moist_cp, mappm
use fv_mp_mod, only: mp_reduce_sum, mp_reduce_min, mp_reduce_max, is_master
use fv_eta_mod, only: get_eta_level, gw_1d
use fv_grid_utils_mod, only: g_sum
use a2b_edge_mod, only: a2b_ord2, a2b_ord4
use fv_surf_map_mod, only: zs_g
use fv_sg_mod, only: qsmith
use tracer_manager_mod, only: get_tracer_names, get_number_tracers, get_tracer_index
use field_manager_mod, only: MODEL_ATMOS
use mpp_mod, only: mpp_error, FATAL, stdlog, mpp_pe, mpp_root_pe, mpp_sum, mpp_max, NOTE, input_nml_file
use sat_vapor_pres_mod, only: compute_qs, lookup_es
use fv_arrays_mod, only: max_step
#ifndef GFS_PHYS
use gfdl_mp_mod, only: wqs1, qsmith_init, c_liq
#endif
use fv_diag_column_mod, only: fv_diag_column_init, sounding_column, debug_column
#ifdef MULTI_GASES
use multi_gases_mod, only: virq, virqd, vicpqd, vicvqd, num_gas
#endif
implicit none
private
interface range_check
module procedure range_check_3d
module procedure range_check_2d
end interface range_check
real, parameter:: missing_value = -1.e10
real, parameter:: missing_value2 = -1.e3 !< for variables with many missing values
real, parameter:: missing_value3 = 1.e10 !< for variables where we look for smallest values
real :: ginv
real :: pk0
logical master
character(len=3) :: gn = ''
! private (to this module) diag:
type(time_type) :: fv_time
type(fv_diag_type), pointer :: idiag
logical :: module_is_initialized=.false.
logical :: prt_minmax =.false.
logical :: m_calendar
integer sphum, liq_wat, ice_wat, cld_amt ! GFDL physics
integer rainwat, snowwat, graupel, hailwat
#ifdef MULTI_GASES
integer spo, spo2, spo3
#else
integer o3mr
#endif
integer :: istep, mp_top
real :: ptop
real, parameter :: rad2deg = 180./pi
logical :: do_diag_sonde, do_diag_debug
integer :: sound_freq
logical :: prt_sounding = .false.
! tracers
character(len=128) :: tname
character(len=256) :: tlongname, tunits
real :: sphum_ll_fix = 0.
real :: qcly0 ! initial value for terminator test
public :: fv_diag_init, fv_time, fv_diag, prt_mxm, prt_maxmin, range_check!, id_divg, id_te
public :: prt_mass, prt_minmax, ppme, fv_diag_init_gn, z_sum, sphum_ll_fix, eqv_pot, qcly0, gn
public :: prt_height, prt_gb_nh_sh, interpolate_vertical, rh_calc, get_height_field, dbzcalc
public :: max_vv, get_vorticity, max_uh
public :: max_vorticity, max_vorticity_hy1, bunkers_vector, helicity_relative_CAPS
public :: cs3_interpolator, get_height_given_pressure
#ifdef MOVING_NEST
public :: interpolate_z, get_pressure_given_height
public :: fv_diag_reinit
#endif
integer, parameter :: MAX_PLEVS = 31
#ifdef FEWER_PLEVS
integer :: nplev = 11 !< # of levels in plev interpolated standard level output, with levels given by levs. 11 by default
#else
integer :: nplev = 31 !< # of levels in plev interpolated standard level output, with levels given by levs. 31 by default
#endif
integer :: levs(MAX_PLEVS) !< levels for plev interpolated standard level output, in hPa (mb) in increasing order. Extended GFS std levels by default.
integer :: k100, k200, k300, k500
integer :: nplev_ave
integer :: levs_ave(MAX_PLEVS) !< Interfaces of layer averages for nplev_ave regridded output, in hPa (mb) in increasing order. 50,400,850,1000 by default.
integer :: yr_init, mo_init, dy_init, hr_init, mn_init, sec_init
integer :: id_dx, id_dy
real,dimension(2) :: vrange, vsrange, wrange, trange, slprange, rhrange, skrange
real,dimension(2) :: vrange_bad, trange_bad
! integer :: id_d_grid_ucomp, id_d_grid_vcomp ! D grid winds
! integer :: id_c_grid_ucomp, id_c_grid_vcomp ! C grid winds
namelist /fv_diag_plevs_nml/ nplev, levs, levs_ave, k100, k200, k500
! version number of this module
! Include variable "version" to be written to log file.
#include