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

Annotation of /trunk/dyn3d/integrd.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 107 - (hide annotations)
Thu Sep 11 15:09:15 2014 UTC (9 years, 8 months ago) by guez
File size: 4490 byte(s)
Imported procedure grilles_gcm_sub from LMDZ. Had then to transform
local variable phis of etat to argument.

Replaced calls to lnblnk by calls to trim.

Removed arguments nlat, klevel and griscal of filtreg. Replaced
integer arguments ifiltre and iaire by logical arguments direct and
intensive.

Changed default values of guide_t and guide_q to false.

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