source: LMDZ6/branches/Amaury_dev/libf/phylmd/screenp_mod.F90 @ 5136

Last change on this file since 5136 was 5134, checked in by abarral, 4 months ago

Replace academic.h, alpale.h, comdissip.h, comdissipn.h, comdissnew.h by modules
Remove unused clesph0.h

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