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

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

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

revision 231 by guez, Mon Nov 6 18:00:54 2017 UTC revision 247 by guez, Fri Jan 5 14:45:45 2018 UTC
# Line 12  contains Line 12  contains
12      ! Objet : diffusion verticale de la vitesse      ! Objet : diffusion verticale de la vitesse
13    
14      USE dimphy, ONLY: klev      USE dimphy, ONLY: klev
15      use nr_util, only: assert_eq      use nr_util, only: assert
16      USE suphec_m, ONLY: rd, rg      USE suphec_m, ONLY: rd, rg
17    
18      REAL, intent(in):: dtime ! intervalle de temps (en s)      REAL, intent(in):: dtime ! intervalle de temps (en s)
19    
20      REAL, intent(in):: u1lay(:), v1lay(:) ! (knon)      REAL, intent(in):: u1lay(:), v1lay(:) ! (knon)
21      ! vent de la premiere couche (m/s)      ! vent de la premiere couche (m / s)
22    
23      REAL, intent(in):: coef(:, 2:) ! (knon, 2:klev)      REAL, intent(in):: coef(:, 2:) ! (knon, 2:klev)
24      ! Coefficient d'echange (m**2/s) multiplié par le cisaillement du      ! Coefficient d'echange (m**2 / s) multiplié par le cisaillement du
25      ! vent (dV/dz)      ! vent (dV / dz)
26    
27      REAL, intent(in):: cdrag(:) ! (knon) sans unité      REAL, intent(in):: cdrag(:) ! (knon) sans unité
   
28      REAL, intent(in):: t(:, :) ! (knon, klev) ! temperature (K)      REAL, intent(in):: t(:, :) ! (knon, klev) ! temperature (K)
29      REAL, intent(in):: ven(:, :) ! (knon, klev) vitesse horizontale (m/s)      REAL, intent(in):: ven(:, :) ! (knon, klev) vitesse horizontale (m / s)
30      REAL, intent(in):: paprs(:, :) ! (knon, klev+1) pression a inter-couche (Pa)      REAL, intent(in):: paprs(:, :) ! (knon, klev + 1) pression a
31        ! inter-couche (Pa)
32      real, intent(in):: pplay(:, :) ! (knon, klev) pression au milieu      real, intent(in):: pplay(:, :) ! (knon, klev) pression au milieu
33                                     ! de couche (Pa)      ! de couche (Pa)
34      real, intent(in):: delp(:, :) ! (knon, klev) epaisseur de couche (Pa)      real, intent(in):: delp(:, :) ! (knon, klev) epaisseur de couche (Pa)
35      REAL, intent(out):: d_ven(:, :) ! (knon, klev) ! le changement de "ven"      REAL, intent(out):: d_ven(:, :) ! (knon, klev) ! le changement de "ven"
36    
37      REAL, intent(out):: flux_v(:) ! (knon)      REAL, intent(out):: flux_v(:) ! (knon)
38      ! (diagnostic) flux du vent à la surface, en (kg m/s)/(m**2 s)      ! (diagnostic) flux du vent à la surface, en (kg m / s) / (m**2 s)
39      ! flux_v est le flux de moment angulaire (positif vers bas)      ! flux_v est le flux de moment angulaire (positif vers bas)
40    
41      ! Local:      ! Local:
42      INTEGER knon, i, k      INTEGER k
43      REAL zx_cv(size(u1lay), 2:klev) ! (knon, 2:klev)      REAL zx_cv(size(u1lay), 2:klev) ! (knon, 2:klev)
44      REAL zx_dv(size(u1lay), 2:klev) ! (knon, 2:klev)      REAL zx_dv(size(u1lay), 2:klev) ! (knon, 2:klev)
45      REAL zx_buf(size(u1lay)) ! (knon)      REAL zx_buf(size(u1lay)) ! (knon)
# Line 48  contains Line 48  contains
48    
49      !------------------------------------------------------------------      !------------------------------------------------------------------
50    
51      knon = assert_eq([size(u1lay), size(v1lay), size(coef, 1), size(t, 1), &      call assert(size(u1lay) == [size(v1lay), size(coef, 1), size(t, 1), &
52           size(ven, 1), size(paprs, 1), size(pplay, 1), size(delp, 1), &           size(ven, 1), size(paprs, 1), size(pplay, 1), size(delp, 1), &
53           size(d_ven, 1), size(flux_v)], "clvent knon")           size(d_ven, 1), size(flux_v)], "clvent knon")
     local_ven = ven  
54    
55      DO i = 1, knon      zx_coef(:, 1) = cdrag * (1. + SQRT(u1lay**2 + v1lay**2)) * pplay(:, 1) &
56         zx_coef(i, 1) = cdrag(i) * (1. + SQRT(u1lay(i)**2 + v1lay(i)**2)) &           / (RD * t(:, 1)) * dtime * RG
             * pplay(i, 1) / (RD * t(i, 1)) * dtime * RG  
     ENDDO  
57    
58      DO k = 2, klev      DO k = 2, klev
59         DO i = 1, knon         zx_coef(:, k) = coef(:, k) * RG / (pplay(:, k - 1) - pplay(:, k)) &
60            zx_coef(i, k) = coef(i, k) * RG / (pplay(i, k-1) - pplay(i, k)) &              * (paprs(:, k) * 2 / (t(:, k) + t(:, k - 1)) / RD)**2 * dtime * RG
                * (paprs(i, k) * 2 / (t(i, k) + t(i, k - 1)) / RD)**2  
           zx_coef(i, k) = zx_coef(i, k) * dtime * RG  
        ENDDO  
61      ENDDO      ENDDO
62    
63      DO i = 1, knon      zx_buf = delp(:, 1) + zx_coef(:, 1) + zx_coef(:, 2)
64         zx_buf(i) = delp(i, 1) + zx_coef(i, 1)+zx_coef(i, 2)      zx_cv(:, 2) = ven(:, 1) * delp(:, 1) / zx_buf
65         zx_cv(i, 2) = local_ven(i, 1)*delp(i, 1) / zx_buf(i)      zx_dv(:, 2) = zx_coef(:, 2) / zx_buf
66         zx_dv(i, 2) = zx_coef(i, 2) &  
             /zx_buf(i)  
     ENDDO  
67      DO k = 3, klev      DO k = 3, klev
68         DO i = 1, knon         zx_buf = delp(:, k - 1) + zx_coef(:, k) &
69            zx_buf(i) = delp(i, k-1) + zx_coef(i, k) &              + zx_coef(:, k - 1) * (1. - zx_dv(:, k - 1))
70                 + zx_coef(i, k-1)*(1.-zx_dv(i, k-1))         zx_cv(:, k) = (ven(:, k - 1) * delp(:, k - 1) &
71            zx_cv(i, k) = (local_ven(i, k-1)*delp(i, k-1) &              + zx_coef(:, k - 1) * zx_cv(:, k - 1)) / zx_buf
72                 +zx_coef(i, k-1)*zx_cv(i, k-1) )/zx_buf(i)         zx_dv(:, k) = zx_coef(:, k) / zx_buf
           zx_dv(i, k) = zx_coef(i, k)/zx_buf(i)  
        ENDDO  
     ENDDO  
     DO i = 1, knon  
        local_ven(i, klev) = ( local_ven(i, klev)*delp(i, klev) &  
             +zx_coef(i, klev)*zx_cv(i, klev) ) &  
             / ( delp(i, klev) + zx_coef(i, klev) &  
             -zx_coef(i, klev)*zx_dv(i, klev) )  
     ENDDO  
     DO k = klev-1, 1, -1  
        DO i = 1, knon  
           local_ven(i, k) = zx_cv(i, k+1) + zx_dv(i, k+1)*local_ven(i, k+1)  
        ENDDO  
73      ENDDO      ENDDO
74    
75      DO i = 1, knon      local_ven(:, klev) = (ven(:, klev) * delp(:, klev) &
76         flux_v(i) = zx_coef(i, 1)/(RG*dtime) &           + zx_coef(:, klev) * zx_cv(:, klev)) &
77              *local_ven(i, 1)           / (delp(:, klev) + zx_coef(:, klev) &
78      ENDDO           - zx_coef(:, klev) * zx_dv(:, klev))
79    
80      DO k = 1, klev      DO k = klev - 1, 1, - 1
81         DO i = 1, knon         local_ven(:, k) = zx_cv(:, k + 1) + zx_dv(:, k + 1) * local_ven(:, k + 1)
           d_ven(i, k) = local_ven(i, k) - ven(i, k)  
        ENDDO  
82      ENDDO      ENDDO
83    
84        flux_v = zx_coef(:, 1) / (RG * dtime) * local_ven(:, 1)
85        d_ven = local_ven - ven
86    
87    END SUBROUTINE clvent    END SUBROUTINE clvent
88    
89  end module clvent_m  end module clvent_m

Legend:
Removed from v.231  
changed lines
  Added in v.247

  ViewVC Help
Powered by ViewVC 1.1.21