PageRenderTime 74ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_sf_sfclay.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 895 lines | 509 code | 92 blank | 294 comment | 3 complexity | 7f33423e58aa2d6ab6db61880539c2c0 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_sf_sfclay
  4. REAL , PARAMETER :: VCONVC=1.
  5. REAL , PARAMETER :: CZO=0.0185
  6. REAL , PARAMETER :: OZO=1.59E-5
  7. REAL, DIMENSION(0:1000 ),SAVE :: PSIMTB,PSIHTB
  8. CONTAINS
  9. !-------------------------------------------------------------------
  10. SUBROUTINE SFCLAY(U3D,V3D,T3D,QV3D,P3D,dz8w, &
  11. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  12. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  13. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, &
  14. U10,V10,TH2,T2,Q2, &
  15. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  16. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  17. KARMAN,EOMEG,STBOLT, &
  18. P1000mb, &
  19. ids,ide, jds,jde, kds,kde, &
  20. ims,ime, jms,jme, kms,kme, &
  21. its,ite, jts,jte, kts,kte, &
  22. ustm,ck,cka,cd,cda,isftcflx,iz0tlnd,scm_force_flux )
  23. !-------------------------------------------------------------------
  24. IMPLICIT NONE
  25. !-------------------------------------------------------------------
  26. !-- U3D 3D u-velocity interpolated to theta points (m/s)
  27. !-- V3D 3D v-velocity interpolated to theta points (m/s)
  28. !-- T3D temperature (K)
  29. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  30. !-- P3D 3D pressure (Pa)
  31. !-- dz8w dz between full levels (m)
  32. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  33. !-- G acceleration due to gravity (m/s^2)
  34. !-- ROVCP R/CP
  35. !-- R gas constant for dry air (J/kg/K)
  36. !-- XLV latent heat of vaporization for water (J/kg)
  37. !-- PSFC surface pressure (Pa)
  38. !-- ZNT roughness length (m)
  39. !-- UST u* in similarity theory (m/s)
  40. !-- USTM u* in similarity theory (m/s) without vconv correction
  41. ! used to couple with TKE scheme
  42. !-- PBLH PBL height from previous time (m)
  43. !-- MAVAIL surface moisture availability (between 0 and 1)
  44. !-- ZOL z/L height over Monin-Obukhov length
  45. !-- MOL T* (similarity theory) (K)
  46. !-- REGIME flag indicating PBL regime (stable, unstable, etc.)
  47. !-- PSIM similarity stability function for momentum
  48. !-- PSIH similarity stability function for heat
  49. !-- XLAND land mask (1 for land, 2 for water)
  50. !-- HFX upward heat flux at the surface (W/m^2)
  51. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  52. !-- LH net upward latent heat flux at surface (W/m^2)
  53. !-- TSK surface temperature (K)
  54. !-- FLHC exchange coefficient for heat (W/m^2/K)
  55. !-- FLQC exchange coefficient for moisture (kg/m^2/s)
  56. !-- CHS heat/moisture exchange coefficient for LSM (m/s)
  57. !-- QGH lowest-level saturated mixing ratio
  58. !-- QSFC ground saturated mixing ratio
  59. !-- U10 diagnostic 10m u wind
  60. !-- V10 diagnostic 10m v wind
  61. !-- TH2 diagnostic 2m theta (K)
  62. !-- T2 diagnostic 2m temperature (K)
  63. !-- Q2 diagnostic 2m mixing ratio (kg/kg)
  64. !-- GZ1OZ0 log(z/z0) where z0 is roughness length
  65. !-- WSPD wind speed at lowest model level (m/s)
  66. !-- BR bulk Richardson number in surface layer
  67. !-- ISFFLX isfflx=1 for surface heat and moisture fluxes
  68. !-- DX horizontal grid size (m)
  69. !-- SVP1 constant for saturation vapor pressure (kPa)
  70. !-- SVP2 constant for saturation vapor pressure (dimensionless)
  71. !-- SVP3 constant for saturation vapor pressure (K)
  72. !-- SVPT0 constant for saturation vapor pressure (K)
  73. !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
  74. !-- EP2 constant for specific humidity calculation
  75. ! (R_d/R_v) (dimensionless)
  76. !-- KARMAN Von Karman constant
  77. !-- EOMEG angular velocity of earth's rotation (rad/s)
  78. !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
  79. !-- ck enthalpy exchange coeff at 10 meters
  80. !-- cd momentum exchange coeff at 10 meters
  81. !-- cka enthalpy exchange coeff at the lowest model level
  82. !-- cda momentum exchange coeff at the lowest model level
  83. !-- isftcflx =0, (Charnock and Carlson-Boland); =1, AHW Ck, Cd, =2 Garratt
  84. !-- iz0tlnd =0 Carlson-Boland, =1 Czil_new
  85. !-- ids start index for i in domain
  86. !-- ide end index for i in domain
  87. !-- jds start index for j in domain
  88. !-- jde end index for j in domain
  89. !-- kds start index for k in domain
  90. !-- kde end index for k in domain
  91. !-- ims start index for i in memory
  92. !-- ime end index for i in memory
  93. !-- jms start index for j in memory
  94. !-- jme end index for j in memory
  95. !-- kms start index for k in memory
  96. !-- kme end index for k in memory
  97. !-- its start index for i in tile
  98. !-- ite end index for i in tile
  99. !-- jts start index for j in tile
  100. !-- jte end index for j in tile
  101. !-- kts start index for k in tile
  102. !-- kte end index for k in tile
  103. !-------------------------------------------------------------------
  104. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  105. ims,ime, jms,jme, kms,kme, &
  106. its,ite, jts,jte, kts,kte
  107. !
  108. INTEGER, INTENT(IN ) :: ISFFLX
  109. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  110. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  111. REAL, INTENT(IN ) :: P1000mb
  112. !
  113. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  114. INTENT(IN ) :: dz8w
  115. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  116. INTENT(IN ) :: QV3D, &
  117. P3D, &
  118. T3D
  119. REAL, DIMENSION( ims:ime, jms:jme ) , &
  120. INTENT(IN ) :: MAVAIL, &
  121. PBLH, &
  122. XLAND, &
  123. TSK
  124. REAL, DIMENSION( ims:ime, jms:jme ) , &
  125. INTENT(OUT ) :: U10, &
  126. V10, &
  127. TH2, &
  128. T2, &
  129. Q2, &
  130. QSFC
  131. !
  132. REAL, DIMENSION( ims:ime, jms:jme ) , &
  133. INTENT(INOUT) :: REGIME, &
  134. HFX, &
  135. QFX, &
  136. LH, &
  137. MOL,RMOL
  138. !m the following 5 are change to memory size
  139. !
  140. REAL, DIMENSION( ims:ime, jms:jme ) , &
  141. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  142. PSIM,PSIH
  143. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  144. INTENT(IN ) :: U3D, &
  145. V3D
  146. REAL, DIMENSION( ims:ime, jms:jme ) , &
  147. INTENT(IN ) :: PSFC
  148. REAL, DIMENSION( ims:ime, jms:jme ) , &
  149. INTENT(INOUT) :: ZNT, &
  150. ZOL, &
  151. UST, &
  152. CPM, &
  153. CHS2, &
  154. CQS2, &
  155. CHS
  156. REAL, DIMENSION( ims:ime, jms:jme ) , &
  157. INTENT(INOUT) :: FLHC,FLQC
  158. REAL, DIMENSION( ims:ime, jms:jme ) , &
  159. INTENT(INOUT) :: &
  160. QGH
  161. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  162. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ) , &
  163. INTENT(OUT) :: ck,cka,cd,cda,ustm
  164. INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX, IZ0TLND
  165. INTEGER, OPTIONAL, INTENT(IN ) :: SCM_FORCE_FLUX
  166. ! LOCAL VARS
  167. REAL, DIMENSION( its:ite ) :: U1D, &
  168. V1D, &
  169. QV1D, &
  170. P1D, &
  171. T1D
  172. REAL, DIMENSION( its:ite ) :: dz8w1d
  173. INTEGER :: I,J
  174. DO J=jts,jte
  175. DO i=its,ite
  176. dz8w1d(I) = dz8w(i,1,j)
  177. ENDDO
  178. DO i=its,ite
  179. U1D(i) =U3D(i,1,j)
  180. V1D(i) =V3D(i,1,j)
  181. QV1D(i)=QV3D(i,1,j)
  182. P1D(i) =P3D(i,1,j)
  183. T1D(i) =T3D(i,1,j)
  184. ENDDO
  185. ! Sending array starting locations of optional variables may cause
  186. ! troubles, so we explicitly change the call.
  187. CALL SFCLAY1D(J,U1D,V1D,T1D,QV1D,P1D,dz8w1d, &
  188. CP,G,ROVCP,R,XLV,PSFC(ims,j),CHS(ims,j),CHS2(ims,j),&
  189. CQS2(ims,j),CPM(ims,j),PBLH(ims,j), RMOL(ims,j), &
  190. ZNT(ims,j),UST(ims,j),MAVAIL(ims,j),ZOL(ims,j), &
  191. MOL(ims,j),REGIME(ims,j),PSIM(ims,j),PSIH(ims,j), &
  192. XLAND(ims,j),HFX(ims,j),QFX(ims,j),TSK(ims,j), &
  193. U10(ims,j),V10(ims,j),TH2(ims,j),T2(ims,j), &
  194. Q2(ims,j),FLHC(ims,j),FLQC(ims,j),QGH(ims,j), &
  195. QSFC(ims,j),LH(ims,j), &
  196. GZ1OZ0(ims,j),WSPD(ims,j),BR(ims,j),ISFFLX,DX, &
  197. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
  198. P1000mb, &
  199. ids,ide, jds,jde, kds,kde, &
  200. ims,ime, jms,jme, kms,kme, &
  201. its,ite, jts,jte, kts,kte &
  202. #if ( EM_CORE == 1 )
  203. ,isftcflx,iz0tlnd,scm_force_flux, &
  204. USTM(ims,j),CK(ims,j),CKA(ims,j), &
  205. CD(ims,j),CDA(ims,j) &
  206. #endif
  207. )
  208. ENDDO
  209. END SUBROUTINE SFCLAY
  210. !-------------------------------------------------------------------
  211. SUBROUTINE SFCLAY1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
  212. CP,G,ROVCP,R,XLV,PSFCPA,CHS,CHS2,CQS2,CPM,PBLH,RMOL, &
  213. ZNT,UST,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  214. XLAND,HFX,QFX,TSK, &
  215. U10,V10,TH2,T2,Q2,FLHC,FLQC,QGH, &
  216. QSFC,LH,GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  217. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  218. KARMAN,EOMEG,STBOLT, &
  219. P1000mb, &
  220. ids,ide, jds,jde, kds,kde, &
  221. ims,ime, jms,jme, kms,kme, &
  222. its,ite, jts,jte, kts,kte, &
  223. isftcflx, iz0tlnd, scm_force_flux, &
  224. ustm,ck,cka,cd,cda )
  225. !-------------------------------------------------------------------
  226. IMPLICIT NONE
  227. !-------------------------------------------------------------------
  228. REAL, PARAMETER :: XKA=2.4E-5
  229. REAL, PARAMETER :: PRT=1.
  230. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  231. ims,ime, jms,jme, kms,kme, &
  232. its,ite, jts,jte, kts,kte, &
  233. J
  234. !
  235. INTEGER, INTENT(IN ) :: ISFFLX
  236. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  237. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  238. REAL, INTENT(IN ) :: P1000mb
  239. !
  240. REAL, DIMENSION( ims:ime ) , &
  241. INTENT(IN ) :: MAVAIL, &
  242. PBLH, &
  243. XLAND, &
  244. TSK
  245. !
  246. REAL, DIMENSION( ims:ime ) , &
  247. INTENT(IN ) :: PSFCPA
  248. REAL, DIMENSION( ims:ime ) , &
  249. INTENT(INOUT) :: REGIME, &
  250. HFX, &
  251. QFX, &
  252. MOL,RMOL
  253. !m the following 5 are changed to memory size---
  254. !
  255. REAL, DIMENSION( ims:ime ) , &
  256. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  257. PSIM,PSIH
  258. REAL, DIMENSION( ims:ime ) , &
  259. INTENT(INOUT) :: ZNT, &
  260. ZOL, &
  261. UST, &
  262. CPM, &
  263. CHS2, &
  264. CQS2, &
  265. CHS
  266. REAL, DIMENSION( ims:ime ) , &
  267. INTENT(INOUT) :: FLHC,FLQC
  268. REAL, DIMENSION( ims:ime ) , &
  269. INTENT(INOUT) :: &
  270. QGH
  271. REAL, DIMENSION( ims:ime ) , &
  272. INTENT(OUT) :: U10,V10, &
  273. TH2,T2,Q2,QSFC,LH
  274. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  275. ! MODULE-LOCAL VARIABLES, DEFINED IN SUBROUTINE SFCLAY
  276. REAL, DIMENSION( its:ite ), INTENT(IN ) :: dz8w1d
  277. REAL, DIMENSION( its:ite ), INTENT(IN ) :: UX, &
  278. VX, &
  279. QV1D, &
  280. P1D, &
  281. T1D
  282. REAL, OPTIONAL, DIMENSION( ims:ime ) , &
  283. INTENT(OUT) :: ck,cka,cd,cda,ustm
  284. INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX, IZ0TLND
  285. INTEGER, OPTIONAL, INTENT(IN ) :: SCM_FORCE_FLUX
  286. ! LOCAL VARS
  287. REAL, DIMENSION( its:ite ) :: ZA, &
  288. THVX,ZQKL, &
  289. ZQKLP1, &
  290. THX,QX, &
  291. PSIH2, &
  292. PSIM2, &
  293. PSIH10, &
  294. PSIM10, &
  295. DENOMQ, &
  296. DENOMQ2, &
  297. DENOMT2, &
  298. WSPDI, &
  299. GZ2OZ0, &
  300. GZ10OZ0
  301. !
  302. REAL, DIMENSION( its:ite ) :: &
  303. RHOX,GOVRTH, &
  304. TGDSA
  305. !
  306. REAL, DIMENSION( its:ite) :: SCR3,SCR4
  307. REAL, DIMENSION( its:ite ) :: THGB, PSFC
  308. !
  309. INTEGER :: KL
  310. INTEGER :: N,I,K,KK,L,NZOL,NK,NZOL2,NZOL10
  311. REAL :: PL,THCON,TVCON,E1
  312. REAL :: ZL,TSKV,DTHVDZ,DTHVM,VCONV,RZOL,RZOL2,RZOL10,ZOL2,ZOL10
  313. REAL :: DTG,PSIX,DTTHX,PSIX10,PSIT,PSIT2,PSIQ,PSIQ2,PSIQ10
  314. REAL :: FLUXC,VSGD,Z0Q,VISC,RESTAR,CZIL,RESTAR2
  315. !-------------------------------------------------------------------
  316. KL=kte
  317. DO i=its,ite
  318. ! PSFC cb
  319. PSFC(I)=PSFCPA(I)/1000.
  320. ENDDO
  321. !
  322. !----CONVERT GROUND TEMPERATURE TO POTENTIAL TEMPERATURE:
  323. !
  324. DO 5 I=its,ite
  325. TGDSA(I)=TSK(I)
  326. ! PSFC cb
  327. ! THGB(I)=TSK(I)*(100./PSFC(I))**ROVCP
  328. THGB(I)=TSK(I)*(P1000mb/PSFCPA(I))**ROVCP
  329. 5 CONTINUE
  330. !
  331. !-----DECOUPLE FLUX-FORM VARIABLES TO GIVE U,V,T,THETA,THETA-VIR.,
  332. ! T-VIR., QV, AND QC AT CROSS POINTS AND AT KTAU-1.
  333. !
  334. ! *** NOTE ***
  335. ! THE BOUNDARY WINDS MAY NOT BE ADEQUATELY AFFECTED BY FRICTION,
  336. ! SO USE ONLY INTERIOR VALUES OF UX AND VX TO CALCULATE
  337. ! TENDENCIES.
  338. !
  339. 10 CONTINUE
  340. ! DO 24 I=its,ite
  341. ! UX(I)=U1D(I)
  342. ! VX(I)=V1D(I)
  343. ! 24 CONTINUE
  344. 26 CONTINUE
  345. !.....SCR3(I,K) STORE TEMPERATURE,
  346. ! SCR4(I,K) STORE VIRTUAL TEMPERATURE.
  347. DO 30 I=its,ite
  348. ! PL cb
  349. PL=P1D(I)/1000.
  350. SCR3(I)=T1D(I)
  351. ! THCON=(100./PL)**ROVCP
  352. THCON=(P1000mb*0.001/PL)**ROVCP
  353. THX(I)=SCR3(I)*THCON
  354. SCR4(I)=SCR3(I)
  355. THVX(I)=THX(I)
  356. QX(I)=0.
  357. 30 CONTINUE
  358. !
  359. DO I=its,ite
  360. QGH(I)=0.
  361. FLHC(I)=0.
  362. FLQC(I)=0.
  363. CPM(I)=CP
  364. ENDDO
  365. !
  366. ! IF(IDRY.EQ.1)GOTO 80
  367. DO 50 I=its,ite
  368. QX(I)=QV1D(I)
  369. TVCON=(1.+EP1*QX(I))
  370. THVX(I)=THX(I)*TVCON
  371. SCR4(I)=SCR3(I)*TVCON
  372. 50 CONTINUE
  373. !
  374. DO 60 I=its,ite
  375. E1=SVP1*EXP(SVP2*(TGDSA(I)-SVPT0)/(TGDSA(I)-SVP3))
  376. ! for land points QSFC can come from previous time step
  377. if(xland(i).gt.1.5.or.qsfc(i).le.0.0)QSFC(I)=EP2*E1/(PSFC(I)-E1)
  378. ! QGH CHANGED TO USE LOWEST-LEVEL AIR TEMP CONSISTENT WITH MYJSFC CHANGE
  379. ! Q2SAT = QGH IN LSM
  380. E1=SVP1*EXP(SVP2*(T1D(I)-SVPT0)/(T1D(I)-SVP3))
  381. PL=P1D(I)/1000.
  382. QGH(I)=EP2*E1/(PL-E1)
  383. CPM(I)=CP*(1.+0.8*QX(I))
  384. 60 CONTINUE
  385. 80 CONTINUE
  386. !-----COMPUTE THE HEIGHT OF FULL- AND HALF-SIGMA LEVELS ABOVE GROUND
  387. ! LEVEL, AND THE LAYER THICKNESSES.
  388. DO 90 I=its,ite
  389. ZQKLP1(I)=0.
  390. RHOX(I)=PSFC(I)*1000./(R*SCR4(I))
  391. 90 CONTINUE
  392. !
  393. DO 110 I=its,ite
  394. ZQKL(I)=dz8w1d(I)+ZQKLP1(I)
  395. 110 CONTINUE
  396. !
  397. DO 120 I=its,ite
  398. ZA(I)=0.5*(ZQKL(I)+ZQKLP1(I))
  399. 120 CONTINUE
  400. !
  401. DO 160 I=its,ite
  402. GOVRTH(I)=G/THX(I)
  403. 160 CONTINUE
  404. !-----CALCULATE BULK RICHARDSON NO. OF SURFACE LAYER, ACCORDING TO
  405. ! AKB(1976), EQ(12).
  406. DO 260 I=its,ite
  407. GZ1OZ0(I)=ALOG(ZA(I)/ZNT(I))
  408. GZ2OZ0(I)=ALOG(2./ZNT(I))
  409. GZ10OZ0(I)=ALOG(10./ZNT(I))
  410. IF((XLAND(I)-1.5).GE.0)THEN
  411. ZL=ZNT(I)
  412. ELSE
  413. ZL=0.01
  414. ENDIF
  415. WSPD(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
  416. TSKV=THGB(I)*(1.+EP1*QSFC(I))
  417. DTHVDZ=(THVX(I)-TSKV)
  418. ! Convective velocity scale Vc and subgrid-scale velocity Vsg
  419. ! following Beljaars (1995, QJRMS) and Mahrt and Sun (1995, MWR)
  420. ! ... HONG Aug. 2001
  421. !
  422. ! VCONV = 0.25*sqrt(g/tskv*pblh(i)*dthvm)
  423. ! Use Beljaars over land, old MM5 (Wyngaard) formula over water
  424. if (xland(i).lt.1.5) then
  425. fluxc = max(hfx(i)/rhox(i)/cp &
  426. + ep1*tskv*qfx(i)/rhox(i),0.)
  427. VCONV = vconvc*(g/tgdsa(i)*pblh(i)*fluxc)**.33
  428. else
  429. IF(-DTHVDZ.GE.0)THEN
  430. DTHVM=-DTHVDZ
  431. ELSE
  432. DTHVM=0.
  433. ENDIF
  434. VCONV = 2.*SQRT(DTHVM)
  435. endif
  436. ! Mahrt and Sun low-res correction
  437. VSGD = 0.32 * (max(dx/5000.-1.,0.))**.33
  438. WSPD(I)=SQRT(WSPD(I)*WSPD(I)+VCONV*VCONV+vsgd*vsgd)
  439. WSPD(I)=AMAX1(WSPD(I),0.1)
  440. BR(I)=GOVRTH(I)*ZA(I)*DTHVDZ/(WSPD(I)*WSPD(I))
  441. ! IF PREVIOUSLY UNSTABLE, DO NOT LET INTO REGIMES 1 AND 2
  442. IF(MOL(I).LT.0.)BR(I)=AMIN1(BR(I),0.0)
  443. !jdf
  444. RMOL(I)=-GOVRTH(I)*DTHVDZ*ZA(I)*KARMAN
  445. !jdf
  446. 260 CONTINUE
  447. !
  448. !-----DIAGNOSE BASIC PARAMETERS FOR THE APPROPRIATED STABILITY CLASS:
  449. !
  450. !
  451. ! THE STABILITY CLASSES ARE DETERMINED BY BR (BULK RICHARDSON NO.)
  452. ! AND HOL (HEIGHT OF PBL/MONIN-OBUKHOV LENGTH).
  453. !
  454. ! CRITERIA FOR THE CLASSES ARE AS FOLLOWS:
  455. !
  456. ! 1. BR .GE. 0.2;
  457. ! REPRESENTS NIGHTTIME STABLE CONDITIONS (REGIME=1),
  458. !
  459. ! 2. BR .LT. 0.2 .AND. BR .GT. 0.0;
  460. ! REPRESENTS DAMPED MECHANICAL TURBULENT CONDITIONS
  461. ! (REGIME=2),
  462. !
  463. ! 3. BR .EQ. 0.0
  464. ! REPRESENTS FORCED CONVECTION CONDITIONS (REGIME=3),
  465. !
  466. ! 4. BR .LT. 0.0
  467. ! REPRESENTS FREE CONVECTION CONDITIONS (REGIME=4).
  468. !
  469. !CCCCC
  470. DO 320 I=its,ite
  471. !CCCCC
  472. !CC REMOVE REGIME 3 DEPENDENCE ON PBL HEIGHT
  473. !CC IF(BR(I).LT.0..AND.HOL(I,J).GT.1.5)GOTO 310
  474. IF(BR(I).LT.0.)GOTO 310
  475. !
  476. !-----CLASS 1; STABLE (NIGHTTIME) CONDITIONS:
  477. !
  478. IF(BR(I).LT.0.2)GOTO 270
  479. REGIME(I)=1.
  480. PSIM(I)=-10.*GZ1OZ0(I)
  481. ! LOWER LIMIT ON PSI IN STABLE CONDITIONS
  482. PSIM(I)=AMAX1(PSIM(I),-10.)
  483. PSIH(I)=PSIM(I)
  484. PSIM10(I)=10./ZA(I)*PSIM(I)
  485. PSIM10(I)=AMAX1(PSIM10(I),-10.)
  486. PSIH10(I)=PSIM10(I)
  487. PSIM2(I)=2./ZA(I)*PSIM(I)
  488. PSIM2(I)=AMAX1(PSIM2(I),-10.)
  489. PSIH2(I)=PSIM2(I)
  490. ! 1.0 over Monin-Obukhov length
  491. IF(UST(I).LT.0.01)THEN
  492. RMOL(I)=BR(I)*GZ1OZ0(I) !ZA/L
  493. ELSE
  494. RMOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I)) !ZA/L
  495. ENDIF
  496. RMOL(I)=AMIN1(RMOL(I),9.999) ! ZA/L
  497. RMOL(I) = RMOL(I)/ZA(I) !1.0/L
  498. GOTO 320
  499. !
  500. !-----CLASS 2; DAMPED MECHANICAL TURBULENCE:
  501. !
  502. 270 IF(BR(I).EQ.0.0)GOTO 280
  503. REGIME(I)=2.
  504. PSIM(I)=-5.0*BR(I)*GZ1OZ0(I)/(1.1-5.0*BR(I))
  505. ! LOWER LIMIT ON PSI IN STABLE CONDITIONS
  506. PSIM(I)=AMAX1(PSIM(I),-10.)
  507. !.....AKB(1976), EQ(16).
  508. PSIH(I)=PSIM(I)
  509. PSIM10(I)=10./ZA(I)*PSIM(I)
  510. PSIM10(I)=AMAX1(PSIM10(I),-10.)
  511. PSIH10(I)=PSIM10(I)
  512. PSIM2(I)=2./ZA(I)*PSIM(I)
  513. PSIM2(I)=AMAX1(PSIM2(I),-10.)
  514. PSIH2(I)=PSIM2(I)
  515. ! Linear form: PSIM = -0.5*ZA/L; e.g, see eqn 16 of
  516. ! Blackadar, Modeling the nocturnal boundary layer, Preprints,
  517. ! Third Symposium on Atmospheric Turbulence Diffusion and Air Quality,
  518. ! Raleigh, NC, 1976
  519. ZOL(I) = BR(I)*GZ1OZ0(I)/(1.00001-5.0*BR(I))
  520. if ( ZOL(I) .GT. 0.5 ) then ! linear form ok
  521. ! Holtslag and de Bruin, J. App. Meteor 27, 689-704, 1988;
  522. ! see also, Launiainen, Boundary-Layer Meteor 76,165-179, 1995
  523. ! Eqn (8) of Launiainen, 1995
  524. ZOL(I) = ( 1.89*GZ1OZ0(I) + 44.2 ) * BR(I)*BR(I) &
  525. + ( 1.18*GZ1OZ0(I) - 1.37 ) * BR(I)
  526. ZOL(I)=AMIN1(ZOL(I),9.999)
  527. end if
  528. ! 1.0 over Monin-Obukhov length
  529. RMOL(I)= ZOL(I)/ZA(I)
  530. GOTO 320
  531. !
  532. !-----CLASS 3; FORCED CONVECTION:
  533. !
  534. 280 REGIME(I)=3.
  535. PSIM(I)=0.0
  536. PSIH(I)=PSIM(I)
  537. PSIM10(I)=0.
  538. PSIH10(I)=PSIM10(I)
  539. PSIM2(I)=0.
  540. PSIH2(I)=PSIM2(I)
  541. IF(UST(I).LT.0.01)THEN
  542. ZOL(I)=BR(I)*GZ1OZ0(I)
  543. ELSE
  544. ZOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I))
  545. ENDIF
  546. RMOL(I) = ZOL(I)/ZA(I)
  547. GOTO 320
  548. !
  549. !-----CLASS 4; FREE CONVECTION:
  550. !
  551. 310 CONTINUE
  552. REGIME(I)=4.
  553. IF(UST(I).LT.0.01)THEN
  554. ZOL(I)=BR(I)*GZ1OZ0(I)
  555. ELSE
  556. ZOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I))
  557. ENDIF
  558. ZOL10=10./ZA(I)*ZOL(I)
  559. ZOL2=2./ZA(I)*ZOL(I)
  560. ZOL(I)=AMIN1(ZOL(I),0.)
  561. ZOL(I)=AMAX1(ZOL(I),-9.9999)
  562. ZOL10=AMIN1(ZOL10,0.)
  563. ZOL10=AMAX1(ZOL10,-9.9999)
  564. ZOL2=AMIN1(ZOL2,0.)
  565. ZOL2=AMAX1(ZOL2,-9.9999)
  566. NZOL=INT(-ZOL(I)*100.)
  567. RZOL=-ZOL(I)*100.-NZOL
  568. NZOL10=INT(-ZOL10*100.)
  569. RZOL10=-ZOL10*100.-NZOL10
  570. NZOL2=INT(-ZOL2*100.)
  571. RZOL2=-ZOL2*100.-NZOL2
  572. PSIM(I)=PSIMTB(NZOL)+RZOL*(PSIMTB(NZOL+1)-PSIMTB(NZOL))
  573. PSIH(I)=PSIHTB(NZOL)+RZOL*(PSIHTB(NZOL+1)-PSIHTB(NZOL))
  574. PSIM10(I)=PSIMTB(NZOL10)+RZOL10*(PSIMTB(NZOL10+1)-PSIMTB(NZOL10))
  575. PSIH10(I)=PSIHTB(NZOL10)+RZOL10*(PSIHTB(NZOL10+1)-PSIHTB(NZOL10))
  576. PSIM2(I)=PSIMTB(NZOL2)+RZOL2*(PSIMTB(NZOL2+1)-PSIMTB(NZOL2))
  577. PSIH2(I)=PSIHTB(NZOL2)+RZOL2*(PSIHTB(NZOL2+1)-PSIHTB(NZOL2))
  578. !---LIMIT PSIH AND PSIM IN THE CASE OF THIN LAYERS AND HIGH ROUGHNESS
  579. !--- THIS PREVENTS DENOMINATOR IN FLUXES FROM GETTING TOO SMALL
  580. ! PSIH(I)=AMIN1(PSIH(I),0.9*GZ1OZ0(I))
  581. ! PSIM(I)=AMIN1(PSIM(I),0.9*GZ1OZ0(I))
  582. PSIH(I)=AMIN1(PSIH(I),0.9*GZ1OZ0(I))
  583. PSIM(I)=AMIN1(PSIM(I),0.9*GZ1OZ0(I))
  584. PSIH2(I)=AMIN1(PSIH2(I),0.9*GZ2OZ0(I))
  585. PSIM10(I)=AMIN1(PSIM10(I),0.9*GZ10OZ0(I))
  586. ! AHW: mods to compute ck, cd
  587. PSIH10(I)=AMIN1(PSIH10(I),0.9*GZ10OZ0(I))
  588. RMOL(I) = ZOL(I)/ZA(I)
  589. 320 CONTINUE
  590. !
  591. !-----COMPUTE THE FRICTIONAL VELOCITY:
  592. ! ZA(1982) EQS(2.60),(2.61).
  593. !
  594. DO 330 I=its,ite
  595. DTG=THX(I)-THGB(I)
  596. PSIX=GZ1OZ0(I)-PSIM(I)
  597. PSIX10=GZ10OZ0(I)-PSIM10(I)
  598. ! LOWER LIMIT ADDED TO PREVENT LARGE FLHC IN SOIL MODEL
  599. ! ACTIVATES IN UNSTABLE CONDITIONS WITH THIN LAYERS OR HIGH Z0
  600. PSIT=AMAX1(GZ1OZ0(I)-PSIH(I),2.)
  601. IF((XLAND(I)-1.5).GE.0)THEN
  602. ZL=ZNT(I)
  603. ELSE
  604. ZL=0.01
  605. ENDIF
  606. PSIQ=ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-PSIH(I)
  607. PSIT2=GZ2OZ0(I)-PSIH2(I)
  608. PSIQ2=ALOG(KARMAN*UST(I)*2./XKA+2./ZL)-PSIH2(I)
  609. ! AHW: mods to compute ck, cd
  610. PSIQ10=ALOG(KARMAN*UST(I)*10./XKA+10./ZL)-PSIH10(I)
  611. IF ( PRESENT(ISFTCFLX) ) THEN
  612. IF ( ISFTCFLX.EQ.1 .AND. (XLAND(I)-1.5).GE.0. ) THEN
  613. ! v3.1
  614. ! Z0Q = 1.e-4 + 1.e-3*(MAX(0.,UST(I)-1.))**2
  615. ! hfip1
  616. ! Z0Q = 0.62*2.0E-5/UST(I) + 1.E-3*(MAX(0.,UST(I)-1.5))**2
  617. ! v3.2
  618. Z0Q = 1.e-4
  619. PSIQ=ALOG(ZA(I)/Z0Q)-PSIH(I)
  620. PSIT=PSIQ
  621. PSIQ2=ALOG(2./Z0Q)-PSIH2(I)
  622. PSIQ10=ALOG(10./Z0Q)-PSIH10(I)
  623. PSIT2=PSIQ2
  624. ENDIF
  625. IF ( ISFTCFLX.EQ.2 .AND. (XLAND(I)-1.5).GE.0. ) THEN
  626. ! AHW: Garratt formula: Calculate roughness Reynolds number
  627. ! Kinematic viscosity of air (linear approc to
  628. ! temp dependence at sea levle)
  629. VISC=(1.32+0.009*(SCR3(I)-273.15))*1.E-5
  630. !! VISC=1.5E-5
  631. RESTAR=UST(I)*ZNT(I)/VISC
  632. RESTAR2=2.48*SQRT(SQRT(RESTAR))-2.
  633. PSIT=GZ1OZ0(I)-PSIH(I)+RESTAR2
  634. PSIQ=GZ1OZ0(I)-PSIH(I)+2.28*SQRT(SQRT(RESTAR))-2.
  635. PSIT2=GZ2OZ0(I)-PSIH2(I)+RESTAR2
  636. PSIQ2=GZ2OZ0(I)-PSIH2(I)+2.28*SQRT(SQRT(RESTAR))-2.
  637. PSIQ10=GZ10OZ0(I)-PSIH(I)+2.28*SQRT(SQRT(RESTAR))-2.
  638. ENDIF
  639. ENDIF
  640. IF(PRESENT(ck) .and. PRESENT(cd) .and. PRESENT(cka) .and. PRESENT(cda)) THEN
  641. Ck(I)=(karman/psix10)*(karman/psiq10)
  642. Cd(I)=(karman/psix10)*(karman/psix10)
  643. Cka(I)=(karman/psix)*(karman/psiq)
  644. Cda(I)=(karman/psix)*(karman/psix)
  645. ENDIF
  646. IF ( PRESENT(IZ0TLND) ) THEN
  647. IF ( IZ0TLND.EQ.1 .AND. (XLAND(I)-1.5).LE.0. ) THEN
  648. ZL=ZNT(I)
  649. ! CZIL RELATED CHANGES FOR LAND
  650. VISC=(1.32+0.009*(SCR3(I)-273.15))*1.E-5
  651. RESTAR=UST(I)*ZL/VISC
  652. ! Modify CZIL according to Chen & Zhang, 2009
  653. CZIL = 10.0 ** ( -0.40 * ( ZL / 0.07 ) )
  654. PSIT=GZ1OZ0(I)-PSIH(I)+CZIL*KARMAN*SQRT(RESTAR)
  655. PSIQ=GZ1OZ0(I)-PSIH(I)+CZIL*KARMAN*SQRT(RESTAR)
  656. PSIT2=GZ2OZ0(I)-PSIH2(I)+CZIL*KARMAN*SQRT(RESTAR)
  657. PSIQ2=GZ2OZ0(I)-PSIH2(I)+CZIL*KARMAN*SQRT(RESTAR)
  658. ENDIF
  659. ENDIF
  660. ! TO PREVENT OSCILLATIONS AVERAGE WITH OLD VALUE
  661. UST(I)=0.5*UST(I)+0.5*KARMAN*WSPD(I)/PSIX
  662. ! TKE coupling: compute ust without vconv for use in tke scheme
  663. WSPDI(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
  664. IF ( PRESENT(USTM) ) THEN
  665. USTM(I)=0.5*USTM(I)+0.5*KARMAN*WSPDI(I)/PSIX
  666. ENDIF
  667. U10(I)=UX(I)*PSIX10/PSIX
  668. V10(I)=VX(I)*PSIX10/PSIX
  669. TH2(I)=THGB(I)+DTG*PSIT2/PSIT
  670. Q2(I)=QSFC(I)+(QX(I)-QSFC(I))*PSIQ2/PSIQ
  671. ! T2(I) = TH2(I)*(PSFC(I)/100.)**ROVCP
  672. T2(I) = TH2(I)*(PSFCPA(I)/P1000mb)**ROVCP
  673. ! LATER Q2 WILL BE OVERWRITTEN FOR LAND POINTS IN SURFCE
  674. ! QA2(I,J) = Q2(I)
  675. ! UA10(I,J) = U10(I)
  676. ! VA10(I,J) = V10(I)
  677. ! write(*,1002)UST(I),KARMAN*WSPD(I),PSIX,KARMAN*WSPD(I)/PSIX
  678. !
  679. IF((XLAND(I)-1.5).LT.0.)THEN
  680. UST(I)=AMAX1(UST(I),0.1)
  681. ENDIF
  682. MOL(I)=KARMAN*DTG/PSIT/PRT
  683. DENOMQ(I)=PSIQ
  684. DENOMQ2(I)=PSIQ2
  685. DENOMT2(I)=PSIT2
  686. 330 CONTINUE
  687. !
  688. 335 CONTINUE
  689. !-----COMPUTE THE SURFACE SENSIBLE AND LATENT HEAT FLUXES:
  690. IF ( PRESENT(SCM_FORCE_FLUX) ) THEN
  691. IF (SCM_FORCE_FLUX.EQ.1) GOTO 350
  692. ENDIF
  693. DO i=its,ite
  694. QFX(i)=0.
  695. HFX(i)=0.
  696. ENDDO
  697. 350 CONTINUE
  698. IF (ISFFLX.EQ.0) GOTO 410
  699. !-----OVER WATER, ALTER ROUGHNESS LENGTH (ZNT) ACCORDING TO WIND (UST).
  700. DO 360 I=its,ite
  701. IF((XLAND(I)-1.5).GE.0)THEN
  702. ZNT(I)=CZO*UST(I)*UST(I)/G+OZO
  703. ! AHW: change roughness length, and hence the drag coefficients Ck and Cd
  704. IF ( PRESENT(ISFTCFLX) ) THEN
  705. IF ( ISFTCFLX.NE.0 ) THEN
  706. ! ZNT(I)=10.*exp(-9.*UST(I)**(-.3333))
  707. ! ZNT(I)=10.*exp(-9.5*UST(I)**(-.3333))
  708. ! ZNT(I)=ZNT(I) + 0.11*1.5E-5/AMAX1(UST(I),0.01)
  709. ZNT(I)=0.011*UST(I)*UST(I)/G+OZO
  710. ZNT(I)=MIN(ZNT(I),2.85e-3)
  711. ! ZNT(I)=MAX(ZNT(I),1.27e-7)
  712. ! ZNT(I)=MAX(ZNT(I),3.50e-5)
  713. ENDIF
  714. ENDIF
  715. ZL = ZNT(I)
  716. ELSE
  717. ZL = 0.01
  718. ENDIF
  719. FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/DENOMQ(I)
  720. ! FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/( &
  721. ! ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-PSIH(I))
  722. DTTHX=ABS(THX(I)-THGB(I))
  723. IF(DTTHX.GT.1.E-5)THEN
  724. FLHC(I)=CPM(I)*RHOX(I)*UST(I)*MOL(I)/(THX(I)-THGB(I))
  725. ! write(*,1001)FLHC(I),CPM(I),RHOX(I),UST(I),MOL(I),THX(I),THGB(I),I
  726. 1001 format(f8.5,2x,f12.7,2x,f12.10,2x,f12.10,2x,f13.10,2x,f12.8,f12.8,2x,i3)
  727. ELSE
  728. FLHC(I)=0.
  729. ENDIF
  730. 360 CONTINUE
  731. !
  732. !-----COMPUTE SURFACE MOIST FLUX:
  733. !
  734. ! IF(IDRY.EQ.1)GOTO 390
  735. IF ( PRESENT(SCM_FORCE_FLUX) ) THEN
  736. IF (SCM_FORCE_FLUX.EQ.1) GOTO 405
  737. ENDIF
  738. !
  739. DO 370 I=its,ite
  740. QFX(I)=FLQC(I)*(QSFC(I)-QX(I))
  741. QFX(I)=AMAX1(QFX(I),0.)
  742. LH(I)=XLV*QFX(I)
  743. 370 CONTINUE
  744. !-----COMPUTE SURFACE HEAT FLUX:
  745. !
  746. 390 CONTINUE
  747. DO 400 I=its,ite
  748. IF(XLAND(I)-1.5.GT.0.)THEN
  749. HFX(I)=FLHC(I)*(THGB(I)-THX(I))
  750. IF ( PRESENT(ISFTCFLX) ) THEN
  751. IF ( ISFTCFLX.NE.0 ) THEN
  752. ! AHW: add dissipative heating term
  753. HFX(I)=HFX(I)+RHOX(I)*USTM(I)*USTM(I)*WSPDI(I)
  754. ENDIF
  755. ENDIF
  756. ELSEIF(XLAND(I)-1.5.LT.0.)THEN
  757. HFX(I)=FLHC(I)*(THGB(I)-THX(I))
  758. HFX(I)=AMAX1(HFX(I),-250.)
  759. ENDIF
  760. 400 CONTINUE
  761. 405 CONTINUE
  762. DO I=its,ite
  763. IF((XLAND(I)-1.5).GE.0)THEN
  764. ZL=ZNT(I)
  765. ELSE
  766. ZL=0.01
  767. ENDIF
  768. CHS(I)=UST(I)*KARMAN/DENOMQ(I)
  769. ! GZ2OZ0(I)=ALOG(2./ZNT(I))
  770. ! PSIM2(I)=-10.*GZ2OZ0(I)
  771. ! PSIM2(I)=AMAX1(PSIM2(I),-10.)
  772. ! PSIH2(I)=PSIM2(I)
  773. CQS2(I)=UST(I)*KARMAN/DENOMQ2(I)
  774. CHS2(I)=UST(I)*KARMAN/DENOMT2(I)
  775. ENDDO
  776. 410 CONTINUE
  777. !jdf
  778. ! DO I=its,ite
  779. ! IF(UST(I).GE.0.1) THEN
  780. ! RMOL(I)=RMOL(I)*(-FLHC(I))/(UST(I)*UST(I)*UST(I))
  781. ! ELSE
  782. ! RMOL(I)=RMOL(I)*(-FLHC(I))/(0.1*0.1*0.1)
  783. ! ENDIF
  784. ! ENDDO
  785. !jdf
  786. !
  787. END SUBROUTINE SFCLAY1D
  788. !====================================================================
  789. SUBROUTINE sfclayinit( allowed_to_read )
  790. LOGICAL , INTENT(IN) :: allowed_to_read
  791. INTEGER :: N
  792. REAL :: ZOLN,X,Y
  793. DO N=0,1000
  794. ZOLN=-FLOAT(N)*0.01
  795. X=(1-16.*ZOLN)**0.25
  796. PSIMTB(N)=2*ALOG(0.5*(1+X))+ALOG(0.5*(1+X*X))- &
  797. 2.*ATAN(X)+2.*ATAN(1.)
  798. Y=(1-16*ZOLN)**0.5
  799. PSIHTB(N)=2*ALOG(0.5*(1+Y))
  800. ENDDO
  801. END SUBROUTINE sfclayinit
  802. !-------------------------------------------------------------------
  803. END MODULE module_sf_sfclay