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

Annotation of /trunk/dyn3d/integrd.f

Parent Directory Parent Directory | Revision Log Revision Log


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

  ViewVC Help
Powered by ViewVC 1.1.21