PageRenderTime 57ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/share/module_soil_pre.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 4250 lines | 3067 code | 692 blank | 491 comment | 30 complexity | 9a91b75be6fa25ff4e561715c40b39be 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. #if ( ! NMM_CORE == 1 )
  2. MODULE module_soil_pre
  3. USE module_date_time
  4. USE module_state_description
  5. CHARACTER (LEN=3) :: num_cat_count
  6. INTEGER , PARAMETER , DIMENSION(0:300) :: ints = &
  7. (/ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, &
  8. 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, &
  9. 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, &
  10. 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, &
  11. 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, &
  12. 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, &
  13. 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, &
  14. 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, &
  15. 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, &
  16. 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, &
  17. 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, &
  18. 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, &
  19. 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, &
  20. 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, &
  21. 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, &
  22. 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, &
  23. 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, &
  24. 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, &
  25. 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, &
  26. 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, &
  27. 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, &
  28. 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, &
  29. 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, &
  30. 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, &
  31. 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, &
  32. 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, &
  33. 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, &
  34. 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, &
  35. 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, &
  36. 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300 /)
  37. ! Excluded middle processing
  38. LOGICAL , SAVE :: hold_ups
  39. INTEGER , SAVE :: em_width
  40. LOGICAL , EXTERNAL :: skip_middle_points_t
  41. CONTAINS
  42. SUBROUTINE adjust_for_seaice_pre ( xice , landmask , tsk , ivgtyp , vegcat , lu_index , &
  43. xland , landusef , isltyp , soilcat , soilctop , &
  44. soilcbot , tmn , &
  45. seaice_threshold , &
  46. fractional_seaice, &
  47. num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
  48. iswater , isice , &
  49. scheme , &
  50. ids , ide , jds , jde , kds , kde , &
  51. ims , ime , jms , jme , kms , kme , &
  52. its , ite , jts , jte , kts , kte )
  53. IMPLICIT NONE
  54. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  55. ims , ime , jms , jme , kms , kme , &
  56. its , ite , jts , jte , kts , kte , &
  57. iswater , isice
  58. INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme
  59. REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef
  60. REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop
  61. REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot
  62. INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
  63. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , &
  64. vegcat, xland , soilcat , tmn
  65. REAL , INTENT(IN) :: seaice_threshold
  66. INTEGER :: i , j , num_seaice_changes , loop
  67. CHARACTER (LEN=132) :: message
  68. INTEGER, INTENT(IN) :: fractional_seaice
  69. REAL :: XICE_THRESHOLD
  70. IF ( FRACTIONAL_SEAICE == 0 ) THEN
  71. xice_threshold = 0.5
  72. ELSEIF ( FRACTIONAL_SEAICE == 1 ) THEN
  73. xice_threshold = 0.02
  74. ENDIF
  75. num_seaice_changes = 0
  76. fix_seaice : SELECT CASE ( scheme )
  77. CASE ( SLABSCHEME )
  78. DO j = jts , MIN(jde-1,jte)
  79. DO i = its , MIN(ide-1,ite)
  80. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  81. IF ( xice(i,j) .GT. 200.0 ) THEN
  82. xice(i,j) = 0.
  83. num_seaice_changes = num_seaice_changes + 1
  84. END IF
  85. END DO
  86. END DO
  87. IF ( num_seaice_changes .GT. 0 ) THEN
  88. WRITE ( message , FMT='(A,I6)' ) &
  89. 'Total pre number of sea ice locations removed (due to FLAG values) = ', &
  90. num_seaice_changes
  91. CALL wrf_debug ( 0 , message )
  92. END IF
  93. num_seaice_changes = 0
  94. DO j = jts , MIN(jde-1,jte)
  95. DO i = its , MIN(ide-1,ite)
  96. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  97. IF ( ( xice(i,j) .GE. xice_threshold ) .OR. &
  98. ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
  99. IF ( FRACTIONAL_SEAICE == 0 ) THEN
  100. xice(i,j) = 1.0
  101. ENDIF
  102. num_seaice_changes = num_seaice_changes + 1
  103. if(landmask(i,j) .LT. 0.5 )tmn(i,j) = 271.4
  104. vegcat(i,j)=isice
  105. ivgtyp(i,j)=isice
  106. lu_index(i,j)=isice
  107. landmask(i,j)=1.
  108. xland(i,j)=1.
  109. DO loop=1,num_veg_cat
  110. landusef(i,loop,j)=0.
  111. END DO
  112. landusef(i,ivgtyp(i,j),j)=1.
  113. isltyp(i,j) = 16
  114. soilcat(i,j)=isltyp(i,j)
  115. DO loop=1,num_soil_top_cat
  116. soilctop(i,loop,j)=0
  117. END DO
  118. DO loop=1,num_soil_bot_cat
  119. soilcbot(i,loop,j)=0
  120. END DO
  121. soilctop(i,isltyp(i,j),j)=1.
  122. soilcbot(i,isltyp(i,j),j)=1.
  123. ELSE
  124. xice(i,j) = 0.0
  125. END IF
  126. END DO
  127. END DO
  128. IF ( num_seaice_changes .GT. 0 ) THEN
  129. WRITE ( message , FMT='(A,I6)' ) &
  130. 'Total pre number of sea ice location changes (water to land) = ', num_seaice_changes
  131. CALL wrf_debug ( 0 , message )
  132. END IF
  133. CASE ( LSMSCHEME , NOAHMPSCHEME , RUCLSMSCHEME , SSIBSCHEME) !mchen add for ssib
  134. num_seaice_changes = 0
  135. DO j = jts , MIN(jde-1,jte)
  136. DO i = its , MIN(ide-1,ite)
  137. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  138. IF ( landmask(i,j) .GT. 0.5 ) THEN
  139. if (xice(i,j).gt.0) num_seaice_changes = num_seaice_changes + 1
  140. xice(i,j) = 0.
  141. END IF
  142. END DO
  143. END DO
  144. IF ( num_seaice_changes .GT. 0 ) THEN
  145. WRITE ( message , FMT='(A,I6)' ) &
  146. 'Total pre number of land location changes (seaice set to zero) = ', num_seaice_changes
  147. CALL wrf_debug ( 0 , message )
  148. END IF
  149. END SELECT fix_seaice
  150. END SUBROUTINE adjust_for_seaice_pre
  151. SUBROUTINE adjust_for_seaice_post ( xice , landmask , tsk_old , tsk , ivgtyp , vegcat , lu_index , &
  152. xland , landusef , isltyp , soilcat , soilctop , &
  153. soilcbot , tmn , vegfra , &
  154. tslb , smois , sh2o , &
  155. seaice_threshold , &
  156. sst , flag_sst , &
  157. fractional_seaice, &
  158. num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
  159. num_soil_layers , &
  160. iswater , isice , &
  161. scheme , &
  162. ids , ide , jds , jde , kds , kde , &
  163. ims , ime , jms , jme , kms , kme , &
  164. its , ite , jts , jte , kts , kte )
  165. IMPLICIT NONE
  166. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  167. ims , ime , jms , jme , kms , kme , &
  168. its , ite , jts , jte , kts , kte , &
  169. iswater , isice
  170. INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat , scheme
  171. INTEGER , INTENT(IN) :: num_soil_layers
  172. REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landusef
  173. REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(INOUT):: soilctop
  174. REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(INOUT):: soilcbot
  175. REAL , DIMENSION(ims:ime,1:num_soil_layers,jms:jme) , INTENT(INOUT):: tslb , smois , sh2o
  176. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN):: sst
  177. INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
  178. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask , xice , tsk , lu_index , &
  179. vegcat, xland , soilcat , tmn , &
  180. tsk_old , vegfra
  181. INTEGER , INTENT(IN) :: flag_sst
  182. REAL , INTENT(IN) :: seaice_threshold
  183. REAL :: total_depth , mid_point_depth
  184. INTEGER :: i , j , num_seaice_changes , loop
  185. CHARACTER (LEN=132) :: message
  186. INTEGER, INTENT(IN) :: fractional_seaice
  187. real :: xice_threshold
  188. IF ( FRACTIONAL_SEAICE == 0 ) THEN
  189. xice_threshold = 0.5
  190. ELSEIF ( FRACTIONAL_SEAICE == 1 ) THEN
  191. xice_threshold = 0.02
  192. ENDIF
  193. num_seaice_changes = 0
  194. fix_seaice : SELECT CASE ( scheme )
  195. CASE ( SLABSCHEME )
  196. CASE ( LSMSCHEME , NOAHMPSCHEME , SSIBSCHEME ) !mchen add for ssib
  197. DO j = jts , MIN(jde-1,jte)
  198. DO i = its , MIN(ide-1,ite)
  199. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  200. IF ( xice(i,j) .GT. 200.0 ) THEN
  201. xice(i,j) = 0.
  202. num_seaice_changes = num_seaice_changes + 1
  203. END IF
  204. END DO
  205. END DO
  206. IF ( num_seaice_changes .GT. 0 ) THEN
  207. WRITE ( message , FMT='(A,I6)' ) &
  208. 'Total post number of sea ice locations removed (due to FLAG values) = ', &
  209. num_seaice_changes
  210. CALL wrf_debug ( 0 , message )
  211. END IF
  212. num_seaice_changes = 0
  213. DO j = jts , MIN(jde-1,jte)
  214. DO i = its , MIN(ide-1,ite)
  215. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  216. IF ( ( ( tsk(i,j) .LT. 170 ) .OR. ( tsk(i,j) .GT. 400 ) ) .AND. &
  217. ( ( tsk_old(i,j) .GT. 170 ) .AND. ( tsk_old(i,j) .LT. 400 ) ) )THEN
  218. tsk(i,j) = tsk_old(i,j)
  219. END IF
  220. IF ( ( ( tsk(i,j) .LT. 170 ) .OR. ( tsk(i,j) .GT. 400 ) ) .AND. &
  221. ( ( tsk_old(i,j) .LT. 170 ) .OR. ( tsk_old(i,j) .GT. 400 ) ) )THEN
  222. print *,'TSK woes in seaice post, i,j=',i,j,' tsk = ',tsk(i,j), tsk_old(i,j)
  223. CALL wrf_error_fatal ( 'TSK is unrealistic, problems for seaice post')
  224. ELSE IF ( ( xice(i,j) .GE. xice_threshold ) .OR. &
  225. ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
  226. IF ( FRACTIONAL_SEAICE == 0 ) THEN
  227. xice(i,j) = 1.0
  228. ENDIF
  229. num_seaice_changes = num_seaice_changes + 1
  230. if(landmask(i,j) .LT. 0.5 )tmn(i,j) = 271.4
  231. vegcat(i,j)=isice
  232. ivgtyp(i,j)=isice
  233. lu_index(i,j)=isice
  234. landmask(i,j)=1.
  235. xland(i,j)=1.
  236. vegfra(i,j)=0.
  237. DO loop=1,num_veg_cat
  238. landusef(i,loop,j)=0.
  239. END DO
  240. landusef(i,ivgtyp(i,j),j)=1.
  241. tsk_old(i,j) = tsk(i,j)
  242. isltyp(i,j) = 16
  243. soilcat(i,j)=isltyp(i,j)
  244. DO loop=1,num_soil_top_cat
  245. soilctop(i,loop,j)=0
  246. END DO
  247. DO loop=1,num_soil_bot_cat
  248. soilcbot(i,loop,j)=0
  249. END DO
  250. soilctop(i,isltyp(i,j),j)=1.
  251. soilcbot(i,isltyp(i,j),j)=1.
  252. total_depth = 3. ! ice is 3 m deep, num_soil_layers equispaced layers
  253. DO loop = 1,num_soil_layers
  254. mid_point_depth=(total_depth/num_soil_layers)/2. + &
  255. (loop-1)*(total_depth/num_soil_layers)
  256. tslb(i,loop,j) = ( (total_depth-mid_point_depth)*tsk(i,j) + &
  257. mid_point_depth*tmn(i,j) ) / total_depth
  258. END DO
  259. DO loop=1,num_soil_layers
  260. smois(i,loop,j) = 1.0
  261. sh2o(i,loop,j) = 0.0
  262. END DO
  263. ELSE IF ( xice(i,j) .LT. xice_threshold ) THEN
  264. xice(i,j) = 0.
  265. END IF
  266. END DO
  267. END DO
  268. IF ( num_seaice_changes .GT. 0 ) THEN
  269. WRITE ( message , FMT='(A,I6)' ) &
  270. 'Total post number of sea ice location changes (water to land) = ', num_seaice_changes
  271. CALL wrf_debug ( 0 , message )
  272. END IF
  273. CASE ( RUCLSMSCHEME )
  274. DO j = jts , MIN(jde-1,jte)
  275. DO i = its , MIN(ide-1,ite)
  276. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  277. IF ( xice(i,j) .GT. 200.0 ) THEN
  278. xice(i,j) = 0.
  279. num_seaice_changes = num_seaice_changes + 1
  280. END IF
  281. END DO
  282. END DO
  283. IF ( num_seaice_changes .GT. 0 ) THEN
  284. WRITE ( message , FMT='(A,I6)' ) &
  285. 'Total post number of sea ice locations removed (due to FLAG values) = ', &
  286. num_seaice_changes
  287. CALL wrf_debug ( 0 , message )
  288. END IF
  289. num_seaice_changes = 0
  290. DO j = jts , MIN(jde-1,jte)
  291. DO i = its , MIN(ide-1,ite)
  292. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  293. IF ( ( ( tsk(i,j) .LT. 170 ) .OR. ( tsk(i,j) .GT. 400 ) ) .AND. &
  294. ( ( tsk_old(i,j) .GT. 170 ) .AND. ( tsk_old(i,j) .LT. 400 ) ) )THEN
  295. tsk(i,j) = tsk_old(i,j)
  296. END IF
  297. IF ( ( ( tsk(i,j) .LT. 170 ) .OR. ( tsk(i,j) .GT. 400 ) ) .AND. &
  298. ( ( tsk_old(i,j) .LT. 170 ) .OR. ( tsk_old(i,j) .GT. 400 ) ) )THEN
  299. print *,'TSK woes in seaice post, i,j=',i,j,' tsk = ',tsk(i,j), tsk_old(i,j)
  300. CALL wrf_error_fatal ( 'TSK is unrealistic, problems for seaice post')
  301. ELSE IF ( ( xice(i,j) .GE. xice_threshold ) .OR. &
  302. ( ( landmask(i,j) .LT. 0.5 ) .AND. ( tsk(i,j) .LT. seaice_threshold ) ) ) THEN
  303. IF ( FRACTIONAL_SEAICE == 0 ) THEN
  304. xice(i,j) = 1.0
  305. ELSE
  306. xice(i,j)=max(0.25,xice(i,j))
  307. ENDIF
  308. num_seaice_changes = num_seaice_changes + 1
  309. if(landmask(i,j) .LT. 0.5 )tmn(i,j) = 271.4
  310. vegcat(i,j)=isice
  311. ivgtyp(i,j)=isice
  312. lu_index(i,j)=isice
  313. landmask(i,j)=1.
  314. xland(i,j)=1.
  315. vegfra(i,j)=0.
  316. DO loop=1,num_veg_cat
  317. landusef(i,loop,j)=0.
  318. END DO
  319. landusef(i,ivgtyp(i,j),j)=1.
  320. !tgs - compute blended sea ice/water skin temperature
  321. if(flag_sst.eq.1) then
  322. tsk(i,j) = xice(i,j)*(min(seaice_threshold,tsk(i,j))) &
  323. +(1-xice(i,j))*sst(i,j)
  324. else
  325. tsk(i,j) = xice(i,j)*(min(seaice_threshold,tsk(i,j))) &
  326. +(1-xice(i,j))*tsk(i,j)
  327. endif
  328. tsk_old(i,j) = tsk(i,j)
  329. isltyp(i,j) = 16
  330. soilcat(i,j)=isltyp(i,j)
  331. DO loop=1,num_soil_top_cat
  332. soilctop(i,loop,j)=0
  333. END DO
  334. DO loop=1,num_soil_bot_cat
  335. soilcbot(i,loop,j)=0
  336. END DO
  337. soilctop(i,isltyp(i,j),j)=1.
  338. soilcbot(i,isltyp(i,j),j)=1.
  339. total_depth = 3. ! ice is 3 m deep, num_soil_layers equispaced layers
  340. tslb(i,1,j) = tsk(i,j)
  341. tslb(i,num_soil_layers,j) = tmn(i,j)
  342. DO loop = 2,num_soil_layers-1
  343. mid_point_depth=(total_depth/num_soil_layers)/4. + &
  344. (loop-2)*(total_depth/num_soil_layers)
  345. tslb(i,loop,j) = ( (total_depth-mid_point_depth)*tsk(i,j) + &
  346. mid_point_depth*tmn(i,j) ) / total_depth
  347. END DO
  348. DO loop=1,num_soil_layers
  349. smois(i,loop,j) = 1.0
  350. sh2o(i,loop,j) = 0.0
  351. END DO
  352. ELSE IF ( xice(i,j) .LT. xice_threshold ) THEN
  353. xice(i,j) = 0.
  354. END IF
  355. END DO
  356. END DO
  357. IF ( num_seaice_changes .GT. 0 ) THEN
  358. WRITE ( message , FMT='(A,I6)' ) &
  359. 'Total post number of sea ice location changes (water to land) = ', num_seaice_changes
  360. CALL wrf_debug ( 0 , message )
  361. END IF
  362. END SELECT fix_seaice
  363. END SUBROUTINE adjust_for_seaice_post
  364. SUBROUTINE process_percent_cat_new ( landmask , &
  365. landuse_frac , soil_top_cat , soil_bot_cat , &
  366. isltyp , ivgtyp , &
  367. num_veg_cat , num_soil_top_cat , num_soil_bot_cat , &
  368. ids , ide , jds , jde , kds , kde , &
  369. ims , ime , jms , jme , kms , kme , &
  370. its , ite , jts , jte , kts , kte , &
  371. iswater )
  372. IMPLICIT NONE
  373. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  374. ims , ime , jms , jme , kms , kme , &
  375. its , ite , jts , jte , kts , kte , &
  376. iswater
  377. INTEGER , INTENT(IN) :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat
  378. REAL , DIMENSION(ims:ime,1:num_veg_cat,jms:jme) , INTENT(INOUT):: landuse_frac
  379. REAL , DIMENSION(ims:ime,1:num_soil_top_cat,jms:jme) , INTENT(IN):: soil_top_cat
  380. REAL , DIMENSION(ims:ime,1:num_soil_bot_cat,jms:jme) , INTENT(IN):: soil_bot_cat
  381. INTEGER , DIMENSION(ims:ime,jms:jme), INTENT(OUT) :: isltyp , ivgtyp
  382. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: landmask
  383. INTEGER :: i , j , l , ll, dominant_index
  384. REAL :: dominant_value
  385. #ifdef WRF_CHEM
  386. ! REAL :: lwthresh = .99
  387. REAL :: lwthresh = .50
  388. #else
  389. REAL :: lwthresh = .50
  390. #endif
  391. INTEGER , PARAMETER :: iswater_soil = 14
  392. INTEGER :: iforce
  393. CHARACTER (LEN=132) :: message
  394. CHARACTER(LEN=256) :: mminlu
  395. LOGICAL :: aggregate_lu
  396. integer :: change_water , change_land
  397. change_water = 0
  398. change_land = 0
  399. ! Sanity check on the 50/50 points
  400. DO j = jts , MIN(jde-1,jte)
  401. DO i = its , MIN(ide-1,ite)
  402. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  403. dominant_value = landuse_frac(i,iswater,j)
  404. IF ( dominant_value .EQ. lwthresh ) THEN
  405. DO l = 1 , num_veg_cat
  406. IF ( l .EQ. iswater ) CYCLE
  407. IF ( ( landuse_frac(i,l,j) .EQ. lwthresh ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
  408. PRINT *,i,j,' water and category ',l,' both at 50%, landmask is ',landmask(i,j)
  409. landuse_frac(i,l,j) = lwthresh - .01
  410. landuse_frac(i,iswater,j) = lwthresh + 0.01
  411. ELSE IF ( ( landuse_frac(i,l,j) .EQ. lwthresh ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
  412. PRINT *,i,j,' water and category ',l,' both at 50%, landmask is ',landmask(i,j)
  413. landuse_frac(i,l,j) = lwthresh + .01
  414. landuse_frac(i,iswater,j) = lwthresh - 0.01
  415. END IF
  416. END DO
  417. END IF
  418. END DO
  419. END DO
  420. ! Compute the aggregate of the vegetation/land use categories. Lump all of the grasses together,
  421. ! all of the shrubs, all of the trees, etc. Choose the correct set of available land use
  422. ! categories. Also, make sure that the user wants to actually avail themselves of aforementioned
  423. ! opportunity, as mayhaps they don't.
  424. CALL nl_get_mminlu ( 1 , mminlu )
  425. CALL nl_get_aggregate_lu ( 1 , aggregate_lu )
  426. IF ( aggregate_lu ) THEN
  427. DO j = jts , MIN(jde-1,jte)
  428. DO i = its , MIN(ide-1,ite)
  429. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  430. CALL aggregate_categories_part1 ( landuse_frac , iswater , num_veg_cat , mminlu(1:4) )
  431. END DO
  432. END DO
  433. END IF
  434. ! Compute the dominant VEGETATION INDEX.
  435. DO j = jts , MIN(jde-1,jte)
  436. DO i = its , MIN(ide-1,ite)
  437. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  438. dominant_value = landuse_frac(i,1,j)
  439. dominant_index = 1
  440. DO l = 2 , num_veg_cat
  441. IF ( l .EQ. iswater ) THEN
  442. ! wait a bit
  443. ELSE IF ( ( l .NE. iswater ) .AND. ( landuse_frac(i,l,j) .GT. dominant_value ) ) THEN
  444. dominant_value = landuse_frac(i,l,j)
  445. dominant_index = l
  446. END IF
  447. END DO
  448. IF ( landuse_frac(i,iswater,j) .GT. lwthresh ) THEN
  449. dominant_value = landuse_frac(i,iswater,j)
  450. dominant_index = iswater
  451. ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh) .AND. &
  452. ( landmask(i,j) .LT. 0.5) .AND. &
  453. ( dominant_value .EQ. lwthresh) ) THEN
  454. dominant_value = landuse_frac(i,iswater,j)
  455. dominant_index = iswater
  456. ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh) .AND. &
  457. ( landmask(i,j) .GT. 0.5) .AND. &
  458. ( dominant_value .EQ. lwthresh) ) THEN
  459. !no op
  460. ELSE IF ( ( landuse_frac(i,iswater,j) .EQ. lwthresh ) .AND. &
  461. ( dominant_value .LT. lwthresh ) ) THEN
  462. dominant_value = landuse_frac(i,iswater,j)
  463. dominant_index = iswater
  464. END IF
  465. IF ( dominant_index .EQ. iswater ) THEN
  466. if(landmask(i,j).gt.lwthresh) then
  467. !print *,'changing to water at point ',i,j
  468. !WRITE ( num_cat_count , FMT = '(I3)' ) num_veg_cat
  469. !WRITE ( message , FMT = '('//num_cat_count//'(i3,1x))' ) ints(1:num_veg_cat)
  470. !CALL wrf_debug(1,message)
  471. !WRITE ( message , FMT = '('//num_cat_count//'(i3,1x))' ) nint(landuse_frac(i,:,j)*100)
  472. !CALL wrf_debug(1,message)
  473. change_water=change_water+1
  474. endif
  475. landmask(i,j) = 0
  476. ELSE IF ( dominant_index .NE. iswater ) THEN
  477. if(landmask(i,j).lt.lwthresh) then
  478. !print *,'changing to land at point ',i,j
  479. !WRITE ( num_cat_count , FMT = '(I3)' ) num_veg_cat
  480. !WRITE ( message , FMT = '('//num_cat_count//'(i3,1x))' ) ints(1:num_veg_cat)
  481. !CALL wrf_debug(1,message)
  482. !WRITE ( message , FMT = '('//num_cat_count//'(i3,1x))' ) nint(landuse_frac(i,:,j)*100)
  483. !CALL wrf_debug(1,message)
  484. change_land=change_land+1
  485. endif
  486. landmask(i,j) = 1
  487. END IF
  488. ivgtyp(i,j) = dominant_index
  489. END DO
  490. END DO
  491. ! Compute the dominant SOIL TEXTURE INDEX, TOP.
  492. iforce = 0
  493. DO i = its , MIN(ide-1,ite)
  494. DO j = jts , MIN(jde-1,jte)
  495. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  496. dominant_value = soil_top_cat(i,1,j)
  497. dominant_index = 1
  498. IF ( landmask(i,j) .GT. lwthresh ) THEN
  499. DO l = 2 , num_soil_top_cat
  500. IF ( ( l .NE. iswater_soil ) .AND. ( soil_top_cat(i,l,j) .GT. dominant_value ) ) THEN
  501. dominant_value = soil_top_cat(i,l,j)
  502. dominant_index = l
  503. END IF
  504. END DO
  505. IF ( dominant_value .LT. 0.01 ) THEN
  506. iforce = iforce + 1
  507. WRITE ( message , FMT = '(A,I4,I4)' ) &
  508. 'based on landuse, changing soil to land at point ',i,j
  509. CALL wrf_debug(1,message)
  510. WRITE ( num_cat_count , FMT = '(I3)' ) num_soil_top_cat
  511. WRITE ( message , FMT = '('//num_cat_count//'(i3,1x))' ) (ints(l),l=1,num_soil_top_cat)
  512. CALL wrf_debug(1,message)
  513. WRITE ( message , FMT = '('//num_cat_count//'(i3,1x))' ) &
  514. ((nint(soil_top_cat(i,ints(l),j)*100)), l=1,num_soil_top_cat)
  515. CALL wrf_debug(1,message)
  516. dominant_index = 8
  517. END IF
  518. ELSE
  519. dominant_index = iswater_soil
  520. END IF
  521. isltyp(i,j) = dominant_index
  522. END DO
  523. END DO
  524. if(iforce.ne.0)then
  525. WRITE(message,FMT='(A,I4,A,I6)' ) &
  526. 'forcing artificial silty clay loam at ',iforce,' points, out of ',&
  527. (MIN(ide-1,ite)-its+1)*(MIN(jde-1,jte)-jts+1)
  528. CALL wrf_debug(0,message)
  529. endif
  530. print *,'LAND CHANGE = ',change_land
  531. print *,'WATER CHANGE = ',change_water
  532. END SUBROUTINE process_percent_cat_new
  533. SUBROUTINE process_soil_real ( tsk , tmn , tavgsfc, &
  534. landmask , sst , ht, toposoil, &
  535. st_input , sm_input , sw_input , &
  536. st_levels_input , sm_levels_input , sw_levels_input , &
  537. zs , dzs , tslb , smois , sh2o , &
  538. flag_sst , flag_tavgsfc, flag_soilhgt, &
  539. flag_soil_layers, flag_soil_levels, &
  540. ids , ide , jds , jde , kds , kde , &
  541. ims , ime , jms , jme , kms , kme , &
  542. its , ite , jts , jte , kts , kte , &
  543. sf_surface_physics , num_soil_layers , real_data_init_type , &
  544. num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
  545. num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc )
  546. IMPLICIT NONE
  547. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  548. ims , ime , jms , jme , kms , kme , &
  549. its , ite , jts , jte , kts , kte , &
  550. sf_surface_physics , num_soil_layers , real_data_init_type , &
  551. num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
  552. num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc
  553. INTEGER , INTENT(IN) :: flag_sst, flag_tavgsfc
  554. INTEGER , INTENT(IN) :: flag_soil_layers, flag_soil_levels, flag_soilhgt
  555. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: landmask , sst
  556. INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(INOUT) :: st_levels_input
  557. INTEGER , DIMENSION(1:num_sm_levels_input) , INTENT(INOUT) :: sm_levels_input
  558. INTEGER , DIMENSION(1:num_sw_levels_input) , INTENT(INOUT) :: sw_levels_input
  559. REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
  560. REAL , DIMENSION(ims:ime,1:num_sm_levels_alloc,jms:jme) , INTENT(INOUT) :: sm_input
  561. REAL , DIMENSION(ims:ime,1:num_sw_levels_alloc,jms:jme) , INTENT(INOUT) :: sw_input
  562. REAL, DIMENSION(1:num_soil_layers), INTENT(OUT) :: zs,dzs
  563. REAL , DIMENSION(ims:ime,num_soil_layers,jms:jme) , INTENT(OUT) :: tslb , smois , sh2o
  564. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: tavgsfc, ht, toposoil
  565. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tsk, tmn
  566. INTEGER :: i , j , k, l , dominant_index , num_soil_cat , num_veg_cat, closest_layer
  567. REAL :: dominant_value, closest_depth, diff_cm
  568. REAL , ALLOCATABLE , DIMENSION(:) :: depth ! Soil layer thicknesses (cm)
  569. REAL, PARAMETER :: get_temp_closest_to = 30. ! use soil temperature closest to this depth (cm)
  570. REAL, PARAMETER :: something_big = 1.e6 ! Initialize closest depth as something big (cm)
  571. INTEGER :: something_far = 1000 ! Soil array index far away
  572. CHARACTER (LEN=132) :: message
  573. ! Case statement for tmn initialization
  574. ! Need to have a reasonable default value for annual mean deeeeep soil temperature
  575. ! For sf_surface_physics = 1, we want to use close to a 30 cm value
  576. ! for the bottom level of the soil temps.
  577. ! NOTE: We are assuming that soil_layers are the same for each grid point
  578. fix_bottom_level_for_temp : SELECT CASE ( sf_surface_physics )
  579. CASE (SLABSCHEME)
  580. IF ( flag_tavgsfc .EQ. 1 ) THEN
  581. CALL wrf_debug ( 0 , 'Using average surface temperature for tmn')
  582. DO j = jts , MIN(jde-1,jte)
  583. DO i = its , MIN(ide-1,ite)
  584. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  585. tmn(i,j) = tavgsfc(i,j)
  586. END DO
  587. END DO
  588. ELSE
  589. ! Look for soil temp close to 30 cm
  590. closest_layer = something_far
  591. closest_depth = something_big
  592. DO k = 1, num_st_levels_input
  593. diff_cm = abs( st_levels_input(k) - get_temp_closest_to )
  594. IF ( diff_cm < closest_depth ) THEN
  595. closest_depth = diff_cm
  596. closest_layer = k
  597. END IF
  598. END DO
  599. IF ( closest_layer == something_far ) THEN
  600. CALL wrf_debug ( 0 , 'No soil temperature data for grid%tmn near 30 cm')
  601. CALL wrf_debug ( 0 , 'Using 1 degree static annual mean temps' )
  602. ELSE
  603. write(message, FMT='(A,F7.2,A,I3)')&
  604. 'Soil temperature closest to ',get_temp_closest_to, &
  605. ' at level ',st_levels_input(closest_layer)
  606. CALL wrf_debug ( 0 , message )
  607. DO j = jts , MIN(jde-1,jte)
  608. DO i = its , MIN(ide-1,ite)
  609. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  610. tmn(i,j) = st_input(i,closest_layer+1,j)
  611. END DO
  612. END DO
  613. END IF
  614. END IF
  615. CASE (LSMSCHEME)
  616. CASE (NOAHMPSCHEME)
  617. CASE (RUCLSMSCHEME)
  618. CASE (PXLSMSCHEME)
  619. ! When the input data from met_em is in layers, there is an additional level added to the beginning
  620. ! of the array to define the surface, which is why we add the extra value (closest_layer+1)
  621. IF ( flag_tavgsfc .EQ. 1 ) THEN
  622. CALL wrf_debug ( 0 , 'Using average surface temperature for tmn')
  623. DO j = jts , MIN(jde-1,jte)
  624. DO i = its , MIN(ide-1,ite)
  625. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  626. tmn(i,j) = tavgsfc(i,j)
  627. END DO
  628. END DO
  629. ELSE
  630. ! Look for soil temp close to 30 cm
  631. closest_layer = num_st_levels_input+1
  632. closest_depth = something_big
  633. DO k = 1, num_st_levels_input
  634. diff_cm = abs( st_levels_input(k) - get_temp_closest_to )
  635. IF ( diff_cm < closest_depth ) THEN
  636. closest_depth = diff_cm
  637. closest_layer = k
  638. END IF
  639. END DO
  640. IF ( closest_layer == num_st_levels_input + 1 ) THEN
  641. CALL wrf_debug ( 0 , 'No soil temperature data for grid%tmn near 30 cm')
  642. CALL wrf_debug ( 0 , 'Using 1 degree static annual mean temps' )
  643. ELSE
  644. write(message, FMT='(A,F7.2,A,I3)')&
  645. 'Soil temperature closest to ',get_temp_closest_to, &
  646. ' at level ',st_levels_input(closest_layer)
  647. CALL wrf_debug ( 0 , message )
  648. DO j = jts , MIN(jde-1,jte)
  649. DO i = its , MIN(ide-1,ite)
  650. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  651. tmn(i,j) = st_input(i,closest_layer+1,j)
  652. END DO
  653. END DO
  654. END IF
  655. END IF
  656. #if 0
  657. ! Loop over layers and do a weighted mean
  658. IF ( ALLOCATED ( depth ) ) DEALLOCATE ( depth )
  659. ALLOCATE ( depth(num_st_levels_input) )
  660. IF ( flag_soil_layers == 1 ) THEN
  661. DO k = num_st_levels_input, 2, -1
  662. depth(k) = st_levels_input(k) - st_levels_input(k-1)
  663. END DO
  664. depth(1) = st_levels_input(1)
  665. ELSE IF ( flag_soil_levels == 1 ) THEN
  666. DO k = 2, num_st_levels_input
  667. depth(k) = st_levels_input(k) - st_levels_input(k-1)
  668. END DO
  669. depth(1) = 0.
  670. END IF
  671. DO j = jts , MIN(jde-1,jte)
  672. DO i = its , MIN(ide-1,ite)
  673. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  674. tmn(i,j) = 0.
  675. DO k = 1, num_st_levels_input
  676. tmn(i,j) = tmn(i,j) + depth(k) * st_input(i,k,j)
  677. END DO
  678. END DO
  679. END DO
  680. DEALLOCATE ( depth )
  681. #endif
  682. END SELECT fix_bottom_level_for_temp
  683. ! Adjust the various soil temperature values depending on the difference in
  684. ! elevation between the current model's elevation and the incoming data's
  685. ! orography.
  686. adjust_soil : SELECT CASE ( sf_surface_physics )
  687. CASE ( SLABSCHEME , LSMSCHEME , NOAHMPSCHEME , RUCLSMSCHEME, PXLSMSCHEME, SSIBSCHEME )
  688. CALL adjust_soil_temp_new ( tmn , sf_surface_physics , tsk , ht , &
  689. toposoil , landmask , st_input, st_levels_input, &
  690. flag_soilhgt , flag_tavgsfc , &
  691. flag_soil_layers , flag_soil_levels, &
  692. num_st_levels_input, num_st_levels_alloc, &
  693. ids , ide , jds , jde , kds , kde , &
  694. ims , ime , jms , jme , kms , kme , &
  695. its , ite , jts , jte , kts , kte )
  696. END SELECT adjust_soil
  697. ! Initialize the soil depth, and the soil temperature and moisture.
  698. IF ( ( sf_surface_physics .EQ. SLABSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  699. CALL init_soil_depth_1 ( zs , dzs , num_soil_layers )
  700. CALL init_soil_1_real ( tsk , tmn , tslb , zs , dzs , num_soil_layers , real_data_init_type , &
  701. landmask , sst , flag_sst , &
  702. ids , ide , jds , jde , kds , kde , &
  703. ims , ime , jms , jme , kms , kme , &
  704. its , ite , jts , jte , kts , kte )
  705. ELSE IF ( ( sf_surface_physics .EQ. LSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  706. CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
  707. CALL init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , &
  708. st_input , sm_input , sw_input , landmask , sst , &
  709. zs , dzs , &
  710. st_levels_input , sm_levels_input , sw_levels_input , &
  711. num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
  712. num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
  713. flag_sst , flag_soil_layers , flag_soil_levels , &
  714. ids , ide , jds , jde , kds , kde , &
  715. ims , ime , jms , jme , kms , kme , &
  716. its , ite , jts , jte , kts , kte )
  717. ELSE IF ( ( sf_surface_physics .EQ. NOAHMPSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  718. CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
  719. CALL init_soil_2_real ( tsk , tmn , smois , sh2o , tslb , &
  720. st_input , sm_input , sw_input , landmask , sst , &
  721. zs , dzs , &
  722. st_levels_input , sm_levels_input , sw_levels_input , &
  723. num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
  724. num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
  725. flag_sst , flag_soil_layers , flag_soil_levels , &
  726. ids , ide , jds , jde , kds , kde , &
  727. ims , ime , jms , jme , kms , kme , &
  728. its , ite , jts , jte , kts , kte )
  729. ELSE IF ( ( sf_surface_physics .EQ. RUCLSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  730. CALL init_soil_depth_3 ( zs , dzs , num_soil_layers )
  731. CALL init_soil_3_real ( tsk , tmn , smois , tslb , &
  732. st_input , sm_input , landmask , sst , &
  733. zs , dzs , &
  734. st_levels_input , sm_levels_input , &
  735. num_soil_layers , num_st_levels_input , num_sm_levels_input , &
  736. num_st_levels_alloc , num_sm_levels_alloc , &
  737. flag_sst , flag_soil_layers , flag_soil_levels , &
  738. ids , ide , jds , jde , kds , kde , &
  739. ims , ime , jms , jme , kms , kme , &
  740. its , ite , jts , jte , kts , kte )
  741. ELSE IF ( ( sf_surface_physics .EQ. PXLSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  742. CALL init_soil_depth_7 ( zs , dzs , num_soil_layers )
  743. CALL init_soil_7_real ( tsk , tmn , smois , sh2o, tslb , &
  744. st_input , sm_input , sw_input, landmask , sst , &
  745. zs , dzs , &
  746. st_levels_input , sm_levels_input , sw_levels_input, &
  747. num_soil_layers , num_st_levels_input , num_sm_levels_input , num_sw_levels_input , &
  748. num_st_levels_alloc , num_sm_levels_alloc , num_sw_levels_alloc , &
  749. flag_sst , flag_soil_layers , flag_soil_levels , &
  750. ids , ide , jds , jde , kds , kde , &
  751. ims , ime , jms , jme , kms , kme , &
  752. its , ite , jts , jte , kts , kte )
  753. ELSE IF ( ( sf_surface_physics .EQ. 8 ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  754. CALL init_soil_depth_8 ( zs , dzs , num_soil_layers )
  755. CALL init_soil_3_real ( tsk , tmn , smois , tslb , &
  756. st_input , sm_input , landmask , sst , &
  757. zs , dzs , &
  758. st_levels_input , sm_levels_input , &
  759. num_soil_layers , num_st_levels_input , num_sm_levels_input , &
  760. num_st_levels_alloc , num_sm_levels_alloc , &
  761. flag_sst , flag_soil_layers , flag_soil_levels , &
  762. ids , ide , jds , jde , kds , kde , &
  763. ims , ime , jms , jme , kms , kme , &
  764. its , ite , jts , jte , kts , kte )
  765. END IF
  766. END SUBROUTINE process_soil_real
  767. SUBROUTINE process_soil_ideal ( xland,xice,vegfra,snow,canwat, &
  768. ivgtyp,isltyp,tslb,smois, &
  769. tsk,tmn,zs,dzs, &
  770. num_soil_layers, &
  771. sf_surface_physics , &
  772. ids,ide, jds,jde, kds,kde,&
  773. ims,ime, jms,jme, kms,kme,&
  774. its,ite, jts,jte, kts,kte )
  775. IMPLICIT NONE
  776. INTEGER, INTENT(IN) ::ids,ide, jds,jde, kds,kde, &
  777. ims,ime, jms,jme, kms,kme, &
  778. its,ite, jts,jte, kts,kte
  779. INTEGER, INTENT(IN) :: num_soil_layers , sf_surface_physics
  780. REAL, DIMENSION( ims:ime, num_soil_layers, jms:jme ) , INTENT(INOUT) :: smois, tslb
  781. REAL, DIMENSION(num_soil_layers), INTENT(OUT) :: dzs,zs
  782. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT) :: tsk, tmn
  783. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: xland, snow, canwat, xice, vegfra
  784. INTEGER, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT) :: ivgtyp, isltyp
  785. ! Local variables.
  786. INTEGER :: itf,jtf
  787. itf=MIN(ite,ide-1)
  788. jtf=MIN(jte,jde-1)
  789. IF ( ( sf_surface_physics .EQ. SLABSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  790. CALL init_soil_depth_1 ( zs , dzs , num_soil_layers )
  791. CALL init_soil_1_ideal(tsk,tmn,tslb,xland, &
  792. ivgtyp,zs,dzs,num_soil_layers, &
  793. ids,ide, jds,jde, kds,kde, &
  794. ims,ime, jms,jme, kms,kme, &
  795. its,ite, jts,jte, kts,kte )
  796. ELSE IF ( ( sf_surface_physics .EQ. LSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  797. CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
  798. CALL init_soil_2_ideal ( xland,xice,vegfra,snow,canwat, &
  799. ivgtyp,isltyp,tslb,smois,tmn, &
  800. num_soil_layers, &
  801. ids,ide, jds,jde, kds,kde, &
  802. ims,ime, jms,jme, kms,kme, &
  803. its,ite, jts,jte, kts,kte )
  804. ELSE IF ( ( sf_surface_physics .EQ. NOAHMPSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  805. CALL init_soil_depth_2 ( zs , dzs , num_soil_layers )
  806. CALL init_soil_2_ideal ( xland,xice,vegfra,snow,canwat, &
  807. ivgtyp,isltyp,tslb,smois,tmn, &
  808. num_soil_layers, &
  809. ids,ide, jds,jde, kds,kde, &
  810. ims,ime, jms,jme, kms,kme, &
  811. its,ite, jts,jte, kts,kte )
  812. ELSE IF ( ( sf_surface_physics .EQ. RUCLSMSCHEME ) .AND. ( num_soil_layers .GT. 1 ) ) THEN
  813. CALL init_soil_depth_3 ( zs , dzs , num_soil_layers )
  814. END IF
  815. END SUBROUTINE process_soil_ideal
  816. SUBROUTINE adjust_soil_temp_new ( tmn , sf_surface_physics , tsk , ter , &
  817. toposoil , landmask , st_input , st_levels_input, &
  818. flag_toposoil , flag_tavgsfc , &
  819. flag_soil_layers , flag_soil_levels, &
  820. num_st_levels_input, num_st_levels_alloc, &
  821. ids , ide , jds , jde , kds , kde , &
  822. ims , ime , jms , jme , kms , kme , &
  823. its , ite , jts , jte , kts , kte )
  824. IMPLICIT NONE
  825. INTEGER , INTENT(IN) :: ids , ide , jds , jde , kds , kde , &
  826. ims , ime , jms , jme , kms , kme , &
  827. its , ite , jts , jte , kts , kte
  828. INTEGER , INTENT(IN) :: num_st_levels_input, num_st_levels_alloc
  829. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(IN) :: ter , toposoil , landmask
  830. REAL , DIMENSION(ims:ime,jms:jme) , INTENT(INOUT) :: tmn , tsk
  831. REAL , DIMENSION(ims:ime,1:num_st_levels_alloc,jms:jme) , INTENT(INOUT) :: st_input
  832. INTEGER , DIMENSION(1:num_st_levels_input) , INTENT(IN) :: st_levels_input
  833. INTEGER , INTENT(IN) :: sf_surface_physics , flag_toposoil , flag_tavgsfc
  834. INTEGER , INTENT(IN) :: flag_soil_layers , flag_soil_levels
  835. INTEGER :: i , j, k , st_near_sfc
  836. REAL :: soil_elev_min_val , soil_elev_max_val , soil_elev_min_dif , soil_elev_max_dif
  837. ! Adjust the annual mean temperature as if it is based on from a sea-level elevation
  838. ! if the value used is from the actual annula mean data set. If the input field to
  839. ! be used for tmn is one of the first-guess input temp fields, need to do an adjustment
  840. ! only on the diff in topo from the model terrain and the first-guess terrain.
  841. SELECT CASE ( sf_surface_physics )
  842. CASE ( LSMSCHEME , NOAHMPSCHEME )
  843. DO j = jts , MIN(jde-1,jte)
  844. DO i = its , MIN(ide-1,ite)
  845. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  846. IF (landmask(i,j) .GT. 0.5 ) THEN
  847. tmn(i,j) = tmn(i,j) - 0.0065 * ter(i,j)
  848. END IF
  849. END DO
  850. END DO
  851. CASE (RUCLSMSCHEME)
  852. DO j = jts , MIN(jde-1,jte)
  853. DO i = its , MIN(ide-1,ite)
  854. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  855. IF (landmask(i,j) .GT. 0.5 ) THEN
  856. tmn(i,j) = tmn(i,j) - 0.0065 * ter(i,j)
  857. END IF
  858. END DO
  859. END DO
  860. END SELECT
  861. ! Do we have a soil field with which to modify soil temperatures?
  862. IF ( flag_toposoil .EQ. 1 ) THEN
  863. DO j = jts , MIN(jde-1,jte)
  864. DO i = its , MIN(ide-1,ite)
  865. IF ( skip_middle_points_t ( ids , ide , jds , jde , i , j , em_width , hold_ups ) ) CYCLE
  866. ! Is the toposoil field OK, or is it a subversive soil elevation field. We can tell
  867. ! usually by looking at values. Anything less than -1000 m (lower than the Dead Sea) is
  868. ! bad. Anything larger than 10 km (taller than Everest) is toast. Also, anything where
  869. ! the difference between the soil elevation and the terrain is greater than 3 km means
  870. ! that the soil data is either all zeros or that the data are inconsistent. Any of these
  871. ! three conditions is grievous enough to induce a WRF fatality. However, if they are at
  872. ! a water point, then we can safely ignore them.
  873. soil_elev_min_val = toposoil(i,j)
  874. soil_elev_max_val = toposoil(i,j)
  875. soil_elev_min_dif = ter(i,j) - toposoil(i,j)
  876. soil_elev_max_dif = ter(i,j) - toposoil(i,j)
  877. IF ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .LT. 0.5 ) ) THEN
  878. CYCLE
  879. ELSE IF ( ( soil_elev_min_val .LT. -1000 ) .AND. ( landmask(i,j) .GT. 0.5 ) ) THEN
  880. !print *,'no soil temperature elevation adjustment, soil height too small = ',toposoil(i,j)
  881. cycle
  882. ! CALL wrf_error_f

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