SURFEX v8.1
General documentation of Surfex
subscale_z0eff.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! ######spl
6  SUBROUTINE subscale_z0eff(ISSK,PZ0VEG,OZ0REL,OMASK )
7 ! ######################################################################
8 !
9 !!*SUBSCALE_Z0EFF computes an effective roughness lenght deduced
10 !! from the subgrid-scale orography.
11 !!
12 !!
13 !! METHOD
14 !! ------
15 !! See M.Georgelin and al. July 1994, Monthly Weather Review.
16 !!
17 !! EXTERNAL
18 !! --------
19 !!
20 !! IMPLICIT ARGUMENTS
21 !! ------------------
22 !!
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! M. Georgelin Laboratoire d'Aerologie
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 18/12/95
36 !! 22/12/97 (V Masson) call with dummy arguments
37 !!
38 !----------------------------------------------------------------------------
39 !
40 !* 0. DECLARATION
41 ! -----------
42 !
43 USE modd_csts, ONLY : xkarman
44 USE modd_isba_par, ONLY : xcdz0eff
45 USE modd_surf_par, ONLY : xundef
46 !
47 USE modd_sso_n, ONLY : sso_t
48 !
49 USE modi_get_z0rel
50 !
51 USE yomhook ,ONLY : lhook, dr_hook
52 USE parkind1 ,ONLY : jprb
53 !
54 IMPLICIT NONE
55 !
56 !* 0.1 Declaration of dummy arguments
57 ! ------------------------------
58 !
59 TYPE(sso_t), INTENT(INOUT) :: ISSK
60 REAL, DIMENSION(:), INTENT(IN) :: PZ0VEG ! vegetation roughness length
61 !
62 LOGICAL, INTENT(IN) :: OZ0REL
63 LOGICAL, DIMENSION(:), INTENT(IN), OPTIONAL :: OMASK ! mask where computations
64  ! are done
65 !
66 !* 0.2 Declaration of other local variables
67 ! ------------------------------------
68 !
69 REAL, DIMENSION(SIZE(ISSK%XAOSIP)) :: ZLOC
70 LOGICAL, DIMENSION(SIZE(ISSK%XZ0EFFIM)) :: GMASK
71 !
72 INTEGER :: JJ ! loop counter on points
73 REAL(KIND=JPRB) :: ZHOOK_HANDLE
74 !----------------------------------------------------------------------------
75 !
76 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF',0,zhook_handle)
77 !
78 IF (.NOT.PRESENT(omask)) THEN
79  issk%XZ0EFFIP = xundef
80  issk%XZ0EFFIM = xundef
81  issk%XZ0EFFJP = xundef
82  issk%XZ0EFFJM = xundef
83 ENDIF
84 !
85 !----------------------------------------------------------------------------
86 !
87 IF (PRESENT(omask)) THEN
88  gmask=omask
89 ELSEIF (all(pz0veg(:)==0.)) THEN
90  gmask = (issk%XAOSIP/=xundef) ! computations always performed where SSO data exist
91 ELSE
92  gmask=pz0veg(:) /= xundef ! computations always performed where defined
93 END IF
94 !
95 !* 1. Computations from A/S and h/2
96 ! -----------------------------
97 !
98  CALL get_z0eff(gmask(:),pz0veg(:),issk%XHO2JP(:),issk%XAOSJP(:),issk%XZ0EFFJP(:))
99  CALL get_z0eff(gmask(:),pz0veg(:),issk%XHO2JM(:),issk%XAOSJM(:),issk%XZ0EFFJM(:))
100  CALL get_z0eff(gmask(:),pz0veg(:),issk%XHO2IM(:),issk%XAOSIM(:),issk%XZ0EFFIM(:))
101  CALL get_z0eff(gmask(:),pz0veg(:),issk%XHO2IP(:),issk%XAOSIP(:),issk%XZ0EFFIP(:))
102 !
103 IF (oz0rel) CALL get_z0rel(issk,gmask)
104 !
105 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF',1,zhook_handle)
106 !
107 !-------------------------------------------------------------------------------
108 CONTAINS
109 !
110 SUBROUTINE get_z0eff(OCOMPUT,PZ0,PHO,PAO,PZ0EFF)
111 !
112 USE modd_isba_par, ONLY : xcdz0eff
113 USE modd_csts, ONLY : xkarman
114 !
115 USE yomhook ,ONLY : lhook, dr_hook
116 USE parkind1 ,ONLY : jprb
117 !
118 IMPLICIT NONE
119 !
120 LOGICAL, DIMENSION(:), INTENT(IN) :: OCOMPUT
121 REAL, DIMENSION(:), INTENT(IN) :: PZ0
122 REAL, DIMENSION(:), INTENT(IN) :: PHO
123 REAL, DIMENSION(:), INTENT(IN) :: PAO
124 REAL, DIMENSION(:), INTENT(INOUT):: PZ0EFF
125 !
126 LOGICAL, DIMENSION(SIZE(PZ0)) :: LWORK1
127 !
128 REAL :: ZLOC1,ZLOC2,ZLOC3
129 INTEGER :: JJ, INI
130 !
131 REAL(KIND=JPRB) :: ZHOOK_HANDLE
132 !
133 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF:GET_ZOEFF',0,zhook_handle)
134 !
135 ini=SIZE(pz0)
136 !
137 lwork1(:)=(pho(:)>pz0(:).AND.(pz0(:)/=0.0.OR.pao(:)/=0.0))
138 !
139 DO jj=1,ini
140  IF (ocomput(jj)) THEN
141  IF (lwork1(jj)) THEN
142  zloc1 = (xcdz0eff/(2.*xkarman**2))*pao(jj)
143  IF ( pz0(jj) > 0. ) THEN
144  zloc2 = 1./(alog(pho(jj)/pz0(jj)))**2
145  ELSE
146  zloc2 = 0.
147  ENDIF
148  zloc3 = sqrt(1./(zloc1+zloc2))
149  pz0eff(jj) = pho(jj) * exp(-zloc3)
150  ELSE
151  pz0eff(jj) = pz0(jj)
152  ENDIF
153  ENDIF
154 ENDDO
155 !
156 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF:GET_ZOEFF',1,zhook_handle)
157 !
158 END SUBROUTINE get_z0eff
159 
160 END SUBROUTINE subscale_z0eff
subroutine subscale_z0eff(ISSK, PZ0VEG, OZ0REL, OMASK)
subroutine get_z0eff(OCOMPUT, PZ0, PHO, PAO, PZ0EFF)
real, save xkarman
Definition: modd_csts.F90:48
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
subroutine get_z0rel(ISS, OMASK)
Definition: get_z0rel.F90:7