//------------------------------------------------------------------------------ // NOAA/ERL // Forecast Systems Laboratory // Facility Division // Data Acquisition Branch // Posix Data Services Software // // gvarImage.cdl // // This cdl describes FSL's proposed format for GOES-Next data in space // view or orthographic projection. It's intent is to keep the data as // close as possible to that which was received from the satellite. Thus // the data is not remapped in anyway, but the scan lines from the satellite // are ordered appropriately so that an image can be displayed without // difficulty. // // Two different forms of navigation information are included with the image // data. The first is the satellite orbit and attitude information which // can be used in conjunction with a SOCC subroutine library to navigate the // image. The second set of navigation information consists of all of the // variables present in the WMO GRIB specification for space view projections. // This is the NUWG convention and allows users who have libraries familiar // with these quantities to navigate the data easily. Most of these numbers // are calculated from the satellite orbit and attitude information. // // Please note that while we have defined a "target" CDL we have not completed // work on this project and expect that this CDL may evolve with the project // itself. // // John Lewis & Andrew Sundelin // //------------------------------------------------------------------------------ // netCDF definition for GOES Space View or Orthogroaphic netcdf gvarImage { dimensions: y = 891; // note: the actual value will change x = 1352; // depending on the sector & resolution satnav = 1; // For geo-referencing: variables that use // this dimension define a mapping between // (x, y) indices and (latitude, longitude) // using the satellite navigation variables gridnav = 1; // For geo-referencing: variables that use // this dimension define a mapping between // (x, y) indices and (latitude, longitude) // using the GRIB defined navigation variables sinOrbtYawTotal = 9; // Needed for Sine Orbit Yaw orbitAttitudeLen = 336; // bytes of orbit and attitude information navLength = 132; // Length of navigation name strings imcLength = 4; // Length of image motion comp. string scanModeLength = 30; // Length of scan mode string dimNameLength = 8; // Length of the dimension names variables: // Image Information short image(y, x); image:units = "counts"; image:long_name = "Image Pixel Values"; image:navigation = "satnav, gridnav"; image:missing_value = 0s; image:_FillValue = 0s; byte channel; channel:long_name = "Current Channel Number"; channel:gvar_name = "LICHA, word 5, blocks 1 - 10"; float wavelength; wavelength:units = "microns"; wavelength:long_name = "Channel Wavelength"; byte frameTypeFlag; frameTypeFlag:long_name = "Priority Frame Flag"; // IR Calibration Variables // // To the best of my knowledge even line and odd line calibration information // should be sufficient to completely calibrate any given GVAR image given // that it is done at full satellite resolution, however reducing the // resolution by, say, a factor of five would entirely throw off such a // system. Line-by-line calibration as here, while taking up a lot of // space under many conditions is also the easiest to use. float bias(y); bias:long_name = "IR calibration bias term"; bias:gvar_name = "IWBIAS, words 5587 - 5614"; bias:missing_value = 0.0f; bias:_FillValue = 0.0f; float firstOrderGain(y); firstOrderGain:long_name = "IR calibration 1st order gain"; firstOrderGain:gvar_name = "IGAIN1, words 5615 - 5642"; firstOrderGain:missing_value = 0.0f; firstOrderGain:_FillValue = 0.0f; float secondOrderGain(y); secondOrderGain:long_name = "IR calibration 2nd order gain"; secondOrderGain:gvar_name = "IGAIN2, words 5643 - 5670"; secondOrderGain:missing_value = 0.0f; secondOrderGain:_FillValue = 0.0f; float biasRate(y); biasRate:long_name = "IR calibration bias rate"; biasRate:gvar_name = "IBRATE, words 5671 - 5698"; biasRate:missing_value = 0.0f; biasRate:_FillValue = 0.0f; // Time variables // // currentTime is line-by-line so that potential temporal aliasing due to // scan interruptions for priority frames, etc. can be detected. double currentTime(y); currentTime:units = "seconds since 1970-1-1 00:00:00.00"; currentTime:long_name = "Current SPS Time"; currentTime:gvar_name = "TCURR, words 23 - 30"; double frameStartTime; frameStartTime:units ="seconds since 1970-1-1 00:00:00.00 0:00"; frameStartTime:long_name = "Valid Time Frame Start"; frameStartTime:gvar_name = "TIPFS (priorty: words 63 - 70) or TINFS (normal: words 71 - 78)"; double lastSpaceLookTime; lastSpaceLookTime:units = "seconds since 1970-1-1 00:00:00.00 0:00"; lastSpaceLookTime:long_name = "Time of last spacelook calib"; lastSpaceLookTime:gvar_name = "TISPC, words 79 - 86"; double lastBlkBodyTime; lastBlkBodyTime:units="seconds since 1970-1-1 00:00:00.00 0:00"; lastBlkBodyTime:long_name = "Time of last blackbody calib"; lastBlkBodyTime:gvar_name = "TIBBC, words 95 - 102"; double lastStarSenseTime; lastStarSenseTime:units = "seconds since 1970-1-1 00:00:00.00 0:00"; lastStarSenseTime:long_name = "Time of Last Star Sense"; lastStarSenseTime:gvar_name = "TISTR: words 103 - 110"; double curOrbitAttTime; curOrbitAttTime:units = "seconds since 1970-1-1 00:00:00.00 0:00"; curOrbitAttTime:long_name = "Time tag of current O&A set implemented"; curOrbitAttTime:gvar_name = "TIONA, words 143 - 150"; // This could be dimensioned by y, but since most GVAR users merely // display count data it is _extremely_ unlikely that the calibration // would change within a single image. double curIRcalTime; curIRcalTime:units = "seconds since 1970-1-1 00:00:00.00 0:00"; curIRcalTime:long_name = "Time tag of current IR calib. set "; curIRcalTime:gvar_name = "TIIRT: words 119 - 126"; // Satellite variables byte satid; satid:long_name = "Satellite Id Number"; satid:units = "WMO Table (0 01 007 - BUFR Supl #3 (VIII,1991))"; int scanStatus; scanStatus:long_name = "Imager Scan Status"; scanStatus:gvar_name = "ISCAN: words 3 - 6"; //////////////////////////////////////////////////////////////////////////// // GVAR Satellite Navigation Information (broken out) // These are needed for the GOES-Next Earth Referencing Subroutine Library //////////////////////////////////////////////////////////////////////////// char satnav_model(satnav, navLength); satnav_model:long_name = "Satellite Navigation Model"; char elem_dim(satnav, dimNameLength); elem_dim:long_name = "Element dimension name"; char line_dim(satnav, dimNameLength); line_dim:long_name = "Line dimension name"; char imc(satnav, imcLength); imc:long_name = "Image Motion Compensation (IMC) Identifier"; imc:gvar_name = "words 279 - 282"; float refLong(satnav); refLong:units = "radians"; refLong:long_name = "Reference longitude"; refLong:gvar_name = "words 295 - 298"; float refRadDist(satnav); refRadDist:units = "kilometers"; refRadDist:long_name = "Reference radial distance from nominal"; refRadDist:gvar_name = "words 299 - 302"; float refLat(satnav); refLat:units = "radians"; refLat:long_name = "Reference Latitude"; refLat:gvar_name = "words 303 - 306"; float refOrbYaw(satnav); refOrbYaw:units = "radians"; refOrbYaw:long_name = "Reference Orbit Yaw"; refOrbYaw:gvar_name = "words 307 - 310"; float roll(satnav); roll:units = "radians"; roll:long_name = "Reference Attitude: Roll"; roll:gvar_name = "words 311 - 314"; float pitch(satnav); pitch:units = "radians"; pitch:long_name = "Reference Attitude: Pitch"; pitch:gvar_name = "words 315 - 318"; float yaw(satnav); yaw:units = "radians"; yaw:long_name = "Reference Attitude: Yaw"; yaw:gvar_name = "words 319 - 322"; float imcEnableTime(satnav); imcEnableTime:units = "minutes"; imcEnableTime:long_name = "IMC set enable time from epoch"; imcEnableTime:gvar_name = "words 331 - 334"; float spCompRoll(satnav); spCompRoll:units = "minutes"; spCompRoll:long_name = "Spacecraft compensation: roll"; spCompRoll:gvar_name = "words 335 - 338"; float spCompPitch(satnav); spCompPitch:units = "minutes"; spCompPitch:long_name = "Spacecraft compensation: pitch"; spCompPitch:gvar_name = "words 339 - 342"; float spCompYaw(satnav); spCompYaw:units = "minutes"; spCompYaw:long_name = "Spacecraft compensation: yaw"; spCompYaw:gvar_name = "words 343 - 346"; float wa(satnav, sinOrbtYawTotal); wa:long_name = "Sine Orbit Yaw"; wa:gvar_name = "words 479 - 514"; float epochTimeDelay(satnav); epochTimeDelay:units = "minutes"; epochTimeDelay:long_name = "Exponential time delay from epoch"; epochTimeDelay:gvar_name = "words 519 - 522"; short eastWestCycles(satnav); eastWestCycles:units = "cycles"; eastWestCycles:long_name = "East West Cycles"; eastWestCycles:gvar_name = "IOFEC, words 6306"; short eastWestIncs(satnav); eastWestIncs:units = "increments"; eastWestIncs:long_name = "East West Increments"; eastWestIncs:gvar_name = "IOFEI, words 6309 - 6310"; short northSouthCycles(satnav); northSouthCycles:units = "cycles"; northSouthCycles:long_name = "North South Cycles"; northSouthCycles:gavr_name = "IOFNC, words 6305"; short northSouthIncs(satnav); northSouthIncs:units = "increments"; northSouthIncs:long_name = "North South Increments"; northSouthIncs:gvar_name = "IOFNI, words 6307 - 6308"; // GVAR Navigational Variables - in one chunk (converted to IEEE-754 // from Gould floating point system) byte orbitAttitude(satnav, orbitAttitudeLen); orbitAttitude:long_name = "Orbit and Attitude Info Block"; orbitAttitude:gvar_name = "words 279 - 1626"; //////////////////////////////////////////////////////////////////////////// // Navigational Variables - similar to WMO GRIB Standard //////////////////////////////////////////////////////////////////////////// char gridnav_model(gridnav, navLength); gridnav_model:long_name = "Grid Navigation Model"; char grid_type(gridnav, navLength); grid_type:long_name = "GRIB-1 grid type"; char grid_name(gridnav, navLength); grid_name:long_name = "grid name"; short grid_number(gridnav); grid_number:long_name = "GRIB-1 catalogued grid number"; long center_id(gridnav); center_id:long_name = "WMO centers table"; char x_dim(gridnav, dimNameLength); x_dim:long_name = "x dimension name"; char y_dim(gridnav, dimNameLength); y_dim:long_name = "y dimension name"; short Nx(gridnav); Nx:long_name = "Number of points along x-axis (columns)"; Nx:grib_name = "octet 7 - 8"; short Ny(gridnav); Ny:long_name = "Number of points along y-axis (rows or lines)"; Ny:grib_name = "octet 9 - 10"; float Lap(gridnav); Lap:long_name = "Latitude of sub-satellite point"; Lap:units = "radians"; Lap:grib_name = "octet 11 - 13"; float Lop(gridnav); Lop:long_name = "Longitude of sub-satellite point"; Lop:units = "radians"; Lop:grib_name = "octet 14 - 16"; byte resolution(gridnav); resolution:long_name = "Resolution"; byte component(gridnav); component:long_name = "Component"; // resCompFlag is a series of three flags. It has no units. // Bit 1: Direction increments flag // Bit 2: Earth Shape Flag (i.e. Spherical or oblate spheroid) // Bits 3 - 4: reserved (set to zero) // Bit 5: resolution of the u-v vector components // Bits 6 - 8: reserved (set to zero) byte resCompFlag(gridnav); resCompFlag:units = "WMO Resolution and Component Flag (GRIB Table 7)"; resCompFlag:long_name = "Resolution and Component Flag"; resCompFlag:grib_name = "octet 17"; float dx(gridnav); dx:long_name = "Apparent diameter of Earth in grid lengths"; dx:units = "meters"; dx:grib_name = "octet 18 - 20"; float dy(gridnav); dy:long_name = "Apparent diameter of Earth in grid lengths"; dy:units = "meters"; dy:grib_name = "octet 21 - 23"; float Xp(gridnav); Xp:long_name = "X-coordinate of sub-satellite point"; Xp:units = "degrees"; Xp:gvar_name = "SUBLA: words 175 - 178"; Xp:grib_name = "octet 24 - 25"; float Yp(gridnav); Yp:long_name = "Y-coordinate of sub-satellite point"; Yp:units = "degrees"; Yp:gvar_name = "SUBLO: words 179 - 182"; Yp:grib_name = "octet 26 - 27"; byte scanMode(gridnav); scanMode:units = "WMO Scan Mode Flag (GRIB Table 8)"; scanMode:long_name = "Scanning Mode"; scanMode:grib_name = "octet 28"; char scanModeStr(gridnav, scanModeLength); scanModeStr:units = "Description of image scanning method"; scanModeStr:long_name = "Satellite Scanning Mode String"; // Note: See also scanMode in GRIB section char orientation(gridnav); orientation:long_name = "Grid Orientation"; orientation:units = "millidegrees"; orientation:grib_name = "octet 29 - 31"; float Nr(gridnav); Nr:long_name = "Camera Altitude"; Nr:units = "Earth Equatorial Radii"; Nr:grib_name = "octet 32 - 34"; // Navigational Variables - Misc // Note: The apparent angular size of the Earth is: 2.0 * asin (1/Nr) [radians] // Calculated from equation: Rx = 2.0 * asin (1/Nr) / dx float Rx(gridnav); Rx:long_name = "Horizontal Angular Resolution"; Rx:units = "radians"; // Calculated from equation: Ry = 2.0 * asin (1/Nr) / dy float Ry(gridnav); Ry:long_name = "Vertical Angular Resolution"; Ry:units = "radians"; // Standard Supplementary Information :history = "Encoded into netCDF by NOAA/FSL from local GOES/GVAR feed"; :title = "GOES Satellite Image Data"; :Conventions = "NUWG"; :origin = "NOAA/ERL Forecast Systems Laboratory, Boulder, CO"; :version = 1.0; // 1st operational ed data: x_dim = "x"; y_dim = "y"; elem_dim = "x"; line_dim = "y"; // the navigation model names have yet to be set by NUWG these are // just ideas as to what they may look like satnav_model = "GOES-8 Kamel"; gridnav_model = "WMO GRIB Edition 1"; grid_type = "Orthographic Projection"; grid_name = "FSL CONUS C"; // for example, based on sector grid_number = 1; // not correct, just an example center_id = 59; }