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

Contents of /trunk/dyn3d/integrd.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 348 - (show 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 module integrd_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE integrd(vcovm1, ucovm1, tetam1, psm1, massem1, dv, du, dteta, &
8 dp, vcov, ucov, teta, q, ps, masse, 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 ! Libraries:
15 use nr_util, only: assert
16
17 USE comgeom, ONLY : aire_2d, apoln, apols
18 USE dimensions, ONLY : iim, jjm, llm
19 USE disvert_m, ONLY : ap, bp
20 use massdair_m, only: massdair
21 USE paramet_m, ONLY : ip1jm
22 use qminimum_m, only: qminimum
23
24 REAL, intent(inout):: vcovm1(ip1jm, llm), ucovm1((iim + 1) * (jjm + 1), llm)
25 REAL, intent(inout):: tetam1(iim + 1, jjm + 1, llm)
26 REAL, intent(inout):: psm1(:, :) ! (iim + 1, jjm + 1)
27 real, intent(inout):: massem1(iim + 1, jjm + 1, llm)
28 REAL, intent(in):: dv(ip1jm, llm), du((iim + 1) * (jjm + 1), llm)
29 REAL, intent(in):: dteta(iim + 1, jjm + 1, llm)
30 REAL, intent(in):: dp(:, :) ! (iim + 1, jjm + 1)
31 REAL, intent(inout):: vcov(ip1jm, llm), ucov((iim + 1) * (jjm + 1), llm)
32 real, intent(inout):: teta(iim + 1, jjm + 1, llm)
33 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 REAL, intent(inout):: masse(iim + 1, jjm + 1, llm)
36 real, intent(in):: dt ! time step, in s
37 LOGICAL, INTENT (IN) :: leapf
38
39 ! Local:
40 REAL finvmaold(iim + 1, jjm + 1, llm)
41 INTEGER nq
42 REAL vscr(ip1jm), uscr((iim + 1) * (jjm + 1)), hscr(iim + 1, jjm + 1)
43 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
48 !-----------------------------------------------------------------------
49
50 call assert(size(q, 1) == iim + 1, size(q, 2) == jjm + 1, &
51 size(q, 3) == llm, "integrd")
52 nq = size(q, 4)
53
54 DO l = 1, llm
55 DO ij = 1, iim + 1
56 ucov(ij, l) = 0.
57 ucov(ij+ip1jm, l) = 0.
58 uscr(ij) = 0.
59 uscr(ij+ip1jm) = 0.
60 END DO
61 END DO
62
63 ! Integration de ps :
64
65 pscr = ps
66 ps = psm1 + dt * dp
67
68 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
78 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
82 ! Calcul de la nouvelle masse d'air au dernier temps integre t+1
83
84 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
85 CALL massdair(p, finvmaold)
86
87 ! integration de ucov, vcov, h
88
89 DO l = 1, llm
90 DO ij = iim + 2, ip1jm
91 uscr(ij) = ucov(ij, l)
92 ucov(ij, l) = ucovm1(ij, l) + dt * du(ij, l)
93 END DO
94
95 DO ij = 1, ip1jm
96 vscr(ij) = vcov(ij, l)
97 vcov(ij, l) = vcovm1(ij, l) + dt * dv(ij, l)
98 END DO
99
100 hscr = teta(:, :, l)
101 teta(:, :, l) = tetam1(:, :, l) * massem1(:, :, l) / finvmaold(:, :, l) &
102 + dt * dteta(:, :, l) / finvmaold(:, :, l)
103
104 ! Calcul de la valeur moyenne, unique aux poles pour teta
105 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
109 IF (leapf) THEN
110 ucovm1(:, l) = uscr
111 vcovm1(:, l) = vscr
112 tetam1(:, :, l) = hscr
113 END IF
114 END DO
115
116 forall (l = 1:llm) deltap(:, :, l) = p(:, :, l) - p(:, :, l + 1)
117 CALL qminimum(q, nq, deltap)
118
119 ! Calcul de la valeur moyenne, unique aux poles pour q
120 DO iq = 1, nq
121 DO l = 1, llm
122 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 END DO
126 END DO
127
128 IF (leapf) THEN
129 psm1 = pscr
130 massem1 = masse
131 END IF
132
133 masse = finvmaold
134
135 END SUBROUTINE integrd
136
137 end module integrd_m

  ViewVC Help
Powered by ViewVC 1.1.21