/[lmdze]/trunk/dyn3d/integrd.f
ViewVC logotype

Diff of /trunk/dyn3d/integrd.f

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

revision 28 by guez, Fri Mar 26 18:33:04 2010 UTC revision 32 by guez, Tue Apr 6 17:52:58 2010 UTC
# Line 1  Line 1 
1  SUBROUTINE integrd(nq,vcovm1,ucovm1,tetam1,psm1,massem1,dv,du,dteta,dq,dp, &  module integrd_m
      vcov,ucov,teta,q,ps,masse,phis,finvmaold,leapf, dt)  
   
   ! From dyn3d/integrd.F,v 1.1.1.1 2004/05/19 12:53:05  
   !   Auteur:  P. Le Van                                                    
   !   objet:                                                                
   !   Incrementation des tendances dynamiques                              
   
   USE dimens_m, ONLY : iim, llm  
   USE paramet_m, ONLY : iip1, iip2, ijp1llm, ip1jm, ip1jmp1, jjp1, llmp1  
   USE comvert, ONLY : ap, bp  
   USE comgeom, ONLY : aire, apoln, apols  
   USE pression_m, ONLY : pression  
   USE filtreg_m, ONLY : filtreg  
2    
3    IMPLICIT NONE    IMPLICIT NONE
4    
5    !   Arguments:                                                            contains
6    
7      SUBROUTINE integrd(nq,vcovm1,ucovm1,tetam1,psm1,massem1,dv,du,dteta,dp, &
8           vcov,ucov,teta,q,ps,masse,finvmaold,leapf, dt)
9    
10        ! From dyn3d/integrd.F,v 1.1.1.1 2004/05/19 12:53:05
11        !   Auteur:  P. Le Van                                                  
12        !   objet:                                                              
13        !   Incrementation des tendances dynamiques                            
14    
15        USE dimens_m, ONLY : iim, llm
16        USE paramet_m, ONLY : iip1, iip2, ijp1llm, ip1jm, ip1jmp1, jjp1, llmp1
17        USE comvert, ONLY : ap, bp
18        USE comgeom, ONLY : aire, apoln, apols
19        USE pression_m, ONLY : pression
20        USE filtreg_m, ONLY : filtreg
21    
22        !   Arguments:                                                          
23    
24        INTEGER, intent(in):: nq
25    
26    INTEGER nq      REAL vcov(ip1jm,llm), ucov(ip1jmp1,llm), teta(ip1jmp1,llm)
27        REAL q(ip1jmp1,llm,nq)
28        REAL ps(ip1jmp1), masse(ip1jmp1,llm)
29    
30    REAL vcov(ip1jm,llm), ucov(ip1jmp1,llm), teta(ip1jmp1,llm)      REAL vcovm1(ip1jm,llm), ucovm1(ip1jmp1,llm)
31    REAL q(ip1jmp1,llm,nq)      REAL tetam1(ip1jmp1,llm), psm1(ip1jmp1), massem1(ip1jmp1,llm)
   REAL ps(ip1jmp1), masse(ip1jmp1,llm), phis(ip1jmp1)  
32    
33    REAL vcovm1(ip1jm,llm), ucovm1(ip1jmp1,llm)      REAL dv(ip1jm,llm), du(ip1jmp1,llm)
34    REAL tetam1(ip1jmp1,llm), psm1(ip1jmp1), massem1(ip1jmp1,llm)      REAL dteta(ip1jmp1,llm), dp(ip1jmp1)
35        REAL finvmaold(ip1jmp1,llm)
36        LOGICAL, INTENT (IN) :: leapf
37        real, intent(in):: dt
38    
39    REAL dv(ip1jm,llm), du(ip1jmp1,llm)      !   Local:                                                              
   REAL dteta(ip1jmp1,llm), dp(ip1jmp1)  
   REAL dq(ip1jmp1,llm,nq), finvmaold(ip1jmp1,llm)  
   LOGICAL, INTENT (IN) :: leapf  
   real, intent(in):: dt  
40    
41    !   Local:                                                                    REAL vscr(ip1jm), uscr(ip1jmp1), hscr(ip1jmp1), pscr(ip1jmp1)
42        REAL massescr(ip1jmp1,llm), finvmasse(ip1jmp1,llm)
43        REAL p(ip1jmp1,llmp1)
44        REAL tpn, tps, tppn(iim), tpps(iim)
45        REAL qpn, qps, qppn(iim), qpps(iim)
46        REAL deltap(ip1jmp1,llm)
47    
48    REAL vscr(ip1jm), uscr(ip1jmp1), hscr(ip1jmp1), pscr(ip1jmp1)      INTEGER l, ij, iq
   REAL massescr(ip1jmp1,llm), finvmasse(ip1jmp1,llm)  
   REAL p(ip1jmp1,llmp1)  
   REAL tpn, tps, tppn(iim), tpps(iim)  
   REAL qpn, qps, qppn(iim), qpps(iim)  
   REAL deltap(ip1jmp1,llm)  
49    
50    INTEGER l, ij, iq      REAL ssum
51    
52    REAL ssum      !-----------------------------------------------------------------------
53    
54    !-----------------------------------------------------------------------      DO l = 1, llm
55           DO ij = 1, iip1
56              ucov(ij,l) = 0.
57              ucov(ij+ip1jm,l) = 0.
58              uscr(ij) = 0.
59              uscr(ij+ip1jm) = 0.
60           END DO
61        END DO
62    
   DO l = 1, llm  
      DO ij = 1, iip1  
         ucov(ij,l) = 0.  
         ucov(ij+ip1jm,l) = 0.  
         uscr(ij) = 0.  
         uscr(ij+ip1jm) = 0.  
      END DO  
   END DO  
63    
64        !    ............    integration  de       ps         ..............    
65    
66    !    ............    integration  de       ps         ..............          CALL scopy(ip1jmp1*llm,masse,1,massescr,1)
67    
68    CALL scopy(ip1jmp1*llm,masse,1,massescr,1)      DO ij = 1, ip1jmp1
69           pscr(ij) = ps(ij)
70           ps(ij) = psm1(ij) + dt*dp(ij)
71        END DO
72    
73    DO ij = 1, ip1jmp1      DO ij = 1, ip1jmp1
74       pscr(ij) = ps(ij)         IF (ps(ij)<0.) THEN
75       ps(ij) = psm1(ij) + dt*dp(ij)            PRINT *, ' Au point ij = ', ij, ' , pression sol neg. ', ps(ij)
76    END DO            STOP 'integrd'
77           END IF
78        END DO
79    
80    DO ij = 1, ip1jmp1      DO ij = 1, iim
81       IF (ps(ij)<0.) THEN         tppn(ij) = aire(ij)*ps(ij)
82          PRINT *, ' Au point ij = ', ij, ' , pression sol neg. ', ps(ij)         tpps(ij) = aire(ij+ip1jm)*ps(ij+ip1jm)
83          STOP 'integrd'      END DO
84       END IF      tpn = ssum(iim,tppn,1)/apoln
85    END DO      tps = ssum(iim,tpps,1)/apols
86        DO ij = 1, iip1
87           ps(ij) = tpn
88           ps(ij+ip1jm) = tps
89        END DO
90    
91    DO ij = 1, iim      !  ... Calcul  de la nouvelle masse d'air au dernier temps integre t+1 .
      tppn(ij) = aire(ij)*ps(ij)  
      tpps(ij) = aire(ij+ip1jm)*ps(ij+ip1jm)  
   END DO  
   tpn = ssum(iim,tppn,1)/apoln  
   tps = ssum(iim,tpps,1)/apols  
   DO ij = 1, iip1  
      ps(ij) = tpn  
      ps(ij+ip1jm) = tps  
   END DO  
92    
93    !  ... Calcul  de la nouvelle masse d'air au dernier temps integre t+1 .      CALL pression(ip1jmp1,ap,bp,ps,p)
94        CALL massdair(p,masse)
95    
96    CALL pression(ip1jmp1,ap,bp,ps,p)      CALL scopy(ijp1llm,masse,1,finvmasse,1)
97    CALL massdair(p,masse)      CALL filtreg(finvmasse,jjp1,llm,-2,2,.TRUE.,1)
98    
   CALL scopy(ijp1llm,masse,1,finvmasse,1)  
   CALL filtreg(finvmasse,jjp1,llm,-2,2,.TRUE.,1)  
99    
100        !    ............   integration  de  ucov, vcov,  h     ..............  
101    
102    !    ............   integration  de  ucov, vcov,  h     ..............        DO  l = 1, llm
103    
104    DO  l = 1, llm         DO ij = iip2, ip1jm
105              uscr(ij) = ucov(ij,l)
106              ucov(ij,l) = ucovm1(ij,l) + dt*du(ij,l)
107           END DO
108    
109       DO ij = iip2, ip1jm         DO ij = 1, ip1jm
110          uscr(ij) = ucov(ij,l)            vscr(ij) = vcov(ij,l)
111          ucov(ij,l) = ucovm1(ij,l) + dt*du(ij,l)            vcov(ij,l) = vcovm1(ij,l) + dt*dv(ij,l)
112       END DO         END DO
113    
114       DO ij = 1, ip1jm         DO ij = 1, ip1jmp1
115          vscr(ij) = vcov(ij,l)            hscr(ij) = teta(ij,l)
116          vcov(ij,l) = vcovm1(ij,l) + dt*dv(ij,l)            teta(ij,l) = tetam1(ij,l)*massem1(ij,l)/masse(ij,l) + &
117       END DO                 dt*dteta(ij,l)/masse(ij,l)
118           END DO
119    
120       DO ij = 1, ip1jmp1         !   ....  Calcul de la valeur moyenne, unique  aux poles pour  teta    .
         hscr(ij) = teta(ij,l)  
         teta(ij,l) = tetam1(ij,l)*massem1(ij,l)/masse(ij,l) + &  
              dt*dteta(ij,l)/masse(ij,l)  
      END DO  
121    
      !   ....  Calcul de la valeur moyenne, unique  aux poles pour  teta    .  
122    
123           DO ij = 1, iim
124              tppn(ij) = aire(ij)*teta(ij,l)
125              tpps(ij) = aire(ij+ip1jm)*teta(ij+ip1jm,l)
126           END DO
127           tpn = ssum(iim,tppn,1)/apoln
128           tps = ssum(iim,tpps,1)/apols
129    
130       DO ij = 1, iim         DO ij = 1, iip1
131          tppn(ij) = aire(ij)*teta(ij,l)            teta(ij,l) = tpn
132          tpps(ij) = aire(ij+ip1jm)*teta(ij+ip1jm,l)            teta(ij+ip1jm,l) = tps
133       END DO         END DO
      tpn = ssum(iim,tppn,1)/apoln  
      tps = ssum(iim,tpps,1)/apols  
134    
      DO ij = 1, iip1  
         teta(ij,l) = tpn  
         teta(ij+ip1jm,l) = tps  
      END DO  
135    
136           IF (leapf) THEN
137              CALL scopy(ip1jmp1,uscr(1),1,ucovm1(1,l),1)
138              CALL scopy(ip1jm,vscr(1),1,vcovm1(1,l),1)
139              CALL scopy(ip1jmp1,hscr(1),1,tetam1(1,l),1)
140           END IF
141    
142       IF (leapf) THEN      END DO
         CALL scopy(ip1jmp1,uscr(1),1,ucovm1(1,l),1)  
         CALL scopy(ip1jm,vscr(1),1,vcovm1(1,l),1)  
         CALL scopy(ip1jmp1,hscr(1),1,tetam1(1,l),1)  
      END IF  
143    
144    END DO      DO l = 1, llm
145           DO ij = 1, ip1jmp1
146              deltap(ij,l) = p(ij,l) - p(ij,l+1)
147           END DO
148        END DO
149    
150    DO l = 1, llm      CALL qminimum(q,nq,deltap)
      DO ij = 1, ip1jmp1  
         deltap(ij,l) = p(ij,l) - p(ij,l+1)  
      END DO  
   END DO  
151    
152    CALL qminimum(q,nq,deltap)      !    .....  Calcul de la valeur moyenne, unique  aux poles pour  q .....
153    
   !    .....  Calcul de la valeur moyenne, unique  aux poles pour  q .....  
154    
155        DO iq = 1, nq
156           DO l = 1, llm
157    
158    DO iq = 1, nq            DO ij = 1, iim
159       DO l = 1, llm               qppn(ij) = aire(ij)*q(ij,l,iq)
160                 qpps(ij) = aire(ij+ip1jm)*q(ij+ip1jm,l,iq)
161              END DO
162              qpn = ssum(iim,qppn,1)/apoln
163              qps = ssum(iim,qpps,1)/apols
164    
165          DO ij = 1, iim            DO ij = 1, iip1
166             qppn(ij) = aire(ij)*q(ij,l,iq)               q(ij,l,iq) = qpn
167             qpps(ij) = aire(ij+ip1jm)*q(ij+ip1jm,l,iq)               q(ij+ip1jm,l,iq) = qps
168          END DO            END DO
         qpn = ssum(iim,qppn,1)/apoln  
         qps = ssum(iim,qpps,1)/apols  
169    
170          DO ij = 1, iip1         END DO
171             q(ij,l,iq) = qpn      END DO
            q(ij+ip1jm,l,iq) = qps  
         END DO  
172    
      END DO  
   END DO  
173    
174        CALL scopy(ijp1llm,finvmasse,1,finvmaold,1)
175    
   CALL scopy(ijp1llm,finvmasse,1,finvmaold,1)  
176    
177        !     .....   FIN  de l'integration  de   q    .......                  
178    
179    !     .....   FIN  de l'integration  de   q    .......                        IF (leapf) THEN
180           CALL scopy(ip1jmp1,pscr,1,psm1,1)
181           CALL scopy(ip1jmp1*llm,massescr,1,massem1,1)
182        END IF
183    
184    IF (leapf) THEN    END SUBROUTINE integrd
      CALL scopy(ip1jmp1,pscr,1,psm1,1)  
      CALL scopy(ip1jmp1*llm,massescr,1,massem1,1)  
   END IF  
185    
186  END SUBROUTINE integrd  end module integrd_m

Legend:
Removed from v.28  
changed lines
  Added in v.32

  ViewVC Help
Powered by ViewVC 1.1.21