diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90 index 01b8ad3b08d16de5328da5c3af533b5d6c483817..98e480a511cd2e6adf2ede770f03d47d03f7f5aa 100644 --- a/src/MNH/diag.f90 +++ b/src/MNH/diag.f90 @@ -65,6 +65,8 @@ !! 05/2010 Add lidar !!! 03/2012 (S. Bielli) Add NAM_NCOUT for netcdf output !! 03/2013 (O.Caumont) Modif call aircraft_balloon +!! 03/2013 (C. Augros) Add variables for radar simulator in NAMELIST: +!! NBAZIM,LSNRT,XSNRMIN ! ! !------------------------------------------------------------------------------- @@ -206,9 +208,9 @@ NAMELIST/NAM_DIAG/ CISO, LVAR_RS, LVAR_LS, & NGPS,XLAT_GPS,XLON_GPS,XZS_GPS,CNAM_GPS,XDIFFORO, & NVERSION_RAD, NCURV_INTERPOL, LCART_RAD, CARF,LREFR,LDNDZ,& XLON_RAD,XLAT_RAD,XALT_RAD,CNAME_RAD,XLAM_RAD,XDT_RAD, & - NDIFF,LATT,NPTS_GAULAG,NPTS_H,NPTS_V,XSTEP_RAD,NBSTEPMAX, & + NDIFF,LATT,NPTS_GAULAG,NPTS_H,NPTS_V,XSTEP_RAD,NBSTEPMAX,NBAZIM, & XGRID,NBELEV,XELEV,NBRAD,LQUAD,LFALL,LWBSCS,LWREFL,& - XREFLMIN,XREFLVDOPMIN,& + XREFLMIN,XREFLVDOPMIN,LSNRT,XSNRMIN,& LLIDAR,CVIEW_LIDAR,XALT_LIDAR,XWVL_LIDAR,& LISOPR,XISOPR,LISOTH,XISOTH, LHU_FLX ! @@ -297,6 +299,7 @@ NVERSION_RAD=1 XSTEP_RAD=XUNDEF NCURV_INTERPOL=0 LCART_RAD=.TRUE. +NBAZIM=720 XLON_RAD(:)=XUNDEF XLAT_RAD(:)=XUNDEF XALT_RAD(:)=XUNDEF @@ -324,6 +327,8 @@ LWREFL=.FALSE. LWBSCS=.FALSE. XREFLMIN=-30. XREFLVDOPMIN=-990. +LSNRT=.TRUE. +XSNRMIN=0 ! LDIAG(:)=.FALSE. XDIAG(:)=XUNDEF diff --git a/src/MNH/modd_radar.f90 b/src/MNH/modd_radar.f90 index 65f695f889fb3f00df2bbd33e7ae1a3cba5dfe8d..f66b0d2f6c88547ae6c0b444126ade603677e0fc 100644 --- a/src/MNH/modd_radar.f90 +++ b/src/MNH/modd_radar.f90 @@ -30,7 +30,8 @@ !! Original 20/11/03 !! O. Caumont 14/09/09 Removal of XAZIM !! O. Caumont 14/09/09 Possibility to use polar coordinates -!------------------------------------------------------------------------------- +!! C. Augros 2013 Simulator RADAR : add LSNRT XSNRMIN +!!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ @@ -74,6 +75,10 @@ LOGICAL :: LWBSCS ! weighting by backscattering cross sections LOGICAL :: LWREFL ! weighting by reflectivities REAL :: XREFLMIN ! min val for reflectivities REAL :: XREFLVDOPMIN ! min val for Doppler velocities +LOGICAL :: LSNRT !if .TRUE. the threshold on Z and V is function of SNR +REAL :: XSNRMIN !SNR threshold under which reflectivity is set to -XUNDEF if (LSNRT=.TRUE.) + + END MODULE MODD_RADAR diff --git a/src/MNH/mode_arf.f90 b/src/MNH/mode_arf.f90 index ee67ca990648874e4fa5406111b518fcf9d99b6e..d3e43ae1842dfc324b7ff65eb57314c6c64ebcaf 100644 --- a/src/MNH/mode_arf.f90 +++ b/src/MNH/mode_arf.f90 @@ -30,6 +30,9 @@ !! Pruppacher, H. R. and K. V. Beard, 1970: A wind tunnel investigation of the !! internal circulation and shape of water drops falling at terminal velocity in !! air. Quart. J. Roy. Meteor. Soc., 96, 247-256. +!! +!! Brandes, E. A., G. Zhang, J. Vivekanandan, 2002: Experiments in Rainfall Estimation +!! with a Polarimetric Radar in a Subtropical Environment. J. Appl. Met., 41, 674-685 !! !! !! AUTHOR @@ -39,7 +42,8 @@ !! MODIFICATIONS !! ------------- !! Original 08/02/2005 -!-------------------------------------------------------------------------------- +!! C. Augros 26/10/2012 : Ajout fonction Brandes et al 2002 +!!-------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -66,12 +70,20 @@ CONTAINS ELSE ARF=1. END IF - ELSE + ELSE IF (CARF=="AND99") THEN IF(PDEQ>=1.1E-3.and.PDEQ<=4.4E-3) THEN ARF=1.012-14.4*PDEQ-1.03E4*PDEQ**2 ELSE ARF=MAX(1.0048+.57*PDEQ-2.628E4*PDEQ**2+3.682E6*PDEQ**3-1.677E8*PDEQ**4,.2) END IF + ELSE IF (CARF=="BR02") THEN + IF (PDEQ < 0.5E-3) THEN + ARF=1. + ELSE + ARF=0.9951+0.02510E3*PDEQ-0.03644E6*PDEQ**2+0.0053030E9*PDEQ**3-0.0002492E12*PDEQ**4 + ENDIF + ELSE IF (CARF=="SPHE") THEN + ARF=1. END IF END FUNCTION ARF diff --git a/src/MNH/mode_interpol_beam.f90 b/src/MNH/mode_interpol_beam.f90 index 1084b95b3b1030a36b3a383ca0268c097d6c8535..8205b8c6dc13f6c0819764958a4d105691aabb1f 100644 --- a/src/MNH/mode_interpol_beam.f90 +++ b/src/MNH/mode_interpol_beam.f90 @@ -309,6 +309,7 @@ CONTAINS USE MODD_PARAMETERS USE MODD_GRID_n + USE MODE_ll ! IMPLICIT NONE ! @@ -342,14 +343,9 @@ CONTAINS ! IPAS=0 ! - IIU=SIZE(PZM,1) - IJU=SIZE(PZM,2) + CALL GET_INDICE_ll( IIB,IJB,IIE,IJE) IKU=SIZE(PZM,3) - IIB = JPHEXT + 1 - IJB = JPHEXT + 1 IKB = JPVEXT + 1 - IIE = IIU - JPHEXT - IJE = IJU - JPHEXT IKE = IKU - JPVEXT ! @@ -363,7 +359,7 @@ CONTAINS IPAS=0 II=COUNT(PXHATM(:) <= PX_RAY(JI,JEL,JAZ,JL,JH,JV)) ! number of mass points x-coordinates less than x-position of current ray point IJ=COUNT(PYHATM(:) <= PY_RAY(JI,JEL,JAZ,JL,JH,JV)) - IF ( (II <= IIE-1) .AND. (II >= IIB) .AND. (IJ <= IJE-1) .AND. (IJ >= IJB) ) THEN + IF ( (II <= IIE) .AND. (II >= IIB) .AND. (IJ <= IJE) .AND. (IJ >= IJB) ) THEN ! WRITE(ILUOUT0,*) 'inside the horizontal domain ' ZXCOEF=(PX_RAY(JI,JEL,JAZ,JL,JH,JV)-PXHATM(II))/(PXHATM(II+1)-PXHATM(II)) ZYCOEF=(PY_RAY(JI,JEL,JAZ,JL,JH,JV)-PYHATM(IJ))/(PYHATM(IJ+1)-PYHATM(IJ)) @@ -402,7 +398,7 @@ CONTAINS END DO ENDIF ELSE - IF ((IK00 <= IKE-1).AND. (IK01 <= IKE-1) .AND. (IK10 <= IKE-1) .AND. (IK11 <= IKE-1) ) THEN + IF ((IK00 <= IKE).AND. (IK01 <= IKE) .AND. (IK10 <= IKE) .AND. (IK11 <= IKE) ) THEN ! We are above below the lowest mass level and below the upper mass level IPAS=2 ZZCOEF00=(PZ_RAY(JI,JEL,JAZ,JL,JH,JV) -PZM(II,IJ,IK00)) /(PZM(II,IJ,IK00+1)-PZM(II,IJ,IK00)) diff --git a/src/MNH/mode_readtmat.f90 b/src/MNH/mode_readtmat.f90 new file mode 100644 index 0000000000000000000000000000000000000000..afd2fb4501f5245be9838da9761e079b522ffd1b --- /dev/null +++ b/src/MNH/mode_readtmat.f90 @@ -0,0 +1,559 @@ +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for RCS information +!----------------------------------------------------------------- +!----------------------------------------------------------------- +! ######spl + MODULE MODE_READTMAT +! #################### +! +!!**** *MODE_READTMAT* - module routines +!! +!! PURPOSE +!! ------- +!! Reads coefficients RE IM S11,S22 in Tmat lookup table, build from Tmat_20140121.f +!! in rep /home/augros/Programmes/T-Matrice/Clotilde/ClotildeV3 +!! which is a modification of Mishchenko code +!! +!!** IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! +!! +!! +!! AUTHOR +!! ------ +!! C. Augros * Meteo France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 30/10/2012 +!! +!! C. Augros 15/11/2012 : if ZLAM, D, T or ZELEV are out of the table limits +!! S11, S22... are set to 0 => this is realistic only in case of small D, below Dmin +!! but in reality it happens also for large D (> 8mm) => needs to be corrected +!! +!! ----- MY_MODIF 4 ------ +!! C. Augros 7/12/2012 : quadrilinear interpolation instead of the ponderation by 1/d**2 +!! as done in ReadResuTmatV3.f90 (Programmes/T-Matrice/Clotilde/ClotildeV3/ReadResuTmatV3) +!! +!! ----- MY_MODIF 5 ------ +!! C. Augros 12/12/2012 +!! SUBROUTINE READTMAT(PLAM_RAD,PELEV_RAD,PT,Dm,RES11,IMS11,& +!! RES22,IMS22,RES11f,IMS11f,RES22f,IMS22f) instead of +!! SUBROUTINE READTMAT(PLAM_RAD,PELEV_RAD,PT,Dm,S11,S22,S11f,S22f) +!! +!! ----- MY_MODIF 6 ------ +!! C. Augros 13/12/2012 +!! add of : +!! SUBROUTINE READTMATINT(PLAM_RAD,PELEV_RAD,PT,M,PS11_CARRE,PS22_CARRE,& +!! S22S11,PRE_S22FMS11F,PIM_S22FT,PIM_S11FT) +!! read the 2nd Tmat table with the PS11_CARRE, PS22_CARRE... integrated +!! over all diameters (table made by MakeTmatIntegree.f90) +!! as done in ReadTmatInt (Programmes/T-Matrice/Clotilde/ClotildeV3/ +!! TmatIntegree/ReadTmatInt/) +!! +!! C. Augros 01/2013 +!! Corrections dans subroutine READTMAT et READTMATINT des erreurs de lecture +!! des tables (remplacement de ZLAM_INF, ZTC_INF... par PLAM_MIN, PTC_MIN) +!! +!! ----- MY_MODIF 12 ------ +!! C. Augros 13/12/2012 +!! +!! SUBROUTINE CALC_KTMAT(PLAM_RAD,PELEV_RAD,PT,M,PLAM_MIN,PLAM_MAX,PLAM_STEP,& +!! PELEV_MIN,PELEV_MAX,PELEV_STEP,PTC_MIN,PTC_MAX,PTC_STEP,& +!! KTMAT,PLAM_RED,PELEV_RED,PTC_RED,PM_RED)!! +!! => calcul des positions dans la table Tmat (ktmat) des coefficients à interpoler +!! et des variables réduites qui traduisent la position entre 0 et 1 de ZLAM, ZELEV, +!! ZTC et M par rapport aux bornes sup et inf +!! +!! ------------ MY_MODIF 13 ------ +!! C. Augros 6/02/2014 +!! modification CALC_KTMAT et INTERPOL pour tenir compte de la colonne supplémentaire ZFW (wet graupel) +!! uniquement pour les tables Tmat 06 +!! suppresion de la routine READTMATINT + +!! C. Augros 3/06/2014 +! Correction signe < dans mode_readtmat pour condition T° wet graupel +! et modif dans calc_ktmat pour initialiser ZFW à 0 ou à max si proche des min et max + +!! ------------- MY_MODIF 14 ------ +! C. Augros 3/06/2014 +! modif seuils sur PR_RAY, PS_RAY...: on remplace par une condition sur M (hydromet content)> minM=10-7 +! pour être cohérent avec la valeur min dans les tables Tmat => evite plein de calculs pour rien +! +! C. Augros 11/06/2014 +! Correction du bug dans CALC_KTMAT (mode_readtmat): INB_FW et pas ZFW !!! +! => correction du pb dans la bande brillante + +!! ------------- MY_MODIF 15 ------ +! C. Augros 11/06/2014 (pas d'impact sur mode_readtmat) +! => dans radar_scat: calcul fonction diélectique dans la glace avec maxwell garnett (et pas Smith 84) +! si NDIFF=7 => calcul avec Mie pour la glace primaire +! => dans write_lfifm1: ecriture des sorties sur une seule colonne F12.5 (on supprime az, porte) + +!! ------------- MY_MODIF 16 ------ +! C. Augros 22/08/2014 +! On ne conserve que les routines CALC_KTMAT et INTERPOL (qui sont appelées dans radar_scat si NDIFF=7) +! Suppression de READTMAT (avec la nouvelle version de radarscat, les tables tmat +! intégrées sont lues au début du code, pas besoin de les relire à chaque fois) +!------------------------------------------------------------------------------- +!-------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS + +! ------------ +USE MODD_RADAR, ONLY:XVALGROUND +USE MODD_CST, ONLY: XPI +USE MODD_PARAMETERS, ONLY:XUNDEF,NUNDEF +! +!------------------------------------------------------------------------------- +! +CONTAINS +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +!* 1. SUBROUTINE CALC_KTMAT +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! ################################################# + SUBROUTINE CALC_KTMAT(PELEV_RAD,PT,PFW,PM,& + PELEV_MIN,PELEV_MAX,PELEV_STEP,PTC_MIN,PTC_MAX,PTC_STEP,& + PFW_MIN,PFW_MAX,PFW_STEP,PEXPM_MIN,PEXPM_MAX,PEXPM_STEP,& + KTMAT,PELEV_RED,PTC_RED,PFW_RED,PM_RED) +! ################################################# + +IMPLICIT NONE +! Arguments entree et sortie +REAL,INTENT(IN) :: PELEV_RAD,PT,PFW,PM,PEXPM_MIN,PEXPM_MAX,PEXPM_STEP,& +PELEV_MIN,PELEV_MAX,PELEV_STEP,PTC_MIN,PTC_MAX,PTC_STEP,PFW_MIN,PFW_MAX,PFW_STEP +INTEGER,DIMENSION(16),INTENT(OUT):: KTMAT +REAL,INTENT(OUT) :: PELEV_RED,PTC_RED,PFW_RED,PM_RED + +!************* Declarations *************** +REAL :: ZELEV,ZELEV_INF,ZELEV_SUP +REAL :: ZTC,ZTC_INF,ZTC_SUP +REAL :: ZFW_INF,ZFW_SUP,ZFW +REAL :: ZEXPM,ZEXPM_INF,ZEXPM_SUP,ZEXPM_RED,ZM_INF,ZM_SUP +INTEGER :: IELEV,ITC,IFW,IEXPM +INTEGER :: INB_ELEV,INB_TC,INB_FW,INB_M +INTEGER :: IELEVS,ITCS,IEXPMS,IFWS +!********************************************** +!***** Parametres !!! ****** +!********************************************** +!Conversion de l'elevation en degre (a partir de la valeur en radian) +ZELEV=PELEV_RAD*180./XPI +!Conversion de la temperature de °K en °C +ZTC=PT-273.15 +!Hydromet content +ZEXPM=LOG10(PM) +!Liquid water fraction +ZFW=PFW + + +!On verifie que ZELEV, ZTC, ZFW et M sont compris dans les bornes min et max + +IF (ABS(ZELEV-PELEV_MIN) < PELEV_STEP/10) ZELEV=PELEV_MIN +IF (ABS(ZELEV-PELEV_MAX) < PELEV_STEP/10) ZELEV=PELEV_MAX +IF (ABS(ZTC-PTC_MIN) < PTC_STEP/10) ZTC=PTC_MIN +IF (ABS(ZTC-PTC_MAX) < PTC_STEP/10) ZTC=PTC_MAX +IF (ABS(ZFW-PFW_MIN) < PFW_STEP/10) ZFW=PFW_MIN +IF (ABS(ZFW-PFW_MAX) < PFW_STEP/10) ZFW=PFW_MAX +IF (ABS(ZEXPM-PEXPM_MIN) < PEXPM_STEP/10) ZEXPM=PEXPM_MIN +IF (ABS(ZEXPM-PEXPM_MAX) < PEXPM_STEP/10) ZEXPM=PEXPM_MAX + +IF ((ZELEV >=PELEV_MIN).AND. (ZELEV<=PELEV_MAX) .AND.& + (ZTC >=PTC_MIN) .AND. (ZTC<=PTC_MAX) .AND.(ZFW >=PFW_MIN) .AND. (ZFW<=PFW_MAX) .AND.& + (ZEXPM >=PEXPM_MIN).AND. (ZEXPM<=PEXPM_MAX)) THEN + + !Recherche dans le fichier de la position des valeurs encadrant les + !valeurs données ci-dessus + !------- ZELEV ------------------ + IELEV=floor((ZELEV-PELEV_MIN)/PELEV_STEP) + ZELEV_INF=PELEV_MIN+IELEV*PELEV_STEP + IF (ZELEV==ZELEV_INF) THEN + IELEVS=IELEV + ELSE + IELEVS=IELEV+1 + ENDIF + ZELEV_SUP=PELEV_MIN+IELEVS*PELEV_STEP + INB_ELEV=nint((PELEV_MAX-PELEV_MIN)/PELEV_STEP)+1 + !WRITE(0,*) "IELEV,IELEVS,ZELEV_INF,ZELEV_SUP,INB_ELEV : ",IELEV,IELEVS,ZELEV_INF,ZELEV_SUP,INB_ELEV + !------- ZTC ------------------ + ITC=floor((ZTC-PTC_MIN)/PTC_STEP) + ZTC_INF=PTC_MIN+ITC*PTC_STEP + IF (ZTC==ZTC_INF) THEN + ITCS=ITC + ELSE + ITCS=ITC+1 + ENDIF + ZTC_SUP=PTC_MIN+(ITCS)*PTC_STEP + INB_TC=nint((PTC_MAX-PTC_MIN)/PTC_STEP)+1 + !WRITE(0,*) "ITC,ITCS,ZTC_INF,ZTC_SUP,INB_TC : ",ITC,ITCS,ZTC_INF,ZTC_SUP,INB_TC + + !------- ZFW ------------------ + IFW=floor((ZFW-PFW_MIN)/PFW_STEP) + ZFW_INF=PFW_MIN+IFW*PFW_STEP + IF (ZFW==ZFW_INF) THEN + IFWS=IFW + ELSE + IFWS=IFW+1 + ENDIF + ZFW_SUP=PFW_MIN+(IFWS)*PFW_STEP + INB_FW=nint((PFW_MAX-PFW_MIN)/PFW_STEP)+1 + !WRITE(0,*) "IFW,IFWS,ZFW_INF,ZFW_SUP,INB_FW : ",IFW,IFWS,ZFW_INF,ZFW_SUP,INB_FW + + !------- PM ------------------ + IEXPM=floor((ZEXPM-PEXPM_MIN)/PEXPM_STEP) + ZEXPM_INF=PEXPM_MIN+IEXPM*PEXPM_STEP + IF (ZEXPM==ZEXPM_INF) THEN + IEXPMS=IEXPM + ELSE + IEXPMS=IEXPM+1 + ENDIF + ZEXPM_SUP=PEXPM_MIN+IEXPMS*PEXPM_STEP + INB_M=nint((PEXPM_MAX-PEXPM_MIN)/PEXPM_STEP)+1 + ZM_INF=10**ZEXPM_INF + ZM_SUP=10**ZEXPM_SUP + !WRITE(0,*) "IEXPM,IEXPMS,ZEXPM_INF,ZEXPM_SUP,INB_M,ZM_INF,ZM_SUP : ",& + !IEXPM,IEXPMS,ZEXPM_INF,ZEXPM_SUP,INB_M,ZM_INF,ZM_SUP + !WRITE(0,*) " " + + !-- Calcul des variables reduites (comprises entre 0 et 1) + ! pour l'interpolation linaire + IF (ZELEV_SUP .NE. ZELEV_INF) THEN + PELEV_RED=(ZELEV-ZELEV_INF)/(ZELEV_SUP-ZELEV_INF) + ELSE + PELEV_RED=0 + ENDIF + IF (ZTC_SUP .NE. ZTC_INF) THEN + PTC_RED=(ZTC-ZTC_INF)/(ZTC_SUP-ZTC_INF) + ELSE + PTC_RED=0 + ENDIF + IF (ZFW_SUP .NE. ZFW_INF) THEN + PFW_RED=(ZFW-ZFW_INF)/(ZFW_SUP-ZFW_INF) + ELSE + PFW_RED=0 + ENDIF + IF (ZEXPM_SUP .NE. ZEXPM_INF) THEN + PM_RED=(PM-ZM_INF)/(ZM_SUP-ZM_INF) + ZEXPM_RED=(ZEXPM-ZEXPM_INF)/(ZEXPM_SUP-ZEXPM_INF) + ELSE + PM_RED=0 + ENDIF + KTMAT(1)=ITC*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFW*INB_M+IEXPM+1 + KTMAT(2)=ITC*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFW*INB_M+IEXPMS+1 + KTMAT(3)=ITC*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFWS*INB_M+IEXPM+1 + KTMAT(4)=ITC*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFWS*INB_M+IEXPMS+1 + KTMAT(5)=ITC*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFW*INB_M+IEXPM+1 + KTMAT(6)=ITC*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFW*INB_M+IEXPMS+1 + KTMAT(7)=ITC*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFWS*INB_M+IEXPM+1 + KTMAT(8)=ITC*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFWS*INB_M+IEXPMS+1 + KTMAT(9)=ITCS*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFW*INB_M+IEXPM+1 + KTMAT(10)=ITCS*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFW*INB_M+IEXPMS+1 + KTMAT(11)=ITCS*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFWS*INB_M+IEXPM+1 + KTMAT(12)=ITCS*INB_ELEV*INB_FW*INB_M+IELEV*INB_FW*INB_M+IFWS*INB_M+IEXPMS+1 + KTMAT(13)=ITCS*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFW*INB_M+IEXPM+1 + KTMAT(14)=ITCS*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFW*INB_M+IEXPMS+1 + KTMAT(15)=ITCS*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFWS*INB_M+IEXPM+1 + KTMAT(16)=ITCS*INB_ELEV*INB_FW*INB_M+IELEVS*INB_FW*INB_M+IFWS*INB_M+IEXPMS+1 +ELSE +! WRITE(0,*) "ZM, ZTC, ZELEV ou en dehors des bornes:" +! WRITE(0,*) ",ZELEV,ZTC,ZEXPM, ZFW : ",ZELEV,ZTC,ZEXPM, ZFW +! WRITE(0,*) "PELEV_MIN,PELEV_STEP,PELEV_MAX",PELEV_MIN,PELEV_STEP,PELEV_MAX +! WRITE(0,*) "PTC_MIN,PTC_STEP,PTC_MAX",PTC_MIN,PTC_STEP,PTC_MAX +! WRITE(0,*) "PFW_MIN,PFW_STEP,PFW_MAX",PFW_MIN,PFW_STEP,PFW_MAX +! WRITE(0,*) "PEXPM_MIN,PEXPM_STEP,PEXPM_MAX",PEXPM_MIN,PEXPM_STEP,PEXPM_MAX +! WRITE(0,*) "--------------------------------" +! IF ((ZELEV >=PELEV_MIN).AND. (ZELEV<=PELEV_MAX)) THEN +! WRITE(0,*) "ok ZELEV :",ZELEV +! ELSE +! WRITE(0,*) "Nok ZELEV :",ZELEV +! ENDIF +! IF ((ZTC >=PTC_MIN).AND. (ZTC<=PTC_MAX)) THEN +! WRITE(0,*) "ok ZTC :",ZTC +! ELSE +! WRITE(0,*) "Nok ZTC :",ZTC +! ENDIF +! IF ((ZFW >=PFW_MIN).AND. (ZFW<=PFW_MAX)) THEN +! WRITE(0,*) "ok ZFW :",ZFW +! ELSE +! WRITE(0,*) "Nok ZFW :",ZFW +! ENDIF +! IF ((ZEXPM >=PEXPM_MIN).AND. (ZEXPM<=PEXPM_MAX)) THEN +! WRITE(0,*) "ok ZEXPM :",ZEXPM +! ELSE +! WRITE(0,*) "Nok ZEXPM :",ZEXPM +! ENDIF + KTMAT(:)=-NUNDEF + PTC_RED=-XUNDEF + PELEV_RED=-XUNDEF + PFW_RED=-XUNDEF + PM_RED=-XUNDEF +ENDIF + +RETURN +END SUBROUTINE CALC_KTMAT + +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +!* 2. SUBROUTINE INTERPOL +! -------------------------------------- +!------------------------------------------------------------------------------- +! ################################################# + SUBROUTINE INTERPOL(PELEV_RED,PTC_RED,PFW_RED,PM_RED,PMAT_COEF,& + PS11_CARRE,PS22_CARRE,PRE_S22S11,PIM_S22S11,PRE_S22FMS11F,PIM_S22FT,PIM_S11FT) +! ################################################# + +IMPLICIT NONE +! Arguments entree et sortie +REAL,INTENT(IN) :: PELEV_RED,PTC_RED,PFW_RED,PM_RED +REAL,DIMENSION(7,16),INTENT(IN) :: PMAT_COEF !matrice contenant tous les coef interpolés: RES11, RES22... +REAL,INTENT(OUT) :: PS11_CARRE,PS22_CARRE,PRE_S22S11,PIM_S22S11,PRE_S22FMS11F,PIM_S22FT,PIM_S11FT +INTEGER:: JCOEF +REAL,DIMENSION(7) :: ZVECT_COEF !vecteur contenant tous les coef interpolés: RES11, RES22... + +!------------------- Interpolation -------------------------- +!on calcule la distance entre le point ZELEV,T,M avec les +!bornes inf et sup +! si on ne se trouve pas exactement sur une des bornes +!IF ((ZELEV_SUP/=ZELEV_INF) .OR. (ZTC_SUP/=ZTC_INF) .OR. (ZM_SUP/=ZM_INF)) THEN +! WRITE(0,*) "IF ( (ZELEV_SUP/=ZELEV_INF) .OR. (ZTC_SUP/=ZTC_INF) .OR. (ZM_SUP/=ZM_INF))" +!ENDIF + + !--- Interpolation linéaire --- +DO JCOEF=1,7,1 + ZVECT_COEF(JCOEF)= & + (1-PM_RED)*(1-PFW_RED)*(1-PELEV_RED)*(1-PTC_RED)*PMAT_COEF(JCOEF,1)+& + PM_RED*(1-PFW_RED)*(1-PELEV_RED)*(1-PTC_RED)*PMAT_COEF(JCOEF,2)+& + (1-PM_RED)*PFW_RED*(1-PELEV_RED)*(1-PTC_RED)*PMAT_COEF(JCOEF,3)+& + PM_RED*PFW_RED*(1-PELEV_RED)*(1-PTC_RED)*PMAT_COEF(JCOEF,4)+& + (1-PM_RED)*(1-PFW_RED)*PELEV_RED*(1-PTC_RED)*PMAT_COEF(JCOEF,5)+& + PM_RED*(1-PFW_RED)*PELEV_RED*(1-PTC_RED)*PMAT_COEF(JCOEF,6)+& + (1-PM_RED)*PFW_RED*PELEV_RED*(1-PTC_RED)*PMAT_COEF(JCOEF,7)+& + PM_RED*PFW_RED*PELEV_RED*(1-PTC_RED)*PMAT_COEF(JCOEF,8)+& + + (1-PM_RED)*(1-PFW_RED)*(1-PELEV_RED)*PTC_RED*PMAT_COEF(JCOEF,9)+& + PM_RED*(1-PFW_RED)*(1-PELEV_RED)*PTC_RED*PMAT_COEF(JCOEF,10)+& + (1-PM_RED)*PFW_RED*(1-PELEV_RED)*PTC_RED*PMAT_COEF(JCOEF,11)+& + PM_RED*PFW_RED*(1-PELEV_RED)*PTC_RED*PMAT_COEF(JCOEF,12)+& + (1-PM_RED)*(1-PFW_RED)*PELEV_RED*PTC_RED*PMAT_COEF(JCOEF,13)+& + PM_RED*(1-PFW_RED)*PELEV_RED*PTC_RED*PMAT_COEF(JCOEF,14)+& + (1-PM_RED)*PFW_RED*PELEV_RED*PTC_RED*PMAT_COEF(JCOEF,15)+& + PM_RED*PFW_RED*PELEV_RED*PTC_RED*PMAT_COEF(JCOEF,16) + +ENDDO!--- fin interpolation lineaire ----------------------- + +PS11_CARRE=ZVECT_COEF(1) +PS22_CARRE=ZVECT_COEF(2) +PRE_S22S11=ZVECT_COEF(3) +PIM_S22S11=ZVECT_COEF(4) +PRE_S22FMS11F=ZVECT_COEF(5) +PIM_S22FT=ZVECT_COEF(6) +PIM_S11FT=ZVECT_COEF(7) + +RETURN + + END SUBROUTINE INTERPOL +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! +!* 3. SUBROUTINE CALC_KTMAT_LIMA : idem CALC_KTMAT mais pour adapter +! aux concentrations pour l'espace pluie pour LIMA +! +!------------------------------------------------------------------------------- +!------------------------------------------------------------------------------- +! ################################################# + SUBROUTINE CALC_KTMAT_LIMA(PELEV_RAD,PT,PCC,PM,& + PELEV_MIN,PELEV_MAX,PELEV_STEP,PTC_MIN,PTC_MAX,PTC_STEP,& + PEXPCC_MIN,PEXPCC_MAX,PEXPCC_STEP,PEXPM_MIN,PEXPM_MAX,PEXPM_STEP,& + KTMAT,PELEV_RED,PTC_RED,PCC_RED,PM_RED) +! ################################################# + +IMPLICIT NONE +! Arguments entree et sortie +REAL,INTENT(IN) :: PELEV_RAD,PT,PCC,PM,PEXPM_MIN,PEXPM_MAX,PEXPM_STEP,& +PELEV_MIN,PELEV_MAX,PELEV_STEP,PTC_MIN,PTC_MAX,PTC_STEP,PEXPCC_MIN,PEXPCC_MAX,PEXPCC_STEP +INTEGER,DIMENSION(16),INTENT(OUT):: KTMAT +REAL,INTENT(OUT) :: PELEV_RED,PTC_RED,PCC_RED,PM_RED + +!************* Declarations *************** +REAL :: ZELEV,ZELEV_INF,ZELEV_SUP +REAL :: ZTC,ZTC_INF,ZTC_SUP +REAL :: ZEXPCC_INF,ZEXPCC_SUP,ZEXPCC,ZCC_INF,ZCC_SUP,ZEXPCC_RED +REAL :: ZEXPM,ZEXPM_INF,ZEXPM_SUP,ZEXPM_RED,ZM_INF,ZM_SUP +INTEGER :: IELEV,ITC,IEXPCC,IEXPM +INTEGER :: INB_ELEV,INB_TC,INB_CC,INB_M +INTEGER :: IELEVS,ITCS,IEXPMS,IEXPCCS +!********************************************** +!***** Parametres !!! ****** +!********************************************** + +!Conversion de l'elevation en degre (a partir de la valeur en radian) +ZELEV=PELEV_RAD*180./XPI +!Conversion de la temperature de °K en °C +ZTC=PT-273.15 +!Hydromet content +ZEXPM=LOG10(PM) +!Concentration +ZEXPCC=LOG10(PCC) + + +!On verifie que ZELEV, ZTC, ZCC et M sont compris dans les bornes min et max +IF (ABS(ZELEV-PELEV_MIN) < PELEV_STEP/10) ZELEV=PELEV_MIN +IF (ABS(ZELEV-PELEV_MAX) < PELEV_STEP/10) ZELEV=PELEV_MAX +IF (ABS(ZTC-PTC_MIN) < PTC_STEP/10) ZTC=PTC_MIN +IF (ABS(ZTC-PTC_MAX) < PTC_STEP/10) ZTC=PTC_MAX +IF (ABS(ZEXPCC-PEXPCC_MIN) < PEXPCC_STEP/10) ZEXPCC=PEXPCC_MIN +IF (ABS(ZEXPCC-PEXPCC_MAX) < PEXPCC_STEP/10) ZEXPCC=PEXPCC_MAX +IF (ABS(ZEXPM-PEXPM_MIN) < PEXPM_STEP/10) ZEXPM=PEXPM_MIN +IF (ABS(ZEXPM-PEXPM_MAX) < PEXPM_STEP/10) ZEXPM=PEXPM_MAX + +IF ((ZELEV >=PELEV_MIN).AND. (ZELEV<=PELEV_MAX) .AND.& + (ZTC >=PTC_MIN) .AND. (ZTC<=PTC_MAX) .AND.(ZEXPCC >=PEXPCC_MIN) .AND. (ZEXPCC<=PEXPCC_MAX) .AND.& + (ZEXPM >=PEXPM_MIN).AND. (ZEXPM<=PEXPM_MAX)) THEN + + !Recherche dans le fichier de la position des valeurs encadrant les + !valeurs données ci-dessus + !------- ZELEV ------------------ + IELEV=floor((ZELEV-PELEV_MIN)/PELEV_STEP) + ZELEV_INF=PELEV_MIN+IELEV*PELEV_STEP + IF (ZELEV==ZELEV_INF) THEN + IELEVS=IELEV + ELSE + IELEVS=IELEV+1 + ENDIF + ZELEV_SUP=PELEV_MIN+IELEVS*PELEV_STEP + INB_ELEV=nint((PELEV_MAX-PELEV_MIN)/PELEV_STEP)+1 + !WRITE(0,*) "IELEV,IELEVS,ZELEV_INF,ZELEV_SUP,INB_ELEV : ",IELEV,IELEVS,ZELEV_INF,ZELEV_SUP,INB_ELEV + !------- ZTC ------------------ + ITC=floor((ZTC-PTC_MIN)/PTC_STEP) + ZTC_INF=PTC_MIN+ITC*PTC_STEP + IF (ZTC==ZTC_INF) THEN + ITCS=ITC + ELSE + ITCS=ITC+1 + ENDIF + ZTC_SUP=PTC_MIN+(ITCS)*PTC_STEP + INB_TC=nint((PTC_MAX-PTC_MIN)/PTC_STEP)+1 + !WRITE(0,*) "ITC,ITCS,ZTC_INF,ZTC_SUP,INB_TC : ",ITC,ITCS,ZTC_INF,ZTC_SUP,INB_TC + + !------- ZCC ------------------ + IEXPCC=floor((ZEXPCC-PEXPCC_MIN)/PEXPCC_STEP) + ZEXPCC_INF=PEXPCC_MIN+IEXPCC*PEXPCC_STEP + IF (ZEXPCC==ZEXPCC_INF) THEN + IEXPCCS=IEXPCC + ELSE + IEXPCCS=IEXPCC+1 + ENDIF + ZEXPCC_SUP=PEXPCC_MIN+(IEXPCCS)*PEXPCC_STEP + INB_CC=nint((PEXPCC_MAX-PEXPCC_MIN)/PEXPCC_STEP)+1 + ZCC_INF=10**ZEXPCC_INF + ZCC_SUP=10**ZEXPCC_SUP + !------- PM ------------------ + IEXPM=floor((ZEXPM-PEXPM_MIN)/PEXPM_STEP) + ZEXPM_INF=PEXPM_MIN+IEXPM*PEXPM_STEP + IF (ZEXPM==ZEXPM_INF) THEN + IEXPMS=IEXPM + ELSE + IEXPMS=IEXPM+1 + ENDIF + ZEXPM_SUP=PEXPM_MIN+IEXPMS*PEXPM_STEP + INB_M=nint((PEXPM_MAX-PEXPM_MIN)/PEXPM_STEP)+1 + ZM_INF=10**ZEXPM_INF + ZM_SUP=10**ZEXPM_SUP + !WRITE(0,*) "IEXPM,IEXPMS,ZEXPM_INF,ZEXPM_SUP,INB_M,ZM_INF,ZM_SUP : ",& + !IEXPM,IEXPMS,ZEXPM_INF,ZEXPM_SUP,INB_M,ZM_INF,ZM_SUP + !WRITE(0,*) " " + + !-- Calcul des variables reduites (comprises entre 0 et 1) + ! pour l'interpolation linaire + IF (ZELEV_SUP .NE. ZELEV_INF) THEN + PELEV_RED=(ZELEV-ZELEV_INF)/(ZELEV_SUP-ZELEV_INF) + ELSE + PELEV_RED=0 + ENDIF + IF (ZTC_SUP .NE. ZTC_INF) THEN + PTC_RED=(ZTC-ZTC_INF)/(ZTC_SUP-ZTC_INF) + ELSE + PTC_RED=0 + ENDIF + IF (ZEXPCC_SUP .NE. ZEXPCC_INF) THEN + PCC_RED=(PCC-ZCC_INF)/(ZCC_SUP-ZCC_INF) + ZEXPCC_RED=(ZEXPCC-ZEXPCC_INF)/(ZEXPCC_SUP-ZEXPCC_INF) + ELSE + PCC_RED=0 + ENDIF + IF (ZEXPM_SUP .NE. ZEXPM_INF) THEN + PM_RED=(PM-ZM_INF)/(ZM_SUP-ZM_INF) + ZEXPM_RED=(ZEXPM-ZEXPM_INF)/(ZEXPM_SUP-ZEXPM_INF) + ELSE + PM_RED=0 + ENDIF + KTMAT(1)=ITC*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCC*INB_M+IEXPM+1 + KTMAT(2)=ITC*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCC*INB_M+IEXPMS+1 + KTMAT(3)=ITC*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCCS*INB_M+IEXPM+1 + KTMAT(4)=ITC*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCCS*INB_M+IEXPMS+1 + KTMAT(5)=ITC*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCC*INB_M+IEXPM+1 + KTMAT(6)=ITC*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCC*INB_M+IEXPMS+1 + KTMAT(7)=ITC*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCCS*INB_M+IEXPM+1 + KTMAT(8)=ITC*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCCS*INB_M+IEXPMS+1 + KTMAT(9)=ITCS*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCC*INB_M+IEXPM+1 + KTMAT(10)=ITCS*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCC*INB_M+IEXPMS+1 + KTMAT(11)=ITCS*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCCS*INB_M+IEXPM+1 + KTMAT(12)=ITCS*INB_ELEV*INB_CC*INB_M+IELEV*INB_CC*INB_M+IEXPCCS*INB_M+IEXPMS+1 + KTMAT(13)=ITCS*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCC*INB_M+IEXPM+1 + KTMAT(14)=ITCS*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCC*INB_M+IEXPMS+1 + KTMAT(15)=ITCS*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCCS*INB_M+IEXPM+1 + KTMAT(16)=ITCS*INB_ELEV*INB_CC*INB_M+IELEVS*INB_CC*INB_M+IEXPCCS*INB_M+IEXPMS+1 +ELSE +! WRITE(0,*) "ZM, ZTC, ZELEV en dehors des bornes:" +! WRITE(0,*) "ZELEV,ZTC,ZEXPM, ZEXPCC : ",ZELEV,ZTC,ZEXPM, ZEXPCC +! WRITE(0,*) "PELEV_MIN,PELEV_STEP,PELEV_MAX",PELEV_MIN,PELEV_STEP,PELEV_MAX +! WRITE(0,*) "PTC_MIN,PTC_STEP,PTC_MAX",PTC_MIN,PTC_STEP,PTC_MAX +! WRITE(0,*) "PEXPCC_MIN,PEXPCC_STEP,PEXPCC_MAX",PEXPCC_MIN,PEXPCC_STEP,PEXPCC_MAX +! WRITE(0,*) "PEXPM_MIN,PEXPM_STEP,PEXPM_MAX",PEXPM_MIN,PEXPM_STEP,PEXPM_MAX +! WRITE(0,*) "--------------------------------" +! IF ((ZELEV >=PELEV_MIN).AND. (ZELEV<=PELEV_MAX)) THEN +! WRITE(0,*) "ok ZELEV :",ZELEV +! ELSE +! WRITE(0,*) "Nok ZELEV :",ZELEV +! ENDIF +! IF ((ZTC >=PTC_MIN).AND. (ZTC<=PTC_MAX)) THEN +! WRITE(0,*) "ok ZTC :",ZTC +! ELSE +! WRITE(0,*) "Nok ZTC :",ZTC +! ENDIF +! IF ((ZEXPCC >=PEXPCC_MIN).AND. (ZEXPCC<=PEXPCC_MAX)) THEN +! WRITE(0,*) "ok ZEXPCC :",ZEXPCC +! ELSE +! WRITE(0,*) "Nok ZEXPCC :",ZEXPCC +! ENDIF +! IF ((ZEXPM >=PEXPM_MIN).AND. (ZEXPM<=PEXPM_MAX)) THEN +! WRITE(0,*) "ok ZEXPM :",ZEXPM +! ELSE +! WRITE(0,*) "Nok ZEXPM :",ZEXPM +! ENDIF + KTMAT(:)=-NUNDEF + PTC_RED=-XUNDEF + PELEV_RED=-XUNDEF + PCC_RED=-XUNDEF + PM_RED=-XUNDEF +ENDIF + +RETURN +END SUBROUTINE CALC_KTMAT_LIMA + + + +END MODULE MODE_READTMAT diff --git a/src/MNH/radar_scattering.f90 b/src/MNH/radar_scattering.f90 index 89325b277bd0ca136c49867a281c29a4701dfce3..e9434099b850b0daceeefbce1280f1528543bdfe 100644 --- a/src/MNH/radar_scattering.f90 +++ b/src/MNH/radar_scattering.f90 @@ -13,7 +13,7 @@ ! INTERFACE SUBROUTINE RADAR_SCATTERING(PT_RAY,PRHODREF_RAY,PR_RAY,PI_RAY,PCIT_RAY,PS_RAY,PG_RAY,PVDOP_RAY, & - PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY) + PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY,PCR_RAY) REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PT_RAY ! temperature interpolated along the rays REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PRHODREF_RAY ! REAL, DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PR_RAY ! rainwater mixing ratio interpolated along the rays @@ -27,17 +27,18 @@ REAL, DIMENSION(:), INTENT(IN) :: PX_H ! Gaussian horizontal nodes REAL, DIMENSION(:), INTENT(IN) :: PX_V ! Gaussian vertical nodes REAL, DIMENSION(:), INTENT(IN) :: PW_H ! Gaussian horizontal weights REAL, DIMENSION(:), INTENT(IN) :: PW_V ! Gaussian vertical weights -REAL,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PZE ! gate equivalent reflectivity factor (horizontal) +REAL,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PZE ! 5D matrix (iradar, ielev, iaz, irangestep, ivar) containing the radar variables that will be calculated +!in polar or cartesian projection (same projection as the observation grid) ! convective/stratiform REAL, DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PBU_MASK_RAY -! /convective/stratiform +REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN) :: PCR_RAY ! rainwater mixing ratio interpolated along the rays END SUBROUTINE RADAR_SCATTERING END INTERFACE END MODULE MODI_RADAR_SCATTERING ! ! ######spl SUBROUTINE RADAR_SCATTERING(PT_RAY,PRHODREF_RAY,PR_RAY,PI_RAY,PCIT_RAY, & - PS_RAY,PG_RAY,PVDOP_RAY,PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY) + PS_RAY,PG_RAY,PVDOP_RAY,PELEV,PX_H,PX_V,PW_H,PW_V,PZE,PBU_MASK_RAY,PCR_RAY) ! ############################## ! !!**** *RADAR_SCATTERING* - computes radar reflectivities. @@ -84,7 +85,7 @@ END MODULE MODI_RADAR_SCATTERING !! !! AUTHOR !! ------ -!! O. Caumont & V. Ducrocq * Météo-France * +!! O. Caumont & V. Ducrocq * Meteo-France * !! !! MODIFICATIONS !! ------------- @@ -94,8 +95,9 @@ END MODULE MODI_RADAR_SCATTERING !! O. Caumont 21/12/2009 correction of bugs to compute KDP. !! O. Caumont 11/02/2010 thresholding and conversion from linear to !! log values after interpolation instead of before. -!! G.Tanguy 25/03/2010 Introduction of MODD_TMAT and ALLOCATE/DEALLOCATE -!! +!! G.Tanguy 25/03/2010 Introduction of MODD_TMAT and ALLOCATE/DEALLOCATE +!! C.Augros 2014 New simulator for T matrice +!! G.Delautier 10/2014 : Mise a jour simulateur T-matrice pour LIMA !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -103,17 +105,39 @@ END MODULE MODI_RADAR_SCATTERING ! USE MODD_CST USE MODD_PARAMETERS -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM +USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XDR_I=>XDR,XLBEXR_I=>XLBEXR,& + XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XCR_I=>XCR,& + XALPHAS_I=>XALPHAS,XNUS_I=>XNUS,XDS_I=>XDS,XLBEXS_I=>XLBEXS,& + XLBS_I=>XLBS,XCCS_I=>XCCS,XAS_I=>XAS,XBS_I=>XBS,XCXS_I=>XCXS,XCS_I=>XCS,& + XALPHAG_I=>XALPHAG,XNUG_I=>XNUG,XDG_I=>XDG,XLBEXG_I=>XLBEXG,& + XLBG_I=>XLBG,XCCG_I=>XCCG,XAG_I=>XAG,XBG_I=>XBG,XCXG_I=>XCXG,XCG_I=>XCG,& + XALPHAI_I=>XALPHAI,XNUI_I=>XNUI,XDI_I=>XDI,XLBEXI_I=>XLBEXI,& + XLBI_I=>XLBI,XAI_I=>XAI,XBI_I=>XBI,XC_I_I=>XC_I,& + XRTMIN_I=>XRTMIN +!!LIMA +!USE MODD_PARAM_LIMA_WARM, ONLY: XDR_L=>XDR,XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XCR_L=>XCR +!USE MODD_PARAM_LIMA_COLD, ONLY: XDI_L=>XDI,XLBEXI_L=>XLBEXI,XLBI_L=>XLBI,XAI_L=>XAI,XBI_L=>XBI,XC_I_L=>XC_I,& +! XDS_L=>XDS,XLBEXS_L=>XLBEXS,XLBS_L=>XLBS,XCCS_L=>XCCS,XAS_L=>XAS,XBS_L=>XBS,XCXS_L=>XCXS,XCS_L=>XCS +! +!USE MODD_PARAM_LIMA_MIXED, ONLY:XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L=>XCCG,XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG +!USE MODD_PARAM_LIMA, ONLY: XALPHAR_L=>XALPHAR,XNUR_L=>XNUR,XALPHAS_L=>XALPHAS,XNUS_L=>XNUS,& +! XALPHAG_L=>XALPHAG,XNUG_L=>XNUG, XALPHAI_L=>XALPHAI,XNUI_L=>XNUI,& +! XRTMIN_L=>XRTMIN +!!LIMA USE MODD_RADAR, ONLY:XLAM_RAD,XSTEP_RAD,NBELEV,NDIFF,LATT,NPTS_GAULAG,LQUAD,XVALGROUND,NDGS, & - LFALL,LWBSCS,LWREFL,XREFLVDOPMIN + LFALL,LWBSCS,LWREFL,XREFLVDOPMIN,XREFLMIN,LSNRT,XSNRMIN USE MODD_TMAT ! USE MODE_ARF USE MODE_FSCATTER +USE MODE_READTMAT USE MODE_FGAU , ONLY:GAULAG USE MODI_GAMMA, ONLY:GAMMA ! +USE MODE_FM +USE MODE_IO_ll +USE MODD_LUNIT +! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -136,13 +160,22 @@ REAL,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PZE ! gate equivalent reflectivity ! convective/stratiform REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PBU_MASK_RAY ! /convective/stratiform +REAL, DIMENSION(:,:,:,:,:,:),OPTIONAL,INTENT(IN) :: PCR_RAY ! rainwater mixing ratio interpolated along the rays ! !* 0.2 Declarations of local variables : ! -REAL, DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZREFL! 1: radar reflectivity in dBZ, 2: ZDR, 3: KDP, 4: BU_MASK, 5-8: mixing ratios, 9-12: Z_j, 13: CIT, 14: height above ground, 15-18: specific attenuations, 19-22: total attenuations +REAL, DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZREFL +!1: ZHH (dBZ), 2: ZDR, 3: KDP, 4: CSR (0 pr air clair, 1 pour stratiforme, 2 pour convectif) +!5-8: ZER, ZEI, ZES,ZEG +!9 : VRU (vitesse radiale) +!10-13 : AER, AEI, AES, AEG +!14-17: ATR, ATI, ATS, ATG +!18-20: RhoHV, PhiDP, DeltaHV + REAL, DIMENSION(:,:,:,:,:,:,:),ALLOCATABLE :: ZAELOC ! local attenuation REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZAETOT ! 1: total attenuation, 2: // vertical -REAL :: ZAERINT,ZAEIINT,ZAESINT,ZAEGINT ! 1-4: total A_i +REAL :: ZAERINT,ZAEIINT,ZAESINT,ZAEGINT ! total attenuation horizontal +REAL :: ZAVRINT,ZAVSINT,ZAVGINT ! total attenuation vertical ! REAL,DIMENSION(:),ALLOCATABLE :: ZX,ZW ! Gauss-Laguerre points and weights ! @@ -158,23 +191,208 @@ REAL :: ZFRAC_ICE,ZD,ZDE ! auxiliary variables REAL :: ZQSCA REAL,DIMENSION(2) :: ZQEXT REAL,DIMENSION(3) :: ZQBACK ! Q_b(HH),Q_b(VV) (backscattering efficiencies at horizontal and vertical polarizations, resp.) -COMPLEX :: QM,QMW,QMI,QK,QB ! dielectric parameters +!REAL :: P=DACOS(-1D0) +REAL :: ZRHOI ! pristine ice density (from m=a*D**b), +REAL :: ZRHOPI=916. !pure ice density (kg/m3) +COMPLEX :: ZNUM, ZDEN !for calculation of ice dielectri cconstant +COMPLEX :: ZQM,ZQMW,ZQMI,ZQK,ZQB, ZEPSI ! dielectric parameters +REAL :: ZS11_CARRE_R,ZS22_CARRE_R,ZRE_S22S11_R,ZIM_S22S11_R +REAL :: ZS11_CARRE_I,ZS22_CARRE_I,ZRE_S22S11_I,ZIM_S22S11_I +REAL :: ZS11_CARRE_S,ZS22_CARRE_S,ZRE_S22S11_S,ZIM_S22S11_S +REAL :: ZS11_CARRE_G,ZS22_CARRE_G,ZRE_S22S11_G,ZIM_S22S11_G +REAL :: ZS11_CARRE_T,ZS22_CARRE_T,ZRE_S22S11_T,ZIM_S22S11_T +REAL :: ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT + +REAL :: ZM ! INTEGER :: INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V ! sizes of the arrays INTEGER :: IEL -INTEGER :: JI,JL,JEL,JAZ,JH,JV,JJ ! Loop variables of control +INTEGER :: JI,JL,JEL,JAZ,JH,JV,JJ,JT ! Loop variables of control REAL :: ZLB ! depolarization factor along the spheroid symmetry axis -REAL :: XCXI ! should be defined with other parameters of microphysical scheme -REAL :: ZCR=0.,ZCI=0.,ZCS=0.,ZCG=0. ! coefficients to take into account fall speeds when simulating Doppler winds +REAL :: ZCXI=0. ! should be defined with other parameters of microphysical scheme +REAL :: ZCR,ZCI,ZCS,ZCG ! coefficients to take into account fall speeds when simulating Doppler winds REAL, DIMENSION(:,:,:,:),ALLOCATABLE :: ZCONC_BIN -INTEGER :: IVDOP,IMAX +INTEGER :: IVDOP,IMAX,IRHOHV,IPHIDP,IDELTAHV +INTEGER :: IRHR,IRHS,IRHG,IZDA,IZDS,IZDG,IKDR,IKDS,IKDG LOGICAL :: LPART_MASK ! indicates a partial mask along the beam -INTEGER,PARAMETER :: IZER=5,IZEI=6,IZES=7,IZEG=8, IAER=10,IAEI=11,IAES=12,IAEG=13, IATR=14,IATI=15,IATS=16,IATG=17 -!------------------------------------------------------------------------------- +INTEGER,PARAMETER :: IZER=5,IZEI=6,IZES=7,IZEG=8 +INTEGER,PARAMETER :: IAER=10,IAEI=11,IAES=12,IAEG=13 +INTEGER,PARAMETER :: IAVR=14,IAVI=15,IAVS=16,IAVG=17 +INTEGER,PARAMETER :: IATR=18,IATI=19,IATS=20,IATG=21 + +!for ZSNR threshold +REAL ::ZDISTRAD,ZSNR,ZSNR_R,ZSNR_S,ZSNR_I,ZSNR_G,ZZHH,ZZE_R,ZZE_I,ZZE_S,ZZE_G +LOGICAL :: GTHRESHOLD_V, GTHRESHOLD_Z,GTHRESHOLD_ZR,GTHRESHOLD_ZI,GTHRESHOLD_ZS,GTHRESHOLD_ZG + +!--------- TO READ T-MATRIX TABLE -------- +CHARACTER(LEN=6) :: YBAND +CHARACTER(LEN=1) ::YTYPE +CHARACTER(LEN=1),DIMENSION(4) :: YTAB_TYPE +CHARACTER(LEN=25),DIMENSION(4) :: YFILE_COEFINT + +REAL,DIMENSION(4) :: ZELEV_MIN,ZELEV_MAX,ZELEV_STEP,& +ZTC_MIN,ZTC_MAX,ZTC_STEP,ZFW_MIN,ZFW_MAX,ZFW_STEP +INTEGER :: IRESP,ILINE,INB_M +INTEGER,DIMENSION(4) :: INB_ELEV,INB_TC,INB_FW,INB_LINE + +REAL, DIMENSION(:),ALLOCATABLE :: ZTC_T_R, ZTC_T_S, ZTC_T_G, ZTC_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZELEV_T_R, ZELEV_T_S, ZELEV_T_G, ZELEV_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZFW_T_S, ZFW_T_G, ZFW_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZM_T_R, ZM_T_S, ZM_T_G, ZM_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZS11_CARRE_T_R, ZS11_CARRE_T_S, ZS11_CARRE_T_G, ZS11_CARRE_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZS22_CARRE_T_R, ZS22_CARRE_T_S, ZS22_CARRE_T_G, ZS22_CARRE_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZRE_S22S11_T_R, ZRE_S22S11_T_S, ZRE_S22S11_T_G, ZRE_S22S11_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22S11_T_R, ZIM_S22S11_T_S, ZIM_S22S11_T_G, ZIM_S22S11_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S22FT_T_R, ZIM_S22FT_T_S, ZIM_S22FT_T_G, ZIM_S22FT_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZIM_S11FT_T_R, ZIM_S11FT_T_S, ZIM_S11FT_T_G, ZIM_S11FT_T_W +REAL, DIMENSION(:),ALLOCATABLE :: ZRE_S22FMS11FT_T_R, ZRE_S22FMS11FT_T_S, ZRE_S22FMS11FT_T_G, ZRE_S22FMS11FT_T_W + +INTEGER,DIMENSION(16):: ITMAT +REAL:: ZELEV_RED,ZTC_RED,ZM_RED,ZFW_RED +INTEGER :: JIND +REAL,DIMENSION(7,16) :: KMAT_COEF !matrice contenant tous les coef interpolés + !pour chaque val inf et sup de ELEV_t +REAL :: ZEXPM_MIN, ZEXPM_STEP, ZEXPM_MAX,ZM_MIN +REAL :: ZFW !water fraction inside melting graupel (ZFW=0 for rain, snow and dry graupel). used only with NDIFF=7: Tmatrix +INTEGER :: ILUOUT0,IUNIT +! +! MODIF GAELLE POUR LIMA ! +LOGICAL :: GLIMA +REAL,DIMENSION(4) :: ZCC_MIN,ZCC_MAX, ZCC_STEP +INTEGER,DIMENSION(4):: INB_CC +REAL, DIMENSION(:),ALLOCATABLE :: ZCC_T_R +REAL :: ZCC_RED +LOGICAL :: GCALC +REAL :: ZCC +REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZM_6D,ZCC_6D +REAL :: ZC +! +REAL :: ZCCR,ZLBR,ZLBEXR,ZDR,ZALPHAR,ZNUR,ZBR +REAL :: ZCCS,ZLBS,ZLBEXS,ZDS,ZALPHAS,ZNUS,ZAS,ZBS,ZCXS +REAL :: ZCCG,ZLBG,ZLBEXG,ZDG,ZALPHAG,ZNUG,ZAG,ZBG,ZCXG +REAL :: ZLBI,ZLBEXI,ZDI,ZALPHAI,ZNUI,ZAI,ZBI +REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN ! !* 1. INITIALISATION -! -------------- +!-------------- +! ouverture fichier listing +CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP) +! +IF (PRESENT(PCR_RAY)) THEN + GLIMA=.TRUE. +ELSE + GLIMA=.FALSE. +ENDIF +! +! +! + ZS11_CARRE_R=0 + ZS22_CARRE_R=0 + ZRE_S22S11_R=0 + ZIM_S22S11_R=0 + ZS11_CARRE_I=0 + ZS22_CARRE_I=0 + ZRE_S22S11_I=0 + ZIM_S22S11_I=0 + ZS11_CARRE_S=0 + ZS22_CARRE_S=0 + ZRE_S22S11_S=0 + ZIM_S22S11_S=0 + ZS11_CARRE_G=0 + ZS22_CARRE_G=0 + ZRE_S22S11_G=0 + ZIM_S22S11_G=0 +! Initialisation varibales microphysiques +!IF (GLIMA) THEN ! LIMA +! ZLBR=XLBR_L +! ZLBEXR=XLBEXR_L +! ZDR=XDR_L +! ZALPHAR=XALPHAR_L +! ZNUR=XNUR_L +! ZBR=XBR_L +! ZCCS=XCCS_L +! ZCXS=XCXS_L +! ZLBS=XLBS_L +! ZLBEXS=XLBEXS_L +! ZDS=XDS_L +! ZALPHAS=XALPHAS_L +! ZNUS=XNUS_L +! ZAS=XAS_L +! ZBS=XBS_L +! ZCCG=XCCG_L +! ZCXG=XCXG_L +! ZLBG=XLBG_L +! ZLBEXG=XLBEXG_L +! ZDG=XDG_L +! ZALPHAG=XALPHAG_L +! ZNUG=XNUG_L +! ZAG=XAG_L +! ZBG=XBG_L +! ZLBI=XLBI_L +! ZLBEXI=XLBEXI_L +! ZDI=XDI_L +! ZALPHAI=XALPHAI_L +! ZNUI=XNUI_L +! ZAI=XAI_L +! ZBI=XBI_L +! ALLOCATE(ZRTMIN(SIZE(XRTMIN_L))) +! ZRTMIN=XRTMIN_L +!ELSE ! ICE3 + ZCCR=XCCR_I + ZLBR=XLBR_I + ZLBEXR=XLBEXR_I + ZDR=XDR_I + ZALPHAR=XALPHAR_I + ZNUR=XNUR_I + ZBR=XBR_I + ZCCS=XCCS_I + ZCXS=XCXS_I + ZLBS=XLBS_I + ZLBEXS=XLBEXS_I + ZDS=XDS_I + ZALPHAS=XALPHAS_I + ZNUS=XNUS_I + ZAS=XAS_I + ZBS=XBS_I + ZCCG=XCCG_I + ZCXG=XCXG_I + ZLBG=XLBG_I + ZLBEXG=XLBEXG_I + ZDG=XDG_I + ZALPHAG=XALPHAG_I + ZNUG=XNUG_I + ZAG=XAG_I + ZBG=XBG_I + ZLBI=XLBI_I + ZLBEXI=XLBEXI_I + ZDI=XDI_I + ZALPHAI=XALPHAI_I + ZNUI=XNUI_I + ZAI=XAI_I + ZBI=XBI_I + ALLOCATE(ZRTMIN(SIZE(XRTMIN_I))) + ZRTMIN=XRTMIN_I +!ENDIF +IF (LATT) THEN + IRHOHV=22 !au lieu de 18: + !"ZHH","ZDR","KDP","CSR","ZER","ZEI","ZES","ZEG","VRU" + !"AER","AEI","AES","AEG","AVR","AVI","AVS","AVG","ATR","ATI","ATS","ATG" +ELSE + IRHOHV=10 +END IF +IPHIDP=IRHOHV+1 +IDELTAHV=IPHIDP+1 +IRHR=IDELTAHV+1 +IRHS=IRHR+1 +IRHG=IRHS+1 +IZDA=IRHG+1 +IZDS=IZDA+1 +IZDG=IZDS+1 +IKDR=IZDG+1 +IKDS=IKDR+1 +IKDG=IKDS+1 + INBRAD=SIZE(PT_RAY,1) IIELV=SIZE(PT_RAY,2) INBAZIM=SIZE(PT_RAY,3) @@ -184,609 +402,1316 @@ INPTS_V=SIZE(PT_RAY,6) ! ! Initialisation for radial winds IF(LFALL) THEN - ZCR=XCR - ZCI=XC_I - ZCS=XCS - ZCG=XCG +! IF (GLIMA) THEN +! ZCR=XCR_L +! ZCI=XC_I_L +! ZCS=XCS_L +! ZCG=XCG_L +! ELSE + ZCR=XCR_I + ZCI=XC_I_I + ZCS=XCS_I + ZCG=XCG_I +! ENDIF +ELSE + ZCR=0. + ZCI=0. + ZCS=0. + ZCG=0. END IF +! Calculation of nodes and weights for the Gauss-Laguerre quadrature +! for Mie and T-matrix and RG IF(NDIFF/=0) THEN - ALLOCATE(ZX(NPTS_GAULAG),ZW(NPTS_GAULAG)) - CALL GAULAG(NPTS_GAULAG,ZX,ZW) ! for Mie and T-matrix and RG + ALLOCATE(ZX(NPTS_GAULAG),ZW(NPTS_GAULAG)) !NPTS_GAULAG : number of points for the quadrature + CALL GAULAG(NPTS_GAULAG,ZX,ZW) END IF ! -IVDOP=9 +IVDOP=9 !index of Doppler Velocity (VRU) in ZREFL IMAX=SIZE(PZE,5) +WRITE(ILUOUT0,*) "-----------------" +WRITE(ILUOUT0,*) "Radar scattering" +WRITE(ILUOUT0,*) "-----------------" +WRITE(ILUOUT0,*) 'Nombre de variables dans PZE: ',IMAX + IF(.NOT.LWREFL) IMAX=IMAX+1 + ALLOCATE(ZREFL(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,IMAX)) ZREFL(:,:,:,:,:,:,:)=0. IF(LATT) THEN - ZREFL(:,:,:,:,:,:,IATR:IATG)=1. + ZREFL(:,:,:,:,:,:,IATR:IATG)=1. END IF PZE(:,:,:,:,:)=0. IF (LATT)THEN - ALLOCATE(ZAELOC(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,2)) - ALLOCATE(ZAETOT(INPTS_H,INPTS_V,2)) - ZAELOC(:,:,:,:,:,:,:)=0. ! initialization of attenuation stuff (alpha_e for first gate) - ZAETOT(:,:,:)=1. ! initialization of attenuation stuff (total attenuation) + ALLOCATE(ZAELOC(INBRAD,IIELV,INBAZIM,INBSTEPMAX,INPTS_H,INPTS_V,2)) + ALLOCATE(ZAETOT(INPTS_H,INPTS_V,2)) + ZAELOC(:,:,:,:,:,:,:)=0. ! initialization of attenuation stuff (alpha_e for first gate) + ZAETOT(:,:,:)=1. ! initialization of attenuation stuff (total attenuation) END IF -WRITE(0,*) 'BEFORE LOOP DIFFUSION' +WRITE(ILUOUT0,*) 'BEFORE LOOP DIFFUSION' IF(LWBSCS) THEN - ALLOCATE(ZCONC_BIN(INBRAD,IIELV,INBAZIM,INBSTEPMAX)) - ZCONC_BIN(:,:,:,:)=0. + ALLOCATE(ZCONC_BIN(INBRAD,IIELV,INBAZIM,INBSTEPMAX)) + ZCONC_BIN(:,:,:,:)=0. END IF -! LOOP OVER EVERYTHING -DO JI=1,INBRAD - IEL=NBELEV(JI) - DO JEL=1,IEL - DO JAZ=1,INBAZIM - DO JH=1,INPTS_H - DO JV=1,INPTS_V ! we go down to check partial masks - IF(LATT) THEN - ZAERINT=1. - ZAEIINT=1. - ZAESINT=1. - ZAEGINT=1. - END IF - LPART_MASK=.FALSE. - LOOPJL: DO JL=1,INBSTEPMAX - ! REINDENTING FOR READIBILITY -IF(LPART_MASK) THEN ! THIS RAY IS MASKED - ZREFL(JI,JEL,JAZ,JL:INBSTEPMAX,JH,JV,1)=0. - EXIT LOOPJL -ELSE - ! if not underground or outside of the MESO-NH domain and rain - IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) THEN +WRITE(ILUOUT0,*) "XCCR:",ZCCR +WRITE(ILUOUT0,*) "XLBR:",ZLBR +WRITE(ILUOUT0,*) "XLBEXR:",ZLBEXR + +WRITE(ILUOUT0,*) "XCCS:",ZCCS +WRITE(ILUOUT0,*) "XLBS:",ZLBS +WRITE(ILUOUT0,*) "XLBEXS:",ZLBEXS + +WRITE(ILUOUT0,*) "XCCG:",ZCCG +WRITE(ILUOUT0,*) "XLBG:",ZLBG +WRITE(ILUOUT0,*) "XLBEXG:",ZLBEXG + ! -!--------------------------------------------------------------------------------------------------- -!* 2. RAINDROPS -! --------- +IF (GLIMA .AND. NDIFF==7) THEN + IF (ZALPHAR/=1 .AND. ZNUR /=2.) THEN + WRITE(ILUOUT0,*) " ERROR : TMATRICE TABLE ARE MADE WITH XALPHAR=1 XNUR=2" + WRITE(ILUOUT0,*) " FOR CCLOUD=LIMA. PLEASE CHANGE THIS VALUES OR PROVIDE " + WRITE(ILUOUT0,*) " NEW TMATRICE TABLES " + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF +ELSE + IF (ZALPHAR/=1 .AND. ZNUR /=1.) THEN + WRITE(ILUOUT0,*) " ERROR : TMATRICE TABLE ARE MADE WITH XALPHAR=1 XNUR=1" + WRITE(ILUOUT0,*) " FOR CCLOUD=ICE3. PLEASE CHANGE THIS VALUEs OR PROVIDE " + WRITE(ILUOUT0,*) " NEW TMATRICE TABLES " + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF +ENDIF + +!--------------------------------------------- +! LOOP OVER EVERYTHING +!-------------------------------------------- +IF(NDIFF==7) THEN + YTAB_TYPE(1)='r' + YTAB_TYPE(2)='s' + YTAB_TYPE(3)='g' + YTAB_TYPE(4)='w' ! - IF(SIZE(PR_RAY,1) > 0) THEN - IF(PR_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(3)) THEN - QMW=SQRT(QEPSW(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) - ZLBDA=XLBR*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PR_RAY(JI,JEL,JAZ,JL,JH,JV))**XLBEXR - ! ZLBDA=XLBR*(6E-3)**XLBEXR - QK=(QMW**2-1.)/(QMW**2+2.) - ! DIFFUSION - IF(NDIFF==0.OR.NDIFF==4) THEN ! Rayleigh - ZREFLOC(1:2)=1.E18*XCCR*ZLBDA**(ZCXR-6.)*MOMG(XALPHAR,XNUR,6.) - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) & - *1.E18*XCCR*ZLBDA**(ZCXR-6.-XDR)*MOMG(XALPHAR,XNUR,6.+XDR) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=XCCR*ZLBDA**ZCXR - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) & - *XCCR*ZLBDA**(ZCXR-XDR)*MOMG(XALPHAR,XNUR,XDR) - END IF - IF(LATT) THEN - IF(NDIFF==0) THEN ! Rayleigh 3rd order - ZAETMP(:)=XCCR*ZLBDA**ZCXR*( & - XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAR,XNUR,XBR) /ZLBDA**XBR) - ELSE ! Rayleigh 6th order - ZAETMP(:)=XCCR*ZLBDA**ZCXR*( & - XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAR,XNUR,XBR) /ZLBDA**XBR & - +XPI**4/15./XLAM_RAD(JI)**3*AIMAG(QK**2*(QMW**4+27.*QMW**2+38.) & - /(2.*QMW**2+3.))*MOMG(XALPHAR,XNUR,5.*XBR/3.)/ZLBDA**(5.*XBR/3.)& - +2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(QK**2) & - * MOMG(XALPHAR,XNUR,2.*XBR) /ZLBDA**(2.*XBR)) - END IF - END IF - ELSE ! MIE OR T-MATRIX - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! Gauss-Laguerre quadrature - SELECT CASE(NDIFF) - CASE(1) ! MIE - CALL BHMIE(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA,QMW,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) - ZQBACK(3)=0. - CASE(2) ! NDIFF==2 T-matrix - ! G. TANGUY Allocation des Tableaux de MODD_TMAT - ALLOCATE(XRT11(NPN6,NPN4,NPN4)) - ALLOCATE(XRT12(NPN6,NPN4,NPN4)) - ALLOCATE(XRT21(NPN6,NPN4,NPN4)) - ALLOCATE(XRT22(NPN6,NPN4,NPN4)) - ALLOCATE(XIT11(NPN6,NPN4,NPN4)) - ALLOCATE(XIT12(NPN6,NPN4,NPN4)) - ALLOCATE(XIT21(NPN6,NPN4,NPN4)) - ALLOCATE(XIT22(NPN6,NPN4,NPN4)) - ALLOCATE(XTR1(NPN2,NPN2)) - ALLOCATE(XTI1(NPN2,NPN2)) - ALLOCATE(XQR(NPN2,NPN2)) - ALLOCATE(XQI(NPN2,NPN2)) - ALLOCATE(XRGQR(NPN2,NPN2)) - ALLOCATE(XRGQI(NPN2,NPN2)) - ALLOCATE(XJ(NPNG2,NPN1)) - ALLOCATE(XY(NPNG2,NPN1)) - ALLOCATE(XJR(NPNG2,NPN1)) - ALLOCATE(XJI(NPNG2,NPN1)) - ALLOCATE(XDJ(NPNG2,NPN1)) - ALLOCATE(XDY(NPNG2,NPN1)) - ALLOCATE(XDJR(NPNG2,NPN1)) - ALLOCATE(XDJI(NPNG2,NPN1)) - - CALL TMD(&!2,& !GTTE=1 SPHERES ; =2 OBLATE - ZX(JJ)/ZLBDA,&!Deq (m) - XLAM_RAD(JI),&!LAM: radar wavelength - REAL(QMW),& !MRR: real part of refractive index - AIMAG(QMW),& !MRI: imaginary part of refractive index (>=0) - NDGS,& !NDGS: number of division points in computing integrals over the surface particles (default=2) - 2,& ! gouttes oscillantes ? (oui=1,non=2) - PELEV(JI,JEL,JL,JV)*180./XPI,&! elevation in deg - ZQBACK(1),ZQBACK(2),ZQBACK(3),ZQEXT(1),& - 1./ARF(ZX(JJ)/ZLBDA)) ! axis ratio function - ! ZQBACK(3)=ZQBACK(3)/ZLBDA**2 - ZQBACK(3)=12.*ZQBACK(3)/ZX(JJ)**2/XPI - - - ! DEALLOACTION DES TABLEAUX - DEALLOCATE(XRT11) - DEALLOCATE(XRT12) - DEALLOCATE(XRT21) - DEALLOCATE(XRT22) - DEALLOCATE(XIT11) - DEALLOCATE(XIT12) - DEALLOCATE(XIT21) - DEALLOCATE(XIT22) - DEALLOCATE(XTR1) - DEALLOCATE(XTI1) - DEALLOCATE(XQR) - DEALLOCATE(XQI) - DEALLOCATE(XRGQR) - DEALLOCATE(XRGQI) - DEALLOCATE(XJ) - DEALLOCATE(XY) - DEALLOCATE(XJR) - DEALLOCATE(XJI) - DEALLOCATE(XDJ) - DEALLOCATE(XDY) - DEALLOCATE(XDJR) - DEALLOCATE(XDJI) - - - CASE(3) ! NDIFF==3 RG - IF(ZX(JJ)/ZLBDA<.5E-3) THEN - ZLB=1./3. - ELSE - ZLB=1./(ARF(ZX(JJ)/ZLBDA))**2-1. ! f**2 - ZLB=(1.+ZLB)/ZLB*(1.-ATAN(SQRT(ZLB))/SQRT(ZLB)) ! lambda_b - if(ZX(JJ)/ZLBDA>16.61E-3) print*, 'Negative axis ratio; reduce NPTS_GAULAG.' - END IF - ZQBACK(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4& - *ABS((QMW**2-1.)/3./(1.+.5*(1.-ZLB)*(QMW**2-1.)))**2 - ZQBACK(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4*ABS((QMW**2-1.)/3.*& - (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(QMW**2-1.))+& ! PELEV=PI+THETA_I - COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(QMW**2-1.))) )**2 ! - ZQBACK(3)=ZX(JJ)/ZLBDA**3*REAL((QMW**2-1.)**2*(3.*ZLB-1.)/(2.+(QMW**2-1.)*(ZLB+1.) & - +ZLB*(1.-ZLB)*(QMW**2-1.)**2)) - IF(LATT) THEN - ZQEXT(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((QMW**2-1.)/3./(1.+.5*(1.-ZLB)*(QMW**2-1.))) - ZQEXT(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((QMW**2-1.)/3.*& - (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(QMW**2-1.))+& ! PELEV=PI+THETA_I - COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(QMW**2-1.)))) - END IF - END SELECT - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**2*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(2+XDR)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**2*ZW(JJ) - END DO ! end loop Gauss-Laguerre quadrature - ZREFLOC(1:2)=1.E18*ZREFLOC(1:2)*(XLAM_RAD(JI)/XPI)**4/.93*XCCR/4./ZLBDA**3 - ZREFLOC(3)=ZREFLOC(3)*XPI**2/6./XLAM_RAD(JI)*XCCR/ZLBDA & - *180.E3/XPI ! (in deg/km) - - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*XCCR/4./ZLBDA**(3+XDR) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*XCCR*ZLBDA**(ZCXR-2.*XBR/3.)/(4.*GAMMA(XNUR)) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFLOC(1) ! Z_e due to raindrops - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAER)=ZAETMP(1) - IF(JL>1) ZAERINT=ZAERINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)*ZAERINT ! Z_r attenuated - END IF - END IF - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATR)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATR) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD) - END IF - - ! - !--------------------------------------------------------------------------------------------------- - !* 3. PRISTINE ICE - ! --------- - ! - IF (SIZE(PI_RAY,1)>0) THEN - IF(PI_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(4) .AND. PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)> 527.82) THEN ! cit > 527.82 otherwise pbs due to interpolation - QMI=SQRT(QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) - QK=(QMI**2-1.)/(QMI**2+2.) - ZDMELT_FACT=(6.*XAI)/(XPI*.92*XRHOLW) - ZEXP=2.*XBI - ZLBDA=XLBI*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PI_RAY(JI,JEL,JAZ,JL,JH,JV)/ & - PCIT_RAY(JI,JEL,JAZ,JL,JH,JV))**XLBEXI - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN ! Rayleigh or Rayleigh-Gans (pristine ice = sphere) - ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) & - *ZLBDA**(XCXI-ZEXP)*MOMG(XALPHAI,XNUI,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& - *1.E18*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)*ZLBDA**(XCXI-ZEXP-XDI)*MOMG(XALPHAI,XNUI,ZEXP+XDI) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)& - +PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)*ZLBDA**XCXI - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCI*SIN(PELEV(JI,JEL,JL,JV))& - *PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)*ZLBDA**(XCXI-XDI)*MOMG(XALPHAI,XNUI,XDI) - END IF - IF(LATT) THEN - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)*ZLBDA**XCXI*( & - ZDMELT_FACT *XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAI,XNUI,XBI) /ZLBDA**XBI) + ! definition des paramètres de lecture de la table T-matrice + ! all mixing ratio + ZEXPM_MIN=-7. + ZEXPM_STEP=0.01 + ZEXPM_MAX=-2. + ZM_MIN=10**ZEXPM_MIN + ! rain + ZELEV_MIN(1)=0.0 + ZELEV_STEP(1)=4.0 + ZELEV_MAX(1)=12.0 + ZTC_MIN(1)=-20.0 + ZTC_STEP(1)=1.0 + ZTC_MAX(1)=40.0 + ZFW_MIN(1)=0.0 + ZFW_STEP(1)=0.1 + ZFW_MAX(1)=0.0 + IF (GLIMA) THEN + ZCC_MIN(1)=1.8 + ZCC_STEP(1)=0.02 + ZCC_MAX(1)=6 + ELSE + ZCC_MIN(1)=1. + ZCC_STEP(1)=1. + ZCC_MAX(1)=1. + ENDIF + ! snow + graupel + ZELEV_MIN(2:3)=0.0 + ZELEV_STEP(2:3)=12.0 + ZELEV_MAX(2:3)=12.0 + ZTC_MIN(2:3)=-70.0 + ZTC_STEP(2:3)=1.0 + ZTC_MAX(2:3)=10.0 + ZFW_MIN(2:3)=0.0 + ZFW_STEP(2:3)=0.1 + ZFW_MAX(2:3)=0.0 + ZCC_MIN(2:3)=1. + ZCC_STEP(2:3)=1. + ZCC_MAX(2:3)=1. + ! wet graupel + ZELEV_MIN(4)=0.0 + ZELEV_STEP(4)=4.0 + ZELEV_MAX(4)=12.0 + ZTC_MIN(4)=-10.0 + ZTC_STEP(4)=1.0 + ZTC_MAX(4)=10.0 + ZFW_MIN(4)=0.0 + ZFW_STEP(4)=0.1 + ZFW_MAX(4)=1.0 + ZCC_MIN(4)=1. + ZCC_STEP(4)=1. + ZCC_MAX(4)=1. + + DO JT=1,4 + INB_ELEV(JT)=NINT((ZELEV_MAX(JT)-ZELEV_MIN(JT))/ZELEV_STEP(JT))+1 + INB_TC(JT)=NINT((ZTC_MAX(JT)-ZTC_MIN(JT))/ZTC_STEP(JT))+1 + INB_FW(JT)=NINT((ZFW_MAX(JT)-ZFW_MIN(JT))/ZFW_STEP(JT))+1 + INB_M=NINT((ZEXPM_MAX-ZEXPM_MIN)/ZEXPM_STEP)+1 + INB_CC(JT)=NINT((ZCC_MAX(JT)-ZCC_MIN(JT))/ZCC_STEP(JT))+1 + INB_LINE(JT)=INB_ELEV(JT)*INB_TC(JT)*INB_FW(JT)*INB_M*INB_CC(JT) + ENDDO +ENDIF + +!--------------------------------------------- +! LOOP OVER EVERYTHING +!-------------------------------------------- + !============== loop over radars ================= +WRITE(ILUOUT0,*) "INBRAD",INBRAD +DO JI=1,INBRAD + WRITE(ILUOUT0,*) "JI",JI + WRITE(ILUOUT0,*) "XLAM_RAD(JI):",XLAM_RAD(JI) + + IF(NDIFF==7) THEN ! If T-MATRIX + !--------------------------------------------------------------------------------------------- + ! 0. LECTURE DES TABLES TMAT POUR PLUIE, NEIGE, GRAUPEL + ! en fonction de la bande frequence + !--------------------------------------------------------------------------------------------- + IF ( XLAM_RAD(JI)==0.1062) THEN + YBAND='S106.2' + ELSEIF (XLAM_RAD(JI) ==0.0532 ) THEN + YBAND='C053.2' + ELSEIF (XLAM_RAD(JI)==0.0319 ) THEN + YBAND='X031.9' + ELSE + WRITE(ILUOUT0,*) "ERROR RADAR_SCATTERING" + WRITE(ILUOUT0,*) "Tmatrice tables are only available for XLAM_RAD=0.1062" + WRITE(ILUOUT0,*) "or XLAM_RAD=0.053.2 or XLAM_RAD=0.031.8" + WRITE(ILUOUT0,*) "change XLAM_RAD in namelist or compute new tmatrice table" + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + + !************ fichiers Min Max Pas et Coef Tmat *********** + DO JT=1,4 !types (r, s, g, w) + + YTYPE=YTAB_TYPE(JT) + IF (JT .EQ. 1) THEN + IF (GLIMA) THEN + YFILE_COEFINT(JT)='TmatCoefInt_LIMA_'//YBAND//YTYPE + ELSE + YFILE_COEFINT(JT)='TmatCoefInt_ICE3_'//YBAND//YTYPE + ENDIF + ELSE + YFILE_COEFINT(JT)='TmatCoefInt_'//YBAND//YTYPE + ENDIF + YFILE_COEFINT(JT)=TRIM(ADJUSTL(YFILE_COEFINT(JT))) + ENDDO + !lookup tables for rain + ALLOCATE (ZTC_T_R(INB_LINE(1)),ZELEV_T_R(INB_LINE(1)),ZCC_T_R(INB_LINE(1)),ZM_T_R(INB_LINE(1)),& + ZS11_CARRE_T_R(INB_LINE(1)),ZS22_CARRE_T_R(INB_LINE(1)), ZRE_S22S11_T_R(INB_LINE(1)),ZIM_S22S11_T_R(INB_LINE(1)),& + ZRE_S22FMS11FT_T_R(INB_LINE(1)),ZIM_S22FT_T_R(INB_LINE(1)),ZIM_S11FT_T_R(INB_LINE(1))) + + !lookup tables for snow + ALLOCATE (ZTC_T_S(INB_LINE(2)),ZELEV_T_S(INB_LINE(2)),ZFW_T_S(INB_LINE(2)),ZM_T_S(INB_LINE(2)),& + ZS11_CARRE_T_S(INB_LINE(2)),ZS22_CARRE_T_S(INB_LINE(2)),ZRE_S22S11_T_S(INB_LINE(2)),ZIM_S22S11_T_S(INB_LINE(2)),& + ZRE_S22FMS11FT_T_S(INB_LINE(2)),ZIM_S22FT_T_S(INB_LINE(2)),ZIM_S11FT_T_S(INB_LINE(2))) + + !lookup tables for graupel + ALLOCATE (ZTC_T_G(INB_LINE(3)),ZELEV_T_G(INB_LINE(3)),ZFW_T_G(INB_LINE(3)),ZM_T_G(INB_LINE(3)),& + ZS11_CARRE_T_G(INB_LINE(3)),ZS22_CARRE_T_G(INB_LINE(3)), ZRE_S22S11_T_G(INB_LINE(3)),ZIM_S22S11_T_G(INB_LINE(3)),& + ZRE_S22FMS11FT_T_G(INB_LINE(3)),ZIM_S22FT_T_G(INB_LINE(3)),ZIM_S11FT_T_G(INB_LINE(3))) + + !lookup tables for wet graupel + ALLOCATE (ZTC_T_W(INB_LINE(4)),ZELEV_T_W(INB_LINE(4)),ZFW_T_W(INB_LINE(4)),ZM_T_W(INB_LINE(4)),& + ZS11_CARRE_T_W(INB_LINE(4)),ZS22_CARRE_T_W(INB_LINE(4)), ZRE_S22S11_T_W(INB_LINE(4)),ZIM_S22S11_T_W(INB_LINE(4)),& + ZRE_S22FMS11FT_T_W(INB_LINE(4)),ZIM_S22FT_T_W(INB_LINE(4)),ZIM_S11FT_T_W(INB_LINE(4))) + + + !===== Lecture des tables =========== + + 6003 FORMAT (E11.4,2X,E9.3,2X,E10.4,2X,E10.4,2X,E12.5,2X,E12.5,2X,& + E12.5,2X,E12.5,2X,E12.5,2X,E12.5,2X,E12.5) + + !rain + CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(1),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE=GLOBAL) + IF ( IRESP /= 0 ) THEN + WRITE(ILUOUT0,*) "STOP : PROBLEM OPENING FILE : ", YFILE_COEFINT(1) + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + ILINE=1 + DO WHILE (ILINE .LE. INB_LINE(1)) + READ( UNIT=IUNIT,FMT=6003, IOSTAT=IRESP ) ZTC_T_R(ILINE),ZELEV_T_R(ILINE),& + ZCC_T_R(ILINE),ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE),& + ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE) + ILINE=ILINE+1 + ENDDO + CALL CLOSE_ll(YFILE_COEFINT(1),IOSTAT=IRESP) + WRITE(ILUOUT0,*) "NLIGNE rain",ILINE + ILINE=2 + WRITE(ILUOUT0,*) "ILINE=",ILINE + WRITE(ILUOUT0,*) "ZTC_T_R(ILINE),ZELEV_T_R(ILINE),ZCC_T_R(ILINE)",& + ZTC_T_R(ILINE),ZELEV_T_R(ILINE),ZCC_T_R(ILINE) + WRITE(ILUOUT0,*) "ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE)",& + ZM_T_R(ILINE),ZS11_CARRE_T_R(ILINE),ZS22_CARRE_T_R(ILINE),ZRE_S22S11_T_R(ILINE) + WRITE(ILUOUT0,*) "ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE)",& + ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE) + + !snow + CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(2),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE=GLOBAL) + IF ( IRESP /= 0 ) THEN + WRITE(ILUOUT0,*) "STOP : PROBLEM OPENING FILE : ", YFILE_COEFINT(2) + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + ILINE=1 + DO WHILE (ILINE .LE. INB_LINE(2)) + READ( UNIT=IUNIT,FMT=6003, IOSTAT=IRESP ) ZTC_T_S(ILINE),ZELEV_T_S(ILINE),& + ZFW_T_S(ILINE),ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE),& + ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE) + ILINE=ILINE+1 + ENDDO + CALL CLOSE_ll(YFILE_COEFINT(2),IOSTAT=IRESP) + WRITE(ILUOUT0,*) "NLIGNE snow",ILINE + ILINE=2 + WRITE(ILUOUT0,*) "ILINE=",ILINE + WRITE(ILUOUT0,*) "ZTC_T_S(ILINE),ZELEV_T_S(ILINE),ZFW_T_S(ILINE)",& + ZTC_T_S(ILINE),ZELEV_T_S(ILINE),ZFW_T_S(ILINE) + WRITE(ILUOUT0,*) "ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE)",& + ZM_T_S(ILINE),ZS11_CARRE_T_S(ILINE),ZS22_CARRE_T_S(ILINE),ZRE_S22S11_T_S(ILINE) + WRITE(ILUOUT0,*) "ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)",& + ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE) + + !graupel + CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(3),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE=GLOBAL) + IF ( IRESP /= 0 ) THEN + WRITE(ILUOUT0,*) "STOP : PROBLEM OPENING FILE : ", YFILE_COEFINT(3) + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + ILINE=1 + DO WHILE (ILINE .LE. INB_LINE(3)) + READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_G(ILINE),ZELEV_T_G(ILINE),& + ZFW_T_G(ILINE),ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE),& + ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE) + ILINE=ILINE+1 + ENDDO + CALL CLOSE_ll(YFILE_COEFINT(3),IOSTAT=IRESP) + WRITE(ILUOUT0,*) "NLIGNE graupel",ILINE + ILINE=2 + WRITE(ILUOUT0,*) "ILINE=",ILINE + WRITE(ILUOUT0,*) "ZTC_T_G(ILINE),ZELEV_T_G(ILINE)",& + ZTC_T_G(ILINE),ZELEV_T_G(ILINE) + WRITE(ILUOUT0,*) "ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE)",& + ZM_T_G(ILINE),ZS11_CARRE_T_G(ILINE),ZS22_CARRE_T_G(ILINE),ZRE_S22S11_T_G(ILINE) + WRITE(ILUOUT0,*) "ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)",& + ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE) + + !wet graupel + CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(4),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE=GLOBAL) + IF ( IRESP /= 0 ) THEN + WRITE(ILUOUT0,*) "STOP : PROBLEM OPENING FILE : ", YFILE_COEFINT(4) + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + ILINE=1 + DO WHILE (ILINE .LE. INB_LINE(4)) + READ( UNIT=IUNIT, FMT=6003,IOSTAT=IRESP ) ZTC_T_W(ILINE),ZELEV_T_W(ILINE),& + ZFW_T_W(ILINE),ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE),& + ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE) + ILINE=ILINE+1 + ENDDO + CALL CLOSE_ll(YFILE_COEFINT(4),IOSTAT=IRESP) + WRITE(ILUOUT0,*) "NLIGNE wet graupel",ILINE + ILINE=2 + WRITE(ILUOUT0,*) "ILINE=",ILINE + WRITE(ILUOUT0,*) "ZTC_T_W(ILINE),ZELEV_T_W(ILINE)", ZTC_T_W(ILINE),ZELEV_T_W(ILINE) + WRITE(ILUOUT0,*) "ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE)",& + ZM_T_W(ILINE),ZS11_CARRE_T_W(ILINE),ZS22_CARRE_T_W(ILINE),ZRE_S22S11_T_W(ILINE) + WRITE(ILUOUT0,*) "ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE)",& + ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE) + + ENDIF !END IF T-MATRIX => END OF LOOKUP TABLE READING + + !============== loop over elevations ================= + IEL=NBELEV(JI) + WRITE(ILUOUT0,*) "NBELEV(JI)",NBELEV(JI) + WRITE(ILUOUT0,*) "INPTS_V",INPTS_V + DO JEL=1,IEL + WRITE(ILUOUT0,*) "JEL",JEL + JL=1 + JV=1 + WRITE(ILUOUT0,*) "JL,JV",JL,JV + WRITE(ILUOUT0,*) "PELEV(JI,JEL,JL,JV)*180./XPI",PELEV(JI,JEL,JL,JV)*180./XPI + JL=INBSTEPMAX + JV=INPTS_V + WRITE(ILUOUT0,*) "JL,JV",JL,JV + WRITE(ILUOUT0,*) "PELEV(JI,JEL,JL,JV)*180./XPI",PELEV(JI,JEL,JL,JV)*180./XPI + !============== loop over azimuths ================= + DO JAZ=1,INBAZIM + DO JH=1,INPTS_H !horizontal discretization of the beam + DO JV=1,INPTS_V ! vertical discretization (we go down to check partial masks) + IF(LATT) THEN + ZAERINT=1. + ZAVRINT=1. + ZAEIINT=1. + ZAESINT=1. + ZAVSINT=1. + ZAEGINT=1. + ZAVGINT=1. + END IF + !Loop over the ranges for one azimuth. If the range is masked, the reflectivity for all the consecutive ranges is set to 0 + LPART_MASK=.FALSE. + LOOPJL: DO JL=1,INBSTEPMAX + IF(LPART_MASK) THEN ! THIS RAY IS MASKED + ZREFL(JI,JEL,JAZ,JL:INBSTEPMAX,JH,JV,1)=0. + EXIT LOOPJL + ELSE + ! if not underground or outside of the MESO-NH domain (PT_RAY : temperature interpolated along the rays) + IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) THEN + ! + !--------------------------------------------------------------------------------------------------- + !* 2. RAINDROPS + ! --------- + ! + IF(SIZE(PR_RAY,1) > 0) THEN ! if PR_RAY is available for at least one radar + !contenu en hydrometeore + ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PR_RAY(JI,JEL,JAZ,JL,JH,JV) + IF (GLIMA) ZCC=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PCR_RAY(JI,JEL,JAZ,JL,JH,JV) + !ZM_MIN : min value for rain content (10**-7 <=> Z=-26 dBZ)mixing ratio + IF (GLIMA) THEN + GCALC=((ZM > ZM_MIN).AND.(ZCC > 10**ZCC_MIN(1))) ELSE - ZAETMP(:)=PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)*ZLBDA**XCXI*( & - ZDMELT_FACT *XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAI,XNUI,XBI) /ZLBDA**XBI & - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & - *AIMAG(QK**2*(QMI**4+27.*QMI**2+38.) & - /(2.*QMI**2+3.))*MOMG(XALPHAI,XNUI,5.*XBI/3.)/ZLBDA**(5.*XBI/3.) & - +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(QK**2) & - * MOMG(XALPHAI,XNUI,2.*XBI) /ZLBDA**(2.*XBI)) - END IF - END IF - ELSE ! MIE OR T-MATRIX - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./XALPHAI)/ZLBDA - ZDE=ZDMELT_FACT**(1./3.)*ZD**(XBI/3.) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,QMI,ZQEXT(1),ZQSCA,ZQBACK(1)) - ! zqback=4.*(XPI/XLAM_RAD(JI))**4*ABS((QMI**2-1.)/(QMI**2+2.))**2* & - ! ((ZX(JJ)**(1./XALPHAI)/ZLBDA/(XPI*XRHOLW/(6.*XAI))**(1./XBI))**(XBI/3.))**4 !! rayleigh - ZQBACK(2)=ZQBACK(1) - ZQBACK(3)=0. - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(XNUI-1.+2.*XBI/3./XALPHAI)*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(XNUI-1.+2.*XBI/3./XALPHAI+XDI/XALPHAI)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(XNUI-1.+2.*XBI/3./XALPHAI)*ZW(JJ) - END DO ! END Gauss-Laguerre quadrature - ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) & - *ZLBDA**(XCXI-2.*XBI/3.)/(4.*GAMMA(XNUI)*.93)*ZDMELT_FACT**(2./3.)*ZREFLOC(1:2) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) & - *ZLBDA**(XCXI-2.*XBI/3.-XDI)/(4.*GAMMA(XNUI)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)*ZLBDA**(XCXI-2.*XBI/3.)/(4.*GAMMA(XNUI))& - *ZDMELT_FACT**(2./3.) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFLOC(1) ! z_e due to pristine ice - - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEI)=ZAETMP(1) - IF(JL>1) ZAEIINT=ZAEIINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)*ZAEIINT ! Z_i attenuated - END IF - END IF - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATI)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATI) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD) - END IF - - !--------------------------------------------------------------------------------------------------- - !* 4. SNOW - ! ----- - ! - IF (SIZE(PS_RAY,1)>0) THEN - IF(PS_RAY(JI,JEL,JAZ,JL,JH,JV) > 100000.*XRTMIN(5)) THEN - QMI=SQRT(QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) - ZDMELT_FACT=6.*XAS/(XPI*.92*XRHOLW) - ZEXP=2.*XBS - ZLBDA= XLBS*( PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PS_RAY(JI,JEL,JAZ,JL,JH,JV) )**XLBEXS - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN ! Rayleigh or Rayleigh-Gans - ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*XCCS*ZLBDA**(XCXS-ZEXP)*MOMG(XALPHAS,XNUS,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& - *1.E18*XCCS*ZLBDA**(XCXS-ZEXP-XDS)*MOMG(XALPHAS,XNUS,ZEXP+XDS) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+XCCS*ZLBDA**XCXS - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCS*SIN(PELEV(JI,JEL,JL,JV))& - *XCCS*ZLBDA**(XCXS-XDS)*MOMG(XALPHAS,XNUS,XDS) - END IF - IF(LATT) THEN - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=XCCS*ZLBDA**XCXS*( & - ZDMELT_FACT *XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAS,XNUS,XBS) /ZLBDA**XBS) + GCALC=(ZM > ZM_MIN) + ENDIF + IF(GCALC ) THEN + !calculation of the dielectrique constant (permittitivité relative) + ! for liquid water from function QEPSW + !(defined in mode_fscatter.f90 => equation 3.6 p 64) + YTYPE='r' + ZQMW=SQRT(QEPSW(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) + !ZLBDA : slope distribution parameter (equation 2.6 p 23) + IF (GLIMA) THEN + ZLBDA=( ZLBR*ZCC / ZM )**ZLBEXR + ELSE + ZLBDA=ZLBR*(ZM)**ZLBEXR + ENDIF + ZQK=(ZQMW**2-1.)/(ZQMW**2+2.) !dielectric factor (3.43 p 56) + ZFW=0 !Liquid water fraction (only for melting graupel => 0 for rain) + + !compteur=compteur+1 + !--------------------------------------------------- + ! ------------ DIFFUSION -------------- + !--------------------------------------------------- + !******************************* NDIFF=0 or 4 ********************************* + IF(NDIFF==0.OR.NDIFF==4) THEN ! Rayleigh + !ZREFLOC(1:2) : Zh et Zv = int(sigma(D)*N(D)) (eq 1.6 p 16) + !with N(D) formulation (eq 2.2 p 23) and sigma Rayleigh (3.41 p 55) + !MOMG : gamma function defined in mong.f90 + !XCCR = 1.E7; XLBEXR = -0.25! Marshall-Palmer law (radar_rain_ice.f90) + !ZCXR : -1 (Xi coeff in equation 2.3 p 23) + ZREFLOC(1:2)=1.E18*ZCCR*ZLBDA**(ZCXR-6.)*MOMG(ZALPHAR,ZNUR,6.) + IF(LWREFL) THEN ! weighting by reflectivities + !ZREFL(...,IVDOP)=radial velocity (IVDOP=9), weighted by reflectivity and + !taking into account raindrops fall velocity (ZCR = 842, XDR = 0.8 -> 2.8 p23 et 2.1 p24) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) & + *1.E18*ZCCR*ZLBDA**(ZCXR-6.-ZDR)*MOMG(ZALPHAR,ZNUR,6.+ZDR) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZCCR*ZLBDA**ZCXR ! N0j of equation 2.3 p23 (density of particules) + !projection of fall velocity only + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=-ZCR*SIN(PELEV(JI,JEL,JL,JV)) & + *ZCCR*ZLBDA**(ZCXR-ZDR)*MOMG(ZALPHAR,ZNUR,ZDR) + END IF ! end weighting by reflectivities + IF(LATT) THEN ! Calculation of Extinction coefficient + IF(NDIFF==0) THEN ! Rayleigh 3rd order : calculation from equations + ! 3.39 p55 : extinction coeff = int(extinction_section(D) * N(D)) + ! 2.2 and 2.3 p23: simplification of int(D**p * N(D)) and N0j + ! 3.42 p57 : extinction_section(D) + ZAETMP(:)=ZCCR*ZLBDA**ZCXR*(XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& + *MOMG(ZALPHAR,ZNUR,ZBR)/ZLBDA**ZBR) + ELSE ! Rayleigh 6th order ! eq 3.52 p 58 for extinction coefficient + ZAETMP(:)=ZCCR*ZLBDA**ZCXR*(XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& + *MOMG(ZALPHAR,ZNUR,ZBR)/ZLBDA**ZBR & + +XPI**4/15./XLAM_RAD(JI)**3*AIMAG(ZQK**2*(ZQMW**4+27.*ZQMW**2+38.) & + /(2.*ZQMW**2+3.))*MOMG(ZALPHAR,ZNUR,5.*ZBR/3.)/ZLBDA**(5.*ZBR/3.)& + +2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & + *MOMG(ZALPHAR,ZNUR,2.*ZBR) /ZLBDA**(2.*ZBR)) + END IF + END IF ! end IF(LATT) + ZRE_S22S11_R=0 + ZIM_S22S11_R=0 + ZS22_CARRE_R=0 + ZS11_CARRE_R=0 + !******************************* NDIFF==7 ************************************ + ELSE IF(NDIFF==7) THEN !T-matrix + ZREFLOC(:)=0 + IF(LATT) ZAETMP(:)=0 + IF (GLIMA) THEN + CALL CALC_KTMAT_LIMA(PELEV(JI,JEL,JL,JV),& + PT_RAY(JI,JEL,JAZ,JL,JH,JV),ZCC,ZM,& + ZELEV_MIN(1),ZELEV_MAX(1),ZELEV_STEP(1),& + ZTC_MIN(1),ZTC_MAX(1),ZTC_STEP(1),& + ZCC_MIN(1),ZCC_MAX(1),ZCC_STEP(1),& + ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& + ITMAT,ZELEV_RED,ZTC_RED,ZCC_RED,ZM_RED) + ELSE + CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV),& + PT_RAY(JI,JEL,JAZ,JL,JH,JV),ZFW,ZM,& + ZELEV_MIN(1),ZELEV_MAX(1),ZELEV_STEP(1),& + ZTC_MIN(1),ZTC_MAX(1),ZTC_STEP(1),& + ZFW_MIN(1),ZFW_MAX(1),ZFW_STEP(1),& + ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& + ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) + ENDIF + IF (ITMAT(1) .NE. -NUNDEF) THEN + DO JIND=1,SIZE(KMAT_COEF,2),1 + KMAT_COEF(1,JIND)=ZS11_CARRE_T_R(ITMAT(JIND)) + KMAT_COEF(2,JIND)=ZS22_CARRE_T_R(ITMAT(JIND)) + KMAT_COEF(3,JIND)=ZRE_S22S11_T_R(ITMAT(JIND)) + KMAT_COEF(4,JIND)=ZIM_S22S11_T_R(ITMAT(JIND)) + KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_R(ITMAT(JIND)) + KMAT_COEF(6,JIND)=ZIM_S22FT_T_R(ITMAT(JIND)) + KMAT_COEF(7,JIND)=ZIM_S11FT_T_R(ITMAT(JIND)) + ENDDO + IF (GLIMA) THEN + CALL INTERPOL(ZELEV_RED,ZTC_RED,ZCC_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_R,ZS22_CARRE_R,& + ZRE_S22S11_R,ZIM_S22S11_R,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) + ELSE + CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_R,ZS22_CARRE_R,& + ZRE_S22S11_R,ZIM_S22S11_R,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) + ENDIF + ELSE + ZS11_CARRE_R=0 + ZS22_CARRE_R=0 + ZRE_S22S11_R=0 + ZIM_S22S11_R=0 + ZRE_S22FMS11F=0 + ZIM_S22FT=0 + ZIM_S11FT=0 + END IF + ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_R + ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_R + ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F + IF (GLIMA) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & + *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCC/4./ZLBDA**(2+ZDR) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & + *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**(3+ZDR) + ENDIF + IF(LATT) THEN + ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 + ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 + END IF + !******************************* NDIFF=1 or 3 ********************************* + ! Gauss Laguerre integration + ELSE ! MIE OR T-MATRIX OR RAYLEIGH FOR ELLIPSOIDES + ZREFLOC(:)=0. + IF(LATT) ZAETMP(:)=0. + DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature + SELECT CASE(NDIFF) + CASE(1) ! *************** NDIFF=1 MIE ***************** + ! subroutine BHMIE defined in mode_fscatter.f90 + ! calculate extinction coefficient ZQEXT(1),scattering : ZQSCA + ! and backscattering ZQBACK(1) on the horizontal plan (spheroid) + CALL BHMIE(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA,ZQMW,ZQEXT(1),ZQSCA,ZQBACK(1)) + ZQBACK(2)=ZQBACK(1) !=> same because sphere + ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 + ZQBACK(3)=0. !=> 0 because sphere + CASE(3) !****************** NDIFF==3 RG RAYLEIGH FOR ELLIPSOIDES *********************** + IF(ARF(ZX(JJ)/ZLBDA)==1.) THEN + ZLB=1./3. + ELSE + ZLB=1./(ARF(ZX(JJ)/ZLBDA))**2-1. ! f**2 + ZLB=(1.+ZLB)/ZLB*(1.-ATAN(SQRT(ZLB))/SQRT(ZLB)) ! lambda_b + IF(ZX(JJ)/ZLBDA>16.61E-3) PRINT*, 'Negative axis ratio; reduce NPTS_GAULAG.' + END IF + ! equation 3.44 p 56 (ZX**4 instead of ZX**6 but ZQBACK is multiplied after by ZX**2) + ZQBACK(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4& + *ABS((ZQMW**2-1.)/3./(1.+.5*(1.-ZLB)*(ZQMW**2-1.)))**2 + ! equation 3.45 p 56 + ZQBACK(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)**4*ABS((ZQMW**2-1.)/3.*& + (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(ZQMW**2-1.))+& ! PELEV=PI+THETA_I + COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(ZQMW**2-1.))) )**2 ! + ! KDP from equation 3.49 + ZQBACK(3)=ZX(JJ)/ZLBDA**3*REAL((ZQMW**2-1.)**2*(3.*ZLB-1.)/(2.+(ZQMW**2-1.)*(ZLB+1.) & + +ZLB*(1.-ZLB)*(ZQMW**2-1.)**2)) + IF(LATT) THEN + ! equations 3.48 and 3.49 p57 + ZQEXT(1)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((ZQMW**2-1.)/3./(1.+.5*(1.-ZLB)*(ZQMW**2-1.))) + ZQEXT(2)=4.*(XPI/XLAM_RAD(JI)*ZX(JJ)/ZLBDA)*AIMAG((ZQMW**2-1.)/3.*& + (SIN(PELEV(JI,JEL,JL,JV))**2/(1.+.5*(1.-ZLB)*(ZQMW**2-1.))+& ! PELEV=PI+THETA_I + COS(PELEV(JI,JEL,JL,JV))**2/(1.+ZLB*(ZQMW**2-1.)))) + END IF + END SELECT !end SELECT NDIFF + !incrementation of the reflectivity and Kdp(1,2,3,4 for Zh, Zv, ) + !with the backscattering coefficients for each point of the GAULAG distribution + ! or each diameter D + ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**2*ZW(JJ) + ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(2+ZDR)*ZW(JJ) + !same for attenuation with extinction coefficient + IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**2*ZW(JJ) + END DO ! ****** end loop Gauss-Laguerre quadrature + + ZREFLOC(1:2)=1.E18*ZREFLOC(1:2)*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**3 + ZREFLOC(3)=ZREFLOC(3)*XPI**2/6./XLAM_RAD(JI)*ZCCR/ZLBDA & + *180.E3/XPI ! (in deg/km) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCR*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & + *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCR/4./ZLBDA**(3+ZDR) + + !********* for all cases with Gauss-Laguerre integration + ZRE_S22S11_R=0 + ZIM_S22S11_R=0 + ZS22_CARRE_R=0 + ZS11_CARRE_R=0 + IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCR*ZLBDA**(ZCXR-2.*ZBR/3.)/(4.*GAMMA(ZNUR)) + END IF ! ****************** End if for each type of diffusion ************************ + !incrementation of ZHH, ZDR and KDP + ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) + ! ZER (Z due to raindrops) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFLOC(1) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)=ZREFLOC(2) !Zvv for ZDR due to rain + ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDR)=ZREFLOC(3) !Zvv for ZDR due to rain + + ! RhoHV due to rain + IF (ZS22_CARRE_R*ZS11_CARRE_R .GT. 0) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHR)=SQRT(ZRE_S22S11_R**2+ZIM_S22S11_R**2)/SQRT(ZS22_CARRE_R*ZS11_CARRE_R) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHR)=1 + END IF + IF(LATT) THEN + ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAETMP(:) ! specific attenuation due to rain + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAER)=ZAETMP(1) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVR)=ZAETMP(2) + ! for ranges over 1, correction of attenuation on reflectivity due to rain + IF(JL>1) THEN + ZAERINT=ZAERINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD) + ZAVRINT=ZAVRINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVR)*XSTEP_RAD) + END IF + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZER)*ZAERINT ! Z_r attenuated + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDA)*ZAVRINT ! ZVr attenuated + END IF !end IF(LATT) + END IF + ! mimimum rainwater mixing ratio + ! Total attenuation even if no hydrometeors (equation 1.7 p 17) + IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATR)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATR) & + *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAER)*XSTEP_RAD) + END IF ! **************** end RAIN (end IF SIZE(PR_RAY,1) > 0) + ! + !--------------------------------------------------------------------------------------------------- + !* 3. PRISTINE ICE + ! --------- + ! + IF (SIZE(PI_RAY,1)>0) THEN + ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PI_RAY(JI,JEL,JAZ,JL,JH,JV) !ice content + IF (PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF .OR. PI_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF) ZM=-XUNDEF + IF (GLIMA) THEN + ZC=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) + IF (PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF .OR. PCIT_RAY(JI,JEL,JAZ,JL,JH,JV)==-XUNDEF) ZC=-XUNDEF ELSE - ZAETMP(:)=XCCS*ZLBDA**XCXS*( & - ZDMELT_FACT *XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAS,XNUS,XBS) /ZLBDA**XBS & - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & - *AIMAG(QK**2*(QMI**4+27.*QMI**2+38.) & - /(2.*QMI**2+3.))*MOMG(XALPHAS,XNUS,5.*XBS/3.)/ZLBDA**(5.*XBS/3.) & - +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(QK**2) & - * MOMG(XALPHAS,XNUS,2.*XBS) /ZLBDA**(2.*XBS)) - END IF - END IF - ELSE ! MIE OR T-MATRIX - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./XALPHAS)/ZLBDA - ZDE=ZDMELT_FACT**(1./3.)*ZD**(XBS/3.) - SELECT CASE(NDIFF) - CASE(1,2) ! MIE or T-matrix but we use Mie (particles are considered as isotropic=spheres) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,QMI,ZQEXT(1),ZQSCA,ZQBACK(1)) - ZQBACK(2)=ZQBACK(1) - ZQBACK(3)=0. - END SELECT - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(XNUS-1.+2.*XBS/3./XALPHAS)*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(XNUS-1.+2.*XBS/3./XALPHAS+XDS/XALPHAS)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(XNUS-1.+2.*XBS/3./XALPHAS)*ZW(JJ) - END DO - ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*XCCS & - *ZLBDA**(XCXS-2.*XBS/3.)/(4.*GAMMA(XNUS)*.93)*ZDMELT_FACT**(2./3.)*ZREFLOC(1:2) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*XCCS & - *ZLBDA**(XCXS-2.*XBS/3.-XDS)/(4.*GAMMA(XNUS)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*XCCS*ZLBDA**(XCXS-2.*XBS/3.)/(4.*GAMMA(XNUS))& - *ZDMELT_FACT**(2./3.) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFLOC(1) ! Z_e due to snow - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAES)=ZAETMP(1) - IF(JL>1) ZAESINT=ZAESINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)*ZAESINT ! Z_s attenuated - END IF - END IF - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATS)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATS) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD) - END IF - - !--------------------------------------------------------------------------------------------------- - !* 5. GRAUPEL - ! ------- - ! - !ZDG=.5 ! from Bringi & Chandrasekar 2001, p. 433 - IF (SIZE(PG_RAY,1)>0) THEN - IF(PG_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(6)) THEN - QMI=SQRT(QEPSI(MIN(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) - QMW=SQRT(QEPSW(MAX(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) - ZLBDA=XLBG*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV))**XLBEXG - IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) > XTT) THEN ! mixture of ice and water - ZFRAC_ICE = .85 - ELSE ! only ice - ZFRAC_ICE=1. - END IF - ZDMELT_FACT=6.*XAG/(XPI*XRHOLW*((1.-ZFRAC_ICE)+ZFRAC_ICE*0.92)) - ZEXP=2.*XBG - QB=2.*QMW**2*(2.*QMI**2*LOG(QMI/QMW)/(QMI**2-QMW**2)-1.)/(QMI**2-QMW**2) - QM=SQRT(((1.-ZFRAC_ICE)*QMW**2+ZFRAC_ICE*QB*QMI**2)/(1.-ZFRAC_ICE+ZFRAC_ICE*QB)) ! Bohren & Battan (1982) - QK=(QM**2-1.)/(QM**2+2.) - IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN - ZREFLOC(1:2)=ABS(QK)**2/.93*ZDMELT_FACT**2*1.E18*XCCG*ZLBDA**(XCXG-ZEXP)*MOMG(XALPHAG,XNUG,ZEXP) - ZREFLOC(3)=0. - IF(LWREFL) THEN ! weighting by reflectivities + ZC=PCIT_RAY(JI,JEL,JAZ,JL,JH,JV) + ENDIF + IF(ZM>ZM_MIN .AND. ZC> 527.82) THEN + ! cit > 527.82 otherwise pbs due to interpolation + !ice dielectric constant (QPESI defined in mode_fscatter, equation 3.65 p 65) + ZEPSI=QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI)) + ZQMI=SQRT(ZEPSI) + ZQK=(ZQMI**2-1.)/(ZQMI**2+2.) + !see 3.77 p68 : to replace Dg by an equivalent diameter De of pure ice, a multiplicative + !melting factor has to be added + ZDMELT_FACT=(6.*ZAI)/(XPI*.92*XRHOLW) + ZEXP=2.*ZBI !XBI = 2.5 (Plates) in ini_radar.f90 (bj tab 2.1 p24) + !ZLBDA : slope distribution parameter (equation 2.6 p 23) + IF (GLIMA) THEN + ZLBDA=(ZLBI*ZC/ZM)**ZLBEXI + ELSE + ZLBDA=ZLBI*(ZM/ZC)**ZLBEXI + ENDIF + ! Rayleigh or Rayleigh-Gans (=> Rayleigh) or Rayleigh with 6th order for attenuation + ! (pristine ice = sphere), + IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN + !ZREFLOC(1:2) : Zh et Zv from equation 2.2 p23 and Cristals parameters + !ZEQICE=0.224 (radar_rain_ice.f90) factor used to convert the ice crystals + !reflectivity into an equivalent liquid water reflectivity (from Smith, JCAM 84) + ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZC & + *ZLBDA**(ZCXI-ZEXP)*MOMG(ZALPHAI,ZNUI,ZEXP) + ZREFLOC(3)=0. + IF(LWREFL) THEN ! weighting by reflectivities + !calculation of radial velocity + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& + *1.E18*ZC*ZLBDA**(ZCXI-ZEXP-ZDI)& + *MOMG(ZALPHAI,ZNUI,ZEXP+ZDI) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)& + +ZC*ZLBDA**ZCXI + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + -ZCI*SIN(PELEV(JI,JEL,JL,JV))& + *ZC& + *ZLBDA**(ZCXI-ZDI)*MOMG(ZALPHAI,ZNUI,ZDI) + END IF + IF(LATT) THEN ! Calculation of Extinction coefficient + ! Rayleigh 3rd order + IF(NDIFF==0.OR.NDIFF==3) THEN + ZAETMP(:)=ZC*ZLBDA**ZCXI& + *(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& + *MOMG(ZALPHAI,ZNUI,ZBI)/ZLBDA**ZBI) + ! Rayleigh 6th order + ELSE + ZAETMP(:)=ZC*ZLBDA**ZCXI*(& + ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& + *MOMG(ZALPHAI,ZNUI,ZBI)/ZLBDA**ZBI& + +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3& + *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.)& + /(2.*ZQMI**2+3.))*MOMG(ZALPHAI,ZNUI,5.*ZBI/3.)/ZLBDA**(5.*ZBI/3.) & + +ZDMELT_FACT**2*2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2)& + *MOMG(ZALPHAI,ZNUI,2.*ZBI)/ZLBDA**(2.*ZBI)) + END IF + END IF + ELSE ! (if NDIFF=1 or NDIFF=7) => MIE (if choice=T-Matrix => Mie) + ZREFLOC(:)=0. + IF(LATT) ZAETMP(:)=0. + DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature + ZD=ZX(JJ)**(1./ZALPHAI)/ZLBDA !equivaut au ZDELTA_EQUIV olivier + ZRHOI=6*ZAI*ZD**(ZBI-3.)/XPI !pristine ice density + ZNUM=1.+2.*ZRHOI*(ZEPSI-1.)/(ZRHOPI*(ZEPSI+2.)) + ZDEN=1.-ZRHOI*(ZEPSI-1.)/(ZRHOPI*(ZEPSI+2.)) + ZQM=sqrt(ZNUM/ZDEN) + CALL BHMIE(XPI/XLAM_RAD(JI)*ZD,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1)) + ZQBACK(2)=ZQBACK(1) + ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 + ZQBACK(3)=0. + ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUI-1.)*ZD**2*ZW(JJ) + ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUI-1.+ZDI/ZALPHAI)*ZD**2*ZW(JJ) + IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUI-1.)*ZD**2*ZW(JJ) + END DO ! **************** end loop Gauss-Laguerre quadrature + + ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZC & + *ZLBDA**(ZCXI)/(4.*GAMMA(ZNUI)) + + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCI*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & + *1.E18*(XLAM_RAD(JI)/XPI)**4*ZC & + *ZLBDA**(ZCXI-ZDI)/(4.*GAMMA(ZNUI)*.93) + IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZC*ZLBDA**(ZCXI)/(4.*GAMMA(ZNUI)) + END IF !**************** end loop for each type of diffusion + ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFLOC(1) ! z_e due to pristine ice + IF(LATT) THEN + ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEI)=ZAETMP(1) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVI)=ZAETMP(2) + IF(JL>1) ZAEIINT=ZAEIINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEI)*ZAEIINT ! Z_i attenuated + END IF + END IF !********************* end IF (SIZE(PI_RAY,1)>0) + + ! Total attenuation even if no hydrometeors + IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATI)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATI) & + *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEI)*XSTEP_RAD) + ZRE_S22S11_I=0 + ZIM_S22S11_I=0 + ZS22_CARRE_I=0 + ZS11_CARRE_I=0 + END IF !******************** end IF (SIZE(PI_RAY,1)>0) + !--------------------------------------------------------------------------------------------------- + !* 4. SNOW + ! ----- + IF (SIZE(PS_RAY,1)>0) THEN + ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PS_RAY(JI,JEL,JAZ,JL,JH,JV) !snow content + IF(ZM > ZM_MIN) THEN + YTYPE='s' + !ZQMI: same formulation than for ice because snow is simulated only + !above melting leyer (3.5.4 p 67) + ZFW=0 + ZQMI=SQRT(QEPSI(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XLIGHTSPEED/XLAM_RAD(JI))) + ZQK=(ZQMI**2-1.)/(ZQMI**2+2.) !ajout de Clotilde 23/04/2012 + ZDMELT_FACT=6.*ZAS/(XPI*.92*XRHOLW) + ZEXP=2.*ZBS !XBS = 1.9 in ini_radar.f90 (bj tab 2.1 p24) + !dans ini_rain_ice.f90 : + ZLBDA= ZLBS*(ZM)**ZLBEXS + + ! Rayleigh or Rayleigh-Gans or Rayleigh with 6th order for attenuation + IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN + ZREFLOC(1:2)=ZEQICE*.92**2*ZDMELT_FACT**2*1.E18*ZCCS*ZLBDA**(ZCXS-ZEXP)*MOMG(ZALPHAS,ZNUS,ZEXP) + ZREFLOC(3)=0. + IF(LWREFL) THEN ! weighting by reflectivities + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZEQICE*.92**2*ZDMELT_FACT**2& + *1.E18*ZCCS*ZLBDA**(ZCXS-ZEXP-ZDS)*MOMG(ZALPHAS,ZNUS,ZEXP+ZDS) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCS*ZLBDA**ZCXS + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + -ZCS*SIN(PELEV(JI,JEL,JL,JV))& + *ZCCS*ZLBDA**(ZCXS-ZDS)*MOMG(ZALPHAS,ZNUS,ZDS) + END IF + IF(LATT) THEN + IF(NDIFF==0.OR.NDIFF==3) THEN + ZAETMP(:)=ZCCS*ZLBDA**ZCXS*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK)& + *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS) + ELSE + ZAETMP(:)=ZCCS*ZLBDA**ZCXS*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & + *MOMG(ZALPHAS,ZNUS,ZBS)/ZLBDA**ZBS & + +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & + *AIMAG(ZQK**2*(ZQMI**4+27.*ZQMI**2+38.) & + /(2.*ZQMI**2+3.))*MOMG(ZALPHAS,ZNUS,5.*ZBS/3.)/ZLBDA**(5.*ZBS/3.) & + +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & + *MOMG(ZALPHAS,ZNUS,2.*ZBS)/ZLBDA**(2.*ZBS)) + END IF + END IF + ZRE_S22S11_S=0 + ZIM_S22S11_S=0 + ZS22_CARRE_S=0 + ZS11_CARRE_S=0 + !******************************* NDIFF==7 ************************************ + ELSE IF(NDIFF==7) THEN + + ZREFLOC(:)=0 + IF(LATT) ZAETMP(:)=0 + CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),& + ZFW,ZM,& + ZELEV_MIN(2),ZELEV_MAX(2),ZELEV_STEP(2),& + ZTC_MIN(2),ZTC_MAX(2),ZTC_STEP(2),& + ZFW_MIN(2),ZFW_MAX(2),ZFW_STEP(2),& + ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& + ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) + + IF (ITMAT(1) .NE. -NUNDEF) THEN + DO JIND=1,SIZE(KMAT_COEF,2),1 + KMAT_COEF(1,JIND)=ZS11_CARRE_T_S(ITMAT(JIND)) + KMAT_COEF(2,JIND)=ZS22_CARRE_T_S(ITMAT(JIND)) + KMAT_COEF(3,JIND)=ZRE_S22S11_T_S(ITMAT(JIND)) + KMAT_COEF(4,JIND)=ZIM_S22S11_T_S(ITMAT(JIND)) + KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_S(ITMAT(JIND)) + KMAT_COEF(6,JIND)=ZIM_S22FT_T_S(ITMAT(JIND)) + KMAT_COEF(7,JIND)=ZIM_S11FT_T_S(ITMAT(JIND)) + ENDDO + CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_S,ZS22_CARRE_S,& + ZRE_S22S11_S,ZIM_S22S11_S,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) + ELSE + ZS11_CARRE_S=0 + ZS22_CARRE_S=0 + ZRE_S22S11_S=0 + ZIM_S22S11_S=0 + ZRE_S22FMS11F=0 + ZIM_S22FT=0 + ZIM_S11FT=0 + END IF + ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_S + ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_S + ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & + *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCS/4./ZLBDA**(3+ZDS) + IF(LATT) THEN + ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 + ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 + END IF + ELSE ! MIE + ZREFLOC(:)=0. + IF(LATT) ZAETMP(:)=0. + DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature + ZD=ZX(JJ)**(1./ZALPHAS)/ZLBDA + ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBS/3.) + CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQMI,ZQEXT(1),ZQSCA,ZQBACK(1)) + ZQBACK(2)=ZQBACK(1) + ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 + ZQBACK(3)=0. + ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ) + ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS+ZDS/ZALPHAS)*ZW(JJ) + IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUS-1.+2.*ZBS/3./ZALPHAS)*ZW(JJ) + END DO ! ****** end loop Gauss-Laguerre quadrature + ZREFLOC(1:2)=1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCS*ZLBDA**(ZCXS-2.*ZBS/3.)/& + (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.)*ZREFLOC(1:2) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCS*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & + *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCS & + *ZLBDA**(ZCXS-2.*ZBS/3.-ZDS)/ & + (4.*GAMMA(ZNUS)*.93)*ZDMELT_FACT**(2./3.) + IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCS*ZLBDA**(ZCXS-2.*ZBS/3.)/(4.*GAMMA(ZNUS))& + *ZDMELT_FACT**(2./3.) + ZRE_S22S11_S=0 + ZIM_S22S11_S=0 + ZS22_CARRE_S=0 + ZS11_CARRE_S=0 + END IF !**************** end loop for each type of diffusion + ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFLOC(1) ! Z_e due to snow + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)=ZREFLOC(2) !Zvv for ZDR due to snow + ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDS)=ZREFLOC(3) !Zvv for ZDR due to snow + IF (ZS22_CARRE_S*ZS11_CARRE_S .GT. 0) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHS)=SQRT(ZRE_S22S11_S**2+ZIM_S22S11_S**2)/SQRT(ZS22_CARRE_S*ZS11_CARRE_S) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHS)=1 + END IF + IF(LATT) THEN + ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAES)=ZAETMP(1) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVS)=ZAETMP(2) + IF(JL>1) THEN + ZAESINT=ZAESINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD) + ZAVSINT=ZAVSINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVS)*XSTEP_RAD) + ENDIF + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZES)*ZAESINT ! Z_s attenuated + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDS)*ZAVSINT ! ZVs attenuated + END IF !end IF(LATT) + END IF !end IF(PS_RAY(JI,JEL,JAZ,JL,JH,JV) > ...) + + + ! Total attenuation even if no hydrometeors + IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATS)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATS) & + *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAES)*XSTEP_RAD) + END IF !END IF (SIZE(PS_RAY,1)>0) + !--------------------------------------------------------------------------------------------------- + !* 5. GRAUPEL + ! ------- + ! + !ZDG=.5 ! from Bringi & Chandrasekar 2001, p. 433 + IF (SIZE(PG_RAY,1)>0) THEN + ZM=PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV) !graupel content + IF(ZM > ZM_MIN) THEN + YTYPE='g' + ZQMI=SQRT(QEPSI(MIN(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) + ZQMW=SQRT(QEPSW(MAX(PT_RAY(JI,JEL,JAZ,JL,JH,JV),XTT),XLIGHTSPEED/XLAM_RAD(JI))) + !ini_radar.f90 : ZCXG = -0.5 XBG = 2.8 ( Xj et bj tab 2.1 p 24) + !ini_rain_ice.f90 : XLBEXG = 1.0/(XCXG-XBG) XAG = 19.6 (aj tab 2.1 p 24) + !XLBG = ( XAG*XCCG*MOMG(XALPHAG,XNUG,XBG) )**(-XLBEXG) (eq 2.6 p 23) + IF (PR_RAY(JI,JEL,JAZ,JL,JH,JV) > ZRTMIN(3) ) THEN + ZFW=PR_RAY(JI,JEL,JAZ,JL,JH,JV)/(PR_RAY(JI,JEL,JAZ,JL,JH,JV)+PG_RAY(JI,JEL,JAZ,JL,JH,JV)) + ELSE + ZFW=0. + END IF + ZLBDA=ZLBG*(PRHODREF_RAY(JI,JEL,JAZ,JL,JH,JV)*PG_RAY(JI,JEL,JAZ,JL,JH,JV))**ZLBEXG + !XTT : température du point triple de l'eau (273.16 K <=> 0.1 °C) + IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) > XTT) THEN ! mixture of ice and water + ZFRAC_ICE = .85 !(see p 68) + ELSE ! only ice + ZFRAC_ICE=1. + END IF + ! from eq 3.77 p 68 + !XRHOLW=1000 (initialized in ini_cst.f90) + ZDMELT_FACT=6.*ZAG/(XPI*XRHOLW*((1.-ZFRAC_ICE)+ZFRAC_ICE*0.92)) + ZEXP=2.*ZBG + !Calculation of the refractive index from Bohren and Battan (3.72 p66) + ZQB=2.*ZQMW**2*(2.*ZQMI**2*LOG(ZQMI/ZQMW)/(ZQMI**2-ZQMW**2)-1.)/(ZQMI**2-ZQMW**2) !Beta (3.73 p66) + ZQM=SQRT(((1.-ZFRAC_ICE)*ZQMW**2+ZFRAC_ICE*ZQB*ZQMI**2)/(1.-ZFRAC_ICE+ZFRAC_ICE*ZQB)) ! Bohren & Battan (1982) 3.72 p66 + ZQK=(ZQM**2-1.)/(ZQM**2+2.) + !Rayleigh, Rayleigh for ellipsoides or Rayleigh 6th order + IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) THEN + ZREFLOC(1:2)=ABS(ZQK)**2/.93*ZDMELT_FACT**2*1.E18*ZCCG*ZLBDA**(ZCXG-ZEXP)*MOMG(ZALPHAG,ZNUG,ZEXP) + ZREFLOC(3)=0. + IF(LWREFL) THEN ! weighting by reflectivities + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ABS(ZQK)**2/.93*ZDMELT_FACT**2& + *1.E18*ZCCG*ZLBDA**(ZCXG-ZEXP-ZDG)*MOMG(ZALPHAG,ZNUG,ZEXP+ZDG) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+ZCCG*ZLBDA**ZCXG + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& + -ZCG*SIN(PELEV(JI,JEL,JL,JV))& + *ZCCG*ZLBDA**(ZCXG-ZDG)*MOMG(ZALPHAG,ZNUG,ZDG) + END IF !end IF(LWREFL) + IF(LATT) THEN + IF(NDIFF==0.OR.NDIFF==3) THEN + ZAETMP(:)=ZCCG*ZLBDA**ZCXG*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & + *MOMG(ZALPHAG,ZNUG,ZBG)/ZLBDA**ZBG) + ELSE + ZAETMP(:)=ZCCG*ZLBDA**ZCXG*(ZDMELT_FACT*XPI**2/XLAM_RAD(JI)*AIMAG(ZQK) & + *MOMG(ZALPHAG,ZNUG,ZBG)/ZLBDA**ZBG& + +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & + *AIMAG(ZQK**2*(ZQM**4+27.*ZQM**2+38.) & + /(2.*ZQM**2+3.))*MOMG(ZALPHAG,ZNUG,5.*ZBG/3.)/ZLBDA**(5.*ZBG/3.)& + +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(ZQK**2) & + *MOMG(ZALPHAG,ZNUG,2.*ZBG) /ZLBDA**(2.*ZBG)) + END IF ! end IF(NDIFF==0.OR.NDIFF==3) + END IF ! end IF(LATT) + ZRE_S22S11_G=0 + ZIM_S22S11_G=0 + ZS22_CARRE_G=0 + ZS11_CARRE_G=0 + !******************************* NDIFF==7 TmatInt ************************************ + ELSE IF(NDIFF==7) THEN + ZREFLOC(:)=0 + IF(LATT) ZAETMP(:)=0 + IF (ZFW < 0.01) THEN !******** DRY GRAUPEL + CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV), PT_RAY(JI,JEL,JAZ,JL,JH,JV),& + ZFW,ZM,& + ZELEV_MIN(3),ZELEV_MAX(3),ZELEV_STEP(3),& + ZTC_MIN(3),ZTC_MAX(3),ZTC_STEP(3),& + ZFW_MIN(3),ZFW_MAX(3),ZFW_STEP(3),& + ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& + ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) + IF (ITMAT(1) .NE. -NUNDEF) THEN + DO JIND=1,SIZE(KMAT_COEF,2),1 + KMAT_COEF(1,JIND)=ZS11_CARRE_T_G(ITMAT(JIND)) + KMAT_COEF(2,JIND)=ZS22_CARRE_T_G(ITMAT(JIND)) + KMAT_COEF(3,JIND)=ZRE_S22S11_T_G(ITMAT(JIND)) + KMAT_COEF(4,JIND)=ZIM_S22S11_T_G(ITMAT(JIND)) + KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_G(ITMAT(JIND)) + KMAT_COEF(6,JIND)=ZIM_S22FT_T_G(ITMAT(JIND)) + KMAT_COEF(7,JIND)=ZIM_S11FT_T_G(ITMAT(JIND)) + ENDDO + CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_G,ZS22_CARRE_G,& + ZRE_S22S11_G,ZIM_S22S11_G,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) + ELSE + ZS11_CARRE_G=0 + ZS22_CARRE_G=0 + ZRE_S22S11_G=0 + ZIM_S22S11_G=0 + ZRE_S22FMS11F=0 + ZIM_S22FT=0 + ZIM_S11FT=0 + END IF + ELSE !ZFW >= 0.01 ************** WET GRAUPEL + CALL CALC_KTMAT(PELEV(JI,JEL,JL,JV),PT_RAY(JI,JEL,JAZ,JL,JH,JV),& + ZFW,ZM,& + ZELEV_MIN(4),ZELEV_MAX(4),ZELEV_STEP(4),& + ZTC_MIN(4),ZTC_MAX(4),ZTC_STEP(4),& + ZFW_MIN(4),ZFW_MAX(4),ZFW_STEP(4),& + ZEXPM_MIN,ZEXPM_MAX,ZEXPM_STEP,& + ITMAT,ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED) + IF (ITMAT(1) .NE. -NUNDEF) THEN + DO JIND=1,SIZE(KMAT_COEF,2),1 + KMAT_COEF(1,JIND)=ZS11_CARRE_T_W(ITMAT(JIND)) + KMAT_COEF(2,JIND)=ZS22_CARRE_T_W(ITMAT(JIND)) + KMAT_COEF(3,JIND)=ZRE_S22S11_T_W(ITMAT(JIND)) + KMAT_COEF(4,JIND)=ZIM_S22S11_T_W(ITMAT(JIND)) + KMAT_COEF(5,JIND)=ZRE_S22FMS11FT_T_W(ITMAT(JIND)) + KMAT_COEF(6,JIND)=ZIM_S22FT_T_W(ITMAT(JIND)) + KMAT_COEF(7,JIND)=ZIM_S11FT_T_W(ITMAT(JIND)) + ENDDO + CALL INTERPOL(ZELEV_RED,ZTC_RED,ZFW_RED,ZM_RED,KMAT_COEF,ZS11_CARRE_G,ZS22_CARRE_G,& + ZRE_S22S11_G,ZIM_S22S11_G,ZRE_S22FMS11F,ZIM_S22FT,ZIM_S11FT) + ELSE + ZS11_CARRE_G=0 + ZS22_CARRE_G=0 + ZRE_S22S11_G=0 + ZIM_S22S11_G=0 + ZRE_S22FMS11F=0 + ZIM_S22FT=0 + ZIM_S11FT=0 + END IF + END IF!END IF (ZFW<0.01) + ZREFLOC(1)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS22_CARRE_G + ZREFLOC(2)=1.E18*(XLAM_RAD(JI))**4/(XPI**5*.93)*4*XPI*ZS11_CARRE_G + ZREFLOC(3)=180.E3/XPI*XLAM_RAD(JI)*ZRE_S22FMS11F + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(1) & + *1.E18*(XLAM_RAD(JI)/XPI)**4/.93*ZCCG/4./ZLBDA**(3+ZDG) + IF(LATT) THEN + ZAETMP(1)=ZIM_S22FT*XLAM_RAD(JI)*2 + ZAETMP(2)=ZIM_S11FT*XLAM_RAD(JI)*2 + END IF + ELSE ! Mie (NDIFF=1) + ZREFLOC(:)=0. + IF(LATT) ZAETMP(:)=0. + DO JJ=1,NPTS_GAULAG ! ****** Gauss-Laguerre quadrature + ZD=ZX(JJ)**(1./ZALPHAG)/ZLBDA + ZDE=ZDMELT_FACT**(1./3.)*ZD**(ZBG/3.) + CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,ZQM,ZQEXT(1),ZQSCA,ZQBACK(1)) + ZQBACK(2)=ZQBACK(1) + ZQEXT(2)=ZQEXT(1) ! modif Clotilde 23/04/2012 + ZQBACK(3)=0. + ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG)*ZW(JJ) + ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG+ZDG/ZALPHAG)*ZW(JJ) + IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(ZNUG-1.+2.*ZBG/3./ZALPHAG)*ZW(JJ) + END DO ! ****** end loop on diameter (Gauss-Laguerre) + ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCG & + *ZLBDA**(ZCXG-2.*ZBG/3.)/(4.*GAMMA(ZNUG)*.93)*ZDMELT_FACT**(2./3.) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP) & + +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & + -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & + *1.E18*(XLAM_RAD(JI)/XPI)**4*ZCCG & + *ZLBDA**(ZCXG-2.*ZBG/3.-ZDG)/(4.*GAMMA(ZNUG)*.93)*ZDMELT_FACT**(2./3.) + IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*ZCCG*ZLBDA**(ZCXG-2.*ZBG/3.)/(4.*GAMMA(ZNUG)) & + *ZDMELT_FACT**(2./3.) + ZRE_S22S11_G=0 + ZIM_S22S11_G=0 + ZS22_CARRE_G=0 + ZS11_CARRE_G=0 !0 in case of Mie + END IF !**************** end loop for each type of diffusion : IF(NDIFF==0.OR.NDIFF==3.OR.NDIFF==4) + ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFLOC(1) ! z_e due to graupel + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)=ZREFLOC(2) !Zvv for ZDR due to graupel + ZREFL(JI,JEL,JAZ,JL,JH,JV,IKDG)=ZREFLOC(3) !Zvv for ZDR due to graupel + + IF (ZS22_CARRE_G*ZS11_CARRE_G .GT. 0) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHG)=SQRT(ZRE_S22S11_G**2+ZIM_S22S11_G**2)/SQRT(ZS22_CARRE_G*ZS11_CARRE_G) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHG)=1 + END IF + IF(LATT) THEN + ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEG)=ZAETMP(1) + ZREFL(JI,JEL,JAZ,JL,JH,JV,IAVG)=ZAETMP(2) + IF(JL>1) THEN + ZAEGINT=ZAEGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD) + ZAVGINT=ZAVGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAVG)*XSTEP_RAD) + END IF + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)*ZAEGINT ! Z_g attenuated + ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZDG)*ZAVGINT ! Z_g attenuated + END IF !end IF(LATT) + END IF !**************** IF(PG_RAY(JI,JEL,JAZ,JL,JH,JV) > XRTMIN(6)) + + ! Total attenuation even if no hydrometeors + IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATG)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATG) & + *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD) + + END IF ! **************** end GRAUPEL (end IF SIZE(PG_RAY,1) > 0) + !----------------------------------------------------------------------------------------------- + !----------------------------------------------------------------------------------------------- + + IF(LWREFL) THEN ! weighting by reflectivities ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ABS(QK)**2/.93*ZDMELT_FACT**2& - *1.E18*XCCG*ZLBDA**(XCXG-ZEXP-XDG)*MOMG(XALPHAG,XNUG,ZEXP+XDG) - ELSE - ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)+XCCG*ZLBDA**XCXG + +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,1) + ELSE IF(LWBSCS) THEN ! weighting by hydrometeor concentrations ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - -ZCG*SIN(PELEV(JI,JEL,JL,JV))& - *XCCG*ZLBDA**(XCXG-XDG)*MOMG(XALPHAG,XNUG,XDG) - END IF - IF(LATT) THEN - IF(NDIFF==0.OR.NDIFF==3) THEN - ZAETMP(:)=XCCG*ZLBDA**XCXG*( & - ZDMELT_FACT *XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAG,XNUG,XBG) /ZLBDA**XBG) - ELSE - ZAETMP(:)=XCCG*ZLBDA**XCXG*( & - ZDMELT_FACT *XPI**2 /XLAM_RAD(JI) *AIMAG(QK) & - * MOMG(XALPHAG,XNUG,XBG) /ZLBDA**XBG & - +ZDMELT_FACT**(5./3.)*XPI**4/15./XLAM_RAD(JI)**3 & - *AIMAG(QK**2*(QM**4+27.*QM**2+38.) & - /(2.*QM**2+3.))*MOMG(XALPHAG,XNUG,5.*XBG/3.)/ZLBDA**(5.*XBG/3.)& - +ZDMELT_FACT**2 *2.*XPI**5/3. /XLAM_RAD(JI)**4*REAL(QK**2) & - * MOMG(XALPHAG,XNUG,2.*XBG) /ZLBDA**(2.*XBG)) - END IF - END IF - ELSE ! Mie or T-matrix - ZREFLOC(:)=0. - IF(LATT) ZAETMP(:)=0. - DO JJ=1,NPTS_GAULAG ! Gauss-Laguerre quadrature - ZD=ZX(JJ)**(1./XALPHAG)/ZLBDA - ZDE=ZDMELT_FACT**(1./3.)*ZD**(XBG/3.) - ! SELECT CASE(NDIFF) - ! CASE(0,3) - ! ZQBACK(1)=4.*(XPI/XLAM_RAD(JI))**4*ABS(QK)**2*ZDE**4 - ! ZQEXT(1)=4.*(XPI*ZDE/XLAM_RAD(JI)*AIMAG(QK)& - ! +(XPI*ZDE/XLAM_RAD(JI))**3*AIMAG(QK**2*(QM**4+27.*QM**2+38.)/(2.*QM**2+3.))/15.& - ! +2.*(XPI*ZDE/XLAM_RAD(JI))**4*REAL(QK**2)/3.) - ! CASE(1,2) ! MIE/T-MATRIX (we use Mie in both cases) - CALL BHMIE(XPI/XLAM_RAD(JI)*ZDE,QM,ZQEXT(1),ZQSCA,ZQBACK(1)) - ! END SELECT - ZQBACK(2)=ZQBACK(1) - ZQBACK(3)=0. - ZREFLOC(1:3)=ZREFLOC(1:3)+ZQBACK(1:3)*ZX(JJ)**(XNUG-1.+2.*XBG/3./XALPHAG)*ZW(JJ) - ZREFLOC(4)=ZREFLOC(4)+ZQBACK(1)*ZX(JJ)**(XNUG-1.+2.*XBG/3./XALPHAG+XDG/XALPHAG)*ZW(JJ) - IF(LATT) ZAETMP(:)=ZAETMP(:)+ZQEXT(:)*ZX(JJ)**(XNUG-1.+2.*XBG/3./XALPHAG)*ZW(JJ) - END DO - ZREFLOC(1:2)=ZREFLOC(1:2)*1.E18*(XLAM_RAD(JI)/XPI)**4*XCCG & - *ZLBDA**(XCXG-2.*XBG/3.)/(4.*GAMMA(XNUG)*.93)*ZDMELT_FACT**(2./3.) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFLOC(1) & - -ZCG*SIN(PELEV(JI,JEL,JL,JV))*ZREFLOC(4) & - *1.E18*(XLAM_RAD(JI)/XPI)**4*XCCG & - *ZLBDA**(XCXG-2.*XBG/3.-XDG)/(4.*GAMMA(XNUG)*.93)*ZDMELT_FACT**(2./3.) - IF(LATT) ZAETMP(:)=ZAETMP(:)*XPI*XCCG*ZLBDA**(XCXG-2.*XBG/3.)/(4.*GAMMA(XNUG))& - *ZDMELT_FACT**(2./3.) - END IF - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:3)+ZREFLOC(1:3) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFLOC(1) ! z_e due to graupel - IF(LATT) THEN - ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)=ZAELOC(JI,JEL,JAZ,JL,JH,JV,:)+ZAETMP(:) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IAEG)=ZAETMP(1) - IF(JL>1) ZAEGINT=ZAEGINT*EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD) - ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IZEG)*ZAEGINT ! Z_g attenuated - END IF - END IF - ! Total attenuation even if no hydrometeors - IF(LATT.AND.JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IATG)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IATG) & - *EXP(-2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IAEG)*XSTEP_RAD) - END IF - - IF(LWREFL) THEN ! weighting by reflectivities - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,1) - ELSE IF(LWBSCS) THEN ! weighting by hydrometeor concentrations - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX) - ELSE IF(ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)/=0.) THEN ! no weighting - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)/ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)& - +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV) - END IF - - ELSE - IF(JV==1.OR.ZREFL(JI,JEL,JAZ,JL,JH,MAX(JV-1,1),1)==-XUNDEF) THEN ! ground clutter - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=-XUNDEF - ELSE ! outside model domain (top or lateral boundaries) - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=0. - END IF - LPART_MASK=.TRUE. - END IF -END IF + +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)*ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX) + ELSE IF(ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)/=0.) THEN ! no weighting + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)/ZREFL(JI,JEL,JAZ,JL,JH,JV,IMAX)& + +PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV) + END IF + !Calculation of Phidp (ZREFL(JI,JEL,JAZ,JL,JH,JV,IPHIDP) is initialized to 0 before the loop + IF (JL>1) ZREFL(JI,JEL,JAZ,JL,JH,JV,IPHIDP)=ZREFL(JI,JEL,JAZ,JL-1,JH,JV,IPHIDP)+ & + 2.*ZREFL(JI,JEL,JAZ,JL-1,JH,JV,3)*XSTEP_RAD*1D-3 - END DO LOOPJL - END DO !JV - END DO !JH - END DO !JAZ - END DO !JEL + !Calculation of RhoHV and DeltaHV + ZRE_S22S11_T=ZRE_S22S11_R+ZRE_S22S11_I+ZRE_S22S11_S+ZRE_S22S11_G + ZIM_S22S11_T=ZIM_S22S11_R+ZIM_S22S11_I+ZIM_S22S11_S+ZIM_S22S11_G + ZS22_CARRE_T=ZS22_CARRE_R+ZS22_CARRE_I+ZS22_CARRE_S+ZS22_CARRE_G + ZS11_CARRE_T=ZS11_CARRE_R+ZS11_CARRE_I+ZS11_CARRE_S+ZS11_CARRE_G + !RhoHV + IF ((ZS22_CARRE_T*ZS11_CARRE_T)>0.) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHOHV)=SQRT(ZRE_S22S11_T**2+ZIM_S22S11_T**2)/SQRT(ZS22_CARRE_T*ZS11_CARRE_T) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IRHOHV)=-XUNDEF + END IF + !DeltaHV + IF (ZRE_S22S11_T/=0) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IDELTAHV)=180/XPI*ATAN(ZIM_S22S11_T/ZRE_S22S11_T) + ELSE + ZREFL(JI,JEL,JAZ,JL,JH,JV,IDELTAHV)=0 + END IF + ELSE !if temperature is not defined + ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=XVALGROUND + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=XVALGROUND + LPART_MASK=.TRUE. + END IF !end condition : IF(PT_RAY(JI,JEL,JAZ,JL,JH,JV) /= -XUNDEF) => if temperature is defined + END IF !end condition : IF(LPART_MASK) => if pixel is not masked + END DO LOOPJL + END DO !JV + END DO !JH + END DO !JAZ + END DO !JEL + ! + !lookup tables for rain + DEALLOCATE (ZTC_T_R,ZELEV_T_R,ZM_T_R,ZS11_CARRE_T_R,ZS22_CARRE_T_R,& + ZRE_S22S11_T_R,ZIM_S22S11_T_R,ZRE_S22FMS11FT_T_R,ZIM_S22FT_T_R,ZIM_S11FT_T_R) + !lookup tables for snow + DEALLOCATE (ZTC_T_S,ZELEV_T_S,ZM_T_S,ZS11_CARRE_T_S,ZS22_CARRE_T_S,& + ZRE_S22S11_T_S,ZIM_S22S11_T_S,ZRE_S22FMS11FT_T_S,ZIM_S22FT_T_S,ZIM_S11FT_T_S) + !lookup tables for graupel + DEALLOCATE (ZTC_T_G,ZELEV_T_G,ZM_T_G,ZS11_CARRE_T_G,ZS22_CARRE_T_G,& + ZRE_S22S11_T_G,ZIM_S22S11_T_G,ZRE_S22FMS11FT_T_G,ZIM_S22FT_T_G,ZIM_S11FT_T_G) + !lookup tables for wet graupel + DEALLOCATE (ZTC_T_W,ZELEV_T_W,ZM_T_W,ZS11_CARRE_T_W,ZS22_CARRE_T_W,& + ZRE_S22S11_T_W,ZIM_S22S11_T_W,ZRE_S22FMS11FT_T_W,ZIM_S22FT_T_W,ZIM_S11FT_T_W) END DO !JI - ! ! attenuation in dB/km -IF(LATT) ZREFL(:,:,:,:,:,:,IAER:IAEG)=4343.*2.*ZREFL(:,:,:,:,:,:,IAER:IAEG) ! specific attenuation +IF(LATT) ZREFL(:,:,:,:,:,:,IAER:IAEG)=4343.*2.*ZREFL(:,:,:,:,:,:,IAER:IAEG) ! horizontal specific attenuation +IF(LATT) ZREFL(:,:,:,:,:,:,IAVR:IAVG)=4343.*2.*ZREFL(:,:,:,:,:,:,IAVR:IAVG) ! vertical specific attenuation ! convective/stratiform ZREFL(:,:,:,:,:,:,4)=PBU_MASK_RAY(:,:,:,:,:,:) ! CSR ! /convective/stratiform + +WRITE(ILUOUT0,*) 'NB ZREFL MIN MAX :', MINVAL(ZREFL(:,:,:,:,:,:,:)),MAXVAL(ZREFL(:,:,:,:,:,:,:)) +WRITE(ILUOUT0,*) 'NB ZREFL VALGROUND :', COUNT(ZREFL(:,:,:,:,:,:,:) ==XVALGROUND) +WRITE(ILUOUT0,*) 'NB ZREFL -XUNDEF :', COUNT(ZREFL(:,:,:,:,:,:,:) ==-XUNDEF) +WRITE(ILUOUT0,*) 'NB ZREFL > 0 :', COUNT(ZREFL(:,:,:,:,:,:,:)>0.) +WRITE(ILUOUT0,*) 'NB ZREFL = 0 :', COUNT(ZREFL(:,:,:,:,:,:,:)==0.) +WRITE(ILUOUT0,*) 'NB ZREFL < 0 :', COUNT(ZREFL(:,:,:,:,:,:,:) < 0.)-COUNT( ZREFL(:,:,:,:,:,:,:)==XVALGROUND) !--------------------------------------------------------------------------------------------------- !* 6. FINAL STEP : TOTAL ATTENUATION AND EQUIVALENT REFLECTIVITY FACTOR ! --------------------------------------------------------------- ! ALLOCATE(ZVTEMP(IMAX)) - DO JI=1,INBRAD - IEL=NBELEV(JI) - DO JEL=1,IEL - DO JAZ=1,INBAZIM - IF (LATT) ZAETOT(:,:,1:2)=1. - DO JL=1,INBSTEPMAX - IF(COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==-XUNDEF)==0.AND.COUNT(PT_RAY(JI,JEL,JAZ,JL,:,:)/=-XUNDEF)/=0) THEN ! if no undef point in gate JL and at least one point defined - DO JH=1,INPTS_H - ZVTEMP(:)=0. - DO JV=1,INPTS_V ! Loop on Jv - IF (JL > 1) THEN - IF(LATT) THEN ! we use ZALPHAE0=alpha_0 from last gate - ZAETOT(JH,JV,1:2)=ZAETOT(JH,JV,1:2)*EXP(-2.*ZAELOC(JI,JEL,JAZ,JL-1,JH,JV,:)*XSTEP_RAD) - ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)*ZAETOT(JH,JV,1:2)!attenuated reflectivity - IF(LWREFL) ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)*ZAETOT(JH,JV,1) - END IF - - END IF - - IF(.NOT.(LWREFL.AND.LWBSCS)) THEN - ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV) - END IF + IEL=NBELEV(JI) + DO JEL=1,IEL + DO JAZ=1,INBAZIM + IF (LATT) ZAETOT(:,:,1:2)=1. + PZE(JI,JEL,JAZ,1,IPHIDP)=0 + DO JL=1,INBSTEPMAX + ! if no undef point in gate JL and at least one point where T is defined + IF(COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==-XUNDEF)==0.AND. & + COUNT(ZREFL(JI,JEL,JAZ,JL,:,:,1)==XVALGROUND)==0.AND. & + COUNT(PT_RAY(JI,JEL,JAZ,JL,:,:)/=-XUNDEF)/=0) THEN + DO JH=1,INPTS_H + ZVTEMP(:)=0. + DO JV=1,INPTS_V ! Loop on Jv + !if range is over 1, attenuation is added + IF (JL > 1) THEN + IF(LATT) THEN ! we use ZALPHAE0=alpha_0 from last gate + !Total attenuation + ZAETOT(JH,JV,1:2)=ZAETOT(JH,JV,1:2)*EXP(-2.*ZAELOC(JI,JEL,JAZ,JL-1,JH,JV,:)*XSTEP_RAD) + !Zhh, Zvv + ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)=ZREFL(JI,JEL,JAZ,JL,JH,JV,1:2)*ZAETOT(JH,JV,1:2)!attenuated reflectivity + !Z for Radial velocity + IF(LWREFL) ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)*ZAETOT(JH,JV,1) + END IF !end IF(LATT) + END IF !end IF (JL > 1) + IF(.NOT.(LWREFL.AND.LWBSCS)) THEN + ZREFL(JI,JEL,JAZ,JL,JH,JV,IVDOP)=PVDOP_RAY(JI,JEL,JAZ,JL,JH,JV) + END IF + ! Quadrature on vertical reflectivities +VDOP + IF(LQUAD) THEN + ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) & + *EXP(-2.*LOG(2.)*PX_V(ABS((2*JV-INPTS_V-1)/2)+1)**2) + ELSE + ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) + END IF + END DO ! End loop on JV +! + IF(LQUAD) THEN + PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) & + *EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2) + IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* & + PW_H(ABS((2*JH-INPTS_H-1)/2)+1)*EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2) + ELSE + PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) + IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* & + PW_H(ABS((2*JH-INPTS_H-1)/2)+1) + END IF !end IF(LQUAD) + END DO ! End loop on JH - ! Quadrature on vertical reflectivities +VDOP - IF(LQUAD) THEN - ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) & - *EXP(-2.*LOG(2.)*PX_V(ABS((2*JV-INPTS_V-1)/2)+1)**2) - ELSE - ZVTEMP(:)=ZVTEMP(:)+ZREFL(JI,JEL,JAZ,JL,JH,JV,:)*PW_V(ABS((2*JV-INPTS_V-1)/2)+1) - END IF - END DO ! End loop on JV - - IF(LQUAD) THEN - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) & - *EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2) - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* & - PW_H(ABS((2*JH-INPTS_H-1)/2)+1)*EXP(-2.*LOG(2.)*PX_H(ABS((2*JH-INPTS_H-1)/2)+1)**2) - ELSE - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)+ZVTEMP(1:SIZE(PZE,5))*PW_H(ABS((2*JH-INPTS_H-1)/2)+1) - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)+ZVTEMP(IMAX)* & - PW_H(ABS((2*JH-INPTS_H-1)/2)+1) - END IF - END DO ! End loop on JH - - IF(LQUAD) THEN - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)*2.*LOG(2.)/XPI - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)*2.*LOG(2.)/XPI - ELSE - PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)/XPI! ELSE REMAINS -XUNDEF - IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)/XPI - END IF - - IF(PZE(JI,JEL,JAZ,JL,1)>=10**(XREFLVDOPMIN/10.)) THEN ! Doppler velocities if Z>=XREFLVDOPMIN dBZ - IF(LWREFL) THEN - PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/PZE(JI,JEL,JAZ,JL,1) - ELSE IF(LWBSCS) THEN - IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.) THEN - PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/ZCONC_BIN(JI,JEL,JAZ,JL) - ELSE - PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF - END IF - END IF - ELSE - PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF - END IF - - ELSE ! ground clutter or outside Meso-NH domain - PZE(JI,JEL,JAZ,JL,1:2)=-XUNDEF + IF(LQUAD) THEN + PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)*2.*LOG(2.)/XPI + IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)*2.*LOG(2.)/XPI + ELSE + PZE(JI,JEL,JAZ,JL,:)=PZE(JI,JEL,JAZ,JL,:)/XPI + IF(LWBSCS) ZCONC_BIN(JI,JEL,JAZ,JL)=ZCONC_BIN(JI,JEL,JAZ,JL)/XPI + END IF !end IF(LQUAD) +! + !**** Thresholding: with ZSNR, or with XREFLVDOPMIN and XREFLMIN + ZSNR=-XUNDEF + ZSNR_R=-XUNDEF + ZSNR_I=-XUNDEF + ZSNR_S=-XUNDEF + ZSNR_G=-XUNDEF + ZZHH=PZE(JI,JEL,JAZ,JL,1) + ZZE_R=PZE(JI,JEL,JAZ,JL,IZER) + ZZE_I=PZE(JI,JEL,JAZ,JL,IZEI) + ZZE_S=PZE(JI,JEL,JAZ,JL,IZES) + ZZE_G=PZE(JI,JEL,JAZ,JL,IZEG) + ZDISTRAD=JL*XSTEP_RAD !radar distance in meters + IF (LSNRT) THEN + IF (ZZHH/=XVALGROUND .AND. ZZHH/=-XUNDEF.AND.ZZHH/=0) THEN + ZSNR=10*LOG10(ZZHH)-20*LOG10(ZDISTRAD/(100*10**3)) END IF - - IF(PZE(JI,JEL,JAZ,JL,1) < 0.) THEN ! flag bin when underground - PZE(JI,JEL,JAZ,JL,1)=XVALGROUND - PZE(JI,JEL,JAZ,JL,IZER:IZEG)=XVALGROUND + IF (ZZE_R/=XVALGROUND .AND. ZZE_R/=-XUNDEF.AND.ZZE_R/=0) THEN + ZSNR_R=10*LOG10(ZZE_R)-20*LOG10(ZDISTRAD/(100*10**3)) END IF - - IF(LATT) THEN - WHERE(PZE(JI,JEL,JAZ,JL,IATR:IATG)<=0.) - PZE(JI,JEL,JAZ,JL,IATR:IATG)=XVALGROUND - END WHERE + IF (ZZE_I/=XVALGROUND .AND. ZZE_I/=-XUNDEF.AND.ZZE_I/=0) THEN + ZSNR_I=10*LOG10(ZZE_I)-20*LOG10(ZDISTRAD/(100*10**3)) + END IF + IF (ZZE_S/=XVALGROUND .AND. ZZE_S/=-XUNDEF.AND.ZZE_S/=0) THEN + ZSNR_S=10*LOG10(ZZE_S)-20*LOG10(ZDISTRAD/(100*10**3)) END IF - END DO - END DO - END DO -END DO - -DEALLOCATE(ZREFL,ZVTEMP) -WRITE(0,*) 'NB PZE VALGROUND :', COUNT(PZE(:,:,:,:,1) ==XVALGROUND) -WRITE(0,*) 'NB PZE > 0 :', COUNT(PZE(:,:,:,:,1)>0.) -WRITE(0,*) 'NB PZE = 0 :', COUNT(PZE(:,:,:,:,1)==0.) -WRITE(0,*) 'NB PZE < 0 :', COUNT(PZE(:,:,:,:,1) < 0.)-COUNT(PZE(:,:,:,:,1) ==XVALGROUND) + IF (ZZE_G/=XVALGROUND .AND. ZZE_G/=-XUNDEF.AND.ZZE_G/=0) THEN + ZSNR_G=10*LOG10(ZZE_G)-20*LOG10(ZDISTRAD/(100*10**3)) + END IF + GTHRESHOLD_V=(ZSNR>=XSNRMIN) + GTHRESHOLD_Z=GTHRESHOLD_V + GTHRESHOLD_ZR=(ZSNR_R>=XSNRMIN) + GTHRESHOLD_ZI=(ZSNR_I>=XSNRMIN) + GTHRESHOLD_ZS=(ZSNR_S>=XSNRMIN) + GTHRESHOLD_ZG=(ZSNR_G>=XSNRMIN) + ELSE + GTHRESHOLD_V=(ZZHH>=10**(XREFLVDOPMIN/10.)) + GTHRESHOLD_Z=(ZZHH>=10**(XREFLMIN/10.)) + GTHRESHOLD_ZR=(ZZE_R>=10**(XREFLMIN/10.)) + GTHRESHOLD_ZI=(ZZE_I>=10**(XREFLMIN/10.)) + GTHRESHOLD_ZS=(ZZE_S>=10**(XREFLMIN/10.)) + GTHRESHOLD_ZG=(ZZE_G>=10**(XREFLMIN/10.)) + END IF + !--- Doppler velocities + IF(GTHRESHOLD_V) THEN + IF(LWREFL) THEN + !change Clotilde 27/04/2012 to avoid division by zero and floating point exception + IF (PZE(JI,JEL,JAZ,JL,1)/=0) THEN + PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/PZE(JI,JEL,JAZ,JL,1) + END IF + ELSE IF(LWBSCS) THEN + IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.) THEN + PZE(JI,JEL,JAZ,JL,IVDOP)=PZE(JI,JEL,JAZ,JL,IVDOP)/ZCONC_BIN(JI,JEL,JAZ,JL) + ELSE + PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF + END IF !end IF(ZCONC_BIN(JI,JEL,JAZ,JL)>0.) + END IF !end IF(LWREFL) + ELSE + PZE(JI,JEL,JAZ,JL,IVDOP)=-XUNDEF + END IF !end IF(GTHRESHOLD_V) + + !--- Zhh, Zvv et variables globales + IF(GTHRESHOLD_Z .EQV. .FALSE.) THEN + PZE(JI,JEL,JAZ,JL,1:4)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IRHOHV:IDELTAHV)=-XUNDEF + END IF + !--- ZER, ZDA, KDR, RHR + IF(GTHRESHOLD_ZR .EQV. .FALSE.) THEN + PZE(JI,JEL,JAZ,JL,IZER)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IZDA)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IKDR)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IRHR)=-XUNDEF + END IF + !--- ZES, ZDS, KDS, RHS + IF(GTHRESHOLD_ZS .EQV. .FALSE.) THEN + PZE(JI,JEL,JAZ,JL,IZES)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IZDS)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IKDS)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IRHS)=-XUNDEF + END IF + + !--- ZEG, ZDG, KDG, RHG + IF(GTHRESHOLD_ZG .EQV. .FALSE.) THEN + PZE(JI,JEL,JAZ,JL,IZEG)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IZDG)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IKDG)=-XUNDEF + PZE(JI,JEL,JAZ,JL,IRHG)=-XUNDEF + END IF + !--- ZEI + IF(GTHRESHOLD_ZI .EQV. .FALSE.) THEN + PZE(JI,JEL,JAZ,JL,IZEI)=-XUNDEF + END IF + ELSE + ! ground clutter or outside Meso-NH domain + !(IF T not defined or if one undef point at least in gate) + PZE(JI,JEL,JAZ,JL,:)=XVALGROUND + END IF + IF(PZE(JI,JEL,JAZ,JL,1) < 0. .AND. PZE(JI,JEL,JAZ,JL,1)/=-XUNDEF) THEN ! flag bin when underground => xvalground si < 0? + PZE(JI,JEL,JAZ,JL,:)=XVALGROUND + END IF ! end IF(PZE(JI,JEL,JAZ,JL,1) < 0.) + END DO ! end DO JL=1,INBSTEPMAX + END DO !end DO JAZ=1,INBAZIM + END DO !end DO JEL=1,IEL +END DO !end DO JI=1,INBRAD +DEALLOCATE(ZREFL,ZVTEMP,ZRTMIN) +WRITE(ILUOUT0,*) '*****************FIN RADAR_SCATTERING ***********************' +WRITE(ILUOUT0,*) 'NB PZE MIN MAX :', MINVAL(PZE(:,:,:,:,IZEI)),MAXVAL(PZE(:,:,:,:,IZEI)) +WRITE(ILUOUT0,*) 'NB PZE VALGROUND :', COUNT(PZE(:,:,:,:,IZEI) ==XVALGROUND) +WRITE(ILUOUT0,*) 'NB PZE -XUNDEF :', COUNT(PZE(:,:,:,:,IZEI) ==-XUNDEF) +WRITE(ILUOUT0,*) 'NB PZE > 0 :', COUNT(PZE(:,:,:,:,IZEI)>0.) +WRITE(ILUOUT0,*) 'NB PZE = 0 :', COUNT(PZE(:,:,:,:,IZEI)==0.) +WRITE(ILUOUT0,*) 'NB PZE < 0 :', COUNT(PZE(:,:,:,:,IZEI) < 0.)-COUNT(PZE(:,:,:,:,IZEI) ==XVALGROUND) IF(NDIFF/=0) DEALLOCATE(ZX,ZW) IF (LATT) DEALLOCATE(ZAELOC,ZAETOT) -WRITE(0,*) 'END OF RADAR SCATTERING' +WRITE(ILUOUT0,*) 'END OF RADAR SCATTERING' END SUBROUTINE RADAR_SCATTERING diff --git a/src/MNH/radar_simulator.f90 b/src/MNH/radar_simulator.f90 index 6ae3191ca1656757547d9ff7b974b37a9c5037e8..c0bd0044c09edb6eb077af287001e3b2e83e1e54 100644 --- a/src/MNH/radar_simulator.f90 +++ b/src/MNH/radar_simulator.f90 @@ -12,17 +12,19 @@ ! ########################### ! INTERFACE - SUBROUTINE RADAR_SIMULATOR(PUM,PVM,PWM,PRT,PCIT,PRHODREF,PTEMP,PPABSM,PREFL_CART,PLATLON) -! + SUBROUTINE RADAR_SIMULATOR(PUM,PVM,PWM,PRT,PCIT,PRHODREF,PTEMP,PPABSM,PREFL_CART,PLATLON,PCRT) +! variables en entree REAL,DIMENSION(:,:,:), INTENT(IN), TARGET :: PUM,PVM,PWM ! wind components REAL,DIMENSION(:,:,:,:),INTENT(IN), TARGET :: PRT ! microphysical mix. ratios at t REAL,DIMENSION(:,:,:), INTENT(IN), TARGET :: PCIT ! pristine ice concentration at t REAL,DIMENSION(:,:,:), INTENT(IN), TARGET :: PRHODREF ! density of the ref. state REAL,DIMENSION(:,:,:), INTENT(IN), TARGET :: PTEMP ! air temperature REAL,DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute pressure -! -REAL,DIMENSION(:,:,:,:,:),INTENT(OUT) :: PREFL_CART ! radar reflectivity in dBZ on observation cartesian grid +! variables en sortie +REAL,DIMENSION(:,:,:,:,:),INTENT(OUT) :: PREFL_CART ! radar variables (including reflectivity in dBZ) on observation cartesian grid REAL,DIMENSION(:,:,:), INTENT(OUT) :: PLATLON! latlon of cartesian grid points +REAL,DIMENSION(:,:,:),OPTIONAL,INTENT(IN), TARGET :: PCRT ! rain concentration at t + ! END SUBROUTINE RADAR_SIMULATOR ! @@ -32,7 +34,7 @@ END MODULE MODI_RADAR_SIMULATOR ! ! ######################################################################### SUBROUTINE RADAR_SIMULATOR(PUM,PVM,PWM,PRT,PCIT,PRHODREF,PTEMP,PPABSM, & - PREFL_CART,PLATLON) + PREFL_CART,PLATLON,PCRT) ! ######################################################################### ! !!**** *RADAR_SIMULATOR * - computes some pertinent radar parameters on PPIs @@ -83,15 +85,48 @@ END MODULE MODI_RADAR_SIMULATOR !! !! AUTHOR !! ------ -!! O. Caumont & V. Ducrocq * Météo-France * +!! O. Caumont & V. Ducrocq * Meteo-France * !! !! MODIFICATIONS !! ------------- -!! Original 26/03/2004 -!! O. Caumont 14/09/2009 modifications to allow for polar outputs -!! O. Caumont 11/02/2010 thresholding and conversion from linear to log values after interpolation instead of before. -!! O. Caumont 01/2011 gate-to-gate path computations revised (formulation+efficiency); comments in outputs revised +!! Original 26/03/2004 +!! O. Caumont 14/09/2009 modifications to allow for polar outputs +!! O. Caumont 11/02/2010 thresholding and conversion from linear to log values after interpolation instead of before. +!! O. Caumont 01/2011 gate-to-gate path computations revised (formulation+efficiency); comments in outputs revised +!! C. Augros 22/02/2012 add of comments +!! Attention : dans cette version, la temperature est forcee a 15° et l'elevation +!! a la valeur donnee dans DIAG (pas de prise en compte de la courbure du faisceau) +!! +!! ------------- MY_MODIF 8 ------ +!! C. Augros 02/2013 +!! All thresholding is done in radar_scattering. +!! +!! ------------- MY_MODIF 9 ------ +!! C. Augros 20/02/2013 +!! Calculation of RHV, PDP and DHV +!! +!! ------------- MY_MODIF 10 ------ +!! C. Augros 28/02/2013 +!! add of Avv (specific vertical attenuation) and T° in output files !! +!! ------------- MY_MODIF 11 ------ +!! C. Augros 7/03/2013 +!! Add of NDIFF=7 (TmatInt) for snow and graupel +!! RHR-RHG, ZDA-ZDG, KDR-KDG (RhoHV, ZDR and Kdp for rain, snow and graupel) +!! in output files +!! +!! C. Augros 13/03/2013 +!! Thresholding of radar variables for each specie (specific SNR value for rain, snow, ice, graupel) +!! +!! C. Augros 22/03/2013 +!! Correction of interpolation part: add of "IF LATT" to set variables (AER-AEG, ATR-ATG) +!! to xvalground or xundef +!! +!! C. Augros 27/03/2013 +!! for polar output: +!! NBAZIM set in nameliste (720) +!! ZAZIM_BASE(JAZ)=(0.5+JAZ-1)*ZZSTEP +!! !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -99,8 +134,6 @@ END MODULE MODI_RADAR_SIMULATOR ! USE MODD_CST , ONLY: XPI,XRD,XRV,XRADIUS USE MODD_REF -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM USE MODD_PARAMETERS USE MODD_LUNIT ! @@ -137,6 +170,7 @@ REAL,DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! Absolute pressure ! REAL,DIMENSION(:,:,:,:,:),INTENT(OUT) :: PREFL_CART ! radar reflectivity in dBZ and other parameters on observation cartesian or polar grid REAL,DIMENSION(:,:,:), INTENT(OUT) :: PLATLON! latlon of cartesian grid points +REAL,DIMENSION(:,:,:),OPTIONAL,INTENT(IN), TARGET :: PCRT ! rain concentration at t ! !* 0.2 Declarations of local variables : @@ -154,13 +188,13 @@ INTEGER :: IIELV ! maximum number of elevations INTEGER :: ILUOUT0 ! Logical unit number for output-listing INTEGER :: IRESP ! Return code of FM-routines INTEGER :: JI,JL,JEL,JAZ,JH,JV ! Loop variables of control -INTEGER :: IEL -INTEGER,DIMENSION(:,:,:,:),ALLOCATABLE :: IREFL_CART_NB! +INTEGER :: IEL,IND,INDV +INTEGER,DIMENSION(:,:,:,:),ALLOCATABLE :: IREFL_CART_NB,IREFL_CART_NBR,IREFL_CART_NBI,IREFL_CART_NBS,IREFL_CART_NBG! INTEGER,DIMENSION(:,:,:,:),ALLOCATABLE :: IVDOP_CART_NB! REAL,DIMENSION(:,:,:,:,:),ALLOCATABLE :: ZZE ! gate equivalent reflectivity factor, ZDR, KDP, -REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: ZELEV ! elevation in rad. -REAL,DIMENSION(:), ALLOCATABLE :: ZAZIM_BASE ! azimuth in rad. of the beam centre -REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZAZIM ! azimuth in rad. of discretized beam +REAL,DIMENSION(:,:,:,:),ALLOCATABLE :: ZELEV ! elevation in rad. +REAL,DIMENSION(:), ALLOCATABLE :: ZAZIM_BASE ! azimuth in rad. of the beam centre +REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZAZIM ! azimuth in rad. of discretized beam ! REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZX_RAY ! x positions of the points along the ray-tracing REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZY_RAY ! y positions of the points along the ray-tracing @@ -200,16 +234,28 @@ INTEGER :: INVAR REAL :: r,h,alph ! convective/stratiform -LOGICAL,DIMENSION(:,:,:),ALLOCATABLE :: GBU_MSK +LOGICAL,DIMENSION(:,:,:),ALLOCATABLE :: GBU_MSK REAL, DIMENSION(:,:,:),ALLOCATABLE, TARGET :: ZBU_MASK REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE, TARGET :: ZBU_MASK_RAY ! refractivity REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZN_RAY,ZDNDZ_RAY ! refractivity and its vertical gradient in radar coordinates -REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZN,ZDNDZ -INTEGER :: IRFR,IDNZ ! index of ZN_RAY,ZDNDZ_RAY in ZZE -INTEGER :: IVDOP,IHAS -INTEGER,PARAMETER :: IZER=5,IZEG=8,IATR=14,IATG=17 -! +REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZN,ZDNDZ ! index of ZN_RAY,ZDNDZ_RAY in ZZE + +INTEGER,PARAMETER :: IZER=5,IZEI=6,IZES=7,IZEG=8 +INTEGER,PARAMETER :: IVDOP=9 +INTEGER,PARAMETER :: IAER=10,IAEI=11,IAES=12,IAEG=13 +INTEGER,PARAMETER :: IAVR=14,IAVI=15,IAVS=16,IAVG=17 +INTEGER,PARAMETER :: IATR=18,IATI=19,IATS=20,IATG=21 +INTEGER :: IRHV,IPDP,IDHV +INTEGER :: IRHR, IRHS, IRHG, IZDA, IZDS, IZDG, IKDR, IKDS, IKDG +INTEGER :: IHAS,IRFR,IDNZ +REAL :: ZZSTEP +! +!Modif pour LIMA +! +LOGICAL :: GLIMA +REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE, TARGET :: ZCRT_RAY ! rain concentration interpolated along the rays! +REAL, DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZWORK !------------------------------------------------------------------------------- ! ! @@ -232,7 +278,7 @@ IJE = IJU - JPHEXT IKE = IKU - JPVEXT ! convective/stratiform ALLOCATE(GBU_MSK(IIU,IJU,4)) -CALL SET_MSK(PRT,PRHODREF,GBU_MSK) ! on récupère GBU_MSK +CALL SET_MSK(PRT,PRHODREF,GBU_MSK) ! on récupère GBU_MSK ALLOCATE(ZBU_MASK(SIZE(PTEMP,1),SIZE(PTEMP,2),SIZE(PTEMP,3))) ZBU_MASK(:,:,1)=0. WHERE(GBU_MSK(:,:,2)) ! stratiform @@ -244,6 +290,12 @@ END WHERE DEALLOCATE(GBU_MSK) ZBU_MASK(:,:,:)=SPREAD(ZBU_MASK(:,:,1),DIM=3,NCOPIES=SIZE(PTEMP,3)) IIELV=MAXVAL(NBELEV(1:NBRAD)) +! LIMA +IF (PRESENT(PCRT)) THEN + GLIMA=.TRUE. +ELSE + GLIMA=.FALSE. +ENDIF ! !* 1.2 Some constants and parameters ! @@ -252,32 +304,50 @@ ZRDSDG=XPI/180. ! PI/180 ! !* 1.3 beam characteristics initialization ! -! azimuths 0°=N 90°=E -ALLOCATE(ZAZIM_BASE(NBAZIM),ZAZIM(NBRAD,NBAZIM,NPTS_H)) -! -DO JAZ=1,NBAZIM - IF(JAZ<=NMAX) THEN +! azimuths 0=N 90=E +WRITE(ILUOUT0,*) "NBAZIM",NBAZIM +ALLOCATE(ZAZIM_BASE(NBAZIM),ZAZIM(NBRAD,NBAZIM,NPTS_H)) +!calculation of the azimut of the center of the beam (ZAZIM_BASE) +!so that each pixel of the square grid circling the PPI (which number of pixel in the radius is NMAX) +!NMAX=INT(NBSTEPMAX*XSTEP_RAD/XGRID) : number of range +!contains one azimut only + +IF (LCART_RAD) THEN + DO JAZ=1,NBAZIM ! NBAZIM defined in mode_interpol_beam + IF(JAZ<=NMAX) THEN ZAZIM_BASE(JAZ)=ATAN((JAZ-.5)/NMAX) - ELSE IF(JAZ<=3*NMAX) THEN + ELSE IF(JAZ<=3*NMAX) THEN ZAZIM_BASE(JAZ)=XPI/2+ATAN((-2*NMAX+JAZ-.5)/NMAX) - ELSE IF(JAZ<=5*NMAX) THEN + ELSE IF(JAZ<=5*NMAX) THEN ZAZIM_BASE(JAZ)=XPI-ATAN((4*NMAX-JAZ+.5)/NMAX) - ELSE IF(JAZ<=7*NMAX) THEN + ELSE IF(JAZ<=7*NMAX) THEN ZAZIM_BASE(JAZ)=3*XPI/2-ATAN((6*NMAX-JAZ+.5)/NMAX) - ELSE + ELSE ZAZIM_BASE(JAZ)=2*XPI-ATAN((8*NMAX-JAZ+.5)/NMAX) - END IF -END DO + END IF + END DO +ELSE + ZZSTEP=2*XPI/NBAZIM + DO JAZ=1,NBAZIM + ZAZIM_BASE(JAZ)=(0.5+JAZ-1)*ZZSTEP + END DO +END IF + +WRITE(ILUOUT0,*) "ZAZIM_BASE(1)",ZAZIM_BASE(1) +WRITE(ILUOUT0,*) "ZAZIM_BASE(NBAZIM/2.)",ZAZIM_BASE(NBAZIM/2.) +WRITE(ILUOUT0,*) "ZAZIM_BASE(NBAZIM)",ZAZIM_BASE(NBAZIM) + +!copy in the 3D matrix (ZAZIM) containing the horizontal discretization of the beam for all azimut of all radars ZAZIM(:,1:NBAZIM,:)=SPREAD(SPREAD(ZAZIM_BASE(1:NBAZIM),DIM=1,NCOPIES=NBRAD),DIM=3,NCOPIES=NPTS_H) ! ! elevations ALLOCATE(ZELEV(NBRAD,IIELV,NBSTEPMAX+1,NPTS_V)) -! +! 4D matrix containing the vertical discretization of the beam for all elevations (with a value for each range step) ZELEV(:,:,:,:)=SPREAD(SPREAD(XELEV(1:NBRAD,1:IIELV),DIM=3,NCOPIES=NBSTEPMAX+1),& DIM=4,NCOPIES=NPTS_V) ! ! Discretization of the gate -! +! Calculation of the position ZX_H and ZX_V and weights ZW_H and ZW_V for each discretization of the beam (horizontally and vertically) ALLOCATE(ZX_H((NPTS_H+1)/2),ZW_H((NPTS_H+1)/2)) ALLOCATE(ZX_V((NPTS_V+1)/2),ZW_V((NPTS_V+1)/2)) IF(LQUAD) THEN @@ -309,21 +379,45 @@ ZELEV(:,:,:,:)=ZELEV(:,:,:,:)*ZRDSDG ! in radian ! initialisation of refractivity indices IRFR=1 ! this is used down there in the interpolation part IDNZ=1 ! this is used down there in the interpolation part -IHAS=10 -IVDOP=9 -IF(LREFR) IRFR=16 ! refractivity +!IHAS=10 !number of calculated radar variables (on the radar projection) +!IHAS=13 !add of RhoHV, PhiDP, DeltaHV in ZZE +IHAS=22 !add of RHR-RHG, ZDA-ZDG, KDR-KDG +IF(LREFR) THEN + IRFR=IHAS+7 ! add of TEM: + !"HAS","M_R","M_I","M_S","M_G","CIT","TEM" + ! puis "RFR" + IF (GLIMA) IRFR=IRFR+1 ! add "CRT" +ENDIF IF(LDNDZ) THEN IF(LREFR) THEN - IDNZ=17 ! refractivity vertical gradient + IDNZ=IHAS+8 !+7 !17 ! refractivity vertical gradient ELSE - IDNZ=16 ! refractivity vertical gradient + IDNZ=IHAS+7 !+6 !16 ! refractivity vertical gradient END IF + IF (GLIMA) IDNZ=IDNZ+1 END IF IF(LATT) THEN - IRFR=IRFR+8 - IDNZ=IDNZ+8 - IHAS=IHAS+8 + IRFR=IRFR+12 !add of AVR-AVG (vertical specific attenuation) + IDNZ=IDNZ+12 + IHAS=IHAS+12 +END IF +IF (LATT) THEN + IRHV=22 !"ZHH","ZDR","KDP","CSR","ZER","ZEI","ZES","ZEG","VRU" + !"AER","AEI","AES","AEG","AVR","AVI","AVS","AVG","ATR","ATI","ATS","ATG" +ELSE + IRHV=10 END IF +IPDP=IRHV+1 +IDHV=IPDP+1 +IRHR=IDHV+1 +IRHS=IRHR+1 +IRHG=IRHS+1 +IZDA=IRHG+1 +IZDS=IZDA+1 +IZDG=IZDS+1 +IKDR=IZDG+1 +IKDS=IKDR+1 +IKDG=IKDS+1 ! !---------------------------------------------------------------------------------------- !* 2. RAY TRACING DEFINITION @@ -336,21 +430,21 @@ IF (XRPK<0.) THEN ! projection from north pole ZLAT0=-XLAT0 ZBETA=-XBETA ZLON0=XLON0+180. - WRITE(0,*) 'projection from north pole' - WRITE(0,*) 'ZRPK',ZRPK - WRITE(0,*) 'ZLAT0',ZLAT0 - WRITE(0,*) 'ZBETA',ZBETA - WRITE(0,*) 'ZLON0',ZLON0 + WRITE(ILUOUT0,*) 'projection from north pole' + WRITE(ILUOUT0,*) 'ZRPK',ZRPK + WRITE(ILUOUT0,*) 'ZLAT0',ZLAT0 + WRITE(ILUOUT0,*) 'ZBETA',ZBETA + WRITE(ILUOUT0,*) 'ZLON0',ZLON0 ELSE ! projection from south pole ZRPK=XRPK ZLAT0=XLAT0 ZBETA=XBETA ZLON0=XLON0 - WRITE(0,*) 'projection from south pole' - WRITE(0,*) 'ZRPK:',ZRPK - WRITE(0,*) 'ZLAT0:',ZLAT0 - WRITE(0,*) 'ZBETA:',ZBETA - WRITE(0,*) 'ZLON0:',ZLON0 + WRITE(ILUOUT0,*) 'projection from south pole' + WRITE(ILUOUT0,*) 'ZRPK:',ZRPK + WRITE(ILUOUT0,*) 'ZLAT0:',ZLAT0 + WRITE(ILUOUT0,*) 'ZBETA:',ZBETA + WRITE(ILUOUT0,*) 'ZLON0:',ZLON0 ENDIF ZCLAT0 = COS(ZRDSDG*ZLAT0) ZSLAT0 = SIN(ZRDSDG*ZLAT0) @@ -381,8 +475,8 @@ DO JI=1,NBRAD END DO XZ_INI(:)=XALT_RAD(:) ! z positions of the ground source signal ! -ALLOCATE(ZX_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& - ZY_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& +ALLOCATE(ZX_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& !6D matrix : X position of the pixel in the model grid for each range + ZY_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& !of each discretisation of each elevation and each azimut of each radar ZZ_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& ZLAT(NPTS_H,NPTS_V),& ZLON(NPTS_H,NPTS_V),& @@ -395,11 +489,11 @@ ZZ_RAY(:,:,:,:,:,:)=0. ZDX_NAT(:,:,:,:,:,:)=0. ZDY_NAT(:,:,:,:,:,:)=0. ! -ZX_RAY(1:NBRAD,:,:,1,:,:)=SPREAD(SPREAD(SPREAD(SPREAD(XX_INI(1:NBRAD),DIM=2,NCOPIES=IIELV),& +ZX_RAY(1:NBRAD,:,:,1,:,:)=SPREAD(SPREAD(SPREAD(SPREAD(XX_INI(1:NBRAD),DIM=2,NCOPIES=IIELV),& !initialization with the X position of the radar DIM=3,NCOPIES=NBAZIM),DIM=4,NCOPIES=NPTS_H),DIM=5,NCOPIES=NPTS_V) -ZY_RAY(1:NBRAD,:,:,1,:,:)=SPREAD(SPREAD(SPREAD(SPREAD(XY_INI(1:NBRAD),DIM=2,NCOPIES=IIELV), & +ZY_RAY(1:NBRAD,:,:,1,:,:)=SPREAD(SPREAD(SPREAD(SPREAD(XY_INI(1:NBRAD),DIM=2,NCOPIES=IIELV), & !initialization with the Y position of the radar DIM=3,NCOPIES=NBAZIM),DIM=4,NCOPIES=NPTS_H),DIM=5,NCOPIES=NPTS_V) -ZZ_RAY(1:NBRAD,:,:,1,:,:)=SPREAD(SPREAD(SPREAD(SPREAD(XZ_INI(1:NBRAD),DIM=2,NCOPIES=IIELV), & +ZZ_RAY(1:NBRAD,:,:,1,:,:)=SPREAD(SPREAD(SPREAD(SPREAD(XZ_INI(1:NBRAD),DIM=2,NCOPIES=IIELV), & !initialization with the Z position of the radar DIM=3,NCOPIES=NBAZIM),DIM=4,NCOPIES=NPTS_H),DIM=5,NCOPIES=NPTS_V) ! refractivity IF(LREFR) ALLOCATE(ZN_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) @@ -417,145 +511,144 @@ IF(NCURV_INTERPOL == 1) THEN ENDIF ! -!* 2.3 positions of the rays in the MESO-NH conformal projection +!* 2.3 positions of the rays in the MESO-NH conformal projection (calculation of ZX_RAY, ZY_RAY and ZZ_RAY) ! DO JI=1,NBRAD - IEL=NBELEV(JI) - WRITE(0,*) 'RADAR #',JI,'Number of ELEVATIONS: ',NBELEV(JI) - WRITE(0,*) ' Elevations used:' - DO JEL=1,IEL - WRITE(0,*) " ",ZELEV(JI,JEL,1,:)/ZRDSDG - DO JAZ=1,NBAZIM - label: DO JL=1,NBSTEPMAX - ! SM_LATLON takes bidimensional arrays as arguments - CALL SM_LATLON(XLATORI,XLONORI, & - ZX_RAY(JI,JEL,JAZ,JL,:,:), ZY_RAY(JI,JEL,JAZ,JL,:,:),ZLAT(:,:),ZLON(:,:)) - DO JH=1,NPTS_H - DO JV=1,NPTS_V - ! - !* Compute positions of the gates - ! - ! Compute local Map factor and other projection factors - IF(XRPK<0.) ZLAT(JH,JV)=-ZLAT(JH,JV) ! projection from north pole - - IF(ABS(ZRPK-1.)>1.E-10 .AND. ABS(COS(ZRDSDG*ZLAT(JH,JV)))<1.E-10) THEN - WRITE(0,*) 'Error in projection : ' - WRITE(0,*) 'pole in the domain, but not with stereopolar projection' - !callabortstop - CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) - CALL ABORT - STOP - ENDIF - ! - IF(ABS(ZCLAT0)<1.E-10 .AND. ABS(ZRPK-1.)<1.E-10) THEN - ZMAP = (1.+ZSLAT0)/(1.+SIN(ZRDSDG*ZLAT(JH,JV))) - ELSE IF(ABS(COS(ZRDSDG*ZLAT(JH,JV)))>1.E-10) THEN - ZMAP = ((ZCLAT0/COS(ZRDSDG*ZLAT(JH,JV)))**(1.-ZRPK)) & - * ((1.+ZSLAT0)/(1.+SIN(ZRDSDG*ZLAT(JH,JV))))**ZRPK - ELSE - ZMAP = (1.+ZSLAT0)/(1.+SIN(ZRDSDG*ZLAT(JH,JV))) - END IF - ZGAMMA=(ZRPK*(ZLON(JH,JV)-ZLON0)-ZBETA)*ZRDSDG - ZCOSG=COS(ZGAMMA) - ZSING=SIN(ZGAMMA) + IEL=NBELEV(JI) + WRITE(ILUOUT0,*) 'RADAR #',JI,'Number of ELEVATIONS: ',NBELEV(JI) + WRITE(ILUOUT0,*) ' Elevations used:' + DO JEL=1,IEL + WRITE(ILUOUT0,*) " ",ZELEV(JI,JEL,1,:)/ZRDSDG + DO JAZ=1,NBAZIM + label: DO JL=1,NBSTEPMAX + ! SM_LATLON takes bidimensional arrays as arguments + CALL SM_LATLON(XLATORI,XLONORI, & + ZX_RAY(JI,JEL,JAZ,JL,:,:), ZY_RAY(JI,JEL,JAZ,JL,:,:),ZLAT(:,:),ZLON(:,:)) + DO JH=1,NPTS_H + DO JV=1,NPTS_V + ! + !* Compute positions of the gates + ! + ! Compute local Map factor and other projection factors + IF(XRPK<0.) ZLAT(JH,JV)=-ZLAT(JH,JV) ! projection from north pole + + IF(ABS(ZRPK-1.)>1.E-10 .AND. ABS(COS(ZRDSDG*ZLAT(JH,JV)))<1.E-10) THEN + WRITE(ILUOUT0,*) 'Error in projection : ' + WRITE(ILUOUT0,*) 'pole in the domain, but not with stereopolar projection' + !callabortstop + CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + ! + IF(ABS(ZCLAT0)<1.E-10 .AND. ABS(ZRPK-1.)<1.E-10) THEN + ZMAP = (1.+ZSLAT0)/(1.+SIN(ZRDSDG*ZLAT(JH,JV))) + ELSE IF(ABS(COS(ZRDSDG*ZLAT(JH,JV)))>1.E-10) THEN + ZMAP = ((ZCLAT0/COS(ZRDSDG*ZLAT(JH,JV)))**(1.-ZRPK)) & + * ((1.+ZSLAT0)/(1.+SIN(ZRDSDG*ZLAT(JH,JV))))**ZRPK + ELSE + ZMAP = (1.+ZSLAT0)/(1.+SIN(ZRDSDG*ZLAT(JH,JV))) + END IF + ZGAMMA=(ZRPK*(ZLON(JH,JV)-ZLON0)-ZBETA)*ZRDSDG + ZCOSG=COS(ZGAMMA) + ZSING=SIN(ZGAMMA) - ! compute positions of radar gates (2 methods) : - ! First method : gate-to-gate computation using the model's index of refraction - IF(NCURV_INTERPOL == 1) THEN - ! first compute vertical position (height) - ! compute the index of refraction at the radar gate boundaries - CALL INTERPOL_BEAM(ZN(:,:,:),ZN1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) - IF(LREFR) ZN_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZN1-1.)*1.E6 - IF(LDNDZ) THEN - IF(JL==1) THEN - ZDNDZ_RAY(JI,JEL,JAZ,JL,JH,JV)=0. ! this is not true, this is set to XVALGROUND afterwards - ELSE - ZDNDZ_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZN1-ZN0)*1.E6/(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1)) - END IF - END IF - IF(ZN1==-XUNDEF) THEN ! we are underground - ZZ_RAY(JI,JEL,JAZ,JL:NBSTEPMAX+1,:,:)=-XUNDEF ! rest of the ray is flagged undefined - EXIT label - ELSE - IF(JL > 1) THEN -! next line to comment (std refraction) -! ZN1=ZN0-(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1))/(4.*XRADIUS) - IF(ZN0/ZN1*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL-1,JH,JV))/(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV)) & - *COS(ZELEV(JI,JEL,JL-1,JV)) >= 1.) THEN ! it means the slope of the ray path is 0 relative to the Earth - ZELEV(JI,JEL,JL,JV)=-ACOS(2.-ZN0/ZN1*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL-1,JH,JV)) & - /(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))*COS(ZELEV(JI,JEL,JL-1,JV))) - ELSE ! usual formula - ZELEV(JI,JEL,JL,JV)=ZELEV(JI,JEL,JL-1,JV)/ABS(ZELEV(JI,JEL,JL-1,JV))* & - ACOS(ZN0/ZN1*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL-1,JH,JV))/ & - (XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))*COS(ZELEV(JI,JEL,JL-1,JV))) - END IF - ZDNDZ1=(ZN1-ZN0)/(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1)) - ELSE ! for first gate DNDZ1 is the local value at radar - CALL INTERPOL_BEAM(ZDNDZ(:,:,:),ZDNDZ1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),& - ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) - END IF - IF(ZDNDZ1>-ZN1/XRADIUS/COS(ZELEV(JI,JEL,JL,JV))) THEN - ZKE=1./(1.+XRADIUS/ZN1*ZDNDZ1*COS(ZELEV(JI,JEL,JL,JV))) - ELSE - ZKE=1./(1.-XRADIUS/ZN1*ZDNDZ1*COS(ZELEV(JI,JEL,JL,JV))) - END IF - ! éléments finis -! ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)=SQRT(XSTEP_RAD**2+(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))**2 & -! +2.*XSTEP_RAD*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))*SIN(ZELEV(JI,JEL,JL,JV)))-XRADIUS - ! Doviak & Zrnic - ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZZ_RAY(JI,JEL,JAZ,JL,JH,JV)+SQRT(XSTEP_RAD**2+(ZKE*XRADIUS)**2 & - +2.*XSTEP_RAD*ZKE*XRADIUS*SIN(ZELEV(JI,JEL,JL,JV)))-ZKE*XRADIUS - ZN0=ZN1 - ! then compute horizontal position - ZDX_NAT(JI,JEL,JAZ,JL,JH,JV)=XRADIUS*ASIN(XSTEP_RAD/ & - (XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV))*COS(ZELEV(JI,JEL,JL,JV)))*SIN(ZAZIM(JI,JAZ,JH)) - ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)=XRADIUS*ASIN(XSTEP_RAD/ & - (XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV))*COS(ZELEV(JI,JEL,JL,JV)))*COS(ZAZIM(JI,JAZ,JH)) - ZX_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZX_RAY(JI,JEL,JAZ,JL,JH,JV) & !!! - + (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZCOSG) - & - (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZSING) ) & - /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) - ZY_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZY_RAY(JI,JEL,JAZ,JL,JH,JV) + & - (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZSING) + & - (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZCOSG) ) & - /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) - ! WRITE(0,*) 'ZY_RAY(',JI,JEL,JAZ,JL+1,')',ZY_RAY(JI,JEL,JAZ,JL+1) - END IF - ELSE - ! effective Earth radius model Doviak & Zrnic 1993 (2.28b) p. 21 - ! vertical position - ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)=SQRT((JL*XSTEP_RAD)**2+(ZKE*XRADIUS)**2+ & - 2.*JL*XSTEP_RAD*ZKE*XRADIUS*SIN(ZELEV(JI,JEL,1,JV)))-ZKE*XRADIUS+ & - ZZ_RAY(JI,JEL,JAZ,1,JH,JV) - ! This formula is given by Doviak & Zrnic 1993 (9.9 p. 307) - ZELEV(JI,JEL,JL+1,JV)=ZELEV(JI,JEL,1,JV)+ATAN(JL*XSTEP_RAD*COS(ZELEV(JI,JEL,1,JV))& - /(ZKE*XRADIUS+JL*XSTEP_RAD*SIN(ZELEV(JI,JEL,1,JV)))) - ! horizontal position (Doviak & Zrnic) - ZDX_NAT(JI,JEL,JAZ,JL,JH,JV)=ZKE*XRADIUS*ASIN(JL*XSTEP_RAD*COS(ZELEV(JI,JEL,JL,JV)) & - /(ZKE*XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)))*SIN(ZAZIM(JI,JAZ,JH)) - ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)=ZKE*XRADIUS*ASIN(JL*XSTEP_RAD*COS(ZELEV(JI,JEL,JL,JV)) & - /(ZKE*XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)))*COS(ZAZIM(JI,JAZ,JH)) - ZX_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZX_RAY(JI,JEL,JAZ,1,JH,JV) & !!! - + (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZCOSG) - & - (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZSING) ) & - /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) - ZY_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZY_RAY(JI,JEL,JAZ,1,JH,JV) + & - (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZSING) + & - (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZCOSG) ) & - /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) + ! compute positions of radar gates (2 methods) : + ! First method : gate-to-gate computation using the model's index of refraction + IF(NCURV_INTERPOL == 1) THEN + ! first compute vertical position (height) + ! compute the index of refraction at the radar gate boundaries + CALL INTERPOL_BEAM(ZN(:,:,:),ZN1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),& + ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) + IF(LREFR) ZN_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZN1-1.)*1.E6 !LREFR: if true writes out refractivity (N ≡ (n − 1) × 106) + IF(LDNDZ) THEN !LDNDZ: if true writes out vertical gradient of refractivity + IF(JL==1) THEN + ZDNDZ_RAY(JI,JEL,JAZ,JL,JH,JV)=0. ! this is not true, this is set to XVALGROUND afterwards + ELSE + ZDNDZ_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZN1-ZN0)*1.E6/(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1)) + END IF + END IF + IF(ZN1==-XUNDEF) THEN ! we are underground + ZZ_RAY(JI,JEL,JAZ,JL:NBSTEPMAX+1,:,:)=-XUNDEF ! rest of the ray is flagged undefined + EXIT label + ELSE + IF(JL > 1) THEN + ! next line to comment (std refraction) + !ZN1=ZN0-(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1))/(4.*XRADIUS) + IF(ZN0/ZN1*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL-1,JH,JV))/(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV)) & + *COS(ZELEV(JI,JEL,JL-1,JV)) >= 1.) THEN ! it means the slope of the ray path is 0 relative to the Earth + ZELEV(JI,JEL,JL,JV)=-ACOS(2.-ZN0/ZN1*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL-1,JH,JV)) & + /(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))*COS(ZELEV(JI,JEL,JL-1,JV))) + ELSE ! usual formula + ZELEV(JI,JEL,JL,JV)=ZELEV(JI,JEL,JL-1,JV)/ABS(ZELEV(JI,JEL,JL-1,JV))* & + ACOS(ZN0/ZN1*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL-1,JH,JV))/ & + (XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))*COS(ZELEV(JI,JEL,JL-1,JV))) END IF - END DO - END DO - END DO label - END DO - END DO + ZDNDZ1=(ZN1-ZN0)/(ZZ_RAY(JI,JEL,JAZ,JL,1,1)-ZZ_RAY(JI,JEL,JAZ,JL-1,1,1)) + ELSE ! for first gate DNDZ1 is the local value at radar + CALL INTERPOL_BEAM(ZDNDZ(:,:,:),ZDNDZ1,ZX_RAY(JI,JEL,JAZ,JL,JH,JV),& + ZY_RAY(JI,JEL,JAZ,JL,JH,JV),ZZ_RAY(JI,JEL,JAZ,JL,JH,JV),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) + END IF + IF(ZDNDZ1>-ZN1/XRADIUS/COS(ZELEV(JI,JEL,JL,JV))) THEN + ZKE=1./(1.+XRADIUS/ZN1*ZDNDZ1*COS(ZELEV(JI,JEL,JL,JV))) + ELSE + ZKE=1./(1.-XRADIUS/ZN1*ZDNDZ1*COS(ZELEV(JI,JEL,JL,JV))) + END IF + ! elements finis + !ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)=SQRT(XSTEP_RAD**2+(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))**2 & + !+2.*XSTEP_RAD*(XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL,JH,JV))*SIN(ZELEV(JI,JEL,JL,JV)))-XRADIUS + ! Doviak & Zrnic + ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZZ_RAY(JI,JEL,JAZ,JL,JH,JV)+SQRT(XSTEP_RAD**2+(ZKE*XRADIUS)**2 & + +2.*XSTEP_RAD*ZKE*XRADIUS*SIN(ZELEV(JI,JEL,JL,JV)))-ZKE*XRADIUS + ZN0=ZN1 + ! then compute horizontal position + ZDX_NAT(JI,JEL,JAZ,JL,JH,JV)=XRADIUS*ASIN(XSTEP_RAD/ & + (XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV))*COS(ZELEV(JI,JEL,JL,JV)))*SIN(ZAZIM(JI,JAZ,JH)) + ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)=XRADIUS*ASIN(XSTEP_RAD/ & + (XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV))*COS(ZELEV(JI,JEL,JL,JV)))*COS(ZAZIM(JI,JAZ,JH)) + ZX_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZX_RAY(JI,JEL,JAZ,JL,JH,JV) & !!! + + (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZCOSG) - & + (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZSING) ) & + /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) + ZY_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZY_RAY(JI,JEL,JAZ,JL,JH,JV) + & + (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZSING) + & + (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZCOSG) ) & + /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) + END IF + ELSE + ! 2nd method : effective Earth radius model Doviak & Zrnic 1993 (2.28b) p. 21 + ! vertical position + ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)=SQRT((JL*XSTEP_RAD)**2+(ZKE*XRADIUS)**2+ & + 2.*JL*XSTEP_RAD*ZKE*XRADIUS*SIN(ZELEV(JI,JEL,1,JV)))-ZKE*XRADIUS+ & + ZZ_RAY(JI,JEL,JAZ,1,JH,JV) + ! This formula is given by Doviak & Zrnic 1993 (9.9 p. 307) + ZELEV(JI,JEL,JL+1,JV)=ZELEV(JI,JEL,1,JV)+ATAN(JL*XSTEP_RAD*COS(ZELEV(JI,JEL,1,JV))& + /(ZKE*XRADIUS+JL*XSTEP_RAD*SIN(ZELEV(JI,JEL,1,JV)))) + ! horizontal position (Doviak & Zrnic) + ZDX_NAT(JI,JEL,JAZ,JL,JH,JV)=ZKE*XRADIUS*ASIN(JL*XSTEP_RAD*COS(ZELEV(JI,JEL,JL,JV)) & + /(ZKE*XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)))*SIN(ZAZIM(JI,JAZ,JH)) + ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)=ZKE*XRADIUS*ASIN(JL*XSTEP_RAD*COS(ZELEV(JI,JEL,JL,JV)) & + /(ZKE*XRADIUS+ZZ_RAY(JI,JEL,JAZ,JL+1,JH,JV)))*COS(ZAZIM(JI,JAZ,JH)) + ZX_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZX_RAY(JI,JEL,JAZ,1,JH,JV) & !!! + + (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZCOSG) - & + (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZSING) ) & + /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) + ZY_RAY(JI,JEL,JAZ,JL+1,JH,JV)=ZY_RAY(JI,JEL,JAZ,1,JH,JV) + & + (ZMAP* XRADIUS *((ZDX_NAT(JI,JEL,JAZ,JL,JH,JV) * ZSING) + & + (ZDY_NAT(JI,JEL,JAZ,JL,JH,JV)* ZCOSG) ) & + /(ZZ_RAY(JI,JEL,JAZ,JL,JH,JV) + XRADIUS)) + END IF + END DO + END DO + END DO label + END DO + END DO END DO DEALLOCATE(ZLAT,ZLON) DEALLOCATE(ZDX_NAT,ZDY_NAT) IF(NCURV_INTERPOL == 1) DEALLOCATE(ZN,ZDNDZ) ! end of geometrical part ; I determined z[xyz]_ray -WRITE(0,*) 'BEAM DEFINITION DONE' +WRITE(ILUOUT0,*) 'BEAM DEFINITION DONE' ! !------------------------------------------------------------------------------- !* 3. INTERPOLATION OF THE MODEL VARIABLES ON THE RAYS @@ -565,18 +658,22 @@ WRITE(0,*) 'BEAM DEFINITION DONE' !* 3.1 allocation of the arrays and initialization of the arrays of pointers ! (to avoid multiple calls to interpol_beam) ! -! 1: temperature; 2: rhodref, 3: rain mixing ratio; 4: r_i; 5: CIT; 6: r_s; 7: r_g; 8: convective/stratiform; 9: u; 10: v; 11: w -ALLOCATE(TVARMOD(NRR+5)) -ALLOCATE(TVARRAD(NRR+5)) +! 1: temperature; 2: rhodref, 3: rain mixing ratio; 4: r_i; 5: CIT; 6: r_s; 7: r_g; 8: convective/stratiform; 9: u; 10: v; 11: w; 12: rain concentration (LIMA only) + ALLOCATE(TVARMOD(NRR+5)) ! pointer toward the matrix of model variables (Tempe, rhodref,mixing rations...) in the model projection (X,Y,Z) + ALLOCATE(TVARRAD(NRR+5)) ! pointer toward the matrix of model variables (Tempe, rhodref,mixing rations...) interpolated in the + ! radar projection (iradar,ielev,iazim,irangestep,idiscretH,idiscretV) + TVARMOD(1)%P=>PTEMP(:,:,:) TVARMOD(2)%P=>PRHODREF(:,:,:) -ALLOCATE(ZT_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& + +ALLOCATE(ZT_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& ! temperature and reference density interpolated along the ray ZRHODREF_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) TVARRAD(1)%P=>ZT_RAY(:,:,:,:,:,:) TVARRAD(2)%P=>ZRHODREF_RAY(:,:,:,:,:,:) INVAR=2 ! raindrops -IF(SIZE(PRT,4)>2) THEN +IF(SIZE(PRT,4)>2) THEN ! PRT : 4D matrix containing the mixing ratios of different species in the model grid (X,Y,Z) + !SIZE(PRT,4) : number of hydrometeor species INVAR=INVAR+1 TVARMOD(INVAR)%P=>PRT(:,:,:,3) ALLOCATE(ZR_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) @@ -591,7 +688,7 @@ IF (SIZE(PRT,4)>3) THEN INVAR=INVAR+1 TVARMOD(INVAR)%P=>PCIT(:,:,:) ALLOCATE(ZCIT_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) - TVARRAD(5)%P=>ZCIT_RAY(:,:,:,:,:,:) + TVARRAD(INVAR)%P=>ZCIT_RAY(:,:,:,:,:,:) END IF ! snow IF (SIZE(PRT,4)>4) THEN @@ -615,15 +712,21 @@ TVARRAD(INVAR+1)%P=>ZBU_MASK_RAY(:,:,:,:,:,:) TVARMOD(INVAR+2)%P=>PUM(:,:,:) TVARMOD(INVAR+3)%P=>PVM(:,:,:) TVARMOD(INVAR+4)%P=>PWM(:,:,:) -ALLOCATE(ZUM_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& - ZVM_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V),& - ZWM_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) +ALLOCATE(ZUM_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) +ALLOCATE(ZVM_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) +ALLOCATE(ZWM_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) TVARRAD(INVAR+2)%P=>ZUM_RAY(:,:,:,:,:,:) TVARRAD(INVAR+3)%P=>ZVM_RAY(:,:,:,:,:,:) TVARRAD(INVAR+4)%P=>ZWM_RAY(:,:,:,:,:,:) +IF (GLIMA) THEN + ALLOCATE(ZCRT_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) + TVARMOD(INVAR+5)%P=>PCRT(:,:,:) + TVARRAD(INVAR+5)%P=>ZCRT_RAY(:,:,:,:,:,:) +ENDIF !* 3.2 interpolation of all model variables - +!interpolation from TVARMOD to TVARRAD of the model variables in the radar projection, using the position (ZX_RAY, ZY_RAY, ZZ_RAY) +!of the beam in the model grid CALL INTERPOL_BEAM(TVARMOD,TVARRAD,ZX_RAY(:,:,:,:,:,:),& ZY_RAY(:,:,:,:,:,:),ZZ_RAY(:,:,:,:,:,:),ZXHATM(:),ZYHATM(:),ZZM(:,:,:)) ! @@ -633,50 +736,137 @@ DEALLOCATE(ZX_RAY,ZY_RAY) DEALLOCATE(TVARMOD,TVARRAD) ! !Doppler velocities (unfolded): wind contribution +!Calculation of the radial velocity in the radar projection from U,V and W model (ZUM_RAY, ZVM_RAY and ZWM_RAY model) ALLOCATE(ZVDOP_RAY(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,NPTS_H,NPTS_V)) DO JI=1,NBRAD IEL=NBELEV(JI) DO JEL=1,IEL - DO JAZ=1,NBAZIM - DO JL=1,NBSTEPMAX+1 - DO JH=1,NPTS_H - DO JV=1,NPTS_V - IF(ZUM_RAY(JI,JEL,JAZ,JL,JH,JV)/=-XUNDEF) THEN - ZVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZUM_RAY(JI,JEL,JAZ,JL,JH,JV)*SIN(ZAZIM(JI,JAZ,JH))& - +ZVM_RAY(JI,JEL,JAZ,JL,JH,JV)*COS(ZAZIM(JI,JAZ,JH)))*COS(ZELEV(JI,JEL,JL,JV))& - +ZWM_RAY(JI,JEL,JAZ,JL,JH,JV)*SIN(ZELEV(JI,JEL,JL,JV)) - ELSE - ZVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)=-XUNDEF - END IF - END DO - END DO + DO JAZ=1,NBAZIM + DO JL=1,NBSTEPMAX+1 + DO JH=1,NPTS_H + DO JV=1,NPTS_V + IF(ZUM_RAY(JI,JEL,JAZ,JL,JH,JV)/=-XUNDEF) THEN + ZVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)=(ZUM_RAY(JI,JEL,JAZ,JL,JH,JV)*SIN(ZAZIM(JI,JAZ,JH))& + +ZVM_RAY(JI,JEL,JAZ,JL,JH,JV)*COS(ZAZIM(JI,JAZ,JH)))*COS(ZELEV(JI,JEL,JL,JV))& + +ZWM_RAY(JI,JEL,JAZ,JL,JH,JV)*SIN(ZELEV(JI,JEL,JL,JV)) + ELSE + ZVDOP_RAY(JI,JEL,JAZ,JL,JH,JV)=-XUNDEF + END IF + END DO END DO - END DO + END DO + END DO END DO END DO DEALLOCATE(ZAZIM,ZUM_RAY,ZVM_RAY,ZWM_RAY) - -WRITE(0,*) 'INTERPOLATION OF MODEL VARIABLES DONE' +! +WRITE(ILUOUT0,*) 'INTERPOLATION OF MODEL VARIABLES DONE' ! !----------------------------------------------------------------------------------------- !* 4. COMPUTING REFLECTIVITIES ALONG THE RAY BEAM (BACKSCATTERING + ATTENUATION) ! --------------------------------------------------------------------------- ALLOCATE(ZZE(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,SIZE(PREFL_CART(:,:,:,:,:),5))) +!ZZE : 5D matrix (iradar, ielev, iaz, irangestep, ivar) containing the radar variables that will be calculated +!in polar or cartesian projection (same projection as the observation grid) +!PREFL_CART is the same matrix, but is the name of the variable which is given as output of radar_simulator +!whereas ZZE is a intermediate variable -CALL RADAR_SCATTERING(ZT_RAY,ZRHODREF_RAY,ZR_RAY,ZI_RAY,ZCIT_RAY,ZS_RAY,ZG_RAY,ZVDOP_RAY, & - ZELEV,ZX_H,ZX_V,ZW_H,ZW_V,ZZE(:,:,:,:,1:IHAS-1),ZBU_MASK_RAY) +!calculation of ZZE and ZBU_MASK_RAY +!----------------------------------------------------------------------- +IF (GLIMA) THEN + CALL RADAR_SCATTERING(ZT_RAY,ZRHODREF_RAY,ZR_RAY,ZI_RAY,ZCIT_RAY,ZS_RAY,ZG_RAY,ZVDOP_RAY, & + ZELEV,ZX_H,ZX_V,ZW_H,ZW_V,ZZE(:,:,:,:,1:IHAS-1),ZBU_MASK_RAY,ZCRT_RAY) +ELSE + CALL RADAR_SCATTERING(ZT_RAY,ZRHODREF_RAY,ZR_RAY,ZI_RAY,ZCIT_RAY,ZS_RAY,ZG_RAY,ZVDOP_RAY, & + ZELEV,ZX_H,ZX_V,ZW_H,ZW_V,ZZE(:,:,:,:,1:IHAS-1),ZBU_MASK_RAY) +ENDIF DEALLOCATE(ZVDOP_RAY) ! convective/stratiform DEALLOCATE(ZBU_MASK_RAY) ! /convective/stratiform ! conversion discretised gates -> single point gates for other output fields +! model variables (beam height, mixing ratios, CIT, refractivity, refractivity gradient) in the radar projection are also added to ZZE ZZE(:,:,:,:,IHAS)=ZZ_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! beam height -ZZE(:,:,:,:,IHAS+1)=ZRHODREF_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2)*ZR_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! M_r -ZZE(:,:,:,:,IHAS+2)=ZRHODREF_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2)*ZI_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! M_i -ZZE(:,:,:,:,IHAS+3)=ZRHODREF_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2)*ZS_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! M_s -ZZE(:,:,:,:,IHAS+4)=ZRHODREF_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2)*ZG_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! M_g -ZZE(:,:,:,:,IHAS+5)=ZCIT_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! CIT +ALLOCATE(ZWORK(SIZE(ZRHODREF_RAY,1),SIZE(ZRHODREF_RAY,2),& + SIZE(ZRHODREF_RAY,3),SIZE(ZRHODREF_RAY,4),& + SIZE(ZRHODREF_RAY,5),SIZE(ZRHODREF_RAY,6))) +! M_r +WHERE(ZRHODREF_RAY/=-XUNDEF .AND. ZR_RAY/=-XUNDEF) + ZWORK=ZRHODREF_RAY*ZR_RAY +ELSEWHERE + ZWORK=-XUNDEF +END WHERE +WHERE(ZRHODREF_RAY==XVALGROUND .OR. ZR_RAY==XVALGROUND) + ZWORK=XVALGROUND +END WHERE +ZZE(:,:,:,:,IHAS+1)=ZWORK(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) +! M_i +WHERE(ZRHODREF_RAY/=-XUNDEF .AND. ZI_RAY/=-XUNDEF) + ZWORK=ZRHODREF_RAY*ZI_RAY +ELSEWHERE + ZWORK=-XUNDEF +END WHERE +WHERE(ZRHODREF_RAY==XVALGROUND .OR. ZI_RAY==XVALGROUND) + ZWORK=XVALGROUND +END WHERE +ZZE(:,:,:,:,IHAS+2)=ZWORK(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) +! M_s +WHERE(ZRHODREF_RAY/=-XUNDEF .AND. ZS_RAY/=-XUNDEF) + ZWORK=ZRHODREF_RAY*ZS_RAY +ELSEWHERE + ZWORK=-XUNDEF +END WHERE +WHERE(ZRHODREF_RAY==XVALGROUND .OR. ZS_RAY==XVALGROUND) + ZWORK=XVALGROUND +END WHERE +ZZE(:,:,:,:,IHAS+3)=ZWORK(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) +! M_g +WHERE(ZRHODREF_RAY/=-XUNDEF .AND. ZG_RAY/=-XUNDEF) + ZWORK=ZRHODREF_RAY*ZG_RAY +ELSEWHERE + ZWORK=-XUNDEF +END WHERE +WHERE(ZRHODREF_RAY==XVALGROUND .OR. ZG_RAY==XVALGROUND) + ZWORK=XVALGROUND +END WHERE +ZZE(:,:,:,:,IHAS+4)=ZWORK(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) +DEALLOCATE(ZWORK) +! CIT +IF (GLIMA)THEN + ALLOCATE(ZWORK(SIZE(ZRHODREF_RAY,1),SIZE(ZRHODREF_RAY,2),& + SIZE(ZRHODREF_RAY,3),SIZE(ZRHODREF_RAY,4),& + SIZE(ZRHODREF_RAY,5),SIZE(ZRHODREF_RAY,6))) + WHERE(ZRHODREF_RAY/=-XUNDEF .AND. ZCIT_RAY/=-XUNDEF) + ZWORK=ZRHODREF_RAY*ZCIT_RAY + ELSEWHERE + ZWORK=-XUNDEF + END WHERE + WHERE(ZRHODREF_RAY==XVALGROUND .OR. ZCIT_RAY==XVALGROUND) + ZWORK=XVALGROUND + END WHERE + + ZZE(:,:,:,:,IHAS+5)=ZWORK(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) + DEALLOCATE(ZWORK) +ELSE + ZZE(:,:,:,:,IHAS+5)=ZCIT_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) +ENDIF +ZZE(:,:,:,:,IHAS+6)=ZT_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! temperature +IF (GLIMA)THEN + ALLOCATE(ZWORK(SIZE(ZRHODREF_RAY,1),SIZE(ZRHODREF_RAY,2),& + SIZE(ZRHODREF_RAY,3),SIZE(ZRHODREF_RAY,4),& + SIZE(ZRHODREF_RAY,5),SIZE(ZRHODREF_RAY,6))) + WHERE(ZRHODREF_RAY/=-XUNDEF .AND. ZCRT_RAY/=-XUNDEF) + ZWORK=ZRHODREF_RAY*ZCRT_RAY + ELSEWHERE + ZWORK=-XUNDEF + END WHERE + WHERE(ZRHODREF_RAY==XVALGROUND .OR. ZCRT_RAY==XVALGROUND) + ZWORK=XVALGROUND + END WHERE + ZZE(:,:,:,:,IHAS+7)=ZWORK(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) + DEALLOCATE(ZWORK) +ENDIF IF(LREFR) THEN ZZE(:,:,:,:,IRFR)=ZN_RAY(:,:,:,:,(NPTS_H+1)/2,(NPTS_V+1)/2) ! refractivity ZZE(:,:,:,NBSTEPMAX+1,IRFR)=XVALGROUND @@ -700,10 +890,18 @@ IF(ALLOCATED(ZG_RAY)) DEALLOCATE(ZG_RAY) !---------------------------------------------------------------------------------------------- !* 5. INTERPOLATION ON THE CARTESIAN GRID ! ----------------------------------- -IF (LCART_RAD) THEN +IF (LCART_RAD) THEN !if cartesian interpolation ALLOCATE(IREFL_CART_NB(NBRAD,IIELV,2*NMAX,2*NMAX),IVDOP_CART_NB(NBRAD,IIELV,2*NMAX,2*NMAX)) + ALLOCATE(IREFL_CART_NBR(NBRAD,IIELV,2*NMAX,2*NMAX)) + ALLOCATE(IREFL_CART_NBI(NBRAD,IIELV,2*NMAX,2*NMAX)) + ALLOCATE(IREFL_CART_NBS(NBRAD,IIELV,2*NMAX,2*NMAX)) + ALLOCATE(IREFL_CART_NBG(NBRAD,IIELV,2*NMAX,2*NMAX)) PREFL_CART(:,:,:,:,:)=0. IREFL_CART_NB(:,:,:,:)=0 + IREFL_CART_NBR(:,:,:,:)=0 + IREFL_CART_NBS(:,:,:,:)=0 + IREFL_CART_NBI(:,:,:,:)=0 + IREFL_CART_NBG(:,:,:,:)=0 IVDOP_CART_NB(:,:,:,:)=0 ! !* 5.1 reflectivity on a cartesian grid (this is the way DSO/CMR creates BUFRs) @@ -713,99 +911,567 @@ IF (LCART_RAD) THEN DO JEL=1,IEL DO JAZ=1,NBAZIM DO JL=1,NBSTEPMAX+1 + IF ((ZZE(JI,JEL,JAZ,JL,IHAS+6)/=XVALGROUND).AND.(ZZE(JI,JEL,JAZ,JL,IHAS+6)/=-XUNDEF)) THEN !conversion en °C + ZZE(JI,JEL,JAZ,JL,IHAS+6)=ZZE(JI,JEL,JAZ,JL,IHAS+6)-273.15 + ENDIF IXGRID=CEILING(NMAX+((JL-1)*XSTEP_RAD*SIN(ZAZIM_BASE(JAZ))/XGRID)) IYGRID=CEILING(NMAX+((JL-1)*XSTEP_RAD*COS(ZAZIM_BASE(JAZ))/XGRID)) ! assigning polar grid values to cartesian grid + + !************************************************* + !**** RADIAL VELOCITY **** + !************************************************* + !XVALGROUND for VRU + IF(ZZE(JI,JEL,JAZ,JL,IVDOP)==XVALGROUND.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)==XVALGROUND & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==XVALGROUND) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==XVALGROUND) & ! case for refractivity gradient at origin + ) THEN ! if any XVALGROUND in the pixel for ZHH -> pixel set to XVALGROUND for all variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=XVALGROUND + IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + + !-xundef for VRU + ELSE IF(ZZE(JI,JEL,JAZ,JL,IVDOP)==-XUNDEF.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)==-XUNDEF & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==-XUNDEF) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==-XUNDEF) & ! case for refractivity gradient at origin + ) THEN ! if any -XUNDEF in the pixel for ZHH-> pixel set to -XUNDEF for all general variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=-XUNDEF + IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + + !if no xvalground and no -xundef for VRU + ELSE + PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP) & + +ZZE(JI,JEL,JAZ,JL,IVDOP) + IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)+1 + END IF + + !************************************************* + !**** GENERAL VARIABLES **** + !************************************************* + !Keeping -XUNDEF and XVALGROUND values for ZHH and "general" variables IF(ZZE(JI,JEL,JAZ,JL,1)==XVALGROUND.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,1)==XVALGROUND & .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==XVALGROUND) & ! case for refractivity at boundaries .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==XVALGROUND) & ! case for refractivity gradient at origin - ) THEN ! if any XVALGROUND in the pixel -> pixel set to XVALGROUND - PREFL_CART(JI,JEL,IXGRID,IYGRID,:)=XVALGROUND + ) THEN ! if any XVALGROUND in the pixel for ZHH -> pixel set to XVALGROUND for all variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,1:4)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHV:IDHV)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IHAS:)=XVALGROUND IREFL_CART_NB(JI,JEL,IXGRID,IYGRID)=1 - IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + !IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + + !-xundef for ZHH + ELSE IF(ZZE(JI,JEL,JAZ,JL,1)==-XUNDEF.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,1)==-XUNDEF & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==-XUNDEF) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==-XUNDEF) & ! case for refractivity gradient at origin + ) THEN ! if any -XUNDEF in the pixel for ZHH-> pixel set to -XUNDEF for all general variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,1:4)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHV:IDHV)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IHAS:)=-XUNDEF + IREFL_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + !IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + + !if no xvalground and no -xundef for REFL: incrementation of all polar pixels inside the cartesian pixel ELSE - PREFL_CART(JI,JEL,IXGRID,IYGRID,:IVDOP-1)=PREFL_CART(JI,JEL,IXGRID,IYGRID,:IVDOP-1) & - +ZZE(JI,JEL,JAZ,JL,:IVDOP-1) - PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP+1:)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP+1:) & - +ZZE(JI,JEL,JAZ,JL,IVDOP+1:) + PREFL_CART(JI,JEL,IXGRID,IYGRID,1:4)=PREFL_CART(JI,JEL,IXGRID,IYGRID,1:4) & + +ZZE(JI,JEL,JAZ,JL,1:4) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHV:IDHV)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHV:IDHV) & + +ZZE(JI,JEL,JAZ,JL,IRHV:IDHV) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IHAS:)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IHAS:) & + +ZZE(JI,JEL,JAZ,JL,IHAS:) IREFL_CART_NB(JI,JEL,IXGRID,IYGRID)=IREFL_CART_NB(JI,JEL,IXGRID,IYGRID)+1 - IF(ZZE(JI,JEL,JAZ,JL,IVDOP)/=-XUNDEF.AND.PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)/=XVALGROUND) THEN - PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)+ZZE(JI,JEL,JAZ,JL,IVDOP) - IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)+1 - ELSE - PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=XVALGROUND - IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + + !if no xundef for IVDOP + !IF(ZZE(JI,JEL,JAZ,JL,IVDOP)/=-XUNDEF.AND.PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)/=-XUNDEF) THEN + ! !if no xvalground for IVDOP + ! IF (ZZE(JI,JEL,JAZ,JL,IVDOP)/=XVALGROUND.AND.PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)/=XVALGROUND)THEN + ! PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)+ZZE(JI,JEL,JAZ,JL,IVDOP) + ! IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)+1 + ! ELSE + ! PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=XVALGROUND + ! IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + ! END IF + !ELSE + ! PREFL_CART(JI,JEL,IXGRID,IYGRID,IVDOP)=-XUNDEF + ! IVDOP_CART_NB(JI,JEL,IXGRID,IYGRID)=1 + !END IF !end if no xundef for IVDOP + END IF !END IF ZZE(JI,JEL,JAZ,JL,1).OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,1)==XVALGROUND + + !********************************************** + !**** RAIN VARIABLES **** + !********************************************** + IF(ZZE(JI,JEL,JAZ,JL,IZER)==XVALGROUND.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZER)==XVALGROUND & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==XVALGROUND) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==XVALGROUND) & ! case for refractivity gradient at origin + ) THEN ! if any XVALGROUND in the pixel for ZHH -> pixel set to XVALGROUND for all variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZER)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHR)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDA)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDR)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVR)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATR)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAER)=XVALGROUND END IF + IREFL_CART_NBR(JI,JEL,IXGRID,IYGRID)=1 + + !-xundef for ZER + ELSE IF(ZZE(JI,JEL,JAZ,JL,IZER)==-XUNDEF.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZER)==-XUNDEF & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==-XUNDEF) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==-XUNDEF) & ! case for refractivity gradient at origin + ) THEN ! if any -XUNDEF in the pixel for ZER-> pixel set to -XUNDEF for all rain variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZER)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHR)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDA)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDR)=-XUNDEF + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAER)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVR)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATR)=-XUNDEF + END IF + IREFL_CART_NBR(JI,JEL,IXGRID,IYGRID)=1 + + !if no xvalground and no -xundef for REFL: incrementation of all polar pixels inside the cartesian pixel + ELSE + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZER)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZER) & + +ZZE(JI,JEL,JAZ,JL,IZER) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHR)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHR) & + +ZZE(JI,JEL,JAZ,JL,IRHR) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDA)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDA) & + +ZZE(JI,JEL,JAZ,JL,IZDA) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDR)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDR) & + +ZZE(JI,JEL,JAZ,JL,IKDR) + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAER)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAER) & + +ZZE(JI,JEL,JAZ,JL,IAER) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVR)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVR) & + +ZZE(JI,JEL,JAZ,JL,IAVR) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATR)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IATR) & + +ZZE(JI,JEL,JAZ,JL,IATR) + END IF + IREFL_CART_NBR(JI,JEL,IXGRID,IYGRID)=IREFL_CART_NBR(JI,JEL,IXGRID,IYGRID)+1 END IF - END DO ! JL - END DO ! - END DO - END DO -DEALLOCATE(ZZE) + !********************************************** + !**** ICE VARIABLES **** + !********************************************** + IF(ZZE(JI,JEL,JAZ,JL,IZEI)==XVALGROUND.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEI)==XVALGROUND & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==XVALGROUND) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==XVALGROUND) & ! case for refractivity gradient at origin + ) THEN ! if any XVALGROUND in the pixel for ZHH -> pixel set to XVALGROUND for all variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEI)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEI)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVI)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATI)=XVALGROUND + ENDIF + IREFL_CART_NBI(JI,JEL,IXGRID,IYGRID)=1 + + !-xundef for ZEI + ELSE IF(ZZE(JI,JEL,JAZ,JL,IZEI)==-XUNDEF.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEI)==-XUNDEF & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==-XUNDEF) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==-XUNDEF) & ! case for refractivity gradient at origin + ) THEN ! if any -XUNDEF in the pixel for ZER-> pixel set to -XUNDEF for all rain variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEI)=-XUNDEF + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEI)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVI)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATI)=-XUNDEF + ENDIF + IREFL_CART_NBI(JI,JEL,IXGRID,IYGRID)=1 + + !if no xvalground and no -xundef for REFL: incrementation of all polar pixels inside the cartesian pixel + ELSE + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEI)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEI) & + +ZZE(JI,JEL,JAZ,JL,IZEI) + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEI)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEI) & + +ZZE(JI,JEL,JAZ,JL,IAEI) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVI)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVI) & + +ZZE(JI,JEL,JAZ,JL,IAVI) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATI)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IATI) & + +ZZE(JI,JEL,JAZ,JL,IATI) + ENDIF + IREFL_CART_NBI(JI,JEL,IXGRID,IYGRID)=IREFL_CART_NBI(JI,JEL,IXGRID,IYGRID)+1 + END IF + + !********************************************** + !**** SNOW VARIABLES **** + !********************************************** + IF(ZZE(JI,JEL,JAZ,JL,IZES)==XVALGROUND.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZES)==XVALGROUND & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==XVALGROUND) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==XVALGROUND) & ! case for refractivity gradient at origin + ) THEN ! if any XVALGROUND in the pixel for ZES -> pixel set to XVALGROUND for all snow variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZES)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHS)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDS)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDS)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAES)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVS)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATS)=XVALGROUND + END IF + IREFL_CART_NBS(JI,JEL,IXGRID,IYGRID)=1 + + !-xundef for ZES + ELSE IF(ZZE(JI,JEL,JAZ,JL,IZES)==-XUNDEF.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZES)==-XUNDEF & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==-XUNDEF) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==-XUNDEF) & ! case for refractivity gradient at origin + ) THEN ! if any -XUNDEF in the pixel for ZHH-> pixel set to -XUNDEF for all general variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZES)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHS)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDS)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDS)=-XUNDEF + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAES)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVS)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATS)=-XUNDEF + ENDIF + IREFL_CART_NBS(JI,JEL,IXGRID,IYGRID)=1 + + !if no xvalground and no -xundef for REFL: incrementation of all polar pixels inside the cartesian pixel + ELSE + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZES)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZES) & + +ZZE(JI,JEL,JAZ,JL,IZES) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHS)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHS) & + +ZZE(JI,JEL,JAZ,JL,IRHS) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDS)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDS) & + +ZZE(JI,JEL,JAZ,JL,IZDS) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDS)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDS) & + +ZZE(JI,JEL,JAZ,JL,IKDS) + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAES)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAES) & + +ZZE(JI,JEL,JAZ,JL,IAES) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVS)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAES) & + +ZZE(JI,JEL,JAZ,JL,IAES) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATS)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IATS) & + +ZZE(JI,JEL,JAZ,JL,IATS) + END IF + IREFL_CART_NBS(JI,JEL,IXGRID,IYGRID)=IREFL_CART_NBS(JI,JEL,IXGRID,IYGRID)+1 + END IF + + !********************************************** + !**** GRAUPEL VARIABLES **** + !********************************************** + IF(ZZE(JI,JEL,JAZ,JL,IZEG)==XVALGROUND.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEG)==XVALGROUND & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==XVALGROUND) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==XVALGROUND) & ! case for refractivity gradient at origin + ) THEN ! if any XVALGROUND in the pixel for ZES -> pixel set to XVALGROUND for all snow variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEG)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHG)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDG)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDG)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEG)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVG)=XVALGROUND + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATG)=XVALGROUND + END IF + + IREFL_CART_NBG(JI,JEL,IXGRID,IYGRID)=1 + + !-xundef for ZEG + ELSE IF(ZZE(JI,JEL,JAZ,JL,IZEG)==-XUNDEF.OR.PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEG)==-XUNDEF & + .OR.(LREFR.AND.ZZE(JI,JEL,JAZ,JL,IRFR)==-XUNDEF) & ! case for refractivity at boundaries + .OR.(LDNDZ.AND.ZZE(JI,JEL,JAZ,JL,IDNZ)==-XUNDEF) & ! case for refractivity gradient at origin + ) THEN ! if any -XUNDEF in the pixel for ZHH-> pixel set to -XUNDEF for all general variables + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEG)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHG)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDG)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDG)=-XUNDEF + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEG)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVG)=-XUNDEF + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATG)=-XUNDEF + END IF + IREFL_CART_NBG(JI,JEL,IXGRID,IYGRID)=1 -!* 5.2 writing cartesian grid output (averaging) -! Now out-of-range pixels are affected 0, and underground pixels are affected XVALGROUND + !if no xvalground and no -xundef for REFL: incrementation of all polar pixels inside the cartesian pixel + ELSE + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZEG) & + +ZZE(JI,JEL,JAZ,JL,IZEG) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IRHG) & + +ZZE(JI,JEL,JAZ,JL,IRHG) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IZDG) & + +ZZE(JI,JEL,JAZ,JL,IZDG) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IKDG) & + +ZZE(JI,JEL,JAZ,JL,IKDG) + IF (LATT) THEN + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAEG) & + +ZZE(JI,JEL,JAZ,JL,IAEG) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IAVG) & + +ZZE(JI,JEL,JAZ,JL,IAVG) + PREFL_CART(JI,JEL,IXGRID,IYGRID,IATG)=PREFL_CART(JI,JEL,IXGRID,IYGRID,IATG) & + +ZZE(JI,JEL,JAZ,JL,IATG) + END IF + IREFL_CART_NBG(JI,JEL,IXGRID,IYGRID)=IREFL_CART_NBG(JI,JEL,IXGRID,IYGRID)+1 + END IF + + END DO !JL + END DO !JAZ + END DO !JEL + END DO !JI + +DEALLOCATE(ZZE) +!* 5.2 writing cartesian grid output (averaging) and dB conversion DO JI=1,NBRAD IEL=NBELEV(JI) DO JEL=1,IEL DO JV=2*NMAX,1,-1 DO JH=1,2*NMAX - IF(IREFL_CART_NB(JI,JEL,JH,JV) == 0) THEN + + !**** RADIAL VELOCITY + IF(IVDOP_CART_NB(JI,JEL,JH,JV) == 0) THEN + IF((JH+SIGN(.5,JH-.5-NMAX)-.5-NMAX)**2+(JV+SIGN(.5,JV-.5-NMAX)-.5-NMAX)**2>=NMAX**2) THEN + ! out of range + PREFL_CART(JI,JEL,JH,JV,IVDOP)=XVALGROUND + ELSE + PREFL_CART(JI,JEL,JH,JV,IVDOP)=0 + WRITE(ILUOUT0,*) "Warning: some pixels have no radial velocity; increase XGRID or decrease XSTEP_RAD" + END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IVDOP)=PREFL_CART(JI,JEL,JH,JV,IVDOP)/IVDOP_CART_NB(JI,JEL,JH,JV) + END IF + + !**** GENERAL VARIABLES + IF(IREFL_CART_NB(JI,JEL,JH,JV) == 0) THEN ! no values inside the cartesian pixel IF((JH+SIGN(.5,JH-.5-NMAX)-.5-NMAX)**2+(JV+SIGN(.5,JV-.5-NMAX)-.5-NMAX)**2>=NMAX**2) THEN ! out of range - PREFL_CART(JI,JEL,JH,JV,:)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,1:4)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IRHV:IDHV)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IHAS:)=XVALGROUND ELSE - PREFL_CART(JI,JEL,JH,JV,:)=0. - WRITE(*,*) "Warning: some pixels have no reflectivity; increase XGRID or decrease XSTEP_RAD" + PREFL_CART(JI,JEL,JH,JV,1:4)=0 + PREFL_CART(JI,JEL,JH,JV,IRHV:IDHV)=0 + PREFL_CART(JI,JEL,JH,JV,IHAS:)=0 + WRITE(ILUOUT0,*) "Warning: some pixels have no reflectivity; increase XGRID or decrease XSTEP_RAD" END IF ELSE - PREFL_CART(JI,JEL,JH,JV,:)=PREFL_CART(JI,JEL,JH,JV,:)/IREFL_CART_NB(JI,JEL,JH,JV) - IF(IVDOP_CART_NB(JI,JEL,JH,JV) == 0) THEN - PREFL_CART(JI,JEL,JH,JV,IVDOP)=XVALGROUND + !PREFL_CART(JI,JEL,JH,JV,:)=PREFL_CART(JI,JEL,JH,JV,:)/IREFL_CART_NB(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,1:4)=PREFL_CART(JI,JEL,JH,JV,1:4)/IREFL_CART_NB(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IRHV:IDHV)=PREFL_CART(JI,JEL,JH,JV,IRHV:IDHV)/IREFL_CART_NB(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IHAS:)=PREFL_CART(JI,JEL,JH,JV,IHAS:)/IREFL_CART_NB(JI,JEL,JH,JV) + + ! --------- Converting to dB ----------- + IF(PREFL_CART(JI,JEL,JH,JV,1)> 0) THEN + PREFL_CART(JI,JEL,JH,JV,1)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,1)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JH,JV,2) > 0.) THEN + PREFL_CART(JI,JEL,JH,JV,2)=PREFL_CART(JI,JEL,JH,JV,1) & + -10.*LOG10(PREFL_CART(JI,JEL,JH,JV,2)) ! Zdr=Z_HH-Z_VV + !ELSE + ! PREFL_CART(JI,JEL,JH,JV,2)=-XUNDEF Zvv<0 + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JH,JV,1)== 0) THEN + PREFL_CART(JI,JEL,JH,JV,1)=-XUNDEF + !PREFL_CART(JI,JEL,JH,JV,IZER:IZEG)=-XUNDEF + END IF + END IF !***** END GENERAL VARIABLES + + !**** RAIN VARIABLES + IF(IREFL_CART_NBR(JI,JEL,JH,JV) == 0) THEN ! no values inside the cartesian pixel + IF((JH+SIGN(.5,JH-.5-NMAX)-.5-NMAX)**2+(JV+SIGN(.5,JV-.5-NMAX)-.5-NMAX)**2>=NMAX**2) THEN + ! out of range + PREFL_CART(JI,JEL,JH,JV,IZER)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IRHR)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IZDA)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IKDR)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAER)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IAVR)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IATR)=XVALGROUND + END IF ELSE - PREFL_CART(JI,JEL,JH,JV,IVDOP)=PREFL_CART(JI,JEL,JH,JV,IVDOP) & - *IREFL_CART_NB(JI,JEL,JH,JV)/IVDOP_CART_NB(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IZER)=0 + PREFL_CART(JI,JEL,JH,JV,IRHR)=0 + PREFL_CART(JI,JEL,JH,JV,IZDA)=0 + PREFL_CART(JI,JEL,JH,JV,IKDR)=0 + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAER)=0 + PREFL_CART(JI,JEL,JH,JV,IAVR)=0 + PREFL_CART(JI,JEL,JH,JV,IATR)=0 + END IF + WRITE(ILUOUT0,*) "Warning: some pixels have no reflectivity; increase XGRID or decrease XSTEP_RAD" END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZER)=PREFL_CART(JI,JEL,JH,JV,IZER)/IREFL_CART_NBR(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IRHR)=PREFL_CART(JI,JEL,JH,JV,IRHR)/IREFL_CART_NBR(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IZDA)=PREFL_CART(JI,JEL,JH,JV,IZDA)/IREFL_CART_NBR(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IKDR)=PREFL_CART(JI,JEL,JH,JV,IKDR)/IREFL_CART_NBR(JI,JEL,JH,JV) + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAER)=PREFL_CART(JI,JEL,JH,JV,IAER)/IREFL_CART_NBR(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IAVR)=PREFL_CART(JI,JEL,JH,JV,IAVR)/IREFL_CART_NBR(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IATR)=PREFL_CART(JI,JEL,JH,JV,IATR)/IREFL_CART_NBR(JI,JEL,JH,JV) + END IF + + ! --------- Converting to dB ----------- + IF(PREFL_CART(JI,JEL,JH,JV,IZER)> 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZER)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZER)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JH,JV,IZDA) > 0.) THEN + PREFL_CART(JI,JEL,JH,JV,IZDA)=PREFL_CART(JI,JEL,JH,JV,IZER) & + -10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZDA)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JH,JV,IZER)== 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZER)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JH,JV,IATR)>0.) THEN + PREFL_CART(JI,JEL,JH,JV,IATR)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IATR)) + ENDIF + ENDIF + END IF !****** END RAIN - ! thresholding and converting - ! Unit conversion : - IF(PREFL_CART(JI,JEL,JH,JV,1) > 10**(XREFLMIN/10.) ) THEN ! unit conversion (mm^6 m^{-3} -> dBZ) - PREFL_CART(JI,JEL,JH,JV,1)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,1)) ! Z_equiv in dBZ - IF(PREFL_CART(JI,JEL,JH,JV,2) > 0. ) THEN - PREFL_CART(JI,JEL,JH,JV,2)=PREFL_CART(JI,JEL,JH,JV,1) & - -10.*LOG10(PREFL_CART(JI,JEL,JH,JV,2)) ! Zdr=Z_HH-Z_VV - ELSE - PREFL_CART(JI,JEL,JH,JV,2)=-XUNDEF - ENDIF - WHERE(PREFL_CART(JI,JEL,JH,JV,IZER:IZEG)> 10**(XREFLMIN/10.)) - PREFL_CART(JI,JEL,JH,JV,IZER:IZEG)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZER:IZEG)) - ELSEWHERE - PREFL_CART(JI,JEL,JH,JV,IZER:IZEG)=-XUNDEF - END WHERE - ELSE IF(PREFL_CART(JI,JEL,JH,JV,1) >= 0.) THEN ! few/no hydrometeor present - PREFL_CART(JI,JEL,JH,JV,1:2)=-XUNDEF - PREFL_CART(JI,JEL,JH,JV,IZER:IZEG)=-XUNDEF -! Next case should not happen -! ELSE ! flag bin when underground -! PZE(JI,JEL,JAZ,JL,1)=XVALGROUND -! PZE(JI,JEL,JAZ,JL,IZER:IZEG)=XVALGROUND + !**** ICE VARIABLES + IF(IREFL_CART_NBI(JI,JEL,JH,JV) == 0) THEN ! no values inside the cartesian pixel + IF((JH+SIGN(.5,JH-.5-NMAX)-.5-NMAX)**2+(JV+SIGN(.5,JV-.5-NMAX)-.5-NMAX)**2>=NMAX**2) THEN + ! out of range + PREFL_CART(JI,JEL,JH,JV,IZEI)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAEI)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IAVI)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IATI)=XVALGROUND + END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZEI)=0 + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAEI)=0 + PREFL_CART(JI,JEL,JH,JV,IAVI)=0 + PREFL_CART(JI,JEL,JH,JV,IATI)=0 + END IF + WRITE(ILUOUT0,*) "Warning: some pixels have no reflectivity; increase XGRID or decrease XSTEP_RAD" END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZEI)=PREFL_CART(JI,JEL,JH,JV,IZEI)/IREFL_CART_NBI(JI,JEL,JH,JV) + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAEI)=PREFL_CART(JI,JEL,JH,JV,IAEI)/IREFL_CART_NBI(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IAVI)=PREFL_CART(JI,JEL,JH,JV,IAVI)/IREFL_CART_NBI(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IATI)=PREFL_CART(JI,JEL,JH,JV,IATI)/IREFL_CART_NBI(JI,JEL,JH,JV) + END IF + ! --------- Converting to dB ----------- + IF(PREFL_CART(JI,JEL,JH,JV,IZEI)> 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZEI)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZEI)) ! Z_equiv in dB + ELSE IF (PREFL_CART(JI,JEL,JH,JV,IZEI)== 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZEI)=-XUNDEF + END IF - IF(LATT) THEN - WHERE(PREFL_CART(JI,JEL,JH,JV,IATR:IATG)>0.) - PREFL_CART(JI,JEL,JH,JV,IATR:IATG)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IATR:IATG)) - END WHERE - ENDIF + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JH,JV,IATI)>0.) THEN + PREFL_CART(JI,JEL,JH,JV,IATI)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IATI)) + ENDIF + ENDIF + END IF !****** END ICE - END IF + !**** SNOW VARIABLES + IF(IREFL_CART_NBS(JI,JEL,JH,JV) == 0) THEN ! no values inside the cartesian pixel + IF((JH+SIGN(.5,JH-.5-NMAX)-.5-NMAX)**2+(JV+SIGN(.5,JV-.5-NMAX)-.5-NMAX)**2>=NMAX**2) THEN + ! out of range + PREFL_CART(JI,JEL,JH,JV,IZES)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IRHS)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IZDS)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IKDS)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAES)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IAVS)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IATS)=XVALGROUND + ENDIF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZES)=0 + PREFL_CART(JI,JEL,JH,JV,IRHS)=0 + PREFL_CART(JI,JEL,JH,JV,IZDS)=0 + PREFL_CART(JI,JEL,JH,JV,IKDS)=0 + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAES)=0 + PREFL_CART(JI,JEL,JH,JV,IAVS)=0 + PREFL_CART(JI,JEL,JH,JV,IATS)=0 + END IF + WRITE(ILUOUT0,*) "Warning: some pixels have no reflectivity; increase XGRID or decrease XSTEP_RAD" + END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZES)=PREFL_CART(JI,JEL,JH,JV,IZES)/IREFL_CART_NBS(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IRHS)=PREFL_CART(JI,JEL,JH,JV,IRHS)/IREFL_CART_NBS(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IZDS)=PREFL_CART(JI,JEL,JH,JV,IZDS)/IREFL_CART_NBS(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IKDS)=PREFL_CART(JI,JEL,JH,JV,IKDS)/IREFL_CART_NBS(JI,JEL,JH,JV) + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAES)=PREFL_CART(JI,JEL,JH,JV,IAES)/IREFL_CART_NBS(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IAVS)=PREFL_CART(JI,JEL,JH,JV,IAVS)/IREFL_CART_NBS(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IATS)=PREFL_CART(JI,JEL,JH,JV,IATS)/IREFL_CART_NBS(JI,JEL,JH,JV) + END IF + + ! --------- Converting to dB ----------- + IF(PREFL_CART(JI,JEL,JH,JV,IZES)> 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZES)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZES)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JH,JV,IZDS) > 0.) THEN + PREFL_CART(JI,JEL,JH,JV,IZDS)=PREFL_CART(JI,JEL,JH,JV,IZES) & + -10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZDS)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JH,JV,IZES)== 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZES)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JH,JV,IATS)>0.) THEN + PREFL_CART(JI,JEL,JH,JV,IATS)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IATS)) + ENDIF + ENDIF + END IF !******** END SNOW + + !**** GRAUPEL VARIABLES + IF(IREFL_CART_NBG(JI,JEL,JH,JV) == 0) THEN ! no values inside the cartesian pixel + IF((JH+SIGN(.5,JH-.5-NMAX)-.5-NMAX)**2+(JV+SIGN(.5,JV-.5-NMAX)-.5-NMAX)**2>=NMAX**2) THEN + ! out of range + PREFL_CART(JI,JEL,JH,JV,IZEG)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IRHG)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IZDG)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IKDG)=XVALGROUND + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAEG)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IAVG)=XVALGROUND + PREFL_CART(JI,JEL,JH,JV,IATG)=XVALGROUND + END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZEG)=0 + PREFL_CART(JI,JEL,JH,JV,IRHG)=0 + PREFL_CART(JI,JEL,JH,JV,IZDG)=0 + PREFL_CART(JI,JEL,JH,JV,IKDG)=0 + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAEG)=0 + PREFL_CART(JI,JEL,JH,JV,IAVG)=0 + PREFL_CART(JI,JEL,JH,JV,IATG)=0 + ENDIF + WRITE(ILUOUT0,*) "Warning: some pixels have no reflectivity; increase XGRID or decrease XSTEP_RAD" + END IF + ELSE + PREFL_CART(JI,JEL,JH,JV,IZEG)=PREFL_CART(JI,JEL,JH,JV,IZEG)/IREFL_CART_NBG(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IRHG)=PREFL_CART(JI,JEL,JH,JV,IRHG)/IREFL_CART_NBG(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IZDG)=PREFL_CART(JI,JEL,JH,JV,IZDG)/IREFL_CART_NBG(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IKDG)=PREFL_CART(JI,JEL,JH,JV,IKDG)/IREFL_CART_NBG(JI,JEL,JH,JV) + IF (LATT) THEN + PREFL_CART(JI,JEL,JH,JV,IAEG)=PREFL_CART(JI,JEL,JH,JV,IAEG)/IREFL_CART_NBG(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IAVG)=PREFL_CART(JI,JEL,JH,JV,IAVG)/IREFL_CART_NBG(JI,JEL,JH,JV) + PREFL_CART(JI,JEL,JH,JV,IATG)=PREFL_CART(JI,JEL,JH,JV,IATG)/IREFL_CART_NBG(JI,JEL,JH,JV) + END IF + + ! --------- Converting to dB ----------- + IF(PREFL_CART(JI,JEL,JH,JV,IZEG)> 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZEG)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZEG)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JH,JV,IZDG) > 0.) THEN + PREFL_CART(JI,JEL,JH,JV,IZDG)=PREFL_CART(JI,JEL,JH,JV,IZEG) & + -10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IZDG)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JH,JV,IZEG)== 0) THEN + PREFL_CART(JI,JEL,JH,JV,IZES)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JH,JV,IATG)>0.) THEN + PREFL_CART(JI,JEL,JH,JV,IATG)=10.*LOG10(PREFL_CART(JI,JEL,JH,JV,IATG)) + ENDIF + ENDIF + END IF !******** END GRAUPEL END DO END DO END DO END DO - WRITE(0,*) 'CARTESIAN GRID INTERPOLATION DONE' + WRITE(ILUOUT0,*) 'CARTESIAN GRID INTERPOLATION DONE' DEALLOCATE(IREFL_CART_NB,IVDOP_CART_NB) ! !* 5.3 positions of the cartesian grid (as in R2, provided 'as is') @@ -828,20 +1494,111 @@ DEALLOCATE(ZZE) END DO END DO -! polar output -ELSE + +ELSE ! if polar output PREFL_CART(:,:,:,:,:)=ZZE(:,:,:,:,:) DEALLOCATE(ZZE) DO JI=1,NBRAD DO JAZ=1,NBAZIM - PLATLON(1,JAZ,1)=ZAZIM_BASE(JAZ) - END DO + PLATLON(1,JAZ,1)=ZAZIM_BASE(JAZ) ! pourquoi PLATLON(1,JAZ,1) et pas PLATLON(JI,JAZ,1)? + END DO ! en coordonnees polaires on indique la position centrale (en radian) de chaque azimut END DO -END IF + + !--------- Converting to dB for polar output ----------- + DO JI=1,NBRAD + IEL=NBELEV(JI) + DO JEL=1,IEL + DO JAZ=1,NBAZIM + DO JL=1,NBSTEPMAX+1 + !conversion en deg celcius + IF (PREFL_CART(JI,JEL,JAZ,JL,IHAS+6)/=-XUNDEF .AND. PREFL_CART(JI,JEL,JAZ,JL,IHAS+6)/=XVALGROUND) & + PREFL_CART(JI,JEL,JAZ,JL,IHAS+6)=PREFL_CART(JI,JEL,JAZ,JL,IHAS+6)-273.15 + + !------ ZHH and ZDR + IF(PREFL_CART(JI,JEL,JAZ,JL,1)> 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,1)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,1)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JAZ,JL,2) > 0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,2)=PREFL_CART(JI,JEL,JAZ,JL,1) & + -10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,2)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JAZ,JL,1)== 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,1)=-XUNDEF + END IF + + !------ RAIN : ZER, ZDA, ATR + IF(PREFL_CART(JI,JEL,JAZ,JL,IZER)> 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZER)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZER)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JAZ,JL,IZDA) > 0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZDA)=PREFL_CART(JI,JEL,JAZ,JL,IZER) & + -10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZDA)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JAZ,JL,IZER)== 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZER)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JAZ,JL,IATR)>0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IATR)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IATR)) + ENDIF + ENDIF !------- END RAIN + +! ------- ICE ----------- + IF(PREFL_CART(JI,JEL,JAZ,JL,IZEI)> 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZEI)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZEI)) ! Z_equiv in dB + ELSE IF (PREFL_CART(JI,JEL,JAZ,JL,IZEI)== 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZEI)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JAZ,JL,IATI)>0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IATI)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IATI)) + ENDIF + END IF !------ END ICE + +! --------- SNOW ----------- + IF(PREFL_CART(JI,JEL,JAZ,JL,IZES)> 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZES)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZES)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JAZ,JL,IZDS) > 0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZDS)=PREFL_CART(JI,JEL,JAZ,JL,IZES) & + -10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZDS)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JAZ,JL,IZES)== 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZES)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JAZ,JL,IATS)>0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IATS)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IATS)) + ENDIF + END IF !------ END SNOW + +! --------- GRAUPEL ----------- + IF(PREFL_CART(JI,JEL,JAZ,JL,IZEG)> 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZEG)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZEG)) ! Z_equiv in dBZ + IF(PREFL_CART(JI,JEL,JAZ,JL,IZDG) > 0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZDG)=PREFL_CART(JI,JEL,JAZ,JL,IZEG) & + -10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IZDG)) ! Zdr=Z_HH-Z_VV + ENDIF + ELSE IF (PREFL_CART(JI,JEL,JAZ,JL,IZEG)== 0) THEN + PREFL_CART(JI,JEL,JAZ,JL,IZES)=-XUNDEF + END IF + + IF(LATT) THEN + IF(PREFL_CART(JI,JEL,JAZ,JL,IATG)>0.) THEN + PREFL_CART(JI,JEL,JAZ,JL,IATG)=10.*LOG10(PREFL_CART(JI,JEL,JAZ,JL,IATG)) + END IF + END IF !------ END GRAUPEL + END DO + END DO + END DO + END DO + + +END IF ! end condition on cartesian or polar outout DEALLOCATE(ZAZIM_BASE) -WRITE(0,*) 'ROUTINE RADAR_SIMULATOR COMPLETED' +WRITE(ILUOUT0,*) 'ROUTINE RADAR_SIMULATOR COMPLETED' END SUBROUTINE RADAR_SIMULATOR diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90 index b9cd48d5b5dbc7a73db94318c9c70b55e37c9f51..31eb83591c024177f3d1417ee6aba24f87db9d1e 100644 --- a/src/MNH/write_lfifm1_for_diag.f90 +++ b/src/MNH/write_lfifm1_for_diag.f90 @@ -136,7 +136,8 @@ END MODULE MODI_WRITE_LFIFM1_FOR_DIAG !! F. Duffourg 02/2013 : add new fields !! J.Escobar 21/03/2013: for HALOK get correctly local array dim/bound !! J. escobar 27/03/2014 : write LAT/LON only in not CARTESIAN case -!! 2014 G.Delautier : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM +!! G.Delautier 2014 : remplace MODD_RAIN_C2R2_PARAM par MODD_RAIN_C2R2_KHKO_PARAM +!! C. Augros 2014 : new radar simulator (T matrice) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -158,6 +159,7 @@ USE MODD_PARAM_n USE MODD_CURVCOR_n USE MODD_REF USE MODD_REF_n +USE MODD_LUNIT, ONLY : CLUOUT0 USE MODD_LUNIT_n USE MODD_TURB_n USE MODD_RADIATIONS_n @@ -178,8 +180,8 @@ USE MODD_ELEC_DESCR, ONLY : CELECNAMES USE MODD_RAIN_C2R2_KHKO_PARAM USE MODD_ICE_C1R3_PARAM USE MODD_PARAM_ICE, ONLY : LSEDIC -USE MODD_PARAM_C2R2, ONLY : LSEDC -USE MODD_PARAM_C1R3 +!USE MODD_PARAM_C2R2, ONLY : LSEDC +!USE MODD_PARAM_C1R3 USE MODD_LG, ONLY : CLGNAMES USE MODD_PASPOL, ONLY : LPASPOL USE MODD_CONDSAMP, ONLY : LCONDSAMP @@ -188,7 +190,7 @@ USE MODD_DIAG_FLAG USE MODD_RADAR, ONLY: XLAT_RAD,XELEV,& XSTEP_RAD,NBRAD,NBELEV,NBAZIM,NBSTEPMAX,& NCURV_INTERPOL,LATT,LCART_RAD,NPTS_H,NPTS_V,XGRID,& - LREFR,LDNDZ,NMAX,CNAME_RAD,& + LREFR,LDNDZ,NMAX,CNAME_RAD,NDIFF,& XLON_RAD,XALT_RAD,XLAM_RAD,XDT_RAD,LWBSCS,LWREFL ! USE MODI_RADAR_SIMULATOR @@ -224,6 +226,9 @@ USE MODE_THERMO USE MODE_MODELN_HANDLER USE MODI_LIDAR ! +USE MODD_MPIF +USE MODD_VAR_ll +! IMPLICIT NONE ! !* 0.1 Declarations of arguments @@ -272,10 +277,11 @@ REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK33,ZWORK34 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK21,ZWORK22 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK23,ZWORK24 REAL,DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZWORK42 ! reflectivity on a cartesian grid (PREFL_CART) +REAL,DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZWORK42_BIS REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK43 ! latlon coordinates of cartesian grid points (PLATLON) REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZPHI,ZTHETAE,ZTHETAV INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK1 -integer :: ICURR,INBOUT +integer :: ICURR,INBOUT,IERR ! REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NSP+NCARB+NSOA,JPMODE):: ZPTOTA REAL,DIMENSION(SIZE(XSVT,1),SIZE(XSVT,2),SIZE(XSVT,3),NMODE_DST*2):: ZSDSTDEP @@ -297,13 +303,16 @@ INTEGER :: IEL,IIELV CHARACTER(LEN=5) :: YVIEW ! Upward or Downward integration INTEGER :: IACCMODE !------------------------------------------------------------------------------- -INTEGER :: IAUX ! work variable +INTEGER :: IAUX ! work variable REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZWORK35,ZWORK36 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2)) :: ZWORK25,ZWORK26 -REAL :: ZEAU ! Mean precipitable water +REAL :: ZEAU ! Mean precipitable water INTEGER, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2)) ::IKTOP ! level in which is the altitude 3000m REAL, DIMENSION(SIZE(XZZ,1),SIZE(XZZ,2),SIZE(XZZ,3)) :: ZDELTAZ ! interval (m) between two levels K - +INTEGER :: ILUOUT0 ! Logical unit number for output-listing +! +CHARACTER(LEN=2) :: INDICE +INTEGER :: I ! !------------------------------------------------------------------------------- ! @@ -322,7 +331,7 @@ IKB=1+JPVEXT IKE=IKU-JPVEXT IMI = GET_CURRENT_MODEL_INDEX() - +CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP) !------------------------------------------------------------------------------- ! !* 1. WRITES IN THE LFI FILE @@ -2783,7 +2792,7 @@ IF(LRADAR .AND. LUSERR) THEN ! IF (NVERSION_RAD == 1) THEN ! original version of radar diagnostics - WRITE(0,*) 'radar diagnostics from RADAR_RAIN_ICE routine' + WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_RAIN_ICE routine' CALL RADAR_RAIN_ICE (XRT, XCIT, XRHODREF, ZTEMP, ZWORK31, ZWORK32, & ZWORK33, ZWORK34 ) ! @@ -2812,158 +2821,169 @@ IF(LRADAR .AND. LUSERR) THEN CALL FMWRIT (HFMFILE,YRECFM,CLUOUT,'XY',ZWORK34,IGRID,ILENCH,YCOMMENT,IRESP) ! ELSE - ! - WRITE(0,*) 'radar diagnostics from RADAR_SIMULATOR routine' - - NBRAD=COUNT(XLAT_RAD(:) /= XUNDEF) - NMAX=INT(NBSTEPMAX*XSTEP_RAD/XGRID) - IF(NBSTEPMAX*XSTEP_RAD/XGRID/=NMAX) THEN - WRITE(0,*) 'NBSTEPMAX*XSTEP_RAD/XGRID is not an integer; please choose another combination' - CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) - CALL ABORT - STOP - ENDIF - DO JI=1,NBRAD - NBELEV(JI)=COUNT(XELEV(JI,:) /= XUNDEF) - WRITE(0,*) 'Number of ELEVATIONS : ', NBELEV(JI), 'FOR RADAR:', JI - END DO - IIELV=MAXVAL(NBELEV(1:NBRAD)) - WRITE(0,*) 'Maximum number of ELEVATIONS',IIELV - WRITE(0,*) 'YOU HAVE ASKED FOR ', NBRAD, 'RADARS' - ! - NBAZIM=8*NMAX ! number of azimuths - WRITE(0,*) ' Number of AZIMUTHS : ', NBAZIM - IF (LCART_RAD) THEN - ALLOCATE(ZWORK43(NBRAD,4*NMAX,2*NMAX)) - ELSE - ALLOCATE(ZWORK43(1,NBAZIM,1)) - END IF + ! + WRITE(ILUOUT0,*) 'radar diagnostics from RADAR_SIMULATOR routine' + + NBRAD=COUNT(XLAT_RAD(:) /= XUNDEF) + NMAX=INT(NBSTEPMAX*XSTEP_RAD/XGRID) + IF(NBSTEPMAX*XSTEP_RAD/XGRID/=NMAX .AND. (LCART_RAD)) THEN + WRITE(ILUOUT0,*) 'NBSTEPMAX*XSTEP_RAD/XGRID is not an integer; please choose another combination' + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP + ENDIF + DO JI=1,NBRAD + NBELEV(JI)=COUNT(XELEV(JI,:) /= XUNDEF) + WRITE(ILUOUT0,*) 'Number of ELEVATIONS : ', NBELEV(JI), 'FOR RADAR:', JI + END DO + IIELV=MAXVAL(NBELEV(1:NBRAD)) + WRITE(ILUOUT0,*) 'Maximum number of ELEVATIONS',IIELV + WRITE(ILUOUT0,*) 'YOU HAVE ASKED FOR ', NBRAD, 'RADARS' + ! + IF (LCART_RAD) NBAZIM=8*NMAX ! number of azimuths + WRITE(ILUOUT0,*) ' Number of AZIMUTHS : ', NBAZIM + IF (LCART_RAD) THEN + ALLOCATE(ZWORK43(NBRAD,4*NMAX,2*NMAX)) + ELSE + ALLOCATE(ZWORK43(1,NBAZIM,1)) + END IF !! Some controls... - IF(NBRAD/=COUNT(XLON_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XALT_RAD(:) /= XUNDEF).OR. & - NBRAD/=COUNT(XLAM_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XDT_RAD(:) /= XUNDEF).OR. & - NBRAD/=COUNT(CNAME_RAD(:) /= "UNDEF")) THEN - WRITE(0,*) "Error: inconsistency in DIAG1.nam." + IF(NBRAD/=COUNT(XLON_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XALT_RAD(:) /= XUNDEF).OR. & + NBRAD/=COUNT(XLAM_RAD(:) /= XUNDEF).OR.NBRAD/=COUNT(XDT_RAD(:) /= XUNDEF).OR. & + NBRAD/=COUNT(CNAME_RAD(:) /= "UNDEF")) THEN + WRITE(ILUOUT0,*) "Error: inconsistency in DIAG1.nam." !callabortstop - CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) - CALL ABORT - STOP - END IF - IF(NCURV_INTERPOL==0.AND.(LREFR.OR.LDNDZ)) THEN - LREFR=.FALSE. - LDNDZ=.FALSE. - WRITE(0,*) "Warning: cannot output refractivity nor its vertical gradient when NCURV_INTERPOL=0" - END IF - IF(MOD(NPTS_H,2)==0) THEN - NPTS_H=NPTS_H+1 - WRITE(0,*) "Warning: NPTS_H has to be ODD. Setting it to ",NPTS_H - END IF - IF(MOD(NPTS_V,2)==0) THEN - NPTS_V=NPTS_V+1 - WRITE(0,*) "Warning: NPTS_V has to be ODD. Setting it to ",NPTS_V - END IF - IF(LWBSCS.AND.LWREFL) THEN - LWREFL=.FALSE. - WRITE(0,*) "Warning: LWREFL cannot be set to .TRUE. if LWBSCS is also set to .TRUE.. Setting LWREFL to .FALSE.." - END IF + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP + END IF + IF(NCURV_INTERPOL==0.AND.(LREFR.OR.LDNDZ)) THEN + LREFR=.FALSE. + LDNDZ=.FALSE. + WRITE(ILUOUT0,*) "Warning: cannot output refractivity nor its vertical gradient when NCURV_INTERPOL=0" + END IF + IF(MOD(NPTS_H,2)==0) THEN + NPTS_H=NPTS_H+1 + WRITE(ILUOUT0,*) "Warning: NPTS_H has to be ODD. Setting it to ",NPTS_H + END IF + IF(MOD(NPTS_V,2)==0) THEN + NPTS_V=NPTS_V+1 + WRITE(ILUOUT0,*) "Warning: NPTS_V has to be ODD. Setting it to ",NPTS_V + END IF + IF(LWBSCS.AND.LWREFL) THEN + LWREFL=.FALSE. + WRITE(ILUOUT0,*) "Warning: LWREFL cannot be set to .TRUE. if LWBSCS is also set to .TRUE.. Setting LWREFL to .FALSE.." + END IF + IF(CCLOUD=="LIMA" .AND. NDIFF/=7) THEN + WRITE(ILUOUT0,*) " ERROR : NDIFF=",NDIFF," not available with CCLOUD=LIMA" + CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP) + CALL ABORT + STOP + END IF + INBOUT=28 !28: Temperature + RHR, RHS, RHG, ZDA, ZDS, ZDG, KDR, KDS, KDG + IF (CCLOUD=='LIMA') INBOUT=INBOUT+1 ! rain concentration CRT + IF(LREFR) INBOUT=INBOUT+1 !+refractivity + IF(LDNDZ) INBOUT=INBOUT+1 !+refractivity vertical gradient + IF(LATT) INBOUT=INBOUT+12 !+AER-AEG AVR-AVG (vertical specific attenuation) and ATR-ATG + WRITE(ILUOUT0,*) "Nombre de variables dans ZWORK42 en sortie de radar_simulator:",INBOUT - INBOUT=15 - IF(LREFR) INBOUT=INBOUT+1 - IF(LDNDZ) INBOUT=INBOUT+1 - IF(LATT) INBOUT=INBOUT+8 - IF (LCART_RAD) THEN - ALLOCATE(ZWORK42(NBRAD,IIELV,2*NMAX,2*NMAX,INBOUT)) - ELSE - ALLOCATE(ZWORK42(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT)) - END IF - ! - CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XCIT,XRHODREF,ZTEMP,XPABST,ZWORK42,ZWORK43) - ALLOCATE(YRAD(INBOUT)) - YRAD(1:9)=(/"ZHH","ZDR","KDP","CSR","ZER","ZEI","ZES","ZEG","VRU"/) - ICURR=10 - IF(LATT) THEN - YRAD(ICURR:ICURR+7)=(/"AER","AEI","AES","AEG","ATR","ATI","ATS","ATG"/) - ICURR=ICURR+8 - END IF - YRAD(ICURR:ICURR+5)=(/"HAS","M_R","M_I","M_S","M_G","CIT"/) - ICURR=ICURR+6 - IF(LREFR) THEN - YRAD(ICURR)="RFR" - ICURR=ICURR+1 - END IF - IF(LDNDZ) THEN - YRAD(ICURR)="DNZ" - ICURR=ICURR+1 - END IF - - IF (LCART_RAD) THEN - PRINT*, "Writing Cartesian output" - DO JI=1,NBRAD - IEL=NBELEV(JI) - ! print*,'nb d élévations',IEL - ! writing latlon in internal files - ALLOCATE(CLATLON(2*NMAX)) - CLATLON="" - DO JV=2*NMAX,1,-1 - DO JH=1,2*NMAX - WRITE(CBUFFER,'(2(f8.3,1X))') ZWORK43(JI,2*JH-1,JV),ZWORK43(JI,2*JH,JV) + IF (LCART_RAD) THEN + ALLOCATE(ZWORK42(NBRAD,IIELV,2*NMAX,2*NMAX,INBOUT)) + ELSE + ALLOCATE(ZWORK42(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT)) + ALLOCATE(ZWORK42_BIS(NBRAD,IIELV,NBAZIM,NBSTEPMAX+1,INBOUT)) + END IF + ! +! IF (CCLOUD=='LIMA') THEN +! CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XSVT(:,:,:,NSV_LIMA_NI),XRHODREF,& +! ZTEMP,XPABST,ZWORK42,ZWORK43,XSVT(:,:,:,NSV_LIMA_NR)) +! ELSE ! ICE3 + CALL RADAR_SIMULATOR(XUT,XVT,XWT,XRT,XCIT,XRHODREF,ZTEMP,XPABSM,ZWORK42,ZWORK43) +! ENDIF + ALLOCATE(YRAD(INBOUT)) + YRAD(1:9)=(/"ZHH","ZDR","KDP","CSR","ZER","ZEI","ZES","ZEG","VRU"/) + ICURR=10 + IF(LATT) THEN + YRAD(ICURR:ICURR+11)=(/"AER","AEI","AES","AEG","AVR","AVI","AVS","AVG","ATR","ATI","ATS","ATG"/) + ICURR=ICURR+12 + END IF + YRAD(ICURR:ICURR+2)=(/"RHV","PDP","DHV"/) + ICURR=ICURR+3 + YRAD(ICURR:ICURR+8)=(/"RHR","RHS","RHG","ZDA","ZDS","ZDG","KDR","KDS","KDG"/) + ICURR=ICURR+9 + YRAD(ICURR:ICURR+6)=(/"HAS","M_R","M_I","M_S","M_G","CIT","TEM"/) + ICURR=ICURR+7 + IF (CCLOUD=='LIMA') THEN + YRAD(ICURR)="CRT" + ICURR=ICURR+1 + ENDIF + IF(LREFR) THEN + YRAD(ICURR)="RFR" + ICURR=ICURR+1 + END IF + IF(LDNDZ) THEN + YRAD(ICURR)="DNZ" + ICURR=ICURR+1 + END IF + IF (LCART_RAD) THEN + DO JI=1,NBRAD + IEL=NBELEV(JI) + ! writing latlon in internal files + ALLOCATE(CLATLON(2*NMAX)) + CLATLON="" + DO JV=2*NMAX,1,-1 + DO JH=1,2*NMAX + WRITE(CBUFFER,'(2(f8.3,1X))') ZWORK43(JI,2*JH-1,JV),ZWORK43(JI,2*JH,JV) CLATLON(JV)=TRIM(CLATLON(JV)) // " " // TRIM(CBUFFER) - END DO - CLATLON(JV)=TRIM(ADJUSTL(CLATLON(JV))) + END DO + CLATLON(JV)=TRIM(ADJUSTL(CLATLON(JV))) + END DO + DO JEL=1,IEL + WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',& + INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL))) + WRITE(YGRID_SIZE,'(I3.3)') 2*NMAX + DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5) + YRS=YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//YGRID_SIZE//HFMFILE + CALL OPEN_ll(UNIT=ILURS,FILE=YRS,IOSTAT=IRESP,STATUS="NEW",ACTION='WRITE', & + FORM="FORMATTED",RECL=8192) + WRITE(ILURS,'(A,4F12.6,2I5)') '**domaine LATLON ',ZWORK43(JI,1,1),ZWORK43(JI,4*NMAX-1,2*NMAX), & + ZWORK43(JI,2,1),ZWORK43(JI,4*NMAX,2*NMAX),2*NMAX,2*NMAX !! HEADER + DO JV=2*NMAX,1,-1 + DO JH=1,2*NMAX + WRITE(ILURS,'(E11.5,1X)',ADVANCE='NO') ZWORK42(JI,JEL,JH,JV,JJ) + END DO + WRITE(ILURS,*) '' END DO - - DO JEL=1,IEL - WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',& - INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL))) - WRITE(YGRID_SIZE,'(I3.3)') 2*NMAX - DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5) - YRS=YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//YGRID_SIZE//HFMFILE - CALL OPEN_ll(UNIT=ILURS,FILE=YRS,IOSTAT=IRESP,STATUS="NEW",ACTION='WRITE', & - FORM="FORMATTED",RECL=8192) - WRITE(ILURS,'(A,4F12.6,2I5)') '**domaine LATLON ',ZWORK43(JI,1,1),ZWORK43(JI,4*NMAX-1,2*NMAX), & - ZWORK43(JI,2,1),ZWORK43(JI,4*NMAX,2*NMAX),2*NMAX,2*NMAX !! HEADER - DO JV=2*NMAX,1,-1 - DO JH=1,2*NMAX - WRITE(ILURS,'(E11.5,1X)',ADVANCE='NO') ZWORK42(JI,JEL,JH,JV,JJ) - END DO - WRITE(ILURS,*) '' - END DO - - DO JV=2*NMAX,1,-1 - WRITE(ILURS,*) CLATLON(JV) - END DO - CALL CLOSE_ll(HFILE=YRS) - END DO - - END DO - DEALLOCATE(CLATLON) - END DO - ELSE ! polar output - PRINT*, "Writing polar output" - DO JI=1,NBRAD - IEL=NBELEV(JI) - DO JEL=1,IEL - WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',& - INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL))) -! WRITE(YGRID_SIZE,'(I3.3)') 2*NMAX - - DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5) - YRS="P"//YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//HFMFILE - CALL OPEN_ll(UNIT=ILURS,FILE=YRS,IOSTAT=IRESP,STATUS="NEW",ACTION='WRITE', & - FORM="FORMATTED",RECL=8192) - WRITE(ILURS,*) '# FORMAT : R (m),THETA (rad),VAL ; azimuths 0°=N 90°=E; NBSTEPMAX=',NBSTEPMAX !! HEADER - DO JH=1,NBAZIM - DO JV=1,NBSTEPMAX+1 - WRITE(ILURS,'(3(E11.5,1X))') JV*XSTEP_RAD,ZWORK43(1,JH,1),ZWORK42(JI,JEL,JH,JV,JJ) - END DO - END DO - - CALL CLOSE_ll(HFILE=YRS) - END DO - END DO - END DO - END IF - DEALLOCATE(ZWORK42,ZWORK43) + DO JV=2*NMAX,1,-1 + WRITE(ILURS,*) CLATLON(JV) + END DO + CALL CLOSE_ll(HFILE=YRS) + END DO + END DO + DEALLOCATE(CLATLON) + END DO + ELSE ! polar output + CALL MPI_ALLREDUCE(ZWORK42, ZWORK42_BIS, SIZE(ZWORK42), MPI_PRECISION, MPI_MAX, NMNH_COMM_WORLD, IERR) + DO JI=1,NBRAD + IEL=NBELEV(JI) + DO JEL=1,IEL + WRITE(YELEV,'(I2.2,A1,I1.1)') FLOOR(XELEV(JI,JEL)),'.',& + INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL))) + DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5) + YRS="P"//YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//HFMFILE + CALL OPEN_ll(UNIT=ILURS,FILE=YRS,IOSTAT=IRESP,ACTION='WRITE',MODE=GLOBAL) + DO JH=1,NBAZIM + DO JV=1,NBSTEPMAX+1 + WRITE(ILURS,"(F15.7)") ZWORK42_BIS(JI,JEL,JH,JV,JJ) + END DO + END DO + CALL CLOSE_ll(HFILE=YRS) + END DO + END DO + END DO + END IF !polar output + DEALLOCATE(ZWORK42,ZWORK43) END IF END IF !