/[lmdze]/trunk/Sources/dyn3d/limy.f
ViewVC logotype

Diff of /trunk/Sources/dyn3d/limy.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/libf/dyn3d/limy.f revision 3 by guez, Wed Feb 27 13:16:39 2008 UTC trunk/Sources/dyn3d/limy.f revision 178 by guez, Fri Mar 11 18:47:26 2016 UTC
# Line 1  Line 1 
 !  
 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/limy.F,v 1.1.1.1 2004/05/19 12:53:07 lmdzadmin Exp $  
 !  
       SUBROUTINE limy(s0,sy,sm,pente_max)  
 c  
 c     Auteurs:   P.Le Van, F.Hourdin, F.Forget  
 c  
 c    ********************************************************************  
 c     Shema  d'advection " pseudo amont " .  
 c    ********************************************************************  
 c     q,w sont des arguments d'entree  pour le s-pg ....  
 c     dq               sont des arguments de sortie 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),sy(ip1jmp1,llm),sm(ip1jmp1,llm)  
 c  
 c      Local  
 c   ---------  
 c  
       INTEGER i,ij,l  
 c  
       REAL q(ip1jmp1,llm)  
       REAL airej2,airejjm,airescb(iim),airesch(iim)  
       real sigv,dyq(ip1jmp1),dyqv(ip1jm)  
       real adyqv(ip1jm),dyqmax(ip1jmp1)  
       REAL qbyv(ip1jm,llm)  
   
       REAL qpns,qpsn,apn,aps,dyn1,dys1,dyn2,dys2  
       Logical extremum,first  
       save first  
   
       real convpn,convps,convmpn,convmps  
       real sinlon(iip1),sinlondlon(iip1)  
       real coslon(iip1),coslondlon(iip1)  
       save sinlon,coslon,sinlondlon,coslondlon  
 c  
 c  
       REAL      SSUM  
       integer ismax,ismin  
       EXTERNAL  SSUM, convflu,ismin,ismax  
       EXTERNAL filtreg  
   
       data first/.true./  
   
       if(first) then  
          print*,'SCHEMA AMONT NOUVEAU'  
          first=.false.  
          do i=2,iip1  
             coslon(i)=cos(rlonv(i))  
             sinlon(i)=sin(rlonv(i))  
             coslondlon(i)=coslon(i)*(rlonu(i)-rlonu(i-1))/pi  
             sinlondlon(i)=sinlon(i)*(rlonu(i)-rlonu(i-1))/pi  
          enddo  
          coslon(1)=coslon(iip1)  
          coslondlon(1)=coslondlon(iip1)  
          sinlon(1)=sinlon(iip1)  
          sinlondlon(1)=sinlondlon(iip1)  
       endif  
   
 c  
   
       do l = 1, llm  
 c  
          DO ij=1,ip1jmp1  
                q(ij,l) = s0(ij,l) / sm ( ij,l )  
                dyq(ij) = sy(ij,l) / sm ( ij,l )  
          ENDDO  
 c  
 c   --------------------------------  
 c      CALCUL EN LATITUDE  
 c   --------------------------------  
   
 c   On commence par calculer la valeur du traceur moyenne sur le premier cercle  
 c   de latitude autour du pole (qpns pour le pole nord et qpsn pour  
 c    le pole nord) qui sera utilisee pour evaluer les pentes au pole.  
   
       airej2 = SSUM( iim, aire(iip2), 1 )  
       airejjm= SSUM( iim, aire(ip1jm -iim), 1 )  
       DO i = 1, iim  
       airescb(i) = aire(i+ iip1) * q(i+ iip1,l)  
       airesch(i) = aire(i+ ip1jm- iip1) * q(i+ ip1jm- iip1,l)  
       ENDDO  
       qpns   = SSUM( iim,  airescb ,1 ) / airej2  
       qpsn   = SSUM( iim,  airesch ,1 ) / airejjm  
   
 c   calcul des pentes aux points v  
   
       do ij=1,ip1jm  
          dyqv(ij)=q(ij,l)-q(ij+iip1,l)  
          adyqv(ij)=abs(dyqv(ij))  
       ENDDO  
   
 c   calcul des pentes aux points scalaires  
   
       do ij=iip2,ip1jm  
          dyqmax(ij)=min(adyqv(ij-iip1),adyqv(ij))  
          dyqmax(ij)=pente_max*dyqmax(ij)  
       enddo  
   
 c   calcul des pentes aux poles  
   
 c   calcul des pentes limites aux poles  
   
 c     print*,dyqv(iip1+1)  
 c     apn=abs(dyq(1)/dyqv(iip1+1))  
 c     print*,dyq(ip1jm+1)  
 c     print*,dyqv(ip1jm-iip1+1)  
 c     aps=abs(dyq(ip1jm+1)/dyqv(ip1jm-iip1+1))  
 c     do ij=2,iim  
 c        apn=amax1(abs(dyq(ij)/dyqv(ij)),apn)  
 c        aps=amax1(abs(dyq(ip1jm+ij)/dyqv(ip1jm-iip1+ij)),aps)  
 c     enddo  
 c     apn=min(pente_max/apn,1.)  
 c     aps=min(pente_max/aps,1.)  
   
   
 c   cas ou on a un extremum au pole  
   
 c     if(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)  
 c    &   apn=0.  
 c     if(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*  
 c    &   dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)  
 c    &   aps=0.  
   
 c   limitation des pentes aux poles  
 c     do ij=1,iip1  
 c        dyq(ij)=apn*dyq(ij)  
 c        dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)  
 c     enddo  
   
 c   test  
 c      do ij=1,iip1  
 c         dyq(iip1+ij)=0.  
 c         dyq(ip1jm+ij-iip1)=0.  
 c      enddo  
 c      do ij=1,ip1jmp1  
 c         dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))  
 c      enddo  
   
       if(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)  
      &   then  
          do ij=1,iip1  
             dyqmax(ij)=0.  
          enddo  
       else  
          do ij=1,iip1  
             dyqmax(ij)=pente_max*abs(dyqv(ij))  
          enddo  
       endif  
   
       if(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*  
      & dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)  
      &then  
          do ij=ip1jm+1,ip1jmp1  
             dyqmax(ij)=0.  
          enddo  
       else  
          do ij=ip1jm+1,ip1jmp1  
             dyqmax(ij)=pente_max*abs(dyqv(ij-iip1))  
          enddo  
       endif  
   
 c   calcul des pentes limitees  
   
       do ij=1,ip1jmp1  
          if(dyqv(ij)*dyqv(ij-iip1).gt.0.) then  
             dyq(ij)=sign(min(abs(dyq(ij)),dyqmax(ij)),dyq(ij))  
          else  
             dyq(ij)=0.  
          endif  
       enddo  
   
          DO ij=1,ip1jmp1  
                sy(ij,l) = dyq(ij) * sm ( ij,l )  
         ENDDO  
1    
2        enddo ! fin de la boucle sur les couches verticales  ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/limy.F,v 1.1.1.1 2004/05/19
3    ! 12:53:07 lmdzadmin Exp $
4    
5        RETURN  SUBROUTINE limy(s0, sy, sm, pente_max)
6        END  
7      ! Auteurs:   P.Le Van, F.Hourdin, F.Forget
8    
9      ! ********************************************************************
10      ! Shema  d'advection " pseudo amont " .
11      ! ********************************************************************
12      ! q,w sont des arguments d'entree  pour le s-pg ....
13      ! dq         sont des arguments de sortie pour le s-pg ....
14    
15    
16      ! --------------------------------------------------------------------
17      USE comconst
18      USE conf_gcm_m
19      USE dimens_m
20      USE disvert_m
21      USE dynetat0_m, only: rlonv, rlonu
22      USE nr_util, ONLY: pi
23      USE paramet_m
24    
25      IMPLICIT NONE
26    
27    
28    
29      ! Arguments:
30      ! ----------
31      REAL pente_max
32      REAL s0(ip1jmp1, llm), sy(ip1jmp1, llm), sm(ip1jmp1, llm)
33    
34      ! Local
35      ! ---------
36    
37      INTEGER i, ij, l
38    
39      REAL q(ip1jmp1, llm)
40      REAL dyq(ip1jmp1), dyqv(ip1jm)
41      REAL adyqv(ip1jm), dyqmax(ip1jmp1)
42    
43      LOGICAL first
44      SAVE first
45    
46      REAL sinlon(iip1), sinlondlon(iip1)
47      REAL coslon(iip1), coslondlon(iip1)
48      SAVE sinlon, coslon, sinlondlon, coslondlon
49    
50    
51      INTEGER ismax, ismin
52      EXTERNAL convflu, ismin, ismax
53    
54      DATA first/.TRUE./
55    
56      IF (first) THEN
57        PRINT *, 'SCHEMA AMONT NOUVEAU'
58        first = .FALSE.
59        DO i = 2, iip1
60          coslon(i) = cos(rlonv(i))
61          sinlon(i) = sin(rlonv(i))
62          coslondlon(i) = coslon(i)*(rlonu(i)-rlonu(i-1))/pi
63          sinlondlon(i) = sinlon(i)*(rlonu(i)-rlonu(i-1))/pi
64        END DO
65        coslon(1) = coslon(iip1)
66        coslondlon(1) = coslondlon(iip1)
67        sinlon(1) = sinlon(iip1)
68        sinlondlon(1) = sinlondlon(iip1)
69      END IF
70    
71    
72    
73      DO l = 1, llm
74    
75        DO ij = 1, ip1jmp1
76          q(ij, l) = s0(ij, l)/sm(ij, l)
77          dyq(ij) = sy(ij, l)/sm(ij, l)
78        END DO
79    
80        ! --------------------------------
81        ! CALCUL EN LATITUDE
82        ! --------------------------------
83    
84        ! On commence par calculer la valeur du traceur moyenne sur le premier
85        ! cercle
86        ! de latitude autour du pole (qpns pour le pole nord et qpsn pour
87        ! le pole nord) qui sera utilisee pour evaluer les pentes au pole.
88    
89        ! calcul des pentes aux points v
90    
91        DO ij = 1, ip1jm
92          dyqv(ij) = q(ij, l) - q(ij+iip1, l)
93          adyqv(ij) = abs(dyqv(ij))
94        END DO
95    
96        ! calcul des pentes aux points scalaires
97    
98        DO ij = iip2, ip1jm
99          dyqmax(ij) = min(adyqv(ij-iip1), adyqv(ij))
100          dyqmax(ij) = pente_max*dyqmax(ij)
101        END DO
102    
103        ! calcul des pentes aux poles
104    
105        ! calcul des pentes limites aux poles
106    
107        ! cas ou on a un extremum au pole
108    
109        ! if(dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1)).le.0.)
110        ! &   apn=0.
111        ! if(dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*
112        ! &   dyqv(ismin(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1).le.0.)
113        ! &   aps=0.
114    
115        ! limitation des pentes aux poles
116        ! do ij=1,iip1
117        ! dyq(ij)=apn*dyq(ij)
118        ! dyq(ip1jm+ij)=aps*dyq(ip1jm+ij)
119        ! enddo
120    
121        ! test
122        ! do ij=1,iip1
123        ! dyq(iip1+ij)=0.
124        ! dyq(ip1jm+ij-iip1)=0.
125        ! enddo
126        ! do ij=1,ip1jmp1
127        ! dyq(ij)=dyq(ij)*cos(rlatu((ij-1)/iip1+1))
128        ! enddo
129    
130        IF (dyqv(ismin(iim,dyqv,1))*dyqv(ismax(iim,dyqv,1))<=0.) THEN
131          DO ij = 1, iip1
132            dyqmax(ij) = 0.
133          END DO
134        ELSE
135          DO ij = 1, iip1
136            dyqmax(ij) = pente_max*abs(dyqv(ij))
137          END DO
138        END IF
139    
140        IF (dyqv(ismax(iim,dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)*dyqv(ismin(iim, &
141            dyqv(ip1jm-iip1+1),1)+ip1jm-iip1+1)<=0.) THEN
142          DO ij = ip1jm + 1, ip1jmp1
143            dyqmax(ij) = 0.
144          END DO
145        ELSE
146          DO ij = ip1jm + 1, ip1jmp1
147            dyqmax(ij) = pente_max*abs(dyqv(ij-iip1))
148          END DO
149        END IF
150    
151        ! calcul des pentes limitees
152    
153        DO ij = 1, ip1jmp1
154          IF (dyqv(ij)*dyqv(ij-iip1)>0.) THEN
155            dyq(ij) = sign(min(abs(dyq(ij)),dyqmax(ij)), dyq(ij))
156          ELSE
157            dyq(ij) = 0.
158          END IF
159        END DO
160    
161        DO ij = 1, ip1jmp1
162          sy(ij, l) = dyq(ij)*sm(ij, l)
163        END DO
164    
165      END DO ! fin de la boucle sur les couches verticales
166    
167      RETURN
168    END SUBROUTINE limy

Legend:
Removed from v.3  
changed lines
  Added in v.178

  ViewVC Help
Powered by ViewVC 1.1.21