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

Annotation of /trunk/dyn3d/integrd.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 64 - (hide annotations)
Wed Aug 29 14:47:17 2012 UTC (11 years, 8 months ago) by guez
Original Path: trunk/libf/dyn3d/integrd.f90
File size: 4749 byte(s)
Removed variable lstardis in module comdissnew and procedures gradiv
and nxgrarot. lstardir had to be true. gradiv and nxgrarot were called
if lstardis was false. Removed argument iter of procedure
filtreg. iter had to be 1. gradiv and nxgrarot called filtreg with
iter == 2.

Moved procedure flxsetup into module yoecumf. Module yoecumf is only
used in program units of directory Conflx, moved it there.

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

  ViewVC Help
Powered by ViewVC 1.1.21