From 6f6c7beaefe8e2f9976d2ac0d0d4d02b03255717 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Mon, 9 Dec 2019 17:36:52 +0100 Subject: [PATCH] Philippe 09/12/2019: OpenACC: replace declare directives by data zones The only remaining declare are in the modd_* declarations --- src/LIB/SURCOUCHE/src/mode_mnh_world.f90 | 4 +- src/MNH/advec_4th_order_aux.f90 | 5 +- src/MNH/advec_weno_k_2_aux.f90 | 46 +-- src/MNH/advec_weno_k_3_aux.f90 | 54 ++-- src/MNH/advection_metsv.f90 | 55 +--- src/MNH/advection_uvw.f90 | 31 +- src/MNH/advection_uvw_cen.f90 | 27 +- src/MNH/advecuvw_rk.f90 | 12 +- src/MNH/condensation.f90 | 35 ++- src/MNH/contrav.f90 | 3 +- src/MNH/emoist.f90 | 6 +- src/MNH/etheta.f90 | 6 +- src/MNH/get_halo.f90 | 2 - src/MNH/gravity.f90 | 5 +- src/MNH/gravity_impl.f90 | 6 +- src/MNH/ice4_compute_pdf.f90 | 43 ++- src/MNH/ice4_fast_rg.f90 | 57 ++-- src/MNH/ice4_fast_rh.f90 | 72 +++-- src/MNH/ice4_fast_ri.f90 | 24 +- src/MNH/ice4_fast_rs.f90 | 39 +-- src/MNH/ice4_nucleation.f90 | 43 +-- src/MNH/ice4_nucleation_wrapper.f90 | 61 ++-- src/MNH/ice4_rainfr_vert.f90 | 5 +- src/MNH/ice4_rimltc.f90 | 17 +- src/MNH/ice4_rrhong.f90 | 16 +- src/MNH/ice4_rsrimcg_old.f90 | 28 +- src/MNH/ice4_sedimentation_split.f90 | 139 +++++---- src/MNH/ice4_slow.f90 | 29 +- src/MNH/ice4_tendencies.f90 | 80 +++-- src/MNH/ice4_warm.f90 | 39 ++- src/MNH/ice_adjust.f90 | 57 ++-- src/MNH/mode_mnh_zwork.f90 | 4 - src/MNH/mode_prandtl.f90 | 356 +++++++++++++++++++---- src/MNH/modeln.f90 | 7 +- src/MNH/ppm_met.f90 | 10 - src/MNH/rain_ice.f90 | 93 ++---- src/MNH/rain_ice_fast_rg.f90 | 19 +- src/MNH/rain_ice_fast_rh.f90 | 22 +- src/MNH/rain_ice_fast_ri.f90 | 7 +- src/MNH/rain_ice_fast_rs.f90 | 17 +- src/MNH/rain_ice_nucleation.f90 | 49 ++-- src/MNH/rain_ice_red.f90 | 309 +++++++++++++++----- src/MNH/rain_ice_sedimentation_split.f90 | 25 +- src/MNH/rain_ice_slow.f90 | 5 +- src/MNH/rain_ice_warm.f90 | 6 +- src/MNH/resolved_cloud.f90 | 35 +-- src/MNH/rotate_wind.f90 | 7 +- src/MNH/slow_terms.f90 | 14 +- src/MNH/tm06_h.f90 | 5 +- src/MNH/tridiag_thermo.f90 | 6 +- src/MNH/turb.f90 | 57 ++-- src/MNH/turb_hor_splt.f90 | 13 +- src/MNH/turb_hor_tke.f90 | 2 - src/MNH/turb_ver_thermo_corr.f90 | 9 +- 54 files changed, 1275 insertions(+), 848 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 index 56f1f3fdc..30124a276 100644 --- a/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 +++ b/src/LIB/SURCOUCHE/src/mode_mnh_world.f90 @@ -59,10 +59,9 @@ CONTAINS #if 0 !Try to initialise device memory by creating a big array REAL,dimension(:,:,:),allocatable :: big - !$acc declare create(big) - allocate(big(1024,1024,128)) + !$acc data create(big) !$acc kernels pcopyout(big) big(:,:,:)=1e123 @@ -70,6 +69,7 @@ CONTAINS !$acc end kernels print *,'big=',big(1,1,1),big(1000,1024,128) + !$acc end data deallocate(big) #endif ! diff --git a/src/MNH/advec_4th_order_aux.f90 b/src/MNH/advec_4th_order_aux.f90 index 0ff939cf7..97ea2d967 100644 --- a/src/MNH/advec_4th_order_aux.f90 +++ b/src/MNH/advec_4th_order_aux.f90 @@ -142,7 +142,6 @@ LOGICAL :: GWEST , GEAST LOGICAL :: GSOUTH , GNORTH REAL, DIMENSION(:,:), ALLOCATABLE :: ZHALO2_WEST, ZHALO2_EAST REAL, DIMENSION(:,:), ALLOCATABLE :: ZHALO2_SOUTH, ZHALO2_NORTH -!$acc declare create (ZHALO2_WEST,ZHALO2_EAST,ZHALO2_SOUTH,ZHALO2_NORTH) ! !$acc data present( PMEANX, PMEANY, PFIELDT ) @@ -157,6 +156,8 @@ allocate( zhalo2_east ( size( pfieldt, 2 ), size( pfieldt, 3 ) ) ) allocate( zhalo2_south( size( pfieldt, 2 ), size( pfieldt, 3 ) ) ) allocate( zhalo2_north( size( pfieldt, 2 ), size( pfieldt, 3 ) ) ) +!$acc data create ( zhalo2_west, zhalo2_east, zhalo2_south, zhalo2_north ) + !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS @@ -456,6 +457,8 @@ END IF !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE ADVEC_4TH_ORDER_ALGO diff --git a/src/MNH/advec_weno_k_2_aux.f90 b/src/MNH/advec_weno_k_2_aux.f90 index f850bdaf1..e5e1ad84a 100644 --- a/src/MNH/advec_weno_k_2_aux.f90 +++ b/src/MNH/advec_weno_k_2_aux.f90 @@ -302,25 +302,21 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2 -!$acc declare present(ZFPOS1,ZFPOS2) ! ! intermediate reconstruction fluxes for negative wind case ! we need only one since ZFNEG2 = ZFPOS2 ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2 -!$acc declare present(ZFNEG1,ZFNEG2) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2 -!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2 -!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2) ! ! standard weights ! @@ -330,7 +326,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3. REAL, PARAMETER :: ZEPS = 1.0E-15 ! !----------------------------------------------------------------------------- -!$acc data present( PSRC, PRUCT, PR ) copyin( TWEST, TEAST ) +!$acc data present( psrc, pruct, pr, & +!$acc & zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) & +!$acc & copyin( twest, teast ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -686,25 +684,21 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2 -!$acc declare present(ZFPOS1,ZFPOS2) ! ! intermediate reconstruction fluxes for negative wind case ! we need only one since ZFNEG2 = ZFPOS2 ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2 -!$acc declare present(ZFNEG1,ZFNEG2) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2 -!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2 -!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2) ! ! standard weights ! @@ -714,7 +708,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3. REAL, PARAMETER :: ZEPS = 1.0E-15 ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PRUCT, PR ) copyin( TWEST, TEAST ) +!$acc data present( psrc, pruct, pr, & +!$acc & zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) & +!$acc & copyin( twest, teast ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -1073,25 +1069,21 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2 -!$acc declare present(ZFPOS1,ZFPOS2) ! ! intermediate reconstruction fluxes for negative wind case ! we need only one since ZFNEG2 = ZFPOS2 ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2 -!$acc declare present(ZFNEG1,ZFNEG2) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2 -!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2 -!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2) ! ! standard weights ! @@ -1101,7 +1093,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3. REAL, PARAMETER :: ZEPS = 1.0E-15 ! !----------------------------------------------------------------------------- -!$acc data present( PSRC, PRVCT, PR ) copyin( TNORTH, TSOUTH ) +!$acc data present( psrc, prvct, pr, & +!$acc & zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) & +!$acc & copyin( tnorth, tsouth ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -1454,25 +1448,21 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2 -!$acc declare present(ZFPOS1,ZFPOS2) ! ! intermediate reconstruction fluxes for negative wind case ! we need only one since ZFNEG2 = ZFPOS2 ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2 -!$acc declare present(ZFNEG1,ZFNEG2) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2 -!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2 -!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2) ! ! standard weights ! @@ -1482,7 +1472,9 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3. REAL, PARAMETER :: ZEPS = 1.0E-15 ! !---------------------------------------------------------------------------- -!$acc data present( PSRC, PRVCT, PR ) copyin( TNORTH, TSOUTH ) +!$acc data present( psrc, prvct, pr, & +!$acc & zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) & +!$acc & copyin( tnorth, tsouth ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -1823,25 +1815,21 @@ INTEGER :: IT ! End useful area in x,y,z directions ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2 -!$acc declare present(ZFPOS1,ZFPOS2) ! ! intermediate reconstruction fluxes for negative wind case ! we need only one since ZFNEG2 = ZFPOS2 ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2 -!$acc declare present(ZFNEG1,ZFNEG2) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2 -!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2 -!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2) ! ! standard weights ! @@ -1851,7 +1839,8 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3. REAL, PARAMETER :: ZEPS = 1.0E-15 ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PRWCT, PR ) +!$acc data present( psrc, prwct, pr, & +!$acc & zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -2034,25 +2023,21 @@ INTEGER :: IT ! End useful area in x,y,z directions ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFPOS1, ZFPOS2 -!$acc declare present(ZFPOS1,ZFPOS2) ! ! intermediate reconstruction fluxes for negative wind case ! we need only one since ZFNEG2 = ZFPOS2 ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZFNEG1, ZFNEG2 -!$acc declare present(ZFNEG1,ZFNEG2) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBPOS1, ZBPOS2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZBNEG1, ZBNEG2 -!$acc declare present(ZBPOS1,ZBPOS2,ZBNEG1,ZBNEG2) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2 -!$acc declare present(ZOMP1,ZOMP2,ZOMN1,ZOMN2) ! ! standard weights ! @@ -2062,7 +2047,8 @@ REAL, PARAMETER :: ZGAMMA2 = 2./3. REAL, PARAMETER :: ZEPS = 1.0E-15 ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PRWCT, PR ) +!$acc data present( psrc, prwct, pr, & +!$acc & zfpos1, zfpos2, zfneg1, zfneg2, zbpos1, zbpos2, zbneg1, zbneg2, zomp1, zomp2, zomn1, zomn2 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays diff --git a/src/MNH/advec_weno_k_3_aux.f90 b/src/MNH/advec_weno_k_3_aux.f90 index 647bf8653..d6f20a659 100644 --- a/src/MNH/advec_weno_k_3_aux.f90 +++ b/src/MNH/advec_weno_k_3_aux.f90 @@ -283,31 +283,30 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3 -!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3) ! ! intermediate reconstruction fluxes for negative wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3 -!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3 -!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3) ! ! WENO non-normalized weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2, ZOMP3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2, ZOMN3 -!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3) ! ! EPSILON for weno weights calculation ! REAL, PARAMETER :: ZEPS = 1.0E-15 ! !----------------------------------------------------------------------------- -!$acc data present( PSRC, PRUCT, PR ) +!$acc data present( psrc, pruct, pr, & +!$acc & zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, & +!$acc & zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, & +!$acc & zomp1, zomp2, zomp3, zomn1, zomn2, zomn3 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -964,30 +963,29 @@ INTEGER:: ILUOUT,IRESP ! for prints ! ! intermediate reconstruction fluxes for positive wind case REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3 -!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3) ! ! intermediate reconstruction fluxes for negative wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3 -!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3) ! ! smoothness indicators for positive wind case REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3 -!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2, ZOMP3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2, ZOMN3 -!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3) ! ! EPSILON for weno weights calculation ! REAL, PARAMETER :: ZEPS = 1.0E-15 ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PRUCT, PR ) +!$acc data present( psrc, pruct, pr, & +!$acc & zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, & +!$acc & zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, & +!$acc & zomp1, zomp2, zomp3, zomn1, zomn2, zomn3 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -1647,31 +1645,30 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3 -!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3) ! ! intermediate reconstruction fluxes for negative wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3 -!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3 -!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMP1, ZOMP2, ZOMP3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMN1, ZOMN2, ZOMN3 -!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3) ! ! EPSILON for weno weights calculation ! REAL, PARAMETER :: ZEPS = 1.0E-15 ! !----------------------------------------------------------------------------- -!$acc data present( PSRC, PRVCT, PR ) +!$acc data present( psrc, prvct, pr, & +!$acc & zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, & +!$acc & zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, & +!$acc & zomp1, zomp2, zomp3, zomn1, zomn2, zomn3 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -2328,32 +2325,31 @@ INTEGER:: ILUOUT,IRESP ! for prints ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3 -!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3) ! ! intermediate reconstruction fluxes for negative wind case ! ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3 -!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3 -!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMP1, ZOMP2, ZOMP3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)) :: ZOMN1, ZOMN2, ZOMN3 -!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3) ! ! EPSILON for weno weights calculation ! REAL, PARAMETER :: ZEPS = 1.0E-15 ! !---------------------------------------------------------------------------- -!$acc data present( PSRC, PRVCT, PR ) +!$acc data present( psrc, prvct, pr, & +!$acc & zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, & +!$acc & zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, & +!$acc & zomp1, zomp2, zomp3, zomn1, zomn2, zomn3 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -3011,31 +3007,30 @@ INTEGER :: IT ! End useful area in x,y,z directions ! ! intermediate reconstruction fluxes for positive wind case REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3 -!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3) ! ! intermediate reconstruction fluxes for negative wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3 -!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3 -!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMP1, ZOMP2, ZOMP3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMN1, ZOMN2, ZOMN3 -!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3) ! ! EPSILON for weno weights calculation ! REAL, PARAMETER :: ZEPS = 1.0E-15 ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PRWCT, PR ) +!$acc data present( psrc, prwct, pr, & +!$acc & zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, & +!$acc & zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, & +!$acc & zomp1, zomp2, zomp3, zomn1, zomn2, zomn3 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -3283,31 +3278,30 @@ INTEGER :: IT ! End useful area in x,y,z directions ! intermediate reconstruction fluxes for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFPOS1, ZFPOS2, ZFPOS3 -!$acc declare present(ZFPOS1, ZFPOS2, ZFPOS3) ! ! intermediate reconstruction fluxes for negative wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZFNEG1, ZFNEG2, ZFNEG3 -!$acc declare present(ZFNEG1, ZFNEG2, ZFNEG3) ! ! smoothness indicators for positive wind case ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBPOS1, ZBPOS2, ZBPOS3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZBNEG1, ZBNEG2, ZBNEG3 -!$acc declare present(ZBPOS1, ZBPOS2, ZBPOS3, ZBNEG1, ZBNEG2, ZBNEG3) ! ! WENO weights ! REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMP1, ZOMP2, ZOMP3 REAL, DIMENSION(SIZE(PSRC,1),SIZE(PSRC,2),SIZE(PSRC,3)):: ZOMN1, ZOMN2, ZOMN3 -!$acc declare present(ZOMP1, ZOMP2, ZOMP3, ZOMN1, ZOMN2, ZOMN3) ! ! EPSILON for weno weights calculation ! REAL, PARAMETER :: ZEPS = 1.0E-15 ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PRWCT, PR ) +!$acc data present( psrc, prwct, pr, & +!$acc & zfpos1, zfpos2, zfpos3, zfneg1, zfneg2, zfneg3, & +!$acc & zbpos1, zbpos2, zbpos3, zbneg1, zbneg2, zbneg3, & +!$acc & zomp1, zomp2, zomp3, zomn1, zomn2, zomn3 ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays diff --git a/src/MNH/advection_metsv.f90 b/src/MNH/advection_metsv.f90 index 1f1fd7500..abcc83011 100644 --- a/src/MNH/advection_metsv.f90 +++ b/src/MNH/advection_metsv.f90 @@ -235,55 +235,42 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTKES_ADV ! Advection TKE source te REAL, DIMENSION(:,:,:),allocatable :: ZRUCPPM REAL, DIMENSION(:,:,:),allocatable :: ZRVCPPM REAL, DIMENSION(:,:,:),allocatable :: ZRWCPPM -!$acc declare create(ZRUCPPM,ZRVCPPM,ZRWCPPM) ! contravariant ! components ! of momentum REAL, DIMENSION(:,:,:),allocatable :: ZCFLU REAL, DIMENSION(:,:,:),allocatable :: ZCFLV REAL, DIMENSION(:,:,:),allocatable :: ZCFLW -!$acc declare create(ZCFLU,ZCFLV,ZCFLW) ! ! CFL numbers on each direction REAL, DIMENSION(:,:,:),allocatable :: ZCFL -!$acc declare create(ZCFL) ! ! CFL number ! REAL :: ZCFLU_MAX, ZCFLV_MAX, ZCFLW_MAX, ZCFL_MAX ! maximum CFL numbers ! REAL, DIMENSION(:,:,:),allocatable :: ZTH REAL, DIMENSION(:,:,:),allocatable :: ZTKE -!$acc declare create(ZTH,ZTKE) REAL, DIMENSION(:,:,:),allocatable :: ZRTHS_OTHER REAL, DIMENSION(:,:,:),allocatable :: ZRTKES_OTHER -!$acc declare create(ZRTHS_OTHER,ZRTKES_OTHER) REAL, DIMENSION(:,:,:),allocatable :: ZRTHS_PPM -!$acc declare create(ZRTHS_PPM) REAL, DIMENSION(:,:,:),allocatable :: ZRTKES_PPM -!$acc declare create(ZRTKES_PPM) REAL, DIMENSION(:,:,:,:),allocatable :: ZR REAL, DIMENSION(:,:,:,:),allocatable :: ZSV -!$acc declare create(ZR,ZSV) REAL, DIMENSION(:,:,:,:),allocatable :: ZSNWC REAL, DIMENSION(:,:,:,:),allocatable :: ZSNWC_INIT REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS -!$acc declare create(ZSNWC,ZSNWC_INIT,ZRSNWCS) ! Guess at the sub time step REAL, DIMENSION(:,:,:,:),allocatable :: ZRRS_OTHER REAL, DIMENSION(:,:,:,:),allocatable :: ZRSVS_OTHER REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS_OTHER -!$acc declare create(ZRRS_OTHER,ZRSVS_OTHER,ZRSNWCS_OTHER) ! Tendencies since the beginning of the time step REAL, DIMENSION(:,:,:,:),allocatable :: ZRRS_PPM REAL, DIMENSION(:,:,:,:),allocatable :: ZRSVS_PPM REAL, DIMENSION(:,:,:,:),allocatable :: ZRSNWCS_PPM -!$acc declare create(ZRRS_PPM,ZRSVS_PPM,ZRSNWCS_PPM) ! Guess at the end of the sub time step REAL, DIMENSION(:,:,:),allocatable :: ZRHOX1,ZRHOX2 REAL, DIMENSION(:,:,:),allocatable :: ZRHOY1,ZRHOY2 REAL, DIMENSION(:,:,:),allocatable :: ZRHOZ1,ZRHOZ2 REAL, DIMENSION(:,:,:),allocatable :: ZT,ZEXN,ZLV,ZLS,ZCPH -!$acc declare create(ZRHOX1,ZRHOX2,ZRHOY1,ZRHOY2,ZRHOZ1,ZRHOZ2) -!$acc declare create(ZT,ZEXN,ZLV,ZLS,ZCPH) ! Temporary advected rhodj for PPM routines ! @@ -370,6 +357,13 @@ allocate( ZEXN ( SIZE(PUT, 1), SIZE(PUT, 2), SIZE(PUT, 3) ) allocate( ZLV ( SIZE(PUT, 1), SIZE(PUT, 2), SIZE(PUT, 3) ) ) allocate( ZLS ( SIZE(PUT, 1), SIZE(PUT, 2), SIZE(PUT, 3) ) ) allocate( ZCPH ( SIZE(PUT, 1), SIZE(PUT, 2), SIZE(PUT, 3) ) ) + +!$acc data create( ZRUCPPM, ZRVCPPM, ZRWCPPM, ZCFLU, ZCFLV, ZCFLW, ZCFL, ZTH, & +!$acc & ZTKE, ZRTHS_OTHER, ZRTKES_OTHER, ZRTHS_PPM, ZRTKES_PPM, & +!$acc & ZR, ZSV, ZSNWC, ZSNWC_INIT, ZRSNWCS, ZRRS_OTHER, ZRSVS_OTHER, ZRSNWCS_OTHER, & +!$acc & ZRRS_PPM, ZRSVS_PPM, ZRSNWCS_PPM, ZRHOX1, ZRHOX2, ZRHOY1, ZRHOY2, ZRHOZ1, ZRHOZ2, & +!$acc & ZT, ZEXN, ZLV, ZLS, ZCPH ) + ! !* 0. INITIALIZATION ! -------------- @@ -960,39 +954,6 @@ END IF CALL MNH_REL_ZT3D(IZ1, IZ2) #endif !------------------------------------------------------------------------------- -! -deallocate( ZRUCPPM ) -deallocate( ZRVCPPM ) -deallocate( ZRWCPPM ) -deallocate( ZCFLU ) -deallocate( ZCFLV ) -deallocate( ZCFLW ) -deallocate( ZCFL ) -deallocate( ZTH ) -deallocate( ZTKE ) -deallocate( ZRTHS_OTHER ) -deallocate( ZRTKES_OTHER ) -deallocate( ZRTHS_PPM ) -deallocate( ZRTKES_PPM ) -deallocate( ZR ) -deallocate( ZSV ) -deallocate( ZSNWC) -deallocate( ZSNWC_INIT ) -deallocate( ZRSNWCS ) -deallocate( ZRRS_OTHER ) -deallocate( ZRSVS_OTHER ) -deallocate( ZRSNWCS_OTHER ) -deallocate( ZRRS_PPM ) -deallocate( ZRSVS_PPM ) -deallocate( ZRSNWCS_PPM ) -deallocate( ZRHOX1, ZRHOX2 ) -deallocate( ZRHOY1, ZRHOY2 ) -deallocate( ZRHOZ1, ZRHOZ2 ) -deallocate( ZT ) -deallocate( ZEXN ) -deallocate( ZLV ) -deallocate( ZLS ) -deallocate( ZCPH ) IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays @@ -1006,4 +967,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ADVECTION_METSV diff --git a/src/MNH/advection_uvw.f90 b/src/MNH/advection_uvw.f90 index 03e2c6fa4..c1f96a8ef 100644 --- a/src/MNH/advection_uvw.f90 +++ b/src/MNH/advection_uvw.f90 @@ -156,7 +156,6 @@ INTEGER :: IKE ! indice K End in z direction REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUT REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVT REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWT -!$acc declare create(ZRUT,ZRVT,ZRWT) ! cartesian ! components of ! momentum @@ -164,27 +163,22 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWT REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUCT REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVCT REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWCT -!$acc declare create(ZRUCT,ZRVCT,ZRWCT) ! contravariant ! components ! of momentum ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZU, ZV, ZW -!$acc declare create(ZU,ZV,ZW) ! Guesses at the end of the sub time step REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS_OTHER REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVS_OTHER REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWS_OTHER -!$acc declare create(ZRUS_OTHER,ZRVS_OTHER,ZRWS_OTHER) ! Contribution of the RK time step REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS_ADV REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRVS_ADV REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRWS_ADV -!$acc declare create(ZRUS_ADV,ZRVS_ADV,ZRWS_ADV) REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMXM_RHODJ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMYM_RHODJ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZMZM_RHODJ -!$acc declare create(ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ) ! ! Momentum tendencies due to advection INTEGER :: ISPLIT ! Number of splitting loops @@ -248,6 +242,10 @@ ALLOCATE( ZMXM_RHODJ( SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3) ) ) ALLOCATE( ZMYM_RHODJ( SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3) ) ) ALLOCATE( ZMZM_RHODJ( SIZE(PUT,1), SIZE(PUT,2), SIZE(PUT,3) ) ) +!$acc data create( zrut, zrvt, zrwt, zruct, zrvct, zrwct, zu, zv, zw, & +!$acc & zrus_other, zrvs_other, zrws_other, zrus_adv, zrvs_adv, zrws_adv, & +!$acc & zrus_adv, zrvs_adv, zrws_adv, zmxm_rhodj, zmym_rhodj, zmzm_rhodj ) + #ifdef MNH_OPENACC #if 0 CALL INIT_ON_HOST_AND_DEVICE(ZRUT,-1e99,'ADVECTION_UVW::ZRUT') @@ -505,25 +503,6 @@ CALL MNH_REL_ZT4D(ISPL, IZRUSB) CALL MNH_REL_ZT3D(IZUT, IZVT, IZWT, IZ1, IZ2) #endif -DEALLOCATE( ZRUT ) -DEALLOCATE( ZRVT ) -DEALLOCATE( ZRWT ) -DEALLOCATE( ZRUCT ) -DEALLOCATE( ZRVCT ) -DEALLOCATE( ZRWCT ) -DEALLOCATE( ZU ) -DEALLOCATE( ZV ) -DEALLOCATE( ZW ) -DEALLOCATE( ZRUS_OTHER ) -DEALLOCATE( ZRVS_OTHER ) -DEALLOCATE( ZRWS_OTHER ) -DEALLOCATE( ZRUS_ADV ) -DEALLOCATE( ZRVS_ADV ) -DEALLOCATE( ZRWS_ADV ) -DEALLOCATE( ZMXM_RHODJ ) -DEALLOCATE( ZMYM_RHODJ ) -DEALLOCATE( ZMZM_RHODJ ) - IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PRUS,"ADVECTION_UVW end:PRUS") @@ -533,4 +512,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ADVECTION_UVW diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90 index dcd9de9c8..fdc6cd0e2 100644 --- a/src/MNH/advection_uvw_cen.f90 +++ b/src/MNH/advection_uvw_cen.f90 @@ -151,13 +151,11 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2MLIST ! momentum variables REAL, DIMENSION(:,:,:), allocatable :: ZUS REAL, DIMENSION(:,:,:), allocatable :: ZVS REAL, DIMENSION(:,:,:), allocatable :: ZWS -!$acc declare create(ZUS,ZVS,ZWS) ! guess of cartesian components of ! momentum at future (+PTSTEP) timestep REAL, DIMENSION(:,:,:), allocatable :: ZRUS REAL, DIMENSION(:,:,:), allocatable :: ZRVS REAL, DIMENSION(:,:,:), allocatable :: ZRWS -!$acc declare create(ZRUS,ZRVS,ZRWS) ! cartesian components of ! rhodJ times the tendency of ! momentum from previous (-PTSTEP) @@ -166,7 +164,6 @@ REAL, DIMENSION(:,:,:), allocatable :: ZRWS REAL, DIMENSION(:,:,:), allocatable :: ZRUT REAL, DIMENSION(:,:,:), allocatable :: ZRVT REAL, DIMENSION(:,:,:), allocatable :: ZRWT -!$acc declare create(ZRUT,ZRVT,ZRWT) ! cartesian ! components of ! momentum @@ -174,14 +171,12 @@ REAL, DIMENSION(:,:,:), allocatable :: ZRWT REAL, DIMENSION(:,:,:), allocatable :: ZRUCT REAL, DIMENSION(:,:,:), allocatable :: ZRVCT REAL, DIMENSION(:,:,:), allocatable :: ZRWCT -!$acc declare create(ZRUCT,ZRVCT,ZRWCT) ! contravariant ! components ! of momentum REAL, DIMENSION(:,:,:), allocatable :: ZMXM_RHODJ REAL, DIMENSION(:,:,:), allocatable :: ZMYM_RHODJ REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ -!$acc declare create(ZMXM_RHODJ,ZMYM_RHODJ,ZMZM_RHODJ) ! INTEGER :: IINFO_ll ! return code of parallel routine TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange @@ -233,6 +228,9 @@ allocate( zmxm_rhodj ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) allocate( zmym_rhodj ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) allocate( zmzm_rhodj ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +!$acc data create( zus, zvs, zws, zrus, zrvs, zrws, zrut, zrvt, zrwt, & +!$acc & zruct, zrvct, zrwct, zmxm_rhodj, zmym_rhodj, zmzm_rhodj ) + #ifdef MNH_OPENACC CALL INIT_ON_HOST_AND_DEVICE(ZUS,-1e99,'ADVECTION_UVW_CEN::ZUS') CALL INIT_ON_HOST_AND_DEVICE(ZVS,-2e99,'ADVECTION_UVW_CEN::ZVS') @@ -361,22 +359,6 @@ IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADV_BU_RW') CALL MNH_REL_ZT3D(IZ1, IZ2) #endif -deallocate( zus ) -deallocate( zvs ) -deallocate( zws ) -deallocate( zrus ) -deallocate( zrvs ) -deallocate( zrws ) -deallocate( zrut ) -deallocate( zrvt ) -deallocate( zrwt ) -deallocate( zruct ) -deallocate( zrvct ) -deallocate( zrwct ) -deallocate( zmxm_rhodj ) -deallocate( zmym_rhodj ) -deallocate( zmzm_rhodj ) - IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PRUS,"ADVECTION_UVW_CEN end:PRUS") @@ -385,6 +367,9 @@ IF (MPPDB_INITIALIZED) THEN END IF !$acc end data + +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE ADVECTION_UVW_CEN diff --git a/src/MNH/advecuvw_rk.f90 b/src/MNH/advecuvw_rk.f90 index 7a0dc37df..34153fbe7 100644 --- a/src/MNH/advecuvw_rk.f90 +++ b/src/MNH/advecuvw_rk.f90 @@ -202,8 +202,6 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUT ! Butcher array coefficients ! at the RK sub time step REAL, DIMENSION(:), ALLOCATABLE :: ZBUTS! Butcher array coefficients ! at the end of the RK loop -!$acc declare create(ZBUT,ZBUTS) - !JUAN TYPE(LIST_ll), POINTER :: TZFIELDMT_ll ! list of fields to exchange TYPE(HALO2LIST_ll), POINTER :: TZHALO2MT_ll ! momentum variables @@ -301,7 +299,9 @@ END SELECT ! ALLOCATE(ZBUT(ISPL-1,ISPL-1)) ALLOCATE(ZBUTS(ISPL)) -! + +!$acc data create(ZBUT,ZBUTS) + SELECT CASE (HTEMP_SCHEME) CASE('RK11') ZBUTS = (/ 1. /) @@ -522,12 +522,8 @@ ZRWS = 0. ! #ifdef MNH_OPENACC CALL MNH_REL_ZT3D(IZMEAN,IZWORK) -#else -DEALLOCATE(ZRUS, ZRVS, ZRWS) -deallocate(ZUT,ZVT,ZWT) #endif ! -DEALLOCATE(ZBUT, ZBUTS) CALL CLEANLIST_ll(TZFIELDMT_ll) CALL DEL_HALO2_ll(TZHALO2MT_ll) !$acc update self(PRUS_ADV,PRVS_ADV,PRWS_ADV) @@ -543,4 +539,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ADVECUVW_RK diff --git a/src/MNH/condensation.f90 b/src/MNH/condensation.f90 index 57b950656..96edd4530 100644 --- a/src/MNH/condensation.f90 +++ b/src/MNH/condensation.f90 @@ -178,20 +178,20 @@ REAL, DIMENSION(KIU,KJU,KKU), OPTIONAL, INTENT(IN) :: PCPH !* 0.2 Declarations of local variables : ! INTEGER :: JI, JJ, JK, JKP, JKM, IKTB, IKTE ! loop index -REAL, DIMENSION(KIU,KJU,KKU) :: ZTLK, ZRT ! work arrays for T_l and total water mixing ratio -REAL, DIMENSION(KIU,KJU,KKU) :: ZL ! length scale -REAL, DIMENSION(KIU,KJU,KKU) :: ZFRAC ! Ice fraction -INTEGER, DIMENSION(KIU,KJU) :: ITPL ! top levels of troposphere -REAL, DIMENSION(KIU,KJU) :: ZTMIN ! minimum Temp. related to ITPL +REAL, DIMENSION(:,:,:), allocatable :: ZTLK, ZRT ! work arrays for T_l and total water mixing ratio +REAL, DIMENSION(:,:,:), allocatable :: ZL ! length scale +REAL, DIMENSION(:,:,:), allocatable :: ZFRAC ! Ice fraction +INTEGER, DIMENSION(:,:), allocatable :: ITPL ! top levels of troposphere +REAL, DIMENSION(:,:), allocatable :: ZTMIN ! minimum Temp. related to ITPL ! -REAL, DIMENSION(KIU,KJU,KKU) :: ZLV, ZLS, ZCPD +REAL, DIMENSION(:,:,:), allocatable :: ZLV, ZLS, ZCPD REAL :: ZTEMP, ZPV, ZQSL, ZPIV, ZQSI, ZCOND, ZLVS ! thermodynamics REAL :: ZLL, DZZ, ZZZ ! used for length scales REAL :: ZAH, ZA, ZB, ZSBAR, ZQ1, ZSIGMA, ZDRW, ZDTL, ZSIG_CONV ! related to computation of Sig_s INTEGER :: INQ1 REAL :: ZINC LOGICAL :: GPRESENT_PLV, GPRESENT_PLS, GPRESENT_PCPH -LOGICAL, DIMENSION(KIU,KJU,KKU) :: GWORK +LOGICAL, DIMENSION(:,:,:), allocatable :: GWORK ! !* 0.3 Definition of constants : ! @@ -213,8 +213,6 @@ REAL, DIMENSION(-22:11),PARAMETER :: ZSRC_1D =(/ & 0.9986521 , 0.999768E+00 , 0.9999684 , 0.999997E+00, & 1.0000000 , 1.000000 /) ! -!$acc declare create(ZFRAC) device_resident(ZTLK,ZRT,ZL,ITPL,ZTMIN,ZLV,ZLS,ZCPD,GWORK) -! !------------------------------------------------------------------------------- ! !$acc data present(PPABS, PZZ, PT, PRV, PRC, PRI, PRS, PRG, PSIGS, PMFCONV, PCLDFR, PSIGRC, PLV, PLS, PCPH) @@ -236,7 +234,22 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK3D(PRC,"CONDENSATION beg:PRC",PRECISION) CALL MPPDB_CHECK3D(PRI,"CONDENSATION beg:PRI",PRECISION) END IF -! + +allocate( ztlk (kiu, kju, kku ) ) +allocate( zrt (kiu, kju, kku ) ) +allocate( zl (kiu, kju, kku ) ) +allocate( zfrac(kiu, kju, kku ) ) + +allocate( itpl (kiu, kju ) ) +allocate( ztmin(kiu, kju ) ) + +allocate( zlv (kiu, kju, kku ) ) +allocate( zls (kiu, kju, kku ) ) +allocate( zcpd (kiu, kju, kku ) ) +allocate( gwork(kiu, kju, kku ) ) + +!$acc data create( ztlk, zrt, zl, zfrac, itpl, ztmin, zlv, zls,zcpd, gwork ) + IKTB=1+JPVEXT IKTE=KKU-JPVEXT ! @@ -503,4 +516,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE CONDENSATION diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90 index e4dd9c400..5c3162db8 100644 --- a/src/MNH/contrav.f90 +++ b/src/MNH/contrav.f90 @@ -570,7 +570,6 @@ INTEGER :: IINFO_ll LOGICAL :: GDATA_ON_DEVICE real :: ZTMP1, ZTMP2 ! Intermediate work variables REAL, DIMENSION(:,:), ALLOCATABLE :: ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH -!$acc declare create(ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH) TYPE(LIST_ll), POINTER :: TZFIELD_U, TZFIELD_V, TZFIELD_DZX, TZFIELD_DZY TYPE(HALO2LIST_ll), POINTER :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY @@ -649,6 +648,7 @@ IF (KADV_ORDER == 4 ) THEN ! !PW: necessary because pointers does not work with OpenACC (PGI 16.1) ALLOCATE(ZU_EAST(IJU,IKU),ZV_NORTH(IIU,IKU),ZDZX_EAST(IJU,IKU),ZDZY_NORTH(IIU,IKU)) +!$acc enter data create( zu_east, zv_north, zdzx_east, zdzy_north ) ZU_EAST(:,:) = TZHALO2_U%HALO2%EAST ZDZX_EAST(:,:) = TZHALO2_DZX%HALO2%EAST ZV_NORTH(:,:) = TZHALO2_V%HALO2%NORTH @@ -869,6 +869,7 @@ PRWCT(:,:,1) = - PRWCT(:,:,3) ! Mirror hypothesis !$acc update self(PRWCT) ! IF (KADV_ORDER == 4 ) THEN +!$acc exit data delete( zu_east, zv_north, zdzx_east, zdzy_north ) DEALLOCATE(ZU_EAST,ZV_NORTH,ZDZX_EAST,ZDZY_NORTH) CALL CLEANLIST_ll(TZFIELD_U) CALL CLEANLIST_ll(TZFIELD_V) diff --git a/src/MNH/emoist.f90 b/src/MNH/emoist.f90 index 1f68cffa3..891977a24 100644 --- a/src/MNH/emoist.f90 +++ b/src/MNH/emoist.f90 @@ -127,7 +127,6 @@ REAL,DIMENSION(:,:,:), INTENT(OUT):: PEMOIST ! result ! REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW ! ZA = coeft A, ZRW = total mixing ratio rw -!$acc declare create(ZA,ZRW) REAL :: ZDELTA ! = Rv/Rd - 1 INTEGER :: JRR ! moist loop counter ! @@ -146,6 +145,9 @@ end if allocate( za ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +!$acc data create( za, zrw ) + ! !* 1. COMPUTE EMOIST ! -------------- @@ -217,6 +219,8 @@ end if !$acc end data +!$acc end data + !--------------------------------------------------------------------------- ! #ifndef MNH_OPENACC diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90 index 1039cb55b..53c6580c5 100644 --- a/src/MNH/etheta.f90 +++ b/src/MNH/etheta.f90 @@ -132,7 +132,6 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PETHETA ! result ! REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW ! ZA = coeft A, ZRW = total mixing ratio rw -!$acc declare create(ZA,ZRW) REAL :: ZDELTA ! = Rv/Rd - 1 INTEGER :: JRR ! moist loop counter ! @@ -151,6 +150,9 @@ end if allocate( za ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +!$acc data create( za, zrw ) + ! !* 1. COMPUTE ETHETA ! -------------- @@ -217,6 +219,8 @@ end if !$acc end data +!$acc end data + !--------------------------------------------------------------------------- ! #ifndef MNH_OPENACC diff --git a/src/MNH/get_halo.f90 b/src/MNH/get_halo.f90 index d77fef3f8..34daa24a1 100644 --- a/src/MNH/get_halo.f90 +++ b/src/MNH/get_halo.f90 @@ -135,8 +135,6 @@ MODULE MODD_HALO_D IMPLICIT NONE REAL, SAVE , ALLOCATABLE, DIMENSION(:,:,:) :: ZNORTH_IN, ZSOUTH_IN, ZWEST_IN, ZEAST_IN REAL, SAVE , ALLOCATABLE, DIMENSION(:,:,:) :: ZNORTH_OUT, ZSOUTH_OUT, ZWEST_OUT, ZEAST_OUT -!!$acc declare create (ZNORTH_IN, ZSOUTH_IN, ZWEST_IN, ZEAST_IN) -!!$acc declare create (ZNORTH_OUT, ZSOUTH_OUT, ZWEST_OUT, ZEAST_OUT) LOGICAL, SAVE :: GFIRST_GET_HALO_D = .TRUE. diff --git a/src/MNH/gravity.f90 b/src/MNH/gravity.f90 index 97a5624a3..2d43fa8a4 100644 --- a/src/MNH/gravity.f90 +++ b/src/MNH/gravity.f90 @@ -142,7 +142,6 @@ INTEGER :: JWATER ! loop index on the different types of water REAL, DIMENSION(:,:,:), allocatable :: ZWORK1, ZWORK2 INTEGER :: IKU ! -!$acc declare device_resident(ZWORK1, ZWORK2) ! !------------------------------------------------------------------------------- @@ -159,6 +158,8 @@ END IF allocate( zwork1(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) allocate( zwork2(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) + +!$acc data create( zwork1, zwork2 ) ! !* 1. COMPUTES THE GRAVITY TERM ! ------------------------- @@ -240,6 +241,8 @@ END IF !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE GRAVITY diff --git a/src/MNH/gravity_impl.f90 b/src/MNH/gravity_impl.f90 index 8f97f2ff9..2667b4733 100644 --- a/src/MNH/gravity_impl.f90 +++ b/src/MNH/gravity_impl.f90 @@ -126,7 +126,6 @@ REAL, DIMENSION(:,:,:,:), allocatable :: ZR ! INTEGER :: JR ! -!$acc declare device_resident(ZRWS_GRAV, ZTH, ZR) !------------------------------------------------------------------------------- !$acc data present( PTHT, PRHODJ, PRT, PTHVREF, PRWS, PRTHS, PRRS, PRTHS_CLD, PRRS_CLD ) @@ -148,6 +147,9 @@ END IF allocate( zrws_grav( size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) allocate( zth ( size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) allocate( zr ( size( prt, 1 ), size( prt, 2 ), size( prt, 3 ), size( prt, 4 ) ) ) + +!$acc data create( zrws_grav, zth, zr ) + ! ! guess of Theta at future time-step !$acc kernels @@ -191,6 +193,8 @@ END IF !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE GRAVITY_IMPL diff --git a/src/MNH/ice4_compute_pdf.f90 b/src/MNH/ice4_compute_pdf.f90 index 2d56d0908..f0e67e524 100644 --- a/src/MNH/ice4_compute_pdf.f90 +++ b/src/MNH/ice4_compute_pdf.f90 @@ -77,26 +77,24 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC ! HLCLOUDS : LWC that is Low ! note that PRC = PHLC_HRC + PHLC_LRC REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRF ! Rain fraction ! -!$acc declare present(KSIZE,HSUBG_AUCV,HSUBG_PR_PDF,PRHODREF,PRCT,PCF,PSIGMA_RC, & -!$acc& PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PRF) -! !* 0.2 declaration of local variables ! -INTEGER :: JI -LOGICAL, DIMENSION(KSIZE) :: GWORK, GWORK2, GWORK3 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZRCRAUTC, & !RC value to begin rain formation =XCRIAUTC/RHODREF - ZHLC_RCMAX, & !HLCLOUDS : maximum value for RC in distribution - ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low LWC local in LCF - ZHLC_HRCLOCAL !HLCLOUDS : LWC that is High LWC local in HCF - ! note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL - ! = PHLC_HRC/HCF+ PHLC_LRC/LCF -REAL :: ZCOEFFRCM -! -!$acc declare create(GWORK,GWORK2,GWORK3,ZRCRAUTC,ZHLC_RCMAX,ZHLC_LRCLOCAL,ZHLC_HRCLOCAL,ZCOEFFRCM) +INTEGER :: JI +LOGICAL, DIMENSION(:), allocatable :: GWORK, GWORK2, GWORK3 +REAL :: ZCOEFFRCM +REAL, DIMENSION(:), allocatable :: ZRCRAUTC, & !RC value to begin rain formation =XCRIAUTC/RHODREF + ZHLC_RCMAX, & !HLCLOUDS : maximum value for RC in distribution + ZHLC_LRCLOCAL, & !HLCLOUDS : LWC that is Low LWC local in LCF + ZHLC_HRCLOCAL !HLCLOUDS : LWC that is High LWC local in HCF + ! note that ZRC/CF = ZHLC_HRCLOCAL+ ZHLC_LRCLOCAL + ! = PHLC_HRC/HCF+ PHLC_LRC/LCF ! !------------------------------------------------------------------------------- -!$acc data copyin( XCRIAUTC, XRTMIN ) +! !$acc data copyin( XCRIAUTC, XRTMIN ) + +!$acc data present(PRHODREF,PRCT,PCF,PSIGMA_RC, & +!$acc& PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PRF) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -105,7 +103,18 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PCF,"ICE4_COMPUTE_PDF beg:PCF",PRECISION) CALL MPPDB_CHECK1D(PSIGMA_RC,"ICE4_COMPUTE_PDF beg:PSIGMA_RC",PRECISION) END IF -! + +allocate( gwork (ksize ) ) +allocate( gwork2(ksize ) ) +allocate( gwork3(ksize ) ) + +allocate( zrcrautc (size( prhodref) ) ) +allocate( zhlc_rcmax (size( prhodref) ) ) +allocate( zhlc_lrclocal(size( prhodref) ) ) +allocate( zhlc_hrclocal(size( prhodref) ) ) + +!$acc data create(GWORK,GWORK2,GWORK3,ZRCRAUTC,ZHLC_RCMAX,ZHLC_LRCLOCAL,ZHLC_HRCLOCAL) + !Cloud water split between high and low content part is done according to autoconversion option !$acc kernels ZRCRAUTC(:)=XCRIAUTC/PRHODREF(:) ! Autoconversion rc threshold @@ -363,4 +372,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_COMPUTE_PDF diff --git a/src/MNH/ice4_fast_rg.f90 b/src/MNH/ice4_fast_rg.f90 index fbd1f5140..c319ceb3e 100644 --- a/src/MNH/ice4_fast_rg.f90 +++ b/src/MNH/ice4_fast_rg.f90 @@ -167,11 +167,6 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RH ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,KRR,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ,PCIT,PLBDAR,PLBDAS,PLBDAG, & -!$acc& PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRGSI,PRGSI_MR,LDWETG,PRICFRRG,PRRCFRIG,PRICFRR,PRCWETG,PRIWETG, & -!$acc& PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG,PRWETGH,PRWETGH_MR,PRGMLTR,PRG_TEND, & -!$acc& PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_RG,PB_RH) -! !* 0.2 declaration of local variables ! INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6 @@ -179,27 +174,22 @@ INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRR INTEGER :: IGDRY INTEGER :: IDX, JJ INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1 -INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2 +INTEGER, DIMENSION(:), allocatable :: I1 +INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2 LOGICAL :: GCRFLIMIT,GDSOFT,GEVLIMIT,GNULLWETG,GWETGPOST !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GDRY, GLDRYG, GMASK -REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, & +LOGICAL, DIMENSION(:), allocatable :: GDRY, GLDRYG, GMASK +REAL, DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3 +REAL, DIMENSION(:), allocatable :: ZZW, & ZRDRYG_INIT, & !Initial dry growth rate of the graupeln ZRWETG_INIT !Initial wet growth rate of the graupeln ! -!$acc declare create(IGDRY,I1,IVEC1,IVEC2,GDRY,GLDRYG,GMASK,ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYG_INIT,ZRWETG_INIT) -! -!$acc data copyin( XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, XLMTT, XLVTT, XMD, XMV, XRV, XTT, & -!$acc& LCRFLIMIT, LEVLIMIT, LNULLWETG, LWETGPOST, & -!$acc& XBS, XCEXVT, XCXG, XCXS, XDG, XRTMIN, & -!$acc& NDRYLBDAG, NDRYLBDAR, NDRYLBDAS, X0DEPG, X1DEPG, XCOLEXIG, XCOLEXSG, XCOLIG, XCOLSG, XDRYINTP1G, & -!$acc& XDRYINTP1R, XDRYINTP1S, XDRYINTP2G, XDRYINTP2R, XDRYINTP2S, XEX0DEPG, XEX1DEPG, XEXICFRR, & -!$acc& XEXRCFRI, XFCDRYG, XFIDRYG, XFRDRYG, XFSDRYG, XICFRR, XKER_RDRYG, XKER_SDRYG, XLBRDRYG1, & -!$acc& XLBRDRYG2, XLBRDRYG3, XLBSDRYG1, XLBSDRYG2, XLBSDRYG3, XRCFRI ) -! !------------------------------------------------------------------------------- ! +!$acc data present(LDCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ,PCIT,PLBDAR,PLBDAS,PLBDAG, & +!$acc& PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRGSI,PRGSI_MR,LDWETG,PRICFRRG,PRRCFRIG,PRICFRR,PRCWETG,PRIWETG, & +!$acc& PRRWETG,PRSWETG,PRCDRYG,PRIDRYG,PRRDRYG,PRSDRYG,PRWETGH,PRWETGH_MR,PRGMLTR,PRG_TEND, & +!$acc& PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_RG,PB_RH) + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK1D_LOG(LDCOMPUTE,"ICE4_FAST_RG beg:LDCOMPUTE") @@ -239,7 +229,22 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PB_RG,"ICE4_FAST_RG beg:PB_RG",PRECISION) CALL MPPDB_CHECK1D(PB_RH,"ICE4_FAST_RG beg:PB_RH",PRECISION) END IF -! + +allocate( i1 ( size( prhodref ) ) ) +allocate( ivec1 ( size( prhodref ) ) ) +allocate( ivec2 ( size( prhodref ) ) ) +allocate( gdry ( size( prhodref ) ) ) +allocate( gldryg ( size( prhodref ) ) ) +allocate( gmask ( size( prhodref ) ) ) +allocate( zvec1 ( size( prhodref ) ) ) +allocate( zvec2 ( size( prhodref ) ) ) +allocate( zvec3 ( size( prhodref ) ) ) +allocate( zzw ( size( prhodref ) ) ) +allocate( zrdryg_init( size( prhodref ) ) ) +allocate( zrwetg_init( size( prhodref ) ) ) + +!$acc data create(I1,IVEC1,IVEC2,GDRY,GLDRYG,GMASK,ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYG_INIT,ZRWETG_INIT) + !Workaround of PGI bug with OpenACC (at least up to 18.10 version) GCRFLIMIT = LCRFLIMIT GEVLIMIT = LEVLIMIT @@ -364,8 +369,8 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GDRY,IGDRY) -!$acc update self(IGDRY) -IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY) +! !$acc update self(IGDRY) +! IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY) ! !$acc kernels IF(GDSOFT) THEN !$acc kernels @@ -472,8 +477,8 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GDRY,IGDRY) -!$acc update self(IGDRY) -IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY) +! !$acc update self(IGDRY) +! IF(JJ==-999) print *,'PW: IGDRY=',IGDRY,COUNT(GDRY) ! !$acc kernels IF(GDSOFT) THEN !$acc kernels @@ -739,4 +744,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_FAST_RG diff --git a/src/MNH/ice4_fast_rh.f90 b/src/MNH/ice4_fast_rh.f90 index 4d27b08cb..033f84ada 100644 --- a/src/MNH/ice4_fast_rh.f90 +++ b/src/MNH/ice4_fast_rh.f90 @@ -151,42 +151,31 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RH ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,LDWETG,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ, & -!$acc& PLBDAS,PLBDAG,PLBDAR,PLBDAH,PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT, & -!$acc& PRCWETH,PRIWETH,PRSWETH,PRGWETH,PRRWETH, & -!$acc& PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR, & -!$acc& PRH_TEND,PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH) -! !* 0.2 declaration of local variables ! INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRSWETH=6, IRGDRYH=7, IRGWETH=8 ! -INTEGER :: IHAIL, IGWET +INTEGER :: IGWET INTEGER :: IDX, JJ -INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1 -INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2 +INTEGER, DIMENSION(:), allocatable :: I1 +INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2 LOGICAL :: GCONVHG,GDSOFT,GEVLIMIT,GNULLWETH,GWETHPOST !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GHAIL, GWET, GMASK, LLWETH, LLDRYH -REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, & +LOGICAL, DIMENSION(:), allocatable :: GHAIL, GWET, GMASK, LLWETH, LLDRYH +REAL, DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3 +REAL, DIMENSION(:), allocatable :: ZZW, & ZRDRYH_INIT, ZRWETH_INIT, & ZRDRYHG ! -!$acc declare create(IHAIL,IGWET,I1,IVEC1,IVEC2,GHAIL,GWET,GMASK,LLWETH,LLDRYH, & -!$acc& ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYH_INIT,ZRWETH_INIT,ZRDRYHG) -! -!$acc data copyin( XALPI, XALPW, XBETAI, XBETAW, XGAMW, XCI, XCL, XCPV, XESTT, XGAMI, XLMTT, XLVTT, XMD, XMV, XRV, XTT, & -!$acc& LCONVHG, LEVLIMIT, LNULLWETH, LWETHPOST, & -!$acc& XBG, XBS, XCEXVT, XCXG, XCXH, XCXS, XDH, XRTMIN, & -!$acc& NWETLBDAG, NWETLBDAH, NWETLBDAR, NWETLBDAS, X0DEPH, X1DEPH, XCOLEXGH, XCOLEXIH, XCOLGH, XCOLIH, XCOLEXSH, & -!$acc& XCOLSH, XEX0DEPH, XEX1DEPH, XFGWETH, XFRWETH, XFSWETH, XFWETH, XKER_GWETH, XKER_RWETH, XKER_SWETH, & -!$acc& XLBGWETH1, XLBGWETH2, XLBGWETH3, XLBRWETH1, XLBRWETH2, XLBRWETH3, XLBSWETH1, XLBSWETH2, XLBSWETH3, & -!$acc& XWETINTP1G, XWETINTP1H, XWETINTP1R, XWETINTP1S, XWETINTP2G, XWETINTP2H, XWETINTP2R, XWETINTP2S ) -! !------------------------------------------------------------------------------- ! CALL PRINT_MSG(NVERB_ERROR,'GEN','ICE4_FAST_RH','OPENACC: implemented but never tested') -! + +!$acc data present(LDCOMPUTE,LDWETG,PRHODREF,PLVFACT,PLSFACT,PPRES,PDV,PKA,PCJ, & +!$acc& PLBDAS,PLBDAG,PLBDAR,PLBDAH,PT,PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT, & +!$acc& PRCWETH,PRIWETH,PRSWETH,PRGWETH,PRRWETH, & +!$acc& PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR, & +!$acc& PRH_TEND,PA_TH,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH) + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK1D_LOG(LDCOMPUTE,"ICE4_FAST_RH beg:LDCOMPUTE") @@ -221,7 +210,26 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PA_RG,"ICE4_FAST_RH beg:PA_RG",PRECISION) CALL MPPDB_CHECK1D(PA_RH,"ICE4_FAST_RH beg:PA_RH",PRECISION) END IF -! + +allocate( i1 ( size( prhodref ) ) ) +allocate( ivec1 ( size( prhodref ) ) ) +allocate( ivec2 ( size( prhodref ) ) ) +allocate( ghail ( size( prhodref ) ) ) +allocate( gwet ( size( prhodref ) ) ) +allocate( gmask ( size( prhodref ) ) ) +allocate( llweth ( size( prhodref ) ) ) +allocate( lldryh ( size( prhodref ) ) ) +allocate( zvec1 ( size( prhodref ) ) ) +allocate( zvec2 ( size( prhodref ) ) ) +allocate( zvec3 ( size( prhodref ) ) ) +allocate( zzw ( size( prhodref ) ) ) +allocate( zrdryh_init( size( prhodref ) ) ) +allocate( zrweth_init( size( prhodref ) ) ) +allocate( zrdryhg ( size( prhodref ) ) ) + +!$acc data create(I1,IVEC1,IVEC2,GHAIL,GWET,GMASK,LLWETH,LLDRYH, & +!$acc& ZVEC1,ZVEC2,ZVEC3,ZZW,ZRDRYH_INIT,ZRWETH_INIT,ZRDRYHG) + !Workaround of PGI bug with OpenACC (at least up to 18.10 version) GCONVHG = LCONVHG GEVLIMIT = LEVLIMIT @@ -292,8 +300,8 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GWET,IGWET) -!$acc update self(IGWET) -IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET) +! !$acc update self(IGWET) +! IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET) ! !$acc kernels IF(GDSOFT) THEN !$acc kernels @@ -398,8 +406,8 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GWET,IGWET) -!$acc update self(IGWET) -IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET) +! !$acc update self(IGWET) +! IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET) ! !$acc kernels IF(GDSOFT) THEN !$acc kernels @@ -511,8 +519,8 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GWET,IGWET) -!$acc update self(IGWET) -IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET) +! !$acc update self(IGWET) +! IF(JJ==-999) print *,'PW: IGWET=',IGWET,COUNT(GWET) ! !$acc kernels IF(GDSOFT) THEN !$acc kernels @@ -771,4 +779,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_FAST_RH diff --git a/src/MNH/ice4_fast_ri.f90 b/src/MNH/ice4_fast_ri.f90 index 3d5d78d92..46b860570 100644 --- a/src/MNH/ice4_fast_ri.f90 +++ b/src/MNH/ice4_fast_ri.f90 @@ -96,18 +96,17 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_TH REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PAI,PCJ,PCIT, & -!$acc& PSSI,PRCT,PRIT,PRCBERI,PA_TH,PA_RC,PA_RI) -! !* 0.2 declaration of local variables ! LOGICAL :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW -!$acc declare create(GMASK,ZZW) +LOGICAL, DIMENSION(:), allocatable :: GMASK +REAL, DIMENSION(:), allocatable :: ZZW ! !------------------------------------------------------------------------------- ! +!$acc data present(LDCOMPUTE,PRHODREF,PLVFACT,PLSFACT,PAI,PCJ,PCIT, & +!$acc& PSSI,PRCT,PRIT,PRCBERI,PA_TH,PA_RC,PA_RI) + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK1D_LOG(LDCOMPUTE,"ICE4_FAST_RI beg:LDCOMPUTE") @@ -126,7 +125,12 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PA_RC,"ICE4_FAST_RI beg:PA_RC",PRECISION) CALL MPPDB_CHECK1D(PA_RI,"ICE4_FAST_RI beg:PA_RI",PRECISION) END IF -! + +allocate( gmask( size( prhodref ) ) ) +allocate( zzw ( size( prhodref ) ) ) + +!$acc data create(GMASK,ZZW) + ! !$acc kernels !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called GDSOFT = LDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) @@ -167,5 +171,9 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PA_RC,"ICE4_FAST_RI end:PA_RC",PRECISION) CALL MPPDB_CHECK1D(PA_RI,"ICE4_FAST_RI end:PA_RI",PRECISION) END IF -! + +!$acc end data + +!$acc end data + END SUBROUTINE ICE4_FAST_RI diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90 index f8600375d..4e213f09d 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -149,21 +149,10 @@ REAL, DIMENSION(:), allocatable :: ZVEC1, ZVEC2, ZVEC3 REAL, DIMENSION(:), allocatable :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE ! real, DIMENSION(:), allocatable :: xprov -!$acc data present( KSIZE, LDSOFT, LDCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ, & +!$acc data present( LDCOMPUTE, PRHODREF, PLVFACT, PLSFACT, PPRES, PDV, PKA, PCJ, & !$acc& PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG, & !$acc& PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, PRCMLTSR, PRS_TEND, PA_TH, & -!$acc& PA_RC, PA_RR, PA_RS, PA_RG ) & -! -!$acc& create( IGRIM, IGACC, I1, IVEC1, IVEC2, GRIM, GACC, GMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE ) & -! -!$acc& copyin( XALPI, XALPW, XBETAI, XBETAW, XCI, XCL, XCPV, XESTT, XGAMI, XGAMW, XLMTT, XLVTT, XMD, XMV, XRV, XTT, & -!$acc& LEVLIMIT, CSNOWRIMING, & -!$acc& XBS, XCEXVT, XCXS, XRTMIN, & -!$acc& NACCLBDAR, NACCLBDAS, NGAMINC, X0DEPS, X1DEPS, XACCINTP1R, XACCINTP1S, XACCINTP2R, XACCINTP2S, & -!$acc& XCRIMSG, XCRIMSS, XEX0DEPS, XEX1DEPS, XEXCRIMSG, XEXCRIMSS, XEXSRIMCG, XEXSRIMCG2, XFRACCSS, & -!$acc& XFSACCRG, XFSCVMG, XGAMINC_RIM1, XGAMINC_RIM2, XGAMINC_RIM4, XKER_RACCS, & -!$acc& XKER_RACCSS, XKER_SACCRG, XLBRACCS1, XLBRACCS2, XLBRACCS3, XLBSACCR1, XLBSACCR2, XLBSACCR3, & -!$acc& XRIMINTP1, XRIMINTP2, XSRIMCG, XSRIMCG2, XSRIMCG3 ) +!$acc& PA_RC, PA_RR, PA_RS, PA_RG ) ! !------------------------------------------------------------------------------- ! @@ -211,13 +200,15 @@ allocate( zzw6 ( size( prhodref ) ) ) allocate( zfreez_rate ( size( prhodref ) ) ) ! +!$acc data create( I1, IVEC1, IVEC2, GRIM, GACC, GMASK, ZVEC1, ZVEC2, ZVEC3, ZZW, ZZW2, ZZW6, ZFREEZ_RATE ) + ! !$acc kernels !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called GDSOFT = LDSOFT;GEVLIMIT = LEVLIMIT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) ! !$acc end kernels -!$acc kernels +! !$acc kernels ISIZE = KSIZE -!$acc end kernels +! !$acc end kernels ! !* 5.0 maximum freezing rate ! @@ -275,7 +266,6 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GRIM,IGRIM) -!$acc update self(IGRIM) IF(JJ==-999) print *,'PW: IGRIM=',IGRIM,COUNT(GRIM) ! !$acc kernels ! @@ -442,7 +432,6 @@ END DO !$acc end kernels !PW: BUG: this is necessary to get correct results (PGI 18.10) ! !$acc update self(GACC,IGACC) -!$acc update self(IGACC) IF(JJ==-999) print *,'PW: IGACC=',IGACC,COUNT(GACC) ! !$acc kernels IF(GDSOFT) THEN @@ -668,20 +657,6 @@ PA_RG(:) = PA_RG(:) + PRSMLTG(:) PA_RC(:) = PA_RC(:) - PRCMLTSR(:) PA_RR(:) = PA_RR(:) + PRCMLTSR(:) !$acc end kernels -! -deallocate( i1 ) -deallocate( ivec1 ) -deallocate( ivec2 ) -deallocate( grim ) -deallocate( gacc ) -deallocate( gmask ) -deallocate( zvec1 ) -deallocate( zvec2 ) -deallocate( zvec3 ) -deallocate( zzw ) -deallocate( zzw2 ) -deallocate( zzw6 ) -deallocate( zfreez_rate ) IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays @@ -704,4 +679,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_FAST_RS diff --git a/src/MNH/ice4_nucleation.f90 b/src/MNH/ice4_nucleation.f90 index 340f25344..0669066ff 100644 --- a/src/MNH/ice4_nucleation.f90 +++ b/src/MNH/ice4_nucleation.f90 @@ -80,26 +80,19 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RV REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI ! -!$acc declare present(KSIZE,ODSOFT,ODCOMPUTE,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR,PB_TH,PB_RV,PB_RI) -! !* 0.2 declaration of local variables ! -INTEGER :: JI -LOGICAL :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(KSIZE) :: GNEGT ! Test where to compute the HEN process -LOGICAL, DIMENSION(KSIZE) :: GWORK, GWORK2 -REAL, DIMENSION(KSIZE) :: ZW ! work array -REAL, DIMENSION(KSIZE) :: ZZW, & ! Work array - ZUSW, & ! Undersaturation over water - ZSSI ! Supersaturation over ice -! -!$acc declare create(JI,GNEGT,GWORK,GWORK2,ZW,ZZW,ZUSW,ZSSI) -! -!$acc data copyin( XALPI, XALPW, XBETAI, XBETAW, XGAMI, XGAMW, XMD, XMV, XTT, & -!$acc& LFEEDBACKT, & -!$acc& XALPHA1, XALPHA2, XBETA1, XBETA2, XMNU0, XNU10, XNU20, & -!$acc& XRTMIN ) -! +INTEGER :: JI +LOGICAL :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL, DIMENSION(:), allocatable :: GNEGT ! Test where to compute the HEN process +LOGICAL, DIMENSION(:), allocatable :: GWORK, GWORK2 +REAL, DIMENSION(:), allocatable :: ZW ! work array +REAL, DIMENSION(:), allocatable :: ZZW, & ! Work array + ZUSW, & ! Undersaturation over water + ZSSI ! Supersaturation over ice + +!$acc data present(ODCOMPUTE,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR,PB_TH,PB_RV,PB_RI) + !------------------------------------------------------------------------------- ! IF (MPPDB_INITIALIZED) THEN @@ -117,7 +110,17 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PB_RV,"ICE4_NUCLEATION beg:PB_RV") CALL MPPDB_CHECK(PB_RI,"ICE4_NUCLEATION beg:PB_RI") END IF -! + +allocate( gnegt (ksize ) ) +allocate( gwork (ksize ) ) +allocate( gwork2(ksize ) ) +allocate( zw (ksize ) ) +allocate( zzw (ksize ) ) +allocate( zusw (ksize ) ) +allocate( zssi (ksize ) ) + +!$acc data create(GNEGT,GWORK,GWORK2,ZW,ZZW,ZUSW,ZSSI) + !Workaround of PGI bug with OpenACC (at least up to 18.10 version) GFEEDBACKT = LFEEDBACKT ! !$acc kernels @@ -243,4 +246,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_NUCLEATION diff --git a/src/MNH/ice4_nucleation_wrapper.f90 b/src/MNH/ice4_nucleation_wrapper.f90 index 73cbd1d93..96869e7bd 100644 --- a/src/MNH/ice4_nucleation_wrapper.f90 +++ b/src/MNH/ice4_nucleation_wrapper.f90 @@ -71,32 +71,29 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRVHENI_MR ! Mixing ratio change due to the heterogeneous nucleation ! -!$acc declare present(KIT,KJT,KKT,LDMASK,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR) ! !* 0.2 declaration of local variables ! -INTEGER :: IDX, JI, JJ, JK -INTEGER :: JL -INTEGER :: INEGT, INEGT_TMP -INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3 -LOGICAL :: GDSOFT -LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE -LOGICAL, DIMENSION(KIT,KJT,KKT) :: GNEGT ! Test where to compute the HEN process -REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature - ZPRES, & ! Pressure - ZRVT, & ! Water vapor m.r. at t - ZCIT, & ! Pristine ice conc. at t - ZTHT, & ! Theta at t - ZRHODREF, & - ZEXN, & - ZLSFACT, & - ZRVHENI_MR, & - ZB_TH, ZB_RV, ZB_RI -! -!$acc declare create(IDX,JI,JJ,JK,JL,GDSOFT,GLDCOMPUTE,GNEGT,INEGT,INEGT_TMP,I1,I2,I3,ZZT,ZPRES,ZRVT,ZCIT,ZTHT, & -!$acc& ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI) -! -!$acc data copyin( XTT ) +INTEGER :: IDX, JI, JJ, JK +INTEGER :: JL +INTEGER :: INEGT, INEGT_TMP +INTEGER, DIMENSION(:), ALLOCATABLE :: I1,I2,I3 +LOGICAL :: GDSOFT +LOGICAL, DIMENSION(:), ALLOCATABLE :: GLDCOMPUTE +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: GNEGT ! Test where to compute the HEN process +REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature + ZPRES, & ! Pressure + ZRVT, & ! Water vapor m.r. at t + ZCIT, & ! Pristine ice conc. at t + ZTHT, & ! Theta at t + ZRHODREF, & + ZEXN, & + ZLSFACT, & + ZRVHENI_MR, & + ZB_TH, ZB_RV, ZB_RI +! +!$acc data present(LDMASK,PTHT,PPABST,PRHODREF,PEXN,PLSFACT,PT,PRVT,PCIT,PRVHENI_MR) + !------------------------------------------------------------------------------- ! IF (MPPDB_INITIALIZED) THEN @@ -112,6 +109,10 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PCIT,"ICE4_NUCLEATION_WRAPPER beg:PCIT") END IF + +allocate( gnegt(kit, kjt, kkt ) ) + +!$acc data create( gnegt ) ! ! optimization by looking for locations where ! the temperature is negative only !!! @@ -120,7 +121,6 @@ END IF GNEGT(:,:,:)=PT(:,:,:)<XTT .AND. LDMASK INEGT = COUNT(GNEGT(:,:,:)) !$acc end kernels -!$acc update self(INEGT) ! ALLOCATE(GLDCOMPUTE(INEGT)) ALLOCATE(I1(INEGT),I2(INEGT),I3(INEGT)) @@ -136,7 +136,10 @@ ALLOCATE(ZRVHENI_MR(INEGT)) ALLOCATE(ZB_TH(INEGT)) ALLOCATE(ZB_RV(INEGT)) ALLOCATE(ZB_RI(INEGT)) -! + +!$acc data create(GLDCOMPUTE,I1,I2,I3,ZZT,ZPRES,ZRVT,ZCIT,ZTHT, & +!$acc& ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI) + !$acc kernels ZB_TH(:) = 0. ZB_RV(:) = 0. @@ -182,10 +185,6 @@ IF(INEGT>0) THEN !$acc end kernels END IF ! -DEALLOCATE(GLDCOMPUTE) -DEALLOCATE(I1,I2,I3) -DEALLOCATE(ZZT,ZPRES,ZRVT,ZCIT,ZTHT,ZRHODREF,ZEXN,ZLSFACT,ZRVHENI_MR,ZB_TH,ZB_RV,ZB_RI) -! IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PCIT,"ICE4_NUCLEATION_WRAPPER end:PCIT") @@ -195,4 +194,8 @@ END IF !$acc end data +!$acc end data + +!$acc end data + END SUBROUTINE ICE4_NUCLEATION_WRAPPER diff --git a/src/MNH/ice4_rainfr_vert.f90 b/src/MNH/ice4_rainfr_vert.f90 index d0787c12f..37b1a209f 100644 --- a/src/MNH/ice4_rainfr_vert.f90 +++ b/src/MNH/ice4_rainfr_vert.f90 @@ -44,16 +44,17 @@ INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PPRFR !Precipitation fraction REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRR !Rain field ! -!$acc declare present(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKT, KKL, PPRFR, PRR) ! !* 0.2 declaration of local variables ! INTEGER :: JI, JJ, JK ! -!$acc data copyin( XRTMIN ) +! !$acc data copyin( XRTMIN ) ! !------------------------------------------------------------------------------- ! +!$acc data present(PPRFR, PRR) + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK3D(PRR,"ICE4_RAINFR_VERT beg:PRR",PRECISION) diff --git a/src/MNH/ice4_rimltc.f90 b/src/MNH/ice4_rimltc.f90 index 026fc4afc..ae52dc2e1 100644 --- a/src/MNH/ice4_rimltc.f90 +++ b/src/MNH/ice4_rimltc.f90 @@ -72,16 +72,13 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RC REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RI ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT, & -!$acc& PTHT,PRIT,PRIMLTC_MR,PB_TH,PB_RC,PB_RI) -! !* 0.2 declaration of local variables ! LOGICAL :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(KSIZE) :: GMASK -!$acc declare create(GMASK) -! -!$acc data copyin( XTT, LFEEDBACKT ) +LOGICAL, DIMENSION(:), allocatable :: GMASK + +!$acc data present(LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT, & +!$acc& PTHT,PRIT,PRIMLTC_MR,PB_TH,PB_RC,PB_RI) !------------------------------------------------------------------------------- IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -96,6 +93,10 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PB_RC,"ICE4_RIMLTC beg:PB_RC") CALL MPPDB_CHECK(PB_RI,"ICE4_RIMLTC beg:PB_RI") END IF + +allocate( gmask(ksize ) ) + +!$acc data create(GMASK) ! !* 7.1 cloud ice melting ! @@ -135,4 +136,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_RIMLTC diff --git a/src/MNH/ice4_rrhong.f90 b/src/MNH/ice4_rrhong.f90 index be99b28cc..067995467 100644 --- a/src/MNH/ice4_rrhong.f90 +++ b/src/MNH/ice4_rrhong.f90 @@ -73,17 +73,13 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_TH REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RR REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT,PRRT,PTHT, & -!$acc& PRRHONG_MR,PB_TH,PB_RR,PB_RG) -! !* 0.2 declaration of local variables ! LOGICAL :: GDSOFT, GFEEDBACKT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRRT)) :: GMASK -!$acc declare create(GMASK) -! -!$acc data copyin( XTT, XRTMIN, LFEEDBACKT ) +LOGICAL, DIMENSION(:), allocatable :: GMASK ! +!$acc data present(LDCOMPUTE,PEXN,PLVFACT,PLSFACT,PT,PRRT,PTHT, & +!$acc& PRRHONG_MR,PB_TH,PB_RR,PB_RG) !------------------------------------------------------------------------------- IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -98,6 +94,10 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PB_RR,"ICE4_RRHONG beg:PB_RR") CALL MPPDB_CHECK(PB_RG,"ICE4_RRHONG beg:PB_RG") END IF + +allocate( gmask(size( prrt ) ) ) + +!$acc data create(GMASK) ! !* 3.3 compute the spontaneous freezing source: RRHONG ! @@ -136,4 +136,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_RRHONG diff --git a/src/MNH/ice4_rsrimcg_old.f90 b/src/MNH/ice4_rsrimcg_old.f90 index ea1c477b9..cc9c628cd 100644 --- a/src/MNH/ice4_rsrimcg_old.f90 +++ b/src/MNH/ice4_rsrimcg_old.f90 @@ -76,23 +76,18 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to cl REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RS REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PB_RG ! -!$acc declare present(KSIZE,ODSOFT,ODCOMPUTE,PRHODREF,PLBDAS, & -!$acc& PT,PRCT,PRST,PRSRIMCG_MR,PB_RS,PB_RG) -! !* 0.2 declaration of local variables ! INTEGER :: IDX, JL INTEGER :: IGRIM -INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2 +INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2 LOGICAL :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GRIM -REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW -! -!$acc declare create(IGRIM, IVEC1, IVEC2, GRIM, ZVEC1, ZVEC2, ZZW) -! -!$acc data copyin( XTT, CSNOWRIMING, XRTMIN, NGAMINC, XEXSRIMCG, XGAMINC_RIM2, XRIMINTP1, XRIMINTP2, XSRIMCG ) +LOGICAL, DIMENSION(:), allocatable :: GRIM +REAL, DIMENSION(:), allocatable :: ZVEC1, ZVEC2 +REAL, DIMENSION(:), allocatable :: ZZW ! +!$acc data present(ODCOMPUTE,PRHODREF,PLBDAS, & +!$acc& PT,PRCT,PRST,PRSRIMCG_MR,PB_RS,PB_RG) !------------------------------------------------------------------------------- ! IF (MPPDB_INITIALIZED) THEN @@ -107,6 +102,15 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PB_RS,"ICE4_RSRIMCG_OLD beg:PB_RS") CALL MPPDB_CHECK(PB_RG,"ICE4_RSRIMCG_OLD beg:PB_RG") END IF + +allocate( ivec1(size( prhodref ) ) ) +allocate( ivec2(size( prhodref ) ) ) +allocate( grim (size( prhodref ) ) ) +allocate( zvec1(size( prhodref ) ) ) +allocate( zvec2(size( prhodref ) ) ) +allocate( zzw (size( prhodref ) ) ) + +!$acc data create( IVEC1, IVEC2, GRIM, ZVEC1, ZVEC2, ZZW) ! !------------------------------------------------------------------------------- ! @@ -194,4 +198,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_RSRIMCG_OLD diff --git a/src/MNH/ice4_sedimentation_split.f90 b/src/MNH/ice4_sedimentation_split.f90 index be8781cd4..89b442ffc 100644 --- a/src/MNH/ice4_sedimentation_split.f90 +++ b/src/MNH/ice4_sedimentation_split.f90 @@ -130,38 +130,28 @@ REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air !* 0.2 declaration of local variables ! ! -INTEGER :: JI,JJ,JK -INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL :: GDEPOSC, GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA -REAL :: ZINVTSTEP -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZCONC_TMP ! Weighted concentration -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),KKTB:KKTE) :: ZW ! work array -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ! droplet condensation - & ZRAY, & ! Cloud Mean radius - & ZLBC, & ! XLBC weighted by sea fraction - & ZFSEDC, & - & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step - & ZRCT, & - & ZRRT, & - & ZRIT, & - & ZRST, & - & ZRGT, & - & ZRHT +INTEGER :: JI,JJ,JK +INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GDEPOSC, GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA +REAL :: ZINVTSTEP +REAL, DIMENSION(:,:), allocatable :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(:,:,:), allocatable :: ZW ! work array +REAL, DIMENSION(:,:,:), allocatable :: ZCONC3D, & ! droplet condensation + & ZRAY, & ! Cloud Mean radius + & ZLBC, & ! XLBC weighted by sea fraction + & ZFSEDC, & + & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step + & ZRCT, & + & ZRRT, & + & ZRIT, & + & ZRST, & + & ZRGT, & + & ZRHT !------------------------------------------------------------------------------- -!$acc data present( KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, PTSTEP, KRR, OSEDIC, ODEPOSC, PVDEPOSC, PDZZ, & -!$acc& PRHODREF, PPABST, PTHT, PRHODJ, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT, & -!$acc& PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR ) & -! -!$acc& create( JI, JJ, JK, ZINVTSTEP, ZCONC_TMP, ZW, & -!$acc& ZCONC3D, ZRAY, ZLBC, ZFSEDC, ZPRCS, ZPRRS, ZPRIS, ZPRSS, ZPRGS, ZPRHS, & -!$acc& ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT ) & -! -!$acc& copyin( XRHOLW, & -!$acc XSPLIT_MAXCFL, & -!$acc XALPHAC, XALPHAC2, XCONC_LAND, XCONC_SEA, XCONC_URBAN, XLBC, XNUC, XNUC2, & -!$acc XFSEDC ) +!$acc data present( PDZZ, PRHODREF, PPABST, PTHT, PRHODJ, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT, & +!$acc& PINPRC, PINDEP, PINPRR, PINPRI, PINPRS, PINPRG, PSEA, PTOWN, PINPRH, PRHT, PRHS, PFPR ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -186,7 +176,32 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRGS,"ICE4_SEDIMENTATION_SPLIT beg:PRGS") IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"ICE4_SEDIMENTATION_SPLIT beg:PRHS") END IF -! + +allocate( zconc_tmp(size( prhodref, 1 ), size( prhodref, 2 ) ) ) + +allocate( zw(size( prhodref, 1 ), size( prhodref, 2 ), KKTB : KKTE ) ) + +allocate( zconc3d(size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zray (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zlbc (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zfsedc (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zprcs (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zprrs (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zpris (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zprss (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zprgs (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zprhs (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zrct (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zrrt (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zrit (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zrst (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zrgt (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) +allocate( zrht (size( prhodref, 1 ), size( prhodref, 2 ), size( prhodref, 3 ) ) ) + +!$acc data create( zconc_tmp, zw, & +!$acc& zconc3d, zray, zlbc, zfsedc, zprcs, zprrs, zpris, zprss, zprgs, zprhs, & +!$acc& zrct, zrrt, zrit, zrst, zrgt, zrht ) + !$acc kernels !Workaround of PGI bug with OpenACC (at least up to 18.10 version) GDEPOSC = ODEPOSC @@ -375,6 +390,7 @@ END IF !$acc end data +!$acc end data ! CONTAINS ! @@ -418,34 +434,25 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPRXS ! external tenden REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D REAL, DIMENSION(KIT,KJT,KKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air precipitation fluxes ! -!$acc declare present(KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKTB,KKTE,KKT,KKL,KRR,PMAXCFL, & -!$acc& PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PTSTEP, PRXT,PRXS,PINPRX,PPRXS, & -!$acc& PRAY,PLBC,PFSEDC,PCONC3D,PFPR) & -!$acc& copyin(KSPE) -! !* 0.2 declaration of local variables ! -character(len=10) :: yspe ! String for error message -INTEGER :: IDX, ISEDIM -INTEGER :: JI, JJ, JK, JL -INTEGER, DIMENSION(KIT*KJT*KKT) :: I1,I2,I3 ! Used to replace the COUNT -LOGICAL :: GPRESENT_PFPR -REAL :: ZINVTSTEP -REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC -REAL :: ZFSED, ZEXSED -REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE -REAL, DIMENSION(KIT, KJT) :: ZMAX_TSTEP ! Maximum CFL in column -REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZREMAINT ! Remaining time until the timestep end -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! Sedimentation fluxes -! -!$acc declare create(I1,I2,I3,ZINVTSTEP, & -!$acc ZFSED,ZEXSED,ZMAX_TSTEP,ZRSMIN,ZREMAINT,ZWSED) -! -!$acc data copyin( XCPD, XP00, XRD, & -!$acc& XCC, XCEXVT, XDC, XLBEXC, XRTMIN, & -!$acc& XEXCSEDI, XEXSEDG, XEXSEDH, XEXSEDR, XEXSEDS, XFSEDG, XFSEDH, XFSEDI, XFSEDR, XFSEDS ) -! +character(len=10) :: yspe ! String for error message +INTEGER :: IDX, ISEDIM +INTEGER :: JI, JJ, JK, JL +INTEGER, DIMENSION(:), allocatable :: I1,I2,I3 ! Used to replace the COUNT +LOGICAL :: GPRESENT_PFPR +REAL :: ZINVTSTEP +REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC +REAL :: ZFSED, ZEXSED +REAL, DIMENSION(:,:), allocatable :: ZMRCHANGE +REAL, DIMENSION(:,:), allocatable :: ZMAX_TSTEP ! Maximum CFL in column +REAL, DIMENSION(:), allocatable :: ZRSMIN +REAL, DIMENSION(:,:), allocatable :: ZREMAINT ! Remaining time until the timestep end +REAL, DIMENSION(:,:,:), allocatable :: ZWSED ! Sedimentation fluxes + +!$acc data present(PRHODREF,POORHODZ,PDZZ,PPABST,PTHT,PRXT,PRXS,PINPRX,PPRXS, & +!$acc& PRAY,PLBC,PFSEDC,PCONC3D,PFPR) + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PRHODREF,"INTERNAL_SEDIM_SPLI beg:PRHODREF") @@ -463,6 +470,22 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRXS,"INTERNAL_SEDIM_SPLI beg:PRXS") IF (PRESENT(PFPR)) CALL MPPDB_CHECK(PFPR,"INTERNAL_SEDIM_SPLI beg:PFPR") END IF + +allocate( i1(kit * kjt * kkt ) ) +allocate( i2(kit * kjt * kkt ) ) +allocate( i3(kit * kjt * kkt ) ) + +allocate( zmrchange (kit, kjt ) ) +allocate( zmax_tstep(kit, kjt ) ) + +allocate( zrsmin(size( xrtmin ) ) ) + +allocate( zremaint(size( prhodref, 1 ), size( prhodref, 2 ) ) ) + +allocate( zwsed(size( prhodref, 1 ), size( prhodref, 2 ), 0 : size( prhodref, 3 ) + 1 ) ) + +!$acc data create( i1, i2, i3, zmrchange, zmax_tstep, zrsmin, zremaint, zwsed ) + ! !------------------------------------------------------------------------------- IF (KSPE<2 .OR. KSPE>7) CALL PRINT_MSG(NVERB_FATAL,'GEN','INTERNAL_SEDIM_SPLIT','invalid species (KSPE variable)') @@ -664,6 +687,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE INTERNAL_SEDIM_SPLI ! END SUBROUTINE ICE4_SEDIMENTATION_SPLIT diff --git a/src/MNH/ice4_slow.f90 b/src/MNH/ice4_slow.f90 index 38416765e..160cdf061 100644 --- a/src/MNH/ice4_slow.f90 +++ b/src/MNH/ice4_slow.f90 @@ -112,25 +112,17 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RI REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RS REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RG ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,PRHODREF,PT,PSSI,PLVFACT,PLSFACT, & -!$acc& PRVT,PRCT,PRIT,PRST,PRGT,PLBDAS,PLBDAG,PAI,PCJ, & -!$acc& PRCHONI,PRVDEPS,PRIAGGS,PRIAUTS,PRVDEPG, & -!$acc& PA_TH,PA_RV,PA_RC,PA_RI,PA_RS,PA_RG ) -! !* 0.2 declaration of local variables ! LOGICAL :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK -REAL, DIMENSION(SIZE(PRHODREF)) :: ZCRIAUTI +LOGICAL, DIMENSION(:), allocatable :: GMASK +REAL, DIMENSION(:), allocatable :: ZCRIAUTI REAL :: ZTIMAUTIC ! -!$acc declare create(ZCRIAUTI,ZTIMAUTIC,GMASK) -! -!$acc data copyin( XTT, & -!$acc& XCEXVT, XRTMIN, & -!$acc& X0DEPG, X0DEPS, X1DEPG, X1DEPS, XACRIAUTI, XALPHA3, XBCRIAUTI, XBETA3, XCOLEXIS, XCRIAUTI, & -!$acc& XEX0DEPG, XEX0DEPS, XEX1DEPG, XEX1DEPS, XEXIAGGS, XFIAGGS, XHON, XTEXAUTI, XTIMAUTI ) -! +!$acc data present(LDCOMPUTE,PRHODREF,PT,PSSI,PLVFACT,PLSFACT, & +!$acc& PRVT,PRCT,PRIT,PRST,PRGT,PLBDAS,PLBDAG,PAI,PCJ, & +!$acc& PRCHONI,PRVDEPS,PRIAGGS,PRIAUTS,PRVDEPG, & +!$acc& PA_TH,PA_RV,PA_RC,PA_RI,PA_RS,PA_RG ) !------------------------------------------------------------------------------- ! IF (MPPDB_INITIALIZED) THEN @@ -163,7 +155,12 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PA_RS,"ICE4_SLOW beg:PA_RS") CALL MPPDB_CHECK(PA_RG,"ICE4_SLOW beg:PA_RG") END IF -! + +allocate( gmask (size( prhodref ) ) ) +allocate( zcriauti(size( prhodref ) ) ) + +!$acc data create(ZCRIAUTI,GMASK) + ! !$acc kernels !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called GDSOFT = LDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) @@ -323,4 +320,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_SLOW diff --git a/src/MNH/ice4_tendencies.f90 b/src/MNH/ice4_tendencies.f90 index 2bb519cbb..cff3f3e85 100644 --- a/src/MNH/ice4_tendencies.f90 +++ b/src/MNH/ice4_tendencies.f90 @@ -299,9 +299,22 @@ REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_HRC REAL, DIMENSION(KSIZE), INTENT(OUT) :: PHLC_LRC REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR ! Rain fraction ! -!$acc declare present(KSIZE,KIB,KIE,KIT,KJB,KJE,KJT,KKB,KKE,KKT,KKL,KRR,ODSOFT, & -!$acc& OWARM,HSUBG_RC_RR_ACCR,HSUBG_RR_EVAP,HSUBG_AUCV_RC,HSUBG_PR_PDF) -!$acc declare present(ODCOMPUTE,PEXN,PRHODREF,PLVFACT,PLSFACT,K1,K2,K3,PPRES,PCF,PCIT,PT,PTHT, & +!* 0.2 declaration of local variables +! +INTEGER :: IDX,JI,JJ,JK,JL +INTEGER :: IRR, ISIZE +LOGICAL :: GDSOFT, GWARM !Workaround of PGI bug with OpenACC (at least up to 18.10 version) +LOGICAL, DIMENSION(:), allocatable :: LLWETG +REAL, DIMENSION(:), allocatable :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & + & ZT, ZTHT, & + & ZZW, & + & ZSSI, ZKA, ZDV, ZAI, ZCJ, & + & ZRF, & + & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, & + & ZRGSI, ZRGSI_MR +REAL, DIMENSION(:,:,:), allocatable :: ZRRT3D +! +!$acc data present(ODCOMPUTE,PEXN,PRHODREF,PLVFACT,PLSFACT,K1,K2,K3,PPRES,PCF,PCIT,PT,PTHT, & !$acc& PRVT,PRCT,PRRT,PRIT,PRST,PRGT,PRHT,PRRT3D,PSIGMA_RC,PRVHENI_MR,PRRHONG_MR,PRIMLTC_MR, & !$acc& PRSRIMCG_MR,PRCHONI,PRVDEPS,PRIAGGS,PRIAUTS,PRVDEPG,PRCAUTR,PRCACCR,PRREVAV, & !$acc& PRCRIMSS,PRCRIMSG,PRSRIMCG,PRRACCSS,PRRACCSG,PRSACCRG,PRSMLTG,PRCMLTSR,PRICFRRG,PRRCFRIG, & @@ -310,29 +323,7 @@ REAL, DIMENSION(KIT,KJT,KKT), INTENT(OUT) :: PRAINFR ! Rain fraction !$acc& PRCDRYH,PRIDRYH,PRSDRYH,PRRDRYH,PRGDRYH,PRDRYHG,PRHMLTR,PRCBERI,PRS_TEND,PRG_TEND,PRH_TEND, & !$acc& PA_TH,PA_RV,PA_RC,PA_RR,PA_RI,PA_RS,PA_RG,PA_RH,PB_TH,PB_RV,PB_RC,PB_RR,PB_RI,PB_RS,PB_RG,PB_RH, & !$acc& PHLC_HCF,PHLC_LCF,PHLC_HRC,PHLC_LRC,PRAINFR) -! -!* 0.2 declaration of local variables -! -INTEGER :: IDX,JI,JJ,JK,JL -INTEGER :: IRR, ISIZE -LOGICAL :: GDSOFT, GWARM !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(KSIZE) :: LLWETG -REAL, DIMENSION(KSIZE) :: ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, & - & ZT, ZTHT, & - & ZZW, & - & ZSSI, ZKA, ZDV, ZAI, ZCJ, & - & ZRF, & - & ZLBDAR, ZLBDAS, ZLBDAG, ZLBDAH, ZLBDAR_RF, & - & ZRGSI, ZRGSI_MR -REAL, DIMENSION(KIT,KJT,KKT) :: ZRRT3D -! -!$acc declare create(ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZZW,ZSSI,ZKA,ZDV,ZAI,ZCJ,ZRF, & -!$acc& ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,ZRRT3D,IDX,JI,JJ,JK,JL,LLWETG) -! -!$acc data copyin( XALPI, XBETAI, XCI, XCPV, XGAMI, XLSTT, XMD, XMV, XP00, XRV, XTT, & -!$acc& XSCFAC, & -!$acc& XLBDAS_MAX, XLBEXG, XLBEXH, XLBEXR, XLBEXS, XLBG, XLBH, XLBR, XLBS, XRTMIN ) -! + IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PEXN,"ICE4_TENDENCIES beg:PEXN") @@ -377,14 +368,40 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRG_TEND,"ICE4_TENDENCIES beg:PRG_TEND") CALL MPPDB_CHECK(PRH_TEND,"ICE4_TENDENCIES beg:PRH_TEND") END IF -! + +allocate( llwetg (ksize ) ) +allocate( zrvt (ksize ) ) +allocate( zrct (ksize ) ) +allocate( zrrt (ksize ) ) +allocate( zrit (ksize ) ) +allocate( zrst (ksize ) ) +allocate( zrgt (ksize ) ) +allocate( zt (ksize ) ) +allocate( ztht (ksize ) ) +allocate( zzw (ksize ) ) +allocate( zssi (ksize ) ) +allocate( zka (ksize ) ) +allocate( zdv (ksize ) ) +allocate( zai (ksize ) ) +allocate( zcj (ksize ) ) +allocate( zrf (ksize ) ) +allocate( zlbdar (ksize ) ) +allocate( zlbdas (ksize ) ) +allocate( zlbdag (ksize ) ) +allocate( zlbdah (ksize ) ) +allocate( zlbdar_rf(ksize ) ) +allocate( zrgsi (ksize ) ) +allocate( zrgsi_mr (ksize ) ) + +allocate( zrrt3d(kit, kjt, kkt ) ) + +!$acc data create(LLWETG,ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZT,ZTHT,ZZW,ZSSI,ZKA,ZDV,ZAI,ZCJ,ZRF, & +!$acc& ZLBDAR,ZLBDAS,ZLBDAG,ZLBDAH,ZLBDAR_RF,ZRGSI,ZRGSI_MR,ZRRT3D) !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -!$acc kernels GDSOFT = ODSOFT GWARM = OWARM -!$acc end kernels ! -!$acc data copyin(GDSOFT) +! !$acc data copyin(GDSOFT) ! !$acc kernels IRR = KRR @@ -709,7 +726,6 @@ CALL ICE4_FAST_RI(KSIZE, GDSOFT, ODCOMPUTE, & &ZRCT, ZRIT, & &PRCBERI, PA_TH, PA_RC, PA_RI) ! -!$acc end data ! IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays @@ -790,4 +806,6 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE ICE4_TENDENCIES diff --git a/src/MNH/ice4_warm.f90 b/src/MNH/ice4_warm.f90 index a7a20b82a..385b45007 100644 --- a/src/MNH/ice4_warm.f90 +++ b/src/MNH/ice4_warm.f90 @@ -121,21 +121,17 @@ REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RV REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RC REAL, DIMENSION(KSIZE), INTENT(INOUT) :: PA_RR ! -!$acc declare present(KSIZE,LDSOFT,LDCOMPUTE,HSUBG_RC_RR_ACCR,HSUBG_RR_EVAP,PRHODREF,PLVFACT,PT,PPRES,PTHT, & -!$acc& PLBDAR,PLBDAR_RF,PKA,PDV,PCJ,PHLC_LCF,PHLC_HCF,PHLC_LRC,PHLC_HRC,PCF,PRF, & -!$acc& PRVT,PRCT,PRRT,PRCAUTR,PRCACCR,PRREVAV,PA_TH,PA_RV,PA_RC,PA_RR ) -! !* 0.2 declaration of local variables ! LOGICAL :: GDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GMASK, GMASK1, GMASK2 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW2, ZZW3, ZZW4 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZUSW ! Undersaturation over water -REAL, DIMENSION(SIZE(PRHODREF)) :: ZTHLT ! Liquid potential temperature -! -! -!$acc declare create(ZZW2,ZZW3,ZZW4,ZUSW,ZTHLT,GMASK,GMASK1,GMASK2) -! +LOGICAL, DIMENSION(:), allocatable :: GMASK, GMASK1, GMASK2 +REAL, DIMENSION(:), allocatable :: ZZW2, ZZW3, ZZW4 +REAL, DIMENSION(:), allocatable :: ZUSW ! Undersaturation over water +REAL, DIMENSION(:), allocatable :: ZTHLT ! Liquid potential temperature + +!$acc data present(LDCOMPUTE,PRHODREF,PLVFACT,PT,PPRES,PTHT, & +!$acc& PLBDAR,PLBDAR_RF,PKA,PDV,PCJ,PHLC_LCF,PHLC_HCF,PHLC_LRC,PHLC_HRC,PCF,PRF, & +!$acc& PRVT,PRCT,PRRT,PRCAUTR,PRCACCR,PRREVAV,PA_TH,PA_RV,PA_RC,PA_RR ) !------------------------------------------------------------------------------- ! IF (MPPDB_INITIALIZED) THEN @@ -169,7 +165,18 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PA_RC,"ICE4_WARM beg:PA_RC",PRECISION) CALL MPPDB_CHECK1D(PA_RR,"ICE4_WARM beg:PA_RR",PRECISION) END IF -! + +allocate( gmask (size( prhodref ) ) ) +allocate( gmask1(size( prhodref ) ) ) +allocate( gmask2(size( prhodref ) ) ) +allocate( zzw2 (size( prhodref ) ) ) +allocate( zzw3 (size( prhodref ) ) ) +allocate( zzw4 (size( prhodref ) ) ) +allocate( zusw (size( prhodref ) ) ) +allocate( zthlt (size( prhodref ) ) ) + +!$acc data create(GMASK,GMASK1,GMASK2,ZZW2,ZZW3,ZZW4,ZUSW,ZTHLT) + ! !$acc kernels !PW: bug?: for the moment I take the value from the CPU as OK. GPU value seems to be lost when this subroutine is called GDSOFT = LDSOFT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) @@ -383,5 +390,9 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PA_RC,"ICE4_WARM end:PA_RC",PRECISION) CALL MPPDB_CHECK1D(PA_RR,"ICE4_WARM end:PA_RR",PRECISION) END IF -! + +!$acc end data + +!$acc end data + END SUBROUTINE ICE4_WARM diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90 index b2cf71482..627390ce6 100644 --- a/src/MNH/ice_adjust.f90 +++ b/src/MNH/ice_adjust.f90 @@ -18,13 +18,13 @@ INTERFACE PRR, PRI, PRIS, PRS, PRG, & PRH, POUT_RV, POUT_RC, POUT_RI, POUT_TH ) ! -INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKA !near ground array index INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE CHARACTER(len=4), INTENT(IN) :: HBUNAME ! Name of the budget -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid ! Condensation LOGICAL :: OSIGMAS ! Switch for Sigma_s: ! use values computed in CONDENSATION @@ -38,11 +38,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio ! @@ -55,7 +55,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRIS ! Cloud ice m.r. at t+1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRR ! Rain water m.r. to adjust REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI ! Cloud ice m.r. to adjust @@ -194,13 +194,13 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! ! -INTEGER, INTENT(IN) :: KKA !near ground array index +INTEGER, INTENT(IN) :: KKA !near ground array index INTEGER, INTENT(IN) :: KKU !uppest atmosphere array index INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO INTEGER, INTENT(IN) :: KRR ! Number of moist variables CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE CHARACTER(len=4), INTENT(IN) :: HBUNAME ! Name of the budget -LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid +LOGICAL, INTENT(IN) :: OSUBG_COND ! Switch for Subgrid ! Condensation LOGICAL :: OSIGMAS ! Switch for Sigma_s: ! use values computed in CONDENSATION @@ -214,11 +214,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Reference Exner function ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PSIGS ! Sigma_s at time t REAL, DIMENSION(:,:,:), INTENT(IN) :: PMFCONV ! convective mass flux -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t +REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! Absolute Pressure at t REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! height of model layer REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXN ! Exner function ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(IN) :: PCF_MF! Convective Mass Flux Cloud fraction REAL, DIMENSION(:,:,:), INTENT(IN) :: PRC_MF! Convective Mass Flux liquid mixing ratio REAL, DIMENSION(:,:,:), INTENT(IN) :: PRI_MF! Convective Mass Flux ice mixing ratio ! @@ -231,7 +231,7 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS ! Theta source REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCS ! Second-order flux ! s'rc'/2Sigma_s2 at time t+1 ! multiplied by Lambda_3 -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! Cloud fraction ! REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRIS ! Cloud ice m.r. at t+1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PRR ! Rain water m.r. to adjust @@ -255,10 +255,10 @@ INTEGER :: IKE ! K index value of the last inner mass point INTEGER :: JITER,ITERMAX ! iterative loop for first order adjustment INTEGER :: JI,JJ,JK ! -LOGICAL,DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: GTEMP +LOGICAL,DIMENSION(:,:,:), allocatable :: GTEMP ! -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZSIGS,ZSRCS -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & +REAL, DIMENSION(:,:,:), allocatable :: ZSIGS,ZSRCS +REAL, DIMENSION(:,:,:), allocatable & :: ZT, & ! adjusted temperature ZRV, ZRC, ZRI, & ! adjusted state ZCPH, & ! guess of the CPh for the mixing @@ -266,12 +266,6 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & ZLS, & ! guess of the Ls at t+1 ZW1,ZW2 ! Work arrays for intermediate fields ! -!acc declare device_resident(ZT,ZCPH,ZLV,ZLS,ZW1,ZW2,GTEMP,ZSIGS) -!TODO PW: a repasser en resident quand condensation sera sur GPU -!$acc declare create(ZT,ZCPH,ZLV,ZLS,ZW1,ZW2,GTEMP,ZSIGS,ZSRCS) - -!$acc declare create(ZRV,ZRC,ZRI) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -315,7 +309,22 @@ CALL MPPDB_CHECK3D(PRVS,"ICE_ADJUST beg:PRVS",PRECISION) CALL MPPDB_CHECK3D(PRCS,"ICE_ADJUST beg:PRCS",PRECISION) CALL MPPDB_CHECK3D(PTHS,"ICE_ADJUST beg:PTHS",PRECISION) CALL MPPDB_CHECK3D(PRIS,"ICE_ADJUST beg:PRIS",PRECISION) -! + +allocate( gtemp(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zsigs(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zsrcs(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zt (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zrv (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zrc (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zri (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zcph (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zlv (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zls (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zw1 (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zw2 (size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + +!$acc data create( gtemp, zsigs, zsrcs, zt, zrv, zrc, zri, zcph, zlv, zls, zw1, zw2 ) + IIU = SIZE(PEXNREF,1) IJU = SIZE(PEXNREF,2) IKU = SIZE(PEXNREF,3) @@ -453,10 +462,10 @@ IF ( .NOT. OSUBG_COND ) THEN WHERE ( GTEMP(:,:,:) ) PCLDFR(:,:,:) = 1. ELSEWHERE - PCLDFR(:,:,:) = 0. + PCLDFR(:,:,:) = 0. ENDWHERE IF ( SIZE(PSRCS,3) /= 0 ) THEN - PSRCS(:,:,:) = PCLDFR(:,:,:) + PSRCS(:,:,:) = PCLDFR(:,:,:) END IF ELSE #ifdef MNH_OPENACC @@ -534,4 +543,6 @@ CALL MPPDB_CHECK3D(PCLDFR,"ICE_ADJUST end:PCLDFR",PRECISION) !$acc end data -END SUBROUTINE ICE_ADJUST +!$acc end data + +END SUBROUTINE ICE_ADJUST diff --git a/src/MNH/mode_mnh_zwork.f90 b/src/MNH/mode_mnh_zwork.f90 index 4cfaed867..e94ced87e 100644 --- a/src/MNH/mode_mnh_zwork.f90 +++ b/src/MNH/mode_mnh_zwork.f90 @@ -27,10 +27,8 @@ MODULE MODE_MNH_ZWORK ! REAL, SAVE, ALLOCATABLE , DIMENSION(:,:) :: ZPSRC_HALO2_WEST REAL, SAVE, ALLOCATABLE , DIMENSION(:,:) :: ZPSRC_HALO2_SOUTH -!acc declare create(ZPSRC_HALO2_WEST,ZPSRC_HALO2_SOUTH) REAL, SAVE, ALLOCATABLE , DIMENSION(:,:,:) :: ZUNIT3D -!acc declare device_resident(ZUNIT3D) INTEGER, parameter :: JPMAX_T3D = 40 INTEGER , ALLOCATABLE, DIMENSION (:) :: NT3D_POOL @@ -38,8 +36,6 @@ MODULE MODE_MNH_ZWORK !REAL , ALLOCATABLE, DIMENSION(:,:,:,:) , TARGET :: ZT3D_A1,ZT3D_A2,ZT3D_A3,ZT3D_A4 !REAL , POINTER , DIMENSION(:,:,:,:) :: ZT3D REAL,SAVE , ALLOCATABLE, DIMENSION(:,:,:,:) :: ZT3D - ! acc declare create(ZT3D_A1,ZT3D_A2,ZT3D_A3,ZT3D_A4) -!acc declare device_resident(ZT3D) TYPE TMODEL REAL , POINTER, DIMENSION(:,:,:,:) :: X END TYPE TMODEL diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90 index e8219824e..8c2d2609e 100644 --- a/src/MNH/mode_prandtl.f90 +++ b/src/MNH/mode_prandtl.f90 @@ -73,19 +73,24 @@ SUBROUTINE PHI3(PREDTH1,PREDR1,PRED2TH3,PRED2R3,PRED2THR3,HTURBDIM,OUSERV,PPHI3) #ifndef MNH_OPENACC REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PPHI3 #else - REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)), INTENT(OUT) :: PPHI3 + REAL, DIMENSION(:,:,:), INTENT(OUT) :: PPHI3 #endif ! - REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: ZW1, ZW2 - LOGICAL,DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: PHI3LOGIC -!$acc declare create( ZW1, ZW2, PHI3LOGIC ) - INTEGER :: IKB, IKE + INTEGER :: IKB, IKE + LOGICAL,DIMENSION(:,:,:), allocatable :: PHI3LOGIC + REAL, DIMENSION(:,:,:), allocatable :: ZW1, ZW2 !$acc data present( PREDTH1, PREDR1, PRED2TH3, PRED2R3, PRED2THR3, PPHI3 ) IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB -! + +allocate( zw1 ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) +allocate( zw2 ( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) +allocate( phi3logic( size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) + +!$acc data create( zw1, zw2, phi3logic ) + !$acc kernels IF (HTURBDIM=='3DIM') THEN !* 3DIM case @@ -139,6 +144,8 @@ PPHI3(:,:,IKE+1)=PPHI3(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION PHI3 #else @@ -160,16 +167,19 @@ SUBROUTINE PSI_SV(PREDTH1,PREDR1,PREDS1,PRED2THS,PRED2RS,PPHI3,PPSI3,PPSI_SV) #ifndef MNH_OPENACC REAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3),SIZE(PRED2THS,4)) :: PPSI_SV #else - REAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3),SIZE(PRED2THS,4)), INTENT(OUT) :: PPSI_SV + REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PPSI_SV #endif ! - LOGICAL, DIMENSION(SIZE(PRED2THS,1),SIZE(PRED2THS,2),SIZE(PRED2THS,3)) :: PSILOGIC -!$acc declare create( PSILOGIC ) INTEGER :: IKB, IKE INTEGER :: JSV + LOGICAL, DIMENSION(:,:,:), allocatable :: PSILOGIC !$acc data present( PREDTH1, PREDR1, PREDS1, PRED2THS, PRED2RS, PPHI3, PPSI3, PPSI_SV ) +allocate( psilogic( size( pred2ths, 1 ), size( pred2ths, 2 ), size( pred2ths, 3 ) ) ) + +!$acc data create( psilogic ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -199,6 +209,8 @@ END DO !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION PSI_SV #else @@ -388,7 +400,6 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU INTEGER :: IKB, IKE #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE -!$acc declare create( ZTMP1_DEVICE ) #endif !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PDTDZ, PD_PHI3DTDZ2_O_DDTDZ ) @@ -397,6 +408,8 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU allocate( ztmp1_device(size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) #endif +!$acc data create( ztmp1_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! @@ -456,6 +469,8 @@ PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE+1)=PD_PHI3DTDZ2_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_PHI3DTDZ2_O_DDTDZ #else @@ -565,8 +580,7 @@ SUBROUTINE M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH) #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE -!$acc declare create( ZTMP1_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PM3_WTH_W2TH ) @@ -574,6 +588,13 @@ SUBROUTINE M3_WTH_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PM3_WTH_W2TH) #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2TH', 'OpenACC: not yet tested' ) #endif + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#endif + +!$acc data create( ztmp1_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -593,6 +614,8 @@ PM3_WTH_W2TH(:,:,IKE+1)=PM3_WTH_W2TH(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_WTH_W2TH #else @@ -621,8 +644,7 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA, #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE -!$acc declare create( ZTMP1_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PBLL_O_E, PETHETA, PKEFF, PTKE, PD_M3_WTH_W2TH_O_DDTDZ ) @@ -630,6 +652,13 @@ SUBROUTINE D_M3_WTH_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PBLL_O_E,PETHETA, #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2TH_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#endif + +!$acc data create( ztmp1_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -659,6 +688,8 @@ PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2TH_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_WTH_W2TH_O_DDTDZ #else @@ -688,8 +719,7 @@ SUBROUTINE M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST, #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE -!$acc declare create( ZTMP1_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE #endif !$acc data present( PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_WTH_W2R ) @@ -697,6 +727,13 @@ SUBROUTINE M3_WTH_W2R(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_E,PEMOIST, #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_W2R', 'OpenACC: not yet tested' ) #endif + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#endif + +!$acc data create( ztmp1_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -714,6 +751,8 @@ PM3_WTH_W2R(:,:,IKE+1)=PM3_WTH_W2R(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_WTH_W2R #else @@ -742,8 +781,7 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_ #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE -!$acc declare create( ZTMP1_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PBLL_O_E, PEMOIST, PD_M3_WTH_W2R_O_DDTDZ ) @@ -751,6 +789,13 @@ SUBROUTINE D_M3_WTH_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PBLL_O_ #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_W2R_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pd, 1 ), size( pd, 2 ), size( pd, 3 ) ) ) +#endif + +!$acc data create( ztmp1_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -770,6 +815,8 @@ PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_W2R_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_WTH_W2R_O_DDTDZ #else @@ -802,8 +849,7 @@ SUBROUTINE M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_ #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PKEFF, PTKE, PSQRT_TKE, PBLL_O_E, PBETA, PLEPS, PEMOIST, PDTDZ, PM3_WTH_WR2 ) @@ -811,6 +857,14 @@ SUBROUTINE M3_WTH_WR2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBLL_O_ #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WR2', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -841,6 +895,8 @@ PM3_WTH_WR2(:,:,IKE+1)=PM3_WTH_WR2(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_WTH_WR2 #else @@ -874,8 +930,7 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_T #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: 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 ) @@ -883,6 +938,14 @@ SUBROUTINE D_M3_WTH_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PKEFF,PTKE,PSQRT_T #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_WTH_WR2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -915,6 +978,8 @@ PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_WTH_WR2_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_WTH_WR2_O_DDTDZ #else @@ -944,8 +1009,7 @@ SUBROUTINE M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PE #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PKEFF, PTKE, PSQRT_TKE, PBETA, PLEPS, PEMOIST, PM3_WTH_WTHR ) @@ -953,6 +1017,14 @@ SUBROUTINE M3_WTH_WTHR(KKA,KKU,KKL,PREDR1,PD,PKEFF,PTKE,PSQRT_TKE,PBETA,PLEPS,PE #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_WTH_WTHR', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -974,6 +1046,8 @@ PM3_WTH_WTHR(:,:,IKE+1)=PM3_WTH_WTHR(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_WTH_WTHR #else @@ -1043,8 +1117,7 @@ SUBROUTINE M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PDTDZ, PLM, PLEPS, PTKE, PM3_TH2_W2TH ) @@ -1052,6 +1125,14 @@ SUBROUTINE M3_TH2_W2TH(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PDTDZ,PLM,PLEPS,PTKE,PM3_TH #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2TH', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1074,6 +1155,8 @@ PM3_TH2_W2TH(:,:,IKE+1)=PM3_TH2_W2TH(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_TH2_W2TH #else @@ -1102,8 +1185,7 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OU #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_TH2_W2TH_O_DDTDZ ) @@ -1111,6 +1193,14 @@ SUBROUTINE D_M3_TH2_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,OU #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2TH_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1168,6 +1258,8 @@ PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2TH_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_W2TH_O_DDTDZ #else @@ -1194,8 +1286,7 @@ SUBROUTINE M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_TH2_WTH2 ) @@ -1203,6 +1294,14 @@ SUBROUTINE M3_TH2_WTH2(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_TH2_WTH #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTH2', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1232,6 +1331,8 @@ PM3_TH2_WTH2(:,:,IKE+1)=PM3_TH2_WTH2(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_TH2_WTH2 #else @@ -1260,8 +1361,7 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_TH2_WTH2_O_DDTDZ ) @@ -1269,6 +1369,14 @@ SUBROUTINE D_M3_TH2_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTH2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1302,6 +1410,8 @@ PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTH2_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_WTH2_O_DDTDZ #else @@ -1330,8 +1440,7 @@ SUBROUTINE M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_T #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PD, PLM, PLEPS, PTKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_W2R ) @@ -1339,6 +1448,14 @@ SUBROUTINE M3_TH2_W2R(KKA,KKU,KKL,PD,PLM,PLEPS,PTKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_T #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_W2R', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1371,6 +1488,8 @@ PM3_TH2_W2R(:,:,IKE+1)=PM3_TH2_W2R(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_TH2_W2R #else @@ -1401,8 +1520,7 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBL #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: 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 ) @@ -1410,6 +1528,14 @@ SUBROUTINE D_M3_TH2_W2R_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PBL #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_W2R_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1440,6 +1566,8 @@ PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_W2R_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_W2R_O_DDTDZ #else @@ -1467,8 +1595,7 @@ SUBROUTINE M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_ #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WR2 ) @@ -1476,6 +1603,14 @@ SUBROUTINE M3_TH2_WR2(KKA,KKU,KKL,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PDTDZ,PM3_ #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WR2', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1508,6 +1643,8 @@ PM3_TH2_WR2(:,:,IKE+1)=PM3_TH2_WR2(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_TH2_WR2 #else @@ -1537,14 +1674,21 @@ SUBROUTINE D_M3_TH2_WR2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PB #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: 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 ) #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WR2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1580,6 +1724,8 @@ PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WR2_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_WR2_O_DDTDZ #else @@ -1608,8 +1754,7 @@ SUBROUTINE M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PEMOIST, PDTDZ, PM3_TH2_WTHR ) @@ -1617,6 +1762,14 @@ SUBROUTINE M3_TH2_WTHR(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PEMOIST,PD #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_TH2_WTHR', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1638,6 +1791,8 @@ PM3_TH2_WTHR(:,:,IKE+1)=PM3_TH2_WTHR(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_TH2_WTHR #else @@ -1667,8 +1822,7 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: 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 ) @@ -1676,6 +1830,14 @@ SUBROUTINE D_M3_TH2_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_TH2_WTHR_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1698,6 +1860,8 @@ PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_TH2_WTHR_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_TH2_WTHR_O_DDTDZ #else @@ -1724,8 +1888,7 @@ SUBROUTINE M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTH #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PM3_THR_WTHR ) @@ -1733,6 +1896,14 @@ SUBROUTINE M3_THR_WTHR(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,PM3_THR_WTH #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTHR', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1754,6 +1925,8 @@ PM3_THR_WTHR(:,:,IKE+1)=PM3_THR_WTHR(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_THR_WTHR #else @@ -1782,8 +1955,7 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTHR_O_DDTDZ ) @@ -1791,6 +1963,14 @@ SUBROUTINE D_M3_THR_WTHR_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTHR_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1812,6 +1992,8 @@ PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTHR_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_THR_WTHR_O_DDTDZ #else @@ -1840,8 +2022,7 @@ SUBROUTINE M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PDRDZ, PM3_THR_WTH2 ) @@ -1849,6 +2030,14 @@ SUBROUTINE M3_THR_WTH2(KKA,KKU,KKL,PREDR1,PD,PLEPS,PSQRT_TKE,PBLL_O_E,PETHETA,PD #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_WTH2', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1870,6 +2059,8 @@ PM3_THR_WTH2(:,:,IKE+1)=PM3_THR_WTH2(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_THR_WTH2 #else @@ -1899,8 +2090,7 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: 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 ) @@ -1908,6 +2098,14 @@ SUBROUTINE D_M3_THR_WTH2_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -1942,6 +2140,8 @@ PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_THR_WTH2_O_DDTDZ #else @@ -1970,8 +2170,7 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLEPS, PSQRT_TKE, PBLL_O_E, PETHETA, PD_M3_THR_WTH2_O_DDRDZ ) @@ -1979,6 +2178,14 @@ SUBROUTINE D_M3_THR_WTH2_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLEPS,PSQRT_TKE,P #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_WTH2_O_DDRDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2003,6 +2210,8 @@ PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_WTH2_O_DDRDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_THR_WTH2_O_DDRDZ #else @@ -2030,8 +2239,7 @@ SUBROUTINE M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH) #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDR1, PD, PLM, PLEPS, PTKE, PDRDZ, PM3_THR_W2TH ) @@ -2039,6 +2247,14 @@ SUBROUTINE M3_THR_W2TH(KKA,KKU,KKL,PREDR1,PD,PLM,PLEPS,PTKE,PDRDZ,PM3_THR_W2TH) #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'M3_THR_W2TH', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2060,6 +2276,8 @@ PM3_THR_W2TH(:,:,IKE+1)=PM3_THR_W2TH(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION M3_THR_W2TH #else @@ -2090,8 +2308,7 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PB #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: 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 ) @@ -2099,6 +2316,14 @@ SUBROUTINE D_M3_THR_W2TH_O_DDTDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PB #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDTDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2133,6 +2358,8 @@ PD_M3_THR_W2TH_O_DDTDZ(:,:,IKE+1)=PD_M3_THR_W2TH_O_DDTDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_THR_W2TH_O_DDTDZ #else @@ -2160,8 +2387,7 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PD,1),SIZE(PD,2),SIZE(PD,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create( ZTMP1_DEVICE, ZTMP2_DEVICE ) + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE #endif !$acc data present( PREDTH1, PREDR1, PD, PLM, PLEPS, PTKE, PD_M3_THR_W2TH_O_DDRDZ ) @@ -2169,6 +2395,14 @@ SUBROUTINE D_M3_THR_W2TH_O_DDRDZ(KKA,KKU,KKL,PREDTH1,PREDR1,PD,PLM,PLEPS,PTKE,PD #ifdef MNH_OPENACC call Print_msg( NVERB_WARNING, 'GEN', 'D_M3_THR_W2TH_O_DDRDZ', 'OpenACC: not yet tested' ) #endif + +#ifdef 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 ) ) ) +#endif + +!$acc data create( ztmp1_device, ztmp2_device ) + IKB = 1+JPVEXT_TURB IKE = SIZE(PD,3)-JPVEXT_TURB @@ -2201,6 +2435,8 @@ PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE+1)=PD_M3_THR_W2TH_O_DDRDZ(:,:,IKE) !$acc end data +!$acc end data + #ifndef MNH_OPENACC END FUNCTION D_M3_THR_W2TH_O_DDRDZ #else diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 5f4426526..931e6f5fa 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -515,7 +515,6 @@ LOGICAL :: KSEDI LOGICAL :: KHHONI ! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS,ZRVS,ZRWS -!$acc declare create(ZRWS) REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST !To give pressure at t ! (and not t+1) to resolved_cloud REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ @@ -543,6 +542,8 @@ allocate( ZPABST(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) ) allocate( ZJ (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) ) allocate( ZWETDEPAER(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER) ) +!$acc data create( zrws ) + ! !* 0. MICROPHYSICAL SCHEME ! ------------------- @@ -2237,5 +2238,7 @@ IF (OEXIT) THEN CALL IO_File_close(TLUOUT) IF (IMI==NMODEL) CALL IO_File_close(TLUOUT0) END IF -! + +!$acc end data + END SUBROUTINE MODEL_n diff --git a/src/MNH/ppm_met.f90 b/src/MNH/ppm_met.f90 index 277ffc39f..f9f2d3e6c 100644 --- a/src/MNH/ppm_met.f90 +++ b/src/MNH/ppm_met.f90 @@ -133,18 +133,8 @@ REAL, INTENT(IN) :: PTSTEP_PPM ! Time Step PPM ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT, PTKET ! Vars at t REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT -! !PW: bug workaround with PGI (tested up to 16.10) -! !PTKET is present but if zero-size => not detected as present -! !!$acc declare present(PTHT,PTKET,PRT) -! !$acc declare present(PTHT,PRT) -! !$acc declare pcopyin(PTKET) ! REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRTHS, PRTKES! Source terms -! !PW: bug workaround with PGI (tested up to 16.10) -! !PRTKES is present but if zero-size => not detected as present -! !!$acc declare present(PRTHS,PRTKES) -! !$acc declare present(PRTHS) -! !$acc declare pcopyout(PRTKES) REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PRRS ! !* 0.2 Declarations of local variables : diff --git a/src/MNH/rain_ice.f90 b/src/MNH/rain_ice.f90 index 8f18f2415..9444b4556 100644 --- a/src/MNH/rain_ice.f90 +++ b/src/MNH/rain_ice.f90 @@ -426,68 +426,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZRHODREF, & ! RHO Dry REFerence REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW ! work array REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZT ! Temperature -LOGICAL :: GPRESENT_PFPR,GPRESENT_PSEA -! -#if 0 -!acc declare create(GMICRO,GWET,GHAIL,GDEP, & -!acc & IVEC1,IVEC2,ZVEC1,ZVEC2,ZVEC3,ZW, & -!acc & ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS,ZRAINFR, & -!acc & ZWSED,ZWSEDW1,ZWSEDW2,ZCONC_TMP,ZT,ZRAY,ZLBC,ZFSEDC, & -!acc & ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZRHT,ZCIT, & -!acc & ZRVS,ZRCS,ZRRS,ZRIS,ZRSS,ZRGS,ZRHS,ZTHS, & -!acc & ZRHODREF, & -!acc & ZRHODJ,ZZT,ZPRES,ZZW,ZZW2,ZZW3,ZZW4,ZLSFACT,ZLVFACT, & -!acc & ZUSW,ZSSI,ZLBDAS,ZLBDAG,ZLBDAH, & -!acc & ZAI,ZCJ,ZKA,ZDV,ZZW1,ZRTMIN) & -!acc & device_resident(GSEDIMR,GSEDIMC,GSEDIMI,GSEDIMS,GSEDIMG,GSEDIMH, & -!acc & GNEGT,GRIM,GACC,GDRY,GWORK, & -!acc & ZEXNREF,ZLBDAR,ZRDRYG,ZRWETG,ZSIGMA_RC,ZCF, & -!acc & I1,I2,I3 ) - -! !$acc declare copyin(XALPHA1,XCEXVT,XEXCSEDI,XEX0DEPG,XEX1DEPG,XEX0DEPS,XEX1DEPS, & -! !$acc & XEX0EVAR,XEX1EVAR, & -! !$acc & XEXCACCR,XEXIAGGS,XEXSEDG,XEXSEDH,XEXSEDR,XEXSEDS, & -! !$acc & XFSEDC,XFSEDG,XLBC,XLBEXC,XLBEXG,XLBEXI,XLBEXR,XLBEXS,XRTMIN, & -! !$acc & XKER_RACCS,XKER_RACCSS,XKER_SACCRG,XCXS, & -! !$acc & XRIMINTP1,XEXCRIMSS,XGAMINC_RIM1,XGAMINC_RIM2,XEXCRIMSG,XEXSRIMCG, & -! !$acc & XEXICFRR,XEXRCFRI,XKER_SDRYG,XCOLEXSG,XCXG,XKER_RDRYG, & -! !$acc & XALPHAC,XALPHAC2,XNUC,XNUC2 ) - -! !$acc declare create(ZHLC_HCF3D,ZHLC_LCF3D,ZHLC_HRC3D,ZHLC_LRC3D, & -!$acc declare create( ZRHODREF, & -!$acc & ZRVT,ZRCS,ZRCT,ZRGS,ZRGT,ZRHS,ZRHT,ZRRS,ZRRT,ZRSS,ZRST,ZRVS, & -!$acc & ZCIT,ZRIS,ZRIT,ZTHS,ZTHT,ZTHLT, & -!$acc & ZRHODJ,ZZT,ZPRES,ZZW,ZLSFACT,ZLVFACT,ZUSW,ZSSI,ZLBDAR_RF,ZLBDAG,ZLBDAH, & -!$acc & ZAI,ZCJ,ZKA,ZDV,ZCF,ZRF,ZHLC_HCF,ZHLC_HRC,ZHLC_LCF,ZHLC_LRC,ZZW1, & -!$acc & GPRESENT_PFPR,GPRESENT_PSEA ) - -!$acc data create(GMICRO, & -!$acc & ZW, & -!$acc & ZT, & -!$acc & I1,I2,I3 ) -#else -#if 0 -!Disabled if PGI 19.5 to 19.10 bug (crash of the compiler) -!$acc declare copyin(XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, & -!$acc & XALPI, XBETAI, XGAMI, XMD, XMV, XTT,& -! !$acc & LLES_CALL,& -!$acc & JPVEXT,& -! !$acc & CSUBG_PR_PDF, LDEPOSC,& -!$acc & XLBEXR, XLBR, XRTMIN,& -!$acc & XCRIAUTC) -#endif - -!$acc declare create( I1, I2, I3, GMICRO, & -!$acc & ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, & -!$acc & ZCIT, ZRVS, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZTHT, ZTHLT, & -!$acc & ZRHODREF, ZRHODJ, ZZT, ZPRES, ZEXNREF, ZZW, ZLSFACT, ZLVFACT, ZUSW, ZSSI, & -!$acc & ZLBDAR, ZLBDAR_RF, ZLBDAS, ZLBDAG, ZLBDAH, ZRDRYG, ZRWETG, & -!$acc & ZAI, ZCJ, ZKA, ZDV, ZSIGMA_RC, ZCF, ZRF, & -!$acc & ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, ZHLC_RCMAX, ZRCRAUTC, & -!$acc & ZHLC_HRCLOCAL, ZHLC_LRCLOCAL, ZZW1, ZW, ZT, & -!$acc & GPRESENT_PFPR,GPRESENT_PSEA ) -#endif - ! ! IN variables ! @@ -554,6 +492,8 @@ ALLOCATE( GMICRO(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) ) ALLOCATE( ZW (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) ) ALLOCATE( ZT (SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) ) +!$acc data create( I1, I2, I3, GMICRO, ZW, ZT ) + !------------------------------------------------------------------------------- ! !* 1. COMPUTE THE LOOP BOUNDS @@ -571,18 +511,6 @@ IKTE=IKT-JPVEXT ! ZINVTSTEP=1./PTSTEP ! -IF (PRESENT(PFPR)) THEN - GPRESENT_PFPR = .TRUE. -ELSE - GPRESENT_PFPR = .FALSE. -END IF -! -IF (PRESENT(PSEA)) THEN - GPRESENT_PSEA = .TRUE. -ELSE - GPRESENT_PSEA = .FALSE. -END IF -!$acc update device(GPRESENT_PFPR,GPRESENT_PSEA) ! ! !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES @@ -697,6 +625,15 @@ IF( IMICRO >= 0 ) THEN ELSE ALLOCATE(ZRHODJ(0)) END IF + +!$acc data create( ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, & +!$acc & ZCIT, ZRVS, ZRCS, ZRRS, ZRIS, ZRSS, ZRGS, ZRHS, ZTHS, ZTHT, ZTHLT, & +!$acc & ZRHODREF, ZZT, ZPRES, ZEXNREF, ZSIGMA_RC, ZCF, ZRF, & +!$acc & ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, ZHLC_RCMAX, ZRCRAUTC, & +!$acc & ZHLC_HRCLOCAL, ZHLC_LRCLOCAL, ZZW, ZLSFACT, ZLVFACT, ZUSW, ZSSI, & +!$acc & ZLBDAR, ZLBDAR_RF, ZLBDAS, ZLBDAG, ZLBDAH, ZRDRYG, ZRWETG, & +!$acc & ZAI, ZCJ, ZKA, ZDV, ZZW1, ZRHODJ ) + ! !$acc kernels !$acc loop independent @@ -972,9 +909,7 @@ IF( IMICRO >= 0 ) THEN PRAINFR(I1(JL),I2(JL),I3(JL)) = ZRF(JL) END DO !$acc end kernels -!$acc data copyin(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL) CALL ICE4_RAINFR_VERT(IIB, IIE, IIT, IJB, IJE, IJT, IKB, IKE, IKT, KKL, PRAINFR, PRRT(:,:,:)) -!$acc end data !$acc kernels !$acc loop independent DO JL=1,IMICRO @@ -1105,6 +1040,10 @@ IF( IMICRO >= 0 ) THEN END DO END IF !$acc end kernels + +!$acc end data + + ! ! ! @@ -1310,6 +1249,8 @@ END IF !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE RAIN_ICE diff --git a/src/MNH/rain_ice_fast_rg.f90 b/src/MNH/rain_ice_fast_rg.f90 index 5a11cc242..e99e3adc5 100644 --- a/src/MNH/rain_ice_fast_rg.f90 +++ b/src/MNH/rain_ice_fast_rg.f90 @@ -98,9 +98,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for int REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAG, ZVECLBDAR, ZVECLBDAS REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays ! -!$acc declare device_resident(I1, IVEC1, IVEC2, GWORK, ZZW, ZVEC1, ZVEC2, ZVEC3, & -!$acc & ZVECLBDAG, ZVECLBDAR, ZVECLBDAS, ZZW1) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -115,9 +112,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays ! ! OUT variables ! -!$acc & PRDRYG, PRWETG ) & - -!$acc & copyin( XKER_RDRYG, XKER_SDRYG ) +!$acc & PRDRYG, PRWETG ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -158,6 +153,9 @@ ALLOCATE( I1 (size(PRHODREF)) ) ALLOCATE( GWORK(size(PRHODREF)) ) ALLOCATE( ZZW (size(PRHODREF)) ) ALLOCATE( ZZW1 (size(PRHODREF),7) ) + +!$acc data create( I1, GWORK, ZZW, ZZW1 ) + ! !* 6.1 rain contact freezing ! @@ -251,6 +249,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) ALLOCATE(ZVEC3(IGDRY)) ALLOCATE(IVEC1(IGDRY)) ALLOCATE(IVEC2(IGDRY)) + +!$acc data create( ZVECLBDAG, ZVECLBDAS, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 ) ! !* 6.2.3 select the (PLBDAG,PLBDAS) couplet ! @@ -315,6 +315,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) #endif END DO !$acc end kernels + +!$acc end data DEALLOCATE(ZVECLBDAS) DEALLOCATE(ZVECLBDAG) DEALLOCATE(IVEC2) @@ -346,6 +348,7 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) ALLOCATE(ZVEC3(IGDRY)) ALLOCATE(IVEC1(IGDRY)) ALLOCATE(IVEC2(IGDRY)) +!$acc data create( ZVECLBDAG, ZVECLBDAR, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 ) ! !* 6.2.8 select the (PLBDAG,PLBDAR) couplet ! @@ -408,6 +411,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) #endif END DO !$acc end kernels + +!$acc end data DEALLOCATE(ZVECLBDAR) DEALLOCATE(ZVECLBDAG) DEALLOCATE(IVEC2) @@ -633,6 +638,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_FAST_RG END MODULE MODE_RAIN_ICE_FAST_RG diff --git a/src/MNH/rain_ice_fast_rh.f90 b/src/MNH/rain_ice_fast_rh.f90 index 4181b18f1..b8abc187d 100644 --- a/src/MNH/rain_ice_fast_rh.f90 +++ b/src/MNH/rain_ice_fast_rh.f90 @@ -93,9 +93,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAG, ZVECLBDAH, ZVECLBDAS REAL, DIMENSION(:), ALLOCATABLE :: ZZW ! Work array REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays ! -!$acc declare device_resident(I1H, I1W, IVEC1, IVEC2, GWORK, ZVEC1, ZVEC2, ZVEC3, & -!$acc & ZVECLBDAG, ZVECLBDAH, ZVECLBDAS, ZZW, ZZW1) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -106,14 +103,12 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZZW1 ! Work arrays ! ! INOUT variables ! -!$acc & PLBDAH, PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, PTHS, PUSW ) & +!$acc & PLBDAH, PRCS, PRRS, PRIS, PRSS, PRGS, PRHS, PTHS, PUSW ) ! ! OUT variables ! !NONE -!$acc & copyin( XKER_GWETH, XKER_SWETH ) - #ifdef MNH_OPENACC CALL PRINT_MSG(NVERB_WARNING,'GEN','RAIN_ICE_FAST_RH','OPENACC: not yet tested') #endif @@ -157,7 +152,9 @@ ALLOCATE( I1W (size(PRHODREF)) ) ALLOCATE( GWORK(size(PRHODREF)) ) ALLOCATE( ZZW (size(PRHODREF)) ) ALLOCATE( ZZW1 (size(PRHODREF),7) ) -! + +!$acc data create( I1H, I1W, GWORK, ZZW, ZZW1 ) + !$acc kernels GWORK(:) = PRHT(:)>XRTMIN(7) !$acc end kernels @@ -213,6 +210,9 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) ALLOCATE(ZVEC3(IGWET)) ALLOCATE(IVEC1(IGWET)) ALLOCATE(IVEC2(IGWET)) + +!$acc data create( ZVECLBDAH, ZVECLBDAS, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 ) + ! !* 7.2.3 select the (PLBDAH,PLBDAS) couplet ! @@ -258,6 +258,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) XLBSWETH3/( ZVECLBDAS(JJ)**2) ) ) END DO !$acc end kernels + +!$acc end data DEALLOCATE(ZVECLBDAS) DEALLOCATE(ZVECLBDAH) DEALLOCATE(IVEC2) @@ -289,6 +291,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) ALLOCATE(ZVEC3(IGWET)) ALLOCATE(IVEC1(IGWET)) ALLOCATE(IVEC2(IGWET)) + +!$acc data create( ZVECLBDAG, ZVECLBDAH, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2 ) ! !* 7.2.8 select the (PLBDAH,PLBDAG) couplet ! @@ -334,6 +338,8 @@ ALLOCATE( ZZW1 (size(PRHODREF),7) ) XLBGWETH3/( ZVECLBDAG(JJ)**2) ) ),0. ) END DO !$acc end kernels + +!$acc end data DEALLOCATE(ZVECLBDAH) DEALLOCATE(ZVECLBDAG) DEALLOCATE(IVEC2) @@ -503,6 +509,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_FAST_RH END MODULE MODE_RAIN_ICE_FAST_RH diff --git a/src/MNH/rain_ice_fast_ri.f90 b/src/MNH/rain_ice_fast_ri.f90 index 3c853be77..5ebaf71d1 100644 --- a/src/MNH/rain_ice_fast_ri.f90 +++ b/src/MNH/rain_ice_fast_ri.f90 @@ -61,8 +61,6 @@ REAL, DIMENSION(:), INTENT(INOUT) :: PTHS ! Theta source LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK REAL, DIMENSION(:), ALLOCATABLE :: ZZW ! Work array ! -!$acc declare device_resident( GWORK, ZZW ) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -102,6 +100,9 @@ END IF ! ALLOCATE( GWORK(size(PRHODREF)) ) ALLOCATE( ZZW (size(PRHODREF)) ) + +!$acc data create( GWORK, ZZW ) + ! !* 7.1 cloud ice melting ! @@ -169,6 +170,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_FAST_RI END MODULE MODE_RAIN_ICE_FAST_RI diff --git a/src/MNH/rain_ice_fast_rs.f90 b/src/MNH/rain_ice_fast_rs.f90 index 1aeb5c892..1def10276 100644 --- a/src/MNH/rain_ice_fast_rs.f90 +++ b/src/MNH/rain_ice_fast_rs.f90 @@ -89,9 +89,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZVEC1,ZVEC2,ZVEC3 ! Work vectors for inter REAL, DIMENSION(:), ALLOCATABLE :: ZVECLBDAR, ZVECLBDAS REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays ! -!$acc declare device_resident(I1, IVEC1, IVEC2, GWORK, ZZW, ZVEC1, ZVEC2, ZVEC3, & -!$acc & ZVECLBDAR, ZVECLBDAS, ZZW1, ZZW2, ZZW3, ZZW4) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -102,14 +99,12 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZW1, ZZW2, ZZW3, ZZW4 ! Work arrays ! ! INOUT variables ! -!$acc & PRCS, PRRS, PRSS, PRGS, PTHS ) & +!$acc & PRCS, PRRS, PRSS, PRGS, PTHS ) ! ! OUT variables ! !NONE -!$acc & copyin( XKER_RACCS, XKER_RACCSS, XKER_SACCRG ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(OMICRO,"RAIN_ICE_FAST_RS beg:OMICRO") @@ -141,6 +136,8 @@ END IF ALLOCATE( I1 (size(PRHODREF)) ) ALLOCATE( GWORK(size(PRHODREF)) ) ALLOCATE( ZZW (size(PRHODREF)) ) + +!$acc data create( I1, GWORK, ZZW ) ! !* 5.1 cloud droplet riming of the aggregates ! @@ -164,6 +161,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ALLOCATE(ZZW1(IGRIM)) ALLOCATE(ZZW2(IGRIM)) ALLOCATE(ZZW3(IGRIM)) +!$acc data create( ZVECLBDAS, ZVEC1, ZVEC2, IVEC2, ZZW1, ZZW2, ZZW3 ) ! ! 5.1.1 select the PLBDAS ! @@ -249,6 +247,8 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) END IF END DO !$acc end kernels + +!$acc end data DEALLOCATE(ZZW3) DEALLOCATE(ZZW2) DEALLOCATE(ZZW1) @@ -299,6 +299,7 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) ALLOCATE(ZZW2(IGACC)) ALLOCATE(ZZW3(IGACC)) ALLOCATE(ZZW4(IGACC)) +!$acc data create( ZVECLBDAR, ZVECLBDAS, ZVEC1, ZVEC2, ZVEC3, IVEC1, IVEC2, ZZW2, ZZW3, ZZW4 ) ! ! 5.2.1 select the (PLBDAS,PLBDAR) couplet ! @@ -426,6 +427,8 @@ CALL COUNTJV_DEVICE( GWORK(:), I1(:), IGRIM ) END IF END DO !$acc end kernels + +!$acc end data DEALLOCATE(ZZW4) DEALLOCATE(ZZW3) DEALLOCATE(ZZW2) @@ -505,6 +508,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_FAST_RS END MODULE MODE_RAIN_ICE_FAST_RS diff --git a/src/MNH/rain_ice_nucleation.f90 b/src/MNH/rain_ice_nucleation.f90 index 07beccbeb..c5b38273f 100644 --- a/src/MNH/rain_ice_nucleation.f90 +++ b/src/MNH/rain_ice_nucleation.f90 @@ -70,25 +70,20 @@ REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t ! !* 0.2 declaration of local variables ! -INTEGER :: INEGT -INTEGER :: JL ! and PACK intrinsics -INTEGER, DIMENSION(SIZE(PEXNREF)) :: I1,I2,I3 ! Used to replace the COUNT -LOGICAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & - :: GNEGT ! Test where to compute the HEN process -REAL :: ZZWMAX -REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t -REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature - ZPRES, & ! Pressure - ZZW, & ! Work array - ZUSW, & ! Undersaturation over water - ZSSI ! Supersaturation over ice -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & - :: ZW ! work array +INTEGER :: INEGT +INTEGER :: JL ! and PACK intrinsics +INTEGER, DIMENSION(:), allocatable :: I1,I2,I3 ! Used to replace the COUNT +LOGICAL, DIMENSION(:,:,:), allocatable :: GNEGT ! Test where to compute the HEN process +REAL :: ZZWMAX +REAL, DIMENSION(:), ALLOCATABLE :: ZRVT ! Water vapor m.r. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZCIT ! Pristine ice conc. at t +REAL, DIMENSION(:), ALLOCATABLE :: ZZT, & ! Temperature + ZPRES, & ! Pressure + ZZW, & ! Work array + ZUSW, & ! Undersaturation over water + ZSSI ! Supersaturation over ice +REAL, DIMENSION(:,:,:), allocatable :: ZW ! work array ! -!$acc declare device_resident(ZRVT, ZCIT, ZZT, ZPRES, ZZW, ZUSW, ZSSI, ZW) -!$acc declare device_resident(I1, I2, I3, GNEGT) - !------------------------------------------------------------------------------- ! ! IN variables @@ -102,9 +97,7 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) & ! ! OUT variables ! -!$acc & PT ) & - -!$acc & copyin( XALPHA1 ) +!$acc & PT ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -126,6 +119,14 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRVS,"RAIN_ICE_NUCLEATION beg:PRVS") CALL MPPDB_CHECK(PRIS,"RAIN_ICE_NUCLEATION beg:PRIS") END IF + +allocate( i1( size( pexnref ) ) ) +allocate( i2( size( pexnref ) ) ) +allocate( i3( size( pexnref ) ) ) +allocate( gnegt( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zw ( size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + +!$acc data create( i1, i2, i3, gnegt, zw ) ! ! ! compute the temperature and the pressure @@ -156,6 +157,8 @@ IF( INEGT >= 1 ) THEN ALLOCATE(ZZW(INEGT)) ALLOCATE(ZUSW(INEGT)) ALLOCATE(ZSSI(INEGT)) +!$acc data create( zrvt, zcit, zzt, zpres, zzw, zusw, zssi ) + !$acc kernels DO JL=1,INEGT ZRVT(JL) = PRVT (I1(JL),I2(JL),I3(JL)) @@ -237,6 +240,8 @@ IF( INEGT >= 1 ) THEN END DO END IF !$acc end kernels + +!$acc end data DEALLOCATE(ZSSI) DEALLOCATE(ZUSW) DEALLOCATE(ZZW) @@ -264,6 +269,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_NUCLEATION END MODULE MODE_RAIN_ICE_NUCLEATION diff --git a/src/MNH/rain_ice_red.f90 b/src/MNH/rain_ice_red.f90 index 81e786272..ec42b1f1c 100644 --- a/src/MNH/rain_ice_red.f90 +++ b/src/MNH/rain_ice_red.f90 @@ -341,31 +341,24 @@ INTEGER :: IKE, IKTE ! !For packing INTEGER :: IDX, JI, JJ, JK INTEGER :: IMICRO ! Case r_x>0 locations -INTEGER, DIMENSION(COUNT(ODMICRO)) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER, DIMENSION(:), allocatable :: I1,I2,I3 ! Used to replace the COUNT INTEGER :: JL ! and PACK intrinsics ! -!acc declare create(IIB,IIE,IIT,IJB,IJE,IJT,IKB,IKTB,IKT,IKE,IKTE,IMICRO,I1,I2,I3,JL) -!$acc declare create(I1,I2,I3) -! -LOGICAL, DIMENSION(COUNT(ODMICRO)) :: GWORK -!acc declare create(GWORK) +LOGICAL, DIMENSION(:), allocatable :: GWORK ! !Arrays for nucleation call outisde of ODMICRO points -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZW ! work array -REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) :: ZT ! Temperature -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & +REAL, DIMENSION(:,:,:), allocatable :: ZW ! work array +REAL, DIMENSION(:,:,:), allocatable :: ZT ! Temperature +REAL, DIMENSION(:,:,:), allocatable :: & & ZZ_RVHENI_MR, & ! heterogeneous nucleation mixing ratio change & ZZ_RVHENI ! heterogeneous nucleation -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D +REAL, DIMENSION(:,:,:), allocatable :: ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D ! !Diagnostics -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2)) :: ZINPRI ! Pristine ice instant precip -! -!$acc declare create(ZW,ZT,ZZ_RVHENI_MR,ZZ_RVHENI,ZZ_LVFACT,ZZ_LSFACT,ZLSFACT3D, & -!$acc & ZINPRI) +REAL, DIMENSION(:,:), allocatable :: ZINPRI ! Pristine ice instant precip ! !Packed variables -REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVT, & ! Water vapor m.r. at t +REAL, DIMENSION(:), allocatable :: ZRVT, & ! Water vapor m.r. at t & ZRCT, & ! Cloud water m.r. at t & ZRRT, & ! Rain water m.r. at t & ZRIT, & ! Pristine ice m.r. at t @@ -389,11 +382,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVT, & ! Water vapor m.r. at t & ZHLC_LRC ! HLCLOUDS : LWC that is Low LWC in grid ! note that ZRC = ZHLC_HRC + ZHLC_LRC ! -!$acc declare create(ZRVT,ZRCT,ZRRT,ZRIT,ZRST,ZRGT,ZRHT,ZCIT,ZTHT,ZRHODREF,ZZT,ZPRES,ZEXN, & -!$acc& ZLSFACT,ZLVFACT,ZSIGMA_RC,ZCF,ZHLC_HCF,ZHLC_LCF,ZHLC_HRC,ZHLC_LRC) -! !Output packed tendencies (for budgets only) -REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change +REAL, DIMENSION(:), allocatable :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change & ZRCHONI, & ! Homogeneous nucleation & ZRRHONG_MR, & ! Spontaneous freezing mixing ratio change & ZRVDEPS, & ! Deposition on r_s, @@ -420,13 +410,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZRVHENI_MR, & ! heterogeneous nucleation mixi & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, & ! Wet growth of hailstone & ZRDRYHG ! Conversion of hailstone into graupel ! -!$acc declare create(ZRVHENI_MR,ZRCHONI,ZRRHONG_MR,ZRVDEPS,ZRIAGGS,ZRIAUTS,ZRVDEPG,ZRCAUTR,ZRCACCR,ZRREVAV,ZRIMLTC_MR, & -!$acc& ZRCBERI,ZRHMLTR,ZRSMLTG,ZRCMLTSR,ZRRACCSS,ZRRACCSG,ZRSACCRG,ZRCRIMSS,ZRCRIMSG,ZRSRIMCG,ZRSRIMCG_MR, & -!$acc& ZRICFRRG, ZRRCFRIG, ZRICFRR,ZRCWETG,ZRIWETG,ZRRWETG,ZRSWETG,ZRCDRYG,ZRIDRYG,ZRRDRYG,ZRSDRYG,ZRWETGH, & -!$acc& ZRWETGH_MR,ZRGMLTR,ZRCWETH,ZRIWETH,ZRSWETH,ZRGWETH,ZRRWETH,ZRCDRYH,ZRIDRYH,ZRSDRYH,ZRRDRYH,ZRGDRYH,ZRDRYHG) -! !Output packed total mixing ratio change (for budgets only) -REAL, DIMENSION(COUNT(ODMICRO)) :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change +REAL, DIMENSION(:), allocatable :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change & ZTOT_RCHONI, & ! Homogeneous nucleation & ZTOT_RRHONG, & ! Spontaneous freezing mixing ratio change & ZTOT_RVDEPS, & ! Deposition on r_s, @@ -452,15 +437,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZTOT_RVHENI, & ! heterogeneous nucleation mix & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, & ! Wet growth of hailstone & ZTOT_RDRYHG ! Conversion of hailstone into graupel ! -!$acc declare create(ZTOT_RVHENI,ZTOT_RCHONI,ZTOT_RRHONG,ZTOT_RVDEPS,ZTOT_RIAGGS,ZTOT_RIAUTS,ZTOT_RVDEPG,ZTOT_RCAUTR, & -!$acc& ZTOT_RCACCR,ZTOT_RREVAV,ZTOT_RCRIMSS,ZTOT_RCRIMSG,ZTOT_RSRIMCG,ZTOT_RIMLTC,ZTOT_RCBERI,ZTOT_RHMLTR, & -!$acc& ZTOT_RSMLTG,ZTOT_RCMLTSR,ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG,ZTOT_RICFRRG, ZTOT_RRCFRIG, & -!$acc& ZTOT_RICFRR,ZTOT_RCWETG,ZTOT_RIWETG,ZTOT_RRWETG,ZTOT_RSWETG,ZTOT_RCDRYG,ZTOT_RIDRYG,ZTOT_RRDRYG, & -!$acc& ZTOT_RSDRYG,ZTOT_RWETGH,ZTOT_RGMLTR,ZTOT_RCWETH,ZTOT_RIWETH,ZTOT_RSWETH,ZTOT_RGWETH,ZTOT_RRWETH, & -!$acc& ZTOT_RCDRYH,ZTOT_RIDRYH,ZTOT_RSDRYH,ZTOT_RRDRYH,ZTOT_RGDRYH,ZTOT_RDRYHG) -! !For time- or mixing-ratio- splitting -REAL, DIMENSION(COUNT(ODMICRO)) :: Z0RVT, & ! Water vapor m.r. at the beginig of the current loop +REAL, DIMENSION(:), allocatable :: Z0RVT, & ! Water vapor m.r. at the beginig of the current loop & Z0RCT, & ! Cloud water m.r. at the beginig of the current loop & Z0RRT, & ! Rain water m.r. at the beginig of the current loop & Z0RIT, & ! Pristine ice m.r. at the beginig of the current loop @@ -470,12 +448,8 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: Z0RVT, & ! Water vapor m.r. at the begi & ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, & & ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH ! -!$acc declare create(Z0RVT,Z0RCT,Z0RRT,Z0RIT,Z0RST,Z0RGT,Z0RHT, & -!$acc& ZA_TH,ZA_RV,ZA_RC,ZA_RR,ZA_RI,ZA_RS,ZA_RG,ZA_RH, & -!$acc& ZB_TH,ZB_RV,ZB_RC,ZB_RR,ZB_RI,ZB_RS,ZB_RG,ZB_RH ) -! !To take into acount external tendencies inside the splitting -REAL, DIMENSION(COUNT(ODMICRO)) :: ZEXT_RV, & ! External tendencie for rv +REAL, DIMENSION(:), allocatable :: ZEXT_RV, & ! External tendencie for rv ZEXT_RC, & ! External tendencie for rc ZEXT_RR, & ! External tendencie for rr ZEXT_RI, & ! External tendencie for ri @@ -485,49 +459,33 @@ REAL, DIMENSION(COUNT(ODMICRO)) :: ZEXT_RV, & ! External tendencie for rv ZEXT_TH ! External tendencie for th LOGICAL :: GEXT_TEND ! -!acc declare create(GEXT_TEND) -!$acc declare create(ZEXT_RV,ZEXT_RC,ZEXT_RR,ZEXT_RI,ZEXT_RS,ZEXT_RG,ZEXT_RH,ZEXT_TH) -! -INTEGER, DIMENSION(COUNT(ODMICRO)) :: IITER ! Number of iterations done (with real tendencies computation) +INTEGER, DIMENSION(:), allocatable :: IITER ! Number of iterations done (with real tendencies computation) INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) -REAL, DIMENSION(COUNT(ODMICRO)) :: ZTIME, & ! Current integration time (starts with 0 and ends with PTSTEP) +REAL, DIMENSION(:), allocatable :: ZTIME, & ! Current integration time (starts with 0 and ends with PTSTEP) & ZMAXTIME, & ! Time on which we can apply the current tendencies & ZTIME_THRESHOLD, & ! Time to reach threshold & ZTIME_LASTCALL ! Integration time when last tendecies call has been done -LOGICAL, DIMENSION(COUNT(ODMICRO)) :: LLCOMPUTE ! Points where we must compute tendenceis +LOGICAL, DIMENSION(:), allocatable :: LLCOMPUTE ! Points where we must compute tendenceis INTEGER :: IKA, IKU, IKL, IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) LOGICAL :: GFEEDBACKT, GBU_ENABLE, GBUDGET_RC, GBUDGET_RR, GBUDGET_RI, GBUDGET_RS, GBUDGET_RG, & GBUDGET_RH, GBUDGET_RV, GBUDGET_TH, GWARM !Workaround of PGI bug with OpenACC (at least up to 18.10 version) LOGICAL :: GSOFT ! Must we really compute tendencies or only adjust them to new T variables -LOGICAL, DIMENSION(SIZE(ODMICRO,1),SIZE(ODMICRO,2),SIZE(ODMICRO,3)) :: GDNOTMICRO ! = .NOT.ODMICRO +LOGICAL, DIMENSION(:,:,:), allocatable :: GDNOTMICRO ! = .NOT.ODMICRO REAL :: ZTSTEP ! length of sub-timestep in case of time splitting REAL :: ZINV_TSTEP ! Inverse ov PTSTEP -REAL, DIMENSION(COUNT(ODMICRO), 6) :: ZRS_TEND -REAL, DIMENSION(COUNT(ODMICRO), 6) :: ZRG_TEND -REAL, DIMENSION(COUNT(ODMICRO), 8) :: ZRH_TEND +REAL, DIMENSION(:,:), allocatable :: ZRS_TEND +REAL, DIMENSION(:,:), allocatable :: ZRG_TEND +REAL, DIMENSION(:,:), allocatable :: ZRH_TEND ! !For total tendencies computation -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & +REAL, DIMENSION(:,:,:), allocatable :: & &ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS ! -! !$acc declare create(GSOFT) -!acc declare create(IITER,INB_ITER_MAX,ZTIME,ZMAXTIME,ZTIME_THRESHOLD,ZTIME_LASTCALL,LLCOMPUTE,GDNOTMICRO,ZTSTEP, & -!$acc declare create(IITER,ZTIME,ZMAXTIME,ZTIME_THRESHOLD,ZTIME_LASTCALL,LLCOMPUTE,GDNOTMICRO,ZTSTEP, & -!$acc & ZINV_TSTEP,ZRS_TEND,ZRG_TEND,ZRH_TEND,ZW_RVS,ZW_RCS,ZW_RRS,ZW_RIS,ZW_RSS,ZW_RGS,ZW_RHS,ZW_THS) -! -!acc declare copyin(JPVEXT,XUNDEF) !These are parameters -!$acc data present( OSEDIC, HSEDIM, HSUBG_AUCV_RC, OWARM, KKA, KKU, KKL, PTSTEP, KRR, & -!$acc & ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, PTHT, PRVT, & +!$acc data present( ODMICRO, PEXN, PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, PTHT, PRVT, & !$acc & PRCT, PRRT, PRIT, PRST, PRGT, PSIGS, PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & !$acc & PINPRC, PINDEP, PINPRR, PEVAP3D, PINPRS, PINPRG, PRAINFR, & -!$acc & PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR ) & - -!$acc & copyin( XCI, XCL, XCPD, XCPV, XLSTT, XLVTT, XTT, & -!$acc & XRTMIN, & -!$acc & CSUBG_PR_PDF, CSUBG_RC_RR_ACCR, CSUBG_RR_EVAP, LDEPOSC, LFEEDBACKT, LSEDIM_AFTER, & -!$acc & NMAXITER, XMRSTEP, XTSTEP_TS, XVDEPOSC, & -!$acc & LBU_ENABLE, LBUDGET_RC, LBUDGET_RR, LBUDGET_RI, LBUDGET_RS, LBUDGET_RG, LBUDGET_RH, LBUDGET_RV, LBUDGET_TH ) +!$acc & PSEA, PTOWN, PRHT, PRHS, PINPRH, PFPR ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -562,9 +520,224 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PINDEP,"RAIN_ICE_RED beg:PINDEP") IF (PRESENT(PRHS)) CALL MPPDB_CHECK(PRHS,"RAIN_ICE_RED beg:PRHS") END IF -! -!------------------------------------------------------------------------------- -! + +!$acc kernels +imicro = count(odmicro) +!$acc end kernels + +allocate( i1(imicro ) ) +allocate( i2(imicro ) ) +allocate( i3(imicro ) ) + +allocate( gwork(imicro ) ) + +allocate( zw(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) +allocate( zt(size( pexnref, 1 ), size( pexnref, 2 ), size( pexnref, 3 ) ) ) + +allocate( zz_rvheni_mr(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zz_rvheni (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zz_lvfact (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zz_lsfact (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zlsfact3d (size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) + +allocate( zinpri(size( ptht, 1 ), size( ptht, 2 ) ) ) + +allocate( zrvt (imicro ) ) +allocate( zrct (imicro ) ) +allocate( zrrt (imicro ) ) +allocate( zrit (imicro ) ) +allocate( zrst (imicro ) ) +allocate( zrgt (imicro ) ) +allocate( zrht (imicro ) ) +allocate( zcit (imicro ) ) +allocate( ztht (imicro ) ) +allocate( zrhodref (imicro ) ) +allocate( zzt (imicro ) ) +allocate( zpres (imicro ) ) +allocate( zexn (imicro ) ) +allocate( zlsfact (imicro ) ) +allocate( zlvfact (imicro ) ) +allocate( zsigma_rc(imicro ) ) +allocate( zcf (imicro ) ) +allocate( zhlc_hcf (imicro ) ) +allocate( zhlc_lcf (imicro ) ) +allocate( zhlc_hrc (imicro ) ) +allocate( zhlc_lrc (imicro ) ) + +allocate( zrvheni_mr (imicro ) ) +allocate( zrchoni (imicro ) ) +allocate( zrrhong_mr (imicro ) ) +allocate( zrvdeps (imicro ) ) +allocate( zriaggs (imicro ) ) +allocate( zriauts (imicro ) ) +allocate( zrvdepg (imicro ) ) +allocate( zrcautr (imicro ) ) +allocate( zrcaccr (imicro ) ) +allocate( zrrevav (imicro ) ) +allocate( zrimltc_mr (imicro ) ) +allocate( zrcberi (imicro ) ) +allocate( zrhmltr (imicro ) ) +allocate( zrsmltg (imicro ) ) +allocate( zrcmltsr (imicro ) ) +allocate( zrraccss (imicro ) ) +allocate( zrraccsg (imicro ) ) +allocate( zrsaccrg (imicro ) ) +allocate( zrcrimss (imicro ) ) +allocate( zrcrimsg (imicro ) ) +allocate( zrsrimcg (imicro ) ) +allocate( zrsrimcg_mr(imicro ) ) +allocate( zricfrrg (imicro ) ) +allocate( zrrcfrig (imicro ) ) +allocate( zricfrr (imicro ) ) +allocate( zrcwetg (imicro ) ) +allocate( zriwetg (imicro ) ) +allocate( zrrwetg (imicro ) ) +allocate( zrswetg (imicro ) ) +allocate( zrcdryg (imicro ) ) +allocate( zridryg (imicro ) ) +allocate( zrrdryg (imicro ) ) +allocate( zrsdryg (imicro ) ) +allocate( zrwetgh (imicro ) ) +allocate( zrwetgh_mr (imicro ) ) +allocate( zrgmltr (imicro ) ) +allocate( zrcweth (imicro ) ) +allocate( zriweth (imicro ) ) +allocate( zrsweth (imicro ) ) +allocate( zrgweth (imicro ) ) +allocate( zrrweth (imicro ) ) +allocate( zrcdryh (imicro ) ) +allocate( zridryh (imicro ) ) +allocate( zrsdryh (imicro ) ) +allocate( zrrdryh (imicro ) ) +allocate( zrgdryh (imicro ) ) +allocate( zrdryhg (imicro ) ) + +allocate( ztot_rvheni (imicro ) ) +allocate( ztot_rchoni (imicro ) ) +allocate( ztot_rrhong (imicro ) ) +allocate( ztot_rvdeps (imicro ) ) +allocate( ztot_riaggs (imicro ) ) +allocate( ztot_riauts (imicro ) ) +allocate( ztot_rvdepg (imicro ) ) +allocate( ztot_rcautr (imicro ) ) +allocate( ztot_rcaccr (imicro ) ) +allocate( ztot_rrevav (imicro ) ) +allocate( ztot_rcrimss(imicro ) ) +allocate( ztot_rcrimsg(imicro ) ) +allocate( ztot_rsrimcg(imicro ) ) +allocate( ztot_rimltc (imicro ) ) +allocate( ztot_rcberi (imicro ) ) +allocate( ztot_rhmltr (imicro ) ) +allocate( ztot_rsmltg (imicro ) ) +allocate( ztot_rcmltsr(imicro ) ) +allocate( ztot_rraccss(imicro ) ) +allocate( ztot_rraccsg(imicro ) ) +allocate( ztot_rsaccrg(imicro ) ) +allocate( ztot_ricfrrg(imicro ) ) +allocate( ztot_rrcfrig(imicro ) ) +allocate( ztot_ricfrr (imicro ) ) +allocate( ztot_rcwetg (imicro ) ) +allocate( ztot_riwetg (imicro ) ) +allocate( ztot_rrwetg (imicro ) ) +allocate( ztot_rswetg (imicro ) ) +allocate( ztot_rcdryg (imicro ) ) +allocate( ztot_ridryg (imicro ) ) +allocate( ztot_rrdryg (imicro ) ) +allocate( ztot_rsdryg (imicro ) ) +allocate( ztot_rwetgh (imicro ) ) +allocate( ztot_rgmltr (imicro ) ) +allocate( ztot_rcweth (imicro ) ) +allocate( ztot_riweth (imicro ) ) +allocate( ztot_rsweth (imicro ) ) +allocate( ztot_rgweth (imicro ) ) +allocate( ztot_rrweth (imicro ) ) +allocate( ztot_rcdryh (imicro ) ) +allocate( ztot_rdryhg (imicro ) ) +allocate( ztot_ridryh (imicro ) ) +allocate( ztot_rsdryh (imicro ) ) +allocate( ztot_rrdryh (imicro ) ) +allocate( ztot_rgdryh (imicro ) ) + +allocate( z0rvt(imicro ) ) +allocate( z0rct(imicro ) ) +allocate( z0rrt(imicro ) ) +allocate( z0rit(imicro ) ) +allocate( z0rst(imicro ) ) +allocate( z0rgt(imicro ) ) +allocate( z0rht(imicro ) ) +allocate( za_th(imicro ) ) +allocate( za_rv(imicro ) ) +allocate( za_rc(imicro ) ) +allocate( za_rr(imicro ) ) +allocate( za_ri(imicro ) ) +allocate( za_rs(imicro ) ) +allocate( za_rg(imicro ) ) +allocate( za_rh(imicro ) ) +allocate( zb_th(imicro ) ) +allocate( zb_rv(imicro ) ) +allocate( zb_rc(imicro ) ) +allocate( zb_rr(imicro ) ) +allocate( zb_ri(imicro ) ) +allocate( zb_rs(imicro ) ) +allocate( zb_rg(imicro ) ) +allocate( zb_rh(imicro ) ) + +allocate( zext_rv(imicro ) ) +allocate( zext_rc(imicro ) ) +allocate( zext_rr(imicro ) ) +allocate( zext_ri(imicro ) ) +allocate( zext_rs(imicro ) ) +allocate( zext_rg(imicro ) ) +allocate( zext_rh(imicro ) ) +allocate( zext_th(imicro ) ) + +allocate( iiter(imicro ) ) + +allocate( ztime(imicro ) ) +allocate( zmaxtime(imicro ) ) +allocate( ztime_threshold(imicro ) ) +allocate( ztime_lastcall(imicro ) ) + +allocate( llcompute(imicro ) ) + +allocate( gdnotmicro(size( odmicro, 1 ), size( odmicro, 2 ), size( odmicro, 3 ) ) ) + +allocate( zrs_tend(imicro, 6 ) ) +allocate( zrg_tend(imicro, 6 ) ) +allocate( zrh_tend(imicro, 8 ) ) + +allocate( zw_rvs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_rcs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_rrs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_ris(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_rss(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_rgs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_rhs(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zw_ths(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) + +!$acc data create( I1, I2, I3, & +!$acc & gwork, ZW, ZT, ZZ_RVHENI_MR, ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, ZLSFACT3D, ZINPRI, & +!$acc & ZRVT, ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT, ZCIT, ZTHT, ZRHODREF, ZZT, ZPRES, ZEXN, & +!$acc & ZLSFACT, ZLVFACT, ZSIGMA_RC, ZCF, ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, & +!$acc & ZRVHENI_MR, ZRCHONI, ZRRHONG_MR, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, ZRCAUTR, ZRCACCR, ZRREVAV, ZRIMLTC_MR, & +!$acc & ZRCBERI, ZRHMLTR, ZRSMLTG, ZRCMLTSR, ZRRACCSS, ZRRACCSG, ZRSACCRG, & +!$acc & ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR, & +!$acc & ZRICFRRG, ZRRCFRIG, ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, & +!$acc & ZRWETGH, ZRWETGH_MR, ZRGMLTR, ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & +!$acc & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, & +!$acc & ZTOT_RVHENI, ZTOT_RCHONI, ZTOT_RRHONG, ZTOT_RVDEPS, ZTOT_RIAGGS, ZTOT_RIAUTS, ZTOT_RVDEPG, ZTOT_RCAUTR, & +!$acc & ZTOT_RCACCR, ZTOT_RREVAV, ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, ZTOT_RIMLTC, ZTOT_RCBERI, ZTOT_RHMLTR, & +!$acc & ZTOT_RSMLTG, ZTOT_RCMLTSR, ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG, ZTOT_RICFRRG, ZTOT_RRCFRIG, & +!$acc & ZTOT_RICFRR, ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG, & +!$acc & ZTOT_RSDRYG, ZTOT_RWETGH, ZTOT_RGMLTR, ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH, & +!$acc & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, ZTOT_RDRYHG, & +!$acc & Z0RVT, Z0RCT, Z0RRT, Z0RIT, Z0RST, Z0RGT, Z0RHT, & +!$acc & ZA_TH, ZA_RV, ZA_RC, ZA_RR, ZA_RI, ZA_RS, ZA_RG, ZA_RH, & +!$acc & ZB_TH, ZB_RV, ZB_RC, ZB_RR, ZB_RI, ZB_RS, ZB_RG, ZB_RH, & +!$acc & ZEXT_RV, ZEXT_RC, ZEXT_RR, ZEXT_RI, ZEXT_RS, ZEXT_RG, ZEXT_RH, ZEXT_TH, & +!$acc & IITER, ZTIME, ZMAXTIME, ZTIME_THRESHOLD, ZTIME_LASTCALL, LLCOMPUTE, GDNOTMICRO, & +!$acc & ZRS_TEND, ZRG_TEND, ZRH_TEND, ZW_RVS, ZW_RCS, ZW_RRS, ZW_RIS, ZW_RSS, ZW_RGS, ZW_RHS, ZW_THS ) + !------------------------------------------------------------------------------- !Workaround of PGI bug with OpenACC (at least up to 18.10 version) GFEEDBACKT = LFEEDBACKT @@ -2009,6 +2182,8 @@ END IF !$acc end data +!$acc end data + CONTAINS ! SUBROUTINE CORRECT_NEGATIVITIES(KRR, PRV, PRC, PRR, & diff --git a/src/MNH/rain_ice_sedimentation_split.f90 b/src/MNH/rain_ice_sedimentation_split.f90 index f9d4125cd..f926782c1 100644 --- a/src/MNH/rain_ice_sedimentation_split.f90 +++ b/src/MNH/rain_ice_sedimentation_split.f90 @@ -131,16 +131,6 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPRCS,ZPRRS,ZPRSS,ZPRGS,ZPRHS ! Mixi REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZW ! Work array REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWSED ! sedimentation fluxes ! -!$acc declare device_resident(IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, & -!$acc & GDEP, GSEDIMR, GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH, & -!PW:BUG: do not uncomment to get correct results !$acc & ZTMP1, ZTMP2, & -!PW:BUG: do not uncomment to get correct results !$acc & ZRHODREFLOC, ZRSLOC, ZRTLOC, & -!PW:BUG: do not uncomment to get correct results !$acc & ZCC, ZFSEDC1D, ZWLBDC, ZCONC, ZRAY1D, ZWLBDA, ZZT, ZPRES, & -!$acc & ZRTMIN, ZCONC_TMP, ZCONC3D, & -!$acc & ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D, & -!$acc & ZRAY, ZLBC, ZFSEDC, & -!$acc & ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW, ZWSED) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -154,9 +144,9 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWSED ! sedimentation fluxes ! ! OUT variables ! -!$acc & PINPRR, PINPRS, PINPRG, PINPRR3D, PINPRH, PFPR ) & +!$acc & PINPRR, PINPRS, PINPRG, PINPRR3D, PINPRH, PFPR ) -!$acc & copyin( XFSEDC, XLBC, XLBEXC, XRTMIN ) +! !$acc & copyin( XFSEDC, XLBC, XLBEXC, XRTMIN ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -215,7 +205,14 @@ ALLOCATE( ZPRGS (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) ) ALLOCATE( ZPRHS (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) ) ALLOCATE( ZW (SIZE(PRCS,1),SIZE(PRCS,2),SIZE(PRCS,3)) ) ALLOCATE( ZWSED (SIZE(PRCS,1),SIZE(PRCS,2),0:SIZE(PRCS,3)+1) ) -! + +!$acc data create( IC1, IC2, IC3, IR1, IR2, IR3, IS1, IS2, IS3, II1, II2, II3, IG1, IG2, IG3, IH1, IH2, IH3, & +!$acc & GDEP, GSEDIMR, GSEDIMC, GSEDIMI, GSEDIMS, GSEDIMG, GSEDIMH, & +!$acc & ZRTMIN, ZCONC_TMP, & +!$acc & ZOMPSEA, ZTMP1_2D, ZTMP2_2D, ZTMP3_2D, ZTMP4_2D, ZCONC3D, & +!$acc & ZRAY, ZLBC, ZFSEDC, & +!$acc & ZPRCS, ZPRRS, ZPRSS, ZPRGS, ZPRHS, ZW, ZWSED ) + IF ( PRESENT( PFPR ) ) THEN GPRESENT_PFPR = .TRUE. ELSE @@ -689,6 +686,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_SEDIMENTATION_SPLIT END MODULE MODE_RAIN_ICE_SEDIMENTATION_SPLIT diff --git a/src/MNH/rain_ice_slow.f90 b/src/MNH/rain_ice_slow.f90 index c3869a900..7b325a112 100644 --- a/src/MNH/rain_ice_slow.f90 +++ b/src/MNH/rain_ice_slow.f90 @@ -80,8 +80,6 @@ LOGICAL, DIMENSION(:), ALLOCATABLE :: GWORK REAL, DIMENSION(:), ALLOCATABLE :: ZCRIAUTI ! Snow-to-ice autoconversion thres. REAL, DIMENSION(:), ALLOCATABLE :: ZZW ! Work array ! -!$acc declare device_resident(GWORK, ZZW, ZCRIAUTI) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -128,6 +126,7 @@ END IF ALLOCATE( GWORK (size(PRHODREF)) ) ALLOCATE( ZZW (size(PRHODREF)) ) ALLOCATE( ZCRIAUTI(size(PRHODREF)) ) +!$acc data create( gwork, zzw, zcriauti ) ! !* 3.2 compute the homogeneous nucleation source: RCHONI ! @@ -391,6 +390,8 @@ END IF !$acc end data +!$acc end data + END SUBROUTINE RAIN_ICE_SLOW END MODULE MODE_RAIN_ICE_SLOW diff --git a/src/MNH/rain_ice_warm.f90 b/src/MNH/rain_ice_warm.f90 index e8e890b01..6c5a6ad90 100644 --- a/src/MNH/rain_ice_warm.f90 +++ b/src/MNH/rain_ice_warm.f90 @@ -90,8 +90,6 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZZW2 ! Work array REAL, DIMENSION(:), ALLOCATABLE :: ZZW3 ! Work array REAL, DIMENSION(:), ALLOCATABLE :: ZZW4 ! Work array ! -!$acc declare device_resident(GWORK, ZZW, ZZW2, ZZW3, ZZW4) -! !------------------------------------------------------------------------------- ! ! IN variables @@ -151,6 +149,8 @@ ALLOCATE( ZZW (size(PRHODREF)) ) ALLOCATE( ZZW2 (size(PRHODREF)) ) ALLOCATE( ZZW3 (size(PRHODREF)) ) ALLOCATE( ZZW4 (size(PRHODREF)) ) + +!$acc data create( gwork, zzw, zzw2, zzw3, zzw4 ) ! !* 4.2 compute the autoconversion of r_c for r_r production: RCAUTR ! @@ -389,6 +389,8 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PEVAP3D,"RAIN_ICE_WARM end:PEVAP3D") END IF +!$acc end data + !$acc end data END SUBROUTINE RAIN_ICE_WARM diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 5a9111c4f..61ff8a22c 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -440,9 +440,6 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRAINFR ! Rain fraction REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PSEA ! Land Sea mask REAL, DIMENSION(:,:), OPTIONAL, INTENT(IN) :: PTOWN ! Town fraction ! -! Variables from modules -! !$acc declare copyin(CSEDIM) -! !* 0.2 Declarations of local variables : ! INTEGER :: JRR,JSV ! Loop index for the moist and scalar variables @@ -457,9 +454,6 @@ INTEGER :: IKL INTEGER :: IINFO_ll ! return code of parallel routine INTEGER :: JI,JJ,JK,JL ! -!$acc declare create(IKA,IKU,IKL) -! -! REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDZZ REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZT,ZEXN,ZLV,ZLS,ZCPH REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOR @@ -487,15 +481,11 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZINPRI REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTHSSTEP REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRSSTEP ! -!$acc declare create(ZDZZ,ZEXN,ZLV,ZLS,ZCPH,ZZZ,ZSVT,ZSVS) create(ZT) create(ZCOR,ZRSMIN) & -!$acc & create(ZTHSSTEP,ZRSSTEP,LLMICRO) -! !------------------------------------------------------------------------------ ! ! IN variables ! -!$acc data present( KRR, OSEDIC, HSUBG_AUCV, PTSTEP, OWARM, & -!$acc & PRHODJ, PZZ, PRHODREF, PEXNREF, PPABST, PTHT, PSIGS, PSIGQSAT, & +!$acc data present( PRHODJ, PZZ, PRHODREF, PEXNREF, PPABST, PTHT, PSIGS, PSIGQSAT, & !$acc & PMFCONV, PTHM, PPABSM, PRCM, PW_ACT, PDTHRAD, & !$acc & PCF_MF, PRC_MF, PRI_MF, & !$acc & PSOLORG, PMI, PSEA, PTOWN, & @@ -508,9 +498,9 @@ REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZRSSTEP ! ! OUT variables ! -!$acc & PSRCS, PRAINFR ) & +!$acc & PSRCS, PRAINFR ) -!$acc & copyin( XRTMIN ) +! !$acc & copyin( XRTMIN ) !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -572,19 +562,15 @@ allocate ( ZINPRI ( SIZE(PZZ,1), SIZE(PZZ,2) ) ) allocate ( ZTHSSTEP ( SIZE(PTHS,1), SIZE(PTHS,2), SIZE(PTHS,3) ) ) allocate ( ZRSSTEP ( SIZE(PRS,1), SIZE(PRS,2), SIZE(PRS,3), SIZE(PRS,4) ) ) +!$acc data create(LLMICRO,ZDZZ,ZT,ZEXN,ZLV,ZLS,ZCPH,ZCOR,ZZZ,ZINPRI,ZTHSSTEP,ZRSSTEP) + CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) -!$acc kernels IKA=1 -!$acc end kernels IKB=1+JPVEXT IKE=SIZE(PZZ,3) - JPVEXT IKU=SIZE(PZZ,3) -!$acc update device(IKU) ! -!$acc kernels IKL = 1 -!$acc end kernels -!$acc update host(IKL) ! GWEST = LWEST_ll() GEAST = LEAST_ll() @@ -608,11 +594,13 @@ END IF IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN ALLOCATE(ZSVT(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1)) ALLOCATE(ZSVS(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3),ISVEND - ISVBEG + 1)) +!$acc enter data create(ZSVT,ZSVS) ZSVT(:,:,:,:) = PSVT(:,:,:,ISVBEG:ISVEND) ZSVS(:,:,:,:) = PSVS(:,:,:,ISVBEG:ISVEND) END IF IF (HCLOUD(1:3)=='ICE' .AND. LRED) THEN ALLOCATE(ZRSMIN(SIZE(XRTMIN))) +!$acc enter data create(ZRSMIN) !$acc kernels ZRSMIN(:) = XRTMIN(:) / PTSTEP !$acc end kernels @@ -1219,7 +1207,7 @@ CALL PRINT_MSG(NVERB_FATAL,'GEN','RESOLVED_CLOUD','C2R2//KHKO not yet implemente PRG=ZRSSTEP(:,:,:,6) ) ENDIF IF (LRED) THEN -!$acc kernels present(LLMICRO,PRT,XRTMIN,ZRSMIN) +!$acc kernels LLMICRO(:,:,:)=PRT(:,:,:,2)>XRTMIN(2) .OR. & PRT(:,:,:,3)>XRTMIN(3) .OR. & PRT(:,:,:,4)>XRTMIN(4) .OR. & @@ -1500,8 +1488,7 @@ IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') DO JSV = 1,SIZE(ZSVT,4) PSVT(:,:,:,JSV+ISVBEG-1) = ZSVT(:,:,:,JSV) ENDDO - DEALLOCATE(ZSVS) - DEALLOCATE(ZSVT) +!$acc exit data delete(ZSVT,ZSVS) ENDIF ! IF (MPPDB_INITIALIZED) THEN @@ -1530,6 +1517,10 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRAINFR,"RESOLVED_CLOUD end:PRAINFR") END IF +!$acc exit data delete(ZRSMIN) + +!$acc end data + !$acc end data !------------------------------------------------------------------------------- diff --git a/src/MNH/rotate_wind.f90 b/src/MNH/rotate_wind.f90 index 261b761ce..6146dc637 100644 --- a/src/MNH/rotate_wind.f90 +++ b/src/MNH/rotate_wind.f90 @@ -143,7 +143,6 @@ REAL, DIMENSION(:,:), allocatable :: ZCOEFF,ZCOEFM, & ! interpolation we ZUINT,ZVINT,ZWINT, & ! intermediate values of the cartesian components after x interp. ZUFIN,ZVFIN,ZWFIN, & ! final values of the cartesian components after the 2 interp. ZWGROUND ! vertical velocity at the surface -!$acc declare create( ILOC, JLOC, ZCOEFF, ZCOEFM, ZUINT, ZVINT, ZWINT, ZUFIN, ZVFIN, ZWFIN, ZWGROUND ) INTEGER :: IIB,IIE,IJB,IJE,IKB ! index values for the Beginning or the End of the physical domain in x,y and z directions INTEGER :: IIU,IJU ! arrays' sizes for i and j indices INTEGER :: JI,JJ @@ -179,6 +178,8 @@ allocate( zufin (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) allocate( zvfin (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) allocate( zwfin (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) allocate( zwground(size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) + +!$acc data create( iloc, jloc, zcoeff, zcoefm, zuint, zvint, zwint, zufin, zvfin, zwfin, zwground ) ! !* 1. PRELIMINARIES ! ------------- @@ -271,7 +272,9 @@ if ( mppdb_initialized ) then end if !$acc end data -! + +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE ROTATE_WIND diff --git a/src/MNH/slow_terms.f90 b/src/MNH/slow_terms.f90 index 5f1ce23c2..4874d71b7 100644 --- a/src/MNH/slow_terms.f90 +++ b/src/MNH/slow_terms.f90 @@ -216,15 +216,13 @@ LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: G3D ! INTEGER :: JI,JJ,IC,JL ! loop control for packed array -!$acc declare create( ZT, ZW, ZW1, ZW2, ZW3, ZEXNT, ZDZZ, G3D ) - !------------------------------------------------------------------------------- !$acc data present( PZZ, PRHODJ, PRHODREF, PCLDFR, PTHT, PRVT, PRCT, PRRT, & -!$acc & PPABST, PTHS, PRVS, PRCS, PRRS, PINPRR, PINPRR3D, PEVAP3D ) & +!$acc & PPABST, PTHS, PRVS, PRCS, PRRS, PINPRR, PINPRR3D, PEVAP3D ) -!$acc & copyin( XC1RC, XC2RC, XC1RE, XC2RE, XCEXRA, XCEXRE, XCEXRS, XCEXVT, XCRA, XCRS, XDIVA, XTHCO, & -!$acc & XALPW, XBETAW, XGAMW, XCL, XCPD, XCPV, XLVTT, XMD, XMV, XP00, XRD, XRHOLW, XRV, XTT ) +! !$acc & copyin( XC1RC, XC2RC, XC1RE, XC2RE, XCEXRA, XCEXRE, XCEXRS, XCEXVT, XCRA, XCRS, XDIVA, XTHCO, & +! !$acc & XALPW, XBETAW, XGAMW, XCL, XCPD, XCPV, XLVTT, XMD, XMV, XP00, XRD, XRHOLW, XRV, XTT ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -255,6 +253,8 @@ allocate( zw3 ( size(pzz,1), size(pzz,2), size(pzz,3) ) ) allocate( zexnt( size(pzz,1), size(pzz,2), size(pzz,3) ) ) allocate( zdzz ( size(pzz,1), size(pzz,2), size(pzz,3) ) ) allocate( g3d ( size(prhodj,1), size(prhodj,2), size(prhodj,3) ) ) + +!$acc data create( zt, zw, zw1, zw2, zw3, zexnt, zdzz, g3d ) ! !* 1. COMPUTE THE LOOP BOUNDS AND EXNER FUNCTION ! ------------------------------------------ @@ -576,4 +576,6 @@ END IF !$acc end data -END SUBROUTINE SLOW_TERMS +!$acc end data + +END SUBROUTINE SLOW_TERMS diff --git a/src/MNH/tm06_h.f90 b/src/MNH/tm06_h.f90 index 561088d8d..a0522e45a 100644 --- a/src/MNH/tm06_h.f90 +++ b/src/MNH/tm06_h.f90 @@ -99,7 +99,6 @@ LOGICAL, DIMENSION(:,:), allocatable :: GWORK REAL :: ZGROWTH ! maximum BL growth rate REAL, DIMENSION(:,:), allocatable :: ZFLXZMIN ! minimum of temperature flux REAL, DIMENSION(:,:), allocatable :: ZBL_DEPTH ! BL depth at previous time-step -!$acc declare create(ZFLXZMIN,ZBL_DEPTH,GWORK) !---------------------------------------------------------------------------- !$acc data present( PZZ, PFLXZ, PBL_DEPTH ) @@ -120,6 +119,8 @@ allocate( ZFLXZMIN (size( pzz, 1 ), size( pzz, 2 ) ) ) allocate( ZBL_DEPTH(size( pzz, 1 ), size( pzz, 2 ) ) ) allocate( GWORK (size( pzz, 1 ), size( pzz, 2 ) ) ) +!$acc data create( zflxzmin, zbl_depth, gwork ) + !* mixed boundary layer cannot grow more rapidly than 1800m/h !$acc kernels ZGROWTH = 2.0 ! (m/s) @@ -155,5 +156,7 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- END SUBROUTINE TM06_H diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90 index 3af0031fe..acc77444d 100644 --- a/src/MNH/tridiag_thermo.f90 +++ b/src/MNH/tridiag_thermo.f90 @@ -191,11 +191,9 @@ INTEGER :: IKB,IKE ! inner vertical limits INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain ! -!$acc declare create(ZRHODJ_DFDDTDZ_O_DZ2,ZA,ZB,ZC,ZY,ZGAM,ZBET,ZMZM_RHODJ) ! #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE -!$acc declare create(ZTMP1_DEVICE) #endif ! --------------------------------------------------------------------------- @@ -222,6 +220,8 @@ allocate( zbet (size( pvarm, 1 ), size( pvarm, 2 ) ) ) #ifdef MNH_OPENACC allocate( ztmp1_device(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) #endif + +!$acc data create( zrhodj_dfddtdz_o_dz2, zmzm_rhodj, za, zb, zc, zy, zgam, zbet, ztmp1_device ) ! !* 1. Preliminaries ! ------------- @@ -385,6 +385,8 @@ end if !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE TRIDIAG_THERMO diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index 3a39fea0a..1e90ee673 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -402,22 +402,17 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:) ::& ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,& ! 3rd order moments ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,& ! opposite of verticale derivate of 3rd order moments ZTHLM ! initial potential temp. -!$acc declare create(ZCP,ZEXN,ZT,ZLOCPEXNM,ZLEPS,ZTRH, & -!$acc & ZAMOIST,ZATHETA,ZCOEF_DISS,ZFRAC_ICE, & -!$acc & ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR, & -!$acc & ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,ZTHLM ) ! REAL, ALLOCATABLE, DIMENSION(:,:,:,:) :: & - ZRM ! initial mixing ratio -!$acc declare create(ZRM) + ZRM ! initial mixing ratio REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTAU11M,ZTAU12M, & ZTAU22M,ZTAU33M, & ! tangential surface fluxes in the axes following the orography ZUSLOPE,ZVSLOPE, & - ! wind components at the first mass level parallel - ! to the orography + ! wind components at the first mass level parallel + ! to the orography ZCDUEFF, & - ! - Cd*||u|| where ||u|| is the module of the wind tangential to + ! - Cd*||u|| where ||u|| is the module of the wind tangential to ! orography (ZUSLOPE,ZVSLOPE) at the surface. ZUSTAR, ZLMO, & ZRVM, ZSFRV @@ -425,12 +420,10 @@ REAL, ALLOCATABLE, DIMENSION(:,:) :: ZTAU11M,ZTAU12M, & ! ! Virtual Potential Temp. used ! in the Deardorff mixing length computation -!$acc declare create(ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M,ZUSLOPE,ZVSLOPE,ZCDUEFF,ZUSTAR,ZLMO,ZRVM,ZSFRV) -REAL, DIMENSION(:,:,:), ALLOCATABLE :: & +REAL, DIMENSION(:,:,:), ALLOCATABLE :: & ZLVOCPEXNM,ZLSOCPEXNM, & ! Lv/Cp/EXNREF and Ls/Cp/EXNREF at t-1 ZATHETA_ICE,ZAMOIST_ICE ! coefficients for s = f (Thetal,Rnp) ! -!$acc declare create(ZLVOCPEXNM,ZLSOCPEXNM,ZATHETA_ICE,ZAMOIST_ICE) REAL :: ZEXPL ! 1-PIMPL deg of expl. REAL :: ZRVORD ! RV/RD ! @@ -447,12 +440,10 @@ REAL :: ZALPHA ! proportionnality constant between Dz/2 and REAL :: ZTIME1, ZTIME2 REAL, DIMENSION(:,:,:), allocatable :: ZTT,ZEXNE,ZLV,ZCPH REAL, DIMENSION(:,:,:), allocatable :: ZSHEAR, ZDUDZ, ZDVDZ -!$acc declare create(ZTT,ZEXNE,ZLV,ZCPH,ZSHEAR, ZDUDZ, ZDVDZ) TYPE(TFIELDDATA) :: TZFIELD ! #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE) #endif ! !------------------------------------------------------------------------------------------ @@ -584,6 +575,17 @@ IF (HTURBDIM=="1DIM") then end if #endif +!$acc data create( zcp, zexn, zt, zlocpexnm, zleps, ztrh, & +!$acc & zatheta, zamoist, zcoef_diss, zfrac_ice, & +!$acc & zmwth, zmwr, zmth2, zmr2, zmthr, & +!$acc & zfwth, zfwr, zfth2, zfr2, zfthr, zthlm, & +!$acc & zrm, & +!$acc & ztau11m, ztau12m, ztau22m, ztau33m, & +!$acc & zuslope, zvslope, zcdueff, zlmo, & +!$acc & zustar, zrvm, zsfrv, & +!$acc & ztt, zexne, zlv, zcph, zshear, zdudz, zdvdz, & +!$acc & ztmp1_device, ztmp2_device, ztmp3_device ) + !------------------------------------------------------------------------------------------ ! !* 1.PRELIMINARIES @@ -666,7 +668,10 @@ IF (KRRL >=1) THEN ALLOCATE(ZLSOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) ALLOCATE(ZAMOIST_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) ALLOCATE(ZATHETA_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3))) -! + +!$acc enter data create( zlvocpexnm, zlsocpexnm ) +!$acc data create( zamoist_ice, zatheta_ice ) + CALL COMPUTE_FUNCTION_THERMO(XALPW,XBETAW,XGAMW,XLVTT,XCL,ZT,ZEXN,ZCP, & ZLVOCPEXNM,ZAMOIST,ZATHETA) CALL COMPUTE_FUNCTION_THERMO(XALPI,XBETAI,XGAMI,XLSTT,XCI,ZT,ZEXN,ZCP, & @@ -684,6 +689,8 @@ IF (KRRL >=1) THEN ZATHETA(:,:,:) = (1.0-ZFRAC_ICE(:,:,:))*ZATHETA(:,:,:) & +ZFRAC_ICE(:,:,:) *ZATHETA_ICE(:,:,:) !$acc end kernels + +!$acc end data DEALLOCATE(ZAMOIST_ICE) DEALLOCATE(ZATHETA_ICE) ELSE @@ -1226,6 +1233,7 @@ IF ( KRRL >= 1 ) THEN !$acc end kernels !$acc update self(PRT(:,:,:,1)) ! +!$acc exit data delete( zlvocpexnm, zlsocpexnm ) DEALLOCATE(ZLVOCPEXNM) DEALLOCATE(ZLSOCPEXNM) ELSE @@ -1418,6 +1426,8 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! CONTAINS @@ -1559,7 +1569,6 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA REAL :: ZEPS ! XMV / XMD real, dimension(:,:,:), allocatable :: zrvsat real, dimension(:,:,:), allocatable :: zdrvsatdt -!$acc declare create(ZRVSAT,ZDRVSATDT) ! !------------------------------------------------------------------------------- @@ -1575,6 +1584,7 @@ real, dimension(:,:,:), allocatable :: zdrvsatdt allocate( zrvsat ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) +!$acc data create( zrvsat, zdrvsatdt ) ZEPS = XMV / XMD ! @@ -1641,6 +1651,8 @@ real, dimension(:,:,:), allocatable :: zdrvsatdt !$acc end data +!$acc end data + END SUBROUTINE COMPUTE_FUNCTION_THERMO ! ! @@ -1891,7 +1903,6 @@ REAL :: ZALPHA ! proportionnality constant between Dz/2 and REAL :: ZD ! distance to the surface #ifdef MNH_OPENACC real, dimension(:,:,:), allocatable :: ztmp1_device, ztmp2_device -!$acc declare create(ztmp1_device, ztmp2_device) #endif ! !------------------------------------------------------------------------------- @@ -1911,6 +1922,8 @@ allocate( ztmp1_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) ) allocate( ztmp2_device( size( pdxx, 1 ), size( pdxx, 2 ), size( pdxx, 3 ) ) ) #endif +!$acc data create( ztmp1_device, ztmp2_device ) + !$acc kernels DO JK = KKTB,KKTE ! 1D turbulence scheme PLM(:,:,JK) = PZZ(:,:,JK+KKL) - PZZ(:,:,JK) @@ -1985,6 +1998,8 @@ end if !$acc end data +!$acc end data + END SUBROUTINE DELT @@ -2071,11 +2086,9 @@ REAL, DIMENSION(:,:,:), ALLOCATABLE :: & ZDTHLDZ,ZDRTDZ, &!dtheta_l/dz, drt_dz used for computing the stablity ! ! criterion ZETHETA,ZEMOIST !coef ETHETA and EMOIST -!$acc declare create(ZWORK2D,ZDTHLDZ,ZDRTDZ,ZETHETA,ZEMOIST) ! #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) #endif !---------------------------------------------------------------------------- @@ -2108,6 +2121,10 @@ allocate( ZEMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) allocate( ZTMP1_DEVICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) allocate( ZTMP2_DEVICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) #endif + +!$acc data create( zwork2d, zdthldz, zdrtdz, zetheta, zemoist, & +!$acc & ztmp1_device, ztmp2_device ) + ! ! initialize the mixing length with the mesh grid !$acc kernels @@ -2252,6 +2269,8 @@ end if !$acc end data +!$acc end data + END SUBROUTINE DEAR end module mode_turb diff --git a/src/MNH/turb_hor_splt.f90 b/src/MNH/turb_hor_splt.f90 index 6249d927c..2b5d5d470 100644 --- a/src/MNH/turb_hor_splt.f90 +++ b/src/MNH/turb_hor_splt.f90 @@ -367,14 +367,10 @@ REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRM, ZSVM REAL,ALLOCATABLE,DIMENSION(:,:,:) :: ZRUS, ZRVS, ZRWS, ZRTHLS REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS ! -!$acc declare create(ZK,ZINV_PDXX,ZINV_PDYY,ZINV_PDZZ,ZMZM_PRHODJ, & -!$acc & ZUM,ZVM,ZWM,ZTHLM,ZTKEM,ZRM,ZSVM,ZRUS,ZRVS,ZRWS,ZRTHLS,ZRRS,ZRSVS) -! TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll ! #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) #endif ! --------------------------------------------------------------------------- @@ -459,7 +455,10 @@ ALLOCATE(ZMZM_PRHODJ(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3))) allocate( ZTMP1_DEVICE( SIZE( PTHLM, 1 ), SIZE( PTHLM, 2 ), SIZE( PTHLM, 3 ) ) ) allocate( ZTMP2_DEVICE( SIZE( PTHLM, 1 ), SIZE( PTHLM, 2 ), SIZE( PTHLM, 3 ) ) ) #endif -! + +!$acc data create( ZK, ZINV_PDXX, ZINV_PDYY, ZINV_PDZZ, ZMZM_PRHODJ, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE ) + !$acc kernels ZINV_PDXX = 1./PDXX ZINV_PDYY = 1./PDYY @@ -498,6 +497,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN ALLOCATE(ZRSVS(SIZE(PRSVS,1),SIZE(PRSVS,2),SIZE(PRSVS,3),SIZE(PRSVS,4))) ALLOCATE(ZRTHLS(SIZE(PRTHLS,1),SIZE(PRTHLS,2),SIZE(PRTHLS,3))) ALLOCATE(ZRRS(SIZE(PRRS,1),SIZE(PRRS,2),SIZE(PRRS,3),SIZE(PRRS,4))) +!$acc data create( zum, zvm, zwm, zsvm, zthlm, ztkem, zrm, zrus, zrvs, zrws, zrsvs, zrthls, zrrs ) ! ! !* 2.2 list for parallel exchanges @@ -702,6 +702,7 @@ IF (KSPLIT>1 .AND. CPROGRAM=='MESONH') THEN !* 2.6 deallocations ! ------------- ! +!$acc end data DEALLOCATE(ZUM) DEALLOCATE(ZVM) DEALLOCATE(ZWM) @@ -753,6 +754,8 @@ ELSE END IF !-------------------------------------------------------------------- ! +!$acc end data + DEALLOCATE(ZK) DEALLOCATE(ZINV_PDXX) DEALLOCATE(ZINV_PDYY) diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90 index b857a251f..f81424712 100644 --- a/src/MNH/turb_hor_tke.f90 +++ b/src/MNH/turb_hor_tke.f90 @@ -131,8 +131,6 @@ REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF ! REAL, DIMENSION(:,:,:), allocatable :: ZFLX ! -!$acc declare create(ZCOEFF,ZFLX) -! REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index cf0d494c9..000e3cf61 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -409,8 +409,6 @@ LOGICAL :: GFTHR ! flag to use w'th'r' #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE, & -!$acc & ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE) #endif TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- @@ -487,11 +485,10 @@ allocate( ztmp7_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) allocate( ztmp8_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) #endif -!$acc data create( ZFLXZ, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, ZCOEFF, & -!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE , & -!$acc & ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE ) +!$acc data create( zflxz, zkeff, zf, zdfddtdz, zdfddrdz, zcoeff, & +!$acc & ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, & +!$acc & ztmp5_device, ztmp6_device, ztmp7_device, ztmp8_device ) -! GUSERV = (KRR/=0) ! ! compute the coefficients for the uncentred gradient computation near the -- GitLab