/[lmdze]/trunk/phylmd/coefkzmin.f
ViewVC logotype

Diff of /trunk/phylmd/coefkzmin.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 233 by guez, Tue Nov 7 10:52:46 2017 UTC revision 239 by guez, Fri Nov 10 15:16:48 2017 UTC
# Line 4  module coefkzmin_m Line 4  module coefkzmin_m
4    
5  contains  contains
6    
7    SUBROUTINE coefkzmin(ngrid, ypaprs, ypplay, yu, yv, yt, yq, ycoefm, km, kn)    SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm, kn)
8    
9      ! From LMDZ4/libf/phylmd/coefkzmin.F, version 1.1.1.1 2004/05/19 12:53:08      ! From LMDZ4/libf/phylmd/coefkzmin.F, version 1.1.1.1 2004/05/19 12:53:08
10    
# Line 14  contains Line 14  contains
14      USE dimphy, ONLY: klev, klon      USE dimphy, ONLY: klev, klon
15      USE suphec_m, ONLY: rd, rg, rkappa      USE suphec_m, ONLY: rd, rg, rkappa
16    
17      integer, intent(in):: ngrid      integer, intent(in):: knon
18      REAL, intent(in):: ypaprs(klon, klev+1), ypplay(klon, klev)      REAL, intent(in):: ypaprs(klon, klev+1), ypplay(klon, klev)
19      REAL, intent(in):: yu(klon, klev), yv(klon, klev) ! wind, in m s-1      REAL, intent(in):: yu(klon, klev), yv(klon, klev) ! wind, in m s-1
20      REAL, intent(in):: yt(klon, klev) ! temperature, in K      REAL, intent(in):: yt(klon, klev) ! temperature, in K
21      REAL, intent(in):: yq(klon, klev)      REAL, intent(in):: yq(klon, klev)
22      REAL, intent(in):: ycoefm(:) ! (ngrid) drag coefficient      REAL, intent(in):: ycoefm(:) ! (knon) drag coefficient
23    
24      REAL, intent(inout):: km(:, 2:) ! (knon, 2:klev)      REAL, intent(out):: kn(:, 2:) ! (knon, 2:klev) coefficient de
25      ! coefficient de diffusion turbulente de quantité de mouvement (au      ! diffusion turbulente de la quantité de mouvement et des
26      ! bas de chaque couche) (en sortie : la valeur à la fin du pas de      ! scalaires (au bas de chaque couche) (en sortie : la valeur à la
27      ! temps), m2 s-1      ! fin du pas de temps), m2 s-1
   
     REAL, intent(inout):: kn(:, 2:) ! (knon, 2:klev)  
     ! coefficient de diffusion turbulente des scalaires (au bas de  
     ! chaque couche) (en sortie : la valeur à la fin du pas de temps), m2 s-1  
28    
29      ! Local:      ! Local:
30    
31      real ustar(ngrid) ! u*      real ustar(knon) ! u*
32      real zlay(ngrid, klev) ! in m      real zlay(knon, klev) ! in m
33      integer i, k      integer i, k
34      real pblhmin(ngrid)      real pblhmin(knon)
35      real, parameter:: coriol = 1e-4      real, parameter:: coriol = 1e-4
36    
37      REAL zlev(ngrid, 2: klev)      REAL zlev(knon, 2: klev)
38      ! altitude at level (interface between layer with same index), in m      ! altitude at level (interface between layer with same index), in m
39    
40      REAL teta(ngrid, klev)      REAL teta(knon, klev)
41      ! température potentielle au centre de chaque couche (la valeur au      ! température potentielle au centre de chaque couche (la valeur au
42      ! debut du pas de temps)      ! debut du pas de temps)
43    
# Line 51  contains Line 47  contains
47    
48      ! Debut de la partie qui doit etre incluse a terme dans clmain.      ! Debut de la partie qui doit etre incluse a terme dans clmain.
49    
50      do i = 1, ngrid      do i = 1, knon
51         zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) &         zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) &
52              * (ypaprs(i, 1) - ypplay(i, 1)) / RG              * (ypaprs(i, 1) - ypplay(i, 1)) / RG
53      enddo      enddo
54    
55      do k = 2, klev      do k = 2, klev
56         do i = 1, ngrid         do i = 1, knon
57            zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) &            zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) &
58                 / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG                 / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG
59         enddo         enddo
60      enddo      enddo
61    
62      do k=1, klev      do k=1, klev
63         do i = 1, ngrid         do i = 1, knon
64            ! Attention : on passe la temperature potentielle virtuelle            ! Attention : on passe la temperature potentielle virtuelle
65            ! pour le calcul de K.            ! pour le calcul de K.
66            teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa &            teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa &
# Line 73  contains Line 69  contains
69      enddo      enddo
70    
71      forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1))      forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1))
72      ustar = SQRT(ycoefm * (yu(:ngrid, 1)**2 + yv(:ngrid, 1)**2))      ustar = SQRT(ycoefm * (yu(:knon, 1)**2 + yv(:knon, 1)**2))
73    
74      ! Fin de la partie qui doit être incluse à terme dans clmain      ! Fin de la partie qui doit être incluse à terme dans clmain
75    
# Line 87  contains Line 83  contains
83      pblhmin = 0.07 * ustar / coriol      pblhmin = 0.07 * ustar / coriol
84    
85      do k = 2, klev      do k = 2, klev
86         do i = 1, ngrid         do i = 1, knon
87            if (teta(i, 2) > teta(i, 1)) then            if (teta(i, 2) > teta(i, 1)) then
88               kn(i, k) = kap * zlev(i, k) * ustar(i) &               kn(i, k) = kap * zlev(i, k) * ustar(i) &
89                    * (max(1. - zlev(i, k) / pblhmin(i), 0.))**2                    * (max(1. - zlev(i, k) / pblhmin(i), 0.))**2
90            else            else
91               kn(i, k) = 0. ! min n'est utilisé que pour les SL stables               kn(i, k) = 0. ! min n'est utilisé que pour les SL stables
92            endif            endif
           km(i, k) = kn(i, k)  
93         enddo         enddo
94      enddo      enddo
95    

Legend:
Removed from v.233  
changed lines
  Added in v.239

  ViewVC Help
Powered by ViewVC 1.1.21