source: LMDZ6/branches/Amaury_dev/libf/phylmd/lmdz_screenp.f90 @ 5185

Last change on this file since 5185 was 5158, checked in by abarral, 5 months ago

Add missing klon on strataer_emiss_mod.F90
Correct various missing explicit declarations
Replace tabs by spaces (tabs are not part of the fortran charset)
Continue cleaning modules
Removed unused arguments and variables

  • Property svn:executable set to *
File size: 7.0 KB
Line 
1MODULE lmdz_screenp
2
3  ! This module contains some procedures for calculation of the first
4  ! guess of temperature, specific humidity and wind at a reference level
5  ! coefficients for turbulent diffusion at surface
6
7  IMPLICIT NONE; PRIVATE
8  PUBLIC screenp, screenpn
9
10CONTAINS
11
12  !****************************************************************************************
13
14  !r original routine
15
16  SUBROUTINE screenp(klon, knon, &
17          speed, tair, qair, &
18          ts, qsurf, rugos, lmon, &
19          ustar, testar, qstar, zref, &
20          delu, delte, delq)
21    IMPLICIT NONE
22    !-------------------------------------------------------------------------
23
24    ! Objet : calcul "predicteur" des anomalies du vent, de la temperature
25    !         potentielle et de l'humidite relative au niveau de reference zref et
26    !         par rapport au 1er niveau (pour u) ou a la surface (pour theta et q)
27    !         a partir des relations de Dyer-Businger.
28
29    ! Reference : Hess, Colman et McAvaney (1995)
30
31    ! I. Musat, 01.07.2002
32    !-------------------------------------------------------------------------
33
34    ! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
35    ! knon----input-I- nombre de points pour un type de surface
36    ! speed---input-R- module du vent au 1er niveau du modele
37    ! tair----input-R- temperature de l'air au 1er niveau du modele
38    ! qair----input-R- humidite relative au 1er niveau du modele
39    ! ts------input-R- temperature de l'air a la surface
40    ! qsurf---input-R- humidite relative a la surface
41    ! rugos---input-R- rugosite
42    ! lmon----input-R- longueur de Monin-Obukov
43    ! ustar---input-R- facteur d'echelle pour le vent
44    ! testar--input-R- facteur d'echelle pour la temperature potentielle
45    ! qstar---input-R- facteur d'echelle pour l'humidite relative
46    ! zref----input-R- altitude de reference
47
48    ! delu----input-R- anomalie du vent par rapport au 1er niveau
49    ! delte---input-R- anomalie de la temperature potentielle par rapport a la surface
50    ! delq----input-R- anomalie de l'humidite relative par rapport a la surface
51
52    INTEGER, INTENT(IN) :: klon, knon
53    REAL, DIMENSION(klon), INTENT(IN) :: speed, tair, qair
54    REAL, DIMENSION(klon), INTENT(IN) :: ts, qsurf, rugos
55    DOUBLE PRECISION, DIMENSION(klon), INTENT(IN) :: lmon
56    REAL, DIMENSION(klon), INTENT(IN) :: ustar, testar, qstar
57    REAL, INTENT(IN) :: zref
58
59    REAL, DIMENSION(klon), INTENT(OUT) :: delu, delte, delq
60
61    !-------------------------------------------------------------------------
62    ! Variables locales et constantes :
63    REAL, PARAMETER :: RKAR = 0.40
64    INTEGER :: i
65    REAL :: xtmp, xtmp0
66    !-------------------------------------------------------------------------
67    DO i = 1, knon
68
69      IF (lmon(i)>=0.) THEN
70
71        ! STABLE CASE
72
73        IF (speed(i)>1.5.AND.lmon(i)<=1.0                        &
74                .AND. rugos(i)<=1.0) THEN
75          delu(i) = (ustar(i) / RKAR) * &
76                  (log(zref / (rugos(i)) + 1.) + &
77                          min(5.d0, 5.0 * (zref - rugos(i)) / lmon(i)))
78          delte(i) = (testar(i) / RKAR) * &
79                  (log(zref / (rugos(i)) + 1.) + &
80                          min(5.d0, 5.0 * (zref - rugos(i)) / lmon(i)))
81          delq(i) = (qstar(i) / RKAR) * &
82                  (log(zref / (rugos(i)) + 1.) + &
83                          min(5.d0, 5.0 * (zref - rugos(i)) / lmon(i)))
84        ELSE
85          delu(i) = 0.1 * speed(i)
86          delte(i) = 0.1 * (tair(i) - ts(i))
87          delq(i) = 0.1 * (max(qair(i), 0.0) - max(qsurf(i), 0.0))
88        ENDIF
89      ELSE
90
91        ! UNSTABLE CASE
92
93        IF (speed(i)>5.0.AND.abs(lmon(i))<=50.0) THEN
94          xtmp = (1. - 16. * (zref / lmon(i)))**(1. / 4.)
95          xtmp0 = (1. - 16. * (rugos(i) / lmon(i)))**(1. / 4.)
96          delu(i) = (ustar(i) / RKAR) * &
97                  (log(zref / (rugos(i)) + 1.) &
98                          - 2. * log(0.5 * (1. + xtmp)) &
99                          + 2. * log(0.5 * (1. + xtmp0)) &
100                          - log(0.5 * (1. + xtmp * xtmp)) &
101                          + log(0.5 * (1. + xtmp0 * xtmp0)) &
102                          + 2. * atan(xtmp) - 2. * atan(xtmp0))
103          delte(i) = (testar(i) / RKAR) * &
104                  (log(zref / (rugos(i)) + 1.) &
105                          - 2.0 * log(0.5 * (1. + xtmp * xtmp)) &
106                          + 2.0 * log(0.5 * (1. + xtmp0 * xtmp0)))
107          delq(i) = (qstar(i) / RKAR) * &
108                  (log(zref / (rugos(i)) + 1.) &
109                          - 2.0 * log(0.5 * (1. + xtmp * xtmp)) &
110                          + 2.0 * log(0.5 * (1. + xtmp0 * xtmp0)))
111        ELSE
112          delu(i) = 0.5 * speed(i)
113          delte(i) = 0.5 * (tair(i) - ts(i))
114          delq(i) = 0.5 * (max(qair(i), 0.0) - max(qsurf(i), 0.0))
115        ENDIF
116      ENDIF
117
118    ENDDO
119
120  END SUBROUTINE screenp
121
122  SUBROUTINE screenpn(klon, knon, speed, tair, qair, ts, qsurf, zri1, delu, delte, delq)
123    IMPLICIT NONE
124    !-------------------------------------------------------------------------
125
126    ! Objet : calcul "predicteur" des anomalies du vent, de la temperature
127    !         potentielle et de l'humidite relative au niveau de reference zref et
128    !         par rapport au 1er niveau (pour u) ou a la surface (pour theta et q)
129    !         a partir des relations de Dyer-Businger.
130
131    ! Reference : Hess, Colman et McAvaney (1995)
132
133    ! I. Musat, 01.07.2002
134    !-------------------------------------------------------------------------
135
136    ! klon----input-I- dimension de la grille physique (= nb_pts_latitude X nb_pts_longitude)
137    ! knon----input-I- nombre de points pour un type de surface
138    ! speed---input-R- module du vent au 1er niveau du modele
139    ! tair----input-R- temperature de l'air au 1er niveau du modele
140    ! qair----input-R- humidite relative au 1er niveau du modele
141    ! ts------input-R- temperature de l'air a la surface
142    ! qsurf---input-R- humidite relative a la surface
143
144    ! delu----input-R- anomalie du vent par rapport au 1er niveau
145    ! delte---input-R- anomalie de la temperature potentielle par rapport a la surface
146    ! delq----input-R- anomalie de l'humidite relative par rapport a la surface
147
148    INTEGER, INTENT(IN) :: klon, knon
149    REAL, DIMENSION(klon), INTENT(IN) :: speed, tair, qair
150    REAL, DIMENSION(klon), INTENT(IN) :: ts, qsurf
151    REAL, DIMENSION(klon), INTENT(IN) :: zri1
152
153    REAL, DIMENSION(klon), INTENT(OUT) :: delu, delte, delq
154
155    !-------------------------------------------------------------------------
156    ! Variables locales et constantes :
157    REAL, PARAMETER :: RKAR = 0.40
158    INTEGER :: i
159    !-------------------------------------------------------------------------
160    DO i = 1, knon
161
162      IF (zri1(i)>=0.) THEN
163        delu(i) = 0.1 * speed(i)
164        delte(i) = 0.1 * (tair(i) - ts(i))
165        delq(i) = 0.1 * (max(qair(i), 0.0) - max(qsurf(i), 0.0))
166      ELSE
167        delu(i) = 0.5 * speed(i)
168        delte(i) = 0.5 * (tair(i) - ts(i))
169        delq(i) = 0.5 * (max(qair(i), 0.0) - max(qsurf(i), 0.0))
170      ENDIF
171
172    ENDDO
173
174  END SUBROUTINE screenpn
175END MODULE lmdz_screenp
Note: See TracBrowser for help on using the repository browser.