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

Contents of /trunk/dyn3d/integrd.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 66 - (show annotations)
Thu Sep 20 13:00:41 2012 UTC (11 years, 8 months ago) by guez
Original Path: trunk/libf/dyn3d/integrd.f90
File size: 4751 byte(s)
Changed name of module "comvert" to "disvert_m". Changed constant
1. to 0.3 in vertical sampling "strato".

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

  ViewVC Help
Powered by ViewVC 1.1.21