1 |
|
|
MODULE lmdz_thermcell_closure |
2 |
|
|
! |
3 |
|
|
! $Header$ |
4 |
|
|
! |
5 |
|
|
CONTAINS |
6 |
|
|
|
7 |
|
288 |
SUBROUTINE thermcell_closure(ngrid,nlay,r_aspect,ptimestep,rho, & |
8 |
|
288 |
& zlev,lalim,alim_star,zmax,wmax,f) |
9 |
|
|
|
10 |
|
|
!------------------------------------------------------------------------- |
11 |
|
|
!thermcell_closure: fermeture, determination de f |
12 |
|
|
! |
13 |
|
|
! Modification 7 septembre 2009 |
14 |
|
|
! 1. On enleve alim_star_tot des arguments pour le recalculer et etre ainis |
15 |
|
|
! coherent avec l'integrale au numerateur. |
16 |
|
|
! 2. On ne garde qu'une version des couples wmax,zmax et wmax_sec,zmax_sec |
17 |
|
|
! l'idee etant que le choix se fasse a l'appel de thermcell_closure |
18 |
|
|
! 3. Vectorisation en mettant les boucles en l l'exterieur avec des if |
19 |
|
|
!------------------------------------------------------------------------- |
20 |
|
|
IMPLICIT NONE |
21 |
|
|
|
22 |
|
|
! --- arguments ------------------------------------------ |
23 |
|
|
integer, intent(in) :: ngrid,nlay |
24 |
|
|
real, intent(in) :: r_aspect,ptimestep |
25 |
|
|
real, intent(in), dimension(ngrid,nlay) :: alim_star,rho,zlev |
26 |
|
|
integer, intent(in), dimension(ngrid) :: lalim |
27 |
|
|
real, intent(in), dimension(ngrid) :: zmax,wmax |
28 |
|
|
|
29 |
|
|
real, intent(out), dimension(ngrid) :: f |
30 |
|
|
|
31 |
|
|
|
32 |
|
|
! --- local ------------------------------------------ |
33 |
|
288 |
real, dimension(ngrid) :: zdenom,alim_star2,alim_star_tot |
34 |
|
|
INTEGER llmax |
35 |
|
|
INTEGER ig,k |
36 |
|
|
|
37 |
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
38 |
|
|
!print*,'THERMCELL CLOSURE 26E' |
39 |
|
|
|
40 |
✓✓ |
286560 |
alim_star2(:)=0. |
41 |
✓✓ |
286560 |
alim_star_tot(:)=0. |
42 |
✓✓ |
286560 |
f(:)=0. |
43 |
|
|
|
44 |
|
|
! Indice vertical max (max de lalim) atteint par les thermiques sur le domaine |
45 |
|
|
llmax=1 |
46 |
✓✓ |
286560 |
do ig=1,ngrid |
47 |
|
286560 |
if (lalim(ig)>llmax) llmax=lalim(ig) |
48 |
|
|
enddo |
49 |
|
|
|
50 |
|
|
|
51 |
|
|
! Calcul des integrales sur la verticale de alim_star et de |
52 |
|
|
! alim_star^2/(rho dz) |
53 |
✓✓ |
2115 |
do k=1,llmax-1 |
54 |
✓✓ |
1818153 |
do ig=1,ngrid |
55 |
✓✓ |
1817865 |
if (k<lalim(ig)) then |
56 |
|
|
alim_star2(ig)=alim_star2(ig)+alim_star(ig,k)**2 & |
57 |
|
341470 |
& /(rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k))) |
58 |
|
341470 |
alim_star_tot(ig)=alim_star_tot(ig)+alim_star(ig,k) |
59 |
|
|
endif |
60 |
|
|
enddo |
61 |
|
|
enddo |
62 |
|
|
|
63 |
|
|
|
64 |
✓✓ |
286560 |
do ig=1,ngrid |
65 |
✓✓ |
286560 |
if (alim_star2(ig)>1.e-10) then |
66 |
|
|
f(ig)=wmax(ig)*alim_star_tot(ig)/ & |
67 |
|
137471 |
& (max(500.,zmax(ig))*r_aspect*alim_star2(ig)) |
68 |
|
|
endif |
69 |
|
|
enddo |
70 |
|
|
|
71 |
|
|
|
72 |
|
|
|
73 |
|
288 |
RETURN |
74 |
|
|
end |
75 |
|
|
END MODULE lmdz_thermcell_closure |