From 0bce585c69590d1716e764b53068b6db95a5cd2b Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 17 Mar 2017 15:07:31 +0100
Subject: [PATCH] Philippe 17/03/2017: optimisation/simplification + small bug
 corrections

---
 src/MNH/rain_ice.f90 | 479 +++++++++++++------------------------------
 1 file changed, 145 insertions(+), 334 deletions(-)

diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90
index 54ce81608..d143f4fce 100644
--- a/src/MNH/rain_ice.f90
+++ b/src/MNH/rain_ice.f90
@@ -424,12 +424,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZCRIAUTI ! Snow-to-ice autoconversion thres.
 !
 REAL, DIMENSION(:), ALLOCATABLE &
                :: ZRHODREF, & ! RHO Dry REFerence
-                  ZRHODREFC,& ! RHO Dry REFerence
-                  ZRHODREFR,& ! RHO Dry REFerence
-                  ZRHODREFI,& ! RHO Dry REFerence
-                  ZRHODREFS,& ! RHO Dry REFerence
-                  ZRHODREFG,& ! RHO Dry REFerence
-                  ZRHODREFH,& ! RHO Dry REFerence
                   ZRHODJ,   & ! RHO times Jacobian
                   ZZT,      & ! Temperature
                   ZPRES,    & ! Pressure
@@ -450,13 +444,7 @@ REAL, DIMENSION(:), ALLOCATABLE &
                   ZKA,      & ! Thermal conductivity of the air
                   ZDV,      & ! Diffusivity of water vapor in the air
                   ZSIGMA_RC,& ! Standard deviation of rc at time t  
-                  ZCF,      & ! Cloud fraction
-                  ZCC,      & ! terminal velocity
-                  ZFSEDC1D, & ! For cloud sedimentation
-                  ZWLBDC,   & ! Slope parameter of the droplet  distribution
-                  ZCONC,    & ! Concentration des aerosols
-                  ZRAY1D,   & ! Mean radius
-                  ZWLBDA      ! Libre parcours moyen
+                  ZCF         ! Cloud fraction
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays
 REAL            :: ZTIMAUTIC, ZTHRC, ZTHRH
 REAL            :: ZINVTSTEP
@@ -473,12 +461,12 @@ INTEGER                           :: JL       ! and PACK intrinsics
 !$acc &              ZWSED,ZWSEDW1,ZWSEDW2,ZCONC_TMP,ZT,ZRAY,ZLBC,ZFSEDC,         &
 !$acc &              ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZRHT,ZCIT,                     &
 !$acc &              ZRVS,ZRCS,ZRRS,ZRIS,ZRSS,ZRGS,ZRHS,ZTHS,                     &
-!$acc &              ZRHODREF,ZRHODREFR,ZRHODREFI,ZRHODREFS,ZRHODREFG,ZRHODREFH,  &
+!$acc &              ZRHODREF,                                                    &
 !$acc &              ZRHODJ,ZZT,ZPRES,ZZW,ZLSFACT,ZLVFACT,                        &
 !$acc &              ZUSW,ZSSI,ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,                       &
 !$acc &              ZAI,ZCJ,ZKA,ZDV,ZZW1,ZRTMIN)                                 &
-!$acc &       device_resident(ZCRIAUTI,ZEXNREF,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF,ZCC,   &
-!$acc &                       ZFSEDC1D,ZWLBDC,ZCONC,ZRAY1D,ZWLBDA,I1,I2,I3)
+!$acc &       device_resident(ZCRIAUTI,ZEXNREF,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF,       &
+!$acc &                       I1,I2,I3)
 !
 #ifdef _OPENACC
 PRINT *,'OPENACC: RAIN_ICE being implemented'
@@ -493,7 +481,7 @@ END IF
 !-------------------------------------------------------------------------------
 !
 !*       1.     COMPUTE THE LOOP BOUNDS
-!   	        -----------------------
+!               -----------------------
 !
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKB=KKA+JPVEXT*KKL
@@ -507,7 +495,7 @@ ZINVTSTEP=1./PTSTEP
 !
 !
 !*       2.     COMPUTES THE SLOW COLD PROCESS SOURCES
-!   	        --------------------------------------
+!               --------------------------------------
 !
 CALL RAIN_ICE_NUCLEATION
 !
@@ -663,7 +651,7 @@ IF( IMICRO >= 0 ) THEN
 !
 !
 !*       3.     COMPUTES THE SLOW WARM PROCESS SOURCES
-!   	        --------------------------------------
+!               --------------------------------------
 !
 !*       3.1    compute the slope parameter Lbda_r
 !
@@ -949,27 +937,19 @@ INTEGER , DIMENSION(SIZE(GSEDIMS)) :: IS1,IS2,IS3 ! Used to replace the COUNT
 INTEGER , DIMENSION(SIZE(GSEDIMI)) :: II1,II2,II3 ! Used to replace the COUNT
 INTEGER , DIMENSION(SIZE(GSEDIMG)) :: IG1,IG2,IG3 ! Used to replace the COUNT
 INTEGER , DIMENSION(SIZE(GSEDIMH)) :: IH1,IH2,IH3 ! Used to replace the COUNT
-INTEGER   :: ILENALLOCC,ILENALLOCR,ILENALLOCI,ILENALLOCS,ILENALLOCG,ILENALLOCH
-INTEGER   :: ILISTLENC,ILISTLENR,ILISTLENI,ILISTLENS,ILISTLENG,ILISTLENH
-INTEGER, ALLOCATABLE :: ILISTR(:),ILISTC(:),ILISTI(:),ILISTS(:),ILISTG(:),ILISTH(:)
-! Optimization for NEC
-!INTEGER, SAVE :: IOLDALLOCC = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10
-!INTEGER, SAVE :: IOLDALLOCR = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10
-!INTEGER, SAVE :: IOLDALLOCI = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10
-!INTEGER, SAVE :: IOLDALLOCS = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10
-!INTEGER, SAVE :: IOLDALLOCG = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10
-!INTEGER, SAVE :: IOLDALLOCH = SIZE(PEXNREF,1)*SIZE(PEXNREF,2)*SIZE(PEXNREF,3)/10
-INTEGER, SAVE :: IOLDALLOCC = 6000
-INTEGER, SAVE :: IOLDALLOCR = 6000
-INTEGER, SAVE :: IOLDALLOCI = 6000
-INTEGER, SAVE :: IOLDALLOCS = 6000
-INTEGER, SAVE :: IOLDALLOCG = 6000
-INTEGER, SAVE :: IOLDALLOCH = 6000
-!
+REAL :: ZRHODREFLOC   ! RHO Dry REFerence
+REAL :: ZRSLOC,ZRTLOC ! Intermediary variables
+REAL :: ZWLBDC        ! Slope parameter of the droplet  distribution
+REAL :: ZCONC         ! Concentration of aerosols
+REAL :: ZZTLOC        ! Temperature
+REAL :: ZPRESLOC      ! Pressure
+REAL :: ZRAY1D        ! Mean radius
+REAL :: ZFSEDC1D      ! For cloud sedimentation
+REAL :: ZWLBDA        ! Mean freepath
+REAL :: ZCC           ! Terminal velocity
 REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D !  droplet condensation
 !$acc declare device_resident(IC1,IC2,IC3,IR1,IR2,IR3,IS1,IS2,IS3,       &
-!$acc &                       II1,II2,II3,IG1,IG2,IG3,IH1,IH2,IH3,       &
-!$acc &                       ILISTR,ILISTC,ILISTI,ILISTS,ILISTG,ILISTH) &
+!$acc &                       II1,II2,II3,IG1,IG2,IG3,IH1,IH2,IH3)       &
 !$acc &                create(ZCONC3D)
 !-------------------------------------------------------------------------------
 !
@@ -1030,13 +1010,6 @@ GSEDIMS(:,:,:) = .FALSE.
 GSEDIMG(:,:,:) = .FALSE.
 IF ( KRR == 7 ) GSEDIMH(:,:,:) = .FALSE.
 !
-ILENALLOCR = 0
-IF (OSEDIC) ILENALLOCC = 0
-ILENALLOCI = 0
-ILENALLOCS = 0
-ILENALLOCG = 0
-IF ( KRR == 7 ) ILENALLOCH = 0
-!
 ! ZPiS = Specie i source creating during the current time step
 ! PRiS = Source of the previous time step
 !
@@ -1107,77 +1080,46 @@ DO JN = 1 , KSPLITR
 !
 !*       2.1   for cloud
 !
-  IF (OSEDIC) THEN
 !$acc kernels
+  IF (OSEDIC) THEN
     ZWSED(:,:,:) = 0.
     IF( JN==1 ) PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP
-!$acc end kernels
-    IF( ISEDIMC >= 1 ) THEN
-      IF ( ISEDIMC .GT. ILENALLOCC ) THEN
-        IF ( ILENALLOCC .GT. 0 ) THEN
-          DEALLOCATE (ZRCS, ZRHODREFC, ILISTC,ZWLBDC,ZCONC,ZRCT,  &
-                      ZZT,ZPRES,ZRAY1D,ZFSEDC1D,ZWLBDA,ZCC )
-        END IF
-        ILENALLOCC = MAX (IOLDALLOCC, 2*ISEDIMC )
-        IOLDALLOCC = ILENALLOCC
-        ALLOCATE(ZRCS(ILENALLOCC), ZRHODREFC(ILENALLOCC), ILISTC(ILENALLOCC), &
-          ZWLBDC(ILENALLOCC), ZCONC(ILENALLOCC), ZRCT(ILENALLOCC), ZZT(ILENALLOCC), &
-          ZPRES(ILENALLOCC), ZRAY1D(ILENALLOCC), ZFSEDC1D(ILENALLOCC), &
-          ZWLBDA(ILENALLOCC), ZCC(ILENALLOCC)  )
-      END IF
-!
-!$acc kernels
-      DO JL=1,ISEDIMC
-        ZRCS(JL) = PRCS(IC1(JL),IC2(JL),IC3(JL))
-        ZRHODREFC(JL) =  PRHODREF(IC1(JL),IC2(JL),IC3(JL))
-        ZWLBDC(JL) = ZLBC(IC1(JL),IC2(JL),IC3(JL))
-        ZCONC(JL) = ZCONC3D(IC1(JL),IC2(JL),IC3(JL))
-        ZRCT(JL) = PRCT(IC1(JL),IC2(JL),IC3(JL))
-        ZZT(JL) = PTHT(IC1(JL),IC2(JL),IC3(JL))
-        ZPRES(JL) = PPABST(IC1(JL),IC2(JL),IC3(JL))
-        ZRAY1D(JL) = ZRAY(IC1(JL),IC2(JL),IC3(JL))
-        ZFSEDC1D(JL) = ZFSEDC(IC1(JL),IC2(JL),IC3(JL))
-      END DO
-!
-      ILISTLENC = 0
-      DO JL=1,ISEDIMC
-        IF( ZRCS(JL) .GT. ZRTMIN(2) ) THEN
-          ILISTLENC = ILISTLENC + 1
-          ILISTC(ILISTLENC) = JL
-        END IF
-      END DO
-!$acc end kernels
 !
-!$acc kernels
-      DO JJ = 1, ILISTLENC
-        JL = ILISTC(JJ)
-        IF (ZRCS(JL) .GT. ZRTMIN(2) .AND. ZRCT(JL) .GT. XRTMIN(2)) THEN
-          ZWLBDC(JL) = ZWLBDC(JL) * ZCONC(JL) / (ZRHODREFC(JL) * ZRCT(JL))
+    DO JL=1,ISEDIMC
+      ZRSLOC = PRCS(IC1(JL),IC2(JL),IC3(JL))
+      ZRTLOC = PRCT(IC1(JL),IC2(JL),IC3(JL))
+      IF (ZRSLOC .GT. ZRTMIN(2) .AND. ZRTLOC .GT. XRTMIN(2)) THEN
+        ZRHODREFLOC = PRHODREF(IC1(JL),IC2(JL),IC3(JL))
+        ZWLBDC      = ZLBC    (IC1(JL),IC2(JL),IC3(JL))
+        ZCONC       = ZCONC3D (IC1(JL),IC2(JL),IC3(JL))
+        ZZTLOC      = PTHT    (IC1(JL),IC2(JL),IC3(JL))
+        ZPRESLOC    = PPABST  (IC1(JL),IC2(JL),IC3(JL))
+        ZRAY1D      = ZRAY    (IC1(JL),IC2(JL),IC3(JL))
+        ZFSEDC1D    = ZFSEDC  (IC1(JL),IC2(JL),IC3(JL))
+        ZWLBDC = ZWLBDC * ZCONC / (ZRHODREFLOC * ZRTLOC)
 #ifndef MNH_BITREP
-          ZWLBDC(JL) = ZWLBDC(JL)**XLBEXC
+        ZWLBDC = ZWLBDC**XLBEXC
 #else
-          ZWLBDC(JL) = BR_POW(ZWLBDC(JL),XLBEXC)
+        ZWLBDC = BR_POW(ZWLBDC,XLBEXC)
 #endif
-          ZRAY1D(JL) = ZRAY1D(JL) / ZWLBDC(JL) !! ZRAY : mean diameter=M(1)/2
+        ZRAY1D = ZRAY1D / ZWLBDC !! ZRAY : mean diameter=M(1)/2
 #ifndef MNH_BITREP
-          ZZT(JL)    = ZZT(JL) * (ZPRES(JL)/XP00)**(XRD/XCPD)
+        ZZTLOC = ZZTLOC * (ZPRESLOC/XP00)**(XRD/XCPD)
 #else
-          ZZT(JL)    = ZZT(JL) * BR_POW(ZPRES(JL)/XP00,XRD/XCPD)
+        ZZTLOC = ZZTLOC * BR_POW(ZPRESLOC/XP00,XRD/XCPD)
 #endif
-          ZWLBDA(JL) = 6.6E-8*(101325./ZPRES(JL))*(ZZT(JL)/293.15)
-          ZCC(JL)    = XCC*(1.+1.26*ZWLBDA(JL)/ZRAY1D(JL)) !! XCC modified for cloud
+        ZWLBDA = 6.6E-8*(101325./ZPRESLOC)*(ZZTLOC/293.15)
+        ZCC    = XCC*(1.+1.26*ZWLBDA/ZRAY1D) !! XCC modified for cloud
 #ifndef MNH_BITREP
-          ZWSED (IC1(JL),IC2(JL),IC3(JL))= ZRHODREFC(JL)**(-XCEXVT +1 ) *   &
-              ZWLBDC(JL)**(-XDC)*ZCC(JL)*ZFSEDC1D(JL) * ZRCS(JL)
+        ZWSED (IC1(JL),IC2(JL),IC3(JL))= ZRHODREFLOC**(-XCEXVT +1 ) *   &
+                                         ZWLBDC**(-XDC)*ZCC*ZFSEDC1D * ZRSLOC
 #else
-          ZWSED (IC1(JL),IC2(JL),IC3(JL))= BR_POW(ZRHODREFC(JL),-XCEXVT +1) *   &
-              BR_POW(ZWLBDC(JL),-XDC)*ZCC(JL)*ZFSEDC1D(JL) * ZRCS(JL)
+        ZWSED (IC1(JL),IC2(JL),IC3(JL))= BR_POW(ZRHODREFLOC,-XCEXVT +1) *   &
+                                         BR_POW(ZWLBDC,-XDC)*ZCC*ZFSEDC1D * ZRSLOC
 #endif
-        END IF
-      END DO
-!$acc end kernels
-    END IF
-!$acc kernels
+      END IF
+    END DO
+!
     DO JK = IKTB , IKTE
       PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
     END DO
@@ -1185,280 +1127,159 @@ DO JN = 1 , KSPLITR
     IF( JN==KSPLITR ) THEN
       PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP
     END IF
-!$acc end kernels
   END IF
+!acc end kernels
 !
 !*       2.2   for rain
 !
-!$acc kernels
+!acc kernels
   IF( JN==1 ) PRRS(:,:,:) = PRRS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
-!$acc end kernels
-  IF( ISEDIMR >= 1 ) THEN
-    IF ( ISEDIMR .GT. ILENALLOCR ) THEN
-      IF ( ILENALLOCR .GT. 0 ) THEN
-        DEALLOCATE (ZRRS, ZRHODREFR, ILISTR)
-      END IF
-      ILENALLOCR = MAX (IOLDALLOCR, 2*ISEDIMR )
-      IOLDALLOCR = ILENALLOCR
-      ALLOCATE(ZRRS(ILENALLOCR), ZRHODREFR(ILENALLOCR), ILISTR(ILENALLOCR))
-    END IF
-!
-!acc kernels present(PRRS,PRHODREF,ZRTMIN,ILISTR,ZWSED,IR1,IR2,IR3,ZRRS,ZRHODREFR) copyin(XEXSEDR) default(none)
-!$acc kernels
-    DO JL=1,ISEDIMR
-      ZRRS(JL) = PRRS(IR1(JL),IR2(JL),IR3(JL))
-      ZRHODREFR(JL) =  PRHODREF(IR1(JL),IR2(JL),IR3(JL))
-    END DO
 !
-    ILISTLENR = 0
-    DO JL=1,ISEDIMR
-      IF( ZRRS(JL) .GT. ZRTMIN(3) ) THEN
-        ILISTLENR = ILISTLENR + 1
-        ILISTR(ILISTLENR) = JL
-      END IF
-    END DO
-!$acc end kernels
-!$acc kernels present(ILISTR,ZWSED,IR1,IR2,IR3,ZRRS,ZRHODREFR) copyin(XEXSEDR) default(none)
-    DO JJ = 1, ILISTLENR
-      JL = ILISTR(JJ)
+  DO JL=1,ISEDIMR
+    ZRSLOC = PRRS(IR1(JL),IR2(JL),IR3(JL))
+    IF( ZRSLOC .GT. ZRTMIN(3) ) THEN
+      ZRHODREFLOC = PRHODREF(IR1(JL),IR2(JL),IR3(JL))
 #ifndef MNH_BITREP
-      ZWSED (IR1(JL),IR2(JL),IR3(JL))= XFSEDR  * ZRRS(JL)**XEXSEDR *   &
-                                       ZRHODREFR(JL)**(XEXSEDR-XCEXVT)
+      ZWSED (IR1(JL),IR2(JL),IR3(JL))= XFSEDR  * ZRSLOC**XEXSEDR *   &
+                                       ZRHODREFLOC**(XEXSEDR-XCEXVT)
 #else
-      ZWSED (IR1(JL),IR2(JL),IR3(JL))= XFSEDR  * BR_POW(ZRRS(JL),XEXSEDR) *   &
-                                       BR_POW(ZRHODREFR(JL),XEXSEDR-XCEXVT)
+      ZWSED (IR1(JL),IR2(JL),IR3(JL))= XFSEDR  * BR_POW(ZRSLOC,XEXSEDR) *   &
+                                       BR_POW(ZRHODREFLOC,XEXSEDR-XCEXVT)
 #endif
-    END DO
-!$acc end kernels
-  END IF
-!$acc kernels
+    END IF
+  END DO
+!
   DO JK = IKTB , IKTE
     PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
   END DO
-  PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR
+  PINPRR(:,:)     = PINPRR(:,:)     + ZWSED(:,:,IKB)  /XRHOLW/KSPLITR
   PINPRR3D(:,:,:) = PINPRR3D(:,:,:) + ZWSED(:,:,1:IKT)/XRHOLW/KSPLITR 
   IF ( JN==KSPLITR ) THEN
     PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP
   END IF
-!$acc end kernels
+!acc end kernels
 !
 !*       2.3   for pristine ice
 !
-!$acc kernels
+!acc kernels
   IF( JN==1 ) PRIS(:,:,:) = PRIS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
-!$acc end kernels
-  IF( ISEDIMI >= 1 ) THEN
-    IF ( ISEDIMI .GT. ILENALLOCI ) THEN
-      IF ( ILENALLOCI .GT. 0 ) THEN
-        DEALLOCATE (ZRIS, ZRHODREFI, ILISTI)
-      END IF
-      ILENALLOCI = MAX (IOLDALLOCI, 2*ISEDIMI )
-      IOLDALLOCI = ILENALLOCI
-      ALLOCATE(ZRIS(ILENALLOCI), ZRHODREFI(ILENALLOCI), ILISTI(ILENALLOCI))
-    END IF
 !
-!$acc kernels
-    DO JL=1,ISEDIMI
-      ZRIS(JL) = PRIS(II1(JL),II2(JL),II3(JL))
-      ZRHODREFI(JL) =  PRHODREF(II1(JL),II2(JL),II3(JL))
-    END DO
-!
-    ILISTLENI = 0
-    DO JL=1,ISEDIMI
-     IF( ZRIS(JL) .GT.  MAX(ZRTMIN(4),1.0E-7 )) THEN ! limitation of the McF&H formula
-       ILISTLENI = ILISTLENI + 1
-       ILISTI(ILISTLENI) = JL
-     END IF
-    END DO
-!$acc end kernels
-!$acc kernels
-       DO JJ = 1, ILISTLENI
-          JL = ILISTI(JJ)
+  DO JL=1,ISEDIMI
+    ZRSLOC = PRIS(II1(JL),II2(JL),II3(JL))
+    IF( ZRSLOC .GT.  MAX(ZRTMIN(4),1.0E-7 )) THEN ! limitation of the McF&H formula
+      ZRHODREFLOC = PRHODREF(II1(JL),II2(JL),II3(JL))
 #ifndef MNH_BITREP
-              ZWSED (II1(JL),II2(JL),II3(JL))= XFSEDI * ZRIS(JL) *  &
-                               ZRHODREFI(JL)**(1.0-XCEXVT) * & !    McF&H
-                               MAX( 0.05E6,-0.15319E6-0.021454E6* &
-                               ALOG(ZRHODREFI(JL)*ZRIS(JL)) )**XEXCSEDI
+      ZWSED (II1(JL),II2(JL),II3(JL))= XFSEDI * ZRSLOC *  &
+                                       ZRHODREFLOC**(1.0-XCEXVT) * & !    McF&H
+                                       MAX( 0.05E6,-0.15319E6-0.021454E6* &
+                                       ALOG(ZRHODREFLOC*ZRSLOC) )**XEXCSEDI
 #else
-              ZWSED (II1(JL),II2(JL),II3(JL))= XFSEDI * ZRIS(JL) *  &
-                               BR_POW(ZRHODREFI(JL),1.0-XCEXVT) * & !    McF&H
-                               BR_POW(MAX( 0.05E6,-0.15319E6-0.021454E6* &
-                               BR_LOG(ZRHODREFI(JL)*ZRIS(JL)) ),XEXCSEDI)
+      ZWSED (II1(JL),II2(JL),II3(JL))= XFSEDI * ZRSLOC *  &
+                                       BR_POW(ZRHODREFLOC,1.0-XCEXVT) * & !    McF&H
+                                       BR_POW(MAX( 0.05E6,-0.15319E6-0.021454E6* &
+                                       BR_LOG(ZRHODREFLOC*ZRSLOC) ),XEXCSEDI)
 #endif
-       END DO
-!$acc end kernels
+    END IF
+  END DO
+!
+  DO JK = IKTB , IKTE
+    PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  IF( JN==KSPLITR ) THEN
+    PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP
   END IF
-!$acc kernels
-       DO JK = IKTB , IKTE
-         PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-      IF( JN==KSPLITR ) THEN
-        PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
+!acc end kernels
 !
 !*       2.4   for aggregates/snow
 !
-!$acc kernels
+!acc kernels
   IF( JN==1 ) PRSS(:,:,:) = PRSS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
-!$acc end kernels
-  IF( ISEDIMS >= 1 ) THEN
-    IF ( ISEDIMS .GT. ILENALLOCS ) THEN
-      IF ( ILENALLOCS .GT. 0 ) THEN
-        DEALLOCATE (ZRSS, ZRHODREFS, ILISTS)
-      END IF
-      ILENALLOCS = MAX (IOLDALLOCS, 2*ISEDIMS )
-      IOLDALLOCS = ILENALLOCS
-      ALLOCATE(ZRSS(ILENALLOCS), ZRHODREFS(ILENALLOCS), ILISTS(ILENALLOCS))
-    END IF
 !
-!$acc kernels
-    DO JL=1,ISEDIMS
-      ZRSS(JL) = PRSS(IS1(JL),IS2(JL),IS3(JL))
-      ZRHODREFS(JL) =  PRHODREF(IS1(JL),IS2(JL),IS3(JL))
-    END DO
-!
-    ILISTLENS = 0
-    DO JL=1,ISEDIMS
-     IF( ZRSS(JL) .GT. ZRTMIN(5) ) THEN
-       ILISTLENS = ILISTLENS + 1
-       ILISTS(ILISTLENS) = JL
-     END IF
-    END DO
-!$acc end kernels
-!$acc kernels present(ILISTS,IS1,IS2,IS3,ZRSS,ZRHODREFS,ZWSED) copyin(XEXSEDS) default(none)
-       DO JJ = 1, ILISTLENS
-          JL = ILISTS(JJ)
+  DO JL=1,ISEDIMS
+    ZRSLOC = PRSS(IS1(JL),IS2(JL),IS3(JL))
+    IF( ZRSLOC .GT. ZRTMIN(5) ) THEN
+      ZRHODREFLOC = PRHODREF(IS1(JL),IS2(JL),IS3(JL))
 #ifndef MNH_BITREP
-             ZWSED (IS1(JL),IS2(JL),IS3(JL))= XFSEDS * ZRSS(JL)**XEXSEDS *  &
-                                        ZRHODREFS(JL)**(XEXSEDS-XCEXVT)
+      ZWSED (IS1(JL),IS2(JL),IS3(JL))= XFSEDS * ZRSLOC**XEXSEDS *  &
+                                       ZRHODREFLOC**(XEXSEDS-XCEXVT)
 #else
-             ZWSED (IS1(JL),IS2(JL),IS3(JL))= XFSEDS * BR_POW(ZRSS(JL),XEXSEDS) *  &
-                                        BR_POW(ZRHODREFS(JL),XEXSEDS-XCEXVT)
+      ZWSED (IS1(JL),IS2(JL),IS3(JL))= XFSEDS * BR_POW(ZRSLOC,XEXSEDS) *  &
+                                       BR_POW(ZRHODREFLOC,XEXSEDS-XCEXVT)
 #endif
-       END DO
-!$acc end kernels
+    END IF
+  END DO
+!
+  DO JK = IKTB , IKTE
+    PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR
+  IF( JN==KSPLITR ) THEN
+    PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP
   END IF
-!$acc kernels
-       DO JK = IKTB , IKTE
-         PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR
-      IF( JN==KSPLITR ) THEN
-        PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
+!acc end kernels
 !
 !*       2.5   for graupeln
 !
-!$acc kernels
+!acc kernels
   ZWSED(:,:,:) = 0.
   IF( JN==1 ) PRGS(:,:,:) = PRGS(:,:,:) * PTSTEP
-!$acc end kernels
-  IF( ISEDIMG >= 1 ) THEN
-    IF ( ISEDIMG .GT. ILENALLOCG ) THEN
-      IF ( ILENALLOCG .GT. 0 ) THEN
-        DEALLOCATE (ZRGS, ZRHODREFG, ILISTG)
-      END IF
-      ILENALLOCG = MAX (IOLDALLOCG, 2*ISEDIMG )
-      IOLDALLOCG = ILENALLOCG
-      ALLOCATE(ZRGS(ILENALLOCG), ZRHODREFG(ILENALLOCG), ILISTG(ILENALLOCG))
-    END IF
-!
-!$acc kernels
-    DO JL=1,ISEDIMG
-      ZRGS(JL) = PRGS(IG1(JL),IG2(JL),IG3(JL))
-      ZRHODREFG(JL) =  PRHODREF(IG1(JL),IG2(JL),IG3(JL))
-    END DO
 !
-    ILISTLENG = 0
-    DO JL=1,ISEDIMG
-     IF( ZRGS(JL) .GT. ZRTMIN(6) ) THEN
-       ILISTLENG = ILISTLENG + 1
-       ILISTG(ILISTLENG) = JL
-     END IF
-    END DO
-!$acc end kernels
-!$acc kernels present(ILISTG,IG1,IG2,IG3,ZRGS,ZRHODREFG,ZWSED) copyin(XEXSEDG) default(none)
-       DO JJ = 1, ILISTLENG
-          JL = ILISTG(JJ)
+  DO JL=1,ISEDIMG
+    ZRSLOC = PRGS(IG1(JL),IG2(JL),IG3(JL))
+    IF( ZRSLOC .GT. ZRTMIN(6) ) THEN
+      ZRHODREFLOC = PRHODREF(IG1(JL),IG2(JL),IG3(JL))
 #ifndef MNH_BITREP
-             ZWSED (IG1(JL),IG2(JL),IG3(JL))= XFSEDG  * ZRGS(JL)**XEXSEDG *   &
-                                        ZRHODREFG(JL)**(XEXSEDG-XCEXVT)
+      ZWSED (IG1(JL),IG2(JL),IG3(JL))= XFSEDG  * ZRSLOC**XEXSEDG *   &
+                                       ZRHODREFLOC**(XEXSEDG-XCEXVT)
 #else
-             ZWSED (IG1(JL),IG2(JL),IG3(JL))= XFSEDG  * BR_POW(ZRGS(JL),XEXSEDG) *   &
-                                        BR_POW(ZRHODREFG(JL),XEXSEDG-XCEXVT)
+      ZWSED (IG1(JL),IG2(JL),IG3(JL))= XFSEDG  * BR_POW(ZRSLOC,XEXSEDG) *   &
+                                       BR_POW(ZRHODREFLOC,XEXSEDG-XCEXVT)
 #endif
-       END DO
-!$acc end kernels
-END IF
-!$acc kernels
-       DO JK = IKTB , IKTE
-         PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR                             
-       IF( JN==KSPLITR ) THEN
-        PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
+    END IF
+  END DO
+!
+  DO JK = IKTB , IKTE
+    PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR                             
+  IF( JN==KSPLITR ) THEN
+    PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP
+  END IF
+!acc end kernels
 !
 !*       2.6   for hail
 !
- IF ( KRR == 7 ) THEN
-!$acc kernels
+!acc kernels
+  IF ( KRR == 7 ) THEN
   IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP
   ZWSED(:,:,:) = 0.
-!$acc end kernels
-  IF( ISEDIMH >= 1 ) THEN
-    IF ( ISEDIMH .GT. ILENALLOCH ) THEN
-      IF ( ILENALLOCH .GT. 0 ) THEN
-        DEALLOCATE (ZRHS, ZRHODREFH, ILISTH)
-      END IF
-      ILENALLOCH = MAX (IOLDALLOCH, 2*ISEDIMH )
-      IOLDALLOCH = ILENALLOCH
-      ALLOCATE(ZRHS(ILENALLOCH), ZRHODREFH(ILENALLOCH), ILISTH(ILENALLOCH))
-    END IF
-!
-!$acc kernels
-    DO JL=1,ISEDIMH
-      ZRHS(JL) = PRHS(IH1(JL),IH2(JL),IH3(JL))
-      ZRHODREFH(JL) =  PRHODREF(IH1(JL),IH2(JL),IH3(JL))
-    END DO
 !
-    ILISTLENH = 0
-    DO JL=1,ISEDIMH
-     IF( ZRHS(JL) .GT. ZRTMIN(7) ) THEN
-       ILISTLENH = ILISTLENH + 1
-       ILISTH(ILISTLENH) = JL
-     END IF
-    END DO
-!$acc end kernels
-!$acc kernels present(ILISTH,IH1,IH2,IH3,ZRHS,ZRHODREFH,ZWSED) copyin(XEXSEDH) default(none)
-       DO JJ = 1, ILISTLENH
-          JL = ILISTH(JJ)
+  DO JL=1,ISEDIMH
+    ZRSLOC = PRHS(IH1(JL),IH2(JL),IH3(JL))
+    IF( ZRSLOC .GT. ZRTMIN(7) ) THEN
+      ZRHODREFLOC = PRHODREF(IH1(JL),IH2(JL),IH3(JL))
 #ifndef MNH_BITREP
-             ZWSED (IH1(JL),IH2(JL),IH3(JL))= XFSEDH  * ZRHS(JL)**XEXSEDH *   &
-                                        ZRHODREFH(JL)**(XEXSEDH-XCEXVT)
+      ZWSED (IH1(JL),IH2(JL),IH3(JL))= XFSEDH  * ZRSLOC**XEXSEDH *   &
+                                       ZRHODREFLOC**(XEXSEDH-XCEXVT)
 #else
-             ZWSED (IH1(JL),IH2(JL),IH3(JL))= XFSEDH  * BR_POW(ZRHS(JL),XEXSEDH) *   &
-                                        BR_POW(ZRHODREFH(JL),XEXSEDH-XCEXVT)
+      ZWSED (IH1(JL),IH2(JL),IH3(JL))= XFSEDH  * BR_POW(ZRSLOC,XEXSEDH) *   &
+                                       BR_POW(ZRHODREFLOC,XEXSEDH-XCEXVT)
 #endif
-       END DO
-!$acc end kernels
+    END IF
+  END DO
+!
+  DO JK = IKTB , IKTE
+    PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR
+  IF( JN==KSPLITR ) THEN
+    PRHS(:,:,:) = PRHS(:,:,:) * ZINVTSTEP
   END IF
-!$acc kernels
-       DO JK = IKTB , IKTE
-         PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,IKB)/XRHOLW/KSPLITR
-       IF( JN==KSPLITR ) THEN
-        PRHS(:,:,:) = PRHS(:,:,:) * ZINVTSTEP
-      END IF
+  END IF ! KRR==7
 !$acc end kernels
- END IF
 !
 END DO
 !$acc update self(PRRS,PRSS,PRGS,PRIS)
@@ -1468,16 +1289,6 @@ IF (KRR==7) THEN
 END IF
 #endif
 !
-IF (OSEDIC) THEN
-   IF (ILENALLOCC .GT. 0) DEALLOCATE (ZRCS, ZRHODREFC,  &
-  ILISTC,ZWLBDC,ZCONC,ZRCT, ZZT,ZPRES,ZRAY1D,ZFSEDC1D, ZWLBDA,ZCC)         
-END IF
-IF (ILENALLOCR .GT. 0 ) DEALLOCATE(ZRHODREFR,ZRRS,ILISTR)
-IF (ILENALLOCI .GT. 0 ) DEALLOCATE(ZRHODREFI,ZRIS,ILISTI)
-IF (ILENALLOCS .GT. 0 ) DEALLOCATE(ZRHODREFS,ZRSS,ILISTS)
-IF (ILENALLOCG .GT. 0 ) DEALLOCATE(ZRHODREFG,ZRGS,ILISTG)
-IF (KRR == 7 .AND. (ILENALLOCH .GT. 0 )) DEALLOCATE(ZRHODREFH,ZRHS,ILISTH)
-!
 !*       2.3     budget storage
 !
 IF (LBUDGET_RC .AND. OSEDIC) THEN
@@ -2070,7 +1881,7 @@ IMPLICIT NONE
 INTEGER , DIMENSION(SIZE(GNEGT))  :: I1,I2,I3 ! Used to replace the COUNT
 INTEGER                           :: JL       ! and PACK intrinsics
 REAL                              :: ZZWMAX
-!$acc device_resident(I1,I2,I3)
+!$acc declare device_resident(I1,I2,I3)
 !
 !-------------------------------------------------------------------------------
 !
@@ -4001,7 +3812,7 @@ INTEGER,                   INTENT(OUT) :: IC       ! Count
 !
 !*       0.2  declaration of local variables
 !
-INTEGER :: JI,JJ,JK,IC
+INTEGER :: JI,JJ,JK
 !
 !-------------------------------------------------------------------------------
 !
@@ -4072,7 +3883,7 @@ INTEGER,                 INTENT(OUT) :: IC    ! Count
 !
 !*       0.2  declaration of local variables
 !
-INTEGER :: JI,JJ,IC
+INTEGER :: JI,JJ
 !
 !-------------------------------------------------------------------------------
 !
@@ -4137,7 +3948,7 @@ INTEGER,               INTENT(OUT) :: IC       ! Count
 !
 !*       0.2  declaration of local variables
 !
-INTEGER :: JI,IC
+INTEGER :: JI
 !
 !-------------------------------------------------------------------------------
 !
-- 
GitLab