AMSU-A Sample Read Program
/* $Id$ */
/*****************************************************************************/
/* Name: amsuareader.c - Read AMSU-A swath data in HDF-EOS format */
/* */
/* Usage: amsuareader filename [N] */
/* filename - Name of AMSU-A data file */
/* N - Scan line to read, 1-#scans in file */
/* */
/* Description: */
/* Read the Nth scan line from the given file, or the first if "N" is */
/* not specified. This file contains the following routines: */
/* */
/* main - Main program */
/* */
/* Notes: */
/* Makes a lot of assumptions about the file's format. */
/* */
/* Revision history: */
/* 99-02-10 BEB Written */
/* 00-08-07 BEB Updated to new format */
/*****************************************************************************/
#include <stdio.h>
#include <strings.h>
#include <stdlib.h>
#include <df.h>
#include <HdfEosDef.h>
#include "SDP_Utilities.h"
#define XTRACK 30 /* Cross-track dimension */
#define NDATAS 15 /* Number of data fields */
/* Static data */
static float64 Time; /* Time value */
static float32 Latitude[XTRACK]; /* Latitude values */
static float32 Longitude[XTRACK]; /* Longitude values */
static float32 Data[NDATAS][XTRACK]; /* Data values */
/* Data field names */
static char *Datanames[NDATAS] = {
"23800.37 MHz",
"31400.42 MHz",
"50299.91 MHz",
"52799.39 MHz",
"53595.41 +- 115 MHz",
"54399.53 MHz",
"54940.64 MHz",
"55498.70 MHz",
"57290.33 MHz",
"57290.33 +- 217 MHz",
"57290.33 +- 322.2 +- 48 MHz",
"57290.33 +- 322.2 +- 22 MHz",
"57290.33 +- 322.2 +- 10 MHz",
"57290.33 +- 322.2 +- 4.5 MHz",
"88997.00 MHz"
};
/* Local functions */
static int readAMSUA(char *name, int n);
static void writeAMSUA(int n);
/*---------------------------------------------------------------------------*/
/* Name: main - Main program for AMSU-A reader */
/* */
/* Usage: int result = main(int argc, char *argv[]); */
/* argc - Count of arguments */
/* argv - Array of arguments */
/* result - Exit status */
/* */
/* Description: */
/* Parse the command-line arguments and pass them to the reader. */
/* */
/* Notes: */
/* None. */
/* */
/* Revision history: */
/* 99-02-10 BEB Written */
/*---------------------------------------------------------------------------*/
int
main(int argc, char *argv[]) {
int n; /* Desired scan number */
/* Check the calling sequence */
if (argc < 2 || argc > 3) {
printf("Usage is amsuareader filename [N]\n");
return (0);
}
/* Get the scan number, if any */
if (argc == 3) {
if (sscanf(argv[2], "0", &n) != 1 || n < 1) {
printf("Scan number is invalid\n");
return (1);
}
} else {
n = 1;
}
/* Call the reader */
if (readAMSUA(argv[1], n) != 0)
return (1);
/* Display the results */
writeAMSUA(n);
return (0);
}
/*---------------------------------------------------------------------------*/
/* Name: readAMSUA - Read one scan line of AMSU-A data */
/* */
/* Usage: int result = readAMSUA(char *name, int n); */
/* name - Name of file to read */
/* n - Number of scan line */
/* result - Non-zero on errors */
/* */
/* Description: */
/* Read scan line "n" (1-#scans) from "name" and store it into the */
/* global variables. */
/* */
/* Notes: */
/* None. */
/* */
/* Revision history: */
/* 99-02-10 BEB Written */
/*---------------------------------------------------------------------------*/
static int
readAMSUA(char *name, int n) {
int32 fid; /* File identifier */
int32 swid; /* Swath identifier */
int32 size; /* Size of things */
int32 start[2]; /* Start index array */
int32 edge[2]; /* Edge count array */
int f; /* Loop counter */
char swname[64]; /* Swath name */
/* Open the file */
if ((fid = SWopen(name, DFACC_READ)) == -1) {
printf("Unable to open '' for reading", name);
return (-1);
}
/* Retrieve the name of the swath within the file */
if (SWinqswath(name, swname, &size) != 1) {
printf("Wrong number of swath objects in ''\n", name);
return (-1);
}
/* Attach to the swath */
if ((swid = SWattach(fid, swname)) == -1) {
printf("Unable to attach to ''\n", swname);
return (-1);
}
/* See how many scan lines in this file */
if ((size = SWdiminfo(swid, "Track")) == -1) {
printf("Unable to determine the value of 'Track'\n");
return (-1);
}
/* Check the user's value */
if (n > size) {
printf("Sorry, there are only 0 scans in this file\n", size);
return (-1);
}
/* Read in the data */
start[0] = n - 1;
edge[0] = 1;
start[1] = 0;
edge[1] = XTRACK;
if (SWreadfield(swid, "Time", start, NULL, edge, &Time) != 0) {
printf("Error reading 'Time' value\n");
return (-1);
}
if (SWreadfield(swid, "Latitude", start, NULL, edge, Latitude) != 0) {
printf("Error reading 'Latitude' values\n");
return (-1);
}
if (SWreadfield(swid, "Longitude", start, NULL, edge, Longitude) != 0) {
printf("Error reading 'Longitude' values\n");
return (-1);
}
for (f = 0; f < NDATAS; f++) {
if (SWreadfield(swid, Datanames[f], start, NULL, edge, Data[f]) != 0) {
printf("Error reading '' values\n", Datanames[f]);
return (-1);
}
}
/* All OK */
(void) SWdetach(swid);
(void) SWclose(fid);
return (0);
}
/*---------------------------------------------------------------------------*/
/* Name: writeAMSUA - Output data from globals */
/* */
/* Usage: writeAMSUA(int n); */
/* n - Scan number */
/* */
/* Description: */
/* Display the data assembled in the global variables. */
/* */
/* Notes: */
/* None. */
/* */
/* Revision history: */
/* 99-02-10 BEB Written */
/*---------------------------------------------------------------------------*/
static void
writeAMSUA(int n) {
char utc[28]; /* Time stamp */
int i; /* Local index */
int f; /* Local index */
/* Convert the TAI value to UTC */
(void) SDP_TD_TAItoUTC((float64) Time, utc);
/* Write out the first line */
printf("Scan 0 at \n\n", n, utc);
/* Header */
printf(" Field 1 Field 2 Field 3 Field 4 Field 5\n");
printf(" Field 6 Field 7 Field 8 Field 9 Field 10\n");
printf(" Lat. Lon. Field 11 Field 12 Field 13 Field 14 Field 15\n");
printf("-- ------ ------- -------- -------- -------- -------- --------\n");
/* Loop through the data */
for (i = 0; i < XTRACK; i++) {
printf(" 0", i + 1);
printf(" 0.00", Latitude[i]);
printf(" 0.00", Longitude[i]);
for (f = 0; f < NDATAS; f++) {
if (f > 0 && f % 5 == 0)
printf("\n ");
printf(" 0.00", Data[i][f]);
}
printf("\n");
}
}