GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/coefkzmin.F90 Lines: 0 36 0.0 %
Date: 2023-06-30 12:51:15 Branches: 0 36 0.0 %

Line Branch Exec Source
1
2
SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm, km, kn)
3
4
  USE dimphy
5
  IMPLICIT NONE
6
7
  include "YOMCST.h"
8
9
  ! .......................................................................
10
  ! Entrees modifies en attendant une version ou les zlev, et zlay soient
11
  ! disponibles.
12
13
  REAL ycdragm(klon)
14
15
  REAL yu(klon, klev), yv(klon, klev)
16
  REAL yt(klon, klev), yq(klon, klev)
17
  REAL ypaprs(klon, klev+1), ypplay(klon, klev)
18
  REAL yustar(klon)
19
  REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
20
21
  INTEGER i
22
23
  ! .......................................................................
24
25
  ! En entree :
26
  ! -----------
27
28
  ! zlev : altitude a chaque niveau (interface inferieure de la couche
29
  ! de meme indice)
30
  ! ustar : u*
31
32
  ! teta : temperature potentielle au centre de chaque couche
33
  ! (en entree : la valeur au debut du pas de temps)
34
35
  ! en sortier :
36
  ! ------------
37
38
  ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
39
  ! couche)
40
  ! (en sortie : la valeur a la fin du pas de temps)
41
  ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
42
  ! (en sortie : la valeur a la fin du pas de temps)
43
44
  ! .......................................................................
45
46
  REAL ustar(klon)
47
  REAL kmin, qmin, pblhmin(klon), coriol(klon)
48
  REAL zlev(klon, klev+1)
49
  REAL teta(klon, klev)
50
51
  REAL km(klon, klev)
52
  REAL kn(klon, klev)
53
  INTEGER knon
54
55
56
  INTEGER nlay, nlev
57
  INTEGER ig, k
58
59
  REAL, PARAMETER :: kap = 0.4
60
61
  nlay = klev
62
  nlev = klev + 1
63
  ! .......................................................................
64
  ! en attendant une version ou les zlev, et zlay soient
65
  ! disponibles.
66
  ! Debut de la partie qui doit etre unclue a terme dans clmain.
67
68
  DO i = 1, knon
69
    yzlay(i, 1) = rd*yt(i, 1)/(0.5*(ypaprs(i,1)+ypplay(i, &
70
      1)))*(ypaprs(i,1)-ypplay(i,1))/rg
71
  END DO
72
  DO k = 2, klev
73
    DO i = 1, knon
74
      yzlay(i, k) = yzlay(i, k-1) + rd*0.5*(yt(i,k-1)+yt(i,k))/ypaprs(i, k)*( &
75
        ypplay(i,k-1)-ypplay(i,k))/rg
76
    END DO
77
  END DO
78
  DO k = 1, klev
79
    DO i = 1, knon
80
      ! ATTENTION:on passe la temperature potentielle virt. pour le calcul de
81
      ! K
82
      yteta(i, k) = yt(i, k)*(ypaprs(i,1)/ypplay(i,k))**rkappa* &
83
        (1.+0.61*yq(i,k))
84
    END DO
85
  END DO
86
  DO i = 1, knon
87
    yzlev(i, 1) = 0.
88
    yzlev(i, klev+1) = 2.*yzlay(i, klev) - yzlay(i, klev-1)
89
  END DO
90
  DO k = 2, klev
91
    DO i = 1, knon
92
      yzlev(i, k) = 0.5*(yzlay(i,k)+yzlay(i,k-1))
93
    END DO
94
  END DO
95
96
  yustar(1:knon) = sqrt(ycdragm(1:knon)*(yu(1:knon,1)*yu(1:knon,1)+yv(1:knon, &
97
    1)*yv(1:knon,1)))
98
99
  ! Fin de la partie qui doit etre unclue a terme dans clmain.
100
101
  ! ette routine est ecrite pour avoir en entree ustar, teta et zlev
102
  ! Ici, on a inclut le calcul de ces trois variables dans la routine
103
  ! coefkzmin en attendant une nouvelle version de la couche limite
104
  ! ou ces variables seront disponibles.
105
106
  ! Debut de la routine coefkzmin proprement dite.
107
108
  ustar = yustar
109
  teta = yteta
110
  zlev = yzlev
111
112
  DO ig = 1, knon
113
    coriol(ig) = 1.E-4
114
    pblhmin(ig) = 0.07*ustar(ig)/max(abs(coriol(ig)), 2.546E-5)
115
  END DO
116
117
  DO k = 2, klev
118
    DO ig = 1, knon
119
      IF (teta(ig,2)>teta(ig,1)) THEN
120
        qmin = ustar(ig)*(max(1.-zlev(ig,k)/pblhmin(ig),0.))**2
121
        kmin = kap*zlev(ig, k)*qmin
122
      ELSE
123
        kmin = 0. ! kmin n'est utilise que pour les SL stables.
124
      END IF
125
      kn(ig, k) = kmin
126
      km(ig, k) = kmin
127
    END DO
128
  END DO
129
130
131
  RETURN
132
END SUBROUTINE coefkzmin