From 89140b6d8a07e6c12908b58bf0beaf6f3f560ced Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Sat, 26 Feb 2022 00:46:35 +0100
Subject: [PATCH] Quentin 26/02/2022: missing bugfixes from last commit : 3 bug
 bit-repro (add ifdef REPRO48/55) to be validated in compute_entr_detr and
 compute_updraft

---
 src/common/turb/mode_compute_entr_detr.F90 |   4 +
 src/common/turb/mode_compute_updraft.F90   |  10 +-
 src/mesonh/turb/mode_tridiag_massflux.f90  | 280 ---------------------
 3 files changed, 13 insertions(+), 281 deletions(-)
 delete mode 100644 src/mesonh/turb/mode_tridiag_massflux.f90

diff --git a/src/common/turb/mode_compute_entr_detr.F90 b/src/common/turb/mode_compute_entr_detr.F90
index 35bf18b95..7292dbb27 100644
--- a/src/common/turb/mode_compute_entr_detr.F90
+++ b/src/common/turb/mode_compute_entr_detr.F90
@@ -349,7 +349,11 @@ DO JLOOP=1,SIZE(OTEST)
                (PRTM(JLOOP,KK)-ZDZ*(PRTM(JLOOP,KK)-PRTM(JLOOP,JI))/PDZZ(JLOOP,KK)) + &
                (1. - ZKIC_INIT)*PRT_UP(JLOOP)
   ELSE
+#ifdef REPRO55
+    ZMIXTHL(JLOOP) = 0.1
+#else
     ZMIXTHL(JLOOP) = 300.
+#endif
     ZMIXRT(JLOOP) = 0.1
   ENDIF
 ENDDO
diff --git a/src/common/turb/mode_compute_updraft.F90 b/src/common/turb/mode_compute_updraft.F90
index cc5c9672a..3ad4b5584 100644
--- a/src/common/turb/mode_compute_updraft.F90
+++ b/src/common/turb/mode_compute_updraft.F90
@@ -319,7 +319,11 @@ IF (OENTR_DETR) THEN
     ZSHEAR = 0. !no shear in bl89 mixing length
   END IF
   !
+#ifdef REPRO48
   CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP)
+#else
+  CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.FALSE.,ZSHEAR,ZLUP)
+#endif
   ZLUP(:)=MAX(ZLUP(:),1.E-10)
 
   ! Compute Buoyancy flux at the ground
@@ -425,11 +429,15 @@ DO JK=KKB,KKE-KKL,KKL
       ZMIX2(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*PENTR(JLOOP,JK) !&
       ZMIX3_CLD(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*(1.-ZPART_DRY(JLOOP))*ZDETR_CLD(JLOOP,JK) !&                   
       ZMIX2_CLD(JLOOP) = (PZZ(JLOOP,JK+KKL)-PZZ(JLOOP,JK))*(1.-ZPART_DRY(JLOOP))*ZENTR_CLD(JLOOP,JK)
-                  
+#ifdef REPRO48                  
       PTHL_UP(JLOOP,JK+KKL)=(PTHL_UP(JLOOP,JK)*(1.-0.5*ZMIX2(JLOOP)) + PTHLM(JLOOP,JK)*ZMIX2(JLOOP)) &
                             /(1.+0.5*ZMIX2(JLOOP))   
       PRT_UP(JLOOP,JK+KKL) =(PRT_UP (JLOOP,JK)*(1.-0.5*ZMIX2(JLOOP)) + PRTM(JLOOP,JK)*ZMIX2(JLOOP))  &
                             /(1.+0.5*ZMIX2(JLOOP))
+#else
+      PTHL_UP(JLOOP,JK+KKL)=PTHL_UP(JLOOP,JK)*EXP(-ZMIX2(JLOOP)) + PTHLM(JLOOP,JK)*(1-EXP(-ZMIX2(JLOOP)))
+      PRT_UP(JLOOP,JK+KKL) =PRT_UP (JLOOP,JK)*EXP(-ZMIX2(JLOOP)) +  PRTM(JLOOP,JK)*(1-EXP(-ZMIX2(JLOOP)))
+#endif
     ENDIF
   ENDDO
   
diff --git a/src/mesonh/turb/mode_tridiag_massflux.f90 b/src/mesonh/turb/mode_tridiag_massflux.f90
deleted file mode 100644
index 3e909c2c5..000000000
--- a/src/mesonh/turb/mode_tridiag_massflux.f90
+++ /dev/null
@@ -1,280 +0,0 @@
-!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.
-MODULE MODE_TRIDIAG_MASSFLUX
-IMPLICIT NONE
-CONTAINS
-SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL,  &
-                                 PDZZ,PRHODJ,PVARP             )
-
-       USE PARKIND1, ONLY : JPRB
-       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
-!      #################################################
-!
-!
-!!****   *TRIDIAG_MASSFLUX* - routine to solve a time implicit scheme
-!!
-!!
-!!     PURPOSE
-!!     -------
-!        The purpose of this routine is to give a field PVARP at t+1, by 
-!      solving an implicit TRIDIAGonal system obtained by the 
-!      discretization of the vertical turbulent diffusion. It should be noted 
-!      that the degree of implicitness can be varied (PIMPL parameter) and that
-!      the function of F(T) must have been linearized.
-!      PVARP is localized at a mass point.
-!
-!!**   METHOD
-!!     ------
-!!
-!!        [T(+) - T(-)]/2Dt = -d{ F + dF/dT *impl*[T(+) + T(-)] }/dz
-!!
-!!     It is discretized as follows:
-!!
-!!    PRHODJ(k)*PVARP(k)/PTSTEP
-!!              = 
-!!    PRHODJ(k)*PVARM(k)/PTSTEP 
-!!  - (PRHODJ(k+1)+PRHODJ(k)  )/2. * PF(k+1)/PDZZ(k+1)
-!!  + (PRHODJ(k)  +PRHODJ(k-1))/2. * PF(k)  /PDZZ(k)
-!!  + (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k+1)/PDZZ(k+1)
-!!  - (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARP(k+1)/PDZZ(k+1)
-!!  + (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k)  /PDZZ(k+1)
-!!  - (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARP(k)  /PDZZ(k+1)
-!!  - (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)   * PVARM(k)  /PDZZ(k)
-!!  + (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)   * PVARP(k)  /PDZZ(k)
-!!  - (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)   * PVARM(k-1)/PDZZ(k)
-!!  + (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)   * PVARP(k-1)/PDZZ(k)
-!!
-!!
-!!    The system to solve is:
-!!
-!!      A*PVARP(k-1) + B*PVARP(k) + C*PVARP(k+1) = Y(k)
-!!
-!!
-!!    The RHS of the linear system in PVARP writes:
-!!
-!! y(k)    = PRHODJ(k)*PVARM(k)/PTSTEP
-!!  - (PRHODJ(k+1)+PRHODJ(k)  )/2. * PF(k+1)/PDZZ(k+1)
-!!  + (PRHODJ(k)  +PRHODJ(k-1))/2. * PF(k)  /PDZZ(k)
-!!  + (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k+1)/PDZZ(k+1)
-!!  + (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1) * PVARM(k)  /PDZZ(k+1)
-!!  - (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)   * PVARM(k)  /PDZZ(k)
-!!  - (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)   * PVARM(k-1)/PDZZ(k)
-!!
-!!                      
-!!        Then, the classical TRIDIAGonal algorithm is used to invert the 
-!!     implicit operator. Its matrix is given by:
-!!
-!!     ( b(KKB)   c(KKB)      0        0        0         0        0        0  )
-!!     ( a(KKB+1) b(KKB+1) c(KKB+1)    0  ...    0        0        0        0  ) 
-!!     (   0      a(KKB+2) b(KKB+2) c(KKB+2).    0        0        0        0  ) 
-!!      .......................................................................
-!!     (   0   ...   0     a(k)     b(k)     c(k)         0   ...  0        0  ) 
-!!      .......................................................................
-!!     (   0         0        0        0        0 ...a(KKE-1) b(KKE-1) c(KKE-1))
-!!     (   0         0        0        0        0 ...     0   a(KKE)   b(KKE)  )
-!!
-!!     KKB and KKE represent the first and the last inner mass levels of the
-!!     model. The coefficients are:
-!!         
-!! a(k) = - (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)  /PDZZ(k)
-!! b(k) =    PRHODJ(k) / PTSTEP
-!!        + (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1)/PDZZ(k+1)
-!!        - (PRHODJ(k)  +PRHODJ(k-1))/2. * 0.5*PIMPL* PDFDT(k)  /PDZZ(k)
-!! c(k) = + (PRHODJ(k+1)+PRHODJ(k)  )/2. * 0.5*PIMPL* PDFDT(k+1)/PDZZ(k+1)
-!!
-!!          for all k /= KKB or KKE
-!!
-!!
-!! b(KKB) =  PRHODJ(KKB) / PTSTEP
-!!          +(PRHODJ(KKB+1)+PRHODJ(KKB))/2.*0.5*PIMPL*PDFDT(KKB+1)/PDZZ(KKB+1)
-!! c(KKB) = +(PRHODJ(KKB+1)+PRHODJ(KKB))/2.*0.5*PIMPL*PDFDT(KKB+1)/PDZZ(KKB+1)
-!!
-!! b(KKE) =  PRHODJ(KKE) / PTSTEP
-!!          -(PRHODJ(KKE)+PRHODJ(KKE-1))/2.*0.5*PIMPL*PDFDT(KKE)/PDZZ(KKE)
-!! a(KKE) = -(PRHODJ(KKE)+PRHODJ(KKE-1))/2.*0.5*PIMPL*PDFDT(KKE)/PDZZ(KKE)
-!!
-!!
-!!     EXTERNAL
-!!     --------
-!!
-!!       NONE
-!!
-!!     IMPLICIT ARGUMENTS
-!!     ------------------
-!!
-!!     REFERENCE
-!!     ---------
-!!       Press et al: Numerical recipes (1986) Cambridge Univ. Press
-!!
-!!     AUTHOR
-!!     ------
-!!       V. Masson and S. Malardel         * Meteo-France *   
-!! 
-!!     MODIFICATIONS
-!!     -------------
-!!       Original        07/2006
-!!       V.Masson : Optimization
-!!       S. Riette Jan 2012: support for both order of vertical levels
-!! ---------------------------------------------------------------------
-!
-!*       0. DECLARATIONS
-!
-USE MODD_PARAMETERS, ONLY: JPVEXT
-USE MODI_SHUMAN_MF
-!
-IMPLICIT NONE
-!
-!
-!*       0.1 declarations of arguments
-!
-INTEGER,                INTENT(IN)   :: KKA          ! near ground array index
-INTEGER,                INTENT(IN)   :: KKB          ! near ground physical index
-INTEGER,                INTENT(IN)   :: KKE          ! uppest atmosphere physical index
-INTEGER,                INTENT(IN)   :: KKU          ! uppest atmosphere array index
-INTEGER,                INTENT(IN)   :: KKL          ! +1 if grid goes from ground to atmosphere top, -1 otherwise
-REAL, DIMENSION(:,:), INTENT(IN) :: PVARM   ! variable at t-1      at mass point
-REAL, DIMENSION(:,:), INTENT(IN) :: PF      ! flux in dT/dt=-dF/dz at flux point
-REAL, DIMENSION(:,:), INTENT(IN) :: PDFDT   ! dF/dT                at flux point
-REAL,                   INTENT(IN) :: PTSTEP  ! Double time step
-REAL,                   INTENT(IN) :: PIMPL   ! implicit weight
-REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ    ! Dz                   at flux point
-REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ  ! (dry rho)*J          at mass point
-!
-REAL, DIMENSION(:,:), INTENT(OUT):: PVARP   ! variable at t+1      at mass point
-!
-!
-!*       0.2 declarations of local variables
-!
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))  :: ZRHODJ_DFDT_O_DZ
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))  :: ZMZM_RHODJ
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))  :: ZA, ZB, ZC
-REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2))  :: ZY ,ZGAM 
-                                         ! RHS of the equation, 3D work array
-REAL, DIMENSION(SIZE(PVARM,1))                :: ZBET
-                                         ! 2D work array
-INTEGER                              :: JK            ! loop counter
-!
-! ---------------------------------------------------------------------------
-!                                              
-!*      1.  Preliminaries
-!           -------------
-!
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
-IF (LHOOK) CALL DR_HOOK('TRIDIAG_MASSFLUX',0,ZHOOK_HANDLE)
-ZMZM_RHODJ  = MZM_MF(KKA, KKU, KKL, PRHODJ)
-ZRHODJ_DFDT_O_DZ = ZMZM_RHODJ*PDFDT/PDZZ
-!
-ZA=0.
-ZB=0.
-ZC=0.
-ZY=0.
-!
-!
-!*      2.  COMPUTE THE RIGHT HAND SIDE
-!           ---------------------------
-!
-ZY(:,KKB) = PRHODJ(:,KKB)*PVARM(:,KKB)/PTSTEP             &
-    - ZMZM_RHODJ(:,KKB+KKL) * PF(:,KKB+KKL)/PDZZ(:,KKB+KKL)     &
-    + ZMZM_RHODJ(:,KKB  ) * PF(:,KKB  )/PDZZ(:,KKB  )     &
-    + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL * PVARM(:,KKB+KKL)    &
-    + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL * PVARM(:,KKB  )
-!
-DO JK=2+JPVEXT,SIZE(ZY,2)-JPVEXT-1
-  ZY(:,JK) = PRHODJ(:,JK)*PVARM(:,JK)/PTSTEP          &
-    - ZMZM_RHODJ(:,JK+KKL) * PF(:,JK+KKL)/PDZZ(:,JK+KKL)    &
-    + ZMZM_RHODJ(:,JK  ) * PF(:,JK  )/PDZZ(:,JK  )    &
-    + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL * PVARM(:,JK+KKL)  &
-    + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL * PVARM(:,JK  )  &
-    - ZRHODJ_DFDT_O_DZ(:,JK  ) * 0.5*PIMPL * PVARM(:,JK  )  &
-    - ZRHODJ_DFDT_O_DZ(:,JK  ) * 0.5*PIMPL * PVARM(:,JK-KKL)
-END DO
-! 
-IF (JPVEXT==0) THEN
-  ZY(:,KKE) = PRHODJ(:,KKE)*PVARM(:,KKE)/PTSTEP 
-ELSE
-  ZY(:,KKE) = PRHODJ(:,KKE)*PVARM(:,KKE)/PTSTEP &
-   - ZMZM_RHODJ(:,KKE+KKL) * PF(:,KKE+KKL)/PDZZ(:,KKE+KKL) &
-   + ZMZM_RHODJ(:,KKE  ) * PF(:,KKE  )/PDZZ(:,KKE  ) &
-   - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL * PVARM(:,KKE  ) &
-   - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL * PVARM(:,KKE-KKL)
-ENDIF
-!
-!
-!*       3.  INVERSION OF THE TRIDIAGONAL SYSTEM
-!            -----------------------------------
-!
-IF ( PIMPL > 1.E-10 ) THEN
-!
-!*       3.1 arrays A, B, C
-!            --------------
-!
-  ZB(:,KKB) =   PRHODJ(:,KKB)/PTSTEP                   &
-                + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL
-  ZC(:,KKB) =   ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL
-
-  DO JK=2+JPVEXT,SIZE(ZY,2)-JPVEXT-1
-    ZA(:,JK) = - ZRHODJ_DFDT_O_DZ(:,JK  ) * 0.5*PIMPL
-    ZB(:,JK) =   PRHODJ(:,JK)/PTSTEP                   &
-                 + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL &
-                 - ZRHODJ_DFDT_O_DZ(:,JK  ) * 0.5*PIMPL
-    ZC(:,JK) =   ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL
-  END DO
-
-  ZA(:,KKE) = - ZRHODJ_DFDT_O_DZ(:,KKE  ) * 0.5*PIMPL
-  ZB(:,KKE) =   PRHODJ(:,KKE)/PTSTEP                   &
-                - ZRHODJ_DFDT_O_DZ(:,KKE  ) * 0.5*PIMPL
-!
-!*       3.2 going up
-!            --------
-!
-  ZBET(:) = ZB(:,KKB)  ! bet = b(KKB)
-  PVARP(:,KKB) = ZY(:,KKB) / ZBET(:)
-
-  !
-  DO JK = KKB+KKL,KKE-KKL,KKL
-    ZGAM(:,JK) = ZC(:,JK-KKL) / ZBET(:)
-                                                    ! gam(k) = c(k-1) / bet
-    ZBET(:)    = ZB(:,JK) - ZA(:,JK) * ZGAM(:,JK)
-                                                    ! bet = b(k) - a(k)* gam(k)  
-    PVARP(:,JK)= ( ZY(:,JK) - ZA(:,JK) * PVARP(:,JK-KKL) ) / ZBET(:)
-                                        ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
-  END DO 
-  ! special treatment for the last level
-  ZGAM(:,KKE) = ZC(:,KKE-KKL) / ZBET(:)
-                                                    ! gam(k) = c(k-1) / bet
-  ZBET(:)     = ZB(:,KKE) - ZA(:,KKE) * ZGAM(:,KKE)
-                                                    ! bet = b(k) - a(k)* gam(k)  
-  PVARP(:,KKE)= ( ZY(:,KKE) - ZA(:,KKE) * PVARP(:,KKE-KKL) ) / ZBET(:)
-                                       ! res(k) = (y(k) -a(k)*res(k-1))/ bet 
-!
-!*       3.3 going down
-!            ----------
-!
-  DO JK = KKE-KKL,KKB,-KKL
-    PVARP(:,JK) = PVARP(:,JK) - ZGAM(:,JK+KKL) * PVARP(:,JK+KKL)
-  END DO
-!
-!
-ELSE
-  !!! EXPLICIT FORMULATION
-  !
-  DO JK=1+JPVEXT,SIZE(PVARP,2)-JPVEXT
-    PVARP(:,JK) = ZY(:,JK) * PTSTEP / PRHODJ(:,JK)
-  ENDDO
-  !
-END IF 
-!
-!
-!*       4.  FILL THE UPPER AND LOWER EXTERNAL VALUES
-!            ----------------------------------------
-!
-PVARP(:,KKA)=PVARP(:,KKB)
-PVARP(:,KKU)=PVARP(:,KKE)
-!
-!-------------------------------------------------------------------------------
-!
-IF (LHOOK) CALL DR_HOOK('TRIDIAG_MASSFLUX',1,ZHOOK_HANDLE)
-END SUBROUTINE TRIDIAG_MASSFLUX
-END MODULE MODE_TRIDIAG_MASSFLUX
-- 
GitLab