/[lmdze]/trunk/libf/dyn3d/integrd.f90
ViewVC logotype

Contents of /trunk/libf/dyn3d/integrd.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 28 - (show annotations)
Fri Mar 26 18:33:04 2010 UTC (14 years, 1 month ago) by guez
File size: 4535 byte(s)
Removed unused "diagedyn.f" and "undefSTD.f".

In "etat0", the variable "dt" of module "temps" was defined from
"landicered.nc", which was meaningless and useless. Replaced "dt" by a
local trash variable.

Removed variable "dt" from module "temps" and created instead a local
variable of "leapfrog" and an argument of "integrd".

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

  ViewVC Help
Powered by ViewVC 1.1.21