From 03016b3ec72d128162d35973321baeb2f7bc966d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Wed, 28 Feb 2024 11:02:01 +0100
Subject: [PATCH] Philippe 28/02/2024: Lagrangian trajectories: small
 improvements/cleaning + respect DOCTOR norm

---
 src/MNH/compute_r00.f90    | 191 +++++++++++++++++--------------------
 src/MNH/modd_lagr_traj.f90 |   6 +-
 2 files changed, 90 insertions(+), 107 deletions(-)

diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90
index 3f37f874c..d2d12a3c2 100644
--- a/src/MNH/compute_r00.f90
+++ b/src/MNH/compute_r00.f90
@@ -6,6 +6,7 @@
 !###############################
 MODULE MODE_COMPUTE_R00
 ! ###############################
+  USE MODD_LAGR_TRAJ, ONLY: NLAGRFILEMAX
 
   IMPLICIT NONE
 
@@ -16,13 +17,9 @@ MODULE MODE_COMPUTE_R00
 
   REAL, PARAMETER :: NSPVAL = -1.E+11
 
-  INTEGER                 :: NFILES
-  INTEGER                 :: NNBR_START
-  INTEGER, DIMENSION(100) :: NBRFILES
-
-!PW:TODO: DOCTOR
-!PW: si JF=1: reprendre comportement orig DIAG
-
+  INTEGER                          :: NFILES
+  INTEGER                          :: NNBR_START
+  INTEGER, DIMENSION(NLAGRFILEMAX) :: NBRFILES
 
 CONTAINS
 
@@ -40,12 +37,6 @@ SUBROUTINE INI_COMPUTE_R00()
 
   INTEGER :: IFILECUR, JFILECUR
   INTEGER :: JLOOP
-  INTEGER :: JF
-
-  JF=1
-  DO WHILE (LEN_TRIM(CFILES(JF))/=0)
-    JF=JF+1
-  END DO
 !
 !
 !*       2.0    FIND THE FILE TO BE TREATED AND THE INIT-SV FILES
@@ -53,7 +44,7 @@ SUBROUTINE INI_COMPUTE_R00()
 !
 ! Search the number of the file to be treated
   IFILECUR=0
-  DO JFILECUR=1,100
+  DO JFILECUR = 1, NLAGRFILEMAX
     IF (CINIFILE==CFILES(JFILECUR)) THEN
       IFILECUR=JFILECUR
       EXIT
@@ -64,7 +55,7 @@ SUBROUTINE INI_COMPUTE_R00()
   ! Search the number of the files(NFILES), where the Lagrangian tracers
   !have been reinitialized
   NFILES=0
-  DO JFILECUR=IFILECUR,100
+  DO JFILECUR = IFILECUR, NLAGRFILEMAX
     IF (LEN_TRIM(CFILES(JFILECUR)) /= 0) THEN
       NFILES= NFILES +1
       NBRFILES(NFILES)=JFILECUR       ! contains the number of the files where
@@ -169,38 +160,33 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! Output file
 !
 !*       0.2   declarations of local variables
 !
-INTEGER                            :: NIU,NJU,NKU
-INTEGER                            :: JFILECUR
-INTEGER                            :: JLOOP
-REAL                               :: ZXOR,ZYOR,ZDX,ZDY
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZXI, ZYI, ZZI
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZX0, ZY0, ZZ0        ! origin of the 
-       ! particules colocated with the mesh-grid points read in the file
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZX00, ZY00, ZZ00, ZZL ! cumulative
-       ! origin for more than one restart of the tracers 
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZTH0, ZTHE0   ! same fields 
-       ! for Theta and ThetaE as for the coordinates of the origin
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZRV0, ZRH0    ! same fields
-       ! for Rv and RH as for the coordinates of the origin
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZRC0, ZRI0    ! same fields
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZU0, ZV0, ZW0 ! same fields
-REAL, ALLOCATABLE, DIMENSION(:,:,:,:):: ZCCN_FREE0, ZIFN_FREE0
-       ! for Rv as for the coordinates of the origin
-REAL, ALLOCATABLE, DIMENSION(:,:,:):: ZWORK1,ZWORK2,ZWORK3       
-TYPE(DATE_TIME)                    :: TDTCUR_START
-CHARACTER(LEN=NMNHNAMELGTMAX)      :: YMNHNAME
-CHARACTER(LEN=2)                   :: INDICE
-LOGICAL                            :: GLFI, GNC4
-LOGICAL                            :: GSTART
-INTEGER                            :: JI,JJ,JK,JSV,ISV ! loop index
-REAL                               :: ZXMAX,ZYMAX,ZZMAX  ! domain extrema
-REAL                               :: XFILLVALUE =  9.9692099683868690e+36
-TYPE(TFIELDMETADATA)               :: TZFIELD
-TYPE(TFIELDMETADATA)               :: TZFIELD_X0, TZFIELD_Y0, TZFIELD_Z0
-TYPE(TFIELDMETADATA)               :: TZFIELD_U0, TZFIELD_V0, TZFIELD_W0
-TYPE(TFIELDMETADATA)               :: TZFIELD_TH0, TZFIELD_RV0, TZFIELD_RH0, TZFIELD_THE0
-TYPE(TFIELDMETADATA)               :: TZFIELD_RC0, TZFIELD_RI0
-TYPE(TFILEDATA),POINTER            :: TZTRACFILE
+INTEGER                               :: IIU, IJU, IKU
+INTEGER                               :: JFILECUR
+INTEGER                               :: JLOOP
+REAL                                  :: ZXOR,ZYOR,ZDX,ZDY
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZXI, ZYI, ZZI
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZX0, ZY0, ZZ0         ! origin of the particles colocated with the mesh-grid points
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZX00, ZY00, ZZ00, ZZL ! cumulative origin for more than one restart of the tracers
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZTH0, ZTHE0           ! same fields for Theta and ThetaE as for the coords of the origin
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZRV0, ZRH0            ! same fields for Rv and RH as for the coordinates of the origin
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZRC0, ZRI0
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZU0, ZV0, ZW0
+REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: ZCCN_FREE0, ZIFN_FREE0
+REAL, ALLOCATABLE, DIMENSION(:,:,:)   :: ZWORK1,ZWORK2,ZWORK3
+TYPE(DATE_TIME)                       :: TDTCUR_START
+CHARACTER(LEN=NMNHNAMELGTMAX)         :: YMNHNAME
+CHARACTER(LEN=2)                      :: YIDX
+LOGICAL                               :: GLFI, GNC4
+LOGICAL                               :: GSTART
+INTEGER                               :: JI, JJ, JSV, ISV ! loop index
+REAL                                  :: ZXMAX,ZYMAX,ZZMAX  ! domain extrema
+REAL                                  :: XFILLVALUE =  9.9692099683868690e+36
+TYPE(TFIELDMETADATA)                  :: TZFIELD
+TYPE(TFIELDMETADATA)                  :: TZFIELD_X0, TZFIELD_Y0, TZFIELD_Z0
+TYPE(TFIELDMETADATA)                  :: TZFIELD_U0, TZFIELD_V0, TZFIELD_W0
+TYPE(TFIELDMETADATA)                  :: TZFIELD_TH0, TZFIELD_RV0, TZFIELD_RH0, TZFIELD_THE0
+TYPE(TFIELDMETADATA)                  :: TZFIELD_RC0, TZFIELD_RI0
+TYPE(TFILEDATA),POINTER               :: TZTRACFILE
 !
 !-------------------------------------------------------------------------------
 
@@ -218,52 +204,53 @@ TZTRACFILE => NULL()
 !               -----------------------------------------
 !
 !
-NIU=SIZE(XZZ,1)
-NJU=SIZE(XZZ,2)
-NKU=SIZE(XZZ,3)
-!
-ALLOCATE(ZXI(NIU,NJU,NKU))
-ALLOCATE(ZYI(NIU,NJU,NKU))
-ALLOCATE(ZZI(NIU,NJU,NKU))
-ALLOCATE(ZX0(NIU,NJU,NKU))
-ALLOCATE(ZY0(NIU,NJU,NKU))
-ALLOCATE(ZZ0(NIU,NJU,NKU))
-ALLOCATE(ZWORK1(NIU,NJU,NKU))
-ALLOCATE(ZWORK2(NIU,NJU,NKU))
-ALLOCATE(ZWORK3(NIU,NJU,NKU))
-ALLOCATE(ZX00(NIU,NJU,NKU))
-ALLOCATE(ZY00(NIU,NJU,NKU))
-ALLOCATE(ZZ00(NIU,NJU,NKU))
-ALLOCATE(ZZL(NIU,NJU,NKU))
-ALLOCATE(ZTH0(NIU,NJU,NKU))
-ALLOCATE(ZU0(NIU,NJU,NKU))
-ALLOCATE(ZV0(NIU,NJU,NKU))
-ALLOCATE(ZW0(NIU,NJU,NKU))
+IIU=SIZE(XZZ,1)
+IJU=SIZE(XZZ,2)
+IKU=SIZE(XZZ,3)
+!
+ALLOCATE(ZXI(IIU,IJU,IKU))
+ALLOCATE(ZYI(IIU,IJU,IKU))
+ALLOCATE(ZZI(IIU,IJU,IKU))
+ALLOCATE(ZX0(IIU,IJU,IKU))
+ALLOCATE(ZY0(IIU,IJU,IKU))
+ALLOCATE(ZZ0(IIU,IJU,IKU))
+ALLOCATE(ZWORK1(IIU,IJU,IKU))
+ALLOCATE(ZWORK2(IIU,IJU,IKU))
+ALLOCATE(ZWORK3(IIU,IJU,IKU))
+ALLOCATE(ZX00(IIU,IJU,IKU))
+ALLOCATE(ZY00(IIU,IJU,IKU))
+ALLOCATE(ZZ00(IIU,IJU,IKU))
+ALLOCATE(ZZL(IIU,IJU,IKU))
+ALLOCATE(ZTH0(IIU,IJU,IKU))
+ALLOCATE(ZU0(IIU,IJU,IKU))
+ALLOCATE(ZV0(IIU,IJU,IKU))
+ALLOCATE(ZW0(IIU,IJU,IKU))
 IF (LUSERV) THEN
-  ALLOCATE(ZRV0(NIU,NJU,NKU))
-  ALLOCATE(ZRH0(NIU,NJU,NKU))
-  ALLOCATE(ZTHE0(NIU,NJU,NKU))
+  ALLOCATE(ZRV0(IIU,IJU,IKU))
+  ALLOCATE(ZRH0(IIU,IJU,IKU))
+  ALLOCATE(ZTHE0(IIU,IJU,IKU))
 END IF
-IF (LUSERC) ALLOCATE(ZRC0(NIU,NJU,NKU))
-IF (LUSERI) ALLOCATE(ZRI0(NIU,NJU,NKU))
+IF (LUSERC) ALLOCATE(ZRC0(IIU,IJU,IKU))
+IF (LUSERI) ALLOCATE(ZRI0(IIU,IJU,IKU))
 IF (CCLOUD == 'LIMA') THEN
-  ALLOCATE(ZCCN_FREE0(NIU,NJU,NKU,NMOD_CCN))
-  ALLOCATE(ZIFN_FREE0(NIU,NJU,NKU,NMOD_IFN))
+  ALLOCATE(ZCCN_FREE0(IIU,IJU,IKU,NMOD_CCN))
+  ALLOCATE(ZIFN_FREE0(IIU,IJU,IKU,NMOD_IFN))
 END IF
 
 ALLOCATE( TLAGR_DATES(NTRAJSTLG) )
 
 ! initial values
 !PW:BUG+TODO?: ne tient pas compte de JPHEXT! + utiliser XXHATM ET XDXHAT plutot que XXHAT?
+!PW:BUG+TODO?:  ne tient pas compte de JPHEXT! + utiliser XXHATM ET XDXHAT plutot que XXHAT?
 ZXOR=0.5 * (XXHAT(2)+XXHAT(3)) 
 ZYOR=0.5 * (XYHAT(2)+XYHAT(3))
 ZDX= XXHAT(3)-XXHAT(2)
 ZDY= XYHAT(3)-XYHAT(2)
 ZZL=MZF(XZZ)
-ZZL(:,:,NKU)=2*XZZ(:,:,NKU)-ZZL(:,:,NKU-1)
-ZXMAX=ZXOR+(NIU-3)*ZDX
-ZYMAX=ZYOR+(NJU-3)*ZDY
-ZZMAX=ZZL(2,2,NKU-1)
+ZZL(:,:,IKU)=2*XZZ(:,:,IKU)-ZZL(:,:,IKU-1)
+ZXMAX=ZXOR+(IIU-3)*ZDX
+ZYMAX=ZYOR+(IJU-3)*ZDY
+ZZMAX=ZZL(2,2,IKU-1)
 !  conversion from km to meters
 ZXOR=ZXOR*1.E-3
 ZYOR=ZYOR*1.E-3
@@ -278,25 +265,21 @@ ZX00(:,:,:)=XSVT(:,:,:,NSV_LGBEG)*1.E-3   ! ZX0 in km
 ZY00(:,:,:)=XSVT(:,:,:,NSV_LGBEG+1)*1.E-3 ! ZY0 in km
 ZZ00(:,:,:)=XSVT(:,:,:,NSV_LGEND)*1.E-3   ! ZZ0 in km
 !
-DO JK=1,NKU
-  DO JJ=1,NJU
-    DO JI=1,NIU-1
-      ZXI(JI,JJ,JK)=0.5*(XXHAT(JI)+XXHAT(JI+1))
-    END DO
-    ZXI(NIU,JJ,JK)=2.*ZXI(NIU-1,JJ,JK)-ZXI(NIU-2,JJ,JK)
+DO JJ = 1, IJU
+  DO JI = 1, IIU-1
+    ZXI(JI,JJ,:) = 0.5 * ( XXHAT(JI) + XXHAT(JI+1) )
   END DO
+  ZXI(IIU,JJ,:) = 2. * ZXI(IIU-1,JJ,:) - ZXI(IIU-2,JJ,:)
 END DO
-ZXI=ZXI*1.E-3
+ZXI(:,:,:) = ZXI(:,:,:) * 1.E-3
 !
-DO JK=1,NKU
-  DO JI=1,NIU
-    DO JJ=1,NJU-1
-      ZYI(JI,JJ,JK)=0.5*(XYHAT(JJ)+XYHAT(JJ+1))
-    END DO
-    ZYI(JI,NJU,JK)=2.*ZYI(JI,NJU-1,JK)-ZYI(JI,NJU-2,JK)
+DO JI=1,IIU
+  DO JJ=1,IJU-1
+    ZYI(JI,JJ,:)= 0.5 * ( XYHAT(JJ) + XYHAT(JJ+1) )
   END DO
+  ZYI(JI,IJU,:) = 2. * ZYI(JI,IJU-1,:) - ZYI(JI,IJU-2,:)
 END DO
-ZYI=ZYI*1.E-3
+ZYI(:,:,:) = ZYI(:,:,:) * 1.E-3
 !
 IF (L2D) THEN
   WHERE ( ZX00<ZXOR .OR. ZX00>ZXMAX .OR. &
@@ -563,13 +546,11 @@ DO JFILECUR=1,NFILES
         TZFIELD = TSVLIST(JSV)
         IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
           ISV=JSV - NSV_LIMA_CCN_FREE + 1
-          WRITE(INDICE,'(I2.2)')(ISV)
           CALL IO_Field_read(TZTRACFILE,TZFIELD,ZCCN_FREE0(:,:,:,ISV))
           ZCCN_FREE0(:,:,:,ISV)=ZCCN_FREE0(:,:,:,ISV)*1.E-6*XRHODREF(:,:,:) ! in cm-3
         END IF
         IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
           ISV=JSV - NSV_LIMA_IFN_FREE + 1
-          WRITE(INDICE,'(I2.2)')(ISV)
           CALL IO_Field_read(TZTRACFILE,TZFIELD,ZIFN_FREE0(:,:,:,ISV))
           ZIFN_FREE0(:,:,:,ISV)=ZIFN_FREE0(:,:,:,ISV)*1.E-6*XRHODREF(:,:,:) ! in cm-3
         END IF
@@ -697,8 +678,8 @@ DO JFILECUR=1,NFILES
           CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZCCN_FREE0(:,:,:,JSV),ZWORK1)
         END IF
         WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
-        WRITE(INDICE,'(I2.2)')(JSV)
-        YMNHNAME = TRIM(CLIMA_WARM_CONC(3))//INDICE
+        WRITE(YIDX,'(I2.2)')(JSV)
+        YMNHNAME = TRIM(CLIMA_WARM_CONC(3))//YIDX
         TZFIELD = TFIELDMETADATA(                       &
           CMNHNAME   = TRIM(YMNHNAME)//'_TRAJ',         &
           CSTDNAME   = '',                              &
@@ -720,8 +701,8 @@ DO JFILECUR=1,NFILES
           CALL INTERPXYZ(ZX00,ZY00,ZZ00,ZIFN_FREE0(:,:,:,JSV),ZWORK1)
         END IF
         WHERE(ZWORK1<0.) ZWORK1=XFILLVALUE
-        WRITE(INDICE,'(I2.2)')(JSV)
-        YMNHNAME = TRIM(CLIMA_COLD_CONC(5))//INDICE
+        WRITE(YIDX,'(I2.2)')(JSV)
+        YMNHNAME = TRIM(CLIMA_COLD_CONC(5))//YIDX
         TZFIELD = TFIELDMETADATA(                       &
           CMNHNAME   = TRIM(YMNHNAME)//'_TRAJ',         &
           CSTDNAME   = '',                              &
@@ -845,9 +826,9 @@ LOGICAL  :: GEXT
 !
 !-------------------------------------------------------------------------------
 !
-DO JK=1,NKU
-  DO JJ=1,NJU
-    DO JI=1,NIU
+DO JK=1,IKU
+  DO JJ=1,IJU
+    DO JI=1,IIU
       !
       ZX=PX(JI,JJ,JK) 
       ZY=PY(JI,JJ,JK)
@@ -882,13 +863,13 @@ DO JK=1,NKU
       ZEPS2=ZYREL-REAL(IJ)
       IF (L2D) ZEPS2=0.
       !
-      DO JKK=1,NKU
+      DO JKK=1,IKU
         ZZLXY(JKK)=ZEPS2*(ZEPS1*(ZZL(II+1,IJ+1,JKK))+(1-ZEPS1)*(ZZL(II,IJ+1,JKK)))     &
              + (1-ZEPS2)*(ZEPS1*(ZZL(II+1,IJ,JKK))+(1-ZEPS1)*(ZZL(II,IJ,JKK)))
       ENDDO
       !
       IK=999
-      DO JKK=2,NKU
+      DO JKK=2,IKU
         IF (ZZLXY(JKK).GE.ZZ) THEN
           IK=JKK-1
           EXIT 
@@ -898,7 +879,7 @@ DO JK=1,NKU
       IF (IK==999) THEN
         PRINT*,'PROBLEM AT POINT',II,IJ
         PRINT*,'XREL, YREL, Z =',ZXREL,ZYREL,ZZ
-        PRINT*,'ZZLXY(NKU)',ZZLXY(NKU)
+        PRINT*,'ZZLXY(NKU)',ZZLXY(IKU)
 !callabortstop
         CALL PRINT_MSG(NVERB_FATAL,'GEN','COMPUTE_R00','')
       END IF 
diff --git a/src/MNH/modd_lagr_traj.f90 b/src/MNH/modd_lagr_traj.f90
index d37815a19..04a1563c5 100644
--- a/src/MNH/modd_lagr_traj.f90
+++ b/src/MNH/modd_lagr_traj.f90
@@ -16,8 +16,10 @@ USE MODD_TYPE_DATE,  ONLY: DATE_TIME
 
 SAVE
 
-CHARACTER(LEN=NFILENAMELGTMAX) :: CFILES(100)      ! names of the files to be treated
-INTEGER                        :: NSTART_SUPP(100) ! supplementary starts for the lagrangian trajectories
+INTEGER, PARAMETER :: NLAGRFILEMAX = 100 ! Maximum number of files to be treated for Lagrangian trajectories
+
+CHARACTER(LEN=NFILENAMELGTMAX) :: CFILES(NLAGRFILEMAX)      ! names of the files to be treated
+INTEGER                        :: NSTART_SUPP(NLAGRFILEMAX) ! supplementary starts for the Lagrangian trajectories
 
 INTEGER                                    :: NTRAJSTLG = 0 ! Number of time starts for Lagrangian trajectories
 TYPE(DATE_TIME), DIMENSION(:), ALLOCATABLE :: TLAGR_DATES   ! Times for Lagrangian trajectories
-- 
GitLab