AtmProfile Introduction Page


AtmProfile Data Contents

AtmProfile files and data structures contain Atmospheric Profile data used mainly by code to generate atmospheric transmittances from Line-By-Line (LBL) codes, generate fast transmittance model regression coefficients, and generate the statistics for those models. The AtmProfile data structure and data files contain the following data,

Table 1. Contents of AtmProfile structures and files
Name Description Rank
n_Levels The number of atmospheric levels dimension, K+1. -
n_Layers The number of atmospheric layers dimension, K. -
n_Absorbers The number of gaseous absorbers dimension, J. -
n_Profiles The number of atmospheric profiles dimension, M. -
Absorber ID An array containing the HITRAN absorber ID values for the absorbers included in the profile. See table A1 for the valid values. Rank-1, J
Absorber Units ID An array containing the absorber units ID values for the absorbers included in the profile. These values correspond to those used by LBLRTM. See table A2 for the valid values. Rank-1, J
Absorber Units Name An array containing the name of the absorber units corresponding to the absorber units ID. These values correspond to those used by LBLRTM. Rank-1, J
Absorber Units, LBLRTM An array containing the character identifier for absorber units used in LBLRTM. See table A2 for the valid identifiers. Rank-1, J
Description A character string array containing a description of each profile. Rank-1, M
Climatology Model The climatology model associated with each profile. Rank-1, M
DateTime A structure containing date and time information for each profile. Rank-1, M
Location A structure containing location information for each profile. Rank-1, M
Level Pressure Array of LEVEL pressure values. Rank-2, K+1 x M
Level Temperature Array of LEVEL temperature values. Rank-2, K+1 x M
Level Absorber Array of LEVEL absorber amounts. Rank-3, K+1 x J x M
Level Altitude Array of LEVEL altitudes. Rank-2, K+1 x M
Layer Pressure Array of LAYER average pressure values. Rank-2, K x M
Layer Temperature Array of LAYER average temperature values. Rank-2, K x M
Layer Absorber Array of LAYER average absorber amounts. Rank-3, K x J x M
Layer DeltaZ Array of LAYER thicknesses. Rank-2, K x M

AtmProfile Structure Defintion

The AtmProfile structure is defined in the AtmProfile_Define module.

  TYPE, PUBLIC :: AtmProfile_type
    INTEGER :: n_Allocates = 0

    INTEGER :: PD_StrLen  = PDSL
    INTEGER :: AUN_StrLen = AUNSL

    ! -- Dimensions
    INTEGER( Long ) :: n_Levels    = 0 ! Dimension K+1
    INTEGER( Long ) :: n_Layers    = 0 ! Dimension K
    INTEGER( Long ) :: n_Absorbers = 0 ! Dimension J
    INTEGER( Long ) :: n_Profiles  = 0 ! Dimension M

    ! -- Absorber information
    INTEGER( Long ),    POINTER, DIMENSION( : ) :: Absorber_ID => NULL()           ! J
    INTEGER( Long ),    POINTER, DIMENSION( : ) :: Absorber_Units_ID => NULL()     ! J
    CHARACTER( AUNSL ), POINTER, DIMENSION( : ) :: Absorber_Units_Name => NULL()   ! J
    CHARACTER(   1   ), POINTER, DIMENSION( : ) :: Absorber_Units_LBLRTM => NULL() ! J

    ! -- Profile data    
    CHARACTER( PDSL ),               POINTER, DIMENSION( : )       :: Description       => NULL()  ! M
    INTEGER( Long ),                 POINTER, DIMENSION( : )       :: Climatology_Model => NULL()  ! M
    TYPE( AtmProfileDateTime_type ), POINTER, DIMENSION( : )       :: DateTime          => NULL()  ! M
    TYPE( AtmProfileLocation_type ), POINTER, DIMENSION( : )       :: Location          => NULL()  ! M

    REAL( Double ),                  POINTER, DIMENSION( :, : )    :: Level_Pressure     => NULL() ! K+1 x M
    REAL( Double ),                  POINTER, DIMENSION( :, : )    :: Level_Temperature  => NULL() ! K+1 x M
    REAL( Double ),                  POINTER, DIMENSION( :, :, : ) :: Level_Absorber     => NULL() ! K+1 x J x M
    REAL( Double ),                  POINTER, DIMENSION( :, : )    :: Level_Altitude     => NULL() ! K+1 x M

    REAL( Double ),                  POINTER, DIMENSION( :, : )    :: Layer_Pressure    => NULL()  ! K x M
    REAL( Double ),                  POINTER, DIMENSION( :, : )    :: Layer_Temperature => NULL()  ! K x M
    REAL( Double ),                  POINTER, DIMENSION( :, :, : ) :: Layer_Absorber    => NULL()  ! K x J x M
    REAL( Double ),                  POINTER, DIMENSION( :, : )    :: Layer_Delta_Z     => NULL()  ! K x M
  END TYPE AtmProfile_type

where the initialisation values for the string length members, PDSL and AUNSL, are parameters defined in the module.

Two other internal structures are defined. One is used to hold the profile date and time information,

  TYPE, PUBLIC :: AtmProfileDateTime_type
    INTEGER( Long ) :: Year  = ATMPROFILE_IP_INVALID
    INTEGER( Long ) :: Month = ATMPROFILE_IP_INVALID
    INTEGER( Long ) :: Day   = ATMPROFILE_IP_INVALID
    INTEGER( Long ) :: Hour  = ATMPROFILE_IP_INVALID
  END TYPE AtmProfileDateTime_type

and the other is used to hold the profile location information,

  TYPE, PUBLIC :: AtmProfileLocation_type
    REAL( Double ) :: Latitude         = ATMPROFILE_FP_INVALID
    REAL( Double ) :: Longitude        = ATMPROFILE_FP_INVALID
    REAL( Double ) :: Surface_Altitude = ATMPROFILE_FP_INVALID
  END TYPE AtmProfileLocation_type

where the initialisation value, ATMPROFILE_FP_INVALID, is a defined parameter used to signal an invalid floating point, i.e. real, value.

The AtmProfile_type is PUBLIC and its members are not encapsulated; that is, they can be fully accessed outside the scope of the AtmProfile_Define module. This makes it possible to manipulate the structure and its data directly rather than, for e.g., via get() and set() functions. This was done to eliminate the overhead of the get/set type of access in using the structure. But, it is recommended that the user destroy, allocate, and assign the structure using the routines in the AtmProfile_Define module where possible to eliminate -- or at least minimise -- the possibility of memory leakage since most of the structure members are pointers.

The floating point components are defined with the Double kind type rather than the generic fp_kind kind type and the integer components are explicitly type as Long. This is done to ensure the binary datafiles are read and written consistently.

The n_Allocates structure component is only used internally in the structure allocation and destruction functions to keep track of the current allocation status of the structure.

AtmProfile File Formats

netCDF Format

This is the default format for AtmProfile data files. Using netCDF allows users to track the history, release, and version of the data file relatively easily via global attributes, as well as the attributes of the contents themselves. These datafiles are accessed using the functions in the AtmProfile_netCDF_IO module.

Below is the CDL representation of the netCDF format AtmProfile data file for the UMBC set of 48 profiles used as a dependent set in generating the OPTRAN fast transmittance model regression coefficients,

netcdf UMBC.AtmProfile {
dimensions:
	n_levels = 101 ;
	n_layers = 100 ;
	n_absorbers = 5 ;
	n_profiles = 48 ;
	pdsl = 512 ;
variables:
	char profile_description(n_profiles, pdsl) ;
		profile_description:long_name = "Description of profile" ;
	int climatology_model(n_profiles) ;
		climatology_model:long_name = "Climatology model associated with profile date/time/location." ;
	double date_time(n_profiles) ;
		date_time:long_name = "Date and Time in which profile was recorded(sonde) or for which it was generated(model)" ;
		date_time:units = "YYYYMMDD.HH" ;
		date_time:_FillValue = -999. ;
	double latitude(n_profiles) ;
		latitude:long_name = "Latitude of profile location" ;
		latitude:units = "degress North (-90->+90)" ;
		latitude:_FillValue = -999. ;
	double longitude(n_profiles) ;
		longitude:long_name = "Longitude of profile location" ;
		longitude:units = "degress East (0->360)" ;
		longitude:_FillValue = -999. ;
	double surface_altitude(n_profiles) ;
		surface_altitude:long_name = "Surface altitude of profile" ;
		surface_altitude:units = "metres (m)" ;
		surface_altitude:_FillValue = -999. ;
	int absorber_id(n_absorbers) ;
		absorber_id:long_name = "HITRAN/LBLRTM absorber ID number for atmospheric profile constituents" ;
		absorber_id:units = "N/A" ;
		absorber_id:_FillValue = -1 ;
	int absorber_units_id(n_absorbers) ;
		absorber_units_id:long_name = "LBLRTM absorber units ID number" ;
		absorber_units_id:units = "N/A" ;
		absorber_units_id:_FillValue = -1 ;
	double level_pressure(n_profiles, n_levels) ;
		level_pressure:long_name = "Level pressure" ;
		level_pressure:units = "hectoPascals (hPa)" ;
		level_pressure:_FillValue = -999. ;
	double level_temperature(n_profiles, n_levels) ;
		level_temperature:long_name = "Level temperature" ;
		level_temperature:units = "Kelvin (K)" ;
		level_temperature:_FillValue = -999. ;
	double level_absorber(n_profiles, n_absorbers, n_levels) ;
		level_absorber:long_name = "Level absorber" ;
		level_absorber:units = "Variable (see Absorber_Units_ID)" ;
		level_absorber:_FillValue = -999. ;
	double level_altitude(n_profiles, n_levels) ;
		level_altitude:long_name = "Level altitude" ;
		level_altitude:units = "metres (m)" ;
		level_altitude:_FillValue = -999. ;
	double layer_pressure(n_profiles, n_layers) ;
		layer_pressure:long_name = "Layer pressure" ;
		layer_pressure:units = "hectoPascals (hPa)" ;
		layer_pressure:_FillValue = -999. ;
	double layer_temperature(n_profiles, n_layers) ;
		layer_temperature:long_name = "Layer temperature" ;
		layer_temperature:units = "Kelvin (K)" ;
		layer_temperature:_FillValue = -999. ;
	double layer_absorber(n_profiles, n_absorbers, n_layers) ;
		layer_absorber:long_name = "Layer absorber" ;
		layer_absorber:units = "Variable (see Absorber_Units_ID)" ;
		layer_absorber:_FillValue = -999. ;
	double layer_delta_z(n_profiles, n_layers) ;
		layer_delta_z:long_name = "Layer thickness" ;
		layer_delta_z:units = "metres (m)" ;
		layer_delta_z:_FillValue = -999. ;

// global attributes:
		:write_module_history = "$Id: AtmProfile_netCDF_IO.f90,v 4.0 2004/11/02 20:13:02 paulv Exp $" ;
		:creation_date_and_time = "2004/11/09, 16:06:24 -0500UTC" ;
		:title = "UMBC atmospheric profile set." ;
		:history = "$Id: UMBC_Profile_Set.f90,v 1.3 2003/08/13 21:21:02 paulv Exp $; $Id: Interpolate.f90,v 3.10 2004/06/25 17:19:21 paulv Exp $; $Id: Create_AtmProfile.f90,v 1.10 2004/11/02 20:11:14 paulv Exp $" ;
		:comment = "Original profiles interpolated to the 101 AIRS pressure levels." ;
		:id_tag = "UMBC" ;
}

Binary (sequential,unformatted) Format

This data file format is provided only for those people who still do not have access to the netCDF libraries. This interface is unsupported so use the netCDF files.

These binary datafiles are read and written using the functions in the AtmProfile_Binary_IO module. They are created from the netCDF format data files via the AtmProfile_NC2BIN conversion program.

The contents of the binary format datafiles are effectively the same as the netCDF datafiles but with no attribute data and some extra header data to check the variable definitions and endian-ness of the files.

Appendices

Table A1. AtmProfile Absorber_ID Values (Same as HITRAN).
IDAbsorberIDAbsorberIDAbsorberIDAbsorber
1 H2O 2 CO2 3 O3 4 N2O
5 CO 6 CH4 7 O2 8 NO
9 SO2 10 NO2 11 NH3 12 HNO3
13 OH 14 HF 15 HCL 16 HBR
17 HI 18 CLO 19 OCS 20 H2CO
21 HOCL 22 N2 23 HCN 24 CH3CL
25 H2O2 26 C2H2 27 C2H6 28 PH3
29 COF2 30 SF6 31 H2S 32 HCOOH

Table A2. AtmProfile Absorber_Units_ID Values (Same as LBLRTM).
ID Units LBLRTM Identifier
1 ppmv A
2 cm-3 B
3 g/kg C
4 g.m-3 D
5 hPa E
6 Dew point, K [H2O Only] F
7 Dew point, deg.C [H2O Only] G
8 Relative humidity [H2O Only] H


This page maintained by Paul van Delst

Last updated 03 January 2005