Module containing methods to for CLM history file handling.
USES:
use shr_kind_mod, only : r8 => shr_kind_r8 use spmdMod , only : masterproc use shr_sys_mod , only : shr_sys_flush use abortutils , only : endrun use clm_varcon , only : spval,ispval use clm_varctl , only : iulog use clmtype , only : gratm, grlnd, nameg, namel, namec, namep, allrof use decompMod , only : get_proc_bounds, get_proc_global use decompMod , only : get_proc_bounds_atm, get_proc_global_atm #if (defined RTM) use RunoffMod , only : get_proc_rof_bounds, get_proc_rof_global #endif use ncdio_pio implicit none save privatePUBLIC TYPES:
Constants
integer , public, parameter :: max_tapes = 6 ! max number of history tapes
integer , public, parameter :: max_flds = 1500 ! max number of history fields
integer , public, parameter :: max_namlen = 32 ! maximum number of characters for field name
Counters
integer , public :: ntapes = 0 ! index of max history file requested
Namelist
integer :: ni ! implicit index below
logical, public :: &
hist_empty_htapes = .false. ! namelist: flag indicates no default history fields
integer, public :: &
hist_ndens(max_tapes) = 2 ! namelist: output density of netcdf history files
integer, public :: &
hist_mfilt(max_tapes) = 30 ! namelist: number of time samples per tape
logical, public :: &
hist_dov2xy(max_tapes) = (/.true.,(.true.,ni=2,max_tapes)/) ! namelist: true=> do grid averaging
integer, public :: &
hist_nhtfrq(max_tapes) = (/0, (-24, ni=2,max_tapes)/) ! namelist: history write freq(0=monthly)
character(len=1), public :: &
hist_avgflag_pertape(max_tapes) = (/(' ',ni=1,max_tapes)/) ! namelist: per tape averaging flag
character(len=max_namlen), public :: &
hist_type1d_pertape(max_tapes) = (/(' ',ni=1,max_tapes)/) ! namelist: per tape type1d
character(len=max_namlen+2), public :: &
fincl(max_flds,max_tapes) ! namelist-equivalence list of fields to add
character(len=max_namlen+2), public :: &
hist_fincl1(max_flds) = ' ' ! namelist: list of fields to add
character(len=max_namlen+2), public :: &
hist_fincl2(max_flds) = ' ' ! namelist: list of fields to add
character(len=max_namlen+2), public :: &
hist_fincl3(max_flds) = ' ' ! namelist: list of fields to add
character(len=max_namlen+2), public :: &
hist_fincl4(max_flds) = ' ' ! namelist: list of fields to add
character(len=max_namlen+2), public :: &
hist_fincl5(max_flds) = ' ' ! namelist: list of fields to add
character(len=max_namlen+2), public :: &
hist_fincl6(max_flds) = ' ' ! namelist: list of fields to add
character(len=max_namlen), public :: &
fexcl(max_flds,max_tapes) ! namelist-equivalence list of fields to remove
character(len=max_namlen), public :: &
hist_fexcl1(max_flds) = ' ' ! namelist: list of fields to remove
character(len=max_namlen), public :: &
hist_fexcl2(max_flds) = ' ' ! namelist: list of fields to remove
character(len=max_namlen), public :: &
hist_fexcl3(max_flds) = ' ' ! namelist: list of fields to remove
character(len=max_namlen), public :: &
hist_fexcl4(max_flds) = ' ' ! namelist: list of fields to remove
character(len=max_namlen), public :: &
hist_fexcl5(max_flds) = ' ' ! namelist: list of fields to remove
character(len=max_namlen), public :: &
hist_fexcl6(max_flds) = ' ' ! namelist: list of fields to remove
Restart
logical, private :: if_disphist(max_tapes) ! true => save history file
PUBLIC MEMBER FUNCTIONS:
public :: hist_addfld1d ! Add a 1d single-level field to the master field list public :: hist_addfld2d ! Add a 2d multi-level field to the master field list public :: hist_add_subscript ! Add a 2d subscript dimension public :: hist_printflds ! Print summary of master field list public :: hist_htapes_build ! Initialize history file handler for initial or continue run public :: hist_update_hbuf ! Updates history buffer for all fields and tapes public :: hist_htapes_wrapup ! Write history tape(s) public :: hist_restart_ncd ! Read/write history file restart dataREVISION HISTORY:
Created by Mariana VertensteinPRIVATE MEMBER FUNCTIONS:
private :: masterlist_make_active ! Add a field to a history file default "on" list private :: masterlist_addfld ! Add a field to the master field list private :: masterlist_change_timeavg ! Override default history tape contents for specific tape private :: htapes_fieldlist ! Define the contents of each history file based on namelist private :: htape_addfld ! Add a field to the active list for a history tape private :: htape_create ! Define contents of history file t private :: htape_timeconst ! Write time constant values to history tape private :: htape_timeconst3D ! Write time constant 3D values to primary history tape private :: hfields_normalize ! Normalize history file fields by number of accumulations private :: hfields_zero ! Zero out accumulation and hsitory buffers for a tape private :: hfields_write ! Write a variable to a history tape private :: hfields_1dinfo ! Define/output 1d subgrid info if appropriate private :: hist_update_hbuf_field_1d ! Updates history buffer for specific field and tape private :: hist_update_hbuf_field_2d ! Updates history buffer for specific field and tape private :: list_index ! Find index of field in exclude list private :: set_hist_filename ! Determine history dataset filenames private :: getname ! Retrieve name portion of input "inname" private :: getflag ! Retrieve flag private :: pointer_index ! Track data pointer indices private :: max_nFields ! The max number of fields on any tapePRIVATE TYPES:
Constants
integer, parameter :: max_chars = 128 ! max chars for char variables
Subscript dimensions
integer, parameter :: max_subs = 100 ! max number of subscripts
integer :: num_subs = 0 ! actual number of subscripts
character(len=32) :: subs_name(max_subs) ! name of subscript
integer :: subs_dim(max_subs) ! dimension of subscript
Derived types
type field_info
character(len=max_namlen) :: name ! field name
character(len=max_chars) :: long_name ! long name
character(len=max_chars) :: units ! units
character(len=8) :: type1d ! clm pointer first dimension type
! from clmtype (nameg, etc)
character(len=8) :: type1d_out ! hbuf first dimension type
! from clmtype (nameg, etc)
character(len=8) :: type2d ! hbuf second dimension type
! ["levgrnd","levlak","numrad","subname(n)"]
integer :: beg1d ! on-node 1d clm pointer start index
integer :: end1d ! on-node 1d clm pointer end index
integer :: num1d ! size of clm pointer first dimension (all nodes)
integer :: beg1d_out ! on-node 1d hbuf pointer start index
integer :: end1d_out ! on-node 1d hbuf pointer end index
integer :: num1d_out ! size of hbuf first dimension (all nodes)
integer :: num2d ! size of hbuf second dimension (e.g. number of vertical levels)
integer :: hpindex ! history pointer index
character(len=8) :: p2c_scale_type ! scale factor when averaging pft to column
character(len=8) :: c2l_scale_type ! scale factor when averaging column to landunit
character(len=8) :: l2g_scale_type ! scale factor when averaging landunit to gridcell
end type field_info
type master_entry
type (field_info) :: field ! field information
logical :: actflag(max_tapes) ! active/inactive flag
character(len=1) :: avgflag(max_tapes) ! time averaging flag ("X","A","M" or "I",)
end type master_entry
type history_entry
type (field_info) :: field ! field information
character(len=1) :: avgflag ! time averaging flag
real(r8), pointer :: hbuf(:,:) ! history buffer (dimensions: dim1d x num2d)
integer , pointer :: nacs(:,:) ! accumulation counter (dimensions: dim1d x num2d)
end type history_entry
type history_tape
integer :: nflds ! number of active fields on tape
integer :: ntimes ! current number of time samples on tape
integer :: mfilt ! maximum number of time samples per tape
integer :: nhtfrq ! number of time samples per tape
integer :: ncprec ! netcdf output precision
logical :: dov2xy ! true => do xy average for all fields
logical :: is_endhist ! true => current time step is end of history interval
real(r8) :: begtime ! time at beginning of history averaging interval
type (history_entry) :: hlist(max_flds) ! array of active history tape entries
end type history_tape
type clmpoint_rs ! Pointer to real scalar data (1D)
real(r8), pointer :: ptr(:)
end type clmpoint_rs
type clmpoint_ra ! Pointer to real array data (2D)
real(r8), pointer :: ptr(:,:)
end type clmpoint_ra