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,
| 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 |
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.
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" ;
}
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.
| ID | Absorber | ID | Absorber | ID | Absorber | ID | Absorber |
|---|---|---|---|---|---|---|---|
| 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 |
| 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 |