Files
GEOS-Chem-adjoint-v35-note/code/obs_operators/airsv5_mod.f90
2018-08-28 00:40:44 -04:00

1018 lines
36 KiB
Fortran

MODULE AIRSv5_MOD
!*********************************************************************
! Module AIRSv5_MOD contains variables for reading data from AIRS.
! Each array is used to store data read from AIRS file with data for
! 1 day (jaf, 8/20/07)
!
! Module Variables:
! ============================================================================
! (1 ) SurfPressure : surface pressure read from file
! (2 ) COcol : columns read from AIRS file
! (3 ) qual : quality flag for CO value
! (4 ) dofs : degrees of freedom for each observation
! (5 ) Longitude : vector of longitudes read from AIRS file
! (6 ) Latitude : vector of latitudes read from AIRS file
! (7 ) YYYYMMDD : date of observation
! (8 ) FILENAME : name of input file
! (9 ) iNObs : number of observations in one file
! (10) NObss : total number of observations in one day
! (11) COlev : indices of CO trapeziods
! (12) NTraps : number of trapezoids (9)
! (13) Plev : AIRS 100 pressure levels
! (14) NLevs : number of pressure levels (100)
! (15) AvgKer : AIRS averaging kernel (on 9 trapezoids)
! (16) BotLev : Lowest level near surface (see discussion
! of nSurfSup in documentation)
! (17) LocalT : Local solar time of granule center
!
! Module subroutines:
! ===========================================================================
! (1 ) FILE_INFO --> moved to airs_co_obs_mod.f
! (2 ) INFO_AIRS
! (3 ) INIT_READ_AIRS
! (4 ) CLEANUP_AIRS
!
!*********************************************************************
IMPLICIT NONE
! Make everything PUBLIC
PUBLIC
!=============================================================
! MODULE VARIABLES
!=============================================================
REAL*4, ALLOCATABLE :: SurfPressure(:)
REAL*4, ALLOCATABLE :: COcol(:)
REAL*4, ALLOCATABLE :: COcd(:,:)
REAL*4, ALLOCATABLE :: LandFrac(:)
REAL*4, ALLOCATABLE :: H2Ocd(:,:)
REAL*4, ALLOCATABLE :: Tsurf(:)
REAL*4, ALLOCATABLE :: AvgKer(:,:,:)
REAL*4, ALLOCATABLE :: dofs(:)
REAL*8, ALLOCATABLE :: Longitude(:)
REAL*8, ALLOCATABLE :: Latitude(:)
REAL*8, ALLOCATABLE :: Hour(:)
REAL*8, ALLOCATABLE :: Minute(:)
CHARACTER(LEN=3), ALLOCATABLE :: DNFlag(:)
INTEGER, ALLOCATABLE :: qual(:)
INTEGER*2, ALLOCATABLE :: NTraps(:)
INTEGER*2, ALLOCATABLE :: LocalT(:)
INTEGER, ALLOCATABLE :: iNObs(:)
INTEGER, ALLOCATABLE :: BotLev(:)
INTEGER :: Nobss
INTEGER :: NFiles
! NTraps0 is hardwired as this does not change for CO.
! This is the ideal number of trapezoids. Some retrievals
! will not have 9, and this is what is read by NTraps.
! This must be changed if you use a different species.
INTEGER, PARAMETER :: NTraps0=9
INTEGER, PARAMETER :: NLevs=100
INTEGER*4, ALLOCATABLE :: COlev(:)
REAL*4 :: Plev(NLevs)
! Date Information
INTEGER :: YEAR, MONTH, DAY, IDAY
CHARACTER(LEN=255), ALLOCATABLE :: FILENAME(:)
INTEGER, ALLOCATABLE:: DOMAIN_OBS(:,:)
!=================================================================
! MODULE ROUTINES -- follow below the "CONTAINS" statement
!=================================================================
CONTAINS
!------------------------------------------------------------------------------
!!$ SUBROUTINE FILE_INFO
!!$!
!!$!******************************************************************************
!!$! Subroutine FILE_INFO sets the directory and filename given the date. The
!!$! date is currently hardwired. (jaf, 6/1/07)
!!$!******************************************************************************
!!$
!!$ ! References to F90 modules
!!$ USE TIME_MOD, ONLY : EXPAND_DATE
!!$ USE FILE_MOD, ONLY : IOERROR
!!$
!!$ ! Arguments
!!$ CHARACTER(LEN=255) :: DIR_AIRS
!!$ CHARACTER(LEN=255) :: FILENAME_IN
!!$ CHARACTER(LEN=255) :: file
!!$ CHARACTER(LEN= 8) :: YYYYMMDDs
!!$ INTEGER :: IU_FILE, IOS, IOS1, I
!!$
!!$ !=================================================================
!!$ ! FILE_INFO begins here!
!!$ !=================================================================
!!$
!!$ ! Set date and corresponding input AIRS filename
!!$ DIR_AIRS = '/san/as04ro/data/obs/airs/'
!!$ !DIR_AIRS = '/san/as04/home/ctm/mak/AIRS/data_airs/'
!!$ !DIR_AIRS = '/as/data-rw/corrections/as/data/airs/'
!!$ FILENAME_IN='input.txt'
!!$
!!$ IU_FILE=15
!!$ OPEN( IU_FILE, FILE=FILENAME_IN, IOSTAT=IOS )
!!$ IF ( IOS /= 0 ) CALL IOERROR( IOS, IU_FILE, 'airs:1' )
!!$
!!$ ! zero counters
!!$ Nfiles = 0
!!$
!!$ ! Figure out how many files to read (#lines in the file):
!!$ CALL SYSTEM('wc -l '//trim(FILENAME_IN)//' > tmp.txt')
!!$
!!$ OPEN( 5, FILE='tmp.txt', IOSTAT=IOS1 )
!!$ IF ( IOS1 /= 0 ) CALL IOERROR( IOS1, 5, 'tmp:1' )
!!$
!!$ ! Read #lines
!!$ READ( 5, *, IOSTAT=IOS1 ) NFiles
!!$ IF ( IOS1 /= 0 ) CALL IOERROR( IOS1, 5, 'tmp:2' )
!!$
!!$ ! Close file
!!$ CLOSE( 5 )
!!$
!!$ PRINT*, 'Number of Files: ', NFiles
!!$ ALLOCATE( iNObs (NFiles) )
!!$
!!$ ALLOCATE( FILENAME(NFiles) )
!!$ DO i = 1, NFiles
!!$
!!$ IF ( IOS < 0 ) EXIT
!!$ IF ( IOS > 0 ) CALL IOERROR( IOS, IU_FILE, 'airs:2' )
!!$
!!$ READ( IU_FILE,'(a)',IOSTAT=IOS) file
!!$ IF (i .eq. 1) &
!!$ YYYYMMDDs = file(6:9)//file(11:12)//file(14:15)
!!$ FILENAME(i)=trim(DIR_AIRS)//YYYYMMDDs//'/'//trim(file)
!!$ print*, 'filename:', trim(filename(i))
!!$
!!$ ENDDO
!!$
!!$ ! Close file
!!$ CLOSE( IU_FILE )
!!$
!!$ READ (YYYYMMDDs,*) YYYYMMDD
!!$
!!$ PRINT*,'Date: ',YYYYMMDD
!!$
!!$ ! Return to calling program
!!$ END SUBROUTINE FILE_INFO
!!$
!!$!------------------------------------------------------------------------------
SUBROUTINE INFO_AIRS
!
!******************************************************************************
! Subroutine INFO_AIRS Info prints info about all VDATA and SDATA fields
! contained within the AIRS HDF file. Based on INFO_MOP02 (bmy, 7/3/03,
! 4/27/05; jaf 8/15/07)
!******************************************************************************
! References to F90 modules
USE He4SwathModule
USE He4IncludeModule
INTEGER :: fId, sId
CHARACTER(LEN=HE4_MAX_CHAR) :: swathname = &
'L2_Support_atmospheric&surface_product'
! For dimension information
INTEGER :: nDims
INTEGER :: dims(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: dimNames(HE4_MAX_FLDS)
! For swath attributes
INTEGER :: nAttrs
REAL*4 :: attrValue(HE4_MAX_ATRS)
CHARACTER(LEN=HE4_MAX_CHAR) :: attrName(HE4_MAX_ATRS)
! For geolocation fields
INTEGER :: nGeo
INTEGER :: geoRank(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: geoName(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: geoType(HE4_MAX_FLDS)
! For data fields
INTEGER :: nData
INTEGER :: dataRank(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: dataName(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: dataType(HE4_MAX_FLDS)
!=================================================================
! INFO_AIRS begins here!
!=================================================================
! Set verbose output
CALL He4VerboseOutput( .TRUE. )
! Open HDF-EOS5 swath and get the file ID number
CALL He4FileOpen( FILENAME(1), fId )
! Attach to swath and get swath ID number
CALL He4SwathAttach( fId, swathName, sId )
! Get swath attributes
CALL He4SwathAttrs( sId, nAttrs, attrName, attrValue )
! Get swath dimension info
CALL He4SwathDimInfo( sId, nDims, dims, dimNames )
! Get information about geolocation fields
CALL He4SwathGeoFldInfo( sId, nGeo, geoRank, geoName, geoType )
! Get information about data fields
CALL He4SwathDataFldInfo( sId, nData, dataRank, dataName, dataType )
!------------------------------------------------------------------------
! Cleanup and quit
!------------------------------------------------------------------------
! Detach from swath
CALL He4SwathDetach( sId )
! Close HDF-EOS5 file
CALL He4FileClose( fId )
! Return to calling program
END SUBROUTINE INFO_AIRS
!------------------------------------------------------------------------------
SUBROUTINE INIT_READ_AIRS
!********************************************************************
! SUBROUTINE INIT_READ_AIRS allocates all module arrays and reads data
! into them from the HDF file. Based on subroutine READ_MOP02.
!*********************************************************************
! References to F90 modules
USE He4ErrorModule
USE He4SwathModule
USE He4GridModule
USE He4IncludeModule
USE FILE_MOD, ONLY : IOERROR
USE JULDAY_MOD, ONLY : CALDATE, JULDAY
USE TIME_MOD, ONLY : YMD_EXTRACT
! Arguments
! File and Swath Info
INTEGER :: fId, sId, as
CHARACTER(LEN=HE4_MAX_CHAR) :: SWATHNAME = &
'L2_Support_atmospheric&surface_product'
! For dimension information
INTEGER :: nDims
INTEGER :: dims(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: dimNames(HE4_MAX_FLDS)
! For data fields
INTEGER :: nData
INTEGER :: dataRank(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: dataName(HE4_MAX_FLDS)
CHARACTER(LEN=HE4_MAX_CHAR) :: dataType(HE4_MAX_FLDS)
! Fill value
CHARACTER(LEN=HE4_MAX_CHAR) :: name
REAL*4 :: dataFill
! For data field info
INTEGER :: fldDims(HE4_MAX_DIMS)
INTEGER :: fldRank
CHARACTER(LEN=HE4_MAX_CHAR) :: fldType
CHARACTER(LEN=HE4_MAX_CHAR) :: fldDimNames(HE4_MAX_DIMS)
! For swath attribute info
INTEGER :: nAttrs
CHARACTER(LEN=HE4_MAX_CHAR) :: attrName(HE4_MAX_ATRS)
INTEGER*2 :: attrValue(HE4_MAX_ATRS)
INTEGER :: status, strBufSize
CHARACTER(LEN=HE4_MAX_CHAR) :: attrList
! HDF_EOS5 library routines
INTEGER :: SwInqAttrs
INTEGER :: SwRdAttr
INTEGER(HE4_INT) :: nX, nY, nZ, nW
INTEGER :: N, I, J, K
INTEGER :: YYYYMMDD_tmp,HHMMSS,SS
INTEGER*4 :: track, xtrack
REAL*4, ALLOCATABLE :: temp4(:,:)
REAL*4, ALLOCATABLE :: temp4_3d(:,:,:)
REAL*4, ALLOCATABLE :: temp4_4d(:,:,:,:)
REAL*8, ALLOCATABLE :: temp8(:,:)
INTEGER, ALLOCATABLE :: HH(:,:),MM(:,:)
INTEGER*2, ALLOCATABLE :: tempi2(:,:)
INTEGER*4, ALLOCATABLE :: tempi4(:,:)
INTEGER*4, ALLOCATABLE :: tempi_1d(:)
CHARACTER(LEN=6) :: temp_str
REAL*8, ALLOCATABLE :: Time(:)
REAL*4 :: fyr,fday
! For reading pressure file
CHARACTER(LEN=255) :: Pfile
INTEGER :: IU_FILE, IOS, z, s
REAL*4 :: ptemp
!=================================================================
! Init_Read_AIRS begins here!
!=================================================================
!----------------------------------------------------------------
! Read dimensions and allocate arrays
!----------------------------------------------------------------
!!$ DO I = 1, NFiles
!!$
!!$ ! Open HDF-EOS5 swath and get the file ID number
!!$ CALL He4FileOpen( FILENAME(I), fId )
!!$
!!$ ! Attach to swath and get swath ID number
!!$ CALL He4SwathAttach( fId, swathName, sId )
!!$
!!$ ! Get swath dimension info
!!$ CALL He4SwathDimInfo( sId, nDims, dims, dimNames )
!!$
!!$ DO N = 1, nDims
!!$ IF ( TRIM(dimNames(N)) == 'GeoXTrack' ) xtrack = dims(N)
!!$ IF ( TRIM(dimNames(N)) == 'GeoTrack' ) track = dims(N)
!!$ ENDDO
!!$
!!$ IF (xtrack .ne. 30) PRINT*,FILENAME(I),': xtrack=',xtrack
!!$ IF ( track .ne. 45) PRINT*,FILENAME(I),': track=',track
!!$
!!$ ! Detach from swath
!!$ CALL He4SwathDetach( sId )
!!$
!!$ ! Close HDF-EOS5 file
!!$ CALL He4FileClose( fId )
!!$
!!$ iNObs(I) = track*xtrack
!!$ ENDDO
iNObs(:)=1350
Nobss = SUM(iNObs)
PRINT*,'### Number of Observations: ',Nobss
ALLOCATE( Longitude ( Nobss) )
ALLOCATE( Latitude ( Nobss) )
ALLOCATE( Hour ( NObss) )
ALLOCATE( Minute ( NObss) )
ALLOCATE( SurfPressure( Nobss) )
ALLOCATE( DNFlag ( NObss) )
ALLOCATE( COcol( Nobss) )
ALLOCATE( Tsurf( Nobss) )
ALLOCATE( LandFrac( NObss) )
ALLOCATE( qual( Nobss) )
ALLOCATE( NTraps( Nobss) )
ALLOCATE( dofs( Nobss) )
ALLOCATE( BotLev( Nobss) )
ALLOCATE( AvgKer( NTraps0, NTraps0, Nobss) )
ALLOCATE( COcd( NLevs, Nobss ) )
ALLOCATE( H2Ocd( NLevs, Nobss ) )
ALLOCATE( LocalT( Nobss) )
Longitude(:) = 0d0
Latitude(:) = 0d0
Hour(:) = 0d0
Minute(:) = 0d0
SurfPressure(:)=0d0
DNflag(:) = 'NA'
COcol(:)=0d0
Tsurf(:)=0d0
LandFrac(:)=0d0
qual(:)=0
NTraps(:)=0
dofs(:)=0
BotLev(:)=0
AvgKer(:,:,:)=0d0
LocalT(:)=0
COcd(:,:)=0d0
H2Ocd(:,:)=0d0
! Note: Trapezoid layer indices and pressure levels do not change,
! so these are read only once, from the first file
! Open HDF-EOS5 swath and get the file ID number
CALL He4FileOpen( FILENAME(1), fId )
! Attach to swath and get swath ID number
CALL He4SwathAttach( fId, SWATHNAME, sId )
!----------------------------------------------------------------
! Read trapezoid layer information from HDF-EOS file (1-D INT*4)
!----------------------------------------------------------------
! Field name
name = 'CO_trapezoid_layers'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*4 variables BEFORE array allocation!
nX = fldDims(1)
! Allocate array
ALLOCATE( tempi_1d( nX ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'CO_trapezoid_layers' )
tempi_1d = 0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, tempi_1d )
ALLOCATE( COlev( nX+1 ) )
COlev=0
COlev(1:nX)=tempi_1d
COlev(nX+1)=NLevs
DEALLOCATE(tempi_1d)
!----------------------------------------------------------------
! Read pressure level information from HDF-EOS file (1-D INT*4)
!----------------------------------------------------------------
! Field name
name = 'pressSupp'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*4 variables BEFORE array allocation!
nX = fldDims(1)
! Read data from swath
CALL He4SwathReadData( sId, name, nX, Plev )
! Detach from swath
CALL He4SwathDetach( sId )
! Close HDF-EOS5 file
CALL He4FileClose( fId )
!----------------------------------------------------------------
! Loop over files to read all info for one day
!----------------------------------------------------------------
DO I = 1, NFiles
! Open HDF-EOS5 swath and get the file ID number
CALL He4FileOpen( FILENAME(I), fId )
! Attach to swath and get swath ID number
CALL He4SwathAttach( fId, SWATHNAME, sId )
!----------------------------------------------------------------
! Read local solar time from HDF-EOS file (INTEGER*2)
! Read day/night flag from HDF-EOS file (INTEGER*2)
!----------------------------------------------------------------
! Get list of attribute names
nAttrs = SwInqAttrs( sId, attrList, strBufSize )
! Separate list into array
CALL makeCharArrayFromCharList( attrList, ',', attrName )
DO N = 1, nAttrs
status = SwRdAttr( sId, TRIM( attrName(N) ), attrValue(N) )
ENDDO
DO N = 1, nAttrs
IF ( TRIM( attrName(N) ) .EQ. 'LocTimeGranuleCen' ) THEN
LocalT( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I))) = &
attrValue(N)
EXIT
ENDIF
ENDDO
temp_str=' '
CALL He4SwathReadAttr( sId, 'DayNightFlag', temp_str)
DNFlag( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I))) = temp_str
temp_str=' '
s = SUM(iNObs(1:I))-iNObs(I)
DO z = 1, 1350
IF( DNFlag(s+z) .ne. 'Day') then
GOTO 222
ENDIF
ENDDO
!----------------------------------------------------------------
! Read latitude data from HDF-EOS file (2-D REAL*8)
!----------------------------------------------------------------
print*, 'read other stuff before latitude'
call flush(6)
! Field name
name = 'Latitude'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp8( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'Latitude' )
temp8 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp8 )
Latitude( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp8, (/ iNObs(I) /) )
DEALLOCATE(temp8)
!----------------------------------------------------------------
! Read longitude data from HDF-EOS file (2-D REAL*8)
!----------------------------------------------------------------
! Field name
name = 'Longitude'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp8( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'Longitude' )
temp8 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp8 )
Longitude( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp8, (/ iNObs(I) /) )
DEALLOCATE(temp8)
!----------------------------------------------------------------
! Read time data from HDF-EOS file (2-D REAL*8)
!----------------------------------------------------------------
! Field name
name = 'Time'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp8( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'Time' )
ALLOCATE( HH( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'Time:HH' )
ALLOCATE( MM( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'Time:MM' )
temp8 = 0d0
HH = 0
MM = 0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp8 )
temp8 = JULDAY(1993,1,1d0) + (temp8 / 86400d0)
DO J = 1, nX
DO K = 1, nY
CALL CALDATE( Temp8(J,K), YYYYMMDD_tmp, HHMMSS )
CALL YMD_EXTRACT(HHMMSS,HH(J,K),MM(J,K),SS)
ENDDO
ENDDO
HOUR( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( HH, (/ iNObs(I) /) )
MINUTE( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( MM, (/ iNObs(I) /) )
DEALLOCATE(temp8)
DEALLOCATE(HH)
DEALLOCATE(MM)
! DEALLOCATE(Time)
!----------------------------------------------------------------
! Read surface pressure data from HDF-EOS file (2-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'PSurfStd'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp4( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'PSurfStd')
temp4 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp4 )
SurfPressure( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4, (/ iNObs(I) /) )
DEALLOCATE(temp4)
!----------------------------------------------------------------
! Read CO column data from HDF-EOS file (2-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'CO_total_column'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp4( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'CO_total_column' )
temp4 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp4 )
COcol( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4, (/ iNObs(I) /) )
DEALLOCATE(temp4)
!----------------------------------------------------------------
! Read land fraction data from HDF-EOS file (2-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'landFrac'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp4( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'landFrac' )
temp4 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp4 )
LandFrac( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4, (/ iNObs(I) /) )
DEALLOCATE(temp4)
!----------------------------------------------------------------
! Read surface air temperature data from HDF-EOS file (2-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'TSurfAir'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp4( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'TSurfAir')
temp4 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp4 )
Tsurf( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4, (/ iNObs(I) /) )
DEALLOCATE(temp4)
!!$ !----------------------------------------------------------------
!!$ ! Read CO layer column density data from HDF-EOS file (3-D REAL*4)
!!$ !----------------------------------------------------------------
!!$
!!$ ! Field name
!!$ name = 'COCDSup'
!!$
!!$ ! Get fill value (if necessary to strip out missing data values)
!!$ CALL He4SwathFillValue( sId, name, dataFill )
!!$
!!$ ! Get field info (array dimensions are in fldDims)
!!$ CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
!!$
!!$ ! Copy dims to INTEGER*8 variables BEFORE array allocation!
!!$ nX = fldDims(1)
!!$ nY = fldDims(2)
!!$ nZ = fldDims(3)
!!$
!!$ ! Allocate array
!!$ ALLOCATE( temp4_3d( nX, nY, nZ ), stat=as )
!!$ IF ( as /= 0 ) CALL He4AllocErr( 'COCDSup' )
!!$ temp4_3d = 0d0
!!$
!!$ ! Read data from swath
!!$ CALL He4SwathReadData( sId, name, nX, nY, nZ, temp4_3d )
!!$
!!$ COcd( :, SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
!!$ RESHAPE( temp4_3d, (/ NLevs, iNObs(I) /) )
!!$ DEALLOCATE(temp4_3d)
!!$
!----------------------------------------------------------------
! Read H2O layer column density data from HDF-EOS file (3-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'H2OCDSup'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
nZ = fldDims(3)
! Allocate array
ALLOCATE( temp4_3d( nX, nY, nZ ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'H2OCDSup' )
temp4_3d = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, nZ, temp4_3d )
H2Ocd( :, SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4_3d, (/ NLevs, iNObs(I) /) )
DEALLOCATE(temp4_3d)
!----------------------------------------------------------------
! Read averaging kernel data from HDF-EOS file (4-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'CO_ave_kern'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
nZ = fldDims(3)
nW = fldDims(4)
! Allocate array
ALLOCATE( temp4_4d( nX, nY, nZ, nW), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'CO_ave_kern' )
temp4_4d(:,:,:,:) = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, nZ, nW, temp4_4d )
AvgKer( :, :, SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4_4d, (/ NTraps0, NTraps0, iNObs(I)/) )
DEALLOCATE(temp4_4d)
!----------------------------------------------------------------
! Read degrees of freedom data from HDF-EOS file (2-D REAL*4)
!----------------------------------------------------------------
! Field name
name = 'CO_dof'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate array
ALLOCATE( temp4( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'CO_dof' )
temp4 = 0d0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, temp4 )
dofs( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( temp4, (/ iNObs(I) /) )
DEALLOCATE(temp4)
!----------------------------------------------------------------
! Read quality data from HDF-EOS file (2-D UNSIGNED INTEGER*4)
!----------------------------------------------------------------
! Field name
name = 'Qual_CO'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate arrays
ALLOCATE( tempi2( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'Qual_CO' )
tempi2 = 0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, tempi2 )
qual( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( tempi2, (/ iNObs(I) /) )
DEALLOCATE(tempi2)
!----------------------------------------------------------------
! Read number of AK entries from HDF-EOS file (2-D INTEGER*2)
!----------------------------------------------------------------
! Field name
name = 'num_CO_Func'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate arrays
ALLOCATE( tempi2( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'num_CO_Func' )
tempi2 = 0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, tempi2 )
NTraps( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( tempi2, (/ iNObs(I) /) )
DEALLOCATE(tempi2)
!----------------------------------------------------------------
! Read bottom level from HDF-EOS file (2-D INTEGER*4)
!----------------------------------------------------------------
! Field name
name = 'nSurfSup'
! Get fill value (if necessary to strip out missing data values)
CALL He4SwathFillValue( sId, name, dataFill )
! Get field info (array dimensions are in fldDims)
CALL He4SwathFldInfo( sId, name, fldType, fldRank, fldDims, fldDimNames )
! Copy dims to INTEGER*8 variables BEFORE array allocation!
nX = fldDims(1)
nY = fldDims(2)
! Allocate arrays
ALLOCATE( tempi4( nX, nY ), stat=as )
IF ( as /= 0 ) CALL He4AllocErr( 'nSurfSup' )
tempi4 = 0
! Read data from swath
CALL He4SwathReadData( sId, name, nX, nY, tempi4 )
BotLev( SUM(iNObs(1:I))-iNObs(I)+1 : SUM(iNObs(1:I)) ) = &
RESHAPE( tempi4, (/ iNObs(I) /) )
DEALLOCATE(tempi4)
!----------------------------------------------------------------
! Cleanup and quit
!----------------------------------------------------------------
222 CONTINUE
! Detach from swath
CALL He4SwathDetach( sId )
! Close HDF-EOS5 file
CALL He4FileClose( fId )
ENDDO
!----------------------------------------------------------------
! Echo min & max values
!----------------------------------------------------------------
PRINT*, '### Lat min, max: ', MINVAL( Latitude ), MAXVAL( Latitude )
PRINT*, '### Lon min, max: ', MINVAL( Longitude ), MAXVAL( Longitude )
PRINT*, '### LocalT: ', MINVAL(LocalT)
PRINT*, '### Hour min, max: ', MINVAL( Hour ), MAXVAL( Hour )
PRINT*, '### Minute min, max: ', MINVAL( Minute ), MAXVAL( Minute )
PRINT*, '### SurfPressure min, max:', MINVAL( SurfPressure ), &
MAXVAL( SurfPressure )
PRINT*, '### COcol min, max: ', MINVAL( COcol ), MAXVAL( COcol )
PRINT*, '### Tsurf min, max: ', MINVAL( Tsurf ), MAXVAL( Tsurf )
PRINT*, '### LandFrac min, max: ', MINVAL( LandFrac ), MAXVAL( LandFrac )
PRINT*, '### COcd min, max: ', MINVAL( COcd ), MAXVAL( COcd )
PRINT*, '### H2Ocd min, max: ', MINVAL( H2Ocd ), MAXVAL( H2Ocd )
! PRINT*, '### AvgKer min, max: ', MINVAL( AvgKer ), MAXVAL( AvgKer )
! PRINT*, '### dofs min, max: ', MINVAL( dofs ), MAXVAL( dofs )
! PRINT*, '### qual min, max: ', MINVAL( qual ), MAXVAL( qual )
! PRINT*, '### BotLev min, max: ', MINVAL( BotLev ), MAXVAL( BotLev )
! PRINT*, '### NTraps min, max: ', MINVAL( NTraps ), MAXVAL( NTraps )
! PRINT*, '### COlev: ', COlev
PRINT*, '### Plev min, max: ',Plev(1),Plev(NLevs)
! PRINT*, '### Day Night Flag: ', DNFlag(1350)
! Return to calling program
END SUBROUTINE INIT_READ_AIRS
!------------------------------------------------------------------------------
SUBROUTINE CLEANUP_AIRS
!
!******************************************************************************
! Subroutine CLEANUP_AIRS deallocates all module arrays (jaf, 8/15/07)
!******************************************************************************
!
!=================================================================
! CLEANUP_AIRS begins here!
!=================================================================
IF ( ALLOCATED( iNObs ) ) DEALLOCATE( iNObs )
IF ( ALLOCATED( Filename ) ) DEALLOCATE( Filename )
IF ( ALLOCATED( Latitude ) ) DEALLOCATE( Latitude )
IF ( ALLOCATED( Longitude ) ) DEALLOCATE( Longitude )
IF ( ALLOCATED( Hour ) ) DEALLOCATE( Hour )
IF ( ALLOCATED( Minute ) ) DEALLOCATE( Minute )
IF ( ALLOCATED( SurfPressure ) ) DEALLOCATE( SurfPressure )
IF ( ALLOCATED( DNFlag ) ) DEALLOCATE( DNFlag )
IF ( ALLOCATED( COcol ) ) DEALLOCATE( COcol )
IF ( ALLOCATED( Tsurf ) ) DEALLOCATE( Tsurf )
IF ( ALLOCATED( LandFrac ) ) DEALLOCATE( LandFrac )
IF ( ALLOCATED( COcd ) ) DEALLOCATE( COcd )
IF ( ALLOCATED( H2Ocd ) ) DEALLOCATE( H2Ocd )
IF ( ALLOCATED( AvgKer ) ) DEALLOCATE( AvgKer )
IF ( ALLOCATED( qual ) ) DEALLOCATE( qual )
IF ( ALLOCATED( dofs ) ) DEALLOCATE( dofs )
IF ( ALLOCATED( COlev ) ) DEALLOCATE( COlev )
IF ( ALLOCATED( BotLev ) ) DEALLOCATE( BotLev )
IF ( ALLOCATED( NTraps ) ) DEALLOCATE( NTraps )
IF ( ALLOCATED( LocalT ) ) DEALLOCATE( LocalT )
IF ( ALLOCATED( DOMAIN_OBS ) ) DEALLOCATE( DOMAIN_OBS )
! Return to calling program
END SUBROUTINE CLEANUP_AIRS
!------------------------------------------------------------------------------
! End of module
END MODULE AIRSv5_MOD