diff --git a/src/MNH/rain_ice_sedimentation_split.f90 b/src/MNH/rain_ice_sedimentation_split.f90
index db4078db3021849dfdb9a1df9ad3933326dc9e06..6a5024378325e3868bac49ae960f5fdaee584999 100644
--- a/src/MNH/rain_ice_sedimentation_split.f90
+++ b/src/MNH/rain_ice_sedimentation_split.f90
@@ -7,6 +7,7 @@
 !  P. Wautelet 25/02/2019: split rain_ice (cleaner and easier to maintain/debug)
 !  P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function
 !  P. Wautelet 28/05/2019: move COUNTJV function to tools.f90
+!  P. Wautelet 25/06/2019: OpenACC: optimisation of rain_ice_sedimentation_split
 !-----------------------------------------------------------------
 MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT
 
@@ -18,10 +19,11 @@ MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT
 
 CONTAINS
 
-SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT(KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE, KKT, KKL,&
-  KSPLITR,PTSTEP, &
-  KRR,OSEDIC,ODEPOSC,PINPRC,PINDEP,PINPRR,PINPRS,PINPRG,PDZZ,PRHODREF,PPABST,PTHT,PRHODJ,&
-      PINPRR3D,PRCS,PRCT,PRRS,PRRT,PRIS,PRIT,PRSS,PRST,PRGS,PRGT,PSEA,PTOWN,PINPRH,PRHS,PRHT,PFPR)
+SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT( KIB, KIE, KJB, KJE, KKB, KKE, KKTB, KKTE, KKT, KKL,                           &
+                                         KSPLITR, PTSTEP, KRR, OSEDIC, ODEPOSC,                                        &
+                                         PINPRC, PINDEP, PINPRR, PINPRS, PINPRG, PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, &
+                                         PINPRR3D, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,         &
+                                         PSEA, PTOWN, PINPRH, PRHS, PRHT, PFPR                                         )
 !
 !*      0. DECLARATIONS
 !          ------------
@@ -103,80 +105,53 @@ REAL, DIMENSION(:,:,:,:), OPTIONAL, INTENT(OUT)   :: PFPR    ! upper-air precipi
 !*       0.2  declaration of local variables
 !
 !
-INTEGER, SAVE                      :: IOLDALLOCC = 6000
-INTEGER, SAVE                      :: IOLDALLOCR = 6000
-INTEGER, SAVE                      :: IOLDALLOCI = 6000
-INTEGER, SAVE                      :: IOLDALLOCS = 6000
-INTEGER, SAVE                      :: IOLDALLOCG = 6000
-INTEGER, SAVE                      :: IOLDALLOCH = 6000
-INTEGER                            :: ILENALLOCC,ILENALLOCR,ILENALLOCI,ILENALLOCS,ILENALLOCG,ILENALLOCH
-INTEGER                            :: ILISTLENC,ILISTLENR,ILISTLENI,ILISTLENS,ILISTLENG,ILISTLENH
-INTEGER                            :: ISEDIMR,ISEDIMC, ISEDIMI, ISEDIMS, ISEDIMG, ISEDIMH
-INTEGER                            :: JK            ! Vertical loop index for the rain sedimentation
-INTEGER                            :: JN            ! Temporal loop index for the rain sedimentation
-INTEGER                            :: JJ            ! Loop index for the interpolation
-INTEGER                            :: JL
-INTEGER, DIMENSION(:), ALLOCATABLE :: IC1,IC2,IC3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:), ALLOCATABLE :: IR1,IR2,IR3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:), ALLOCATABLE :: IS1,IS2,IS3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:), ALLOCATABLE :: II1,II2,II3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:), ALLOCATABLE :: IG1,IG2,IG3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:), ALLOCATABLE :: IH1,IH2,IH3 ! Used to replace the COUNT
-INTEGER, DIMENSION(:), ALLOCATABLE :: ILISTR,ILISTC,ILISTI,ILISTS,ILISTG,ILISTH
-LOGICAL                            :: GPRESENT_PFPR, GPRESENT_PSEA
-LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GDEP
-LOGICAL, DIMENSION(:,:,:), ALLOCATABLE &
-                                   :: GSEDIMR,GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH ! Test where to compute the SED processes
-REAL                               :: ZINVTSTEP
-REAL                               :: ZTSPLITR ! Small time step for rain sedimentation
-REAL                               :: ZTMP1, ZTMP2 ! Intermediate variables
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRTMIN
+INTEGER                                :: ISEDIMR, ISEDIMC, ISEDIMI, ISEDIMS, ISEDIMG, ISEDIMH
+INTEGER                                :: JI, JJ, JK    ! Loop indices on grid
+INTEGER                                :: JN            ! Temporal loop index for the rain sedimentation
+INTEGER                                :: JL
+INTEGER, DIMENSION(:),     ALLOCATABLE :: IC1, IC2, IC3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     ALLOCATABLE :: IR1, IR2, IR3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     ALLOCATABLE :: IS1, IS2, IS3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     ALLOCATABLE :: II1, II2, II3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     ALLOCATABLE :: IG1, IG2, IG3 ! Used to replace the COUNT
+INTEGER, DIMENSION(:),     ALLOCATABLE :: IH1, IH2, IH3 ! Used to replace the COUNT
+LOGICAL                                :: GPRESENT_PFPR, GPRESENT_PSEA
+LOGICAL, DIMENSION(:,:),   ALLOCATABLE :: GDEP
+LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GSEDIMR, GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH ! Where to compute the SED processes
+REAL                                   :: ZINVTSTEP
+REAL                                   :: ZTSPLITR            ! Small time step for rain sedimentation
+REAL                                   :: ZTMP1, ZTMP2, ZTMP3 ! Intermediate variables
+REAL                                   :: ZRHODREFLOC         ! RHO Dry REFerence
+REAL                                   :: ZRSLOC, ZRTLOC      ! Intermediate variables
+REAL,    DIMENSION(:), ALLOCATABLE     :: ZRTMIN
 ! XRTMIN = Minimum value for the mixing ratio
 ! ZRTMIN = Minimum value for the source (tendency)
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRCS    ! Cloud water m.r. source
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRRS    ! Rain water m.r. source
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRIS    ! Pristine ice m.r. source
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRSS    ! Snow/aggregate m.r. source
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRGS    ! Graupel m.r. source
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRHS    ! Hail m.r. source
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRCT    ! Cloud water m.r. at t
-REAL,    DIMENSION(:), ALLOCATABLE :: ZRHODREFC,& ! RHO Dry REFerence
-                                      ZRHODREFR,& ! RHO Dry REFerence
-                                      ZRHODREFI,& ! RHO Dry REFerence
-                                      ZRHODREFS,& ! RHO Dry REFerence
-                                      ZRHODREFG,& ! RHO Dry REFerence
-                                      ZRHODREFH,& ! RHO Dry REFerence
-                                      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
-                                      ZZT,      & ! Temperature
-                                      ZPRES       ! Pressure
-REAL,    DIMENSION(:,:), ALLOCATABLE                   &
-                                   :: ZCONC_TMP    ! Weighted concentration
-REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZCONC3D !  droplet condensation
-REAL,    DIMENSION(:,:,:), ALLOCATABLE ::  &
-                                      ZRAY,   & ! Cloud Mean radius
-                                      ZLBC,   & ! XLBC weighted by sea fraction
-                                      ZFSEDC
-REAL,    DIMENSION(:,:,:), ALLOCATABLE   &
-                                   :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS   ! Mixing ratios created during the time step
-REAL,    DIMENSION(:,:,:), ALLOCATABLE   &
-                                   :: ZW ! work array
-REAL,    DIMENSION(:,:,:), ALLOCATABLE   &
-                                   :: ZWSED        ! sedimentation fluxes
-!
-! !$acc declare device_resident(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, &
-!$acc declare create(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, &
-!$acc &                       ILISTR, ILISTC, ILISTI, ILISTS, ILISTG, ILISTH,                                           &
+REAL                                   :: ZCC,      & ! terminal velocity
+                                          ZFSEDC1D, & ! For cloud sedimentation
+                                          ZWLBDC,   & ! Slope parameter of the droplet  distribution
+                                          ZCONC,    & ! Concentration des aerosols
+                                          ZRAY1D,   & ! Mean radius
+                                          ZWLBDA,   & ! Free mean path
+                                          ZZT,      & ! Temperature
+                                          ZPRES       ! Pressure
+REAL,    DIMENSION(:,:),   ALLOCATABLE :: ZCONC_TMP   ! Weighted concentration
+REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZCONC3D     ! Doplet condensation
+REAL,    DIMENSION(:,:),   ALLOCATABLE :: ZOMPSEA,ZTMP1_2D,ZTMP2_2D,ZTMP3_2D,ZTMP4_2D !Work arrays
+REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZRAY,   &   ! Cloud Mean radius
+                                          ZLBC,   &   ! XLBC weighted by sea fraction
+                                          ZFSEDC
+REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS   ! Mixing ratios created during the time step
+REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZW          ! Work array
+REAL,    DIMENSION(:,:,:), ALLOCATABLE :: ZWSED       ! sedimentation fluxes
+!
+!$acc declare device_resident(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, &
 !$acc &                       GDEP, GSEDIMR, GSEDIMC,  GSEDIMI,  GSEDIMS,  GSEDIMG,  GSEDIMH,                           &
-! !$acc & ZTMP1, ZTMP2, &
-!$acc &                       ZRTMIN, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZRCT,                                         &
-!$acc &                       ZRHODREFC, ZRHODREFR, ZRHODREFI, ZRHODREFS, ZRHODREFG, ZRHODREFH,                         &
-!$acc &                       ZCC, ZFSEDC1D, ZWLBDC, ZCONC, ZRAY1D, ZWLBDA, ZZT, ZPRES,                                 &
-!$acc &                       ZCONC_TMP, ZCONC3D, ZRAY, ZLBC, ZFSEDC,                                                   &
+!PW:BUG: do not uncomment to get correct results  !$acc & ZTMP1, ZTMP2,                                             &
+!PW:BUG: do not uncomment to get correct results  !$acc & ZRHODREFLOC, ZRSLOC, ZRTLOC,                              &
+!PW:BUG: do not uncomment to get correct results  !$acc & ZCC, ZFSEDC1D, ZWLBDC, ZCONC, ZRAY1D, ZWLBDA, ZZT, ZPRES, &
+!$acc &                       ZRTMIN, ZCONC_TMP, ZCONC3D,                                                               &
+!$acc &                       ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D,                                          &
+!$acc &                       ZRAY, ZLBC, ZFSEDC,                                                                       &
 !$acc &                       ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW, ZWSED)
 !
 !$acc declare copyin(XFSEDC, XLBC, XLBEXC, XRTMIN)
@@ -223,6 +198,11 @@ ALLOCATE( GSEDIMG(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( GSEDIMH(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( ZRTMIN(SIZE(XRTMIN)) )
 ALLOCATE( ZCONC_TMP(SIZE(PRCS,1),SIZE(PRCS,2)) )
+ALLOCATE( ZOMPSEA  (SIZE(PRCS,1),SIZE(PRCS,2)) )
+ALLOCATE( ZTMP1_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
+ALLOCATE( ZTMP2_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
+ALLOCATE( ZTMP3_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
+ALLOCATE( ZTMP4_2D (SIZE(PRCS,1),SIZE(PRCS,2)) )
 ALLOCATE( ZCONC3D(SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( ZRAY   (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
 ALLOCATE( ZLBC   (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) )
@@ -252,43 +232,53 @@ END IF
 ZINVTSTEP=1./PTSTEP
 ZTSPLITR= PTSTEP / REAL(KSPLITR)
 !
-IF (OSEDIC) PINPRC (:,:) = 0.
-IF (ODEPOSC) PINDEP (:,:) = 0.
-PINPRR (:,:) = 0.
+IF ( OSEDIC )  PINPRC (:,:) = 0.
+IF ( ODEPOSC ) PINDEP (:,:) = 0.
+PINPRR (:,:)     = 0.
 PINPRR3D (:,:,:) = 0.
-PINPRS (:,:) = 0.
-PINPRG (:,:) = 0.
+PINPRS (:,:)     = 0.
+PINPRG (:,:)     = 0.
 IF ( KRR == 7 ) PINPRH (:,:) = 0.
 IF ( GPRESENT_PFPR ) PFPR(:,:,:,:) = 0.
 !
 !*       1. Parameters for cloud sedimentation
 !
-   IF (OSEDIC) THEN
-    ZTMP1 = 0.5*GAMMA(XNUC+ 1.0/XALPHAC )/(GAMMA(XNUC ))
-    ZTMP2 = 0.5*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))
+IF ( OSEDIC ) THEN
+  ZTMP1 = 0.5 * GAMMA( XNUC  + 1.0 / XALPHAC  ) / ( GAMMA( XNUC  ) )
+  ZTMP2 = 0.5 * GAMMA( XNUC2 + 1.0 / XALPHAC2 ) / ( GAMMA( XNUC2 ) )
 
-    ZRAY(:,:,:)   = 0.
-    ZLBC(:,:,:)   = XLBC(1)
-    ZFSEDC(:,:,:) = XFSEDC(1)
-    ZCONC3D(:,:,:)= XCONC_LAND
-    ZCONC_TMP(:,:)= XCONC_LAND
-    IF ( GPRESENT_PSEA ) THEN
-      ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND
+  IF ( GPRESENT_PSEA ) THEN
+ !$acc loop independent collapse(2)
+    DO JJ = 1, SIZE( PRCS, 2 )
+      DO JI = 1, SIZE( PRCS, 1 )
+        ZOMPSEA  (JI,JJ) = 1.-PSEA(JI,JJ)
+        ZTMP1_2D (JI,JJ) = PSEA(JI,JJ)*XLBC(2)  +ZOMPSEA(JI,JJ)*XLBC(1)
+        ZTMP2_2D (JI,JJ) = PSEA(JI,JJ)*XFSEDC(2)+ZOMPSEA(JI,JJ)*XFSEDC(1)
+        ZCONC_TMP(JI,JJ) = PSEA(JI,JJ)*XCONC_SEA+ZOMPSEA(JI,JJ)*XCONC_LAND
+        ZTMP3_2D (JI,JJ) = (1.-PTOWN(JI,JJ))*ZCONC_TMP(JI,JJ)+PTOWN(JI,JJ)*XCONC_URBAN
+        ZTMP4_2D (JI,JJ) = MAX( 1. , ZOMPSEA(JI,JJ)*ZTMP1 + PSEA(JI,JJ)*ZTMP2 )
+      END DO
+    END DO
 
-      DO JK=KKTB,KKTE
-        ZLBC(:,:,JK)   = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1)
-        ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1))
-        ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK))
-        ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN
-        ZRAY(:,:,JK)   = (1.-PSEA(:,:)) * ZTMP1 + PSEA(:,:) * ZTMP2
+!$acc loop independent collapse(3)
+    DO JK = KKTB, KKTE
+      DO JJ = 1, SIZE( PRCS, 2 )
+        DO JI = 1, SIZE( PRCS, 1 )
+          ZLBC   (JI,JJ,JK) = ZTMP1_2D(JI,JJ)
+          ZFSEDC (JI,JJ,JK) = ZTMP2_2D(JI,JJ)
+          ZCONC3D(JI,JJ,JK) = ZTMP3_2D(JI,JJ)
+          ZRAY   (JI,JJ,JK) = ZTMP4_2D(JI,JJ)
+        END DO
       END DO
-    ELSE
-        ZCONC3D(:,:,:) = XCONC_LAND
-        ZRAY   (:,:,:) = ZTMP1
-    END IF
-    ZRAY(:,:,:)      = MAX(1.,ZRAY(:,:,:))
-    ZLBC(:,:,:)      = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:))
-   ENDIF
+    END DO
+  ELSE
+    ZLBC   (:,:,:) = XLBC(1)
+    ZFSEDC (:,:,:) = XFSEDC(1)
+    ZCONC3D(:,:,:) = XCONC_LAND
+    ZTMP3 = MAX(1.,ZTMP1)
+    ZRAY   (:,:,:) = ZTMP3
+  END IF
+END IF
 !
 !*       2.    compute the fluxes
 !
@@ -296,30 +286,23 @@ IF ( GPRESENT_PFPR ) PFPR(:,:,:,:) = 0.
 !  the precipitating fields are larger than a minimal value only !!!
 !  For optimization we consider each variable separately
 
-ZRTMIN(:)    = XRTMIN(:) * ZINVTSTEP
-IF (OSEDIC) GSEDIMC(:,:,:) = .FALSE.
+ZRTMIN(:) = XRTMIN(:) * ZINVTSTEP
+IF ( OSEDIC ) GSEDIMC(:,:,:) = .FALSE.
 GSEDIMR(:,:,:) = .FALSE.
 GSEDIMI(:,:,:) = .FALSE.
 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
 !
-IF (OSEDIC) THEN
+IF ( OSEDIC ) THEN
   ZPRCS(:,:,:) = 0.0
-  ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)* ZINVTSTEP
-  PRCS(:,:,:)  = PRCT(:,:,:)* ZINVTSTEP
+  ZPRCS(:,:,:) = PRCS(:,:,:) - PRCT(:,:,:) * ZINVTSTEP
+  PRCS (:,:,:) = PRCT(:,:,:)* ZINVTSTEP
 END IF
-!
+#if 0
 ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)* ZINVTSTEP
 ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)* ZINVTSTEP
 ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)* ZINVTSTEP
@@ -328,6 +311,32 @@ PRRS(:,:,:)  = PRRT(:,:,:)* ZINVTSTEP
 PRSS(:,:,:)  = PRST(:,:,:)* ZINVTSTEP
 PRGS(:,:,:)  = PRGT(:,:,:)* ZINVTSTEP
 IF ( KRR == 7 ) PRHS(:,:,:)  = PRHT(:,:,:)* ZINVTSTEP
+#else
+!$acc loop collapse(3) independent
+DO JK = 1, SIZE( PRRS, 3 )
+  DO JJ = 1, SIZE( PRRS, 2 )
+    DO JI = 1, SIZE( PRRS, 1 )
+      ZPRRS(JI,JJ,JK) = PRRS(JI,JJ,JK) - PRRT(JI,JJ,JK) * ZINVTSTEP
+      ZPRSS(JI,JJ,JK) = PRSS(JI,JJ,JK) - PRST(JI,JJ,JK) * ZINVTSTEP
+      ZPRGS(JI,JJ,JK) = PRGS(JI,JJ,JK) - PRGT(JI,JJ,JK) * ZINVTSTEP
+      PRRS (JI,JJ,JK) =                  PRRT(JI,JJ,JK) * ZINVTSTEP
+      PRSS (JI,JJ,JK) =                  PRST(JI,JJ,JK) * ZINVTSTEP
+      PRGS (JI,JJ,JK) =                  PRGT(JI,JJ,JK) * ZINVTSTEP
+    END DO
+  END DO
+END DO
+IF ( KRR == 7 ) THEN
+!$acc loop collapse(3) independent
+DO JK = 1, SIZE( PRHS, 3 )
+  DO JJ = 1, SIZE( PRHS, 2 )
+    DO JI = 1, SIZE( PRHS, 1 )
+        ZPRHS(JI,JJ,JK) = PRHS(JI,JJ,JK) - PRHT(JI,JJ,JK) * ZINVTSTEP
+        PRHS (JI,JJ,JK) =                  PRHT(JI,JJ,JK) * ZINVTSTEP
+      END DO
+    END DO
+  END DO
+END IF
+#endif
 !$acc end kernels
 !
 ! PRiS = Source of the previous time step + source created during the subtime
@@ -335,456 +344,279 @@ IF ( KRR == 7 ) PRHS(:,:,:)  = PRHT(:,:,:)* ZINVTSTEP
 !
 DO JN = 1 , KSPLITR
 !$acc kernels
-  IF( JN==1 ) THEN
-   IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:)/KSPLITR
-   PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:)/KSPLITR
-   PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:)/KSPLITR
-   PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:)/KSPLITR
-   IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:)/KSPLITR
-   DO JK = KKTB , KKTE
-     ZW(:,:,JK) =ZTSPLITR/(PRHODREF(:,:,JK)* PDZZ(:,:,JK))
-   END DO
- ELSE
-   IF (OSEDIC) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:)*ZTSPLITR
-   PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:)*ZTSPLITR
-   PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:)*ZTSPLITR
-   PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:)*ZTSPLITR
-   IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:)*ZTSPLITR
- END IF
- !
- IF (OSEDIC) GSEDIMC(KIB:KIE,KJB:KJE,KKTB:KKTE) =                &
-                  PRCS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(2)
- GSEDIMR(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
-                  PRRS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(3)
- GSEDIMI(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
-                  PRIS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(4)
- GSEDIMS(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
-                  PRSS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(5)
- GSEDIMG(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
-                  PRGS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(6)
- IF ( KRR == 7 ) GSEDIMH(KIB:KIE,KJB:KJE,KKTB:KKTE) =            &
-                  PRHS(KIB:KIE,KJB:KJE,KKTB:KKTE)>ZRTMIN(7)
+  IF( JN == 1 ) THEN
+    IF ( OSEDIC ) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:) / KSPLITR
+    PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:) / KSPLITR
+    PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:) / KSPLITR
+    PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:) / KSPLITR
+    IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) / KSPLITR
+    DO JK = KKTB , KKTE
+      ZW(:,:,JK) = ZTSPLITR / ( PRHODREF(:,:,JK) * PDZZ(:,:,JK) )
+    END DO
+  ELSE
+    IF ( OSEDIC ) PRCS(:,:,:) = PRCS(:,:,:) + ZPRCS(:,:,:) * ZTSPLITR
+    PRRS(:,:,:) = PRRS(:,:,:) + ZPRRS(:,:,:) * ZTSPLITR
+    PRSS(:,:,:) = PRSS(:,:,:) + ZPRSS(:,:,:) * ZTSPLITR
+    PRGS(:,:,:) = PRGS(:,:,:) + ZPRGS(:,:,:) * ZTSPLITR
+    IF ( KRR == 7 ) PRHS(:,:,:) = PRHS(:,:,:) + ZPRHS(:,:,:) * ZTSPLITR
+  END IF
+  !
+  IF ( OSEDIC ) GSEDIMC(KIB:KIE,KJB:KJE,KKTB:KKTE) =                &
+                   PRCS(KIB:KIE,KJB:KJE,KKTB:KKTE) > ZRTMIN(2)
+  GSEDIMR(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
+                   PRRS(KIB:KIE,KJB:KJE,KKTB:KKTE) > ZRTMIN(3)
+  GSEDIMI(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
+                   PRIS(KIB:KIE,KJB:KJE,KKTB:KKTE) > ZRTMIN(4)
+  GSEDIMS(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
+                   PRSS(KIB:KIE,KJB:KJE,KKTB:KKTE) > ZRTMIN(5)
+  GSEDIMG(KIB:KIE,KJB:KJE,KKTB:KKTE) =                            &
+                   PRGS(KIB:KIE,KJB:KJE,KKTB:KKTE) > ZRTMIN(6)
+  IF ( KRR == 7 ) GSEDIMH(KIB:KIE,KJB:KJE,KKTB:KKTE) =            &
+                   PRHS(KIB:KIE,KJB:KJE,KKTB:KKTE) > ZRTMIN(7)
 !$acc end kernels
 !
 #ifndef _OPENACC
-IF (OSEDIC) ISEDIMC = COUNTJV( GSEDIMC(:,:,:),IC1(:),IC2(:),IC3(:))
- ISEDIMR = COUNTJV( GSEDIMR(:,:,:),IR1(:),IR2(:),IR3(:))
- ISEDIMI = COUNTJV( GSEDIMI(:,:,:),II1(:),II2(:),II3(:))
- ISEDIMS = COUNTJV( GSEDIMS(:,:,:),IS1(:),IS2(:),IS3(:))
- ISEDIMG = COUNTJV( GSEDIMG(:,:,:),IG1(:),IG2(:),IG3(:))
- IF ( KRR == 7 ) ISEDIMH = COUNTJV( GSEDIMH(:,:,:),IH1(:),IH2(:),IH3(:))
+  IF ( OSEDIC ) ISEDIMC = COUNTJV( GSEDIMC(:,:,:), IC1(:), IC2(:), IC3(:) )
+  ISEDIMR = COUNTJV( GSEDIMR(:,:,:), IR1(:), IR2(:), IR3(:) )
+  ISEDIMI = COUNTJV( GSEDIMI(:,:,:), II1(:), II2(:), II3(:) )
+  ISEDIMS = COUNTJV( GSEDIMS(:,:,:), IS1(:), IS2(:), IS3(:) )
+  ISEDIMG = COUNTJV( GSEDIMG(:,:,:), IG1(:), IG2(:), IG3(:) )
+  IF ( KRR == 7 ) ISEDIMH = COUNTJV( GSEDIMH(:,:,:), IH1(:), IH2(:), IH3(:) )
 #else
- IF (OSEDIC) CALL COUNTJV_DEVICE(GSEDIMC,IC1,IC2,IC3,ISEDIMC)
- CALL COUNTJV_DEVICE(GSEDIMR,IR1,IR2,IR3,ISEDIMR)
- CALL COUNTJV_DEVICE(GSEDIMI,II1,II2,II3,ISEDIMI)
- CALL COUNTJV_DEVICE(GSEDIMS,IS1,IS2,IS3,ISEDIMS)
- CALL COUNTJV_DEVICE(GSEDIMG,IG1,IG2,IG3,ISEDIMG)
- IF ( KRR == 7 ) CALL COUNTJV_DEVICE(GSEDIMH,IH1,IH2,IH3,ISEDIMH)
+  IF ( OSEDIC ) CALL COUNTJV_DEVICE( GSEDIMC, IC1, IC2, IC3, ISEDIMC )
+  CALL COUNTJV_DEVICE( GSEDIMR, IR1, IR2, IR3, ISEDIMR )
+  CALL COUNTJV_DEVICE( GSEDIMI, II1, II2, II3, ISEDIMI )
+  CALL COUNTJV_DEVICE( GSEDIMS, IS1, IS2, IS3, ISEDIMS )
+  CALL COUNTJV_DEVICE( GSEDIMG, IG1, IG2, IG3, ISEDIMG )
+  IF ( KRR == 7 ) CALL COUNTJV_DEVICE( GSEDIMH, IH1, IH2, IH3, ISEDIMH )
 #endif
 !
 !*       2.1   for cloud
 !
-IF (OSEDIC) THEN
-!$acc kernels
-  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)  )
-!$acc kernels
-ZRCS     (:) = 0.
-ZRHODREFC(:) = 0.
-ILISTC   (:) = 0
-ZWLBDC   (:) = 0.
-ZCONC    (:) = 0.
-ZRCT     (:) = 0.
-ZZT      (:) = 0.
-ZPRES    (:) = 0.
-ZRAY1D   (:) = 0.
-ZFSEDC1D (:) = 0.
-ZWLBDA   (:) = 0.
-ZCC      (:) = 0.
-!$acc end kernels
-    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
-       DO JJ = 1, ILISTLENC
-          JL = ILISTC(JJ)
-          IF (ZRCS(JL) .GT. ZRTMIN(2) .AND. ZRCT(JL) .GT. XRTMIN(2)) THEN
+  IF ( OSEDIC ) THEN
+    ZWSED(:,:,:) = 0.
+    IF( JN==1 ) PRCS(:,:,:) = PRCS(:,:,:) * PTSTEP
+!$acc loop independent
+     DO JL=1,ISEDIMC
+       ZRSLOC = PRCS(IC1(JL),IC2(JL),IC3(JL))
+       ZRTLOC = PRCT(IC1(JL),IC2(JL),IC3(JL))
+       IF (ZRSLOC > ZRTMIN(2) .AND. ZRTLOC > XRTMIN(2)) THEN
+         ZRHODREFLOC =  PRHODREF(IC1(JL),IC2(JL),IC3(JL))
+         ZFSEDC1D = ZFSEDC(IC1(JL),IC2(JL),IC3(JL))
+         ZWLBDC = ZLBC(IC1(JL),IC2(JL),IC3(JL))
+         ZCONC = ZCONC3D(IC1(JL),IC2(JL),IC3(JL))
+         ZRAY1D = ZRAY(IC1(JL),IC2(JL),IC3(JL))
+         ZZT = PTHT(IC1(JL),IC2(JL),IC3(JL))
+         ZPRES = PPABST(IC1(JL),IC2(JL),IC3(JL))
 !Problems with PGI (18.10). OK if 2 lines are merged!
-!             ZWLBDC(JL) = ZWLBDC(JL) * ZCONC(JL) / (ZRHODREFC(JL) * ZRCT(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
 #ifndef MNH_BITREP
-            ZWLBDC(JL) = (ZWLBDC(JL) * ZCONC(JL) / (ZRHODREFC(JL) * ZRCT(JL)))**XLBEXC
+        ZWLBDC = (ZWLBDC * ZCONC / (ZRHODREFLOC * ZRTLOC))**XLBEXC
 #else
-            ZWLBDC(JL) = BR_POW(ZWLBDC(JL) * ZCONC(JL) / (ZRHODREFC(JL) * ZRCT(JL)),XLBEXC)
+        ZWLBDC = BR_POW(ZWLBDC * ZCONC / (ZRHODREFLOC * ZRTLOC),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)
+        ZZT    = ZZT * (ZPRES/XP00)**(XRD/XCPD)
 #else
-            ZZT(JL)    = ZZT(JL) * BR_POW(ZPRES(JL)/XP00,XRD/XCPD)
+        ZZT    = ZZT * BR_POW(ZPRES/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./ZPRES)*(ZZT/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
-       DO JK = KKTB , KKTE
-         PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       IF ( GPRESENT_PFPR ) THEN
-         DO JK = KKTB , KKTE
-           PFPR(:,:,JK,2)=ZWSED(:,:,JK)
-         ENDDO
-       ENDIF
-      PINPRC(:,:) = PINPRC(:,:) + ZWSED(:,:,KKB) / XRHOLW / KSPLITR
-      IF( JN==KSPLITR ) THEN
-        PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP
       END IF
-!$acc end kernels
- END IF
+    END DO
+    DO JK = KKTB , KKTE
+      PRCS(:,:,JK) = PRCS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+    END DO
+    IF ( GPRESENT_PFPR ) THEN
+      DO JK = KKTB , KKTE
+        PFPR(:,:,JK,2)=ZWSED(:,:,JK)
+      ENDDO
+    ENDIF
+    PINPRC(:,:) = PINPRC(:,:) + ZWSED(:,:,KKB) / XRHOLW / KSPLITR
+    IF( JN == KSPLITR ) THEN
+      PRCS(:,:,:) = PRCS(:,:,:) * ZINVTSTEP
+    END IF
+  END IF
 !
 !*       2.2   for rain
 !
-!$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
-    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
-       DO JJ = 1, ILISTLENR
-          JL = ILISTR(JJ)
+!$acc loop independent
+  DO JL=1,ISEDIMR
+    ZRSLOC = PRRS(IR1(JL),IR2(JL),IR3(JL))
+    IF( ZRSLOC > 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
+  END DO
+  DO JK = KKTB , KKTE
+    PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  IF ( GPRESENT_PFPR ) THEN
+    DO JK = KKTB , KKTE
+      PFPR(:,:,JK,3)=ZWSED(:,:,JK)
+    ENDDO
+  ENDIF
+  PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
+  PINPRR3D(:,:,:) = PINPRR3D(:,:,:) + ZWSED(:,:,1:KKT)/XRHOLW/KSPLITR
+  IF( JN == KSPLITR ) THEN
+    PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP
   END IF
-!$acc kernels
-       DO JK = KKTB , KKTE
-         PRRS(:,:,JK) = PRRS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       IF ( GPRESENT_PFPR ) THEN
-         DO JK = KKTB , KKTE
-           PFPR(:,:,JK,3)=ZWSED(:,:,JK)
-         ENDDO
-       ENDIF
-       PINPRR(:,:) = PINPRR(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
-       PINPRR3D(:,:,:) = PINPRR3D(:,:,:) + ZWSED(:,:,1:KKT)/XRHOLW/KSPLITR
-      IF( JN==KSPLITR ) THEN
-        PRRS(:,:,:) = PRRS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
 !
 !*       2.3   for pristine ice
 !
-!$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
-       DO JJ = 1, ILISTLENI
-          JL = ILISTI(JJ)
+!$acc loop independent
+  DO JL=1,ISEDIMI
+    ZRSLOC = PRIS(II1(JL),II2(JL),II3(JL))
+    IF( ZRSLOC >  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 = KKTB , KKTE
+    PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  IF ( GPRESENT_PFPR ) THEN
+    DO JK = KKTB , KKTE
+      PFPR(:,:,JK,4)=ZWSED(:,:,JK)
+    ENDDO
+  ENDIF
+  IF( JN == KSPLITR ) THEN
+    PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP
   END IF
-!$acc kernels
-       DO JK = KKTB , KKTE
-         PRIS(:,:,JK) = PRIS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       IF ( GPRESENT_PFPR ) THEN
-         DO JK = KKTB , KKTE
-           PFPR(:,:,JK,4)=ZWSED(:,:,JK)
-         ENDDO
-       ENDIF
-      IF( JN==KSPLITR ) THEN
-        PRIS(:,:,:) = PRIS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
 !
 !*       2.4   for aggregates/snow
 !
-!$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
-       DO JJ = 1, ILISTLENS
-          JL = ILISTS(JJ)
+!$acc loop independent
+  DO JL=1,ISEDIMS
+    ZRSLOC = PRSS(IS1(JL),IS2(JL),IS3(JL))
+    IF( ZRSLOC > 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 = KKTB , KKTE
+    PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  IF ( GPRESENT_PFPR ) THEN
+    DO JK = KKTB , KKTE
+      PFPR(:,:,JK,5)=ZWSED(:,:,JK)
+    ENDDO
+  ENDIF
+  PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
+  IF( JN == KSPLITR ) THEN
+    PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP
   END IF
-!$acc kernels
-       DO JK = KKTB , KKTE
-         PRSS(:,:,JK) = PRSS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       IF ( GPRESENT_PFPR ) THEN
-         DO JK = KKTB , KKTE
-           PFPR(:,:,JK,5)=ZWSED(:,:,JK)
-         ENDDO
-       ENDIF
-      PINPRS(:,:) = PINPRS(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
-      IF( JN==KSPLITR ) THEN
-        PRSS(:,:,:) = PRSS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
 !
 !*       2.5   for graupeln
 !
-!$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
-       DO JJ = 1, ILISTLENG
-          JL = ILISTG(JJ)
+!$acc loop independent
+  DO JL=1,ISEDIMG
+    ZRSLOC = PRGS(IG1(JL),IG2(JL),IG3(JL))
+    IF( ZRSLOC > 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 = KKTB , KKTE
-         PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       IF ( GPRESENT_PFPR ) THEN
-         DO JK = KKTB , KKTE
-           PFPR(:,:,JK,6)=ZWSED(:,:,JK)
-         ENDDO
-       ENDIF
-       PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
-      IF( JN==KSPLITR ) THEN
-        PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP
-      END IF
-!$acc end kernels
-!
-!*       2.6   for hail
-!
- IF ( KRR == 7 ) THEN
-!$acc kernels
-  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
+  END DO
+  DO JK = KKTB , KKTE
+    PRGS(:,:,JK) = PRGS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+  END DO
+  IF ( GPRESENT_PFPR ) THEN
+    DO JK = KKTB , KKTE
+      PFPR(:,:,JK,6)=ZWSED(:,:,JK)
+    ENDDO
+  ENDIF
+  PINPRG(:,:) = PINPRG(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
+  IF( JN == KSPLITR ) THEN
+    PRGS(:,:,:) = PRGS(:,:,:) * ZINVTSTEP
+  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
+!*       2.6   for hail
 !
-    ILISTLENH = 0
+  IF ( KRR == 7 ) THEN
+    IF( JN==1 ) PRHS(:,:,:) = PRHS(:,:,:) * PTSTEP
+    ZWSED(:,:,:) = 0.
+!$acc loop independent
     DO JL=1,ISEDIMH
-     IF( ZRHS(JL) .GT. ZRTMIN(7) ) THEN
-       ILISTLENH = ILISTLENH + 1
-       ILISTH(ILISTLENH) = JL
-     END IF
-    END DO
-       DO JJ = 1, ILISTLENH
-          JL = ILISTH(JJ)
+      ZRSLOC = PRHS(IH1(JL),IH2(JL),IH3(JL))
+      IF( ZRSLOC > 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
-!$acc kernels
-       DO JK = KKTB , KKTE
-         PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
-       END DO
-       IF ( GPRESENT_PFPR ) THEN
-         DO JK = KKTB , KKTE
-           PFPR(:,:,JK,7)=ZWSED(:,:,JK)
-         ENDDO
-       ENDIF
-       PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
-      IF( JN==KSPLITR ) THEN
-        PRHS(:,:,:) = PRHS(:,:,:) * ZINVTSTEP
       END IF
+    END DO
+    DO JK = KKTB , KKTE
+      PRHS(:,:,JK) = PRHS(:,:,JK) + ZW(:,:,JK)*(ZWSED(:,:,JK+KKL)-ZWSED(:,:,JK))
+    END DO
+    IF ( GPRESENT_PFPR ) THEN
+      DO JK = KKTB , KKTE
+        PFPR(:,:,JK,7)=ZWSED(:,:,JK)
+      ENDDO
+    ENDIF
+    PINPRH(:,:) = PINPRH(:,:) + ZWSED(:,:,KKB)/XRHOLW/KSPLITR
+    IF( JN == KSPLITR ) THEN
+      PRHS(:,:,:) = PRHS(:,:,:) * ZINVTSTEP
+    END IF
+  END IF
 !$acc end kernels
- END IF
 !
 END DO
 !
-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
@@ -821,9 +653,9 @@ IF (ODEPOSC) THEN
   GDEP(:,:) = .FALSE.
   GDEP(KIB:KIE,KJB:KJE) =    PRCS(KIB:KIE,KJB:KJE,KKB) >0
   WHERE (GDEP)
-     PRCS(:,:,KKB) = PRCS(:,:,KKB) - XVDEPOSC * PRCT(:,:,KKB) / PDZZ(:,:,KKB)
-     PINPRC(:,:) = PINPRC(:,:) + XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW
-     PINDEP(:,:) = XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW
+    PRCS(:,:,KKB) = PRCS(:,:,KKB) - XVDEPOSC * PRCT(:,:,KKB) / PDZZ(:,:,KKB)
+    PINPRC(:,:) = PINPRC(:,:) + XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW
+    PINDEP(:,:) = XVDEPOSC * PRCT(:,:,KKB) * PRHODREF(:,:,KKB) /XRHOLW
   END WHERE
 END IF
 !$acc end kernels
@@ -858,6 +690,6 @@ IF (MPPDB_INITIALIZED) THEN
   END IF
 END IF
 
-  END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT
+END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT
 
 END MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT