Apr. 04, 2005 Update
SpcCoeff files and data structures contain Spectral Coefficient data about particular sensors. The SpcCoeff files/structures are used in many applications available on this site as a way to introduce sensor specific information into data files or code. This page describes the data structure and data file formats.
| Name | Description | |
|---|---|---|
| Release | SpcCoeff data release number. This value is an indicator of the data file and structure format. | |
| Version | SpcCoeff data version number. This value is an indicator of the age or methodology used to produce the data values. | |
| n_Channels | Total number of spectral channels for which there is data. | |
| n_Sensors | Number of different satellite/sensors represented in the data file and structure. | |
| Sensor_Descriptor | String variable (20 characters in length)
containing a short text description of the sensor and satellite.
Descriptors are taken from the SensorInfo file prefix member. Examples are:
|
|
| Sensor_Type | Sensor type flags used to identify the type of sensor channel. | |
| NCEP_Sensor_ID | An array of "in-house" values used at NOAA/NCEP/EMC to identify a satellite/sensor combination. Each sensor channel in the file and structure has a value. | |
| WMO_Satellite_ID | An array of WMO code values identifying satelite platforms. Taken from the WMO common code tables. The Satellite ID is from Common Code table C-5, or code table 0 01 007 in BUFR. Each sensor channel in the file and structure has a value. | |
| WMO_Sensor_ID | An array of WMO code values identifying a satelite sensor. Taken from the WMO common code tables. The Sensor ID is from Common Code table C-8, or code table 0 02 019 in BUFR. Each sensor channel in the file and structure has a value. | |
| Sensor_Channel | An array of sensor channel numbers. May not contain contiguous values. | |
| Frequency | Array of sensor channel central frequencies in gigahertz (GHz). | |
| Wavenumber | Array of sensor channel central frequencies in inverse centimetres (cm-1). | |
| Planck_C1 | Array of the first Planck function coefficient values for each sensor channel in units of mW/(m2.sr.cm-1). | |
| Planck_C2 | Array of the second Planck function coefficient values for each sensor channel in units of Kelvin (K). | |
| Band_C1 | Array of the polychromaticity correction offset values for each sensor channel in units of Kelvin (K). | |
| Band_C2 | Array of the polychromaticity correction slope values for each sensor channel in units of K/K. | |
| Is_Microwave_Channel | Array of flags indicating if a channel is from a microwave instrument. If = 0 ==> Infrared, if = 1 ==> Microwave. OBSOLETE: Use the Sensor_Type component instead. | |
| Polarization | Polarization flags used to indicate the sensor channel polarization. Note that all IR channels are listed as unpolarised. | |
| Cosmic_Background_Radiance | Array of radiance values for each sensor channel at the cosmic background temperature in units of mW/(m2.sr.cm-1) | |
| Is_Solar_Channel | Array of flags indicating if a sensor channel is sensitive to solar contamination. If = 0 ==> No, if = 1 ==> Yes | |
| Solar_Irradiance | Kurucz solar irradiance source function for each sensor channel in units of mW/(m2.cm-1) | |
The SpcCoeff structure is defined in the SpcCoeff_Define module.
TYPE, PUBLIC :: SpcCoeff_type
INTEGER( Long ) :: Release = SPCCOEFF_RELEASE
INTEGER( Long ) :: Version = SPCCOEFF_VERSION
INTEGER( Long ) :: Sensor_Descriptor_StrLen = DL
INTEGER( Long ) :: n_Channels = 0 ! L dimension
INTEGER( Long ) :: n_Sensors = 0
CHARACTER( DL ), POINTER, DIMENSION( : ) :: Sensor_Descriptor => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: Sensor_Type => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: NCEP_Sensor_ID => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: WMO_Satellite_ID => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: WMO_Sensor_ID => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: Sensor_Channel => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Frequency => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Wavenumber => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Planck_C1 => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Planck_C2 => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Band_C1 => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Band_C2 => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: Is_Microwave_Channel => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: Polarization => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Cosmic_Background_Radiance => NULL() ! L
INTEGER( Long ), POINTER, DIMENSION( : ) :: Is_Solar_Channel => NULL() ! L
REAL( Double ), POINTER, DIMENSION( : ) :: Solar_Irradiance => NULL() ! L
END TYPE SpcCoeff_type
The current SPCCOEFF_RELEASE is 5 and the current SPCCOEFF_VERSION is 1. Note that the format of the structure and the datafiles only changes with a release update. Version changes affect the data, but not the structure or datafiles formats.
The SpcCoeff_type is PUBLIC and its members are not encapsulated; that is, they can be fully accessed outside the scope of the SpcCoeff_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, assign, and concatenate the structure using the routines in SpcCoeff_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.
This is the default format for SpcCoeff 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 read and written using the functions in the SpcCoeff_netCDF_IO module. They are created via the Create_IR_SpcCoeff and Create_MW_SpcCoeff programs.
Below is the CDL representation of the header of the netCDF format SpcCoeff data file for NOAA-17 HIRS/3,
netcdf hirs3_n17.SpcCoeff {
dimensions:
n_channels = 19 ;
sdsl = 20 ;
variables:
int Release ;
Release:description = "Release number of SpcCoeff data file" ;
int Version ;
Version:description = "Version number of SpcCoeff data file" ;
char Sensor_Descriptor(n_channels, sdsl) ;
Sensor_Descriptor:description = "Short text string containing the sensor/satellite description" ;
Sensor_Descriptor:long_name = "Sensor Descriptor" ;
int Sensor_Type(n_channels) ;
Sensor_Type:description = "Sensor type flag. Used to identify microwave, infrared, and visible sensor channels" ;
Sensor_Type:long_name = "Sensor Type" ;
Sensor_Type:units = "N/A" ;
Sensor_Type:_FillValue = 0 ;
int NCEP_Sensor_ID(n_channels) ;
NCEP_Sensor_ID:description = "ID used at NOAA/NCEP/EMC to identify a satellite/sensor (-1 == none available)" ;
NCEP_Sensor_ID:long_name = "NCEP Sensor ID" ;
NCEP_Sensor_ID:units = "N/A" ;
NCEP_Sensor_ID:_FillValue = -1 ;
int WMO_Satellite_ID(n_channels) ;
WMO_Satellite_ID:description = "WMO code for identifying satellite platforms (1023 == none available)" ;
WMO_Satellite_ID:long_name = "WMO Satellite ID" ;
WMO_Satellite_ID:units = "N/A" ;
WMO_Satellite_ID:_FillValue = 1023 ;
int WMO_Sensor_ID(n_channels) ;
WMO_Sensor_ID:description = "WMO code for identifying a satellite sensor (2047 == none available)" ;
WMO_Sensor_ID:long_name = "WMO Sensor ID" ;
WMO_Sensor_ID:units = "N/A" ;
WMO_Sensor_ID:_FillValue = 2047 ;
int Sensor_Channel(n_channels) ;
Sensor_Channel:description = "List of sensor channel numbers associated with the SpcCoeff data" ;
Sensor_Channel:long_name = "Sensor Channel" ;
Sensor_Channel:units = "N/A" ;
Sensor_Channel:_FillValue = -1 ;
double frequency(n_channels) ;
frequency:description = "Channel central frequency, f" ;
frequency:long_name = "Frequency" ;
frequency:units = "Gigahertz (GHz)" ;
frequency:_FillValue = -1. ;
double wavenumber(n_channels) ;
wavenumber:description = "Channel central wavenumber, v" ;
wavenumber:long_name = "Wavenumber" ;
wavenumber:units = "Inverse centimetres (cm^-1)" ;
wavenumber:_FillValue = -1. ;
double planck_c1(n_channels) ;
planck_c1:description = "First Planck coefficient, c1.v^3" ;
planck_c1:long_name = "Planck C1" ;
planck_c1:units = "mW/(m^2.sr.cm^-1)" ;
planck_c1:_FillValue = -1. ;
double planck_c2(n_channels) ;
planck_c2:description = "Second Planck coefficient, c2.v" ;
planck_c2:long_name = "Planck C2" ;
planck_c2:units = "Kelvin (K)" ;
planck_c2:_FillValue = -1. ;
double band_c1(n_channels) ;
band_c1:description = "Polychromatic band correction offset" ;
band_c1:long_name = "Band C1" ;
band_c1:units = "Kelvin (K)" ;
band_c1:_FillValue = -1. ;
double band_c2(n_channels) ;
band_c2:description = "Polychromatic band correction slope" ;
band_c2:long_name = "Band C2" ;
band_c2:units = "K/K" ;
band_c2:_FillValue = -1. ;
int is_microwave_channel(n_channels) ;
is_microwave_channel:description = "Flag indicating if a channel is microwave (0=no, 1=yes) OBSOLETE: Use SENSOR_TYPE." ;
is_microwave_channel:long_name = "Microwave channel flag" ;
is_microwave_channel:units = "N/A" ;
is_microwave_channel:_FillValue = -1 ;
int polarization(n_channels) ;
polarization:description = "Polarization type flag. Describes the channel polarization." ;
polarization:long_name = "Polarization type flag" ;
polarization:units = "N/A" ;
polarization:_FillValue = 0 ;
double cosmic_background_radiance(n_channels) ;
cosmic_background_radiance:description = "Plank radiance for the cosmic background temperature" ;
cosmic_background_radiance:long_name = "Cosmic Background Radiance" ;
cosmic_background_radiance:units = "mW/(m^2.sr.cm^-1)" ;
cosmic_background_radiance:_FillValue = -1. ;
int is_solar_channel(n_channels) ;
is_solar_channel:description = "Flag indicating if a channel is affected by solar source (0=no, 1=yes)" ;
is_solar_channel:long_name = "Solar channel flag" ;
is_solar_channel:units = "N/A" ;
is_solar_channel:_FillValue = -1 ;
double solar_irradiance(n_channels) ;
solar_irradiance:description = "TOA solar irradiance using Kurucz spectrum" ;
solar_irradiance:long_name = "Kurucz Solar Irradiance" ;
solar_irradiance:units = "mW/(m^2.cm^-1)" ;
solar_irradiance:_FillValue = -1. ;
// global attributes:
:write_module_history = "$Id: SpcCoeff_netCDF_IO.f90,v 5.2 2005/04/01 18:01:51 paulv Exp $" ;
:creation_date_and_time = "2005/04/01, 13:28:59 -0500UTC" ;
:title = "Spectral coefficients for NOAA-17 HIRS/3 derived from SRF data file hirs3_n17.srf.nc and solar data file solar.nc" ;
:history = "$Id: Create_IR_SpcCoeff.f90,v 5.0 2005/04/01 18:23:58 paulv Exp $; $Id: Interpolate_SRFs.f90,v 2.3 2003/11/19 19:54:24 paulv Exp $; $Id: SRF_ASCII2NC.f90,v 1.3 2003/11/19 14:00:25 paulv Exp $;$Id: hirs3_n17.srf,v 1.1 2003/08/28 21:50:22 paulv Exp $; AER extract_solar.f;$Id: interpolate.f90,v 3.4 2002/10/08 14:48:26 paulv Exp $;$Id: Create_Solar_netCDF_File.f90,v 1.3 2003/02/11 22:16:38 paulv Exp $" ;
:sensor_name = "HIRS/3" ;
:platform_name = "NOAA-17" ;
:comment = "Interpolated SRFs for transmittance production; Data obtained from HMW" ;
}
This is the data file format used in operational applications that require the SpcCoeff data, e.g. the Raditive Transfer Model in the Global Data Assimilation System at NCEP/EMC.
These datafiles are read and written using the functions in the SpcCoeff_Binary_IO module. They are created from the netCDF format data files via the SpcCoeff_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.
| Record Number | Record Contents | Record Length (bytes) | Record Description |
|---|---|---|---|
| 1 | INTEGER( Long ) :: Magic_Number | 4 | Value used to check endian-ness |
| 2 | INTEGER( Long ) :: Release INTEGER( Long ) :: Version |
8 | Values used to check data format and history |
| 3 | INTEGER( Long ) :: n_Channels | 4 | Dimension of all the sensor data. |
| 4 | INTEGER( Long ) :: Sensor_Descriptor_StrLen | 4 | The length of the sensor descriptor string. |
| 5 | INTEGER( Long ) :: n_Items | 4 | Number of components in the SpcCoeff structure. This value is only used internally to the binary I/O software for verification purposes. |
| 6 | INTEGER( Long ), DIMENSION( n_Items ) :: Data_Type | n_Items * 4 | The data types of each component of the SpcCoeff structure. These values are only used internally to the binary I/O software for verification purposes. |
| 7 to n_Channels+6 |
CHARACTER( DL ) :: Sensor_Descriptor
INTEGER( Long ) :: Sensor_Type
INTEGER( Long ) :: NCEP_Sensor_ID
INTEGER( Long ) :: WMO_Satellite_ID
INTEGER( Long ) :: WMO_Sensor_ID
INTEGER( Long ) :: Sensor_Channel
REAL( Double ), :: Frequency
REAL( Double ), :: Wavenumber
REAL( Double ), :: Planck_C1
REAL( Double ), :: Planck_C2
REAL( Double ), :: Band_C1
REAL( Double ), :: Band_C2
INTEGER( Long ) :: Is_Microwave_Channel
INTEGER( Long ) :: Polarization
REAL( Double ), :: Cosmic_Background_Radiance
INTEGER( Long ) :: Is_Solar_Channel
REAL( Double ), :: Solar_Irradiance
|
116 | The data values. These are repeated for each channel. |