SpcCoeff Introduction Page


Apr. 04, 2005 Update

Update Archive

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.

SpcCoeff Data Contents

SpcCoeff files and data structures contain the following data,

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:
  • hirs3_n17
  • airs_aqua
  • ssmis_f16
  • etc...
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)

SpcCoeff Structure Defintion

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.

SpcCoeff File Formats

netCDF Format

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" ;
}

Binary (sequential,unformatted) Format

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.


This page maintained by Paul van Delst

Last updated $Date: $