[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°x1°
+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