From a70adbcaa341c1378ff3c09e7f1ca592040a6b0c Mon Sep 17 00:00:00 2001
From: Juan ESCOBAR <juan.escobar@aero.obs-mip.fr>
Date: Fri, 16 Dec 2022 14:16:04 +0100
Subject: [PATCH] Juan 16/12/2022:MNH/ice4*, for atomic add "acc COPY()" clause
 for probleme with CCE/15.0.0

---
 src/MNH/ice4_fast_rg.f90             |  4 ++--
 src/MNH/ice4_fast_rh.f90             | 29 +++++++++++++++++-----------
 src/MNH/ice4_fast_rs.f90             |  9 ++++-----
 src/MNH/ice4_rsrimcg_old.f90         | 27 ++++++++++++++++----------
 src/MNH/ice4_sedimentation_split.f90 |  2 +-
 5 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90
index 8a49ae40f..0e2e92deb 100644
--- a/src/MNH/ice4_fast_rg.f90
+++ b/src/MNH/ice4_fast_rg.f90
@@ -404,7 +404,7 @@ ENDIF
 ! Wet and dry collection of rs on graupel (6.2.1)
 IGDRY = 0
 !$acc end kernels
-!$acc parallel loop private(idx) independent
+!$acc parallel loop private(idx) copy(IGDRY) independent
 DO CONCURRENT( JJ = 1 : SIZE( GDRY ) )
   ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5))
           &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6))
@@ -518,7 +518,7 @@ ENDIF
 !*       6.2.6  accretion of raindrops on the graupeln
 !
 IGDRY = 0
-!$acc parallel loop private(idx) independent
+!$acc parallel loop private(idx) copy(IGDRY) independent
 DO CONCURRENT( JJ = 1 : SIZE( GDRY ) )
   ZDRY(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3))
           &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6))
diff --git a/src/MNH/ice4_fast_rh.f90 b/src/MNH/ice4_fast_rh.f90
index 33ce69daa..04c1d71ee 100644
--- a/src/MNH/ice4_fast_rh.f90
+++ b/src/MNH/ice4_fast_rh.f90
@@ -318,11 +318,12 @@ ELSE
 #endif
   END WHERE
 ENDIF
+!$acc end kernels
 !
 !*       7.2.1  accretion of aggregates on the hailstones
 !
 IGWET = 0
-!$acc loop private(IDX) independent
+!$acc parallel loop private(IDX) copy(IGWET) independent
 DO JJ = 1, SIZE(GWET)
   ZWET(JJ) = MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7))
             &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & ! WHERE(PRST(:)>XRTMIN(5))
@@ -338,7 +339,7 @@ DO JJ = 1, SIZE(GWET)
     GWET(JJ) = .FALSE.
   END IF
 END DO
-!$acc end kernels
+! acc end parallel loop 
 
 IF(LDSOFT) THEN
 !$acc kernels
@@ -353,7 +354,7 @@ ELSE
   PRH_TEND(:, IRSDRYH)=0.
 !$acc end kernels
   IF(IGWET>0)THEN
-!$acc kernels
+!$acc kernels present_cr(ZVEC1,ZVEC2,ZVEC3,ZZW)
     !
     !*       7.2.3  select the (PLBDAH,PLBDAS) couplet
     !
@@ -396,6 +397,7 @@ ELSE
                                                          * (ZVEC1(JJ) - 1.0)
     END DO
     ZZW(:) = 0.
+    !$acc loop independent
     DO JJ = 1, IGWET
       ZZW(I1(JJ)) = ZVEC3(JJ)
     END DO
@@ -425,9 +427,8 @@ ENDIF
 !
 !*       7.2.6  accretion of graupeln on the hailstones
 !
-!$acc kernels
 IGWET = 0
-!$acc loop private(IDX) independent
+!$acc parallel loop private(IDX) copy(IGWET) independent
 DO JJ = 1, SIZE(GWET)
   ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7))
           &MAX(0., -SIGN(1., XRTMIN(6)-PRGT(JJ))) * & ! WHERE(PRGT(:)>XRTMIN(6))
@@ -443,7 +444,7 @@ DO JJ = 1, SIZE(GWET)
     GWET(JJ) = .FALSE.
   END IF
 END DO
-!$acc end kernels
+! acc end parallel loop
 
 IF(LDSOFT) THEN
 !$acc kernels
@@ -458,7 +459,7 @@ ELSE
   PRH_TEND(:, IRGDRYH)=0.
 !$acc end kernels
   IF(IGWET>0)THEN
-!$acc kernels
+!$acc kernels present_cr(ZVEC1,ZVEC2,ZVEC3,ZZW)
     !
     !*       7.2.8  select the (PLBDAH,PLBDAG) couplet
     !
@@ -501,6 +502,7 @@ ELSE
                                                         * (ZVEC1(JJ) - 1.0)
     END DO
     ZZW(:) = 0.
+    !$acc loop independent
     DO JJ = 1, IGWET
       ZZW(I1(JJ)) = ZVEC3(JJ)
     END DO
@@ -534,12 +536,11 @@ ELSE
 !$acc end kernels
   END IF
 ENDIF
-!$acc kernels
 !
 !*       7.2.11  accretion of raindrops on the hailstones
 !
 IGWET = 0
-!$acc loop private(IDX) independent
+!$acc parallel loop private(IDX) copy(IGWET) independent
 DO JJ = 1, SIZE(GWET)
   ZWET(JJ)=MAX(0., -SIGN(1., XRTMIN(7)-PRHT(JJ))) * & ! WHERE(PRHT(:)>XRTMIN(7))
           &MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & ! WHERE(PRRT(:)>XRTMIN(3))
@@ -555,7 +556,7 @@ DO JJ = 1, SIZE(GWET)
     GWET(JJ) = .FALSE.
   END IF
 END DO
-!$acc end kernels
+! acc end parallel loop 
 
 IF(LDSOFT) THEN
 !$acc kernels
@@ -568,7 +569,7 @@ ELSE
   PRH_TEND(:, IRRWETH)=0.
 !$acc end kernels
   IF(IGWET>0)THEN
-!$acc kernels
+!$acc kernels present_cr(ZVEC1,ZVEC2)
     !
     !*       7.2.12  select the (PLBDAH,PLBDAR) couplet
     !
@@ -611,6 +612,7 @@ ELSE
                                                          *(ZVEC1(JJ) - 1.0)
     END DO
     ZZW(:) = 0.
+    !$acc loop independent
     DO JJ = 1, IGWET
       ZZW(I1(JJ)) = ZVEC3(JJ)
     END DO
@@ -683,6 +685,7 @@ ELSE
                           ( PRHODREF(:)*(XLMTT-XCL*(XTT-PT(:))) )
   END WHERE
 ENDIF
+!$acc loop independent
 DO JL=1, ISIZE
   !We must agregate, at least, the cold species
   ZRWETH_INIT(JL)=ZHAIL(JL) * MAX(PRH_TEND(JL, IRIWETH)+PRH_TEND(JL, IRSWETH)+PRH_TEND(JL, IRGWETH), &
@@ -694,16 +697,19 @@ ENDDO
 !*       7.4    Select Wet or Dry case
 !
 !Wet case
+!$acc loop independent
 DO JL=1, ISIZE
   ZWETH(JL) = ZHAIL(JL) * &
             & MAX(0., SIGN(1., MAX(0., ZRDRYH_INIT(JL)-PRH_TEND(JL, IRIDRYH)-PRH_TEND(JL, IRSDRYH)-PRH_TEND(JL, IRGDRYH)) - &
                               &MAX(0., ZRWETH_INIT(JL)-PRH_TEND(JL, IRIWETH)-PRH_TEND(JL, IRSWETH)-PRH_TEND(JL, IRGWETH))))
 ENDDO
 IF(LNULLWETH) THEN
+  !$acc loop independent
   DO JL=1, ISIZE
     ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRDRYH_INIT(JL))) ! WHERE(ZRDRYH_INIT(:)>0.)
   ENDDO
 ELSE
+  !$acc loop independent
   DO JL=1, ISIZE
     ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., -ZRWETH_INIT(JL))) ! WHERE(ZRWETH_INIT(:)>0.)
   ENDDO
@@ -713,6 +719,7 @@ IF(.NOT. LWETHPOST) THEN
     ZWETH(JL) = ZWETH(JL) * MAX(0., -SIGN(1., PT(JL)-XTT)) ! WHERE(PT(:)<XTT)
   ENDDO
 ENDIF
+!$acc loop independent
 DO JL=1, ISIZE
   ZDRYH(JL) = ZHAIL(JL) * &
             & MAX(0., -SIGN(1., PT(JL)-XTT)) * & ! WHERE(PT(:)<XTT)
diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90
index 94a0ad92c..4fb4434d6 100644
--- a/src/MNH/ice4_fast_rs.f90
+++ b/src/MNH/ice4_fast_rs.f90
@@ -287,12 +287,11 @@ DO JL=1, ISIZE
                                               &PRS_TEND(JL, IFREEZ2) * PRIAGGS(JL)) - &
                                       PRIAGGS(JL))
 ENDDO
-!
+!$acc end kernels
 !*       5.1    cloud droplet riming of the aggregates
 !
 IGRIM = 0
-!$acc end kernels
-!$acc parallel loop private(idx) independent present_cr( I1, GRIM, PCOMPUTE, PRCT, PRST, XRTMIN, ZRIM )
+!$acc parallel loop private(idx) copy(IGRIM) independent present_cr( I1, GRIM, PCOMPUTE, PRCT, PRST, XRTMIN, ZRIM )
 DO CONCURRENT( JJ = 1 : SIZE( GRIM ) )
   ZRIM(JJ)=MAX(0., -SIGN(1., XRTMIN(2)-PRCT(JJ))) * & !WHERE(PRCT(:)>XRTMIN(2))
           &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5))
@@ -461,12 +460,12 @@ DO JL=1, ISIZE
   PA_RG(JL) = PA_RG(JL) + PRCRIMSG(JL)+PRSRIMCG(JL)
   PA_TH(JL) = PA_TH(JL) + PRCRIMSG(JL)*(PLSFACT(JL)-PLVFACT(JL))
 ENDDO
+!$acc end kernels
 !
 !*       5.2    rain accretion onto the aggregates
 !
 IGACC = 0
-!$acc end kernels
-!$acc parallel loop private(idx) independent present_cr( I1, GACC, PCOMPUTE, PRRT, PRST, XRTMIN, ZACC )
+!$acc parallel loop private(idx) copy(IGACC) independent present_cr( I1, GACC, PCOMPUTE, PRRT, PRST, XRTMIN, ZACC )
 DO CONCURRENT( JJ = 1 : SIZE( GACC ) )
   ZACC(JJ)=MAX(0., -SIGN(1., XRTMIN(3)-PRRT(JJ))) * & !WHERE(PRRT(:)>XRTMIN(3))
           &MAX(0., -SIGN(1., XRTMIN(5)-PRST(JJ))) * & !WHERE(PRST(:)>XRTMIN(5))
diff --git a/src/MNH/ice4_rsrimcg_old.f90 b/src/MNH/ice4_rsrimcg_old.f90
index 6d4fb2fd3..8abfaed13 100644
--- a/src/MNH/ice4_rsrimcg_old.f90
+++ b/src/MNH/ice4_rsrimcg_old.f90
@@ -137,27 +137,32 @@ CALL MNH_MEM_GET( zzw,   size( prhodref ) )
 !
 !$acc kernels
 PRSRIMCG_MR(:)=0.
+!$acc end kernels
 !
 IF(.NOT. ODSOFT) THEN
-  IGRIM = 0
-  GRIM(:) = .FALSE.
-!$acc loop private(IDX) independent
+!$acc kernels
+   GRIM(:) = .FALSE.
+!$acc end kernels
+   IGRIM = 0
+!$acc parallel loop private(IDX) copy(IGRIM) independent
   DO JL = 1, SIZE(GRIM)
     IF ( PRCT(JL)>XRTMIN(2) .AND. PRST(JL)>XRTMIN(5) .AND. ODCOMPUTE(JL) .AND. PT(JL)<XTT ) THEN
 !$acc atomic capture
       IGRIM = IGRIM + 1
       IDX = IGRIM
 !$acc end atomic
-      IVEC1(IDX) = Jl
+      IVEC1(IDX) = JL
       GRIM(JL) = .TRUE.
     END IF
   END DO
   !
+! acc end parallel loop
   IF(IGRIM>0) THEN
+    !$acc kernels  
     !
     !        5.1.1  select the PLBDAS
     !
-!$acc loop independent
+    !$acc loop independent
     DO CONCURRENT( JL = 1 : IGRIM )
       ZVEC1(JL) = PLBDAS(IVEC1(JL))
       !
@@ -181,11 +186,11 @@ IF(.NOT. ODSOFT) THEN
       ZVEC1(JL) =  XGAMINC_RIM2( IVEC2(JL)+1 )* ZVEC2(JL)      &
                       - XGAMINC_RIM2( IVEC2(JL)   )*(ZVEC2(JL) - 1.0)
     END DO
-!$acc loop independent
+    !$acc loop independent
     DO CONCURRENT( JL = 1 : size( prhodref ) )
       ZZW(JL) = 0.
     END DO
-!$acc loop independent
+    !$acc loop independent
     DO CONCURRENT( JL = 1 : IGRIM )
       ZZW(IVEC1(JL)) = ZVEC1(JL)
     END DO
@@ -193,7 +198,7 @@ IF(.NOT. ODSOFT) THEN
     !        5.1.6  riming-conversion of the large sized aggregates into graupeln
     !
     !
-!$acc loop independent
+    !$acc loop independent
     DO CONCURRENT( JL = 1 : size( prhodref ) )
       IF ( GRIM(JL) ) THEN
 #ifndef MNH_BITREP
@@ -205,8 +210,10 @@ IF(.NOT. ODSOFT) THEN
         PRSRIMCG_MR(:)=MIN(PRST(:), PRSRIMCG_MR(:))
       END IF
     END DO
-  END IF
-ENDIF
+ !$acc end kernels
+ END IF ! IGRIM
+ENDIF ! ODSOFT
+!$acc kernels
 PB_RS(:) = PB_RS(:) - PRSRIMCG_MR(:)
 PB_RG(:) = PB_RG(:) + PRSRIMCG_MR(:)
 !$acc end kernels
diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90
index 05c7df02d..255d6a688 100644
--- a/src/MNH/ice4_sedimentation_split.f90
+++ b/src/MNH/ice4_sedimentation_split.f90
@@ -614,7 +614,7 @@ ZREMAINT(:,:) = PTSTEP
 !
 DO WHILE (ANY(ZREMAINT>0.))
   ISEDIM = 0
-!$acc parallel loop private(idx) independent
+!$acc parallel loop private(idx) copy(ISEDIM) independent
   DO JK = KKTB,KKTE
 !$acc loop independent collapse(2)
     DO JJ = KJB,KJE
-- 
GitLab