SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
subscale_z0eff_1d.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 ! ######################################################################
6  SUBROUTINE subscale_z0eff_1d(PAOSIP,PAOSIM,PAOSJP,PAOSJM, &
7  pho2ip,pho2im,pho2jp,pho2jm,pz0veg, &
8  pz0effip,pz0effim,pz0effjp,pz0effjm, &
9  omask )
10 ! ######################################################################
11 !
12 !!*SUBSCALE_Z0EFF computes an effective roughness lenght deduced
13 !! from the subgrid-scale orography.
14 !!
15 !!
16 !! METHOD
17 !! ------
18 !! See M.Georgelin and al. July 1994, Monthly Weather Review.
19 !!
20 !! EXTERNAL
21 !! --------
22 !!
23 !! IMPLICIT ARGUMENTS
24 !! ------------------
25 !!
26 !!
27 !! REFERENCE
28 !! ---------
29 !!
30 !! AUTHOR
31 !! ------
32 !!
33 !! M. Georgelin Laboratoire d'Aerologie
34 !!
35 !! MODIFICATION
36 !! ------------
37 !!
38 !! Original 18/12/95
39 !! 22/12/97 (V Masson) call with dummy arguments
40 !! 24/08/12 (B Decharme) optimization (loop into subroutine)
41 !!
42 !----------------------------------------------------------------------------
43 !
44 !* 0. DECLARATION
45 ! -----------
46 !
47 USE modd_surf_par, ONLY : xundef
48 USE modd_csts, ONLY : xkarman
49 USE modd_isba_par, ONLY : xcdz0eff
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 REAL, DIMENSION(:), INTENT(IN) :: paosip ! A/S for increasing x
60 REAL, DIMENSION(:), INTENT(IN) :: paosim ! A/S for decreasing x
61 REAL, DIMENSION(:), INTENT(IN) :: paosjp ! A/S for increasing y
62 REAL, DIMENSION(:), INTENT(IN) :: paosjm ! A/S for decreasing y
63 REAL, DIMENSION(:), INTENT(IN) :: pho2ip ! h/2 for increasing x
64 REAL, DIMENSION(:), INTENT(IN) :: pho2im ! h/2 for decreasing x
65 REAL, DIMENSION(:), INTENT(IN) :: pho2jp ! h/2 for increasing y
66 REAL, DIMENSION(:), INTENT(IN) :: pho2jm ! h/2 for decreasing y
67 REAL, DIMENSION(:), INTENT(IN) :: pz0veg ! vegetation roughness length
68 !
69 REAL, DIMENSION(:), INTENT(INOUT) :: pz0effip! roughness length for increasing x
70 REAL, DIMENSION(:), INTENT(INOUT) :: pz0effim! roughness length for decreasing x
71 REAL, DIMENSION(:), INTENT(INOUT) :: pz0effjp! roughness length for increasing y
72 REAL, DIMENSION(:), INTENT(INOUT) :: pz0effjm! roughness length for decreasing y
73 !
74 LOGICAL, DIMENSION(:), INTENT(IN), OPTIONAL :: omask ! mask where computations
75  ! are done
76 !
77 !* 0.2 Declaration of other local variables
78 ! ------------------------------------
79 !
80 LOGICAL, DIMENSION(SIZE(PZ0EFFIM)) :: gmask
81 !
82 REAL(KIND=JPRB) :: zhook_handle
83 !----------------------------------------------------------------------------
84 !
85 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF_1D',0,zhook_handle)
86 IF (present(omask)) THEN
87  gmask=omask
88 ELSE
89  gmask=(paosip/=xundef) ! computations always performed where SSO data exist
90  pz0effip = xundef
91  pz0effim = xundef
92  pz0effjp = xundef
93  pz0effjm = xundef
94 END IF
95 !
96 !* 1. Computations from A/S and h/2
97 ! -----------------------------
98 !
99  CALL get_z0eff(gmask(:),pz0veg(:),pho2jp(:),paosjp(:),pz0effjp(:))
100  CALL get_z0eff(gmask(:),pz0veg(:),pho2jm(:),paosjm(:),pz0effjm(:))
101  CALL get_z0eff(gmask(:),pz0veg(:),pho2im(:),paosim(:),pz0effim(:))
102  CALL get_z0eff(gmask(:),pz0veg(:),pho2ip(:),paosip(:),pz0effip(:))
103 !
104 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF_1D',1,zhook_handle)
105 !-------------------------------------------------------------------------------
106  CONTAINS
107 !
108 SUBROUTINE get_z0eff(OCOMPUT,PZ0,PHO,PAO,PZ0EFF)
109 !
110 IMPLICIT NONE
111 !
112 LOGICAL, DIMENSION(:), INTENT(IN) :: ocomput
113 REAL, DIMENSION(:), INTENT(IN) :: pz0
114 REAL, DIMENSION(:), INTENT(IN) :: pho
115 REAL, DIMENSION(:), INTENT(IN) :: pao
116 REAL, DIMENSION(:), INTENT(OUT):: pz0eff
117 !
118 LOGICAL, DIMENSION(SIZE(PZ0)) :: lwork1
119 !
120 REAL :: zloc1,zloc2,zloc3
121 INTEGER :: jj, ini
122 !
123 REAL(KIND=JPRB) :: zhook_handle
124 !
125 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF_1D:GET_ZOEFF',0,zhook_handle)
126 !
127 ini=SIZE(pz0)
128 !
129 lwork1(:)=(pho(:)>pz0(:).AND.(pz0(:)/=0.0.OR.pao(:)/=0.0))
130 !
131 DO jj=1,ini
132  IF (ocomput(jj)) THEN
133  IF (lwork1(jj)) THEN
134  zloc1 = (xcdz0eff/(2.*xkarman**2))*pao(jj)
135  IF ( pz0(jj) > 0. ) THEN
136  zloc2 = 1./(alog(pho(jj)/pz0(jj)))**2
137  ELSE
138  zloc2 = 0.
139  ENDIF
140  zloc3 = sqrt(1./(zloc1+zloc2))
141  pz0eff(jj) = pho(jj) * exp(-zloc3)
142  ELSE
143  pz0eff(jj) = pz0(jj)
144  ENDIF
145  ENDIF
146 ENDDO
147 !
148 IF (lhook) CALL dr_hook('SUBSCALE_Z0EFF_1D:GET_ZOEFF',1,zhook_handle)
149 !
150 END SUBROUTINE get_z0eff
151 !
152 END SUBROUTINE subscale_z0eff_1d
subroutine get_z0eff(OCOMPUT, PZ0, PHO, PAO, PZ0EFF)
subroutine subscale_z0eff_1d(PAOSIP, PAOSIM, PAOSJP, PAOSJM, PHO2IP, PHO2IM, PHO2JP, PHO2JM, PZ0VEG, PZ0EFFIP, PZ0EFFIM, PZ0EFFJP, PZ0EFFJM, OMASK)