diff --git a/src/ZSOLVER/turb.f90 b/src/ZSOLVER/turb.f90 index 1061075fcffa6723729195bd24040f4a4580fdb9..8fa13802e433176044e3fa1135a53f786c2986c7 100644 --- a/src/ZSOLVER/turb.f90 +++ b/src/ZSOLVER/turb.f90 @@ -2087,8 +2087,6 @@ END SUBROUTINE CLOUD_MODIF_LM ! END SUBROUTINE TURB - - !################### SUBROUTINE DELT(KKA,KKU,KKL,KKB, KKE,KKTB, KKTE,ORMC01,HTURBDIM,PDXX, PDYY,PZZ,PDIRCOSZW,PLM, ODZ) !################### @@ -2118,6 +2116,7 @@ use mode_mppdb USE MODI_SHUMAN #else USE MODI_SHUMAN_DEVICE +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE #endif implicit none @@ -2155,9 +2154,12 @@ REAL :: ZD ! distance to the surface real, dimension(:,:,:), pointer , contiguous :: ztmp1_device, ztmp2_device #endif ! +integer :: jiu, jju, jku !------------------------------------------------------------------------------- -!$acc data present( PDXX, PDYY, PZZ, PDIRCOSZW, PLM ) +jiu = size( pdxx, 1 ) +jju = size( pdxx, 2 ) +jku = size( pdxx, 3 ) if ( mppdb_initialized ) then !Check all in arrays @@ -2168,13 +2170,18 @@ if ( mppdb_initialized ) then end if #ifdef MNH_OPENACC -allocate( ztmp1_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) ) -allocate( ztmp2_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) ) +!!$allocate( ztmp1_device( JIU,JJU,JKU ) ) +!!$allocate( ztmp2_device( JIU,JJU,JKU ) ) +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() +CALL MNH_MEM_GET( ztmp1_device, JIU,JJU,JKU ) +CALL MNH_MEM_GET( ztmp2_device, JIU,JJU,JKU ) #endif GOCEAN = LOCEAN -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( PDXX, PDYY, PZZ, PDIRCOSZW, PLM ) & +!$acc present( ztmp1_device, ztmp2_device ) IF (ODZ) THEN !$acc kernels @@ -2192,7 +2199,7 @@ IF (ODZ) THEN #else CALL MXF_DEVICE( PDXX, ZTMP1_DEVICE ) !$acc kernels - PLM(:,:,:) = SQRT( PLM(:,:,:) * ZTMP1_DEVICE ) + PLM(:,:,:) = SQRT( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) ) !$acc end kernels #endif ELSE @@ -2207,9 +2214,9 @@ IF (ODZ) THEN CALL MYF_DEVICE( PDYY, ZTMP2_DEVICE ) !$acc kernels #ifndef MNH_BITREP - PLM(:,:,:) = ( PLM(:,:,:) * ZTMP1_DEVICE * ZTMP2_DEVICE ) ** (1./3.) + PLM(:,:,:) = ( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) ) ** (1./3.) #else - PLM(:,:,:) = BR_POW( PLM(:,:,:) * ZTMP1_DEVICE * ZTMP2_DEVICE, 1./3. ) + PLM(:,:,:) = BR_POW( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:), 1./3. ) #endif !$acc end kernels #endif @@ -2218,7 +2225,7 @@ IF (ODZ) THEN ELSE ! Dz not taken into account in computation to assure invariability with vertical grid mesh !$acc kernels - PLM=1.E10 + PLM(:,:,:)=1.E10 !$acc end kernels IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme IF ( L2D) THEN @@ -2241,7 +2248,7 @@ ELSE #ifndef MNH_BITREP PLM(:,:,:) = ( ZTMP1_DEVICE * ZTMP2_DEVICE ) ** (1./2.) #else - PLM(:,:,:) = BR_POW( ZTMP1_DEVICE * ZTMP2_DEVICE, 1. / 2. ) + PLM(:,:,:) = BR_POW( ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:), 1. / 2. ) #endif !$acc end kernels #endif @@ -2253,7 +2260,7 @@ END IF ! mixing length limited by the distance normal to the surface ! (with the same factor as for BL89) ! -!$acc kernels + IF (.NOT. ORMC01) THEN #ifndef MNH_BITREP ZALPHA = 0.5**(-1.5) @@ -2261,8 +2268,9 @@ IF (.NOT. ORMC01) THEN ZALPHA = BR_POW( 0.5, -1.5 ) #endif ! - DO JJ=1,SIZE(PLM,2) - DO JI=1,SIZE(PLM,1) +!$acc kernels + DO JJ=1,JJU + DO JI=1,JIU IF (GOCEAN) THEN DO JK=KKTE,KKTB,-1 ZD=ZALPHA*(PZZ(JI,JJ,KKTE+1)-PZZ(JI,JJ,JK)) @@ -2283,21 +2291,27 @@ IF (.NOT. ORMC01) THEN END DO ENDIF END DO - END DO + END DO +!$acc end kernels END IF ! -PLM(:,:,KKA) = PLM(:,:,KKB ) -PLM(:,:,KKU ) = PLM(:,:,KKE) +!$acc kernels +DO CONCURRENT(JI=1:JIU , JJ=1:JJU ) + PLM(JI,JJ,KKA) = PLM(JI,JJ,KKB ) + PLM(JI,JJ,KKU ) = PLM(JI,JJ,KKE) +END DO !$acc end kernels +!$acc end data + if ( mppdb_initialized ) then !Check all out arrays call Mppdb_check( plm, "Delt end:plm" ) end if -!$acc end data - -!$acc end data +#ifdef MNH_OPENACC +CALL MNH_MEM_RELEASE() +#endif END SUBROUTINE DELT