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

Diff of /trunk/phylmd/coefkzmin.f

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

trunk/phylmd/coefkzmin.f90 revision 76 by guez, Fri Nov 15 18:45:49 2013 UTC trunk/phylmd/coefkzmin.f revision 254 by guez, Mon Feb 5 10:39:38 2018 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(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    
11      ! Entrées modifiées en attendant une version où les zlev et zlay      ! Entrées modifiées en attendant une version où les zlev et zlay
12      ! soient disponibles.      ! soient disponibles.
13    
14      USE dimphy, ONLY: klev, klon      USE dimphy, ONLY: klev
15      USE suphec_m, ONLY: rd, rg, rkappa      USE suphec_m, ONLY: rd, rg, rkappa
16    
17      integer, intent(in):: ngrid      REAL, intent(in):: ypaprs(:, :) ! (knon, klev+1)
18      REAL, intent(in):: ypaprs(klon, klev+1), ypplay(klon, klev)      REAL, intent(in):: ypplay(:, :) ! (knon, klev)
19      REAL, intent(in):: yu(klon, klev), yv(klon, klev) ! wind, in m s-1      REAL, intent(in):: yu(:, :), yv(:, :) ! (knon, klev) wind, in m s-1
20      REAL, intent(in):: yt(klon, klev) ! temperature, in K      REAL, intent(in):: yt(:, :) ! (knon, klev) temperature, in K
21      REAL, intent(in):: yq(klon, klev)      REAL, intent(in):: yq(:, :) ! (knon, klev)
22      REAL, intent(in):: ycoefm(:) ! (ngrid) drag coefficient      REAL, intent(in):: ycoefm(:) ! (knon) drag coefficient
23    
24      REAL, intent(inout):: km(klon, 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(klon, 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*      integer knon
32      real zlay(ngrid, klev) ! in m      real ustar(size(ypaprs, 1)) ! (knon) u*
33        real zlay(size(ypaprs, 1), klev) ! (knon, klev) in m
34      integer i, k      integer i, k
35      real pblhmin(ngrid)      real pblhmin(size(ypaprs, 1)) ! (knon)
36      real, parameter:: coriol = 1e-4      real, parameter:: coriol = 1e-4
37    
38      REAL zlev(ngrid, 2: klev)      REAL zlev(size(ypaprs, 1), 2: klev) ! (knon, 2: klev)
39      ! altitude at level (interface between layer with same index), in m      ! altitude at level (interface between layer with same index), in m
40    
41      REAL teta(ngrid, klev)      REAL teta(size(ypaprs, 1), klev) ! (knon, klev)
42      ! température potentielle au centre de chaque couche (la valeur au      ! température potentielle au centre de chaque couche (la valeur au
43      ! debut du pas de temps)      ! debut du pas de temps)
44    
# Line 49  contains Line 46  contains
46    
47      !---------------------------------------------------------------------      !---------------------------------------------------------------------
48    
49        knon = size(ypaprs, 1)
50        
51      ! Debut de la partie qui doit etre incluse a terme dans clmain.      ! Debut de la partie qui doit etre incluse a terme dans clmain.
52    
53      do i = 1, ngrid      do i = 1, knon
54         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)) &
55              * (ypaprs(i, 1) - ypplay(i, 1)) / RG              * (ypaprs(i, 1) - ypplay(i, 1)) / RG
56      enddo      enddo
57    
58      do k = 2, klev      do k = 2, klev
59         do i = 1, ngrid         do i = 1, knon
60            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)) &
61                 / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG                 / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG
62         enddo         enddo
63      enddo      enddo
64    
65      do k=1, klev      do k=1, klev
66         do i = 1, ngrid         do i = 1, knon
67            ! Attention : on passe la temperature potentielle virtuelle            ! Attention : on passe la temperature potentielle virtuelle
68            ! pour le calcul de K.            ! pour le calcul de K.
69            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 72  contains
72      enddo      enddo
73    
74      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))
75      ustar = SQRT(ycoefm * (yu(:ngrid, 1)**2 + yv(:ngrid, 1)**2))      ustar = SQRT(ycoefm * (yu(:, 1)**2 + yv(:, 1)**2))
76    
77      ! Fin de la partie qui doit être incluse à terme dans clmain      ! Fin de la partie qui doit être incluse à terme dans clmain
78    
# Line 87  contains Line 86  contains
86      pblhmin = 0.07 * ustar / coriol      pblhmin = 0.07 * ustar / coriol
87    
88      do k = 2, klev      do k = 2, klev
89         do i = 1, ngrid         do i = 1, knon
90            if (teta(i, 2) > teta(i, 1)) then            if (teta(i, 2) > teta(i, 1)) then
91               kn(i, k) = kap * zlev(i, k) * ustar(i) &               kn(i, k) = kap * zlev(i, k) * ustar(i) &
92                    * (max(1. - zlev(i, k) / pblhmin(i), 0.))**2                    * (max(1. - zlev(i, k) / pblhmin(i), 0.))**2
93            else            else
94               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
95            endif            endif
           km(i, k) = kn(i, k)  
96         enddo         enddo
97      enddo      enddo
98    

Legend:
Removed from v.76  
changed lines
  Added in v.254

  ViewVC Help
Powered by ViewVC 1.1.21