--- trunk/libf/dyn3d/limx.f 2010/03/25 14:29:07 27 +++ trunk/Sources/dyn3d/limx.f 2015/04/29 15:47:56 134 @@ -1,109 +1,108 @@ -! -! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/limx.F,v 1.1.1.1 2004/05/19 12:53:06 lmdzadmin Exp $ -! - SUBROUTINE limx(s0,sx,sm,pente_max) -c -c Auteurs: P.Le Van, F.Hourdin, F.Forget -c -c ******************************************************************** -c Shema d'advection " pseudo amont " . -c ******************************************************************** -c nq,iq,q,pbaru,pbarv,w sont des arguments d'entree pour le s-pg .... -c -c -c -------------------------------------------------------------------- - use dimens_m - use paramet_m - use comconst - use comvert - use logic - use comgeom - IMPLICIT NONE -c -c -c -c Arguments: -c ---------- - real pente_max - REAL s0(ip1jmp1,llm),sm(ip1jmp1,llm) - real sx(ip1jmp1,llm) -c -c Local -c --------- -c - INTEGER ij,l,j,i,iju,ijq,indu(ip1jmp1),niju - integer n0,iadvplus(ip1jmp1,llm),nl(llm) -c - 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, convflu,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 - -c 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 - -c 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 - -c 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 -c 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 +! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/limx.F,v 1.1.1.1 2004/05/19 +! 12:53:06 lmdzadmin Exp $ - RETURN - END +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 dimens_m + USE paramet_m + USE comconst + USE disvert_m + USE conf_gcm_m + USE comgeom + 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, convflu, 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) + END DO + END DO + + ! 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) + END DO + DO ij = iip1 + iip1, ip1jm, iip1 + dxqu(ij) = dxqu(ij-iim) + END DO + + DO ij = iip2, ip1jm + adxqu(ij) = abs(dxqu(ij)) + END DO + + ! 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)) + END DO + + DO ij = iip1 + iip1, ip1jm, iip1 + dxqmax(ij-iim) = dxqmax(ij) + END DO + + ! calcul de la pente avec limitation + + DO ij = iip2 + 1, ip1jm + IF (dxqu(ij-1)*dxqu(ij)>0. .AND. dxq(ij,l)*dxqu(ij)>0.) THEN + dxq(ij, l) = sign(min(abs(dxq(ij,l)),dxqmax(ij)), dxq(ij,l)) + ELSE + ! extremum local + dxq(ij, l) = 0. + END IF + END DO + DO ij = iip1 + iip1, ip1jm, iip1 + dxq(ij-iim, l) = dxq(ij, l) + END DO + + DO ij = 1, ip1jmp1 + sx(ij, l) = dxq(ij, l)*sm(ij, l) + END DO + + END DO + + RETURN +END SUBROUTINE limx