source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/dyn3d/addfi.F @ 222

Last change on this file since 222 was 222, checked in by ymipsl, 10 years ago

Creating temporary dynamico/lmdz/saturn branche

YM

File size: 5.1 KB
Line 
1!
2! $Id: addfi.F 1446 2010-10-22 09:27:25Z emillour $
3!
4      SUBROUTINE addfi(pdt, leapf, forward,
5     S          pucov, pvcov, pteta, pq   , pps ,
6     S          pdufi, pdvfi, pdhfi,pdqfi, pdpfi  )
7
8      USE infotrac, ONLY : nqtot
9      USE control_mod, ONLY : planet_type
10      IMPLICIT NONE
11c
12c=======================================================================
13c
14c    Addition of the physical tendencies
15c
16c    Interface :
17c    -----------
18c
19c      Input :
20c      -------
21c      pdt                    time step of integration
22c      leapf                  logical
23c      forward                logical
24c      pucov(ip1jmp1,llm)     first component of the covariant velocity
25c      pvcov(ip1ip1jm,llm)    second component of the covariant velocity
26c      pteta(ip1jmp1,llm)     potential temperature
27c      pts(ip1jmp1,llm)       surface temperature
28c      pdufi(ip1jmp1,llm)     |
29c      pdvfi(ip1jm,llm)       |   respective
30c      pdhfi(ip1jmp1)         |      tendencies  (unit/s)
31c      pdtsfi(ip1jmp1)        |
32c
33c      Output :
34c      --------
35c      pucov
36c      pvcov
37c      ph
38c      pts
39c
40c
41c=======================================================================
42c
43c-----------------------------------------------------------------------
44c
45c    0.  Declarations :
46c    ------------------
47c
48#include "dimensions.h"
49#include "paramet.h"
50#include "comconst.h"
51#include "comgeom.h"
52#include "serre.h"
53c
54c    Arguments :
55c    -----------
56c
57      REAL,INTENT(IN) :: pdt ! time step for the integration (s)
58c
59      REAL,INTENT(INOUT) :: pvcov(ip1jm,llm) ! covariant meridional wind
60      REAL,INTENT(INOUT) :: pucov(ip1jmp1,llm) ! covariant zonal wind
61      REAL,INTENT(INOUT) :: pteta(ip1jmp1,llm) ! potential temperature
62      REAL,INTENT(INOUT) :: pq(ip1jmp1,llm,nqtot) ! tracers
63      REAL,INTENT(INOUT) :: pps(ip1jmp1) ! surface pressure (Pa)
64c respective tendencies (.../s) to add
65      REAL,INTENT(IN) :: pdvfi(ip1jm,llm)
66      REAL,INTENT(IN) :: pdufi(ip1jmp1,llm)
67      REAL,INTENT(IN) :: pdqfi(ip1jmp1,llm,nqtot)
68      REAL,INTENT(IN) :: pdhfi(ip1jmp1,llm)
69      REAL,INTENT(IN) :: pdpfi(ip1jmp1)
70c
71      LOGICAL,INTENT(IN) :: leapf,forward ! not used
72c
73c
74c    Local variables :
75c    -----------------
76c
77      REAL xpn(iim),xps(iim),tpn,tps
78      INTEGER j,k,iq,ij
79      REAL,PARAMETER :: qtestw = 1.0e-15
80      REAL,PARAMETER :: qtestt = 1.0e-40
81
82      REAL SSUM
83c
84c-----------------------------------------------------------------------
85
86      DO k = 1,llm
87         DO j = 1,ip1jmp1
88            pteta(j,k)= pteta(j,k) + pdhfi(j,k) * pdt
89         ENDDO
90      ENDDO
91
92      DO  k    = 1, llm
93       DO  ij   = 1, iim
94         xpn(ij) = aire(   ij   ) * pteta(  ij    ,k)
95         xps(ij) = aire(ij+ip1jm) * pteta(ij+ip1jm,k)
96       ENDDO
97       tpn      = SSUM(iim,xpn,1)/ apoln
98       tps      = SSUM(iim,xps,1)/ apols
99
100       DO ij   = 1, iip1
101         pteta(   ij   ,k)  = tpn
102         pteta(ij+ip1jm,k)  = tps
103       ENDDO
104      ENDDO
105!***********************
106! Correction on teta due to surface pressure changes
107      DO k = 1,llm
108        DO j = 1,ip1jmp1
109           pteta(j,k)= pteta(j,k)*(1+pdpfi(j)*pdt/pps(j))**kappa
110        ENDDO
111      ENDDO
112!***********************
113
114      DO k = 1,llm
115         DO j = iip2,ip1jm
116            pucov(j,k)= pucov(j,k) + pdufi(j,k) * pdt
117         ENDDO
118      ENDDO
119
120      DO k = 1,llm
121         DO j = 1,ip1jm
122            pvcov(j,k)= pvcov(j,k) + pdvfi(j,k) * pdt
123         ENDDO
124      ENDDO
125
126c
127      DO j = 1,ip1jmp1
128         pps(j) = pps(j) + pdpfi(j) * pdt
129      ENDDO
130 
131      if (planet_type=="earth") then
132      ! earth case, special treatment for first 2 tracers (water)
133       DO iq = 1, 2
134         DO k = 1,llm
135            DO j = 1,ip1jmp1
136               pq(j,k,iq)= pq(j,k,iq) + pdqfi(j,k,iq) * pdt
137               pq(j,k,iq)= AMAX1( pq(j,k,iq), qtestw )
138            ENDDO
139         ENDDO
140       ENDDO
141
142       DO iq = 3, nqtot
143         DO k = 1,llm
144            DO j = 1,ip1jmp1
145               pq(j,k,iq)= pq(j,k,iq) + pdqfi(j,k,iq) * pdt
146               pq(j,k,iq)= AMAX1( pq(j,k,iq), qtestt )
147            ENDDO
148         ENDDO
149       ENDDO
150      else
151      ! general case, treat all tracers equally)
152       DO iq = 1, nqtot
153         DO k = 1,llm
154            DO j = 1,ip1jmp1
155               pq(j,k,iq)= pq(j,k,iq) + pdqfi(j,k,iq) * pdt
156               pq(j,k,iq)= AMAX1( pq(j,k,iq), qtestt )
157            ENDDO
158         ENDDO
159       ENDDO
160      endif ! of if (planet_type=="earth")
161
162      DO  ij   = 1, iim
163        xpn(ij) = aire(   ij   ) * pps(  ij     )
164        xps(ij) = aire(ij+ip1jm) * pps(ij+ip1jm )
165      ENDDO
166      tpn      = SSUM(iim,xpn,1)/apoln
167      tps      = SSUM(iim,xps,1)/apols
168
169      DO ij   = 1, iip1
170        pps (   ij     )  = tpn
171        pps ( ij+ip1jm )  = tps
172      ENDDO
173
174
175      DO iq = 1, nqtot
176        DO  k    = 1, llm
177          DO  ij   = 1, iim
178            xpn(ij) = aire(   ij   ) * pq(  ij    ,k,iq)
179            xps(ij) = aire(ij+ip1jm) * pq(ij+ip1jm,k,iq)
180          ENDDO
181          tpn      = SSUM(iim,xpn,1)/apoln
182          tps      = SSUM(iim,xps,1)/apols
183
184          DO ij   = 1, iip1
185            pq (   ij   ,k,iq)  = tpn
186            pq (ij+ip1jm,k,iq)  = tps
187          ENDDO
188        ENDDO
189      ENDDO
190
191      RETURN
192      END
Note: See TracBrowser for help on using the repository browser.