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

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

  ViewVC Help
Powered by ViewVC 1.1.21