diff --git a/src/LIB/SURCOUCHE/src/mode_sum_ll.f90 b/src/LIB/SURCOUCHE/src/mode_sum_ll.f90 index 6063f3346f078a27fb90449a4c68bbd1d691d1a2..f01b7876cebfe513c2bafea2eae97565a6ce4279 100644 --- a/src/LIB/SURCOUCHE/src/mode_sum_ll.f90 +++ b/src/LIB/SURCOUCHE/src/mode_sum_ll.f90 @@ -1025,7 +1025,7 @@ CONTAINS logical :: gondevice #endif ! -REAL, DIMENSION(SIZE(PFIELD,1),SIZE(PFIELD,2)) :: ZSUM +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM_ll !------------------------------------------------------------------------------- ! @@ -1126,6 +1126,8 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM_ll ! !* 3.2 The intersection is not empty ! + allocate( ZSUM( SIZE( PFIELD, 1 ), SIZE( PFIELD, 2 ) ) ) + ZSUM(:,:) = 0. IF((IIB <= IIE) .AND. (IJB <= IJE) ) THEN ! @@ -1182,6 +1184,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZSUM_ll !JUAN SUM3D_ll= SUM_DD_R2_ll(ZSUM(:,:)) !JUAN + deallocate( ZSUM ) ENDIF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/advec_4th_order_aux.f90 b/src/MNH/advec_4th_order_aux.f90 index cb89af1c1ab80a6e448c07743d6affb2190d68cb..adb01b8911d4da48fa3af8d694cac695d02cad58 100644 --- a/src/MNH/advec_4th_order_aux.f90 +++ b/src/MNH/advec_4th_order_aux.f90 @@ -140,8 +140,8 @@ INTEGER:: ILUOUT,IRESP ! for prints ! JUAN ACC LOGICAL :: GWEST , GEAST LOGICAL :: GSOUTH , GNORTH -REAL, DIMENSION(SIZE(PFIELDT,2),SIZE(PFIELDT,3)) :: ZHALO2_WEST,ZHALO2_EAST -REAL, DIMENSION(SIZE(PFIELDT,1),SIZE(PFIELDT,3)) :: ZHALO2_SOUTH,ZHALO2_NORTH +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) ! @@ -152,6 +152,11 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PFIELDT,"ADVEC_4TH_ORDER_ALGO beg:PFIELDT") END IF +allocate( zhalo2_west ( size( pfieldt, 2 ), size( pfieldt, 3 ) ) ) +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 ) ) ) + !------------------------------------------------------------------------------- ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS diff --git a/src/MNH/advection_uvw_cen.f90 b/src/MNH/advection_uvw_cen.f90 index af6a40ae70807d96f20afac7f1d2e1290bb9a857..dcd9de9c8521453b7fac64178902e6416f2fc464 100644 --- a/src/MNH/advection_uvw_cen.f90 +++ b/src/MNH/advection_uvw_cen.f90 @@ -148,39 +148,39 @@ TYPE(HALO2LIST_ll), POINTER :: TPHALO2MLIST ! momentum variables !* 0.2 declarations of local variables ! ! -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZUS -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZVS -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZWS +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(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUS -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVS -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWS +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) ! to future (+PTSTEP) timestep -! -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUT -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVT -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWT +! +REAL, DIMENSION(:,:,:), allocatable :: ZRUT +REAL, DIMENSION(:,:,:), allocatable :: ZRVT +REAL, DIMENSION(:,:,:), allocatable :: ZRWT !$acc declare create(ZRUT,ZRVT,ZRWT) - ! cartesian + ! cartesian ! components of ! momentum ! -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRUCT -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRVCT -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZRWCT +REAL, DIMENSION(:,:,:), allocatable :: ZRUCT +REAL, DIMENSION(:,:,:), allocatable :: ZRVCT +REAL, DIMENSION(:,:,:), allocatable :: ZRWCT !$acc declare create(ZRUCT,ZRVCT,ZRWCT) ! contravariant ! components ! of momentum -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMXM_RHODJ -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMYM_RHODJ -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZMZM_RHODJ +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 @@ -217,6 +217,22 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRWS,"ADVECTION_UVW_CEN beg:PRWS") END IF +allocate( zus ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zvs ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zws ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrus ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrvs ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrws ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrut ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrvt ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrwt ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zruct ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrvct ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +allocate( zrwct ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +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 ) ) ) + #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') @@ -315,7 +331,7 @@ IF (HUVW_ADV_SCHEME=='CEN2ND' ) THEN ELSEIF (HUVW_ADV_SCHEME=='CEN4TH') THEN ! CALL ADVECUVW_4TH ( HLBCX, HLBCY, ZRUCT, ZRVCT, ZRWCT, & - PUT, PVT, PWT, ZRUS, ZRVS, ZRWS, TPHALO2MLIST ) + PUT, PVT, PWT, ZRUS, ZRVS, ZRWS, TPHALO2MLIST ) ! END IF ! @@ -345,6 +361,22 @@ 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") diff --git a/src/MNH/bl89.f90 b/src/MNH/bl89.f90 index 35f99be024cf73f5215bf50851e92209463b9257..30c84726982c4d07dec7781e30bc2c99a09eb165 100644 --- a/src/MNH/bl89.f90 +++ b/src/MNH/bl89.f90 @@ -1,12 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1997-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source: /home/cvsroot/MNH-VX-Y-Z/src/MNH/bl89.f90,v $ $Revision: 1.1.8.1.2.2.16.1.2.1 $ $Date: 2014/01/09 13:25:02 $ -!----------------------------------------------------------------- ! ################ MODULE MODI_BL89 ! ################ @@ -114,24 +110,24 @@ INTEGER :: IKB,IKE INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain -REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZVPT ! Virtual Potential Temp at half levels -REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZDELTVPT +real, dimension(:,:), allocatable :: ZVPT ! Virtual Potential Temp at half levels +real, dimension(:,:), allocatable :: ZDELTVPT ! Increment of Virtual Potential Temp between two following levels -REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZHLVPT +real, dimension(:,:), allocatable :: ZHLVPT ! Virtual Potential Temp at half levels -REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2)) :: ZLWORK,ZINTE +real, dimension(:), allocatable :: ZLWORK,ZINTE ! ! downwards then upwards vertical displacement, ! ! residual internal energy, ! ! residual potential energy -REAL, DIMENSION(SIZE(PTKEM,1)*SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZZZ,ZDZZ, & - ZG_O_THVREF, & - ZTHM,ZTKEM,ZLM, & - ZLMDN,ZSHEAR, & - ZSQRT_TKE +real, dimension(:,:), allocatable :: ZZZ,ZDZZ, & + ZG_O_THVREF, & + ZTHM,ZTKEM,ZLM, & + ZLMDN,ZSHEAR, & + ZSQRT_TKE ! ! input and output arrays packed according one horizontal coord. -REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3),SIZE(PRM,4)) :: ZRM +real, dimension(:,:,:), allocatable :: ZRM ! ! input array packed according one horizontal coord. -REAL, DIMENSION(SIZE(PRM,1)*SIZE(PRM,2),SIZE(PRM,3)) :: ZSUM ! to replace SUM function +real, dimension(:,:), allocatable :: ZSUM ! to replace SUM function ! INTEGER :: IIU,IJU INTEGER :: J1D ! horizontal loop counter @@ -143,6 +139,25 @@ REAL :: ZTEST,ZTEST0,ZTESTM ! test for vectorization REAL :: Z2SQRT2 !------------------------------------------------------------------------------- ! + +allocate( zvpt (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zdeltvpt (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zhlvpt (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zlwork (size( ptkem, 1 ) * size( ptkem, 2 ) ) ) +allocate( zinte (size( ptkem, 1 ) * size( ptkem, 2 ) ) ) +allocate( zzz (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zdzz (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zg_o_thvref(size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zthm (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + ztkem (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zlm (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zlmdn (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zshear (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) , & + zsqrt_tke (size( ptkem, 1 ) * size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zrm (size( prm, 1 ) * size( prm, 2 ), size( prm, 3 ), size( prm, 4 ) ) ) +if ( krr > 0 ) & + allocate( zsum (size( prm, 1 ) * size( prm, 2 ), size( prm, 3 ) ) ) + Z2SQRT2=2.*SQRT(2.) IIU=SIZE(PTKEM,1) IJU=SIZE(PTKEM,2) diff --git a/src/MNH/emoist.f90 b/src/MNH/emoist.f90 index 5bf959300d897c7d2955a4cbc476a43e23ef399b..1f68cffa3751fe8d9cbe9b8329c3d314403287b2 100644 --- a/src/MNH/emoist.f90 +++ b/src/MNH/emoist.f90 @@ -29,7 +29,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order #ifndef MNH_OPENACC REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result #else -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)), INTENT(OUT):: PEMOIST ! result +REAL,DIMENSION(:,:,:), INTENT(OUT):: PEMOIST ! result #endif ! #ifndef MNH_OPENACC @@ -120,13 +120,12 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order #ifndef MNH_OPENACC REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result #else -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)), INTENT(OUT):: PEMOIST ! result +REAL,DIMENSION(:,:,:), INTENT(OUT):: PEMOIST ! result #endif ! !* 0.2 declarations of local variables ! -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZA, ZRW +REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW ! ZA = coeft A, ZRW = total mixing ratio rw !$acc declare create(ZA,ZRW) REAL :: ZDELTA ! = Rv/Rd - 1 @@ -144,6 +143,9 @@ if ( mppdb_initialized ) then call Mppdb_check( pamoist, "Emoist beg:pamoist" ) call Mppdb_check( psrcm, "Emoist beg:psrcm" ) end if + +allocate( za ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) ! !* 1. COMPUTE EMOIST ! -------------- @@ -206,6 +208,8 @@ ELSE ! liquid water & ice present END IF !$acc end kernels +deallocate( za, zrw ) + if ( mppdb_initialized ) then !Check all out arrays call Mppdb_check( pemoist, "Emoist end:pemoist" ) diff --git a/src/MNH/etheta.f90 b/src/MNH/etheta.f90 index 73943764e11b4e86a8a4b9f8bce06325cbef8044..1039cb55bd83d887328ad75c7888a9095273c0d0 100644 --- a/src/MNH/etheta.f90 +++ b/src/MNH/etheta.f90 @@ -30,7 +30,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order #ifndef MNH_OPENACC REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result #else -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)), INTENT(OUT):: PETHETA ! result +REAL, DIMENSION(:,:,:), INTENT(OUT):: PETHETA ! result #endif ! ! @@ -123,15 +123,14 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order #ifndef MNH_OPENACC REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PETHETA ! result #else -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)), INTENT(OUT):: PETHETA ! result +REAL, DIMENSION(:,:,:), INTENT(OUT):: PETHETA ! result #endif ! ! ! !* 0.2 declarations of local variables ! -REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZA, ZRW +REAL,DIMENSION(:,:,:), allocatable :: ZA, ZRW ! ZA = coeft A, ZRW = total mixing ratio rw !$acc declare create(ZA,ZRW) REAL :: ZDELTA ! = Rv/Rd - 1 @@ -149,6 +148,9 @@ if ( mppdb_initialized ) then call Mppdb_check( patheta, "Etheta beg:patheta" ) call Mppdb_check( psrcm, "Etheta beg:psrcm" ) end if + +allocate( za ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zrw ( size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) ! !* 1. COMPUTE ETHETA ! -------------- @@ -206,6 +208,8 @@ ELSE ! liquid water & ice present END IF !$acc end kernels +deallocate( za, zrw ) + if ( mppdb_initialized ) then !Check all out arrays call Mppdb_check( petheta, "Etheta end:petheta" ) diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90 index 0d15b0554cf8c771bd807984526c4a13650e5607..8f1992b2cd25c2ce22fba2ec189bcd3022250292 100644 --- a/src/MNH/gradient_u.f90 +++ b/src/MNH/gradient_u.f90 @@ -222,8 +222,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGX_U_M_DEVICE ! result mass point ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE ! ! !* 0.2 declaration of local variables @@ -233,6 +232,13 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE !---------------------------------------------------------------------------- !$acc data present( PA, PDXX, PDZZ, PDZX, PGX_U_M_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device ) + ! !* 1. DEFINITION of GX_U_M_DEVICE ! -------------------- @@ -261,6 +267,8 @@ END IF !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GX_U_M_DEVICE @@ -390,8 +398,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGY_U_UV_DEVICE ! result UV point ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE ! ! !* 0.2 declaration of local variables @@ -401,6 +408,13 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE !---------------------------------------------------------------------------- !$acc data present( PA, PDYY, PDZZ, PDZY, PGY_U_UV_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device ) + ! !* 1. DEFINITION of GY_U_UV_DEVICE ! --------------------- @@ -432,6 +446,8 @@ END IF !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GY_U_UV_DEVICE @@ -543,8 +559,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGZ_U_UW_DEVICE ! result UW point ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE ! ! !* 0.2 declaration of local variables @@ -554,6 +569,12 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE !---------------------------------------------------------------------------- !$acc data present( PA, PDZZ, PGZ_U_UW_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device ) + ! !* 1. DEFINITION of GZ_U_UW_DEVICE ! --------------------- @@ -566,6 +587,8 @@ PGZ_U_UW_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GZ_U_UW_DEVICE diff --git a/src/MNH/gradient_v.f90 b/src/MNH/gradient_v.f90 index e652fcbd2bcac30c74522f5185ea6cb5e8237e2f..95c3c0f07e294dffdb9ae6cdd733c6e57b47b200 100644 --- a/src/MNH/gradient_v.f90 +++ b/src/MNH/gradient_v.f90 @@ -224,8 +224,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY ! metric coefficient dzy ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGY_V_M_DEVICE ! result mass point ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE ! !* 0.2 declaration of local variables ! @@ -234,6 +233,13 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE !---------------------------------------------------------------------------- !$acc data present( PA, PDYY, PDZZ, PDZY, PGY_V_M_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device ) + ! !* 1. DEFINITION of GY_V_M_DEVICE ! -------------------- @@ -263,6 +269,8 @@ END IF !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GY_V_M_DEVICE @@ -391,8 +399,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX ! metric coefficient dzx ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGX_V_UV_DEVICE ! result UV point ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ! ! !* 0.2 declaration of local variables @@ -402,6 +409,14 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE !---------------------------------------------------------------------------- !$acc data present( PA, PDXX, PDZZ, PDZX, PGX_V_UV_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp4_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device ) + ! !* 1. DEFINITION of GX_V_UV_DEVICE ! --------------------- @@ -434,6 +449,8 @@ END IF !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GX_V_UV_DEVICE @@ -546,8 +563,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz ! REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGZ_V_VW_DEVICE ! result VW point ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE ! !* 0.2 declaration of local variables ! @@ -556,6 +572,12 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE !---------------------------------------------------------------------------- !$acc data present( PA, PDZZ, PGZ_V_VW_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device ) + ! !* 1. DEFINITION of GZ_V_VW_DEVICE ! --------------------- @@ -568,6 +590,8 @@ PGZ_V_VW_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GZ_V_VW_DEVICE diff --git a/src/MNH/gradient_w.f90 b/src/MNH/gradient_w.f90 index 14b324f856fb087ad7f9aaae1f2ab8205a7d3c2a..70fda231043e16fb2b0c561c604c56dbd87d77e2 100644 --- a/src/MNH/gradient_w.f90 +++ b/src/MNH/gradient_w.f90 @@ -204,12 +204,17 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGZ_W_M_DEVIC ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE ! !---------------------------------------------------------------------------- !$acc data present( PA, PDZZ, PGZ_W_M_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device ) + ! !* 1. DEFINITION of GZ_W_M_DEVICE ! -------------------- @@ -222,6 +227,8 @@ PGZ_W_M_DEVICE(:,:,:)= ZTMP1_DEVICE/ZTMP2_DEVICE !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GZ_W_M_DEVICE @@ -343,12 +350,20 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGX_W_UW_DEVI ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE ! !---------------------------------------------------------------------------- !$acc data present( PA, PDXX, PDZZ, PDZX, PGX_W_UW_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp4_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp5_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device ) + ! !* 1. DEFINITION of GX_W_UW_DEVICE ! --------------------- @@ -378,6 +393,8 @@ END IF !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GX_W_UW_DEVICE @@ -499,12 +516,20 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)), INTENT(OUT) :: PGY_W_VW_DEVI ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE ! !---------------------------------------------------------------------------- !$acc data present( PA, PDYY, PDZZ, PDZY, PGY_W_VW_DEVICE ) + +allocate( ztmp1_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp2_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp3_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp4_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) +allocate( ztmp5_device(size( pa, 1 ), size( pa, 2 ), size( pa, 3 ) ) ) + +!$acc data create( ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device ) + ! !* 1. DEFINITION of GY_W_VW_DEVICE ! --------------------- @@ -534,6 +559,8 @@ END IF !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE GY_W_VW_DEVICE diff --git a/src/MNH/gravity.f90 b/src/MNH/gravity.f90 index d5781ca4c485545036cbad2ff809d1f53bda0751..97a5624a321f8ef3ff6c2249e2b7ce1e141c21b0 100644 --- a/src/MNH/gravity.f90 +++ b/src/MNH/gravity.f90 @@ -139,8 +139,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRWS ! Sources of Momentum ! REAL :: ZRV_OV_RD ! = RV / RD INTEGER :: JWATER ! loop index on the different types of water -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: & - ZWORK1, ZWORK2 +REAL, DIMENSION(:,:,:), allocatable :: ZWORK1, ZWORK2 INTEGER :: IKU ! !$acc declare device_resident(ZWORK1, ZWORK2) @@ -157,6 +156,9 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PTHT, "GRAVITY beg:PTHT") CALL MPPDB_CHECK(PRT, "GRAVITY beg:PRT") END IF + +allocate( zwork1(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) +allocate( zwork2(size( ptht, 1 ), size( ptht, 2 ), size( ptht, 3 ) ) ) ! !* 1. COMPUTES THE GRAVITY TERM ! ------------------------- diff --git a/src/MNH/gravity_impl.f90 b/src/MNH/gravity_impl.f90 index 633ce90315f7d5770ef00eb5910996fdddaf894f..8f97f2ff99997ba21f3644cb25cb25d37b111d11 100644 --- a/src/MNH/gravity_impl.f90 +++ b/src/MNH/gravity_impl.f90 @@ -118,11 +118,11 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRRS_CLD ! ! ! Tendencies of W due to gravity -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZRWS_GRAV +REAL, DIMENSION(:,:,:), allocatable :: ZRWS_GRAV ! Guess of future theta -REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZTH +REAL, DIMENSION(:,:,:), allocatable :: ZTH ! Guess of future mixing ratios -REAL, DIMENSION(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) :: ZR +REAL, DIMENSION(:,:,:,:), allocatable :: ZR ! INTEGER :: JR ! @@ -144,6 +144,10 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PRWS, "GRAVITY_IMPL beg:PRWS") 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 ) ) ) ! ! guess of Theta at future time-step !$acc kernels diff --git a/src/MNH/ice4_fast_rs.f90 b/src/MNH/ice4_fast_rs.f90 index 837b581c98d1087dd6922e26bbf74ea620eea5f0..fd52d08bfd9b9fb7e54fbd714d6b23a84149df61 100644 --- a/src/MNH/ice4_fast_rs.f90 +++ b/src/MNH/ice4_fast_rs.f90 @@ -141,12 +141,13 @@ INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, INTEGER :: IGRIM, IGACC INTEGER :: IDX, JJ INTEGER :: ISIZE -INTEGER, DIMENSION(SIZE(PRHODREF)) :: I1 -INTEGER, DIMENSION(SIZE(PRHODREF)) :: IVEC1, IVEC2 LOGICAL :: GDSOFT,GEVLIMIT !Workaround of PGI bug with OpenACC (at least up to 18.10 version) -LOGICAL, DIMENSION(SIZE(PRHODREF)) :: GRIM, GACC, GMASK -REAL, DIMENSION(SIZE(PRHODREF)) :: ZVEC1, ZVEC2, ZVEC3 -REAL, DIMENSION(SIZE(PRHODREF)) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE +INTEGER, DIMENSION(:), allocatable :: I1 +INTEGER, DIMENSION(:), allocatable :: IVEC1, IVEC2 +LOGICAL, DIMENSION(:), allocatable :: GRIM, GACC, GMASK +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& PLBDAR, PLBDAS, PT, PRVT, PRCT, PRRT, PRST, PRIAGGS, PRCRIMSS, PRCRIMSG, PRSRIMCG, & @@ -194,6 +195,21 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK1D(PA_RS,"ICE4_FAST_RS beg:PA_RS",PRECISION) CALL MPPDB_CHECK1D(PA_RG,"ICE4_FAST_RS beg:PA_RG",PRECISION) END IF + +allocate( i1 ( size( prhodref ) ) ) +allocate( ivec1 ( size( prhodref ) ) ) +allocate( ivec2 ( size( prhodref ) ) ) +allocate( grim ( size( prhodref ) ) ) +allocate( gacc ( size( prhodref ) ) ) +allocate( gmask ( size( prhodref ) ) ) +allocate( zvec1 ( size( prhodref ) ) ) +allocate( zvec2 ( size( prhodref ) ) ) +allocate( zvec3 ( size( prhodref ) ) ) +allocate( zzw ( size( prhodref ) ) ) +allocate( zzw2 ( size( prhodref ) ) ) +allocate( zzw6 ( size( prhodref ) ) ) +allocate( zfreez_rate ( size( prhodref ) ) ) + ! ! !$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 @@ -653,6 +669,20 @@ 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 CALL MPPDB_CHECK1D(PRSMLTG,"ICE4_FAST_RS end:PRSMLTG",PRECISION) diff --git a/src/MNH/mode_prandtl.f90 b/src/MNH/mode_prandtl.f90 index c31f08bf018d6481cdd8efce92139e7accb92285..e8219824ed427f7d325c78aa0a06feb1e09812a0 100644 --- a/src/MNH/mode_prandtl.f90 +++ b/src/MNH/mode_prandtl.f90 @@ -387,12 +387,16 @@ SUBROUTINE D_PHI3DTDZ2_O_DDTDZ(PPHI3,PREDTH1,PREDR1,PRED2TH3,PRED2THR3,PDTDZ,HTU #endif INTEGER :: IKB, IKE #ifdef MNH_OPENACC - REAL, DIMENSION(SIZE(PREDTH1,1),SIZE(PREDTH1,2),SIZE(PREDTH1,3)) :: ZTMP1_DEVICE + REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE !$acc declare create( ZTMP1_DEVICE ) #endif !$acc data present( PPHI3, PREDTH1, PREDR1, PRED2TH3, PRED2THR3, PDTDZ, PD_PHI3DTDZ2_O_DDTDZ ) +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( predth1, 1 ), size( predth1, 2 ), size( predth1, 3 ) ) ) +#endif + IKB = 1+JPVEXT_TURB IKE = SIZE(PREDTH1,3)-JPVEXT_TURB ! diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index b4b37943f00df398246553713cdaef47df454b95..54636764ba583fd27a551b26f06caed5a35390a7 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -510,18 +510,18 @@ LOGICAL :: KACTIT LOGICAL :: KSEDI LOGICAL :: KHHONI ! -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZRUS,ZRVS,ZRWS +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRUS,ZRVS,ZRWS !$acc declare create(ZRWS) -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZPABST !To give pressure at t +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZPABST !To give pressure at t ! (and not t+1) to resolved_cloud -REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZJ +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZJ ! TYPE(LIST_ll), POINTER :: TZFIELDC_ll ! list of fields to exchange TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll ! list of fields to exchange LOGICAL :: GCLD ! conditionnal call for dust wet deposition LOGICAL :: GCLOUD_ONLY ! conditionnal radiation computations for ! the only cloudy columns -REAL, DIMENSION(SIZE(XRSVS,1), SIZE(XRSVS,2), SIZE(XRSVS,3), NSV_AER) :: ZWETDEPAER +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZWETDEPAER ! @@ -531,6 +531,14 @@ TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE ! TZBAKFILE=> NULL() TZOUTFILE=> NULL() + +allocate( ZRUS (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) ) +allocate( ZRVS (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) ) +allocate( ZRWS (SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) ) +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) ) + ! !* 0. MICROPHYSICAL SCHEME ! ------------------- diff --git a/src/MNH/prandtl.f90 b/src/MNH/prandtl.f90 index f0c6b1a6f9b0d541a7caea7e1bad8b03e74013c6..2c6f15209a9b808a427a52a6cbebba0433ec6744 100644 --- a/src/MNH/prandtl.f90 +++ b/src/MNH/prandtl.f90 @@ -274,10 +274,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PEMOIST ! coefficient E_moist ! ! 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZW1, ZW2 -! working variables -!$acc declare create(ZW1,ZW2) +REAL, DIMENSION(:,:,:), allocatable :: ZW1, ZW2 ! work arrays ! INTEGER :: IKB ! vertical index value for the first inner mass point INTEGER :: IKE ! vertical index value for the last inner mass point @@ -288,12 +285,11 @@ INTEGER :: JLOOP REAL :: ZMINVAL ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP2_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP3_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP4_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP5_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD ! --------------------------------------------------------------------------- @@ -323,6 +319,20 @@ if ( mppdb_initialized ) then call Mppdb_check( psvm, "Prandtl beg:psvm" ) call Mppdb_check( psrcm, "Prandtl beg:psrcm" ) end if + +allocate( zw1(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zw2(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +#endif + +!$acc data create( zw1, zw2, ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device, ztmp5_device ) + ! !* 1. DEFAULT VALUES, 1D REDELSPERGER NUMBERS ! ---------------------------------------- @@ -1052,6 +1062,8 @@ end if !$acc end data +!$acc end data + !--------------------------------------------------------------------------- ! END SUBROUTINE PRANDTL diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 2a6533e1606008758180bcb4fb7f612d03ac2cb0..55d8b32baad8c3e9a0e6ad45ffd7fc2e66f60903 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -477,7 +477,7 @@ INTEGER :: ISVEND ! last scalar index for microph REAL, DIMENSION(:), ALLOCATABLE :: ZRSMIN ! Minimum value for tendencies REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT ! scalar variable for microphysics only REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVS ! scalar tendency for microphysics only -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: LLMICRO ! mask to limit computation +LOGICAL, DIMENSION(:,:,:), ALLOCATABLE :: LLMICRO ! mask to limit computation ! REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR ! INTEGER :: JMOD, JMOD_IFN @@ -559,6 +559,7 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PSSPRO,"RESOLVED_CLOUD beg:PSSPRO") END IF ! +allocate ( LLMICRO ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) allocate ( ZDZZ ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) allocate ( ZT ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) allocate ( ZEXN ( SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3) ) ) diff --git a/src/MNH/rmc01.f90 b/src/MNH/rmc01.f90 index 57f50ba7cbfaafd6767e3d5960356aee38676435..0a9ed042e428c92fd797356edb9b41dc4630808a 100644 --- a/src/MNH/rmc01.f90 +++ b/src/MNH/rmc01.f90 @@ -1,13 +1,8 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2002-2019 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -!--------------- special set of characters for RCS information -!----------------------------------------------------------------- -! $Source$ $Revision$ -! MASDEV4_7 turb 2006/05/18 13:07:25 -!----------------------------------------------------------------- ! ################ MODULE MODI_RMC01 ! ################ @@ -113,23 +108,24 @@ INTEGER :: IIU ! horizontal x boundary INTEGER :: IJU ! horizontal y boundary INTEGER :: JK ! loop counter ! -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZZ ! height of mass - ! points above ground -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZ_O_LMO ! height / LMO -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZGAM ! factor controling - ! transition betw. - ! SBL and free BL - -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZPHIM! MO function - ! for stress -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZPHIE! MO function - ! for TKE -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZDH ! hor. grid mesh - ! size -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZL ! SBL length -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZC ! alt. where - ! turb. is isotr. +REAL, DIMENSION(:,:,:), allocatable :: ZZZ ! height of mass points above ground +REAL, DIMENSION(:,:,:), allocatable :: ZZ_O_LMO ! height / LMO +REAL, DIMENSION(:,:,:), allocatable :: ZGAM ! factor controling transition between SBL and free BL +REAL, DIMENSION(:,:,:), allocatable :: ZPHIM ! MO function for stress +REAL, DIMENSION(:,:,:), allocatable :: ZPHIE ! MO function for TKE +REAL, DIMENSION(:,:,:), allocatable :: ZDH ! hor. grid mesh size +REAL, DIMENSION(:,:,:), allocatable :: ZL ! SBL length +REAL, DIMENSION(:,:,:), allocatable :: ZZC ! alt. where turb. is isotr. !------------------------------------------------------------------------------- + +allocate( zzz (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zz_o_lmo(size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zgam (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zphim (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zphie (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zdh (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zl (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) +allocate( zzc (size( pzz, 1 ), size( pzz, 2 ), size( pzz, 3 ) ) ) ! !* 1. Initializations ! --------------- diff --git a/src/MNH/rotate_wind.f90 b/src/MNH/rotate_wind.f90 index 8e991553575f154ff3bc204c64d5b1be00d4992d..779d310f0be79cd7881673fb706fe1a64a6b3c85 100644 --- a/src/MNH/rotate_wind.f90 +++ b/src/MNH/rotate_wind.f90 @@ -135,29 +135,33 @@ REAL, DIMENSION(:,:), INTENT(OUT) :: PVSLOPE ! wind component along ! ! 0.2 declaration of local variables ! -INTEGER, DIMENSION(SIZE(PDIRCOSXW,1),SIZE(PDIRCOSXW,2)) :: ILOC,JLOC - ! shift index to find the 4 nearest points in x and y directions -REAL, DIMENSION(SIZE(PDIRCOSXW,1),SIZE(PDIRCOSXW,2)) :: ZCOEFF,ZCOEFM, & - ! interpolation weigths for flux and mass locations - 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, DIMENSION(:,:), allocatable :: ILOC,JLOC ! shift index to find the 4 nearest points in x and y directions +REAL, DIMENSION(:,:), allocatable :: ZCOEFF,ZCOEFM, & ! interpolation weigths for flux and mass locations + 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 -! +! !---------------------------------------------------------------------------- !$acc data present( PU, PV, PW, PDIRCOSXW, PDIRCOSYW, PDIRCOSZW, & !$acc & PCOSSLOPE, PSINSLOPE, PDXX, PDYY, PDZZ, PUSLOPE, PVSLOPE ) + +allocate( iloc (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +allocate( jloc (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +allocate( zcoeff (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +allocate( zcoefm (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +allocate( zuint (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +allocate( zvint (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +allocate( zwint (size( pdircosxw, 1 ), size( pdircosxw, 2 ) ) ) +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 ) ) ) ! !* 1. PRELIMINARIES ! ------------- diff --git a/src/MNH/sbl_depth.f90 b/src/MNH/sbl_depth.f90 index b03a5c7082a0d8ff1bc11f7c2f9fb87671f011a8..30916e244e59d25ba14ab9167cc0e9f0c731a9a1 100644 --- a/src/MNH/sbl_depth.f90 +++ b/src/MNH/sbl_depth.f90 @@ -95,16 +95,15 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PSBL_DEPTH! boundary layer height ! 0.2 declaration of local variables ! ! -INTEGER :: JLOOP ! loop counter -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZQ0 ! surface buoyancy flux -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWU ! surface friction u'w' -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZWV ! surface friction v'w' -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZUSTAR2 ! surface friction -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSBL_DYN ! SBL wih dynamical criteria -REAL, DIMENSION(SIZE(PFLXU,1),SIZE(PFLXU,2),SIZE(PFLXU,3)) :: ZWIND - ! intermediate wind for SBL calculation -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZSBL_THER! SBL wih thermal criteria -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZA ! ponderation coefficient +INTEGER :: JLOOP ! loop counter +REAL, DIMENSION(:,:), allocatable :: ZQ0 ! surface buoyancy flux +REAL, DIMENSION(:,:), allocatable :: ZWU ! surface friction u'w' +REAL, DIMENSION(:,:), allocatable :: ZWV ! surface friction v'w' +REAL, DIMENSION(:,:), allocatable :: ZUSTAR2 ! surface friction +REAL, DIMENSION(:,:), allocatable :: ZSBL_DYN ! SBL wih dynamical criteria +REAL, DIMENSION(:,:), allocatable :: ZSBL_THER! SBL wih thermal criteria +REAL, DIMENSION(:,:), allocatable :: ZA ! ponderation coefficient +REAL, DIMENSION(:,:,:), allocatable :: ZWIND ! intermediate wind for SBL calculation #ifdef MNH_OPENACC call Print_msg( NVERB_FATAL, 'GEN', 'SBL_DEPTH', 'not yet implemented' ) #endif @@ -120,6 +119,16 @@ if ( mppdb_initialized ) then !Check all inout arrays call Mppdb_check( psbl_depth, "Sbl_depth beg:psbl_depth" ) end if + +allocate( zq0 (size( pzz, 1 ), size( pzz, 2 ) ) ) +allocate( zwu (size( pzz, 1 ), size( pzz, 2 ) ) ) +allocate( zwv (size( pzz, 1 ), size( pzz, 2 ) ) ) +allocate( zustar2 (size( pzz, 1 ), size( pzz, 2 ) ) ) +allocate( zsbl_dyn (size( pzz, 1 ), size( pzz, 2 ) ) ) +allocate( zsbl_ther(size( pzz, 1 ), size( pzz, 2 ) ) ) +allocate( za (size( pzz, 1 ), size( pzz, 2 ) ) ) + +allocate( zwind (size( pflxu, 1 ), size( pflxu, 2 ), size( pflxu, 3 ) ) ) ! !* initialisations ! diff --git a/src/MNH/tke_eps_sources.f90 b/src/MNH/tke_eps_sources.f90 index 1e032fb389d26fa7aa5a390b46f160b604c5e8a1..ea3497e30c3ee7b1d65ac7f8692e155a5db5933a 100644 --- a/src/MNH/tke_eps_sources.f90 +++ b/src/MNH/tke_eps_sources.f90 @@ -248,7 +248,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDISS ! Dissipati prod. of TKE ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & +REAL, DIMENSION(:,:,:), allocatable :: & ZA, & ! under diagonal elements of the tri-diagonal matrix involved ! in the temporal implicit scheme ZRES, & ! treated variable at t+ deltat when the turbu- @@ -258,8 +258,6 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: & ZFLX, & ! horizontal or vertical flux of the treated variable ZSOURCE, & ! source of evolution for the treated variable ZKEFF ! effectif diffusion coeff = LT * SQRT( TKE ) -!LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG -! ! 3D mask .T. if TKE < XTKEMIN INTEGER :: IIB,IIE,IJB,IJE,IKB,IKE ! Index values for the Beginning and End ! mass points of the domain @@ -270,9 +268,7 @@ INTEGER :: IINFO_ll ! return code of parallel routine TYPE(TFIELDDATA) :: TZFIELD ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZA,ZRES,ZFLX,ZSOURCE,ZKEFF) -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE #endif !---------------------------------------------------------------------------- @@ -303,6 +299,21 @@ if ( mppdb_initialized ) then call Mppdb_check( prthls, "Tke_eps_sources beg:prthls" ) end if +allocate( za (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zres (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zflx (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zsource(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( zkeff (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( ztmp2_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( ztmp3_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( ztmp4_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +#endif + +!$acc data create( ZA, ZRES, ZFLX, ZSOURCE, ZKEFF, ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ) + NULLIFY(TZFIELDDISS_ll) ! !* 1. PRELIMINARY COMPUTATIONS @@ -608,4 +619,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TKE_EPS_SOURCES diff --git a/src/MNH/tm06_h.f90 b/src/MNH/tm06_h.f90 index 8df331aa0eca0a0c8116ec721ac670afb8f75fdf..561088d8dbd6a281fdd053bb945fe316f9d4e1e0 100644 --- a/src/MNH/tm06_h.f90 +++ b/src/MNH/tm06_h.f90 @@ -94,11 +94,11 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PBL_DEPTH ! boundary layer height ! 0.2 declaration of local variables ! ! -INTEGER :: JK ! loop counter -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZFLXZMIN ! minimum of temperature flux -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: ZBL_DEPTH! BL depth at previous time-step -REAL :: ZGROWTH ! maximum BL growth rate -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2)) :: GWORK +INTEGER :: JK ! loop counter +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) !---------------------------------------------------------------------------- @@ -116,6 +116,10 @@ if ( mppdb_initialized ) then call Mppdb_check( pbl_depth, "Tm06_h beg:pbl_depth" ) end if +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 ) ) ) + !* mixed boundary layer cannot grow more rapidly than 1800m/h !$acc kernels ZGROWTH = 2.0 ! (m/s) diff --git a/src/MNH/tridiag.f90 b/src/MNH/tridiag.f90 index 26a22b411bfd62aa13ab3bab73f80bf5d40668fb..e07a43ddc777b07b67c222986c167cdbe8e782bb 100644 --- a/src/MNH/tridiag.f90 +++ b/src/MNH/tridiag.f90 @@ -147,6 +147,9 @@ END MODULE MODI_TRIDIAG USE MODD_PARAMETERS use mode_mppdb +#ifdef MNH_OPENACC +use mode_msg +#endif IMPLICIT NONE ! @@ -167,18 +170,19 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM - ! RHS of the equation, 3D work array -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET - ! 2D work array -INTEGER :: JK ! loop counter -INTEGER :: IKB,IKE ! inner vertical limits -INTEGER :: IKT ! array size in k direction -INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain - +INTEGER :: JK ! loop counter +INTEGER :: IKB,IKE ! inner vertical limits +INTEGER :: IKT ! array size in k direction +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array +REAL, DIMENSION(:,:), allocatable :: ZBET ! 2D work array ! ! --------------------------------------------------------------------------- +#ifdef MNH_OPENACC +call Print_msg( NVERB_FATAL, 'GEN', 'Tridiag', 'OpenACC: not yet implemented' ) +#endif + if ( mppdb_initialized ) then !Check all in arrays call Mppdb_check( pvarm, "Tridiag beg:pvarm" ) @@ -186,6 +190,10 @@ if ( mppdb_initialized ) then call Mppdb_check( prhodj, "Tridiag beg:prhodj" ) call Mppdb_check( psource, "Tridiag beg:psource" ) end if + +allocate( zy (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zgam(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zbet(size( pvarm, 1 ), size( pvarm, 2 ) ) ) ! !* 1. COMPUTE THE RIGHT HAND SIDE ! --------------------------- diff --git a/src/MNH/tridiag_thermo.f90 b/src/MNH/tridiag_thermo.f90 index c4c61cbf8940565dce7ebd67ee0c1f6b61924466..3af0031fe669af6dd19cd8f454a90f4bf052acae 100644 --- a/src/MNH/tridiag_thermo.f90 +++ b/src/MNH/tridiag_thermo.f90 @@ -179,12 +179,12 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass poi ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZRHODJ_DFDDTDZ_O_DZ2 -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZMZM_RHODJ -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZA, ZB, ZC -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM +REAL, DIMENSION(:,:,:), allocatable :: ZRHODJ_DFDDTDZ_O_DZ2 +REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ +REAL, DIMENSION(:,:,:), allocatable :: ZA, ZB, ZC +REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET +REAL, DIMENSION(:,:), allocatable :: ZBET ! 2D work array INTEGER :: JI,JJ,JK ! loop counter INTEGER :: IKB,IKE ! inner vertical limits @@ -194,7 +194,7 @@ 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(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZTMP1_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE !$acc declare create(ZTMP1_DEVICE) #endif ! --------------------------------------------------------------------------- @@ -209,6 +209,19 @@ if ( mppdb_initialized ) then call Mppdb_check( pdzz, "Tridiag_thermo beg:pdzz" ) call Mppdb_check( prhodj, "Tridiag_thermo beg:prhodj" ) end if + +allocate( zrhodj_dfddtdz_o_dz2(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zmzm_rhodj (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( za (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zb (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zc (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zy (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zgam (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zbet (size( pvarm, 1 ), size( pvarm, 2 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +#endif ! !* 1. Preliminaries ! ------------- diff --git a/src/MNH/tridiag_tke.f90 b/src/MNH/tridiag_tke.f90 index 3060d23cacab7bd27c03c0c0a46371ad99f5b07a..9c9fb543957c150bcd05263d679b19adc4c318fa 100644 --- a/src/MNH/tridiag_tke.f90 +++ b/src/MNH/tridiag_tke.f90 @@ -163,15 +163,12 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM - ! RHS of the equation, 3D work array -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET - ! 2D work array -!$acc declare create(ZY,ZGAM,ZBET) INTEGER :: JI,JJ,JK ! loop counters INTEGER :: IKB,IKE ! inner vertical limits INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array +REAL, DIMENSION(:,:), allocatable :: ZBET ! 2D work array ! ! --------------------------------------------------------------------------- @@ -186,6 +183,12 @@ if ( mppdb_initialized ) then call Mppdb_check( pdiag, "Tridiag_tke beg:pdiag" ) end if +allocate( zy (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zgam(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zbet(size( pvarm, 1 ), size( pvarm, 2 ) ) ) + +!$acc data create( ZY, ZGAM, ZBET ) + ! !* 1. COMPUTE THE RIGHT HAND SIDE ! --------------------------- @@ -284,6 +287,8 @@ end if !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE TRIDIAG_TKE diff --git a/src/MNH/tridiag_w.f90 b/src/MNH/tridiag_w.f90 index 6699d45b9383ec8187bb9f09b11732451ab372a2..87da6eff113a0671986d89e68a02782adba4f152 100644 --- a/src/MNH/tridiag_w.f90 +++ b/src/MNH/tridiag_w.f90 @@ -177,15 +177,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PVARP ! variable at t+1 at flux poi ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZRHODJ_DFDDWDZ_O_DZ2 -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZMZM_RHODJ -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZA, ZB, ZC -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM - ! RHS of the equation, 3D work array -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET - ! 2D work array -! -!$acc declare create(ZRHODJ_DFDDWDZ_O_DZ2,ZMZM_RHODJ,ZA,ZB,ZC,ZY,ZGAM,ZBET) +REAL, DIMENSION(:,:,:), allocatable :: ZRHODJ_DFDDWDZ_O_DZ2 +REAL, DIMENSION(:,:,:), allocatable :: ZMZM_RHODJ +REAL, DIMENSION(:,:,:), allocatable :: ZA, ZB, ZC +REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array +REAL, DIMENSION(:,:), allocatable :: ZBET ! 2D work array ! INTEGER :: JK ! loop counter INTEGER :: IKB,IKE,IKU ! inner vertical limits @@ -202,6 +198,18 @@ if ( mppdb_initialized ) then call Mppdb_check( pmzf_dzz, "Tridiag_w beg:pmzf_dzz" ) call Mppdb_check( prhodj, "Tridiag_w beg:prhodj" ) end if + +allocate( zrhodj_dfddwdz_o_dz2(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zmzm_rhodj (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( za (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zb (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zc (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zy (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zgam (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zbet (size( pvarm, 1 ), size( pvarm, 2 ) ) ) + +!$acc data create( ZRHODJ_DFDDWDZ_O_DZ2, ZMZM_RHODJ, ZA, ZB, ZC, ZY, ZGAM, ZBET ) + ! !* 1. Preliminaries ! ------------- @@ -365,6 +373,8 @@ end if !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE TRIDIAG_W diff --git a/src/MNH/tridiag_wind.f90 b/src/MNH/tridiag_wind.f90 index 6aa59aa0a8bf1d9effc07eafa6c6ee6c440e97a1..b7819835b38b0caf679e27ab10b1e7f32bba5c09 100644 --- a/src/MNH/tridiag_wind.f90 +++ b/src/MNH/tridiag_wind.f90 @@ -170,22 +170,13 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVARP ! variable at t+1 ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZY ,ZGAM - ! RHS of the equation, 3D work array -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZBET - ! 2D work array INTEGER :: JI,JJ,JK ! loop counters INTEGER :: IKB,IKE ! inner vertical limits INTEGER :: IKT ! array size in k direction -INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +REAL, DIMENSION(:,:,:), allocatable :: ZY ,ZGAM ! RHS of the equation, 3D work array +REAL, DIMENSION(:,:), allocatable :: ZBET ! 2D work array ! -!$acc declare create(ZY,ZGAM,ZBET) -! -#ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2),SIZE(PVARM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) -#endif - ! --------------------------------------------------------------------------- !$acc data present( PVARM, PA, PCOEFS, PRHODJA, PSOURCE, PVARP ) @@ -198,6 +189,13 @@ if ( mppdb_initialized ) then call Mppdb_check( prhodja, "Tridiag_wind beg:prhodja" ) call Mppdb_check( psource, "Tridiag_wind beg:psource" ) end if + +allocate( zy (size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zgam(size( pvarm, 1 ), size( pvarm, 2 ), size( pvarm, 3 ) ) ) +allocate( zbet(size( pvarm, 1 ), size( pvarm, 2 ) ) ) + +!$acc data create( ZY, ZGAM, ZBET ) + ! !* 1. COMPUTE THE RIGHT HAND SIDE ! --------------------------- @@ -304,6 +302,8 @@ end if !$acc end data +!$acc end data + !------------------------------------------------------------------------------- ! END SUBROUTINE TRIDIAG_WIND diff --git a/src/MNH/turb.f90 b/src/MNH/turb.f90 index cf0d7a8b23540d494a82eff85bce28a0ea436ab8..8e7b61a10c55185dc3350f0974e3ea857f9bb3f0 100644 --- a/src/MNH/turb.f90 +++ b/src/MNH/turb.f90 @@ -401,7 +401,7 @@ REAL, ALLOCATABLE, DIMENSION(:,:,:) ::& ZFRAC_ICE, & ! ri fraction of rc+ri ZMWTH,ZMWR,ZMTH2,ZMR2,ZMTHR,& ! 3rd order moments ZFWTH,ZFWR,ZFTH2,ZFR2,ZFTHR,& ! opposite of verticale derivate of 3rd order moments - ZTHLM, ZTR, ZDISS ! initial potential temp. + 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, & @@ -425,7 +425,7 @@ 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,ZLMO) +!$acc declare create(ZTAU11M,ZTAU12M,ZTAU22M,ZTAU33M,ZUSLOPE,ZVSLOPE,ZCDUEFF,ZUSTAR,ZLMO,ZRVM,ZSFRV) 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) @@ -445,12 +445,13 @@ REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZTT,ZEXNE,ZLV,ZLS,ZCPH -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ +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(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE !$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE) #endif ! @@ -471,6 +472,10 @@ REAL, DIMENSION(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) :: ZTMP1_DEVICE,ZTMP2 ! OUT variables ! !$acc & create ( PSIGS, PWTH, PWRC, PWSV, PDYP, PTHP, PTR, PDISS, PLEM ) +! +! Local variables +! +! !$acc & create ( ZSHEAR ) if ( mppdb_initialized ) then !Check all in arrays @@ -516,45 +521,68 @@ if ( mppdb_initialized ) then call Mppdb_check( prsvs, "Turb beg:prsvs" ) end if -ALLOCATE ( & - ZCP(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZEXN(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZT(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZLOCPEXNM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZLEPS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZTRH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZATHETA(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZAMOIST(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZCOEF_DISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFRAC_ICE(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZMTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFWTH(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFWR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFTH2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFR2(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZFTHR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZTHLM(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZTR(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)), & - ZDISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) - -ALLOCATE ( ZRM(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) ) - -ALLOCATE ( & - ZTAU11M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZTAU12M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZTAU22M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZTAU33M(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZUSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZVSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZCDUEFF(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZUSTAR(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZLMO(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZRVM(SIZE(PTHLT,1),SIZE(PTHLT,2)), & - ZSFRV(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE (ZCP (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZEXN (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZT (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZLOCPEXNM (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZLEPS (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZTRH (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZATHETA (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZAMOIST (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZCOEF_DISS(SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZFRAC_ICE (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) + +ALLOCATE (ZMWTH (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZMWR (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZMTH2 (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZMR2 (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZMTHR (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) + +ALLOCATE (ZFWTH (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZFWR (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZFTH2 (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZFR2 (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZFTHR (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) +ALLOCATE (ZTHLM (SIZE(PTHLT,1),SIZE(PTHLT,2),SIZE(PTHLT,3)) ) + +IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' .OR. ORMC01 ) & + ALLOCATE ( ZRM(SIZE(PRT,1),SIZE(PRT,2),SIZE(PRT,3),SIZE(PRT,4)) ) + +ALLOCATE ( ZTAU11M(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZTAU12M(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZTAU22M(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZTAU33M(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZUSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZVSLOPE(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZCDUEFF(SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +ALLOCATE ( ZLMO (SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +IF (ORMC01) then + ALLOCATE ( ZUSTAR (SIZE(PTHLT,1),SIZE(PTHLT,2)) ) + ALLOCATE ( ZRVM (SIZE(PTHLT,1),SIZE(PTHLT,2)) ) + ALLOCATE ( ZSFRV (SIZE(PTHLT,1),SIZE(PTHLT,2)) ) +end if + +IF ( HCLOUD == 'KHKO' .OR. HCLOUD == 'C2R2' ) then + allocate( ztt (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) + allocate( zexne (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) + allocate( zlv (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) + allocate( zcph (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +end if +IF ( HTURBLEN == 'BL89' .OR. HTURBLEN == 'RM17' ) then + allocate( zshear(size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +end if +IF ( HTURBLEN == 'RM17' ) then + allocate( zdudz (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) + allocate( zdvdz (size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) +end if + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlt, 1 ), size( pthlt, 2 ), size( pthlt, 3 ) ) ) +IF (HTURBDIM=="1DIM") then + allocate( ztmp2_device(size( pthlt, 1 ), size( pthlt, 2 ), size( pthlt, 3 ) ) ) + allocate( ztmp3_device(size( pthlt, 1 ), size( pthlt, 2 ), size( pthlt, 3 ) ) ) +end if +#endif !------------------------------------------------------------------------------------------ ! @@ -1525,8 +1553,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PAMOIST,PATHETA !* 0.2 Declarations of local variables ! REAL :: ZEPS ! XMV / XMD -REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZRVSAT -REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT +real, dimension(:,:,:), allocatable :: zrvsat +real, dimension(:,:,:), allocatable :: zdrvsatdt !$acc declare create(ZRVSAT,ZDRVSATDT) ! !------------------------------------------------------------------------------- @@ -1540,6 +1568,10 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT call Mppdb_check( pcp, "Compute_function_thermo beg:pcp" ) end if + allocate( zrvsat ( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) + allocate( zdrvsatdt( size( pexn, 1 ), size( pexn, 2 ), size( pexn, 3 ) ) ) + + ZEPS = XMV / XMD ! !* 1.1 Lv/Cph at t @@ -1594,6 +1626,8 @@ REAL, DIMENSION(SIZE(PEXN,1),SIZE(PEXN,2),SIZE(PEXN,3)) :: ZDRVSATDT PLOCPEXN(:,:,:) = PLOCPEXN(:,:,:) / PEXN(:,:,:) !$acc end kernels + deallocate( zrvsat, zdrvsatdt ) + if ( mppdb_initialized ) then !Check all out arrays call Mppdb_check( plocpexn, "Compute_function_thermo end:plocpexn" ) @@ -1660,16 +1694,19 @@ IMPLICIT NONE REAL :: ZPENTE ! Slope of the amplification straight line REAL :: ZCOEF_AMPL_CEI_NUL! Ordonnate at the origin of the ! amplification straight line -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZCOEF_AMPL +real, dimension(:,:,:), allocatable :: zcoef_ampl ! Amplification coefficient of the mixing length ! when the instability criterium is verified -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: ZLM_CLOUD +real, dimension(:,:,:), allocatable :: zlm_cloud ! Turbulent mixing length in the clouds ! !------------------------------------------------------------------------------- #ifdef MNH_OPENACC call Print_msg( NVERB_FATAL, 'GEN', 'TURB', 'OpenACC: CLOUD_MODIF_LM not yet implemented' ) #endif + +allocate( zcoef_ampl(size( put, 1 ), size( put, 2 ), size( put, 3) ) ) +allocate( zlm_cloud (size( put, 1 ), size( put, 2 ), size( put, 3) ) ) ! !* 1. INITIALISATION ! -------------- @@ -1778,7 +1815,9 @@ IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN CALL IO_Field_write(TPFILE,TZFIELD,ZLM_CLOUD) ! ENDIF -! + +deallocate( zcoef_ampl, zlm_cloud ) + END SUBROUTINE CLOUD_MODIF_LM ! END SUBROUTINE TURB diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90 index 1dad0cb17813e32d584aba20a8db4ce6f1c234c0..69c208e48d2120622017b3af0af8b465b3f3bf62 100644 --- a/src/MNH/turb_hor_dyn_corr.f90 +++ b/src/MNH/turb_hor_dyn_corr.f90 @@ -229,11 +229,9 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP,PTP ! TKE production terms ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) & - :: ZFLX,ZWORK - ! work arrays, PK is the turb. mixing coef. -! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW +REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays, PK is the turb. mixing coef. +! +REAL, DIMENSION(:,:), allocatable ::ZDIRSINZW ! sinus of the angle between the vertical and the normal to the orography INTEGER :: IKB,IKE ! Index values for the Beginning and End @@ -241,20 +239,20 @@ INTEGER :: IKB,IKE INTEGER :: IKU INTEGER :: JSV ! scalar loop counter ! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GX_U_M_PUM -REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GY_V_M_PVM -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GZ_W_M_PWM -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GZ_W_M_ZWP -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZMZF_DZZ ! MZF(PDZZ) -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZDFDDWDZ ! formal derivative of the -! ! flux (variable: dW/dz) -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZWP ! W at future time-step -! -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDU_DZ_DZS_DX ! du/dz*dzs/dx surf -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDV_DZ_DZS_DY ! dv/dz*dzs/dy surf -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDU_DX ! du/dx surf -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDV_DY ! dv/dy surf -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),1) :: ZDW_DZ ! dw/dz surf +REAL, DIMENSION(:,:,:), allocatable :: GX_U_M_PUM +REAL, DIMENSION(:,:,:), allocatable :: GY_V_M_PVM +REAL, DIMENSION(:,:,:), allocatable :: GZ_W_M_PWM +REAL, DIMENSION(:,:,:), allocatable :: GZ_W_M_ZWP +REAL, DIMENSION(:,:,:), allocatable :: ZMZF_DZZ ! MZF(PDZZ) +REAL, DIMENSION(:,:,:), allocatable :: ZDFDDWDZ ! formal derivative of the +! ! flux (variable: dW/dz) +REAL, DIMENSION(:,:,:), allocatable :: ZWP ! W at future time-step +! +REAL, DIMENSION(:,:,:), allocatable :: ZDU_DZ_DZS_DX ! du/dz*dzs/dx surf +REAL, DIMENSION(:,:,:), allocatable :: ZDV_DZ_DZS_DY ! dv/dz*dzs/dy surf +REAL, DIMENSION(:,:,:), allocatable :: ZDU_DX ! du/dx surf +REAL, DIMENSION(:,:,:), allocatable :: ZDV_DY ! dv/dy surf +REAL, DIMENSION(:,:,:), allocatable :: ZDW_DZ ! dw/dz surf ! INTEGER :: IINFO_ll ! return code of parallel routine TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange @@ -262,23 +260,17 @@ TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange REAL :: ZTIME1, ZTIME2 -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF , ZDZZ +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF , ZDZZ ! coefficients for the uncentred gradient ! computation near the ground ! -!$acc declare create(ZFLX,ZWORK,ZDIRSINZW,ZCOEFF,ZDZZ, & -!$acc & GX_U_M_PUM,GY_V_M_PVM,GZ_W_M_PWM,GZ_W_M_ZWP, & -!$acc & ZMZF_DZZ,ZDFDDWDZ,ZWP, & -!$acc & ZDU_DZ_DZS_DX,ZDV_DZ_DZS_DY,ZDU_DX,ZDV_DY,ZDW_DZ) -! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD ! -------------------------------------------------------------------------- -!$acc data present( PINV_PDZZ, PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ, PDIRCOSZW, & +!$acc data present( PK, PINV_PDZZ, PDXX, PDYY, PDZZ, PDZX, PDZY, PZZ, PDIRCOSZW, & !$acc & PCOSSLOPE, PSINSLOPE, PRHODJ, PCDUEFF, & !$acc & PTAU11M, PTAU12M, PTAU22M, PTAU33M, & !$acc & PUM, PVM, PWM, PTHLM, PRM, PSVM, PUSLOPEM, PVSLOPEM, PTKEM, PLM, & @@ -320,6 +312,42 @@ if ( mppdb_initialized ) then call Mppdb_check( pdp, "Turb_hor_dyn_corr beg:pdp" ) call Mppdb_check( ptp, "Turb_hor_dyn_corr beg:ptp" ) end if + +allocate( zflx (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( zwork(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) + +allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) ) + +allocate( gx_u_m_pum(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( gy_v_m_pvm(size( pvm, 1 ), size( pvm, 2 ), size( pvm, 3 ) ) ) +allocate( gz_w_m_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( gz_w_m_zwp(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( zmzf_dzz (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( zdfddwdz (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( zwp (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) + +allocate( zdu_dz_dzs_dx(size( pwm, 1 ), size( pwm, 2 ), 1 ) ) +allocate( zdv_dz_dzs_dy(size( pwm, 1 ), size( pwm, 2 ), 1 ) ) +allocate( zdu_dx (size( pwm, 1 ), size( pwm, 2 ), 1 ) ) +allocate( zdv_dy (size( pwm, 1 ), size( pwm, 2 ), 1 ) ) +allocate( zdw_dz (size( pwm, 1 ), size( pwm, 2 ), 1 ) ) + +allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) ) +allocate( zdzz (size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +#endif + +!$acc data create( ZFLX, ZWORK, ZDIRSINZW, ZCOEFF, ZDZZ, & +!$acc & GX_U_M_PUM, GY_V_M_PVM, GZ_W_M_PWM, GZ_W_M_ZWP, & +!$acc & ZMZF_DZZ, ZDFDDWDZ, ZWP, & +!$acc & ZDU_DZ_DZS_DX, ZDV_DZ_DZS_DY, ZDU_DX, ZDV_DY, ZDW_DZ, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -1145,4 +1173,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_DYN_CORR diff --git a/src/MNH/turb_hor_splt.f90 b/src/MNH/turb_hor_splt.f90 index bcbc06df3e1ba5b3031128358d386eff81199d34..6249d927c358a2e5d2093e12e3f14368872ac627 100644 --- a/src/MNH/turb_hor_splt.f90 +++ b/src/MNH/turb_hor_splt.f90 @@ -373,7 +373,7 @@ REAL,ALLOCATABLE,DIMENSION(:,:,:,:) :: ZRRS, ZRSVS TYPE(LIST_ll), POINTER, SAVE :: TZFIELDS_ll ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE +REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZTMP1_DEVICE,ZTMP2_DEVICE !$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) #endif ! --------------------------------------------------------------------------- @@ -455,6 +455,10 @@ ALLOCATE(ZINV_PDXX(SIZE(PDXX,1),SIZE(PDXX,2),SIZE(PDXX,3))) ALLOCATE(ZINV_PDYY(SIZE(PDYY,1),SIZE(PDYY,2),SIZE(PDYY,3))) ALLOCATE(ZINV_PDZZ(SIZE(PDZZ,1),SIZE(PDZZ,2),SIZE(PDZZ,3))) ALLOCATE(ZMZM_PRHODJ(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3))) +#ifdef MNH_OPENACC +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 kernels ZINV_PDXX = 1./PDXX @@ -754,6 +758,10 @@ DEALLOCATE(ZINV_PDXX) DEALLOCATE(ZINV_PDYY) DEALLOCATE(ZINV_PDZZ) DEALLOCATE(ZMZM_PRHODJ) +#ifdef MNH_OPENACC +deallocate( ZTMP1_DEVICE ) +deallocate( ZTMP2_DEVICE ) +#endif if ( mppdb_initialized ) then !Check all inout arrays diff --git a/src/MNH/turb_hor_sv_corr.f90 b/src/MNH/turb_hor_sv_corr.f90 index 9d1980b17b0888eb5bcf556032000e8818eb929d..0523d00b0e35e6a0f4c0d86d377771cf961097c6 100644 --- a/src/MNH/turb_hor_sv_corr.f90 +++ b/src/MNH/turb_hor_sv_corr.f90 @@ -141,8 +141,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM ! scalar var. at t-1 ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) & - :: ZFLX, ZA +REAL, DIMENSION(:,:,:), allocatable :: ZFLX, ZA ! INTEGER :: JSV ! loop counter INTEGER :: IKU @@ -181,6 +180,9 @@ if ( mppdb_initialized ) then call Mppdb_check( PSVM, "Turb_hor_sv_corr beg:PSVM" ) end if +allocate( zflx(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( za (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) + IKU=SIZE(PTKEM,3) CALL SECOND_MNH(ZTIME1) ! diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90 index 7130599a0a11e4ea9f64db469e3b42aead86a845..c4a20c624cedb64f76fb8f0a01764ee6750bdd4c 100644 --- a/src/MNH/turb_hor_sv_flux.f90 +++ b/src/MNH/turb_hor_sv_flux.f90 @@ -175,10 +175,8 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRSVS ! var. at t+1 -split- ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) & - :: ZFLXX,ZFLXY - ! work arrays -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),1) :: ZWORK2D +REAL, DIMENSION(:,:,:), allocatable :: ZFLXX, ZFLXY ! work arrays +REAL, DIMENSION(:,:,:), allocatable :: ZWORK2D ! REAL :: ZCSV !constant for the scalar flux @@ -187,7 +185,7 @@ INTEGER :: IKB,IKE ! mass points of the domain INTEGER :: JSV ! loop counter INTEGER :: ISV ! number of scalar var. -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground ! @@ -196,9 +194,8 @@ TYPE(TFIELDDATA) :: TZFIELD REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,& - ZTMP4_DEVICE,ZTMP5_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE,ZTMP5_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, & + ZTMP4_DEVICE, ZTMP5_DEVICE #endif ! --------------------------------------------------------------------------- @@ -231,6 +228,25 @@ if ( mppdb_initialized ) then !Check all inout arrays call Mppdb_check( prsvs, "Turb_hor_sv_flux beg:prsvs" ) end if + +allocate( zflxx(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( zflxy(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) + +allocate( zwork2d(size( psvm, 1 ), size( psvm, 2 ), 1 ) ) + +allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( ztmp2_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( ztmp3_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( ztmp4_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( ztmp5_device(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +#endif + +!$acc data create( ZFLXX, ZFLXY, ZWORK2D, ZCOEFF, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, ZTMP5_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -603,4 +619,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_SV_FLUX diff --git a/src/MNH/turb_hor_thermo_corr.f90 b/src/MNH/turb_hor_thermo_corr.f90 index a498056b10a95d5421c3c6206e5a7f1f5ca92347..4b26c5d5ad80b47e1114d825f145b095d9167554 100644 --- a/src/MNH/turb_hor_thermo_corr.f90 +++ b/src/MNH/turb_hor_thermo_corr.f90 @@ -197,25 +197,20 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSIGS ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) & - :: ZFLX,ZWORK,ZA - ! work arrays -!$acc declare create(ZFLX,ZWORK,ZA) +REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK,ZA ! work arrays ! INTEGER :: IKB,IKE,IKU ! Index values for the Beginning and End ! mass points of the domain -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground REAL :: ZTIME1, ZTIME2 TYPE(TFIELDDATA) :: TZFIELD ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: 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) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE #endif ! ! --------------------------------------------------------------------------- @@ -251,6 +246,28 @@ if ( mppdb_initialized ) then !Check all inout arrays call Mppdb_check( psigs, "Turb_hor_thermo_corr beg:psigs" ) end if + +allocate( zflx (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zwork(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( za (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp6_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +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( ZFLX, ZWORK, ZA, ZCOEFF, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, & +!$acc & ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -842,4 +859,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_THERMO_CORR diff --git a/src/MNH/turb_hor_thermo_flux.f90 b/src/MNH/turb_hor_thermo_flux.f90 index 4d047394a6377774d65f8518455e98c254790f8d..bdc9809ebdfe7c067bf301708d0eff81d295c254 100644 --- a/src/MNH/turb_hor_thermo_flux.f90 +++ b/src/MNH/turb_hor_thermo_flux.f90 @@ -207,26 +207,20 @@ REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS ! var. at t+1 -split- ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) & - :: ZFLX,ZFLXC - ! work arrays -! -!! REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZVPTV +REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZFLXC ! work arrays +!! REAL, DIMENSION(:,:,:), allocatable :: ZVPTV INTEGER :: IKB,IKE,IKU ! Index values for the Beginning and End ! mass points of the domain -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground -!$acc declare create(ZFLX,ZFLXC,ZCOEFF) ! REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: 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) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE #endif ! TYPE(TFIELDDATA) :: TZFIELD @@ -268,6 +262,28 @@ if ( mppdb_initialized ) then call Mppdb_check( prthls, "Turb_hor_thermo_flux beg:prthls" ) call Mppdb_check( prrs, "Turb_hor_thermo_flux beg:prrs" ) end if + +allocate( zflx (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zflxc(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +! allocate( zvptv(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp6_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +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( ZFLX, ZFLXC, ZCOEFF, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, & +!$acc & ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE, ZTMP8_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -1675,4 +1691,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_THERMO_FLUX diff --git a/src/MNH/turb_hor_tke.f90 b/src/MNH/turb_hor_tke.f90 index 59d40b8929090cd1085592aa477b2dc9f5bb6c56..b857a251f3ee3f221d3f0077ba21c2772b2bf82f 100644 --- a/src/MNH/turb_hor_tke.f90 +++ b/src/MNH/turb_hor_tke.f90 @@ -125,19 +125,18 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PTRH ! horizontal transport of T ! INTEGER :: IKB, IKU ! -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFF ! coefficients for the uncentred gradient ! computation near the ground ! -REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)):: ZFLX +REAL, DIMENSION(:,:,:), allocatable :: ZFLX ! !$acc declare create(ZCOEFF,ZFLX) ! REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE #endif ! --------------------------------------------------------------------------- @@ -163,6 +162,21 @@ if ( mppdb_initialized ) then !Check all inout arrays call Mppdb_check( ptrh, "Turb_hor_tke beg:ptrh" ) end if + +allocate( zflx (size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) + +allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), 1 + jpvext : 3 + jpvext ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( ztmp2_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( ztmp3_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +allocate( ztmp4_device(size( ptkem, 1 ), size( ptkem, 2 ), size( ptkem, 3 ) ) ) +#endif + +!$acc data create( ZCOEFF, ZFLX, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -422,6 +436,8 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE TURB_HOR_TKE diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index 12f8d45f1406417043cbb0af4789d8865cd78807..e11c9959921b3f8161ec1914031e82ed399e201a 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -204,32 +204,27 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) & - :: ZFLX,ZWORK - ! work arrays -! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) ::ZDIRSINZW +REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays +! +REAL, DIMENSION(:,:), allocatable :: ZDIRSINZW ! sinus of the angle between the vertical and the normal to the orography INTEGER :: IKB,IKE,IKU ! Index values for the Beginning and End ! mass points of the domain ! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: GY_U_UV_PUM -REAL, DIMENSION(SIZE(PVM,1),SIZE(PVM,2),SIZE(PVM,3)) :: GX_V_UV_PVM -!$acc declare create(ZFLX,ZWORK,ZDIRSINZW,GY_U_UV_PUM,GX_V_UV_PVM) +REAL, DIMENSION(:,:,:), allocatable :: GY_U_UV_PUM +REAL, DIMENSION(:,:,:), allocatable :: GX_V_UV_PVM ! REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP1_DEVICE -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP2_DEVICE -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP3_DEVICE -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP4_DEVICE -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP5_DEVICE -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP6_DEVICE -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP7_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE, & -!$acc & ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP5_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP6_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP7_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD ! --------------------------------------------------------------------------- @@ -269,6 +264,29 @@ if ( mppdb_initialized ) then call Mppdb_check( prvs, "Turb_hor_uv beg:prvs" ) call Mppdb_check( pdp, "Turb_hor_uv beg:pdp" ) end if + +allocate( zflx (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( zwork(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) + +allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) ) + +allocate( gy_u_uv_pum(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( gx_v_uv_pvm(size( pvm, 1 ), size( pvm, 2 ), size( pvm, 3 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( ztmp2_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( ztmp3_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( ztmp4_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( ztmp5_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( ztmp6_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( ztmp7_device(size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +#endif + +!$acc data create( ZFLX, ZWORK, ZDIRSINZW, GY_U_UV_PUM, GX_V_UV_PVM, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE, & +!$acc & ZTMP5_DEVICE, ZTMP6_DEVICE, ZTMP7_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -694,4 +712,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_UV diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index d57b580fb819dc2b0ec6907a79df99a5ffd1e573..102bc4322650b448d75762786a537d27ac91d775 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -179,26 +179,22 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) & - :: ZFLX,ZWORK - ! work arrays -! +REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays +! INTEGER :: IKB,IKE,IKU ! Index values for the Beginning and End ! mass points of the domain INTEGER :: JSV ! scalar loop counter ! -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GX_W_UW_PWM -!$acc declare create(ZFLX,ZWORK,GX_W_UW_PWM) +REAL, DIMENSION(:,:,:), allocatable :: GX_W_UW_PWM ! REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP1_DEVICE -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP2_DEVICE -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP3_DEVICE -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD ! --------------------------------------------------------------------------- @@ -231,6 +227,22 @@ if ( mppdb_initialized ) then call Mppdb_check( prws, "Turb_hor_uw beg:prws" ) call Mppdb_check( pdp, "Turb_hor_uw beg:pdp" ) end if + +allocate( zflx (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( zwork(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) + +allocate( gx_w_uw_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( ztmp2_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( ztmp3_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( ztmp4_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +#endif + +!$acc data create( ZFLX, ZWORK, GX_W_UW_PWM, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -506,4 +518,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_UW diff --git a/src/MNH/turb_hor_vw.f90 b/src/MNH/turb_hor_vw.f90 index 21a5965d633854df9deb7b6559e495aec37b2a3e..8f92eb5987a5621a03597db7db609b0d1540d6dd 100644 --- a/src/MNH/turb_hor_vw.f90 +++ b/src/MNH/turb_hor_vw.f90 @@ -177,29 +177,22 @@ REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDP ! TKE production terms ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) & - :: ZFLX,ZWORK - ! work arrays -!$acc declare create(ZFLX) -!$acc declare device_resident(ZWORK) -! -!! REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZVPTV +REAL, DIMENSION(:,:,:), allocatable :: ZFLX,ZWORK ! work arrays +!! REAL, DIMENSION(:,:,:), allocatable :: ZVPTV INTEGER :: IKB,IKE,IKU ! Index values for the Beginning and End ! mass points of the domain INTEGER :: JSV ! scalar loop counter ! -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: GY_W_VW_PWM -!$acc declare create(GY_W_VW_PWM) +REAL, DIMENSION(:,:,:), allocatable :: GY_W_VW_PWM ! REAL :: ZTIME1, ZTIME2 ! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP1_DEVICE -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP2_DEVICE -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP3_DEVICE -REAL, DIMENSION(SIZE(PWM,1),SIZE(PWM,2),SIZE(PWM,3)) :: ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP2_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP3_DEVICE +REAL, DIMENSION(:,:,:), allocatable :: ZTMP4_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD ! --------------------------------------------------------------------------- @@ -231,6 +224,22 @@ if ( mppdb_initialized ) then call Mppdb_check( prws, "Turb_hor_vw beg:prws" ) call Mppdb_check( pdp, "Turb_hor_vw beg:pdp" ) end if + +allocate( zflx (size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( zwork(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) + +allocate( gy_w_vw_pwm(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( ztmp2_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( ztmp3_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +allocate( ztmp4_device(size( pwm, 1 ), size( pwm, 2 ), size( pwm, 3 ) ) ) +#endif + +!$acc data create( ZFLX, ZWORK, GY_W_VW_PWM, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ) + ! !* 1. PRELIMINARY COMPUTATIONS ! ------------------------ @@ -544,4 +553,6 @@ end if !$acc end data +!$acc end data + END SUBROUTINE TURB_HOR_VW diff --git a/src/MNH/turb_ver.f90 b/src/MNH/turb_ver.f90 index a6ac40f97a817a518a698ad5e245f8056d853ad0..72f71a8327d220b68018461b7c4034f30de70ea2 100644 --- a/src/MNH/turb_ver.f90 +++ b/src/MNH/turb_ver.f90 @@ -219,7 +219,7 @@ END MODULE MODI_TURB_VER !! -------- !! GX_U_M, GY_V_M, GZ_W_M : cartesian gradient operators !! GX_U_UW,GY_V_VW (X,Y,Z) represent the direction of the gradient -!! _(M,U,...)_ represent the localization of the +!! _(M,U,...)_ represent the localization of the !! field to be derivated !! _(M,UW,...) represent the localization of the !! field derivated @@ -440,7 +440,7 @@ REAL, DIMENSION(:,:,:,:),INTENT(OUT) :: PWSV ! scalar flux ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & +REAL, DIMENSION(:,:,:), allocatable :: & ZBETA, & ! buoyancy coefficient ZSQRT_TKE,& ! sqrt(e) ZDTH_DZ, & ! d(th)/dz @@ -462,7 +462,7 @@ REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & ZTHLP, & ! guess of potential temperature due to vert. turbulent flux ZRP ! guess of total water due to vert. turbulent flux -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3),NSV) :: & +REAL, DIMENSION(:,:,:,:), allocatable :: & ZPSI_SV, & ! Prandtl number for scalars ZREDS1, & ! 1D Redeslperger number R_sv ZRED2THS, & ! 3D Redeslperger number R*2_thsv @@ -490,12 +490,7 @@ TYPE(TFIELDDATA) :: TZFIELD !$acc & PFWTH, PFWR, PFTH2, PFR2, PFTHR, PBL_DEPTH, & !$acc & PSBL_DEPTH, PLMO, & !$acc & PRUS, PRVS, PRWS, PRTHLS, PRRS, PRSVS, & -!$acc & PDP, PTP, PSIGS, PWTH, PWRC, PWSV ) & - -!$acc & create( ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, ZRED2R3, ZRED2THR3,& -!$acc & ZBLL_O_E, ZETHETA, ZEMOIST, ZREDTH1, ZREDR1, & -!$acc & ZPHI3, ZPSI3, ZD, ZWTHV, ZWU, ZWV, ZTHLP, ZRP, & -!$acc & ZPSI_SV, ZREDS1, ZRED2THS, ZRED2RS ) +!$acc & PDP, PTP, PSIGS, PWTH, PWRC, PWSV ) if ( mppdb_initialized ) then !Check all in arrays @@ -545,7 +540,6 @@ if ( mppdb_initialized ) then !Check all inout arrays call Mppdb_check( pbl_depth, "Turb_ver beg:pbl_depth" ) call Mppdb_check( psbl_depth, "Turb_ver beg:psbl_depth" ) - call Mppdb_check( plmo, "Turb_ver beg:plmo" ) call Mppdb_check( prus, "Turb_ver beg:prus" ) call Mppdb_check( prvs, "Turb_ver beg:prvs" ) call Mppdb_check( prws, "Turb_ver beg:prws" ) @@ -553,6 +547,38 @@ if ( mppdb_initialized ) then call Mppdb_check( prsvs, "Turb_ver beg:prsvs" ) call Mppdb_check( prrs, "Turb_ver beg:prrs" ) end if + +allocate( zbeta (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zsqrt_tke(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zdth_dz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zdr_dz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zred2th3 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zred2r3 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zred2thr3(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zbll_o_e (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zetheta (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zemoist (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zredth1 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zredr1 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zphi3 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zpsi3 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zd (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zwthv (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zwu (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zwv (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zthlp (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zrp (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +allocate( zpsi_sv (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) ) +allocate( zreds1 (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) ) +allocate( zred2ths(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) ) +allocate( zred2rs (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ), nsv ) ) + +!$acc data create( ZBETA, ZSQRT_TKE, ZDTH_DZ, ZDR_DZ, ZRED2TH3, ZRED2R3, ZRED2THR3,& +!$acc & ZBLL_O_E, ZETHETA, ZEMOIST, ZREDTH1, ZREDR1, & +!$acc & ZPHI3, ZPSI3, ZD, ZWTHV, ZWU, ZWV, ZTHLP, ZRP, & +!$acc & ZPSI_SV, ZREDS1, ZRED2THS, ZRED2RS ) + ! !* 1. PRELIMINARIES ! ------------- @@ -822,7 +848,6 @@ if ( mppdb_initialized ) then !Check all inout arrays call Mppdb_check( pbl_depth, "Turb_ver end:pbl_depth" ) call Mppdb_check( psbl_depth, "Turb_ver end:psbl_depth" ) - call Mppdb_check( plmo, "Turb_ver end:plmo" ) call Mppdb_check( prus, "Turb_ver end:prus" ) call Mppdb_check( prvs, "Turb_ver end:prvs" ) call Mppdb_check( prws, "Turb_ver end:prws" ) @@ -840,5 +865,7 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- END SUBROUTINE TURB_VER diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index 0649f04cf68103bc860631b2245d93fda9768cba..c8aab0d8027d6a6a775c014b4d533baf95991140 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -376,11 +376,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDP ! Dynamic TKE production t !* 0.2 declaration of local variables ! ! -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2)) :: ZDIRSINZW ! sinus of the angle +REAL, DIMENSION(:,:), allocatable :: ZDIRSINZW ! sinus of the angle ! between the normal and the vertical at the surface -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),1):: ZCOEFS ! coeff. for the +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFS ! coeff. for the ! implicit scheme for the wind at the surface -REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: & +REAL, DIMENSION(:,:,:), allocatable :: & ZA, & ! under diagonal elements of the tri-diagonal matrix involved ! in the temporal implicit scheme (also used to store coefficient ! J in Section 5) @@ -396,7 +396,7 @@ INTEGER :: IIB,IIE, & ! I index values for the Beginning and End INTEGER :: IKT ! array size in k direction INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain INTEGER :: JSV ! scalar loop counter -REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1) :: ZCOEFFLXU, & +REAL, DIMENSION(:,:,:), allocatable :: ZCOEFFLXU, & ZCOEFFLXV, ZUSLOPEM, ZVSLOPEM ! coefficients for the surface flux ! evaluation and copy of PUSLOPEM and @@ -405,11 +405,8 @@ INTEGER :: IIU,IJU ! size of array in x,y,z directions ! REAL :: ZTIME1, ZTIME2 ! -!$acc declare create(ZDIRSINZW,ZCOEFS,ZA,ZRES,ZFLXZ,ZSOURCE,ZKEFF,ZCOEFFLXU,ZCOEFFLXV,ZUSLOPEM,ZVSLOPEM) -! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- @@ -433,7 +430,33 @@ if ( mppdb_initialized ) then call Mppdb_check( pwv, "Turb_ver_dyn_flux end:pwv" ) call Mppdb_check( pdp, "Turb_ver_dyn_flux end:pdp" ) end if -! + +allocate( zdirsinzw(size( pum, 1 ), size( pum, 2 ) ) ) + +allocate( zcoefs (size( pum, 1 ), size( pum, 2 ), 1 ) ) + +allocate( za (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( zres (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( zflxz (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( zsource (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) +allocate( zkeff (size( pum, 1 ), size( pum, 2 ), size( pum, 3 ) ) ) + +allocate( zcoefflxu(size( pdzz, 1 ), size( pdzz, 2 ), 1 ) ) +allocate( zcoefflxv(size( pdzz, 1 ), size( pdzz, 2 ), 1 ) ) +allocate( zuslopem (size( pdzz, 1 ), size( pdzz, 2 ), 1 ) ) +allocate( zvslopem (size( pdzz, 1 ), size( pdzz, 2 ), 1 ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +#endif + +!$acc data create( zdirsinzw, zcoefs, za, zres, zflxz, zsource, zkeff, zcoefflxu, zcoefflxv, zuslopem, zvslopem, & +!$acc & ztmp1_device, ztmp2_device, ztmp3_device, ztmp4_device ) + + ! !* 1. PRELIMINARIES ! ------------- ZA=XUNDEF @@ -1337,6 +1360,8 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- ! END SUBROUTINE TURB_VER_DYN_FLUX diff --git a/src/MNH/turb_ver_sv_corr.f90 b/src/MNH/turb_ver_sv_corr.f90 index 1f73e0c12079375af14c1300faff2fa3f14a0a26..cdac705065b008b6669450c203d04420c9e671e3 100644 --- a/src/MNH/turb_ver_sv_corr.f90 +++ b/src/MNH/turb_ver_sv_corr.f90 @@ -161,8 +161,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PPSI_SV ! Inv.Turb.Sch.for scalars !* 0.2 declaration of local variables ! ! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & - ZA, ZFLXZ +REAL, DIMENSION(:,:,:), allocatable :: ZA, ZFLXZ ! REAL :: ZCSV !constant for the scalar flux ! @@ -199,6 +198,9 @@ if ( mppdb_initialized ) then call Mppdb_check( ppsi_sv, "Turb_ver_sv_corr beg:ppsi_sv" ) end if +allocate( za (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( zflxz(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) + CALL SECOND_MNH(ZTIME1) ! IF(LBLOWSNOW) THEN diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90 index fab9ce46ef8304945c9fe223f1d75ced66905d40..6a2f8fcba1a92ee14544c1bc0ef0b49f053c1331 100644 --- a/src/MNH/turb_ver_sv_flux.f90 +++ b/src/MNH/turb_ver_sv_flux.f90 @@ -341,7 +341,7 @@ REAL, DIMENSION(:,:,:,:), INTENT(OUT) :: PWSV ! scalar flux !* 0.2 declaration of local variables ! ! -REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & +REAL, DIMENSION(:,:,:), allocatable :: & ZA, & ! under diagonal elements of the tri-diagonal matrix involved ! in the temporal implicit scheme (also used to store coefficient ! J in Section 5) @@ -390,6 +390,12 @@ if ( mppdb_initialized ) then call Mppdb_check( prsvs, "Turb_ver_sv_flux beg:prsvs" ) end if +allocate( za (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( zres (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( zflxz (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( zsource(size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) +allocate( zkeff (size( psvm, 1 ), size( psvm, 2 ), size( psvm, 3 ) ) ) + IKB=KKA+JPVEXT_TURB*KKL IKE=KKU-JPVEXT_TURB*KKL IKT=SIZE(PSVM,3) diff --git a/src/MNH/turb_ver_thermo_corr.f90 b/src/MNH/turb_ver_thermo_corr.f90 index 567c092ac9417445bbc136c99c38d1e0c4ffb0be..4a34347bc1887115706e0b7c625202b9872ee9d3 100644 --- a/src/MNH/turb_ver_thermo_corr.f90 +++ b/src/MNH/turb_ver_thermo_corr.f90 @@ -422,15 +422,12 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! Vert. part of Sigma_s at !* 0.2 declaration of local variables ! ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZA, & ! work variable for wrc +REAL, DIMENSION(:,:,:), allocatable :: & ZFLXZ, & ! vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) ZDFDDTDZ, & ! dF/d(dTh/dz) - ZDFDDRDZ, & ! dF/d(dr/dz) - Z3RDMOMENT ! 3 order term in flux or variance equation + ZDFDDRDZ ! dF/d(dr/dz) INTEGER :: IKB,IKE ! I index values for the Beginning and End ! mass points of the domain in the 3 direct. INTEGER :: I1,I2 ! For ZCOEFF allocation @@ -447,11 +444,9 @@ LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' ! -!$acc declare create(ZA,ZFLXZ,ZSOURCE,ZKEFF,ZF,ZDFDDTDZ,ZDFDDRDZ,Z3RDMOMENT,ZCOEFF) -! #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP5_DEVICE,ZTMP6_DEVICE,ZTMP7_DEVICE,ZTMP8_DEVICE +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 @@ -527,7 +522,29 @@ IKE=KKU-JPVEXT_TURB*KKL I1=MIN(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL) I2=MAX(KKA+JPVEXT_TURB*KKL,KKA+JPVEXT_TURB*KKL+2*KKL) -ALLOCATE(ZCOEFF(SIZE(PDZZ,1),SIZE(PDZZ,2),I1:I2)) +allocate( zflxz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zkeff (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zf (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zdfddtdz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zdfddrdz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +allocate( zcoeff(size( pdzz, 1 ), size( pdzz, 2 ), i1 : i2 ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp5_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp6_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +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 ) + ! GUSERV = (KRR/=0) ! @@ -1440,11 +1457,6 @@ END IF !$acc end kernels END IF -! -! 4.6 Deallocate -! - DEALLOCATE(ZCOEFF) - if ( mppdb_initialized ) then !Check all out arrays call Mppdb_check( psigs, "Turb_ver_thermo_corr beg:psigs" ) @@ -1452,5 +1464,7 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- END SUBROUTINE TURB_VER_THERMO_CORR diff --git a/src/MNH/turb_ver_thermo_flux.f90 b/src/MNH/turb_ver_thermo_flux.f90 index e650cb5695251e1073fb774e5f0d36f1e1984752..06dc998bdb9880e50070decbe042ef967e800ea7 100644 --- a/src/MNH/turb_ver_thermo_flux.f90 +++ b/src/MNH/turb_ver_thermo_flux.f90 @@ -451,20 +451,10 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PWRC ! cloud water flux ! !* 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: & - ZA, & ! work variable for wrc or LES computation - ZFLXZ, & ! vertical flux of the treated variable - ZSOURCE, & ! source of evolution for the treated variable - ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) - ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) - ZDFDDTDZ, & ! dF/d(dTh/dz) - ZDFDDRDZ, & ! dF/d(dr/dz) - Z3RDMOMENT ! 3 order term in flux or variance equation -!$acc declare create(ZA,ZFLXZ,ZSOURCE,ZKEFF,ZF,ZDFDDTDZ,ZDFDDRDZ,Z3RDMOMENT) INTEGER :: IKB,IKE ! I index values for the Beginning and End ! mass points of the domain in the 3 direct. INTEGER :: IKT ! array size in k direction -INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain +INTEGER :: IKTB,IKTE ! start, end of k loops in physical domain ! REAL :: ZTIME1, ZTIME2 ! @@ -476,9 +466,17 @@ LOGICAL :: GFR2 ! flag to use w'r'2 LOGICAL :: GFWR ! flag to use w'2r' LOGICAL :: GFTHR ! flag to use w'th'r' ! +REAL, DIMENSION(:,:,:), allocatable :: & + ZA, & ! work variable for wrc or LES computation + ZFLXZ, & ! vertical flux of the treated variable + ZSOURCE, & ! source of evolution for the treated variable + ZKEFF, & ! effectif diffusion coeff = LT * SQRT( TKE ) + ZF, & ! Flux in dTh/dt =-dF/dz (evaluated at t-1)(or rt instead of Th) + ZDFDDTDZ, & ! dF/d(dTh/dz) + ZDFDDRDZ, & ! dF/d(dr/dz) + Z3RDMOMENT ! 3 order term in flux or variance equation #ifdef MNH_OPENACC -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE -!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE) +REAL, DIMENSION(:,:,:), allocatable :: ZTMP1_DEVICE,ZTMP2_DEVICE,ZTMP3_DEVICE,ZTMP4_DEVICE #endif TYPE(TFIELDDATA) :: TZFIELD !---------------------------------------------------------------------------- @@ -547,6 +545,26 @@ if ( mppdb_initialized ) then call Mppdb_check( prthls, "Turb_ver_thermo_flux beg:prthls" ) call Mppdb_check( prrs, "Turb_ver_thermo_flux beg:prrs" ) end if + +allocate( za (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zflxz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zsource (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zkeff (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zf (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zdfddtdz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( zdfddrdz (size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( z3rdmoment(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) + +#ifdef MNH_OPENACC +allocate( ztmp1_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp2_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp3_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +allocate( ztmp4_device(size( pthlm, 1 ), size( pthlm, 2 ), size( pthlm, 3 ) ) ) +#endif + +!$acc data create( ZA, ZFLXZ, ZSOURCE, ZKEFF, ZF, ZDFDDTDZ, ZDFDDRDZ, Z3RDMOMENT, & +!$acc & ZTMP1_DEVICE, ZTMP2_DEVICE, ZTMP3_DEVICE, ZTMP4_DEVICE ) + ! !* 1. PRELIMINARIES ! ------------- @@ -1449,5 +1467,7 @@ end if !$acc end data +!$acc end data + !---------------------------------------------------------------------------- END SUBROUTINE TURB_VER_THERMO_FLUX