From a306b1684d5b80020b99e9c151a3a17362db8d2d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Mon, 11 Jun 2018 10:08:48 +0200
Subject: [PATCH] Juan 11/06/2018: rewrite some loops for OpenACC in PPM_01_Z

---
 src/MNH/ppm.f90 | 99 +++++++++++++++++++++++++++++++++++++++----------
 1 file changed, 79 insertions(+), 20 deletions(-)

diff --git a/src/MNH/ppm.f90 b/src/MNH/ppm.f90
index 7e5b0d26d..591a141a8 100644
--- a/src/MNH/ppm.f90
+++ b/src/MNH/ppm.f90
@@ -1838,6 +1838,7 @@ ZQR0(:,:,IKE+1) = ZQR0(:,:,IKB)
 !
 ZDQ = ZQR0 - ZQL0
 ZQ60 = 6.0*(PSRC - 0.5*(ZQL0 + ZQR0))
+#ifndef _OPENACC
 !
 ! initialize final parabolae parameters
 !
@@ -1847,7 +1848,6 @@ ZQ6 = ZQ60
 !
 ! eliminate over and undershoots and create qL and qR as in Lin96
 !
-#ifndef _OPENACC
 WHERE ( ZDMQ == 0.0 )
    ZQL = PSRC
    ZQR = PSRC
@@ -1857,34 +1857,93 @@ ELSEWHERE ( ZQ60*ZDQ < -(ZDQ)**2 )
    ZQR = ZQL0 - ZQ6
    ZQL = ZQL0
 ELSEWHERE ( ZQ60*ZDQ > (ZDQ)**2 ) 
-   ZQ6 = 3.0*(ZQR0 - PSRC)
-   ZQL = ZQR0 - ZQ6
-   ZQR = ZQR0
-END WHERE
 #else
-!PW: BUG: done like that because if using PGI (tested up to 16.10)
-! will cause crashes at run (address not mapped)
-! and problems at compilation
-WHERE ( ZDMQ == 0.0 )
-   ZQL = PSRC
-   ZQR = PSRC
-   ZQ6 = 0.0
-END WHERE
-WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ < -(ZDQ)**2 ) )
-   ZQ6 = 3.0*(ZQL0 - PSRC)
-   ZQR = ZQL0 - ZQ6
-   ZQL = ZQL0
-END WHERE
-WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ > (ZDQ)**2 ) )
    ZQ6 = 3.0*(ZQR0 - PSRC)
    ZQL = ZQR0 - ZQ6
    ZQR = ZQR0
 END WHERE
-#endif
 !
 ! recalculate coefficients of the parabolae
 !
 ZDQ = ZQR - ZQL
+#else
+!!!
+!!! initialize final parabolae parameters
+!!!
+!!ZQL = ZQL0
+!!ZQR = ZQR0
+!!ZQ6 = ZQ60 
+!!!
+!!! eliminate over and undershoots and create qL and qR as in Lin96
+!!!
+!!!PW: BUG: done like that because if using PGI (tested up to 16.10)
+!!! will cause crashes at run (address not mapped)
+!!! and problems at compilation
+!!$WHERE ( ZDMQ == 0.0 )
+!!$   ZQL = PSRC
+!!$   ZQR = PSRC
+!!$   ZQ6 = 0.0
+!!$END WHERE
+!!$WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ < -ZDQ**2 ) )
+!!$WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ < -BR_P2(ZDQ) ) )
+!!$   ZQ6 = 3.0*(ZQL0 - PSRC)
+!!$   ZQR = ZQL0 - ZQ6
+!!$   ZQL = ZQL0
+!!$END WHERE
+!!$WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ > ZDQ**2 ) )
+!!$WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ > BR_P2(ZDQ) ) )
+!!$   ZQ6 = 3.0*(ZQR0 - PSRC)
+!!$   ZQL = ZQR0 - ZQ6
+!!$   ZQR = ZQR0
+!!$END WHERE
+!!!
+!!! recalculate coefficients of the parabolae
+!!!
+!!ZDQ = ZQR - ZQL
+   !$acc loop gang vector
+   DO K=1,IKU
+      !$acc loop gang vector
+      DO J=1,IJU
+         !$acc loop gang vector
+         DO I=1,IIU 
+            !
+            ! determine initial coefficients of the parabolae
+            !
+            ZDQ(I,J,K) = ZQR0(I,J,K) - ZQL0(I,J,K)
+            ZQ60(I,J,K) = 6.0*(PSRC(I,J,K) - 0.5*(ZQL0(I,J,K) + ZQR0(I,J,K)))
+            !
+            ! initialize final parabolae parameters
+            !
+            ZQL(I,J,K) = ZQL0(I,J,K)
+            ZQR(I,J,K) = ZQR0(I,J,K)
+            ZQ6(I,J,K) = ZQ60(I,J,K) 
+            !
+            ! eliminate over and undershoots and create qL and qR as in Lin96
+            !
+            IF ( ZDMQ(I,J,K) == 0.0 ) THEN
+               ZQL(I,J,K) = PSRC(I,J,K)
+               ZQR(I,J,K) = PSRC(I,J,K)
+               ZQ6(I,J,K) = 0.0
+            END IF
+            IF ( ( ZDMQ(I,J,K) /= 0.0 ) .AND. ( ZQ60(I,J,K)*ZDQ(I,J,K) < -ZDQ(I,J,K)**2 ) ) THEN
+               ZQ6(I,J,K) = 3.0*(ZQL0(I,J,K) - PSRC(I,J,K))
+               ZQR(I,J,K) = ZQL0(I,J,K) - ZQ6(I,J,K)
+               ZQL(I,J,K) = ZQL0(I,J,K)
+            END IF
+            IF ( ( ZDMQ(I,J,K) /= 0.0 ) .AND. ( ZQ60(I,J,K)*ZDQ(I,J,K) > ZDQ(I,J,K)**2 ) ) THEN
+               ZQ6(I,J,K) = 3.0*(ZQR0(I,J,K) - PSRC(I,J,K))
+               ZQL(I,J,K) = ZQR0(I,J,K) - ZQ6(I,J,K)
+               ZQR(I,J,K) = ZQR0(I,J,K)
+            END IF
+            !
+            ! recalculate coefficients of the parabolae
+            !
+            ZDQ(I,J,K) = ZQR(I,J,K) - ZQL(I,J,K)
+            !
+         END DO
+      END DO
+   END DO
+#endif
 !
 ! and finally calculate fluxes for the advection
 !
-- 
GitLab