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

Annotation of /trunk/dyn3d/integrd.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 348 - (hide annotations)
Mon Dec 23 14:32:59 2019 UTC (4 years, 6 months ago) by guez
File size: 4164 byte(s)
Rename delta to ice in `calcul_flux`

Rename variable delta to ice, which is more meaningful, in procedure
`calcul_flux`.

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 260 SUBROUTINE integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, dteta, &
8 guez 161 dp, vcov, ucov, teta, q, ps, masse, 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 348 ! Objet : incrémentation des tendances dynamiques
13 guez 3
14 guez 347 ! Libraries:
15     use nr_util, only: assert
16    
17     USE comgeom, ONLY : aire_2d, apoln, apols
18 guez 265 USE dimensions, ONLY : iim, jjm, llm
19 guez 67 USE disvert_m, ONLY : ap, bp
20     use massdair_m, only: massdair
21 guez 347 USE paramet_m, ONLY : ip1jm
22 guez 71 use qminimum_m, only: qminimum
23 guez 3
24 guez 347 REAL, intent(inout):: vcovm1(ip1jm, llm), ucovm1((iim + 1) * (jjm + 1), llm)
25 guez 106 REAL, intent(inout):: tetam1(iim + 1, jjm + 1, llm)
26 guez 347 REAL, intent(inout):: psm1(:, :) ! (iim + 1, jjm + 1)
27 guez 161 real, intent(inout):: massem1(iim + 1, jjm + 1, llm)
28 guez 260 REAL, intent(in):: dv(ip1jm, llm), du((iim + 1) * (jjm + 1), llm)
29 guez 347 REAL, intent(in):: dteta(iim + 1, jjm + 1, llm)
30     REAL, intent(in):: dp(:, :) ! (iim + 1, jjm + 1)
31 guez 91 REAL, intent(inout):: vcov(ip1jm, llm), ucov((iim + 1) * (jjm + 1), llm)
32 guez 106 real, intent(inout):: teta(iim + 1, jjm + 1, llm)
33 guez 347 REAL, intent(inout):: q(:, :, :, :) ! (iim + 1, jjm + 1, llm, nq)
34     REAL, intent(inout):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol, en Pa
35 guez 106 REAL, intent(inout):: masse(iim + 1, jjm + 1, llm)
36 guez 91 real, intent(in):: dt ! time step, in s
37 guez 32 LOGICAL, INTENT (IN) :: leapf
38 guez 3
39 guez 90 ! Local:
40 guez 161 REAL finvmaold(iim + 1, jjm + 1, llm)
41 guez 39 INTEGER nq
42 guez 106 REAL vscr(ip1jm), uscr((iim + 1) * (jjm + 1)), hscr(iim + 1, jjm + 1)
43 guez 347 real pscr(iim + 1, jjm + 1)
44     REAL p(iim + 1, jjm + 1, llm + 1)
45     REAL deltap(iim + 1, jjm + 1, llm)
46     INTEGER l, ij, iq, i, j
47 guez 3
48 guez 32 !-----------------------------------------------------------------------
49 guez 3
50 guez 40 call assert(size(q, 1) == iim + 1, size(q, 2) == jjm + 1, &
51     size(q, 3) == llm, "integrd")
52     nq = size(q, 4)
53 guez 39
54 guez 32 DO l = 1, llm
55 guez 347 DO ij = 1, iim + 1
56 guez 39 ucov(ij, l) = 0.
57     ucov(ij+ip1jm, l) = 0.
58 guez 32 uscr(ij) = 0.
59     uscr(ij+ip1jm) = 0.
60     END DO
61     END DO
62 guez 3
63 guez 46 ! Integration de ps :
64 guez 3
65 guez 46 pscr = ps
66     ps = psm1 + dt * dp
67 guez 3
68 guez 347 DO j = 1, jjm + 1
69     do i = 1, iim + 1
70     IF (ps(i, j) < 0.) THEN
71     PRINT *, 'integrd: au point i, j = ', i, j, &
72     ', negative surface pressure ', ps(i, j)
73     STOP 1
74     END IF
75     END DO
76     end DO
77 guez 3
78 guez 347 ps(:, 1) = sum(aire_2d(:iim, 1) * ps(:iim, 1)) / apoln
79     ps(:, jjm + 1) = sum(aire_2d(:iim, jjm + 1) * ps(:iim, jjm + 1)) / apols
80    
81 guez 3
82 guez 39 ! Calcul de la nouvelle masse d'air au dernier temps integre t+1
83 guez 3
84 guez 347 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
85 guez 161 CALL massdair(p, finvmaold)
86 guez 3
87 guez 39 ! integration de ucov, vcov, h
88 guez 3
89 guez 39 DO l = 1, llm
90 guez 347 DO ij = iim + 2, ip1jm
91 guez 39 uscr(ij) = ucov(ij, l)
92 guez 260 ucov(ij, l) = ucovm1(ij, l) + dt * du(ij, l)
93 guez 32 END DO
94 guez 3
95 guez 32 DO ij = 1, ip1jm
96 guez 39 vscr(ij) = vcov(ij, l)
97 guez 91 vcov(ij, l) = vcovm1(ij, l) + dt * dv(ij, l)
98 guez 32 END DO
99 guez 3
100 guez 106 hscr = teta(:, :, l)
101 guez 161 teta(:, :, l) = tetam1(:, :, l) * massem1(:, :, l) / finvmaold(:, :, l) &
102     + dt * dteta(:, :, l) / finvmaold(:, :, l)
103 guez 3
104 guez 39 ! Calcul de la valeur moyenne, unique aux poles pour teta
105 guez 106 teta(:, 1, l) = sum(aire_2d(:iim, 1) * teta(:iim, 1, l)) / apoln
106     teta(:, jjm + 1, l) = sum(aire_2d(:iim, jjm + 1) &
107     * teta(:iim, jjm + 1, l)) / apols
108 guez 3
109 guez 32 IF (leapf) THEN
110 guez 348 ucovm1(:, l) = uscr
111 guez 57 vcovm1(:, l) = vscr
112 guez 106 tetam1(:, :, l) = hscr
113 guez 32 END IF
114     END DO
115 guez 3
116 guez 347 forall (l = 1:llm) deltap(:, :, l) = p(:, :, l) - p(:, :, l + 1)
117 guez 39 CALL qminimum(q, nq, deltap)
118 guez 3
119 guez 39 ! Calcul de la valeur moyenne, unique aux poles pour q
120 guez 32 DO iq = 1, nq
121     DO l = 1, llm
122 guez 106 q(:, 1, l, iq) = sum(aire_2d(:iim, 1) * q(:iim, 1, l, iq)) / apoln
123     q(:, jjm + 1, l, iq) = sum(aire_2d(:iim, jjm + 1) &
124     * q(:iim, jjm + 1, l, iq)) / apols
125 guez 32 END DO
126     END DO
127 guez 28
128 guez 32 IF (leapf) THEN
129 guez 57 psm1 = pscr
130 guez 161 massem1 = masse
131 guez 32 END IF
132    
133 guez 161 masse = finvmaold
134    
135 guez 32 END SUBROUTINE integrd
136    
137     end module integrd_m

  ViewVC Help
Powered by ViewVC 1.1.21