CCPP SciDoc v7.0.0  v7.0.0
Common Community Physics Package Developed at DTC
 
Loading...
Searching...
No Matches
module_sf_exchcoef.f90
1
3
5CONTAINS
6
7 SUBROUTINE znot_m_v1(uref,znotm)
8 IMPLICIT NONE
9
10! uref(m/s) : Reference level wind
11! znotm(meter): Roughness scale for momentum
12! Author : Biju Thomas on 02/07/2014
13!
14
15 REAL, INTENT(IN) :: uref
16 REAL, INTENT(OUT):: znotm
17 REAL :: bs0, bs1, bs2, bs3, bs4, bs5, bs6
18 REAL :: cf0, cf1, cf2, cf3, cf4, cf5, cf6
19
20
21 bs0 = -8.367276172397277e-12
22 bs1 = 1.7398510865876079e-09
23 bs2 = -1.331896578363359e-07
24 bs3 = 4.507055294438727e-06
25 bs4 = -6.508676881906914e-05
26 bs5 = 0.00044745137674732834
27 bs6 = -0.0010745704660847233
28
29 cf0 = 2.1151080765239772e-13
30 cf1 = -3.2260663894433345e-11
31 cf2 = -3.329705958751961e-10
32 cf3 = 1.7648562021709124e-07
33 cf4 = 7.107636825694182e-06
34 cf5 = -0.0013914681964973246
35 cf6 = 0.0406766967657759
36
37
38 IF ( uref .LE. 5.0 ) THEN
39 znotm = (0.0185 / 9.8*(7.59e-4*uref**2+2.46e-2*uref)**2)
40 ELSEIF (uref .GT. 5.0 .AND. uref .LT. 10.0) THEN
41 znotm =.00000235*(uref**2 - 25 ) + 3.805129199617346e-05
42 ELSEIF ( uref .GE. 10.0 .AND. uref .LT. 60.0) THEN
43 znotm = bs6 + bs5*uref + bs4*uref**2 + bs3*uref**3 + bs2*uref**4 + &
44 bs1*uref**5 + bs0*uref**6
45 ELSE
46 znotm = cf6 + cf5*uref + cf4*uref**2 + cf3*uref**3 + cf2*uref**4 + &
47 cf1*uref**5 + cf0*uref**6
48
49 END IF
50
51 END SUBROUTINE znot_m_v1
52
53 SUBROUTINE znot_m_v0(uref,znotm)
54 IMPLICIT NONE
55
56! uref(m/s) : Reference level wind
57! znotm(meter): Roughness scale for momentum
58! Author : Biju Thomas on 02/07/2014
59
60 REAL, INTENT(IN) :: uref
61 REAL, INTENT(OUT):: znotm
62 REAL :: yz, y1, y2, y3, y4
63
64 yz = 0.0001344
65 y1 = 3.015e-05
66 y2 = 1.517e-06
67 y3 = -3.567e-08
68 y4 = 2.046e-10
69
70 IF ( uref .LT. 12.5 ) THEN
71 znotm = (0.0185 / 9.8*(7.59e-4*uref**2+2.46e-2*uref)**2)
72 ELSE IF ( uref .GE. 12.5 .AND. uref .LT. 30.0 ) THEN
73 znotm = (0.0739793 * uref -0.58)/1000.0
74 ELSE
75 znotm = yz + uref*y1 + uref**2*y2 + uref**3*y3 + uref**4*y4
76 END IF
77
78 END SUBROUTINE znot_m_v0
79
80
81 SUBROUTINE znot_t_v1(uref,znott)
82 IMPLICIT NONE
83
84! uref(m/s) : Reference level wind
85! znott(meter): Roughness scale for temperature/moisture
86! Author : Biju Thomas on 02/07/2014
87
88 REAL, INTENT(IN) :: uref
89 REAL, INTENT(OUT):: znott
90 REAL :: to0, to1, to2, to3
91 REAL :: tr0, tr1, tr2, tr3
92 REAL :: tn0, tn1, tn2, tn3, tn4, tn5
93 REAL :: ta0, ta1, ta2, ta3, ta4, ta5, ta6
94 REAL :: tt0, tt1, tt2, tt3, tt4, tt5, tt6, tt7
95
96
97 tr0 = 6.451939325286488e-08
98 tr1 = -7.306388137342143e-07
99 tr2 = -1.3709065148333262e-05
100 tr3 = 0.00019109962089098182
101
102 to0 = 1.4379320027061375e-08
103 to1 = -2.0674525898850674e-07
104 to2 = -6.8950970846611e-06
105 to3 = 0.00012199648268521026
106
107 tn0 = 1.4023940955902878e-10
108 tn1 = -1.4752557214976321e-08
109 tn2 = 5.90998487691812e-07
110 tn3 = -1.0920804077770066e-05
111 tn4 = 8.898205876940546e-05
112 tn5 = -0.00021123340439418298
113
114 tt0 = 1.92409564131838e-12
115 tt1 = -5.765467086754962e-10
116 tt2 = 7.276979099726975e-08
117 tt3 = -5.002261599293387e-06
118 tt4 = 0.00020220445539973736
119 tt5 = -0.0048088230565883
120 tt6 = 0.0623468551971189
121 tt7 = -0.34019193746967424
122
123 ta0 = -1.7787470700719361e-10
124 ta1 = 4.4691736529848764e-08
125 ta2 = -3.0261975348463414e-06
126 ta3 = -0.00011680322286017206
127 ta4 = 0.024449377821884846
128 ta5 = -1.1228628619105638
129 ta6 = 17.358026773905973
130
131 IF ( uref .LE. 7.0 ) THEN
132 znott = (0.0185 / 9.8*(7.59e-4*uref**2+2.46e-2*uref)**2)
133 ELSEIF ( uref .GE. 7.0 .AND. uref .LT. 12.5 ) THEN
134 znott = tr3 + tr2*uref + tr1*uref**2 + tr0*uref**3
135 ELSEIF ( uref .GE. 12.5 .AND. uref .LT. 15.0 ) THEN
136 znott = to3 + to2*uref + to1*uref**2 + to0*uref**3
137 ELSEIF ( uref .GE. 15.0 .AND. uref .LT. 30.0) THEN
138 znott = tn5 + tn4*uref + tn3*uref**2 + tn2*uref**3 + tn1*uref**4 + &
139 tn0*uref**5
140 ELSEIF ( uref .GE. 30.0 .AND. uref .LT. 60.0) THEN
141 znott = tt7 + tt6*uref + tt5*uref**2 + tt4*uref**3 + tt3*uref**4 + &
142 tt2*uref**5 + tt1*uref**6 + tt0*uref**7
143 ELSE
144 znott = ta6 + ta5*uref + ta4*uref**2 + ta3*uref**3 + ta2*uref**4 + &
145 ta1*uref**5 + ta0*uref**6
146 END IF
147
148 END SUBROUTINE znot_t_v1
149
150 SUBROUTINE znot_t_v0(uref,znott)
151 IMPLICIT NONE
152
153! uref(m/s) : Reference level wind
154! znott(meter): Roughness scale for temperature/moisture
155! Author : Biju Thomas on 02/07/2014
156
157 REAL, INTENT(IN) :: uref
158 REAL, INTENT(OUT):: znott
159
160 IF ( uref .LT. 7.0 ) THEN
161 znott = (0.0185 / 9.8*(7.59e-4*uref**2+2.46e-2*uref)**2)
162 ELSE
163 znott = (0.2375*exp(-0.5250*uref) + 0.0025*exp(-0.0211*uref))*0.01
164 END IF
165
166 END SUBROUTINE znot_t_v0
167
168
169 SUBROUTINE znot_t_v2(uu,znott)
170 IMPLICIT NONE
171
172! uu in MKS
173! znott in m
174! Biju Thomas on 02/12/2015
175!
176
177 REAL, INTENT(IN) :: uu
178 REAL, INTENT(OUT):: znott
179 REAL :: ta0, ta1, ta2, ta3, ta4, ta5, ta6
180 REAL :: tb0, tb1, tb2, tb3, tb4, tb5, tb6
181 REAL :: tt0, tt1, tt2, tt3, tt4, tt5, tt6
182
183 ta0 = 2.51715926619e-09
184 ta1 = -1.66917514012e-07
185 ta2 = 4.57345863551e-06
186 ta3 = -6.64883696932e-05
187 ta4 = 0.00054390175125
188 ta5 = -0.00239645231325
189 ta6 = 0.00453024927761
190
191
192 tb0 = -1.72935914649e-14
193 tb1 = 2.50587455802e-12
194 tb2 = -7.90109676541e-11
195 tb3 = -4.40976353607e-09
196 tb4 = 3.68968179733e-07
197 tb5 = -9.43728336756e-06
198 tb6 = 8.90731312383e-05
199
200 tt0 = 4.68042680888e-14
201 tt1 = -1.98125754931e-11
202 tt2 = 3.41357133496e-09
203 tt3 = -3.05130605309e-07
204 tt4 = 1.48243563819e-05
205 tt5 = -0.000367207751936
206 tt6 = 0.00357204479347
207
208 IF ( uu .LE. 7.0 ) THEN
209 znott = (0.0185 / 9.8*(7.59e-4*uu**2+2.46e-2*uu)**2)
210 ELSEIF ( uu .GE. 7.0 .AND. uu .LT. 15. ) THEN
211 znott = ta6 + ta5*uu + ta4*uu**2 + ta3*uu**3 + ta2*uu**4 + &
212 ta1*uu**5 + ta0*uu**6
213 ELSEIF ( uu .GE. 15.0 .AND. uu .LT. 60.0) THEN
214 znott = tb6 + tb5*uu + tb4*uu**2 + tb3*uu**3 + tb2*uu**4 + &
215 tb1*uu**5 + tb0*uu**6
216 ELSE
217 znott = tt6 + tt5*uu + tt4*uu**2 + tt3*uu**3 + tt2*uu**4 + &
218 tt1*uu**5 + tt0*uu**6
219 END IF
220
221 END SUBROUTINE znot_t_v2
222
223 SUBROUTINE znot_m_v6(uref,znotm)
224 IMPLICIT NONE
225! Calculate areodynamical roughness over water with input 10-m wind
226! For low-to-moderate winds, try to match the Cd-U10 relationship from COARE V3.5 (Edson et al. 2013)
227! For high winds, try to fit available observational data
228!
229! Bin Liu, NOAA/NCEP/EMC 2017
230!
231! uref(m/s) : wind speed at 10-m height
232! znotm(meter): areodynamical roughness scale over water
233!
234
235 REAL, INTENT(IN) :: uref
236 REAL, INTENT(OUT):: znotm
237 REAL :: p13, p12, p11, p10
238 REAL :: p25, p24, p23, p22, p21, p20
239 REAL :: p35, p34, p33, p32, p31, p30
240 REAL :: p40
241
242 p13 = -1.296521881682694e-02
243 p12 = 2.855780863283819e-01
244 p11 = -1.597898515251717e+00
245 p10 = -8.396975715683501e+00
246
247 p25 = 3.790846746036765e-10
248 p24 = 3.281964357650687e-09
249 p23 = 1.962282433562894e-07
250 p22 = -1.240239171056262e-06
251 p21 = 1.739759082358234e-07
252 p20 = 2.147264020369413e-05
253
254 p35 = 1.840430200185075e-07
255 p34 = -2.793849676757154e-05
256 p33 = 1.735308193700643e-03
257 p32 = -6.139315534216305e-02
258 p31 = 1.255457892775006e+00
259 p30 = -1.663993561652530e+01
260
261 p40 = 4.579369142033410e-04
262
263 if (uref >= 0.0 .and. uref <= 6.5 ) then
264 znotm = exp( p10 + p11*uref + p12*uref**2 + p13*uref**3)
265 elseif (uref > 6.5 .and. uref <= 15.7) then
266 znotm = p25*uref**5 + p24*uref**4 + p23*uref**3 + p22*uref**2 + p21*uref + p20
267 elseif (uref > 15.7 .and. uref <= 53.0) then
268 znotm = exp( p35*uref**5 + p34*uref**4 + p33*uref**3 + p32*uref**2 + p31*uref + p30 )
269 elseif ( uref > 53.0) then
270 znotm = p40
271 else
272 print*, 'Wrong input uref value:',uref
273 endif
274
275 END SUBROUTINE znot_m_v6
276
277 SUBROUTINE znot_t_v6(uref,znott)
278 IMPLICIT NONE
279! Calculate scalar roughness over water with input 10-m wind
280! For low-to-moderate winds, try to match the Ck-U10 relationship from COARE algorithm
281! For high winds, try to retain the Ck-U10 relationship of FY2015 HWRF
282!
283! Bin Liu, NOAA/NCEP/EMC 2017
284!
285! uref(m/s) : wind speed at 10-m height
286! znott(meter): scalar roughness scale over water
287!
288
289 REAL, INTENT(IN) :: uref
290 REAL, INTENT(OUT):: znott
291
292 REAL :: p00
293 REAL :: p15, p14, p13, p12, p11, p10
294 REAL :: p25, p24, p23, p22, p21, p20
295 REAL :: p35, p34, p33, p32, p31, p30
296 REAL :: p45, p44, p43, p42, p41, p40
297 REAL :: p56, p55, p54, p53, p52, p51, p50
298 REAL :: p60
299
300 p00 = 1.100000000000000e-04
301
302 p15 = -9.144581627678278e-10
303 p14 = 7.020346616456421e-08
304 p13 = -2.155602086883837e-06
305 p12 = 3.333848806567684e-05
306 p11 = -2.628501274963990e-04
307 p10 = 8.634221567969181e-04
308
309 p25 = -8.654513012535990e-12
310 p24 = 1.232380050058077e-09
311 p23 = -6.837922749505057e-08
312 p22 = 1.871407733439947e-06
313 p21 = -2.552246987137160e-05
314 p20 = 1.428968311457630e-04
315
316 p35 = 3.207515102100162e-12
317 p34 = -2.945761895342535e-10
318 p33 = 8.788972147364181e-09
319 p32 = -3.814457439412957e-08
320 p31 = -2.448983648874671e-06
321 p30 = 3.436721779020359e-05
322
323 p45 = -3.530687797132211e-11
324 p44 = 3.939867958963747e-09
325 p43 = -1.227668406985956e-08
326 p42 = -1.367469811838390e-05
327 p41 = 5.988240863928883e-04
328 p40 = -7.746288511324971e-03
329
330 p56 = -1.187982453329086e-13
331 p55 = 4.801984186231693e-11
332 p54 = -8.049200462388188e-09
333 p53 = 7.169872601310186e-07
334 p52 = -3.581694433758150e-05
335 p51 = 9.503919224192534e-04
336 p50 = -1.036679430885215e-02
337
338 p60 = 4.751256171799112e-05
339
340 if (uref >= 0.0 .and. uref < 5.9 ) then
341 znott = p00
342 elseif (uref >= 5.9 .and. uref <= 15.4) then
343 znott = p15*uref**5 + p14*uref**4 + p13*uref**3 + p12*uref**2 + p11*uref + p10
344 elseif (uref > 15.4 .and. uref <= 21.6) then
345 znott = p25*uref**5 + p24*uref**4 + p23*uref**3 + p22*uref**2 + p21*uref + p20
346 elseif (uref > 21.6 .and. uref <= 42.2) then
347 znott = p35*uref**5 + p34*uref**4 + p33*uref**3 + p32*uref**2 + p31*uref + p30
348 elseif ( uref > 42.2 .and. uref <= 53.3) then
349 znott = p45*uref**5 + p44*uref**4 + p43*uref**3 + p42*uref**2 + p41*uref + p40
350 elseif ( uref > 53.3 .and. uref <= 80.0) then
351 znott = p56*uref**6 + p55*uref**5 + p54*uref**4 + p53*uref**3 + p52*uref**2 + p51*uref + p50
352 elseif ( uref > 80.0) then
353 znott = p60
354 else
355 print*, 'Wrong input uref value:',uref
356 endif
357
358 END SUBROUTINE znot_t_v6
359
360 SUBROUTINE znot_m_v7(uref,znotm)
361 IMPLICIT NONE
362! Calculate areodynamical roughness over water with input 10-m wind
363! For low-to-moderate winds, try to match the Cd-U10 relationship from COARE V3.5 (Edson et al. 2013)
364! For high winds, try to fit available observational data
365! Comparing to znot_t_v6, slightly decrease Cd for higher wind speed
366!
367! Bin Liu, NOAA/NCEP/EMC 2018
368!
369! uref(m/s) : wind speed at 10-m height
370! znotm(meter): areodynamical roughness scale over water
371!
372
373 REAL, INTENT(IN) :: uref
374 REAL, INTENT(OUT):: znotm
375 REAL :: p13, p12, p11, p10
376 REAL :: p25, p24, p23, p22, p21, p20
377 REAL :: p35, p34, p33, p32, p31, p30
378 REAL :: p40
379
380 p13 = -1.296521881682694e-02
381 p12 = 2.855780863283819e-01
382 p11 = -1.597898515251717e+00
383 p10 = -8.396975715683501e+00
384
385 p25 = 3.790846746036765e-10
386 p24 = 3.281964357650687e-09
387 p23 = 1.962282433562894e-07
388 p22 = -1.240239171056262e-06
389 p21 = 1.739759082358234e-07
390 p20 = 2.147264020369413e-05
391
392 p35 = 1.897534489606422e-07
393 p34 = -3.019495980684978e-05
394 p33 = 1.931392924987349e-03
395 p32 = -6.797293095862357e-02
396 p31 = 1.346757797103756e+00
397 p30 = -1.707846930193362e+01
398
399 p40 = 3.371427455376717e-04
400
401 if (uref >= 0.0 .and. uref <= 6.5 ) then
402 znotm = exp( p10 + p11*uref + p12*uref**2 + p13*uref**3)
403 elseif (uref > 6.5 .and. uref <= 15.7) then
404 znotm = p25*uref**5 + p24*uref**4 + p23*uref**3 + p22*uref**2 + p21*uref + p20
405 elseif (uref > 15.7 .and. uref <= 53.0) then
406 znotm = exp( p35*uref**5 + p34*uref**4 + p33*uref**3 + p32*uref**2 + p31*uref + p30 )
407 elseif ( uref > 53.0) then
408 znotm = p40
409 else
410 print*, 'Wrong input uref value:',uref
411 endif
412
413 END SUBROUTINE znot_m_v7
414
415 SUBROUTINE znot_t_v7(uref,znott)
416 IMPLICIT NONE
417! Calculate scalar roughness over water with input 10-m wind
418! For low-to-moderate winds, try to match the Ck-U10 relationship from COARE algorithm
419! For high winds, try to retain the Ck-U10 relationship of FY2015 HWRF
420! To be compatible with the slightly decreased Cd for higher wind speed
421!
422! Bin Liu, NOAA/NCEP/EMC 2018
423!
424! uref(m/s) : wind speed at 10-m height
425! znott(meter): scalar roughness scale over water
426!
427
428 REAL, INTENT(IN) :: uref
429 REAL, INTENT(OUT):: znott
430
431 REAL :: p00
432 REAL :: p15, p14, p13, p12, p11, p10
433 REAL :: p25, p24, p23, p22, p21, p20
434 REAL :: p35, p34, p33, p32, p31, p30
435 REAL :: p45, p44, p43, p42, p41, p40
436 REAL :: p56, p55, p54, p53, p52, p51, p50
437 REAL :: p60
438
439 p00 = 1.100000000000000e-04
440
441 p15 = -9.193764479895316e-10
442 p14 = 7.052217518653943e-08
443 p13 = -2.163419217747114e-06
444 p12 = 3.342963077911962e-05
445 p11 = -2.633566691328004e-04
446 p10 = 8.644979973037803e-04
447
448 p25 = -9.402722450219142e-12
449 p24 = 1.325396583616614e-09
450 p23 = -7.299148051141852e-08
451 p22 = 1.982901461144764e-06
452 p21 = -2.680293455916390e-05
453 p20 = 1.484341646128200e-04
454
455 p35 = 7.921446674311864e-12
456 p34 = -1.019028029546602e-09
457 p33 = 5.251986927351103e-08
458 p32 = -1.337841892062716e-06
459 p31 = 1.659454106237737e-05
460 p30 = -7.558911792344770e-05
461
462 p45 = -2.694370426850801e-10
463 p44 = 5.817362913967911e-08
464 p43 = -5.000813324746342e-06
465 p42 = 2.143803523428029e-04
466 p41 = -4.588070983722060e-03
467 p40 = 3.924356617245624e-02
468
469 p56 = -1.663918773476178e-13
470 p55 = 6.724854483077447e-11
471 p54 = -1.127030176632823e-08
472 p53 = 1.003683177025925e-06
473 p52 = -5.012618091180904e-05
474 p51 = 1.329762020689302e-03
475 p50 = -1.450062148367566e-02
476
477 p60 = 6.840803042788488e-05
478
479 if (uref >= 0.0 .and. uref < 5.9 ) then
480 znott = p00
481 elseif (uref >= 5.9 .and. uref <= 15.4) then
482 znott = p15*uref**5 + p14*uref**4 + p13*uref**3 + p12*uref**2 + p11*uref + p10
483 elseif (uref > 15.4 .and. uref <= 21.6) then
484 znott = p25*uref**5 + p24*uref**4 + p23*uref**3 + p22*uref**2 + p21*uref + p20
485 elseif (uref > 21.6 .and. uref <= 42.6) then
486 znott = p35*uref**5 + p34*uref**4 + p33*uref**3 + p32*uref**2 + p31*uref + p30
487 elseif ( uref > 42.6 .and. uref <= 53.0) then
488 znott = p45*uref**5 + p44*uref**4 + p43*uref**3 + p42*uref**2 + p41*uref + p40
489 elseif ( uref > 53.0 .and. uref <= 80.0) then
490 znott = p56*uref**6 + p55*uref**5 + p54*uref**4 + p53*uref**3 + p52*uref**2 + p51*uref + p50
491 elseif ( uref > 80.0) then
492 znott = p60
493 else
494 print*, 'Wrong input uref value:',uref
495 endif
496
497 END SUBROUTINE znot_t_v7
498
499 SUBROUTINE znot_m_v8(uref,znotm)
500 IMPLICIT NONE
501! Calculate areodynamical roughness over water with input 10-m wind
502! For low-to-moderate winds, try to match the Cd-U10 relationship from COARE V3.5 (Edson et al. 2013)
503! For high winds, try to fit available observational data
504! Comparing to znot_t_v6, slightly decrease Cd for higher wind speed
505! And this is another variation similar to v7
506!
507! Bin Liu, NOAA/NCEP/EMC 2018
508!
509! uref(m/s) : wind speed at 10-m height
510! znotm(meter): areodynamical roughness scale over water
511!
512
513 REAL, INTENT(IN) :: uref
514 REAL, INTENT(OUT):: znotm
515 REAL :: p13, p12, p11, p10
516 REAL :: p25, p24, p23, p22, p21, p20
517 REAL :: p35, p34, p33, p32, p31, p30
518 REAL :: p40
519
520 p13 = -1.296521881682694e-02
521 p12 = 2.855780863283819e-01
522 p11 = -1.597898515251717e+00
523 p10 = -8.396975715683501e+00
524
525 p25 = 3.790846746036765e-10
526 p24 = 3.281964357650687e-09
527 p23 = 1.962282433562894e-07
528 p22 = -1.240239171056262e-06
529 p21 = 1.739759082358234e-07
530 p20 = 2.147264020369413e-05
531
532 p35 = 1.897534489606422e-07
533 p34 = -3.019495980684978e-05
534 p33 = 1.931392924987349e-03
535 p32 = -6.797293095862357e-02
536 p31 = 1.346757797103756e+00
537 p30 = -1.707846930193362e+01
538
539 p40 = 3.886804744928044e-04
540
541 if (uref >= 0.0 .and. uref <= 6.5 ) then
542 znotm = exp( p10 + p11*uref + p12*uref**2 + p13*uref**3)
543 elseif (uref > 6.5 .and. uref <= 15.7) then
544 znotm = p25*uref**5 + p24*uref**4 + p23*uref**3 + p22*uref**2 + p21*uref + p20
545 elseif (uref > 15.7 .and. uref <= 51.5) then
546 znotm = exp( p35*uref**5 + p34*uref**4 + p33*uref**3 + p32*uref**2 + p31*uref + p30 )
547 elseif ( uref > 51.5) then
548 znotm = p40
549 else
550 print*, 'Wrong input uref value:',uref
551 endif
552
553 END SUBROUTINE znot_m_v8
554
555 SUBROUTINE znot_t_v8(uref,znott)
556 IMPLICIT NONE
557! Calculate scalar roughness over water with input 10-m wind
558! For low-to-moderate winds, try to match the Ck-U10 relationship from COARE algorithm
559! For high winds, try to retain the Ck-U10 relationship of FY2015 HWRF
560! To be compatible with the slightly decreased Cd for higher wind speed
561! And this is another variation similar to v7
562!
563! Bin Liu, NOAA/NCEP/EMC 2018
564!
565! uref(m/s) : wind speed at 10-m height
566! znott(meter): scalar roughness scale over water
567!
568
569 REAL, INTENT(IN) :: uref
570 REAL, INTENT(OUT):: znott
571
572 REAL :: p00
573 REAL :: p15, p14, p13, p12, p11, p10
574 REAL :: p25, p24, p23, p22, p21, p20
575 REAL :: p35, p34, p33, p32, p31, p30
576 REAL :: p45, p44, p43, p42, p41, p40
577 REAL :: p56, p55, p54, p53, p52, p51, p50
578 REAL :: p60
579
580 p00 = 1.100000000000000e-04
581
582 p15 = -9.193764479895316e-10
583 p14 = 7.052217518653943e-08
584 p13 = -2.163419217747114e-06
585 p12 = 3.342963077911962e-05
586 p11 = -2.633566691328004e-04
587 p10 = 8.644979973037803e-04
588
589 p25 = -9.402722450219142e-12
590 p24 = 1.325396583616614e-09
591 p23 = -7.299148051141852e-08
592 p22 = 1.982901461144764e-06
593 p21 = -2.680293455916390e-05
594 p20 = 1.484341646128200e-04
595
596 p35 = 7.921446674311864e-12
597 p34 = -1.019028029546602e-09
598 p33 = 5.251986927351103e-08
599 p32 = -1.337841892062716e-06
600 p31 = 1.659454106237737e-05
601 p30 = -7.558911792344770e-05
602
603 p45 = -2.706461188613193e-10
604 p44 = 5.845859022891930e-08
605 p43 = -5.027577045502003e-06
606 p42 = 2.156326523752734e-04
607 p41 = -4.617267288861201e-03
608 p40 = 3.951492707214883e-02
609
610 p56 = -1.112896580069263e-13
611 p55 = 4.450334755105140e-11
612 p54 = -7.375373918500171e-09
613 p53 = 6.493685149526543e-07
614 p52 = -3.206421106713471e-05
615 p51 = 8.407596231678149e-04
616 p50 = -9.027924333673693e-03
617
618 p60 = 5.791179079892191e-05
619
620 if (uref >= 0.0 .and. uref < 5.9 ) then
621 znott = p00
622 elseif (uref >= 5.9 .and. uref <= 15.4) then
623 znott = p15*uref**5 + p14*uref**4 + p13*uref**3 + p12*uref**2 + p11*uref + p10
624 elseif (uref > 15.4 .and. uref <= 21.6) then
625 znott = p25*uref**5 + p24*uref**4 + p23*uref**3 + p22*uref**2 + p21*uref + p20
626 elseif (uref > 21.6 .and. uref <= 42.6) then
627 znott = p35*uref**5 + p34*uref**4 + p33*uref**3 + p32*uref**2 + p31*uref + p30
628 elseif ( uref > 42.6 .and. uref <= 51.5) then
629 znott = p45*uref**5 + p44*uref**4 + p43*uref**3 + p42*uref**2 + p41*uref + p40
630 elseif ( uref > 51.5 .and. uref <= 80.0) then
631 znott = p56*uref**6 + p55*uref**5 + p54*uref**4 + p53*uref**3 + p52*uref**2 + p51*uref + p50
632 elseif ( uref > 80.0) then
633 znott = p60
634 else
635 print*, 'Wrong input uref value:',uref
636 endif
637
638 END SUBROUTINE znot_t_v8
639
640 SUBROUTINE znot_wind10m(w10m,znott,znotm,icoef_sf,errmsg,errflg)
641 IMPLICIT NONE
642
643! w10m(m/s) : 10-m wind speed
644! znott(meter): Roughness scale for temperature/moisture, zt
645! znotm(meter): Roughness scale for momentum, z0
646! Author : Weiguo Wang on 02/24/2016
647! convert from icoef=0,1,2 to have 10m level cd, ch match obs
648 REAL, INTENT(IN) :: w10m
649 INTEGER, INTENT(IN) :: icoef_sf
650 REAL, INTENT(OUT):: znott, znotm
651 character(len=*),intent(out) :: errmsg
652 integer, intent(out) :: errflg
653
654 real :: zm,zt,windmks, zlev,z10, tmp, zlevt, aaa, zm1,zt1
655
656 ! Initialize error-handling
657 errflg = 0
658 errmsg = ''
659
660 zlev=20.0
661 zlevt=10.0
662 z10=10.0
663 windmks=w10m
664 if (windmks > 85.0) windmks=85.0
665 if (windmks < 1.0) windmks=1.0
666 if ( icoef_sf .EQ. 1) then
667 call znot_m_v1(windmks,zm1)
668 call znot_t_v1(windmks,zt1)
669
670 else if ( icoef_sf .EQ. 0 ) then
671 call znot_m_v0(windmks,zm1)
672 call znot_t_v0(windmks,zt1)
673
674 else if( icoef_sf .EQ. 2 ) then
675 call znot_m_v1(windmks,zm1)
676 call znot_t_v2(windmks,zt1)
677
678 else if( icoef_sf .EQ. 3 ) then
679 call znot_m_v1(windmks,zm)
680 call znot_t_v2(windmks,zt)
681!! adjust a little to match obs at 10m, cd is reduced
682 tmp=0.4*0.4/(alog(zlev/zm))**2 ! cd at zlev
683 zm1=z10/exp( sqrt(0.4*0.4/(tmp*0.95-0.0002)) )
684!ch
685 tmp=0.4*0.4/(alog(zlevt/zm)*alog(zlevt/zt)) ! ch at zlev using old formula
686 zt1=z10/exp( 0.4*0.4/( 0.95*tmp*alog(z10/zm1) ) )
687
688 else if( icoef_sf .EQ. 4 ) then
689
690 call znot_m_v1(windmks,zm)
691 call znot_t_v2(windmks,zt)
692!! for wind<20, cd similar to icoef=2 at 10m, then reduced
693 tmp=0.4*0.4/(alog(10.0/zm))**2 ! cd at zlev
694 aaa=0.75
695 if (windmks < 20) then
696 aaa=0.99
697 elseif(windmks < 45.0) then
698 aaa=0.99+(windmks-20)*(0.75-0.99)/(45.0-20.0)
699 endif
700 zm1=z10/exp( sqrt(0.4*0.4/(tmp*aaa)) )
701!ch
702 tmp=0.4*0.4/(alog(zlevt/zm)*alog(zlevt/zt)) ! ch at zlev using old formula
703 zt1=z10/exp( 0.4*0.4/( 0.95*tmp*alog(z10/zm1) ) )
704
705 else if( icoef_sf .EQ. 5 ) then
706
707 call znot_m_v1(windmks,zm)
708 call znot_t_v2(windmks,zt)
709!! for wind<20, cd similar to icoef=2 at 10m, then reduced
710 tmp=0.4*0.4/(alog(10.0/zm))**2 ! cd at zlev
711 aaa=0.80
712 if (windmks < 20) then
713 aaa=1.0
714 elseif(windmks < 45.0) then
715 aaa=1.0+(windmks-20)*(0.80-1.0)/(45.0-20.0)
716 endif
717 zm1=z10/exp( sqrt(0.4*0.4/(tmp*aaa)) )
718!ch
719 tmp=0.4*0.4/(alog(zlevt/zm)*alog(zlevt/zt)) ! ch at zlev using old formula
720 zt1=z10/exp( 0.4*0.4/( 1.0*tmp*alog(z10/zm1) ) )
721
722 else if( icoef_sf .EQ. 6 ) then
723 call znot_m_v6(windmks,zm1)
724 call znot_t_v6(windmks,zt1)
725 else if( icoef_sf .EQ. 7 ) then
726 call znot_m_v7(windmks,zm1)
727 call znot_t_v7(windmks,zt1)
728 else if( icoef_sf .EQ. 8 ) then
729 call znot_m_v8(windmks,zm1)
730 call znot_t_v8(windmks,zt1)
731 else
732 write(0,*)'stop, icoef_sf must be one of 0,1,2,3,4,5,6,7,8'
733 errflg = 1
734 errmsg = 'ERROR(znot_wind10m): icoef_sf must be one of 0,1,2,3,4,5,6,7,8'
735 return
736 endif
737 znott=zt1
738 znotm=zm1
739
740 end subroutine znot_wind10m
741
742END MODULE module_sf_exchcoef
743