PageRenderTime 849ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 1ms

/wrfv2_fire/phys/module_sf_ruclsm.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 6031 lines | 3585 code | 793 blank | 1653 comment | 96 complexity | 926e2faf7df8889ef7fefb2ef52fc9ed MD5 | raw file
Possible License(s): AGPL-1.0

Large files files are truncated, but you can click here to view the full file

  1. #define LSMRUC_DBG_LVL 3000
  2. !WRF:MODEL_LAYER:PHYSICS
  3. !
  4. MODULE module_sf_ruclsm
  5. USE module_model_constants
  6. USE module_wrf_error
  7. ! VEGETATION PARAMETERS
  8. INTEGER :: LUCATS , BARE, NATURAL
  9. integer, PARAMETER :: NLUS=50
  10. CHARACTER*8 LUTYPE
  11. INTEGER, DIMENSION(1:NLUS) :: IFORTBL
  12. real, dimension(1:NLUS) :: SNUPTBL, RSTBL, RGLTBL, HSTBL, LAITBL, &
  13. ALBTBL, Z0TBL, LEMITBL, PCTBL, SHDTBL, MAXALB
  14. REAL :: TOPT_DATA,CMCMAX_DATA,CFACTR_DATA,RSMAX_DATA
  15. ! SOIL PARAMETERS
  16. INTEGER :: SLCATS
  17. INTEGER, PARAMETER :: NSLTYPE=30
  18. CHARACTER*8 SLTYPE
  19. REAL, DIMENSION (1:NSLTYPE) :: BB,DRYSMC,HC, &
  20. MAXSMC, REFSMC,SATPSI,SATDK,SATDW, WLTSMC,QTZ
  21. ! LSM GENERAL PARAMETERS
  22. INTEGER :: SLPCATS
  23. INTEGER, PARAMETER :: NSLOPE=30
  24. REAL, DIMENSION (1:NSLOPE) :: SLOPE_DATA
  25. REAL :: SBETA_DATA,FXEXP_DATA,CSOIL_DATA,SALP_DATA,REFDK_DATA, &
  26. REFKDT_DATA,FRZK_DATA,ZBOT_DATA, SMLOW_DATA,SMHIGH_DATA, &
  27. CZIL_DATA
  28. CHARACTER*256 :: err_message
  29. CONTAINS
  30. !-----------------------------------------------------------------
  31. SUBROUTINE LSMRUC( &
  32. DT,KTAU,NSL,ZS, &
  33. RAINBL,SNOW,SNOWH,SNOWC,FRZFRAC,frpcpn, &
  34. Z3D,P8W,T3D,QV3D,QC3D,RHO3D, & !p8W in [PA]
  35. GLW,GSW,EMISS,CHKLOWQ, CHS, &
  36. FLQC,FLHC,MAVAIL,CANWAT,VEGFRA,ALB,ZNT, &
  37. Z0,SNOALB,ALBBCK,LAI, & !new
  38. mminlu, landusef, nlcat, mosaic_lu, &
  39. mosaic_soil, soilctop, nscat, & !new
  40. QSFC,QSG,QVG,QCG,DEW,SOILT1,TSNAV, &
  41. TBOT,IVGTYP,ISLTYP,XLAND, &
  42. ISWATER,ISICE,XICE,XICE_THRESHOLD, &
  43. CP,ROVCP,G0,LV,STBOLT, &
  44. SOILMOIS,SH2O,SMAVAIL,SMMAX, &
  45. TSO,SOILT,HFX,QFX,LH, &
  46. SFCRUNOFF,UDRUNOFF,SFCEXC, &
  47. SFCEVP,GRDFLX,ACSNOW,SNOM, &
  48. SMFR3D,KEEPFR3DFLAG, &
  49. myj, &
  50. ids,ide, jds,jde, kds,kde, &
  51. ims,ime, jms,jme, kms,kme, &
  52. its,ite, jts,jte, kts,kte )
  53. !-----------------------------------------------------------------
  54. IMPLICIT NONE
  55. !-----------------------------------------------------------------
  56. !
  57. ! The RUC LSM model is described in:
  58. ! Smirnova, T.G., J.M. Brown, and S.G. Benjamin, 1997:
  59. ! Performance of different soil model configurations in simulating
  60. ! ground surface temperature and surface fluxes.
  61. ! Mon. Wea. Rev. 125, 1870-1884.
  62. ! Smirnova, T.G., J.M. Brown, and D. Kim, 2000: Parameterization of
  63. ! cold-season processes in the MAPS land-surface scheme.
  64. ! J. Geophys. Res. 105, 4077-4086.
  65. !-----------------------------------------------------------------
  66. !-- DT time step (second)
  67. ! ktau - number of time step
  68. ! NSL - number of soil layers
  69. ! NZS - number of levels in soil
  70. ! ZS - depth of soil levels (m)
  71. !-- RAINBL - accumulated rain in [mm] between the PBL calls
  72. !-- RAINNCV one time step grid scale precipitation (mm/step)
  73. ! SNOW - snow water equivalent [mm]
  74. ! FRAZFRAC - fraction of frozen precipitation
  75. !-- SNOWC flag indicating snow coverage (1 for snow cover)
  76. !-- Z3D heights (m)
  77. !-- P8W 3D pressure (Pa)
  78. !-- T3D temperature (K)
  79. !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
  80. ! QC3D - 3D cloud water mixing ratio (Kg/Kg)
  81. ! RHO3D - 3D air density (kg/m^3)
  82. !-- GLW downward long wave flux at ground surface (W/m^2)
  83. !-- GSW absorbed short wave flux at ground surface (W/m^2)
  84. !-- EMISS surface emissivity (between 0 and 1)
  85. ! FLQC - surface exchange coefficient for moisture (kg/m^2/s)
  86. ! FLHC - surface exchange coefficient for heat [W/m^2/s/degreeK]
  87. ! SFCEXC - surface exchange coefficient for heat [m/s]
  88. ! CANWAT - CANOPY MOISTURE CONTENT (mm)
  89. ! VEGFRA - vegetation fraction (between 0 and 1)
  90. ! ALB - surface albedo (between 0 and 1)
  91. ! SNOALB - maximum snow albedo (between 0 and 1)
  92. ! ALBBCK - snow-free albedo (between 0 and 1)
  93. ! ZNT - roughness length [m]
  94. !-- TBOT soil temperature at lower boundary (K)
  95. ! IVGTYP - USGS vegetation type (24 classes)
  96. ! ISLTYP - STASGO soil type (16 classes)
  97. !-- XLAND land mask (1 for land, 2 for water)
  98. !-- CP heat capacity at constant pressure for dry air (J/kg/K)
  99. !-- G0 acceleration due to gravity (m/s^2)
  100. !-- LV latent heat of melting (J/kg)
  101. !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
  102. ! SOILMOIS - soil moisture content (volumetric fraction)
  103. ! TSO - soil temp (K)
  104. !-- SOILT surface temperature (K)
  105. !-- HFX upward heat flux at the surface (W/m^2)
  106. !-- QFX upward moisture flux at the surface (kg/m^2/s)
  107. !-- LH upward latent heat flux (W/m^2)
  108. ! SFCRUNOFF - ground surface runoff [mm]
  109. ! UDRUNOFF - underground runoff [mm]
  110. ! SFCEVP - total evaporation in [kg/m^2]
  111. ! GRDFLX - soil heat flux (W/m^2: negative, if downward from surface)
  112. ! ACSNOW - accumulation of snow water [m]
  113. !-- CHKLOWQ - is either 0 or 1 (so far set equal to 1).
  114. !-- used only in MYJPBL.
  115. !-- tice - sea ice temperture (C)
  116. !-- rhosice - sea ice density (kg m^-3)
  117. !-- capice - sea ice volumetric heat capacity (J/m^3/K)
  118. !-- thdifice - sea ice thermal diffusivity (m^2/s)
  119. !--
  120. !-- ims start index for i in memory
  121. !-- ime end index for i in memory
  122. !-- jms start index for j in memory
  123. !-- jme end index for j in memory
  124. !-- kms start index for k in memory
  125. !-- kme end index for k in memory
  126. !-------------------------------------------------------------------------
  127. ! INTEGER, PARAMETER :: nzss=5
  128. ! INTEGER, PARAMETER :: nddzs=2*(nzss-2)
  129. INTEGER, PARAMETER :: nvegclas=24+3
  130. REAL, INTENT(IN ) :: DT
  131. LOGICAL, INTENT(IN ) :: myj,frpcpn
  132. INTEGER, INTENT(IN ) :: NLCAT, NSCAT, mosaic_lu, mosaic_soil
  133. INTEGER, INTENT(IN ) :: ktau, nsl, isice, iswater, &
  134. ims,ime, jms,jme, kms,kme, &
  135. ids,ide, jds,jde, kds,kde, &
  136. its,ite, jts,jte, kts,kte
  137. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  138. INTENT(IN ) :: QV3D, &
  139. QC3D, &
  140. p8w, &
  141. rho3D, &
  142. T3D, &
  143. z3D
  144. REAL, DIMENSION( ims:ime , jms:jme ), &
  145. INTENT(IN ) :: RAINBL, &
  146. GLW, &
  147. GSW, &
  148. FLHC, &
  149. FLQC, &
  150. CHS , &
  151. EMISS, &
  152. XICE, &
  153. XLAND, &
  154. ALBBCK, &
  155. VEGFRA, &
  156. TBOT
  157. REAL, DIMENSION( 1:nsl), INTENT(IN ) :: ZS
  158. REAL, DIMENSION( ims:ime , jms:jme ), &
  159. INTENT(INOUT) :: &
  160. SNOW, & !new
  161. SNOWH, &
  162. SNOWC, &
  163. CANWAT, & ! new
  164. SNOALB, &
  165. ALB, &
  166. LAI, &
  167. MAVAIL, &
  168. SFCEXC, &
  169. Z0 , &
  170. ZNT
  171. REAL, DIMENSION( ims:ime , jms:jme ), &
  172. INTENT(IN ) :: &
  173. FRZFRAC
  174. INTEGER, DIMENSION( ims:ime , jms:jme ), &
  175. INTENT(IN ) :: IVGTYP, &
  176. ISLTYP
  177. CHARACTER(LEN=*), INTENT(IN ) :: MMINLU
  178. REAL, DIMENSION( ims:ime , 1:nlcat, jms:jme ), INTENT(IN):: LANDUSEF
  179. REAL, DIMENSION( ims:ime , 1:nscat, jms:jme ), INTENT(IN):: SOILCTOP
  180. REAL, INTENT(IN ) :: CP,ROVCP,G0,LV,STBOLT,XICE_threshold
  181. REAL, DIMENSION( ims:ime , 1:nsl, jms:jme ) , &
  182. INTENT(INOUT) :: SOILMOIS,SH2O,TSO
  183. REAL, DIMENSION( ims:ime, jms:jme ) , &
  184. INTENT(INOUT) :: SOILT, &
  185. HFX, &
  186. QFX, &
  187. LH, &
  188. SFCEVP, &
  189. SFCRUNOFF, &
  190. UDRUNOFF, &
  191. GRDFLX, &
  192. ACSNOW, &
  193. SNOM, &
  194. QVG, &
  195. QCG, &
  196. DEW, &
  197. QSFC, &
  198. QSG, &
  199. CHKLOWQ, &
  200. SOILT1, &
  201. TSNAV
  202. REAL, DIMENSION( ims:ime, jms:jme ) , &
  203. INTENT(INOUT) :: SMAVAIL, &
  204. SMMAX
  205. REAL, DIMENSION( its:ite, jts:jte ) :: &
  206. PC, &
  207. RUNOFF1, &
  208. RUNOFF2, &
  209. EMISSL, &
  210. ZNTL, &
  211. LMAVAIL, &
  212. SMELT, &
  213. SNOH, &
  214. SNFLX, &
  215. EDIR, &
  216. EC, &
  217. ETT, &
  218. SUBLIM, &
  219. sflx, &
  220. EVAPL, &
  221. PRCPL, &
  222. SEAICE, &
  223. INFILTR
  224. !--- soil/snow properties
  225. REAL, DIMENSION( ims:ime, 1:nsl, jms:jme) &
  226. :: KEEPFR3DFLAG, &
  227. SMFR3D
  228. REAL &
  229. :: RHOCS, &
  230. RHOSN, &
  231. RHONEWSN, &
  232. BCLH, &
  233. DQM, &
  234. KSAT, &
  235. PSIS, &
  236. QMIN, &
  237. QWRTZ, &
  238. REF, &
  239. WILT, &
  240. CANWATR, &
  241. SNOWFRAC, &
  242. SNHEI, &
  243. SNWE
  244. REAL :: CN, &
  245. SAT,CW, &
  246. C1SN, &
  247. C2SN, &
  248. KQWRTZ, &
  249. KICE, &
  250. KWT
  251. REAL, DIMENSION(1:NSL) :: ZSMAIN, &
  252. ZSHALF, &
  253. DTDZS2
  254. REAL, DIMENSION(1:2*(nsl-2)) :: DTDZS
  255. REAL, DIMENSION(1:4001) :: TBQ
  256. REAL, DIMENSION( 1:nsl ) :: SOILM1D, &
  257. TSO1D, &
  258. SOILICE, &
  259. SOILIQW, &
  260. SMFRKEEP
  261. REAL, DIMENSION( 1:nsl ) :: KEEPFR
  262. REAL, DIMENSION( 1:nlcat ) :: lufrac
  263. REAL, DIMENSION( 1:nscat ) :: soilfrac
  264. REAL :: RSM, &
  265. SNWEPRINT, &
  266. SNHEIPRINT
  267. REAL :: PRCPMS, &
  268. NEWSNMS, &
  269. PATM, &
  270. PATMB, &
  271. TABS, &
  272. QVATM, &
  273. QCATM, &
  274. Q2SAT, &
  275. CONFLX, &
  276. RHO, &
  277. QKMS, &
  278. TKMS, &
  279. INFILTRP
  280. REAL :: cq,r61,r273,arp,brp,x,evs,eis
  281. REAL :: meltfactor
  282. INTEGER :: NROOT
  283. INTEGER :: ILAND,ISOIL,IFOREST
  284. INTEGER :: I,J,K,NZS,NZS1,NDDZS
  285. INTEGER :: k1,l,k2,kp,km
  286. CHARACTER (LEN=132) :: message
  287. !-----------------------------------------------------------------
  288. NZS=NSL
  289. NDDZS=2*(nzs-2)
  290. !---- table TBQ is for resolution of balance equation in VILKA
  291. CQ=173.15-.05
  292. R273=1./273.15
  293. R61=6.1153*0.62198
  294. ARP=77455.*41.9/461.525
  295. BRP=64.*41.9/461.525
  296. DO K=1,4001
  297. CQ=CQ+.05
  298. ! TBQ(K)=R61*EXP(ARP*(R273-1./CQ)-BRP*LOG(CQ*R273))
  299. EVS=EXP(17.67*(CQ-273.15)/(CQ-29.65))
  300. EIS=EXP(22.514-6.15E3/CQ)
  301. if(CQ.ge.273.15) then
  302. ! tbq is in mb
  303. tbq(k) = R61*evs
  304. else
  305. tbq(k) = R61*eis
  306. endif
  307. END DO
  308. !--- Initialize soil/vegetation parameters
  309. !--- This is temporary until SI is added to mass coordinate ---!!!!!
  310. #if ( NMM_CORE == 1 )
  311. if(ktau+1.eq.1) then
  312. #else
  313. if(ktau.eq.1) then
  314. #endif
  315. DO J=jts,jte
  316. DO i=its,ite
  317. do k=1,nsl
  318. ! smfr3d (i,k,j)=soilmois(i,k,j)/900.*1.e3
  319. ! sh2o (i,k,j)=soilmois(i,k,j)-smfr3d(i,k,j)/1.e3*900.
  320. keepfr3dflag(i,k,j)=0.
  321. enddo
  322. !--- initializing to zero snow fraction
  323. snowc(i,j) = min(1.,snowh(i,j)/0.05)
  324. !--- initializing inside snow temp if it is not defined
  325. IF((soilt1(i,j) .LT. 170.) .or. (soilt1(i,j) .GT.400.)) THEN
  326. IF(snowc(i,j).gt.0.1) THEN
  327. soilt1(i,j)=0.5*(soilt(i,j)+tso(i,1,j))
  328. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  329. WRITE ( message , FMT='(A,F8.3,2I6)' ) &
  330. 'Temperature inside snow is initialized in RUCLSM ', soilt1(i,j),i,j
  331. CALL wrf_debug ( 0 , message )
  332. ENDIF
  333. ELSE
  334. soilt1(i,j) = soilt(i,j)
  335. ENDIF
  336. ENDIF
  337. tsnav(i,j) =0.5*(soilt(i,j)+tso(i,1,j))-273.
  338. qcg (i,j) =0.
  339. patmb=P8w(i,kms,j)*1.e-2
  340. QSG (i,j) = QSN(SOILT(i,j),TBQ)/PATMB
  341. IF((qvg(i,j) .LE. 0.) .or. (qvg(i,j) .GT.0.1)) THEN
  342. qvg (i,j) = QSG(i,j)*mavail(i,j)
  343. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  344. WRITE ( message , FMT='(A,F8.3,2I6)' ) &
  345. 'QVG is initialized in RUCLSM ', qvg(i,j),mavail(i,j),qsg(i,j),i,j
  346. CALL wrf_debug ( 0 , message )
  347. ENDIF
  348. ENDIF
  349. ! qvg (i,j) =qv3d(i,1,j)
  350. ! qsfc(i,j) = qsg(i,j)/(1.+qsg(i,j))
  351. qsfc(i,j) = qvg(i,j)/(1.+qvg(i,j))
  352. SMELT(i,j) = 0.
  353. SNOM (i,j) = 0.
  354. SNFLX(i,j) = 0.
  355. DEW (i,j) = 0.
  356. PC (i,j) = 0.
  357. zntl (i,j) = 0.
  358. RUNOFF1(i,j) = 0.
  359. RUNOFF2(i,j) = 0.
  360. SFCRUNOFF(i,j) = 0.
  361. UDRUNOFF(i,j) = 0.
  362. emissl (i,j) = 0.
  363. ! Temporarily!!!
  364. canwat(i,j)=0.
  365. ! For RUC LSM CHKLOWQ needed for MYJPBL should
  366. ! 1 because is actual specific humidity at the surface, and
  367. ! not the saturation value
  368. chklowq(i,j) = 1.
  369. infiltr(i,j) = 0.
  370. snoh (i,j) = 0.
  371. edir (i,j) = 0.
  372. ec (i,j) = 0.
  373. ett (i,j) = 0.
  374. sublim(i,j) = 0.
  375. sflx (i,j) = 0.
  376. evapl (i,j) = 0.
  377. prcpl (i,j) = 0.
  378. ENDDO
  379. ENDDO
  380. do k=1,nsl
  381. soilice(k)=0.
  382. soiliqw(k)=0.
  383. enddo
  384. endif
  385. !-----------------------------------------------------------------
  386. PRCPMS = 0.
  387. DO J=jts,jte
  388. DO i=its,ite
  389. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  390. print *,' IN LSMRUC ','ims,ime,jms,jme,its,ite,jts,jte,nzs', &
  391. ims,ime,jms,jme,its,ite,jts,jte,nzs
  392. print *,' IVGTYP, ISLTYP ', ivgtyp(i,j),isltyp(i,j)
  393. print *,' MAVAIL ', mavail(i,j)
  394. print *,' SOILT,QVG,P8w',soilt(i,j),qvg(i,j),p8w(i,1,j)
  395. print *, 'LSMRUC, I,J,xland, QFX,HFX from SFCLAY',i,j,xland(i,j), &
  396. qfx(i,j),hfx(i,j)
  397. print *, ' GSW, GLW =',gsw(i,j),glw(i,j)
  398. print *, 'SOILT, TSO start of time step =',soilt(i,j),(tso(i,k,j),k=1,nsl)
  399. print *, 'SOILMOIS start of time step =',(soilmois(i,k,j),k=1,nsl)
  400. print *, 'SMFROZEN start of time step =',(smfr3d(i,k,j),k=1,nsl)
  401. print *, ' I,J=, after SFCLAY CHS,FLHC ',i,j,chs(i,j),flhc(i,j)
  402. print *, 'LSMRUC, IVGTYP,ISLTYP,ALB = ', ivgtyp(i,j),isltyp(i,j),alb(i,j),i,j
  403. print *, 'LSMRUC I,J,DT,RAINBL =',I,J,dt,RAINBL(i,j)
  404. print *, 'XLAND ---->, ivgtype,isoiltyp,i,j',xland(i,j),ivgtyp(i,j),isltyp(i,j),i,j
  405. ENDIF
  406. ILAND = IVGTYP(i,j)
  407. ISOIL = ISLTYP(I,J)
  408. TABS = T3D(i,kms,j)
  409. QVATM = QV3D(i,kms,j)
  410. QCATM = QC3D(i,kms,j)
  411. PATM = P8w(i,kms,j)*1.e-5
  412. !-- Z3D(1) is thickness between first full sigma level and the surface,
  413. !-- but first mass level is at the half of the first sigma level
  414. !-- (u and v are also at the half of first sigma level)
  415. CONFLX = Z3D(i,kms,j)*0.5
  416. RHO = RHO3D(I,kms,J)
  417. !--- 1*e-3 is to convert from mm/s to m/s
  418. IF(FRPCPN) THEN
  419. PRCPMS = (RAINBL(i,j)/DT*1.e-3)*(1-FRZFRAC(I,J))
  420. NEWSNMS = (RAINBL(i,j)/DT*1.e-3)*FRZFRAC(I,J)
  421. ELSE
  422. if (tabs.le.273.15) then
  423. PRCPMS = 0.
  424. NEWSNMS = RAINBL(i,j)/DT*1.e-3
  425. else
  426. PRCPMS = RAINBL(i,j)/DT*1.e-3
  427. NEWSNMS = 0.
  428. endif
  429. ENDIF
  430. ! if (myj) then
  431. QKMS=CHS(i,j)
  432. TKMS=CHS(i,j)
  433. ! else
  434. !--- convert exchange coeff QKMS to [m/s]
  435. ! QKMS=FLQC(I,J)/RHO/MAVAIL(I,J)
  436. ! TKMS=FLHC(I,J)/RHO/CP
  437. ! endif
  438. !--- convert incoming snow and canwat from mm to m
  439. SNWE=SNOW(I,J)*1.E-3
  440. SNHEI=SNOWH(I,J)
  441. CANWATR=CANWAT(I,J)*1.E-3
  442. SNOWFRAC=SNOWC(I,J)
  443. !-----
  444. zsmain(1)=0.
  445. zshalf(1)=0.
  446. do k=2,nzs
  447. zsmain(k)= zs(k)
  448. zshalf(k)=0.5*(zsmain(k-1) + zsmain(k))
  449. enddo
  450. do k=1,nlcat
  451. lufrac(k) = landusef(i,k,j)
  452. enddo
  453. do k=1,nscat
  454. soilfrac(k) = soilctop(i,k,j)
  455. enddo
  456. !------------------------------------------------------------
  457. !----- DDZS and DSDZ1 are for implicit solution of soil eqns.
  458. !-------------------------------------------------------------
  459. NZS1=NZS-1
  460. !-----
  461. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  462. print *,' DT,NZS1, ZSMAIN, ZSHALF --->', dt,nzs1,zsmain,zshalf
  463. ENDIF
  464. DO K=2,NZS1
  465. K1=2*K-3
  466. K2=K1+1
  467. X=DT/2./(ZSHALF(K+1)-ZSHALF(K))
  468. DTDZS(K1)=X/(ZSMAIN(K)-ZSMAIN(K-1))
  469. DTDZS2(K-1)=X
  470. DTDZS(K2)=X/(ZSMAIN(K+1)-ZSMAIN(K))
  471. END DO
  472. !27jul2011 - CN and SAT are defined in VEGPARM.TBL
  473. ! CN=0.5 ! exponent
  474. ! SAT=0.0004 ! canopy water saturated
  475. CW =4.183E6
  476. !--- Constants used in Johansen soil thermal
  477. !--- conductivity method
  478. KQWRTZ=7.7
  479. KICE=2.2
  480. KWT=0.57
  481. !***********************************************************************
  482. !--- Constants for snow density calculations C1SN and C2SN
  483. c1sn=0.026
  484. ! c1sn=0.01
  485. c2sn=21.
  486. !***********************************************************************
  487. NROOT= 4
  488. ! ! rooting depth
  489. RHONEWSN = 200.
  490. if(SNOW(i,j).gt.0. .and. SNOWH(i,j).gt.0.) then
  491. RHOSN = SNOW(i,j)/SNOWH(i,j)
  492. else
  493. RHOSN = 300.
  494. endif
  495. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  496. if(ktau.eq.1 .and.(i.eq.195.and.j.eq.254)) &
  497. print *,'before SOILVEGIN - z0,znt(195,254)',z0(i,j),znt(i,j)
  498. ENDIF
  499. !--- initializing soil and surface properties
  500. CALL SOILVEGIN ( mosaic_lu, mosaic_soil,soilfrac,nscat, &
  501. NLCAT,ILAND,ISOIL,iswater,MYJ,IFOREST,lufrac, &
  502. EMISSL(I,J),PC(I,J),ZNT(I,J),LAI(I,J), &
  503. QWRTZ,RHOCS,BCLH,DQM,KSAT,PSIS,QMIN,REF,WILT,i,j )
  504. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  505. if(ktau.eq.1 .and.(i.eq.195.and.j.eq.254)) &
  506. print *,'after SOILVEGIN - z0,znt(195,254)',z0(i,j),znt(i,j)
  507. if(ktau.eq.1 .and. (i.eq.195.and.j.eq.254)) then
  508. print *,'NLCAT,iland,lufrac,EMISSL(I,J),PC(I,J),ZNT(I,J),LAI(I,J)', &
  509. NLCAT,iland,lufrac,EMISSL(I,J),PC(I,J),ZNT(I,J),LAI(I,J),i,j
  510. print *,'NSCAT,soilfrac,QWRTZ,RHOCS,BCLH,DQM,KSAT,PSIS,QMIN,REF,WILT',&
  511. NSCAT,soilfrac,QWRTZ,RHOCS,BCLH,DQM,KSAT,PSIS,QMIN,REF,WILT,i,j
  512. endif
  513. ENDIF
  514. CN=CFACTR_DATA ! exponent
  515. SAT=max(1.e-4,CMCMAX_DATA * LAI(I,J) * 0.01*VEGFRA(I,J)) ! canopy water saturated
  516. !-- definition of number of soil levels in the rooting zone
  517. ! IF(iforest(ivgtyp(i,j)).ne.1) THEN
  518. IF(iforest.ne.1) THEN
  519. !---- all vegetation types except evergreen and mixed forests
  520. !18apr08 - define meltfactor for Egglston melting limit:
  521. ! for open areas factor is 2, and for forests - factor is 1.5
  522. ! This will make limit on snow melting smaller and let snow stay
  523. ! longer in the forests.
  524. meltfactor = 2.0
  525. do k=2,nzs
  526. if(zsmain(k).ge.0.4) then
  527. NROOT=K
  528. goto 111
  529. endif
  530. enddo
  531. ELSE
  532. !---- evergreen and mixed forests
  533. !18apr08 - define meltfactor
  534. ! meltfactor = 1.5
  535. ! 28 March 11 - Previously used value of metfactor= 1.5 needs to be further reduced
  536. ! to compensate for low snow albedos in the forested areas.
  537. ! Melting rate in forests will reduce.
  538. meltfactor = 0.85
  539. do k=2,nzs
  540. if(zsmain(k).ge.1.1) then
  541. NROOT=K
  542. goto 111
  543. endif
  544. enddo
  545. ENDIF
  546. 111 continue
  547. !-----
  548. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  549. print *,' ZNT, LAI, VEGFRA, SAT, EMIS, PC --->', &
  550. ZNT(I,J),LAI(I,J),VEGFRA(I,J),SAT,EMISSL(I,J),PC(I,J)
  551. print *,' ZS, ZSMAIN, ZSHALF, CONFLX, CN, SAT, --->', zs,zsmain,zshalf,conflx,cn,sat
  552. print *,'NROOT, meltfactor, iforest, ivgtyp, i,j ', nroot,meltfactor,iforest,ivgtyp(I,J),I,J
  553. ! print *,'NROOT, iforest, ivgtyp, i,j ', nroot,iforest(ivgtyp(i,j)),ivgtyp(I,J),I,J
  554. ENDIF
  555. !*** SET ZERO-VALUE FOR SOME OUTPUT DIAGNOSTIC ARRAYS
  556. IF((XLAND(I,J)-1.5).GE.0.)THEN
  557. !-- Water
  558. SMAVAIL(I,J)=1.0
  559. SMMAX(I,J)=1.0
  560. SNOW(I,J)=0.0
  561. SNOWH(I,J)=0.0
  562. SNOWC(I,J)=0.0
  563. LMAVAIL(I,J)=1.0
  564. ILAND=iswater
  565. ! ILAND=16
  566. ISOIL=14
  567. patmb=P8w(i,1,j)*1.e-2
  568. qvg (i,j) = QSN(SOILT(i,j),TBQ)/PATMB
  569. qsfc(i,j) = qvg(i,j)/(1.+qvg(i,j))
  570. CHKLOWQ(I,J)=1.
  571. Q2SAT=QSN(TABS,TBQ)/PATMB
  572. DO K=1,NZS
  573. SOILMOIS(I,K,J)=1.0
  574. SH2O (I,K,J)=1.0
  575. TSO(I,K,J)= SOILT(I,J)
  576. ENDDO
  577. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  578. PRINT*,' water point, I=',I, &
  579. 'J=',J, 'SOILT=', SOILT(i,j)
  580. ENDIF
  581. ELSE
  582. ! LAND POINT OR SEA ICE
  583. if(xice(i,j).ge.xice_threshold) then
  584. ! if(IVGTYP(i,j).eq.isice) then
  585. SEAICE(i,j)=1.
  586. else
  587. SEAICE(i,j)=0.
  588. endif
  589. IF(SEAICE(I,J).GT.0.5)THEN
  590. !-- Sea-ice case
  591. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  592. PRINT*,' sea-ice at water point, I=',I, &
  593. 'J=',J
  594. ENDIF
  595. ! ILAND = 24
  596. ILAND = isice
  597. ISOIL = 16
  598. ZNT(I,J) = 0.011
  599. snoalb(i,j) = 0.75
  600. dqm = 1.
  601. ref = 1.
  602. qmin = 0.
  603. wilt = 0.
  604. emissl(i,j) = 1.0
  605. DO K=1,NZS
  606. soilmois(i,k,j) = 1.
  607. smfr3d(i,k,j) = 1.
  608. sh2o(i,k,j) = 0.
  609. keepfr3dflag(i,k,j) = 0.
  610. ENDDO
  611. ENDIF
  612. ! Attention!!!! RUC LSM uses soil moisture content minus residual (minimum
  613. ! or dry soil moisture content for a given soil type) as a state variable.
  614. DO k=1,nzs
  615. ! soilm1d - soil moisture content minus residual [m**3/m**3]
  616. soilm1d (k) = min(max(0.,soilmois(i,k,j)-qmin),dqm)
  617. ! soilm1d (k) = min(max(0.,soilmois(i,k,j)),dqm)
  618. tso1d (k) = tso(i,k,j)
  619. soiliqw (k) = min(max(0.,sh2o(i,k,j)-qmin),soilm1d(k))
  620. ENDDO
  621. do k=1,nzs
  622. smfrkeep(k) = smfr3d(i,k,j)
  623. keepfr (k) = keepfr3dflag(i,k,j)
  624. enddo
  625. ! LMAVAIL(I,J)=max(0.00001,min(1.,soilmois(i,1,j)/(REF-QMIN)))
  626. ! LMAVAIL(I,J)=max(0.00001,min(1.,soilmois(i,1,j)/dqm))
  627. LMAVAIL(I,J)=max(0.00001,min(1.,soilm1d(1)/dqm))
  628. #if ( NMM_CORE == 1 )
  629. if(ktau+1.gt.1) then
  630. #else
  631. if(ktau.gt.1) then
  632. #endif
  633. ! extract dew from the cloud water at the surface
  634. QCG(I,J)=QCG(I,J)-DEW(I,J)
  635. endif
  636. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  637. print *,'LAND, i,j,tso1d,soilm1d,PATM,TABS,QVATM,QCATM,RHO', &
  638. i,j,tso1d,soilm1d,PATM,TABS,QVATM,QCATM,RHO
  639. print *,'CONFLX =',CONFLX
  640. print *,'SMFRKEEP,KEEPFR ',SMFRKEEP,KEEPFR
  641. ENDIF
  642. !-----------------------------------------------------------------
  643. CALL SFCTMP (dt,ktau,conflx,i,j, &
  644. !--- input variables
  645. nzs,nddzs,nroot,meltfactor, & !added meltfactor
  646. iland,isoil,xland(i,j),ivgtyp(i,j),PRCPMS, &
  647. NEWSNMS,SNWE,SNHEI,SNOWFRAC,RHOSN,RHONEWSN, &
  648. PATM,TABS,QVATM,QCATM,RHO, &
  649. GLW(I,J),GSW(I,J),EMISSL(I,J), &
  650. QKMS,TKMS,PC(I,J),LMAVAIL(I,J), &
  651. canwatr,vegfra(I,J),alb(I,J),znt(I,J), &
  652. snoalb(i,j),albbck(i,j), & !new
  653. myj,seaice(i,j),isice, &
  654. !--- soil fixed fields
  655. QWRTZ, &
  656. rhocs,dqm,qmin,ref, &
  657. wilt,psis,bclh,ksat, &
  658. sat,cn,zsmain,zshalf,DTDZS,DTDZS2,tbq, &
  659. !--- constants
  660. cp,rovcp,g0,lv,stbolt,cw,c1sn,c2sn, &
  661. KQWRTZ,KICE,KWT, &
  662. !--- output variables
  663. snweprint,snheiprint,rsm, &
  664. soilm1d,tso1d,smfrkeep,keepfr, &
  665. soilt(I,J),soilt1(i,j),tsnav(i,j),dew(I,J), &
  666. qvg(I,J),qsg(I,J),qcg(I,J),SMELT(I,J), &
  667. SNOH(I,J),SNFLX(I,J),SNOM(I,J),ACSNOW(I,J), &
  668. edir(I,J),ec(I,J),ett(I,J),qfx(I,J), &
  669. lh(I,J),hfx(I,J),sflx(I,J),sublim(I,J), &
  670. evapl(I,J),prcpl(I,J),runoff1(I,J), &
  671. runoff2(I,J),soilice,soiliqw,infiltrp)
  672. !-----------------------------------------------------------------
  673. !*** DIAGNOSTICS
  674. !--- available and maximum soil moisture content in the soil
  675. !--- domain
  676. smavail(i,j) = 0.
  677. smmax (i,j) = 0.
  678. do k=1,nzs-1
  679. smavail(i,j)=smavail(i,j)+(qmin+soilm1d(k))* &
  680. (zshalf(k+1)-zshalf(k))
  681. smmax (i,j) =smmax (i,j)+(qmin+dqm)* &
  682. (zshalf(k+1)-zshalf(k))
  683. enddo
  684. smavail(i,j)=smavail(i,j)+(qmin+soilm1d(nzs))* &
  685. (zsmain(nzs)-zshalf(nzs))
  686. smmax (i,j) =smmax (i,j)+(qmin+dqm)* &
  687. (zsmain(nzs)-zshalf(nzs))
  688. !--- Convert the water unit into mm
  689. SFCRUNOFF(I,J) = SFCRUNOFF(I,J)+RUNOFF1(I,J)*DT*1000.0
  690. UDRUNOFF (I,J) = UDRUNOFF(I,J)+RUNOFF2(I,J)*1000.0
  691. SMAVAIL (I,J) = SMAVAIL(I,J) * 1000.
  692. SMMAX (I,J) = SMMAX(I,J) * 1000.
  693. do k=1,nzs
  694. ! soilmois(i,k,j) = soilm1d(k)
  695. soilmois(i,k,j) = soilm1d(k) + qmin
  696. sh2o (i,k,j) = min(soiliqw(k) + qmin,soilmois(i,k,j))
  697. tso(i,k,j) = tso1d(k)
  698. enddo
  699. tso(i,nzs,j) = tbot(i,j)
  700. do k=1,nzs
  701. smfr3d(i,k,j) = smfrkeep(k)
  702. keepfr3dflag(i,k,j) = keepfr (k)
  703. enddo
  704. !tgs add together dew and cloud at the ground surface
  705. qcg(i,j)=qcg(i,j)+dew(i,j)
  706. Z0 (I,J) = ZNT (I,J)
  707. SFCEXC (I,J) = TKMS
  708. patmb=P8w(i,1,j)*1.e-2
  709. Q2SAT=QSN(TABS,TBQ)/PATMB
  710. QSFC(I,J) = QVG(I,J)/(1.+QVG(I,J))
  711. ! for MYJ surface and PBL scheme
  712. ! if (myj) then
  713. ! MYJSFC expects QSFC as actual specific humidity at the surface
  714. IF((QVATM.GE.Q2SAT*0.95).AND.QVATM.LT.qvg(I,J))THEN
  715. CHKLOWQ(I,J)=0.
  716. ELSE
  717. CHKLOWQ(I,J)=1.
  718. ENDIF
  719. ! else
  720. ! CHKLOWQ(I,J)=1.
  721. ! endif
  722. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  723. if(CHKLOWQ(I,J).eq.0.) then
  724. print *,'i,j,CHKLOWQ', &
  725. i,j,CHKLOWQ(I,J)
  726. endif
  727. ENDIF
  728. ! SNOW is in [mm], SNWE is in [m]; CANWAT is in mm, CANWATR is in m
  729. SNOW (i,j) = SNWE*1000.
  730. SNOWH (I,J) = SNHEI
  731. CANWAT (I,J) = CANWATR*1000.
  732. INFILTR(I,J) = INFILTRP
  733. MAVAIL (i,j) = LMAVAIL(I,J)
  734. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  735. print *,' LAND, I=,J=, QFX, HFX after SFCTMP', i,j,lh(i,j),hfx(i,j)
  736. ENDIF
  737. !!! QFX (I,J) = LH(I,J)/LV
  738. SFCEVP (I,J) = SFCEVP (I,J) + QFX (I,J) * DT
  739. GRDFLX (I,J) = -1. * sflx(I,J)
  740. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  741. print *,' QFX after change, LH ', i,j, QFX(i,j),LH(I,J)
  742. ENDIF
  743. !--- SNOWC snow cover flag
  744. if(snowfrac > 0. .and. xice(i,j).ge.xice_threshold ) then
  745. SNOWFRAC = SNOWFRAC*XICE(I,J)
  746. endif
  747. SNOWC(I,J)=SNOWFRAC
  748. !--- get 3d soil fields
  749. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  750. print *,'LAND, i,j,tso1d,soilm1d - end of time step', &
  751. i,j,tso1d,soilm1d
  752. ENDIF
  753. !--- end of a land or sea ice point
  754. ENDIF
  755. ENDDO
  756. ENDDO
  757. !-----------------------------------------------------------------
  758. END SUBROUTINE LSMRUC
  759. !-----------------------------------------------------------------
  760. SUBROUTINE SFCTMP (delt,ktau,conflx,i,j, &
  761. !--- input variables
  762. nzs,nddzs,nroot,meltfactor, &
  763. ILAND,ISOIL,XLAND,IVGTYP,PRCPMS, &
  764. NEWSNMS,SNWE,SNHEI,SNOWFRAC,RHOSN,RHONEWSN, &
  765. PATM,TABS,QVATM,QCATM,rho, &
  766. GLW,GSW,EMISS,QKMS,TKMS,PC, &
  767. MAVAIL,CST,VEGFRA,ALB,ZNT, &
  768. ALB_SNOW,ALB_SNOW_FREE, &
  769. MYJ,SEAICE,ISICE, &
  770. !--- soil fixed fields
  771. QWRTZ,rhocs,dqm,qmin,ref,wilt,psis,bclh,ksat, &
  772. sat,cn,zsmain,zshalf,DTDZS,DTDZS2,tbq, &
  773. !--- constants
  774. cp,rovcp,g0,lv,stbolt,cw,c1sn,c2sn, &
  775. KQWRTZ,KICE,KWT, &
  776. !--- output variables
  777. snweprint,snheiprint,rsm, &
  778. soilm1d,ts1d,smfrkeep,keepfr,soilt,soilt1, &
  779. tsnav,dew,qvg,qsg,qcg, &
  780. SMELT,SNOH,SNFLX,SNOM,ACSNOW, &
  781. edir1,ec1,ett1,eeta,qfx,hfx,s,sublim, &
  782. evapl,prcpl,runoff1,runoff2,soilice, &
  783. soiliqw,infiltr)
  784. !-----------------------------------------------------------------
  785. IMPLICIT NONE
  786. !-----------------------------------------------------------------
  787. !--- input variables
  788. INTEGER, INTENT(IN ) :: isice,i,j,nroot,ktau,nzs , &
  789. nddzs !nddzs=2*(nzs-2)
  790. REAL, INTENT(IN ) :: DELT,CONFLX,meltfactor
  791. REAL, INTENT(IN ) :: C1SN,C2SN
  792. LOGICAL, INTENT(IN ) :: myj
  793. !--- 3-D Atmospheric variables
  794. REAL , &
  795. INTENT(IN ) :: PATM, &
  796. TABS, &
  797. QVATM, &
  798. QCATM
  799. REAL , &
  800. INTENT(IN ) :: GLW, &
  801. GSW, &
  802. PC, &
  803. VEGFRA, &
  804. ALB_SNOW_FREE, &
  805. SEAICE, &
  806. XLAND, &
  807. RHO, &
  808. QKMS, &
  809. TKMS
  810. INTEGER, INTENT(IN ) :: IVGTYP
  811. !--- 2-D variables
  812. REAL , &
  813. INTENT(INOUT) :: EMISS, &
  814. MAVAIL, &
  815. SNOWFRAC, &
  816. ALB_SNOW, &
  817. ALB, &
  818. CST
  819. !--- soil properties
  820. REAL :: &
  821. RHOCS, &
  822. BCLH, &
  823. DQM, &
  824. KSAT, &
  825. PSIS, &
  826. QMIN, &
  827. QWRTZ, &
  828. REF, &
  829. SAT, &
  830. WILT
  831. REAL, INTENT(IN ) :: CN, &
  832. CW, &
  833. CP, &
  834. ROVCP, &
  835. G0, &
  836. LV, &
  837. STBOLT, &
  838. KQWRTZ, &
  839. KICE, &
  840. KWT
  841. REAL, DIMENSION(1:NZS), INTENT(IN) :: ZSMAIN, &
  842. ZSHALF, &
  843. DTDZS2
  844. REAL, DIMENSION(1:NDDZS), INTENT(IN) :: DTDZS
  845. REAL, DIMENSION(1:4001), INTENT(IN) :: TBQ
  846. !--- input/output variables
  847. !-------- 3-d soil moisture and temperature
  848. REAL, DIMENSION( 1:nzs ) , &
  849. INTENT(INOUT) :: TS1D, &
  850. SOILM1D, &
  851. SMFRKEEP
  852. REAL, DIMENSION( 1:nzs ) , &
  853. INTENT(INOUT) :: KEEPFR
  854. INTEGER, INTENT(INOUT) :: ILAND,ISOIL
  855. !-------- 2-d variables
  856. REAL , &
  857. INTENT(INOUT) :: DEW, &
  858. EDIR1, &
  859. EC1, &
  860. ETT1, &
  861. EETA, &
  862. EVAPL, &
  863. INFILTR, &
  864. RHOSN, &
  865. RHONEWSN, &
  866. SUBLIM, &
  867. PRCPL, &
  868. QVG, &
  869. QSG, &
  870. QCG, &
  871. QFX, &
  872. HFX, &
  873. S, &
  874. RUNOFF1, &
  875. RUNOFF2, &
  876. ACSNOW, &
  877. SNWE, &
  878. SNHEI, &
  879. SMELT, &
  880. SNOM, &
  881. SNOH, &
  882. SNFLX, &
  883. SOILT, &
  884. SOILT1, &
  885. TSNAV, &
  886. ZNT
  887. REAL, DIMENSION(1:NZS) :: &
  888. tice, &
  889. rhosice, &
  890. capice, &
  891. thdifice
  892. !-------- 1-d variables
  893. REAL, DIMENSION(1:NZS), INTENT(OUT) :: SOILICE, &
  894. SOILIQW
  895. REAL, INTENT(OUT) :: RSM, &
  896. SNWEPRINT, &
  897. SNHEIPRINT
  898. !--- Local variables
  899. INTEGER :: K,ILNB
  900. REAL :: BSN, XSN , &
  901. RAINF, SNTH, NEWSN, PRCPMS, NEWSNMS , &
  902. T3, UPFLUX, XINET
  903. REAL :: snhei_crit, keep_snow_albedo
  904. REAL :: RNET,GSWNEW,EMISSN,ZNTSN
  905. REAL :: VEGFRAC
  906. real :: cice, albice, albsn
  907. !-----------------------------------------------------------------
  908. integer, parameter :: ilsnow=99
  909. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  910. print *,' in SFCTMP',i,j,nzs,nddzs,nroot, &
  911. SNWE,RHOSN,SNOM,SMELT,TS1D
  912. ENDIF
  913. NEWSN=0.
  914. RAINF = 0.
  915. RSM=0.
  916. INFILTR=0.
  917. VEGFRAC=0.01*VEGFRA
  918. ! if(VEGFRAC.le.0.01) VEGFRAC=0.
  919. !---initialize local arrays for sea ice
  920. do k=1,nzs
  921. tice(k) = 0.
  922. rhosice(k) = 0.
  923. cice = 0.
  924. capice(k) = 0.
  925. thdifice(k) = 0.
  926. enddo
  927. GSWnew=GSW
  928. ALBice=ALB_SNOW_FREE
  929. !--- sea ice properties
  930. !--- N.N Zubov "Arctic Ice"
  931. !--- no salinity dependence because we consider the ice pack
  932. !--- to be old and to have low salinity (0.0002)
  933. if(SEAICE.ge.0.5) then
  934. do k=1,nzs
  935. tice(k) = ts1d(k) - 273.15
  936. rhosice(k) = 917.6/(1-0.000165*tice(k))
  937. cice = 2115.85 +7.7948*tice(k)
  938. capice(k) = cice*rhosice(k)
  939. thdifice(k) = 2.260872/capice(k)
  940. enddo
  941. !-- SEA ICE ALB dependence on ice temperature. When ice temperature is
  942. !-- below critical value of -10C - no change to albedo.
  943. !-- If temperature is higher that -10C then albedo is decreasing.
  944. !-- The minimum albedo at t=0C for ice is 0.1 less.
  945. GSWNEW=GSW/(1.-ALB)
  946. ALBice = MIN(ALB_SNOW_FREE,MAX(ALB_SNOW_FREE - 0.05, &
  947. ALB_SNOW_FREE - 0.1*(tice(1)+10.)/10. ))
  948. GSWNEW=GSW*(1.-ALBice)
  949. endif
  950. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  951. print *,'I,J,KTAU,QKMS,TKMS', i,j,ktau,qkms,tkms
  952. print *,'GSW,GSWnew,GLW,SOILT,EMISS,ALB,ALBice,SNWE',&
  953. GSW,GSWnew,GLW,SOILT,EMISS,ALB,ALBice,SNWE
  954. ENDIF
  955. SNHEI = SNWE * 1000. / RHOSN
  956. !--------------
  957. T3 = STBOLT*SOILT*SOILT*SOILT
  958. UPFLUX = T3 *SOILT
  959. XINET = EMISS*(GLW-UPFLUX)
  960. RNET = GSWnew + XINET
  961. !Calculate the amount (m) of fresh snow
  962. if(snhei.gt.0.0081*1.e3/rhosn) then
  963. !*** Correct snow density for current temperature (Koren et al. 1999)
  964. BSN=delt/3600.*c1sn*exp(0.08*tsnav-c2sn*rhosn*1.e-3)
  965. if(bsn*snwe*100..lt.1.e-4) goto 777
  966. XSN=rhosn*(exp(bsn*snwe*100.)-1.)/(bsn*snwe*100.)
  967. rhosn=MIN(MAX(100.,XSN),400.)
  968. ! rhosn=MIN(MAX(50.,XSN),400.)
  969. 777 continue
  970. ! else
  971. ! rhosn =200.
  972. ! rhonewsn =200.
  973. endif
  974. newsn=newsnms*delt
  975. !---- ACSNOW - accumulated snow water [kg m-2]
  976. acsnow=acsnow+newsn*1.e3
  977. IF(NEWSN.GT.0.) THEN
  978. ! IF(NEWSN.GE.1.E-8) THEN
  979. !*** Calculate fresh snow density (t > -15C, else MIN value)
  980. !*** Eq. 10 from Koren et al. (1999)
  981. IF ( wrf_at_debug_level(LSMRUC_DBG_LVL) ) THEN
  982. print *, 'THERE IS NEW SNOW, newsn', newsn
  983. ENDIF
  984. if(tabs.lt.258.15) then
  985. ! rhonewsn=50.
  986. rhonewsn=100.
  987. else
  988. rhonewsn=1.e3*max((0.10+0.0017*(Tabs-273.15+15.)**1.5) &
  989. , 0.10)
  990. ! rhonewsn=1.e3*max((0.05+0.0017*(Tabs-273.15+15.)**1.5) &
  991. ! , 0.05)
  992. rhonewsn=MIN(rhonewsn,400.)
  993. ! rhonewsn=100.
  994. endif
  995. !*** Define average snow density of the snow pack considering
  996. !*** the amount of fresh snow (eq. 9 in Koren et al.(1999)
  997. !*** without snow melt )
  998. xsn=(rhosn*snwe+rhonewsn*newsn)/ &
  999. (snwe+newsn)
  1000. rhosn=MIN(MAX(100.,XSN),400.)
  1001. ! rhosn=MIN(MAX(50.,XSN),400.)
  1002. snwe=snwe+newsn
  1003. snhei=snwe*1.E3/rhosn
  1004. NEWSN=NEWSN*1.E3/rhonewsn
  1005. ENDIF
  1006. IF(PRCPMS.NE.0.) THEN
  1007. ! PRCPMS is liquid precipitation rate
  1008. ! RAINF is a flag used for calculation of rain water
  1009. ! heat content contribution into heat budget equation. Rain's temperature
  1010. ! is set equal to air temperature at the first atmospheric
  1011. ! level.
  1012. RAINF=1.
  1013. ENDIF
  1014. IF(SNHEI.GT.0.0) THEN
  1015. !--- Set of surface parameters should be changed to snow values for grid
  1016. !--- points where the snow cover exceeds snow threshold of 2 cm
  1017. ILAND=ISICE
  1018. SNHEI_CRIT=0.01601*1.e3/rhosn
  1019. ! SNOWFRAC=MIN(1.,SNHEI/SNHEI_CRIT)
  1020. SNOWFRAC=MIN(1.,SNHEI/(2.*SNHEI_CRIT))
  1021. !tgs - low limit on snow fraction
  1022. ! if(SNOWFRAC.lt.0.01) snowfrac=0.
  1023. !--- EMISS = 0.98 for snow
  1024. EMISS = EMISS*(1.-snowfrac)+0.98*snowfrac
  1025. !-- Set znt for snow from VEGPARM table (snow/ice landuse), except for
  1026. !-- land-use types with higher roughness (forests, urban).
  1027. IF(znt.lt.0.2 .and. snowfrac.gt.0.99) znt=z0tbl(iland)
  1028. KEEP_SNOW_ALBEDO = 0.
  1029. IF (NEWSN.GT.0.) KEEP_SNOW_ALBEDO = 1.
  1030. !--- GSW in-coming solar
  1031. GSWNEW=GSW/(1.-ALB)
  1032. IF(SEAICE .LT. 0.5) THEN
  1033. !----- SNOW on soil
  1034. !-- ALB dependence on snow depth
  1035. ALBsn = MAX(keep_snow_albedo*alb_snow, &
  1036. MIN((alb_snow_free + &
  1037. (alb_snow - alb_snow_free) * snowfrac), alb_snow))
  1038. !28mar11 if canopy is covered with snow to its capacity and snow depth is
  1039. ! higher than patchy snow treshold - then snow albedo is not less than 0.7
  1040. if(cst.ge.sat .and. snowfrac .eq.1.) albsn=max(alb_snow,0.7)
  1041. !-- ALB dependence on snow temperature. When snow temperature is
  1042. !-- below critical value of -10C - no change to albedo.
  1043. !-- If temperature is higher that -10C then albedo is decreasing.
  1044. !-- The minimum albedo at t=0C for snow on land is 15% less than
  1045. !-- albedo of temperatures below -10C.
  1046. if(albsn.lt.0.5) then
  1047. ALB=ALBsn
  1048. else
  1049. !-- change albedo when no fresh snow and snow albedo is higher than 0.5
  1050. ALB = MIN(ALBSN,MAX(ALBSN - 0.1*(soilt - 263.15)/ &
  1051. (273.15-263.15)*ALBSN, ALBSN - 0.05))
  1052. endif
  1053. ELSE
  1054. !----- S

Large files files are truncated, but you can click here to view the full file