diff --git a/src/ZSOLVER/mass_leak.f90 b/src/ZSOLVER/mass_leak.f90 index c5dc3e31e31f062be44979df10e5bc756e15877f..9ffe52c67bd2b3bceed6459854309e30d6eb4468 100644 --- a/src/ZSOLVER/mass_leak.f90 +++ b/src/ZSOLVER/mass_leak.f90 @@ -147,7 +147,9 @@ INTEGER :: JJ ! Loop index in y direction INTEGER :: JK ! Loop index in z direction ! INTEGER :: IINFO_ll ! return code of parallel routine - +! +LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH +REAL :: ZLEAK_W,ZLEAK_E,ZLEAK_S,ZLEAK_N ! !------------------------------------------------------------------------------- ! @@ -159,6 +161,10 @@ CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IKB = 1 + JPVEXT IKE = SIZE(PRUS,3) - JPVEXT ! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) ! !------------------------------------------------------------------------------- ! @@ -166,57 +172,81 @@ IKE = SIZE(PRUS,3) - JPVEXT ! ------------------- ! ZLEAK=0. +ZLEAK_E=0. +ZLEAK_W=0. +ZLEAK_S=0. +ZLEAK_N=0. ! -IF( HLBCX(1) /= 'CYCL' ) THEN +IF( HLBCY(1) /= 'CYCL' ) THEN ALLOCATE( ZLEAK_W_2D(IIB:IIB,IJB:IJE)) - ZLEAK_W_2D = 0.0 - IF (LWEST_ll()) THEN + ALLOCATE( ZLEAK_E_2D(IIE+1:IIE+1,IJB:IJE)) + !$acc kernels async + ZLEAK_W_2D = 0.0 + IF( GWEST ) THEN DO JK=IKB,IKE DO JJ=IJB,IJE ZLEAK_W_2D(IIB,JJ) = ZLEAK_W_2D(IIB,JJ) - 1./PDXX(IIB,JJ,JK) *PRUS(IIB,JJ,JK) END DO - END DO + END DO END IF - ZLEAK = SUM_DD_R2_ll(ZLEAK_W_2D) -! - ALLOCATE( ZLEAK_E_2D(IIE+1:IIE+1,IJB:IJE)) - ZLEAK_E_2D = 0.0 - IF (LEAST_ll()) THEN - DO JK=IKB,IKE - DO JJ=IJB,IJE - ZLEAK_E_2D(IIE+1,JJ) = ZLEAK_E_2D(IIE+1,JJ) + 1./PDXX(IIE+1,JJ,JK)*PRUS(IIE+1,JJ,JK) - END DO - END DO - END IF - ZLEAK = ZLEAK + SUM_DD_R2_ll(ZLEAK_E_2D) -! + !$acc end kernels + ! + !$acc kernels async + ZLEAK_E_2D = 0.0 + IF( GEAST ) THEN + DO JK=IKB,IKE + DO JJ=IJB,IJE + ZLEAK_E_2D(IIE+1,JJ) = ZLEAK_E_2D(IIE+1,JJ) + 1./PDXX(IIE+1,JJ,JK)*PRUS(IIE+1,JJ,JK) + END DO + END DO + END IF + !$acc end kernels + ! + !$acc wait + ! + ZLEAK_W = SUM_DD_R2_ll(ZLEAK_W_2D) + ZLEAK_E = SUM_DD_R2_ll(ZLEAK_E_2D) END IF ! IF( HLBCY(1) /= 'CYCL' ) THEN ALLOCATE( ZLEAK_S_2D(IIB:IIE,IJB:IJB)) - ZLEAK_S_2D = 0.0 - IF (LSOUTH_ll()) THEN + ALLOCATE( ZLEAK_N_2D(IIB:IIE,IJE+1:IJE+1)) + ! + !$acc kernels async + ZLEAK_S_2D = 0.0 + IF( GSOUTH ) THEN DO JI=IIB,IIE DO JK=IKB,IKE ZLEAK_S_2D(JI,IJB) = ZLEAK_S_2D(JI,IJB) - 1./PDYY(JI,IJB,JK) *PRVS(JI,IJB,JK) END DO END DO END IF - ZLEAK = ZLEAK + SUM_DD_R2_ll(ZLEAK_S_2D) + !$acc end kernels ! - ALLOCATE( ZLEAK_N_2D(IIB:IIE,IJE+1:IJE+1)) + !$acc kernels async ZLEAK_N_2D = 0.0 - IF (LNORTH_ll()) THEN + IF ( GNORTH ) THEN DO JI=IIB,IIE DO JK=IKB,IKE ZLEAK_N_2D(JI,IJE+1) = ZLEAK_N_2D(JI,IJE+1) + 1./PDYY(JI,IJE+1,JK)*PRVS(JI,IJE+1,JK) END DO END DO END IF - ZLEAK = ZLEAK + SUM_DD_R2_ll(ZLEAK_N_2D) + !$acc end kernels ! + !$acc wait + ! + ZLEAK_S = SUM_DD_R2_ll(ZLEAK_S_2D) + ZLEAK_N = SUM_DD_R2_ll(ZLEAK_N_2D) +! END IF ! +ZLEAK = ZLEAK_E + ZLEAK_W + ZLEAK_S + ZLEAK_N +!!$ZLEAK = ZLEAK_E +!!$ZLEAK = ZLEAK + ZLEAK_W +!!$ZLEAK = ZLEAK + ZLEAK_S +!!$ZLEAK = ZLEAK + ZLEAK_N +! !CALL REDUCESUM_ll(ZLEAK,IINFO_ll) ! we do the reducesum_ll in SUM_DD_R2_ll so we do not do it here ! !------------------------------------------------------------------------------- @@ -227,18 +257,31 @@ END IF ZUSTOP=ZLEAK ZUSTOP=ZUSTOP/PLINMASS ! -IF (HLBCX(1)=='OPEN' .AND. LWEST_ll() ) & - PRUS(IIB,:,:)=PRUS(IIB,:,:)+ZUSTOP*0.5*(PRHODJ(IIB,:,:)+PRHODJ(IIB-1,:,:)) +IF (HLBCX(1)=='OPEN' .AND. LWEST_ll() ) THEN + !$acc kernels async + PRUS(IIB,:,:)=PRUS(IIB,:,:)+ZUSTOP*0.5*(PRHODJ(IIB,:,:)+PRHODJ(IIB-1,:,:)) + !$acc end kernels +END IF ! -IF (HLBCX(2)=='OPEN' .AND. LEAST_ll() ) & - PRUS(IIE+1,:,:)=PRUS(IIE+1,:,:)-ZUSTOP*0.5*(PRHODJ(IIE+1,:,:)+PRHODJ(IIE,:,:)) +IF (HLBCX(2)=='OPEN' .AND. LEAST_ll() ) THEN + !$acc kernels async + PRUS(IIE+1,:,:)=PRUS(IIE+1,:,:)-ZUSTOP*0.5*(PRHODJ(IIE+1,:,:)+PRHODJ(IIE,:,:)) + !$acc end kernels +END IF ! -IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll() ) & - PRVS(:,IJB,:)=PRVS(:,IJB,:)+ZUSTOP*0.5*(PRHODJ(:,IJB,:)+PRHODJ(:,IJB-1,:)) +IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll() ) THEN + !$acc kernels async + PRVS(:,IJB,:)=PRVS(:,IJB,:)+ZUSTOP*0.5*(PRHODJ(:,IJB,:)+PRHODJ(:,IJB-1,:)) + !$acc end kernels +END IF ! -IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll() ) & - PRVS(:,IJE+1,:)=PRVS(:,IJE+1,:)-ZUSTOP*0.5*(PRHODJ(:,IJE+1,:)+PRHODJ(:,IJE,:)) +IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll() ) THEN + !$acc kernels async + PRVS(:,IJE+1,:)=PRVS(:,IJE+1,:)-ZUSTOP*0.5*(PRHODJ(:,IJE+1,:)+PRHODJ(:,IJE,:)) + !$acc end kernels +END IF ! +!$acc wait ! ! !-------------------------------------------------------------------------------