23 REAL,
DIMENSION(:,:),
ALLOCATABLE ::
kcoefhq
31 delp, temp, q,
dtime, &
33 ccoef_h_out, ccoef_q_out, dcoef_h_out, dcoef_q_out, &
34 kcoef_hq_out, gama_q_out, gama_h_out, &
36 acoef_h_out, acoef_q_out, bcoef_h_out, bcoef_q_out)
44 INTEGER,
INTENT(IN) :: knon
45 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: coefhq
46 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pplay
47 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
48 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: temp, delp
49 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: q
50 REAL,
INTENT(IN) :: dtime
54 REAL,
DIMENSION(klon),
INTENT(OUT) :: Acoef_H_out
55 REAL,
DIMENSION(klon),
INTENT(OUT) :: Acoef_Q_out
56 REAL,
DIMENSION(klon),
INTENT(OUT) :: Bcoef_H_out
57 REAL,
DIMENSION(klon),
INTENT(OUT) :: Bcoef_Q_out
60 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Ccoef_H_out
61 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Ccoef_Q_out
62 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Dcoef_H_out
63 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Dcoef_Q_out
64 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Kcoef_hq_out
65 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: gama_q_out
66 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: gama_h_out
71 LOGICAL,
SAVE :: first=.
true.
73 REAL,
DIMENSION(klon,klev) :: local_H
74 REAL,
DIMENSION(klon) :: psref
93 IF ( ierr /= 0 ) print*,
' pb in allloc Ccoef_Q, ierr=', ierr
96 IF ( ierr /= 0 ) print*,
' pb in allloc Dcoef_Q, ierr=', ierr
99 IF ( ierr /= 0 ) print*,
' pb in allloc Ccoef_H, ierr=', ierr
102 IF ( ierr /= 0 ) print*,
' pb in allloc Dcoef_H, ierr=', ierr
105 IF ( ierr /= 0 ) print*,
' pb in allloc Acoef_X and Bcoef_X, ierr=', ierr
108 IF ( ierr /= 0 ) print*,
' pb in allloc Kcoefhq, ierr=', ierr
111 IF ( ierr /= 0 ) print*,
' pb in allloc gamaq, ierr=', ierr
114 IF ( ierr /= 0 ) print*,
' pb in allloc gamah, ierr=', ierr
126 coefhq(i,k)*
rg*
rg*dtime /(pplay(i,k-1)-pplay(i,k)) &
127 *(paprs(i,k)*2/(temp(i,k)+temp(i,k-1))/rd)**2
137 psref(:) = paprs(:,1)
142 gamah(:,:) = -1.0e-03
143 gamah(:,2) = -2.5e-03
148 delz = rd * (temp(i,k-1)+temp(i,k)) / &
149 2.0 /
rg / paprs(i,k) * (pplay(i,k-1)-pplay(i,k))
150 pkh = (psref(i)/paprs(i,k))**rkappa
184 local_h(i,k) = rcpd * temp(i,k) * &
185 (psref(i)/pplay(i,k))**rkappa
208 IF (mod(iflag_pbl_split,2) .eq.1)
THEN
212 ccoef_h_out(i,k) =
ccoef_h(i,k)
213 dcoef_h_out(i,k) =
dcoef_h(i,k)
214 ccoef_q_out(i,k) =
ccoef_q(i,k)
215 dcoef_q_out(i,k) =
dcoef_q(i,k)
216 kcoef_hq_out(i,k) =
kcoefhq(i,k)
221 gama_h_out(i,k) =
gamah(i,k)
222 gama_q_out(i,k) =
gamaq(i,k)
234 SUBROUTINE calc_coef(knon, Kcoef, gama, delp, X, Ccoef, Dcoef, Acoef, Bcoef)
242 INTEGER,
INTENT(IN) :: knon
243 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: Kcoef, delp
244 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: X
245 REAL,
DIMENSION(klon,2:klev),
INTENT(IN) :: gama
249 REAL,
DIMENSION(klon),
INTENT(OUT) :: Acoef, Bcoef
250 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: Ccoef, Dcoef
279 buf = delp(i,k) + kcoef(i,k) + kcoef(i,k+1)*(1.-dcoef(i,k+1))
280 ccoef(i,k) = (x(i,k)*delp(i,k) + kcoef(i,k+1)*ccoef(i,k+1) + &
281 kcoef(i,k+1)*gama(i,k+1) - kcoef(i,k)*gama(i,k))/buf
282 dcoef(i,k) = kcoef(i,k)/buf
292 buf = delp(i,1) + kcoef(i,2)*(1.-dcoef(i,2))
293 acoef(i) = (x(i,1)*delp(i,1) + kcoef(i,2)*(gama(i,2)+ccoef(i,2)))/buf
294 bcoef(i) = -1. *
rg / buf
301 SUBROUTINE climb_hq_up(knon, dtime, t_old, q_old, &
304 acoef_h_in, acoef_q_in, bcoef_h_in, bcoef_q_in, &
305 ccoef_h_in, ccoef_q_in, dcoef_h_in, dcoef_q_in, &
306 kcoef_hq_in, gama_q_in, gama_h_in, &
308 flux_q, flux_h, d_q, d_t)
319 INTEGER,
INTENT(IN) :: knon
320 REAL,
INTENT(IN) :: dtime
321 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: t_old, q_old
322 REAL,
DIMENSION(klon),
INTENT(IN) :: flx_q1, flx_h1
323 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
324 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pplay
327 REAL,
DIMENSION(klon),
INTENT(IN) :: Acoef_H_in,Acoef_Q_in, Bcoef_H_in, Bcoef_Q_in
328 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: Ccoef_H_in, Ccoef_Q_in, Dcoef_H_in, Dcoef_Q_in
329 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: Kcoef_hq_in, gama_q_in, gama_h_in
334 REAL,
DIMENSION(klon,klev),
INTENT(OUT) :: flux_q, flux_h, d_q, d_t
338 LOGICAL,
SAVE :: last=.
false.
339 REAL,
DIMENSION(klon,klev) :: h_new, q_new
340 REAL,
DIMENSION(klon) :: psref
341 INTEGER :: k, i, ierr
358 psref(1:knon) = paprs(1:knon,1)
361 IF (mod(iflag_pbl_split,2) .eq.1)
THEN
377 gamah(i,k)=gama_h_in(i,k)
378 gamaq(i,k)=gama_q_in(i,k)
393 q_new(1:knon,1) =
acoef_q(1:knon) +
bcoef_q(1:knon)*flx_q1(1:knon)*dtime
394 h_new(1:knon,1) =
acoef_h(1:knon) +
bcoef_h(1:knon)*flx_h1(1:knon)*dtime
410 flux_q(1:knon,1)=flx_q1(1:knon)
411 flux_h(1:knon,1)=flx_h1(1:knon)
416 flux_q(i,k) = (
kcoefhq(i,k)/
rg/dtime) * &
417 (q_new(i,k)-q_new(i,k-1)+
gamaq(i,k))
419 flux_h(i,k) = (
kcoefhq(i,k)/
rg/dtime) * &
420 (h_new(i,k)-h_new(i,k-1)+
gamah(i,k))
432 d_t(i,k) = h_new(i,k)/(psref(i)/pplay(i,k))**rkappa/rcpd - t_old(i,k)
433 d_q(i,k) = q_new(i,k) - q_old(i,k)
443 IF ( ierr /= 0 ) print*,
' pb in dealllocate Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H, ierr=', ierr
445 IF ( ierr /= 0 ) print*,
' pb in dealllocate Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H, ierr=', ierr
447 IF ( ierr /= 0 ) print*,
' pb in dealllocate gamaq, gamah, ierr=', ierr
449 IF ( ierr /= 0 ) print*,
' pb in dealllocate Kcoefhq, ierr=', ierr
real, dimension(:,:), allocatable dcoef_q
real, dimension(:,:), allocatable ccoef_h
subroutine, public climb_hq_up(knon, dtime, t_old, q_old,flx_q1, flx_h1, paprs, pplay,
!$Header!integer nvarmx dtime
real, dimension(:), allocatable acoef_h
real, dimension(:,:), allocatable ccoef_q
real, dimension(:), allocatable bcoef_h
!$Id iflag_pbl_split common compbl iflag_pbl
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
real, dimension(:,:), allocatable kcoefhq
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL pplay
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le paprs
subroutine calc_coef(knon, Kcoef, gama, delp, X, Ccoef, Dcoef, Acoef, Bcoef)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
real, dimension(:,:), allocatable dcoef_h
real, dimension(:,:), allocatable gamah
real, dimension(:,:), allocatable gamaq
subroutine, public climb_hq_down(knon, coefhq, paprs, pplay,delp, temp, q, dtime,
real, dimension(:), allocatable bcoef_q
real, dimension(:), allocatable acoef_q