PageRenderTime 54ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_sf_mynn.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1595 lines | 759 code | 294 blank | 542 comment | 5 complexity | 517833b1cd11f840640a0c9b4bc8f439 MD5 | raw file
Possible License(s): AGPL-1.0
  1. MODULE module_sf_mynn
  2. !-------------------------------------------------------------------
  3. !Modifications implemented by Joseph Olson NOAA/GSD/AMB - CU/CIRES
  4. !for WRFv3.4:
  5. !
  6. ! BOTH LAND AND WATER:
  7. !1) Calculation of stability parameter (z/L) taken from Li et al. (2010 BLM)
  8. !2) Fixed isfflx=0 option to turn off scalar fluxes, but keep momentum
  9. ! fluxes for idealized studies (credit: Anna Fitch).
  10. !3) Kinematic viscosity now varies with temperature
  11. !4) Uses Monin-Obukhov flux-profile relationships more consistent with
  12. ! those used in the MYNN PBL code.
  13. !5) Allows negative QFX, similar to MYJ scheme
  14. !
  15. ! LAND only:
  16. !1) Scalar roughness length parameterization of Yang et al. (2002 QJRMS,
  17. ! 2008 JAMC) and Chen et al. (2010 J. of Hydromet), with modifications.
  18. !2) Relaxed u* minimum from 0.1 to 0.01
  19. !
  20. ! WATER only:
  21. !1) Charnock relationship with varying Charnock parameter is taken from
  22. ! the COARE3.0 bulk algorithm (Fairall et al 2003). A formulation for
  23. ! the aerodynamic roughness length was also taken from Davis et al (2008)
  24. ! and Donelan et al. (2004), but this formulation seems to result in a
  25. ! hign surface wind speed bias for low/moderate wind speeds, so the
  26. ! varying Charnock relationship is default.
  27. !2) Scalar roughness length is taken from the COARE3.0 bulk algorithm
  28. ! (Fairall et al 2003). A formulation for the scalar roughness length
  29. ! was also taken from Garrat (1992), but since this formula makes zt
  30. ! proportional to zo, heat and moisture fluxes are dependent
  31. ! upon which formulation for aerodynamic roughness length is used.
  32. ! Therefore, the COARE3.0 formulation (with slight modifications) is
  33. ! used as default instead.
  34. !-------------------------------------------------------------------
  35. USE module_model_constants, only: &
  36. &p1000mb, cp, xlv, ep_2
  37. USE module_sf_sfclay, ONLY: sfclayinit
  38. USE module_bl_mynn, only: tv0, mym_condensation
  39. !-------------------------------------------------------------------
  40. IMPLICIT NONE
  41. !-------------------------------------------------------------------
  42. REAL, PARAMETER :: xlvcp=xlv/cp, ep_3=1.-ep_2
  43. REAL, PARAMETER :: wmin=0.1 ! Minimum wind speed
  44. REAL, PARAMETER :: zm2h=7.4 ! = z_0m/z_0h
  45. REAL, PARAMETER :: charnock=0.016, bvisc=1.5e-5, z0hsea=5.e-5
  46. REAL, PARAMETER :: VCONVC=1.0
  47. REAL, PARAMETER :: CZ0=charnock
  48. REAL, DIMENSION(0:1000 ),SAVE :: PSIMTB,PSIHTB
  49. CONTAINS
  50. !-------------------------------------------------------------------
  51. SUBROUTINE mynn_sf_init_driver(allowed_to_read)
  52. LOGICAL, INTENT(in) :: allowed_to_read
  53. !Fill the PSIM and PSIH tables. The subroutine "sfclayinit"
  54. !can be found in module_sf_sfclay.F. This subroutine returns
  55. !the forms from Dyer and Hicks (1974) or Paulson (1970)???.
  56. CALL sfclayinit(allowed_to_read)
  57. END SUBROUTINE mynn_sf_init_driver
  58. !-------------------------------------------------------------------
  59. SUBROUTINE SFCLAY_mynn(U3D,V3D,T3D,QV3D,P3D,dz8w, &
  60. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  61. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  62. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, &
  63. U10,V10,TH2,T2,Q2, &
  64. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  65. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  66. KARMAN,EOMEG,STBOLT, &
  67. itimestep,ch,th3d,pi3d,qc3d, &
  68. tsq,qsq,cov,qcg, &
  69. !JOE-add zo/zt
  70. ! z0zt_ratio,BulkRi,wstar,&
  71. !JOE-end z0/zt
  72. ids,ide, jds,jde, kds,kde, &
  73. ims,ime, jms,jme, kms,kme, &
  74. its,ite, jts,jte, kts,kte )
  75. !-------------------------------------------------------------------
  76. IMPLICIT NONE
  77. !-------------------------------------------------------------------
  78. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  79. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  80. !-- T3D temperature (K)
  81. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  82. !-- P3D 3D pressure (Pa)
  83. !-- dz8w dz between full levels (m)
  84. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  85. !-- G acceleration due to gravity (m/s^2)
  86. !-- ROVCP R/CP
  87. !-- R gas constant for dry air (J/kg/K)
  88. !-- XLV latent heat of vaporization for water (J/kg)
  89. !-- PSFC surface pressure (Pa)
  90. !-- ZNT roughness length (m)
  91. !-- UST u* in similarity theory (m/s)
  92. !-- PBLH PBL height from previous time (m)
  93. !-- MAVAIL surface moisture availability (between 0 and 1)
  94. !-- ZOL z/L height over Monin-Obukhov length
  95. !-- MOL T* (similarity theory) (K)
  96. !-- REGIME flag indicating PBL regime (stable, unstable, etc.)
  97. !-- PSIM similarity stability function for momentum
  98. !-- PSIH similarity stability function for heat
  99. !-- XLAND land mask (1 for land, 2 for water)
  100. !-- HFX upward heat flux at the surface (W/m^2)
  101. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  102. !-- LH net upward latent heat flux at surface (W/m^2)
  103. !-- TSK surface temperature (K)
  104. !-- FLHC exchange coefficient for heat (W/m^2/K)
  105. !-- FLQC exchange coefficient for moisture (kg/m^2/s)
  106. !-- CHS heat/moisture exchange coefficient for LSM (m/s)
  107. !-- QGH lowest-level saturated mixing ratio
  108. !-- U10 diagnostic 10m u wind
  109. !-- V10 diagnostic 10m v wind
  110. !-- TH2 diagnostic 2m theta (K)
  111. !-- T2 diagnostic 2m temperature (K)
  112. !-- Q2 diagnostic 2m mixing ratio (kg/kg)
  113. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  114. !-- WSPD wind speed at lowest model level (m/s)
  115. !-- BR bulk Richardson number in surface layer
  116. !-- ISFFLX isfflx=1 for surface heat and moisture fluxes
  117. !-- DX horizontal grid size (m)
  118. !-- SVP1 constant for saturation vapor pressure (kPa)
  119. !-- SVP2 constant for saturation vapor pressure (dimensionless)
  120. !-- SVP3 constant for saturation vapor pressure (K)
  121. !-- SVPT0 constant for saturation vapor pressure (K)
  122. !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
  123. !-- EP2 constant for specific humidity calculation
  124. ! (R_d/R_v) (dimensionless)
  125. !-- KARMAN Von Karman constant
  126. !-- EOMEG angular velocity of earth's rotation (rad/s)
  127. !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
  128. !-- ids start index for i in domain
  129. !-- ide end index for i in domain
  130. !-- jds start index for j in domain
  131. !-- jde end index for j in domain
  132. !-- kds start index for k in domain
  133. !-- kde end index for k in domain
  134. !-- ims start index for i in memory
  135. !-- ime end index for i in memory
  136. !-- jms start index for j in memory
  137. !-- jme end index for j in memory
  138. !-- kms start index for k in memory
  139. !-- kme end index for k in memory
  140. !-- its start index for i in tile
  141. !-- ite end index for i in tile
  142. !-- jts start index for j in tile
  143. !-- jte end index for j in tile
  144. !-- kts start index for k in tile
  145. !-- kte end index for k in tile
  146. !-------------------------------------------------------------------
  147. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  148. ims,ime, jms,jme, kms,kme, &
  149. its,ite, jts,jte, kts,kte
  150. !
  151. INTEGER, INTENT(IN ) :: ISFFLX
  152. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  153. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  154. !
  155. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  156. INTENT(IN ) :: dz8w
  157. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  158. INTENT(IN ) :: QV3D, &
  159. P3D, &
  160. T3D, &
  161. QC3D,&
  162. th3d,pi3d,tsq,qsq,cov
  163. INTEGER, INTENT(in) :: itimestep
  164. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) ::&
  165. & qcg
  166. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) ::&
  167. & ch
  168. REAL, DIMENSION( ims:ime, jms:jme ) , &
  169. INTENT(IN ) :: MAVAIL, &
  170. PBLH, &
  171. XLAND, &
  172. TSK
  173. REAL, DIMENSION( ims:ime, jms:jme ) , &
  174. INTENT(OUT ) :: U10, &
  175. V10, &
  176. TH2, &
  177. T2, &
  178. !JOE-use value from LSM Q2, &
  179. Q2
  180. !JOE-moved down below QSFC
  181. !
  182. REAL, DIMENSION( ims:ime, jms:jme ) , &
  183. INTENT(INOUT) :: REGIME, &
  184. HFX, &
  185. QFX, &
  186. LH, &
  187. MOL,RMOL,QSFC
  188. !m the following 5 are change to memory size
  189. !
  190. REAL, DIMENSION( ims:ime, jms:jme ) , &
  191. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  192. PSIM,PSIH
  193. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  194. INTENT(IN ) :: U3D, &
  195. V3D
  196. REAL, DIMENSION( ims:ime, jms:jme ) , &
  197. INTENT(IN ) :: PSFC
  198. REAL, DIMENSION( ims:ime, jms:jme ) , &
  199. INTENT(INOUT) :: ZNT, &
  200. ZOL, &
  201. UST, &
  202. CPM, &
  203. CHS2, &
  204. CQS2, &
  205. CHS
  206. REAL, DIMENSION( ims:ime, jms:jme ) , &
  207. INTENT(INOUT) :: FLHC,FLQC
  208. REAL, DIMENSION( ims:ime, jms:jme ) , &
  209. INTENT(INOUT) :: QGH
  210. !JOE-begin
  211. ! REAL, DIMENSION( ims:ime, jms:jme ) , &
  212. ! INTENT(OUT) :: z0zt_ratio, &
  213. ! BulkRi,wstar
  214. !JOE-end
  215. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  216. !----------- LOCAL VARS -----------------------------------
  217. REAL, DIMENSION( its:ite ) :: U1D, &
  218. V1D, &
  219. QV1D, &
  220. P1D, &
  221. T1D,qc1d
  222. REAL, DIMENSION( its:ite ) :: dz8w1d
  223. REAL, DIMENSION( its:ite ) :: vt1,vq1
  224. REAL, DIMENSION(kts:kts+1) :: thl, qw, vt, vq
  225. REAL :: ql
  226. INTEGER :: I,J,K
  227. !-----------------------------------------------------------
  228. DO J=jts,jte
  229. DO i=its,ite
  230. dz8w1d(I) = dz8w(i,kts,j)
  231. ENDDO
  232. DO i=its,ite
  233. U1D(i) =U3D(i,kts,j)
  234. V1D(i) =V3D(i,kts,j)
  235. QV1D(i)=QV3D(i,kts,j)
  236. QC1D(i)=QC3D(i,kts,j)
  237. P1D(i) =P3D(i,kts,j)
  238. T1D(i) =T3D(i,kts,j)
  239. ENDDO
  240. IF (itimestep==1) THEN
  241. DO i=its,ite
  242. vt1(i)=0.
  243. vq1(i)=0.
  244. UST(i,j)=0.02*SQRT(U1D(i)*U1D(i) + V1D(i)*V1D(i))
  245. MOL(i,j)=0. ! Tstar
  246. ENDDO
  247. ELSE
  248. DO i=its,ite
  249. do k = kts,kts+1
  250. ql = qc3d(i,k,j)/(1.+qc3d(i,k,j))
  251. qw(k) = qv3d(i,k,j)/(1.+qv3d(i,k,j)) + ql
  252. thl(k) = th3d(i,k,j)-xlvcp*ql/pi3d(i,k,j)
  253. end do
  254. ! NOTE: The last grid number is kts+1 instead of kte.
  255. CALL mym_condensation (kts,kts+1, &
  256. & dz8w(i,kts:kts+1,j), &
  257. & thl(kts:kts+1), qw(kts:kts+1), &
  258. & p3d(i,kts:kts+1,j),&
  259. & pi3d(i,kts:kts+1,j), &
  260. & tsq(i,kts:kts+1,j), &
  261. & qsq(i,kts:kts+1,j), &
  262. & cov(i,kts:kts+1,j), &
  263. & vt(kts:kts+1), vq(kts:kts+1))
  264. vt1(i) = vt(kts)
  265. vq1(i) = vq(kts)
  266. ENDDO
  267. ENDIF
  268. CALL SFCLAY1D_mynn(J,U1D,V1D,T1D,QV1D,P1D,dz8w1d, &
  269. CP,G,ROVCP,R,XLV,PSFC(ims,j),CHS(ims,j),CHS2(ims,j),&
  270. CQS2(ims,j),CPM(ims,j),PBLH(ims,j), RMOL(ims,j), &
  271. ZNT(ims,j),UST(ims,j),MAVAIL(ims,j),ZOL(ims,j), &
  272. MOL(ims,j),REGIME(ims,j),PSIM(ims,j),PSIH(ims,j), &
  273. XLAND(ims,j),HFX(ims,j),QFX(ims,j),TSK(ims,j), &
  274. U10(ims,j),V10(ims,j),TH2(ims,j),T2(ims,j), &
  275. Q2(ims,j),FLHC(ims,j),FLQC(ims,j),QGH(ims,j), &
  276. QSFC(ims,j),LH(ims,j), &
  277. GZ1OZ0(ims,j),WSPD(ims,j),BR(ims,j),ISFFLX,DX, &
  278. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
  279. ch(ims,j),vt1,vq1,qc1d,qcg(ims,j),&
  280. !JOE-begin
  281. ! z0zt_ratio(ims,j),BulkRi(ims,j),wstar(ims,j), &
  282. itimestep,&
  283. !JOE-end
  284. ids,ide, jds,jde, kds,kde, &
  285. ims,ime, jms,jme, kms,kme, &
  286. its,ite, jts,jte, kts,kte )
  287. ENDDO
  288. END SUBROUTINE SFCLAY_MYNN
  289. !-------------------------------------------------------------------
  290. SUBROUTINE SFCLAY1D_mynn(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
  291. CP,G,ROVCP,R,XLV,PSFCPA,CHS,CHS2,CQS2,CPM,PBLH,RMOL, &
  292. ZNT,UST,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  293. XLAND,HFX,QFX,TSK, &
  294. U10,V10,TH2,T2,Q2,FLHC,FLQC,QGH, &
  295. QSFC,LH,GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  296. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  297. KARMAN,EOMEG,STBOLT, &
  298. ch,vt1,vq1,qc1d,qcg,&
  299. !JOE-add
  300. ! zratio,BRi,wstar,itimestep, &
  301. itimestep, &
  302. !JOE-end
  303. ids,ide, jds,jde, kds,kde, &
  304. ims,ime, jms,jme, kms,kme, &
  305. its,ite, jts,jte, kts,kte )
  306. !-------------------------------------------------------------------
  307. IMPLICIT NONE
  308. !-------------------------------------------------------------------
  309. REAL, PARAMETER :: XKA=2.4E-5 !molecular diffusivity
  310. REAL, PARAMETER :: PRT=1. !prandlt number
  311. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  312. ims,ime, jms,jme, kms,kme, &
  313. its,ite, jts,jte, kts,kte, &
  314. J
  315. !
  316. INTEGER, INTENT(in) :: itimestep
  317. INTEGER, INTENT(IN ) :: ISFFLX
  318. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  319. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  320. !
  321. REAL, DIMENSION( ims:ime ) , &
  322. INTENT(IN ) :: MAVAIL, &
  323. PBLH, &
  324. XLAND, &
  325. TSK
  326. !
  327. REAL, DIMENSION( ims:ime ) , &
  328. INTENT(IN ) :: PSFCPA
  329. REAL, DIMENSION( ims:ime ) , &
  330. INTENT(INOUT) :: REGIME, &
  331. HFX, &
  332. QFX, &
  333. MOL,RMOL
  334. !m the following 5 are changed to memory size---
  335. !
  336. REAL, DIMENSION( ims:ime ) , &
  337. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  338. PSIM,PSIH
  339. REAL, DIMENSION( ims:ime ) , &
  340. INTENT(INOUT) :: ZNT, &
  341. ZOL, &
  342. UST, &
  343. CPM, &
  344. CHS2, &
  345. CQS2, &
  346. CHS
  347. !JOE-add
  348. ! REAL, DIMENSION( ims:ime ) , &
  349. ! INTENT(OUT) :: zratio,BRi,wstar
  350. REAL, DIMENSION( ims:ime ) :: zratio,BRi,wstar
  351. !JOE-end
  352. REAL, DIMENSION( ims:ime ) , &
  353. INTENT(INOUT) :: FLHC,FLQC
  354. REAL, DIMENSION( ims:ime ) , &
  355. INTENT(INOUT) :: QGH,QSFC
  356. REAL, DIMENSION( ims:ime ) , &
  357. INTENT(OUT) :: U10,V10, &
  358. !JOE-make qsfc inout (moved up) TH2,T2,Q2,QSFC,LH
  359. TH2,T2,Q2,LH
  360. REAL, INTENT(IN) :: CP,G,ROVCP,R,XLV,DX
  361. ! MODULE-LOCAL VARIABLES, DEFINED IN SUBROUTINE SFCLAY
  362. REAL, DIMENSION( its:ite ), INTENT(IN ) :: dz8w1d
  363. REAL, DIMENSION( its:ite ), INTENT(IN ) :: UX, &
  364. VX, &
  365. QV1D, &
  366. P1D, &
  367. T1D,qc1d
  368. REAL, DIMENSION( ims:ime ), INTENT(IN) :: qcg
  369. REAL, DIMENSION( ims:ime ), INTENT(INOUT) :: ch
  370. REAL, DIMENSION( its:ite ), INTENT(IN) :: vt1,vq1
  371. ! LOCAL VARS
  372. REAL, DIMENSION( its:ite ) :: z_t,z_q
  373. REAL :: thl1,sqv1,sqc1,exner1,sqvg,sqcg,vv,ww
  374. REAL, DIMENSION( its:ite ) :: ZA, &
  375. THVX,ZQKL, &
  376. THX,QX, &
  377. PSIH2, &
  378. PSIM2, &
  379. PSIH10, &
  380. PSIM10, &
  381. GZ2OZ0, &
  382. GZ10OZ0
  383. !
  384. REAL, DIMENSION( its:ite ) :: RHOX,GOVRTH
  385. !
  386. REAL, DIMENSION( its:ite) :: SCR4
  387. REAL, DIMENSION( its:ite ) :: THGB, PSFC
  388. REAL, DIMENSION( its:ite ) :: GZ2OZt,GZ10OZt,GZ1OZt
  389. !
  390. INTEGER :: N,I,K,KK,L,NZOL,NK,NZOL2,NZOL10
  391. REAL :: PL,THCON,TVCON,E1
  392. REAL :: ZL,TSKV,DTHVDZ,DTHVM,VCONV,RZOL,RZOL2,RZOL10,ZOL2,ZOL10
  393. REAL :: DTG,PSIX,USTM,DTTHX,PSIX10,PSIT,PSIT2,PSIQ,PSIQ2
  394. REAL :: FLUXC,VSGD
  395. real :: restar,VISC,psilim
  396. !-------------------------------------------------------------------
  397. !----CONVERT GROUND TEMPERATURE TO POTENTIAL TEMPERATURE:
  398. DO I=its,ite
  399. ! PSFC cmb
  400. PSFC(I)=PSFCPA(I)/1000.
  401. THGB(I)=TSK(I)*(100./PSFC(I))**ROVCP
  402. ENDDO
  403. !
  404. ! SCR4(I,K) STORES EITHER TEMPERATURE OR VIRTUAL TEMPERATURE,
  405. ! DEPENDING ON IFDRY (CURRENTLY NOT USED, SO SCR4 == TVX).
  406. DO 30 I=its,ite
  407. ! PL cmb
  408. PL=P1D(I)/1000.
  409. THCON=(100./PL)**ROVCP
  410. THX(I)=T1D(I)*THCON
  411. SCR4(I)=T1D(I)
  412. THVX(I)=THX(I)
  413. QX(I)=0.
  414. 30 CONTINUE
  415. ! INITIALIZE SOME VARIABLES HERE:
  416. DO I=its,ite
  417. QGH(I)=0.
  418. FLHC(I)=0.
  419. FLQC(I)=0.
  420. CPM(I)=CP
  421. ENDDO
  422. ! IF(IDRY.EQ.1)GOTO 80
  423. DO 50 I=its,ite
  424. QX(I)=QV1D(I)/(1.+QV1D(I)) !CONVERT TO SPEC HUM
  425. TVCON=(1.+EP1*QX(I))
  426. THVX(I)=THX(I)*TVCON
  427. SCR4(I)=T1D(I)*TVCON
  428. 50 CONTINUE
  429. !
  430. DO 60 I=its,ite
  431. IF (TSK(I) .LT. 273.15) THEN
  432. !SATURATION VAPOR PRESSURE WRT ICE
  433. E1=SVP1*EXP(4648*(1./273.15 - 1./TSK(I)) - &
  434. 11.64*LOG(273.15/TSK(I)) + 0.02265*(273.15 - TSK(I)))
  435. ELSE
  436. !SATURATION VAPOR PRESSURE WRT WATER
  437. E1=SVP1*EXP(SVP2*(TSK(I)-SVPT0)/(TSK(I)-SVP3))
  438. ENDIF
  439. QSFC(I)=EP2*E1/(PSFC(I)-ep_3*E1) !specific humidity
  440. !QSFC(I)=EP2*E1/(PSFC(I)-E1) !mixing ratio
  441. !FOR LAND POINTS, QSFC can come from previous time step (in LSM)
  442. !if(xland(i).gt.1.5 .or. QSFC(i).le.0.0) QSFC(I)=EP2*E1/(PSFC(I)-ep_3*E1)
  443. ! QGH CHANGED TO USE LOWEST-LEVEL AIR TEMP CONSISTENT WITH MYJSFC CHANGE
  444. ! Q2SAT = QGH IN LSM
  445. E1=SVP1*EXP(SVP2*(T1D(I)-SVPT0)/(T1D(I)-SVP3))
  446. PL=P1D(I)/1000.
  447. QGH(I)=EP2*E1/(PL-ep_3*E1) !specific humidity
  448. !QGH(I)=EP2*E1/(PL-E1) !mixing ratio
  449. CPM(I)=CP*(1.+0.84*QX(I)/(1.-qx(i)))
  450. 60 CONTINUE
  451. 80 CONTINUE
  452. !-----COMPUTE THE HEIGHT OF FULL- AND HALF-SIGMA LEVELS ABOVE GROUND
  453. ! LEVEL, AND THE LAYER THICKNESSES.
  454. DO I=its,ite
  455. RHOX(I)=PSFC(I)*1000./(R*SCR4(I))
  456. ZQKL(I)=dz8w1d(I) !first full-sigma level
  457. ZA(I)=0.5*ZQKL(I) !first half-sigma level
  458. GOVRTH(I)=G/THX(I)
  459. ENDDO
  460. !-----CALCULATE BULK RICHARDSON NO. OF SURFACE LAYER, ACCORDING TO
  461. ! AKB(1976), EQ(12).
  462. DO 260 I=its,ite
  463. WSPD(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
  464. IF((XLAND(I)-1.5).GE.0)THEN
  465. !COMPUTE KINEMATIC VISCOSITY
  466. VISC=(1.32+0.009*(T1D(I)-273.15))*1.E-5
  467. !--------------------------------------
  468. ! WATER
  469. !--------------------------------------
  470. !GET ZNT
  471. !--------------------------------------
  472. !CALL davis_etal_2008(ZNT(i),UST(i))
  473. !CALL Taylor_Yelland_2001(ZNT(i),UST(i),WSPD(i))
  474. CALL charnock_1955(ZNT(i),UST(i),WSPD(i),visc)
  475. !COMPUTE ROUGHNESS REYNOLDS NUMBER (restar) USING NEW ZNT
  476. ! AHW: Garratt formula: Calculate roughness Reynolds number
  477. ! Kinematic viscosity of air (linear approx to
  478. ! temp dependence at sea level)
  479. restar=MAX(ust(i)*ZNT(i)/visc, 0.1)
  480. !--------------------------------------
  481. !GET z_t and z_q
  482. !--------------------------------------
  483. !CALL zilitinkevich_1995(ZNT(i),z_t(i),z_q(i),restar,UST(I),KARMAN,XLAND(I))
  484. !CALL garrat_1992(z_t(i),z_q(i),ZNT(i),restar,XLAND(I))
  485. CALL fairall_2001(z_t(i),z_q(i),restar,UST(i),visc)
  486. zratio(i)=znt(i)/z_t(i)
  487. ELSE
  488. !--------------------------------------
  489. ! LAND
  490. !--------------------------------------
  491. !COMPUTE ROUGHNESS REYNOLDS NUMBER (restar) USING DEFAULT ZNT
  492. !restar=MAX(ust(i)*ZNT(i)/bvisc, 1.0)
  493. VISC=(1.32+0.009*(T1D(I)-273.15))*1.E-5
  494. restar=MAX(ust(i)*ZNT(i)/visc, 0.1)
  495. !--------------------------------------
  496. !GET z_t and z_q
  497. !--------------------------------------
  498. !CALL zilitinkevich_1995(ZNT(i),z_t(i),z_q(i),restar,UST(I),KARMAN,XLAND(I))
  499. !CALL garrat_1992(z_t(i),z_q(i),ZNT(i),restar,XLAND(I))
  500. CALL Yang_2008(ZNT(i),z_t(i),z_q(i),UST(i),MOL(I),restar,visc,XLAND(I))
  501. zratio(i)=znt(i)/z_t(i)
  502. ENDIF
  503. GZ1OZ0(I)= LOG(ZA(I)/ZNT(I))
  504. GZ1OZt(I)= LOG(ZA(I)/z_t(i))
  505. GZ2OZ0(I)= LOG(2./ZNT(I))
  506. GZ2OZt(I)= LOG(2./z_t(i))
  507. GZ10OZ0(I)=LOG(10./ZNT(I))
  508. GZ10OZt(I)=LOG(10./z_t(i))
  509. !account for partial condensation
  510. exner1=(p1d(i)/p1000mb)**ROVCP
  511. sqc1=qc1d(i)/(1.+qc1d(i)) !convert to spec hum.
  512. sqv1=qx(i)
  513. thl1=THX(I)-xlvcp/exner1*sqc1
  514. sqvg=qsfc(i)
  515. sqcg=qcg(i)/(1.+qcg(i)) !convert to specific humidity
  516. vv = thl1-THGB(I)
  517. ww = mavail(i)*(sqv1-sqvg) + (sqc1-sqcg)
  518. TSKV=THGB(I)*(1.+EP1*QSFC(I)*MAVAIL(I))
  519. !TSKV=THGB(I)*(1.+EP1*QSFC(I))
  520. !DTHVDZ=(THVX(I)-TSKV)
  521. DTHVDZ= (vt1(i) + 1.0)*vv + (vq1(i) + tv0)*ww
  522. !--------------------------------------------------------
  523. ! Calculate the convective velocity scale (WSTAR) and
  524. ! subgrid-scale velocity (VSGD) following Beljaars (1995, QJRMS)
  525. ! and Mahrt and Sun (1995, MWR), respectively
  526. !-------------------------------------------------------
  527. ! VCONV = 0.25*sqrt(g/tskv*pblh(i)*dthvm)
  528. ! Use Beljaars over land, old MM5 (Wyngaard) formula over water
  529. if (xland(i).lt.1.5) then !LAND (xland == 1)
  530. fluxc = max(hfx(i)/rhox(i)/cp &
  531. + ep1*tskv*qfx(i)/rhox(i),0.)
  532. !JOE:VCONV = vconvc*(g/TSK(i)*pblh(i)*fluxc)**.33
  533. WSTAR(I) = vconvc*(g/TSK(i)*pblh(i)*fluxc)**.33
  534. else !WATER (xland == 2)
  535. IF(-DTHVDZ.GE.0)THEN
  536. DTHVM=-DTHVDZ
  537. ELSE
  538. DTHVM=0.
  539. ENDIF
  540. !JOE-the Wyngaard formula is 2-3 times larger than the Beljaars
  541. !formula, so switch to Beljaars for water, but use VCONVC = 1.25,
  542. !as in the COARE3.0 bulk parameterizations.
  543. !WSTAR(I) = 2.*SQRT(DTHVM)
  544. fluxc = max(hfx(i)/rhox(i)/cp &
  545. + ep1*tskv*qfx(i)/rhox(i),0.)
  546. WSTAR(I) = 1.25*(g/TSK(i)*pblh(i)*fluxc)**.33
  547. endif
  548. !--------------------------------------------------------
  549. ! Mahrt and Sun low-res correction
  550. ! (for 13 km ~ 0.37 m/s; for 3 km == 0 m/s)
  551. !--------------------------------------------------------
  552. VSGD = 0.32 * (max(dx/5000.-1.,0.))**.33
  553. WSPD(I)=SQRT(WSPD(I)*WSPD(I)+WSTAR(I)*WSTAR(I)+vsgd*vsgd)
  554. WSPD(I)=AMAX1(WSPD(I),wmin)
  555. !--------------------------------------------------------
  556. ! CALCULATE THE BULK RICHARDSON NUMBER OF SURFACE LAYER,
  557. ! ACCORDING TO AKB(1976), EQ(12).
  558. !--------------------------------------------------------
  559. BR(I)=GOVRTH(I)*ZA(I)*DTHVDZ/(WSPD(I)*WSPD(I))
  560. !SET LIMITS ACCORDING TO Li et al. (2010) Boundary-Layer Meteorol (p.158)
  561. BR(I)=MAX(BR(I),-2.0)
  562. BR(I)=MIN(BR(I),1.0)
  563. BRi(I)=BR(I) !new variable for output - BR is not a "state" variable.
  564. ! IF PREVIOUSLY UNSTABLE, DO NOT LET INTO REGIMES 1 AND 2 (STABLE)
  565. if (itimestep .GT. 1) THEN
  566. IF(MOL(I).LT.0.)BR(I)=AMIN1(BR(I),0.0)
  567. ENDIF
  568. !jdf
  569. RMOL(I)=-GOVRTH(I)*DTHVDZ*ZA(I)*KARMAN
  570. !jdf
  571. !JOE-begin
  572. ! IF(I .eq. 2)THEN
  573. ! write(*,1006)"BR:",BR(I)," fluxc:",fluxc," vt1:",vt1(i)," vq1:",vq1(i)
  574. ! write(*,1007)"XLAND:",XLAND(I)," WSPD:",WSPD(I)," DTHVDZ:",DTHVDZ," WSTAR:",WSTAR(I)
  575. ! ENDIF
  576. !JOE-end
  577. 260 CONTINUE
  578. 1006 format(A,F7.3,A,f9.4,A,f9.5,A,f9.4)
  579. 1007 format(A,F2.0,A,f6.2,A,f7.3,A,f7.2)
  580. !--------------------------------------------------------------------
  581. !--- DIAGNOSE BASIC PARAMETERS FOR THE APPROPRIATED STABILITY CLASS:
  582. !
  583. !
  584. ! THE STABILITY CLASSES ARE DETERMINED BY BR (BULK RICHARDSON NO.)
  585. ! AND HOL (HEIGHT OF PBL/MONIN-OBUKHOV LENGTH).
  586. !
  587. ! CRITERIA FOR THE CLASSES ARE AS FOLLOWS:
  588. !
  589. ! 1. BR .GE. 0.2;
  590. ! REPRESENTS NIGHTTIME STABLE CONDITIONS (REGIME=1),
  591. !
  592. ! 2. BR .LT. 0.2 .AND. BR .GT. 0.0;
  593. ! REPRESENTS DAMPED MECHANICAL TURBULENT CONDITIONS
  594. ! (REGIME=2),
  595. !
  596. ! 3. BR .EQ. 0.0
  597. ! REPRESENTS FORCED CONVECTION CONDITIONS (REGIME=3),
  598. !
  599. ! 4. BR .LT. 0.0
  600. ! REPRESENTS FREE CONVECTION CONDITIONS (REGIME=4).
  601. !
  602. !--------------------------------------------------------------------
  603. DO 320 I=its,ite
  604. IF (BR(I) .GT. 0.2) THEN
  605. !===================================================
  606. !---CLASS 1; STABLE (NIGHTTIME) CONDITIONS:
  607. !===================================================
  608. REGIME(I)=1.
  609. !COMPUTE z/L
  610. CALL Li_etal_2010(ZOL(I),BR(I),ZA(I)/ZNT(I),zratio(I))
  611. !COMPUTE PSIM and PSIH
  612. IF((XLAND(I)-1.5).GE.0)THEN
  613. ! WATER
  614. !CALL PSI_Suselj_Sood_2010(PSIM(I),PSIH(I),ZOL(I)) !produces neg TKE
  615. !CALL PSI_Beljaars_Holtslag_1991(PSIM(I),PSIH(I),ZOL(I))
  616. !CALL PSI_Businger_1971(PSIM(I),PSIH(I),ZOL(I))
  617. CALL PSI_DyerHicks(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  618. !LOWER LIMIT ON PSI IN STABLE CONDITIONS
  619. psilim = -20.
  620. ELSE
  621. ! LAND
  622. !CALL PSI_Beljaars_Holtslag_1991(PSIM(I),PSIH(I),ZOL(I))
  623. !CALL PSI_Businger_1971(PSIM(I),PSIH(I),ZOL(I))
  624. !CALL PSI_Zilitinkevich_Esau_2007(PSIM(I),PSIH(I),ZOL(I))
  625. CALL PSI_DyerHicks(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  626. !LOWER LIMIT ON PSI IN STABLE CONDITIONS
  627. psilim = -20. !JOE: relaxed from -10 to -20.
  628. ENDIF
  629. PSIM(I)=AMAX1(PSIM(I),psilim)
  630. PSIH(I)=AMAX1(PSIH(I),psilim)
  631. PSIM10(I)=10./ZA(I)*PSIM(I)
  632. PSIM10(I)=AMAX1(PSIM10(I),psilim)
  633. PSIH10(I)=PSIM10(I)
  634. PSIM2(I)=2./ZA(I)*PSIM(I)
  635. PSIM2(I)=AMAX1(PSIM2(I),psilim)
  636. PSIH2(I)=PSIM2(I)
  637. RMOL(I) = ZOL(I)/ZA(I) !1.0/L
  638. ELSEIF(BR(I) .GT. 0. .AND. BR(I) .LE. 0.2) THEN
  639. !========================================================
  640. !---CLASS 2; DAMPED MECHANICAL TURBULENCE:
  641. !========================================================
  642. REGIME(I)=2.
  643. !COMPUTE z/L
  644. CALL Li_etal_2010(ZOL(I),BR(I),ZA(I)/ZNT(I),zratio(I))
  645. !COMPUTE PSIM and PSIH
  646. IF((XLAND(I)-1.5).GE.0)THEN
  647. ! WATER
  648. !CALL PSI_Suselj_Sood_2010(PSIM(I),PSIH(I),ZOL(I))
  649. !CALL PSI_Beljaars_Holtslag_1991(PSIM(I),PSIH(I),ZOL(I))
  650. !CALL PSI_Businger_1971(PSIM(I),PSIH(I),ZOL(I))
  651. CALL PSI_DyerHicks(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  652. !LOWER LIMIT ON PSI IN STABLE CONDITIONS
  653. psilim = -10. !JOE: This limit is never hit.
  654. ELSE
  655. ! LAND
  656. !CALL PSI_Beljaars_Holtslag_1991(PSIM(I),PSIH(I),ZOL(I))
  657. !CALL PSI_Businger_1971(PSIM(I),PSIH(I),ZOL(I))
  658. !CALL PSI_Zilitinkevich_Esau_2007(PSIM(I),PSIH(I),ZOL(I))
  659. CALL PSI_DyerHicks(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  660. !LOWER LIMIT ON PSI IN STABLE CONDITIONS
  661. psilim = -10. !JOE: This limit is never hit.
  662. ENDIF
  663. ! LOWER LIMIT ON PSI IN STABLE CONDITIONS
  664. PSIM(I)=AMAX1(PSIM(I),psilim)
  665. PSIH(I)=AMAX1(PSIH(I),psilim)
  666. PSIM10(I)=10./ZA(I)*PSIM(I)
  667. PSIM10(I)=AMAX1(PSIM10(I),psilim)
  668. PSIH10(I)=PSIM10(I)
  669. PSIM2(I)=2./ZA(I)*PSIM(I)
  670. PSIM2(I)=AMAX1(PSIM2(I),psilim)
  671. PSIH2(I)=PSIM2(I)
  672. ! 1.0 over Monin-Obukhov length
  673. RMOL(I)= ZOL(I)/ZA(I)
  674. ELSEIF(BR(I) .EQ. 0.) THEN
  675. !=========================================================
  676. !-----CLASS 3; FORCED CONVECTION/NEUTRAL:
  677. !=========================================================
  678. REGIME(I)=3.
  679. PSIM(I)=0.0
  680. PSIH(I)=PSIM(I)
  681. PSIM10(I)=0.
  682. PSIH10(I)=PSIM10(I)
  683. PSIM2(I)=0.
  684. PSIH2(I)=PSIM2(I)
  685. !ZOL(I)=0.
  686. IF(UST(I) .LT. 0.01)THEN
  687. ZOL(I)=BR(I)*GZ1OZ0(I)
  688. ELSE
  689. ZOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I))
  690. ENDIF
  691. RMOL(I) = ZOL(I)/ZA(I)
  692. ELSEIF(BR(I) .LT. 0.)THEN
  693. !==========================================================
  694. !-----CLASS 4; FREE CONVECTION:
  695. !==========================================================
  696. REGIME(I)=4.
  697. !COMPUTE z/L
  698. CALL Li_etal_2010(ZOL(I),BR(I),ZA(I)/ZNT(I),zratio(I))
  699. ZOL10=10./ZA(I)*ZOL(I)
  700. ZOL2=2./ZA(I)*ZOL(I)
  701. ZOL(I)=AMIN1(ZOL(I),0.)
  702. ZOL(I)=AMAX1(ZOL(I),-9.9999)
  703. ZOL10=AMIN1(ZOL10,0.)
  704. ZOL10=AMAX1(ZOL10,-9.9999)
  705. ZOL2=AMIN1(ZOL2,0.)
  706. ZOL2=AMAX1(ZOL2,-9.9999)
  707. NZOL=INT(-ZOL(I)*100.)
  708. RZOL=-ZOL(I)*100.-NZOL
  709. NZOL10=INT(-ZOL10*100.)
  710. RZOL10=-ZOL10*100.-NZOL10
  711. NZOL2=INT(-ZOL2*100.)
  712. RZOL2=-ZOL2*100.-NZOL2
  713. !COMPUTE PSIM and PSIH
  714. IF((XLAND(I)-1.5).GE.0)THEN
  715. ! WATER
  716. !CALL PSI_Suselj_Sood_2010(PSIM(I),PSIH(I),ZOL(I))
  717. !CALL PSI_Hogstrom_1996(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  718. !CALL PSI_Businger_1971(PSIM(I),PSIH(I),ZOL(I))
  719. CALL PSI_DyerHicks(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  720. ELSE
  721. ! LAND
  722. !CALL PSI_Hogstrom_1996(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  723. !CALL PSI_Businger_1971(PSIM(I),PSIH(I),ZOL(I))
  724. CALL PSI_DyerHicks(PSIM(I),PSIH(I),ZOL(I), z_t(I), ZNT(I), ZA(I))
  725. ENDIF
  726. PSIM10(I)=PSIMTB(NZOL10)+RZOL10*(PSIMTB(NZOL10+1)-PSIMTB(NZOL10))
  727. PSIH10(I)=PSIHTB(NZOL10)+RZOL10*(PSIHTB(NZOL10+1)-PSIHTB(NZOL10))
  728. PSIM2(I)=PSIMTB(NZOL2)+RZOL2*(PSIMTB(NZOL2+1)-PSIMTB(NZOL2))
  729. PSIH2(I)=PSIHTB(NZOL2)+RZOL2*(PSIHTB(NZOL2+1)-PSIHTB(NZOL2))
  730. !---LIMIT PSIH AND PSIM IN THE CASE OF THIN LAYERS AND
  731. !---HIGH ROUGHNESS. THIS PREVENTS DENOMINATOR IN FLUXES
  732. !---FROM GETTING TOO SMALL
  733. PSIH(I)=AMIN1(PSIH(I),0.85*GZ1OZ0(I))
  734. PSIM(I)=AMIN1(PSIM(I),0.85*GZ1OZ0(I))
  735. PSIH2(I)=AMIN1(PSIH2(I),0.85*GZ2OZ0(I))
  736. PSIM10(I)=AMIN1(PSIM10(I),0.85*GZ10OZ0(I))
  737. RMOL(I) = ZOL(I)/ZA(I)
  738. ENDIF
  739. 320 CONTINUE
  740. !-----------------------------------------------------------
  741. !-----COMPUTE U*, T*, AND SURFACE DIAGNOSTICS:
  742. !-----------------------------------------------------------
  743. DO 330 I=its,ite
  744. !------------------------------------------------------------
  745. !-----COMPUTE THE FRICTIONAL VELOCITY:
  746. ! ZA(1982) EQS(2.60),(2.61).
  747. !------------------------------------------------------------
  748. DTG=THX(I)-THGB(I)
  749. PSIX=GZ1OZ0(I)-PSIM(I)
  750. PSIX10=GZ10OZ0(I)-PSIM10(I)
  751. ! TO PREVENT OSCILLATIONS AVERAGE WITH OLD VALUE
  752. UST(I)=0.5*UST(I)+0.5*KARMAN*WSPD(I)/PSIX
  753. IF((XLAND(I)-1.5).LT.0.)THEN !LAND
  754. !JOE: UST(I)=AMAX1(UST(I),0.1)
  755. UST(I)=AMAX1(UST(I),0.01) !Relaxing this limit
  756. ENDIF
  757. !------------------------------------------------------------
  758. !-----COMPUTE THE RESISTANCE (PSIQ AND PSIT):
  759. !------------------------------------------------------------
  760. ! LOWER LIMIT ADDED TO PREVENT LARGE FLHC IN SOIL MODEL
  761. ! ACTIVATES IN UNSTABLE CONDITIONS WITH THIN LAYERS OR HIGH Z0
  762. !PSIT=AMAX1(GZ1OZ0(I)-PSIH(I),2.)
  763. PSIT=AMAX1(GZ1OZt(I)-PSIH(I),2.)
  764. PSIT2=MAX(GZ2OZt(I)-PSIH2(I),2.)
  765. IF((XLAND(I)-1.5).GE.0)THEN
  766. PSIQ=MAX(LOG(za(i)/z_q(I))-PSIH(I),2.)
  767. PSIQ2=MAX(LOG(2./z_q(I))-PSIH2(I),2.)
  768. ELSE
  769. !CARLSON AND BOLAND (1978)(independent of zq):
  770. ZL=0.01
  771. PSIQ=MAX(LOG(KARMAN*UST(I)*ZA(I)/XKA + ZA(I)/ZL)-PSIH(I),2.0)
  772. PSIQ2=MAX(LOG(KARMAN*UST(I)*2./XKA + 2./ZL)-PSIH2(I),2.0)
  773. ENDIF
  774. !------------------------------------------------------------
  775. !COMPUTE THE TEMPERATURE SCALE (or FRICTION TEMPERATURE, T*)
  776. !------------------------------------------------------------
  777. MOL(I)=KARMAN*DTG/PSIT/PRT
  778. !t_star(I) = -HFX(I)/(UST(I)*CPM(I)*RHOX(I))
  779. !t_star(I) = MOL(I)
  780. !-----------------------------------------------------
  781. !COMPUTE 10 M WNDS
  782. ! If the lowest model level is close to 10-m, use it
  783. ! instead of the flux-based formula.
  784. if (ZA(i) .gt. 7.0 .and. ZA(i) .lt. 13.0) then
  785. U10(I)=UX(I)
  786. V10(I)=VX(I)
  787. else
  788. U10(I)=UX(I)*PSIX10/PSIX
  789. V10(I)=VX(I)*PSIX10/PSIX
  790. endif
  791. !-----------------------------------------------------
  792. !GET 2 M T, TH, AND Q
  793. !THESE WILL BE OVERWRITTEN FOR LAND POINTS IN THE LSM
  794. TH2(I)=THGB(I)+DTG*PSIT2/PSIT
  795. Q2(I)=QSFC(I)+(QX(I)-QSFC(I))*PSIQ2/PSIQ
  796. T2(I) = TH2(I)*(PSFC(I)/100.)**ROVCP
  797. 330 CONTINUE
  798. !-----------------------------------------------------------
  799. !-----COMPUTE THE SURFACE SENSIBLE AND LATENT HEAT FLUXES:
  800. !-----------------------------------------------------------
  801. DO i=its,ite
  802. QFX(i) =0.
  803. HFX(i) =0.
  804. ENDDO
  805. !-----------------------------------------------------
  806. !-- BUT FIRST, RECALCULATE ROUGHNESS LENGTHS (ZNT, Z_T, Z_Q).
  807. !-- USING AN UPDATED U*.
  808. !-----------------------------------------------------
  809. DO 360 I=its,ite
  810. IF((XLAND(I)-1.5).GE.0)THEN
  811. !COMPUTE KINEMATIC VISCOSITY
  812. ! AHW: Garratt formula: Calculate kinematic viscosity
  813. ! of air (linear approc to temp dependence at sea lev)
  814. VISC=(1.32+0.009*(T1D(I)-273.15))*1.E-5
  815. !--------------------------------------
  816. ! WATER
  817. !--------------------------------------
  818. ! GET ZNT
  819. !--------------------------------------
  820. !CALL davis_etal_2008(ZNT(i),UST(i))
  821. !CALL Taylor_Yelland_2001(ZNT(i),UST(i),WSPD(i))
  822. CALL charnock_1955(ZNT(i),UST(i),WSPD(i),visc)
  823. !COMPUTE ROUGHNESS REYNOLDS NUMBER WITH NEW ZNT
  824. restar=MAX(ust(i)*ZNT(i)/visc, 0.1)
  825. !--------------------------------------
  826. ! GET z_t and z_q
  827. !--------------------------------------
  828. !CALL zilitinkevich_1995(ZNT(i),z_t(i),z_q(i),restar,UST(I),KARMAN,XLAND(I))
  829. !CALL garrat_1992(z_t(i),z_q(i),ZNT(i),restar,XLAND(I))
  830. CALL fairall_2001(z_t(i),z_q(i),restar,UST(i),visc)
  831. zratio(i)=znt(i)/z_t(i)
  832. ELSE
  833. !--------------------------------------
  834. ! LAND
  835. !--------------------------------------
  836. !COMPUTE ROUGHNESS REYNOLDS NUMBER (restar)
  837. VISC=(1.32+0.009*(T1D(I)-273.15))*1.E-5
  838. restar=MAX(ust(i)*ZNT(i)/visc, 0.1)
  839. !--------------------------------------
  840. ! GET z_t and z_q
  841. !--------------------------------------
  842. !CALL zilitinkevich_1995(ZNT(i),z_t(i),z_q(i),restar,UST(I),KARMAN,XLAND(I))
  843. !CALL garrat_1992(z_t(i),z_q(i),ZNT(i),restar,XLAND(I))
  844. CALL Yang_2008(ZNT(i),z_t(i),z_q(i),UST(i),MOL(I),restar,visc,XLAND(I))
  845. zratio(i)=znt(i)/z_t(i)
  846. ENDIF
  847. !------------------------------------------
  848. ! CALCULATE THE EXCHANGE COEFFICIENTS FOR HEAT (FLHC)
  849. ! AND MOISTURE (FLQC)
  850. !------------------------------------------
  851. IF (ISFFLX.GT.0) THEN
  852. IF((XLAND(I)-1.5).GE.0)THEN
  853. PSIQ=MAX(LOG(za(i)/z_q(I))-PSIH(I),2.)
  854. ELSE
  855. !CARLSON AND BOLAND (1978)(independent of zq):
  856. ZL=0.01
  857. PSIQ=MAX(LOG(KARMAN*UST(I)*ZA(I)/XKA + ZA(I)/ZL)-PSIH(I),2.0)
  858. ENDIF
  859. !FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/( &
  860. ! ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-PSIH(I))
  861. !FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/( &
  862. ! & ALOG(za(i)/z_q(i))-PSIH(I))
  863. FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/PSIQ
  864. DTTHX=ABS(THX(I)-THGB(I))
  865. IF(DTTHX.GT.1.E-5)THEN
  866. FLHC(I)=CPM(I)*RHOX(I)*UST(I)*MOL(I)/(THX(I)-THGB(I))
  867. ELSE
  868. FLHC(I)=0.
  869. ENDIF
  870. ENDIF
  871. ! IF (I .eq. 2) THEN
  872. ! write(*,1001)"REGIME:",REGIME(I)," z/L:",ZOL(I)," UST:",UST(I)," Tstar:",MOL(I)
  873. ! write(*,1002)"PSIM:",PSIM(I)," PSIH:",PSIH(I)," FLHC:",FLHC(I)," FLQC:",FLQC(I)
  874. ! write(*,1003)"CPM:",CPM(I)," RHOX:",RHOX(I)," L:",ZOL(I)/ZA(I)," DTHV:",THX(I)-THGB(I)
  875. ! write(*,1004)"Z0/Zt:",zratio(I)," Z0:",ZNT(I)," Zt:",z_t(I)," za:",za(I)
  876. ! write(*,1005)"Re:",restar," MAVAIL:",MAVAIL(I)," QSFC(I):",QSFC(I)," QX(I):",QX(I)
  877. ! print*,"VISC=",VISC," Z0:",ZNT(I)," T1D(i):",T1D(i)
  878. ! write(*,*)"============================================="
  879. ! ENDIF
  880. 360 CONTINUE
  881. 1001 format(A,F2.0, A,f10.4,A,f5.3, A,f11.5)
  882. 1002 format(A,f7.2, A,f7.2, A,f9.2, A,f10.6)
  883. 1003 format(A,f7.2, A,f7.2, A,f10.3,A,f10.3)
  884. 1004 format(A,f11.3,A,f9.7, A,f9.7, A,f6.2, A,f10.3)
  885. 1005 format(A,f9.2,A,f6.4,A,f7.4,A,f7.4)
  886. IF (ISFFLX .GT. 0) THEN
  887. !----------------------------------
  888. !-----COMPUTE SURFACE MOISTURE FLUX:
  889. !
  890. !IF(IDRY .EQ. 1)GOTO 390
  891. DO I=its,ite
  892. QFX(I)=FLQC(I)*(QSFC(I)-QX(I))
  893. !JOE: QFX(I)=AMAX1(QFX(I),0.) !does not allows neg QFX
  894. QFX(I)=AMAX1(QFX(I),-0.02) !allows small neg QFX, like MYJ
  895. LH(I)=XLV*QFX(I)
  896. ENDDO
  897. 390 CONTINUE
  898. !----------------------------------
  899. !-----COMPUTE SURFACE HEAT FLUX:
  900. !
  901. DO 400 I=its,ite
  902. IF(XLAND(I)-1.5.GT.0.)THEN
  903. HFX(I)=FLHC(I)*(THGB(I)-THX(I))
  904. ELSEIF(XLAND(I)-1.5.LT.0.)THEN
  905. HFX(I)=FLHC(I)*(THGB(I)-THX(I))
  906. HFX(I)=AMAX1(HFX(I),-250.)
  907. ENDIF
  908. 400 CONTINUE
  909. DO I=its,ite
  910. ! CHS(I)=UST(I)*KARMAN/(ALOG(KARMAN*UST(I)*ZA(I) &
  911. ! /XKA+ZA(I)/ZL)-PSIH(I))
  912. CHS(I)=UST(I)*KARMAN/(LOG(ZA(I)/z_t(I))- &
  913. &PSIH(I))
  914. ! The exchange coefficient for cloud water is assumed to be the same as
  915. ! that for heat. CH is multiplied by WSPD.
  916. !! ch(i)=chs(i)
  917. ch(i)=flhc(i)/( cpm(i)*rhox(i) )
  918. ! GZ2OZ0(I)=ALOG(2./ZNT(I))
  919. ! PSIM2(I)=-10.*GZ2OZ0(I)
  920. ! PSIM2(I)=AMAX1(PSIM2(I),-10.)
  921. ! PSIH2(I)=PSIM2(I)
  922. ! CQS2(I)=UST(I)*KARMAN/(ALOG(KARMAN*UST(I)*2.0 &
  923. ! /XKA+2.0/ZL)-PSIH2(I))
  924. ! CHS2(I)=UST(I)*KARMAN/(GZ2OZ0(I)-PSIH2(I))
  925. !THESE ARE USED FOR 2-M DIAGNOSTICS ONLY
  926. CQS2(I)=UST(I)*KARMAN/(LOG(2.0/z_q(I))-PSIH2(I))
  927. CHS2(I)=UST(I)*KARMAN/(GZ2OZt(I)-PSIH2(I))
  928. ENDDO
  929. ENDIF
  930. END SUBROUTINE SFCLAY1D_mynn
  931. !-------------------------------------------------------------------
  932. SUBROUTINE zilitinkevich_1995(Z_0,Zt,Zq,restar,ustar,KARMAN,landsea)
  933. IMPLICIT NONE
  934. REAL, INTENT(IN) :: Z_0,restar,ustar,KARMAN,landsea
  935. REAL, INTENT(OUT) :: Zt,Zq
  936. REAL, PARAMETER :: C1=0.075
  937. IF (landsea-1.5 .GT. 0) THEN !WATER
  938. !THIS IS BASED ON Zilitinkevich, Grachev, and Fairall (2001;
  939. !Their equations 15 and 16).
  940. IF (restar .LT. 0.1) THEN
  941. Zt = Z_0*EXP(KARMAN*2.0)
  942. Zt = MIN( Zt, 5.0e-5)
  943. Zt = MAX( Zt, 2.0e-9) !same lower limit as ECMWF
  944. Zq = Z_0*EXP(KARMAN*3.0)
  945. Zq = MIN( Zq, 5.0e-5)
  946. Zq = MAX( Zq, 2.0e-9)
  947. ELSE
  948. Zt = Z_0*EXP(-KARMAN*(4.0*SQRT(restar)-3.2))
  949. Zt = MIN( Zt, 5.0e-5)
  950. Zt = MAX( Zt, 2.0e-9)
  951. Zq = Z_0*EXP(-KARMAN*(4.0*SQRT(restar)-4.2))
  952. Zq = MIN( Zt, 5.0e-5)
  953. Zq = MAX( Zt, 2.0e-9)
  954. ENDIF
  955. ELSE !LAND
  956. Zt = Z_0*EXP(-KARMAN*C1*SQRT(restar))
  957. Zt = MAX( Zt, Z_0/200.)
  958. Zt = MIN( Zt, Z_0)
  959. Zq = Z_0*EXP(-KARMAN*C1*SQRT(restar))
  960. Zq = MAX( Zq, Z_0/200.)
  961. Zq = MIN( Zq, Z_0)
  962. !Zq = Zt
  963. ENDIF
  964. return
  965. END SUBROUTINE zilitinkevich_1995
  966. !--------------------------------------------------------------------
  967. SUBROUTINE davis_etal_2008(Z_0,ustar)
  968. !This formulation for roughness length was designed to match
  969. !the labratory experiments of Donelan et al. (2004).
  970. !This formulation produces smaller Z_0 between 5-20 m/s than
  971. !the Taylor_Yelland_2001 or Charnock subroutines (below).
  972. IMPLICIT NONE
  973. REAL, INTENT(IN) :: ustar
  974. REAL, INTENT(OUT) :: Z_0
  975. Z_0 = 10.*EXP(-10./(ustar**(1./3.)))
  976. Z_0 = MAX( Z_0, 1.27e-7) !These max/mins were suggested by
  977. Z_0 = MIN( Z_0, 2.85e-3) !Davis et al. (2008)
  978. return
  979. END SUBROUTINE davis_etal_2008
  980. !--------------------------------------------------------------------
  981. SUBROUTINE Taylor_Yelland_2001(Z_0,ustar,wsp10)
  982. !This formulation for roughness length was designed account for
  983. !wave steepness.
  984. IMPLICIT NONE
  985. REAL, INTENT(IN) :: ustar,wsp10
  986. REAL, INTENT(OUT) :: Z_0
  987. REAL, parameter :: g=9.81, pi=3.14159265
  988. REAL :: hs, Tp, Lp
  989. !hs is the significant wave height
  990. hs = 0.0248*(wsp10**2.)
  991. !Tp dominant wave period
  992. Tp = 0.729*MAX(wsp10,0.1)
  993. !Lp is the wavelength of the dominant wave
  994. Lp = g*Tp**2/(2*pi)
  995. Z_0 = 1200.*hs*(hs/Lp)**4.5
  996. Z_0 = MAX( Z_0, 1.27e-7) !These max/mins were suggested by
  997. Z_0 = MIN( Z_0, 2.85e-3) !Davis et al. (2008)
  998. return
  999. END SUBROUTINE Taylor_Yelland_2001
  1000. !--------------------------------------------------------------------
  1001. SUBROUTINE charnock_1955(Z_0,ustar,wsp10,visc)
  1002. !This version of Charnock's relation employs a varying
  1003. !Charnock parameter, similar to COARE3.0 [Fairall et al. (2003)].
  1004. !The Charnoch parameter CZC is varied from .011 to .018
  1005. !between 10-m wsp = 10 and 18.
  1006. IMPLICIT NONE
  1007. REAL, INTENT(IN) :: ustar, visc, wsp10
  1008. REAL, INTENT(OUT) :: Z_0
  1009. REAL, PARAMETER :: G=9.81, CZO2=0.011
  1010. REAL :: CZC !variable charnock "constant"
  1011. CZC = CZO2 + 0.007*MIN(MAX((wsp10-10.)/8., 0.), 1.0)
  1012. Z_0 = CZC*ustar*ustar/G + (0.11*visc/MAX(ustar,0.1))
  1013. Z_0 = MAX( Z_0, 1.27e-7) !These max/mins were suggested by
  1014. Z_0 = MIN( Z_0, 2.85e-3) !Davis et al. (2008)
  1015. return
  1016. END SUBROUTINE charnock_1955
  1017. !--------------------------------------------------------------------
  1018. SUBROUTINE garrat_1992(Zt,Zq,Z_0,Ren,landsea)
  1019. !This formulation for the thermal and moisture roughness lengths
  1020. !(Zt and Zq) relates them to Z0 via the roughness Reynolds number (Ren).
  1021. !This formula comes from Fairall et al. (2003). It is modified from
  1022. !the original Garrat-Brutsaert model to better fit the COARE/HEXMAX
  1023. !data. The formula for land uses a constant ratio (Z_0/7.4) taken
  1024. !from Garrat (1992).
  1025. IMPLICIT NONE
  1026. REAL, INTENT(IN) :: Ren, Z_0,landsea
  1027. REAL, INTENT(OUT) :: Zt,Zq
  1028. REAL :: Rq
  1029. REAL, PARAMETER :: e=2.71828183
  1030. IF (landsea-1.5 .GT. 0) THEN !WATER
  1031. Zt = Z_0*EXP(2.0 - (2.48*(Ren**0.25)))
  1032. Zq = Z_0*EXP(2.0 - (2.28*(Ren**0.25)))
  1033. Zq = MIN( Zq, 5.0e-5)
  1034. Zq = MAX( Zq, 2.0e-9)
  1035. Zt = MIN( Zt, 5.0e-5)
  1036. Zt = MAX( Zt, 2.0e-9) !same lower limit as ECMWF
  1037. ELSE !LAND
  1038. Zq = Z_0/(e**2.) !taken from Garrat (1980,1992)
  1039. Zt = Zq
  1040. ENDIF
  1041. return
  1042. END SUBROUTINE garrat_1992
  1043. !--------------------------------------------------------------------
  1044. SUBROUTINE fairall_2001(Zt,Zq,Ren,ustar,visc)
  1045. !This formulation for thermal and moisture roughness length (Zt and Zq)
  1046. !as a function of the roughness Reynolds number (Ren) comes from the
  1047. !COARE3.0 formulation, empirically derived from COARE and HEXMAX data
  1048. ![Fairall et al. (2003)]. Edson et al. (2004; JGR) suspected that this
  1049. !relationship overestimated roughness lengths for low Reynolds number
  1050. !flows, so a smooth flow relationship, taken from Garrat (1992, p. 102),
  1051. !is used for flows with Ren < 2.
  1052. !
  1053. !This is for use over water only.
  1054. IMPLICIT NONE
  1055. REAL, INTENT(IN) :: Ren,ustar,visc
  1056. REAL, INTENT(OUT) :: Zt,Zq
  1057. IF (Ren .le. 2.) then
  1058. Zt = (5.5e-5)*(Ren**(-0.63))
  1059. !FOR SMOOTH SEAS, USE GARRAT FOR Zq
  1060. Zq = 0.2*visc/MAX(ustar,0.1)
  1061. ELSE
  1062. !FOR ROUGH SEAS, USE FAIRALL
  1063. Zt = (5.5e-5)*(Ren**(-0.63))
  1064. Zq = Zt
  1065. ENDIF
  1066. Zt = MIN(Zt,5.5e-5)
  1067. Zt = MAX(Zt,2.0e-9)
  1068. Zq = MIN(Zt,5.5e-5)
  1069. Zq = MAX(Zt,2.0e-9)
  1070. return
  1071. END SUBROUTINE fairall_2001
  1072. !--------------------------------------------------------------------
  1073. SUBROUTINE Yang_2008(Z_0,Zt,Zq,ustar,tstar,Ren,visc,landsea)
  1074. !This is a modified version of Yang et al (2002 QJRMS, 2008 JAMC)
  1075. !and Chen et al (2010, J of Hydromet). Although it was originally
  1076. !designed for arid regions with bare soil, it is modified
  1077. !here to perform over a broader spectrum of vegetation.
  1078. !
  1079. !The original formulation relates the thermal roughness length (Zt)
  1080. !to u* and T*:
  1081. !
  1082. ! Zt = ht * EXP(-beta*(ustar**0.5)*(ABS(tstar)**0.25))
  1083. !
  1084. !where ht = Renc*visc/ustar and the critical Reynolds number
  1085. !(Renc) = 70. Beta was originally = 10 (2002 paper) but was revised
  1086. !to 7.2 (in 2008 paper). Their form typically varies the
  1087. !ratio Z0/Zt by a few orders of magnitude (1-1E5).
  1088. !
  1089. !This modified form uses beta = 2.0, so zo/zt generally only varies by
  1090. !10-300 over grass and cropland to about 20-2000 over forests.
  1091. !
  1092. !This should only be used over land!
  1093. IMPLICIT NONE
  1094. REAL, INTENT(IN) :: Z_0, Ren, ustar, tstar, visc, landsea
  1095. REAL :: ht, tstar2
  1096. REAL, INTENT(OUT) :: Zt,Zq
  1097. REAL, PARAMETER :: Renc=70., beta=2.0, e=2.71828183
  1098. ht = Renc*visc/MAX(ustar,0.01)
  1099. tstar2 = MIN(tstar+0.2,0.0)
  1100. Zt = ht * EXP(-beta*(ustar**0.5)*(ABS(tstar2)**0.25))
  1101. Zq = Zt
  1102. Zt = MIN(Zt, Z_0/(e**2.)) !Garrat (1980,1992)
  1103. Zq = MIN(Zq, Z_0/(e**2.))
  1104. return
  1105. END SUBROUTINE Yang_2008
  1106. !--------------------------------------------------------------------
  1107. SUBROUTINE PSI_Hogstrom_1996(psi_m, psi_h, zL, Zt, Z_0, Za)
  1108. ! This subroutine returns the stability functions based off
  1109. ! of Hogstrom (1996).
  1110. IMPLICIT NONE
  1111. REAL, INTENT(IN) :: zL, Zt, Z_0, Za
  1112. REAL, INTENT(OUT) :: psi_m, psi_h
  1113. REAL :: x, x0, y, y0, zmL, zhL
  1114. zmL = Z_0*zL/Za
  1115. zhL = Zt*zL/Za
  1116. IF (zL .gt. 0.) THEN !STABLE (not well tested - seem large)
  1117. psi_m = -5.3*(zL - zmL)
  1118. psi_h = -8.0*(zL - zhL)
  1119. ELSE !UNSTABLE
  1120. x = (1.-19.0*zL)**0.25
  1121. x0= (1.-19.0*zmL)**0.25
  1122. y = (1.-11.6*zL)**0.5
  1123. y0= (1.-11.6*zhL)**0.5
  1124. psi_m = 2.*LOG((1.+x)/(1.+x0)) + LOG((1.+x**2.)/(1.+x0**2.)) - &
  1125. 2.*ATAN(x) + 2*ATAN(x0)
  1126. psi_h = 2.*LOG((1.+y)/(1.+y0))
  1127. ENDIF
  1128. return
  1129. END SUBROUTINE PSI_Hogstrom_1996
  1130. !--------------------------------------------------------------------
  1131. SUBROUTINE PSI_DyerHicks(psi_m, psi_h, zL, Zt, Z_0, Za)
  1132. ! This subroutine returns the stability functions based off
  1133. ! of Hogstrom (1996), but with different constants compatible
  1134. ! with Dyer and Hicks (1970/74?). This formulation is used for
  1135. ! testing/development by Nakanishi (personal communication).
  1136. IMPLICIT NONE
  1137. REAL, INTENT(IN) :: zL, Zt, Z_0, Za
  1138. REAL, INTENT(OUT) :: psi_m, psi_h
  1139. REAL :: x, x0, y, y0, zmL, zhL
  1140. zmL = Z_0*zL/Za
  1141. zhL = Zt*zL/Za
  1142. IF (zL .gt. 0.) THEN !STABLE
  1143. psi_m = -5.0*(zL - zmL)
  1144. psi_h = -5.0*(zL - zhL)
  1145. ELSE !UNSTABLE
  1146. x = (1.-16.*zL)**0.25
  1147. x0= (1.-16.*zmL)**0.25
  1148. !x = (1.-19.*zL)**0.25 !Hogstrom's form
  1149. !x0= (1.-19.*zmL)**0.25
  1150. y = (1.-16.*zL)**0.5
  1151. y0= (1.-16.*zhL)**0.5
  1152. psi_m = 2.*LOG((1.+x)/(1.+x0)) + LOG((1.+x**2.)/(1.+x0**2.)) - &
  1153. 2.*ATAN(x) + 2*ATAN(x0)
  1154. psi_h = 2.*LOG((1.+y)/(1.+y0))
  1155. ENDIF
  1156. return
  1157. END SUBROUTINE PSI_DyerHicks
  1158. !--------------------------------------------------------------------
  1159. SUBROUTINE PSI_Beljaars_Holtslag_1991(psi_m, psi_h, zL)
  1160. ! This subroutine returns the stability functions based off
  1161. ! of Beljaar and Holtslag 1991, which is an extension of Holtslag
  1162. ! and Debruin 1989.
  1163. IMPLICIT NONE
  1164. REAL, INTENT(IN) :: zL
  1165. REAL, INTENT(OUT) :: psi_m, psi_h
  1166. REAL, PARAMETER :: a=1., b=0.666, c=5., d=0.35
  1167. IF (zL .lt. 0.) THEN !UNSTABLE
  1168. WRITE(*,*)"WARNING: Universal stability function from"
  1169. WRITE(*,*)" Beljaars and Holtslag (1991) should only"
  1170. WRITE(*,*)" be used in the stable regime!"
  1171. psi_m = 0.
  1172. psi_h = 0.
  1173. ELSE !STABLE
  1174. psi_m = -(a*zL + b*(zL -(c/d))*exp(-d*zL) + (b*c/d))
  1175. psi_h = -((1.+.666*a*zL)**1.5 + &
  1176. b*(zL - (c/d))*exp(-d*zL) + (b*c/d) -1.)
  1177. ENDIF
  1178. return
  1179. END SUBROUTINE PSI_Beljaars_Holtslag_1991
  1180. !--------------------------------------------------------------------
  1181. SUBROUTINE PSI_Zilitinkevich_Esau_2007(psi_m, psi_h, zL)
  1182. ! This subroutine returns the stability functions come from
  1183. ! Zilitinkevich and Esau (2007, BM), which are formulatioed from the
  1184. ! "generalized similarity theory" and tuned to the LES DATABASE64
  1185. ! to determine their dependence on z/L.
  1186. IMPLICIT NONE
  1187. REAL, INTENT(IN) :: zL
  1188. REAL, INTENT(OUT) :: psi_m, psi_h
  1189. REAL, PARAMETER :: Cm=3.0, Ct=2.5
  1190. IF (zL .lt. 0.) THEN !UNSTABLE
  1191. WRITE(*,*)"WARNING: Universal stability function from"
  1192. WRITE(*,*)" Zilitinkevich and Esau (2007) should only"
  1193. WRITE(*,*)" be used in the stable regime!"
  1194. psi_m = 0.
  1195. psi_h = 0.
  1196. ELSE !STABLE
  1197. psi_m = -Cm*(zL**(5./6.))
  1198. psi_h = -Ct*(zL**(4./5.))
  1199. ENDIF
  1200. return
  1201. END SUBROUTINE PSI_Zilitinkevich_Esau_2007
  1202. !--------------------------------------------------------------------
  1203. SUBROUTINE PSI_Businger_1971(psi_m, psi_h, zL)
  1204. ! This subroutine returns the flux-profile relationships
  1205. ! of Businger el al. 1971.
  1206. IMPLICIT NONE
  1207. REAL, INTENT(IN) :: zL
  1208. REAL, INTENT(OUT) :: psi_m, psi_h
  1209. REAL :: x, y
  1210. REAL, PARAMETER :: Pi180 = 3.14159265/180.
  1211. IF (zL .lt. 0.) THEN !UNSTABLE
  1212. x = (1. - 15.0*zL)**0.25
  1213. y = (1. - 9.0*zL)**0.5
  1214. psi_m = LOG(((1.+x)/2.)**2.) + LOG((1.+x**2.)/2.) - &
  1215. 2.*ATAN(x) + Pi180*90.
  1216. psi_h = 2.*LOG((1.+y)/2.)
  1217. ELSE !STABLE
  1218. psi_m = -4.7*zL
  1219. psi_h = -(4.7/0.74)*zL
  1220. ENDIF
  1221. return
  1222. END SUBROUTINE PSI_Businger_1971
  1223. !--------------------------------------------------------------------
  1224. SUBROUTINE PSI_Suselj_Sood_2010(psi_m, psi_h, zL)
  1225. !This subroutine returns flux-profile relatioships based off
  1226. !of Lobocki (1993), which is derived from the MY-level 2 model.
  1227. !Suselj and Sood (2010) applied the surface layer length scales
  1228. !from Nakanishi (2001) to get this new relationship. These functions
  1229. !are more agressive (larger magnitude) than most formulations. They
  1230. !showed improvement over water, but untested over land.
  1231. IMPLICIT NONE
  1232. REAL, INTENT(IN) :: zL
  1233. REAL, INTENT(OUT) :: psi_m, psi_h
  1234. REAL, PARAMETER :: Rfc=0.19, Ric=0.183, PHIT=0.8
  1235. IF (zL .gt. 0.) THEN !STABLE
  1236. psi_m = -(zL/Rfc + 1.1223*EXP(1.-1.6666/zL))
  1237. !psi_h = -zL*Ric/((Rfc**2.)*PHIT) + 8.209*(zL**1.1091)
  1238. !THEIR EQ FOR PSI_H CRASHES THE MODEL AND DOES NOT MATCH
  1239. !THEIR FIG 1. THIS EQ (BELOW) MATCHES THEIR FIG 1 BETTER:
  1240. psi_h = -(zL*Ric/((Rfc**2.)*5.) + 7.09*(zL**1.1091))
  1241. ELSE !UNSTABLE
  1242. psi_m = 0.9904*LOG(1. - 14.264*zL)
  1243. psi_h = 1.0103*LOG(1. - 16.3066*zL)
  1244. ENDIF
  1245. return
  1246. END SUBROUTINE PSI_Suselj_Sood_2010
  1247. !--------------------------------------------------------------------
  1248. SUBROUTINE Li_etal_2010(zL, Rib, zaz0, z0zt)
  1249. !This subroutine returns a more robust z/L that best matches
  1250. !the z/L from Hogstrom (1996) for unstable conditions and Beljaars
  1251. !and Holtslag (1991) for stable conditions.
  1252. IMPLICIT NONE
  1253. REAL, INTENT(OUT) :: zL
  1254. REAL, INTENT(IN) :: Rib, zaz0, z0zt
  1255. REAL :: alfa, beta, zaz02, z0zt2
  1256. REAL, PARAMETER :: au11=0.045, bu11=0.003, bu12=0.0059, &
  1257. bu21=-0.0828, bu22=0.8845, bu31=0.1739, &
  1258. bu32=-0.9213, bu33=-0.1057
  1259. REAL, PARAMETER :: aw11=0.5738, aw12=-0.4399, aw21=-4.901,&
  1260. aw22=52.50, bw11=-0.0539, bw12=1.540, &
  1261. bw21=-0.669, bw22=-3.282
  1262. REAL, PARAMETER :: as11=0.7529, as21=14.94, bs11=0.1569,&
  1263. bs21=-0.3091, bs22=-1.303
  1264. !set limits according to Li et al (2010), p 157.
  1265. zaz02=zaz0
  1266. IF (zaz0 .lt. 100.0) zaz02=100.
  1267. IF (zaz0 .gt. 100000.0) zaz02=100000.
  1268. !set more limits according to Li et al (2010)
  1269. z0zt2=z0zt
  1270. IF (z0zt .lt. 0.5) z0zt2=0.5
  1271. IF (z0zt .gt. 100.0) z0zt2=100.
  1272. alfa = LOG(zaz02)
  1273. beta = LOG(z0zt2)
  1274. IF (Rib .le. 0.0) THEN
  1275. zL = au11*alfa*Rib**2 + ( &
  1276. (bu11*beta + bu12)*alfa**2 + &
  1277. (bu21*beta + bu22)*alfa + &
  1278. (bu31*beta**2 + bu32*beta + bu33))*Rib
  1279. !if(zL .LT. -15 .OR. zl .GT. 0.)print*,"VIOLATION Rib<0:",zL
  1280. zL = MAX(zL,-15.) !LIMITS SET ACCORDING TO Li et al (2010)
  1281. zL = MIN(zL,0.) !Figure 1.
  1282. ELSEIF (Rib .gt. 0.0 .AND. Rib .le. 0.2) THEN
  1283. zL = ((aw11*beta + aw12)*alfa + &
  1284. (aw21*beta + aw22))*Rib**2 + &
  1285. ((bw11*beta + bw12)*alfa + &
  1286. (bw21*beta + bw22))*Rib
  1287. !if(zL .LT. 0 .OR. zl .GT. 4)print*,"VIOLATION 0<Rib<0.2:",zL
  1288. zL = MIN(zL,4.) !LIMITS APPROX SET ACCORDING TO Li et al (2010)
  1289. zL = MAX(zL,0.) !THEIR FIGURE 1B.
  1290. ELSE
  1291. zL = (as11*alfa + as21)*Rib + bs11*alfa + &
  1292. bs21*beta + bs22
  1293. !if(zL .LE. 1 .OR. zl .GT. 23)print*,"VIOLATION Rib>0.2:",zL
  1294. zL = MIN(zL,20.) !LIMITS ACCORDING TO Li et al (2010), THIER
  1295. !FIGUE 1C.
  1296. zL = MAX(zL,1.)
  1297. ENDIF
  1298. return
  1299. END SUBROUTINE Li_etal_2010
  1300. !--------------------------------------------------------------------
  1301. END MODULE module_sf_mynn