MODULE IO_Scene1 IMPLICIT NONE PUBLIC PUBLIC :: Scene_type TYPE :: Scene_type INTEGER :: iTyp !0->Scene, 1->retrieved scene (with ChiSq, etc) INTEGER :: AlgSN !Algorithm Serial number (svn). For algorithm-based scenes) INTEGER :: ProfIndx !Profile Index !---Atmospheric class / Surface class INTEGER :: iTypAtm !Atmospheric type ID CHARACTER(LEN=20) :: DescTypAtm !Label of Cthe atmospheric class INTEGER :: iTypSfc !Surface type ID CHARACTER(LEN=20) :: DescTypSfc !Label of Cthe surface class !---Atmosph Profile-related information INTEGER :: Nlev !Number of levels INTEGER :: Nlay !Number of layers INTEGER :: Nabsorb !Number of absorbents INTEGER, DIMENSION(:), POINTER :: AbsorbID !IDS of the absorbents REAL, DIMENSION(:), POINTER :: Pres_lev !Level pressure grid REAL, DIMENSION(:), POINTER :: Pres_lay !Layer pressure grid REAL, DIMENSION(:), POINTER :: Temp_lay !Layer temperature profile REAL, DIMENSION(:,:), POINTER :: Absorb_lay !Layer aborbents profiles INTEGER :: iH2O !Index of H2O (within absorb vector) INTEGER :: iO3 !Index of O3 within absorb vector !---Positioning Data REAL :: lat !Latitude REAL :: lon !Longitude INTEGER :: node !=0->ASC, =1->DE INTEGER :: scanDAY !Day INTEGER :: scanYear !Year REAL :: scanUTC !UTC time INTEGER :: iscanPos !Scan position INTEGER :: iScanLine !Scan line Index INTEGER :: nPosScan !Number of scan positions within scanline INTEGER :: nScanLines !Number of scanlines within orbit (some might be missing) !---Hydrometeors-related information INTEGER :: nParmCLW !#Parameters defining cloud INTEGER :: nParmRain !#Parameters defining rain INTEGER :: nParmSnow !#Parameters defining Snow INTEGER :: nParmIce !#Parameters defining Ice INTEGER :: nParmGrpl !#Parameters defining Graupel REAL, DIMENSION(:), POINTER :: Clw !Cloud amount vector REAL, DIMENSION(:), POINTER :: Rain !Rain amount vector REAL, DIMENSION(:), POINTER :: Snow !Snow amount vector REAL, DIMENSION(:), POINTER :: Ice !Ice amount vector REAL, DIMENSION(:), POINTER :: Graupel !Graupel amount vector !---Emiss-spectra -related information INTEGER :: Nchan !Number of channels REAL, DIMENSION(:), POINTER :: CentrFreq !Central frequencies INTEGER, DIMENSION(:), POINTER :: polarity !Polarizations REAL :: Angle !Angle REAL :: RelAziAngle!Relative Azimuth Angle REAL :: SolZenAngle!Solar Zenith Angle REAL, DIMENSION(:), POINTER :: Emiss !Emissivities vector REAL, DIMENSION(:), POINTER :: Refl !Reflectivities vector !---Surface-level parameters REAL :: WindSp !Wind speed REAL :: WindDir !Wind vector REAL :: WindU !U-direction wind speed REAL :: WindV !V-direction wind speed REAL :: Tskin !Skin temperature REAL :: DeltaT !Delta-Temperature REAL :: SfcPress !Surface pressure !---Additional information (used for GDAS,ECMWF, etc) REAL :: swe !Snow Water Equivalent REAL :: snowdepth !Snow Depth REAL :: soilMoist !Soil Moisture !---QC info INTEGER :: nqc !#Elements in QC INTEGER(2), DIMENSION(:), POINTER :: qc !QC vector !---Convergence/Measurements items (when the scene is a retrieved one) INTEGER :: nAttempt !Number of attempts performed for retrieval INTEGER :: nIter !Number of iterations REAL :: ChiSq !Convergence metric REAL, DIMENSION(:), POINTER :: YFwd !Last forward simulated TBs in retr. INTEGER, DIMENSION(:), POINTER :: ChanSel !Channels selection used in retr. REAL, DIMENSION(:), POINTER :: Ym !Measured TBs used for retrieval (uncorrected) REAL, DIMENSION(:), POINTER :: YmCorr !Measured TBs used for retrieval (corrected) !---Dummy placeholder variables INTEGER :: dummy !dummy variable (placeholder) END TYPE Scene_type INTEGER, PARAMETER :: H2OID = 1, O3ID = 3 PUBLIC :: MeasurData_type !----Global section of the module TYPE :: MeasurData_type INTEGER :: nchan !# of channels INTEGER :: nPosScan !# of scan positions within scanline INTEGER :: nScanLines !# of scanlines within file (some might be missing) INTEGER :: nqc !# QC elements INTEGER :: iscanPos !Scan position INTEGER :: iScanLine !Scan line index REAL :: lat !Latitude REAL :: lon !Longitude INTEGER :: Node !Orbit mode (Asc/Des) INTEGER :: Year !Year of measuremrent INTEGER :: Month !Month of measurement INTEGER :: Day !Day INTEGER :: julDay !Julian day REAL :: secs !Seconds within the day REAL :: RelAziAngle !Relative Azimuth Angle REAL :: SolZenAngle !Solar Zenith Angle REAL, DIMENSION(:), POINTER :: CentrFreq !Central frequencies REAL, DIMENSION(:), POINTER :: Rad !Radiances REAL, DIMENSION(:), POINTER :: tb !Brightness temperatures REAL, DIMENSION(:), POINTER :: angle !Viewing Angle REAL, DIMENSION(:), POINTER :: secant_view !Secant of viewing angle INTEGER, DIMENSION(:), POINTER :: qc !QC vector INTEGER, DIMENSION(:), POINTER :: polar !Polarizations END TYPE MeasurData_type CONTAINS SUBROUTINE ReadMeasurmts(iu,Y) INTEGER :: iu TYPE(MeasurData_type) :: Y INTEGER :: ichan ! ierr=0 READ(iu) Y%lat,Y%lon,Y%RelAziAngle,Y%SolZenAngle ! IF (ierr.ne.0) THEN ! ierr=Warn_readInvalid ! CALL ErrHandl(WarningType,Warn_readInvalid,'Radiances invalid.(ReadMeasurements)') ! RETURN ! ENDIF READ(iu) Y%Node,Y%iscanPos,Y%iscanLine,Y%Year,Y%julDAY,Y%secs READ(iu) Y%angle(1:Y%nchan) READ(iu) Y%tb(1:Y%nchan) IF (Y%nqc.gt.0) READ(iu) Y%qc(1:Y%nqc) DO ichan=1,Y%nchan Y%secant_view(ichan) = 1./cos(deg2rad(Y%angle(ichan))) ENDDO RETURN !10 ierr=Warn_EndOfFile ! CALL ErrHandl(WarningType,Warn_EndOfFile,'(ReadMeasurements)') ! RETURN !20 ierr=Warn_readInvalid ! CALL ErrHandl(WarningType,Warn_readInvalid,'(ReadMeasurements)') ! RETURN END SUBROUTINE ReadMeasurmts ! SUBROUTINE ReadHdrMeasurmts(MeasurFile,iu,nMeasurData,MeasurData) SUBROUTINE ReadHdrMeasurmts(iu,nMeasurData,MeasurData) ! CHARACTER(LEN=*) :: MeasurFile TYPE(MeasurData_type) :: MeasurData INTEGER :: iu,nMeasurData !---Open file containing radiance measurements ! iu=get_lun() ! OPEN(iu,file=MeasurFile,form='unformatted',status='old') !---Read header/Place holder READ(iu) nMeasurData READ(iu) MeasurData%nchan READ(iu) MeasurData%nPosScan,MeasurData%nScanLines READ(iu) MeasurData%nqc ALLOCATE(MeasurData%CentrFreq(MeasurData%nchan),MeasurData%Rad(MeasurData%nchan), & MeasurData%qc(MeasurData%nqc),MeasurData%Tb(MeasurData%nchan), & MeasurData%polar(MeasurData%nchan),MeasurData%angle(MeasurData%nchan), & MeasurData%secant_view(MeasurData%nchan)) READ(iu) MeasurData%CentrFreq(1:MeasurData%nchan) READ(iu) MeasurData%polar(1:MeasurData%nchan) PRINT*,nMeasurData,MeasurData%nchan,MeasurData%nPosScan,MeasurData%nScanLines,MeasurData%nqc PRINT*,MeasurData%CentrFreq(1:MeasurData%nchan) PRINT*,MeasurData%polar(1:MeasurData%nchan) RETURN END SUBROUTINE ReadHdrMeasurmts SUBROUTINE ReadHdrScene(iu,Scene,nprf) INTEGER :: iu,nprf TYPE(Scene_type) :: Scene READ(iu) Scene%iTyp,Scene%AlgSN!iTyp: =0->Simple Scene, =1->Retrieved Scene READ(iu) nprf READ(iu) Scene%nLay READ(iu) Scene%nLev READ(iu) Scene%nChan READ(iu) Scene%nPosScan READ(iu) Scene%nScanLines READ(iu) Scene%nAbsorb READ(iu) Scene%nParmCLW READ(iu) Scene%nParmRain READ(iu) Scene%nParmSnow READ(iu) Scene%nParmIce READ(iu) Scene%nParmGrpl ALLOCATE(Scene%AbsorbID(1:Scene%nAbsorb),Scene%CentrFreq(1:Scene%nchan),& Scene%polarity(1:Scene%nchan)) READ(iu) Scene%AbsorbID(1:Scene%nAbsorb) READ(iu) Scene%CentrFreq(1:Scene%nchan) READ(iu) Scene%polarity(1:Scene%nchan) ! READ(iu) AbsorbID ! READ(iu) CentrFreq ! READ(iu) polarity READ(iu) Scene%nqc Scene%iH2O = FindIndx(Scene%AbsorbID,H2OID) Scene%iO3 = FindIndx(Scene%AbsorbID,O3ID) !---Allocate the arrays for future reading ALLOCATE(Scene%pres_lay(1:Scene%nLay),Scene%Temp_lay(1:Scene%nLay), & Scene%Absorb_lay(1:Scene%nLay,1:Scene%nAbsorb), & Scene%Clw(1:Scene%nParmCLW),Scene%Rain(1:Scene%nParmRain), & Scene%Snow(1:Scene%nParmSnow),Scene%Ice(1:Scene%nParmIce), & Scene%Graupel(1:Scene%nParmGrpl),Scene%Emiss(1:Scene%nchan), & Scene%Refl(1:Scene%nchan),Scene%pres_lev(1:Scene%nLev), & Scene%qc(1:Scene%nqc),Scene%YFwd(1:Scene%nchan), & Scene%ChanSel(1:Scene%nchan),Scene%Ym(1:Scene%nchan), & Scene%YmCorr(1:Scene%nchan)) RETURN END SUBROUTINE ReadHdrScene SUBROUTINE ReadScene(iu,Scene) INTEGER :: iu, ierr TYPE(Scene_type) :: Scene ierr=0 READ(iu,iostat=ierr,end=10) Scene%ProfIndx ! IF (ierr.ne.0) THEN ! ierr=Warn_readInvalid ! CALL ErrHandl(WarningType,Warn_readInvalid,'Scene invalid.') ! RETURN ! ENDIF !---Atmospheric constituents READ(iu,err=20) Scene%pres_lay(1:Scene%nLay) READ(iu,err=20) Scene%pres_lev(1:Scene%nLev) READ(iu,err=20) Scene%Temp_lay(1:Scene%nLay) READ(iu,err=20) Scene%Absorb_lay(1:Scene%nLay,1:Scene%nAbsorb) !---hydrometeors READ(iu,err=20) Scene%Clw(1:Scene%nParmCLW) READ(iu,err=20) Scene%Rain(1:Scene%nParmRain) READ(iu,err=20) Scene%Graupel(1:Scene%nParmGrpl) Scene%Snow(1:Scene%nParmSnow) =0. Scene%Ice(1:Scene%nParmIce) =0. !---Emissivity/reflectivity vectors READ(iu,err=20) Scene%Emiss(1:Scene%nchan) READ(iu,err=20) Scene%angle,Scene%WindSp,Scene%Tskin,Scene%SfcPress,Scene%iTypSfc,Scene%WindU,Scene%WindV,& Scene%RelAziAngle,Scene%SolZenAngle,Scene%SnowDepth !---QC variables READ(iu,err=20) Scene%qc(1:Scene%nqc) !---Positioning variables READ(iu,err=20) Scene%lat,Scene%lon,Scene%node,Scene%scanUTC,Scene%scanYear,Scene%scanDay,Scene%iscanPos,Scene%iscanLine !---In case the scene is a retrieved one IF (Scene%iTyp .eq. 1) THEN READ(iu,err=20) Scene%nAttempt,Scene%nIter,Scene%ChiSq READ(iu,err=20) Scene%YFwd(1:Scene%nchan) READ(iu,err=20) Scene%ChanSel(1:Scene%nchan) READ(iu,err=20) Scene%Ym(1:Scene%nchan) READ(iu,err=20) Scene%YmCorr(1:Scene%nchan) ENDIF RETURN 10 CONTINUE ! ierr=Warn_EndOfFile ! CALL ErrHandl(WarningType,Warn_EndOfFile,'Scene') PRINT*, 'end of file' RETURN 20 CONTINUE !20 ierr=Warn_readInvalid ! CALL ErrHandl(WarningType,Warn_readInvalid,'(ReadScene)') PRINT*, 'read invalid' RETURN END SUBROUTINE ReadScene INTEGER FUNCTION FindIndx(AbsorbID,ID) INTEGER, DIMENSION(:) :: AbsorbID INTEGER :: ID !---Local variables INTEGER :: iId,nIDs nIDs = SIZE(AbsorbID) FindIndx = -1 DO iId=1,nIDs IF (ID .eq. AbsorbID(iId)) THEN FindIndx = iId ENDIF ENDDO ! IF (FindIndx .eq. -1) CALL ErrHandl(WarningType,Warn_NoMolecIndxFound,'') RETURN END FUNCTION FindIndx REAL FUNCTION deg2rad(angle) REAL :: angle deg2rad=angle*3.14159/180. END FUNCTION deg2rad END MODULE IO_Scene1