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

/wrfv2_fire/phys/module_sf_sfclayrev.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1091 lines | 624 code | 98 blank | 369 comment | 18 complexity | 5fd19da281f6a973f0b95d62160137a0 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_sf_sfclayrev
  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 SFCLAYREV(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 )
  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. ! LOCAL VARS
  166. REAL, DIMENSION( its:ite ) :: U1D, &
  167. V1D, &
  168. QV1D, &
  169. P1D, &
  170. T1D
  171. REAL, DIMENSION( its:ite ) :: dz8w1d
  172. INTEGER :: I,J
  173. DO J=jts,jte
  174. DO i=its,ite
  175. dz8w1d(I) = dz8w(i,1,j)
  176. ENDDO
  177. DO i=its,ite
  178. U1D(i) =U3D(i,1,j)
  179. V1D(i) =V3D(i,1,j)
  180. QV1D(i)=QV3D(i,1,j)
  181. P1D(i) =P3D(i,1,j)
  182. T1D(i) =T3D(i,1,j)
  183. ENDDO
  184. ! Sending array starting locations of optional variables may cause
  185. ! troubles, so we explicitly change the call.
  186. CALL SFCLAYREV1D(J,U1D,V1D,T1D,QV1D,P1D,dz8w1d, &
  187. CP,G,ROVCP,R,XLV,PSFC(ims,j),CHS(ims,j),CHS2(ims,j),&
  188. CQS2(ims,j),CPM(ims,j),PBLH(ims,j), RMOL(ims,j), &
  189. ZNT(ims,j),UST(ims,j),MAVAIL(ims,j),ZOL(ims,j), &
  190. MOL(ims,j),REGIME(ims,j),PSIM(ims,j),PSIH(ims,j), &
  191. XLAND(ims,j),HFX(ims,j),QFX(ims,j),TSK(ims,j), &
  192. U10(ims,j),V10(ims,j),TH2(ims,j),T2(ims,j), &
  193. Q2(ims,j),FLHC(ims,j),FLQC(ims,j),QGH(ims,j), &
  194. QSFC(ims,j),LH(ims,j), &
  195. GZ1OZ0(ims,j),WSPD(ims,j),BR(ims,j),ISFFLX,DX, &
  196. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
  197. P1000mb, &
  198. ids,ide, jds,jde, kds,kde, &
  199. ims,ime, jms,jme, kms,kme, &
  200. its,ite, jts,jte, kts,kte &
  201. #if ( EM_CORE == 1 )
  202. ,isftcflx,iz0tlnd, &
  203. USTM(ims,j),CK(ims,j),CKA(ims,j), &
  204. CD(ims,j),CDA(ims,j) &
  205. #endif
  206. )
  207. ENDDO
  208. END SUBROUTINE SFCLAYREV
  209. !-------------------------------------------------------------------
  210. SUBROUTINE SFCLAYREV1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
  211. CP,G,ROVCP,R,XLV,PSFCPA,CHS,CHS2,CQS2,CPM,PBLH,RMOL, &
  212. ZNT,UST,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  213. XLAND,HFX,QFX,TSK, &
  214. U10,V10,TH2,T2,Q2,FLHC,FLQC,QGH, &
  215. QSFC,LH,GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  216. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  217. KARMAN,EOMEG,STBOLT, &
  218. P1000mb, &
  219. ids,ide, jds,jde, kds,kde, &
  220. ims,ime, jms,jme, kms,kme, &
  221. its,ite, jts,jte, kts,kte, &
  222. isftcflx, iz0tlnd, &
  223. ustm,ck,cka,cd,cda )
  224. !-------------------------------------------------------------------
  225. IMPLICIT NONE
  226. !-------------------------------------------------------------------
  227. REAL, PARAMETER :: XKA=2.4E-5
  228. REAL, PARAMETER :: PRT=1.
  229. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  230. ims,ime, jms,jme, kms,kme, &
  231. its,ite, jts,jte, kts,kte, &
  232. J
  233. !
  234. INTEGER, INTENT(IN ) :: ISFFLX
  235. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  236. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  237. REAL, INTENT(IN ) :: P1000mb
  238. !
  239. REAL, DIMENSION( ims:ime ) , &
  240. INTENT(IN ) :: MAVAIL, &
  241. PBLH, &
  242. XLAND, &
  243. TSK
  244. !
  245. REAL, DIMENSION( ims:ime ) , &
  246. INTENT(IN ) :: PSFCPA
  247. REAL, DIMENSION( ims:ime ) , &
  248. INTENT(INOUT) :: REGIME, &
  249. HFX, &
  250. QFX, &
  251. MOL,RMOL
  252. !m the following 5 are changed to memory size---
  253. !
  254. REAL, DIMENSION( ims:ime ) , &
  255. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  256. PSIM,PSIH
  257. REAL, DIMENSION( ims:ime ) , &
  258. INTENT(INOUT) :: ZNT, &
  259. ZOL, &
  260. UST, &
  261. CPM, &
  262. CHS2, &
  263. CQS2, &
  264. CHS
  265. REAL, DIMENSION( ims:ime ) , &
  266. INTENT(INOUT) :: FLHC,FLQC
  267. REAL, DIMENSION( ims:ime ) , &
  268. INTENT(INOUT) :: &
  269. QGH
  270. REAL, DIMENSION( ims:ime ) , &
  271. INTENT(OUT) :: U10,V10, &
  272. TH2,T2,Q2,QSFC,LH
  273. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  274. ! MODULE-LOCAL VARIABLES, DEFINED IN SUBROUTINE SFCLAY
  275. REAL, DIMENSION( its:ite ), INTENT(IN ) :: dz8w1d
  276. REAL, DIMENSION( its:ite ), INTENT(IN ) :: UX, &
  277. VX, &
  278. QV1D, &
  279. P1D, &
  280. T1D
  281. REAL, OPTIONAL, DIMENSION( ims:ime ) , &
  282. INTENT(OUT) :: ck,cka,cd,cda,ustm
  283. INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX, IZ0TLND
  284. ! LOCAL VARS
  285. REAL, DIMENSION( its:ite ) :: ZA, &
  286. THVX,ZQKL, &
  287. ZQKLP1, &
  288. THX,QX, &
  289. PSIH2, &
  290. PSIM2, &
  291. PSIH10, &
  292. PSIM10, &
  293. DENOMQ, &
  294. DENOMQ2, &
  295. DENOMT2, &
  296. WSPDI, &
  297. GZ2OZ0, &
  298. GZ10OZ0
  299. !
  300. REAL, DIMENSION( its:ite ) :: &
  301. RHOX,GOVRTH, &
  302. TGDSA
  303. !
  304. REAL, DIMENSION( its:ite) :: SCR3,SCR4
  305. REAL, DIMENSION( its:ite ) :: THGB, PSFC
  306. !
  307. INTEGER :: KL
  308. INTEGER :: N,I,K,KK,L,NZOL,NK,NZOL2,NZOL10
  309. REAL :: PL,THCON,TVCON,E1
  310. REAL :: ZL,TSKV,DTHVDZ,DTHVM,VCONV,RZOL,RZOL2,RZOL10,ZOL2,ZOL10
  311. REAL :: DTG,PSIX,DTTHX,PSIX10,PSIT,PSIT2,PSIQ,PSIQ2,PSIQ10
  312. REAL :: FLUXC,VSGD,Z0Q,VISC,RESTAR,CZIL,RESTAR2
  313. !
  314. ! .... paj ...
  315. !
  316. REAL :: zolri,zolri2,zolzz,zol0
  317. REAL :: psih_stable,psim_stable,psih_unstable,psim_unstable
  318. REAL :: zl2,zl10,z0t
  319. REAL, DIMENSION( its:ite ) :: pq,pq2,pq10
  320. !-------------------------------------------------------------------
  321. KL=kte
  322. DO i=its,ite
  323. ! PSFC cb
  324. PSFC(I)=PSFCPA(I)/1000.
  325. ENDDO
  326. !
  327. !----CONVERT GROUND TEMPERATURE TO POTENTIAL TEMPERATURE:
  328. !
  329. DO 5 I=its,ite
  330. TGDSA(I)=TSK(I)
  331. ! PSFC cb
  332. ! THGB(I)=TSK(I)*(100./PSFC(I))**ROVCP
  333. THGB(I)=TSK(I)*(P1000mb/PSFCPA(I))**ROVCP
  334. 5 CONTINUE
  335. !
  336. !-----DECOUPLE FLUX-FORM VARIABLES TO GIVE U,V,T,THETA,THETA-VIR.,
  337. ! T-VIR., QV, AND QC AT CROSS POINTS AND AT KTAU-1.
  338. !
  339. ! *** NOTE ***
  340. ! THE BOUNDARY WINDS MAY NOT BE ADEQUATELY AFFECTED BY FRICTION,
  341. ! SO USE ONLY INTERIOR VALUES OF UX AND VX TO CALCULATE
  342. ! TENDENCIES.
  343. !
  344. 10 CONTINUE
  345. ! DO 24 I=its,ite
  346. ! UX(I)=U1D(I)
  347. ! VX(I)=V1D(I)
  348. ! 24 CONTINUE
  349. 26 CONTINUE
  350. !.....SCR3(I,K) STORE TEMPERATURE,
  351. ! SCR4(I,K) STORE VIRTUAL TEMPERATURE.
  352. DO 30 I=its,ite
  353. ! PL cb
  354. PL=P1D(I)/1000.
  355. SCR3(I)=T1D(I)
  356. ! THCON=(100./PL)**ROVCP
  357. THCON=(P1000mb*0.001/PL)**ROVCP
  358. THX(I)=SCR3(I)*THCON
  359. SCR4(I)=SCR3(I)
  360. THVX(I)=THX(I)
  361. QX(I)=0.
  362. 30 CONTINUE
  363. !
  364. DO I=its,ite
  365. QGH(I)=0.
  366. FLHC(I)=0.
  367. FLQC(I)=0.
  368. CPM(I)=CP
  369. ENDDO
  370. !
  371. ! IF(IDRY.EQ.1)GOTO 80
  372. DO 50 I=its,ite
  373. QX(I)=QV1D(I)
  374. TVCON=(1.+EP1*QX(I))
  375. THVX(I)=THX(I)*TVCON
  376. SCR4(I)=SCR3(I)*TVCON
  377. 50 CONTINUE
  378. !
  379. DO 60 I=its,ite
  380. E1=SVP1*EXP(SVP2*(TGDSA(I)-SVPT0)/(TGDSA(I)-SVP3))
  381. ! for land points QSFC can come from previous time step
  382. if(xland(i).gt.1.5.or.qsfc(i).le.0.0)QSFC(I)=EP2*E1/(PSFC(I)-E1)
  383. ! QGH CHANGED TO USE LOWEST-LEVEL AIR TEMP CONSISTENT WITH MYJSFC CHANGE
  384. ! Q2SAT = QGH IN LSM
  385. E1=SVP1*EXP(SVP2*(T1D(I)-SVPT0)/(T1D(I)-SVP3))
  386. PL=P1D(I)/1000.
  387. QGH(I)=EP2*E1/(PL-E1)
  388. CPM(I)=CP*(1.+0.8*QX(I))
  389. 60 CONTINUE
  390. 80 CONTINUE
  391. !-----COMPUTE THE HEIGHT OF FULL- AND HALF-SIGMA LEVELS ABOVE GROUND
  392. ! LEVEL, AND THE LAYER THICKNESSES.
  393. DO 90 I=its,ite
  394. ZQKLP1(I)=0.
  395. RHOX(I)=PSFC(I)*1000./(R*SCR4(I))
  396. 90 CONTINUE
  397. !
  398. DO 110 I=its,ite
  399. ZQKL(I)=dz8w1d(I)+ZQKLP1(I)
  400. 110 CONTINUE
  401. !
  402. DO 120 I=its,ite
  403. ZA(I)=0.5*(ZQKL(I)+ZQKLP1(I))
  404. 120 CONTINUE
  405. !
  406. DO 160 I=its,ite
  407. GOVRTH(I)=G/THX(I)
  408. 160 CONTINUE
  409. !-----CALCULATE BULK RICHARDSON NO. OF SURFACE LAYER, ACCORDING TO
  410. ! AKB(1976), EQ(12).
  411. DO 260 I=its,ite
  412. GZ1OZ0(I)=ALOG((ZA(I)+ZNT(I))/ZNT(I)) ! log((z+z0)/z0)
  413. GZ2OZ0(I)=ALOG((2.+ZNT(I))/ZNT(I)) ! log((2+z0)/z0)
  414. GZ10OZ0(I)=ALOG((10.+ZNT(I))/ZNT(I)) ! log((10+z0)z0)
  415. IF((XLAND(I)-1.5).GE.0)THEN
  416. ZL=ZNT(I)
  417. ELSE
  418. ZL=0.01
  419. ENDIF
  420. WSPD(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
  421. TSKV=THGB(I)*(1.+EP1*QSFC(I))
  422. DTHVDZ=(THVX(I)-TSKV)
  423. ! Convective velocity scale Vc and subgrid-scale velocity Vsg
  424. ! following Beljaars (1995, QJRMS) and Mahrt and Sun (1995, MWR)
  425. ! ... HONG Aug. 2001
  426. !
  427. ! VCONV = 0.25*sqrt(g/tskv*pblh(i)*dthvm)
  428. ! Use Beljaars over land, old MM5 (Wyngaard) formula over water
  429. if (xland(i).lt.1.5) then
  430. fluxc = max(hfx(i)/rhox(i)/cp &
  431. + ep1*tskv*qfx(i)/rhox(i),0.)
  432. VCONV = vconvc*(g/tgdsa(i)*pblh(i)*fluxc)**.33
  433. else
  434. IF(-DTHVDZ.GE.0)THEN
  435. DTHVM=-DTHVDZ
  436. ELSE
  437. DTHVM=0.
  438. ENDIF
  439. VCONV = 2.*SQRT(DTHVM)
  440. endif
  441. ! Mahrt and Sun low-res correction
  442. VSGD = 0.32 * (max(dx/5000.-1.,0.))**.33
  443. WSPD(I)=SQRT(WSPD(I)*WSPD(I)+VCONV*VCONV+vsgd*vsgd)
  444. WSPD(I)=AMAX1(WSPD(I),0.1)
  445. BR(I)=GOVRTH(I)*ZA(I)*DTHVDZ/(WSPD(I)*WSPD(I))
  446. ! IF PREVIOUSLY UNSTABLE, DO NOT LET INTO REGIMES 1 AND 2
  447. IF(MOL(I).LT.0.)BR(I)=AMIN1(BR(I),0.0)
  448. !jdf
  449. RMOL(I)=-GOVRTH(I)*DTHVDZ*ZA(I)*KARMAN
  450. !jdf
  451. 260 CONTINUE
  452. !
  453. !-----DIAGNOSE BASIC PARAMETERS FOR THE APPROPRIATED STABILITY CLASS:
  454. !
  455. !
  456. ! THE STABILITY CLASSES ARE DETERMINED BY BR (BULK RICHARDSON NO.)
  457. ! AND HOL (HEIGHT OF PBL/MONIN-OBUKHOV LENGTH).
  458. !
  459. ! CRITERIA FOR THE CLASSES ARE AS FOLLOWS:
  460. !
  461. ! 1. BR .GE. 0.0;
  462. ! REPRESENTS NIGHTTIME STABLE CONDITIONS (REGIME=1),
  463. !
  464. ! 3. BR .EQ. 0.0
  465. ! REPRESENTS FORCED CONVECTION CONDITIONS (REGIME=3),
  466. !
  467. ! 4. BR .LT. 0.0
  468. ! REPRESENTS FREE CONVECTION CONDITIONS (REGIME=4).
  469. !
  470. !CCCCC
  471. DO 320 I=its,ite
  472. !
  473. if (br(I).gt.0) then
  474. if (br(I).gt.250.0) then
  475. zol(I)=zolri(250.0,ZA(I),ZNT(I))
  476. else
  477. zol(I)=zolri(br(I),ZA(I),ZNT(I))
  478. endif
  479. endif
  480. !
  481. if (br(I).lt.0) then
  482. IF(UST(I).LT.0.001)THEN
  483. ZOL(I)=BR(I)*GZ1OZ0(I)
  484. ELSE
  485. if (br(I).lt.-250.0) then
  486. zol(I)=zolri(-250.0,ZA(I),ZNT(I))
  487. else
  488. zol(I)=zolri(br(I),ZA(I),ZNT(I))
  489. endif
  490. ENDIF
  491. endif
  492. !
  493. ! ... paj: compute integrated similarity functions.
  494. !
  495. zolzz=zol(I)*(za(I)+znt(I))/za(I) ! (z+z0/L
  496. zol10=zol(I)*(10.+znt(I))/za(I) ! (10+z0)/L
  497. zol2=zol(I)*(2.+znt(I))/za(I) ! (2+z0)/L
  498. zol0=zol(I)*znt(I)/za(I) ! z0/L
  499. ZL2=(2.)/ZA(I)*ZOL(I) ! 2/L
  500. ZL10=(10.)/ZA(I)*ZOL(I) ! 10/L
  501. IF((XLAND(I)-1.5).LT.0.)THEN
  502. ZL=(0.01)/ZA(I)*ZOL(I) ! (0.01)/L
  503. ELSE
  504. ZL=ZOL0 ! z0/L
  505. ENDIF
  506. IF(BR(I).LT.0.)GOTO 310 ! go to unstable regime (class 4)
  507. IF(BR(I).EQ.0.)GOTO 280 ! go to neutral regime (class 3)
  508. !
  509. !-----CLASS 1; STABLE (NIGHTTIME) CONDITIONS:
  510. !
  511. REGIME(I)=1.
  512. !
  513. ! ... paj: psim and psih. Follows Cheng and Brutsaert 2005 (CB05).
  514. !
  515. psim(I)=psim_stable(zolzz)-psim_stable(zol0)
  516. psih(I)=psih_stable(zolzz)-psih_stable(zol0)
  517. !
  518. psim10(I)=psim_stable(zol10)-psim_stable(zol0)
  519. psih10(I)=psih_stable(zol10)-psih_stable(zol0)
  520. !
  521. psim2(I)=psim_stable(zol2)-psim_stable(zol0)
  522. psih2(I)=psih_stable(zol2)-psih_stable(zol0)
  523. !
  524. ! ... paj: preparations to compute PSIQ. Follows CB05+Carlson Boland JAM 1978.
  525. !
  526. pq(I)=psih_stable(zol(I))-psih_stable(zl)
  527. pq2(I)=psih_stable(zl2)-psih_stable(zl)
  528. pq10(I)=psih_stable(zl10)-psih_stable(zl)
  529. !
  530. ! 1.0 over Monin-Obukhov length
  531. RMOL(I)=ZOL(I)/ZA(I)
  532. !
  533. GOTO 320
  534. !
  535. !-----CLASS 3; FORCED CONVECTION:
  536. !
  537. 280 REGIME(I)=3.
  538. PSIM(I)=0.0
  539. PSIH(I)=PSIM(I)
  540. PSIM10(I)=0.
  541. PSIH10(I)=PSIM10(I)
  542. PSIM2(I)=0.
  543. PSIH2(I)=PSIM2(I)
  544. !
  545. ! paj: preparations to compute PSIQ.
  546. !
  547. pq(I)=PSIH(I)
  548. pq2(I)=PSIH2(I)
  549. pq10(I)=0.
  550. !
  551. ZOL(I)=0.
  552. RMOL(I) = ZOL(I)/ZA(I)
  553. GOTO 320
  554. !
  555. !-----CLASS 4; FREE CONVECTION:
  556. !
  557. 310 CONTINUE
  558. REGIME(I)=4.
  559. !
  560. ! ... paj: PSIM and PSIH ...
  561. !
  562. psim(I)=psim_unstable(zolzz)-psim_unstable(zol0)
  563. psih(I)=psih_unstable(zolzz)-psih_unstable(zol0)
  564. !
  565. psim10(I)=psim_unstable(zol10)-psim_unstable(zol0)
  566. psih10(I)=psih_unstable(zol10)-psih_unstable(zol0)
  567. !
  568. psim2(I)=psim_unstable(zol2)-psim_unstable(zol0)
  569. psih2(I)=psih_unstable(zol2)-psih_unstable(zol0)
  570. !
  571. ! ... paj: preparations to compute PSIQ
  572. !
  573. pq(I)=psih_unstable(zol(I))-psih_unstable(zl)
  574. pq2(I)=psih_unstable(zl2)-psih_unstable(zl)
  575. pq10(I)=psih_unstable(zl10)-psih_unstable(zl)
  576. !
  577. !---LIMIOT PSIH AND PSIM IN THE CASE OF THIN LAYERS AND HIGH ROUGHNESS
  578. !--- THIS PREVENTS DENOMINATOR IN FLUXES FROM GETTING TOO SMALL
  579. PSIH(I)=AMIN1(PSIH(I),0.9*GZ1OZ0(I))
  580. PSIM(I)=AMIN1(PSIM(I),0.9*GZ1OZ0(I))
  581. PSIH2(I)=AMIN1(PSIH2(I),0.9*GZ2OZ0(I))
  582. PSIM10(I)=AMIN1(PSIM10(I),0.9*GZ10OZ0(I))
  583. !
  584. ! AHW: mods to compute ck, cd
  585. PSIH10(I)=AMIN1(PSIH10(I),0.9*GZ10OZ0(I))
  586. RMOL(I) = ZOL(I)/ZA(I)
  587. 320 CONTINUE
  588. !
  589. !-----COMPUTE THE FRICTIONAL VELOCITY:
  590. ! ZA(1982) EQS(2.60),(2.61).
  591. !
  592. DO 330 I=its,ite
  593. DTG=THX(I)-THGB(I)
  594. PSIX=GZ1OZ0(I)-PSIM(I)
  595. PSIX10=GZ10OZ0(I)-PSIM10(I)
  596. ! LOWER LIMIT ADDED TO PREVENT LARGE FLHC IN SOIL MODEL
  597. ! ACTIVATES IN UNSTABLE CONDITIONS WITH THIN LAYERS OR HIGH Z0
  598. ! PSIT=AMAX1(GZ1OZ0(I)-PSIH(I),2.)
  599. PSIT=GZ1OZ0(I)-PSIH(I)
  600. PSIT2=GZ2OZ0(I)-PSIH2(I)
  601. !
  602. IF((XLAND(I)-1.5).GE.0)THEN
  603. ZL=ZNT(I)
  604. ELSE
  605. ZL=0.01
  606. ENDIF
  607. !
  608. PSIQ=ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-pq(I)
  609. PSIQ2=ALOG(KARMAN*UST(I)*2./XKA+2./ZL)-pq2(I)
  610. ! AHW: mods to compute ck, cd
  611. PSIQ10=ALOG(KARMAN*UST(I)*10./XKA+10./ZL)-pq10(I)
  612. IF ( PRESENT(ISFTCFLX) ) THEN
  613. IF ( ISFTCFLX.EQ.1 .AND. (XLAND(I)-1.5).GE.0. ) THEN
  614. ! v3.1
  615. ! Z0Q = 1.e-4 + 1.e-3*(MAX(0.,UST(I)-1.))**2
  616. ! hfip1
  617. ! Z0Q = 0.62*2.0E-5/UST(I) + 1.E-3*(MAX(0.,UST(I)-1.5))**2
  618. ! v3.2
  619. Z0Q = 1.e-4
  620. !
  621. ! ... paj: recompute psih for z0q
  622. !
  623. zolzz=zol(I)*(za(I)+z0q)/za(I) ! (z+z0q)/L
  624. zol10=zol(I)*(10.+z0q)/za(I) ! (10+z0q)/L
  625. zol2=zol(I)*(2.+z0q)/za(I) ! (2+z0q)/L
  626. zol0=zol(I)*z0q/za(I) ! z0q/L
  627. !
  628. if (zol(I).gt.0.) then
  629. psih(I)=psih_stable(zolzz)-psih_stable(zol0)
  630. psih10(I)=psih_stable(zol10)-psih_stable(zol0)
  631. psih2(I)=psih_stable(zol2)-psih_stable(zol0)
  632. else
  633. if (zol(I).eq.0) then
  634. psih(I)=0.
  635. psih10(I)=0.
  636. psih2(I)=0.
  637. else
  638. psih(I)=psih_unstable(zolzz)-psih_unstable(zol0)
  639. psih10(I)=psih_unstable(zol10)-psih_unstable(zol0)
  640. psih2(I)=psih_unstable(zol2)-psih_unstable(zol0)
  641. endif
  642. endif
  643. !
  644. PSIQ=ALOG((ZA(I)+z0q)/Z0Q)-PSIH(I)
  645. PSIT=PSIQ
  646. PSIQ2=ALOG((2.+z0q)/Z0Q)-PSIH2(I)
  647. PSIQ10=ALOG((10.+z0q)/Z0Q)-PSIH10(I)
  648. PSIT2=PSIQ2
  649. ENDIF
  650. IF ( ISFTCFLX.EQ.2 .AND. (XLAND(I)-1.5).GE.0. ) THEN
  651. ! AHW: Garratt formula: Calculate roughness Reynolds number
  652. ! Kinematic viscosity of air (linear approc to
  653. ! temp dependence at sea levle)
  654. VISC=(1.32+0.009*(SCR3(I)-273.15))*1.E-5
  655. !! VISC=1.5E-5
  656. RESTAR=UST(I)*ZNT(I)/VISC
  657. RESTAR2=2.48*SQRT(SQRT(RESTAR))-2.
  658. !
  659. ! ... paj: compute psih for z0t for temperature ...
  660. !
  661. z0t=znt(I)/exp(RESTAR2)
  662. !
  663. zolzz=zol(I)*(za(I)+z0t)/za(I) ! (z+z0t)/L
  664. zol10=zol(I)*(10.+z0t)/za(I) ! (10+z0t)/L
  665. zol2=zol(I)*(2.+z0t)/za(I) ! (2+z0t)/L
  666. zol0=zol(I)*z0t/za(I) ! z0t/L
  667. !
  668. if (zol(I).gt.0.) then
  669. psih(I)=psih_stable(zolzz)-psih_stable(zol0)
  670. psih10(I)=psih_stable(zol10)-psih_stable(zol0)
  671. psih2(I)=psih_stable(zol2)-psih_stable(zol0)
  672. else
  673. if (zol(I).eq.0) then
  674. psih(I)=0.
  675. psih10(I)=0.
  676. psih2(I)=0.
  677. else
  678. psih(I)=psih_unstable(zolzz)-psih_unstable(zol0)
  679. psih10(I)=psih_unstable(zol10)-psih_unstable(zol0)
  680. psih2(I)=psih_unstable(zol2)-psih_unstable(zol0)
  681. endif
  682. endif
  683. !
  684. ! PSIT=GZ1OZ0(I)-PSIH(I)+RESTAR2
  685. ! PSIT2=GZ2OZ0(I)-PSIH2(I)+RESTAR2
  686. PSIT=ALOG((ZA(I)+z0t)/Z0t)-PSIH(I)
  687. PSIT2=ALOG((2.+z0t)/Z0t)-PSIH2(I)
  688. !
  689. z0t=znt(I)/exp(2.28*SQRT(SQRT(RESTAR))-2.)
  690. !
  691. zolzz=zol(I)*(za(I)+z0t)/za(I) ! (z+z0t)/L
  692. zol10=zol(I)*(10.+z0t)/za(I) ! (10+z0t)/L
  693. zol2=zol(I)*(2.+z0t)/za(I) ! (2+z0t)/L
  694. zol0=zol(I)*z0t/za(I) ! z0t/L
  695. !
  696. if (zol(I).gt.0.) then
  697. psih(I)=psih_stable(zolzz)-psih_stable(zol0)
  698. psih10(I)=psih_stable(zol10)-psih_stable(zol0)
  699. psih2(I)=psih_stable(zol2)-psih_stable(zol0)
  700. else
  701. if (zol(I).eq.0) then
  702. psih(I)=0.
  703. psih10(I)=0.
  704. psih2(I)=0.
  705. else
  706. psih(I)=psih_unstable(zolzz)-psih_unstable(zol0)
  707. psih10(I)=psih_unstable(zol10)-psih_unstable(zol0)
  708. psih2(I)=psih_unstable(zol2)-psih_unstable(zol0)
  709. endif
  710. endif
  711. !
  712. PSIQ=ALOG((ZA(I)+z0t)/Z0t)-PSIH(I)
  713. PSIQ2=ALOG((2.+z0t)/Z0t)-PSIH2(I)
  714. PSIQ10=ALOG((10.+z0t)/Z0t)-PSIH10(I)
  715. ! PSIQ=GZ1OZ0(I)-PSIH(I)+2.28*SQRT(SQRT(RESTAR))-2.
  716. ! PSIQ2=GZ2OZ0(I)-PSIH2(I)+2.28*SQRT(SQRT(RESTAR))-2.
  717. ! PSIQ10=GZ10OZ0(I)-PSIH(I)+2.28*SQRT(SQRT(RESTAR))-2.
  718. ENDIF
  719. ENDIF
  720. IF(PRESENT(ck) .and. PRESENT(cd) .and. PRESENT(cka) .and. PRESENT(cda)) THEN
  721. Ck(I)=(karman/psix10)*(karman/psiq10)
  722. Cd(I)=(karman/psix10)*(karman/psix10)
  723. Cka(I)=(karman/psix)*(karman/psiq)
  724. Cda(I)=(karman/psix)*(karman/psix)
  725. ENDIF
  726. IF ( PRESENT(IZ0TLND) ) THEN
  727. IF ( IZ0TLND.EQ.1 .AND. (XLAND(I)-1.5).LE.0. ) THEN
  728. ZL=ZNT(I)
  729. ! CZIL RELATED CHANGES FOR LAND
  730. VISC=(1.32+0.009*(SCR3(I)-273.15))*1.E-5
  731. RESTAR=UST(I)*ZL/VISC
  732. ! Modify CZIL according to Chen & Zhang, 2009
  733. CZIL = 10.0 ** ( -0.40 * ( ZL / 0.07 ) )
  734. !
  735. ! ... paj: compute phish for z0t over land
  736. !
  737. z0t=znt(I)/exp(CZIL*KARMAN*SQRT(RESTAR))
  738. !
  739. zolzz=zol(I)*(za(I)+z0t)/za(I) ! (z+z0t)/L
  740. zol10=zol(I)*(10.+z0t)/za(I) ! (10+z0t)/L
  741. zol2=zol(I)*(2.+z0t)/za(I) ! (2+z0t)/L
  742. zol0=zol(I)*z0t/za(I) ! z0t/L
  743. !
  744. if (zol(I).gt.0.) then
  745. psih(I)=psih_stable(zolzz)-psih_stable(zol0)
  746. psih10(I)=psih_stable(zol10)-psih_stable(zol0)
  747. psih2(I)=psih_stable(zol2)-psih_stable(zol0)
  748. else
  749. if (zol(I).eq.0) then
  750. psih(I)=0.
  751. psih10(I)=0.
  752. psih2(I)=0.
  753. else
  754. psih(I)=psih_unstable(zolzz)-psih_unstable(zol0)
  755. psih10(I)=psih_unstable(zol10)-psih_unstable(zol0)
  756. psih2(I)=psih_unstable(zol2)-psih_unstable(zol0)
  757. endif
  758. endif
  759. !
  760. PSIQ=ALOG((ZA(I)+z0t)/Z0t)-PSIH(I)
  761. PSIQ2=ALOG((2.+z0t)/Z0t)-PSIH2(I)
  762. PSIT=PSIQ
  763. PSIT2=PSIQ2
  764. !
  765. ! PSIT=GZ1OZ0(I)-PSIH(I)+CZIL*KARMAN*SQRT(RESTAR)
  766. ! PSIQ=GZ1OZ0(I)-PSIH(I)+CZIL*KARMAN*SQRT(RESTAR)
  767. ! PSIT2=GZ2OZ0(I)-PSIH2(I)+CZIL*KARMAN*SQRT(RESTAR)
  768. ! PSIQ2=GZ2OZ0(I)-PSIH2(I)+CZIL*KARMAN*SQRT(RESTAR)
  769. ENDIF
  770. ENDIF
  771. ! TO PREVENT OSCILLATIONS AVERAGE WITH OLD VALUE
  772. UST(I)=0.5*UST(I)+0.5*KARMAN*WSPD(I)/PSIX
  773. ! TKE coupling: compute ust without vconv for use in tke scheme
  774. WSPDI(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
  775. IF ( PRESENT(USTM) ) THEN
  776. USTM(I)=0.5*USTM(I)+0.5*KARMAN*WSPDI(I)/PSIX
  777. ENDIF
  778. U10(I)=UX(I)*PSIX10/PSIX
  779. V10(I)=VX(I)*PSIX10/PSIX
  780. TH2(I)=THGB(I)+DTG*PSIT2/PSIT
  781. Q2(I)=QSFC(I)+(QX(I)-QSFC(I))*PSIQ2/PSIQ
  782. T2(I) = TH2(I)*(PSFCPA(I)/P1000mb)**ROVCP
  783. !
  784. IF((XLAND(I)-1.5).LT.0.)THEN
  785. UST(I)=AMAX1(UST(I),0.001)
  786. ENDIF
  787. MOL(I)=KARMAN*DTG/PSIT/PRT
  788. DENOMQ(I)=PSIQ
  789. DENOMQ2(I)=PSIQ2
  790. DENOMT2(I)=PSIT2
  791. 330 CONTINUE
  792. !
  793. 335 CONTINUE
  794. !-----COMPUTE THE SURFACE SENSIBLE AND LATENT HEAT FLUXES:
  795. DO i=its,ite
  796. QFX(i)=0.
  797. HFX(i)=0.
  798. ENDDO
  799. IF (ISFFLX.EQ.0) GOTO 410
  800. !-----OVER WATER, ALTER ROUGHNESS LENGTH (ZNT) ACCORDING TO WIND (UST).
  801. DO 360 I=its,ite
  802. IF((XLAND(I)-1.5).GE.0)THEN
  803. ZNT(I)=CZO*UST(I)*UST(I)/G+OZO
  804. ! AHW: change roughness length, and hence the drag coefficients Ck and Cd
  805. IF ( PRESENT(ISFTCFLX) ) THEN
  806. IF ( ISFTCFLX.NE.0 ) THEN
  807. ! ZNT(I)=10.*exp(-9.*UST(I)**(-.3333))
  808. ZNT(I)=10.*exp(-9.5*UST(I)**(-.3333))
  809. ZNT(I)=ZNT(I) + 0.11*1.5E-5/AMAX1(UST(I),0.01)
  810. ZNT(I)=MIN(ZNT(I),2.85e-3)
  811. ZNT(I)=MAX(ZNT(I),1.27e-7)
  812. ENDIF
  813. ENDIF
  814. ZL = ZNT(I)
  815. ELSE
  816. ZL = 0.01
  817. ENDIF
  818. FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/DENOMQ(I)
  819. ! FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/( &
  820. ! ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-PSIH(I))
  821. DTTHX=ABS(THX(I)-THGB(I))
  822. IF(DTTHX.GT.1.E-5)THEN
  823. FLHC(I)=CPM(I)*RHOX(I)*UST(I)*MOL(I)/(THX(I)-THGB(I))
  824. ! write(*,1001)FLHC(I),CPM(I),RHOX(I),UST(I),MOL(I),THX(I),THGB(I),I
  825. 1001 format(f8.5,2x,f12.7,2x,f12.10,2x,f12.10,2x,f13.10,2x,f12.8,f12.8,2x,i3)
  826. ELSE
  827. FLHC(I)=0.
  828. ENDIF
  829. 360 CONTINUE
  830. !
  831. !-----COMPUTE SURFACE MOIST FLUX:
  832. !
  833. ! IF(IDRY.EQ.1)GOTO 390
  834. !
  835. DO 370 I=its,ite
  836. QFX(I)=FLQC(I)*(QSFC(I)-QX(I))
  837. QFX(I)=AMAX1(QFX(I),0.)
  838. LH(I)=XLV*QFX(I)
  839. 370 CONTINUE
  840. !-----COMPUTE SURFACE HEAT FLUX:
  841. !
  842. 390 CONTINUE
  843. DO 400 I=its,ite
  844. IF(XLAND(I)-1.5.GT.0.)THEN
  845. HFX(I)=FLHC(I)*(THGB(I)-THX(I))
  846. IF ( PRESENT(ISFTCFLX) ) THEN
  847. IF ( ISFTCFLX.NE.0 ) THEN
  848. ! AHW: add dissipative heating term
  849. HFX(I)=HFX(I)+RHOX(I)*USTM(I)*USTM(I)*WSPDI(I)
  850. ENDIF
  851. ENDIF
  852. ELSEIF(XLAND(I)-1.5.LT.0.)THEN
  853. HFX(I)=FLHC(I)*(THGB(I)-THX(I))
  854. HFX(I)=AMAX1(HFX(I),-250.)
  855. ENDIF
  856. 400 CONTINUE
  857. DO I=its,ite
  858. IF((XLAND(I)-1.5).GE.0)THEN
  859. ZL=ZNT(I)
  860. ELSE
  861. ZL=0.01
  862. ENDIF
  863. !v3.1.1
  864. ! CHS(I)=UST(I)*KARMAN/(ALOG(KARMAN*UST(I)*ZA(I) &
  865. ! /XKA+ZA(I)/ZL)-PSIH(I))
  866. CHS(I)=UST(I)*KARMAN/DENOMQ(I)
  867. ! GZ2OZ0(I)=ALOG(2./ZNT(I))
  868. ! PSIM2(I)=-10.*GZ2OZ0(I)
  869. ! PSIM2(I)=AMAX1(PSIM2(I),-10.)
  870. ! PSIH2(I)=PSIM2(I)
  871. ! v3.1.1
  872. ! CQS2(I)=UST(I)*KARMAN/(ALOG(KARMAN*UST(I)*2.0 &
  873. ! /XKA+2.0/ZL)-PSIH2(I))
  874. ! CHS2(I)=UST(I)*KARMAN/(GZ2OZ0(I)-PSIH2(I))
  875. CQS2(I)=UST(I)*KARMAN/DENOMQ2(I)
  876. CHS2(I)=UST(I)*KARMAN/DENOMT2(I)
  877. ENDDO
  878. 410 CONTINUE
  879. !jdf
  880. ! DO I=its,ite
  881. ! IF(UST(I).GE.0.1) THEN
  882. ! RMOL(I)=RMOL(I)*(-FLHC(I))/(UST(I)*UST(I)*UST(I))
  883. ! ELSE
  884. ! RMOL(I)=RMOL(I)*(-FLHC(I))/(0.1*0.1*0.1)
  885. ! ENDIF
  886. ! ENDDO
  887. !jdf
  888. !
  889. END SUBROUTINE SFCLAYREV1D
  890. !====================================================================
  891. SUBROUTINE sfclayrevinit( allowed_to_read )
  892. ! LOGICAL , INTENT(IN) :: allowed_to_read
  893. ! INTEGER :: N
  894. ! REAL :: ZOLN,X,Y
  895. ! DO N=0,1000
  896. ! ZOLN=-FLOAT(N)*0.1
  897. ! X=(1-16.*ZOLN)**0.25
  898. ! PSIMTB(N)=2*ALOG(0.5*(1+X))+ALOG(0.5*(1+X*X))- &
  899. ! 2.*ATAN(X)+2.*ATAN(1.)
  900. ! Y=(1-16*ZOLN)**0.5
  901. ! PSIHTB(N)=2*ALOG(0.5*(1+Y))
  902. ! ENDDO
  903. END SUBROUTINE sfclayrevinit
  904. !-------------------------------------------------------------------
  905. END MODULE module_sf_sfclayrev
  906. !
  907. ! ----------------------------------------------------------
  908. !
  909. function zolri(ri,z,z0)
  910. !
  911. real right,left,midpoint
  912. !
  913. if (ri.lt.0.)then
  914. left=-1200.
  915. right=0.
  916. else
  917. left=0.
  918. right=20000.
  919. endif
  920. !
  921. Do While (abs(right - left) > 0.01)
  922. midpoint=(right+left)/2.
  923. a=zolri2(left,ri,z,z0)
  924. b=zolri2(midpoint,ri,z,z0)
  925. c=zolri2(right,ri,z,z0)
  926. !
  927. if ((a * b) < 0) then
  928. right = midpoint
  929. else
  930. if ((c * b) < 0) then
  931. left = midpoint
  932. else
  933. goto 11
  934. endif
  935. endif
  936. !
  937. enddo
  938. 11 continue
  939. !
  940. zolri=midpoint
  941. return
  942. end
  943. !
  944. ! -----------------------------------------------------------------------
  945. !
  946. function zolri2(zol2,ri2,z,z0)
  947. !
  948. zol20=zol2*z0/z ! z0/L
  949. zol3=zol2+zol20 ! (z+z0)/L
  950. !
  951. if (ri2.lt.0) then
  952. psix2=log((z+z0)/z0)-(psim_unstable(zol3)-psim_unstable(zol20))
  953. psih2=log((z+z0)/z0)-(psih_unstable(zol3)-psih_unstable(zol20))
  954. else
  955. psix2=log((z+z0)/z0)-(psim_stable(zol3)-psim_stable(zol20))
  956. psih2=log((z+z0)/z0)-(psih_stable(zol3)-psih_stable(zol20))
  957. endif
  958. !
  959. zolri2=zol2*psih2/psix2**2-ri2
  960. !
  961. return
  962. end
  963. !
  964. ! ... integrated similarity functions ...
  965. !
  966. function psim_stable(zolf)
  967. psim_stable=-6.1*log(zolf+(1+zolf**2.5)**(1./2.5))
  968. return
  969. end
  970. function psih_stable(zolf)
  971. psih_stable=-5.3*log(zolf+(1+zolf**1.1)**(1./1.1))
  972. return
  973. end
  974. function psim_unstable(zolf)
  975. x=(1.-16.*zolf)**.25
  976. psimk=2*ALOG(0.5*(1+X))+ALOG(0.5*(1+X*X))-2.*ATAN(X)+2.*ATAN(1.)
  977. !
  978. ym=(1.-10.*zolf)**0.33
  979. psimc=(3./2.)*log((ym**2.+ym+1.)/3.)-sqrt(3.)*ATAN((2.*ym+1)/sqrt(3.))+4.*ATAN(1.)/sqrt(3.)
  980. !
  981. psim_unstable=(psimk+zolf**2*(psimc))/(1+zolf**2.)
  982. return
  983. end
  984. function psih_unstable(zolf)
  985. y=(1.-16.*zolf)**.5
  986. psihk=2.*log((1+y)/2.)
  987. !
  988. yh=(1.-34.*zolf)**0.33
  989. psihc=(3./2.)*log((yh**2.+yh+1.)/3.)-sqrt(3.)*ATAN((2.*yh+1)/sqrt(3.))+4.*ATAN(1.)/sqrt(3.)
  990. !
  991. psih_unstable=(psihk+zolf**2*(psihc))/(1+zolf**2.)
  992. return
  993. end