diff --git a/src/MNH/rain_ice_fast_rg.f90 b/src/MNH/rain_ice_fast_rg.f90 index 99236f978708246bb13d0ec489096543509dcb88..0d3634267fdd502a2c40b0dd6aa382737abdeee6 100644 --- a/src/MNH/rain_ice_fast_rg.f90 +++ b/src/MNH/rain_ice_fast_rg.f90 @@ -8,7 +8,8 @@ ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 03/06/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) ! P. Wautelet 05/06/2019: optimisations -! J. Escobar 11/08/2020: Bypass PGI/NVHPC OPENACC BUG, error 700: Illegal address during kernel execution => DO CONCURRENT +! J. Escobar 11/08/2020: Bypass PGI/NVHPC OPENACC BUG, error 700: Illegal address during kernel execution => DO CONCURRENT +! J. Escobar 12/08/2020: Bypass PGI/NVHPC OPENACC BUG data partially present => enter data in ini_rain_ce & DO CONCURRENT !----------------------------------------------------------------- MODULE MODE_RAIN_ICE_FAST_RG @@ -113,7 +114,10 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays ! ! OUT variables ! -!$acc & PRDRYG, PRWETG ) +!$acc & PRDRYG, PRWETG, & +! +! use var +!$acc & XKER_SDRYG ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -285,14 +289,14 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) ! SDRYG-kernel ! !$acc loop independent - DO JJ = 1,IGDRY + DO CONCURRENT ( JJ = 1:IGDRY ) ZVEC3(JJ) = ( XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * ZVEC1(JJ) & - ( XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & * (ZVEC1(JJ) - 1.0) - END DO + END DO ! CONCURRENT ! !$acc loop independent DO JJ = 1, IGDRY diff --git a/src/MNH/rain_ice_fast_rs.f90 b/src/MNH/rain_ice_fast_rs.f90 index 8027a5508ad7cbd49eff909815ce8e1017b04b61..551bf36c813938ba5839a32e0dbaed69d3b714b7 100644 --- a/src/MNH/rain_ice_fast_rs.f90 +++ b/src/MNH/rain_ice_fast_rs.f90 @@ -8,7 +8,8 @@ ! P. Wautelet 26/04/2019: replace non-standard FLOAT function by REAL function ! P. Wautelet 03/06/2019: remove PACK/UNPACK intrinsics (to get more performance and better OpenACC support) ! P. Wautelet 05/06/2019: optimisations -! J. Escobar 11/08/2020: Bypass PGI/NVHPC OPENACC BUG, error 700: Illegal address during kernel execution => DO CONCURRENT +! J. Escobar 11/08/2020: Bypass PGI/NVHPC OPENACC BUG, error 700: Illegal address during kernel execution => DO CONCURRENT +! J. Escobar 12/08/2020: Bypass PGI/NVHPC OPENACC BUG data partially present => enter data in ini_rain_ce & DO CONCURRENT !----------------------------------------------------------------- MODULE MODE_RAIN_ICE_FAST_RS @@ -100,7 +101,10 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays ! ! INOUT variables ! -!$acc & PRCS, PRRS, PRSS, PRGS, PTHS ) +!$acc & PRCS, PRRS, PRSS, PRGS, PTHS , & +! +! use variable +!$acc & XGAMINC_RIM1,XGAMINC_RIM2) ! ! OUT variables ! @@ -148,7 +152,7 @@ GWORK(:) = PRCT(:)>XRTMIN(2) .AND. PRST(:)>XRTMIN(5) .AND. PRCS(:)>0.0 .AND. PZT #ifndef MNH_OPENACC IGRIM = COUNTJV( GWORK(:), I1(:) ) #else -CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) +CALL COUNTJV_DEVICE( GWORK, I1, IGRIM ) #endif ! IF( IGRIM>0 ) THEN @@ -192,8 +196,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ! ! 5.1.4 riming of the small sized aggregates ! -!$acc loop independent - DO JJ = 1, IGRIM + DO CONCURRENT ( JJ = 1:IGRIM ) ! LOCAL(JL) JL = I1(JJ) #ifndef MNH_BITREP ZZW1(JJ) = MIN( PRCS(JL), & @@ -209,7 +212,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) PRCS(JL) = PRCS(JL) - ZZW1(JJ) PRSS(JL) = PRSS(JL) + ZZW1(JJ) PTHS(JL) = PTHS(JL) + ZZW1(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSS)) - END DO + END DO ! CONCURRENT ! ! 5.1.5 perform the linear interpolation of the normalized ! "XBS"-moment of the incomplete gamma function @@ -222,8 +225,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! -!$acc loop independent - DO JJ = 1, IGRIM + DO CONCURRENT (JJ = 1:IGRIM ) ! LOCAL(JL) JL = I1(JJ) IF ( PRSS(JL) > 0.0 ) THEN #ifndef MNH_BITREP @@ -250,7 +252,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) PRGS(JL) = PRGS(JL) + ZZW2(JJ)+ZZW3(JJ) PTHS(JL) = PTHS(JL) + ZZW2(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RCRIMSG)) END IF - END DO + END DO ! CONCURRENT !$acc end kernels !$acc end data @@ -348,8 +350,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ! ! 5.2.4 raindrop accretion on the small sized aggregates ! -!$acc loop independent - DO JJ = 1, IGACC + DO CONCURRENT ( JJ = 1:IGACC ) ! LOCAL(JL) JL = I1(JJ) #ifndef MNH_BITREP ZZW2(JJ) = & !! coef of RRACCS @@ -368,7 +369,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) PRRS(JL) = PRRS(JL) - ZZW4(JJ) PRSS(JL) = PRSS(JL) + ZZW4(JJ) PTHS(JL) = PTHS(JL) + ZZW4(JJ)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRACCSS)) - END DO + END DO ! CONCURRENT ! ! 5.2.4b perform the bilinear interpolation of the normalized ! RACCS-kernel @@ -381,7 +382,6 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) - XKER_RACCS(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & * (ZVEC2(JJ) - 1.0) END DO ! CONCURRENT -!$acc loop independent DO JJ = 1, IGACC ZZW2(JJ) = ZZW2(JJ) * ZVEC3(JJ) END DO @@ -401,8 +401,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ! 5.2.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! -!$acc loop independent - DO JJ = 1, IGACC + DO CONCURRENT ( JJ = 1:IGACC ) ! LOCAL(JL) JL = I1(JJ) IF ( PRSS(JL) > 0.0 ) THEN ZZW2(JJ) = MAX( MIN( PRRS(JL),ZZW2(JJ)-ZZW4(JJ) ),0.0 ) ! RRACCSG @@ -427,7 +426,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ! f(L_f*(RRACCSG)) END IF END IF - END DO + END DO ! CONCURRENT !$acc end kernels !$acc end data