/[lmdze]/trunk/phylmd/Interface_surf/yamada4.f
ViewVC logotype

Diff of /trunk/phylmd/Interface_surf/yamada4.f

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

trunk/Sources/phylmd/yamada4.f revision 229 by guez, Mon Nov 6 17:20:45 2017 UTC trunk/phylmd/Interface_surf/yamada4.f revision 288 by guez, Tue Jul 24 16:27:12 2018 UTC
# Line 8  module yamada4_m Line 8  module yamada4_m
8    
9  contains  contains
10    
11    SUBROUTINE yamada4(dt, g, zlev, zlay, u, v, teta, cd, q2, km, kn, kq, ustar)    SUBROUTINE yamada4(dt, zlev, zlay, u, v, teta, q2, coefm, coefh, ustar)
12    
13      ! From LMDZ4/libf/phylmd/yamada4.F, version 1.1 2004/06/22 11:45:36      ! From LMDZ4/libf/phylmd/yamada4.F, version 1.1 2004/06/22 11:45:36
14    
15      USE conf_phys_m, ONLY: iflag_pbl      USE conf_phys_m, ONLY: iflag_pbl
16      USE dimphy, ONLY: klev      USE dimphy, ONLY: klev
17      use nr_util, only: assert, assert_eq      use nr_util, only: assert, assert_eq
18        USE suphec_m, ONLY: rg
19    
20      REAL, intent(in):: dt ! pas de temps      REAL, intent(in):: dt ! pas de temps
     real, intent(in):: g  
21    
22      REAL zlev(:, :) ! (knon, klev + 1)      REAL zlev(:, :) ! (knon, klev + 1)
23      ! altitude \`a chaque niveau (interface inf\'erieure de la couche de      ! altitude \`a chaque niveau (interface inf\'erieure de la couche de
# Line 34  contains Line 34  contains
34      ! temp\'erature potentielle au centre de chaque couche (en entr\'ee :      ! temp\'erature potentielle au centre de chaque couche (en entr\'ee :
35      ! la valeur au d\'ebut du pas de temps)      ! la valeur au d\'ebut du pas de temps)
36    
     REAL, intent(in):: cd(:) ! (knon) cdrag, valeur au d\'ebut du pas de temps  
   
37      REAL, intent(inout):: q2(:, :) ! (knon, klev + 1)      REAL, intent(inout):: q2(:, :) ! (knon, klev + 1)
38      ! $q^2$ au bas de chaque couche      ! $q^2$ au bas de chaque couche
39      ! En entr\'ee : la valeur au d\'ebut du pas de temps ; en sortie : la      ! En entr\'ee : la valeur au d\'ebut du pas de temps ; en sortie : la
40      ! valeur \`a la fin du pas de temps.      ! valeur \`a la fin du pas de temps.
41    
42      REAL km(:, :) ! (knon, klev + 1)      REAL, intent(out):: coefm(:, 2:) ! (knon, 2:klev)
43      ! diffusivit\'e turbulente de quantit\'e de mouvement (au bas de      ! diffusivit\'e turbulente de quantit\'e de mouvement (au bas de
44      ! chaque couche) (en sortie : la valeur \`a la fin du pas de temps)      ! chaque couche) (en sortie : la valeur \`a la fin du pas de temps)
45    
46      REAL kn(:, :) ! (knon, klev + 1)      REAL, intent(out):: coefh(:, 2:) ! (knon, 2:klev)
47      ! diffusivit\'e turbulente des scalaires (au bas de chaque couche)      ! diffusivit\'e turbulente des scalaires (au bas de chaque couche)
48      ! (en sortie : la valeur \`a la fin du pas de temps)      ! (en sortie : la valeur \`a la fin du pas de temps)
49    
     REAL kq(:, :) ! (knon, klev + 1)  
50      real, intent(in):: ustar(:) ! (knon)      real, intent(in):: ustar(:) ! (knon)
51    
52      ! Local:      ! Local:
53      integer knon      integer knon
54      real kmin, qmin      real kmin, qmin
55      real pblhmin(size(cd)), coriol(size(cd)) ! (knon)      real pblhmin(size(ustar)), coriol(size(ustar)) ! (knon)
56      real qpre      real qpre
57      REAL unsdz(size(zlay, 1), size(zlay, 2)) ! (knon, klev)      REAL unsdz(size(zlay, 1), size(zlay, 2)) ! (knon, klev)
58      REAL unsdzdec(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)      REAL unsdzdec(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)
# Line 75  contains Line 72  contains
72      real zq      real zq
73      real dtetadz(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)      real dtetadz(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)
74      real l(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)      real l(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)
75      real l0(size(cd)) ! (knon)      real l0(size(ustar)) ! (knon)
76      real sq(size(cd)), sqz(size(cd)) ! (knon)      real sq(size(ustar)), sqz(size(ustar)) ! (knon)
77      real zz(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)      real zz(size(zlev, 1), size(zlev, 2)) ! (knon, klev + 1)
78      integer iter      integer iter
79      real:: ric = 0.195, rifc = 0.191, b1 = 16.6      real:: ric = 0.195, rifc = 0.191, b1 = 16.6
# Line 85  contains Line 82  contains
82    
83      call assert(any(iflag_pbl == [6, 8, 9]), "yamada4 iflag_pbl")      call assert(any(iflag_pbl == [6, 8, 9]), "yamada4 iflag_pbl")
84      knon = assert_eq([size(zlev, 1), size(zlay, 1), size(u, 1), size(v, 1), &      knon = assert_eq([size(zlev, 1), size(zlay, 1), size(u, 1), size(v, 1), &
85           size(teta, 1), size(cd), size(q2, 1), size(km, 1), size(kn, 1), &           size(teta, 1), size(ustar), size(q2, 1), size(coefm, 1), &
86           size(kq, 1)], "yamada4 knon")           size(coefh, 1)], "yamada4 knon")
87      call assert(klev == [size(zlev, 2) - 1, size(zlay, 2), size(u, 2), &      call assert(klev == [size(zlev, 2) - 1, size(zlay, 2), size(u, 2), &
88           size(v, 2), size(teta, 2), size(q2, 2) - 1, size(km, 2) - 1, &           size(v, 2), size(teta, 2), size(q2, 2) - 1, size(coefm, 2) + 1, &
89           size(kn, 2) - 1, size(kq, 2) - 1], "yamada4 klev")           size(coefh, 2) + 1], "yamada4 klev")
90    
91      ipas = ipas + 1      ipas = ipas + 1
92    
# Line 125  contains Line 122  contains
122            m2(ig, k) = ((u(ig, k)-u(ig, k-1))**2 + (v(ig, k)-v(ig, k-1))**2) &            m2(ig, k) = ((u(ig, k)-u(ig, k-1))**2 + (v(ig, k)-v(ig, k-1))**2) &
123                 /(dz(ig, k)*dz(ig, k))                 /(dz(ig, k)*dz(ig, k))
124            dtetadz(ig, k) = (teta(ig, k)-teta(ig, k-1))/dz(ig, k)            dtetadz(ig, k) = (teta(ig, k)-teta(ig, k-1))/dz(ig, k)
125            n2(ig, k) = g*2.*dtetadz(ig, k)/(teta(ig, k-1) + teta(ig, k))            n2(ig, k) = rg*2.*dtetadz(ig, k)/(teta(ig, k-1) + teta(ig, k))
126            ri = n2(ig, k)/max(m2(ig, k), 1.e-10)            ri = n2(ig, k)/max(m2(ig, k), 1.e-10)
127            if (ri.lt.ric) then            if (ri.lt.ric) then
128               rif(ig, k) = frif(ri)               rif(ig, k) = frif(ri)
# Line 215  contains Line 212  contains
212      else if (iflag_pbl >= 8) then      else if (iflag_pbl >= 8) then
213         ! Yamada 2.5 a la Didi         ! Yamada 2.5 a la Didi
214    
215         ! Calcul de l, km, au pas precedent         ! Calcul de l, coefm, au pas precedent
216         do k = 2, klev         do k = 2, klev
217            do ig = 1, knon            do ig = 1, knon
218               delta(ig, k) = q2(ig, k)/(l(ig, k)**2*sm(ig, k))               delta(ig, k) = q2(ig, k)/(l(ig, k)**2*sm(ig, k))
219               if (delta(ig, k).lt.1.e-20) then               if (delta(ig, k).lt.1.e-20) then
220                  delta(ig, k) = 1.e-20                  delta(ig, k) = 1.e-20
221               endif               endif
222               km(ig, k) = l(ig, k)*sqrt(q2(ig, k))*sm(ig, k)               coefm(ig, k) = l(ig, k)*sqrt(q2(ig, k))*sm(ig, k)
223               aa1 = (m2(ig, k)*(1.-rif(ig, k))-delta(ig, k)/b1)               aa1 = (m2(ig, k)*(1.-rif(ig, k))-delta(ig, k)/b1)
224               aa(ig, k) = aa1*dt/(delta(ig, k)*l(ig, k))               aa(ig, k) = aa1*dt/(delta(ig, k)*l(ig, k))
225               qpre = sqrt(q2(ig, k))               qpre = sqrt(q2(ig, k))
# Line 249  contains Line 246  contains
246      do k = 2, klev      do k = 2, klev
247         do ig = 1, knon         do ig = 1, knon
248            zq = sqrt(q2(ig, k))            zq = sqrt(q2(ig, k))
249            km(ig, k) = l(ig, k)*zq*sm(ig, k)            coefm(ig, k) = l(ig, k)*zq*sm(ig, k)
250            kn(ig, k) = km(ig, k)*alpha(ig, k)            coefh(ig, k) = coefm(ig, k)*alpha(ig, k)
           kq(ig, k) = l(ig, k)*zq*0.2  
251         enddo         enddo
252      enddo      enddo
253    
# Line 274  contains Line 270  contains
270            else            else
271               kmin = -1. ! kmin n'est utilise que pour les SL stables.               kmin = -1. ! kmin n'est utilise que pour les SL stables.
272            endif            endif
273            if (kn(ig, k).lt.kmin.or.km(ig, k).lt.kmin) then            if (coefh(ig, k).lt.kmin.or.coefm(ig, k).lt.kmin) then
274               kn(ig, k) = kmin               coefh(ig, k) = kmin
275               km(ig, k) = kmin               coefm(ig, k) = kmin
              kq(ig, k) = kmin  
276               ! la longueur de melange est suposee etre l = kap z               ! la longueur de melange est suposee etre l = kap z
277               ! K = l q Sm d'ou q2 = (K/l Sm)**2               ! K = l q Sm d'ou q2 = (K/l Sm)**2
278               q2(ig, k) = (qmin/sm(ig, k))**2               q2(ig, k) = (qmin/sm(ig, k))**2

Legend:
Removed from v.229  
changed lines
  Added in v.288

  ViewVC Help
Powered by ViewVC 1.1.21