GAMAP INTERNALS routines in *

All GAMAP Routines

List routines by category:
Atmospheric Sciences | Benchmarking | Color | Date/Time | Doc | File & I/O | BPCH Format | Scientific Data Formats | GAMAP Examples | GAMAP Internals | GAMAP Utilities | GAMAP Data Manipulation | GAMAP Models & Grids | GAMAP Plotting | General | Graphics | Math & Units | Plotting | Regridding | Strings | Structures | Time Series

List routines by alphabetical order:
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

Last modified: Tue Apr 4 10:50:22 2017.


List of Routines


Routine Descriptions

ADJ_INDEX

[Next Routine] [List of Routines]
 NAME:
        ADJ_INDEX

 PURPOSE:
        Adjusts CTM global index arrays for a particular
        data-block dimension from global size to window size.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        NEWINDEX = ADJ_INDEX( OLDINDEX, N_SUBTRACT, MAXINDEX )

 INPUTS:
        OLDINDEX -> The globally sized CTM index array to be adjusted.

        N_SUBTRACT -> The number to subtract from each element
             of OLDINDEX.  

        MAXINDEX -> The maximum number of elements that OLDINDEX
             can have.  

 KEYWORD PARAMETERS:
        None

 OUTPUTS:
        ADJ_INDEX returns the window-sized index array as
        the value of the function.

 SUBROUTINES:
        None

 REQUIREMENTS:
        None.
            
 NOTES:
        Designed for use with GAMAP, but can be used for more
        general purpose applications as well.

 EXAMPLE:
       WE     = [ 69, 70, 71, 0, 1, 2 ]     ; WE straddles the date line
       WE_ADJ = ADJ_INDEX( WE, 69, 72 )   
       print, WE_ADJ
         0       1       2       3       4       5
       NEWDATA = DATA[ WE_ADJ, *, * ]

       ; WE has a possible maximum of 72 elements.  Convert WE
       ; from global size to window size by subtracting 69 
       ; from each element of WE.  Use WE_ADJ to reference
       ; elements of the DATA array.

 MODIFICATION HISTORY:
        bmy, 19 Feb 1999: VERSION 1.00
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/adj_index.pro)


CREATE3DFSTRU

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CREATE3DFSTRU

 PURPOSE:
        Creates an empty GAMAP fileinfo structure or an array
        of such structures. These are used to hold information
        about CTM data files.

 CATEGORY:
        GAMAP Internals, Structures

 CALLING SEQUENCE:
        FILEINFO = CREATE3DHSTRU( [Elements] )

 INPUTS:
        ELEMENTS -> Number of individual structures to
             be contained in the array of structures. Default
             is 1, i.e. return a single structure.

 KEYWORD PARAMETERS:
        None

 OUTPUTS:
        A fileinfo structure or an array of fileinfo structures.

 SUBROUTINES:
        None

 REQUIREMENTS:
        None

 NOTES:
        See comments in code below for structure field descriptions.

 EXAMPLES:
        FILEINFO = CREATE3DFSTRU()
            ; returns a single structure which will hold
            ; info about CTM punch file data.

        FILEINFO = CREATE3DFSTRU( 20 )
            ; returns an 20 element array of structures 
            ; which will hold info about 20 records from a 
            ; CTM data file

 MODIFICATION HISTORY:
        mgs, 14 Aug 1998: VERSION 1.00
        bmy, 18 May 2007: GAMAP VERSION 2.06
                          - added standard doc header
                          - updated comments, cosmetic changes
 MODIFICATION HISTORY:
        bmy, 19 Feb 1999: VERSION 1.00
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/create3dfstru.pro)


CREATE3DHSTRU

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CREATE3DHSTRU

 PURPOSE:
        Creates an empty GAMAP datainfo structure or an array
        of such structures. These are used to hold information
        about individual data blocks from CTM data files.

 CATEGORY:
        GAMAP Internals, Structures

 CALLING SEQUENCE:
        DATAINFO = CREATE3DHSTRU( [Elements] )

 INPUTS:
        ELEMENTS -> Number of individual structures to be contained 
             in the array of structures. Default is 1, (i.e. return
             a single structure).

 KEYWORD PARAMETERS:
        None

 OUTPUTS:
        A datainfo structure or an array of datainfo structures.

 SUBROUTINES:
        None

 REQUIREMENTS:
        None

 NOTES:
        See comments in code below for structure field descriptions.

 EXAMPLES:
        DATAINFO = CREATE3DHSTRU()
            ; returns a single structure which will hold
            ; info about CTM punch file data.

        DATAINFO = CREATE3DHSTRU( 20 )
            ; returns an 20 element array of structures 
            ; which will hold info about 20 records from a 
            ; CTM data file

 MODIFICATION HISTORY:
        mgs, 14 Aug 1998: VERSION 1.00
        mgs, 10 Nov 1998: - changed default filepos to -1L and scale to 1
        bmy, 08 Feb 1999: VERSION 1.10
                          - changed TAU0, TAU1 from longword to double
                          - added OFFSET field for I0, J0, L0
        bmy, 17 Feb 1999: VERSION 1.20
                          - changed OFFSET field to FIRST since we
                            are storing the I, J, L indices of the 
                            first 
        mgs, 16 Mar 1999: - cosmetic changes
        bmy, 03 Jan 2000: VERSION 1.44
                          - updated comments
        bmy, 26 Apr 2000: VERSION 1.45
                          - TRACER now carries a longword variable
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
        phs, 02 Dec 2008: GAMAP VERSION 2.13
                          - DIM tag is 32-bit integer (LONG) now
        bmy, 23 Feb 2012: GAMAP VERSION 2.16
                          - Now make FILEPOS a LONG64 variable, in
                            order to read files larger than 2.4 GB
                          - Now make FIRST an array of LONG variables

(See /n/home09/ryantosca/IDL/gamap2/internals/create3dhstru.pro)


CTM_DOSELECT_DATA (FUNCTION)

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_DOSELECT_DATA (function)

 PURPOSE:
        Return indices for data blocks that match specific
        criteria.  This is an internal routine which is called
        by CTM_GET_DATA.  

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        INDEX = CTM_DOSELECT_DATA( DIAGN, USE_DATAINFO [, keywords ] )

 INPUTS:
        CATEGORY -> A string or string array with category names
            to search for. Multilevel categories can be expanded to
            a string array with the EXPAND_CATEGORY function.
            Usually, CTM_DOSELECT_DATA should be called with only
            one "logical" category at the time, i.e. only for
            multilevel diagnostics should it contain more than one
            element. Otherwise, the tracer offset may be wrong.

        USE_DATAINFO -> A valid DataInfo structure. No error checking 
            is performed.

        Both parameters are mandatory.

 KEYWORD PARAMETERS:
        ILUN -> A logical unit value or an array of logical unit
            values. Only records from corresponding files will be 
            returned. If ILUN is an undefined variable, information
            about all previously opened files will be returned,
            and ILUN will contain all logical unit numbers that 
            match the selection criteria.

        TRACER -> A tracer number or an array of tracer numbers to
            restrict the selection of data records. Default is to
            return information about all tracers.
            Tracer numbers less than 100 are automatically expanded
            to include the offset of certain diagnostics (see
            keyword TRCOFFSET and routine CTM_DIAGINFO). If TRACER is
            an undefined variable, all tracers that match the selection 
            criteria are returned.

        TRCOFFSET -> A tracer offset (multiple of 100) that will be
            added to TRACER. The search is performed for both,
            TRACER and TRACER+TRCOFFSET. (for tracer offsets see
            routine CTM_DIAGINFO and file diaginfo.dat)
 
        TAU -> A time value (tau0 !) or an array of time values
            to restrict the selection of data records. Default is to
            return information about all time steps. If TAU is an
            undefined variable, it will return all time steps that
            match the selection criteria.

        STATUS -> Restricts the data selection to
            Data that has not been read  (STATUS = 0)
            Data that has been read      (STATUS = 1)
            All data blocks              (STATUS = 2, default)
            If STATUS is 1, all pointers returned in DATA are tested
            for validity. Status will automatically be restricted 
            to range 0..1

        COUNT -> A named variable that will return the number of
            data blocks found with the given selection criteria

        MISSING -> If no records were found that match the selection 
            criteria, MISSING will return a string array with the 
            items that could not be matched (e.g. ['TRACER','ILUN']).
            If records were found, MISSING returns an empty string.

        SPACING -> Passes to CTM_DOSELECT_DATA the spacing between
            diagnostic offsets listed in "diaginfo.dat".  

 OUTPUTS:
        The function returns an (long) integer array that contains
        index values to all the data blocks that match the selection
        criteria. If no data is found, -1L is returned.

 SUBROUTINES:
        Uses IS_SELECTED function

 REQUIREMENTS:
        None

 NOTES:
        None

 EXAMPLE:
        See CTM_SELECT_DATA and CTM_READ_DATA source codes.

 MODIFICATION HISTORY:
        mgs, 19 Aug 1998: VERSION 1.00
        mgs, 07 Oct 1998: - added DEBUG keyword
        mgs, 22 Oct 1998: - now filters ilun, tracer, and tau
                            after finding matching records. This
                            was necessary to find the correct first
                            or last time step in CTM_GET_DATA.
                            Needs some more testing whether there are
                            side effects when TAU0 and ILUN or TRACER
                            are specified.
        mgs, 09 Nov 1998: - improved documentation
                          - default status now 2
                          - uses status field in use_datainfo instead of
                            ptr_valid function
                          - ILUN, TRACER and TAU only overwritten
                            if they are undefined variables
                          - added MISSING keyword
        mgs, 10 Nov 1998: - minor bug fix for status=1
        bmy, 19 Nov 2003: GAMAP VERSION 2.01
                          - added SPACING keyword to pass the
                            diagnostic spacing from CTM_DIAGINFO
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_doselect_data.pro)


CTM_GETDEFAULTSTRUCTURES

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_GETDEFAULTSTRUCTURES

 PURPOSE:
        Return default values for FileInfo and DataInfo for
        subsequent analysis. The defaults are taken from the
        global common block defined in gamap_cmn.pro

 CATEGORY:
        GAMAP Internals, Structures

 CALLING SEQUENCE:
        CTM_GETDEFAULTSTRUCTURES, FileInfo, DataInfo, result=result

 INPUTS:
        FILEINFO -> A named variable that will contain the global
            FileInfo structure array, i.e. information about all
            files that have been opened.

        DATAINFO -> A named variable that will contain the global
            DataInfo structure array, i.e. information about all
            data records that have been read from the headers of 
            all opened CTM files.

 KEYWORD PARAMETERS:
        RESULT -> returns 1 if assignment was successful, 0 otherwise.

 OUTPUTS:
        None

 SUBROUTINES:
        External Subroutines Required
        ==============================
        GAMAP_CMN

 REQUIREMENTS:
        Requires routines from the GAMAP package.

 NOTES:
        None

 EXAMPLE:
        CTM_GETDEFAULTSTRUCTURES, $
            FileInfo, DataInfo, result=result

        if (not result) then return

        ; the current state of the global FileInfo and DataInfo 
        ; structures will be copied into FileInfo and DataInfo

 MODIFICATION HISTORY:
        mgs, 20 Aug 1998: VERSION 1.00
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_getdefaultstructures.pro)


CTM_OPEN_FILE

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_OPEN_FILE

 PURPOSE:
        Open a CTM output (punch) file and reads the complete
        header information from that file. The file may be either
        ASCII or binary type, and is only opened if not already 
        parsed. It is re-opened if it was parsed but closed in the 
        meantime. CTM_OPEN_FILE can also be used to read GEOS-CTM
        restart files. However, since it is not possible to
        point randomly at these data, the complete set of tracers
        in a restart file will be read at once.
        
        While in general files are opened automatically when 
        CTM_GET_DATA is used, there are several circumstances where
        direct use of CTM_OPEN_FILE advantageous:
        * if a read error occurs, use CTM_OPEN_FILE with the /PRINT
          keyword to diagnose the error
        * to compare two model runs, it is simpler to first open
          the two files, then call CTM_GET_DATA without the filename
          keyword. All operations will then be done on both files
          in parallel.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        CTM_OPEN_FILE, FILENAME, THISFILEINFO, THISDATAINFO

 INPUTS:
        FILENAME -> The name of the file to be opened or a
            file mask. If the file was not found or the file 
            mask contains wild cards, a pickfile dialog is
            opened for interactive selection. The default
            search mask can be set in gamap.defaults (see
            GAMAP_INIT).

 KEYWORD PARAMETERS:
        CANCELLED -> Returns 1 if the CANCEL button was pressed
            during DIALOG PICKFILE filename selection.
 
        _EXTRA keywords are passed to the various routines which
            read the file headers.  

 OUTPUTS:
        THISFILEINFO -> A named variable that will contain a 
            fileinfo structure (see CREATE3DFSTRU).

        THISDATAINFO -> A named variable that will contain an
            array of datainfo structures (see CREATE3DHSTRU)
            associated with this file.

        THISFILEINFO and THISDATAINFO are also appended to the 
        global pointer variables pGlobalFileInfo and pGlobalDataInfo
        (see gamap_cmn.pro and GAMAP_INIT).

 SUBROUTINES:
        Internal Subroutines:
        ============================================================
        Get_Free_Lun  (function)   Test_For_NCDF          (function)
        Test_For_HDF  (function)   Test_For_HDFEOS        (function)
        Test_For_GMAO (function)   Test_For_Binary        (function)
        File_Parse    (function)   File_Opened_Previously (function)
        Handle_Prev_Opened_File

        External Subroutines Required:
        ==============================================================
        GAMAP_CMN          (incl file)  OPEN_FILE
        CTM_READ3DB_HEADER (function )  CTM_READ3DB_HEADER (function)
        CTM_READ_GMAO      (function )  CTM_READ_NCDF      (function) 
        CTM_READ_GMI       (function )  LITTLE_ENDIAN      (function)
        STRRIGHT           (function )

 REQUIREMENTS:
        References routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) In internal function "test_for_dao", add additional met 
        field names as is necessary to the FIELDNAMES array.  The
        first met field name in a file is tested against FIELDNAMES.
        If there is a match, then the file is declared to be a DAO 
        met field file, and it is assigned a file type of 4.

        (2) You must also add additional met field names to routine
        "ctm_read_dao" as is necessary.  The DAO met field files do 
        not carry tracer numbers, so the name of each met field must
        be checked in "ctm_read_dao" before a corresponding DATAINFO
        structure can be assigned.

        (3) If a binary file is the wrong endian, we will get a
        "Corrupted F77 file error" when we try to read data from it.
        We now test for this error in routines TEST_FOR_BINARY and
        TEST_FOR_DAO.  If this error condition occurs, the file is
        re-opened with the /SWAP_ENDIAN command.

 EXAMPLE:
        CTM_OPEN_FILE
        ; queries the user for a filename and stores the analyzed
        ; header information in the global common block
        ; If an ASCII punch file is read, the user is prompted for
        ; a model name

        CTM_OPEN_FILE,'',fileinfo,datainfo
        ; opens a CTM punch file after selection from a pickfile
        ; dialog

        CTM_OPEN_FILE,'~/amalthea/CTM4/run/ctm.pch',fileinfo,datainfo
        ; opens the specified punch file

 MODIFICATION HISTORY:
        mgs, 14 Aug 1998: VERSION 1.00
        mgs, 17 Sep 1998: - file units now starting from 20, so
                            they do not interfere with GET_LUN
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
        mgs, 05 Oct 1998: - added function file_parse
                          - can now handle GEOS restart files as well.
        mgs, 10 Nov 1998: - no message after Cancel on Pickfile dialog
        bmy, 20 Jan 1999: - explicitly set binary type to 2 for 
                            GEOS-CTM restart files
                          - accept bey's personal GEOS CTM timeseries label
        mgs, 19 May 1999: - added SWAP_ENDIAN keyword to open_file if
                            binary files are read on PC
        mgs, 24 May 1999: - added support for 'CTM bin 02' files
                            (involved changing filetype numbers)
        bmy, 12 Apr 2000: GAMAP VERSION 1.45
                          - added test for DAO binary met field files
        bmy, 12 Jun 2000: - added CLDFRC to list of recognized DAO fields
        bmy, 28 Jul 2000: GAMAP VERSION 1.46
                          - added GEOS-3 names to list of recognized fields
                          - deleted a couple of field names woe don't use
        bmy, 25 Sep 2000: - added new field: SLP (sea level pressure)
        bmy, 05 Dec 2000: GAMAP VERSION 1.47
                          - added new fields: TKE, RH, KH
        bmy, 07 Mar 2001: - added new fields: CLDTMP, TPW
        bmy, 25 Apr 2001: - added new fields: TAULOW, TAUMID, TAUHI
        bmy, 26 Jul 2001: GAMAP VERSION 1.48
                          - added new field: T2M
        bmy, 15 Aug 2001: - added new field: OPTDEPTH
        bmy, 27 Sep 2001: GAMAP VERSION 1.49
                          - reference LITTLE_ENDIAN in internal
                            subroutine "handle_prev_opened_file"
                          - swap endian if LITTLE_ENDIAN() returns true
                            in internal subroutine "handle_prev_opened_file"
        bmy, 29 Jan 2002: GAMAP VERSION 1.50
                          - added new field: GWET
        bmy, 03 Mar 2003: GAMAP VERSION 1.52:
                          - added new fvDAS fields: CMFDTR, CMFETR,
                            ZMDU, ZMED, ZMEU, ZMMD, ZMMU, HKETA, HKBETA
        bmy, 18 Jun 2003: GAMAP VERSION 1.53
                          - added new fields: EVAP, LAI, PARDF, PARDR
        bmy, 30 Jul 2003: - added new field: TSKIN
  lyj & tdf, 22 Oct 2003: - added SWAP_BINARY keyword to TEST_FOR_BINARY
                          - Call TEST_FOR_BINARY with /SWAP_BINARY
                            as a last-ditch effort if the file type
                            cannot be classified.  This will open the
                            file and swap the endian.
        bmy, 12 Dec 2003: GAMAP VERSION 2.01
                          - Now also test for netCDF file format
                          - Added internal routines TEST_FOR_NETCDF,
                            TEST_FOR_HDF (stub), TEST_FOR_HDFEOS
                          - FILETYPE for ASCII   files range from 0-99
                          - FILETYPE for BINARY  files range from 100-199
                          - FILETYPE for netCDF  files range from 200-299
                          - FILETYPE for HDF-EOS files range from 300-399
                          - Routine TEST_FOR_GMAO now looks for met
                            field tracer names from "tracerinfo.dat",
                            instead of using a hardwired string array
                          - rewritten for clarity; updated comments
                          - Now looks for the GEOS-4 met field ident string
        bmy, 11 Feb 2004: GAMAP VERSION 2.01a
                          - Now prevents infinite loops when testing
                            for file type
        bmy, 24 Aug 2004: GAMAP VERSION 2.03
                          - now recognizes GEOS-CHEM station timeseries
                            file in bpch file format by the FTI string
        bmy, 21 Mar 2005: - Added COARDS-compliant netCDF as FILETYPE=203
        bmy, 24 May 2005: GAMAP VERSION 2.04
                          - Now test properly for GCAP met fields
        bmy, 06 Feb 2006: - Activate file type tests for HDF-EOS4 
                            swath and point file types
                          - Add new function TEST_FOR_HDF5 to test if
                            the file is in HDF5 format
                          - Use the absolute path name internally when
                            testing for HDF5 or HDF-EOS files
        bmy, 31 May 2006: GAMAP VERSION 2.05
                          - Now expand the filename when calling NCDF_OPEN
                          - Skip test for HDF5 for IDL versions
                            earlier than 6.0
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
                          - Now modified for GEOS-5
                          - Added FILETYPE=106 for files that
                            contain 4-D data blocks
                          - Use FILETYPE=202 for netCDF files
                            created by BPCH2GMI
        phs, 30 Jun 2008: GAMAP VERSION 2.12
                          - warning if too many files are opened
                          - completly rewrite handling of endian swapping
        bmy, 23 Jan 2017: GAMAP VERSION 2.19
                          - Add a better test for netCDF files.  This
                            removes the restriction of the file having
                            to end with *.nc or *.nc4.
               

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_open_file.pro)


CTM_PRINT_DATAINFO

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_PRINT_DATAINFO

 PURPOSE:
        Create and print a formatted list of DATAINFO records.
        This procedure can be used for direct printing, but it
        can also return a string array of the formatted output 
        e.g. for use in a widget list.

 CATEGORY:
        GAMAP Internals, GAMAP Data Manipulation

 CALLING SEQUENCE:
        CTM_PRINT_DATAINFO,DATAINFO [,keywords]

 INPUTS:
        DATAINFO -> One or more DATAINFO records, e.g. the result 
             from CTM_GET_DATA.

 KEYWORD PARAMETERS:
        FIELDS -> (*** not yet implemented ***) A list of fields
             (structure tag names) to be printed. Default is
             CATEGORY, ILUN, TRACERNAME, TRACERNUMBER, 
             UNIT, TAU0, STATUS, DIMENSIONS
             FIELDS can also include tags from the (global) FILEINFO
             structure (e.g. FILENAME).

        OUTPUT -> A named variable that will contain a string array
             with the formatted output including the title line but 
             without the seperating lines. The title is not included
             if keyword /NOTITLE is set.

        /NOPRINT -> Don't print, only return formatted strings

        /NOTITLE -> Do not generate title line (will neither be printed
             nor included in OUTPUT.

 OUTPUTS:
        None

 SUBROUTINES:
        External subroutines required:  
        ------------------------------
        GAMAP_CMN  (include file)
        TAU2YYMMDD (function)

 REQUIREMENTS:
        References routines from both GAMAP and TOOLS packages.

 NOTES:
        For GISS, FSU family of models, TAU0 = 0 occurs on date 1/1/1980.
        For GEOS      family of models, TAU0 = 0 occurs on date 1/1/1985.
        Therefore, the model family must be obtained from the global
        FILEINFO structure in order to display the YYMMDD
        corresponding to TAU0.
 
 EXAMPLE:
        CTM_GET_DATA,DataInfo,File='',tracer=2
        CTM_PRINT_DATAINFO,DataInfo
        ; *or*
        CTM_PRINT_DATAINFO,DataInfo,Output=r,/NOPRINT

 MODIFICATION HISTORY:
        mgs, 10 Nov 1998: VERSION 1.00
        bmy, 11 Feb 1999: VERSION 1.01
                          - adjust format for double-precision TAU0
        mgs, 16 Mar 1999: - added tracer number and removed STATUS
                          - made cosmetic changes
        mgs, 23 Mar 1999: - print dimension as NA if not yet available
        bmy, 27 Apr 1999: - widen tracer number field to 6 chars
        mgs, 22 Jun 1999: - widen unit field to 12 chars and add DATE field
        bmy, 27 Jul 1999: VERSION 1.42
                          - GISS/FSU YYMMDD values are now correct
                          - cosmetic changes
        bmy, 10 Aug 1999: - change I6 format for date to I6.6
                            so that leading zeroes are printed
        bmy, 03 Jan 2000: VERSION 1.44
                          - change I6.6 format to I8.8 and print the 
                            date in YYYYMMDD format for Y2K compliance
                          - declare TAU2YYMMDD as external with the
                            FORWARD_FUNCTION command
        bmy, 14 Feb 2001: GAMAP VERSION 1.47
                          - decrease tracer name from 10 to 7 chars
                          - Now use 10-digit date string YYYYMMDDHH
        bmy, 02 Jul 2001: GAMAP VERSION 1.48
                          - now assume that GENERIC grids use GEOS
                            time epoch for NYMD2TAU 
        bmy, 21 Oct 2002: GAMAP VERSION 1.52
                          - now assume MOPITT grid uses GEOS epoch
                          - deleted obsolete code
        bmy, 03 May 2005: GAMAP VERSION 2.04
                          - wrap tracer number into 5 digits
                          - GCAP uses the same TAU values as GEOS models
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
         bmy 24 Jan 2014: GAMAP VERSION 2.17
                          - Adjust output format string to allow for
                            a few extra spaces in UNIT and TRACER #.

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_print_datainfo.pro)


CTM_READ3DB_HEADER

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ3DB_HEADER

 PURPOSE:
        retrieve header information and file positions of data
        blocks from binary global 3D model output. This is a
        twin of CTM_READ3DP_HEADER which digests the header
        information from ASCII punch files.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        test = CTM_READ3DB_HEADER(LUN,FILEINFO,DATAINFO [,keywords])

 INPUTS:
        LUN --> logical file unit of the binary punch file. The file 
             must be open (see CTM_OPEN_FILE or OPEN_FILE)

        FILEINFO --> a (single) fileinfo structure containing information
             about the (open) file (see CREATE3DFSTRU). FILEINFO also
             contains information about the model which generated
             the output (see CTM_TYPE)

        DATAINFO --> a named variable that will contain an array of
             structures describing the file content (see
             CREATE3DHSTRU)

 KEYWORD PARAMETERS:
        PRINT  -> if activated, print all headers found in the file

 OUTPUTS:
        The function returns 1 if successful, and 0 otherwise. 

        FILEINFO --> toptitle and modelinfo tags will be set

        DATAINFO --> contains an array of named structures 
             (see CREATE3DHSTRU) with all relevant information
             from the punch file header and what is needed to find
             and load the data.
              
 SUBROUTINES:

 REQUIREMENTS:
        uses CREATE3DHSTRU function to create header structure
        uses CHKSTRU to test FILEINFO structure
        uses CTM_TYPE to create modelinfo structure
        needs gamap_cmn.pro to access global common block

 NOTES:
        This routine uses the new binary file format introduced
        first to the GEOS/Harvard CTM.

 EXAMPLE:
              fileinfo = create3dfstru()   ; not required !
              fname = '~bmy/terra/CTM4/results/ctm.bpch'
              open_file,fname,ilun,/F77_UNFORMATTED   ; <=== !!
              if (ilun gt 0) then $
                 result = CTM_READ3DB_HEADER(ilun,fileinfo,datainfo)
              print,result

        To get e.g. all scaling factors, type 
              print,datainfo[*].scale

        To retrieve the header structure for one data block, type
              blocki = datainfo[i]

 MODIFICATION HISTORY:
        mgs, 15 Aug 1998: VERSION 1.00
                          - derived from CTM_READ3DP_HEADER
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
        mgs, 14 Jan 1999: - now expects diag category name instead 
                            of number
        bmy, 11 Feb 1999: - change TAU0, TAU1 to double-precision,
                            in accordance w/ new binary file format
                          - clean up some POINT_LUN calls
        bmy, 22 Feb 1999: VERSION 1.01
                          - now store I0, J0, L0 from binary file
                            in new FIRST field from CREATE3DHSTRU
                          - comment out assignment statement for
                            SKIP; now use value from binary file
        mgs, 16 Mar 1999: - cosmetic changes
        mgs, 24 May 1999: - now supports 'CTM bin 02' files
                          - added a filetype check
                          - now defaults to 512 records (former 4096)
        mgs, 27 May 1999: - fixed bug with new record default: new
                            records were never added as they were 
                            supposed to.
        bmy, 26 Jul 1999: - also print out SKIP field in debug output
        bmy, 10 Jul 2003: GAMAP VERSION 1.53
                          - added kludge so that GEOS-3 reduced grid
                            w/ 30 layers will be added to FILEINFO
                            correctly
        bmy, 21 Nov 2003: GAMAP VERSION 2.01
                          - BPCH file v1 now has FILETYPE=101
                          - BPCH file v2 now has FILETYPE=102
                          - Now define separate DATAINFO.FORMAT values
                            for BPCH v1 and BPCH v2 type files   
                          - removed kludge for GEOS3_30L, since the
                            bug in CTM_TYPE has now been fixed
        bmy, 24 Aug 2004: GAMAP VERSION 2.03
                          - now assign FORMAT string for Filetype 105
                            which is BPCH file for GEOS-CHEM station
                            timeseries (e.g. ND48 diagnostic)
  phs & bmy, 13 Jul 2007: GAMAP VERSION 2.10
                          - Now account for FILETYPE=106, which
                            denotes CTM bpch files w/ 4-D data.
        bmy, 23 Feb 2012: GAMAP VERSION 2.16
                          - Now make FILEPOS and NEWPOS LONG64
                            variables, in order to read bpch files
                            larger than 2.4 GB.
        bmy, 20 Jan 2016: GAMAP VERSION 2.19
                          - Bug fix: cast SKIP variable to LONG64

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read3db_header.pro)


CTM_READ3DP_HEADER

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ3DP_HEADER

 PURPOSE:
        retrieve header information and file positions of data
        blocks from global 3D model punch file output.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        test = CTM_READ3DP_HEADER(LUN,FILEINFO,DATAINFO [,keywords])

 INPUTS:
        LUN --> logical file unit of the punch file. The file
             must be open (see CTM_OPEN_FILE or OPEN_FILE)

        FILEINFO --> a (single) fileinfo structure containing information
             about the (open) file (see CREATE3DFSTRU). FILEINFO also
             contains information about the model that generated the
             data, which is queried interactively.

        DATAINFO --> a named variable that will contain an array of
             structures describing the file content (see
             CREATE3DHSTRU)

 KEYWORD PARAMETERS:
        /NO_TOPTITLE --> do not interprete first line of file as
             header line. Only one header line will be skipped
             (as normally only one header line is read in).

        /EXTRA_SPACE -> digests output from GISS_II_PRIME model with
             extra spaces in the punch file. This keyword is optional
             in the following sense: If CTM_READ3DP_HEADER detects
             an error reading a header line, it is called again
             automatically with this option set.

        PRINT  -> if activated, print all headers found in the file

 OUTPUTS:
        The function returns 1 if successful, and 0 otherwise.

        FILEINFO --> toptitle and modelinfo tags will be set

        DATAINFO --> contains an array of named structures
             (see CREATE3DHSTRU) with all relevant information
             from the punch file header and what is needed to find
             and load the data.

 SUBROUTINES:

 REQUIREMENTS:
        uses CREATE3DHSTRU function to create header structure
        uses CHKSTRU to test FILEINFO structure
        uses CTM_TYPE to set modelinfo
        needs gamap_cmn.pro to set default in query for model type

 NOTES:
        This routine does rely on the output format from the global GCM
        as specified first for the GEOS/Harvard CTM. However, it is
        designed to digest the output from all models currently used
        in DJJ's group.
        It uses the NL parameter to skip blocks between headers.

        The window offsets (I0, J0, L0) are set to
        zero, since the ASCII punch file is not set up to save
        a sub-region of the globe (bmy, 2/11/99)

 EXAMPLE:
              fileinfo = create3dfstru()   ; not required !
              fname = '~bmy/terra/CTM4/results/ctm.pch.m2'
              open_file,fname,ilun
              if (ilun gt 0) then $
                 result = ctm_read3dp_header(ilun,fileinfo,datainfo)
              print,result

        To get e.g. all scaling factors, type
              print,datainfo[*].scale

        To retrieve the header structure for one data block, type
              blocki = datainfo[i]

 MODIFICATION HISTORY:
        mgs, 21 Aug 1997: VERSION 1.00
        mgs, 02 Mar 1998: VERSION 1.10
                  - can handle GEOS output now
                  - reads in file header
                  - returns structure instead of string array
                  - always returns all entries, filtering must be done later
        mgs, 03 Mar 1998: - now returns a structure and is a function
        mgs, 04 Mar 1998: - toptitle is now default, changed keyword to
                    NO_TOPTITLE ; eliminated search for '!' or '%'
        mgs, 10 Mar 1998: - rewritten again, now with named structure
                    returned as DATAINFO. Skipping of data blocks
                    drastically improved by setting the file pointer
                    instead of reading the lines.
        mgs, 16 May 1998: - removed DATATYPE3DP function, set type tag to -1
                  - added EXTRA_SPACE option for GISS_II_PRIME output and
                    LINELENGTH keyword for full flexibility
                  - now ignores time series ('TS...') data
        mgs, 13 Aug 1998: - format string now composed here, not in
                    read3dp_data
        mgs, 14 Aug 1998: VERSION 2.00 - major changes!
                  - now requires open file and uses ILUN parameter
                  - automatic EXTRA_SPACE detection
                  - fileinfo structure not created any more, and only
                    extended if present (chkstru)
                  - error messages as dialog box
                  - LINELENGTH keyword removed
        mgs, 15 Aug 1998: - now calls select_model and inserts model
                    information in fileinfo structure
                  - gamap_cmn.pro included for default model name
                  - had to change DEBUG keyword into PRINT
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
        mgs, 26 Oct 1998: - now resets error state in no_dim
        mgs, 14 Jan 1998: - new lcount for line counting in error report
                  - linelength adjusted for working in Windows (CR/LF)
        bmy, 11 Feb 1999: VERSION 2.01
                  - Add window offsets (I0,J0,L0) to DATAINFO 
                  - save DATAINFO.TAU0 and DATAINFO.TAU1 as double precision
        bmy, 17 Feb 1999: VERSION 2.02
                  - changed to accommodate the FIRST field (instead of OFFSET)
                    of the DATAINFO structure, which contains
                    the I, J, L indices of the first grid box
        bmy, 01 Mar 1999: 
                  - bug fix!  NL needs to be a longword, so that
                    we can read 2 x 2.5 punch files correctly!! 
        mgs, 23 Mar 1999: 
                  - cleaned up reading of dimensions from label a little
        mgs, 27 May 1999: 
                  - new default number of records is 512 instead of 4096.
                  - bug fix: new records were never appended.
        mgs, 22 Jun 1999: 
                  - bug fix: "title" needed to be trimmed.
        bmy, 20 Jan 2000: FOR GAMAP VERSION 1.44
                  - !ERR is now replaced by !ERROR_STATE.CODE
                  - !ERR_STRING is now replaced by !ERROR_STATE.MSG
                  - I/O error trapping is now done by testing error
                    messages instead of testing for error numbers
                  - cosmetic changes, updated comments
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read3dp_header.pro)


CTM_READ_COARDS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_COARDS

 PURPOSE:
        Reads data blocks from a COARDS-compliant netCDF file (such
        as created by routine BPCH2COARDS) into GAMAP.  CTM_READ_COARDS 
        is is an internal routine which is called by CTM_OPEN_FILE.

        NOTE: COARDS is a formatting standard for netCDF files which
        is widely used in both the atmospheric & climate communities.
        COARDS-compliant netCDF files can be read by GAMAP, GrADS and
        other plotting packages.
        
        See http://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.html
        for more information about the COARDS standard.

 CATEGORY:
        GAMAP Internals, Scientific Data Formats

 CALLING SEQUENCE:
        CTM_READ_COARDS, [, Keywords ]

 INPUTS:
        ILUN -> GAMAP file unit which will denote the netCDF file.

        FILENAME -> Name of the netCDF grid file to be read.
 
        FILEINFO -> Array of FILEINFO structures which will be
             returned to CTM_OPEN_FILE.  CTM_OPEN_FILE will 
             append FILEINFO to the GAMAP global common block.

        DATAINFO -> Array of DATAINFO structures (each element 
             specifies a GAMAP data block) which will be returned
             to CTM_OPEN_FILE.  CTM_OPEN_FILE will append FILEINFO 
             to the GAMAP global common block.        

 KEYWORD PARAMETERS:
        _EXTRA=e -> Picks up extra keywords

 OUTPUTS:
        None

 SUBROUTINES:
        Internal Subroutines:
        ====================================================
        CRC_Get_DimInfo        CRC_Get_IndexVars   
        CRC_Read_Global_Atts   CRC_Get_Tracer
        CRC_Get_Data           CRC_Save_Data

        External Subroutines Required:
        ====================================================
        CTM_GRID          (function)   CTM_TYPE (function)
        CTM_MAKE_DATAINFO (function)   STRRIGHT (function)
        STRREPL           (function)

 REQUIREMENTS:
        Requires routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) Assumes that data blocks have the following dimensions:
            (a) longitude, latitude, time  
            (b) longitude, latitude, levels, time

        (2) Assumes that times are given in GMT.

        (3) If information about each tracer in the COARDS-compliant
            netCDF file is stored in the GAMAP "tracerinfo.dat" file, 
            then CTM_READ_COARDS will be able to read the file without 
            having to ask the user to supply a GAMAP category and
            tracer name.  
       
 EXAMPLE:
        ILUN     = 21
        FILENAME = 'coards.20010101.nc'
        CTM_READ_COARDS, ILUN, FILENAME, FILEINFO, DATAINFO

             ; Reads data from the COARDS-compliant netCDF file 
             ; coards.20010101.nc and stores it the FILEINFO and 
             ; DATAINFO arrays of structures.  If you are calling 
             ; CTM_READ_COARDS from CTM_OPEN_FILE, then CTM_OPEN_FILE 
             ; will append FILEINFO and DATAINFO to the GAMAP global
             ; common block.

 MODIFICATION HISTORY:
        bmy, 21 Mar 2005: GAMAP VERSION 2.03
        bmy, 21 Jul 2005: GAMAP VERSION 2.04
                          - bug fix in CRC_SAVE_DATA
        bmy, 06 Mar 2006: GAMAP VERSION 2.05
                          - minor bug fix in CRC_READ_GLOBAL_ATTS
                          - bug fix in CRC_SAVE_DATA: add a fake 4th
                            dim to DATA array if needed
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
        bmy, 16 Sep 2008: GAMAP VERSION 2.13
                          - Convert some global attributes to number
                            types in case attributes were initially
                            saved to the netCDF file as strings
        phs, 15 Sep 2009: - Added check on reading tracerinfo.dat
                          - Convert some tracer names created by
                            BPCH2COARDS to their original value.
        bmy, 14 Dec 2011: GAMAP VERSION 2.16
                          - Updated to read the GAMAP category value
                            from a netCDF variable attribute (if present)
        bmy, 19 Dec 2011: - Generalized to handle several different
                            vertical levels
        bmy, 21 Dec 2011: - Now will interpret netCDF attributes
                            "begin_date" and "begin_time" in the same
                            way as "start_date" and "start_time"
        bmy, 22 Dec 2011: - Now compute FIRST (nested datablock offsets)
                            properly for nested grids.  For now assume
                            that the data will always start on the first
                            vertical level.
                          - Bug fix: test for Latrev gt 0 to avoid
                            INADVERTENTLY reversing latitudes
        bmy, 03 Jan 2012: - Skip over Ap and Bp index arrays
                          - Now use better error checks for
                            the time and vertical level dimensions
                            for each tracer in the netCDF file.
        bmy, 05 Jan 2012: - Now interpret DELTA_TIME attribute
                            correctly when specified in hhmmss format.
        bmy, 10 Jan 2012: - Fix to interpret data blocks with multiple 
                            vertical dimensions in the same file 
        bmy, 13 Jan 2012: - When the time dimension in the netCDF
                            file is 1 (esp. when time is an UNLIMITED
                            variable, we need to add a fake dimension
                            of 1 back onto the data block to avoid
                            crashes.  This is a quirk in how the IDL
                            NCDF_VARGET function works.
        bmy, 23 Jan 2017: GAMAP VERSION 2.19
                          - Add modifications to read netCDF restart files

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_coards.pro)


CTM_READ_DATA

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_DATA

 PURPOSE:
        read in one data block from a global model punch file output
        (ASCII or binary)

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        CTM_READ_DATA,data,datainfo
        or:
        CTM_READ_DATA,data,ilun,filepos,xsize,ysize[,zsize,keywords]

 INPUTS:
        DATAINFO -> a datainfo structure as retrieved from
             CTM_OPEN_FILE. This is the easiest way to read 3D
             model output. Alternatively, the individual parameters
             can be specified as follows.
             
        ILUN  -> logical file unit of input file (must be opened before)
        FILEPOS -> a long word containing the start position of the data
             block to be read (normally retrieved by CTM_OPEN_FILE)
        XSIZE -> 1st dimension of the data array
        YSIZE -> 2nd dimension of the data array
        ZSIZE -> optional 3rd dimension of the data array

 KEYWORD PARAMETERS:
        Note: These keywords are ineffective when parameters are passed
        via the DATAINFO structure!

        SCALE -> apply scaling factor to data (default = 1.0)

        FORMAT -> string with format identifier for data block
             Default is '(12f6.2)'. Use '(8e10.3)' for BUDGETS output and
             '(12(f6.2,1x))' for "extra_space" output. Format='BINARY'
             indicates a binary file with REAL*4 data. (As long as the
             dimensions are specified correctly ANY binary file can
             be read this way, i.e. there is no need for additional 
             routines to read in e.g. gridded emission data files)

        RESULT -> will return 1 if successful, 0 otherwise

 OUTPUTS:
        DATA  -> a float array containing the block of data which is 
             either a 2D or a 3D array.

 SUBROUTINES:

 REQUIREMENTS:
        file must have been opened and file positions of the data block
        must be known (see CTM_OPEN_FILE)

 NOTES:
        The data array is *not* added to the datainfo structure! 

 EXAMPLE:
        ; Open a punch file interactively
        CTM_OPEN_FILE,'',fileinfo,datainfo

        ; Test if successful
        IF (not chkstru(datainfo)) then return

        ; Read in data of first data block
        CTM_READ_DATA,data,datainfo[0]

        ; This is equivalent to:
        CTM_READ_DATA,data,fileinfo.ilun,datainfo[0].filepos, $
             datainfo[0].dim[0],datainfo[0].dim[1],datainfo[0].dim[2], $
             scale=datainfo[0].scale,format=datainfo[0].format

 MODIFICATION HISTORY:
        mgs, 13 Aug 1998: VERSION 1.00 (from CTM_READ3DP_DATA)
                          - replaced EFORMAT keyword by more flexible 
                            FORMAT keyword (involves changes in 
                            CTM_READ3DP_HEADER and CREATE_3DHSTRU)
        mgs, 17 Aug 1998: VERSION 2.00
                          - now possible to pass DATAINFO structure
                          - made it necessary to place DATA argument 
                            as first parameter
        mgs, 19 Aug 1998: - added RESULT keyword
        mgs, 26 Oct 1998: - changed print statements to message
                          - user is now prompted when dimensions 
                            are not given
        bmy, 07 Apr 2000: - Added DAO keyword for reading in DAO met fields
        bmy, 11 Apr 2001: - now uses DATA = TEMPORARY( DATA ) * SCALE[0]
                            in order to prevent excess memory usage
        bmy, 19 Nov 2003: GAMAP VERSION 2.01
                          - Removed GMAO keyword, we now use the
                            FORMAT string to test for GMAO data files
  phs & bmy, 13 Jul 2007: GAMAP VERSION 2.10
                          - Modified for 4-D data blocks

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_data.pro)


CTM_READ_EOSGR

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_EOSGR

 PURPOSE:
        Reads data blocks from a HDF-EOS Grid file into GAMAP.
        (This is an internal routine which is called by CTM_OPEN_FILE.)
        
 CATEGORY:
        GAMAP Internals, Scientific Data Formats

 CALLING SEQUENCE:
        CTM_READ_EOSGR, ILUN, FILENAME, FILEINFO, DATAINFO, [, Keywords ]

 INPUTS:
        ILUN -> GAMAP file unit which will denote the HDF-EOS file.

        FILENAME -> Name of the HDF-EOS grid file to be read.
 
        FILEINFO -> Array of FILEINFO structures which will be
             returned to CTM_OPEN_FILE.  CTM_OPEN_FILE will 
             append FILEINFO to the GAMAP global common block.

        DATAINFO -> Array of DATAINFO structures (each element 
             specifies a GAMAP data block) which will be returned
             to CTM_OPEN_FILE.  CTM_OPEN_FILE will append FILEINFO 
             to the GAMAP global common block.
      
 KEYWORD PARAMETERS:
        _EXTRA=e -> Picks up any extra keywords

 OUTPUTS:
        None

 SUBROUTINES:
        Internal Subroutines:
        =====================================================
        CRE_Get_DimInfo   CRE_Get_TracerInfo   CRE_Save_Data

        External Subroutines Required:
        =====================================================
        CTM_GRID          (function)   CTM_TYPE (function)
        CTM_MAKE_DATAINFO (function)   STRRIGHT (function)

 REQUIREMENTS:
        Requires routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) Currently is set up to read HDF-EOS files containing
            GMAO met data files.  You must have all possible met
            field names listed in your "tracerinfo.dat" file or 
            else you will get an "Invalid Selection" error.
                
 EXAMPLE:
        ILUN     = 21
        FILENAME = 'a_llk_03.tsyn2d_mis_x.t20030801'
        CTM_READ_EOSGR, ILUN, FILENAME, FILEINFO, DATAINFO

             ; Reads data from HDF-EOS file a_llk_03.tsyn2d_mis_x.t20030801
             ; and stores it the FILEINFO and DATAINFO arrays of
             ; structures.  If calling CTM_READ_GMI from CTM_OPEN_FILE,
             ; then CTM_OPEN_FILE will append FILEINFO and DATAINFO
             ; to the GAMAP common block.

 MODIFICATION HISTORY:
        bmy, 12 Nov 2003: GAMAP VERSION 2.01
                          - initial version
        bmy, 19 Feb 2004: GAMAP VERSION 2.01a
                          - added c402_rp_02 to the assim list
                          - bug fix: use DEFAULT keyword for SELECT_MODEL
        bmy, 09 Mar 2004: GAMAP VERSION 2.02
                          - now test for "GEOS3", "GEOS4" strings in
                            the file name to determine model type
                          - now undefine variables after use
                          - now make sure that data block begins at the
                            date line and has longitude values in the
                            range [-180,180] degrees.
                          - always ensure that L=1 is the surface level
        bmy, 25 Aug 2004: GAMAP VERSION 2.03
                          - Added c402_cer to the assim list
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
                          - Remove reference to unused SORT_STRU
        bmy, 05 Dec 2007: GAMAP VERSION 2.12
                          - Modified for DAS.llk.asm files
        bmy, 01 Oct 2008: GAMAP VERSION 2.13
                          - Increase DI, DJ in CRE_GET_DIMINFO for
                            the 0.5 x 0.667 grid
                          - Also now test for GEOS-5 in the filename
                            in CRE_GET_DIMINFO
                          - Bug fix in CRE_SAVE_DATA: If there is
                            only one data time in the HDF-EOS file,
                            then add an extra dimension to THISDATA
                            so that the CASE statement will be
                            interpreted properly.

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_eosgr.pro)


CTM_READ_GMAO

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_GMAO

 PURPOSE:
        Reads GMAO I-6,(instantaneous 6h), A-6 (average 6h),
        or A-3 (average 3-h) met field files, and constructs
        a DATAINFO structure for each met field.

 CATEGORY:
        GAMAP Internals
 
 CALLING SEQUENCE:
        Result = CTM_READ_GMAO( Ilun, FileInfo, DataInfo [, Keywords ] )

 INPUTS:
        ILUN --> The name of the input file (or a file mask).
             FILENAME is passed to OPEN_FILE.  If FILENAME is a null 
             string or a file mask, then OPEN_FILE will open a
             pickfile dialog box.

        FILEINFO --> a (single) fileinfo structure containing information
             about the (open) file (see CREATE3DFSTRU). FILEINFO also
             contains information about the model which generated
             the output (see CTM_TYPE)

        DATAINFO --> a named variable that will contain an array of
             structures describing the file content (see
             CREATE3DHSTRU)

 KEYWORD PARAMETERS:
        PRINT  -> if activated, print all headers found in the file

 OUTPUTS:
        The function returns 1 if successful, and 0 otherwise. 

        FILEINFO --> toptitle and modelinfo tags will be set

        DATAINFO --> contains an array of named structures 
             (see CREATE3DHSTRU) with all relevant information
             from the punch file header and what is needed to find
             and load the data.

 SUBROUTINES:
        Internal Subroutines:
        ================================================
        CRG_GET_MODELINFO

        External Subroutines Required:
        ================================================
        CHKSTRU  (function)     CTM_GRID      (function)
        CTM_TYPE (function)     CREATE3DHSTRU (function)
        

 REQUIREMENTS:
        References routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) You must also add additional met field names to your
        "tracerinfo.dat" file as is neccesary.  CTM_READ_GMAO looks
        up met fields stored under the GAMAP categories "GMAO-2D"
        and "GMAO-3D$".

        (2) GEOS-4 met field files have an 8-char ident string 
        of the format "G4 45 19", where:

           (a) "G4" means that it is a GEOS-4 met field file/
           (b) "45" is the resolution code (in this case 4x5).
           (c) "19" is the number of met fields stored w/in the file.

        CTM_READ_GMAO will now set the modeltype and resolution from
        the information in this ident string.  For older met field 
        types (e.g. GEOS-3) which do not have this ident string,
        CTM_READ_GMAO will determine the modeltype and resolution 
        from the filename and date.

 EXAMPLES:
        FileInfo = CREATE3DFSTRU()   ; not required !
        FName    = '/r/amalthea/N/scratch/bmy/960101.a3.4x5'
        OPEN_FILE, FName, Ilun, /F77_Unformatted   
        if ( Ilun gt 0 ) $
            then Result = CTM_READ_GMAO( Ilun, FileInfo, DataInfo )
        print,result

 MODIFICATION HISTORY:
        bmy, 16 May 2000: GAMAP VERSION 1.45
                          - adapted from original program "read_gmao"
        bmy, 12 Jun 2000: - declare XYMD and XHMS as integers for
                            GEOS-2 and GEOS-3 data
        bmy, 28 Jul 2000: GAMAP VERSION 1.46
                          - added GEOS-3 names to list of recognized fields
                          - deleted a couple of field names we don't use 
        bmy, 25 Sep 2000: - added new field: SLP (sea level pressure)
        bmy, 08 Dec 2000: GAMAP VERSION 1.47
                          - added new fields: TKE, RH, KH
        bmy, 07 Mar 2001: - added new fields: CLDTMP, TPW
        bmy, 25 Apr 2001: - added new fields: TAULOW, TAUMID, TAUHI
        bmy, 26 Jul 2001: GAMAP VERSION 1.48
                          - added new field: T2M
        bmy, 15 Aug 2001: - added new field: OPTDEPTH
        bmy, 06 Nov 2001: GAMAP VERSION 1.49
                          - added new field: DELP
                          - changed units from "mb" to "hPa"
        bmy, 29 Jan 2002: GAMAP VERSION 1.50
                          - added new field: GWET
                          - removed obsolete code from 11/6/01
        bmy, 01 May 2002: - added GWETTOP as synonym for GWET
                          - now assign correct units for fvDAS/GEOS-4
                            CLDMAS and DTRAIN fields: kg/m2/s
                          - now assign correct units for fvDAS/GEOS-4
                            PBL field: m (instead of hPa)
        bmy, 17 Jul 2002: GAMAP VERSION 1.51
                          - added PBLH, Z0M, Z0H fields for fvDAS/GEOS-4
        bmy, 16 Dec 2002: GAMAP VERSION 1.52:
                          - added new fvDAS fields: CMFDTR, CMFETR,
                            ZMDU, ZMED, ZMEU, ZMMD, ZMMU, HKETA, HKBETA
        bmy, 21 May 2003: GAMAP VERSION 1.53:
                          - added T, U, V as synonyms of TMPU, UWND, VWND
                          - added Q as a synonym of SPHU
                          - removed CMFDTR, CMFETR fields
                          - HKBETA is now #18; HKETA is now #19
                          - updated comments
                          - added EVAP field as tracer #28 
                          - TGROUND and T2M are now tracers #29, #30
                          - LAI is now tracer #31
                          - PARDF, PARDR are now tracers #32, 33
        bmy, 30 Jul 2003: - added TSKIN as a synonym for TGROUND
        bmy, 12 Dec 2003: GAMAP VERSION 2.01
                          - renamed to CTM_READ_GMAO to reflect the
                            change of name from "DAO" to "GMAO".
                          - GMAO binary files now have FILETYPE=104
                          - Rewrote so that we don't have to hardwire
                            met field names...it now gets the met
                            field names from "tracerinfo.dat"
                          - Now gets modeltype and resolution info
                            from GEOS-4 ident string 
                          - Added internal function CRG_GET_MODELINFO
                            to generate the MODELINFO structure based
                            on the filename and date. 
                          - Improved error output if we can't find
                            the tracer name
  bmy & phs, 03 Aug 2007: GAMAP VERSION 2.10
                          - Ident string value "56" now will specify
                            a grid with 0.5 x 0.666 degree resolution
                          - Ident string value "10" now will specify
                            a grid with 1.0 x 1.0 degree resolution
                          - Now don't reset ILUN for GEOS-5 files
                          - Now call EXTRACT_FILENAME in CRG_GET_MODELINFO
                            to get just the filename instead of the full
                            path name.
                          - Adjusted for GEOS-5 fields with LMX+1 levels
                          - Bug fix: set null strings if GMAO-2D and/or
                            GMAO-3D$ categories aren't found
                          - Bug fix: change "gt" to "ge" in IF statements
                            where NAME2D, NAME3D, etc. are defined.
                          - Now use IS_EDGED
                          - Added routine CRG_GET_HORZDIM to return NI,
                            NJ, NL, FIRST for global or nested grids.
        bmy, 06 Aug 2010: GAMAP VERSION 2.14
                          - Now check for MERRA grid.  This is
                            identical to GEOS-5, but retains the
                            "MERRA" name for clarity. 
        bmy, 11 Aug 2010: - Bug fix: define STRUC array of structures
                            with 1024 entries.  512 is not enough for
                            the hourly MERRA data.              
        bmy, 17 Aug 2010: - Bug fix: define STRUC array of structures
                            with 2048 entries.  1024 may not be
                            enough for the hourly MERRA data.              
  

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_gmao.pro)


CTM_READ_GMI

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_GMI

 PURPOSE:
        Reads data blocks from a GMI netCDF file into GAMAP.
        (This is an internal routine called from CTM_OPEN_FILE.)

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        CTM_READ_GMI, ILUN, FILENAME, FILEINFO, DATAINFO, [, Keywords ]

 INPUTS:
        ILUN -> GAMAP file unit which will denote the GMI netCDF file.

        FILENAME -> Name of the GMI netCDF grid file to be read.
 
        FILEINFO -> Array of FILEINFO structures which will be
             returned to CTM_OPEN_FILE.  CTM_OPEN_FILE will 
             append FILEINFO to the GAMAP global common block.

        DATAINFO -> Array of DATAINFO structures (each element 
             specifies a GAMAP data block) which will be returned
             to CTM_OPEN_FILE.  CTM_OPEN_FILE will append FILEINFO 
             to the GAMAP global common block.

 KEYWORD PARAMETERS:
        _EXTRA=e -> Picks up extra keywords
 
 OUTPUTS:
        None

 SUBROUTINES:
        Internal Subroutines:
        ===============================================
        CRG_Debug_Print   CRG_Get_Name   CRG_Get_Tau0       
        CRG_Get_Tracer    CRG_Get_Data   CRG_Save_Data

        External Subroutines Required:
        ===============================================
        CTM_GRID (function)   CTM_TYPE (function)
        NCDF_GET (function)   TVMAP

 REQUIREMENTS:
        Requires routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) Currently is hardwired to reading in data blocks 
            from netCDF files created for the GMI comparison
            study.  It is difficult to create a general netCDF
            reader since there are many different ways to store
            data w/ in a netCDF file.

 EXAMPLE:
        ILUN     = 21
        FILENAME = 'gmit4_maccm3_year_CO.nc'
        CTM_READ_GMI, ILUN, FILENAME, FILEINFO, DATAINFO

             ; Reads data from the netCDF file gmit4_maccm3_year_CO.nc
             ; and stores it the FILEINFO and DATAINFO arrays of
             ; structures.  If calling CTM_READ_GMI from CTM_OPEN_FILE,
             ; then CTM_OPEN_FILE will append FILEINFO and DATAINFO
             ; to the GAMAP common block.
 
 MODIFICATION HISTORY:
        bmy, 05 Nov 2003: GAMAP VERSION 2.01
                          - initial version
        bmy, 13 Feb 2004: GAMAP VERSION 2.01a
                          - bug fix: now should get multiple months
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_gmi.pro)


CTM_READ_MULTILEVEL

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_MULTILEVEL

 PURPOSE:
        Read all levels of a multilevel diagnostic (e.g. IJ-AVG-$)
        and return a 3D data block. The associated datainfo structure
        must be created before and passed into this routine.
        This is an internal procedure which should not be used
        directly.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        CTM_READ_MULTILEVEL,data,datainfo, $
                   Use_DataInfo=Use_DataInfo, $
                   Use_FileInfo=Use_FileInfo, $
                   result=result

 INPUTS:
        DATAINFO -> The datainfo structure that is to hold the new 
             3D data block.

 KEYWORD PARAMETERS:
        USE_DATAINFO, USE_FILEINFO -> The array of Datainfo and Fileinfo
             stuctures to select from. Unlike the higher level routines,
             CTM_READ_MULTILEVEL does not provide default values for 
             these! 

        RESULT -> A named variable that will be 1 if successful, 
             0 otherwise.

 OUTPUTS:
        DATA -> The 3D data block composed of the individual levels
             from the ASCII punch file. 

 SUBROUTINES:
        External Subroutines Required:
        ===========================================
        EXPAND_CATEGORY     CTM_DIAGINFO
        CTM_DOSELECT_DATA   CTM_READ_DATA

 REQUIREMENTS:
        Requires routines from both GAMAP and TOOLS packages.

 NOTES:
        The dimensional information of the DATAINFO parameter is 
        adapted to the number of levels actually read from disk.

 EXAMPLE:
        See source code of CTM_RETRIEVE_DATA

 MODIFICATION HISTORY:
        mgs, 19 Aug 1998: VERSION 1.00
        mgs, 26 Oct 1998: - made more error tolerant: 
                            = if file ends within record, now returns 
                              what's there
                            = if no dimensions were read, 
                              assumes 72x46 and prints warning
                            = added status keyword
        mgs, 10 Nov 1998: VERSION 3.00
                          - major design change
        mgs, 28 Nov 1998: - hopefully fixed scaling bug now
        bmy, 19 Nov 2003: GAMAP VERSION 2.01
                          - Now get diagnostic spacing from CTM_DIAGINFO
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_multilevel.pro)


CTM_READ_MULTITRACER

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_MULTITRACER

 PURPOSE:
        Read all entries of a 'multitracer' diagnostic (i.e.
        source type diagnostic) and return a 3D data block.
        The associated datainfo structure must be created before 
        and passed into this routine. This routien is meant for
        internal use in the CTM_GET_DATA routines.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        CTM_READ_MULTITRACER,data,datainfo, $
                   Use_DataInfo=Use_DataInfo,  $
                   Use_FileInfo=Use_FileInfo,  $
                   result=result,debug=debug

 INPUTS:
        DATAINFO -> The datainfo structure that is to hold the new
             3D data block. 

 KEYWORD PARAMETERS:
        USE_DATAINFO, USE_FILEINFO -> The array of Datainfo and Fileinfo
             stuctures to select from. Unlike the higher level routines,
             CTM_READ_MULTILEVEL does not provide default values for
             these!

        RESULT -> A named variable that will be 1 if successful, 
             0 otherwise.

 OUTPUTS:
        DATA -> The 3D data block composed of the individual levels
             from the ASCII punch file.

 SUBROUTINES:

 REQUIREMENTS:
        Uses CTM_DOSELECT_DATA, CTM_READ_DATA

 NOTES:
        The dimensional information of the DATAINFO parameter is
        adapted to the number of levels actually read from disk.

 EXAMPLE:
        See source code of CTM_***

 MODIFICATION HISTORY:
        mgs, 19 Aug 1998: VERSION 1.00
        mgs, 26 Oct 1998: made more error tolerant:
             - if file ends within record, now returns what's there
             - if no dimensions were read, assumes 72x46 and prints warning
        mgs, 10 Nov 1998: VERSION 3.00
             - major design change
        mgs, 28 Nov 1998: 
             - hopefully fixed scaling bug now
  bmy & phs: 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_multitracer.pro)


CTM_READ_NCDF

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_READ_NCDF

 PURPOSE:
        Reads data blocks from a netCDF file created by routine
        BPCH2NC or BPCH2GMI into GAMAP.  (This is an internal routine 
        which is called by CTM_OPEN_FILE.)

 CATEGORY:
        GAMAP Internals, Scientific Data Formats

 CALLING SEQUENCE:
        CTM_READ_NCDF, [, Keywords ]

 INPUTS:
        ILUN -> GAMAP file unit which will denote the netCDF file.

        FILENAME -> Name of the netCDF grid file to be read.
 
        FILEINFO -> Array of FILEINFO structures which will be
             returned to CTM_OPEN_FILE.  CTM_OPEN_FILE will 
             append FILEINFO to the GAMAP global common block.

        DATAINFO -> Array of DATAINFO structures (each element 
             specifies a GAMAP data block) which will be returned
             to CTM_OPEN_FILE.  CTM_OPEN_FILE will append FILEINFO 
             to the GAMAP global common block.        

 KEYWORD PARAMETERS:
        _EXTRA=e -> Picks up extra keywords

 OUTPUTS:
        None

 SUBROUTINES:
        Internal Subroutines:
        ====================================================
        CRN_Get_DimInfo       CRN_Get_Time   CRN_Get_Tracer     
        CRN_Read_Global_Atts  CRN_Get_Data   CRN_Save_Data

        External Subroutines Required:
        ====================================================
        CTM_GRID          (function)   CTM_TYPE (function)
        CTM_MAKE_DATAINFO (function)   STRRIGHT (function)

 REQUIREMENTS:
        Requires routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) Currently assumes that the netCDF file was written
            by GAMAP routine BPCH2NC.

 EXAMPLE:
        ILUN     = 21
        FILENAME = 'geos.20010101.nc'
        CTM_READ_NCDF, ILUN, FILENAME, FILEINFO, DATAINFO

             ; Reads data from the netCDF file geos.20010101.nc
             ; and stores it the FILEINFO and DATAINFO arrays of
             ; structures.  If calling CTM_READ_GMI from CTM_OPEN_FILE,
             ; then CTM_OPEN_FILE will append FILEINFO and DATAINFO
             ; to the GAMAP common block.

 MODIFICATION HISTORY:
        bmy, 05 Nov 2003: GAMAP VERSION 2.01
                          - initial version
        bmy, 26 Mar 2004: GAMAP VERSION 2.02
                          - bug fix: now correctly separates "__"
                            in netCDF tracer names with STRPOS
        bmy, 28 Feb 2005: GAMAP VERSION 2.03
                          - bug fix: now also exclude ETAC from
                            being passed to CRN_GET_TRACER
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
                          - Modified to read files from BPCH2GMI
        bmy, 19 Dec 2007: GAMAP VERSION 2.12
                          - Now also skip ETAE, SIGE arrays
                          - Also don't add any vertical info to 
                            the GRIDINFO structure if NLAYERS=1
        bmy, 24 Jan 2011: GAMAP VERSION 2.15
                          - Now skip over Ap and Bp index fields
                            in the netCDF file
        bmy, 14 Dec 2011: GAMAP VERSION 2.16
                          - Now also check to see if the GAMAP
                            category string is passed via the netCDF
                            "gamap_category" attribute

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_read_ncdf.pro)


CTM_RETRIEVE_DATA

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_RETRIEVE_DATA

 PURPOSE:
        Read one "compound" data block from disk. The datainfo
        parameter must contain only one entry, and it must have
        status=0. The data pointer is assumed to be NULL.
        If requested data block is a multilevel or multitracer 
        diagnostics, the routine will search all individual data 
        records that belong to that block and loop over them
        (this is actually done in ctm_read_multilevel and 
        ctm_read_multitracer).

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        CTM_RETRIEVE_DATA,DataInfo,DiagStru,  $
                  Use_DataInfo=Use_DataInfo,  $
                  Use_FileInfo=Use_FileInfo,  $
                  result=result

 INPUTS:
        DataInfo -> DataInfo structure that is to hold the data.
            Normally, this is either created in CTM_GET_DATA for
            multilevel or multitracer diagnostics, or it is created
            upon parsing the header information (ctm_read3d?_header).

        DIAGSTRU -> A (single) diagnostic structure containing
            information what to load (see CTM_DIAGINFO)

 KEYWORD PARAMETERS:
        USE_DATAINFO, USE_FILEINFO -> The array of Datainfo and Fileinfo
             stuctures to select from. Unlike the higher level routines,
             CTM_READ_MULTILEVEL does not provide default values for
             these!

        RESULT -> A named variable that will be 1 if successful,
             0 otherwise.

 OUTPUTS:
        The DATAINFO structure will contain the correct dimensional
        information, the status will be set to 1, and the data pointer
        points to a 2D or 3D data array. (if reading was successful)

 SUBROUTINES:

 REQUIREMENTS:
        Uses CTM_DOSELECT_DATA, CTM_READ_MULTILEVEL, 
             CTM_READ_MULTITRACER, CTM_READ_DATA,
             gamap_cmn.pro

 NOTES:
        This routine is meant for internal use from CTM_GET_DATA.

 EXAMPLE:

 MODIFICATION HISTORY:
        mgs, 19 Aug 1998: VERSION 1.00
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
        mgs, 22 Oct 1998: - scale factor set to 1 after unit scaling
                            is applied for multi...
                          - tracername and unit setting now also done
                            for non-multi fields
        mgs, 26 Oct 1998: - added status keyword. If used (0,1,or 2)
                            no data will be read but datainfo record 
                            will be prepared as usual.
        mgs, 04 Nov 1998: - bug fix for reading of 2D arrays. Now return
                            correct (offset) tracer number
        mgs, 10 Nov 1998: VERSION 3.00
                          - major design change 
        mgs, 28 Nov 1998: - hopefully fixed scaling bug now!
        bmy, 07 Apr 2000: - now can read DAO met field files
        bmy, 21 Nov 2003: GAMAP VERSION 2.01
                          - Removed GMAO keyword in call to
                            CTM_READ_DATA
        bmy, 23 Aug 2004: GAMAP VERSION 2.03 
                          - Now account for single-point data blocks
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_retrieve_data.pro)


CTM_SELECT_DATA (FUNCTION)

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_SELECT_DATA (function)

 PURPOSE:
        Provide a user-friendly function to extract data
        from a DATAINFO structure. The function returns an 
        index to the given DATAINFO structure which points
        to all recored that fulfill the specified conditions.

 CATEGORY:
        GAMAP Internals, GAMAP Data Manipulation

 CALLING SEQUENCE:
        index = CTM_SELECT_DATA(DIAGN[,DATAINFO,keywords])

 INPUTS:
        DIAGN -> A diagnostic number or category name. Only one
            diagnostic can be extracted at the same time. Complete
            information about the requested diagnostic is returned 
            via the DIAGSTRU keyword. (see also CTM_DIAGINFO)

        DATAINFO -> An [optional] subset of the global DataInfo
            structure. As default, CTM_SELECT_DATA operates on
            the global DATAINFO structure (see gamap_cmn.pro) scanning
            all files that have been opened.

 KEYWORD PARAMETERS:
        ILUN -> A logical unit value or an array of logical unit
            values. Only recored from these files will be returned.
            Default is to use all files.
            A link between logical unit numbers and filenames can be
            made through the (global) FileInfo structure (see gamap_cmn.pro)

        TRACER -> A tracer number or an array of tracer numbers to
            restrict the selection of data records. Default is to
            return information about all tracers. 
            Tracer numbers less than 100 are automatically expanded
            to include the offset of certain diagnostics (see
            CTM_DIAGINFO and CTM_DOSELECT_DATA).

        TAU -> A time value (tau0 !) or an array of time values
            to restrict the selection of data records. Default is to
            return information about all time steps. (see also example)

        LEVELRANGE -> A 1 or 2 element vector with a level index or 
            a range of level indices for multilevel diagnostics
            (e.g. 'IJ-AVG$'). As default, information is returned
            about full 3D data blocks only. See also 
            EXPAND keyword.

        /EXPAND -> If set, multilevel diagnostic fields are
            expanded to return the individual layers in addition to
            the complete 3D cube.
        
        DATA -> A named variable that will contain an array with
            pointers to the indexed data blocks. Note that some may
            be NIL pointers if the STATUS value is 0 or 2.

        COUNT -> A named variable that will return the number of
            data blocks found with the given selection criteria
 
        DIAGSTRU -> A named variable that will contain complete 
            information about the requested diagnostics (see
            CTM_DIAGINFO)

        STATUS -> Restricts the data selection to
            Data that has not been read  (STATUS = 0)
            Data that has been read      (STATUS = 1, default)
            All data blocks              (STATUS = 2)
            If STATUS is 1, all pointers returned in DATA are valid.

 OUTPUTS:
        The function returns an (long) integer array that contains
        index values to all the data blocks that match the selection 
        criteria. If no data is found, -1 is returned.

 SUBROUTINES:

 REQUIREMENTS:
        Uses CTM_DOSELECT_DATA, EXPAND_CATEGORY, gamap_cmn.pro,
             GAMAP_INIT, CTM_DIAGINFO

 NOTES:
        This function acts for the most part as a convenient user
        interface to CTM_DOSELECT_DATA which performs the actual
        selection process and contains only minimal error checking.
        For programming purposes, use CTM_DOSELECT_DATA when possible.

 EXAMPLE:
        ; open a CTM punch file
        CTM_OPEN_FILE

        ; Read diagnostic number 45 for all tracers and time steps
        CTM_READ_DATA,45

        ; Select data for tracer 1 and diagnostics 45 
        index = CTM_SELECT_DATA(45,tracer=1,data=pdata)

        ; De-reference the data pointer for the first record
        ; (usually the first timestep)
        if (index[0] ge 0) then data = (*pdata)[0] 

        ; find data for a specific time range
        DataInfo = (*pGlobalDataInfo)[index]
        taus = where(DataInfo.tau0 ge 77666L AND DataInfo.tau1 le 78888L)
        taus = DataInfo.tau0[taus]
        index = CTM_SELECT_DATA(45,DataInfo,tracer=1,tau=taus,data=pdata)
        

 MODIFICATION HISTORY:
        mgs, 19 Aug 1998: VERSION 1.00
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
        mgs, 07 Oct 1998: - removed obsolete FILEINFO parameter
                          - changed NO_EXPAND to EXPAND
        bmy, 19 Nov 2003: GAMAP VERSION 2.01
                          - Now get spacing between diagnostic offsets
                            from CTM_DIAGINFO and pass to CTM_DOSELECT_DATA
                          - Now use the /NO_DELETE keyword in the
                            call to routine EXPAND_CATEGORY
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_select_data.pro)


CTM_VALIDATESTRUCTURES

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        CTM_VALIDATESTRUCTURES

 PURPOSE:
        Test validity of a FILEINFO and DATAINFO structure
        or array of structures.

 CATEGORY:
        GAMAP Internals, Structures

 CALLING SEQUENCE:
        CTM_VALIDATESTRUCTURES,FILEINFO,DATAINFO,result=result, $
              print_warn=print_warn

 INPUTS:
        FILEINFO -> A FileInfo structure (array) to be tested

        DATAINFO -> A DataInfo (array) to be tested

        Both arguments must be present!

 KEYWORD PARAMETERS:
        RESULT -> A named variable that will be set to 1 if
            both structures are valid. This keyword is mandatory.

        PRINT_WARN -> print a warning message on the screen if
            a structure is non-existent or corrupt.

 OUTPUTS:
        None

 SUBROUTINES:
        Uses ROUTINE_NAME and CHKSTRU functions

 REQUIREMENTS:
        None

 NOTES:
        None

 EXAMPLE:
        CTM_VALIDATESTRUCTURES,FileInfo,DataInfo,result=result
        if (not result) then return

 MODIFICATION HISTORY:
        mgs, 20 Aug 1998: VERSION 1.00
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/ctm_validatestructures.pro)


EXPAND_CATEGORY (FUNCTION)

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        EXPAND_CATEGORY  (function)

 PURPOSE:
        Replace wildcards in a multilevel diagnostic category
        and return a string array with one entry for each 
        level.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        xcatgeory = EXPAND_CATEGORY(category)

 INPUTS:
        CATGEORY -> The original category name containing one
            wildcard character (see CTM_DIAGINFO). If category 
            does not contain a wildcard character, the category
            will be returned unchanged.

 KEYWORD PARAMETERS:
        RANGE -> A level index or range of level indices (2-elements)
            to be returned. Default is to return the maximum
            possible range (currently 1..24).

        WILDCHARD -> a character value that is searched for as
            wildchard. Default is '$' which is used in CTM_DIAGINFO
            to denote a varying level index.

        /NO_DELETE -> if set, will return category with wildcard as
            first entry in result list. Default is to delete the 
            wildcard string. 

 OUTPUTS:
        A string array with category names.

 SUBROUTINES:
        None

 REQUIREMENTS:
        None

 NOTES:
        None

 EXAMPLE:
        PRINT, EXPAND_CATEGORY('IJ-AVG-$')

             ; prints IJ-AVG-1 IJ-AVG-2 IJ-AVG-3 ... 
             ;        ... IJ-AVG-A IJ-AVG-B ...

        print, EXPAND_CATEGORY( 'IJ-AVG-$', range=5 )

             ; prints IJ-AVG-5 

 MODIFICATION HISTORY:
        mgs, 19 Aug 1998: VERSION 1.00
        mgs, 26 Oct 1998: added no_delete keyword
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
                          - added extra letters for grids w/
                            more than about 30 layers

(See /n/home09/ryantosca/IDL/gamap2/internals/expand_category.pro)


GAMAP_CMN

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        GAMAP_CMN

 PURPOSE:
        Contains global common block for Global Atmospheric Model 
        output Analysis Package include file (include with @gamap_cmn)

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        @gamap_cmn

 INPUTS:
        None

 KEYWORD PARAMETERS:
        None

 OUTPUTS:
        None

 SUBROUTINES:
        None

 REQUIREMENTS:
        Referenced by gamap_init.pro and gamap.pro

 NOTES:
        None

 MODIFICATION HISTORY:
        mgs, 14 Aug 1998  INITIAL VERSION
        mgs, 21 Jan 1999: - added postscript variables
        bmy, 22 Feb 1999: - added options for animation (GIF, MPEG filenames)
        bmy, 10 Dec 2002: GAMAP VERSION 1.52
                          - removed DO_MPEG and DEFAULTMPEGFILENAME
                          - added DO_BMP and DEFAULTBMPFILENAME
                          - added DO_JPEG and DEFAULTJPEGFILENAME
                          - added DO_PNG and DEFAULTPNGFILENAME
                          - added DO_TIFF and DEFAULTTIFFFILENAME 
        bmy, 13 Nov 2003: GAMAP VERSION 2.01
                          - re-added DO_MPEG and DEFAULTMPEGFILENAME
                          - removed CREATEANIMATION, this was only
                            ever used for XINTERANIMATE (obsolete)
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/gamap_cmn.pro)


GAMAP_INIT

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        GAMAP_INIT

 PURPOSE:
        Initialize global common block for Global Atmospheric Model 
        (output) Analysis Package (GAMAP).  This routine is called
        automatically when gamap_cmn.pro is included in a file 
        ( @gamap_cmn.pro ), but it executes only once.  User 
        preferences are read from the file gamap.defaults in the 
        current directory or the directory where gamap_init.pro 
        resides.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        GAMAP_INIT

 INPUTS:
        none

 KEYWORD PARAMETERS:
        DEBUG -> set a (new) debug level (0 or 1). 

 OUTPUTS:
        none

 SUBROUTINES:
        Uses FILE_EXIST, EXTRACT_PATH, and OPEN_FILE

 REQUIREMENTS:
        None

 NOTES:
        If you change the definition of the common block
        in gamap_cmn.pro, make sure to accomodate these changes
        in GAMAP_INIT.

 EXAMPLE:
        GAMAP_INIT

 MODIFICATION HISTORY:
        mgs, 14 Aug 1998: VERSION 1.00
        mgs, 21 Sep 1998: - changed gamap.cmn to gamap_cmn.pro
        mgs, 05 Oct 1998: - type assignment fix to DEBUG when read
        mgs, 08 Oct 1998: - now runs through after CTM_CLEANUP and does
                            not delete global pointers if valid.
                          - added DEBUG keyword
        mgs, 21 Jan 1999: - added postscript options
        bmy, 19 Feb 1999: - added GIF_FILENAME
        bmy, 22 Feb 1999: VERSION 1.01
                          - added more animation options
                          - changed POSTSCRIPT to DO_POSTSCRIPT
                          - default path now amalthea
        mgs, 23 Mar 1999: - slight change in defaults
        bmy, 19 Jan 2000: GAMAP VERSION 1.44
                          - replaced the deprecated STR_SEP function
                            with STRSPLIT for IDL 5.3+
                          - Now STRTRIM each token so that the case
                            statement will find matches
                          - cosmetic changes, updated comments
        bmy, 13 Mar 2001: GAMAP VERSION 1.47
                          - now supports MacOS operating system
        bmy, 07 Jun 2001: - removed obsolete code prior to 3/13/01
        bmy, 17 Jan 2002: GAMAP VERSION 1.50
                          - now call STRBREAK wrapper routine from
                            the TOOLS subdirectory for backwards
                            compatiblity for string-splitting;
                          - use FORWARD_FUNCTION to declare STRBREAK
        bmy, 10 Dec 2002: GAMAP VERSION 1.52
                          - added options for BMP, JPEG, PNG, TIFF output
                          - added internal function TRIMTOK 
        bmy, 13 Nov 2003: GAMAP VERSION 2.01
                          - re-added option for MPEG animation
                          - removed CREATEANIMATION, this was only
                            ever used for XINTERANIMATE (obsolete)
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
                          - Now use the IDL FILE_WHICH routine to
                            locate the gamap.defaults file

(See /n/home09/ryantosca/IDL/gamap2/internals/gamap_init.pro)


GETETA

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        GETETA

 PURPOSE:
        Defines the eta levels for the various hybrid model grids.
        GETETA is called by function CTM_GRID.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        RESULT = GETETA( MNAME [, NLAYERS [, Keywords ] ] )

 INPUTS:
        MNAME -> The name of the model for which eta level
             information is desired ('GEOS4' or 'GEOS4_30L').

        NLAYERS -> Specifies the number of eta layers for the 
             model type.  Default is 55 layers.

 KEYWORD PARAMETERS:
        PSURF -> Surface pressure in hPa.  If PSURF is not specified,
             GETETA will use 1013.25 hPa (e.g. 1 atmosphere).

        /CENTERS -> Returns to the calling program an array 
             containing the eta coordinate at grid box centers.

        /EDGES -> Returns to the calling program an array 
             containing the eta coordinate at grid box edges.

        A -> Returns to the calling program the "A" vector of
             values that define the hybrid grid.  A has units of
             [hPa].

        B -> Returns to the calling program the "B" vector of
             values that define the hybrid grid.  B is unitless.

        PRESSURE -> Returns the pressure [hPa] at the grid box edges 
             (if /EDGES is set) or the pressure at the grid box centers
             (if /CENTERS is set).

 OUTPUTS:
        RESULT -> contains the array of eta edges (if /EDGES is
             set), or eta centers (if /CENTERS is set).

 SUBROUTINES:
        None

 REQUIREMENTS:
        Called by CTM_GRID.PRO

 NOTES:
        Supported models:
        -----------------------------------------------------------
        (1 ) GCAP,         23-layer (name: "GCAP"         )
        (2 ) GEOS-4,       55-layer (name: "GEOS4"        )
        (3 ) GEOS-4        30-layer (name: "GEOS4_30L"    )
        (4 ) GEOS-5,       72-layer (name: "GEOS5"        )
        (5 ) GEOS-5        47-layer (name: "GEOS5_47L"    )
        (6 ) GEOS-FP       72-layer (name: "GEOSFP"       )
        (7 ) GEOS-FP       47-layer (name: "GEOSFP_47L"   )
        (8 ) MERRA,        72-layer (name: "MERRA"        )
        (9 ) MERRA         47-layer (name: "MERRA_47L"    )
        (10) MERRA2,       72-layer (name: "MERRA2"       )
        (11) MERRA2,       47-layer (name: "MERRA2_47L"   )
        (12) GISS_II_PRIME 23-layer (name: "GISS_II_PRIME")
        (13) MATCH         52-layer (name: "MATCH"        )

        Computing pressure and eta coordinates:
        -----------------------------------------------------------
        In a vertical column, the pressure at the bottom edge of 
        grid box (L) is given by:

           Pe(L)   = A(L) + ( B(L) * Psurface )

        and the pressure at the vertical midpoint of grid box (L)
        is just a simple average of the pressures at the box edges:

           Pc(L)   = ( Pe(L) + Pe(L+1) ) * 0.5

        From PEDGE and PCENTER, we can construct the unitless coordinate 
        ETA (which is very similar to the sigma coordinate) as follows:

           ETAe(L) = ( Pe(L) - Ptop ) / ( Psurface - Ptop ) 

           ETAc(L) = ( Pc(L) - Ptop ) / ( Psurface - Ptop )
 
        For GAMAP plotting routines, we will use the ETA coordinate 
        for hybrid models instead of the sigma coordinate.

        Psurface is a function of longitude and latitude.  GAMAP uses 
        a default Psurface of 1013 hPa (1 atm).  However, you should 
        always compute the pressure edges and centers from an accurate 
        surface pressure field (i.e. from met field data files or from 
        GEOS-Chem or other model output.
   
 EXAMPLE:
        EETA = GETETA( 'GEOS4' PSURF=984.0, /EDGES );
             ; assigns GEOS-1 eta edges to array EETA

        CETA = GETETA( 'GEOS4', /CENTERS, PRESSURE=CPRESS )
             ; assigns GISS-II eta centers to array CETA
             ; (Optional) also returns the pressure at level centers

 MODIFICATION HISTORY:
        bmy, 06 Nov 2001: GAMAP VERSION 1.49
                          - based on routine "getsigma.pro"
        bmy, 04 Nov 2003: GAMAP VERSION 2.01
                          - now supports "GEOS4_30L" grid
                          - now tests for model name using STRPOS 
                            instead of just a straight match
                          - stop w/ an error for non-hybrid grids
                          - now supports 23-layer GISS_II_PRIME model
                          - now supports 52-layer MATCH model
        bmy, 18 Jun 2004: GAMAP VERSION 2.02a
                          - now supports GCAP 23-layer hybrid grid
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10
                          - Updated comments
        bmy, 15 Oct 2009: GAMAP VERSION 2.13
                          - Now supports GEOS-5 grids    
        bmy, 29 Nov 2010: GAMAP VERSION 2.15
                          - Now returns hybrid-grid A and B 
                            values via the A & B keywords      
                          - Now returns the pressure corresponding 
                            to ETA via the PRESSURE keyword 
                          - Renamed /CENTER to /CENTERS  

(See /n/home09/ryantosca/IDL/gamap2/internals/geteta.pro)


GETSIGMA (FUNCTION)

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        GETSIGMA (function)

 PURPOSE:
        Defines the sigma levels for the various grids.
        GETSIGMA is called by function CTM_GRID.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        RESULT = GETSIGMA( MNAME [ NLAYERS [ , keywords ] ] )

 INPUTS:
        MNAME -> The name of the model for which sigma level
             information is desired (e.g. 'geos1', 'giss_ii', etc.)

        NLAYERS -> Specifies the number of sigma layers for the 
             GISS family of models.  Default is 9 layers.

 KEYWORD PARAMETERS:
        CENTER -> Returns to the calling program an array 
             containing the sigma centers. 

        EDGES -> Returns to the calling program an array 
             containing the sigma edges.

        /HELP -> Prints a help screen and returns a value
             of -1 to the calling program.

 OUTPUTS:
        RESULT contains the array of sigma edges (if /EDGES is
        set), or sigma centers (if /CENTERS is set).

 SUBROUTINES:

 REQUIREMENTS:

 NOTES:
        Supported models:
        -------------------------------------------------------
        (1 ) GEOS-1     20-layer   (6 ) GEOS-3        30-layer
        (2 ) GEOS-STRAT 46-layer   (7 ) GISS-II        9-layer    
        (3 ) GEOS-STRAT 26-layer   (8 ) GISS-II-PRIME  9-layer 
        (4 ) GEOS-2     70-layer   (9 ) GISS-II-PRIME 23-layer
        (5 ) GEOS-2     47-layer   (10) FSU           14-layer   
        (6 ) GEOS-3     48-layer   (11) MOPITT         7-layer

        You can add more grids as is necessary.
        
 EXAMPLE:
        ESIG = GETSIGMA( 'GEOS1' /EDGES );
           ; assigns GEOS-1 sigma edges to array ESIG

        CSIG = GETSIGMA( 'GISS_II', 9, /CENTERS )
           ; assigns GISS-II sigma centers (9 layer model) to array CSIG 
 
 MODIFICATION HISTORY:
        mgs, 02 Mar 1998: VERSION 1.00
        bmy, 19 Jun 1998: - added dummy FSU sigma edges and centers
                          - brought comments up to date
        bmy, 16 Oct 1998: - added 26 layer GEOS-STRAT sigma levels
        mgs, 25 Nov 1998: - improved defaulting of NLayers
        bmy, 24 Feb 1999: - updated FSU sigma centers & edges
                            with values provided by Amanda Staudt
        bmy, 27 Jul 1999: GAMAP VERSION 1.42
                          - added GISS-II-PRIME 23-layer sigma levels
                          - updated comments, cosmetic changes
        bmy, 16 May 2000: GAMAP VERSION 1.45
                          - added GEOS-2 grids (47 and 70 layers)
        bmy, 19 Jun 2000: - added GEOS-2 36 pressure-layer grid
        bmy, 26 Jul 2000: GAMAP VERSION 1.46
                          - added GEOS-3 grid (48 layers)
        bmy, 26 Jul 2001: GAMAP VERSION 1.48
                          - added GEOS-3 grid (30 layers, regridded)
        bmy, 18 Dec 2003: GAMAP VERSION 2.01
                          - Now recognizes GEOS3_30L grid name
                          - Now sets 30 layers as default for GEOS3_30L
                          - Removed HELP keyword, you can use usage.pro
  bmy & phs, 13 Jul 2007: GAMAP VERSION 2.10

(See /n/home09/ryantosca/IDL/gamap2/internals/getsigma.pro)


GET_GEOS5_PRESS

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        GET_GEOS5_PRESS

 PURPOSE:
        Returns zonal mean pressure edges and pressure centers
        for the GEOS-5 grid (47 layers or 72 layers).  Because in
        GEOS-5 we cannot compute the pressures at grid box edges
        and centers, we must read them in from disk.

 CATEGORY:
        GAMAP Internals, GAMAP Models & Grids

 CALLING SEQUENCE:
        GET_GEOS5_PRESS, PEDGE, PMID [, Keywords ]

 INPUTS:
        None

 KEYWORD PARAMETERS:
        FILENAME -> Specifies the name of the file containing
             average pressures on the GEOS-5 grid.  If FILENAME
             is omitted, then GET_GEOS5_PRESS will use the default
             filename: "pedge.geos5.{RESOLUTION}.year".  

        NLAYERS -> Specifies the number of layers in the GEOS-5 
             grid.  NLAYERS can be either 47 or 72.  Default is 47.

        RESOLUTION -> Specifies the resolution of the GEOS-5 grid. 
             Default is 4x5.

        PSURF -> If specified, then PEDGE and PMID will be 1-D
             vectors, with the surface pressure (i.e. PEDGE[0])
             being closest to the passed value of PSURF. 

        /VERBOSE -> Set this switch to toggle verbose output.

 OUTPUTS:
        PEDGE -> Array (or vector if PSURF is specified) of pressures 
             at GEOS-5 grid box edges.  The PEDGE values have been 
             averaged over 12 months and also averaged over longitudes 
             (i.e. zonal mean).
 
        PMID -> Array (or vector if PSURF is specified) of pressures 
             at GEOS-5 grid box centers.  The pressures have been 
             averaged over 12 months and also averaged over longitudes 
             (i.e. zonal mean).

 SUBROUTINES:
        External Subroutines Required:
        ===================================
        CTM_GET_DATA   CTM_TYPE (function) 

 REQUIREMENTS:
        Requires routines from both GAMAP and TOOLS packages.

 NOTES:
        (1) At present, we only have saved out a file containing
            pressure edges from the GEOS-5 47-layer model.

 EXAMPLE:
        (1)
        GET_GEOS5_PRESS, PEDGE, PMID, RES=2

             ; Returns pressues at grid box edges (PEDGE) and centers
             ; (PMID) for the GEOS-5 47L model at 2 x 2.5 resolution.
             ; PEDGE is a 2-D array of size 91x48.  PMID is also a
             ; 2-D array of size 91x47.

        (2)
        GET_GEOS5_PRESS, PEDGE, PMID, RES=2, PSURF=1000.0

             ; Returns pressues at grid box edges (PEDGE) and centers
             ; (PMID) for the GEOS-5 47L model at 2 x 2.5 resolution.
             ; for the column with the closest surface pressure to
             ; PSURF=1000 hPa.  PEDGE is a 1-D vector w/ 48 elements.  
             ; PMID is also a 1-D vector w/ 47 elements.

 MODIFICATION HISTORY:
  bmy & phs, 20 Jun 2007: GAMAP VERSION 2.10
        phs, 25 Feb 2008: - check on File_Which output
  dbm & ccc, 15 Dec 2009: GAMAP VERSION 2.14
                          - Make sure PSURF is a scalar

(See /n/home09/ryantosca/IDL/gamap2/internals/get_geos5_press.pro)


SELECT_MODEL

[Previous Routine] [Next Routine] [List of Routines]
 NAME:
        SELECT_MODEL

 PURPOSE:
        Primitive function to select a model.
        Calls CTM_TYPE and returns the MODELINFO structure.

 CATEGORY:
        GAMAP Internals

 CALLING SEQUENCE:
        MODELINFO = SELECT_MODEL( [ Keywords ] )

 INPUTS:
        None

 KEYWORD PARAMETERS:
        DEFAULT -> String containing the default model name, 
             resolution, and number of levels.
             
 OUTPUTS:
        Returns the MODELINFO structure (from CTM_TYPE)
        as the value of the function.

 SUBROUTINES:
        External subroutines required:
        ------------------------------
        CTM_TYPE (function)

 REQUIREMENTS:
        References routines from GAMAP and TOOLS packages.

 NOTES:
        Add new model selections as is necessary.  Also be sure to
        update routines "ctm_type", "ctm_grid", and "getsigma".

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%% NOTE: THIS ROUTINE IS MOSTLY OBSOLETE NOW BECAUSE %%%
        %%% MOST DATA FILES NOW CONTAIN THE MODEL NAME AND    %%%
        %%% RESOLUTION INFORMATION.                           %%%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 EXAMPLE:
        MODELINFO = SELECT_MODEL( DEFAULT='GISS_II_PRIME 4x5 (23L)' )
            
             ; Will return the modelinfo structure for the 23-layer
             ; GISS-II-PRIME model.  We need to specify the number
             ; of layers here since there is also a 9-layer version
             ; of the GISS-II-PRIME model.

 MODIFICATION HISTORY:
        mgs, 13 Aug 1998: VERSION 1.00
        mgs, 21 Dec 1998: - added GEOS_STRAT 2x2.5
        mgs, 25 Mar 1999: - changed FSU to 4x5 and added 'generic'
        bmy, 27 Jul 1999: GAMAP VERSION 1.42
                          - now add the number of layers to the menu choices
                          - added GISS-II-PRIME 23-layer model as a choice
                          - more sophisticated testing for default model 
                          - a few cosmetic changes
        bmy, 03 Jan 2000: GAMAP VERSION 1.44
                          - added GEOS-2 as a model selection
                          - added standard comment header
        bmy, 16 May 2000: GAMAP VERSION 1.45
                          - now use GEOS-2 47-layer grid 
        bmy, 28 Jul 2000: GAMAP VERSION 1.46
                          - added GEOS-3 48-layer grids for 1 x 1, 
                            2 x 2.5, and 4 x 5 horizontal resolution
        bmy, 26 Jul 2001: GAMAP VERSION 1.48
                          - added GEOS-3 30-layer grids for 2 x 2.5
                            and 4 x 5 horizontal resolution
        bmy, 24 Aug 2001: - deleted GEOS-3 30-layer grids, since
                            we won't be using these soon
        bmy, 06 Nov 2001: GAMAP VERSION 1.49
                          - added GEOS-4/fvDAS grids at 1 x 1.25,
                            2 x 2.5, and 4 x 5 resolution
  clh & bmy, 18 Oct 2002: GAMAP VERSION 1.52
                          - added MOPITT 7L grid 
        bmy, 11 Dec 2002  - deleted GEOS-2 47L grid, nobody uses this
        bmy, 18 May 2007: GAMAP VERSION 2.06
                          - added GEOS-4 30L grid
                          - added GEOS-5 47L and 72L grids
                          - added quit option
        bmy, 11 May 2012: GAMAP VERSION 2.16
                          - Added MERRA, GEOS-5.7 options

(See /n/home09/ryantosca/IDL/gamap2/internals/select_model.pro)


TVIMAGE

[Previous Routine] [List of Routines]
 NAME:
     TVIMAGE

 PURPOSE:
     This purpose of TVIMAGE is to enable the TV command in IDL
     to be a completely device-independent and color-decomposition-
     state independent command. On 24-bit displays color decomposition
     is always turned off for 8-bit images and on for 24-bit images.
     The color decomposition state is restored for those versions of
     IDL that support it (> 5.2). Moreover, TVIMAGE adds features
     that TV lacks. For example, images can be positioned in windows
     using the POSITION keyword like other IDL graphics commands.
     TVIMAGE also supports the !P.MULTI system variable, unlike the
     TV command. TVIMAGE was written to work especially well in
     resizeable graphics windows. Note that if you wish to preserve
     the aspect ratio of images in resizeable windows, you should set
     the KEEP_ASPECT_RATIO keyword, described below. TVIMAGE works
     equally well on the display, in the PostScript device, and in
     the Printer and Z-Graphics Buffer devices. The TRUE keyword is
     set automatically to the correct value for 24-bit images, so you
     don't need to specify it when using TVIMAGE.

 AUTHOR:
       FANNING SOFTWARE CONSULTING:
       David Fanning, Ph.D.
       1645 Sheely Drive
       Fort Collins, CO 80526 USA
       Phone: 970-221-0438
       E-mail: davidf@dfanning.com
       Coyote's Guide to IDL Programming: http://www.dfanning.com/

 CATEGORY:
     GAMAP Internals, Graphics

 CALLING SEQUENCE:

     TVIMAGE, image

 INPUTS:
     image:    A 2D or 3D image array. It should be byte data.

       x  :    The X position of the lower-left corner of the image.
               This parameter is only recognized if the TV keyword is set.
               If the Y position is not used, X is taken to be the image
               "position" in the window. See the TV command documenation
               for details.

       y  :    The Y position of the lower-left corner of the image.
               This parameter is only recognized if the TV keyword is set.

 KEYWORD PARAMETERS:

     BACKGROUND:   This keyword specifies the background color. Note that
               the keyword ONLY has effect if the ERASE keyword is also
               set or !P.MULTI is set to multiple plots and TVIMAGE is
               used to place the *first* plot.

     ERASE:    If this keyword is set an ERASE command is issued
               before the image is displayed. Note that the ERASE
               command puts the image on a new page in PostScript
               output.

     _EXTRA:   This keyword picks up any TV keywords you wish to use.

     HALF_HALF: If set, will tell CONGRID to extrapolate a *half* row
               and column on either side, rather than the default of
               one full row/column at the ends of the array.  If you
               are interpolating images with few rows, then the
               output will be more consistent with this technique.
               This keyword is intended as a replacement for
               MINUS_ONE, and both keywords probably should not be
               used in the same call to CONGRID.

     KEEP_ASPECT_RATIO: Normally, the image will be resized to fit the
               specified position in the window. If you prefer, you can
               force the image to maintain its aspect ratio in the window
               (although not its natural size) by setting this keyword.
               The image width is fitted first. If, after setting the
               image width, the image height is too big for the window,
               then the image height is fitted into the window. The
               appropriate values of the POSITION keyword are honored
               during this fitting process. Once a fit is made, the
               POSITION coordiates are re-calculated to center the image
               in the window. You can recover these new position coordinates
               as the output from the POSITION keyword.

     MARGIN:   A single value, expressed as a normalized coordinate, that
               can easily be used to calculate a position in the window.
               The margin is used to calculate a POSITION that gives
               the image an equal margin around the edge of the window.
               The margin must be a number in the range 0.0 to 0.333. This
               keyword is ignored if the POSITION or OVERPLOT keywords are
               used. It is also ignored when TVImage is executed in a
               multi-plot window, EXCEPT if it's value is zero. In this
               special case, the image will be drawn into its position in
               the multi-plot window with no margins whatsoever. (The
               default is to have a slight margin about the image to separate
               it from other images or graphics.

     MINUS_ONE: The value of this keyword is passed along to the CONGRID
               command. It prevents CONGRID from adding an extra row and
               column to the resulting array, which can be a problem with
               small image arrays.

     NOINTERPOLATION: Setting this keyword disables the default bilinear
               interpolation done to the image when it is resized. Nearest
               neighbor interpolation is done instead. This is preferred
               when you do not wish to change the pixel values of the image.
               This keyword must be set, for example, when you are displaying
               GIF files that come with their own non-IDL color table vectors.

     NORMAL:   Setting this keyword means image position coordinates x and y
               are interpreted as being in normalized coordinates. This keyword
               is only valid if the TV keyword is set.

     OVERPLOT: Setting this keyword causes the POSITION keyword to be ignored
               and the image is positioned in the location established by the
               last graphics command. For example:

                    Plot, Findgen(11), Position=[0.1, 0.3, 0.8, 0.95]
                    TVImage, image, /Overplot

     POSITION: The location of the image in the output window. This is
               a four-element floating array of normalized coordinates of
               the type given by !P.POSITION or the POSITION keyword to
               other IDL graphics commands. The form is [x0, y0, x1, y1].
               The default is [0.0, 0.0, 1.0, 1.0]. Note that this keyword is ALSO
               an output keyword. That is to say, upon return from TVIMAGE
               this keyword (if passed by reference) contains the actual
               position in the window where the image was displayed. This
               may be different from the input values if the KEEP_ASPECT_RATIO
               keyword is set, or if you are using TVIMAGE with the POSITION
               keyword when !P.MULTI is set to something other than a single
               plot. One use for the output values might be to position other
               graphics (e.g., a colorbar) in relation to the image.

               Note that the POSITION keyword should not, normally, be used
               when displaying multiple images with !P.MULTI. If it *is* used,
               its meaning differs slightly from its normal meaning. !P.MULTI
               is responsible for calculating the position of graphics in the
               display window. Normally, it would be a mistake to use a POSITION
               graphics keyword on a graphics command that was being drawn with
               !P.MULTI. But in this special case, TVIMAGE will use the POSITION
               coordinates to calculate an image position in the actual position
               calculated for the image by !P.MULTI. The main purpose of this
               functionality is to allow the user to display images along with
               colorbars when using !P.MULTI. See the example below.

     TV:       Setting this keyword makes the TVIMAGE command work much
               like the TV command, although better. That is to say, it
               will still set the correct DECOMPOSED state depending upon
               the kind of image to be displayed (8-bit or 24-bit). It will
               also allow the image to be "positioned" in the window by
               specifying the coordinates of the lower-left corner of the
               image. The NORMAL keyword is activated when the TV keyword
               is set, which will indicate that the position coordinates
               are given in normalized coordinates rather than device
               coordinates.

               Setting this keyword will ensure that the keywords
               KEEP_ASPECT_RATIO, MARGIN, MINUS_ONE, MULTI, and POSITION
               are ignored.

 OUTPUTS:
     None.

 SIDE EFFECTS:
     Unless the KEEP_ASPECT_RATIO keyword is set, the displayed image
     may not have the same aspect ratio as the input data set.

 RESTRICTIONS:
     If the POSITION keyword and the KEEP_ASPECT_RATIO keyword are
     used together, there is an excellent chance the POSITION
     parameters will change. If the POSITION is passed in as a
     variable, the new positions will be returned in the same variable
     as an output parameter.

     If a 24-bit image is displayed on an 8-bit display, the
     24-bit image must be converted to an 8-bit image and the
     appropriate color table vectors. This is done with the COLOR_QUAN
     function. The TVIMAGE command will load the color table vectors
     and set the NOINTERPOLATION keyword if this is done. Note that the
     resulting color table vectors are normally incompatible with other
     IDL-supplied color tables. Hence, other graphics windows open at
     the time the image is display are likely to look strange.

 EXAMPLE:
     To display an image with a contour plot on top of it, type:

        filename = FILEPATH(SUBDIR=['examples','data'], 'worldelv.dat')
        image = BYTARR(360,360)
        OPENR, lun, filename, /GET_LUN
        READU, lun, image
        FREE_LUN, lun

        TVIMAGE, image, POSITION=thisPosition, /KEEP_ASPECT_RATIO
        CONTOUR, image, POSITION=thisPosition, /NOERASE, XSTYLE=1, $
            YSTYLE=1, XRANGE=[0,360], YRANGE=[0,360], NLEVELS=10

     To display four images in a window without spacing between them:

     !P.Multi=[0,2,2]
     TVImage, image, Margin=0
     TVImage, image, Margin=0
     TVImage, image, Margin=0
     TVImage, image, Margin=0
     !P.Multi = 0

     To display four image in a window with associated color bars:

     !P.Multi=[0,2,2]
     p = [0.02, 0.3, 0.98, 0.98]
     LoadCT, 0
     TVImage, image, Position=p
     Colorbar, Position=[p[0], p[1]-0.1, p[2], p[1]-0.05]
     p = [0.02, 0.3, 0.98, 0.98]
     LoadCT, 2
     TVImage, image, Position=p
     Colorbar, Position=[p[0], p[1]-0.1, p[2], p[1]-0.05]
     p = [0.02, 0.3, 0.98, 0.98]
     LoadCT, 3
     TVImage, image, Position=p
     Colorbar, Position=[p[0], p[1]-0.1, p[2], p[1]-0.05]
     p = [0.02, 0.3, 0.98, 0.98]
     LoadCT, 5
     TVImage, image, Position=p
     Colorbar, Position=[p[0], p[1]-0.1, p[2], p[1]-0.05]
     !P.Multi =0

 MODIFICATION HISTORY:
      Written by:     David Fanning, 20 NOV 1996.
      Fixed a small bug with the resizing of the image. 17 Feb 1997. DWF.
      Removed BOTTOM and NCOLORS keywords. This reflects my growing belief
         that this program should act more like TV and less like a "color
         aware" application. I leave "color awareness" to the program
         using TVIMAGE. Added 24-bit image capability. 15 April 1997. DWF.
      Fixed a small bug that prevented this program from working in the
          Z-buffer. 17 April 1997. DWF.
      Fixed a subtle bug that caused me to think I was going crazy!
          Lession learned: Be sure you know the *current* graphics
          window! 17 April 1997. DWF.
      Added support for the PRINTER device. 25 June 1997. DWF.
      Extensive modifications. 27 Oct 1997. DWF
          1) Removed PRINTER support, which didn't work as expected.
          2) Modified Keep_Aspect_Ratio code to work with POSITION keyword.
          3) Added check for window-able devices (!D.Flags AND 256).
          4) Modified PostScript color handling.
      Craig Markwart points out that Congrid adds an extra row and column
          onto an array. When viewing small images (e.g., 20x20) this can be
          a problem. Added a Minus_One keyword whose value can be passed
          along to the Congrid keyword of the same name. 28 Oct 1997. DWF
      Changed default POSITION to fill entire window. 30 July 1998. DWF.
      Made sure color decomposition is OFF for 2D images. 6 Aug 1998. DWF.
      Added limited PRINTER portrait mode support. The correct aspect ratio
          of the image is always maintained when outputting to the
          PRINTER device and POSITION coordinates are ignored. 6 Aug 1998. DWF
      Removed 6 August 98 fixes (Device, Decomposed=0) after realizing that
          they interfere with operation in the Z-graphics buffer. 9 Oct 1998. DWF
      Added a MARGIN keyword. 18 Oct 1998. DWF.
      Re-established Device, Decomposed=0 keyword for devices that
         support it. 18 Oct 1998. DWF.
      Added support for the !P.Multi system variable. 3 March 99. DWF
      Added DEVICE, DECOMPOSED=1 command for all 24-bit images. 2 April 99. DWF.
      Added ability to preserve DECOMPOSED state for IDL 5.2 and higher. 4 April 99. DWF.
      Added TV keyword to allow TVIMAGE to work like the TV command. 11 May 99. DWF.
      Added the OVERPLOT keyword to allow plotting on POSITION coordinates
         estabished by the preceding graphics command. 11 Oct 99. DWF.
      Added automatic recognition of !P.Multi. Setting MULTI keyword is no
         longer required. 18 Nov 99. DWF.
      Added NOINTERPOLATION keyword so that nearest neighbor interpolation
         is performed rather than bilinear. 3 Dec 99. DWF
      Changed ON_ERROR condition from 1 to 2. 19 Dec 99. DWF.
      Added Craig Markwardt's CMCongrid program and removed RSI's. 24 Feb 2000. DWF.
      Added HALF_HALF keyword to support CMCONGRID. 24 Feb 2000. DWF.
      Fixed a small problem with image start position by adding ROUND function. 19 March 2000. DWF.
      Updated the PRINTER device code to take advantage of available keywords. 2 April 2000. DWF.
      Reorganized the code to handle 24-bit images on 8-bit displays better. 2 April 2000. DWF.
      Added BACKGROUND keyword. 20 April 2000. DWF.
      Fixed a small problem in where the ERASE was occuring. 6 May 2000. DWF.
      Rearranged the PLOT part of code to occur before decomposition state
         is changed to fix Background color bug in multiple plots. 23 Sept 2000. DWF.
      Removed MULTI keyword, which is no longer needed. 23 Sept 2000. DWF.
      Fixed a small problem with handling images that are slices from 3D image cubes. 5 Oct 2000. DWF.
      Added fix for brain-dead Macs from Ben Tupper that restores Macs ability to
         display images. 8 June 2001. DWF.
      Fixed small problem with multiple plots and map projections. 29 June 2003. DWF.
      Converted all array subscripts to square brackets. 29 June 2003. DWF.
      Removed obsolete STR_SEP and replaced with STRSPLIT. 27 Oct 2004. DWF.
      Small modification at suggestion of Karsten Rodenacker to increase size of
         images in !P.MULTI mode. 8 December 2004. DWF.
      Minor modifications on Karsten Rodenacker's own account concerning margination
         and TV behaviour. 8 December 2004. KaRo
      There was a small inconsistency in how the image was resized for PostScript as
         opposed to the display, which could occasionally result in a small black line
         to the right of the image. This is now handled consistently. 3 January 2007. DWF.
      Made a small change to CMCONGRID to permit nearest-neighbor interpolation for 3D arrays.
         Previously, any 24-bit image was interpolated, no matter the setting of the NOINTERP
         keyword. 22 April 2007. DWF.
      Updated the program for the 24-bit Z-buffer in IDL 6.4. 11 June 2007. DWF.
      Added new POSITION keyword functionality for !P.MULTI display. 9 Sept 2007. DWF.

(See /n/home09/ryantosca/IDL/gamap2/internals/tvimage.pro)