From f9e34ad23c15430ec4714a3eadcd896b28df6728 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 28 Aug 2020 13:11:07 +0200
Subject: [PATCH] Philippe 28/08/2020: budgets: LES_Z_NORM: use 4D arrays
 instead of 6D and modify order of dimensions

---
 src/MNH/mode_les_diachro.f90 | 76 ++++++++++++++++++------------------
 1 file changed, 38 insertions(+), 38 deletions(-)

diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index e681a460c..4b9437a40 100644
--- a/src/MNH/mode_les_diachro.f90
+++ b/src/MNH/mode_les_diachro.f90
@@ -278,10 +278,10 @@ END SUBROUTINE LES_NORM_4D
 !------------------------------------------------------------------------------
 !
 !###################################
-SUBROUTINE LES_Z_NORM(OAVG,PTRAJZ,PWORK6)
+SUBROUTINE LES_Z_NORM(OAVG,PTRAJZ,PWORK4)
 !###################################
 !
-!* this subroutine interpolates the normalized field PWORK6 to the
+!* this subroutine interpolates the normalized field PWORK4 to the
 !  vertical normalized coordinate.
 !
 USE MODD_LES
@@ -295,24 +295,21 @@ IMPLICIT NONE
 !
 LOGICAL,                      INTENT(IN)    :: OAVG   ! time average ?
 REAL, DIMENSION(:,:,:),       INTENT(INOUT) :: PTRAJZ ! vertical grid
-REAL, DIMENSION(:,:,:,:,:,:), INTENT(INOUT) :: PWORK6 ! field data array
+REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PWORK4 ! field data array
 !
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3))  :: ZTRAJZ
 ! initial grid
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3), &
-                   SIZE(PWORK6,1),SIZE(PWORK6,2),SIZE(PWORK6,6) ) :: ZWORK6
+REAL,    DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1),SIZE(PWORK4,3) ) :: ZWORK4
 ! initial data
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3))  :: ZNORMZ
+REAL,    DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1))  :: ZNORMZ
 ! grid in normalized coordinates
 !
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3), &
-                   SIZE(PWORK6,1),SIZE(PWORK6,2),SIZE(PWORK6,6) ) :: ZNORM6
+REAL,    DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1),SIZE(PWORK4,3) ) :: ZNORM4
 ! data interpolated on normalized vertical grid
 !
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3)+2*JPVEXT)  :: ZZ
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3)+2*JPVEXT)  :: ZW
-INTEGER, DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3))           :: IKLIN
-REAL,    DIMENSION(SIZE(PWORK6,4),SIZE(PWORK6,5),SIZE(PWORK6,3))           :: ZCOEFLIN
+REAL,    DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1)+2*JPVEXT)  :: ZZ
+REAL,    DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1)+2*JPVEXT)  :: ZW
+INTEGER, DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1))           :: IKLIN
+REAL,    DIMENSION(SIZE(PWORK4,2),SIZE(PWORK4,4),SIZE(PWORK4,1))           :: ZCOEFLIN
 !
 INTEGER :: JK, JT, JN, JP
 INTEGER :: ITEMP_MEAN_START, ITEMP_MEAN_END
@@ -339,17 +336,16 @@ END IF
 ZMAX_NORM_M = MAXVAL(ABS(XLES_NORM_M(ITEMP_MEAN_START:ITEMP_MEAN_END)))
 !
 IF (ZMAX_NORM_M<=0.) THEN
-  PWORK6(:,:,:,:,:,:) = XUNDEF
+  PWORK4(:,:,:,:) = XUNDEF
   RETURN
 END IF
 !
 !* moves K index in third position
 !
 DO JK=1,NLES_K
-  DO JN=1,SIZE(PWORK6,5)
-    DO JT=1,SIZE(PWORK6,4)
-      ZTRAJZ(JT,JN,JK) = PTRAJZ(JK,1,JN)
-      ZWORK6(JT,JN,JK,1,1,:) = PWORK6(1,1,JK,JT,JN,:)
+  DO JN=1,SIZE(PWORK4,4)
+    DO JT=1,SIZE(PWORK4,2)
+      ZWORK4(JT,JN,JK,:) = PWORK4(JK,JT,:,JN)
     END DO
   END DO
 END DO
@@ -357,9 +353,9 @@ END DO
 !* computes the stretching due to the use of a normalized grid
 !
 DO JK=1,NLES_K
-  DO JN=1,SIZE(PWORK6,5)
-    DO JT=1,SIZE(PWORK6,4)
-      ZNORMZ(JT,JN,JK) = (ZTRAJZ(JT,JN,JK)-XLES_CURRENT_ZS)/ZMAX_NORM_M * XLES_NORM_M(JT)  &
+  DO JN=1,SIZE(PWORK4,4)
+    DO JT=1,SIZE(PWORK4,2)
+      ZNORMZ(JT,JN,JK) = (xles_current_z(JK)-XLES_CURRENT_ZS)/ZMAX_NORM_M * XLES_NORM_M(JT)  &
                          + XLES_CURRENT_ZS
     END DO
   END DO
@@ -370,34 +366,38 @@ IF (NLES_K>1) THEN
 !
 !* computes the interpolation coefficients
 !
-  ZZ(:,:,JPVEXT+1:JPVEXT+NLES_K) = ZTRAJZ(:,:,:)
+  DO JN=1,SIZE(PWORK4,4)
+    DO JT=1,SIZE(PWORK4,2)
+      ZZ(JT,JN,JPVEXT+1:JPVEXT+NLES_K) = xles_current_z(:)
+    END DO
+  END DO
   DO JK=1,JPVEXT
-    ZZ(:,:,              JK) = ZTRAJZ(:,:,1)      - (ZTRAJZ(:,:,2)     -ZTRAJZ(:,:,1)       )*(JPVEXT+1-JK)
-    ZZ(:,:,NLES_K+JPVEXT+JK) = ZTRAJZ(:,:,NLES_K) + (ZTRAJZ(:,:,NLES_K)-ZTRAJZ(:,:,NLES_K-1))*          JK
+      ZZ(:,:,              JK) = xles_current_z(1)      - (xles_current_z(2)     -xles_current_z(1)       )*(JPVEXT+1-JK)
+      ZZ(:,:,NLES_K+JPVEXT+JK) = xles_current_z(NLES_K) + (xles_current_z(NLES_K)-xles_current_z(NLES_K-1))*          JK
   END DO
 
   CALL COEF_VER_INTERP_LIN(ZZ,ZNORMZ,IKLIN,ZCOEFLIN)
 !
 !* performs the interpolation
 !
-  DO JP=1,SIZE(PWORK6,6)
+  DO JP=1,SIZE(PWORK4,3)
     ZW = XUNDEF
-    ZW(:,:,JPVEXT+1:JPVEXT+NLES_K) = ZWORK6(:,:,:,1,1,JP)
-    ZNORM6(:,:,:,1,1,JP) = VER_INTERP_LIN(ZW,IKLIN,ZCOEFLIN)
+    ZW(:,:,JPVEXT+1:JPVEXT+NLES_K) = ZWORK4(:,:,:,JP)
+    ZNORM4(:,:,:,JP) = VER_INTERP_LIN(ZW,IKLIN,ZCOEFLIN)
   END DO
 !
 ELSE
-  ZNORM6 = ZWORK6
+  ZNORM4 = ZWORK4
 END IF
 !
 !* puts the normalized grid and data in diachro arrays
 !
 PTRAJZ(:,:,:) = (PTRAJZ(:,:,:)-XLES_CURRENT_ZS)/ZMAX_NORM_M
 !
-DO JN=1,SIZE(PWORK6,5)
-  DO JT=1,SIZE(PWORK6,4)
+DO JN=1,SIZE(PWORK4,4)
+  DO JT=1,SIZE(PWORK4,2)
     DO JK=1,NLES_K
-      PWORK6(1,1,JK,JT,JN,:) = ZNORM6(JT,JN,JK,1,1,:)
+      PWORK4(JK,JT,:,JN) = ZNORM4(JT,JN,JK,:)
     END DO
   END DO
 END DO
@@ -631,20 +631,20 @@ ycomment(:) = hcomment(:)
 yunit(:)    = hunit(:)
 ygroup      = hgroup
 
-do jsv = 1, size( pfield, 4 )
-  do jp = 1, size( pfield, 3 )
-    zwork6(1, 1, :, :, jsv, jp) = zfield (:, :, jp, jsv)
-  end do
-end do
-
 tzdates(:) = xles_dates(:)
 
 ! Normalization of vertical dimension
 if ( gnorm ) then
   if ( hunit(1:1) /= ' ') yunit = '1'
-  call Les_z_norm( gavg, ztrajz, zwork6 )
+  call Les_z_norm( gavg, ztrajz, zfield(:,:,:,:) )
 end if
 
+do jsv = 1, size( pfield, 4 )
+  do jp = 1, size( pfield, 3 )
+    zwork6(1, 1, :, :, jsv, jp) = zfield (:, :, jp, jsv)
+  end do
+end do
+
 ! Time average
 iresp = 0
 if ( gavg ) call Les_time_avg( zwork6, tzdates, iresp )
-- 
GitLab