diff --git a/src/MNH/gradient_u.f90 b/src/MNH/gradient_u.f90 index 20526e75efcfa6028c3bf69cfeda117598752815..9cd43ea9c10def9c3319449a72b3b8de99ba6450 100644 --- a/src/MNH/gradient_u.f90 +++ b/src/MNH/gradient_u.f90 @@ -28,6 +28,22 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGX_U_M ! result mass point END FUNCTION GX_U_M ! ! +#ifdef _OPENACC +SUBROUTINE GX_U_M_DEVICE(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX,PGX_U_M_DEVICE) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +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 +!$acc declare present(PA,PDXX,PDZZ,PDZX,PGX_U_M_DEVICE) +! +END SUBROUTINE GX_U_M_DEVICE +#endif +! +! FUNCTION GY_U_UV(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes @@ -42,6 +58,22 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGY_U_UV ! result UV point END FUNCTION GY_U_UV ! ! +#ifdef _OPENACC +SUBROUTINE GY_U_UV_DEVICE(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY,PGY_U_UV_DEVICE) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +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 +!$acc declare present(PA,PDYY,PDZZ,PDZY,PGY_U_UV_DEVICE) +! +END SUBROUTINE GY_U_UV_DEVICE +#endif +! +! FUNCTION GZ_U_UW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_U_UW) ! INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes @@ -53,6 +85,21 @@ REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: PGZ_U_UW ! result UW point ! END FUNCTION GZ_U_UW ! +! +#ifdef _OPENACC +SUBROUTINE GZ_U_UW_DEVICE(KKA,KKU,KL,PA,PDZZ,PGZ_U_UW_DEVICE) +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +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 +!$acc declare present(PA,PDZZ,PGZ_U_UW_DEVICE) +! +END SUBROUTINE GZ_U_UW_DEVICE +#endif +! +! END INTERFACE ! END MODULE MODI_GRADIENT_U @@ -158,6 +205,74 @@ END IF END FUNCTION GX_U_M ! ! +#ifdef _OPENACC +! ####################################################### + SUBROUTINE GX_U_M_DEVICE(KKA,KKU,KL,PA,PDXX,PDZZ,PDZX,PGX_U_M_DEVICE) +! ####################################################### +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN_DEVICE +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX ! metric coefficient dxx +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +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 +!$acc declare present(PA,PDXX,PDZZ,PDZX,PGX_U_M_DEVICE) +! +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) +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GX_U_M_DEVICE +! -------------------- +IF (.NOT. LFLAT) THEN + CALL DXF_DEVICE(PA,ZTMP1_DEVICE) + CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP2_DEVICE) + !$acc kernels + ZTMP3_DEVICE = PDZX * ZTMP2_DEVICE + !$acc end kernels + CALL MXF_DEVICE(ZTMP3_DEVICE,ZTMP2_DEVICE) + !$acc kernels + ZTMP3_DEVICE = ZTMP2_DEVICE / PDZZ + !$acc end kernels + CALL MZF_DEVICE(KKA,KKU,KL,ZTMP3_DEVICE,ZTMP2_DEVICE) + CALL MXF_DEVICE(PDXX,ZTMP3_DEVICE) + !$acc kernels + PGX_U_M_DEVICE(:,:,:)= ( ZTMP1_DEVICE - ZTMP2_DEVICE ) / ZTMP3_DEVICE + !$acc end kernels +ELSE + CALL DXF_DEVICE(PA,ZTMP1_DEVICE) + CALL MXF_DEVICE(PDXX,ZTMP2_DEVICE) + !$acc kernels + PGX_U_M_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE + !$acc end kernels +END IF +! +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE GX_U_M_DEVICE +#endif +! +! ! ######################################################### FUNCTION GY_U_UV(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY) RESULT(PGY_U_UV) ! ######################################################### @@ -256,6 +371,76 @@ END IF END FUNCTION GY_U_UV ! ! +#ifdef _OPENACC +! ######################################################### + SUBROUTINE GY_U_UV_DEVICE(KKA,KKU,KL,PA,PDYY,PDZZ,PDZY,PGY_U_UV_DEVICE) +! ######################################################### +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN_DEVICE +USE MODD_CONF +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDYY ! metric coefficient dyy +REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ ! metric coefficient dzz +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 +!$acc declare present(PA,PDYY,PDZZ,PDZY,PGY_U_UV_DEVICE) +! +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) +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GY_U_UV_DEVICE +! --------------------- +! +IF (.NOT. LFLAT) THEN + CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP1_DEVICE) + CALL MXM_DEVICE(PDZZ,ZTMP2_DEVICE) + !$acc kernels + ZTMP3_DEVICE = ZTMP1_DEVICE/ZTMP2_DEVICE + !$acc end kernels + CALL MYM_DEVICE(ZTMP3_DEVICE,ZTMP1_DEVICE) + CALL MXM_DEVICE(PDZY,ZTMP2_DEVICE) + !$acc kernels + ZTMP3_DEVICE = ZTMP1_DEVICE*ZTMP2_DEVICE + !$acc end kernels + CALL MZF_DEVICE(KKA,KKU,KL, ZTMP3_DEVICE,ZTMP2_DEVICE ) + CALL DYM_DEVICE(PA,ZTMP1_DEVICE) + CALL MXM_DEVICE(PDYY,ZTMP3_DEVICE) + !$acc kernels + PGY_U_UV_DEVICE(:,:,:)= ( ZTMP1_DEVICE - ZTMP2_DEVICE ) / ZTMP3_DEVICE + !$acc end kernels +ELSE + CALL DYM_DEVICE(PA,ZTMP1_DEVICE) + CALL MXM_DEVICE(PDYY,ZTMP2_DEVICE) + !$acc kernels + PGY_U_UV_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE + !$acc end kernels +END IF +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE GY_U_UV_DEVICE +#endif +! +! ! ####################################################### FUNCTION GZ_U_UW(KKA,KKU,KL,PA,PDZZ) RESULT(PGZ_U_UW) ! ####################################################### @@ -337,3 +522,51 @@ PGZ_U_UW(:,:,:)= DZM(KKA,KKU,KL,PA) / MXM(PDZZ) !---------------------------------------------------------------------------- ! END FUNCTION GZ_U_UW +! +! +#ifdef _OPENACC +! ####################################################### + SUBROUTINE GZ_U_UW_DEVICE(KKA,KKU,KL,PA,PDZZ,PGZ_U_UW_DEVICE) +! ####################################################### +! +!* 0. DECLARATIONS +! +! +USE MODI_SHUMAN_DEVICE +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments and result +! +INTEGER, INTENT(IN) :: KKA, KKU ! near ground and uppest atmosphere array indexes +INTEGER, INTENT(IN) :: KL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +REAL, DIMENSION(:,:,:), INTENT(IN) :: PA ! variable at the U point +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 +!$acc declare present(PA,PDZZ,PGZ_U_UW_DEVICE) +! +REAL, DIMENSION(SIZE(PA,1),SIZE(PA,2),SIZE(PA,3)) :: ZTMP1_DEVICE,ZTMP2_DEVICE +!$acc declare create(ZTMP1_DEVICE,ZTMP2_DEVICE) +! +! +!* 0.2 declaration of local variables +! +! NONE +! +!---------------------------------------------------------------------------- +! +!* 1. DEFINITION of GZ_U_UW_DEVICE +! --------------------- +! +CALL DZM_DEVICE(KKA,KKU,KL,PA,ZTMP1_DEVICE) +CALL MXM_DEVICE(PDZZ,ZTMP2_DEVICE) +!$acc kernels +PGZ_U_UW_DEVICE(:,:,:)= ZTMP1_DEVICE / ZTMP2_DEVICE +!$acc end kernels +! +!---------------------------------------------------------------------------- +! +END SUBROUTINE GZ_U_UW_DEVICE +#endif diff --git a/src/MNH/turb_hor_dyn_corr.f90 b/src/MNH/turb_hor_dyn_corr.f90 index 9d1174c92020ef299feb855abaa13001885cc440..f74af2dd66eab455f59056b4fb52b41ac3b6f496 100644 --- a/src/MNH/turb_hor_dyn_corr.f90 +++ b/src/MNH/turb_hor_dyn_corr.f90 @@ -44,6 +44,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion do REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY ! Metric coefficients +!$acc declare present(PDXX, PDYY, PDZZ, PDZX, PDZY) REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus along z directions at surface w-point @@ -63,8 +64,11 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes ! ! Variables at t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM +!$acc declare copyin(PUM,PVM,PWM,PTHLM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +!$acc copyin(PRM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +!$acc copyin(PSVM) REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the ! maximum slope direction REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the @@ -192,6 +196,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PK ! Turbulent diffusion do REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY ! Metric coefficients +!$acc declare present(PDXX, PDYY, PDZZ, PDZX, PDZY) REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! vertical grid REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus along z directions at surface w-point @@ -211,7 +216,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes ! ! Variables at t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM -!$acc copyin(PTHLM) +!$acc declare copyin(PUM,PVM,PWM,PTHLM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM !$acc copyin(PRM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM @@ -251,6 +256,7 @@ CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file 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 +!$acc declare create(GX_U_M_PUM) 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 @@ -290,7 +296,12 @@ IKU = SIZE(PUM,3) ! ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) ! +#ifndef _OPENACC GX_U_M_PUM = GX_U_M(1,IKU,1,PUM,PDXX,PDZZ,PDZX) +#else +CALL GX_U_M_DEVICE(1,IKU,1,PUM,PDXX,PDZZ,PDZX,GX_U_M_PUM) +!$acc update self(GX_U_M_PUM) +#endif IF (.NOT. L2D) THEN GY_V_M_PVM = GY_V_M(1,IKU,1,PVM,PDYY,PDZZ,PDZY) END IF diff --git a/src/MNH/turb_hor_uv.f90 b/src/MNH/turb_hor_uv.f90 index ea8dd97b6123ead0757c17fbcf8f7755b4a09d3e..045a017f5a6ced5354ce36aaa7480b4811ca231b 100644 --- a/src/MNH/turb_hor_uv.f90 +++ b/src/MNH/turb_hor_uv.f90 @@ -46,6 +46,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY ! Metric coefficients +!$acc declare present(PDXX, PDYY, PDZZ, PDZX, PDZY) REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus along z directions at surface w-point REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle @@ -64,6 +65,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes ! ! Variables at t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM +!$acc declare copyin(PUM,PVM) REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the ! maximum slope direction REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the @@ -175,6 +177,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PINV_PDZZ ! 1./PDZZ REAL, DIMENSION(:,:,:), INTENT(IN) :: PMZM_PRHODJ ! MZM(PRHODJ) REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX, PDYY, PDZZ, PDZX, PDZY ! Metric coefficients +!$acc declare present(PDXX, PDYY, PDZZ, PDZX, PDZY) REAL, DIMENSION(:,:), INTENT(IN) :: PDIRCOSZW ! Director Cosinus along z directions at surface w-point REAL, DIMENSION(:,:), INTENT(IN) :: PCOSSLOPE ! cosinus of the angle @@ -193,6 +196,7 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes ! ! Variables at t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM +!$acc declare copyin(PUM,PVM) REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the ! maximum slope direction REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the @@ -223,8 +227,14 @@ CHARACTER (LEN=16) :: YRECFM ! Name of the desired field in LFIFM file ! 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(GY_U_UV_PUM) ! REAL :: ZTIME1, ZTIME2 +! +#ifdef _OPENACC +REAL, DIMENSION(SIZE(PUM,1),SIZE(PUM,2),SIZE(PUM,3)) :: ZTMP1_DEVICE +!$acc declare create(ZTMP1_DEVICE) +#endif ! --------------------------------------------------------------------------- ! !* 1. PRELIMINARY COMPUTATIONS @@ -239,10 +249,18 @@ ILENCH=LEN(YCOMMENT) ! ZDIRSINZW(:,:) = SQRT( 1. - PDIRCOSZW(:,:)**2 ) ! +#ifndef _OPENACC GX_V_UV_PVM = GX_V_UV(1,IKU,1,PVM,PDXX,PDZZ,PDZX) IF (.NOT. L2D) THEN GY_U_UV_PUM = GY_U_UV(1,IKU,1,PUM,PDYY,PDZZ,PDZY) END IF +#else +GX_V_UV_PVM = GX_V_UV(1,IKU,1,PVM,PDXX,PDZZ,PDZX) +IF (.NOT. L2D) THEN + CALL GY_U_UV_DEVICE(1,IKU,1,PUM,PDYY,PDZZ,PDZY,GY_U_UV_PUM) +!$acc update self(GY_U_UV_PUM) +END IF +#endif ! ! !* 12. < U'V'> @@ -359,9 +377,17 @@ END IF ! IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) +#ifndef _OPENACC CALL LES_MEAN_SUBGRID( MXF(MYF(ZFLX)), X_LES_SUBGRID_UV ) CALL LES_MEAN_SUBGRID( MXF(MYF(GY_U_UV(1,IKU,1,PUM,PDYY,PDZZ,PDZY)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(1,IKU,1,PVM,PDXX,PDZZ,PDZX)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) +#else + CALL LES_MEAN_SUBGRID( MXF(MYF(ZFLX)), X_LES_SUBGRID_UV ) + CALL GY_U_UV_DEVICE(1,IKU,1,PUM,PDYY,PDZZ,PDZY,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + CALL LES_MEAN_SUBGRID( MXF(MYF(ZTMP1_DEVICE*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MXF(MYF(GX_V_UV(1,IKU,1,PVM,PDXX,PDZZ,PDZX)*ZFLX)), X_LES_RES_ddxa_V_SBG_UaV , .TRUE.) +#endif CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF diff --git a/src/MNH/turb_hor_uw.f90 b/src/MNH/turb_hor_uw.f90 index 85e587a9553ae5ff3df1ccc72c3a5ca239e3dcc1..b268654e0c6e9b41075835ac5908669387387d91 100644 --- a/src/MNH/turb_hor_uw.f90 +++ b/src/MNH/turb_hor_uw.f90 @@ -52,7 +52,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT ! ! Variables at t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PWM,PTHLM -!$acc declare copyin(PTHLM) +!$acc declare copyin(PUM,PWM,PTHLM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM !$acc declare copyin(PRM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM @@ -177,7 +177,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! ref. state VPT ! ! Variables at t-1 REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PWM,PTHLM -!$acc declare copyin(PTHLM) +!$acc declare copyin(PUM,PWM,PTHLM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM !$acc declare copyin(PRM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM @@ -273,8 +273,14 @@ IF (KSPLT==1) THEN ! !Contribution to the dynamic production of TKE: ! +#ifndef _OPENACC ZWORK(:,:,:) =-MZF(1,IKU,1, MXF( & ZFLX *( GZ_U_UW(1,IKU,1,PUM,PDZZ) + GX_W_UW_PWM ) ) ) +#else + CALL GZ_U_UW_DEVICE(1,IKU,1,PUM,PDZZ,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + ZWORK(:,:,:) =-MZF(1,IKU,1, MXF( ZFLX *( ZTMP1_DEVICE + GX_W_UW_PWM ) ) ) +#endif ! ! ! evaluate the dynamic production at w(IKB+1) in PDP(IKB) @@ -300,10 +306,10 @@ END IF ! IF (LLES_CALL .AND. KSPLT==1) THEN CALL SECOND_MNH(ZTIME1) +#ifndef _OPENACC CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(ZFLX)), X_LES_SUBGRID_WU , .TRUE. ) CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GZ_U_UW(1,IKU,1,PUM,PDZZ)*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GX_W_UW_PWM*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) -#ifndef _OPENACC CALL LES_MEAN_SUBGRID( MXF(GX_M_U(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX)*MZF(1,IKU,1,ZFLX)),& X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) IF (KRR>=1) THEN @@ -315,6 +321,11 @@ IF (LLES_CALL .AND. KSPLT==1) THEN X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) , .TRUE.) END DO #else + CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(ZFLX)), X_LES_SUBGRID_WU , .TRUE. ) + CALL GZ_U_UW_DEVICE(1,IKU,1,PUM,PDZZ,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(ZTMP1_DEVICE*ZFLX)), X_LES_RES_ddxa_U_SBG_UaU , .TRUE.) + CALL LES_MEAN_SUBGRID( MZF(1,IKU,1,MXF(GX_W_UW_PWM*ZFLX)), X_LES_RES_ddxa_W_SBG_UaW , .TRUE.) CALL GX_M_U_DEVICE(1,IKU,1,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) !$acc update self(ZTMP1_DEVICE) CALL LES_MEAN_SUBGRID( MXF(ZTMP1_DEVICE*MZF(1,IKU,1,ZFLX)) , X_LES_RES_ddxa_Thl_SBG_UaW , .TRUE.) diff --git a/src/MNH/turb_ver_dyn_flux.f90 b/src/MNH/turb_ver_dyn_flux.f90 index 72e541e95553a26a69d1e5b8eaf4dfaf9d3d195f..a082df2ab814157d1d329b961d27a1a57e033e82 100644 --- a/src/MNH/turb_ver_dyn_flux.f90 +++ b/src/MNH/turb_ver_dyn_flux.f90 @@ -68,9 +68,11 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM,PTHLM ! Wind at t-Delta t -!$acc declare copyin(PTHLM) +!$acc declare copyin(PUM,PTHLM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +!$acc declare copyin(PRM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +!$acc declare copyin(PSVM) REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the ! maximum slope direction REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the @@ -358,9 +360,11 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PTAU33M ! <ww> in the same axes ! REAL, DIMENSION(:,:,:), INTENT(IN) :: PUM,PVM,PWM, PTHLM ! Wind at t-Delta t -!$acc declare copyin(PTHLM) +!$acc declare copyin(PUM,PTHLM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM +!$acc declare copyin(PRM) REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVM +!$acc declare copyin(PSVM) REAL, DIMENSION(:,:), INTENT(IN) :: PUSLOPEM ! wind component along the ! maximum slope direction REAL, DIMENSION(:,:), INTENT(IN) :: PVSLOPEM ! wind component along the @@ -545,7 +549,13 @@ PWU(:,:,:) = ZFLXZ(:,:,:) ! Contribution to the dynamic production of TKE ! compute the dynamic production at the mass point ! +#ifndef _OPENACC PDP(:,:,:) = - MZF(KKA,KKU,KKL, MXF ( ZFLXZ * GZ_U_UW(KKA,KKU,KKL,PUM,PDZZ) ) ) +#else +CALL GZ_U_UW_DEVICE(KKA,KKU,KKL,PUM,PDZZ,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) +PDP(:,:,:) = - MZF(KKA,KKU,KKL, MXF ( ZFLXZ * ZTMP1_DEVICE ) ) +#endif ! ! evaluate the dynamic production at w(IKB+KKL) in PDP(IKB) PDP(:,:,IKB:IKB) = - MXF ( & @@ -558,8 +568,14 @@ PDP(:,:,IKB:IKB) = - MXF ( IF (LLES_CALL) THEN CALL SECOND_MNH(ZTIME1) CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(ZFLXZ)), X_LES_SUBGRID_WU ) +#ifndef _OPENACC CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(GZ_U_UW(KKA,KKU,KKL,PUM,PDZZ) & & *ZFLXZ)), X_LES_RES_ddxa_U_SBG_UaU ) +#else + CALL GZ_U_UW_DEVICE(KKA,KKU,KKL,PUM,PDZZ,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + CALL LES_MEAN_SUBGRID( MZF(KKA,KKU,KKL,MXF(ZTMP1_DEVICE*ZFLXZ)), X_LES_RES_ddxa_U_SBG_UaU ) +#endif CALL LES_MEAN_SUBGRID( XCMFS * ZKEFF, X_LES_SUBGRID_Km ) CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 @@ -612,11 +628,6 @@ IF(HTURBDIM=='3DIM') THEN #ifndef _OPENACC CALL LES_MEAN_SUBGRID( MXF(GX_M_U(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX)& * MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) -#else - CALL GX_M_U_DEVICE(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) -!$acc update self(ZTMP1_DEVICE) - CALL LES_MEAN_SUBGRID( MXF(ZTMP1_DEVICE * MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) -#endif IF (KRR>=1) THEN CALL LES_MEAN_SUBGRID(MXF(GX_U_M(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX)& *MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Rt_SBG_UaW ) @@ -625,6 +636,21 @@ IF(HTURBDIM=='3DIM') THEN CALL LES_MEAN_SUBGRID( MXF(GX_U_M(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,& PDZX)*MZF(KKA,KKU,KKL,ZFLXZ)),X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) END DO +#else + CALL GX_M_U_DEVICE(KKA,KKU,KKL,PTHLM,PDXX,PDZZ,PDZX,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + CALL LES_MEAN_SUBGRID( MXF(ZTMP1_DEVICE * MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Thl_SBG_UaW ) + IF (KRR>=1) THEN + CALL GX_U_M_DEVICE(KKA,KKU,KKL,PRM(:,:,:,1),PDXX,PDZZ,PDZX,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + CALL LES_MEAN_SUBGRID(MXF(ZTMP1_DEVICE*MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Rt_SBG_UaW ) + END IF + DO JSV=1,NSV + CALL GX_U_M_DEVICE(KKA,KKU,KKL,PSVM(:,:,:,JSV),PDXX,PDZZ,PDZX,ZTMP1_DEVICE) +!$acc update self(ZTMP1_DEVICE) + CALL LES_MEAN_SUBGRID( MXF(ZTMP1_DEVICE*MZF(KKA,KKU,KKL,ZFLXZ)), X_LES_RES_ddxa_Sv_SBG_UaW(:,:,:,JSV) ) + END DO +#endif CALL SECOND_MNH(ZTIME2) XTIME_LES = XTIME_LES + ZTIME2 - ZTIME1 END IF