From 0f417f68322703b6c146f08e724dbd3d63dd27bc Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 5 Sep 2023 14:47:03 +0200 Subject: [PATCH] Philippe 05/09/2023: OpenACC: add directives for RAD_BOUND --- src/MNH/cphase_profile.f90 | 112 +++++++++++++++++++++++------------- src/MNH/modeln.f90 | 16 +++--- src/MNH/rad_bound.f90 | 115 +++++++++++++++++++++++++++++++------ 3 files changed, 178 insertions(+), 65 deletions(-) diff --git a/src/MNH/cphase_profile.f90 b/src/MNH/cphase_profile.f90 index d743241db..a46010d73 100644 --- a/src/MNH/cphase_profile.f90 +++ b/src/MNH/cphase_profile.f90 @@ -1,6 +1,6 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2010-2023 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. !######################### MODULE MODI_CPHASE_PROFILE @@ -56,6 +56,10 @@ END MODULE MODI_CPHASE_PROFILE ! USE MODD_CTURB USE MODD_PARAMETERS + +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif ! IMPLICIT NONE ! @@ -75,8 +79,13 @@ REAL, DIMENSION(:,:),OPTIONAL , INTENT(IN) :: PTKEM ! TKE at t-dt INTEGER :: IKB ! indice K Beginning in z direction INTEGER :: IKE ! indice K End in z direction ! +#ifndef MNH_OPENACC REAL, DIMENSION(SIZE(PCPHASE_PROFILE,1)) :: ZTKE, ZTKEMIN +#else +REAL, DIMENSION(:), POINTER, CONTIGUOUS :: ZTKE, ZTKEMIN +#endif INTEGER :: JL,JK,JKTKE +INTEGER :: JLMAX ! Intermediate variable to work around problem with CCE 15.0.1 ! !------------------------------------------------------------------------------- ! @@ -87,53 +96,78 @@ INTEGER :: JL,JK,JKTKE ! IKB = 1 + JPVEXT IKE = SIZE(PCPHASE_PROFILE,2) - JPVEXT +JLMAX = SIZE(PCPHASE_PROFILE,1) ! +#ifdef MNH_OPENACC +CALL MNH_MEM_POSITION_PIN( 'CPHASE_PROFILE' ) + +CALL MNH_MEM_GET( ZTKE, SIZE( PCPHASE_PROFILE, 1 ) ) +CALL MNH_MEM_GET( ZTKEMIN, SIZE( PCPHASE_PROFILE, 1 ) ) + +!$acc data present( PZHAT, PCPHASE_PROFILE,ZTKE, ZTKEMIN ) +#endif ! !* 1.2 Initializations ! ! -PCPHASE_PROFILE = 0.0 -ZTKEMIN = PZHAT(IKE) -ZTKE = PZHAT(IKE-1) +!$acc kernels +PCPHASE_PROFILE(:,:) = 0.0 +ZTKEMIN(:) = PZHAT(IKE) +ZTKE(:) = PZHAT(IKE-1) +!$acc end kernels !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! - IF (PRESENT(PTKEM)) THEN -! - DO JL = 1,SIZE(PCPHASE_PROFILE,1) - JKTKE=IKE-1 - DO JK = IKB, IKE-1 - IF (PTKEM(JL,JK) < 5.*XTKEMIN ) THEN - ZTKE (JL) = PZHAT (JK) - JKTKE = JK - EXIT - END IF - END DO - DO JK = JKTKE+1,IKE - IF (PTKEM(JL,JK) == XTKEMIN ) THEN - ZTKEMIN (JL) = PZHAT (JK) - EXIT - END IF - END DO - END DO -! - ELSE - ZTKE (:) = 1000. - ZTKEMIN (:) = 2000. - END IF -! - DO JL = 1,SIZE(PCPHASE_PROFILE,1) - DO JK = IKB, IKE - IF (PZHAT(JK) > ZTKEMIN (JL) ) THEN - PCPHASE_PROFILE(JL,JK) = PCPHASE - ELSE IF (PZHAT(JK) < ZTKE (JL) ) THEN - PCPHASE_PROFILE(JL,JK) = PCPHASE_PBL - ELSE - PCPHASE_PROFILE(JL,JK) = 1./(ZTKEMIN (JL) - ZTKE (JL)) * & - ((PZHAT(JK) - ZTKE(JL)) * PCPHASE + (ZTKEMIN (JL) - PZHAT(JK)) * PCPHASE_PBL ) +IF (PRESENT(PTKEM)) THEN +!acc data present( PTKEM ) +!$acc kernels +!$acc loop private( JKTKE ) independent + DO JL = 1, JLMAX + JKTKE=IKE-1 + DO JK = IKB, IKE-1 + IF (PTKEM(JL,JK) < 5.*XTKEMIN ) THEN + ZTKE (JL) = PZHAT (JK) + JKTKE = JK + EXIT END IF - END DO END DO + DO JK = JKTKE+1,IKE + IF (PTKEM(JL,JK) == XTKEMIN ) THEN + ZTKEMIN (JL) = PZHAT (JK) + EXIT + END IF + END DO + END DO +!$acc end kernels +!acc end data +ELSE +!$acc kernels + ZTKE (:) = 1000. + ZTKEMIN (:) = 2000. +!$acc end kernels +END IF +! +!$acc kernels +DO JL = 1, JLMAX + DO JK = IKB, IKE + IF (PZHAT(JK) > ZTKEMIN (JL) ) THEN + PCPHASE_PROFILE(JL,JK) = PCPHASE + ELSE IF (PZHAT(JK) < ZTKE (JL) ) THEN + PCPHASE_PROFILE(JL,JK) = PCPHASE_PBL + ELSE + PCPHASE_PROFILE(JL,JK) = 1./(ZTKEMIN (JL) - ZTKE (JL)) * & + ((PZHAT(JK) - ZTKE(JL)) * PCPHASE + (ZTKEMIN (JL) - PZHAT(JK)) * PCPHASE_PBL ) + END IF + END DO +END DO +!$acc end kernels + +#ifdef MNH_OPENACC +!$acc end data + +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE( 'CPHASE_PROFILE' ) +#endif ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 9dcd0490b..9c8499e3c 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -1640,16 +1640,15 @@ XTIME_LES_BU_PROCESS = 0. !$acc data create ( XUT, XVT, XWT ) & !$acc & present( XTHT, XRT, XPABST, XTHVREF, XRHODJ ) & !$acc & present( XDXX, XDYY, XDZZ, XDZX, XDZY, XRUS, XRVS, XRWS, XRWS_PRES ) & -!$acc & present ( XRRS, XRSVS, XRTHS_CLD, XRRS_CLD, XRSVS_CLD ) & -!$acc & copyin ( XSVT ) +!$acc & present( XRRS, XRSVS, XRTHS_CLD, XRRS_CLD, XRSVS_CLD ) & +!$acc & copyin ( XTKET, XSVT ) ! !$acc update device( XRUS, XRVS, XRWS, XRRS, XRSVS ) !$acc update device( XRUS_PRES, XRVS_PRES, XRWS_PRES ) !$acc update device( XUT, XVT, XWT, XTHT, XRT, XRHODJ, XRTHS ) !$acc update device( XRTHS_CLD, XRRS_CLD, XRSVS_CLD ) ! -!$acc data copyin (XTKET) & -!$acc & copy (XRTKES) & +!$acc data copy (XRTKES) & !$acc & copyout(XRTKEMS) #ifdef MNH_BITREP_OMP CALL SBR_FZ(XRRS_CLD) @@ -1773,7 +1772,6 @@ ELSE XRUS_PRES, XRVS_PRES, XRWS_PRES ) END IF ! -!$acc end data ! CALL SECOND_MNH2(ZTIME2) ! @@ -1813,7 +1811,8 @@ CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY) CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX) CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY) ! -!$acc update self( XRUS, XRVS, XRWS ) +!$acc data copyin( XDXHAT, XDYHAT, XZHAT, XLBXUM, XLBYVM, XLBXUS, XLBYVS, & +!$acc & XFLUCTUNW, XFLUCTVNN, XFLUCTUNE, XFLUCTVNS ) CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX, & XTSTEP, & XDXHAT, XDYHAT, XZHAT, & @@ -1821,8 +1820,8 @@ CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX, & XLBXUM, XLBYVM, XLBXUS, XLBYVS, & XFLUCTUNW,XFLUCTVNN,XFLUCTUNE,XFLUCTVNS, & XCPHASE, XCPHASE_PBL, XRHODJ, & - XTKET,XRUS, XRVS, XRWS ) -!$acc update device( XRUS, XRVS, XRWS ) + XTKET, XRUS, XRVS, XRWS ) +!$acc end data !$acc kernels present(ZRUS,ZRVS,ZRWS) ZRUS(:,:,:)=XRUS(:,:,:)-ZRUS(:,:,:) ZRVS(:,:,:)=XRVS(:,:,:)-ZRVS(:,:,:) @@ -1833,6 +1832,7 @@ CALL SECOND_MNH2(ZTIME2) ! XT_RAD_BOUND = XT_RAD_BOUND + ZTIME2 - ZTIME1 ! +!$acc end data !------------------------------------------------------------------------------- ! !* 19. PRESSURE COMPUTATION diff --git a/src/MNH/rad_bound.f90 b/src/MNH/rad_bound.f90 index 22c423583..6ebe2487b 100644 --- a/src/MNH/rad_bound.f90 +++ b/src/MNH/rad_bound.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2023 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 for details. version 1. @@ -166,6 +166,9 @@ USE MODD_PRECISION, ONLY: MNHREAL32 USE MODD_RECYCL_PARAM_n, ONLY: LRECYCL, XRCOEFF ! USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif ! USE MODI_CPHASE_PROFILE ! @@ -213,10 +216,14 @@ INTEGER :: IJE ! indice J End in y direction INTEGER :: IKB ! indice K Beginning in z direction INTEGER :: IKE ! indice K End in z direction INTEGER :: ILBX,ILBY ! number of points of the RIM arrays +#ifdef MNH_OPENACC +INTEGER :: IIU, IJU, IKU +#endif ! REAL :: ZINVTSTEP ! Inverse of the applicable timestep REAL :: ZKTSTEP ! Rayleigh damping by the timestep ! +#ifndef MNH_OPENACC REAL, DIMENSION(SIZE(PUT,2),SIZE(PUT,3)) :: ZLBGU ! LB x-gradient REAL, DIMENSION(SIZE(PUT,2),SIZE(PUT,3)) :: ZLBEU ! LB temporal Evolution REAL, DIMENSION(SIZE(PUT,2),SIZE(PUT,3)) :: ZLBXU ! LB field at t or t+1 @@ -231,7 +238,27 @@ REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,3)) :: ZCPHASY! Normalized Phase velocity ! ! for V field at Y-boundaries REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,3)) :: ZPHASY ! Phase velocity ! ! for V field at Y-boundaries +#else +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBGU ! LB x-gradient +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBEU ! LB temporal Evolution +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBXU ! LB field at t or t+1 +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZCPHASX! Normalized Phase velocity +! ! for U field at X-boundaries +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZPHASX! Phase velocity +! ! for U field at X-boundaries +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBGV ! LB y-gradient +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBEV ! LB temporal Evolution +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZLBYV ! LB field at t or t+1 +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZCPHASY! Normalized Phase velocity +! ! for V field at Y-boundaries +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZPHASY ! Phase velocity +! ! for V field at Y-boundaries +#endif REAL :: ZALPHA2! implicitness of the damping + +LOGICAL :: GRECYCL +REAL :: ZRCOEFF + ! !------------------------------------------------------------------------------- ! @@ -244,6 +271,35 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PUT,3) - JPVEXT ! +! Copy LRECYCL and XRCOEFF to local variables to work around problem with NVHP 23.7 +GRECYCL = LRECYCL +ZRCOEFF = XRCOEFF +! +#ifdef MNH_OPENACC +IIU = SIZE( PUT, 1 ) +IJU = SIZE( PUT, 2 ) +IKU = SIZE( PUT, 3 ) + +CALL MNH_MEM_POSITION_PIN( 'RAD_BOUND' ) + +CALL MNH_MEM_GET( ZLBGU, IJU, IKU ) +CALL MNH_MEM_GET( ZLBEU, IJU, IKU ) +CALL MNH_MEM_GET( ZLBXU, IJU, IKU ) +CALL MNH_MEM_GET( ZCPHASX, IJU, IKU ) +CALL MNH_MEM_GET( ZPHASX, IJU, IKU ) + +CALL MNH_MEM_GET( ZLBGV, IIU, IKU ) +CALL MNH_MEM_GET( ZLBEV, IIU, IKU ) +CALL MNH_MEM_GET( ZLBYV, IIU, IKU ) +CALL MNH_MEM_GET( ZCPHASY, IIU, IKU ) +CALL MNH_MEM_GET( ZPHASY, IIU, IKU ) + +!$acc data present( PDXHAT, PDYHAT, PZHAT, PUT, PVT, PLBXUM, PLBYVM, PLBXUS, PLBYVS, & +!$acc & PFLUCTUNW, PFLUCTVNN, PFLUCTUNE, PFLUCTVNS, & +!$acc & PRHODJ, PTKET, PRUS, PRVS, PRWS, & +!$acc & ZLBGU, ZLBEU, ZLBXU, ZCPHASX, ZPHASX, & +!$acc & ZLBGV, ZLBEV, ZLBYV, ZCPHASY, ZPHASY ) +#endif ! !* 1.2 Compute the inverse of the applicable timestep ! @@ -271,7 +327,9 @@ SELECT CASE ( HLBCX(1) ) ! CASE ('WALL') ! +!$acc kernels PRUS (IIB,:,:) = 0. +!$acc end kernels ! !* 2.2 OPEN CASE: ! ========= @@ -284,6 +342,7 @@ SELECT CASE ( HLBCX(1) ) CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASX) END IF +!$acc kernels ZCPHASX(:,:) = MAX ( 0., MIN ( 1., & (-PUT(IIB,:,:) + ZPHASX(:,:) ) * PTSTEP / PDXHAT(IIB) ) ) ! notice that ZCPHASX=0. when ZPHASX < PUT(IIB,:,:) @@ -292,8 +351,8 @@ SELECT CASE ( HLBCX(1) ) IF ( SIZE(PLBXUS,1) == 0 ) THEN ZLBEU (:,:) = 0. ZLBGU (:,:) = PLBXUM(JPHEXT+1,:,:) - PLBXUM(JPHEXT,:,:) ! 2 - 1 - IF ( LRECYCL ) THEN - ZLBXU(:,:) = PLBXUM(JPHEXT,:,:) + PFLUCTUNW * XRCOEFF + IF ( GRECYCL ) THEN + ZLBXU(:,:) = PLBXUM(JPHEXT,:,:) + PFLUCTUNW * ZRCOEFF ELSE ZLBXU(:,:) = PLBXUM(JPHEXT,:,:) END IF @@ -301,8 +360,8 @@ SELECT CASE ( HLBCX(1) ) ZLBEU (:,:) = PLBXUS(JPHEXT,:,:) ! 1 ZLBGU (:,:) = PLBXUM(JPHEXT+1,:,:) - PLBXUM(JPHEXT,:,:) + & ! 2 - 1 PTSTEP * (PLBXUS(JPHEXT+1,:,:) - PLBXUS(JPHEXT,:,:)) ! 2 - 1 - IF ( LRECYCL ) THEN - ZLBXU(:,:) = PLBXUM(JPHEXT,:,:)+ PTSTEP *PLBXUS(JPHEXT,:,:) + PFLUCTUNW * XRCOEFF ! 1 + 1 + IF ( GRECYCL ) THEN + ZLBXU(:,:) = PLBXUM(JPHEXT,:,:)+ PTSTEP *PLBXUS(JPHEXT,:,:) + PFLUCTUNW * ZRCOEFF ! 1 + 1 ELSE ZLBXU(:,:) = PLBXUM(JPHEXT,:,:)+ PTSTEP *PLBXUS(JPHEXT,:,:) ! 1 + 1 END IF @@ -333,7 +392,7 @@ SELECT CASE ( HLBCX(1) ) + ( ZLBEU (:,:) * PTSTEP & - ZLBGU (:,:) * ZCPHASX(:,:) & + ZKTSTEP*ZLBXU(:,:) ) ) - +!$acc end kernels ! ! END SELECT @@ -356,7 +415,9 @@ SELECT CASE ( HLBCX(2) ) ! CASE ('WALL') ! +!$acc kernels PRUS (IIE+1,:,:) = 0. +!$acc end kernels ! !* 3.2 OPEN CASE: ! ========= @@ -369,6 +430,7 @@ SELECT CASE ( HLBCX(2) ) CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASX) END IF ! +!$acc kernels ZCPHASX(:,:) = MAX ( 0., MIN ( 1., & ( PUT(IIE+1,:,:) + ZPHASX(:,:) ) * PTSTEP/PDXHAT(IIE) ) ) ! @@ -377,8 +439,8 @@ SELECT CASE ( HLBCX(2) ) IF (SIZE(PLBXUS,1) == 0 ) THEN ZLBEU (:,:) = 0. ZLBGU (:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) - PLBXUM(ILBX-JPHEXT,:,:) ! ILBX / (ILBX-1 - IF ( LRECYCL ) THEN - ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * XRCOEFF + IF ( GRECYCL ) THEN + ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * ZRCOEFF ELSE ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) END IF @@ -386,8 +448,8 @@ SELECT CASE ( HLBCX(2) ) ZLBEU (:,:) = PLBXUS(ILBX-JPHEXT+1,:,:) ZLBGU (:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) - PLBXUM(ILBX-JPHEXT,:,:) + & PTSTEP * (PLBXUS(ILBX-JPHEXT+1,:,:) - PLBXUS(ILBX-JPHEXT,:,:)) - IF ( LRECYCL ) THEN - ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) + PTSTEP * PLBXUS(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * XRCOEFF + IF ( GRECYCL ) THEN + ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) + PTSTEP * PLBXUS(ILBX-JPHEXT+1,:,:) + PFLUCTUNE * ZRCOEFF ELSE ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) + PTSTEP * PLBXUS(ILBX-JPHEXT+1,:,:) END IF @@ -418,6 +480,7 @@ SELECT CASE ( HLBCX(2) ) + ( ZLBEU (:,:) * PTSTEP & + ZLBGU (:,:) * ZCPHASX(:,:) & + ZKTSTEP*ZLBXU(:,:) ) ) +!$acc end kernels ! ! ! @@ -442,7 +505,9 @@ SELECT CASE ( HLBCY(1) ) ! CASE ('WALL') ! +!$acc kernels PRVS (:,IJB,:) = 0. +!$acc end kernels ! !* 4.2 OPEN CASE: ! ========= @@ -455,14 +520,15 @@ SELECT CASE ( HLBCY(1) ) CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASY) END IF ! +!$acc kernels ZCPHASY(:,:) = MAX ( 0., MIN ( 1., & (-PVT(:,IJB,:) + ZPHASY(:,:) ) * PTSTEP/ PDYHAT(IJB) ) ) ! IF ( SIZE(PLBYVS,1) == 0 ) THEN ZLBEV (:,:) = 0. ZLBGV (:,:) = PLBYVM(:,JPHEXT+1,:) - PLBYVM(:,JPHEXT,:) - IF ( LRECYCL ) THEN - ZLBYV(:,:) = PLBYVM(:,JPHEXT,:) + PFLUCTVNS * XRCOEFF + IF ( GRECYCL ) THEN + ZLBYV(:,:) = PLBYVM(:,JPHEXT,:) + PFLUCTVNS * ZRCOEFF ELSE ZLBYV(:,:) = PLBYVM(:,JPHEXT,:) END IF @@ -470,8 +536,8 @@ SELECT CASE ( HLBCY(1) ) ZLBEV (:,:) = PLBYVS(:,JPHEXT,:) ZLBGV (:,:) = PLBYVM(:,JPHEXT+1,:) - PLBYVM(:,JPHEXT,:) + & PTSTEP * (PLBYVS(:,JPHEXT+1,:) - PLBYVS(:,JPHEXT,:)) - IF ( LRECYCL ) THEN - ZLBYV(:,:) = PLBYVM(:,JPHEXT,:) + PTSTEP * PLBYVS(:,JPHEXT,:) + PFLUCTVNS * XRCOEFF + IF ( GRECYCL ) THEN + ZLBYV(:,:) = PLBYVM(:,JPHEXT,:) + PTSTEP * PLBYVS(:,JPHEXT,:) + PFLUCTVNS * ZRCOEFF ELSE ZLBYV(:,:) = PLBYVM(:,JPHEXT,:) + PTSTEP * PLBYVS(:,JPHEXT,:) END IF @@ -502,6 +568,7 @@ SELECT CASE ( HLBCY(1) ) + ( ZLBEV (:,:) * PTSTEP & - ZLBGV (:,:) * ZCPHASY(:,:) & + ZKTSTEP*ZLBYV(:,:) ) ) +!$acc end kernels ! ! ! @@ -526,7 +593,9 @@ SELECT CASE ( HLBCY(2) ) ! CASE ('WALL') ! +!$acc kernels PRVS (:,IJE+1,:) = 0. +!$acc end kernels ! !* 5.2 OPEN CASE: ! ========= @@ -539,6 +608,7 @@ SELECT CASE ( HLBCY(2) ) CALL CPHASE_PROFILE(PZHAT,PCPHASE,PCPHASE_PBL,ZPHASY) END IF ! +!$acc kernels ZCPHASY(:,:) = MAX ( 0., MIN ( 1., & ( PVT(:,IJE+1,:) + ZPHASY(:,:) ) * PTSTEP/PDYHAT(IJE) ) ) ! @@ -546,8 +616,8 @@ SELECT CASE ( HLBCY(2) ) IF ( SIZE(PLBYVS,1) == 0 ) THEN ZLBEV (:,:) = 0. ZLBGV (:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) - PLBYVM(:,ILBY-JPHEXT,:) - IF ( LRECYCL ) THEN - ZLBYV(:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * XRCOEFF + IF ( GRECYCL ) THEN + ZLBYV(:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * ZRCOEFF ELSE ZLBYV(:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) END IF @@ -555,8 +625,8 @@ SELECT CASE ( HLBCY(2) ) ZLBEV (:,:) = PLBYVS(:,ILBY-JPHEXT+1,:) ZLBGV (:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) - PLBYVM(:,ILBY-JPHEXT,:) + & PTSTEP * (PLBYVS(:,ILBY-JPHEXT+1,:) - PLBYVS(:,ILBY-JPHEXT,:)) - IF ( LRECYCL ) THEN - ZLBYV(:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) + PTSTEP *PLBYVS(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * XRCOEFF + IF ( GRECYCL ) THEN + ZLBYV(:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) + PTSTEP *PLBYVS(:,ILBY-JPHEXT+1,:) + PFLUCTVNN * ZRCOEFF ELSE ZLBYV(:,:) = PLBYVM(:,ILBY-JPHEXT+1,:) + PTSTEP *PLBYVS(:,ILBY-JPHEXT+1,:) END IF @@ -587,6 +657,7 @@ SELECT CASE ( HLBCY(2) ) + ( ZLBEV (:,:) * PTSTEP & + ZLBGV (:,:) * ZCPHASY(:,:) & + ZKTSTEP*ZLBYV(:,:) ) ) +!$acc end kernels ! ! END SELECT @@ -597,8 +668,16 @@ END IF !* 6. UPPER BOUNDARY (FLAT SURFACE): ! ------------------------------ ! +!$acc kernels PRWS (:,:,IKE+1) = 0. +!$acc end kernels ! +#ifdef MNH_OPENACC +!$acc end data + +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE( 'RAD_BOUND' ) +#endif !------------------------------------------------------------------------------- ! END SUBROUTINE RAD_BOUND -- GitLab