From 7bcbb68bc7d766eb2f280dee2593c48157e80d3c Mon Sep 17 00:00:00 2001 From: Juan ESCOBAR <juan.escobar@aero.obs-mip.fr> Date: Wed, 26 Oct 2022 15:47:44 +0200 Subject: [PATCH] Juan 26/10/2022:MNH/*, Cray CCE/14.0.3++ Optimsation Problems , add present_cr & minor kernels restructuration --- src/MNH/advecuvw_2nd.f90 | 4 + src/MNH/advecuvw_rk.f90 | 45 +-- src/MNH/ice_adjust.f90 | 16 +- src/MNH/mode_prandtl.f90 | 465 ++++++++++++++++++++++++++----- src/MNH/rain_ice.f90 | 16 +- src/MNH/rain_ice_nucleation.f90 | 4 +- src/MNH/turb.f90 | 115 ++++---- src/MNH/turb_hor_dyn_corr.f90 | 14 +- src/MNH/turb_hor_thermo_flux.f90 | 154 +++++----- src/MNH/turb_hor_uv.f90 | 16 +- src/MNH/turb_hor_uw.f90 | 10 +- src/MNH/turb_hor_vw.f90 | 18 +- src/MNH/turb_ver_dyn_flux.f90 | 76 ++--- src/MNH/turb_ver_thermo_corr.f90 | 142 +++++----- 14 files changed, 735 insertions(+), 360 deletions(-) diff --git a/src/MNH/advecuvw_2nd.f90 b/src/MNH/advecuvw_2nd.f90 index a8313c2f5..5f79d3f6a 100644 --- a/src/MNH/advecuvw_2nd.f90 +++ b/src/MNH/advecuvw_2nd.f90 @@ -117,6 +117,10 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS, PRWS ! Sources of Momentu !* 1. COMPUTES THE ADVECTIVE TENDANCIES ! --------------------------------- ! +!PASCAL +print*," ATTENTION variable PRUS sur GPU " +STOP + PRUS(:,:,:) = PRUS(:,:,:) & -DXM( MXF(PRUCT(:,:,:))*MXF(PUT(:,:,:)) ) ! diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90 index fc1572e0e..511919367 100644 --- a/src/MNH/advecuvw_rk.f90 +++ b/src/MNH/advecuvw_rk.f90 @@ -213,6 +213,7 @@ TYPE(LIST_ll), POINTER :: TZFIELDS4_ll ! list of fields to exchange LOGICAL :: GIBM !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) REAL :: ZIBM_EPSI !Intermediate variable used to work around a Cray compiler bug (CCE 13.0.0) REAL :: ZTIME1,ZTIME2 +INTEGER :: JJI,JJJ,JJK !------------------------------------------------------------------------------- IF (MPPDB_INITIALIZED) THEN @@ -314,7 +315,7 @@ CALL INIT_ON_HOST_AND_DEVICE(ZWT,6e99,'ADVECUVW_RK::ZWT') !$acc data present( PU, PV, PW, PUT, PVT, PWT, PMXM_RHODJ, PMYM_RHODJ, PMZM_RHODJ, & !$acc & PRUCT, PRVCT, PRWCT, PRUS_ADV, PRVS_ADV, PRWS_ADV, & !$acc & PRUS_OTHER, PRVS_OTHER, PRWS_OTHER, ZUT, ZVT, ZWT, & -!$acc & ZRUS, ZRVS, ZRWS, ZIBM, ZBUT, ZBUTS ) +!$acc & ZRUS, ZRVS, ZRWS, ZBUT, ZBUTS ) SELECT CASE (HTEMP_SCHEME) CASE('RK11') @@ -402,20 +403,20 @@ END SELECT !$acc update device(ZBUTS,ZBUT) ! IF ( GIBM ) THEN -!$acc kernels +!$acc kernels present(ZIBM) ZIBM(:,:,:,:) = 1. !$acc end kernels END IF ! IF (GIBM .AND. CIBM_ADV=='FREEZE') THEN -!$acc kernels +!$acc kernels present(ZIBM) WHERE (XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZIBM(:,:,:,1) = 0. WHERE (XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZIBM(:,:,:,2) = 0. WHERE (XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZIBM(:,:,:,3) = 0. !$acc end kernels ENDIF ! -!$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV) present(ZUT,ZVT,ZWT) present(PU,PV,PW) +!$acc kernels present_cr(PU,PV,PW,PRUS_ADV,PRVS_ADV,PRWS_ADV,ZUT,ZVT,ZWT) PRUS_ADV = 0. PRVS_ADV = 0. PRWS_ADV = 0. @@ -447,7 +448,7 @@ CALL ADD3DFIELD_ll( TZFIELDMT_ll, ZWT, 'ADVECUVW_RK::ZWT' ) INBVAR = 3 CALL INIT_HALO2_ll(TZHALO2MT_ll,INBVAR,SIZE(PUT,1),SIZE(PUT,2),SIZE(PWT,3)) ! -!$acc kernels +!$acc kernels present_cr(ZRUS,ZRVS,ZRWS) ZRUS(:, :, :, : ) = 0. ZRVS(:, :, :, : ) = 0. ZRWS(:, :, :, : ) = 0. @@ -486,7 +487,7 @@ RKLOOP: DO JS = 1, ISPL ! -------------------------- ! IF (GIBM .AND. CIBM_ADV=='LOWORD') THEN -!$acc kernels +!$acc kernels present_cr(ZIBM,ZRUS,ZRVS,ZRWS) ZIBM(:,:,:,1)=ZRUS(:,:,:,JS) ZIBM(:,:,:,2)=ZRVS(:,:,:,JS) ZIBM(:,:,:,3)=ZRWS(:,:,:,JS) @@ -513,13 +514,25 @@ RKLOOP: DO JS = 1, ISPL TZHALO2MT_ll ) ENDIF IF (HUVW_ADV_SCHEME=='CEN4TH') THEN + !$acc update self(ZIBM) CALL ADVECUVW_2ND (ZUT, ZVT, ZWT, PRUCT, PRVCT, PRWCT, & ZIBM(:,:,:,1), ZIBM(:,:,:,2), ZIBM(:,:,:,3)) + !$acc update device(ZIBM) ENDIF - WHERE(XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) ZRUS(:,:,:,JS)=ZIBM(:,:,:,1) - WHERE(XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) ZRVS(:,:,:,JS)=ZIBM(:,:,:,2) - WHERE(XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) ZRWS(:,:,:,JS)=ZIBM(:,:,:,3) + !$acc kernels present_cr(ZIBM,ZRUS,ZRVS,ZRWS) + !$mnh_expand_where(JJI=1:IIU,JJJ=1:IJU,JJK=1:IKU) + WHERE(XIBM_LS(:,:,:,2).GT.-ZIBM_EPSI) + ZRUS(:,:,:,JS)=ZIBM(:,:,:,1) + END WHERE + WHERE(XIBM_LS(:,:,:,3).GT.-ZIBM_EPSI) + ZRVS(:,:,:,JS)=ZIBM(:,:,:,2) + END WHERE + WHERE(XIBM_LS(:,:,:,4).GT.-ZIBM_EPSI) + ZRWS(:,:,:,JS)=ZIBM(:,:,:,3) + END WHERE + !$mnh_end_expand_where() ZIBM(:,:,:,:)=1. + !$acc end kernels ENDIF ! write ( ynum, '( I3 )' ) js @@ -552,15 +565,15 @@ RKLOOP: DO JS = 1, ISPL ! ! Guesses at the end of the RK loop ! -!$acc kernels present(PRUS_ADV,PRVS_ADV,PRWS_ADV,ZBUTS) present(ZRUS,ZRVS,ZRWS,ZIBM) +!$acc kernels present_cr(PRUS_ADV,PRVS_ADV,PRWS_ADV,ZBUTS) present_cr(ZRUS,ZRVS,ZRWS,ZIBM) IF ( .NOT. GIBM ) THEN PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JS) * ZRUS(:,:,:,JS) PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JS) * ZRVS(:,:,:,JS) PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JS) * ZRWS(:,:,:,JS) ELSE - PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JI) * ZRUS(:,:,:,JI) * ZIBM(:,:,:,1) - PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JI) * ZRVS(:,:,:,JI) * ZIBM(:,:,:,2) - PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JI) * ZRWS(:,:,:,JI) * ZIBM(:,:,:,3) + PRUS_ADV(:,:,:) = PRUS_ADV(:,:,:) + ZBUTS(JS) * ZRUS(:,:,:,JS) * ZIBM(:,:,:,1) + PRVS_ADV(:,:,:) = PRVS_ADV(:,:,:) + ZBUTS(JS) * ZRVS(:,:,:,JS) * ZIBM(:,:,:,2) + PRWS_ADV(:,:,:) = PRWS_ADV(:,:,:) + ZBUTS(JS) * ZRWS(:,:,:,JS) * ZIBM(:,:,:,3) END IF !$acc end kernels ! @@ -570,7 +583,7 @@ RKLOOP: DO JS = 1, ISPL ! !$acc & present(ZRUS,ZRVS,ZRWS,ZIBM) present(PRUS_OTHER,PRVS_OTHER,PRWS_OTHER) & ! !$acc & present(PMXM_RHODJ,PMYM_RHODJ,PMZM_RHODJ) ! -!$acc kernels present( ZUT, ZVT, ZWT ) +!$acc kernels present_cr( ZUT, ZVT, ZWT ) ZUT(:,:,:) = PU(:,:,:) ZVT(:,:,:) = PV(:,:,:) ZWT(:,:,:) = PW(:,:,:) @@ -581,7 +594,7 @@ RKLOOP: DO JS = 1, ISPL ! Intermediate guesses inside the RK loop ! IF ( .NOT. GIBM ) THEN -!$acc kernels present( ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS ) +!$acc kernels present_cr(ZUT,ZVT,ZWT,ZRUS,ZRVS,ZRWS ) ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & @@ -590,7 +603,7 @@ RKLOOP: DO JS = 1, ISPL ( ZRWS(:,:,:,JI) + PRWS_OTHER(:,:,:) ) / PMZM_RHODJ(:,:,:) !$acc end kernels ELSE -!$acc kernels present( ZUT, ZVT, ZWT, ZRUS, ZRVS, ZRWS, ZIBM ) +!$acc kernels present_cr(ZUT,ZVT,ZWT,ZRUS,ZRVS,ZRWS,ZIBM ) ZUT(:,:,:) = ZUT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & ( ZRUS(:,:,:,JI) + PRUS_OTHER(:,:,:) ) / PMXM_RHODJ(:,:,:) * ZIBM(:,:,:,1) ZVT(:,:,:) = ZVT(:,:,:) + ZBUT(JS,JI) * PTSTEP * & diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90 index dc70a8b50..ede57bc29 100644 --- a/src/MNH/ice_adjust.f90 +++ b/src/MNH/ice_adjust.f90 @@ -410,25 +410,25 @@ CALL MNH_MEM_GET( ZTEMP_BUD , IIU, IJU, IKU ) #endif if ( lbudget_th ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = pths(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_TH), trim( hbuname ), ZTEMP_BUD(:,:,:) ) end if if ( lbudget_rv ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prvs(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RV), trim( hbuname ), ZTEMP_BUD(:,:,:) ) end if if ( lbudget_rc ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prcs(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RC), trim( hbuname ), ZTEMP_BUD(:,:,:) ) end if if ( lbudget_ri ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = pris(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RI), trim( hbuname ), ZTEMP_BUD(:,:,:) ) @@ -684,25 +684,25 @@ IF(GPOUT_TH) POUT_TH=ZT / PEXN(:,:,:) ! ---------------------- ! if ( lbudget_th ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = pths(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_TH), trim( hbuname ), ZTEMP_BUD(:,:,:) ) end if if ( lbudget_rv ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prvs(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RV), trim( hbuname ), ZTEMP_BUD(:,:,:) ) end if if ( lbudget_rc ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prcs(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RC), trim( hbuname ), ZTEMP_BUD(:,:,:) ) end if if ( lbudget_ri ) then - !$acc kernels + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = pris(:, :, :) * prhodj(:, :, :) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RI), trim( hbuname ), ZTEMP_BUD(:,:,:) ) diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90 index 50bf57bf1..e8e8bb1cb 100644 --- a/src/MNH/mode_prandtl.f90 +++ b/src/MNH/mode_prandtl.f90 @@ -500,7 +500,7 @@ IF (LTURBDIM_3DIM) THEN D_PHI3DTDZ_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,HTURBDIM,OUSERV) ) #else CALL D_PHI3DTDZ_O_DDTDZ( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, HTURBDIM, OUSERV, ZTMP1_DEVICE ) -!$acc kernels +!$acc kernels present_cr(PD_PHI3DTDZ2_O_DDTDZ) PD_PHI3DTDZ2_O_DDTDZ(:,:,:) = PDTDZ(:,:,:) * (PPHI3(:,:,:) + ZTMP1_DEVICE(:,:,:) ) !$acc end kernels #endif @@ -673,8 +673,10 @@ SUBROUTINE M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_WTH_W2TH #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +#else + REAL, DIMENSION(:,:,:), pointer , contiguous :: ZTMP1_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PM3_WTH_W2TH ) @@ -683,11 +685,15 @@ SUBROUTINE M3_WTH_W2TH(PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH) call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2TH', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory + CALL MNH_MEM_POSITION_PIN() + CALL MNH_MEM_GET(ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device ) +!$acc data present( ztmp1_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -709,6 +715,11 @@ PM3_WTH_W2TH(:,:,IKE+1)=PM3_WTH_W2TH(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC + !Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN + CALL MNH_MEM_RELEASE() +#endif + #ifndef MNH_OPENACC END FUNCTION M3_WTH_W2TH @@ -734,8 +745,10 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE,P REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_WTH_W2TH_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PBLL_O_E, PETHETA, PKEFF, PTKE, PD_M3_WTH_W2TH_O_DDTDZ ) @@ -744,11 +757,15 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA,PKEFF,PTKE,P call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2TH_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET(ztmp1_device, size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device ) +!$acc data present( ztmp1_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -780,6 +797,11 @@ PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() + +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_WTH_W2TH_O_DDTDZ @@ -804,8 +826,10 @@ SUBROUTINE M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_WTH_W2R #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +#else + REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE #endif !$acc data present( PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_WTH_W2R ) @@ -814,11 +838,15 @@ SUBROUTINE M3_WTH_W2R(PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_WTH_W2R) call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2R', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET(ztmp1_device, size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device ) +!$acc data present( ztmp1_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -838,6 +866,12 @@ PM3_WTH_W2R(:,:,IKE+1)=PM3_WTH_W2R(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC + +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() + +#endif #ifndef MNH_OPENACC END FUNCTION M3_WTH_W2R @@ -863,8 +897,10 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_WTH_W2R_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE + #else + REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PD_M3_WTH_W2R_O_DDTDZ ) @@ -873,11 +909,16 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST,PD call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2R_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET(ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device ) +!$acc data present( ztmp1_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -899,6 +940,10 @@ PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_WTH_W2R_O_DDTDZ @@ -926,8 +971,10 @@ SUBROUTINE M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_WTH_WR2 #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE + #else + REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PD, PKEFF, PTKE, PSQRT_TKE, PBLL_O_E, PBETA, PLEPS, PEMOIST, PDTDZ, PM3_WTH_WR2 ) @@ -936,12 +983,18 @@ SUBROUTINE M3_WTH_WR2(PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E,PBETA,PLEPS,PEMOIST,PDTDZ call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WR2', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET(ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 )) +CALL MNH_MEM_GET(ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 )) #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -974,6 +1027,10 @@ PM3_WTH_WR2(:,:,IKE+1)=PM3_WTH_WR2(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_WTH_WR2 @@ -1004,8 +1061,10 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E, REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_WTH_WR2_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE + #else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PTKE, PSQRT_TKE, PBETA, PLEPS, PREDTH1, PREDR1, PD, PKEFF, PBLL_O_E, PEMOIST, PD_M3_WTH_WR2_O_DDTDZ ) @@ -1014,12 +1073,18 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_E, call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_WR2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1054,6 +1119,10 @@ PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_WTH_WR2_O_DDTDZ @@ -1080,8 +1149,11 @@ SUBROUTINE M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST,PM3_WT REAL, DIMENSION(SIZE(PREDR1,1),SIZE(PREDR1,2),SIZE(PREDR1,3)),INTENT(OUT) :: PM3_WTH_WTHR #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE + #endif !$acc data present( PREDR1, PD, PKEFF, PTKE, PSQRT_TKE, PBETA, PLEPS, PEMOIST, PM3_WTH_WTHR ) @@ -1090,12 +1162,19 @@ SUBROUTINE M3_WTH_WTHR(PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PEMOIST,PM3_WT call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WTHR', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1119,6 +1198,10 @@ PM3_WTH_WTHR(:,:,IKE+1)=PM3_WTH_WTHR(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_WTH_WTHR @@ -1185,8 +1268,11 @@ SUBROUTINE M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W2TH) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_W2TH #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE + #else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE + #endif !$acc data present( PREDTH1, PREDR1, PD, PDTDZ, PLM, PLEPS, PTKE, PM3_TH2_W2TH ) @@ -1195,12 +1281,18 @@ SUBROUTINE M3_TH2_W2TH(PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH2_W2TH) call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2TH', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1225,6 +1317,10 @@ PM3_TH2_W2TH(:,:,IKE+1)=PM3_TH2_W2TH(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_TH2_W2TH @@ -1250,8 +1346,10 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_T REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_W2TH_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_TH2_W2TH_O_DDTDZ ) @@ -1260,12 +1358,18 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OUSERV,PD_M3_T call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2TH_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1325,6 +1429,10 @@ PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_W2TH_O_DDTDZ @@ -1348,8 +1456,10 @@ SUBROUTINE M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_WTH2 #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE + #else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_TH2_WTH2 ) @@ -1358,12 +1468,18 @@ SUBROUTINE M3_TH2_WTH2(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH2) call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTH2', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1395,6 +1511,10 @@ PM3_TH2_WTH2(:,:,IKE+1)=PM3_TH2_WTH2(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_TH2_WTH2 @@ -1420,8 +1540,11 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_WTH2_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE + #else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE + #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_TH2_WTH2_O_DDTDZ ) @@ -1430,12 +1553,19 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTH2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1471,6 +1601,10 @@ PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_WTH2_O_DDTDZ @@ -1496,8 +1630,11 @@ SUBROUTINE M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_W2R) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_W2R #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE + #else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE + #endif !$acc data present( PD, PLM, PLEPS, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_W2R ) @@ -1506,12 +1643,19 @@ SUBROUTINE M3_TH2_W2R(PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_W2R) call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2R', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1546,6 +1690,10 @@ PM3_TH2_W2R(:,:,IKE+1)=PM3_TH2_W2R(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_TH2_W2R @@ -1573,8 +1721,10 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIS REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_W2R_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PD_M3_TH2_W2R_O_DDTDZ ) @@ -1583,12 +1733,19 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIS call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2R_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1621,6 +1778,10 @@ PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_W2R_O_DDTDZ @@ -1645,8 +1806,10 @@ SUBROUTINE M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WR2) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_WR2 #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WR2 ) @@ -1655,12 +1818,19 @@ SUBROUTINE M3_TH2_WR2(PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_WR2) call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WR2', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1695,6 +1865,10 @@ PM3_TH2_WR2(:,:,IKE+1)=PM3_TH2_WR2(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_TH2_WR2 @@ -1721,8 +1895,10 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOI REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_WR2_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PD_M3_TH2_WR2_O_DDTDZ ) @@ -1730,12 +1906,19 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOI call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WR2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1773,6 +1956,10 @@ PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_WR2_O_DDTDZ @@ -1798,8 +1985,10 @@ SUBROUTINE M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_TH2_WTHR #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WTHR ) @@ -1808,12 +1997,19 @@ SUBROUTINE M3_TH2_WTHR(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_TH2_ call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTHR', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1837,6 +2033,10 @@ PM3_TH2_WTHR(:,:,IKE+1)=PM3_TH2_WTHR(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_TH2_WTHR @@ -1863,8 +2063,10 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMO REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_TH2_WTHR_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PD_M3_TH2_WTHR_O_DDTDZ ) @@ -1873,12 +2075,19 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMO call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTHR_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1903,6 +2112,10 @@ PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_WTHR_O_DDTDZ @@ -1926,8 +2139,10 @@ SUBROUTINE M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_THR_WTHR #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_THR_WTHR ) @@ -1936,12 +2151,19 @@ SUBROUTINE M3_THR_WTHR(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTHR) call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTHR', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1965,6 +2187,10 @@ PM3_THR_WTHR(:,:,IKE+1)=PM3_THR_WTHR(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_THR_WTHR @@ -1990,8 +2216,10 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_WTHR_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTHR_O_DDTDZ ) @@ -2000,12 +2228,19 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTHR_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2029,6 +2264,10 @@ PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_THR_WTHR_O_DDTDZ @@ -2054,8 +2293,10 @@ SUBROUTINE M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_THR_ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_THR_WTH2 #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PDRDZ, PM3_THR_WTH2 ) @@ -2064,12 +2305,19 @@ SUBROUTINE M3_THR_WTH2(PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PDRDZ,PM3_THR_ call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTH2', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2093,6 +2341,10 @@ PM3_THR_WTH2(:,:,IKE+1)=PM3_THR_WTH2(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_THR_WTH2 @@ -2119,8 +2371,10 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_WTH2_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PDRDZ, PD_M3_THR_WTH2_O_DDTDZ ) @@ -2129,12 +2383,19 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2171,6 +2432,10 @@ PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_THR_WTH2_O_DDTDZ @@ -2196,8 +2461,10 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_WTH2_O_DDRDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTH2_O_DDRDZ ) @@ -2206,12 +2473,19 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETH call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDRDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2238,6 +2512,10 @@ PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_THR_WTH2_O_DDRDZ @@ -2262,8 +2540,10 @@ SUBROUTINE M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH) REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PM3_THR_W2TH #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PLM, PLEPS, PTKE, PDRDZ, PM3_THR_W2TH ) @@ -2272,12 +2552,19 @@ SUBROUTINE M3_THR_W2TH(PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH) call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_W2TH', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2301,6 +2588,10 @@ PM3_THR_W2TH(:,:,IKE+1)=PM3_THR_W2TH(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION M3_THR_W2TH @@ -2328,8 +2619,10 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_W2TH_O_DDTDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PBLL_O_E, PDRDZ, PETHETA, PD_M3_THR_W2TH_O_DDTDZ ) @@ -2338,12 +2631,19 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBLL_O_E,PDRDZ call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDTDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2404,8 +2704,10 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2TH REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)),INTENT(OUT) :: PD_M3_THR_W2TH_O_DDRDZ #endif INTEGER :: IKB, IKE -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE +#else +REAL, DIMENSION(:,:,:), pointer,contiguous :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_THR_W2TH_O_DDRDZ ) @@ -2414,12 +2716,19 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD_M3_THR_W2TH call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDRDZ', 'OpenACC: not yet tested' ) #endif -#ifdef MNH_OPENACC +#ifndef MNH_OPENACC allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) allocate( ztmp2_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#else +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ztmp1_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) +CALL MNH_MEM_GET( ztmp2_device,size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) + #endif -!$acc data create( ztmp1_device, ztmp2_device ) +!$acc data present( ztmp1_device, ztmp2_device ) IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2454,6 +2763,10 @@ PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE) !$acc end data !$acc end data +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif #ifndef MNH_OPENACC END FUNCTION D_M3_THR_W2TH_O_DDRDZ diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index ab373a19e..2c9d9a834 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -534,10 +534,12 @@ CALL RAIN_ICE_NUCLEATION(IIB, IIE, IJB, IJE, IKTB, IKTE,KRR,PTSTEP,& ! optimization by looking for locations where ! the microphysical fields are larger than a minimal value only !!! ! -!$acc kernels +!$acc kernels present_cr(GMICRO) GMICRO(:,:,:) = .FALSE. +!$acc end kernels IF ( KRR == 7 ) THEN +!$acc kernels present_cr(GMICRO) GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. & PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. & @@ -545,15 +547,17 @@ GMICRO(:,:,:) = .FALSE. PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) .OR. & PRHT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(7) +!$acc end kernels ELSE IF( KRR == 6 ) THEN +!$acc kernels present_cr(GMICRO) GMICRO(IIB:IIE,IJB:IJE,IKTB:IKTE) = & PRCT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(2) .OR. & PRRT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(3) .OR. & PRIT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(4) .OR. & PRST(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(5) .OR. & PRGT(IIB:IIE,IJB:IJE,IKTB:IKTE)>XRTMIN(6) - END IF !$acc end kernels + END IF #ifndef MNH_OPENACC IMICRO = COUNTJV( GMICRO(:,:,:),I1(:),I2(:),I3(:)) @@ -996,7 +1000,7 @@ IF( IMICRO >= 0 ) THEN ENDIF !Diagnostic of precipitation fraction -!$acc kernels +!$acc kernels present_cr(PRAINFR,ZRS_ZERO,ZRG_ZERO) PRAINFR(:,:,:) = 0. #ifdef MNH_OPENACC ZRS_ZERO(:,:,:) = 0. @@ -1082,7 +1086,7 @@ IF( IMICRO >= 0 ) THEN ! IF( OWARM ) THEN ! Check if the formation of the raindrops by the slow ! warm processes is allowed -!$acc kernels +!$acc kernels present_cr(PEVAP3D) PEVAP3D(:,:,:)= 0. !$acc end kernels CALL RAIN_ICE_WARM(GMICRO, IMICRO, I1, I2, I3, & @@ -1120,7 +1124,7 @@ IF( IMICRO >= 0 ) THEN ! ---------------------------------------------- ! IF ( KRR == 7 ) THEN -!$acc kernels +!$acc kernels present_cr(ZLBDAH) ZLBDAH(:) = 0. !$acc end kernels CALL RAIN_ICE_FAST_RH(GMICRO, ZRHODREF, ZRVT, ZRCT, ZRIT, ZRST, ZRGT, ZRHT, ZRHODJ, ZPRES, & @@ -1249,7 +1253,7 @@ ELSE END IF !sedimentation of rain fraction -!$acc kernels +!$acc kernels present_cr(ZRR,ZRS,ZRG) ZRR(:,:,:) = PRRS(:,:,:) * PTSTEP ZRS(:,:,:) = PRSS(:,:,:) * PTSTEP ZRG(:,:,:) = PRGS(:,:,:) * PTSTEP diff --git a/src/MNH/rain_ice_nucleation.f90 b/src/MNH/rain_ice_nucleation.f90 index c44d51d60..d563437d5 100644 --- a/src/MNH/rain_ice_nucleation.f90 +++ b/src/MNH/rain_ice_nucleation.f90 @@ -173,9 +173,11 @@ DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) END DO #endif ! +!$acc end kernels + ! optimization by looking for locations where ! the temperature is negative only !!! -! +!$acc kernels present_cr(GNEGT) GNEGT(:,:,:) = .FALSE. GNEGT(KIB:KIE,KJB:KJE,KKTB:KKTE) = PT(KIB:KIE,KJB:KJE,KKTB:KKTE)<XTT !$acc end kernels diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 6c9b64d17..266e76bd7 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -712,15 +712,21 @@ GTURBLEN_BL89_TURBLEN_RM17_TURBLEN_ADAP_ORMC01 = & HTURBLEN=='BL89' .OR. HTURBLEN=='RM17' .OR. HTURBLEN == 'ADAP' .OR. ORMC01 ! !$acc update device(PTHLT,PRT) -!$acc kernels present_cr(ZCOEF_DISS,ZTHLM,ZRM,zcp) +!PASCAL +!!$acc kernels present_cr(ZCOEF_DISS,ZTHLM,ZRM,zcp) !Copy data into ZTHLM and ZRM only if needed IF (HTURBLEN=='BL89' .OR. HTURBLEN=='RM17' .OR. HTURBLEN=='ADAP' .OR. ORMC01) THEN - DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) - ZTHLM(JI,JJ,JK) = PTHLT(JI,JJ,JK) - ZRM(JI,JJ,JK,:) = PRT(JI,JJ,JK,:) - END DO + !$acc kernels present_cr(ZTHLM,ZRM) + ZTHLM(:,:,:) = PTHLT(:,:,:) + ZRM(:,:,:,:) = PRT(:,:,:,:) + !DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) + !ZTHLM(JI,JJ,JK) = PTHLT(JI,JJ,JK) + !ZRM(JI,JJ,JK,:) = PRT(JI,JJ,JK,:) + !END DO + !$acc end kernels END IF ! +!$acc kernels present_cr(ZTRH,ZCOEF_DISS,ZTHLM,ZRM,zcp) ZTRH(:, :, : ) = XUNDEF ! !---------------------------------------------------------------------------- @@ -805,7 +811,7 @@ IF (KRRL >=1) THEN CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, & ZLSOCPEXNM,ZAMOIST_ICE,ZATHETA_ICE) ! -!$acc kernels present( zamoist, zatheta, zlocpexnm, zlvocpexnm, zlsocpexnm, zamoist_ice, zatheta_ice ) +!$acc kernels present_cr( zamoist, zatheta, zlocpexnm, zlvocpexnm, zlsocpexnm, zamoist_ice, zatheta_ice ) DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) IF (PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4)>0.0) THEN ZFRAC_ICE(JI,JJ,JK) = PRT(JI,JJ,JK,4) / ( PRT(JI,JJ,JK,2)+PRT(JI,JJ,JK,4) ) @@ -861,7 +867,7 @@ IF (KRRL >=1) THEN END IF ! ELSE -!$acc kernels present( zlocpexnm ) +!$acc kernels present_cr( zlocpexnm ) ZLOCPEXNM=0. !$acc end kernels END IF ! loop end on KRRL >= 1 @@ -870,7 +876,7 @@ END IF ! loop end on KRRL >= 1 ! !$acc update device(PRRS,PRTHLS) IF ( KRRL >= 1 ) THEN -!$acc kernels present( zlocpexnm ) +!$acc kernels present_cr( zlocpexnm ) IF ( KRRI >= 1 ) THEN DO CONCURRENT (JI=1:JIU,JJ=1:JJU,JK=1:JKU) ! Rnp at t @@ -907,7 +913,7 @@ SELECT CASE (HTURBLEN) ! ------------------ CASE ('BL89') -!$acc kernels +!$acc kernels present_cr(ZSHEAR) ZSHEAR(:, :, : ) = 0. !$acc end kernels CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKET,ZSHEAR,PLEM) @@ -998,7 +1004,7 @@ END IF !* 3.6 Dissipative length ! ------------------ ! -!$acc kernels +!$acc kernels present_cr(ZLEPS) ZLEPS(:,:,:)=PLEM(:,:,:) ! !* 3.7 Correction in the Surface Boundary Layer (Redelsperger 2001) @@ -1064,7 +1070,7 @@ ENDIF ! CALL UPDATE_ROTATE_WIND(ZUSLOPE,ZVSLOPE) ELSE -!$acc kernels +!$acc kernels present_cr(ZUSLOPE,ZVSLOPE) ZUSLOPE=PUT(:,:,KKA) ZVSLOPE=PVT(:,:,KKA) !$acc end kernels @@ -1127,7 +1133,7 @@ IF (HTOM=='TM06') THEN CALL GZ_W_M_DEVICE(ZMTH2,PDZZ,ZFTH2) ! -d(w'th'2 )/dz !CALL GZ_W_M_DEVICE(ZMR2, PDZZ,ZFR2) ! -d(w'r'2 )/dz !CALL GZ_W_M_DEVICE(ZMTHR,PDZZ,ZFTHR) ! -d(w'th'r')/dz -!$acc kernels +!$acc kernels present_cr(ZFWTH,ZFTH2,ZFWR,ZFR2,ZFTHR) ZFWTH = -ZFWTH !ZFWR = -ZFWR ZFTH2 = -ZFTH2 @@ -1150,7 +1156,7 @@ IF (HTOM=='TM06') THEN ZFTHR = 0. !$acc end kernels ELSE -!$acc kernels +!$acc kernels present_cr(ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR) ZFWTH(:,:,:) = 0. ZFWR(:,:,:) = 0. ZFTH2(:,:,:) = 0. @@ -1170,13 +1176,13 @@ if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W ), 'VTURB', prws ( if ( lbudget_th ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present( ZTEMP_BUD, zlocpexnm ) + !$acc kernels present_cr( ZTEMP_BUD, zlocpexnm ) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) ) @@ -1187,12 +1193,12 @@ end if if ( lbudget_rv ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) ) @@ -1236,13 +1242,13 @@ if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'VTURB', prws(:, :, if ( lbudget_th ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD, zlocpexnm ) + !$acc kernels present_cr(ZTEMP_BUD, zlocpexnm ) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_TH), 'VTURB', ZTEMP_BUD(:,:,:) ) @@ -1253,12 +1259,12 @@ end if if ( lbudget_rv ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RV), 'VTURB', ZTEMP_BUD(:,:,:) ) @@ -1283,13 +1289,13 @@ if ( hturbdim == '3DIM' ) then if (lbudget_th) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD, zlocpexnm ) + !$acc kernels present_cr(ZTEMP_BUD, zlocpexnm ) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) ) @@ -1300,12 +1306,12 @@ if ( hturbdim == '3DIM' ) then if ( lbudget_rv ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) !$acc end kernels call Budget_store_init( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) ) @@ -1345,13 +1351,13 @@ if ( hturbdim == '3DIM' ) then if ( lbudget_th ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlvocpexnm(:, :, :) * prrs(:, :, :, 2) & + zlsocpexnm(:, :, :) * prrs(:, :, :, 4) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD, zlocpexnm ) + !$acc kernels present_cr(ZTEMP_BUD, zlocpexnm ) ZTEMP_BUD(:,:,:) = prthls(:, :, :) + zlocpexnm(:, :, :) * prrs(:, :, :, 2) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_TH), 'HTURB', ZTEMP_BUD(:,:,:) ) @@ -1362,12 +1368,12 @@ if ( hturbdim == '3DIM' ) then if ( lbudget_rv ) then if ( krri >= 1 .and. krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) - prrs(:, :, :, 4) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) ) else if ( krrl >= 1 ) then - !$acc kernels present(ZTEMP_BUD) + !$acc kernels present_cr(ZTEMP_BUD) ZTEMP_BUD(:,:,:) = prrs(:, :, :, 1) - prrs(:, :, :, 2) !$acc end kernels call Budget_store_end( tbudgets(NBUDGET_RV), 'HTURB', ZTEMP_BUD(:,:,:) ) @@ -1399,7 +1405,7 @@ end if PTHP = PTHP + XG / PTHVREF * MZF( PFLXZTHVMF ) #else CALL MZF_DEVICE( PFLXZTHVMF, ZTMP1_DEVICE ) -!$acc kernels +!$acc kernels present_cr(PTHP) PTHP(:,:,:) = PTHP(:,:,:) + XG / PTHVREF(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels #endif @@ -1481,7 +1487,7 @@ END IF ! IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN -!$acc kernels +!$acc kernels present_cr(PRT,PRRS,PTHLT,PRTHLS) PRT(:,:,:,1) = PRT(:,:,:,1) - PRT(:,:,:,2) - PRT(:,:,:,4) PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) - PRRS(:,:,:,4) PTHLT(:,:,:) = PTHLT(:,:,:) + ZLVOCPEXNM(:,:,:) * PRT(:,:,:,2) & @@ -1499,7 +1505,7 @@ IF ( KRRL >= 1 ) THEN CALL MNH_MEM_RELEASE() #endif ELSE -!$acc kernels present( zlocpexnm ) +!$acc kernels present_cr(PRT,PRRS,PTHLT,PRTHLS, zlocpexnm ) PRT(:,:,:,1) = PRT(:,:,:,1) - PRT(:,:,:,2) PRRS(:,:,:,1) = PRRS(:,:,:,1) - PRRS(:,:,:,2) PTHLT(:,:,:) = PTHLT(:,:,:) + ZLOCPEXNM(:,:,:) * PRT(:,:,:,2) @@ -1533,7 +1539,7 @@ IF (LLES_CALL) THEN #ifndef MNH_OPENACC CALL LES_MEAN_SUBGRID((PSFU*PSFU+PSFV*PSFV)**0.25,X_LES_USTAR) #else -!$acc kernels +!$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,1) = (PSFU*PSFU+PSFV*PSFV)**0.25 !$acc end kernels CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE(:,:,1),X_LES_USTAR) @@ -1579,17 +1585,17 @@ IF (LLES_CALL) THEN #else IF (HTURBDIM=="1DIM") THEN !$acc data copy(X_LES_SUBGRID_U2,X_LES_SUBGRID_V2,X_LES_SUBGRID_W2,X_LES_RES_ddz_Thl_SBG_W2) -!$acc kernels +!$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE = 2./3.*PTKET !$acc end kernels CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE,X_LES_SUBGRID_U2) -!$acc kernels +!$acc kernels present_cr(X_LES_SUBGRID_V2,X_LES_SUBGRID_W2) X_LES_SUBGRID_V2(:,:,:) = X_LES_SUBGRID_U2(:,:,:) X_LES_SUBGRID_W2(:,:,:) = X_LES_SUBGRID_U2(:,:,:) !$acc end kernels CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PTHLT,PDZZ,ZTMP2_DEVICE) CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) -!$acc kernels +!$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE*ZTMP3_DEVICE !$acc end kernels CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_RES_ddz_Thl_SBG_W2) @@ -1598,7 +1604,7 @@ IF (LLES_CALL) THEN !$acc data copy(X_LES_RES_ddz_Rt_SBG_W2) CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PRT(:,:,:,1),PDZZ,ZTMP2_DEVICE) CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) -!$acc kernels +!$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE*PTKET*ZTMP3_DEVICE !$acc end kernels CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_RES_ddz_Rt_SBG_W2) @@ -1608,7 +1614,7 @@ IF (LLES_CALL) THEN DO JSV=1,NSV CALL GZ_M_W_DEVICE(KKA,KKU,KKL,PSVT(:,:,:,JSV),PDZZ,ZTMP2_DEVICE) CALL MZF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) -!$acc kernels +!$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE*PTKET*ZTMP3_DEVICE !$acc end kernels CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_RES_ddz_Sv_SBG_W2(:,:,:,JSV)) @@ -1627,7 +1633,7 @@ IF (LLES_CALL) THEN ! !* presso-correlations for subgrid Tke are equal to zero. ! -!$acc kernels +!$acc kernels present_cr(ZLEPS) ZLEPS = 0. !ZLEPS is used as a work array (not used anymore) !$acc end kernels CALL LES_MEAN_SUBGRID(ZLEPS,X_LES_SUBGRID_WP) @@ -1757,7 +1763,7 @@ geast = HLBCX(2) /= "CYCL" .AND. LEAST_ll() gsouth = HLBCY(1) /= "CYCL" .AND. LSOUTH_ll() gnorth = HLBCY(2) /= "CYCL" .AND. LNORTH_ll() -!$acc kernels +!$acc kernels present_cr(PUSLOPE) IF ( gwest ) THEN PUSLOPE(IIB-1,:)=PUSLOPE(IIB,:) PVSLOPE(IIB-1,:)=PVSLOPE(IIB,:) @@ -1853,7 +1859,7 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ! !* 1.1 Lv/Cph at t ! -!$acc kernels ! present(ZRVSAT,ZDRVSATDT) ! present(PLOCPEXN) ! present ZDRVSATDT) +!$acc kernels present_cr(PLOCPEXN) ! present(ZRVSAT,ZDRVSATDT) ! present(PLOCPEXN) ! present ZDRVSATDT) PLOCPEXN(:,:,:) = ( PLTT + (XCPV-PC) * (PT(:,:,:)-XTT) ) / PCP(:,:,:) ! !* 1.2 Saturation vapor pressure at t @@ -1885,9 +1891,9 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) PAMOIST(:,:,:)= 0.5 / ( 1.0 + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) ) ! !$acc end kernels -!$acc kernels !* 1.6 compute Atheta #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +!$acc kernels present_cr(PATHETA) PATHETA(:,:,:)= PAMOIST(:,:,:) * PEXN(:,:,:) * & ( ( ZRVSAT(:,:,:) - PRT(:,:,:,1) ) * PLOCPEXN(:,:,:) / & ( 1. + ZDRVSATDT(:,:,:) * PLOCPEXN(:,:,:) ) * & @@ -1899,7 +1905,9 @@ CALL MNH_MEM_GET( zdrvsatdt, size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) & - ZDRVSATDT(:,:,:) & ) +!$acc end kernels #else +!$acc kernels !$acc_nv loop independent collapse(3) DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) PATHETA(JI,JJ,JK)= PAMOIST(JI,JJ,JK) * PEXN(JI,JJ,JK) * & @@ -1914,11 +1922,12 @@ DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) - ZDRVSATDT(JI,JJ,JK) & ) ENDDO -#endif !$acc end kernels +#endif !* 1.7 Lv/Cph/Exner at t-1 ! -!$acc kernels present(PLOCPEXN) +!!$acc kernels present(PLOCPEXN) +!$acc kernels !$acc_nv loop independent collapse(3) DO CONCURRENT(JI=1:JIU,JJ=1:JJU,JK=1:JKU) PLOCPEXN(JI,JJ,JK) = PLOCPEXN(JI,JJ,JK) / PEXN(JI,JJ,JK) @@ -2228,7 +2237,7 @@ GOCEAN = LOCEAN !$acc present( ztmp1_device, ztmp2_device ) IF (ODZ) THEN -!$acc kernels +!$acc kernels present_cr(PLM) ! Dz is take into account in the computation DO JK = KKTB,KKTE ! 1D turbulence scheme PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK) @@ -2242,7 +2251,7 @@ IF (ODZ) THEN PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) #else CALL MXF_DEVICE( PDXX, ZTMP1_DEVICE ) -!$acc kernels +!$acc kernels present_cr(PLM) PLM(:,:,:) = SQRT( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) ) !$acc end kernels #endif @@ -2256,21 +2265,23 @@ IF (ODZ) THEN #else CALL MXF_DEVICE( PDXX, ZTMP1_DEVICE ) CALL MYF_DEVICE( PDYY, ZTMP2_DEVICE ) -!$acc kernels #if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +!$acc kernels present_cr(PLM) PLM(:,:,:) = ( PLM(:,:,:) * ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) ) ** (1./3.) +!$acc end kernels #else +!$acc kernels DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) PLM(JI,JJ,JK) = BR_POW( PLM(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK), 1./3. ) ENDDO -#endif !$acc end kernels +#endif #endif END IF END IF ELSE ! Dz not taken into account in computation to assure invariability with vertical grid mesh -!$acc kernels +!$acc kernels present_cr(PLM) PLM(:,:,:)=1.E10 !$acc end kernels IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme @@ -2511,7 +2522,7 @@ CALL MNH_MEM_GET( ZTMP2_DEVICE, JIU, JJU, JKU ) ! ! initialize the mixing length with the mesh grid -!$acc kernels +!$acc kernels present_cr(PLM) ! 1D turbulence scheme PLM(:,:,KKTB:KKTE) = PZZ(:,:,KKTB+KKL:KKTE+KKL) - PZZ(:,:,KKTB:KKTE) PLM(:,:,KKU) = PLM(:,:,KKE) @@ -2523,7 +2534,7 @@ IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme PLM(:,:,:) = SQRT( PLM(:,:,:)*MXF(PDXX(:,:,:)) ) #else CALL MXF_DEVICE(PDXX,ZTMP1_DEVICE) -!$acc kernels +!$acc kernels present_cr(PLM) PLM(:,:,:) = SQRT( PLM(:,:,:)*ZTMP1_DEVICE ) !$acc end kernels if ( mppdb_initialized ) then @@ -2542,7 +2553,7 @@ IF ( HTURBDIM /= '1DIM' ) THEN ! 3D turbulence scheme #else CALL MXF_DEVICE(PDXX,ZTMP1_DEVICE) CALL MYF_DEVICE(PDYY,ZTMP2_DEVICE) -!$acc kernels +!$acc kernels present_cr(PLM) PLM(:,:,:) = (PLM(:,:,:)*ZTMP1_DEVICE*ZTMP2_DEVICE ) ** (1./3.) !$acc end kernels if ( mppdb_initialized ) then diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90 index 3472c9da3..59b5e3631 100644 --- a/src/MNH/turb_hor_dyn_corr.f90 +++ b/src/MNH/turb_hor_dyn_corr.f90 @@ -395,7 +395,8 @@ IKU = SIZE(PUM,3) ! ! !$acc kernels async(1) -#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +#if !defined(MNH_BITREP) ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) #else !$mnh_expand_array(JI=1:JIU,JJ=1:JJU ) @@ -619,7 +620,8 @@ CALL MYF_DEVICE(PDYY(:,:,IKB:IKB),ZTMP4_DEVICE(:,:,1:1)) !$acc wait(1) ! !$acc kernels async(4) present_cr(ZFLX,ZDIRSINZW) -#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +#if !defined(MNH_BITREP) ZFLX(:,:,IKB-1) = & PTAU11M(:,:) * PCOSSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2 & -2. * PTAU12M(:,:) * PCOSSLOPE(:,:)* PSINSLOPE(:,:) * PDIRCOSZW(:,:) & @@ -779,7 +781,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN !!! wait for the computation of ZWORK and PDP !$acc wait(2) ! - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = -ZWORK(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) @@ -844,7 +846,8 @@ ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) ! ! extrapolates this flux under the ground with the surface flux !$acc kernels async(3) present_cr(ZFLX) -#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +#if !defined(MNH_BITREP) ZFLX(:,:,IKB-1) = & PTAU11M(:,:) * PSINSLOPE(:,:)**2 * PDIRCOSZW(:,:)**2 & +2. * PTAU12M(:,:) * PCOSSLOPE(:,:)* PSINSLOPE(:,:) * PDIRCOSZW(:,:) & @@ -1068,7 +1071,8 @@ ZFLX(:,:,IKE+1)= ZFLX(:,:,IKE) ! (-2./3.) * PTP(:,:,IKB:IKB) ! extrapolates this flux under the ground with the surface flux !$acc kernels async(3) present_cr(ZFLX) -#if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +!if !defined(MNH_BITREP) && !defined(MNH_BITREP_OMP) +#if !defined(MNH_BITREP) ZFLX(:,:,IKB-1) = & PTAU11M(:,:) * ZDIRSINZW(:,:)**2 & + PTAU33M(:,:) * PDIRCOSZW(:,:)**2 & diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90 index 52cff5188..18f237e55 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -331,7 +331,7 @@ ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) #else CALL MXM_DEVICE( PK, ZTMP1_DEVICE ) CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) @@ -359,7 +359,7 @@ ZTMP3_DEVICE(:,:,1) = ZCOEFF(:,:,IKB+2)*PTHLM(:,:,IKB+2) & +ZCOEFF(:,:,IKB )*PTHLM(:,:,IKB ) !$acc end kernels CALL MXM_DEVICE( ZTMP3_DEVICE(:,:,1:1), ZTMP4_DEVICE(:,:,1:1)) -!$acc kernels present_cr(ZFLX,ZTMP1_DEVICE) +!$acc kernels present_cr(ZFLX,ZTMP1_DEVICE,ZTMP2_DEVICE) ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) * & ( ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) - ZTMP4_DEVICE(:,:,1) & *0.5* ( PDZX(:,:,IKB+1)+PDZX(:,:,IKB)) & @@ -373,7 +373,7 @@ ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) * & ZFLX(:,:,IKB-1:IKB-1) = 2. * MXM( SPREAD( PSFTHM(:,:)* PDIRCOSXW(:,:), 3,1) ) & - ZFLX(:,:,IKB:IKB) #else -! acc kernels +! acc kernels present(ZTMP1_DEVICE) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) ZTMP1_DEVICE(JI,JJ,1) = PSFTHM(JI,JJ)* PDIRCOSXW(JI,JJ) END DO @@ -397,44 +397,44 @@ END IF #else IF (.NOT. LFLAT) THEN CALL MXM_DEVICE(PRHODJ, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) END DO !$acc end kernels CALL DXF_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) END DO !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK) END DO !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE, ZTMP4_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) END DO !$acc end kernels CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE ) -!$acc kernels +!$acc kernels present_cr(PRTHLS) PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) !$acc end kernels ELSE CALL MXM_DEVICE(PRHODJ, ZTMP1_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDXX(:,:,:) !$acc end kernels CALL DXF_DEVICE(ZTMP2_DEVICE, ZTMP3_DEVICE) -!$acc kernels +!$acc kernels present_cr(PRTHLS) PRTHLS(:,:,:) = PRTHLS(:,:,:) - ZTMP3_DEVICE(:,:,:) !$acc end kernels END IF @@ -486,7 +486,7 @@ END IF #else IF ( KRRL >= 1 ) THEN IF (.NOT. LFLAT) THEN - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MZM_DEVICE( ZTMP1_DEVICE, ZTMP4_DEVICE ) @@ -511,7 +511,7 @@ IF ( KRRL >= 1 ) THEN ZFLXC(:,:,:) = 2.*( ZTMP2_DEVICE(:,:,:) +ZTMP7_DEVICE(:,:,:) ) !$acc end kernels IF ( KRRI >= 1 ) THEN - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -528,15 +528,15 @@ IF ( KRRL >= 1 ) THEN PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * (- ZTMP2_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MXM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:) *ZFLX(:,:,:)*PINV_PDXX(:,:,:) !$acc end kernels CALL DXF_DEVICE( ZTMP6_DEVICE, ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP4_DEVICE(:,:,:)*ZTMP5_DEVICE(:,:,:)*PINV_PDZZ(:,:,:) !$acc end kernels CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) @@ -545,11 +545,11 @@ IF ( KRRL >= 1 ) THEN !$acc end kernels END IF ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MXM_DEVICE( ZTMP1_DEVICE,ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:) !$acc end kernels CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) @@ -557,7 +557,7 @@ IF ( KRRL >= 1 ) THEN ZFLXC(:,:,:) = 2.*ZTMP4_DEVICE(:,:,:) !$acc end kernels IF ( KRRI >= 1 ) THEN - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDXX(:,:,:) !$acc end kernels CALL DXF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -566,7 +566,7 @@ IF ( KRRL >= 1 ) THEN PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP2_DEVICE(:,:,:)*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDXX(:,:,:) !$acc end kernels CALL DXF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -618,7 +618,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN ! CALL GX_W_UW_DEVICE(PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) @@ -627,14 +627,14 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN ! CALL GX_M_M_DEVICE(PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MXF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) ! IF (KRR>=1) THEN CALL GX_M_M_DEVICE(PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) @@ -764,7 +764,7 @@ END IF #else CALL MXM_DEVICE( PK, ZTMP1_DEVICE ) CALL GX_M_U_DEVICE(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP2_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) @@ -782,7 +782,7 @@ END DO +ZCOEFF(:,:,IKB )*PRM(:,:,IKB ,1) !$acc end kernels CALL MXM_DEVICE(ZTMP3_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1)) -!$acc kernels present_cr(ZFLX) +!$acc kernels present_cr(ZFLX,ZTMP1_DEVICE) ZFLX(:,:,IKB) = -XCHF * ZTMP1_DEVICE(:,:,1) * & ( ZTMP2_DEVICE(:,:,1) * PINV_PDXX(:,:,IKB) & -ZTMP4_DEVICE(:,:,1) & @@ -803,28 +803,28 @@ END DO ! IF (.NOT. LFLAT) THEN CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) END DO !$acc end kernels CALL DXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDXX(JI,JJ,JK) END DO !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PDZX(JI,JJ,JK)*ZTMP4_DEVICE(JI,JJ,JK) END DO !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP4_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) @@ -839,7 +839,7 @@ END DO !$acc end kernels ELSE CALL MXM_DEVICE(PRHODJ,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDXX(:,:,:) !$acc end kernels CALL DXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) @@ -851,7 +851,7 @@ END DO ! Compute the equivalent tendancy for Rc and Ri ! IF ( KRRL >= 1 ) THEN - !$acc kernels present_cr(ZTMP2_DEVICE) + !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:) ZTMP2_DEVICE(:,:,:) = ZFLX(:,:,:)*PINV_PDXX(:,:,:) !$acc end kernels @@ -893,24 +893,24 @@ END DO !$acc end kernels END IF ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP4_DEVICE) ZTMP4_DEVICE(:,:,:) = ZTMP8_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL DXF_DEVICE(ZTMP4_DEVICE, ZTMP5_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP8_DEVICE(:,:,:)*ZFLX(:,:,:) !$acc end kernels CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZFLXC) ZFLXC(:,:,:) = ZFLXC(:,:,:) + 2.*ZTMP4_DEVICE(:,:,:) !$acc end kernels IF ( KRRI >= 1 ) THEN - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP5_DEVICE(:,:,:)*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP5_DEVICE(:,:,:)*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP5_DEVICE(:,:,:) !$acc end kernels END IF @@ -944,7 +944,7 @@ END DO ! CALL GX_W_UW_DEVICE(PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) @@ -953,14 +953,14 @@ END DO ! CALL GX_M_M_DEVICE(PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MXF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) ! CALL GX_M_M_DEVICE(PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MXF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) @@ -1139,7 +1139,7 @@ END IF #else CALL MYM_DEVICE( PK, ZTMP1_DEVICE ) CALL GY_M_V_DEVICE(1,IKU,1,PTHLM,PDYY,PDZZ,PDZY,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCSHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) @@ -1147,7 +1147,7 @@ END IF ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(ZFLX) ZFLX(:,:,:) = 0. !$acc end kernels END IF @@ -1173,7 +1173,7 @@ ZFLX(:,:,IKB) = -XCSHF * ZTMP1_DEVICE(:,:,1) * & ! extrapolates the flux under the ground so that the vertical average with ! the IKB flux gives the ground value ( warning the tangential surface ! flux has been set to 0 for the moment !! to be improved ) -!$acc kernels +!$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,1) = PSFTHM(:,:)* PDIRCOSYW(:,:) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) ) @@ -1186,28 +1186,28 @@ ZFLX(:,:,IKB-1) = 2. * ZTMP2_DEVICE(:,:,1) - ZFLX(:,:,IKB) IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) END DO !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) END DO !$acc end kernels CALL MZM_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) END DO !$acc end kernels CALL MYF_DEVICE(ZTMP1_DEVICE, ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) @@ -1222,7 +1222,7 @@ IF (.NOT. L2D) THEN !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDYY(:,:,:) !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) @@ -1237,7 +1237,7 @@ END IF !IF ( OSUBG_COND .AND. KRRL > 0 .AND. .NOT. L2D) THEN IF ( KRRL >= 1 .AND. .NOT. L2D) THEN IF (.NOT. LFLAT) THEN - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -1275,11 +1275,11 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * (- ZTMP4_DEVICE(:,:,:) + ZTMP5_DEVICE(:,:,:) )*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDYY(:,:,:) !$acc end kernels CALL DYF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP6_DEVICE(:,:,:)*PINV_PDZZ(:,:,:) !$acc end kernels CALL DZF_DEVICE( ZTMP3_DEVICE, ZTMP5_DEVICE ) @@ -1288,11 +1288,11 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN !$acc end kernels END IF ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PATHETA(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:) !$acc end kernels CALL MYF_DEVICE( ZTMP1_DEVICE, ZTMP3_DEVICE ) @@ -1300,17 +1300,17 @@ IF ( KRRL >= 1 .AND. .NOT. L2D) THEN ZFLXC(:,:,:) = 2.*ZTMP3_DEVICE(:,:,:) !$acc end kernels ! - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:)*PINV_PDYY(:,:,:) !$acc end kernels CALL DYF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) IF ( KRRI >= 1 ) THEN - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:)*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP2_DEVICE(:,:,:)*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:) !$acc end kernels END IF @@ -1345,7 +1345,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN ! CALL GY_W_VW_DEVICE(PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE, ZTMP4_DEVICE) @@ -1354,7 +1354,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN ! CALL GY_M_M_DEVICE(PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaThl , .TRUE. ) @@ -1365,7 +1365,7 @@ IF (KSPLT==1 .AND. LLES_CALL) THEN !$acc data copy(X_LES_RES_ddxa_Rt_SBG_UaThl) CALL GY_M_M_DEVICE(PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE,X_LES_RES_ddxa_Rt_SBG_UaThl , .TRUE. ) @@ -1506,7 +1506,7 @@ IF (KRR/=0) THEN IF (.NOT. L2D) THEN CALL MYM_DEVICE( PK, ZTMP1_DEVICE ) CALL GY_M_V_DEVICE(1,IKU,1,PRM(:,:,:,1),PDYY,PDZZ,PDZY, ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZFLX) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZFLX(JI,JJ,JK) = -XCHF * ZTMP1_DEVICE(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) @@ -1514,7 +1514,7 @@ IF (KRR/=0) THEN ZFLX(:,:,IKE+1) = ZFLX(:,:,IKE) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(ZFLX) ZFLX(:,:,:) = 0. !$acc end kernels END IF @@ -1539,7 +1539,7 @@ IF (KRR/=0) THEN ! extrapolates the flux under the ground so that the vertical average with ! the IKB flux gives the ground value ( warning the tangential surface ! flux has been set to 0 for the moment !! to be improved ) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,1) = PSFRM(:,:)* PDIRCOSYW(:,:) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE(:,:,1:1), ZTMP2_DEVICE(:,:,1:1) ) @@ -1552,7 +1552,7 @@ IF (KRR/=0) THEN IF (.NOT. L2D) THEN IF (.NOT. LFLAT) THEN CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP2_DEVICE(JI,JJ,JK) = ZTMP1_DEVICE(JI,JJ,JK) * ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) @@ -1560,21 +1560,21 @@ IF (KRR/=0) THEN !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) ! - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = ZFLX(JI,JJ,JK) * PINV_PDYY(JI,JJ,JK) END DO !$acc end kernels CALL MZM_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PDZY(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) END DO !$acc end kernels CALL MYF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) !$acc_nv loop independent collapse(3) DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZTMP1_DEVICE(JI,JJ,JK) = PMZM_PRHODJ(JI,JJ,JK) * ZTMP2_DEVICE(JI,JJ,JK) * PINV_PDZZ(JI,JJ,JK) @@ -1590,7 +1590,7 @@ IF (KRR/=0) THEN !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZFLX(:,:,:) * PINV_PDYY(:,:,:) !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) @@ -1604,7 +1604,7 @@ IF (KRR/=0) THEN ! IF ( KRRL >= 1 .AND. .NOT. L2D) THEN ! Sub-grid condensation IF (.NOT. LFLAT) THEN - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) @@ -1637,39 +1637,39 @@ IF (KRR/=0) THEN ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)* PINV_PDZZ(:,:,:) !$acc end kernels CALL DZF_DEVICE( ZTMP2_DEVICE, ZTMP4_DEVICE ) - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * (- ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) + 2. * (- ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) )*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) + 2. * (- ZTMP3_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) ) !$acc end kernels END IF ELSE - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PRHODJ(:,:,:)*PAMOIST(:,:,:)*PSRCM(:,:,:) !$acc end kernels CALL MYM_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP2_DEVICE(:,:,:)*ZFLX(:,:,:) !$acc end kernels CALL MXF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZFLXC) ZFLXC(:,:,:) = ZFLXC(:,:,:) + 2.*ZTMP4_DEVICE(:,:,:) !$acc end kernels ! - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = ZTMP3_DEVICE(:,:,:)* PINV_PDYY(:,:,:) !$acc end kernels CALL DYF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) IF ( KRRI >= 1 ) THEN - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:)*(1.0-PFRAC_ICE(:,:,:)) PRRS(:,:,:,4) = PRRS(:,:,:,4) - 2. * ZTMP2_DEVICE(:,:,:)*PFRAC_ICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(PRRS) PRRS(:,:,:,2) = PRRS(:,:,:,2) - 2. * ZTMP2_DEVICE(:,:,:) !$acc end kernels END IF @@ -1703,7 +1703,7 @@ IF (KRR/=0) THEN ! CALL GY_W_VW_DEVICE(PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MZM_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE, ZTMP4_DEVICE) @@ -1712,14 +1712,14 @@ IF (KRR/=0) THEN ! CALL GY_M_M_DEVICE(PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Thl_SBG_UaRt , .TRUE. ) ! CALL GY_M_M_DEVICE(PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MYF_DEVICE(ZFLX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP3_DEVICE, X_LES_RES_ddxa_Rt_SBG_UaRt , .TRUE. ) diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index 0a11a3829..fc1125675 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -364,13 +364,13 @@ IF (.NOT. L2D) THEN END DO !CONCURRENT !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(ZFLX) ZFLX(:,:,:)= - XCMFS * ZTMP2_DEVICE * (GX_V_UV_PVM) !$acc end kernels END IF #endif ! -!$acc kernels +!$acc kernels present_cr(ZFLX) ZFLX(:,:,IKE+1)= ZFLX(:,:,IKE) !$acc end kernels ! @@ -437,7 +437,7 @@ ZTMP6_DEVICE(:,:,1) = (PVM(:,:,IKB+1)-PVM(:,:,IKB))*(1./ZTMP3_DEVICE(:,:,1)+1./Z !$acc end kernels CALL MXM_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP4_DEVICE(:,:,1:1)) ! -!$acc kernels +!$acc kernels present_cr(ZTMP6_DEVICE) ZTMP6_DEVICE(:,:,1:1) = (PDZX(:,:,IKB+1:IKB+1)+PDZX(:,:,IKB:IKB)) !$acc end kernels CALL MYM_DEVICE(ZTMP6_DEVICE(:,:,1:1),ZTMP2_DEVICE(:,:,1:1)) @@ -612,7 +612,7 @@ IF (.NOT. LFLAT) THEN END DO !CONCURRENT !$acc end kernels ELSE -!$acc kernels +!$acc kernels present_cr(PRUS) PRUS(:,:,:) = PRUS(:,:,:) - ZTMP1_DEVICE !$acc end kernels END IF @@ -725,7 +725,7 @@ IF (KSPLT==1) THEN END DO !CONCURRENT !$acc end kernels ELSE -!$acc kernels +!$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE = ZFLX * GX_V_UV_PVM !$acc end kernels ENDIF @@ -830,7 +830,7 @@ IF (KSPLT==1) THEN #endif ! ! dynamic production - !$acc kernels + !$acc kernels present_cr(PDP) PDP(:,:,:) = PDP(:,:,:) + ZWORK(:,:,:) !$acc end kernels ! @@ -851,7 +851,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL LES_MEAN_SUBGRID(ZTMP2_DEVICE,X_LES_SUBGRID_UV) ! CALL GY_U_UV_DEVICE(PUM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE = ZTMP1_DEVICE*ZFLX !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE) @@ -859,7 +859,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL LES_MEAN_SUBGRID(ZTMP1_DEVICE, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) ! CALL GX_V_UV_DEVICE(PVM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE = ZTMP1_DEVICE*ZFLX !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE) diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index 6a840a431..186fb9de8 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -533,14 +533,14 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WU , .TRUE. ) ! CALL GZ_U_UW_DEVICE(PUM,PDZZ,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE*ZFLX !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) CALL MZF_DEVICE( ZTMP1_DEVICE, ZTMP2_DEVICE ) CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) ! - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE = GX_W_UW_PWM*ZFLX !$acc end kernels CALL MXF_DEVICE(ZTMP1_DEVICE,ZTMP2_DEVICE) @@ -549,7 +549,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN ! CALL MZF_DEVICE( ZFLX, ZTMP1_DEVICE ) CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE = ZTMP2_DEVICE*ZTMP1_DEVICE !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) @@ -561,7 +561,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN ! CALL MZF_DEVICE( ZFLX, ZTMP1_DEVICE ) CALL GX_M_U_DEVICE(1,IKU,1,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) @@ -574,7 +574,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL MZF_DEVICE( ZFLX, ZTMP1_DEVICE ) DO JSV=1,NSV CALL GX_M_U_DEVICE(1,IKU,1,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP2_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index 3596ac8ce..023773412 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -428,15 +428,15 @@ IF (.NOT. L2D) THEN !$acc end kernels ELSE CALL MYM_DEVICE(PRHODJ, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE * PINV_PDYY !$acc end kernels CALL MZM_DEVICE(ZTMP2_DEVICE, ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE * ZFLX - !$acc end kernels + !$acc end kernels CALL DYF_DEVICE( ZTMP2_DEVICE, ZTMP1_DEVICE ) - !$acc kernels + !$acc kernels present_cr(PRWS) PRWS(:,:,:) = PRWS(:,:,:) - ZTMP1_DEVICE !$acc end kernels END IF @@ -555,7 +555,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WV , .TRUE. ) ! CALL GZ_V_VW_DEVICE(PVM,PDZZ,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE = ZTMP1_DEVICE*ZFLX !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) @@ -563,7 +563,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) ! CALL GY_W_VW_DEVICE(PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLX(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP1_DEVICE) @@ -574,7 +574,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL MZF_DEVICE( ZFLX, ZTMP2_DEVICE ) !PW: kernel removed to work around a PGI 19.10 bug !$acc update self(ZTMP1_DEVICE,ZTMP2_DEVICE) -! !$acc kernels +! !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) ! !$acc end kernels !$acc update device(ZTMP3_DEVICE) @@ -589,7 +589,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL MZF_DEVICE( ZFLX, ZTMP2_DEVICE ) !PW: kernel removed to work around a PGI 19.10 bug !$acc update self(ZTMP1_DEVICE,ZTMP2_DEVICE) -! !$acc kernels +! !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) ! !$acc end kernels !$acc update device(ZTMP3_DEVICE) @@ -603,7 +603,7 @@ IF (LLES_CALL .AND. KSPLT==1) THEN CALL MZF_DEVICE( ZFLX, ZTMP2_DEVICE ) DO JSV=1,NSV CALL GY_M_V_DEVICE(1,IKU,1,PSVM(:,:,:,JSV),PDYY,PDZZ,PDZY,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index a5ac03e88..f608c5be7 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -523,7 +523,7 @@ IKTE=IKT-JPVEXT_TURB GOCEAN = LOCEAN ! -!$acc kernels +!$acc kernels present_cr(ZA,PDP,ZSOURCE) ZA(:,:,:) = XUNDEF PDP(:,:,:) = XUNDEF ZSOURCE(:,:,:) = 0. @@ -536,18 +536,22 @@ DO CONCURRENT ( JI=1:JIU,JJ=1:JJU ) ZDIRSINZW(JI,JJ) = SQRT(1.-BR_P2(PDIRCOSZW(JI,JJ))) END DO #endif +!$acc end kernels + ! compute the coefficients for the uncentred gradient computation near the ! ground ! #ifndef MNH_OPENACC ZKEFF(:,:,:) = MZM( PLM(:,:,:) * SQRT(PTKEM(:,:,:)) ) #else +!PASCAL +!$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) !$acc end kernels CALL MZM_DEVICE(ZTMP1_DEVICE,ZKEFF) #endif ! -!$acc kernels +!$acc kernels present_cr(ZUSLOPEM,ZVSLOPEM) ZUSLOPEM(:,:,1)=PUSLOPEM(:,:) ZVSLOPEM(:,:,1)=PVSLOPEM(:,:) !$acc end kernels @@ -687,7 +691,7 @@ ELSE !ATMOS MODEL ONLY #endif ENDIF ! -!$acc kernels +!$acc kernels present_cr(ZSOURCE) ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. ZSOURCE(:,:,IKE) = 0. !$acc end kernels @@ -709,7 +713,7 @@ CALL TRIDIAG_WIND(KKA,KKU,KKL,PUM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL, & #ifndef MNH_OPENACC PRUS(:,:,:)=PRUS(:,:,:)+MXM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP #else -!$acc kernels +!$acc kernels present_cr(PRUS) PRUS(:,:,:)=PRUS(:,:,:)+ZTMP1_DEVICE(:,:,:)*(ZRES(:,:,:)-PUM(:,:,:))/PTSTEP !$acc end kernels #endif @@ -785,7 +789,7 @@ END IF ! ! first part of total momentum flux ! -!$acc kernels +!$acc kernels present_cr(PWU) PWU(:,:,:) = ZFLXZ(:,:,:) !$acc end kernels ! @@ -804,7 +808,7 @@ END DO !$acc end kernels CALL MXF_DEVICE( ZTMP2_DEVICE,ZTMP3_DEVICE ) CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) -!$acc kernels +!$acc kernels present_cr(PDP) PDP(:,:,:) = - ZTMP4_DEVICE(:,:,:) !$acc end kernels #endif @@ -822,7 +826,7 @@ ZTMP2_DEVICE(:,:,IKB:IKB) = ZFLXZ(:,:,IKB+KKL:IKB+KKL) * (PUM(:,:,IKB+KKL:IKB+KK / ZTMP1_DEVICE(:,:,IKB+KKL:IKB+KKL) !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE(:,:,IKB:IKB), ZTMP3_DEVICE(:,:,IKB:IKB)) -!$acc kernels +!$acc kernels present_cr(PDP) PDP(:,:,IKB:IKB) = - ZTMP3_DEVICE(:,:,IKB:IKB) !$acc end kernels #endif @@ -852,14 +856,14 @@ IF (LLES_CALL) THEN CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WU ) ! CALL GZ_U_UW_DEVICE(PUM,PDZZ,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL MXF_DEVICE( ZTMP2_DEVICE, ZTMP3_DEVICE ) CALL MZF_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) CALL LES_MEAN_SUBGRID( ZTMP4_DEVICE, X_LES_RES_ddxa_U_SBG_UaU ) ! - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = XCMFS * ZKEFF(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE, X_LES_SUBGRID_Km ) @@ -876,12 +880,15 @@ END IF IF(HTURBDIM=='3DIM') THEN ! Compute the source for the W wind component ! used to compute the W source at the ground -!$acc kernels +!PASCAL +!$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation +!$acc end kernels IF (GOCEAN) THEN +!$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation - END IF !$acc end kernels + END IF ! #ifndef MNH_OPENACC IF (.NOT. LFLAT) THEN @@ -932,11 +939,11 @@ IF(HTURBDIM=='3DIM') THEN END DO !$acc end kernels CALL DZM_DEVICE( ZTMP3_DEVICE, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(PRWS) PRWS(:,:,:)= PRWS(:,:,:) - ZTMP1_DEVICE(:,:,:) + ZTMP2_DEVICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(PRWS) PRWS(:,:,:)= PRWS(:,:,:) -ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -1013,7 +1020,7 @@ IF (GOCEAN) THEN ) END IF ! -!$acc kernels +!$acc kernels present_cr(PDP) PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) !$acc end kernels ! @@ -1039,7 +1046,7 @@ END IF !$acc & X_LES_RES_ddxa_Rt_SBG_UaW,X_LES_RES_ddxa_Sv_SBG_UaW) ! CALL GX_W_UW_DEVICE( PWM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL MXF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) @@ -1048,7 +1055,7 @@ END IF ! CALL GX_M_U_DEVICE(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) @@ -1057,7 +1064,7 @@ END IF IF (KRR>=1) THEN CALL GX_U_M_DEVICE(PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) @@ -1067,7 +1074,7 @@ END IF DO JSV=1,NSV CALL GX_U_M_DEVICE(PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP1_DEVICE) CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) @@ -1206,11 +1213,11 @@ ELSE ! Atmos case * 0.5 * ( 1. + MYM(PRHODJ(:,:,KKA:KKA)) / MYM(PRHODJ(:,:,IKB:IKB)) ) ENDIF !No flux at the atmosphere top -!$acc kernels +!$acc kernels present_cr(ZSOURCE) ZSOURCE(:,:,IKE) = 0. !$acc end kernels ENDIF ! End of Ocean or Atmospher Cases -!$acc kernels +!$acc kernels present_cr(ZSOURCE) ZSOURCE(:,:,IKTB+1:IKTE-1) = 0. !$acc end kernels ! @@ -1229,7 +1236,7 @@ CALL TRIDIAG_WIND(KKA,KKU,KKL,PVM,ZA,ZCOEFS(:,:,1),PTSTEP,PEXPL,PIMPL, & #ifndef MNH_OPENACC PRVS(:,:,:)=PRVS(:,:,:)+MYM(PRHODJ(:,:,:))*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP #else -!$acc kernels +!$acc kernels present_cr(PRVS) PRVS(:,:,:)=PRVS(:,:,:)+ZTMP1_DEVICE*(ZRES(:,:,:)-PVM(:,:,:))/PTSTEP !$acc end kernels #endif @@ -1302,7 +1309,7 @@ END IF ! ! second part of total momentum flux ! -!$acc kernels +!$acc kernels present_cr(PWV) PWV(:,:,:) = ZFLXZ(:,:,:) !$acc end kernels ! @@ -1355,7 +1362,7 @@ IF (GOCEAN) THEN ) END IF ! -!$acc kernels +!$acc kernels present_cr(PDP) PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) !$acc end kernels ! @@ -1375,7 +1382,7 @@ IF (LLES_CALL) THEN CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE, X_LES_SUBGRID_WV ) ! CALL GZ_V_VW_DEVICE(PVM,PDZZ,ZTMP1_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) @@ -1393,12 +1400,15 @@ END IF ! IF(HTURBDIM=='3DIM') THEN ! Compute the source for the W wind component -!$acc kernels + !PASCAL +!$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,KKA) = 2 * ZFLXZ(:,:,IKB) - ZFLXZ(:,:,IKB+KKL) ! extrapolation +!$acc end kernels IF (GOCEAN) THEN +!$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,KKU) = 2 * ZFLXZ(:,:,IKE) - ZFLXZ(:,:,IKE-KKL) ! extrapolation - END IF !$acc end kernels + END IF ! #ifndef MNH_OPENACC IF (.NOT. L2D) THEN @@ -1452,11 +1462,11 @@ IF(HTURBDIM=='3DIM') THEN END DO !$acc end kernels CALL DZM_DEVICE( ZTMP3_DEVICE, ZTMP4_DEVICE ) - !$acc kernels + !$acc kernels present_cr(PRWS) PRWS(:,:,:)= PRWS(:,:,:) - ZTMP1_DEVICE(:,:,:) + ZTMP4_DEVICE(:,:,:) !$acc end kernels ELSE - !$acc kernels + !$acc kernels present_cr(PRWS) PRWS(:,:,:)= PRWS(:,:,:) - ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -1532,7 +1542,7 @@ IF(HTURBDIM=='3DIM') THEN ) END IF ! -!$acc kernels +!$acc kernels present_cr(PDP) PDP(:,:,:)=PDP(:,:,:)+ZA(:,:,:) !$acc end kernels ! @@ -1555,7 +1565,7 @@ IF(HTURBDIM=='3DIM') THEN !$acc data copy(X_LES_RES_ddxa_W_SBG_UaW,X_LES_RES_ddxa_Thl_SBG_UaW,X_LES_RES_ddxa_Rt_SBG_UaW) ! CALL GY_W_VW_DEVICE( PWM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) - !$acc kernels + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP2_DEVICE,ZTMP3_DEVICE) @@ -1564,7 +1574,7 @@ IF(HTURBDIM=='3DIM') THEN ! CALL GY_M_V_DEVICE(KKA,KKU,KKL,PTHLM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) @@ -1573,7 +1583,7 @@ IF(HTURBDIM=='3DIM') THEN IF (KRR>=1) THEN CALL GY_V_M_DEVICE(PRM(:,:,:,1),PDYY,PDZZ,PDZY,ZTMP1_DEVICE) CALL MZF_DEVICE( ZFLXZ, ZTMP2_DEVICE ) - !$acc kernels + !$acc kernels present_cr(ZTMP3_DEVICE) ZTMP3_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL MYF_DEVICE(ZTMP3_DEVICE,ZTMP4_DEVICE) @@ -1600,7 +1610,7 @@ IF ( OTURB_FLX .AND. tpfile%lopened .AND. HTURBDIM == '1DIM') THEN -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*GZ_W_M(PWM,PDZZ) #else CALL GZ_W_M_DEVICE(PWM,PDZZ,ZTMP1_DEVICE) -!$acc kernels +!$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,:)= (2./3.) * PTKEM(:,:,:) & -XCMFS*PLM(:,:,:)*SQRT(PTKEM(:,:,:))*ZTMP1_DEVICE(:,:,:) !$acc end kernels diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index 993a048fc..c4a205956 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -511,7 +511,7 @@ GUSERV = (KRR/=0) ! ! compute the coefficients for the uncentred gradient computation near the ! ground -!$acc kernels +!$acc kernels present_cr(ZCOEFF,ZKEFF,ZTMP1_DEVICE) ZCOEFF(:,:,IKB+2*KKL)= - PDZZ(:,:,IKB+KKL) / & ( (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) * PDZZ(:,:,IKB+2*KKL) ) ZCOEFF(:,:,IKB+KKL)= (PDZZ(:,:,IKB+2*KKL)+PDZZ(:,:,IKB+KKL)) / & @@ -561,7 +561,7 @@ END IF #endif ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately #else - !$acc kernels + !$acc kernels present_cr(ZTMP1_DEVICE) #ifndef MNH_BITREP !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PPHI3(:,:,:)*PDTH_DZ(:,:,:)**2 @@ -582,6 +582,8 @@ END IF DO CONCURRENT ( JI=1:JIU,JJ=1:JJU,JK=1:JKU) ZF (JI,JJ,JK) = XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK)*ZTMP2_DEVICE(JI,JJ,JK) END DO + !$acc end kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately !$acc end kernels #endif @@ -599,12 +601,12 @@ END IF #else IF (GFTH2) THEN CALL M3_TH2_WTH2( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels CALL D_M3_TH2_WTH2_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels END IF @@ -623,12 +625,12 @@ END IF CALL MZF_DEVICE( PFWTH(:,:,:), ZTMP1_DEVICE(:,:,:) ) CALL M3_TH2_W2TH( PREDTH1(:,:,:), PREDR1(:,:,:), PD(:,:,:), PDTH_DZ(:,:,:), PLM(:,:,:), & PLEPS(:,:,:), PTKEM(:,:,:), ZTMP2_DEVICE(:,:,:) ) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels CALL D_M3_TH2_W2TH_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),& & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),GUSERV,ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -647,12 +649,12 @@ END IF IF (GFR2) THEN CALL M3_TH2_WR2( PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),& & PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels CALL D_M3_TH2_WR2_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),& & PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels END IF @@ -673,10 +675,10 @@ END IF & PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) CALL D_M3_TH2_W2R_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),& & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP3_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP3_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -694,12 +696,12 @@ END IF IF (GFTHR) THEN CALL M3_TH2_WTHR( PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),& & PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels CALL D_M3_TH2_WTHR_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels END IF @@ -715,7 +717,7 @@ END IF ! *DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:) ) & + PIMPL * ZDFDDTDZ(:,:,:) * MZF(DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:) ) #else - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:) !$acc end kernels CALL DZM_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP2_DEVICE(:,:,:) ) @@ -729,7 +731,8 @@ END IF !$acc end kernels CALL MZF_DEVICE( ZTMP3_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) ) #ifdef MNH_COMPILER_CCE - !$acc kernels present(ZFLXZ) + !PASVSCAL$acc kernels present(ZFLXZ) + !$acc kernels #else !$acc kernels #endif @@ -740,10 +743,12 @@ END IF ZFLXZ(JI,JJ,JK) = ZF(JI,JJ,JK) & + PIMPL * ZDFDDTDZ(JI,JJ,JK) * ZTMP4_DEVICE(JI,JJ,JK) END DO +!$acc end kernels #endif ! ! special case near the ground ( uncentred gradient ) #ifndef MNH_BITREP + !$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,IKB) = XCTV * PPHI3(:,:,IKB+KKL) * PLM(:,:,IKB) & * PLEPS(:,:,IKB) & *( PEXPL * & @@ -755,7 +760,9 @@ END IF +ZCOEFF(:,:,IKB+KKL )*PTHLP(:,:,IKB+KKL ) & +ZCOEFF(:,:,IKB )*PTHLP(:,:,IKB ) )**2 & ) + !$acc end kernels #else + !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif @@ -772,12 +779,13 @@ END IF +ZCOEFF(JI,JJ,IKB )*PTHLP(JI,JJ,IKB ) ) & ) END DO + !$acc end kernels #endif - ! + + !$acc kernels present_cr(ZFLXZ,PSIGS) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! ZFLXZ(:,:,:) = MAX(0., ZFLXZ(:,:,:)) - ! IF (KRRL > 0) THEN #ifndef MNH_BITREP PSIGS(:,:,:) = ZFLXZ(:,:,:) * PATHETA(:,:,:)**2 @@ -820,22 +828,22 @@ END IF CALL LES_MEAN_SUBGRID( ZFLXZ(:,:,:), X_LES_SUBGRID_Thl2 ) ! CALL MZF_DEVICE( PWM(:,:,:), ZTMP1_DEVICE(:,:,:) ) - !$acc kernels present_cr(ztmp2_device) + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE(:,:,:), X_LES_RES_W_SBG_Thl2 ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = -2.*XCTD*PSQRT_TKE(:,:,:)*ZFLXZ(:,:,:)/PLEPS(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_DISS_Thl2 ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PETHETA(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlThv ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = -XA3*PBETA(:,:,:)*PETHETA(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlPz, .TRUE. ) @@ -855,12 +863,12 @@ END IF #ifndef MNH_OPENACC ZF (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*MZF(0.5*(PPHI3(:,:,:)+PPSI3(:,:,:))*PDTH_DZ(:,:,:)*PDR_DZ(:,:,:)) #else -!$acc kernels +!$acc kernels present_cr(ZTMP1_DEVICE) !dir$ concurrent ZTMP1_DEVICE(:,:,:) = 0.5*(PPHI3(:,:,:)+PPSI3(:,:,:))*PDTH_DZ(:,:,:)*PDR_DZ(:,:,:) !$acc end kernels CALL MZF_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP2_DEVICE(:,:,:) ) -!$acc kernels +!$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif @@ -869,7 +877,7 @@ END IF END DO !$acc end kernels #endif -!$acc kernels +!$acc kernels present_cr(ZDFDDTDZ,ZDFDDRDZ) ZDFDDTDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately ZDFDDRDZ(:,:,:) = 0. ! this term, because of discretization, is treated separately !$acc end kernels @@ -890,17 +898,17 @@ END IF IF (GFTH2) THEN CALL M3_THR_WTH2( PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),& & PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels CALL D_M3_THR_WTH2_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels CALL D_M3_THR_WTH2_O_DDRDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels END IF @@ -921,17 +929,17 @@ END IF CALL M3_THR_W2TH( PREDR1(:,:,:),PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),& & PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) CALL MZF_DEVICE( PFWTH(:,:,:), ZTMP2_DEVICE(:,:,:) ) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL D_M3_THR_W2TH_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PDR_DZ(:,:,:),PETHETA(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels CALL D_M3_THR_W2TH_O_DDRDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * ZTMP2_DEVICE(:,:,:) !$acc end kernels END IF @@ -951,17 +959,17 @@ END IF IF (GFR2) THEN CALL M3_THR_WR2( PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),& & PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels CALL D_M3_THR_WR2_O_DDTDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),& & PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels CALL D_M3_THR_WR2_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),& & PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),PDTH_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels END IF @@ -982,17 +990,17 @@ END IF CALL MZF_DEVICE( PFWR(:,:,:), ZTMP1_DEVICE(:,:,:) ) CALL M3_THR_W2R( PREDTH1(:,:,:),PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),& & PDTH_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels CALL D_M3_THR_W2R_O_DDTDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),& & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels CALL D_M3_THR_W2R_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),& & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PDTH_DZ(:,:,:),PEMOIST(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -1012,17 +1020,17 @@ END IF IF (GFTHR) THEN CALL M3_THR_WTHR( PREDTH1(:,:,:),PREDR1(:,:,:),PD(:,:,:),PLEPS(:,:,:),& & PSQRT_TKE(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels CALL D_M3_THR_WTHR_O_DDTDZ( PREDTH1(:,:,:),PREDR1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDTDZ) ZDFDDTDZ(:,:,:) = ZDFDDTDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels CALL D_M3_THR_WTHR_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels END IF @@ -1045,13 +1053,13 @@ END IF + PIMPL * ZDFDDTDZ(:,:,:) * MZF(DZM(PTHLP(:,:,:) - PTHLM(:,:,:)) / PDZZ(:,:,:) ) & + PIMPL * ZDFDDRDZ(:,:,:) * MZF(DZM(PRP(:,:,:) - PRM(:,:,:,1)) / PDZZ(:,:,:) ) #else - !$acc kernels present_cr(ztmp1_device,ztmp2_device) + !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE) ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:) ZTMP2_DEVICE(:,:,:) = PRP(:,:,:) - PRM(:,:,:,1) !$acc end kernels CALL DZM_DEVICE( ZTMP1_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) CALL DZM_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP4_DEVICE(:,:,:) ) - !$acc kernels + !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(3) #endif @@ -1069,7 +1077,7 @@ END IF HTURBDIM,GUSERV,ZTMP5_DEVICE(:,:,:)) ! d(phi3*drdz )/ddrdz term CALL D_PSI3DRDZ_O_DDRDZ(PPSI3(:,:,:),PREDR1(:,:,:),PREDTH1(:,:,:),PRED2R3(:,:,:),PRED2THR3(:,:,:), & HTURBDIM,GUSERV,ZTMP6_DEVICE(:,:,:)) ! d(psi3*drdz )/ddrdz term - !$acc kernels present_cr(ztmp1_device,ztmp8_device) + !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP8_DEVICE) ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:) ZTMP8_DEVICE(:,:,:) = PRP(:,:,:) - PRM(:,:,:,1) !$acc end kernels @@ -1088,7 +1096,7 @@ END IF END DO !$acc end kernels !!! - !$acc kernels present_cr(ztmp1_device,ztmp2_device) + !$acc kernels present_cr(ZTMP1_DEVICE,ZTMP2_DEVICE) ZTMP1_DEVICE(:,:,:) = PTHLP(:,:,:) - PTHLM(:,:,:) ZTMP2_DEVICE(:,:,:) = PRP(:,:,:) - PRM(:,:,:,1) !$acc end kernels @@ -1142,9 +1150,9 @@ END IF +ZCOEFF(JI,JJ,IKB )*PRP(JI,JJ,IKB )) & ) END DO - ! +!$acc end kernels + !$acc kernels present_cr(ZFLXZ,PSIGS) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) - ! IF ( KRRL > 0 ) THEN PSIGS(:,:,:) = PSIGS(:,:,:) + & 2. * PATHETA(:,:,:) * PAMOIST(:,:,:) * ZFLXZ(:,:,:) @@ -1185,32 +1193,32 @@ END IF CALL LES_MEAN_SUBGRID( ZFLXZ(:,:,:), X_LES_SUBGRID_THlRt ) ! CALL MZF_DEVICE( PWM(:,:,:), ZTMP1_DEVICE(:,:,:) ) - !$acc kernels present_cr(ztmp2_device) + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = ZTMP1_DEVICE(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP2_DEVICE(:,:,:), X_LES_RES_W_SBG_ThlRt ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = -2.*XCTD*PSQRT_TKE(:,:,:)*ZFLXZ(:,:,:)/PLEPS(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_DISS_ThlRt ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PETHETA(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_RtThv ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = -XA3*PBETA(:,:,:)*PETHETA(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_RtPz, .TRUE. ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = PEMOIST(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlThv , .TRUE. ) ! - !$acc kernels present_cr(ztmp1_device) + !$acc kernels present_cr(ZTMP1_DEVICE) ZTMP1_DEVICE(:,:,:) = -XA3*PBETA(:,:,:)*PEMOIST(:,:,:)*ZFLXZ(:,:,:) !$acc end kernels CALL LES_MEAN_SUBGRID( ZTMP1_DEVICE(:,:,:), X_LES_SUBGRID_ThlPz, .TRUE. ) @@ -1233,7 +1241,7 @@ END IF ZF (:,:,:) = XCTV*PLM(:,:,:)*PLEPS(:,:,:)*MZF(PPSI3(:,:,:)*BR_P2(PDR_DZ(:,:,:))) #endif #else - !$acc kernels + !$acc kernels !!present_cr(ZTMP1_DEVICE) #ifndef MNH_BITREP !dir$ concurrent ZTMP1_DEVICE(:,:,:) = PPSI3(:,:,:)*PDR_DZ(:,:,:)**2 @@ -1272,12 +1280,12 @@ END IF IF (GFR2) THEN CALL M3_R2_WR2( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),& & PSQRT_TKE(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels CALL D_M3_R2_WR2_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PEMOIST(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFR2(:,:,:) !$acc end kernels END IF @@ -1296,12 +1304,12 @@ END IF CALL MZF_DEVICE( PFWR(:,:,:), ZTMP1_DEVICE(:,:,:) ) CALL M3_R2_W2R( PREDR1(:,:,:),PREDTH1(:,:,:),PD(:,:,:),PDR_DZ(:,:,:),& & PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels CALL D_M3_R2_W2R_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),& & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),GUSERV,ZTMP3_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP3_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -1320,12 +1328,12 @@ END IF IF (GFTH2) THEN CALL M3_R2_WTH2( PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),& & PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels CALL D_M3_R2_WTH2_O_DDRDZ( PREDR1(:,:,:),& & PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTH2(:,:,:) !$acc end kernels END IF @@ -1345,12 +1353,12 @@ END IF CALL MZF_DEVICE( PFWTH(:,:,:), ZTMP1_DEVICE(:,:,:) ) CALL M3_R2_W2TH( PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),& & PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP2_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels CALL D_M3_R2_W2TH_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),& & PD(:,:,:),PLM(:,:,:),PLEPS(:,:,:),PTKEM(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP3_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP3_DEVICE(:,:,:) * ZTMP1_DEVICE(:,:,:) !$acc end kernels END IF @@ -1368,12 +1376,12 @@ END IF IF (GFTHR) THEN CALL M3_R2_WTHR( PREDTH1(:,:,:),PD(:,:,:),PLEPS(:,:,:),& & PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP1_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZF) ZF(:,:,:) = ZF(:,:,:) + ZTMP1_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels CALL D_M3_R2_WTHR_O_DDRDZ( PREDR1(:,:,:),PREDTH1(:,:,:),& & PD(:,:,:),PLEPS(:,:,:),PSQRT_TKE(:,:,:),PBLL_O_E(:,:,:),PETHETA(:,:,:),PDR_DZ(:,:,:),ZTMP2_DEVICE(:,:,:)) - !$acc kernels + !$acc kernels present_cr(ZDFDDRDZ) ZDFDDRDZ(:,:,:) = ZDFDDRDZ(:,:,:) + ZTMP2_DEVICE(:,:,:) * PFTHR(:,:,:) !$acc end kernels END IF @@ -1391,7 +1399,7 @@ END IF #else CALL D_PSI3DRDZ2_O_DDRDZ(PPSI3(:,:,:),PREDR1(:,:,:),PREDTH1(:,:,:),PRED2R3(:,:,:),PRED2THR3(:,:,:),PDR_DZ(:,:,:), & HTURBDIM,GUSERV,ZTMP1_DEVICE(:,:,:)) - !$acc kernels present_cr(ztmp2_device) + !$acc kernels present_cr(ZTMP2_DEVICE) ZTMP2_DEVICE(:,:,:) = PRP(:,:,:) - PRM(:,:,:,1) !$acc end kernels CALL DZM_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) @@ -1414,7 +1422,7 @@ END IF !$acc end kernels CALL MZF_DEVICE( ZTMP2_DEVICE(:,:,:), ZTMP3_DEVICE(:,:,:) ) #ifdef MNH_COMPILER_CCE - !$acc kernels present(ZFLXZ) + !$acc kernels #else !$acc kernels #endif @@ -1426,10 +1434,12 @@ END IF + PIMPL * XCTV*PLM(JI,JJ,JK)*PLEPS(JI,JJ,JK) * ZTMP1_DEVICE(JI,JJ,JK) & + PIMPL * ZDFDDRDZ(JI,JJ,JK) * ZTMP3_DEVICE(JI,JJ,JK) END DO + !$acc end kernels #endif ! ! special case near the ground ( uncentred gradient ) #ifndef MNH_BITREP + !$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,IKB) = XCHV * PPSI3(:,:,IKB+KKL) * PLM(:,:,IKB) & * PLEPS(:,:,IKB) & *( PEXPL * & @@ -1441,7 +1451,9 @@ END IF +ZCOEFF(:,:,IKB+KKL )*PRP(:,:,IKB+KKL ) & +ZCOEFF(:,:,IKB )*PRP(:,:,IKB ))**2 & ) + !$acc end kernels #else + !$acc kernels #ifdef MNH_COMPILER_NVHPC !$acc loop independent collapse(2) #endif @@ -1458,8 +1470,10 @@ END IF +ZCOEFF(JI,JJ,IKB )*PRP(JI,JJ,IKB )) & ) END DO + !$acc end kernels #endif ! + !$acc kernels present_cr(ZFLXZ) ZFLXZ(:,:,KKA) = ZFLXZ(:,:,IKB) ! IF ( KRRL > 0 ) THEN @@ -1528,7 +1542,7 @@ END IF ! IF ( KRRL > 0 ) THEN ! Extrapolate PSIGS at the ground and at the top -!$acc kernels +!$acc kernels present_cr(PSIGS) PSIGS(:,:,KKA) = PSIGS(:,:,IKB) PSIGS(:,:,KKU) = PSIGS(:,:,IKE) PSIGS(:,:,:) = SQRT( MAX (PSIGS(:,:,:) , 1.E-12) ) -- GitLab