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

Annotation of /trunk/dyn3d/integrd.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 134 - (hide annotations)
Wed Apr 29 15:47:56 2015 UTC (9 years ago) by guez
Original Path: trunk/Sources/dyn3d/integrd.f
File size: 4490 byte(s)
Sources inside, compilation outside.
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 90 SUBROUTINE integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, dudyn, dteta, &
8     dp, vcov, ucov, teta, q, ps, masse, finvmaold, dt, leapf)
9 guez 3
10 guez 90 ! 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 106 USE comgeom, ONLY : aire, aire_2d, 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 71 use qminimum_m, only: qminimum
22 guez 3
23 guez 46 REAL vcovm1(ip1jm, llm), ucovm1((iim + 1) * (jjm + 1), llm)
24 guez 106 REAL, intent(inout):: tetam1(iim + 1, jjm + 1, llm)
25 guez 57 REAL, intent(inout):: psm1((iim + 1) * (jjm + 1))
26 guez 106 real massem1(iim + 1, jjm + 1, llm)
27 guez 91 REAL, intent(in):: dv(ip1jm, llm), dudyn((iim + 1) * (jjm + 1), llm)
28 guez 106 REAL dteta(iim + 1, jjm + 1, llm), dp((iim + 1) * (jjm + 1))
29 guez 91 REAL, intent(inout):: vcov(ip1jm, llm), ucov((iim + 1) * (jjm + 1), llm)
30 guez 106 real, intent(inout):: teta(iim + 1, jjm + 1, llm)
31 guez 90 REAL q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nq)
32     REAL, intent(inout):: ps((iim + 1) * (jjm + 1))
33 guez 106 REAL, intent(inout):: masse(iim + 1, jjm + 1, llm)
34     REAL finvmaold(iim + 1, jjm + 1, llm)
35 guez 91 real, intent(in):: dt ! time step, in s
36 guez 32 LOGICAL, INTENT (IN) :: leapf
37 guez 3
38 guez 90 ! Local:
39 guez 39 INTEGER nq
40 guez 106 REAL vscr(ip1jm), uscr((iim + 1) * (jjm + 1)), hscr(iim + 1, jjm + 1)
41 guez 46 real pscr((iim + 1) * (jjm + 1))
42 guez 106 REAL massescr(iim + 1, jjm + 1, llm)
43     real finvmasse(iim + 1, jjm + 1, llm)
44 guez 46 REAL p((iim + 1) * (jjm + 1), llmp1)
45 guez 32 REAL tpn, tps, tppn(iim), tpps(iim)
46 guez 46 REAL deltap((iim + 1) * (jjm + 1), llm)
47 guez 32 INTEGER l, ij, iq
48 guez 3
49 guez 32 !-----------------------------------------------------------------------
50 guez 3
51 guez 40 call assert(size(q, 1) == iim + 1, size(q, 2) == jjm + 1, &
52     size(q, 3) == llm, "integrd")
53     nq = size(q, 4)
54 guez 39
55 guez 32 DO l = 1, llm
56     DO ij = 1, iip1
57 guez 39 ucov(ij, l) = 0.
58     ucov(ij+ip1jm, l) = 0.
59 guez 32 uscr(ij) = 0.
60     uscr(ij+ip1jm) = 0.
61     END DO
62     END DO
63 guez 3
64 guez 46 massescr = masse
65 guez 3
66 guez 46 ! Integration de ps :
67 guez 3
68 guez 46 pscr = ps
69     ps = psm1 + dt * dp
70 guez 3
71 guez 46 DO ij = 1, (iim + 1) * (jjm + 1)
72     IF (ps(ij) < 0.) THEN
73     PRINT *, 'integrd: au point ij = ', ij, &
74     ', negative surface pressure ', ps(ij)
75     STOP 1
76 guez 32 END IF
77     END DO
78 guez 3
79 guez 32 DO ij = 1, iim
80 guez 91 tppn(ij) = aire(ij) * ps(ij)
81 guez 46 tpps(ij) = aire(ij+ip1jm) * ps(ij+ip1jm)
82 guez 32 END DO
83 guez 90 tpn = sum(tppn)/apoln
84     tps = sum(tpps)/apols
85 guez 32 DO ij = 1, iip1
86     ps(ij) = tpn
87     ps(ij+ip1jm) = tps
88     END DO
89 guez 3
90 guez 39 ! Calcul de la nouvelle masse d'air au dernier temps integre t+1
91 guez 3
92 guez 37 forall (l = 1: llm + 1) p(:, l) = ap(l) + bp(l) * ps
93 guez 39 CALL massdair(p, masse)
94 guez 3
95 guez 46 finvmasse = masse
96 guez 107 CALL filtreg(finvmasse, direct = .false., intensive = .false.)
97 guez 3
98 guez 39 ! integration de ucov, vcov, h
99 guez 3
100 guez 39 DO l = 1, llm
101 guez 32 DO ij = iip2, ip1jm
102 guez 39 uscr(ij) = ucov(ij, l)
103 guez 91 ucov(ij, l) = ucovm1(ij, l) + dt * dudyn(ij, l)
104 guez 32 END DO
105 guez 3
106 guez 32 DO ij = 1, ip1jm
107 guez 39 vscr(ij) = vcov(ij, l)
108 guez 91 vcov(ij, l) = vcovm1(ij, l) + dt * dv(ij, l)
109 guez 32 END DO
110 guez 3
111 guez 106 hscr = teta(:, :, l)
112     teta(:, :, l) = tetam1(:, :, l) * massem1(:, :, l) / masse(:, :, l) &
113     + dt * dteta(:, :, l) / masse(:, :, l)
114 guez 3
115 guez 39 ! Calcul de la valeur moyenne, unique aux poles pour teta
116 guez 106 teta(:, 1, l) = sum(aire_2d(:iim, 1) * teta(:iim, 1, l)) / apoln
117     teta(:, jjm + 1, l) = sum(aire_2d(:iim, jjm + 1) &
118     * teta(:iim, jjm + 1, l)) / apols
119 guez 3
120 guez 32 IF (leapf) THEN
121 guez 57 ucovm1(:, l) =uscr
122     vcovm1(:, l) = vscr
123 guez 106 tetam1(:, :, l) = hscr
124 guez 32 END IF
125     END DO
126 guez 3
127 guez 32 DO l = 1, llm
128 guez 46 DO ij = 1, (iim + 1) * (jjm + 1)
129 guez 39 deltap(ij, l) = p(ij, l) - p(ij, l+1)
130 guez 32 END DO
131     END DO
132 guez 3
133 guez 39 CALL qminimum(q, nq, deltap)
134 guez 3
135 guez 39 ! Calcul de la valeur moyenne, unique aux poles pour q
136 guez 32 DO iq = 1, nq
137     DO l = 1, llm
138 guez 106 q(:, 1, l, iq) = sum(aire_2d(:iim, 1) * q(:iim, 1, l, iq)) / apoln
139     q(:, jjm + 1, l, iq) = sum(aire_2d(:iim, jjm + 1) &
140     * q(:iim, jjm + 1, l, iq)) / apols
141 guez 32 END DO
142     END DO
143 guez 28
144 guez 57 finvmaold = finvmasse
145 guez 28
146 guez 39 ! Fin de l'integration de q
147 guez 28
148 guez 32 IF (leapf) THEN
149 guez 57 psm1 = pscr
150     massem1 = massescr
151 guez 32 END IF
152    
153     END SUBROUTINE integrd
154    
155     end module integrd_m

  ViewVC Help
Powered by ViewVC 1.1.21