[Dart-dev] [3901] DART/trunk/observations: Initial cut at an AIRS data-to-obs sequence file converter.

nancy at ucar.edu nancy at ucar.edu
Tue Jun 2 16:09:49 MDT 2009


An HTML attachment was scrubbed...
URL: http://mailman.ucar.edu/pipermail/dart-dev/attachments/20090602/994731da/attachment-0001.html 
-------------- next part --------------
Added: DART/trunk/observations/AIRS/AIRS.html
===================================================================
--- DART/trunk/observations/AIRS/AIRS.html	                        (rev 0)
+++ DART/trunk/observations/AIRS/AIRS.html	2009-06-02 22:09:49 UTC (rev 3901)
@@ -0,0 +1,220 @@
+<HTML>
+<HEAD>
+<TITLE>AIRS Observations</TITLE>
+<link rel="stylesheet" type="text/css" href="../doc/html/doc.css"></link> 
+</HEAD>
+<BODY>
+<!--
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+!!                                                                       !!
+!!                   GNU General Public License                          !!
+!!                                                                       !!
+!! This file is part of the Data Assimilation Research Testbed (DART).   !!
+!!                                                                       !!
+!! DART is free software; you can redistribute it and/or modify          !!
+!! it and are expected to follow the terms of the GNU General Public     !!
+!! License as published by the Free Software Foundation.                 !!
+!!                                                                       !!
+!! DART is distributed in the hope that it will be useful,               !!
+!! but WITHOUT ANY WARRANTY; without even the implied warranty of        !!
+!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         !!
+!! GNU General Public License for more details.                          !!
+!!                                                                       !!
+!! You should have received a copy of the GNU General Public License     !!
+!! along with DART; if not, write to:                                    !!
+!!          Free Software Foundation, Inc.                               !!
+!!          59 Temple Place, Suite 330                                   !!
+!!          Boston, MA  02111-1307  USA                                  !!
+!! or see:                                                               !!
+!!          http://www.gnu.org/licenses/gpl.txt                          !!
+!!                                                                       !!
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+-->
+
+<DIV ALIGN=CENTER>
+<A HREF="#Overview">OVERVIEW</A> / 
+<A HREF="#DataSources">DATA SOURCES</A> / 
+<A HREF="#Programs">PROGRAMS</A> /
+<A HREF="#KnownBugs">KNOWN BUGS</A> /
+<A HREF="#FuturePlans">FUTURE PLANS</A> 
+</DIV>
+
+<!--==================================================================-->
+
+<H1>AIRS Observations</H1>
+<A NAME="HEADER"></A>
+
+<!--==================================================================-->
+
+<A NAME="Overview"></A>
+<H2>OVERVIEW</H2>
+
+<P>
+The 
+<a href="http://airs.jpl.nasa.gov/">AIRS</a>
+instrument is an Atmospheric Infrared Sounder flying on the
+<a href="http://aqua.nasa.gov/">Aqua</a> spacecraft.
+Aqua is one of a group of satellites flying close together
+in a polar orbit, collectively known as the "A-train".
+The programs in this directory help to extract the
+data from the distribution files and put them into
+DART observation sequence (obs_seq) file format.
+</P>
+<P>
+AIRS data includes atmospheric temperature in the troposphere,
+derived moisture profiles, land and ocean surface temperatures,
+surface emmissivity, cloud fraction, cloud top height,
+and ozone burden in the atmosphere.
+</P>
+
+<!--==================================================================-->
+
+<A NAME="DataSources"></A>
+<BR><HR><BR>
+<H2>DATA SOURCES</H2>
+
+<P>
+Access to the web pages where the
+AIRS data are stored is available by
+<a href="http://airs.jpl.nasa.gov/data_products/get_AIRS_data/">registering</a>
+as a data user.
+</P>
+
+<P>
+More detailed information on the 
+<a href="http://disc.gsfc.nasa.gov/AIRS/airsL2_Std.shtml/">
+sounder data</a>
+is available.
+</P>
+
+<P>
+The data is distributed in
+<a href="http://www.hdfgroup.org/">HDF-4</a> format, using
+some additional conventions for metadata called
+<a href="http://hdfeos.org/software.php">HDF-EOS</a>.
+There is a basic library for accessing data in hdf files,
+and a variety of
+<a href="http://www.hdfgroup.org/products/index.html">generic tools</a>
+that work with hdf files.
+Besides the programs in this directory, a variety of
+<a href="http://disc.sci.gsfc.nasa.gov/AIRS/tools.shtml">specific tools</a>
+targeted at AIRS data are available to help read and browse the data.
+General information on using hdf in the earth sciences is available
+<a href="http://eosweb.larc.nasa.gov/HBDOCS/hdf.html">here</a>.
+</P>
+
+<P>
+Several types of AIRS data, with varying levels of processing, are available.
+The following descriptions are taken from the
+<a href="http://disc.sci.gsfc.nasa.gov/AIRS/documentation/v5_docs/AIRS_V5_Release_User_Docs/V5_Data_Release_UG.pdf">V5_Data_Release_UG</a> document:
+</P>
+
+<BLOCKQUOTE>
+<P>
+The L1B data product includes geolocated, calibrated observed microwave,
+infrared and visible/near infrared radiances, as well as Quality Assessment
+(QA) data.  The radiances are well calibrated; however, not all QA data have
+been validated.  Each product granule contains 6 minutes of data.  Thus there
+are 240 granules of each L1B product produced every day.
+</P>
+
+<P>
+The L2 data product includes geolocated, calibrated cloud-cleared radiances
+and 2-dimensional and 3-dimensional retrieved physical quantities (e.g.,
+surface properties and temperature, moisture, ozone, carbon monoxide and
+methane profiles throughout the atmosphere).  Each product granule contains 6
+minutes of data.  Thus there are 240 granules of each L2 product produced
+every day.
+</P>
+
+<P>
+The L3 data are created from the L2 data product by binning them in
+1&deg;x1&deg;
+grids.  There are three products: daily, 8-day and monthly.  Each product
+provides separate ascending (daytime) and descending (nighttime) binned data
+sets.
+</P>
+
+</BLOCKQUOTE>
+
+<P>
+The converter in this directory processes level 2 (L2) data files, using
+data set <tt>AIRS_DP</tt> and data product <tt>AIRX2RET.005</tt> without
+<tt>HSB</tt> (the instrument measuring humidity which failed).
+</P>
+
+<P>
+The *new* converter in this directory will handle this product:
+<br>
+The Atmospheric Infrared Sounder (AIRS) is a facility instrument aboard the second Earth Observing System (EOS) polar-orbiting platform, EOS Aqua. In combination with the Advanced Microwave Sounding Unit (AMSU) and the Humidity Sounder for Brazil (HSB), AIRS constitutes an innovative atmospheric sounding group of visible, infrared, and microwave sensors. AIRS data will be generated continuously. Global coverage will be obtained twice daily (day and night) on a 1:30pm sun synchronous orbit from a 705-km altitude.
+
+The AIRS Standard Retrieval Product consists of retrieved estimates of cloud and surface properties, plus profiles of retrieved temperature, water vapor, ozone, carbon monoxide and methane. Estimates of the errors associated with these quantities will also be part of the Standard Product. The temperature profile vertical resolution is 28 levels total between 1100 mb and 0.1 mb, while moisture profile is reported at 14 atmospheric layers between 1100 mb and 50 mb. The horizontal resolution is 50 km. An AIRS granule has been set as 6 minutes of data, 30 footprints cross track by 45 lines along track.
+
+(The Shortname for this product is AIRX2RET).
+</P>
+<!--==================================================================-->
+
+<A NAME="Programs"></A>
+<BR><HR><BR>
+<H2>PROGRAMS</H2>
+
+<P>
+The current procedure is to interactively select a group of data sets
+to download (the L2 data), which generates an ftp script that is
+downloaded and run to retrieve the individual data files.
+Once the data is on the local system, a matlab script converts the
+data into an ascii intermediate file, and then a second program converts
+the file into a second ascii intermediate file.  Finally a third program
+reads the ascii file and writes a DART obs_seq format file.
+Clearly, this process needs a couple tweeks - first, the download
+process needs to be completely automatable, and second, either 
+one or both of the ascii intermediate files could be bypassed 
+and a single fortran program could read the AIRS files and 
+write an obs_seq file directly.
+</P>
+
+<P>
+This directory contains a matlab script for reading the hdf files
+and converting them into an ascii intermediate file (read1.m or read2.m).
+Then sat.f90 reads the output of that and writes a second ascii intermediate
+file.  The create_real_obs, using the real_obs_mod.f90 in this dir, is
+used to convert to obs_seq format.
+</P>
+
+<!--==================================================================-->
+<!-- Describe the bugs.                                               -->
+<!--==================================================================-->
+
+<A NAME="KnownBugs"></A>
+<BR><HR><BR>
+<H2>KNOWN BUGS</H2>
+<P>
+</P>
+
+<!--==================================================================-->
+<!-- Descibe Future Plans.                                            -->
+<!--==================================================================-->
+
+<A NAME="FuturePlans"></A>
+<BR><HR><BR>
+<H2>FUTURE PLANS</H2>
+<P>
+</P>
+
+<BR><HR><BR>
+
+<!--==================================================================-->
+<TABLE summary="">
+<TR><TD>Contact:       </TD><TD> nancy collins </TD></TR>
+<TR><TD>Revision:      </TD><TD> $Revision: 3137 $ </TD></TR>
+<TR><TD>Source:        </TD><TD> $URL: http://subversion.ucar.edu/DAReS/DART/observations/observations.html $ </TD></TR>
+<TR><TD>Change Date:   </TD><TD> $Date: 2008-05-13 11:56:04 -0700 (Tue, 13 May 2008) $ </TD></TR>
+<TR><TD>Change history:</TD><TD> try "svn log" or "svn diff" </TD></TR>
+</TABLE>
+<!--==================================================================-->
+
+<!--==================================================================-->
+
+<HR>
+</BODY>
+</HTML>

Added: DART/trunk/observations/AIRS/airs_JPL_mod.f90
===================================================================
--- DART/trunk/observations/AIRS/airs_JPL_mod.f90	                        (rev 0)
+++ DART/trunk/observations/AIRS/airs_JPL_mod.f90	2009-06-02 22:09:49 UTC (rev 3901)
@@ -0,0 +1,2011 @@
+! adapted from original JPL code, example AIRS readers
+
+module airs_JPL_mod
+
+! the contents of this file are an amalgam of:
+!  airs_ret_typ.inc
+!  airs_ret_struct.inc
+!  airs_ret_rdr.f
+! although in several cases they were modified to use
+! fortran 90 derived types and free format continuation
+! lines, and to not use the unknown syntax 'double precision'.
+
+implicit none
+public
+
+      integer   AIRS_RET_GEOXTRACK                      
+      parameter(AIRS_RET_GEOXTRACK                      =    30)
+      integer   AIRS_RET_GEOTRACK                       
+      parameter(AIRS_RET_GEOTRACK                       =    45)
+      integer   AIRS_RET_STDPRESSURELEV                 
+      parameter(AIRS_RET_STDPRESSURELEV                 =    28)
+      integer   AIRS_RET_STDPRESSURELAY                 
+      parameter(AIRS_RET_STDPRESSURELAY                 =    28)
+      integer   AIRS_RET_AIRSXTRACK                     
+      parameter(AIRS_RET_AIRSXTRACK                     =     3)
+      integer   AIRS_RET_AIRSTRACK                      
+      parameter(AIRS_RET_AIRSTRACK                      =     3)
+      integer   AIRS_RET_CLOUD                          
+      parameter(AIRS_RET_CLOUD                          =     2)
+      integer   AIRS_RET_CHANAMSUA                      
+      parameter(AIRS_RET_CHANAMSUA                      =    15)
+      integer   AIRS_RET_CHANHSB                        
+      parameter(AIRS_RET_CHANHSB                        =     5)
+      integer   AIRS_RET_MWHINGESURF                    
+      parameter(AIRS_RET_MWHINGESURF                    =     7)
+      integer   AIRS_RET_H2OFUNC                        
+      parameter(AIRS_RET_H2OFUNC                        =    11)
+      integer   AIRS_RET_O3FUNC                         
+      parameter(AIRS_RET_O3FUNC                         =     9)
+      integer   AIRS_RET_COFUNC                         
+      parameter(AIRS_RET_COFUNC                         =     9)
+      integer   AIRS_RET_CH4FUNC                        
+      parameter(AIRS_RET_CH4FUNC                        =     7)
+      integer   AIRS_RET_HINGESURF                      
+      parameter(AIRS_RET_HINGESURF                      =   100)
+      integer   AIRS_RET_H2OPRESSURELEV                 
+      parameter(AIRS_RET_H2OPRESSURELEV                 =    15)
+      integer   AIRS_RET_H2OPRESSURELAY                 
+      parameter(AIRS_RET_H2OPRESSURELAY                 =    14)
+
+! Record holds an entire granule of airs_ret
+type airs_granule_type
+
+! Attributes
+        integer*2      NumSO2FOVs
+        character*256  processing_level
+        character*256  instrument
+        character*256  DayNightFlag
+        character*256  AutomaticQAFlag
+        integer      NumTotalData
+        integer      NumProcessData
+        integer      NumSpecialData
+        integer      NumBadData
+        integer      NumMissingData
+        integer      NumLandSurface
+        integer      NumOceanSurface
+        character*256  node_type
+        integer      start_year
+        integer      start_month
+        integer      start_day
+        integer      start_hour
+        integer      start_minute
+        real         start_sec
+        integer      start_orbit
+        integer      end_orbit
+        integer      orbit_path
+        integer      start_orbit_row
+        integer      end_orbit_row
+        integer      granule_number
+        integer      num_scansets
+        integer      num_scanlines
+        real*8       start_Latitude
+        real*8       start_Longitude
+        real*8       start_Time
+        real*8       end_Latitude
+        real*8       end_Longitude
+        real*8       end_Time
+        real           eq_x_longitude
+        real*8        eq_x_tai
+        integer        orbitgeoqa
+        integer*2      num_satgeoqa
+        integer*2      num_glintgeoqa
+        integer*2      num_moongeoqa
+        integer*2      num_ftptgeoqa
+        integer*2      num_zengeoqa
+        integer*2      num_demgeoqa
+        integer*2      num_fpe
+        integer*2      LonGranuleCen
+        integer*2      LatGranuleCen
+        integer*2      LocTimeGranuleCen
+        character*256  CO_first_guess
+        character*256  CH4_first_guess
+
+! Geolocation fields
+        real*8 Latitude(AIRS_RET_GEOXTRACK, &
+                                  AIRS_RET_GEOTRACK)
+        real*8 Longitude(AIRS_RET_GEOXTRACK, & 
+                                   AIRS_RET_GEOTRACK)
+        real*8 Time(AIRS_RET_GEOXTRACK,  &
+                              AIRS_RET_GEOTRACK)
+
+! Data Fields
+        integer*2      RetQAFlag( 30, 45)
+        real           satheight( 45)
+        real           satroll( 45)
+        real           satpitch( 45)
+        real           satyaw( 45)
+        integer        satgeoqa( 45)
+        integer*2      glintgeoqa( 45)
+        integer*2      moongeoqa( 45)
+        integer        ftptgeoqa( 30, 45)
+        integer*2      zengeoqa( 30, 45)
+        integer*2      demgeoqa( 30, 45)
+        real*8         nadirTAI( 45)
+        real*8         sat_lat( 45)
+        real*8         sat_lon( 45)
+        byte           scan_node_type( 45)
+        real           satzen( 30, 45)
+        real           satazi( 30, 45)
+        real           solzen( 30, 45)
+        real           solazi( 30, 45)
+        real           glintlat( 45)
+        real           glintlon( 45)
+        integer*2      sun_glint_distance( 30, 45)
+        real           topog( 30, 45)
+        real           topog_err( 30, 45)
+        real           landFrac( 30, 45)
+        real           landFrac_err( 30, 45)
+        real           pressStd( 28)
+        real           pressH2O( 15)
+        real           MWHingeSurfFreqGHz( 7)
+        real           latAIRS( 3, 3, 30, 45)
+        real           lonAIRS( 3, 3, 30, 45)
+        integer*2      Qual_Guess_PSurf( 30, 45)
+        real           PSurfStd( 30, 45)
+        integer        nSurfStd( 30, 45)
+        real           Press_mid_top_bndry( 30, 45)
+        integer*2      nStd_mid_top_bndry( 30, 45)
+        real           Press_bot_mid_bndry( 30, 45)
+        integer*2      nStd_bot_mid_bndry( 30, 45)
+        real           PBest( 30, 45)
+        real           PGood( 30, 45)
+        integer*2      nBestStd( 30, 45)
+        integer*2      nGoodStd( 30, 45)
+        integer*2      Qual_Temp_Profile_Top( 30, 45)
+        integer*2      Qual_Temp_Profile_Mid( 30, 45)
+        integer*2      Qual_Temp_Profile_Bot( 30, 45)
+        real           TAirStd( 28, 30, 45)
+        real           TAirStdErr( 28, 30, 45)
+        real           TSurfAir( 30, 45)
+        real           TSurfAirErr( 30, 45)
+        integer*2      Qual_Surf( 30, 45)
+        real           TSurfStd( 30, 45)
+        real           TSurfStdErr( 30, 45)
+        integer*2      numHingeSurf( 30, 45)
+        real           freqEmis( 100, 30, 45)
+        real           emisIRStd( 100, 30, 45)
+        real           emisIRStdErr( 100, 30, 45)
+        integer*2      Qual_MW_Only_Temp_Strat( 30, 45)
+        integer*2      Qual_MW_Only_Temp_Tropo( 30, 45)
+        real           TAirMWOnlyStd( 28, 30, 45)
+        byte           MWSurfClass( 30, 45)
+        real           sfcTbMWStd( 7, 30, 45)
+        real           EmisMWStd( 7, 30, 45)
+        real           EmisMWStdErr( 7, 30, 45)
+        integer*2      Qual_MW_Only_H2O( 30, 45)
+        real           totH2OMWOnlyStd( 30, 45)
+        integer*2      Qual_H2O( 30, 45)
+        real           H2OMMRStd( 14, 30, 45)
+        real           H2OMMRStdErr( 14, 30, 45)
+        real           totH2OStd( 30, 45)
+        real           totH2OStdErr( 30, 45)
+        real           H2OMMRSat( 14, 30, 45)
+        real           H2OMMRSat_liquid( 14, 30, 45)
+        integer*2      num_H2O_Func( 30, 45)
+        real           H2O_verticality( 11, 30, 45)
+        integer*2      Qual_O3( 30, 45)
+        real           totO3Std( 30, 45)
+        real           totO3StdErr( 30, 45)
+        real           O3VMRStd( 28, 30, 45)
+        real           O3VMRStdErr( 28, 30, 45)
+        integer*2      num_O3_Func( 30, 45)
+        real           O3_verticality( 9, 30, 45)
+        integer*2      Qual_CO( 30, 45)
+        real           CO_total_column( 30, 45)
+        integer*2      num_CO_Func( 30, 45)
+        integer        CO_trapezoid_layers( 9)
+        real           CO_eff_press( 9, 30, 45)
+        real           CO_VMR_eff( 9, 30, 45)
+        real           CO_VMR_eff_err( 9, 30, 45)
+        real           CO_verticality( 9, 30, 45)
+        real           CO_dof( 30, 45)
+        integer*2      Qual_CH4( 30, 45)
+        real           CH4_total_column( 30, 45)
+        integer*2      num_CH4_Func( 30, 45)
+        integer        CH4_trapezoid_layers( 7)
+        real           CH4_eff_press( 7, 30, 45)
+        real           CH4_VMR_eff( 7, 30, 45)
+        real           CH4_VMR_eff_err( 7, 30, 45)
+        real           CH4_verticality( 7, 30, 45)
+        real           CH4_dof( 30, 45)
+        real           PTropopause( 30, 45)
+        real           T_Tropopause( 30, 45)
+        real           GP_Tropopause( 30, 45)
+        real           GP_Height( 28, 30, 45)
+        real           GP_Height_MWOnly( 28, 30, 45)
+        real           GP_Surface( 30, 45)
+        integer*2      Qual_Cloud_OLR( 30, 45)
+        integer        numCloud( 30, 45)
+        real           TCldTopStd( 2, 30, 45)
+        real           TCldTopStdErr( 2, 30, 45)
+        real           PCldTopStd( 2, 30, 45)
+        real           PCldTopStdErr( 2, 30, 45)
+        real           CldFrcStd( 2, 3, 3, 30, 45)
+        real           CldFrcStdErr( 2, 3, 3, 30, 45)
+        real           olr( 30, 45)
+        real           olr_err( 30, 45)
+        integer*2      Qual_clrolr( 30, 45)
+        real           clrolr( 30, 45)
+        real           clrolr_err( 30, 45)
+        integer*2      dust_flag( 3, 3, 30, 45)
+        integer*2      spectral_clear_indicator( 3, 3, 30, 45)
+        integer*2      num_clear_spectral_indicator( 30, 45)
+        real           CC_noise_eff_amp_factor( 30, 45)
+        real           CC1_noise_eff_amp_factor( 30, 45)
+        real           totCldH2OStd( 30, 45)
+        real           totCldH2OStdErr( 30, 45)
+        real           CC1_Resid( 30, 45)
+        real           CCfinal_Resid( 30, 45)
+        real           CCfinal_Noise_Amp( 30, 45)
+        real           Tdiff_IR_MW_ret( 30, 45)
+        real           Tdiff_IR_4CC1( 30, 45)
+        real           TSurfdiff_IR_4CC1( 30, 45)
+        real           TSurfdiff_IR_4CC2( 30, 45)
+        real           AMSU_Chans_Resid( 30, 45)
+        real           TotCld_4_CCfinal( 30, 45)
+        real           Surf_Resid_Ratio( 30, 45)
+        real           Temp_Resid_Ratio( 30, 45)
+        real           Water_Resid_Ratio( 30, 45)
+        real           Cloud_Resid_Ratio( 30, 45)
+        real           O3_Resid_Ratio( 30, 45)
+        real           CO_Resid_Ratio( 30, 45)
+        real           CH4_Resid_Ratio( 30, 45)
+        real           MWCheck_Resid_Ratio( 30, 45)
+        real           O3_dof( 30, 45)
+        byte           all_spots_avg( 30, 45)
+        byte           MW_ret_used( 30, 45)
+        real           Initial_CC_score( 30, 45)
+        byte           retrieval_type( 30, 45)
+        byte           Startup( 30, 45)
+END type airs_granule_type
+
+
+contains
+
+! This function is autogenerated by the mkezio program to read
+! an AIRS swath of type "L2_Standard_atmospheric&surface_product" from file given by the
+! file_name argument into a buffer pointed to by the airs_ret_gran
+! argument.  The caller owns the buffer.  The entire granule
+! is read -- every attribute and field, the whole lat/lon/time
+! extent.
+!
+! Errors opening the file, etc. are fatal and cause STOP.
+! Problems reading individual attributes or fields are reported to
+! the console but do not interrupt program flow.
+
+      subroutine airs_ret_rdr(file_name, airs_ret_gran)
+      character(len=*), intent(in) :: file_name(:)
+      type(airs_granule_type) :: airs_ret_gran
+
+      integer statn           ! HDF-EOS status. 0 for success
+      integer fid             ! HDF-EOS file ID
+      integer swid            ! HDF-EOS swath ID
+      integer nchar           ! Number of characters
+      character*256 swathname   ! Name of swath
+      integer nswath          ! Number of swaths
+      integer start(10) /0,0,0,0,0, 0,0,0,0,0/
+                                ! start of each dimensions for Swath I/O
+                                ! 0 => start with first element
+      integer stride(10)/1,1,1,1,1, 1,1,1,1,1/
+                                ! stride of each dimensions for Swath I/O
+                                ! 1 => use every element
+      integer edge(10)        ! size of each dimension for swath I/O
+                                ! will be set for each individual read
+      integer swopen, swinqswath, swattach
+      integer swrdfld, swrdattr
+      integer swdetach, swclose
+
+      fid = swopen(file_name, 1)
+      if (fid .eq. -1) then
+        print *, "Error ", fid, " opening file ", file_name
+        stop
+      end if
+
+      ! Get name of swath(s)
+      nswath = swinqswath(file_name, swathname, nchar)
+      if (nswath .ne. 1) then
+        print *, "swinqswath found ", nswath, " swaths for file ", &
+                 file_name, " Need exactly 1"
+        stop
+      end if
+
+      ! There's exactly one swath.  Make sure it is the right one.
+      if (swathname .ne. &
+         'L2_Standard_atmospheric&surface_product') then
+        print *, "Error: bad swath name ", swathname, " in file ", &
+                 file_name
+        print *, "Expected L2_Standard_atmospheric&surface_product"
+        stop
+      end if
+
+      ! Attach to (open) the one swath.
+      swid = swattach(fid, swathname)
+      if (swid .eq. -1) then
+        print *, "Failed to attach to swath ", swathname, &
+                 " in file ", file_name
+        stop
+      end if
+
+! Attributes
+      statn = swrdattr(swid, "NumSO2FOVs", &
+                   airs_ret_gran.NumSO2FOVs)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumSO2FOVs"
+
+      statn = swrdattr(swid, "processing_level", &
+                         airs_ret_gran%processing_level)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "processing_level"
+
+      statn = swrdattr(swid, "instrument", &
+                         airs_ret_gran%instrument)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "instrument"
+
+      statn = swrdattr(swid, "DayNightFlag", &
+                         airs_ret_gran.DayNightFlag)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "DayNightFlag"
+
+      statn = swrdattr(swid, "AutomaticQAFlag", &
+                         airs_ret_gran.AutomaticQAFlag)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "AutomaticQAFlag"
+
+      statn = swrdattr(swid, "NumTotalData", &
+                   airs_ret_gran.NumTotalData)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumTotalData"
+
+      statn = swrdattr(swid, "NumProcessData", &
+                   airs_ret_gran.NumProcessData)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumProcessData"
+
+      statn = swrdattr(swid, "NumSpecialData", &
+                   airs_ret_gran.NumSpecialData)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumSpecialData"
+
+      statn = swrdattr(swid, "NumBadData", &
+                   airs_ret_gran.NumBadData)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumBadData"
+
+      statn = swrdattr(swid, "NumMissingData", &
+                   airs_ret_gran.NumMissingData)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumMissingData"
+
+      statn = swrdattr(swid, "NumLandSurface", &
+                   airs_ret_gran.NumLandSurface)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumLandSurface"
+
+      statn = swrdattr(swid, "NumOceanSurface", &
+                   airs_ret_gran.NumOceanSurface)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "NumOceanSurface"
+
+      statn = swrdattr(swid, "node_type", &
+                         airs_ret_gran%node_type)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "node_type"
+
+      statn = swrdattr(swid, "start_year", &
+                   airs_ret_gran%start_year)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_year"
+
+      statn = swrdattr(swid, "start_month", &
+                   airs_ret_gran%start_month)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_month"
+
+      statn = swrdattr(swid, "start_day", &
+                   airs_ret_gran%start_day)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_day"
+
+      statn = swrdattr(swid, "start_hour", &
+                   airs_ret_gran%start_hour)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_hour"
+
+      statn = swrdattr(swid, "start_minute", &
+                   airs_ret_gran%start_minute)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_minute"
+
+      statn = swrdattr(swid, "start_sec", &
+                   airs_ret_gran%start_sec)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_sec"
+
+      statn = swrdattr(swid, "start_orbit", &
+                   airs_ret_gran%start_orbit)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_orbit"
+
+      statn = swrdattr(swid, "end_orbit", &
+                   airs_ret_gran%end_orbit)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "end_orbit"
+
+      statn = swrdattr(swid, "orbit_path", &
+                   airs_ret_gran%orbit_path)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "orbit_path"
+
+      statn = swrdattr(swid, "start_orbit_row", &
+                   airs_ret_gran%start_orbit_row)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_orbit_row"
+
+      statn = swrdattr(swid, "end_orbit_row", &
+                   airs_ret_gran%end_orbit_row)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "end_orbit_row"
+
+      statn = swrdattr(swid, "granule_number", &
+                   airs_ret_gran%granule_number)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "granule_number"
+
+      statn = swrdattr(swid, "num_scansets", &
+                   airs_ret_gran%num_scansets)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_scansets"
+
+      statn = swrdattr(swid, "num_scanlines", &
+                   airs_ret_gran%num_scanlines)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_scanlines"
+
+      statn = swrdattr(swid, "start_Latitude", &
+                   airs_ret_gran%start_Latitude)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_Latitude"
+
+      statn = swrdattr(swid, "start_Longitude", &
+                   airs_ret_gran%start_Longitude)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_Longitude"
+
+      statn = swrdattr(swid, "start_Time", &
+                   airs_ret_gran%start_Time)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "start_Time"
+
+      statn = swrdattr(swid, "end_Latitude", &
+                   airs_ret_gran%end_Latitude)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "end_Latitude"
+
+      statn = swrdattr(swid, "end_Longitude", &
+                   airs_ret_gran%end_Longitude)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "end_Longitude"
+
+      statn = swrdattr(swid, "end_Time", &
+                   airs_ret_gran%end_Time)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "end_Time"
+
+      statn = swrdattr(swid, "eq_x_longitude", &
+                   airs_ret_gran%eq_x_longitude)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "eq_x_longitude"
+
+      statn = swrdattr(swid, "eq_x_tai", &
+                   airs_ret_gran%eq_x_tai)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "eq_x_tai"
+
+      statn = swrdattr(swid, "orbitgeoqa", &
+                   airs_ret_gran%orbitgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "orbitgeoqa"
+
+      statn = swrdattr(swid, "num_satgeoqa", &
+                   airs_ret_gran%num_satgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_satgeoqa"
+
+      statn = swrdattr(swid, "num_glintgeoqa", &
+                   airs_ret_gran%num_glintgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_glintgeoqa"
+
+      statn = swrdattr(swid, "num_moongeoqa", &
+                   airs_ret_gran%num_moongeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_moongeoqa"
+
+      statn = swrdattr(swid, "num_ftptgeoqa", &
+                   airs_ret_gran%num_ftptgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_ftptgeoqa"
+
+      statn = swrdattr(swid, "num_zengeoqa", &
+                   airs_ret_gran%num_zengeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_zengeoqa"
+
+      statn = swrdattr(swid, "num_demgeoqa", &
+                   airs_ret_gran%num_demgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_demgeoqa"
+
+      statn = swrdattr(swid, "num_fpe", &
+                   airs_ret_gran%num_fpe)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "num_fpe"
+
+      statn = swrdattr(swid, "LonGranuleCen", &
+                   airs_ret_gran.LonGranuleCen)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "LonGranuleCen"
+
+      statn = swrdattr(swid, "LatGranuleCen", &
+                   airs_ret_gran.LatGranuleCen)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "LatGranuleCen"
+
+      statn = swrdattr(swid, "LocTimeGranuleCen", &
+                   airs_ret_gran.LocTimeGranuleCen)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "LocTimeGranuleCen"
+
+      statn = swrdattr(swid, "CO_first_guess", &
+                         airs_ret_gran.CO_first_guess)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "CO_first_guess"
+
+      statn = swrdattr(swid, "CH4_first_guess", &
+                         airs_ret_gran.CH4_first_guess)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading attribute ", &
+                  "CH4_first_guess"
+
+
+! Geolocation fields
+      edge(1) = AIRS_RET_GEOXTRACK
+      edge(2) = AIRS_RET_GEOTRACK
+      statn = swrdfld(swid, "Latitude", start, stride, edge, &
+                      airs_ret_gran.Latitude)
+      if (statn .ne. 0)  &
+        print *, "Error ", statn, " reading field Latitude"
+
+      statn = swrdfld(swid, "Longitude", start, stride, edge, &
+                      airs_ret_gran.Longitude)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field Longitude"
+
+      statn = swrdfld(swid, "Time", start, stride, edge, &
+                      airs_ret_gran.Time)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field Time"
+
+
+! Data Fields
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "RetQAFlag", &
+                   start, stride, edge, &
+                   airs_ret_gran.RetQAFlag)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "RetQAFlag"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "satheight", &
+                   start, stride, edge, &
+                   airs_ret_gran%satheight)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satheight"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "satroll", &
+                   start, stride, edge, &
+                   airs_ret_gran%satroll)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satroll"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "satpitch", &
+                   start, stride, edge, &
+                   airs_ret_gran%satpitch)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satpitch"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "satyaw", &
+                   start, stride, edge, &
+                   airs_ret_gran%satyaw)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satyaw"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "satgeoqa", &
+                   start, stride, edge, &
+                   airs_ret_gran%satgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satgeoqa"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "glintgeoqa", &
+                   start, stride, edge, &
+                   airs_ret_gran%glintgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "glintgeoqa"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "moongeoqa", &
+                   start, stride, edge, &
+                   airs_ret_gran%moongeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "moongeoqa"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "ftptgeoqa", &
+                   start, stride, edge, &
+                   airs_ret_gran%ftptgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "ftptgeoqa"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "zengeoqa", &
+                   start, stride, edge, &
+                   airs_ret_gran%zengeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "zengeoqa"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "demgeoqa", &
+                   start, stride, edge, &
+                   airs_ret_gran%demgeoqa)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "demgeoqa"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "nadirTAI", &
+                   start, stride, edge, &
+                   airs_ret_gran%nadirTAI)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "nadirTAI"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "sat_lat", &
+                   start, stride, edge, &
+                   airs_ret_gran%sat_lat)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "sat_lat"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "sat_lon", &
+                   start, stride, edge, &
+                   airs_ret_gran%sat_lon)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "sat_lon"
+
+      edge(1) = 45
+      statn = SWrdfld(swid, "scan_node_type", &
+                   start, stride, edge, &
+                   airs_ret_gran%scan_node_type)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "scan_node_type"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "satzen", &
+                   start, stride, edge, &
+                   airs_ret_gran%satzen)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satzen"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "satazi", &
+                   start, stride, edge, &
+                   airs_ret_gran%satazi)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "satazi"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "solzen", &
+                   start, stride, edge, &
+                   airs_ret_gran%solzen)
+      if (statn .ne. 0) &
+        print *, "Error ", statn, " reading field ", &
+                  "solzen"
+
+      edge(2) = 45
+      edge(1) = 30
+      statn = SWrdfld(swid, "solazi", &
+                   start, stride, edge, &
+                   airs_ret_gran%solazi)
+      if (statn .ne. 0) &

@@ Diff output truncated at 40000 characters. @@


More information about the Dart-dev mailing list