From ddabe7cb6a2eaa2134506b57b0537e2cbb3f9d7b Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Thu, 21 Dec 2023 14:01:41 +0100
Subject: [PATCH] M. Taufour 18/21/2023: Estimation of effective radius of ice
 and liquid from microphysics hypotheses options NRADLP 4 and NRADIP 4

---
 .../ifs/ice_effective_radius.F90              | 29 ++++++++---
 .../ifs/liquid_effective_radius.F90           | 52 +++++++++++++++++++
 .../ecrad-1.4.0_mnh/ifs/radiation_scheme.F90  | 11 +++-
 src/MNH/ecrad_interface.f90                   |  1 +
 4 files changed, 85 insertions(+), 8 deletions(-)

diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90
index bf4906471..6e1958014 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/ice_effective_radius.F90
@@ -5,8 +5,8 @@ INTERFACE
 
 SUBROUTINE ICE_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
-     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, &
-     &  PRE_UM)
+     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PCIT_LIMA, &
+     &  PGEMU, PRE_UM)
 
 USE PARKIND1 , ONLY : JPIM, JPRB
 ! INPUT ARGUMENTS
@@ -24,6 +24,7 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)  ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_ICE(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_SNOW(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),   INTENT(IN) :: PCIT_LIMA(KLON,KLEV)      ! (/kg)
 ! *** Single level variable
 REAL(KIND=JPRB),   INTENT(IN) :: PGEMU(KLON) ! Sine of latitude
 
@@ -37,8 +38,8 @@ END MODULE MODI_ICE_EFFECTIVE_RADIUS
 
 SUBROUTINE ICE_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
-     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, &
-     &  PRE_UM)
+     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PCIT_LIMA, &
+     &  PGEMU, PRE_UM)
 
 ! ICE_EFFECTIVE_RADIUS
 !
@@ -76,7 +77,8 @@ USE YOERDU   , ONLY : REPLOG, REPSCW
 USE YOMLUN   , ONLY : NULERR
 USE YOMCST   , ONLY : RD, RPI, RTT
 USE MODD_PARAM_ECRAD_n , ONLY : NRADIP, NMINICE, XRE2DE, XRMINICE ! ice optical properties model
-
+USE MODD_PARAM_LIMA , ONLY    : XALPHAI,XNUI ! Ice crystals distribution parameters
+USE MODD_PARAM_LIMA_COLD , ONLY    : XDELTAI,XBI,XREFFI,XLBI,XLBEXI ! Ice crystals distribution parameters
 ! -------------------------------------------------------------------
 
 IMPLICIT NONE
@@ -96,6 +98,8 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)  ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_ICE(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_SNOW(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),   INTENT(IN) :: PCIT_LIMA(KLON,KLEV)      ! (/kg)
+
 ! *** Single level variable
 REAL(KIND=JPRB),   INTENT(IN) :: PGEMU(KLON) ! Sine of latitude
 
@@ -116,6 +120,8 @@ REAL(KIND=JPRB) :: ZDIAMETER_UM     ! Effective diameter in microns
 
 ! Min effective diameter in microns; may vary with latitude
 REAL(KIND=JPRB) :: ZMIN_DIAMETER_UM(KLON)
+REAL(KIND=JPRB) :: ZLBDAI(KLON,KLEV)      ! (/kg)
+
 
 INTEGER :: JL, JK
 
@@ -199,7 +205,18 @@ CASE(3)
       ENDIF
     ENDDO
   ENDDO
-  
+
+CASE(4)
+        !!!! Ice effective radius from Yang et al (2013) reff = V/A
+  ! Distribution parameters for ice and snow      
+  DO JK = 1,KLEV
+    DO JL = KIDIA,KFDIA
+      IF (PCLOUD_FRAC(JL,JK) > 0.001_JPRB &
+           &  .AND. (PQ_ICE(JL,JK)+PQ_SNOW(JL,JK)) > 0.0_JPRB) THEN      
+        PRE_UM(JL,JK) = XREFFI*( XLBI*PCIT_LIMA(JL,JK) / PQ_ICE(JL,JK) )**(XLBEXI*(XDELTAI-XBI))
+      ENDIF
+    ENDDO
+  ENDDO
 CASE DEFAULT
   WRITE(NULERR,'(A,I0,A)') 'ICE EFFECTIVE RADIUS OPTION NRADLP=',NRADIP,' NOT AVAILABLE'
   CALL ABOR1('ERROR IN ICE_EFFECTIVE_RADIUS')
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90
index 0478665d5..d3e1a888f 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/liquid_effective_radius.F90
@@ -5,6 +5,7 @@ INTERFACE
 SUBROUTINE LIQUID_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
      &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQ, PQ_RAIN, &
+     &  PCCT_LIMA, PCRT_LIMA,  &                    
      &  PLAND_FRAC, PCCN_LAND, PCCN_SEA, &
      &  PRE_UM)
 
@@ -27,6 +28,9 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_LIQ(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_RAIN(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),  INTENT (IN)   :: PCCT_LIMA(KLON,KLEV) ! cloud water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCRT_LIMA(KLON,KLEV) ! rain water concentration (LIMA)
+
 ! *** Single-level variables 
 REAL(KIND=JPRB),   INTENT(IN) :: PLAND_FRAC(KLON)        ! 1=land, 0=sea
 REAL(KIND=JPRB),   INTENT(IN) :: PCCN_LAND(KLON)
@@ -44,6 +48,7 @@ END MODULE MODI_LIQUID_EFFECTIVE_RADIUS
 SUBROUTINE LIQUID_EFFECTIVE_RADIUS &
      & (KIDIA, KFDIA, KLON, KLEV, &
      &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQ, PQ_RAIN, &
+     &  PCCT_LIMA, PCRT_LIMA,  &                    
      &  PLAND_FRAC, PCCN_LAND, PCCN_SEA, &
      &  PRE_UM)
 
@@ -84,6 +89,8 @@ USE YOM_YGFL , ONLY : YGFL
 USE YOERDU   , ONLY : REPLOG, REPSCW
 USE YOMLUN   , ONLY : NULERR
 USE YOMCST   , ONLY : RD, RPI
+USE MODD_PARAM_LIMA , ONLY    : XALPHAR,XNUR,       & ! Raindrop      distribution parameters
+                            &   XALPHAC,XNUC          ! Cloud droplet distribution parameters
 
 ! -------------------------------------------------------------------
 
@@ -104,6 +111,9 @@ REAL(KIND=JPRB),   INTENT(IN) :: PCLOUD_FRAC(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_LIQ(KLON,KLEV)       ! (kg/kg)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_RAIN(KLON,KLEV)      ! (kg/kg)
 
+REAL(KIND=JPRB),  INTENT (IN)   :: PCCT_LIMA(KLON,KLEV) ! cloud water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCRT_LIMA(KLON,KLEV) ! rain water concentration (LIMA)
+
 ! *** Single-level variables 
 REAL(KIND=JPRB),   INTENT(IN) :: PLAND_FRAC(KLON)        ! 1=land, 0=sea
 REAL(KIND=JPRB),   INTENT(IN) :: PCCN_LAND(KLON)
@@ -129,6 +139,7 @@ REAL(KIND=JPRB) :: ZSPECTRAL_DISPERSION
 REAL(KIND=JPRB) :: ZNTOT_CM3 ! Number conc in cm-3
 REAL(KIND=JPRB) :: ZRE_CUBED
 REAL(KIND=JPRB) :: ZLWC_GM3, ZRWC_GM3 ! In-cloud liquid, rain content in g m-3
+REAL(KIND=JPRB) :: PCCT_CM3 ! Droplet concentration(from lima) in  cm-3
 REAL(KIND=JPRB) :: ZAIR_DENSITY_GM3   ! Air density in g m-3
 REAL(KIND=JPRB) :: ZRAIN_RATIO        ! Ratio of rain to liquid water content
 REAL(KIND=JPRB) :: ZWOOD_FACTOR, ZRATIO
@@ -242,12 +253,53 @@ CASE(2)
         ! Cloud fraction or liquid+rain water content too low to
         ! consider this a cloud
         PRE_UM(JL,JK) = PP_MIN_RE_UM
+        
 
       ENDIF
 
     ENDDO
     
   ENDDO
+
+CASE(4)
+
+ ! Calculates effective radius from LIMA
+  DO JL = KIDIA,KFDIA
+    ! First compute the cloud droplet concentration
+    
+    DO JK = 1,KLEV
+
+      ! Only consider cloudy regions
+      IF (PCLOUD_FRAC(JL,JK) >= 0.001_JPRB &
+           &  .AND. (PQ_LIQ(JL,JK)+PQ_RAIN(JL,JK)) > 0.0_JPRB) THEN
+
+        ! Compute liquid and rain water contents
+        ZAIR_DENSITY_GM3 = 1000.0_JPRB * PPRESSURE(JL,JK) &
+             &           / (RD*PTEMPERATURE(JL,JK))
+        ! In-cloud mean water contents found by dividing by cloud
+        ! fraction
+        PCCT_CM3 = PCCT_LIMA (JL, JK) * ZAIR_DENSITY_GM3 * 1.E-9_JPRB
+        ZLWC_GM3 = ZAIR_DENSITY_GM3 * PQ_LIQ(JL,JK)  / PCLOUD_FRAC(JL,JK)
+        PRE_UM(JL,JK)=100*(4.*ZLWC_GM3*(XNUC+2)**2/(PCCT_CM3*3.*RPI*(XNUC**2+XNUC)))**(1./3.)     
+!        print*,"r_eff=",PRE_UM(JL,JK)
+        if (PRE_UM(JL,JK)>50) then
+                PRE_UM(JL,JK)=50.
+        else if (PRE_UM(JL,JK)<1.) then
+                PRE_UM(JL,JK)=1.
+        end if
+
+
+      ELSE
+        ! Cloud fraction or liquid+rain water content too low to
+        ! consider this a cloud
+        PRE_UM(JL,JK) = 1.
+
+      ENDIF
+
+    ENDDO
+    
+  ENDDO
+  
   
 CASE DEFAULT
   WRITE(NULERR,'(A,I0,A)') 'LIQUID EFFECTIVE RADIUS OPTION IRADLP=',IRADLP,' NOT AVAILABLE'
diff --git a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90 b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90
index 06cd9e271..270f990cf 100644
--- a/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90
+++ b/src/LIB/RAD/ecrad-1.4.0_mnh/ifs/radiation_scheme.F90
@@ -25,6 +25,7 @@ SUBROUTINE RADIATION_SCHEME &
      &  PPRESSURE_H, PTEMPERATURE_H, &
      &  PQ, PCO2, PCH4, PN2O, PNO2, PCFC11, PCFC12, PHCFC22, PCCL4, PO3_DP, &
      &  PCLOUD_FRAC, PQ_LIQUID, PQ_ICE, PQ_RAIN, PQ_SNOW, &
+     &  PCCT_LIMA, PCRT_LIMA, PCIT_LIMA, &          
      &  PAEROSOL_OLD, PAEROSOL, &
      &  PFLUX_SW, PFLUX_LW, PFLUX_SW_CLEAR, PFLUX_LW_CLEAR, &
      &  PFLUX_SW_SURF, PFLUX_LW_SURF, PFLUX_SW_SURF_CLEAR, PFLUX_LW_SURF_CLEAR, &
@@ -186,6 +187,11 @@ REAL(KIND=JPRB),   INTENT(IN) :: PQ_LIQUID(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_ICE(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_RAIN(KLON,KLEV)
 REAL(KIND=JPRB),   INTENT(IN) :: PQ_SNOW(KLON,KLEV)
+! *** Particle concentrations
+REAL(KIND=JPRB),  INTENT (IN)   :: PCCT_LIMA(KLON,KLEV) ! cloud water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCRT_LIMA(KLON,KLEV) ! rain water concentration (LIMA)
+REAL(KIND=JPRB),  INTENT (IN)   :: PCIT_LIMA(KLON,KLEV) ! ice crystal concentration (LIMA)
+
 
 ! *** Aerosol mass mixing ratios
 REAL(KIND=JPRB),   INTENT(IN) :: PAEROSOL_OLD(KLON,6,KLEV)
@@ -436,13 +442,14 @@ cloud%fraction(KIDIA:KFDIA,:) = PCLOUD_FRAC(KIDIA:KFDIA,:)
 ! Compute effective radii and convert to metres
 CALL LIQUID_EFFECTIVE_RADIUS(KIDIA, KFDIA, KLON, KLEV, &
      &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_LIQUID, PQ_RAIN, &
+     &  PCCT_LIMA, PCRT_LIMA,  &               
      &  PLAND_SEA_MASK, PCCN_LAND, PCCN_SEA, &
      &  PRE_LIQUID_UM)
 cloud%re_liq(KIDIA:KFDIA,:) = PRE_LIQUID_UM(KIDIA:KFDIA,:) * 1.0e-6_JPRB
 
 CALL ICE_EFFECTIVE_RADIUS(KIDIA, KFDIA, KLON, KLEV, &
-     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PGEMU, &
-     &  PRE_ICE_UM)
+     &  PPRESSURE, PTEMPERATURE, PCLOUD_FRAC, PQ_ICE, PQ_SNOW, PCIT_LIMA, &
+     &  PGEMU, PRE_ICE_UM)
 cloud%re_ice(KIDIA:KFDIA,:) = PRE_ICE_UM(KIDIA:KFDIA,:) * 1.0e-6_JPRB
 
 ! Get the cloud overlap decorrelation length (for cloud boundaries),
diff --git a/src/MNH/ecrad_interface.f90 b/src/MNH/ecrad_interface.f90
index 19830f989..96a2821ab 100644
--- a/src/MNH/ecrad_interface.f90
+++ b/src/MNH/ecrad_interface.f90
@@ -441,6 +441,7 @@ CALL RADIATION_SCHEME  (IKIDIA, IKFDIA,KLON, KLEV, IAER, &
         PAP, PT, PAPH, PTH, &
         PQ, ZCCO2, ZCCH4, ZCN2O, ZCNO2, ZCCFC11, ZCCFC12, ZCCFC22, ZCCCL4, ZOZON, &
         PCLFR, PQLWC, PQIWC, PQRWC, ZQSWC, &
+        PCCT_C2R2, PCRT_C2R2, PCIT_C1R3,     &        
         ZAEROSOL_OLD, ZAEROSOL, &
         ZFLUX_SW, ZFLUX_LW, ZFLUX_SW_CLEAR, ZFLUX_LW_CLEAR, &
         ZFLUX_SW_SURF, ZFLUX_LW_SURF, ZFLUX_SW_SURF_CLEAR, ZFLUX_LW_SURF_CLEAR, &
-- 
GitLab