! ! $Header$ ! SUBROUTINE limx(s0,sx,sm,pente_max) ! ! Auteurs: P.Le Van, F.Hourdin, F.Forget ! ! ******************************************************************** ! Shema d'advection " pseudo amont " . ! ******************************************************************** ! nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... ! ! ! -------------------------------------------------------------------- USE comgeom_mod_h USE dimensions_mod, ONLY: iim, jjm, llm, ndm USE paramet_mod_h IMPLICIT NONE ! ! ! ! Arguments: ! ---------- real :: pente_max REAL :: s0(ip1jmp1,llm),sm(ip1jmp1,llm) real :: sx(ip1jmp1,llm) ! ! Local ! --------- ! INTEGER :: ij,l,j,i,iju,ijq,indu(ip1jmp1),niju integer :: n0,iadvplus(ip1jmp1,llm),nl(llm) ! REAL :: q(ip1jmp1,llm) real :: dxq(ip1jmp1,llm) REAL :: new_m,zm real :: dxqu(ip1jmp1) real :: adxqu(ip1jmp1),dxqmax(ip1jmp1) Logical :: extremum,first save first REAL :: SSUM,CVMGP,CVMGT integer :: ismax,ismin EXTERNAL SSUM, ismin,ismax data first/.true./ DO l = 1,llm DO ij=1,ip1jmp1 q(ij,l) = s0(ij,l) / sm ( ij,l ) dxq(ij,l) = sx(ij,l) /sm(ij,l) ENDDO ENDDO ! calcul de la pente a droite et a gauche de la maille do l = 1, llm do ij=iip2,ip1jm-1 dxqu(ij)=q(ij+1,l)-q(ij,l) enddo do ij=iip1+iip1,ip1jm,iip1 dxqu(ij)=dxqu(ij-iim) enddo do ij=iip2,ip1jm adxqu(ij)=abs(dxqu(ij)) enddo ! calcul de la pente maximum dans la maille en valeur absolue do ij=iip2+1,ip1jm dxqmax(ij)=pente_max*min(adxqu(ij-1),adxqu(ij)) enddo do ij=iip1+iip1,ip1jm,iip1 dxqmax(ij-iim)=dxqmax(ij) enddo ! calcul de la pente avec limitation do ij=iip2+1,ip1jm if( dxqu(ij-1)*dxqu(ij).gt.0. & .and. dxq(ij,l)*dxqu(ij).gt.0.) then dxq(ij,l)= & sign(min(abs(dxq(ij,l)),dxqmax(ij)),dxq(ij,l)) else ! extremum local dxq(ij,l)=0. endif enddo do ij=iip1+iip1,ip1jm,iip1 dxq(ij-iim,l)=dxq(ij,l) enddo DO ij=1,ip1jmp1 sx(ij,l) = dxq(ij,l)*sm(ij,l) ENDDO ENDDO RETURN END SUBROUTINE limx