!-------------------------------------- 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 --------------------------------------
!
SUBROUTINE SUASYM2(lobsSpaceData) 1,39
#if defined (DOC)
*
*s/r SUASYM - SET CERTAIN PARAMETERS FOR THE ASYMMETRIC
* CHECK AND FOR VARIATIONAL QUALITY CONTROL
*
*Author : B. BRASNETT CMDA JUNE 1999
*Revision:
* S. Pellerin ARMA/SMC Nov. 2002
* . Elemination of nincrem variable
* R. Sarrazin/B. Brasnett CMC March 2004
* . tighten rejection on satwinds
* J. Hale CMC Sept. 2005
* . added MHS (codtyp=182).
* S. Macpherson ARMA/CMC Sept. 2007
* . add parameters for GB-GPS ZTD
* S. Macpherson ARMA/CMC March 2013
* . modified GPS ZTD parameters to increase QC-Var rejections
*
*Arguments
*
#endif
use MathPhysConstants_mod
use obsSpaceData_mod
use bufr
IMPLICIT NONE
type(struct_obs) :: lobsSpaceData
*
INTEGER JDATA,KINDIC,ITER,JJO,IDATA,IDATEND,IDBURP
INTEGER ITYP,IASS,IFLD,IOTHER,JJ,ISTYP,ILEV
real(8) ZAGZ,ZAHU,ZATT,ZDUV,ZDGZ,ZDTT,ZDHU,ZAUV,ZSLEV,ZAPN,ZDPN
real(8) ZABT,ZDBT,ZABTB,ZDBTB
real(8) ZLEV,ZJO,ZVAL,ZSPDO,ZSPDF,ZOFCST,ZOVAL,ZDIFF,ZAASYM,ZOER
real(8) ZFCST,ZLAT,ZLON,ZPRIOR,ZAPS,ZDPS,ZAUVRA,ZATTRA,ZATTSYM
LOGICAL LLOK
real(8) ZAZD, ZDZD
*
*_____prior probabilities for winds:ZAUV
* prior probabilities for scalar variables: zagz and zahu
* standard deviation multiple for background check for winds: zduv
* standard deviation multiple for background check for heights: zdgz
* standard deviation multiple for background check for humidity: zdhu
*
ZAGZ = 1.d-12
ZATT = 5.d-2
* ZATTRA = 1.d-2
ZATTRA = 0.005d0
* ZAUV = 0.01d0
ZAUV = 0.02d0
* ZAUVRA = 1.d-3
ZAUVRA = 1.d-5
* ZAHU = 0.01d0
ZAHU = 0.05d0
ZAPN = 1.d-4
ZAPS = 1.d-4
ZABT = 1.0d-1
ZABTB = 1.0d-1
ZATTSYM = 1.d-1
ZAZD = 2.0d-2
ZDUV = 5.d0
ZDGZ = 5.d0
ZDTT = 5.d0
ZDHU = 5.d0
ZDPN = 5.d0
ZDPS = 5.d0
ZDBT = 3.d0
ZDBTB = 3.d0
ZDZD = 3.d0
*
*
DO JJO = 1, obs_numheader
(lobsSpaceData)
IDATA = obs_headElem_i
(lobsSpaceData,OBS_RLN,JJO)
IDATEND = obs_headElem_i
(lobsSpaceData,OBS_NLV,JJO) + IDATA - 1
IDBURP = obs_headElem_i
(lobsSpaceData,OBS_ITY,JJO)
ZLAT = obs_headElem_r
(lobsSpaceData,OBS_LAT,JJO)*MPC_DEGREES_PER_RADIAN_R8
ZLON = obs_headElem_r
(lobsSpaceData,OBS_LON,JJO)*MPC_DEGREES_PER_RADIAN_R8
DO JDATA = IDATA, IDATEND
ITYP = obs_bodyElem_i
(lobsSpaceData,OBS_VNM,JDATA)
IASS = obs_bodyElem_i
(lobsSpaceData,OBS_ASS,JDATA)
ZLEV = obs_bodyElem_r
(lobsSpaceData,OBS_PPP,JDATA)*MPC_MBAR_PER_PA_R8
ZOER = obs_bodyElem_r
(lobsSpaceData,OBS_OER,JDATA)
ZVAL = obs_bodyElem_r
(lobsSpaceData,OBS_VAR,JDATA)
ZFCST= ZVAL - obs_bodyElem_r
(lobsSpaceData,OBS_OMP,JDATA)
C
IF (ITYP .EQ. BUFR_NETS .OR. ITYP .EQ. BUFR_NEPS .OR.
1 ITYP .EQ. BUFR_NEPN .OR. ITYP .EQ. BUFR_NESS .OR.
2 ITYP .EQ. BUFR_NEUS .OR. ITYP .EQ. BUFR_NEVS .OR.
3 ITYP .EQ. BUFR_NEZD) THEN
LLOK = (obs_bodyElem_i
(lobsSpaceData,OBS_ASS,JDATA) .EQ. 1)
ELSE
LLOK = (IASS .EQ. 1) .AND. ((obs_bodyElem_i
(lobsSpaceData,OBS_XTR,JDATA) .EQ.0)
1 .OR. ((obs_bodyElem_i
(lobsSpaceData,OBS_XTR,JDATA) .EQ. 2) .AND.
2 (obs_bodyElem_i
(lobsSpaceData,OBS_VNM,JDATA) .EQ. BUFR_NEGZ)))
ENDIF
IF (LLOK) THEN
IF (ITYP .EQ. BUFR_NEUU .OR. ITYP .EQ. BUFR_NEVV .OR.
1 ITYP .EQ. BUFR_NEUS .OR. ITYP .EQ. BUFR_NEVS) THEN
ZAASYM = 1.0d0
IOTHER = -1
IF (ITYP .EQ. BUFR_NEUU .OR. ITYP .EQ. BUFR_NEUS) THEN
DO JJ=IDATA,JDATA
ISTYP = obs_bodyElem_i
(lobsSpaceData,OBS_VNM,JJ)
ZSLEV = obs_bodyElem_r
(lobsSpaceData,OBS_PPP,JJ)*MPC_MBAR_PER_PA_R8
IF ((ISTYP .EQ. BUFR_NEVV .OR. ISTYP .EQ. BUFR_NEVS)
1 .AND. ZLEV .EQ. ZSLEV) THEN
IOTHER = JJ
ENDIF
ENDDO
ELSE
DO JJ=IDATA,JDATA
ISTYP = obs_bodyElem_i
(lobsSpaceData,OBS_VNM,JJ)
ZSLEV = obs_bodyElem_r
(lobsSpaceData,OBS_PPP,JJ)*MPC_MBAR_PER_PA_R8
IF ((ISTYP .EQ. BUFR_NEUU .OR. ISTYP .EQ. BUFR_NEUS)
1 .AND. ZLEV .EQ. ZSLEV) THEN
IOTHER = JJ
ENDIF
ENDDO
ENDIF
IF (IOTHER .NE. -1) THEN
ZOER = obs_bodyElem_r
(lobsSpaceData,OBS_OER,JDATA)
ZOVAL = obs_bodyElem_r
(lobsSpaceData,OBS_VAR,IOTHER)
ZOFCST = ZOVAL-obs_bodyElem_r
(lobsSpaceData,OBS_OMP,IOTHER)
ZSPDO = SQRT(ZOVAL*ZOVAL + ZVAL*ZVAL)
ZSPDF = SQRT(ZOFCST*ZOFCST + ZFCST*ZFCST)
ZDIFF = ZSPDO - ZSPDF
ILEV = NINT(ZLEV)
*
*___________________tighten rejection criterion for satob winds
*
IF (IDBURP .EQ. 88 .OR. IDBURP .EQ. 188) THEN
IF (ZDIFF .LT. 0.0d0 .AND. ABS(ZLAT) .GT. 20.d0 .AND.
1 ILEV .LT. 550) THEN
ZAASYM = 0.7d0*MAX(ZSPDF,1.0d0)
ZPRIOR = ZAASYM*ZAUV
IF (ZPRIOR .GT. 0.99d0) ZAASYM = 0.99d0/ZAUV
* WRITE(*,620)ZAASYM,ILEV,ZLAT,ZLON,ZSPDO,
* 1 ZSPDF
620 FORMAT('ASYMMETRIC TEST. ZAASYM=',f7.1,', LEV=',
1 I4,', LAT=',F5.1,', LON=',F5.1,
2 ', OBSERVED SPEED=',F4.0,', FCST SPEED=',F4.0)
ELSE
*
*_______________________zaasym used to specify new criterion for satwinds
* than are not included in the asymmetric test
*
ZAASYM = 10.d0
ENDIF
ENDIF
ENDIF
*
*_______________________INITIAL VALUE OF GAMMA FOR QCVAR (WINDS)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(1.d0 -
1 (1.d0-(ZAUV*ZAASYM))*(1.d0-(ZAUV*ZAASYM)))*(2.d0*MPC_PI_r8)/
2 ((1.d0-(ZAUV*ZAASYM))*(1.d0-(ZAUV*ZAASYM))*
3 (2.d0*ZDUV)*(2.d0*ZDUV)))
IF ((IDBURP .GE. 32 .AND. IDBURP .LE. 38) .OR.
1 (IDBURP .GE. 135 .AND. IDBURP .LE. 142) .OR.
1 (IDBURP .EQ. 132) )
2 call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,
+ (1.d0 - (1.d0-ZAUVRA)*(1.d0-ZAUVRA))
3 *(2.d0*MPC_PI_R8)/((1.d0-ZAUVRA)*(1.d0-ZAUVRA)*
4 (2.d0*ZDUV)*(2.d0*ZDUV)))
ELSEIF (ITYP .EQ. BUFR_NEGZ) THEN
*
* INITIAL VALUE OF GAMMA FOR QCVAR (HEIGHTS)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZAGZ*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZAGZ)*(2.d0*ZDGZ)))
ELSEIF (ITYP .EQ. BUFR_NETT) THEN
*
* INITIAL VALUE OF GAMMA FOR QCVAR (TEMPERATURES)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZATT*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZATT)*(2.d0*ZDTT)))
IF ((IDBURP .GE. 32 .AND. IDBURP .LE. 38) .OR.
1 (IDBURP .GE. 135 .AND. IDBURP .LE. 142) .OR.
1 (IDBURP .EQ. 132) )
2 call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZATTRA*
3 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZATTRA)*(2.d0*ZDTT)))
ELSEIF (ITYP .EQ. BUFR_NETS) THEN
*
* INITIAL VALUE OF GAMMA FOR QCVAR (SCREEN-LEVEL TEMPERATURES)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZATT*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZATT)*(2.d0*ZDTT)))
*
* ASYMMETRIC TEST FOR SHIP TEMPERATURES
*
IF ((IDBURP .EQ. 13) .AND. (ZVAL .GT. ZFCST)) THEN
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZATTSYM*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZATTSYM)*(2.d0*ZDTT)))
ENDIF
ELSEIF (ITYP .EQ. BUFR_NEPN) THEN
*
* INITIAL VALUE OF GAMMA FOR QCVAR (MSL PRESSURE)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZAPN*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZAPN)*(2.d0*ZDPN)))
ELSEIF (ITYP .EQ. BUFR_NEPS) THEN
*
* INITIAL VALUE OF GAMMA FOR QCVAR (STATION PRESSURE)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZAPS*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZAPS)*(2.d0*ZDPS)))
ELSEIF ( ITYP .EQ. 12062 .OR. ITYP .EQ. 12063 .OR.
1 ITYP .EQ. 12163) THEN
*
* INITIAL VALUE OF GAMMA FOR BRIGHTNESS TEMPERATURES
* TOVS AMSU-A + AIRS + IASI + GEORAD !!!!!
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZABT*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZABT)*(2.d0*ZDBT)))
IF (IDBURP .EQ. 181 .OR.
1 IDBURP .EQ. 182 ) THEN
*
* INITIAL VALUE OF GAMMA FOR TOVS AMSU-B (181) AND MHS (182)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZABTB*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZABTB)*(2.d0*ZDBTB)))
ENDIF
ELSEIF (ITYP .EQ. BUFR_NEZD) THEN
*
* INITIAL VALUE OF GAMMA FOR QCVAR (GPS ZENITH DELAY)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZAZD*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZAZD)*(2.d0*ZDZD)))
ELSE
*
* INITIAL VALUE OF GAMMA FOR QCVAR (OTHERS)
*
call obs_bodySet_r
(lobsSpaceData,OBS_POB,JDATA,(ZAHU*
1 SQRT(2.d0*MPC_PI_R8))/((1.d0-ZAHU)*(2.d0*ZDHU)))
ENDIF
ENDIF
END DO
C
END DO
RETURN
END