diff --git a/src/MNH/ppm.f90 b/src/MNH/ppm.f90 index 04cdcc4fb27565cba1c92890d421d6698017fe7d..2cc5ae3a6403dbab88d4164cd8f360bc21fe0c58 100644 --- a/src/MNH/ppm.f90 +++ b/src/MNH/ppm.f90 @@ -319,62 +319,14 @@ END MODULE MODI_PPM ! !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC ! ######################################################################## -!!$ FUNCTION PPM_01_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & -!!$ RESULT(PR) +#ifdef MNH_OPENACC SUBROUTINE PPM_01_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP, PR) -! ######################################################################## - - USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D - USE MODE_MNH_ZWORK, ONLY : IIU,IJU,IKU - - IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density -REAL, INTENT(IN) :: PTSTEP ! Time step -! -! output source term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR - -INTEGER :: IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG - -!$acc data present( PSRC, PCR, PRHO, PR ) - - CALL MNH_GET_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - - CALL PPM_01_X_D(IIU,IJU,IKU,HLBCX, KGRID, & - & PSRC, PCR, PRHO, PTSTEP, PR, & - & ZT3D(:,:,:,IZQL),ZT3D(:,:,:,IZQR),ZT3D(:,:,:,IZDQ),ZT3D(:,:,:,IZQ6), & - & ZT3D(:,:,:,IZDMQ),ZT3D(:,:,:,IZQL0),ZT3D(:,:,:,IZQR0), ZT3D(:,:,:,IZQ60), & - & ZT3D(:,:,:,IZFPOS),ZT3D(:,:,:,IZFNEG) ) - - CALL MNH_REL_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - -!$acc end data -! -CONTAINS -! -! ######################################################################## - SUBROUTINE PPM_01_X_D(IIU,IJU,IKU,HLBCX, KGRID, & - & PSRC, PCR, PRHO, PTSTEP, PR, & - & ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) - -! ######################################################################## #else -! ######################################################################## FUNCTION PPM_01_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_01_X - PPM_01 fully monotonic PPM advection scheme in X direction !! Colella notation @@ -392,6 +344,9 @@ CONTAINS USE MODD_CONF USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif use mode_mppdb #ifdef MNH_OPENACC use mode_msg @@ -411,9 +366,6 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -#ifdef MNH_OPENACC -INTEGER , INTENT(IN) :: IIU,IJU,IKU -#endif CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type ! INTEGER, INTENT(IN) :: KGRID ! C grid localisation @@ -436,8 +388,8 @@ INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions ! integer :: ji, jj, jk -#ifndef MNH_OPENACC integer :: iiu, iju, iku +#ifndef MNH_OPENACC ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZQL,ZQR REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZDQ,ZQ6 @@ -448,32 +400,23 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZQL0,ZQR0,ZQ60 ! ! advection fluxes REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG -! -!BEG JUAN PPM_LL -INTEGER :: IJS,IJN -!END JUAN PPM_LL #else INTEGER :: I,J,K +! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZQL,ZQR +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZDQ,ZQ6 +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZDMQ ! -!!$! -!!$! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 -REAL , DIMENSION(:,:,:) :: & - ZQL,ZQR, ZDQ,ZQ6, ZDMQ & -!!$! -!!$! extra variables for the initial guess of parabolae parameters - , ZQL0,ZQR0,ZQ60 & -!!$! -!!$! advection fluxes - , ZFPOS, ZFNEG +! extra variables for the initial guess of parabolae parameters +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZQL0,ZQR0,ZQ60 ! -INTEGER :: IJS,IJN +! advection fluxes +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFPOS, ZFNEG #endif +INTEGER :: IJS,IJN LOGICAL :: GWEST , GEAST !------------------------------------------------------------------------------- -!$acc data present( PSRC, PCR, PRHO, PR , & -!$acc & ZQL, ZQR, ZDQ, ZQ6, ZDMQ, ZQL0, ZQR0, ZQ60, ZFPOS, ZFNEG ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PCR, "PPM_01_X beg:PCR") @@ -481,6 +424,30 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC,"PPM_01_X beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZQL, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQR, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZDQ, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQ6, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZDMQ, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQL0, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQR0, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQ60, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFNEG, IIU, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PR , & +!$acc & ZQL, ZQR, ZDQ, ZQ6, ZDMQ, ZQL0, ZQR0, ZQ60, ZFPOS, ZFNEG ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ @@ -497,10 +464,6 @@ GEAST = LEAST_ll() !* initialise & update halo & halo2 for PSRC ! #ifndef MNH_OPENACC -iiu = size( PSRC, 1 ) -iju = size( PSRC, 2 ) -iku = size( PSRC, 3 ) - CALL GET_HALO(PSRC, HNAME='PSRC') ! PR (:,:,:) = PSRC(:,:,:) @@ -535,15 +498,8 @@ CALL GET_HALO_D(PSRC,HDIR="01_X", HNAME='UPDATE_HALO_ll::GET_HALO::PSRC') end do end do ! -#if 0 -ZFPOS(:,1:IJS,:)=PSRC(:,1:IJS,:) -ZFNEG(:,1:IJS,:)=PSRC(:,1:IJS,:) -ZFPOS(:,IJN:,:)=PSRC(:,IJN:,:) -ZFNEG(:,IJN:,:)=PSRC(:,IJN:,:) -#else ZFPOS(:,:,:) = PSRC(:,:,:) ZFNEG(:,:,:) = PSRC(:,:,:) -#endif !$acc end kernels #endif ! @@ -693,7 +649,6 @@ CASE('OPEN') ! ! calculate dmq CALL DIF2X( PSRC, ZDMQ ) -!$acc kernels ! ! overwrite the values on the boundary to get second order difference ! for qL and qR at the boundary @@ -701,19 +656,24 @@ CASE('OPEN') ! WEST BOUND ! IF (GWEST) THEN +!$acc kernels ZDMQ(IIB-1,IJS:IJN,:) = -ZDMQ(IIB,IJS:IJN,:) +!$acc end kernels ENDIF ! ! EAST BOUND ! IF (GEAST) THEN +!$acc kernels ZDMQ(IIE+1,IJS:IJN,:) = -ZDMQ(IIE,IJS:IJN,:) +!$acc end kernels ENDIF ! ! monotonize the difference followinq eq. 5 in Lin94 ! ! ZDMQ(i) = Fct[ ZDMQ(i),PSRC(i),PSRC(i-1),PSRC(i+1) ] ! +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = ijs, ijn @@ -774,29 +734,32 @@ CASE('OPEN') #else !$acc end kernels CALL GET_HALO_D(ZQL0,HDIR="01_X", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') -!$acc kernels #endif ! ! WEST BOUND ! IF (GWEST) THEN +!$acc kernels ZQL0(IIB-1,IJS:IJN,:) = ZQL0(IIB,IJS:IJN,:) +!$acc end kernels ENDIF ! +!$acc kernels present( ZQL0, ZQR0 ) ZQR0(IIB-1:IIE,IJS:IJN,:) = ZQL0(IIB:IIE+1,IJS:IJN,:) +!$acc end kernels ! #ifndef MNH_OPENACC CALL GET_HALO(ZQR0, HNAME='ZQR0') #else -!$acc end kernels CALL GET_HALO_D(ZQR0, HDIR="01_X", HNAME='UPDATE_HALO_ll::GET_HALO::ZQR0') -!$acc kernels #endif ! ! EAST BOUND ! IF (GEAST) THEN +!$acc kernels present( ZQR0 ) ZQR0(IIE+1,IJS:IJN,:) = ZQR0(IIE,IJS:IJN,:) +!$acc end kernels ENDIF #ifndef MNH_OPENACC ! @@ -831,6 +794,7 @@ CASE('OPEN') ! ZDQ(:,IJS:IJN,:) = ZQR(:,IJS:IJN,:) - ZQL(:,IJS:IJN,:) #else +!$acc kernels present( ZQL0, ZQR0 ) !$acc loop independent collapse(3) DO K=1,IKU DO J = IJS,IJN @@ -868,6 +832,7 @@ DO K=1,IKU ! ZDQ(I,J,K) = ZQR(I,J,K) - ZQL(I,J,K) ENDDO ; ENDDO ; ENDDO +!$acc end kernels #endif ! ! and finally calculate fluxes for the advection @@ -878,6 +843,7 @@ ENDDO ; ENDDO ; ENDDO !!$ ZFPOS(IIB+1:IIE+1,:,:) = ZQR(IIB:IIE,:,:) - 0.5*PCR(IIB+1:IIE+1,:,:) * & !!$ (ZDQ(IIB:IIE,:,:) - (1.0 - 2.0*PCR(IIB+1:IIE+1,:,:)/3.0) & !!$ * ZQ6(IIB:IIE,:,:)) +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = ijs, ijn @@ -895,7 +861,6 @@ ENDDO ; ENDDO ; ENDDO #else !$acc end kernels CALL GET_HALO_D(ZFPOS, HDIR="01_X", HNAME='UPDATE_HALO_ll::GET_HALO::ZFPOS') -!$acc kernels #endif ! ! @@ -904,16 +869,19 @@ ENDDO ; ENDDO ; ENDDO ! advection flux at open boundary when u(IIB) > 0 ! IF (GWEST) THEN +!$acc kernels ZFPOS(IIB,IJS:IJN,:) = (PSRC(IIB-1,IJS:IJN,:) - ZQR(IIB-1,IJS:IJN,:))*PCR(IIB,IJS:IJN,:) + & ZQR(IIB-1,IJS:IJN,:) ! PPOSX(IIB-1,:,:) is not important for the calc of advection so ! we set it to 0 !!$ ZFPOS(IIB-1,:,:) = 0.0 +!$acc end kernels ENDIF ! !!$ ZFNEG(IIB-1:IIE,:,:) = ZQL(IIB-1:IIE,:,:) - 0.5*PCR(IIB-1:IIE,:,:) * & !!$ (ZDQ(IIB-1:IIE,:,:) + (1.0 + 2.0*PCR(IIB-1:IIE,:,:)/3.0) & !!$ * ZQ6(IIB-1:IIE,:,:)) +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = ijs, ijn @@ -929,15 +897,16 @@ ENDDO ; ENDDO ; ENDDO #else !$acc end kernels CALL GET_HALO_D(ZFNEG, HDIR="01_X", HNAME='UPDATE_HALO_ll::GET_HALO::ZFNEG') -!$acc kernels #endif ! ! EAST BOUND ! ! advection flux at open boundary when u(IIE+1) < 0 IF (GEAST) THEN +!$acc kernels ZFNEG(IIE+1,IJS:IJN,:) = (ZQR(IIE,IJS:IJN,:)-PSRC(IIE+1,IJS:IJN,:))*PCR(IIE+1,IJS:IJN,:) + & ZQR(IIE,IJS:IJN,:) +!$acc end kernels ENDIF ! ! advect the actual field in X direction by U*dt @@ -948,7 +917,6 @@ ENDDO ; ENDDO ; ENDDO CALL GET_HALO(PR, HNAME='PR') #else !mxm(ZQL,PRHO) -!$acc end kernels CALL MXM_DEVICE(PRHO,ZQL) !$acc kernels where ( PCR(:,:,:) > 0. ) @@ -973,11 +941,12 @@ END IF !$acc end data -#ifndef MNH_OPENACC -CONTAINS -#else -END SUBROUTINE PPM_01_X_D +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() #endif + +CONTAINS ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- @@ -1000,14 +969,14 @@ END SUBROUTINE PPM_01_X_D !------------------------------------------------------------------------------- ! ! -USE MODE_ll +! USE MODE_ll ! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ -REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)), INTENT(OUT) :: DQ +REAL, DIMENSION(:,:,:), INTENT(IN) :: PQ +REAL, DIMENSION(SIZE(PQ,1),SIZE(PQ,2),SIZE(PQ,3)) :: DQ ! !* 0.2 Declarations of local variables : ! @@ -1040,7 +1009,7 @@ DQ = 0.5*DQ !$acc end data END SUBROUTINE DIF2X -! + #ifdef MNH_OPENACC END SUBROUTINE PPM_01_X #else @@ -1051,62 +1020,14 @@ END FUNCTION PPM_01_X !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC ! ######################################################################## -!!$ FUNCTION PPM_01_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & -!!$ RESULT(PR) +#ifdef MNH_OPENACC SUBROUTINE PPM_01_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP, PR) -! ######################################################################## - - USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D - USE MODE_MNH_ZWORK, ONLY : IIU,IJU,IKU - -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR & ! Courant number - , PRHO ! density -! -! output source term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR - -INTEGER :: IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG - -!$acc data present( PSRC, PCR, PRHO, PR ) - - CALL MNH_GET_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - - CALL PPM_01_Y_D(IIU,IJU,IKU,HLBCY, KGRID, & - & PSRC, PCR, PRHO, PTSTEP, PR, & - & ZT3D(:,:,:,IZQL),ZT3D(:,:,:,IZQR),ZT3D(:,:,:,IZDQ),ZT3D(:,:,:,IZQ6), & - & ZT3D(:,:,:,IZDMQ),ZT3D(:,:,:,IZQL0),ZT3D(:,:,:,IZQR0), ZT3D(:,:,:,IZQ60), & - & ZT3D(:,:,:,IZFPOS),ZT3D(:,:,:,IZFNEG) ) - - CALL MNH_REL_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - -!$acc end data - -CONTAINS -! -! ######################################################################## - SUBROUTINE PPM_01_Y_D(IIU,IJU,IKU,HLBCY, KGRID, & - & PSRC, PCR, PRHO, PTSTEP, PR, & - & ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) - -! ######################################################################## #else -! ######################################################################## FUNCTION PPM_01_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_01_Y - PPM_01 fully monotonic PPM advection scheme in Y direction !! Colella notation @@ -1124,6 +1045,9 @@ CONTAINS USE MODD_CONF USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif use mode_mppdb #ifdef MNH_OPENACC use mode_msg @@ -1143,9 +1067,6 @@ IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -#ifdef MNH_OPENACC -integer, intent(in) :: iiu, iju, iku -#endif CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type ! INTEGER, INTENT(IN) :: KGRID ! C grid localisation @@ -1168,11 +1089,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions ! +integer :: iiu, iju, iku INTEGER :: IIW,IIA ! LOGICAL :: GSOUTH , GNORTH #ifndef MNH_OPENACC -integer :: iiu, iju, iku ! ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZQL,ZQR @@ -1187,27 +1108,24 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG ! #else ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 -REAL, DIMENSION(:,:,:) :: & - ZQL,ZQR , ZDQ,ZQ6 , ZDMQ & +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZQL, ZQR +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZDQ, ZQ6 +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZDMQ +! ! extra variables for the initial guess of parabolae parameters - , ZQL0,ZQR0,ZQ60 & +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZQL0,ZQR0,ZQ60 +! ! advection fluxes - , ZFPOS, ZFNEG - +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFPOS, ZFNEG ! -!JUAN ACC INTEGER :: I,J,K ! INTEGER :: IKB,IKE INTEGER :: IJN,IJS -!JUAN ACC #endif integer :: ji, jj, jk !------------------------------------------------------------------------------- -!$acc data present( PSRC, PCR, PRHO, PR, & -!$acc & ZQL, ZQR, ZDQ, ZQ6, ZDMQ, ZQL0, ZQR0, ZQ60, ZFPOS, ZFNEG ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PCR, "PPM_01_Y beg:PCR") @@ -1215,6 +1133,30 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC,"PPM_01_Y beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZQL, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQR, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZDQ, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQ6, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZDMQ, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQL0, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQR0, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQ60, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFNEG, IIU, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PR, & +!$acc & ZQL, ZQR, ZDQ, ZQ6, ZDMQ, ZQL0, ZQR0, ZQ60, ZFPOS, ZFNEG ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ @@ -1227,10 +1169,6 @@ GSOUTH=LSOUTH_ll() GNORTH=LNORTH_ll() ! #ifndef MNH_OPENACC -iiu = size( PSRC, 1 ) -iju = size( PSRC, 2 ) -iku = size( PSRC, 3 ) - CALL GET_HALO(PSRC, HNAME='PSRC') #else IJS=1 @@ -1268,20 +1206,8 @@ CALL GET_HALO_D(PSRC, HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::PSRC') end do end do end do -#ifndef MNH_OPENACC -ZFPOS=PSRC -ZFNEG=PSRC -#else -#if 0 -ZFPOS(1:IIW,:,IKB:IKE)=PSRC(1:IIW,:,IKB:IKE) -ZFNEG(1:IIW,:,IKB:IKE)=PSRC(1:IIW,:,IKB:IKE) -ZFPOS(IIA:,:,IKB:IKE)=PSRC(IIA:,:,IKB:IKE) -ZFNEG(IIA:,:,IKB:IKE)=PSRC(IIA:,:,IKB:IKE) -#else ZFPOS(:,:,:) = PSRC(:,:,:) ZFNEG(:,:,:) = PSRC(:,:,:) -#endif -#endif !$acc end kernels ! SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side @@ -1454,6 +1380,8 @@ CALL MPPDB_CHECK(ZQL0,"PPM_01_Y: ZQL0") END DO END DO END DO +!$acc end kernels +!$acc kernels #endif ! ! and finally calculate fluxes for the advection @@ -1524,23 +1452,27 @@ CASE('OPEN') ! ! calculate dmq CALL DIF2Y( PSRC, ZDMQ ) -!$acc kernels ! overwrite the values on the boundary to get second order difference ! for qL and qR at the boundary ! ! SOUTH BOUND ! IF (GSOUTH) THEN +!$acc kernels ZDMQ(IIW:IIA,IJB-1,:) = -ZDMQ(IIW:IIA,IJB,:) +!$acc end kernels ENDIF ! ! NORTH BOUND ! IF (GNORTH) THEN +!$acc kernels ZDMQ(IIW:IIA,IJE+1,:) = -ZDMQ(IIW:IIA,IJE,:) +!$acc end kernels ENDIF ! ! monotonize the difference followinq eq. 5 in Lin94 +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = ijb, ije @@ -1590,15 +1522,17 @@ end do #else !$acc end kernels CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') -!$acc kernels #endif ! ! SOUTH BOUND ! IF (GSOUTH) THEN +!$acc kernels ZQL0(IIW:IIA,IJB-1,:) = ZQL0(IIW:IIA,IJB,:) +!$acc end kernels ENDIF ! +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = ijb - 1, ije @@ -1607,11 +1541,14 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') end do end do end do +!$acc end kernels ! ! NORTH BOUND ! IF (GNORTH) THEN +!$acc kernels ZQR0(IIW:IIA,IJE+1,:) = ZQR0(IIW:IIA,IJE,:) +!$acc end kernels ENDIF #ifndef MNH_OPENACC ! @@ -1647,6 +1584,7 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') ZDQ(IIW:IIA,:,:) = ZQR(IIW:IIA,:,:) - ZQL(IIW:IIA,:,:) ! #else +!$acc kernels !$acc loop independent collapse(3) DO K=IKB,IKE DO J=IJS,IJN @@ -1686,6 +1624,7 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') END DO END DO END DO +!$acc end kernels #endif ! ! and finally calculate fluxes for the advection @@ -1693,6 +1632,7 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') !!$ ZFPOS(:,IJB+1:IJE+1,:) = ZQR(:,IJB:IJE,:) - 0.5*PCR(:,IJB+1:IJE+1,:) * & !!$ (ZDQ(:,IJB:IJE,:) - (1.0 - 2.0*PCR(:,IJB+1:IJE+1,:)/3.0) & !!$ * ZQ6(:,IJB:IJE,:)) +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = ijb, ije + 1 @@ -1708,7 +1648,6 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') #else !$acc end kernels CALL GET_HALO_D(ZFPOS,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZFPOS') -!$acc kernels #endif ! ! @@ -1717,8 +1656,10 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') ! SOUTH BOUND ! IF (GSOUTH) THEN +!$acc kernels ZFPOS(IIW:IIA,IJB,:) = (PSRC(IIW:IIA,IJB-1,:) - ZQR(IIW:IIA,IJB-1,:))*PCR(IIW:IIA,IJB,:) + & ZQR(IIW:IIA,IJB-1,:) +!$acc end kernels ENDIF ! ! PPOSX(:,IJB-1,:) is not important for the calc of advection so @@ -1728,6 +1669,7 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') !!$ ZFNEG(:,IJB-1:IJE,:) = ZQL(:,IJB-1:IJE,:) - 0.5*PCR(:,IJB-1:IJE,:) * & !!$ ( ZDQ(:,IJB-1:IJE,:) + (1.0 + 2.0*PCR(:,IJB-1:IJE,:)/3.0) * & !!$ ZQ6(:,IJB-1:IJE,:) ) +!$acc kernels !$acc loop independent collapse(3) do jk = 1, iku do jj = 1, iju @@ -1743,7 +1685,6 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') #else !$acc end kernels CALL GET_HALO_D(ZFNEG,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZFNEG') -!$acc kernels #endif ! ! advection flux at open boundary when u(IJE+1) < 0 @@ -1751,8 +1692,10 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') ! NORTH BOUND ! IF (GNORTH) THEN +!$acc kernels ZFNEG(IIW:IIA,IJE+1,:) = (ZQR(IIW:IIA,IJE,:)-PSRC(IIW:IIA,IJE+1,:))*PCR(IIW:IIA,IJE+1,:) + & ZQR(IIW:IIA,IJE,:) +!$acc end kernels ENDIF #ifndef MNH_OPENACC ! @@ -1762,7 +1705,6 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y", HNAME='UPDATE_HALO_ll::GET_HALO::ZQL0') ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) ! #else -!$acc end kernels CALL MYM_DEVICE(PRHO,ZQL) !$acc kernels !$acc loop independent collapse(3) @@ -1799,11 +1741,12 @@ END IF !$acc end data -#ifndef MNH_OPENACC -CONTAINS -#else -END SUBROUTINE PPM_01_Y_D +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() #endif + +CONTAINS ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- @@ -1872,8 +1815,6 @@ END SUBROUTINE DIF2Y ! #endif ! #ifdef MNH_OPENACC -! END SUBROUTINE PPM_01_Y_D - END SUBROUTINE PPM_01_Y #else END FUNCTION PPM_01_Y @@ -1883,57 +1824,13 @@ END FUNCTION PPM_01_Y !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC ! ######################################################################## -!!$ FUNCTION PPM_01_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) RESULT(PR) +#ifdef MNH_OPENACC SUBROUTINE PPM_01_Z(KGRID, PSRC, PCR, PRHO, PTSTEP, PR) -! ######################################################################## - - USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D - USE MODE_MNH_ZWORK, ONLY : IIU,IJU,IKU - - IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -REAL, INTENT(IN) :: PTSTEP ! Time step -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR & ! Courant number - , PRHO ! density -! -! output source term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR - -INTEGER :: IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG - -!$acc data present( PSRC, PCR, PRHO, PR ) - - CALL MNH_GET_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - - CALL PPM_01_Z_D(IIU,IJU,IKU, KGRID, & - & PSRC, PCR, PRHO, PTSTEP, PR, & - & ZT3D(:,:,:,IZQL),ZT3D(:,:,:,IZQR),ZT3D(:,:,:,IZDQ),ZT3D(:,:,:,IZQ6), & - & ZT3D(:,:,:,IZDMQ),ZT3D(:,:,:,IZQL0),ZT3D(:,:,:,IZQR0), ZT3D(:,:,:,IZQ60), & - & ZT3D(:,:,:,IZFPOS),ZT3D(:,:,:,IZFNEG) ) - - CALL MNH_REL_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - -!$acc end data - -CONTAINS -! -! ######################################################################## - SUBROUTINE PPM_01_Z_D(IIU,IJU,IKU,KGRID, & - & PSRC, PCR, PRHO, PTSTEP, PR, & - & ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) -! ######################################################################## #else -! ######################################################################## FUNCTION PPM_01_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_01_Z - PPM_01 fully monotonic PPM advection scheme in Z direction !! Colella notation @@ -1945,30 +1842,29 @@ CONTAINS !! !------------------------------------------------------------------------------- ! +USE MODD_CONF +USE MODD_PARAMETERS, ONLY: JPVEXT + USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif +USE MODE_MPPDB +#ifdef MNH_BITREP +USE MODI_BITREP +#endif +USE MODI_GET_HALO #ifndef MNH_OPENACC USE MODI_SHUMAN #else USE MODI_SHUMAN_DEVICE #endif -USE MODI_GET_HALO -#ifdef MNH_BITREP -USE MODI_BITREP -#endif -! -USE MODD_CONF -USE MODD_PARAMETERS -!USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll -USE MODE_MPPDB ! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -#ifdef MNH_OPENACC -integer, intent(in) :: iiu, iju, iku -#endif INTEGER, INTENT(IN) :: KGRID ! C grid localisation ! #ifndef MNH_OPENACC @@ -1990,11 +1886,11 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! !* 0.2 Declarations of local variables : ! -#ifndef MNH_OPENACC INTEGER :: IIU, IJU, IKU INTEGER:: IKB ! Begining useful area in x,y,z directions INTEGER:: IKE ! End useful area in x,y,z directions ! +#ifndef MNH_OPENACC ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZQL,ZQR REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZDQ,ZQ6 @@ -2007,17 +1903,15 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZQL0,ZQR0,ZQ60 REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG #else ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 -REAL, DIMENSION(:,:,:) :: & - ZQL, ZQR, ZDQ, ZQ6, ZDMQ & +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZQL, ZQR +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZDQ, ZQ6 +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZDMQ ! ! extra variables for the initial guess of parabolae parameters - , ZQL0,ZQR0,ZQ60 & +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZQL0,ZQR0,ZQ60 ! ! advection fluxes - , ZFPOS, ZFNEG -! -INTEGER:: IKB ! Begining useful area in x,y,z directions -INTEGER:: IKE ! End useful area in x,y,z directions +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFPOS, ZFNEG ! INTEGER :: I,J,K #endif @@ -2025,8 +1919,6 @@ integer :: ji, jj, jk ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PCR, PRHO, PR, & -!$acc & ZQL, ZQR, ZDQ, ZQ6, ZDMQ, ZQL0, ZQR0, ZQ60, ZFPOS, ZFNEG ) IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PCR, "PPM_01_Z beg:PCR") @@ -2034,17 +1926,36 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC,"PPM_01_Z beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZQL, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQR, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZDQ, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQ6, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZDMQ, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQL0, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQR0, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZQ60, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFNEG, IIU, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PR, & +!$acc & ZQL, ZQR, ZDQ, ZQ6, ZDMQ, ZQL0, ZQR0, ZQ60, ZFPOS, ZFNEG ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ ! IKB = 1 + JPVEXT IKE = SIZE(PSRC,3) - JPVEXT -#ifndef MNH_OPENACC -iiu = size( PSRC, 1 ) -iju = size( PSRC, 2 ) -iku = size( PSRC, 3 ) -#endif !$acc kernels !$acc loop independent collapse(3) @@ -2103,16 +2014,22 @@ do jk = ikb, ike end do end do end do +!$acc end kernels +!$acc kernels ZDMQ(:,:,IKB-1) = & SIGN( (MIN( ABS(ZDMQ(:,:,IKB-1)), 2.0*(PSRC(:,:,IKB-1) - & MIN(PSRC(:,:,IKE-1),PSRC(:,:,IKB-1),PSRC(:,:,IKB))), & 2.0*(MAX(PSRC(:,:,IKE-1),PSRC(:,:,IKB-1),PSRC(:,:,IKB)) - & PSRC(:,:,IKB-1)) )), ZDMQ(:,:,IKB-1) ) +!$acc end kernels +!$acc kernels ZDMQ(:,:,IKE+1) = & SIGN( (MIN( ABS(ZDMQ(:,:,IKE+1)), 2.0*(PSRC(:,:,IKE+1) - & MIN(PSRC(:,:,IKE),PSRC(:,:,IKE+1),PSRC(:,:,IKB+1))), & 2.0*(MAX(PSRC(:,:,IKE),PSRC(:,:,IKE+1),PSRC(:,:,IKB+1)) - & PSRC(:,:,IKE+1)) )), ZDMQ(:,:,IKE+1) ) +!$acc end kernels +!$acc kernels ! ! calculate qL and qR with the modified dmq ! @@ -2126,6 +2043,8 @@ do jk = ikb, ike + 1 end do ZQL0(:,:,IKB-1) = ZQL0(:,:,IKE) ! +!$acc end kernels +!$acc kernels !$acc loop independent collapse(3) do jk = ikb - 1, ike do jj = 1, iju @@ -2225,9 +2144,11 @@ ZDQ = ZQR - ZQL END DO END DO #endif +!$acc end kernels ! ! and finally calculate fluxes for the advection ! +!$acc kernels !$acc loop independent collapse(3) do jk = ikb + 1, ike + 1 do jj = 1, iju @@ -2237,7 +2158,9 @@ do jk = ikb + 1, ike + 1 end do end do end do +!$acc end kernels ! +!$acc kernels ! advection flux at open boundary when u(IKB) > 0 ZFPOS(:,:,IKB) = (PSRC(:,:,IKB-1) - ZQR(:,:,IKB-1))*PCR(:,:,IKB) + & ZQR(:,:,IKB-1) @@ -2246,6 +2169,8 @@ ZFPOS(:,:,IKB) = (PSRC(:,:,IKB-1) - ZQR(:,:,IKB-1))*PCR(:,:,IKB) + & ! we set it to 0 ZFPOS(:,:,IKB-1) = 0.0 ! +!$acc end kernels +!$acc kernels !$acc loop independent collapse(3) do jk = ikb - 1, ike do jj = 1, iju @@ -2256,6 +2181,8 @@ do jk = ikb - 1, ike end do end do ! +!$acc end kernels +!$acc kernels ! advection flux at open boundary when u(IKE+1) < 0 ZFNEG(:,:,IKE+1) = (ZQR(:,:,IKE)-PSRC(:,:,IKE+1))*PCR(:,:,IKE+1) + & ZQR(:,:,IKE) @@ -2301,11 +2228,12 @@ END IF !$acc end data -#ifndef MNH_OPENACC -CONTAINS -#else -END SUBROUTINE PPM_01_Z_D +#ifdef MNH_OPENACC +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() #endif + +CONTAINS ! !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- @@ -2372,11 +2300,8 @@ DQ = 0.5 * DQ !$acc end data END SUBROUTINE DIF2Z -! #endif -! + #ifdef MNH_OPENACC -! END SUBROUTINE PPM_01_Z_D -! END SUBROUTINE PPM_01_Z #else END FUNCTION PPM_01_Z @@ -2386,59 +2311,14 @@ END FUNCTION PPM_01_Z !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC -! ######################################################################## -!!$ FUNCTION PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & -!!$ RESULT(PR) -SUBROUTINE PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP , PR) - - USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D - USE MODE_MNH_ZWORK, ONLY : ZPSRC_HALO2_WEST - - IMPLICIT NONE - ! - !* 0.1 Declarations of dummy arguments : - ! - CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type - ! - INTEGER, INTENT(IN) :: KGRID ! C grid localisation - ! - REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t - REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number - REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density - REAL, INTENT(IN) :: PTSTEP ! Time step - ! - ! output source term - REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR - - INTEGER :: IZFPOS,IZFNEG,IZPHAT,IZRHO_MXM,IZCR_MXM,IZCR_DXF - -!$acc data present( PSRC, PCR, PRHO, PR ) - - CALL MNH_GET_ZT3D(IZFPOS,IZFNEG,IZPHAT,IZRHO_MXM,IZCR_MXM,IZCR_DXF) - - CALL PPM_S0_X_D(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP , PR, & - & ZT3D(:,:,:,IZFPOS),ZT3D(:,:,:,IZFNEG),ZT3D(:,:,:,IZPHAT),ZT3D(:,:,:,IZRHO_MXM), & - & ZT3D(:,:,:,IZCR_MXM),ZT3D(:,:,:,IZCR_DXF),ZPSRC_HALO2_WEST ) - - CALL MNH_REL_ZT3D(IZFPOS,IZFNEG,IZPHAT,IZRHO_MXM,IZCR_MXM,IZCR_DXF) - -!$acc end data - -CONTAINS -! -! ######################################################################## - SUBROUTINE PPM_S0_X_D(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP , PR & - & ,ZFPOS,ZPHAT,ZFNEG & - & ,ZRHO_MXM,ZCR_MXM,ZCR_DXF,ZPSRC_HALO2_WEST ) - ! ######################################################################## +#ifdef MNH_OPENACC + SUBROUTINE PPM_S0_X( HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP, PR ) #else -! ######################################################################## FUNCTION PPM_S0_X(HLBCX, KGRID, PSRC, PCR, PRHO, PTSTEP) & RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_S0_X - PPM advection scheme in X direction in Skamarock 2006 !! notation - NO CONSTRAINTS @@ -2455,6 +2335,9 @@ USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll USE MODD_CONF USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif USE MODE_MPPDB #ifdef MNH_OPENACC use mode_msg @@ -2467,14 +2350,6 @@ USE MODI_SHUMAN USE MODI_SHUMAN_DEVICE #endif ! -#ifdef MNH_OPENACC -USE MODD_PARAMETERS, ONLY : JPHEXT -! -USE MODE_MNH_ZWORK, ONLY : IIB,IIE, IIU,IJU,IKU , IJS,IJN, GWEST,GEAST -! -USE MODD_IO, ONLY : GSMONOPROC -#endif -! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -2498,13 +2373,14 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! !* 0.2 Declarations of local variables : ! -#ifndef MNH_OPENACC INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions INTEGER :: IJS,IJN +integer :: iiu, iju, iku ! LOGICAL :: GWEST, GEAST +#ifndef MNH_OPENACC ! advection fluxes REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG ! @@ -2514,24 +2390,21 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZPHAT REAL, DIMENSION(SIZE(PCR,2),SIZE(PCR,3)) :: ZPSRC_HALO2_WEST #else ! advection fluxes -REAL, DIMENSION(:,:,:) :: ZFPOS, ZFNEG +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFPOS, ZFNEG ! ! variable at cell edges -REAL, DIMENSION(:,:,:) :: ZPHAT +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPHAT ! -REAL, DIMENSION(:,:,:) :: ZRHO_MXM, ZCR_MXM , ZCR_DXF +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZCR_DXF, ZCR_MXM, ZRHO_MXM INTEGER :: I,J,K ! -REAL, DIMENSION(:,:) :: ZPSRC_HALO2_WEST +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZPSRC_HALO2_WEST #endif TYPE(HALO2LIST_ll), POINTER :: TZ_PSRC_HALO2_ll ! halo2 for PSRC !------------------------------------------------------------------------------- -!$acc data present( PSRC, PCR, PRHO, PR , & -!$acc & ZFPOS, ZFNEG, ZPHAT, ZRHO_MXM, ZCR_MXM, ZCR_DXF, ZPSRC_HALO2_WEST ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PCR, "PPM_S0_X beg:PCR") @@ -2539,11 +2412,31 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC,"PPM_S0_X beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZFPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFNEG, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZPHAT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZCR_DXF, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZCR_MXM, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRHO_MXM, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZPSRC_HALO2_WEST, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PR , & +!$acc & ZFPOS, ZFNEG, ZPHAT, ZRHO_MXM, ZCR_MXM, ZCR_DXF, ZPSRC_HALO2_WEST ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ ! -#ifndef MNH_OPENACC CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IJS=IJB IJN=IJE @@ -2552,7 +2445,6 @@ IJN=IJE ! GWEST = LWEST_ll() GEAST = LEAST_ll() -#endif ! !BEG JUAN PPM_LL ! @@ -2651,7 +2543,6 @@ CALL GET_HALO(ZFNEG, HNAME='ZFNEG') ! JUAN CALL GET_HALO(PR, HNAME='PR') ! JUAN ! CASE ('OPEN') -!$acc kernels ! !!$ ZPHAT(IIB,:,:) = 0.5*(PSRC(IIB-1,:,:) + PSRC(IIB,:,:)) !!$ ZPHAT(IIB-1,:,:) = ZPHAT(IIB,:,:) ! not used @@ -2660,12 +2551,13 @@ CASE ('OPEN') ! WEST BOUND ! IF (.NOT. GWEST) THEN +!$acc kernels ZPHAT(IIB ,IJS:IJN,:) = ( 7.0 * & ( PSRC(IIB ,IJS:IJN,:) + PSRC(IIB-1,IJS:IJN,:) ) - & ( PSRC(IIB+1,IJS:IJN,:) + ZPSRC_HALO2_WEST(IJS:IJN,:) ) ) / 12.0 ! <=> WEST BOUND ( PSRC(IIB+1,IJS:IJN,:) + PSRC(IIB-2,IJS:IJN,:) ) ) / 12.0 -ENDIF !$acc end kernels +ENDIF ! ! update ZPHAT HALO before next/further utilisation ! @@ -2712,15 +2604,17 @@ ENDIF ! acc update device(ZFPOS) #endif ! -!$acc kernels ! positive flux on the WEST boundary IF (GWEST) THEN +!$acc kernels ZFPOS(IIB,IJS:IJN,:) = (PSRC(IIB-1,IJS:IJN,:) - ZPHAT(IIB,IJS:IJN,:))*PCR(IIB,IJS:IJN,:) + & ZPHAT(IIB,IJS:IJN,:) ! this is not used ZFPOS(IIB-1,IJS:IJN,:) = 0.0 +!$acc end kernels ENDIF ! +!$acc kernels ! negative fluxes !!$ ZFNEG(IIB:IIE,:,:) = ZPHAT(IIB:IIE,:,:) + & !!$ PCR(IIB:IIE,:,:)*(ZPHAT(IIB:IIE,:,:) - PSRC(IIB:IIE,:,:)) + & @@ -2740,8 +2634,8 @@ ENDIF ! acc update device(ZFNEG) #endif ! -!$acc kernels IF (GEAST) THEN +!$acc kernels ! ! in OPEN case PCR(IIB-1) is not used, so we also set ZFNEG(IIB-1) = 0 ! @@ -2752,6 +2646,7 @@ ENDIF ! ZFNEG(IIE+1,IJS:IJN,:) = (ZPHAT(IIE+1,IJS:IJN,:) - PSRC(IIE+1,IJS:IJN,:))*PCR(IIE+1,IJS:IJN,:) + & ZPHAT(IIE+1,IJS:IJN,:) +!$acc end kernels ENDIF ! ! calculate the advection @@ -2761,7 +2656,6 @@ ENDIF DXF( PCR*MXM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,PCR)) + & ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) #else -!$acc end kernels CALL MXM_DEVICE(PRHO,ZRHO_MXM) !$acc kernels ZCR_MXM = PCR * ZRHO_MXM * ( ZFPOS*(0.5+SIGN(0.5,PCR)) + ZFNEG*(0.5-SIGN(0.5,PCR)) ) @@ -2769,27 +2663,31 @@ ENDIF CALL DXF_DEVICE(ZCR_MXM,ZCR_DXF) !$acc kernels PR = PSRC * PRHO - ZCR_DXF +!$acc end kernels #endif ! ! in OPEN case fix boundary conditions ! IF (GWEST) THEN +!$acc kernels WHERE ( PCR(IIB,IJS:IJN,:) <= 0. ) ! OUTFLOW condition PR(IIB-1,IJS:IJN,:) = 2.*PR(IIB,IJS:IJN,:) - PR(IIB+1,IJS:IJN,:) ELSEWHERE PR(IIB-1,IJS:IJN,:) = PR(IIB,IJS:IJN,:) END WHERE +!$acc end kernels ENDIF ! IF (GEAST) THEN +!$acc kernels WHERE ( PCR(IIE,IJS:IJN,:) >= 0. ) ! OUTFLOW condition PR(IIE+1,IJS:IJN,:) = 2.*PR(IIE,IJS:IJN,:) - PR(IIE-1,IJS:IJN,:) ELSEWHERE PR(IIE+1,IJS:IJN,:) = PR(IIE,IJS:IJN,:) END WHERE +!$acc end kernels ENDIF ! -!$acc end kernels ! ! END SELECT @@ -2813,8 +2711,11 @@ END IF !$acc end data #ifdef MNH_OPENACC -END SUBROUTINE PPM_S0_X_D +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif +#ifdef MNH_OPENACC END SUBROUTINE PPM_S0_X #else END FUNCTION PPM_S0_X @@ -2823,59 +2724,14 @@ END FUNCTION PPM_S0_X !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC ! ######################################################################## -!!$ FUNCTION PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & -!!$ RESULT(PR) +#ifdef MNH_OPENACC SUBROUTINE PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP, PR) - - USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D - USE MODE_MNH_ZWORK, ONLY : ZPSRC_HALO2_SOUTH - - IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCY ! Y direction LBC type -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density -REAL, INTENT(IN) :: PTSTEP ! Time step -! -! output source term -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR - - INTEGER :: IZFPOS,IZPHAT,IZFNEG,IZRHO_MYM,IZCR_MYM,IZCR_DYF - -!$acc data present( PSRC, PCR, PRHO, PR ) - - CALL MNH_GET_ZT3D(IZFPOS,IZFNEG,IZPHAT,IZRHO_MYM,IZCR_MYM,IZCR_DYF) - - CALL PPM_S0_Y_D(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP , PR, & - & ZT3D(:,:,:,IZFPOS),ZT3D(:,:,:,IZFNEG),ZT3D(:,:,:,IZPHAT),ZT3D(:,:,:,IZRHO_MYM), & - & ZT3D(:,:,:,IZCR_MYM),ZT3D(:,:,:,IZCR_DYF),ZPSRC_HALO2_SOUTH ) - - CALL MNH_REL_ZT3D(IZFPOS,IZFNEG,IZPHAT,IZRHO_MYM,IZCR_MYM,IZCR_DYF) - -!$acc end data - -CONTAINS -! -! ######################################################################## - SUBROUTINE PPM_S0_Y_D(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP , PR & - & ,ZFPOS,ZPHAT,ZFNEG & - & ,ZRHO_MYM,ZCR_MYM,ZCR_DYF,ZPSRC_HALO2_SOUTH ) - -! ######################################################################## #else -! ######################################################################## FUNCTION PPM_S0_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP) & RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_S0_Y - PPM advection scheme in Y direction in Skamarock 2006 !! notation - NO CONSTRAINTS @@ -2890,6 +2746,9 @@ CONTAINS USE MODD_CONF USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif USE MODE_MPPDB #ifdef MNH_OPENACC use mode_msg @@ -2902,15 +2761,6 @@ USE MODI_SHUMAN USE MODI_SHUMAN_DEVICE #endif ! -#ifdef MNH_OPENACC -USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll -USE MODD_PARAMETERS, ONLY : JPHEXT -! -USE MODE_MNH_ZWORK, ONLY : IJB,IJE, IIU,IJU,IKU , IIW,IIA, GSOUTH , GNORTH -! -USE MODD_IO, ONLY : GSMONOPROC -#endif -! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -2934,14 +2784,14 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! !* 0.2 Declarations of local variables : ! -#ifndef MNH_OPENACC INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions -INTEGER :: IJS,IJN INTEGER :: IIW,IIA +INTEGER :: IIU, IJU, IKU ! LOGICAL :: GNORTH, GSOUTH ! +#ifndef MNH_OPENACC ! advection fluxes REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG ! @@ -2953,28 +2803,24 @@ TYPE(HALO2LIST_ll), POINTER :: TZ_PHAT_HALO2_ll ! halo2 for ZPHAT ! REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,3)) :: ZPSRC_HALO2_SOUTH #else -! ! advection fluxes -REAL, DIMENSION(:,:,:) :: ZFPOS, ZFNEG +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFPOS, ZFNEG ! ! variable at cell edges -REAL, DIMENSION(:,:,:) :: ZPHAT +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPHAT ! TYPE(HALO2LIST_ll), POINTER :: TZ_PSRC_HALO2_ll ! halo2 for PSRC TYPE(HALO2LIST_ll), POINTER :: TZ_PHAT_HALO2_ll ! halo2 for ZPHAT ! -REAL, DIMENSION(:,:,:) :: ZRHO_MYM , ZCR_MYM , ZCR_DYF +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZCR_DYF, ZCR_MYM, ZRHO_MYM ! INTEGER :: I,J,K ! -REAL, DIMENSION(:,:) :: ZPSRC_HALO2_SOUTH +REAL, DIMENSION(:,:), POINTER, CONTIGUOUS :: ZPSRC_HALO2_SOUTH #endif ! !------------------------------------------------------------------------------- -!$acc data present( PSRC, PCR, PRHO, PR , & -!$acc & ZFPOS, ZFNEG, ZPHAT, ZRHO_MYM, ZCR_MYM, ZCR_DYF, ZPSRC_HALO2_SOUTH ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PCR, "PPM_S0_Y beg:PCR") @@ -2982,11 +2828,31 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC,"PPM_S0_Y beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZFPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFNEG, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZPHAT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZCR_DYF, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZCR_MYM, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRHO_MYM, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZPSRC_HALO2_SOUTH, IIU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PR , & +!$acc & ZFPOS, ZFNEG, ZPHAT, ZRHO_MYM, ZCR_MYM, ZCR_DYF, ZPSRC_HALO2_SOUTH ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ ! -#ifndef MNH_OPENACC CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IIW=IIB IIA=IIE @@ -2995,7 +2861,6 @@ IIA=IIE ! GNORTH = LNORTH_ll() GSOUTH = LSOUTH_ll() -#endif ! !------------------------------------------------------------------------------- ! @@ -3096,7 +2961,6 @@ CALL GET_HALO(ZFNEG, HNAME='ZFNEG') ! JUAN #endif ! CASE ('OPEN') -!$acc kernels ! !!$ ZPHAT(:,IJB,:) = 0.5*(PSRC(:,IJB-1,:) + PSRC(:,IJB,:)) !!$ ZPHAT(:,IJB-1,:) = ZPHAT(:,IJB,:) ! not used @@ -3106,15 +2970,16 @@ CASE ('OPEN') ! SOUTH BOUND ! IF ( .NOT. GSOUTH) THEN +!$acc kernels ZPHAT(IIW:IIA,IJB ,:) = (7.0 * & (PSRC(IIW:IIA,IJB ,:) + PSRC(IIW:IIA,IJB-1,:)) - & (PSRC(IIW:IIA,IJB+1,:) + ZPSRC_HALO2_SOUTH(IIW:IIA,:) )) / 12.0 ! (PSRC(IIW:IIA,IJB+1,:) + TZ_PSRC_HALO2_ll%HALO2%SOUTH(IIW:IIA,:) )) / 12.0 ! <=> SOUTH BOUND (PSRC(IIW:IIA,IJB+1,:) + PSRC(IIW:IIA,IJB-2,:) )) / 12.0 +!$acc end kernels ENDIF ! !TEMPO_JUAN -!$acc end kernels ! #ifndef MNH_OPENACC !PW: a remettre? CALL GET_HALO(ZPHAT, HNAME='ZPHAT') @@ -3124,16 +2989,19 @@ CASE ('OPEN') ! acc update device(ZPHAT) #endif ! -!$acc kernels IF (GSOUTH) THEN +!$acc kernels ZPHAT(IIW:IIA,IJB ,:) = 0.5*(PSRC(IIW:IIA,IJB-1,:) + PSRC(IIW:IIA,IJB,:)) ZPHAT(IIW:IIA,IJB-1,:) = ZPHAT(IIW:IIA,IJB,:) +!$acc end kernels ENDIF ! ! NORTH BOUND ! IF (GNORTH) THEN +!$acc kernels ZPHAT(IIW:IIA,IJE+1,:) = 0.5*(PSRC(IIW:IIA,IJE,:) + PSRC(IIW:IIA,IJE+1,:)) +!$acc end kernels ENDIF ! ! @@ -3147,7 +3015,8 @@ CASE ('OPEN') !!$ PCR(:,IJB+1:IJE+1,:)*(ZPHAT(:,IJB+1:IJE+1,:) - PSRC(:,IJB:IJE,:)) - & !!$ PCR(:,IJB+1:IJE+1,:)*(1.0 - PCR(:,IJB+1:IJE+1,:)) * & !!$ (ZPHAT(:,IJB:IJE,:) - 2.0*PSRC(:,IJB:IJE,:) + ZPHAT(:,IJB+1:IJE+1,:)) - ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZPHAT(IIW:IIA,IJB:IJE+1,:) - & +!$acc kernels + ZFPOS(IIW:IIA,IJB:IJE+1,:) = ZPHAT(IIW:IIA,IJB:IJE+1,:) - & PCR(IIW:IIA,IJB:IJE+1,:)*( ZPHAT(IIW:IIA,IJB:IJE+1,:) - PSRC(IIW:IIA,IJB-1:IJE ,:) ) - & PCR(IIW:IIA,IJB:IJE+1,:)*( 1.0 - PCR(IIW:IIA,IJB :IJE+1,:) ) * & (ZPHAT(IIW:IIA,IJB-1:IJE,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE,:) + ZPHAT(IIW:IIA,IJB:IJE+1,:)) @@ -3161,14 +3030,15 @@ CASE ('OPEN') ! acc update device(ZFPOS) #endif ! -!$acc kernels ! positive flux on the SOUTH boundary IF (GSOUTH) THEN +!$acc kernels ZFPOS(IIW:IIA,IJB,:) = (PSRC(IIW:IIA,IJB-1,:) - ZPHAT(IIW:IIA,IJB,:))*PCR(IIW:IIA,IJB,:) + & ZPHAT(IIW:IIA,IJB,:) ! ! this is not used ZFPOS(IIW:IIA,IJB-1,:) = 0.0 +!$acc end kernels ENDIF ! ! negative fluxes @@ -3176,7 +3046,8 @@ CASE ('OPEN') !!$ PCR(:,IJB:IJE,:)*(ZPHAT(:,IJB:IJE,:) - PSRC(:,IJB:IJE,:)) + & !!$ PCR(:,IJB:IJE,:)*(1.0 + PCR(:,IJB:IJE,:)) * & !!$ (ZPHAT(:,IJB:IJE,:) - 2.0*PSRC(:,IJB:IJE,:) +ZPHAT(:,IJB+1:IJE+1,:)) - ZFNEG(IIW:IIA,IJB-1:IJE,:) = ZPHAT(IIW:IIA,IJB-1:IJE,:) + & +!$acc kernels + ZFNEG(IIW:IIA,IJB-1:IJE,:) = ZPHAT(IIW:IIA,IJB-1:IJE,:) + & PCR(IIW:IIA,IJB-1:IJE,:)*(ZPHAT(IIW:IIA,IJB-1:IJE,:) - PSRC(IIW:IIA,IJB-1:IJE,:)) + & PCR(IIW:IIA,IJB-1:IJE,:)*(1.0 + PCR(IIW:IIA,IJB-1:IJE,:)) * & (ZPHAT(IIW:IIA,IJB-1:IJE,:) - 2.0*PSRC(IIW:IIA,IJB-1:IJE,:) +ZPHAT(IIW:IIA,IJB:IJE+1,:)) @@ -3190,14 +3061,15 @@ CASE ('OPEN') ! acc update device(ZFNEG) #endif ! -!$acc kernels IF (GNORTH) THEN +!$acc kernels ! this is not used ZFNEG(IIW:IIA,IJB-1,:) = 0.0 ! ! negative flux on the NORTH boundary ZFNEG(IIW:IIA,IJE+1,:) = (ZPHAT(IIW:IIA,IJE+1,:) - PSRC(IIW:IIA,IJE+1,:))*PCR(IIW:IIA,IJE+1,:) + & ZPHAT(IIW:IIA,IJE+1,:) +!$acc end kernels ENDIF ! ! calculate the advection @@ -3207,7 +3079,6 @@ CASE ('OPEN') DYF( PCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,PCR)) + & ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) #else -!$acc end kernels CALL MYM_DEVICE(PRHO,ZRHO_MYM) !$acc kernels ZCR_MYM = PCR * ZRHO_MYM * ( ZFPOS(:,:,:)*(0.5+SIGN(0.5,PCR)) + ZFNEG*(0.5-SIGN(0.5,PCR)) ) @@ -3215,28 +3086,31 @@ CASE ('OPEN') CALL DYF_DEVICE(ZCR_MYM,ZCR_DYF) !$acc kernels PR = PSRC * PRHO - ZCR_DYF +!$acc end kernels #endif ! ! in OPEN case fix boundary conditions ! IF (GSOUTH) THEN +!$acc kernels WHERE ( PCR(IIW:IIA,IJB,:) <= 0. ) ! OUTFLOW condition PR(IIW:IIA,IJB-1,:) = 1.0 * 2.*PR(IIW:IIA,IJB,:) - PR(IIW:IIA,IJB+1,:) ELSEWHERE PR(IIW:IIA,IJB-1,:) = PR(IIW:IIA,IJB,:) END WHERE +!$acc end kernels ENDIF ! IF (GNORTH) THEN +!$acc kernels WHERE ( PCR(IIW:IIA,IJE,:) >= 0. ) ! OUTFLOW condition PR(IIW:IIA,IJE+1,:) = 1.0 * 2.*PR(IIW:IIA,IJE,:) - PR(IIW:IIA,IJE-1,:) ELSEWHERE PR(IIW:IIA,IJE+1,:) = PR(IIW:IIA,IJE,:) END WHERE +!$acc end kernels ENDIF ! -!$acc end kernels -! ! END SELECT ! @@ -3260,8 +3134,11 @@ END IF !not L2D !$acc end data #ifdef MNH_OPENACC -END SUBROUTINE PPM_S0_Y_D +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif +#ifdef MNH_OPENACC END SUBROUTINE PPM_S0_Y #else END FUNCTION PPM_S0_Y @@ -3271,58 +3148,14 @@ END FUNCTION PPM_S0_Y !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC -! ######################################################################## -!!$ FUNCTION PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) & -!!$ RESULT(PR) -SUBROUTINE PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP, PR) - - USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D - - IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density -REAL, INTENT(IN) :: PTSTEP ! Time step -! -! output source term -REAL, DIMENSION(:,:,:),INTENT(OUT):: PR - - - INTEGER :: IZFPOS,IZPHAT,IZFNEG,IZRHO_MZM,IZCR_MZM,IZCR_DZF - -!$acc data present ( PSRC, PCR, PRHO, PR ) - - CALL MNH_GET_ZT3D(IZFPOS,IZFNEG,IZPHAT,IZRHO_MZM,IZCR_MZM,IZCR_DZF) - - CALL PPM_S0_Z_D(KGRID, PSRC, PCR, PRHO, PTSTEP , PR, & - & ZT3D(:,:,:,IZFPOS), ZT3D(:,:,:,IZFNEG), ZT3D(:,:,:,IZPHAT), & - & ZT3D(:,:,:,IZRHO_MZM),ZT3D(:,:,:,IZCR_MZM),ZT3D(:,:,:,IZCR_DZF) ) - - CALL MNH_REL_ZT3D(IZFPOS,IZFNEG,IZPHAT,IZRHO_MZM,IZCR_MZM,IZCR_DZF) - -!$acc end data - -CONTAINS -! -! ######################################################################## -SUBROUTINE PPM_S0_Z_D(KGRID, PSRC, PCR, PRHO, PTSTEP , PR & - & ,ZFPOS,ZFNEG,ZPHAT & - & ,ZRHO_MZM,ZCR_MZM,ZCR_DZF ) - ! ######################################################################## +#ifdef MNH_OPENACC + SUBROUTINE PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP, PR) #else -! ######################################################################## FUNCTION PPM_S0_Z(KGRID, PSRC, PCR, PRHO, PTSTEP) & RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_S0_Z - PPM advection scheme in Z direction in Skamarock 2006 !! notation - NO CONSTRAINTS @@ -3334,22 +3167,22 @@ SUBROUTINE PPM_S0_Z_D(KGRID, PSRC, PCR, PRHO, PTSTEP , PR & !! !------------------------------------------------------------------------------- ! +USE MODD_CONF +USE MODD_PARAMETERS + USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif +USE MODE_MPPDB + +USE MODI_GET_HALO #ifndef MNH_OPENACC USE MODI_SHUMAN #else USE MODI_SHUMAN_DEVICE #endif -USE MODI_GET_HALO -! -USE MODD_CONF -USE MODD_PARAMETERS -USE MODE_MPPDB -! -#ifdef MNH_OPENACC -USE MODE_MNH_ZWORK, ONLY : IKB,IKE, IKU -#endif -! + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -3371,10 +3204,11 @@ REAL, DIMENSION(:,:,:),INTENT(OUT):: PR ! !* 0.2 Declarations of local variables : ! -#ifndef MNH_OPENACC INTEGER:: IKB ! Begining useful area in x,y,z directions INTEGER:: IKE ! End useful area in x,y,z directions +INTEGER :: IIU, IJU, IKU ! +#ifndef MNH_OPENACC ! advection fluxes REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG ! @@ -3382,18 +3216,15 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFPOS, ZFNEG REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZPHAT #else ! advection fluxes -REAL, DIMENSION(:,:,:),INTENT(OUT):: ZFPOS, ZFNEG & +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFPOS, ZFNEG ! ! interpolated variable at cell edges - & , ZPHAT & - & , ZRHO_MZM ,ZCR_MZM,ZCR_DZF +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPHAT +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZCR_DZF, ZCR_MZM, ZRHO_MZM #endif ! !------------------------------------------------------------------------------- -!$acc data present ( PSRC, PCR, PRHO, PR , & -!$acc & ZFPOS, ZFNEG, ZPHAT, ZRHO_MZM, ZCR_MZM, ZCR_DZF ) - IF (MPPDB_INITIALIZED) THEN !Check all IN arrays CALL MPPDB_CHECK(PCR, "PPM_S0_Z beg:PCR") @@ -3401,14 +3232,32 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC,"PPM_S0_Z beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZFPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFNEG, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZPHAT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZCR_DZF, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZCR_MZM, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRHO_MZM, IIU, IJU, IKU ) +#endif + +!$acc data present ( PSRC, PCR, PRHO, PR , & +!$acc & ZFPOS, ZFNEG, ZPHAT, ZRHO_MZM, ZCR_MZM, ZCR_DZF ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ ! -#ifndef MNH_OPENACC IKB = 1 + JPVEXT IKE = SIZE(PSRC,3) - JPVEXT -#endif ! !------------------------------------------------------------------------------- ! @@ -3420,9 +3269,7 @@ IKE = SIZE(PSRC,3) - JPVEXT CALL GET_HALO_D(PSRC, HNAME='UPDATE_HALO_ll::GET_HALO::PSRC') #endif ! -#ifdef MNH_OPENACC !$acc kernels -#endif ! ZPHAT(:,:,IKB+1:IKE) = (7.0 * & (PSRC(:,:,IKB+1:IKE) + PSRC(:,:,IKB:IKE-1)) - & @@ -3512,8 +3359,11 @@ END IF !$acc end data #ifdef MNH_OPENACC -END SUBROUTINE PPM_S0_Z_D +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif +#ifdef MNH_OPENACC END SUBROUTINE PPM_S0_Z #else END FUNCTION PPM_S0_Z @@ -3522,71 +3372,14 @@ END FUNCTION PPM_S0_Z !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC -! ######################################################################## -! FUNCTION PPM_S1_X(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & -! PTSTEP) RESULT(PR) - SUBROUTINE PPM_S1_X(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & - PTSTEP, PR) -! ######################################################################## -USE MODE_ll -use mode_msg -USE MODE_IO -USE MODI_SHUMAN_DEVICE -! -USE MODD_CONF -USE MODD_LUNIT -USE MODD_PARAMETERS -! -USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHOT ! density at t+dt -REAL, INTENT(IN) :: PTSTEP ! Time step -! -! output source term -REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR - -INTEGER :: IZPHAT,IZRUT,IZFUP,IZFCOR,IZRPOS,IZRNEG - -!$acc data present( PSRC, PCR, PRHO, PRHOT, PR ) - - call Print_msg( NVERB_ERROR, 'GEN', 'PPM_S1_X', 'OpenACC: not yet implemented' ) - - CALL MNH_GET_ZT3D(IZPHAT,IZRUT,IZFUP,IZFCOR,IZRPOS,IZRNEG) - - CALL PPM_S1_X_D(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP, PR, & - ZT3D(:,:,:,IZPHAT),ZT3D(:,:,:,IZRUT),ZT3D(:,:,:,IZFUP), & - ZT3D(:,:,:,IZFCOR),ZT3D(:,:,:,IZRPOS),ZT3D(:,:,:,IZRNEG) ) - - CALL MNH_REL_ZT3D(IZPHAT,IZRUT,IZFUP,IZFCOR,IZRPOS,IZRNEG) - -!$acc end data - - CONTAINS -! -! ######################################################################## -! FUNCTION PPM_S1_X_D(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & -! PTSTEP) RESULT(PR) - SUBROUTINE PPM_S1_X_D(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & - PTSTEP, PR, ZPHAT,ZRUT,ZFUP,ZFCOR,ZRPOS,ZRNEG) ! ######################################################################## +#ifdef MNH_OPENACC + SUBROUTINE PPM_S1_X(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP, PR) #else -! ######################################################################## FUNCTION PPM_S1_X(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & PTSTEP) RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_S1_X - PPM advection scheme in X direction in Skamarock 2006 !! notation - with flux limiting for monotonicity @@ -3602,6 +3395,9 @@ USE MODD_CONF USE MODD_PARAMETERS USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif use mode_mppdb #ifndef MNH_OPENACC @@ -3640,6 +3436,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! INTEGER:: IIB,IJB,IKB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE,IKE ! End useful area in x,y,z directions +INTEGER :: IIU, IJU, IKU ! #ifndef MNH_OPENACC ! variable at cell edges @@ -3652,13 +3449,13 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFUP, ZFCOR REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRPOS, ZRNEG #else ! variable at cell edges -REAL, DIMENSION(:,:,:) :: ZPHAT, ZRUT +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPHAT, ZRUT ! ! advection fluxes, upwind and correction -REAL, DIMENSION(:,:,:) :: ZFUP, ZFCOR +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFUP, ZFCOR ! ! ratios for limiting the correction flux -REAL, DIMENSION(:,:,:) :: ZRPOS, ZRNEG +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRPOS, ZRNEG #endif ! ! variables for limiting the correction flux @@ -3670,9 +3467,9 @@ INTEGER :: II, IJ, IK INTEGER :: IRESP ! for prints ! !------------------------------------------------------------------------------- - -!$acc data present( PSRC, PCR, PRHO, PRHOT, PR, & -!$acc & ZPHAT, ZRUT, ZFUP, ZFCOR, ZRPOS, ZRNEG ) +#ifdef MNH_OPENACC +call Print_msg( NVERB_ERROR, 'GEN', 'PPM_S1_X', 'OpenACC: not yet implemented' ) +#endif IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -3682,6 +3479,26 @@ IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays CALL MPPDB_CHECK(PSRC, "PPM_S1_X beg:PSRC") END IF + +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZPHAT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRUT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFUP, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFCOR, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRNEG, IIU, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PRHOT, PR, & +!$acc & ZPHAT, ZRUT, ZFUP, ZFCOR, ZRPOS, ZRNEG ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ @@ -3875,7 +3692,11 @@ END IF !$acc end data #ifdef MNH_OPENACC - END SUBROUTINE PPM_S1_X_D +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif + +#ifdef MNH_OPENACC END SUBROUTINE PPM_S1_X #else END FUNCTION PPM_S1_X @@ -3884,71 +3705,15 @@ END FUNCTION PPM_S1_X !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC ! ######################################################################## -! FUNCTION PPM_S1_Y(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & -! PTSTEP) RESULT(PR) - SUBROUTINE PPM_S1_Y(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, & +#ifdef MNH_OPENACC + SUBROUTINE PPM_S1_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PRHOT, & PTSTEP, PR) -! ######################################################################## -USE MODE_ll -USE MODE_IO -use mode_msg -USE MODI_SHUMAN_DEVICE -! -USE MODD_CONF -USE MODD_LUNIT -USE MODD_PARAMETERS -! -USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -CHARACTER (LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX ! X direction LBC type -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHOT ! density at t+dt -REAL, INTENT(IN) :: PTSTEP ! Time step -! -! output source term -REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR - -INTEGER :: IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG - -!$acc data present( PSRC, PCR, PRHO, PRHOT, PR ) - - call Print_msg( NVERB_ERROR, 'GEN', 'PPM_S1_Y', 'OpenACC: not yet implemented' ) - - CALL MNH_GET_ZT3D(IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG) - - CALL PPM_S1_Y_D(HLBCX, KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP, PR, & - ZT3D(:,:,:,IZPHAT),ZT3D(:,:,:,IZRVT),ZT3D(:,:,:,IZFUP), & - ZT3D(:,:,:,IZFCOR),ZT3D(:,:,:,IZRPOS),ZT3D(:,:,:,IZRNEG) ) - - CALL MNH_REL_ZT3D(IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG) - -!$acc end data - - CONTAINS -! -! ######################################################################## -! FUNCTION PPM_S1_Y_D(HLBCY, KGRID, PSRC, PCR, PRHO, PRHOT, & -! PTSTEP) RESULT(PR) - SUBROUTINE PPM_S1_Y_D(HLBCY, KGRID, PSRC, PCR, PRHO, PRHOT, & - PTSTEP, PR, ZPHAT,ZRVT,ZFUP,ZFCOR,ZRPOS,ZRNEG) -! ######################################################################## #else -! ######################################################################## FUNCTION PPM_S1_Y(HLBCY, KGRID, PSRC, PCR, PRHO, PRHOT, & PTSTEP) RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_S1_Y - PPM advection scheme in Y direction in Skamarock 2006 !! notation - with flux limiting for monotonicity @@ -3960,7 +3725,13 @@ INTEGER :: IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG !! !------------------------------------------------------------------------------- ! +USE MODD_CONF +USE MODD_PARAMETERS + USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif use mode_mppdb #ifndef MNH_OPENACC @@ -3970,12 +3741,6 @@ USE MODI_SHUMAN USE MODI_SHUMAN_DEVICE #endif ! -USE MODD_CONF -USE MODD_PARAMETERS -!USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll -#ifdef MNH_OPENACC -USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D -#endif ! IMPLICIT NONE ! @@ -4006,6 +3771,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! INTEGER:: IIB,IJB,IKB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE,IKE ! End useful area in x,y,z directions +INTEGER :: IIU, IJU, IKU ! #ifndef MNH_OPENACC ! variable at cell edges @@ -4018,13 +3784,13 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFUP, ZFCOR REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRPOS, ZRNEG #else ! variable at cell edges -REAL, DIMENSION(:,:,:) :: ZPHAT, ZRVT +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPHAT, ZRVT ! ! advection fluxes, upwind and correction -REAL, DIMENSION(:,:,:) :: ZFUP, ZFCOR +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFUP, ZFCOR ! ! ratios for limiting the correction flux -REAL, DIMENSION(:,:,:) :: ZRPOS, ZRNEG +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRPOS, ZRNEG #endif ! ! variables for limiting the correction flux @@ -4037,9 +3803,9 @@ INTEGER :: II, IJ, IK INTEGER :: IRESP ! Return code of FM-routines ! !------------------------------------------------------------------------------- - -!$acc data present( PSRC, PCR, PRHO, PRHOT, PR , & -!$acc & ZPHAT, ZRVT, ZFUP, ZFCOR, ZRPOS, ZRNEG ) +#ifdef MNH_OPENACC +call Print_msg( NVERB_ERROR, 'GEN', 'PPM_S1_Y', 'OpenACC: not yet implemented' ) +#endif IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -4050,7 +3816,25 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PSRC, "PPM_S1_Y beg:PSRC") END IF -! +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZPHAT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRVT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFUP, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFCOR, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRNEG, IIU, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PRHOT, PR , & +!$acc & ZPHAT, ZRVT, ZFUP, ZFCOR, ZRPOS, ZRNEG ) + IF ( L2D ) THEN PR = PSRC*PRHO !RETURN @@ -4247,7 +4031,11 @@ END IF !not L2D !$acc end data #ifdef MNH_OPENACC - END SUBROUTINE PPM_S1_Y_D +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif + +#ifdef MNH_OPENACC END SUBROUTINE PPM_S1_Y #else END FUNCTION PPM_S1_Y @@ -4256,68 +4044,14 @@ END FUNCTION PPM_S1_Y !------------------------------------------------------------------------------- !------------------------------------------------------------------------------- ! -#ifdef MNH_OPENACC -! -! ######################################################################## -! FUNCTION PPM_S1_Z(KGRID, PSRC, PCR, PRHO, PRHOT, & -! PTSTEP) RESULT(PR) - SUBROUTINE PPM_S1_Z(KGRID, PSRC, PCR, PRHO, PRHOT, & - PTSTEP, PR) -! ######################################################################## -USE MODE_ll -USE MODE_IO -use mode_msg - -USE MODI_SHUMAN_DEVICE -! -USE MODD_CONF -USE MODD_LUNIT -USE MODD_PARAMETERS -! -USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KGRID ! C grid localisation -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSRC ! variable at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PCR ! Courant number -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHO ! density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHOT ! density at t+dt -REAL, INTENT(IN) :: PTSTEP ! Time step -! -! output source term -REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: PR - -INTEGER :: IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG - -!$acc data present( PSRC, PCR, PRHO, PRHOT, PR ) - - call Print_msg( NVERB_ERROR, 'GEN', 'PPM_S1_Z', 'OpenACC: not yet implemented' ) - - CALL MNH_GET_ZT3D(IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG) - - CALL PPM_S1_Z_D(KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP, PR, & - ZT3D(:,:,:,IZPHAT),ZT3D(:,:,:,IZRVT),ZT3D(:,:,:,IZFUP), & - ZT3D(:,:,:,IZFCOR),ZT3D(:,:,:,IZRPOS),ZT3D(:,:,:,IZRNEG) ) - - CALL MNH_REL_ZT3D(IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG) - -!$acc end data - - CONTAINS -! ######################################################################## - SUBROUTINE PPM_S1_Z_D(KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP, & - PR, ZPHAT,ZRVT,ZFUP,ZFCOR,ZRPOS,ZRNEG) ! ######################################################################## +#ifdef MNH_OPENACC + SUBROUTINE PPM_S1_Z(KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP, PR) #else -! ######################################################################## FUNCTION PPM_S1_Z(KGRID, PSRC, PCR, PRHO, PRHOT, PTSTEP) & RESULT(PR) -! ######################################################################## #endif +! ######################################################################## !! !!**** PPM_S1_Z - PPM advection scheme in Z direction in Skamarock 2006 !! notation - with flux limiting for monotonicity @@ -4329,7 +4063,13 @@ INTEGER :: IZPHAT,IZRVT,IZFUP,IZFCOR,IZRPOS,IZRNEG !! !------------------------------------------------------------------------------- ! +USE MODD_CONF +USE MODD_PARAMETERS + USE MODE_ll +#ifdef MNH_OPENACC +USE MODE_MNH_ZWORK, ONLY: MNH_MEM_GET, MNH_MEM_POSITION_PIN, MNH_MEM_RELEASE +#endif use mode_mppdb #ifndef MNH_OPENACC @@ -4338,14 +4078,7 @@ USE MODI_SHUMAN USE MODI_SHUMAN USE MODI_SHUMAN_DEVICE #endif -! -USE MODD_CONF -USE MODD_PARAMETERS -!USE MODD_ARGSLIST_ll, ONLY : HALO2LIST_ll -#ifdef MNH_OPENACC -USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D -#endif -! + IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : @@ -4373,6 +4106,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PR ! INTEGER:: IIB,IJB,IKB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE,IKE ! End useful area in x,y,z directions +INTEGER :: IIU, IJU, IKU ! #ifndef MNH_OPENACC ! variable at cell edges @@ -4385,13 +4119,13 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZFUP, ZFCOR REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: ZRPOS, ZRNEG #else ! variable at cell edges -REAL, DIMENSION(:,:,:) :: ZPHAT, ZRVT +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZPHAT, ZRVT ! ! advection fluxes, upwind and correction -REAL, DIMENSION(:,:,:) :: ZFUP, ZFCOR +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZFUP, ZFCOR ! ! ratios for limiting the correction flux -REAL, DIMENSION(:,:,:) :: ZRPOS, ZRNEG +REAL, DIMENSION(:,:,:), POINTER, CONTIGUOUS :: ZRPOS, ZRNEG #endif ! ! variables for limiting the correction flux @@ -4402,9 +4136,9 @@ REAL, PARAMETER :: ZEPS = 1.0E-16 INTEGER :: II, IJ, IK ! !------------------------------------------------------------------------------- - -!$acc data present( PSRC, PCR, PRHO, PRHOT, PR, & -!$acc & ZPHAT, ZRVT, ZFUP, ZFCOR, ZRPOS, ZRNEG ) +#ifdef MNH_OPENACC +call Print_msg( NVERB_ERROR, 'GEN', 'PPM_S1_Z', 'OpenACC: not yet implemented' ) +#endif IF (MPPDB_INITIALIZED) THEN !Check all IN arrays @@ -4415,6 +4149,25 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PSRC, "PPM_S1_Z beg:PSRC") END IF +iiu = size( PSRC, 1 ) +iju = size( PSRC, 2 ) +iku = size( PSRC, 3 ) + +#ifdef MNH_OPENACC +!Pin positions in the pools of MNH memory +CALL MNH_MEM_POSITION_PIN() + +CALL MNH_MEM_GET( ZPHAT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRVT, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFUP, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZFCOR, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRPOS, IIU, IJU, IKU ) +CALL MNH_MEM_GET( ZRNEG, IIU, IJU, IKU ) +#endif + +!$acc data present( PSRC, PCR, PRHO, PRHOT, PR, & +!$acc & ZPHAT, ZRVT, ZFUP, ZFCOR, ZRPOS, ZRNEG ) + ! !* 0.3. COMPUTES THE DOMAIN DIMENSIONS ! ------------------------------ @@ -4672,7 +4425,11 @@ END IF !$acc end data #ifdef MNH_OPENACC - END SUBROUTINE PPM_S1_Z_D +!Release all memory allocated with MNH_MEM_GET calls since last call to MNH_MEM_POSITION_PIN +CALL MNH_MEM_RELEASE() +#endif + +#ifdef MNH_OPENACC END SUBROUTINE PPM_S1_Z #else END FUNCTION PPM_S1_Z