1 |
module calltherm_m |
2 |
|
3 |
implicit none |
4 |
|
5 |
contains |
6 |
|
7 |
subroutine calltherm(dtime, pplay, paprs, pphi, u_seri, v_seri, t_seri, & |
8 |
q_seri, d_u_ajs, d_v_ajs, d_t_ajs, d_q_ajs, fm_therm, entr_therm) |
9 |
|
10 |
! From LMDZ4/libf/phylmd/calltherm.F, version 1.2 2004/12/10 11:27:46 |
11 |
! Thermiques |
12 |
|
13 |
USE dimphy, ONLY: klev, klon |
14 |
USE ctherm, ONLY: l_mix_thermals, nsplit_thermals, r_aspect_thermals, & |
15 |
tho_thermals, w2di_thermals |
16 |
use thermcell_m, only: thermcell |
17 |
|
18 |
REAL, intent(in):: dtime |
19 |
REAL, intent(in):: pplay(klon, klev) |
20 |
REAL, intent(in):: paprs(klon, klev+1) |
21 |
REAL, intent(in):: pphi(klon, klev) |
22 |
REAL, intent(inout):: u_seri(klon, klev), v_seri(klon, klev) |
23 |
REAL, intent(inout):: t_seri(klon, klev) |
24 |
real, intent(inout):: q_seri(klon, klev) |
25 |
|
26 |
! Update thermiques |
27 |
REAL d_u_ajs(klon, klev), d_v_ajs(klon, klev) |
28 |
REAL d_t_ajs(klon, klev), d_q_ajs(klon, klev) |
29 |
real fm_therm(klon, klev+1), entr_therm(klon, klev) |
30 |
|
31 |
! Local: |
32 |
|
33 |
REAL d_t_the(klon, klev), d_q_the(klon, klev) |
34 |
REAL d_u_the(klon, klev), d_v_the(klon, klev) |
35 |
|
36 |
real, save:: zfm_therm(klon, klev+1), zentr_therm(klon, klev) |
37 |
real zdt |
38 |
|
39 |
integer i, k, isplit |
40 |
|
41 |
!---------------------------------------------------------------- |
42 |
|
43 |
! Modele du thermique |
44 |
print*, 'avant isplit ', nsplit_thermals |
45 |
|
46 |
fm_therm=0. |
47 |
entr_therm=0. |
48 |
|
49 |
! tests sur les valeurs negatives de l'eau |
50 |
do k=1, klev |
51 |
do i=1, klon |
52 |
if (.not.q_seri(i, k) >= 0.) then |
53 |
print*, 'WARN eau<0 avant therm i=', i, ' k=', k, ' dq, q', & |
54 |
d_q_the(i, k), q_seri(i, k) |
55 |
q_seri(i, k)=1.e-15 |
56 |
endif |
57 |
enddo |
58 |
enddo |
59 |
|
60 |
zdt=dtime/real(nsplit_thermals) |
61 |
do isplit = 1, nsplit_thermals |
62 |
CALL thermcell(klon, klev, zdt, pplay, paprs, pphi, u_seri, v_seri, & |
63 |
t_seri, q_seri, d_u_the, d_v_the, d_t_the, d_q_the, zfm_therm, & |
64 |
zentr_therm, r_aspect_thermals, l_mix_thermals, w2di_thermals, & |
65 |
tho_thermals) |
66 |
|
67 |
! transformation de la derivee en tendance |
68 |
d_t_the=d_t_the*dtime/real(nsplit_thermals) |
69 |
d_u_the=d_u_the*dtime/real(nsplit_thermals) |
70 |
d_v_the=d_v_the*dtime/real(nsplit_thermals) |
71 |
d_q_the=d_q_the*dtime/real(nsplit_thermals) |
72 |
fm_therm=fm_therm +zfm_therm/real(nsplit_thermals) |
73 |
entr_therm=entr_therm +zentr_therm/real(nsplit_thermals) |
74 |
fm_therm(:, klev+1)=0. |
75 |
|
76 |
! accumulation de la tendance |
77 |
d_t_ajs=d_t_ajs+d_t_the |
78 |
d_u_ajs=d_u_ajs+d_u_the |
79 |
d_v_ajs=d_v_ajs+d_v_the |
80 |
d_q_ajs=d_q_ajs+d_q_the |
81 |
|
82 |
! incrementation des variables meteo |
83 |
t_seri = t_seri + d_t_the |
84 |
u_seri = u_seri + d_u_the |
85 |
v_seri = v_seri + d_v_the |
86 |
q_seri = q_seri + d_q_the |
87 |
|
88 |
! tests sur les valeurs negatives de l'eau |
89 |
DO k = 1, klev |
90 |
DO i = 1, klon |
91 |
if (.not.q_seri(i, k) >= 0.) then |
92 |
print*, 'WARN eau<0 apres therm i=', i, ' k=', k, ' dq, q', & |
93 |
d_q_the(i, k), q_seri(i, k) |
94 |
q_seri(i, k)=1.e-15 |
95 |
endif |
96 |
ENDDO |
97 |
ENDDO |
98 |
enddo |
99 |
|
100 |
end subroutine calltherm |
101 |
|
102 |
end module calltherm_m |