diff --git a/src/MNH/boundaries.f90 b/src/MNH/boundaries.f90 index ea327bccbb4525a4b0e4d0b10634a748979566c4..af52bdd153e4eb9235754a8641918633e434caee 100644 --- a/src/MNH/boundaries.f90 +++ b/src/MNH/boundaries.f90 @@ -872,7 +872,7 @@ IF (LUSECHEM .AND. IMI == 1) THEN DO JSV=NSV_CHEMBEG,NSV_CHEMEND IF (GCHBOUNDARY(JSV-NSV_CHEMBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -895,7 +895,7 @@ IF (LUSECHIC .AND. IMI == 1) THEN DO JSV=NSV_CHICBEG,NSV_CHICEND IF (GICBOUNDARY(JSV-NSV_CHICBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -917,7 +917,7 @@ IF (LORILAM .AND. IMI == 1) THEN DO JSV=NSV_AERBEG,NSV_AEREND IF (GAERBOUNDARY(JSV-NSV_AERBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -940,7 +940,7 @@ IF (LDUST .AND. IMI == 1) THEN DO JSV=NSV_DSTBEG,NSV_DSTEND IF (GDSTBOUNDARY(JSV-NSV_DSTBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -963,7 +963,7 @@ IF (LSALT .AND. IMI == 1) THEN DO JSV=NSV_SLTBEG,NSV_SLTEND IF (GSLTBOUNDARY(JSV-NSV_SLTBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -986,7 +986,7 @@ IF ( LPASPOL .AND. IMI == 1) THEN DO JSV=NSV_PPBEG,NSV_PPEND IF (GPPBOUNDARY(JSV-NSV_PPBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -1009,7 +1009,7 @@ IF ( LCONDSAMP .AND. IMI == 1) THEN DO JSV=NSV_CSBEG,NSV_CSEND IF (GCSBOUNDARY(JSV-NSV_CSBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO @@ -1033,9 +1033,7 @@ IF ( LFOREFIRE .AND. IMI == 1) THEN DO JSV=NSV_FFBEG,NSV_FFEND IF (GFFBOUNDARY(JSV-NSV_FFBEG+1)) THEN IF (SIZE(PSVT)>0) THEN - CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV)) - ELSE -!!$ CALL CH_BOUNDARIES (HLBCX,HLBCY,PSVM(:,:,:,JSV),PUM,PVM,PSVM(:,:,:,JSV)) + CALL CH_BOUNDARIES (HLBCX,HLBCY,PUT,PVT,PSVT(:,:,:,JSV),XSVMIN(JSV)) ENDIF ENDIF ENDDO diff --git a/src/MNH/ch_boundaries.f90 b/src/MNH/ch_boundaries.f90 index 0f34c9577a154d8c645b31782fa2abb49da48d1f..33fdb27af5a9fa3e23dee73a1fce12e6261b4573 100644 --- a/src/MNH/ch_boundaries.f90 +++ b/src/MNH/ch_boundaries.f90 @@ -15,11 +15,12 @@ MODULE MODI_CH_BOUNDARIES INTERFACE ! SUBROUTINE CH_BOUNDARIES (HLBCX,HLBCY, & - PUT,PVT,PSVBT ) + PUT,PVT,PSVBT,PSVMIN ) ! CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSVBT REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT +REAL :: PSVMIN ! END SUBROUTINE CH_BOUNDARIES ! @@ -30,7 +31,7 @@ END MODULE MODI_CH_BOUNDARIES ! ! #################################################################### SUBROUTINE CH_BOUNDARIES (HLBCX,HLBCY, & - PUT,PVT,PSVBT ) + PUT,PVT,PSVBT,PSVMIN ) ! #################################################################### ! !!**** *CH_BOUNDARIES* - routine to prepare the Lateral Boundary Conditions for @@ -69,6 +70,7 @@ SUBROUTINE CH_BOUNDARIES (HLBCX,HLBCY, & !! Original 06/06/00 !! 06/06/00 (C. Mari) embedded into mesonh routines !! 15/02/01 (P. Tulet) update for MOCAGE lateral boundary conditions +!! 10/02/17 (M. Leriche) prevent negative values !! !------------------------------------------------------------------------------- ! @@ -90,6 +92,7 @@ IMPLICIT NONE CHARACTER(LEN=4), DIMENSION(2), INTENT(IN) :: HLBCX,HLBCY REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PSVBT REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT,PVT +REAL :: PSVMIN ! ! ! @@ -170,12 +173,12 @@ IF (LWEST_ll( ) .AND. HLBCX(1)=='OPEN') THEN DO IK= 1,IKU IF ( PUT(IIB,IJ,IK) <= 0. ) THEN ! OUTFLOW condition PSVBT(IIB-1,IJ,IK) = & - 2.*PSVBT (IIB,IJ,IK) -PSVBT (IIB+1,IJ,IK) + MAX(PSVMIN,2.*PSVBT (IIB,IJ,IK) -PSVBT (IIB+1,IJ,IK)) ELSE ! INFLOW condition IF (ZZZW(1,IJ,IK) > -999.) THEN - PSVBT(IIB-1,IJ,IK) = PSVBT(IIB+1,IJ,IZZW(1,IJ,IK))+& + PSVBT(IIB-1,IJ,IK) = MAX(PSVMIN,PSVBT(IIB+1,IJ,IZZW(1,IJ,IK))+& (PSVBT(IIB+1,IJ,IZZW(1,IJ,IK)+1)-& - PSVBT(IIB+1,IJ,IZZW(1,IJ,IK))) * ZZZW(1,IJ,IK) + PSVBT(IIB+1,IJ,IZZW(1,IJ,IK))) * ZZZW(1,IJ,IK)) ! ELSE PSVBT(IIB-1,IJ,IK) = PSVBT(IIB+1,IJ,IK) @@ -218,13 +221,13 @@ IF (LEAST_ll( ) .AND. HLBCX(1)=='OPEN') THEN DO IK=1,IKU IF ( PUT(IIE+1,IJ,IK) >= 0. ) THEN ! OUTFLOW condition PSVBT(IIE+1,IJ,IK) = & - 2.*PSVBT (IIE,IJ,IK) -PSVBT (IIE-1,IJ,IK) + MAX(PSVMIN,2.*PSVBT (IIE,IJ,IK) -PSVBT (IIE-1,IJ,IK)) ELSE ! INFLOW condition IF (ZZZE(1,IJ,IK) > -999.) THEN PSVBT(IIE+1,IJ,IK) = & - PSVBT(IIE-1,IJ,IZZE(1,IJ,IK))+& + MAX(PSVMIN,PSVBT(IIE-1,IJ,IZZE(1,IJ,IK))+& (PSVBT(IIE-1,IJ,IZZE(1,IJ,IK)+1)-& - PSVBT(IIE-1,IJ,IZZE(1,IJ,IK))) * ZZZE(1,IJ,IK) + PSVBT(IIE-1,IJ,IZZE(1,IJ,IK))) * ZZZE(1,IJ,IK)) ! ELSE PSVBT(IIE+1,IJ,IK) = PSVBT(IIE-1,IJ,IK) @@ -268,13 +271,13 @@ IF (LSOUTH_ll( ) .AND. HLBCY(1)=='OPEN') THEN DO IK=1,IKU IF ( PVT(II,IJB,IK) <= 0. ) THEN ! OUTFLOW condition PSVBT(II,IJB-1,IK) = & - 2.*PSVBT (II,IJB,IK) -PSVBT (II,IJB+1,IK) + MAX(PSVMIN,2.*PSVBT (II,IJB,IK) -PSVBT (II,IJB+1,IK)) ELSE ! INFLOW condition IF (ZZZS(II,1,IK) > -999.) THEN PSVBT(II,IJB-1,IK) = & - PSVBT(II,IJB+1,IZZS(II,1,IK))+& + MAX(PSVMIN,PSVBT(II,IJB+1,IZZS(II,1,IK))+& (PSVBT(II,IJB+1,IZZS(II,1,IK)+1)-& - PSVBT(II,IJB+1,IZZS(II,1,IK))) * ZZZS(II,1,IK) + PSVBT(II,IJB+1,IZZS(II,1,IK))) * ZZZS(II,1,IK)) ! ELSE PSVBT(II,IJB-1,IK) = PSVBT(II,IJB+1,IK) @@ -319,13 +322,13 @@ IF (LNORTH_ll( ) .AND. HLBCY(2)=='OPEN') THEN DO IK=1,IKU IF ( PVT(II,IJE+1,IK) >= 0. ) THEN ! OUTFLOW condition PSVBT(II,IJE+1,IK) = & - 2.*PSVBT (II,IJE,IK) -PSVBT (II,IJE-1,IK) + MAX(PSVMIN,2.*PSVBT (II,IJE,IK) -PSVBT (II,IJE-1,IK)) ELSE ! INFLOW condition IF (ZZZN(II,1,IK) > -999.) THEN PSVBT(II,IJE+1,IK) = & - PSVBT(II,IJE-1,IZZN(II,1,IK))+& + MAX(PSVMIN,PSVBT(II,IJE-1,IZZN(II,1,IK))+& (PSVBT(II,IJE-1,IZZN(II,1,IK)+1)-& - PSVBT(II,IJE-1,IZZN(II,1,IK))) * ZZZN(II,1,IK) + PSVBT(II,IJE-1,IZZN(II,1,IK))) * ZZZN(II,1,IK)) ! ELSE PSVBT(II,IJE+1,IK) = PSVBT(II,IJE-1,IK)