From d1ce800868c4c01027e892acf9435fff0155026e Mon Sep 17 00:00:00 2001
From: Quentin Rodier <quentin.rodier@meteo.fr>
Date: Tue, 29 Mar 2022 18:09:27 +0200
Subject: [PATCH] Quentin 29/03/2022: Expand Array mode_tke_eps_sources.F90

---
 src/common/turb/mode_tke_eps_sources.F90 | 153 ++++++++++++++++++-----
 1 file changed, 123 insertions(+), 30 deletions(-)

diff --git a/src/common/turb/mode_tke_eps_sources.F90 b/src/common/turb/mode_tke_eps_sources.F90
index 0478fea7f..3d9991f8d 100644
--- a/src/common/turb/mode_tke_eps_sources.F90
+++ b/src/common/turb/mode_tke_eps_sources.F90
@@ -213,7 +213,10 @@ REAL, DIMENSION(D%NIT,D%NJT,D%NKT) ::         &
        ZFLX,     & ! horizontal or vertical flux of the treated variable
        ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
-       ZTR         ! Transport term
+       ZTR,      & ! Transport term
+       ZMWORK1,ZMWORK2,& ! working var. for MZM/MZF operators (array syntax)
+       ZDWORK1,ZDWORK2   ! working var. for DZM/DZF operators (array syntax)
+
 LOGICAL,DIMENSION(D%NIT,D%NJT,D%NKT) :: GTKENEG
                    ! 3D mask .T. if TKE < CSTURB%XTKEMIN
 INTEGER             :: IKB          ! Index values for the Beginning and End
@@ -223,6 +226,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange
 INTEGER                :: IINFO_ll       ! return code of parallel routine
 TYPE(TFIELDDATA) :: TZFIELD
 REAL(KIND=JPRB) :: ZHOOK_HANDLE
+INTEGER :: JI,JJ,JK
 !
 !----------------------------------------------------------------------------
 NULLIFY(TZFIELDDISS_ll)
@@ -235,7 +239,13 @@ IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE)
 IKB=D%NKB
 !
 ! compute the effective diffusion coefficient at the mass point
-ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) 
+DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+ZKEFF(JI,JJ,JK) = PLM(JI,JJ,JK) * SQRT(PTKEM(JI,JJ,JK))
+  ENDDO
+ ENDDO
+ENDDO
 !
 !----------------------------------------------------------------------------
 !
@@ -258,14 +268,26 @@ END IF
 !
 ! extrapolate the dynamic production with a 1/Z law from its value at the 
 ! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB)
-PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+D%NKL)/PDZZ(:,:,IKB))
+!
+DO JJ=1,D%NJT 
+ DO JI=1,D%NIT 
+PDP(JI,JJ,IKB) = PDP(JI,JJ,IKB) * (1. + PDZZ(JI,JJ,IKB+D%NKL)/PDZZ(JI,JJ,IKB))
+ ENDDO
+ENDDO
 !
 ! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..)
 ! + (Dynamical Production) + (Thermal Production) - (dissipation) 
-ZFLX(:,:,:) = CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:)
-ZSOURCE(:,:,:) = ( PRTKES(:,:,:) +  PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) &
-   - PTKEM(:,:,:) / PTSTEP &
-   + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:)
+!
+ZMWORK1 = MZM(ZKEFF, D%NKA, D%NKU, D%NKL) 
+ZMWORK2 = MZM(PRHODJ, D%NKA, D%NKU, D%NKL)
+!
+DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+ZFLX(JI,JJ,JK) = CSTURB%XCED * SQRT(PTKEM(JI,JJ,JK)) / PLEPS(JI,JJ,JK)
+ZSOURCE(JI,JJ,JK) = ( PRTKES(JI,JJ,JK) +  PRTKEMS(JI,JJ,JK) ) / PRHODJ(JI,JJ,JK) &
+   - PTKEM(JI,JJ,JK) / PTSTEP &
+   + PDP(JI,JJ,JK) + PTP(JI,JJ,JK) + ZTR(JI,JJ,JK) - PEXPL * ZFLX(JI,JJ,JK) * PTKEM(JI,JJ,JK)
 !
 !*       2.2  implicit vertical TKE transport
 !
@@ -273,8 +295,10 @@ ZSOURCE(:,:,:) = ( PRTKES(:,:,:) +  PRTKEMS(:,:,:) ) / PRHODJ(:,:,:) &
 ! Compute the vector giving the elements just under the diagonal for the 
 ! matrix inverted in TRIDIAG 
 !
-ZA(:,:,:)     = - PTSTEP * CSTURB%XCET * &
-                MZM(ZKEFF, D%NKA, D%NKU, D%NKL) * MZM(PRHODJ, D%NKA, D%NKU, D%NKL) / PDZZ**2
+ZA(JI,JJ,JK)     = - PTSTEP * CSTURB%XCET * ZMWORK1(JI,JJ,JK) * ZMWORK2(JI,JJ,JK) / PDZZ(JI,JJ,JK)**2
+  ENDDO
+ ENDDO
+ENDDO
 !
 ! Compute TKE at time t+deltat: ( stored in ZRES )
 !
@@ -285,8 +309,15 @@ CALL GET_HALO(ZRES)
 !* diagnose the dissipation
 !
 IF (LDIAG_IN_RUN) THEN
-  XCURRENT_TKE_DISS = ZFLX(:,:,:) * PTKEM(:,:,:) &
-                                  *(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:))
+  DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+  XCURRENT_TKE_DISS(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PTKEM(JI,JJ,JK) &
+                                  *(PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK))
+    ENDDO
+ ENDDO
+ENDDO
+!
   CALL ADD3DFIELD_ll( TZFIELDDISS_ll, XCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::XCURRENT_TKE_DISS' )
   CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll)
   CALL CLEANLIST_ll(TZFIELDDISS_ll)
@@ -295,27 +326,54 @@ ENDIF
 ! TKE must be greater than its minimum value
 ! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH
 IF(HPROGRAM/='MESONH') THEN
- GTKENEG =  ZRES <= CSTURB%XTKEMIN 
- WHERE ( GTKENEG ) 
-   ZRES = CSTURB%XTKEMIN
- END WHERE
+ GTKENEG =  ZRES <= CSTURB%XTKEMIN
+ DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+ IF ( GTKENEG(JI,JJ,JK) ) THEN
+   ZRES(JI,JJ,JK) = CSTURB%XTKEMIN
+ ENDIF
+   ENDDO
+ ENDDO
+ENDDO
 END IF
-PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:))
+!
+DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+PTDISS(JI,JJ,JK) = - ZFLX(JI,JJ,JK)*(PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK))
+  ENDDO
+ ENDDO
+ENDDO
 !
 IF ( OLES_CALL .OR.                         &
      (OTURB_DIAG .AND. TPFILE%LOPENED)  ) THEN
 !
 ! Compute the cartesian vertical flux of TKE in ZFLX
 !
-  ZFLX(:,:,:)   = - CSTURB%XCET * MZM(ZKEFF, D%NKA, D%NKU, D%NKL) *   &
-                  DZM(PIMPL * ZRES + PEXPL * PTKEM, D%NKA, D%NKU, D%NKL) / PDZZ
+  ZMWORK1 = MZM(ZKEFF, D%NKA, D%NKU, D%NKL)
+  ZDWORK1 = DZM(PIMPL * ZRES + PEXPL * PTKEM, D%NKA, D%NKU, D%NKL)
+  DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+  ZFLX(JI,JJ,JK)  = - CSTURB%XCET * ZMWORK1(JI,JJ,JK) * ZDWORK1(JI,JJ,JK) / PDZZ(JI,JJ,JK)
+    ENDDO
+ ENDDO
+ENDDO
 !
   ZFLX(:,:,IKB) = 0.
   ZFLX(:,:,D%NKA) = 0.
 !
 ! Compute the whole turbulent TRansport of TKE:
 !
-  ZTR(:,:,:)= ZTR - DZF(MZM(PRHODJ, D%NKA, D%NKU, D%NKL) * ZFLX / PDZZ, D%NKA, D%NKU, D%NKL) /PRHODJ
+  ZDWORK1 = DZF(MZM(PRHODJ, D%NKA, D%NKU, D%NKL) * ZFLX / PDZZ, D%NKA, D%NKU, D%NKL)
+  DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+  ZTR(JI,JJ,JK)= ZTR(JI,JJ,JK) - ZDWORK1(JI,JJ,JK) /PRHODJ(JI,JJ,JK)
+    ENDDO
+ ENDDO
+ENDDO
 !
 ! Storage in the LES configuration
 !
@@ -343,16 +401,28 @@ END IF
 
 !Store the previous source terms in prtkes before initializing the next one
 !Should be in IF LBUDGET_TKE only. Was removed out for a correct comput. of PTDIFF in case of LBUDGET_TKE=F in AROME
-PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) *                                                           &
-                ( PDP(:,:,:) + PTP(:,:,:)                                                                 &
-                  - CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) )
+DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+PRTKES(JI,JJ,JK) = PRTKES(JI,JJ,JK) + PRHODJ(JI,JJ,JK) *                                                           &
+                ( PDP(JI,JJ,JK) + PTP(JI,JJ,JK)                                                                 &
+                  - CSTURB%XCED * SQRT(PTKEM(JI,JJ,JK)) / PLEPS(JI,JJ,JK) * ( PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK) ) )
+!
+PTDIFF(JI,JJ,JK) =  ZRES(JI,JJ,JK) / PTSTEP - PRTKES(JI,JJ,JK)/PRHODJ(JI,JJ,JK) &
+ & - PDP(JI,JJ,JK)- PTP(JI,JJ,JK) - PTDISS(JI,JJ,JK)
+  ENDDO
+ ENDDO
+ENDDO
 !
-PTDIFF(:,:,:) =  ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) &
- & - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:)
-
 IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) )
 !
-PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP -  PRTKEMS(:,:,:)
+DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+PRTKES(JI,JJ,JK) = ZRES(JI,JJ,JK) * PRHODJ(JI,JJ,JK) / PTSTEP -  PRTKEMS(JI,JJ,JK)
+  ENDDO
+ ENDDO
+ENDDO
 !
 ! stores the whole turbulent transport
 !
@@ -363,16 +433,39 @@ IF (BUCONF%LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTK
 !*       3.   COMPUTE THE DISSIPATIVE HEATING
 !             -------------------------------
 !
-PRTHLS(:,:,:) = PRTHLS(:,:,:) + CSTURB%XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * &
-                (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:)
+DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+PRTHLS(JI,JJ,JK) = PRTHLS(JI,JJ,JK) + CSTURB%XCED * SQRT(PTKEM(JI,JJ,JK)) / PLEPS(JI,JJ,JK) * &
+                (PEXPL*PTKEM(JI,JJ,JK) + PIMPL*ZRES(JI,JJ,JK)) * PRHODJ(JI,JJ,JK) * PCOEF_DISS(JI,JJ,JK)
+  ENDDO
+ ENDDO
+ENDDO
 !----------------------------------------------------------------------------
 !
 !*       4.   STORES SOME DIAGNOSTICS
 !             -----------------------
 !
-IF(PRESENT(PDISS)) PDISS(:,:,:) =  -CSTURB%XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:)
 IF(PRESENT(PTR)) PTR=ZTR
-IF(PRESENT(PEDR)) PEDR = CSTURB%XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:)
+IF(PRESENT(PDISS)) THEN
+  DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+  PDISS(JI,JJ,JK) =  -CSTURB%XCED * (PTKEM(JI,JJ,JK)**1.5) / PLEPS(JI,JJ,JK)
+    ENDDO
+ ENDDO
+ENDDO
+END IF
+!
+IF(PRESENT(PEDR)) THEN
+  DO JK=1,D%NKT 
+ DO JJ=1,D%NJT 
+  DO JI=1,D%NIT 
+  PEDR(JI,JJ,JK) = CSTURB%XCED * (PTKEM(JI,JJ,JK)**1.5) / PLEPS(JI,JJ,JK)
+    ENDDO
+ ENDDO
+ENDDO
+END IF
 !
 IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN
 !
-- 
GitLab