Maud: use CH_BOUNDARIES with SVMIN
authorJuan Escobar <escj@aero.obs-mip.fr>
Fri, 19 May 2017 08:41:34 +0000 (10:41 +0200)
committerJuan Escobar <escj@aero.obs-mip.fr>
Fri, 19 May 2017 08:41:34 +0000 (10:41 +0200)
src/MNH/boundaries.f90
src/MNH/ch_boundaries.f90

index ea327bc..af52bdd 100644 (file)
@@ -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
index 0f34c95..33fdb27 100644 (file)
@@ -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)