From 19a39f36075d10f49ceb178606e3ebb23b2e53eb Mon Sep 17 00:00:00 2001
From: Gaelle DELAUTIER <gaelle.delautier@meteo.fr>
Date: Fri, 15 Sep 2017 15:54:47 +0200
Subject: [PATCH] Q.LIBOIS 2017 bug radiation scheme

---
 src/LIB/RAD/ECMWF_RAD/sw1s.f90 | 98 +++++++++++++++++++++++++++-------
 src/LIB/RAD/ECMWF_RAD/swni.f90 | 31 +++++++++--
 2 files changed, 104 insertions(+), 25 deletions(-)

diff --git a/src/LIB/RAD/ECMWF_RAD/sw1s.f90 b/src/LIB/RAD/ECMWF_RAD/sw1s.f90
index 07480c95b..77e1e50b5 100644
--- a/src/LIB/RAD/ECMWF_RAD/sw1s.f90
+++ b/src/LIB/RAD/ECMWF_RAD/sw1s.f90
@@ -84,7 +84,7 @@ INTEGER_M :: KFDIA
 INTEGER_M :: KIDIA
 INTEGER_M :: KLEV
 INTEGER_M :: KLON
-INTEGER_M :: KNU
+INTEGER_M :: KNU   ! index of wl
 
 
 
@@ -102,9 +102,9 @@ REAL_B :: PAER(KLON,6,KLEV)&
   &,  PRMU(KLON)           , PSEC(KLON)&
   &,  PTAU(KLON,NSW,KLEV)  , PUD(KLON,5,KLEV+1)
 
-REAL_B :: PFD(KLON,KLEV+1) , PFU(KLON,KLEV+1)&
-  &,  PCD(KLON,KLEV+1)     , PCU(KLON,KLEV+1)&
-  &,  PSUDU1(KLON)         , PDIFF(KLON,KLEV)&
+REAL_B :: PFD(KLON,KLEV+1) , PFU(KLON,KLEV+1)&  ! Fluxes down and up
+  &,  PCD(KLON,KLEV+1)     , PCU(KLON,KLEV+1)&  ! Fluxes clear down and up
+  &,  PSUDU1(KLON)         , PDIFF(KLON,KLEV)&  
   &,  PDIRF(KLON,KLEV)
 
 !++MODIF_MESONH
@@ -136,6 +136,11 @@ REAL_B :: ZCGAZ(KLON,KLEV)&
   &,  ZTRA1(KLON,KLEV+1), ZTRA2(KLON,KLEV+1)&
   &,  ZTRCLD(KLON)      , ZTRCLR(KLON)&
   &,  ZW6(KLON,6)       , ZW4(KLON,4), ZO(KLON,2) ,ZT(KLON,2) 
+  
+REAL_B :: ZTA1(KLON), ZTO1(KLON)
+REAL_B :: ZCLDIR 
+  
+  
 
 !     LOCAL INTEGER SCALARS
 INTEGER_M :: IKL, IKM1, JAJ, JK, JL
@@ -152,13 +157,18 @@ INTEGER_M :: IKL, IKM1, JAJ, JK, JL
 !*         1.1    OPTICAL THICKNESS FOR RAYLEIGH SCATTERING
 !                 -----------------------------------------
 
+! PRINT *,"PCLEAR ",PCLEAR
+! PAUSE
 
+! Rayleigh optical depth (Deschamps 1983)
 DO JL = KIDIA,KFDIA
   ZRAYL(JL) =  RRAY(KNU,1) + PRMU(JL) * (RRAY(KNU,2) + PRMU(JL)&
    &* (RRAY(KNU,3) + PRMU(JL) * (RRAY(KNU,4) + PRMU(JL)&
    &* (RRAY(KNU,5) + PRMU(JL) *  RRAY(KNU,6)       ))))
 ENDDO
 
+! PRINT *,"SW1S.F90 ZRAYL ", ZRAYL(1)
+! PRINT *,"YEAH"
 
 !     ------------------------------------------------------------------
 
@@ -178,17 +188,28 @@ ENDDO
         &, ODUST  , PPIZA_DST,PCGA_DST  &
        &, PTAUREL_DST )
 !--MODIF_MESONH
+! ZRJ0 and ZRK0 are downard and upward fluxes
+
+! PRINT *,"SW1S.F90 ZTAUAZ ",ZTAUAZ(1,1),ZTAUAZ(1,2)
 
 !*         2.2   CLOUDY FRACTION OF THE COLUMN
 !                -----------------------------
 
-
+! PTAU is cloud optical depth
+! PAER is aerosol optical depth
+! ZRAYL is rayleigh optical depth
+! NB : cloudy columns are further splitted into cloudy and clear portions
 CALL SWR &
   &( KIDIA ,KFDIA ,KLON  ,KLEV  , KNU &
   &, PALBD ,PCG   ,PCLD  ,POMEGA, PSEC , PTAU &
   &, ZCGAZ ,ZPIZAZ,ZRAY1 ,ZRAY2 , ZREFZ, ZRJ  ,ZRK , ZRMUE &
   &, ZTAUAZ,ZTRA1 ,ZTRA2 ,ZTRCLD &
   &)
+! PRINT *,"SW1S.F90 ZTAUAZ ",ZTAUAZ(1,1)
+! PRINT *,"ZRJ ",ZRJ(1,3,5),ZRK(1,3,5)
+! PRINT *,"ZRMU0 ",ZRMU0(1,1)
+! 
+! PRINT*,"ZTRCLD ZTRCLR ",ZTRCLD(:5),ZTRCLR(:5)
 
 !     ------------------------------------------------------------------
 
@@ -251,13 +272,16 @@ IF (NSW <= 4) THEN
       PCD(JL,IKL) = ZDIRF(JL) * RSUN(KNU)
     ENDDO
   ENDDO
-
+  
+  
   DO JL=KIDIA,KFDIA
-    ZDIFT(JL) = ZR6(JL,1)*ZR6(JL,2)*ZR6(JL,3)*ZTRCLD(JL)
-    ZDIRT(JL) = ZR6(JL,4)*ZR6(JL,5)*ZR6(JL,6)*ZTRCLR(JL)
-    PSUDU1(JL) = ((_ONE_-PCLEAR(JL)) * ZDIFT(JL)&
+    ZDIFT(JL) = ZR6(JL,1)*ZR6(JL,2)*ZR6(JL,3)*ZTRCLD(JL) ! t for true ?
+    ZDIRT(JL) = ZR6(JL,4)*ZR6(JL,5)*ZR6(JL,6)*ZTRCLR(JL) 
+    PSUDU1(JL) = ((_ONE_-PCLEAR(JL)) * ZDIFT(JL)&        ! quantity not used by ECMWF_VERSION_2
      &+PCLEAR(JL) * ZDIRT(JL)) * RSUN(KNU)
   ENDDO
+  
+
 
 
 !*         3.1.2  UPWARD FLUXES
@@ -313,7 +337,6 @@ ELSE IF (NSW == 6) THEN
 !*         3.2,1  DOWNWARD FLUXES
 !                 ---------------
 
-
   JAJ = 2
 
   DO JL = KIDIA,KFDIA
@@ -324,10 +347,18 @@ ELSE IF (NSW == 6) THEN
   
     ZO(JL,1)=_ZERO_
     ZO(JL,2)=_ZERO_
-    PFD(JL,KLEV+1)=((_ONE_-PCLEAR(JL))*ZRJ(JL,JAJ,KLEV+1)&
+    PFD(JL,KLEV+1)=((_ONE_-PCLEAR(JL))*ZRJ(JL,JAJ,KLEV+1)& ! TOA flux
       &+ PCLEAR(JL) *ZRJ0(JL,JAJ,KLEV+1)) * RSUN(KNU)
-    PCD(JL,KLEV+1)= ZRJ0(JL,JAJ,KLEV+1) * RSUN(KNU)
+    PCD(JL,KLEV+1)= ZRJ0(JL,JAJ,KLEV+1) * RSUN(KNU)        ! TOA flux CS
+  ENDDO
+  
+  ! Quentin
+  DO JL = KIDIA,KFDIA
+     ZTA1(JL)=_ZERO_
+     ZTO1(JL)=_ZERO_
   ENDDO
+  ! Quentin
+  
   DO JK = 1 , KLEV
     IKL = KLEV+1-JK
     DO JL = KIDIA,KFDIA
@@ -340,31 +371,58 @@ ELSE IF (NSW == 6) THEN
       ZO(JL,2)=ZO(JL,2)+POZ(JL,  IKL)/ZRMU0(JL,IKL)
     ENDDO
  
+    ! transmission fucntion for all absorbers
     CALL SWTT1 ( KIDIA, KFDIA, KLON, KNU, 4 &
       &, IIND4 &
       &, ZW4  &
       &, ZR4  &
       & )
+      ! ZR4 transmission fucntion
 
     CALL SWUVO3 ( KIDIA, KFDIA, KLON, KNU, 2 &
       &, ZO  &
       &, ZT  &
       & )
+      ! ZT transmission function
 
     DO JL = KIDIA,KFDIA
-      ZDIFF(JL) = ZR4(JL,1)*ZR4(JL,2)*ZT(JL,1)*ZRJ(JL,JAJ,IKL)
-      ZDIRF(JL) = ZR4(JL,3)*ZR4(JL,4)*ZT(JL,2)*ZRJ0(JL,JAJ,IKL)
-      PDIFF(JL,IKL) = ZDIFF(JL) * RSUN(KNU)*(_ONE_-PCLEAR(JL))
-      PDIRF(JL,IKL) = ZDIRF(JL) * RSUN(KNU)*PCLEAR(JL)
-      PFD(JL,IKL) = ((_ONE_-PCLEAR(JL)) * ZDIFF(JL)&
+      ZDIFF(JL) = ZR4(JL,1)*ZR4(JL,2)*ZT(JL,1)*ZRJ(JL,JAJ,IKL) ! multiplication of absorber contributions for clouds
+      ZDIRF(JL) = ZR4(JL,3)*ZR4(JL,4)*ZT(JL,2)*ZRJ0(JL,JAJ,IKL) ! flux in clear sky part
+    ! PDIFF(JL,IKL) = ZDIFF(JL) * RSUN(KNU)*(_ONE_-PCLEAR(JL))
+    ! PDIRF(JL,IKL) = ZDIRF(JL) * RSUN(KNU)*PCLEAR(JL)
+      PFD(JL,IKL) = ((_ONE_-PCLEAR(JL)) * ZDIFF(JL)&  ! total downward flux
         &+PCLEAR(JL)  * ZDIRF(JL)) * RSUN(KNU)
-      PCD(JL,IKL) = ZDIRF(JL) * RSUN(KNU)
+      PCD(JL,IKL) = ZDIRF(JL) * RSUN(KNU)             ! total downward clear-sky
+      
+    ! Quentin
+      ZTA1(JL) = ZTA1(JL) + ZTAUAZ(JL,IKL)            ! aerosol + rayleigh OD
+      ZTO1(JL) = PTAU(JL,KNU,IKL)*(1.-(POMEGA(JL,KNU,IKL)* &  ! cloud OD
+      &           PCG(JL,KNU,IKL)*PCG(JL,KNU,IKL))) + ZTO1(JL)
+      ZCLDIR = ZDIRF(JL)/ZRJ0(JL,JAJ,1)*EXP(-ZTA1(JL)/PRMU(JL))   ! remaining direct in clear-sky (otherwise diffuse)
+      PDIRF(JL,IKL) = ((_ONE_-PCLEAR(JL))*ZCLDIR*EXP(-ZTO1(JL)/PRMU(JL))+& ! some direct through cloud
+      &              PCLEAR(JL)*ZCLDIR) * RSUN(KNU)
+      PDIRF(JL,IKL) = MIN(PFD(JL,IKL),PDIRF(JL,IKL))
+      PDIFF(JL,IKL) = PFD(JL,IKL) - PDIRF(JL,IKL)
+    ! Quentin
+    
+!     PRINT *,"IKL",IKL
+!     PRINT *,"SW1.f90 PDIFF ",PDIFF(:5,1)
+!     PRINT *,"SW1.f90 PDIRF ",PDIRF(:5,1)
     ENDDO
+      
   ENDDO
+!   PRINT *,"SW1.f90 PDIFF ",PDIFF(:5,1)
+!   PRINT *,"SW1.f90 PDIRF ",PDIRF(:5,1)
+!   PRINT *,"SW1.f90 ZDIFF ",ZDIFF(1)
+!   PRINT *,"SW1.f90 ZDIRF ",ZDIRF(1)
+!   PRINT *,"SW1.f90 RSUN ",RSUN(KNU)
+!   PRINT *,"SW1.f90 PCLEAR ",PCLEAR(1)
+!   PRINT *,"SW1.f90 SIZE(PDIFF,1) ",SIZE(PDIFF,1),SIZE(PDIFF,2)
+  
   DO JL=KIDIA,KFDIA
-    ZDIFT(JL) = ZR4(JL,1)*ZR4(JL,2)*ZT(JL,1)*ZTRCLD(JL)
+    ZDIFT(JL) = ZR4(JL,1)*ZR4(JL,2)*ZT(JL,1)*ZTRCLD(JL)     ! true components with corrected cloudiness
     ZDIRT(JL) = ZR4(JL,3)*ZR4(JL,4)*ZT(JL,2)*ZTRCLR(JL)
-    PSUDU1(JL) = ((_ONE_-PCLEAR(JL)) * ZDIFT(JL)&
+    PSUDU1(JL) = ((_ONE_-PCLEAR(JL)) * ZDIFT(JL)&           ! not used by ECMWF_VERSION_2
       &+PCLEAR(JL) * ZDIRT(JL)) * RSUN(KNU)
   ENDDO
 
diff --git a/src/LIB/RAD/ECMWF_RAD/swni.f90 b/src/LIB/RAD/ECMWF_RAD/swni.f90
index 7cef30723..e91319144 100644
--- a/src/LIB/RAD/ECMWF_RAD/swni.f90
+++ b/src/LIB/RAD/ECMWF_RAD/swni.f90
@@ -113,6 +113,10 @@ REAL_B :: PFDOWN(KLON,KLEV+1)  , PFUP(KLON,KLEV+1)&
   &,  PCDOWN(KLON,KLEV+1)  , PCUP(KLON,KLEV+1)&
   &,  PSUDU2(KLON)         , PDIFF(KLON,KLEV)&
   &,  PDIRF(KLON,KLEV) 
+  
+!Quentin
+REAL_B :: ZCLDIR 
+REAL_B :: ZTA1(KLON)
 
 !++MODIF_MESONH
 LOGICAL           :: ODUST                   ! flag for DUST
@@ -537,6 +541,13 @@ DO JL = KIDIA,KFDIA
   PCDOWN(JL,KLEV+1) = ZFD(JL,KLEV+1) * RSUN(KNU)
 ENDDO
 
+! Quentin
+DO JL = KIDIA,KFDIA
+  ZTA1(JL)=_ZERO_
+  ZTO1(JL)=_ZERO_
+ENDDO
+! Quentin
+
 DO JK = 1 , KLEV
   IKL=KLEV+1-JK
   DO JL = KIDIA,KFDIA
@@ -547,15 +558,25 @@ DO JK = 1 , KLEV
   ENDDO
 
   CALL SWTT ( KIDIA,KFDIA,KLON, KNU, IABS, ZW1, ZR1 )
-
+  
+! Quentin
   DO JL = KIDIA,KFDIA
-     PDIFF(JL,IKL)=ZR1(JL)*ZR4(JL)*PFDOWN(JL,IKL)*RSUN(KNU)*&
-     &              (_ONE_-PCLEAR(JL))
-     PDIRF(JL,IKL)=ZFD(JL,IKL)*RSUN(KNU)* PCLEAR(JL)
      PFDOWN(JL,IKL) = ((_ONE_-PCLEAR(JL))*ZR1(JL)*ZR4(JL)*PFDOWN(JL,&
      &IKL)&
      &+PCLEAR(JL)*ZFD(JL,IKL)) * RSUN(KNU)
-    PCDOWN(JL,IKL) = ZFD(JL,IKL) * RSUN(KNU)
+     PCDOWN(JL,IKL) = ZFD(JL,IKL) * RSUN(KNU)
+     ZTA1(JL)=ZTA1(JL)+ZTAUAZ(JL,IKL)
+     ZTO1(JL) = PTAU(JL,KNU,IKL)*(1.-(POMEGA(JL,KNU,IKL)* &
+     &           PCG(JL,KNU,IKL)*PCG(JL,KNU,IKL))) + ZTO1(JL)
+     ZCLDIR     = ZFD(JL,IKL)/ZRJ0(JL,JAJ,IKL)*EXP(-ZTA1(JL)/PRMU(JL))
+     
+     PDIRF(JL,IKL) = ((_ONE_-PCLEAR(JL))*ZCLDIR*EXP(-ZTO1(JL)/PRMU(JL)) + &
+     &              PCLEAR(JL)*ZCLDIR) * RSUN(KNU)
+     PDIRF(JL,IKL) = MIN(PFDOWN(JL,IKL),PDIRF(JL,IKL))
+     PDIFF(JL,IKL) = PFDOWN(JL,IKL) - PDIRF(JL,IKL)
+    ! PDIFF(JL,IKL)=ZR1(JL)*ZR4(JL)*PFDOWN(JL,IKL)*RSUN(KNU)*&
+    ! &              (_ONE_-PCLEAR(JL))
+    ! PDIRF(JL,IKL)=ZFD(JL,IKL)*RSUN(KNU)* PCLEAR(JL)
   ENDDO
 ENDDO
 
-- 
GitLab