diff --git a/MNH/ppm.f90 b/MNH/ppm.f90 index 254e3296d7e5f621fb53caedeb059ce078112b9c..08d964d714e47d1f9f6d3bdfcd1bb3df64663b4c 100644 --- a/MNH/ppm.f90 +++ b/MNH/ppm.f90 @@ -250,7 +250,7 @@ USE MODD_LUNIT !END JUAN PPM_LL USE MODE_MPPDB USE MODD_PARAMETERS, ONLY : JPHEXT -USE MODE_TOOLS_ll, ONLY : GET_INDICE_ll, LEAST_ll, LWEST_ll +! ! ! IMPLICIT NONE @@ -761,6 +761,7 @@ END SUBROUTINE PPM_01_X 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 ! @@ -782,7 +783,8 @@ INTEGER :: IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG CALL MNH_GET_ZT3D(IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG) - CALL PPM_01_Y_D(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP, PR, & + 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) ) @@ -791,7 +793,8 @@ INTEGER :: IZQL,IZQR,IZDQ,IZQ6,IZDMQ,IZQL0,IZQR0,IZQ60,IZFPOS,IZFNEG CONTAINS - SUBROUTINE PPM_01_Y_D(HLBCY, KGRID, PSRC, PCR, PRHO, PTSTEP, PR, & + 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) ! ######################################################################## @@ -827,19 +830,19 @@ 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 +REAL, DIMENSION(IIU,IJU,IKU), INTENT(INOUT):: PSRC ! variable at t +REAL, DIMENSION(IIU,IJU,IKU), INTENT(IN) :: PCR & ! Courant number , PRHO ! density ! ! output source term -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PR +REAL, DIMENSION(IIU,IJU,IKU), INTENT(INOUT) :: PR !$acc declare present (PSRC,PCR,PRHO,PR) ! ! !* 0.2 Declarations of local variables : ! ! terms used in parabolic interpolation, dmq, qL, qR, dq, q6 -REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: & +REAL, DIMENSION(IIU,IJU,IKU) :: & ZQL,ZQR , ZDQ,ZQ6 , ZDMQ & ! extra variables for the initial guess of parabolae parameters , ZQL0,ZQR0,ZQ60 & @@ -850,10 +853,8 @@ REAL, DIMENSION(SIZE(PCR,1),SIZE(PCR,2),SIZE(PCR,3)) :: & INTEGER:: IIB,IJB ! Begining useful area in x,y,z directions INTEGER:: IIE,IJE ! End useful area in x,y,z directions ! -!BEG JUAN PPM_LL -INTEGER :: ILUOUT,IRESP ! for prints -INTEGER :: IIW,IIA -!END JUAN PPM_LL +INTEGER :: ILUOUT,IRESP ! for prints +INTEGER :: IIW,IIA ! !JUAN ACC INTEGER :: I,J,K ,IIU,IJU,IKU @@ -877,10 +878,6 @@ CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IIW=IIB IIA=IIE -IIU=size(psrc,1) -IJU=size(psrc,2) -IKU=size(psrc,3) - GSOUTH=LSOUTH_ll() GNORTH=LNORTH_ll() @@ -902,21 +899,33 @@ CALL GET_HALO_D(PSRC,HDIR="01_Y") ! #define JUAN_ACC_01_Y #ifdef JUAN_ACC_01_Y -!$acc data +!acc data ! create/mirror (ZQL,ZQR,ZDQ,ZQ6,ZDMQ,ZQL0,ZQR0,ZQ60,ZFPOS,ZFNEG) !$acc kernels #endif -PR=PSRC -ZQL=PSRC -ZQR=PSRC -ZDQ=PSRC -ZQ6=PSRC -ZDMQ=PSRC -ZQL0=PSRC -ZQR0=PSRC -ZQ60=PSRC -ZFPOS=PSRC -ZFNEG=PSRC + + +ZFPOS(1:IIW,:,:)=PSRC(1:IIW,:,:) +ZFNEG(1:IIW,:,:)=PSRC(1:IIW,:,:) +!!$ +ZFPOS(IIA:,:,:)=PSRC(IIA:,:,:) +ZFNEG(IIA:,:,:)=PSRC(IIA:,:,:) + + +!!INUTILE $PR=PSRC +!!INUTILE $ZQL=PSRC +!!INUTILE $ZQR=PSRC +!!INUTILE $ZDQ=PSRC +!!INUTILE $ZQ6=PSRC +!!INUTILE $ZDMQ=PSRC + +!!INUTILE $ZQL0=PSRC +!!INUTILE $ZQR0=PSRC +!!INUTILE $ZQ60=PSRC + +!!$ZFPOS=PSRC +!!$ZFNEG=PSRC + ! acc end kernels ! !!$SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side @@ -998,7 +1007,7 @@ ZFNEG=PSRC !!$ (ZDQ(IIW:IIA,IJB-1:IJE,:) - (1.0 - 2.0*PCR(IIW:IIA,IJB:IJE+1,:)/3.0) & !!$ * ZQ6(IIW:IIA,IJB-1:IJE,:)) !!$! -!!$ CALL GET_HALO(ZFPOS(:,:,:),HDIR="01_Y") +!!$ CALL GET_HALO(ZFPOS,HDIR="01_Y") !!$! !!$! SOUTH BOUND !!$! @@ -1012,7 +1021,7 @@ ZFNEG=PSRC !!$! !!$! advect the actual field in Y direction by V*dt !!$! -!!$ PR = DYF( PCR*MYM(PRHO)*( ZFPOS(:,:,:)*(0.5+SIGN(0.5,PCR)) + & +!!$ PR = DYF( PCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,PCR)) + & !!$ ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) !!$ CALL GET_HALO(PR,HDIR="01_Y") !!$ CALL MPPDB_CHECK3DM("PPM::PPM_01_Y CYCL ::PR",PRECISION,PR) @@ -1135,7 +1144,7 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y") ! ! initialize final parabolae parameters ! - ZQL(:,:,:) = ZQL0 + ZQL = ZQL0 ZQR = ZQR0 ZQ6 = ZQ60 !#acc end kernels @@ -1144,18 +1153,18 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y") ! ! acc kernels WHERE ( ZDMQ == 0.0 ) - ZQL(:,:,:) = PSRC + ZQL = PSRC ZQR = PSRC ZQ6 = 0.0 ENDWHERE WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ < -(ZDQ)**2 ) ) ZQ6 = 3.0*(ZQL0 - PSRC) ZQR = ZQL0 - ZQ6 - ZQL(:,:,:) = ZQL0 + ZQL = ZQL0 ENDWHERE WHERE ( ( ZDMQ /= 0.0 ) .AND. ( ZQ60*ZDQ > (ZDQ)**2 ) ) ZQ6 = 3.0*(ZQR0 - PSRC) - ZQL(:,:,:) = ZQR0 - ZQ6 + ZQL = ZQR0 - ZQ6 ZQR = ZQR0 END WHERE ! acc end kernels @@ -1164,7 +1173,7 @@ CALL GET_HALO_D(ZQL0,HDIR="01_Y") ! recalculate coefficients of the parabolae ! !#acc kernels - ZDQ = ZQR - ZQL(:,:,:) + ZDQ = ZQR - ZQL !#acc end kernels ! ! and finally calculate fluxes for the advection @@ -1233,24 +1242,22 @@ CALL GET_HALO_D(ZFPOS,HDIR="01_Y") ZQR(IIW:IIA,IJE,:) !#acc end kernels ENDIF -!!$! -!!$! advect the actual field in X direction by U*dt -!!$! +! +! advect the actual field in X direction by U*dt +! !#acc kernels mym(ZQL,PRHO) - ZQR = PCR* ZQL(:,:,:)*( ZFPOS(:,:,:)*(0.5+SIGN(0.5,PCR)) + ZFNEG*(0.5-SIGN(0.5,PCR)) ) + ZQR = PCR* ZQL*( ZFPOS*(0.5+SIGN(0.5,PCR)) + ZFNEG*(0.5-SIGN(0.5,PCR)) ) dyf(PR,ZQR) !#acc end kernels -!!$ PR = ZDMQ + ZQL0 + ZDQ + ZQ60 + ZQL + ZQR + ZQ6 + ZQR0 + ZFPOS(:,:,:) + ZFNEG - -!!$ PR = DYF( PCR*MYM(PRHO)*( ZFPOS(:,:,:)*(0.5+SIGN(0.5,PCR)) + & +!!$ PR = DYF( PCR*MYM(PRHO)*( ZFPOS*(0.5+SIGN(0.5,PCR)) + & !!$ ZFNEG*(0.5-SIGN(0.5,PCR)) ) ) !!$! #ifdef JUAN_ACC_01_Y !$acc end kernels -!$acc end data +!acc end data #endif CALL GET_HALO_D(PR,HDIR="01_Y")