!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
! version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!
!* This is a subroutine that can apply to any instrument.
!* However, due to the necessity of specifying the instrument
!* bands wavenumbers, the use of this subroutine for a new instrument
!* would require the minor following changes.
!*
!* - Add a .cdk containing wavenumber information for all channels
!* Example: airsch.cdk for AIRS, variable AIRSSWN
!* - Continue the "find the bands (central) wavenumber" IF loop
!* for your specific instrument
SUBROUTINE NEW_EMISS ( SURFEM1, nchn,krtid,nprf,nchannels_max,iptobs) 1,8
#if defined (DOC)
!***********************************************************************
!
!**ID NEW_EMISS -- ASSIGN NEW IR SURFACE EMISSIVITIES
!
! SCIENCE: L. GARAND
! AUTHOR: A. BEAULNE (CMDA/SMC) June 2006
!
! REVISION:
!
! OBJECT: ASSIGN NEW IR SURFACE EMISSIVITIES BASED ON
! CMC ANALYSIS SURFACE ALBEDO, SEA ICE FRACTION AND SNOW MASK
! IN ADDITION TO CERES SURFACE TYPE AND WATER FRACTION
!
!
! ARGUMENTS:
! INPUT:
! -NCHN : NUMBER OF CHANNELS
! -KRTID : SENSOR NUMBER
! -NPRF : NUMBER OF PROFILES
! -NCHANNELS_MAX : TOTAL NUMBER OF OBSERVATIONS TREATED
! -IPTOBS(NPRF) : PROFILE POSITION NUMBER
!
! OUTPUT:
! -SURFEM1(NCHANNELS_MAX) : IR SURFACE EMISSIVITY ESTIMATE (0-1)
!
!***********************************************************************
#endif
use mod_tovs
use airsch
use iasich
use emissivities
IMPLICIT NONE
!implicits
#include "partov.cdk"
#include "comtov.cdk"
#include "comlun.cdk"
INTEGER :: JC,JN,NPRF,NCHANNELS_MAX,ICHN
INTEGER :: NCHN,IPTOBS(NPRF),KRTID
INTEGER :: KSURF(NPRF), LTYPE(NPRF)
INTEGER :: ILAT(NPRF), ILON(NPRF)
REAL :: ALBEDO(NPRF), ICE(NPRF), SNOW(NPRF), PCNT_WAT(NPRF)
REAL(8) :: ZLAT(NPRF), ZLON(NPRF), UWIND(NPRF), VWIND(NPRF), SATZANG(NPRF)
REAL(8) :: SURFEM1(NCHANNELS_MAX)
REAL :: WIND_SFC(NPRF),ANGLE(NPRF), F_LOW(NPRF)
REAL,ALLOCATABLE :: EM_OC(:,:),EMI_SFC(:,:),EMI_MAT(:,:),WAVEN(:)
!* information to extract (transvidage)
!--------------------------------------
!
! ZLAT(NPRF) -- latitude (-90 to 90)
! ZLON(NPRF) -- longitude (0 to 360)
! KSURF(NPRF) -- surface type (0, 1)
! UWIND(NPRF) -- surface u-component wind vector (m/s)
! VWIND(NPRF) -- surface v-component wind vector (m/s)
! SATZANG(NPRF) -- satellite zenith angle (deg)
DO JN = 1, NPRF
ZLAT(JN) = PROFILES_QC(IPTOBS(JN))%LAT
ZLON(JN) = PROFILES_QC(IPTOBS(JN))%LON
KSURF(JN) = PROFILES(IPTOBS(JN))%SKIN%SURFTYPE
UWIND(JN) = PROFILES(IPTOBS(JN))%S2M%U
VWIND(JN) = PROFILES(IPTOBS(JN))%S2M%V
SATZANG(JN) = PROFILES(IPTOBS(JN))%ZENANGLE
END DO
! assign surface properties from grid to profiles
CALL INTERP_SFC
(ILAT,ILON, nprf,zlat,zlon,iptobs)
! ALBEDO(NPRF) -- surface albedo (0-1)
! ICE(NPRF) -- ice cover (0-1)
! SNOW(NPRF) -- snow cover (0-1)
! LTYPE(NPRF) -- surface type (1,...,20)
! PCNT_WAT(NPRF) -- water percentage in pixel containing profile (0-1)
DO JN = 1, NPRF
ALBEDO(JN) = PROFILES_QC(IPTOBS(JN))%ALBEDO
ICE(JN) = PROFILES_QC(IPTOBS(JN))%ICE
SNOW(JN) = PROFILES_QC(IPTOBS(JN))%SNOW
LTYPE(JN) = PROFILES_QC(IPTOBS(JN))%LTYPE
PCNT_WAT(JN) = PROFILES_QC(IPTOBS(JN))%PCNT_WAT
END DO
!* find the sensor bands (central) wavenumbers
ALLOCATE(WAVEN(NCHN))
IF ( PLATFORM(KRTID) == 9 .and. &
& SATELLITE(KRTID) == 2 .and. &
& INSTRUMENT(KRTID) == 11 ) THEN !! --AIRS--
DO JC = 1, NCHN
ICHN = ICHAN(JC,KRTID)
WAVEN(JC) = AIRSSWN(AIRSSCH(ICHN))
END DO
ELSE IF ( PLATFORM(KRTID) == 10 .and. &
& SATELLITE(KRTID) == 2 .and. &
& INSTRUMENT(KRTID) == 16 ) THEN !! --IASI--
DO JC = 1, NCHN
ICHN = ICHAN(JC,KRTID)
WAVEN(JC) = IASISWN(IASISCH(ICHN))
END DO
END IF
!* get the CERES emissivity matrix for all sensor wavenumbers and surface types
ALLOCATE(EMI_MAT(NCHN,20))
CALL CERES_EMATRIX
(EMI_MAT, waven,nchn)
!* refine water emissivities
ALLOCATE(EM_OC(NCHN,NPRF))
DO JN = 1, NPRF
! find surface wind
WIND_SFC(JN) = MIN(SQRT(REAL(UWIND(JN)**2) + REAL(VWIND(JN)**2) + 1.E-12),15.)
! find satellite viewing angle
ANGLE(JN) = REAL(SATZANG(JN))
END DO
! find new ocean emissivities
DO JC = 1, NCHN
EM_OC(JC,:)= EMI_MAT(JC,17)
END DO
CALL EMI_SEA
(EM_OC, waven,angle,wind_sfc,nprf,nchn)
!* get surface emissivities
ALLOCATE(EMI_SFC(NCHN,NPRF))
DO JN = 1, NPRF
! set albedo to 0.6 where snow is present
IF ( KSURF(JN) == 0 .AND. SNOW(JN) > 0.999 ) ALBEDO(JN) = 0.6
! if albedo too high no water
IF ( ALBEDO(JN) >= 0.55 ) PCNT_WAT(JN) = 0.
! if water and CMC ice present then sea ice
IF ( KSURF(JN) == 1 .and. ICE(JN) > 0.001 ) LTYPE(JN) = 20
! if land and CMC snow present then snow
IF ( KSURF(JN) == 0 .and. SNOW(JN) > 0.999 ) LTYPE(JN) = 15
DO JC=1,NCHN
EMI_SFC(JC,JN) = PCNT_WAT(JN) * EM_OC(JC,JN) + &
& ( 1. - PCNT_WAT(JN) ) * EMI_MAT(JC,LTYPE(JN))
SURFEM1((JN-1)*NCHN+JC) = EMI_SFC(JC,JN)
END DO
END DO
DEALLOCATE (WAVEN,EMI_MAT,EM_OC,EMI_SFC)
!* update profiles
DO JN = 1, NPRF
PROFILES_QC(IPTOBS(JN))%ALBEDO = ALBEDO(JN)
PROFILES_QC(IPTOBS(JN))%PCNT_WAT = PCNT_WAT(JN)
PROFILES_QC(IPTOBS(JN))%LTYPE = LTYPE(JN)
END DO
!* find the regional water fraction (here in a 15x15 pixel box centered on profile)
CALL PCNT_BOX
(F_LOW, waterf,nprf,ilat,ilon,kslat,kslon,7)
DO JN = 1, NPRF
PROFILES_QC(IPTOBS(JN))%PCNT_REG = F_LOW(JN)
END DO
END SUBROUTINE NEW_EMISS