PageRenderTime 122ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

/wrfv2_fire/phys/module_surface_driver.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 4662 lines | 3098 code | 345 blank | 1219 comment | 27 complexity | 2cebd156424e3b0f3c100847e14ccdf1 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MEDIATION_LAYER:PHYSICS
  2. !
  3. MODULE module_surface_driver
  4. CONTAINS
  5. SUBROUTINE surface_driver( &
  6. & acgrdflx,achfx,aclhf &
  7. & ,acsnom,acsnow,akhs,akms,albedo,br,canwat &
  8. & ,chklowq,dt,dx,dz8w,dzs,glw &
  9. & ,grdflx,gsw,swdown,gz1oz0,hfx,ht,ifsnow,isfflx &
  10. & ,fractional_seaice,seaice_albedo_opt,tice2tsk_if2cold &
  11. & ,isltyp,itimestep,julian_in,ivgtyp,lowlyr,mavail,rmol &
  12. & ,num_soil_layers,p8w,pblh,pi_phy,pshltr,psih &
  13. #if (NMM_CORE==1)
  14. & ,psim,p_phy,q10,q2,qfx,taux,tauy,qsfc,qshltr,qz0 &
  15. #else
  16. & ,psim,p_phy,q10,q2,qfx,qsfc,qshltr,qz0 &
  17. #endif
  18. & ,raincv,rho,sfcevp,sfcexc,sfcrunoff &
  19. & ,smois,smstav,smstot,snoalb,snow,snowc,snowh,stepbl &
  20. & ,smcrel &
  21. & ,th10,th2,thz0,th_phy,tmn,tshltr,tsk,tslb &
  22. & ,tyr,tyra,tdly,tlag,lagday,nyear,nday,tmn_update,yr &
  23. & ,t_phy,u10,udrunoff,ust,uz0,u_frame,u_phy,v10,vegfra &
  24. & ,vz0,v_frame,v_phy,warm_rain,wspd,xice,xland,z,znt,zs &
  25. #if (NMM_CORE==1)
  26. & ,xicem,isice,iswater,ct,tke_pbl,sfenth &
  27. #else
  28. & ,xicem,isice,iswater,ct,tke_pbl &
  29. #endif
  30. & ,albbck,embck,lh,sh2o,shdmax,shdmin,z0 &
  31. & ,flqc,flhc,psfc,sst,sstsk,dtw,sst_update,sst_skin &
  32. & ,scm_force_skintemp,scm_force_flux,t2,emiss &
  33. & ,sf_sfclay_physics,sf_surface_physics,ra_lw_physics &
  34. & ,mosaic_lu,mosaic_soil &
  35. & ,landusef,soilctop,soilcbot,ra,rs,nlcat,nscat,vegf_px & ! PX-LSM
  36. & ,snowncv, anal_interval, lai, pxlsm_smois_init & ! PX-LSM
  37. & ,pxlsm_soil_nudge & ! PX-LSM
  38. & ,idveg, iopt_crs, iopt_btr, iopt_run, iopt_sfc, iopt_frz, iopt_inf &
  39. & ,iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot, iopt_stc &
  40. & ,isnowxy ,tvxy ,tgxy ,canicexy &
  41. & ,canliqxy ,eahxy ,tahxy ,cmxy ,chxy &
  42. & ,fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy &
  43. & ,wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy &
  44. & ,stmassxy ,woodxy ,stblcpxy ,fastcpxy ,xsaixy &
  45. & ,tradxy ,tsxy ,neexy ,gppxy ,nppxy ,fvegxy ,qinxy &
  46. & ,runsfxy ,runsbxy ,ecanxy ,edirxy ,etranxy ,fsaxy ,firaxy &
  47. & ,aparxy ,psnxy ,savxy ,sagxy &
  48. & ,fsnoxy &
  49. & ,t2mvxy ,t2mbxy ,chstarxy ,rssunxy ,rsshaxy ,bgapxy ,wgapxy &
  50. & ,gapxy ,tgvxy ,tgbxy ,q2mvxy ,q2mbxy ,chvxy ,chbxy &
  51. #if ( EM_CORE==1)
  52. & ,ch,tsq,qsq,cov & ! MYNN
  53. #endif
  54. ! Optional urban
  55. & ,slope_rad,topo_shading,shadowmask & !I solar
  56. & ,swnorm,slope,slp_azi & !I solar
  57. & ,declin,solcon,coszen,hrang,xlat_urb2d & !I solar/urban
  58. & ,num_roof_layers, num_wall_layers & !I urban
  59. & ,num_road_layers, dzr, dzb, dzg & !I urban
  60. & ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d & !H urban
  61. & ,uc_urb2d & !H urban
  62. & ,xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d & !H urban
  63. & ,trl_urb3d,tbl_urb3d,tgl_urb3d & !H urban
  64. & ,sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d,ts_urb2d & !H urban
  65. & ,frc_urb2d, utype_urb2d & !H urban
  66. & ,cmr_sfcdif,chr_sfcdif,cmc_sfcdif,chc_sfcdif &
  67. !-----SSiB LSM (fds 06/2010)---------------------------------------------------
  68. & ,alswvisdir, alswvisdif, alswnirdir, alswnirdif & ! ssib
  69. & ,swvisdir, swvisdif, swnirdir, swnirdif & ! ssib
  70. & ,ssib_br ,ssib_fm ,ssib_fh ,ssib_cm ,ssibxdd & ! ssib
  71. & ,ssib_lhf ,ssib_shf ,ssib_ghf ,ssib_egs ,ssib_eci & ! ssib
  72. & ,ssib_ect ,ssib_egi ,ssib_egt ,ssib_sdn ,ssib_sup & ! ssib
  73. & ,ssib_ldn ,ssib_lup ,ssib_wat ,ssib_shc ,ssib_shg & ! ssib
  74. & ,ssib_lai ,ssib_vcf ,ssib_z00 ,ssib_veg & ! ssib
  75. & ,ISNOW ,SWE ,SNOWDEN ,SNOWDEPTH ,TKAIR & ! ssib-snow
  76. & ,DZO1 ,WO1 ,TSSN1 ,TSSNO1 ,BWO1 ,BTO1 & ! ssib-snow
  77. & ,CTO1 ,FIO1 ,FLO1 ,BIO1 ,BLO1 ,HO1 & ! ssib-snow
  78. & ,DZO2 ,WO2 ,TSSN2 ,TSSNO2 ,BWO2 ,BTO2 & ! ssib-snow
  79. & ,CTO2 ,FIO2 ,FLO2 ,BIO2 ,BLO2 ,HO2 & ! ssib-snow
  80. & ,DZO3 ,WO3 ,TSSN3 ,TSSNO3 ,BWO3 ,BTO3 & ! ssib-snow
  81. & ,CTO3 ,FIO3 ,FLO3 ,BIO3 ,BLO3 ,HO3 & ! ssib-snow
  82. & ,DZO4 ,WO4 ,TSSN4 ,TSSNO4 ,BWO4 ,BTO4 & ! ssib-snow
  83. & ,CTO4 ,FIO4 ,FLO4 ,BIO4 ,BLO4 ,HO4 & ! ssib-snow
  84. & ,ra_sw_physics & ! ssib
  85. !------------------------------------------------------------------------------
  86. & , ids,ide,jds,jde,kds,kde &
  87. & , ims,ime,jms,jme,kms,kme &
  88. & , i_start,i_end,j_start,j_end,kts,kte,num_tiles &
  89. ! Optional moisture tracers
  90. & ,qv_curr, qc_curr, qr_curr &
  91. & ,qi_curr, qs_curr, qg_curr &
  92. ! Optional moisture tracer flags
  93. & ,f_qv,f_qc,f_qr &
  94. & ,f_qi,f_qs,f_qg &
  95. ! Other optionals (more or less em specific)
  96. & ,capg,hol,mol &
  97. & ,rainncv,rainshv,rainbl,regime,thc &
  98. & ,qsg,qvg,qcg,soilt1,tsnav &
  99. & ,smfr3d,keepfr3dflag,dew &
  100. ! Other optionals (more or less nmm specific)
  101. & ,potevp,snopcx,soiltb,sr &
  102. ! Optional observation PX LSM surface nudging
  103. & ,t2_ndg_old, q2_ndg_old, t2_ndg_new, q2_ndg_new &
  104. & ,sn_ndg_old, sn_ndg_new &
  105. & ,t2obs, q2obs &
  106. ! OPTIONAL, Required by TEMF surface layer 1/7/09 WA
  107. & ,hd_temf,te_temf,fCor,exch_temf,wm_temf &
  108. ! Required by ideal SCM surface layer 1/6/10 WA
  109. & ,hfx_force,lh_force,tsk_force &
  110. & ,hfx_force_tend,lh_force_tend,tsk_force_tend &
  111. ! Optional observation nudging
  112. & ,uratx,vratx,tratx &
  113. ! Optional simple oml model
  114. & ,omlcall,oml_hml0,oml_gamma &
  115. & ,tml,t0ml,hml,h0ml,huml,hvml,f,tmoml &
  116. & ,ustm,ck,cka,cd,cda,isftcflx,iz0tlnd &
  117. & ,isurban, mminlu &
  118. & ,snotime &
  119. & ,rdlai2d &
  120. & ,usemonalb &
  121. & ,noahres &
  122. ! Optional adaptive time step
  123. & ,bldt,curr_secs,adapt_step_flag,bldtacttime &
  124. ! Optional urban with BEP
  125. & ,sf_urban_physics,gmt,xlat,xlong,julday &
  126. & ,num_urban_layers & !multi-layer urban
  127. & ,trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d & !multi-layer urban
  128. & ,tlev_urb3d,qlev_urb3d & !multi-layer urban
  129. & ,tw1lev_urb3d,tw2lev_urb3d & !multi-layer urban
  130. & ,tglev_urb3d,tflev_urb3d & !multi-layer urban
  131. & ,sf_ac_urb3d,lf_ac_urb3d,cm_ac_urb3d & !multi-layer urban
  132. & ,sfvent_urb3d,lfvent_urb3d & !multi-layer urban
  133. & ,sfwin1_urb3d,sfwin2_urb3d & !multi-layer urban
  134. & ,sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d & !multi-layer urban
  135. & ,a_u_bep,a_v_bep,a_t_bep,a_q_bep &
  136. & ,b_u_bep,b_v_bep,b_t_bep,b_q_bep &
  137. & ,sf_bep,vl_bep &
  138. & ,a_e_bep,b_e_bep,dlg_bep &
  139. & ,dl_u_bep &
  140. & ,cldfra & !ssib
  141. ! Optional urban Bep end
  142. & )
  143. #if ( ! NMM_CORE == 1 )
  144. USE module_state_description, ONLY : SFCLAYSCHEME &
  145. ,SFCLAYREVSCHEME &
  146. ,MYJSFCSCHEME &
  147. ,QNSESFCSCHEME &
  148. ,GFSSFCSCHEME &
  149. ,PXSFCSCHEME &
  150. ,NOAHMPSCHEME &
  151. ,TEMFSFCSCHEME &
  152. ,IDEALSCMSFCSCHEME &
  153. ,SLABSCHEME &
  154. ,LSMSCHEME &
  155. ,RUCLSMSCHEME &
  156. ,PXLSMSCHEME &
  157. ,SSIBSCHEME & !ssib
  158. ,MYNNSFCSCHEME
  159. #else
  160. USE module_state_description, ONLY : SFCLAYSCHEME &
  161. ,SFCLAYREVSCHEME &
  162. ,MYJSFCSCHEME &
  163. ,QNSESFCSCHEME &
  164. ,GFSSFCSCHEME &
  165. ,PXSFCSCHEME &
  166. ,NOAHMPSCHEME &
  167. ,SLABSCHEME &
  168. ,LSMSCHEME &
  169. ,RUCLSMSCHEME &
  170. ,PXLSMSCHEME &
  171. ,TEMFSFCSCHEME &
  172. ,GFDLSFCSCHEME &
  173. ,SSIBSCHEME & ! ssib
  174. ,GFDLSLAB
  175. #endif
  176. USE module_model_constants
  177. ! *** add new modules of schemes here
  178. USE module_sf_sfclay
  179. USE module_sf_myjsfc
  180. USE module_sf_qnsesfc
  181. USE module_sf_gfs
  182. USE module_sf_noahdrv, only : lsm
  183. USE module_sf_noahmpdrv, only : noahmplsm
  184. USE module_sf_noah_seaice_drv
  185. USE module_sf_ssib ! ssib
  186. USE module_sf_ruclsm
  187. USE module_sf_pxsfclay
  188. USE module_sf_pxlsm
  189. USE module_sf_temfsfclay
  190. USE module_sf_sfclayrev
  191. USE module_sf_noah_seaice_drv
  192. #if ( EM_CORE==1)
  193. USE module_sf_mynn
  194. USE module_sf_oml
  195. USE module_sf_idealscmsfclay
  196. #endif
  197. USE module_sf_scmflux
  198. USE module_sf_scmskintemp
  199. #if ( NMM_CORE == 1 )
  200. USE module_sf_gfdl
  201. #endif
  202. USE module_sf_slab
  203. !
  204. USE module_sf_sfcdiags
  205. USE module_sf_sfcdiags_ruclsm
  206. USE module_sf_sstskin
  207. USE module_sf_tmnupdate
  208. !
  209. ! This driver calls subroutines for the surface parameterizations.
  210. !
  211. ! surface layer: (between surface and pbl)
  212. ! 1. sfclay
  213. ! 2. myjsfc
  214. ! 7. Pleim surface layer
  215. ! 5. MYNN surface layer
  216. ! surface: ground temp/lsm scheme:
  217. ! 1. slab
  218. ! 2. Noah LSM
  219. ! 7. Pleim-Xiu LSM
  220. ! 11. Revised sfclay (option 1)
  221. !
  222. ! surface: ground temp/lsm scheme for urban:
  223. ! 2. BEP
  224. !
  225. ! ocean mixed layer model
  226. ! omlcall = 1
  227. !------------------------------------------------------------------
  228. IMPLICIT NONE
  229. !======================================================================
  230. ! Grid structure in physics part of WRF
  231. !----------------------------------------------------------------------
  232. ! The horizontal velocities used in the physics are unstaggered
  233. ! relative to temperature/moisture variables. All predicted
  234. ! variables are carried at half levels except w, which is at full
  235. ! levels. Some arrays with names (*8w) are at w (full) levels.
  236. !
  237. !----------------------------------------------------------------------
  238. ! In WRF, kms (smallest number) is the bottom level and kme (largest
  239. ! number) is the top level. In your scheme, if 1 is at the top level,
  240. ! then you have to reverse the order in the k direction.
  241. !
  242. ! kme - half level (no data at this level)
  243. ! kme ----- full level
  244. ! kme-1 - half level
  245. ! kme-1 ----- full level
  246. ! .
  247. ! kms+2 - half level
  248. ! kms+2 ----- full level
  249. ! kms+1 - half level
  250. ! kms+1 ----- full level
  251. ! kms - half level
  252. ! kms ----- full level
  253. !
  254. !======================================================================
  255. ! Definitions
  256. !-----------
  257. ! Theta potential temperature (K)
  258. ! Qv water vapor mixing ratio (kg/kg)
  259. ! Qc cloud water mixing ratio (kg/kg)
  260. ! Qr rain water mixing ratio (kg/kg)
  261. ! Qi cloud ice mixing ratio (kg/kg)
  262. ! Qs snow mixing ratio (kg/kg)
  263. !-----------------------------------------------------------------
  264. !-- itimestep number of time steps
  265. !-- GLW downward long wave flux at ground surface (W/m^2)
  266. !-- GSW net short wave flux at ground surface (W/m^2)
  267. !-- SWDOWN downward short wave flux at ground surface (W/m^2)
  268. !-- EMISS surface emissivity (between 0 and 1)
  269. !-- TSK surface temperature (K)
  270. !-- TMN soil temperature at lower boundary (K)
  271. !-- TYR annual mean surface temperature of previous year (K)
  272. !-- TYRA accumulated surface temperature in the current year (K)
  273. !-- TLAG mean surface temperature of previous 140 days (K)
  274. !-- TDLY accumulated daily mean surface temperature of the current day (K)
  275. !-- XLAND land mask (1 for land, 2 for water)
  276. !-- ZNT time-varying roughness length (m)
  277. !-- Z0 background roughness length (m)
  278. !-- MAVAIL surface moisture availability (between 0 and 1)
  279. !-- UST u* in similarity theory (m/s)
  280. !-- MOL T* (similarity theory) (K)
  281. !-- HOL PBL height over Monin-Obukhov length
  282. !-- PBLH PBL height (m)
  283. !-- CAPG heat capacity for soil (J/K/m^3)
  284. !-- THC thermal inertia (Cal/cm/K/s^0.5)
  285. !-- SNOWC flag indicating snow coverage (1 for snow cover)
  286. !-- HFX net upward heat flux at the surface (W/m^2)
  287. !-- QFX net upward moisture flux at the surface (kg/m^2/s)
  288. !-- TAUX RHO*U**2 for ocean coupling
  289. !-- TAUY RHO*U**2 for ocean coupling
  290. !-- LH net upward latent heat flux at surface (W/m^2)
  291. !-- REGIME flag indicating PBL regime (stable, unstable, etc.)
  292. !-- tke_pbl turbulence kinetic energy from PBL schemes (m^2/s^2)
  293. !-- akhs sfc exchange coefficient of heat/moisture from MYJ
  294. !-- akms sfc exchange coefficient of momentum from MYJ
  295. !-- thz0 potential temperature at roughness length (K)
  296. !-- uz0 u wind component at roughness length (m/s)
  297. !-- vz0 v wind component at roughness length (m/s)
  298. !-- qsfc specific humidity at lower boundary (kg/kg)
  299. !-- uratx ratio of u over u10 (Added for obs-nudging)
  300. !-- vratx ratio of v over v10 (Added for obs-nudging)
  301. !-- tratx ratio of t over th2 (Added for obs-nudging)
  302. !-- u10 diagnostic 10-m u component from surface layer
  303. !-- v10 diagnostic 10-m v component from surface layer
  304. !-- th2 diagnostic 2-m theta from surface layer and lsm
  305. !-- t2 diagnostic 2-m temperature from surface layer and lsm
  306. !-- q2 diagnostic 2-m mixing ratio from surface layer and lsm
  307. !-- tshltr diagnostic 2-m theta from MYJ
  308. !-- th10 diagnostic 10-m theta from MYJ
  309. !-- qshltr diagnostic 2-m specific humidity from MYJ
  310. !-- q10 diagnostic 10-m specific humidity from MYJ
  311. !-- lowlyr index of lowest model layer above ground
  312. !-- rr dry air density (kg/m^3)
  313. !-- u_phy u-velocity interpolated to theta points (m/s)
  314. !-- v_phy v-velocity interpolated to theta points (m/s)
  315. !-- th_phy potential temperature (K)
  316. !-- moist moisture array (4D - last index is species) (kg/kg)
  317. !-- p_phy pressure (Pa)
  318. !-- pi_phy exner function (dimensionless)
  319. !-- pshltr diagnostic shelter (2m) pressure from MYJ (Pa)
  320. !-- p8w pressure at full levels (Pa)
  321. !-- t_phy temperature (K)
  322. !-- dz8w dz between full levels (m)
  323. !-- z height above sea level (m)
  324. !-- DX horizontal space interval (m)
  325. !-- DT time step (second)
  326. !-- PSFC pressure at the surface (Pa)
  327. !-- SST sea-surface temperature (K)
  328. !-- SSTSK skin sea-surface temperature (K)
  329. !-- DTW warm layer temp diff (K)
  330. !-- TSLB
  331. !-- ZS
  332. !-- DZS
  333. !-- num_soil_layers number of soil layer
  334. !-- IFSNOW ifsnow=1 for snow-cover effects
  335. !-- omlcall whether to call simple ocean mixed layer model from slab (1 = use oml)
  336. !-- oml_hml0 initial mixed layer depth (if real-data not available, default 50 m)
  337. !-- oml_gamma lapse rate below mixed layer in ocean (default 0.14 K m-1)
  338. !-- ck enthalpy exchange coeff at 10 meters
  339. !-- cd momentum exchange coeff at 10 meters
  340. !-- cka enthalpy exchange coeff at the lowest model level
  341. !-- cda momentum exchange coeff at the lowest model level
  342. !!!!!!!!!!!!!!
  343. !
  344. !
  345. !-- LANDUSEF Landuse fraction ! P-X LSM
  346. !-- SOILCTOP Top soil fraction ! P-X LSM
  347. !-- SOILCBOT Bottom soil fraction ! P-X LSM
  348. !-- RA Aerodynamic resistence ! P-X LSM
  349. !-- RS Stomatal resistence ! P-X LSM
  350. !-- NLCAT Number of landuse categories ! P-X LSM
  351. !-- NSCAT Number of soil categories ! P-X LSM
  352. !-- ch - drag coefficient for heat/moisture ! MYNN LSM
  353. !
  354. !-- ids start index for i in domain
  355. !-- ide end index for i in domain
  356. !-- jds start index for j in domain
  357. !-- jde end index for j in domain
  358. !-- kds start index for k in domain
  359. !-- kde end index for k in domain
  360. !-- ims start index for i in memory
  361. !-- ime end index for i in memory
  362. !-- jms start index for j in memory
  363. !-- jme end index for j in memory
  364. !-- kms start index for k in memory
  365. !-- kme end index for k in memory
  366. !-- its start index for i in tile
  367. !-- ite end index for i in tile
  368. !-- jts start index for j in tile
  369. !-- jte end index for j in tile
  370. !-- kts start index for k in tile
  371. !-- kte end index for k in tile
  372. !
  373. !******************************************************************
  374. !------------------------------------------------------------------
  375. INTEGER, INTENT(IN) :: &
  376. & ids,ide,jds,jde,kds,kde &
  377. & ,ims,ime,jms,jme,kms,kme &
  378. & ,kts,kte,num_tiles
  379. INTEGER, INTENT(IN):: FRACTIONAL_SEAICE
  380. INTEGER, INTENT(IN):: SEAICE_ALBEDO_OPT
  381. INTEGER, INTENT(IN):: NLCAT, mosaic_lu, mosaic_soil
  382. INTEGER, INTENT(IN):: NSCAT
  383. INTEGER, INTENT(IN) :: sf_sfclay_physics, sf_surface_physics, &
  384. sf_urban_physics,ra_lw_physics,sst_update, &
  385. ra_sw_physics
  386. INTEGER, INTENT(IN),OPTIONAL :: sst_skin, tmn_update, &
  387. scm_force_skintemp, scm_force_flux
  388. INTEGER, DIMENSION(num_tiles), INTENT(IN) :: &
  389. & i_start,i_end,j_start,j_end
  390. INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: ISLTYP
  391. INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: IVGTYP
  392. INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: LOWLYR
  393. INTEGER, INTENT(IN ):: IFSNOW
  394. INTEGER, INTENT(IN ):: ISFFLX
  395. INTEGER, INTENT(IN ):: ITIMESTEP
  396. INTEGER, INTENT(IN ):: NUM_SOIL_LAYERS
  397. REAL, INTENT(IN ),OPTIONAL :: JULIAN_in
  398. INTEGER, INTENT(IN ):: LAGDAY
  399. INTEGER, INTENT(IN ):: STEPBL
  400. INTEGER, INTENT(IN ):: ISICE
  401. INTEGER, INTENT(IN ):: ISWATER
  402. INTEGER, INTENT(IN ), OPTIONAL :: ISURBAN
  403. CHARACTER(LEN=*), INTENT(IN ), OPTIONAL :: MMINLU
  404. LOGICAL, INTENT(IN ):: WARM_RAIN
  405. LOGICAL, INTENT(IN):: tice2tsk_if2cold
  406. INTEGER, INTENT(INOUT ),OPTIONAL :: NYEAR
  407. REAL , INTENT(INOUT ),OPTIONAL :: NDAY
  408. INTEGER, INTENT(IN ),OPTIONAL :: YR
  409. REAL , INTENT(IN ):: U_FRAME
  410. REAL , INTENT(IN ):: V_FRAME
  411. #if (NMM_CORE==1)
  412. real , intent(IN ):: SFENTH
  413. #endif
  414. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: SMOIS
  415. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: TSLB
  416. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(OUT) :: SMCREL
  417. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: GLW
  418. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: GSW,SWDOWN
  419. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: HT
  420. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: RAINCV
  421. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: SST
  422. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: SSTSK
  423. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: DTW
  424. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: TMN
  425. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: TYR
  426. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: TYRA
  427. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ),OPTIONAL :: TDLY
  428. REAL, DIMENSION( ims:ime , 1:lagday , jms:jme ), INTENT(INOUT ),OPTIONAL :: TLAG
  429. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: VEGFRA
  430. !------fds (06/2010)--------------------------
  431. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: XICE
  432. !---------------------------------------------
  433. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: XLAND
  434. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: XICEM
  435. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: MAVAIL
  436. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT):: SNOALB
  437. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ACSNOW
  438. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SNOTIME
  439. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: AKHS
  440. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: AKMS
  441. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ALBEDO
  442. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: CANWAT
  443. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: GRDFLX
  444. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: HFX
  445. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: RMOL
  446. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: PBLH
  447. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: Q2
  448. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QFX
  449. #if (NMM_CORE==1)
  450. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT):: TAUX
  451. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT):: TAUY
  452. #endif
  453. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QSFC
  454. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: QZ0
  455. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SFCRUNOFF
  456. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SMSTAV
  457. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SMSTOT
  458. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SNOW
  459. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SNOWC
  460. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: SNOWH
  461. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: TH2
  462. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: THZ0
  463. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: TSK
  464. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: UDRUNOFF
  465. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: UST
  466. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: UZ0
  467. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: VZ0
  468. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: WSPD
  469. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT):: ZNT
  470. !-----fds (06/2010)---------------------------------------------
  471. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_LHF ! SSiB output
  472. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_SHF ! SSiB output
  473. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_GHF ! SSiB output
  474. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_EGS ! SSiB output
  475. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_ECI ! SSiB output
  476. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_ECT ! SSiB output
  477. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_EGI ! SSiB output
  478. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_EGT ! SSiB output
  479. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_SDN ! SSiB output
  480. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_SUP ! SSiB output
  481. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_LDN ! SSiB output
  482. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_LUP ! SSiB output
  483. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_WAT ! SSiB output
  484. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_SHC ! SSiB output
  485. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_SHG ! SSiB output
  486. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_LAI ! SSiB output
  487. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_VCF ! SSiB output
  488. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_Z00 ! SSiB output
  489. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: SSIB_VEG ! SSiB output
  490. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: ALSWVISDIR! SSiB
  491. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: ALSWVISDIF! SSiB
  492. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: ALSWNIRDIR! SSiB
  493. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(OUT):: ALSWNIRDIF! SSiB
  494. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(IN):: SWVISDIR! SSiB
  495. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(IN):: SWVISDIF! SSiB
  496. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(IN):: SWNIRDIR! SSiB
  497. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(IN):: SWNIRDIF! SSiB
  498. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SSiB_BR ! SSiB
  499. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SSiB_FM ! SSiB
  500. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SSiB_FH ! SSiB
  501. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SSiB_CM ! SSiB
  502. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SSiBXDD ! SSiB
  503. INTEGER, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: ISNOW ! ssib-snow
  504. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SWE ! ssib-snow
  505. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SNOWDEN ! ssib-snow
  506. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: SNOWDEPTH ! ssib-snow
  507. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TKAIR ! ssib-snow
  508. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: DZO1 ! ssib-snow
  509. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: WO1 ! ssib-snow
  510. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSN1 ! ssib-snow
  511. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSNO1 ! ssib-snow
  512. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BWO1 ! ssib-snow
  513. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BTO1 ! ssib-snow
  514. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: CTO1 ! ssib-snow
  515. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FIO1 ! ssib-snow
  516. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FLO1 ! ssib-snow
  517. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BIO1 ! ssib-snow
  518. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BLO1 ! ssib-snow
  519. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: HO1 ! ssib-snow
  520. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: DZO2 ! ssib-snow
  521. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: WO2 ! ssib-snow
  522. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSN2 ! ssib-snow
  523. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSNO2 ! ssib-snow
  524. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BWO2 ! ssib-snow
  525. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BTO2 ! ssib-snow
  526. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: CTO2 ! ssib-snow
  527. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FIO2 ! ssib-snow
  528. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FLO2 ! ssib-snow
  529. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BIO2 ! ssib-snow
  530. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BLO2 ! ssib-snow
  531. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: HO2 ! ssib-snow
  532. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: DZO3 ! ssib-snow
  533. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: WO3 ! ssib-snow
  534. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSN3 ! ssib-snow
  535. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSNO3 ! ssib-snow
  536. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BWO3 ! ssib-snow
  537. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BTO3 ! ssib-snow
  538. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: CTO3 ! ssib-snow
  539. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FIO3 ! ssib-snow
  540. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FLO3 ! ssib-snow
  541. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BIO3 ! ssib-snow
  542. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BLO3 ! ssib-snow
  543. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: HO3 ! ssib-snow
  544. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: DZO4 ! ssib-snow
  545. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: WO4 ! ssib-snow
  546. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSN4 ! ssib-snow
  547. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: TSSNO4 ! ssib-snow
  548. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BWO4 ! ssib-snow
  549. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BTO4 ! ssib-snow
  550. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: CTO4 ! ssib-snow
  551. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FIO4 ! ssib-snow
  552. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: FLO4 ! ssib-snow
  553. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BIO4 ! ssib-snow
  554. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: BLO4 ! ssib-snow
  555. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: HO4 ! ssib-snow
  556. !----------------------------------------------------------
  557. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: BR
  558. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: CHKLOWQ
  559. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: GZ1OZ0
  560. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSHLTR
  561. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSIH
  562. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSIM
  563. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: Q10
  564. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: QSHLTR
  565. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: TH10
  566. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: TSHLTR
  567. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: U10
  568. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: V10
  569. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(OUT):: PSFC
  570. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: ACSNOM
  571. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: SFCEVP
  572. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT),OPTIONAL :: ACHFX
  573. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT),OPTIONAL :: ACLHF
  574. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(INOUT),OPTIONAL :: ACGRDFLX
  575. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: SFCEXC
  576. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: FLHC
  577. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: FLQC
  578. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CT
  579. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: DZ8W
  580. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: P8W
  581. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: PI_PHY
  582. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: P_PHY
  583. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: RHO
  584. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: TH_PHY
  585. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: T_PHY
  586. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: U_PHY
  587. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: V_PHY
  588. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ):: Z
  589. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: TKE_PBL
  590. REAL, DIMENSION(1:num_soil_layers), INTENT(IN):: DZS
  591. REAL, DIMENSION(1:num_soil_layers), INTENT(IN):: ZS
  592. REAL, INTENT(IN ):: DT
  593. REAL, INTENT(IN ):: DX
  594. REAL, INTENT(IN ),OPTIONAL :: bldt
  595. REAL, INTENT(IN ),OPTIONAL :: curr_secs
  596. LOGICAL, INTENT(IN ),OPTIONAL :: adapt_step_flag
  597. REAL, INTENT(INOUT),OPTIONAL :: bldtacttime
  598. ! arguments for NCAR surface physics
  599. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: ALBBCK ! INOUT needed for NMM
  600. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: EMBCK
  601. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: LH
  602. REAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), INTENT(INOUT):: SH2O
  603. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: SHDMAX
  604. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN ):: SHDMIN
  605. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT ):: Z0
  606. INTEGER, OPTIONAL, INTENT(IN) :: idveg, iopt_crs, iopt_btr, iopt_run, iopt_sfc, iopt_frz, iopt_inf, iopt_rad, iopt_alb, iopt_snf, iopt_tbot, iopt_stc
  607. INTEGER, OPTIONAL, DIMENSION(ims:ime , jms:jme), INTENT(INOUT) :: ISNOWXY
  608. REAL, OPTIONAL, DIMENSION(ims:ime ,-2:num_soil_layers, jms:jme), INTENT(INOUT) :: zsnsoxy
  609. REAL, OPTIONAL, DIMENSION(ims:ime ,-2:0, jms:jme), INTENT(INOUT) :: tsnoxy, snicexy, snliqxy
  610. REAL, OPTIONAL, DIMENSION(ims:ime , jms:jme), INTENT(INOUT) :: tvxy, tgxy, canicexy, canliqxy, eahxy, tahxy, cmxy, chxy, &
  611. fwetxy, sneqvoxy, alboldxy, qsnowxy, wslakexy, zwtxy, waxy, wtxy, lfmassxy, rtmassxy, stmassxy, woodxy, stblcpxy, fastcpxy, &
  612. xsaixy, tradxy, tsxy, neexy, gppxy, nppxy, fvegxy, qinxy, runsfxy, runsbxy, ecanxy, edirxy, etranxy, fsaxy, firaxy, &
  613. aparxy, psnxy, savxy, sagxy, fsnoxy, q2mvxy, q2mbxy
  614. REAL, OPTIONAL, DIMENSION(ims:ime , jms:jme), INTENT(INOUT) :: t2mvxy ,t2mbxy ,chstarxy, rssunxy, rsshaxy, bgapxy,wgapxy,gapxy , &
  615. tgvxy ,tgbxy, chvxy, chbxy
  616. ! Variables for multi-layer UCM
  617. REAL, OPTIONAL, INTENT(IN ) :: GMT
  618. INTEGER, OPTIONAL, INTENT(IN ) :: JULDAY
  619. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) ::XLAT, XLONG
  620. INTEGER, INTENT(IN ):: NUM_URBAN_LAYERS
  621. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: trb_urb4d
  622. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1_urb4d
  623. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2_urb4d
  624. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tgb_urb4d
  625. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tlev_urb3d
  626. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: qlev_urb3d
  627. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw1lev_urb3d
  628. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tw2lev_urb3d
  629. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tglev_urb3d
  630. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: tflev_urb3d
  631. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lf_ac_urb3d
  632. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sf_ac_urb3d
  633. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: cm_ac_urb3d
  634. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: sfvent_urb3d
  635. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: lfvent_urb3d
  636. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin1_urb3d
  637. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfwin2_urb3d
  638. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw1_urb3d
  639. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfw2_urb3d
  640. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfr_urb3d
  641. REAL, OPTIONAL, DIMENSION( ims:ime, 1:num_urban_layers, jms:jme ), INTENT(INOUT) :: sfg_urb3d
  642. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_u_bep !Implicit momemtum component X-direction
  643. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_v_bep !Implicit momemtum component Y-direction
  644. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_t_bep !Implicit component pot. temperature
  645. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_e_bep !Implicit component TKE
  646. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::a_q_bep !Implicit component TKE
  647. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_u_bep !Explicit momentum component X-direction
  648. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_v_bep !Explicit momentum component Y-direction
  649. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_t_bep !Explicit component pot. temperature
  650. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_e_bep !Explicit component TKE
  651. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::b_q_bep !Explicit component TKE
  652. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::vl_bep !Fraction air volume in grid cell
  653. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dlg_bep !Height above ground
  654. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::sf_bep !Fraction air at the face of grid cell
  655. REAL, OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) ::dl_u_bep !Length scale
  656. ! Optional
  657. !
  658. ! arguments for Ocean Mixed Layer Model
  659. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(INOUT ):: TML, T0ML, HML, H0ML, HUML, HVML
  660. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(IN ):: F, TMOML
  661. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(OUT ):: CK, CKA, CD, CDA, USTM
  662. #if ( EM_CORE==1)
  663. REAL, DIMENSION( ims:ime , jms:jme ), &
  664. &OPTIONAL, INTENT(INOUT ):: ch
  665. REAL, DIMENSION( ims:ime , kms:kme, jms:jme ), &
  666. &OPTIONAL, INTENT(IN ):: tsq,qsq,cov
  667. #endif
  668. INTEGER, OPTIONAL, INTENT(IN ):: slope_rad, topo_shading
  669. INTEGER, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN):: shadowmask
  670. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: swnorm
  671. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN):: slope,slp_azi
  672. INTEGER, OPTIONAL, INTENT(IN ):: ISFTCFLX,IZ0TLND
  673. INTEGER, OPTIONAL, INTENT(IN ):: OMLCALL
  674. REAL , OPTIONAL, INTENT(IN ):: OML_HML0
  675. REAL , OPTIONAL, INTENT(IN ):: OML_GAMMA
  676. !
  677. ! Observation nudging
  678. !
  679. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: uratx !Added for obs-nudging
  680. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: vratx !Added for obs-nudging
  681. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: tratx !Added for obs-nudging
  682. !
  683. ! PX LSM Surface Grid Analysis nudging
  684. !
  685. INTEGER, OPTIONAL, INTENT(IN) :: pxlsm_smois_init, pxlsm_soil_nudge, ANAL_INTERVAL
  686. REAL, DIMENSION( ims:ime, NLCAT, jms:jme ) , OPTIONAL, INTENT(INOUT):: LANDUSEF
  687. REAL, DIMENSION( ims:ime, NSCAT, jms:jme ) , OPTIONAL, INTENT(INOUT):: SOILCTOP, SOILCBOT
  688. REAL, DIMENSION( ims:ime , jms:jme ), OPTIONAL, INTENT(INOUT):: VEGF_PX
  689. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: RA
  690. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: RS
  691. REAL, DIMENSION( ims:ime, jms:jme ) , OPTIONAL, INTENT(INOUT):: LAI
  692. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: T2OBS
  693. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(OUT):: Q2OBS
  694. REAL, DIMENSION( ims:ime, jms:jme ), &
  695. OPTIONAL, INTENT(INOUT) :: t2_ndg_old, &
  696. q2_ndg_old, &
  697. t2_ndg_new, &
  698. q2_ndg_new, &
  699. sn_ndg_old, &
  700. sn_ndg_new
  701. !
  702. !
  703. ! Flags relating to the optional tendency arrays declared above
  704. ! Models that carry the optional tendencies will provdide the
  705. ! optional arguments at compile time; these flags all the model
  706. ! to determine at run-time whether a particular tracer is in
  707. ! use or not.
  708. !
  709. LOGICAL, INTENT(IN), OPTIONAL :: &
  710. f_qv &
  711. ,f_qc &
  712. ,f_qr &
  713. ,f_qi &
  714. ,f_qs &
  715. ,f_qg
  716. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  717. OPTIONAL, INTENT(INOUT) :: &
  718. ! optional moisture tracers
  719. ! 2 time levels; if only one then use CURR
  720. qv_curr, qc_curr, qr_curr &
  721. ,qi_curr, qs_curr, qg_curr
  722. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN) :: snowncv
  723. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: capg
  724. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: emiss
  725. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: hol
  726. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: mol
  727. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: regime
  728. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN ):: rainncv
  729. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN ):: rainshv
  730. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: RAINBL
  731. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: t2
  732. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(IN ):: thc
  733. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: qsg
  734. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: qvg
  735. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: qcg
  736. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: dew
  737. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: soilt1
  738. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: tsnav
  739. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: potevp ! NMM LSM
  740. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: snopcx ! NMM LSM
  741. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: soiltb ! NMM LSM
  742. REAL, DIMENSION( ims:ime, jms:jme ), OPTIONAL, INTENT(INOUT):: sr ! NMM and RUC LSM
  743. REAL, DIMENSION( ims:ime, 1:num_soil_layers, jms:jme ), OPTIONAL, INTENT(INOUT):: smfr3d
  744. REAL, DIMENSION( ims:ime, 1:num_soil_layers, jms:jme ), OPTIONAL, INTENT(INOUT):: keepfr3dflag
  745. REAL, DIMENSION( ims:ime, jms:jme ) , INTENT(OUT), OPTIONAL :: NOAHRES
  746. ! Variables for TEMF surface layer
  747. REAL,OPTIONAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(INOUT) :: te_temf
  748. REAL,OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: hd_temf, exch_temf, wm_temf
  749. REAL,OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: fCor
  750. ! Variables for ideal SCM surface layer
  751. REAL,OPTIONAL, INTENT(INOUT) :: hfx_force,lh_force,tsk_force
  752. REAL,OPTIONAL, INTENT(IN ) :: hfx_force_tend,lh_force_tend,tsk_force_tend
  753. ! LOCAL VAR
  754. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::v_phytmp
  755. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) ::u_phytmp
  756. REAL, DIMENSION( ims:ime, jms:jme ) :: ZOL
  757. REAL, DIMENSION( ims:ime, jms:jme ) :: &
  758. QGH, &
  759. CHS, &
  760. CPM, &
  761. CHS2, &
  762. CQS2
  763. ! SSIB local variables
  764. REAL ZDIFF
  765. !
  766. REAL :: DTMIN,DTBL
  767. !
  768. INTEGER :: i,J,K,NK,jj,ij
  769. INTEGER :: gfdl_ntsflg
  770. LOGICAL :: radiation, myj, frpcpn, isisfc
  771. LOGICAL, INTENT(in), OPTIONAL :: rdlai2d
  772. LOGICAL, INTENT(in), OPTIONAL :: usemonalb
  773. REAL :: total_depth,mid_point_depth
  774. REAL :: tconst,tprior,tnew,yrday,deltat
  775. REAL :: SWSAVE
  776. REAL, DIMENSION( ims:ime, jms:jme ) :: GSWSAVE
  777. !-------------------------------------------------
  778. ! urban related variables are added to declaration
  779. !-------------------------------------------------
  780. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMR_SFCDIF
  781. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHR_SFCDIF
  782. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CMC_SFCDIF
  783. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: CHC_SFCDIF
  784. REAL, OPTIONAL, INTENT(IN) :: DECLIN, SOLCON
  785. REAL, OPTIONAL , DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: COSZEN
  786. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: HRANG
  787. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: XLAT_URB2D !urban
  788. INTEGER, INTENT(IN) :: num_roof_layers !urban
  789. INTEGER, INTENT(IN) :: num_wall_layers !urban
  790. INTEGER, INTENT(IN) :: num_road_layers !urban
  791. REAL, OPTIONAL, DIMENSION(1:num_soil_layers), INTENT(IN) :: DZR !urban
  792. REAL, OPTIONAL, DIMENSION(1:num_soil_layers), INTENT(IN) :: DZB !urban
  793. REAL, OPTIONAL, DIMENSION(1:num_soil_layers), INTENT(IN) :: DZG !urban
  794. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TR_URB2D !urban
  795. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TB_URB2D !urban
  796. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: TG_URB2D !urban
  797. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: TC_URB2D !urban
  798. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: QC_URB2D !urban
  799. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: UC_URB2D !urban
  800. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXR_URB2D !urban
  801. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXB_URB2D !urban
  802. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXG_URB2D !urban
  803. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: XXXC_URB2D !urban
  804. REAL, OPTIONAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), & !urban
  805. INTENT(INOUT) :: TRL_URB3D !urban
  806. REAL, OPTIONAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), & !urban
  807. INTENT(INOUT) :: TBL_URB3D !urban
  808. REAL, OPTIONAL, DIMENSION( ims:ime , 1:num_soil_layers, jms:jme ), & !urban
  809. INTENT(INOUT) :: TGL_URB3D !urban
  810. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: SH_URB2D !urban
  811. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: LH_URB2D !urban
  812. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: G_URB2D !urban
  813. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: RN_URB2D !urban
  814. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT):: TS_URB2D !urban
  815. !
  816. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: FRC_URB2D !urban
  817. INTEGER, OPTIONAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: UTYPE_URB2D !urban
  818. REAL, DIMENSION( ims:ime, jms:jme ) :: PSIM_URB2D !urban local var
  819. REAL, DIMENSION( ims:ime, jms:jme ) :: PSIH_URB2D !urban local var
  820. REAL, DIMENSION( ims:ime, jms:jme ) :: GZ1OZ0_URB2D !urban local var
  821. !m REAL, DIMENSION( ims:ime, jms:jme ) :: AKHS_URB2D !urban local var
  822. REAL, DIMENSION( ims:ime, jms:jme ) :: AKMS_URB2D !urban local var
  823. REAL, DIMENSION( ims:ime, jms:jme ) :: U10_URB2D !urban local var
  824. REAL, DIMENSION( ims:ime, jms:jme ) :: V10_URB2D !urban local var
  825. REAL, DIMENSION( ims:ime, jms:jme ) :: TH2_URB2D !urban local var
  826. REAL, DIMENSION( ims:ime, jms:jme ) :: Q2_URB2D !urban local var
  827. REAL, DIMENSION( ims:ime, jms:jme ) :: UST_URB2D !urban local var
  828. !--------fds (06/2010)---------------------------------------------
  829. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
  830. OPTIONAL, INTENT(IN) :: CLDFRA
  831. REAL :: DAY, CLOUDFRAC
  832. !------------------------------------------------------------------
  833. !
  834. REAL, DIMENSION( ims:ime, jms:jme ) :: HFX_SEA
  835. REAL, DIMENSION( ims:ime, jms:jme ) :: QFX_SEA
  836. REAL, DIMENSION( ims:ime, jms:jme ) :: LH_SEA
  837. REAL, DIMENSION( ims:ime, jms:jme ) :: QSFC_SEA
  838. REAL, DIMENSION( ims:ime, jms:jme ) :: TSK_SEA
  839. REAL, DIMENSION( ims:ime, jms:jme ) :: ZNT_SEA
  840. REAL, DIMENSION( ims:ime, jms:jme ) :: CHS_SEA
  841. REAL, DIMENSION( ims:ime, jms:jme ) :: CHS2_SEA
  842. REAL, DIMENSION( ims:ime, jms:jme ) :: CQS2_SEA
  843. REAL, DIMENSION( ims:ime, jms:jme ) :: CPM_SEA
  844. REAL, DIMENSION( ims:ime, jms:jme ) :: FLHC_SEA
  845. REAL, DIMENSION( ims:ime, jms:jme ) :: FLQC_SEA
  846. REAL, DIMENSION( ims:ime, jms:jme ) :: QGH_SEA
  847. !
  848. REAL, DIMENSION( ims:ime, jms:jme ) :: PSIH_SEA
  849. REAL, DIMENSION( ims:ime, jms:jme ) :: PBLH_SEA
  850. REAL, DIMENSION( ims:ime, jms:jme ) :: RMOL_SEA
  851. REAL, DIMENSION( ims:ime, jms:jme ) :: UST_SEA
  852. REAL, DIMENSION( ims:ime, jms:jme ) :: QZ0_SEA
  853. REAL, DIMENSION( ims:ime, jms:jme ) :: TSK_LOCAL
  854. !
  855. REAL :: xice_threshold
  856. !
  857. !------------------------------------------------------------------
  858. CHARACTER*256 :: message
  859. REAL :: next_bl_time
  860. LOGICAL :: run_param , doing_adapt_dt , decided
  861. LOGICAL :: do_adapt
  862. !
  863. !
  864. !------------------------------------------------------------------
  865. !
  866. ! stop run if using ssib and fractional seaice=0 (fds 12/2010)
  867. if(sf_surface_physics .eq. SSIBSCHEME .and. fractional_seaice .eq. 0) then
  868. WRITE( message,* ) 'Please activate fractional seaice option when using SSiB model'
  869. CALL wrf_error_fatal ( message )
  870. endif
  871. if (sf_sfclay_physics .eq. 0) return
  872. if ( fractional_seaice == 0 ) then
  873. xice_threshold = 0.5
  874. else if ( fractional_seaice == 1 ) then
  875. xice_threshold = 0.02
  876. endif
  877. v_phytmp = 0.
  878. u_phytmp = 0.
  879. ZOL = 0.
  880. QGH = 0.
  881. CHS = 0.
  882. CPM = 0.
  883. CHS2 = 0.
  884. DTMIN = 0.
  885. DTBL = 0.
  886. ! RAINBL in mm (Accumulation between PBL calls)
  887. IF ( PRESENT( rainncv ) .AND. PRESENT( rainbl ) ) THEN
  888. !$OMP PARALLEL DO &
  889. !$OMP PRIVATE ( ij, i, j, k )
  890. DO ij = 1 , num_tiles
  891. DO j=j_start(ij),j_end(ij)
  892. DO i=i_start(ij),i_end(ij)
  893. RAINBL(i,j) = RAINBL(i,j) + RAINCV(i,j) + RAINNCV(i,j)
  894. IF ( PRESENT( rainshv ))RAINBL(i,j) = RAINBL(i,j) + RAINSHV(i,j)
  895. RAINBL(i,j) = MAX (RAINBL(i,j), 0.0)
  896. ENDDO
  897. ENDDO
  898. ENDDO
  899. !$OMP END PARALLEL DO
  900. ELSE IF ( PRESENT( rainbl ) ) THEN
  901. !$OMP PARALLEL DO &
  902. !$OMP PRIVATE ( ij, i, j, k )
  903. DO ij = 1 , num_tiles
  904. DO j=j_start(ij),j_end(ij)
  905. DO i=i_start(ij),i_end(ij)
  906. RAINBL(i,j) = RAINBL(i,j) + RAINCV(i,j)
  907. IF ( PRESENT( rainshv ))RAINBL(i,j) = RAINBL(i,j) + RAINSHV(i,j)
  908. RAINBL(i,j) = MAX (RAINBL(i,j), 0.0)
  909. ENDDO
  910. ENDDO
  911. ENDDO
  912. !$OMP END PARALLEL DO
  913. ENDIF
  914. ! Update SST
  915. IF (sst_update .EQ. 1) THEN
  916. !$OMP PARALLEL DO &
  917. !$OMP PRIVATE ( ij, i, j, k )
  918. DO ij = 1 , num_tiles
  919. DO j=j_start(ij),j_end(ij)
  920. DO i=i_start(ij),i_end(ij)
  921. IF ( FRACTIONAL_SEAICE == 1 ) then
  922. IF ( ( XICE(I,J) .NE. XICEM(I,J) ) .AND. ( XICEM(I,J) .GT. XICE_THRESHOLD ) ) THEN
  923. ! Fractional values of ALBEDO and EMISSIVITY are valid according to the
  924. ! earlier fractional seaice value, XICEM. Recompute them for the new
  925. ! seaice value XICE.
  926. ALBEDO(I,J) = 0.08 + XICE(I,J)/XICEM(I,J) * ( ALBEDO(I,J) - 0.08 )
  927. EMISS (I,J) = 0.98 + XICE(I,J)/XICEM(I,J) * ( EMISS (I,J) - 0.98 )
  928. ENDIF
  929. ENDIF
  930. IF ( XLAND(i,j) .GT. 1.5 .AND. XICE(I,J) .GE. XICE_THRESHOLD .AND. XICEM(I,J) .LT. XICE_THRESHOLD ) THEN
  931. ! water point turns to sea-ice point
  932. XICEM(I,J) = XICE(I,J)
  933. XLAND(I,J) = 1.
  934. IVGTYP(I,J) = ISICE
  935. ISLTYP(I,J) = 16
  936. VEGFRA(I,J) = 0.
  937. TMN(I,J) = 271.4
  938. ! Over new ice, initial guesses of ALBEDO and EMISS are
  939. ! based on default water and ice values for albedo and
  940. ! emissivity. The land-surface schemes can update these
  941. ! values
  942. ALBEDO(I,J) = 0.80 * XICE(I,J) + 0.08 * ( 1.0-XICE(I,J) )
  943. ALBBCK(I,J) = 0.80
  944. EMISS(I,J) = 0.98 * XICE(I,J) + 0.98 * ( 1.0-XICE(I,J) )
  945. EMBCK(I,J) = 0.98
  946. DO nk = 1, num_soil_layers
  947. TSLB(I,NK,J) = TSK(I,J)
  948. SMOIS(I,NK,J) = 1.0
  949. SH2O(I,NK,J) = 0.0
  950. ENDDO
  951. ENDIF
  952. IF(XLAND(i,j) .GT. 1.5) THEN
  953. IF ( SST(i,j) .LT. 350. .and. SST(i,j) .GT. 250.) THEN
  954. TSK(i,j) =SST(i,j)
  955. TSLB(i,1,j)=SST(i,j)
  956. ENDIF
  957. ENDIF
  958. IF ( XLAND(i,j) .LT. 1.5 .AND. XICEM(I,J) .GE. XICE_THRESHOLD .AND. XICE(I,J) .LT. XICE_THRESHOLD ) THEN
  959. ! sea-ice point turns to water point
  960. XICEM(I,J) = XICE(I,J)
  961. XLAND(I,J) = 2.
  962. IVGTYP(I,J) = ISWATER
  963. ISLTYP(I,J) = 14
  964. VEGFRA(I,J) = 0.
  965. SNOW(I,J) = 0.
  966. SNOWC(I,J) = 0.
  967. SNOWH(I,J) = 0.
  968. TMN(I,J) = SST(I,J)
  969. ALBEDO(I,J) = 0.08
  970. ALBBCK(I,J) = 0.08
  971. EMISS(I,J) = 0.98
  972. EMBCK(I,J) = 0.98
  973. DO nk = 1, num_soil_layers
  974. TSLB(I,NK,J) = SST(I,J)
  975. SMOIS(I,NK,J) = 1.0
  976. SH2O(I,NK,J) = 1.0
  977. ENDDO
  978. ENDIF
  979. XICEM(i,j) = XICE(i,j)
  980. ENDDO
  981. ENDDO
  982. ENDDO
  983. !$OMP END PARALLEL DO
  984. ENDIF
  985. IF(PRESENT(SST_SKIN))THEN
  986. IF (sst_skin .EQ. 1) THEN
  987. ! Calculate skin sst based on Zeng and Beljaars (2005)
  988. CALL wrf_debug( 100, 'in SST_SKIN_UPDATE' )
  989. !$OMP PARALLEL DO &
  990. !$OMP PRIVATE ( ij, i, j, k )
  991. DO ij = 1 , num_tiles
  992. DO j=j_start(ij),j_end(ij)
  993. DO i=i_start(ij),i_end(ij)
  994. IF(XLAND(i,j) .GT. 1.5 .and. sst_update .NE. 1) THEN
  995. TSK(i,j) =SST(i,j)
  996. TSLB(i,1,j)=SST(i,j)
  997. ENDIF
  998. ENDDO
  999. ENDDO
  1000. CALL sst_skin_update(xland,glw,gsw,hfx,qfx,tsk,ust, &
  1001. emiss,dtw,sstsk,dt,stbolt, &
  1002. ids, ide, jds, jde, kds, kde, &
  1003. ims, ime, jms, jme, kms, kme, &
  1004. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1005. DO j=j_start(ij),j_end(ij)
  1006. DO i=i_start(ij),i_end(ij)
  1007. IF(XLAND(i,j) .GT. 1.5)TSK(i,j)=SSTSK(i,j)
  1008. ENDDO
  1009. ENDDO
  1010. ENDDO
  1011. !$OMP END PARALLEL DO
  1012. ENDIF
  1013. ENDIF
  1014. IF(PRESENT(TMN_UPDATE))THEN
  1015. IF (tmn_update .EQ. 1) THEN
  1016. CALL wrf_debug( 100, 'in TMN_UPDATE' )
  1017. CALL tmnupdate(tsk,tmn,tlag,tyr,tyra,tdly,nday,nyear,lagday, &
  1018. julian_in, dt, yr, &
  1019. ids, ide, jds, jde, kds, kde, &
  1020. ims, ime, jms, jme, kms, kme, &
  1021. i_start,i_end, j_start,j_end, kts,kte, num_tiles )
  1022. ENDIF
  1023. ENDIF
  1024. !
  1025. ! Modified for adaptive time step
  1026. !
  1027. doing_adapt_dt = .FALSE.
  1028. IF ( PRESENT(adapt_step_flag) ) THEN
  1029. IF ( adapt_step_flag ) THEN
  1030. doing_adapt_dt = .TRUE.
  1031. END IF
  1032. END IF
  1033. ! Do we run through this scheme or not?
  1034. ! Test 1: If this is the initial model time, then yes.
  1035. ! ITIMESTEP=1
  1036. ! Test 2: If the user asked for the surface to be run every time step, then yes.
  1037. ! BLDT=0 or STEPBL=1
  1038. ! Test 3: If not adaptive dt, and this is on the requested surface frequency, then yes.
  1039. ! MOD(ITIMESTEP,STEPBL)=0
  1040. ! Test 4: If using adaptive dt and the current time is past the last requested activate surface time, then yes.
  1041. ! CURR_SECS >= BLDTACTTIME
  1042. ! If we do run through the scheme, we set the flag run_param to TRUE and we set the decided flag
  1043. ! to TRUE. The decided flag says that one of these tests was able to say "yes", run the scheme.
  1044. ! We only proceed to other tests if the previous tests all have left decided as FALSE.
  1045. run_param = .FALSE.
  1046. decided = .FALSE.
  1047. IF ( ( .NOT. decided ) .AND. &
  1048. ( itimestep .EQ. 1 ) ) THEN
  1049. run_param = .TRUE.
  1050. decided = .TRUE.
  1051. END IF
  1052. IF ( PRESENT(bldt) )THEN
  1053. IF ( ( .NOT. decided ) .AND. &
  1054. ( ( bldt .EQ. 0. ) .OR. ( stepbl .EQ. 1 ) ) ) THEN
  1055. run_param = .TRUE.
  1056. decided = .TRUE.
  1057. END IF
  1058. ELSE
  1059. IF ( ( .NOT. decided ) .AND. &
  1060. ( stepbl .EQ. 1 ) ) THEN
  1061. run_param = .TRUE.
  1062. decided = .TRUE.
  1063. END IF
  1064. END IF
  1065. IF ( ( .NOT. decided ) .AND. &
  1066. ( .NOT. doing_adapt_dt ) .AND. &
  1067. ( MOD(itimestep,stepbl) .EQ. 0 ) ) THEN
  1068. run_param = .TRUE.
  1069. decided = .TRUE.
  1070. END IF
  1071. IF ( ( .NOT. decided ) .AND. &
  1072. ( doing_adapt_dt ) .AND. &
  1073. ( curr_secs .GE. bldtacttime ) ) THEN
  1074. run_param = .TRUE.
  1075. decided = .TRUE.
  1076. END IF
  1077. IF ( run_param ) then
  1078. radiation = .false.
  1079. frpcpn = .false.
  1080. myj = ((sf_sfclay_physics .EQ. MYJSFCSCHEME) .OR. &
  1081. (sf_sfclay_physics .EQ. QNSESFCSCHEME) )
  1082. isisfc = ( FRACTIONAL_SEAICE .EQ. 1 .AND. ( &
  1083. (sf_sfclay_physics .EQ. SFCLAYSCHEME ) .OR. &
  1084. (sf_sfclay_physics .EQ. PXSFCSCHEME ) .OR. &
  1085. (sf_sfclay_physics .EQ. MYJSFCSCHEME ) .OR. &
  1086. (sf_sfclay_physics .EQ. GFSSFCSCHEME ) ) &
  1087. )
  1088. IF (ra_lw_physics .gt. 0) radiation = .true.
  1089. IF( PRESENT(slope_rad).AND. radiation )THEN
  1090. ! topographic slope effects modify SWDOWN and GSW here
  1091. IF (slope_rad .EQ. 1) THEN
  1092. !$OMP PARALLEL DO &
  1093. !$OMP PRIVATE ( ij, i, j, k )
  1094. DO ij = 1 , num_tiles
  1095. CALL TOPO_RAD_ADJ_DRVR (XLAT,XLONG,COSZEN, &
  1096. shadowmask, &
  1097. declin, &
  1098. SWDOWN,GSW,SWNORM,GSWSAVE,solcon,hrang, &
  1099. slope,slp_azi, &
  1100. ids, ide, jds, jde, kds, kde, &
  1101. ims, ime, jms, jme, kms, kme, &
  1102. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1103. ENDDO
  1104. !$OMP END PARALLEL DO
  1105. ENDIF
  1106. ENDIF
  1107. !----
  1108. ! CALCULATE CONSTANT
  1109. DTMIN=DT/60.
  1110. ! Surface schemes need PBL time step for updates and accumulations
  1111. ! Assume these schemes provide no tendencies
  1112. if (PRESENT(adapt_step_flag)) then
  1113. if (adapt_step_flag) then
  1114. do_adapt = .TRUE.
  1115. else
  1116. do_adapt = .FALSE.
  1117. endif
  1118. else
  1119. do_adapt = .FALSE.
  1120. endif
  1121. if (PRESENT(BLDT)) then
  1122. if (bldt .eq. 0) then
  1123. DTBL = dt
  1124. ELSE
  1125. if (do_adapt) then
  1126. IF ( curr_secs .LT. 2. * dt ) THEN
  1127. call wrf_message("WARNING: When using an adaptive time-step the boundary layer"// &
  1128. " time-step should be 0 (i.e., equivalent to model time-step)." )
  1129. call wrf_message("In order to proceed, for surface calculations, the "// &
  1130. "boundary layer time-step"// &
  1131. " will be rounded to the nearest minute," )
  1132. call wrf_message("possibly resulting in innacurate results.")
  1133. END IF
  1134. DTBL=bldt*60
  1135. else
  1136. DTBL=DT*STEPBL
  1137. endif
  1138. endif
  1139. else
  1140. DTBL=DT*STEPBL
  1141. endif
  1142. ! SAVE OLD VALUES
  1143. !$OMP PARALLEL DO &
  1144. !$OMP PRIVATE ( ij, i, j, k )
  1145. DO ij = 1 , num_tiles
  1146. DO j=j_start(ij),j_end(ij)
  1147. DO i=i_start(ij),i_end(ij)
  1148. ! PSFC : in Pa
  1149. PSFC(I,J)=p8w(I,kts,J)
  1150. ! REVERSE ORDER IN THE VERTICAL DIRECTION
  1151. DO k=kts,kte
  1152. v_phytmp(i,k,j)=v_phy(i,k,j)+v_frame
  1153. u_phytmp(i,k,j)=u_phy(i,k,j)+u_frame
  1154. ENDDO
  1155. ENDDO
  1156. ENDDO
  1157. ENDDO
  1158. !$OMP END PARALLEL DO
  1159. !$OMP PARALLEL DO &
  1160. !$OMP PRIVATE ( ij, i, j, k )
  1161. DO ij = 1 , num_tiles
  1162. sfclay_select: SELECT CASE(sf_sfclay_physics)
  1163. CASE (SFCLAYSCHEME)
  1164. ! DX varies spatially in NMM, therefore, SFCLAY cannot be called
  1165. ! because it takes a scalar DX. NMM passes in a dummy value for this
  1166. ! scalar. NEEDS FURTHER ATTENTION. JM 20050215
  1167. IF(PRESENT(SCM_FORCE_FLUX))THEN
  1168. IF (scm_force_flux .EQ. 1) THEN
  1169. ! surface forcing by observed fluxes
  1170. CALL scmflux(u_phytmp, v_phytmp, t_phy, qv_curr, p_phy, dz8w, &
  1171. cp, rovcp, xlv, psfc, cpm, xland, &
  1172. psim, psih, hfx, qfx, lh, tsk, flhc, flqc, &
  1173. znt, gz1oz0, wspd, &
  1174. julian_in, karman, p1000mb, &
  1175. itimestep,chklowq, &
  1176. ids, ide, jds, jde, kds, kde, &
  1177. ims, ime, jms, jme, kms, kme, &
  1178. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1179. ENDIF
  1180. ENDIF
  1181. IF(PRESENT(SCM_FORCE_SKINTEMP))THEN
  1182. IF (scm_force_skintemp .EQ. 1) THEN
  1183. ! surface forcing by observed skin temperature
  1184. CALL scmskintemp(tsk, julian_in, itimestep, &
  1185. ids, ide, jds, jde, kds, kde, &
  1186. ims, ime, jms, jme, kms, kme, &
  1187. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1188. ENDIF
  1189. ! IF (scm_force_skintemp .EQ. 2) THEN
  1190. ! surface forcing by gabls2 skin temperature
  1191. ! CALL scmgabls2(tsk, itimestep, dt, &
  1192. ! ids, ide, jds, jde, kds, kde, &
  1193. ! ims, ime, jms, jme, kms, kme, &
  1194. ! i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1195. ! ENDIF
  1196. ENDIF
  1197. IF (PRESENT(qv_curr) .AND. &
  1198. PRESENT(mol) .AND. PRESENT(regime) .AND. &
  1199. .TRUE. ) THEN
  1200. CALL wrf_debug( 100, 'in SFCLAY' )
  1201. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1202. CALL SFCLAY_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,qv_curr,&
  1203. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1204. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1205. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1206. u10,v10,th2,t2,q2, &
  1207. gz1oz0,wspd,br,isfflx,dx, &
  1208. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
  1209. P1000mb, &
  1210. XICE,SST,TSK_SEA, &
  1211. CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
  1212. HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
  1213. ITIMESTEP,TICE2TSK_IF2COLD,XICE_THRESHOLD, &
  1214. ids,ide, jds,jde, kds,kde, &
  1215. ims,ime, jms,jme, kms,kme, &
  1216. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
  1217. ustm,ck,cka,cd,cda,isftcflx,iz0tlnd, &
  1218. sf_surface_physics )
  1219. ELSE
  1220. CALL SFCLAY(u_phytmp,v_phytmp,t_phy,qv_curr, &
  1221. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1222. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1223. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1224. u10,v10,th2,t2,q2, &
  1225. gz1oz0,wspd,br,isfflx,dx, &
  1226. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
  1227. P1000mb, &
  1228. ids,ide, jds,jde, kds,kde, &
  1229. ims,ime, jms,jme, kms,kme, &
  1230. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
  1231. ustm,ck,cka,cd,cda,isftcflx,iz0tlnd,scm_force_flux )
  1232. #if ( EM_CORE==1)
  1233. DO j = j_start(ij),j_end(ij)
  1234. DO i = i_start(ij),i_end(ij)
  1235. ch(i,j) = chs (i,j)
  1236. !! ch(i,j) = flhc(i,j)/( cpm(i,j)*rho(i,kts,j) )
  1237. end do
  1238. end do
  1239. #endif
  1240. ENDIF
  1241. ELSE
  1242. CALL wrf_error_fatal('Lacking arguments for SFCLAY in surface driver')
  1243. ENDIF
  1244. CASE (SFCLAYREVSCHEME)
  1245. ! DX varies spatially in NMM, therefore, SFCLAY cannot be called
  1246. ! because it takes a scalar DX. NMM passes in a dummy value for this
  1247. ! scalar. NEEDS FURTHER ATTENTION. JM 20050215
  1248. IF (PRESENT(qv_curr) .AND. &
  1249. PRESENT(mol) .AND. PRESENT(regime) .AND. &
  1250. .TRUE. ) THEN
  1251. CALL wrf_debug( 100, 'in SFCLAY' )
  1252. ! IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1253. ! CALL SFCLAY_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,qv_curr,&
  1254. ! p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1255. ! znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1256. ! xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1257. ! u10,v10,th2,t2,q2, &
  1258. ! gz1oz0,wspd,br,isfflx,dx, &
  1259. ! svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
  1260. ! P1000mb, &
  1261. ! XICE,SST,TSK_SEA,
  1262. !&
  1263. ! CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA,
  1264. !&
  1265. ! HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA,
  1266. !&
  1267. ! ITIMESTEP,TICE2TSK_IF2COLD,XICE_THRESHOLD,
  1268. !&
  1269. ! ids,ide, jds,jde, kds,kde, &
  1270. ! ims,ime, jms,jme, kms,kme, &
  1271. ! i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
  1272. ! ustm,ck,cka,cd,cda,isftcflx,iz0tlnd )
  1273. ! ELSE
  1274. CALL SFCLAYREV(u_phytmp,v_phytmp,t_phy,qv_curr,&
  1275. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1276. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1277. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1278. u10,v10,th2,t2,q2, &
  1279. gz1oz0,wspd,br,isfflx,dx, &
  1280. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
  1281. P1000mb, &
  1282. ids,ide, jds,jde, kds,kde, &
  1283. ims,ime, jms,jme, kms,kme, &
  1284. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
  1285. ustm,ck,cka,cd,cda,isftcflx,iz0tlnd )
  1286. #if ( EM_CORE==1)
  1287. DO j = j_start(ij),j_end(ij)
  1288. DO i = i_start(ij),i_end(ij)
  1289. ch(i,j) = chs (i,j)
  1290. !! ch(i,j) = flhc(i,j)/( cpm(i,j)*rho(i,kts,j) )
  1291. end do
  1292. end do
  1293. #endif
  1294. ! ENDIF
  1295. ELSE
  1296. CALL wrf_error_fatal('Lacking arguments for SFCLAY in surface driver')
  1297. ENDIF
  1298. CASE (PXSFCSCHEME)
  1299. #if (NMM_CORE != 1)
  1300. IF (PRESENT(qv_curr) .AND. &
  1301. PRESENT(mol) .AND. PRESENT(regime) .AND. &
  1302. .TRUE. ) THEN
  1303. CALL wrf_debug( 100, 'in PX Surface Layer scheme' )
  1304. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1305. CALL WRF_ERROR_FATAL("PXSFCLAY not adapted for FRACTIONAL_SEAICE=1 option")
  1306. CALL PXSFCLAY_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,th_phy,qv_curr,&
  1307. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1308. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1309. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1310. u10,v10, &
  1311. gz1oz0,wspd,br,isfflx,dx, &
  1312. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman, &
  1313. XICE, SST, ITIMESTEP, TICE2TSK_IF2COLD,XICE_THRESHOLD, &
  1314. CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA,FLHC_SEA,FLQC_SEA,&
  1315. HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA, TSK_SEA, &
  1316. ids,ide, jds,jde, kds,kde, &
  1317. ims,ime, jms,jme, kms,kme, &
  1318. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1319. ELSE
  1320. CALL PXSFCLAY(u_phytmp,v_phytmp,t_phy,th_phy,qv_curr,&
  1321. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1322. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1323. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1324. u10,v10, &
  1325. gz1oz0,wspd,br,isfflx,dx, &
  1326. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman, &
  1327. ids,ide, jds,jde, kds,kde, &
  1328. ims,ime, jms,jme, kms,kme, &
  1329. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1330. ENDIF
  1331. ELSE
  1332. CALL wrf_error_fatal('Lacking arguments for PX Surface Layer in surface driver')
  1333. ENDIF
  1334. #else
  1335. CALL wrf_error_fatal('PX Surface Layer scheme cannot be used with NMM')
  1336. #endif
  1337. CASE (MYJSFCSCHEME)
  1338. IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. &
  1339. .TRUE. ) THEN
  1340. CALL wrf_debug(100,'in MYJSFC')
  1341. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1342. CALL MYJSFC_SEAICE_WRAPPER(itimestep,ht,dz8w, &
  1343. p_phy,p8w,th_phy,t_phy, &
  1344. qv_curr,qc_curr, &
  1345. u_phy,v_phy,tke_pbl, &
  1346. tsk,qsfc,thz0,qz0,uz0,vz0, &
  1347. lowlyr, &
  1348. xland,ivgtyp,isurban,iz0tlnd, &
  1349. TICE2TSK_IF2COLD, & ! Extra for wrapper.
  1350. XICE_THRESHOLD, & ! Extra for wrapper.
  1351. XICE, SST, & ! Extra for wrapper.
  1352. CHS_SEA, CHS2_SEA, CQS2_SEA, CPM_SEA, &
  1353. FLHC_SEA, FLQC_SEA, QSFC_SEA, &
  1354. QGH_SEA, QZ0_SEA, HFX_SEA, QFX_SEA, LH_SEA, &
  1355. TSK_SEA, &
  1356. ust,znt,z0,pblh,mavail,rmol, &
  1357. akhs,akms, &
  1358. br, &
  1359. chs,chs2,cqs2,hfx,qfx,lh,flhc,flqc,qgh,cpm,ct, &
  1360. u10,v10,t2,th2,tshltr,th10,q2,qshltr,q10,pshltr, &
  1361. p1000mb, &
  1362. ids,ide, jds,jde, kds,kde, &
  1363. ims,ime, jms,jme, kms,kme, &
  1364. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1365. ELSE
  1366. CALL MYJSFC(itimestep,ht,dz8w, &
  1367. p_phy,p8w,th_phy,t_phy, &
  1368. qv_curr,qc_curr, &
  1369. u_phy,v_phy,tke_pbl, &
  1370. tsk,qsfc,thz0,qz0,uz0,vz0, &
  1371. lowlyr, &
  1372. xland,ivgtyp,isurban,iz0tlnd, &
  1373. ust,znt,z0,pblh,mavail,rmol, &
  1374. akhs,akms, &
  1375. br, &
  1376. chs,chs2,cqs2,hfx,qfx,lh,flhc,flqc,qgh,cpm,ct, &
  1377. u10,v10,t2,th2,tshltr,th10,q2,qshltr,q10,pshltr, &
  1378. p1000mb, &
  1379. ids,ide, jds,jde, kds,kde, &
  1380. ims,ime, jms,jme, kms,kme, &
  1381. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1382. #if ( EM_CORE==1)
  1383. DO j = j_start(ij),j_end(ij)
  1384. DO i = i_start(ij),i_end(ij)
  1385. wspd(i,j) = MAX(SQRT(u_phy(i,kts,j)**2+v_phy(i,kts,j)**2),0.001)
  1386. ch(i,j) = chs (i,j)
  1387. !! ch(i,j) = flhc(i,j)/( cpm(i,j)*rho(i,kts,j) )
  1388. END DO
  1389. END DO
  1390. #endif
  1391. ENDIF
  1392. ELSE
  1393. CALL wrf_error_fatal('Lacking arguments for MYJSFC in surface driver')
  1394. ENDIF
  1395. CASE (QNSESFCSCHEME)
  1396. IF(PRESENT(SCM_FORCE_FLUX))THEN
  1397. IF (scm_force_flux .EQ. 1) THEN
  1398. ! surface forcing by observed fluxes
  1399. CALL scmflux(u_phytmp, v_phytmp, t_phy, qv_curr, p_phy, dz8w, &
  1400. cp, rovcp, xlv, psfc, cpm, xland, &
  1401. psim, psih, hfx, qfx, lh, tsk, flhc, flqc, &
  1402. znt, gz1oz0, wspd, &
  1403. julian_in, karman, p1000mb, &
  1404. itimestep,chklowq, &
  1405. ids, ide, jds, jde, kds, kde, &
  1406. ims, ime, jms, jme, kms, kme, &
  1407. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1408. ENDIF
  1409. ENDIF
  1410. IF(PRESENT(SCM_FORCE_SKINTEMP))THEN
  1411. IF (scm_force_skintemp .EQ. 1) THEN
  1412. ! surface forcing by observed skin temperature
  1413. CALL scmskintemp(tsk, julian_in, itimestep, &
  1414. ids, ide, jds, jde, kds, kde, &
  1415. ims, ime, jms, jme, kms, kme, &
  1416. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1417. ENDIF
  1418. ENDIF
  1419. IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. &
  1420. .TRUE. ) THEN
  1421. CALL wrf_debug(100,'in QNSESFC')
  1422. CALL QNSESFC(itimestep,ht,dz8w, &
  1423. p_phy,p8w,th_phy,t_phy, &
  1424. qv_curr,qc_curr, &
  1425. u_phy,v_phy,tke_pbl, &
  1426. tsk,qsfc,thz0,qz0,uz0,vz0, &
  1427. lowlyr, &
  1428. xland, &
  1429. ust,znt,z0,pblh,mavail,rmol, &
  1430. akhs,akms, &
  1431. br, &
  1432. chs,chs2,cqs2,hfx,qfx,lh,flhc,flqc,qgh,cpm,ct, &
  1433. u10,v10,tshltr,th10,qshltr,q10,pshltr, &
  1434. ids,ide, jds,jde, kds,kde, &
  1435. ims,ime, jms,jme, kms,kme, &
  1436. i_start(ij),i_end(ij), j_start(ij),j_end(ij), &
  1437. kts,kte,scm_force_flux )
  1438. ELSE
  1439. CALL wrf_error_fatal('Lacking arguments for QNSESFC in surface driver')
  1440. ENDIF
  1441. CASE (GFSSFCSCHEME)
  1442. IF (PRESENT(qv_curr) .AND. .TRUE. ) THEN
  1443. CALL wrf_debug( 100, 'in GFSSFC' )
  1444. IF (FRACTIONAL_SEAICE == 1) THEN
  1445. CALL SF_GFS_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,qv_curr, &
  1446. p_phy,CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  1447. ZNT,UST,PSIM,PSIH, &
  1448. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, &
  1449. QGH,QSFC,U10,V10, &
  1450. GZ1OZ0,WSPD,BR,ISFFLX, &
  1451. EP_1,EP_2,KARMAN,itimestep, &
  1452. TICE2TSK_IF2COLD, &
  1453. XICE_THRESHOLD, &
  1454. CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA, &
  1455. FLHC_SEA, FLQC_SEA, &
  1456. HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA, &
  1457. UST_SEA, ZNT_SEA, SST, XICE, &
  1458. ids,ide, jds,jde, kds,kde, &
  1459. ims,ime, jms,jme, kms,kme, &
  1460. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1461. ELSE
  1462. CALL SF_GFS(u_phytmp,v_phytmp,t_phy,qv_curr, &
  1463. p_phy,CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  1464. ZNT,UST,PSIM,PSIH, &
  1465. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, &
  1466. QGH,QSFC,U10,V10, &
  1467. GZ1OZ0,WSPD,BR,ISFFLX, &
  1468. EP_1,EP_2,KARMAN,itimestep, &
  1469. ids,ide, jds,jde, kds,kde, &
  1470. ims,ime, jms,jme, kms,kme, &
  1471. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1472. ENDIF
  1473. CALL wrf_debug(100,'in SFCDIAGS')
  1474. ELSE
  1475. CALL wrf_error_fatal('Lacking arguments for SF_GFS in surface driver')
  1476. ENDIF
  1477. #if ( EM_CORE==1)
  1478. CASE(MYNNSFCSCHEME)
  1479. IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) &
  1480. & .AND. PRESENT(qcg) ) THEN
  1481. CALL wrf_debug(100,'in MYNNSFC')
  1482. IF (FRACTIONAL_SEAICE == 1) THEN
  1483. CALL MYNN_SEAICE_WRAPPER(u_phytmp,v_phytmp,t_phy,qv_curr, &
  1484. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1485. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1486. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1487. u10,v10,th2,t2,q2, &
  1488. gz1oz0,wspd,br,isfflx,dx, &
  1489. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
  1490. &itimestep,ch,th_phy,pi_phy,qc_curr,&
  1491. &tsq,qsq,cov,qcg,&
  1492. XICE,SST,TSK_SEA, &
  1493. CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
  1494. HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
  1495. TICE2TSK_IF2COLD,XICE_THRESHOLD, &
  1496. ids,ide, jds,jde, kds,kde, &
  1497. ims,ime, jms,jme, kms,kme, &
  1498. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1499. ELSE
  1500. CALL SFCLAY_mynn(u_phytmp,v_phytmp,t_phy,qv_curr,&
  1501. p_phy,dz8w,cp,g,rcp,r_d,xlv,psfc,chs,chs2,cqs2,cpm, &
  1502. znt,ust,pblh,mavail,zol,mol,regime,psim,psih, &
  1503. xland,hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc,rmol, &
  1504. u10,v10,th2,t2,q2, &
  1505. gz1oz0,wspd,br,isfflx,dx, &
  1506. svp1,svp2,svp3,svpt0,ep_1,ep_2,karman,eomeg,stbolt, &
  1507. &itimestep,ch,th_phy,pi_phy,qc_curr,&
  1508. &tsq,qsq,cov,qcg,&
  1509. ids,ide, jds,jde, kds,kde, &
  1510. ims,ime, jms,jme, kms,kme, &
  1511. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1512. ENDIF
  1513. ELSE
  1514. CALL wrf_error_fatal('Lacking arguments for SFCLAY_mynn in surface driver')
  1515. ENDIF
  1516. #endif
  1517. #if ( EM_CORE==1)
  1518. CASE (TEMFSFCSCHEME)
  1519. IF (PRESENT(qv_curr).and.PRESENT(hd_temf)) THEN
  1520. CALL wrf_debug( 100, 'in TEMFSFCLAY' )
  1521. ! WA 9/7/09 must initialize Z0 and ZNT for TEMF in ideal cases
  1522. ! DO J=j_start(ij),j_end(ij)
  1523. ! DO I=i_start(ij),i_end(ij)
  1524. ! CHKLOWQ(i,j) = 1.0
  1525. ! Z0(i,j) = 0.03 ! For GABLS2
  1526. ! ZNT(i,j) = 0.03 ! For GABLS2
  1527. ! ENDDO
  1528. ! ENDDO
  1529. CALL TEMFSFCLAY(u3d=u_phytmp,v3d=v_phytmp,th3d=th_phy, &
  1530. qv3d=qv_curr,p3d=p_phy,pi3d=pi_phy,rho=rho,z=z,ht=ht, &
  1531. CP=cp,G=g,ROVCP=rovcp,R=r_d,XLV=xlv,psfc=psfc,chs=chs,&
  1532. chs2=chs2,cqs2=cqs2,CPM=cpm,znt=znt,ust=ust, &
  1533. MAVAIL=mavail,XLAND=xland,HFX=hfx,QFX=qfx,LH=lh, &
  1534. TSK=tsk,FLHC=flhc,FLQC=flqc,QGH=qgh,qsfc=qsfc, &
  1535. U10=u10,V10=v10,TH2=th2,T2=t2,Q2=q2, &
  1536. SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0,EP1=ep_1, &
  1537. EP2=ep_2,KARMAN=karman,fCor=fCor,te_temf=te_temf, &
  1538. hd_temf=hd_temf,exch_temf=exch_temf,wm_temf=wm_temf,&
  1539. ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
  1540. ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
  1541. its=i_start(ij),ite=i_end(ij), &
  1542. jts=j_start(ij),jte=j_end(ij), kts=kts,kte=kte )
  1543. ELSE
  1544. CALL wrf_error_fatal('Lacking arguments for TEMFSFCLAY in surface driver')
  1545. ENDIF
  1546. CASE (IDEALSCMSFCSCHEME)
  1547. IF (PRESENT(qv_curr)) THEN
  1548. CALL wrf_debug( 100, 'in IDEALSCMSFCLAY' )
  1549. CALL IDEALSCMSFCLAY(u3d=u_phytmp,v3d=v_phytmp,th3d=th_phy, &
  1550. qv3d=qv_curr,p3d=p_phy,pi3d=pi_phy,rho=rho,z=z,ht=ht, &
  1551. CP=cp,G=g,ROVCP=rovcp,R=r_d,XLV=xlv,psfc=psfc,chs=chs,&
  1552. chs2=chs2,cqs2=cqs2,CPM=cpm,znt=znt,ust=ust, &
  1553. MAVAIL=mavail,XLAND=xland,HFX=hfx,QFX=qfx,LH=lh, &
  1554. TSK=tsk,FLHC=flhc,FLQC=flqc,QGH=qgh,qsfc=qsfc, &
  1555. U10=u10,V10=v10,TH2=th2,T2=t2,Q2=q2, &
  1556. SVP1=svp1,SVP2=svp2,SVP3=svp3,SVPT0=svpt0,EP1=ep_1, &
  1557. EP2=ep_2,KARMAN=karman,fCor=fCor, &
  1558. exch_temf=exch_temf, &
  1559. hfx_force=hfx_force,lh_force=lh_force,tsk_force=tsk_force, &
  1560. hfx_force_tend=hfx_force_tend, &
  1561. lh_force_tend=lh_force_tend, &
  1562. tsk_force_tend=tsk_force_tend, &
  1563. dt=dt,itimestep=itimestep, &
  1564. ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, &
  1565. ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, &
  1566. its=i_start(ij),ite=i_end(ij), &
  1567. jts=j_start(ij),jte=j_end(ij), kts=kts,kte=kte )
  1568. ELSE
  1569. CALL wrf_error_fatal('Lacking arguments for IDEALSCMSFCLAY in surface driver')
  1570. ENDIF
  1571. #endif
  1572. #if (NMM_CORE==1)
  1573. CASE (GFDLSFCSCHEME)
  1574. CALL wrf_debug( 100, 'in GFDLSFC' )
  1575. IF(sf_surface_physics .eq. 88)THEN
  1576. GFDL_NTSFLG=1
  1577. ELSE
  1578. GFDL_NTSFLG=0
  1579. ENDIF
  1580. CALL SF_GFDL(u_phytmp,v_phytmp,t_phy,qv_curr,p_phy, &
  1581. CP,RCP,R_d,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  1582. DTBL, SMOIS,num_soil_layers,ISLTYP,ZNT,UST,PSIM,PSIH, & !DT & MAVAIL
  1583. XLAND,HFX,QFX,TAUX,TAUY,LH,GSW,GLW,TSK,FLHC,FLQC, & ! gopal's doing for Ocean coupling
  1584. QGH,QSFC,U10,V10, &
  1585. GZ1OZ0,WSPD,BR,ISFFLX, &
  1586. EP_1,EP_2,KARMAN,GFDL_NTSFLG,SFENTH, &
  1587. ids,ide, jds,jde, kds,kde, &
  1588. ims,ime, jms,jme, kms,kme, &
  1589. i_start(ij),i_end(ij),j_start(ij),j_end(ij),kts,kte )
  1590. DO j=j_start(ij),j_end(ij)
  1591. DO i=i_start(ij),i_end(ij)
  1592. CHKLOWQ(I,J)= 1.0
  1593. ENDDO
  1594. ENDDO
  1595. #endif
  1596. CASE DEFAULT
  1597. WRITE( message , * ) &
  1598. 'The sfclay option does not exist: sf_sfclay_physics = ', sf_sfclay_physics
  1599. CALL wrf_error_fatal ( message )
  1600. END SELECT sfclay_select
  1601. ! Compute uratx, vratx, tratx for obs nudging
  1602. IF(PRESENT(uratx) .and. PRESENT(vratx) .and. PRESENT(tratx))THEN
  1603. DO J=j_start(ij),j_end(ij)
  1604. DO I=i_start(ij),i_end(ij)
  1605. IF(ABS(U10(I,J)) .GT. 1.E-10) THEN
  1606. uratx(I,J) = U_PHYTMP(I,1,J)/U10(I,J)
  1607. ELSE
  1608. uratx(I,J) = 1.2
  1609. END IF
  1610. IF(ABS(V10(I,J)) .GT. 1.E-10) THEN
  1611. vratx(I,J) = V_PHYTMP(I,1,J)/V10(I,J)
  1612. ELSE
  1613. vratx(I,J) = 1.2
  1614. END IF
  1615. ! (Quotient P1000mb/P_PHY must be conditioned due to large value of P1000mb)
  1616. tratx(I,J) = (T_PHY(I,1,J)*(P1000mb*0.001/(P_PHY(I,1,J)/1000.))**RCP) &
  1617. /TH2(I,J)
  1618. ENDDO
  1619. ENDDO
  1620. ENDIF
  1621. ENDDO
  1622. !$OMP END PARALLEL DO
  1623. IF (ISFFLX.EQ.0 ) GOTO 430
  1624. !$OMP PARALLEL DO &
  1625. !$OMP PRIVATE ( ij, i, j, k )
  1626. DO ij = 1 , num_tiles
  1627. sfc_select: SELECT CASE(sf_surface_physics)
  1628. CASE (SLABSCHEME)
  1629. IF (PRESENT(qv_curr) .AND. &
  1630. PRESENT(capg) .AND. &
  1631. .TRUE. ) THEN
  1632. DO j=j_start(ij),j_end(ij)
  1633. DO i=i_start(ij),i_end(ij)
  1634. ! CQS2 ACCOUNTS FOR MAVAIL FOR SFCDIAGS 2M Q
  1635. CQS2(I,J)= CQS2(I,J)*MAVAIL(I,J)
  1636. ENDDO
  1637. ENDDO
  1638. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1639. CALL wrf_error_fatal('SLAB scheme cannot be used with fractional seaice')
  1640. ENDIF
  1641. CALL wrf_debug(100,'in SLAB')
  1642. CALL SLAB(t_phy,qv_curr,p_phy,flhc,flqc, &
  1643. psfc,xland,tmn,hfx,qfx,lh,tsk,qsfc,chklowq, &
  1644. gsw,glw,capg,thc,snowc,emiss,mavail, &
  1645. dtbl,rcp,xlv,dtmin,ifsnow, &
  1646. svp1,svp2,svp3,svpt0,ep_2,karman,eomeg,stbolt, &
  1647. tslb,zs,dzs,num_soil_layers,radiation, &
  1648. p1000mb, &
  1649. ids,ide, jds,jde, kds,kde, &
  1650. ims,ime, jms,jme, kms,kme, &
  1651. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte)
  1652. DO j=j_start(ij),j_end(ij)
  1653. DO i=i_start(ij),i_end(ij)
  1654. SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL
  1655. IF(PRESENT(ACHFX))ACHFX(I,J)=ACHFX(I,J) + HFX(I,J)*DT
  1656. IF(PRESENT(ACLHF))ACLHF(I,J)=ACLHF(I,J) + LH(I,J)*DT
  1657. ENDDO
  1658. ENDDO
  1659. CALL wrf_debug(100,'in SFCDIAGS')
  1660. CALL SFCDIAGS(hfx,qfx,tsk,qsfc,chs2,cqs2,t2,th2,q2, &
  1661. psfc,cp,r_d,rcp, &
  1662. ids,ide, jds,jde, kds,kde, &
  1663. ims,ime, jms,jme, kms,kme, &
  1664. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1665. ENDIF
  1666. CASE (LSMSCHEME)
  1667. IF (PRESENT(qv_curr) .AND. PRESENT(rainbl) .AND. &
  1668. ! PRESENT(emiss) .AND. PRESENT(t2) .AND. &
  1669. ! PRESENT(declin) .AND. PRESENT(coszen) .AND. &
  1670. ! PRESENT(hrang) .AND. PRESENT( xlat_urb2d) .AND. &
  1671. ! PRESENT(dzr) .AND. &
  1672. ! PRESENT( dzb) .AND. PRESENT(dzg) .AND. &
  1673. ! PRESENT(tr_urb2d) .AND. PRESENT(tb_urb2d) .AND. &
  1674. ! PRESENT(tg_urb2d) .AND. PRESENT(tc_urb2d) .AND. &
  1675. ! PRESENT(qc_urb2d) .AND. PRESENT(uc_urb2d) .AND. &
  1676. ! PRESENT(xxxr_urb2d) .AND. PRESENT(xxxb_urb2d) .AND. &
  1677. ! PRESENT(xxxg_urb2d) .AND. &
  1678. ! PRESENT(xxxc_urb2d) .AND. PRESENT(trl_urb3d) .AND. &
  1679. ! PRESENT(tbl_urb3d) .AND. PRESENT(tgl_urb3d) .AND. &
  1680. ! PRESENT(sh_urb2d) .AND. PRESENT(lh_urb2d) .AND. &
  1681. ! PRESENT(g_urb2d) .AND. PRESENT(rn_urb2d) .AND. &
  1682. ! PRESENT(ts_urb2d) .AND. &
  1683. ! PRESENT(frc_urb2d) .AND. PRESENT(utype_urb2d) .AND. &
  1684. .TRUE. ) THEN
  1685. !------------------------------------------------------------------
  1686. IF( PRESENT(sr) ) THEN
  1687. frpcpn=.true.
  1688. ENDIF
  1689. IF ( FRACTIONAL_SEAICE == 1) THEN
  1690. ! The fields passed to LSM need to represent the full ice values, not
  1691. ! the fractional values. Convert ALBEDO and EMISS from the blended value
  1692. ! to a value representing only the sea-ice portion. Albedo over open
  1693. ! water is taken to be 0.08. Emissivity over open water is taken to be 0.98
  1694. DO j = j_start(ij) , j_end(ij)
  1695. DO i = i_start(ij) , i_end(ij)
  1696. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN
  1697. ALBEDO(I,J) = (ALBEDO(I,J)-(1.-XICE(I,J))*0.08)/XICE(I,J)
  1698. EMISS(I,J) = (EMISS(I,J)-(1.-XICE(I,J))*0.98)/XICE(I,J)
  1699. ENDIF
  1700. ENDDO
  1701. ENDDO
  1702. IF ( isisfc ) THEN
  1703. ! Use surface layer routine values from the ice portion of grid point
  1704. ELSE
  1705. !
  1706. ! We don't have surface layer routine values at this time, so
  1707. ! just use what we have. Use ice component of TSK
  1708. !
  1709. CALL get_local_ice_tsk( ims, ime, jms, jme, &
  1710. i_start(ij), i_end(ij), &
  1711. j_start(ij), j_end(ij), &
  1712. itimestep, .false., tice2tsk_if2cold, &
  1713. XICE, XICE_THRESHOLD, &
  1714. SST, TSK, TSK_SEA, TSK_LOCAL )
  1715. DO j = j_start(ij) , j_end(ij)
  1716. DO i = i_start(ij) , i_end(ij)
  1717. TSK(i,j) = TSK_LOCAL(i,j)
  1718. ENDDO
  1719. ENDDO
  1720. ENDIF
  1721. ENDIF
  1722. CALL wrf_debug(100,'in NOAH DRV')
  1723. CALL lsm(dz8w,qv_curr,p8w,t_phy,tsk, &
  1724. hfx,qfx,lh,grdflx,qgh,gsw,swdown,glw,smstav,smstot, &
  1725. sfcrunoff,udrunoff,ivgtyp,isltyp,isurban,isice,vegfra, &
  1726. albedo,albbck,znt,z0, tmn,xland,xice, emiss, embck, &
  1727. snowc,qsfc,rainbl, &
  1728. mminlu, &
  1729. num_soil_layers,dtbl,dzs,itimestep, &
  1730. smois,tslb,snow,canwat, &
  1731. chs, chs2, cqs2, cpm,rcp,SR,chklowq,lai,qz0, &
  1732. myj,frpcpn, &
  1733. sh2o,snowh, & !h
  1734. u_phy,v_phy, & !I
  1735. snoalb,shdmin,shdmax, & !i
  1736. snotime, & !o
  1737. acsnom,acsnow, & !o
  1738. snopcx, & !o
  1739. potevp, & !o
  1740. smcrel, & !o
  1741. xice_threshold, &
  1742. rdlai2d,usemonalb, &
  1743. br, & !?
  1744. NOAHRES, &
  1745. ids,ide, jds,jde, kds,kde, &
  1746. ims,ime, jms,jme, kms,kme, &
  1747. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte, &
  1748. sf_urban_physics &
  1749. !Optional urban
  1750. ,cmr_sfcdif,chr_sfcdif,cmc_sfcdif,chc_sfcdif &
  1751. ,tr_urb2d,tb_urb2d,tg_urb2d,tc_urb2d,qc_urb2d, & !H urban
  1752. uc_urb2d, & !H urban
  1753. xxxr_urb2d,xxxb_urb2d,xxxg_urb2d,xxxc_urb2d, & !H urban
  1754. trl_urb3d,tbl_urb3d,tgl_urb3d, & !H urban
  1755. sh_urb2d,lh_urb2d,g_urb2d,rn_urb2d,ts_urb2d, & !H urban
  1756. psim_urb2d,psih_urb2d,u10_urb2d,v10_urb2d, & !O urban
  1757. GZ1OZ0_urb2d, AKMS_URB2D, & !O urban
  1758. th2_urb2d,q2_urb2d,ust_urb2d, & !O urban
  1759. declin,coszen,hrang, & !I solar
  1760. xlat_urb2d, & !I urban
  1761. num_roof_layers, num_wall_layers, & !I urban
  1762. num_road_layers, DZR, DZB, DZG, & !I urban
  1763. FRC_URB2D, UTYPE_URB2D, & !I urban
  1764. num_urban_layers, & !I multi-layer urban
  1765. trb_urb4d,tw1_urb4d,tw2_urb4d,tgb_urb4d, & !H multi-layer urban
  1766. tlev_urb3d,qlev_urb3d, & !H multi-layer urban
  1767. tw1lev_urb3d,tw2lev_urb3d, & !H multi-layer urban
  1768. tglev_urb3d,tflev_urb3d, & !H multi-layer urban
  1769. sf_ac_urb3d,lf_ac_urb3d,cm_ac_urb3d, & !H multi-layer urban
  1770. sfvent_urb3d,lfvent_urb3d, & !H multi-layer urban
  1771. sfwin1_urb3d,sfwin2_urb3d, & !H multi-layer urban
  1772. sfw1_urb3d,sfw2_urb3d,sfr_urb3d,sfg_urb3d, & !H multi-layer urban
  1773. th_phy,rho,p_phy,ust, & !I multi-layer urban
  1774. gmt,julday,xlong,xlat, & !I multi-layer urban
  1775. a_u_bep,a_v_bep,a_t_bep,a_q_bep, & !O multi-layer urban
  1776. a_e_bep,b_u_bep,b_v_bep, & !O multi-layer urban
  1777. b_t_bep,b_q_bep,b_e_bep,dlg_bep, & !O multi-layer urban
  1778. dl_u_bep,sf_bep,vl_bep & !O multi-layer urban
  1779. )
  1780. call seaice_noah( SEAICE_ALBEDO_OPT, &
  1781. & t_phy, qv_curr, p8w, dz8w, num_soil_layers, dt, frpcpn, sr, &
  1782. & glw, swdown, rainbl, snoalb, qgh, xice, xice_threshold, &
  1783. & tslb, emiss, albedo, albbck, z0, tsk, snow, snowc, snowh, &
  1784. & chs, chs2, cqs2, &
  1785. & br, znt, lh, hfx, qfx, potevp, grdflx, qsfc, acsnow, &
  1786. & acsnom, snopcx, sfcrunoff, noahres, &
  1787. & sf_urban_physics, b_t_bep, b_q_bep, rho, &
  1788. & ids,ide, jds,jde, kds,kde, &
  1789. & ims,ime, jms,jme, kms,kme, &
  1790. & i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1791. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1792. ! LSM Returns full land/ice values, no fractional values.
  1793. ! We return to a fractional component here. SFLX currently hard-wires
  1794. ! emissivity over sea ice to 0.98, the same value as over open water, so
  1795. ! the fractional consideration doesn't have any effect for emissivity.
  1796. DO j=j_start(ij),j_end(ij)
  1797. DO i=i_start(ij),i_end(ij)
  1798. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  1799. albedo(i,j) = ( albedo(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.08 )
  1800. emiss(i,j) = ( emiss(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.98 )
  1801. ENDIF
  1802. ENDDO
  1803. ENDDO
  1804. IF ( isisfc ) THEN
  1805. DO j=j_start(ij),j_end(ij)
  1806. DO i=i_start(ij),i_end(ij)
  1807. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  1808. ! Weighted average of fields between ice-cover values and open-water values.
  1809. flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flhc_sea(i,j) )
  1810. flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flqc_sea(i,j) )
  1811. cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cpm_sea(i,j) )
  1812. cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cqs2_sea(i,j) )
  1813. chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs2_sea(i,j) )
  1814. chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs_sea(i,j) )
  1815. qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qsfc_sea(i,j) )
  1816. qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qgh_sea(i,j) )
  1817. qz0(i,j) = ( qz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qz0_sea(i,j) )
  1818. hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * hfx_sea(i,j) )
  1819. qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qfx_sea(i,j) )
  1820. lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * lh_sea(i,j) )
  1821. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) )
  1822. ENDIF
  1823. ENDDO
  1824. ENDDO
  1825. ELSE
  1826. DO j = j_start(ij) , j_end(ij)
  1827. DO i = i_start(ij) , i_end(ij)
  1828. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  1829. ! Compute TSK as the open-water and ice-cover average
  1830. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) )
  1831. ENDIF
  1832. ENDDO
  1833. ENDDO
  1834. ENDIF
  1835. ENDIF
  1836. DO j=j_start(ij),j_end(ij)
  1837. DO i=i_start(ij),i_end(ij)
  1838. ! CHKLOWQ(I,J)= 1.0
  1839. SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL
  1840. SFCEXC(I,J)= CHS(I,J)
  1841. IF(PRESENT(ACHFX))ACHFX(I,J)=ACHFX(I,J) + HFX(I,J)*DT
  1842. IF(PRESENT(ACLHF))ACLHF(I,J)=ACLHF(I,J) + LH(I,J)*DT
  1843. IF(PRESENT(ACGRDFLX))ACGRDFLX(I,J)=ACGRDFLX(I,J) + GRDFLX(I,J)*DT
  1844. ENDDO
  1845. ENDDO
  1846. CALL SFCDIAGS(HFX,QFX,TSK,QSFC,CHS2,CQS2,T2,TH2,Q2, &
  1847. PSFC,CP,R_d,RCP, &
  1848. ids,ide, jds,jde, kds,kde, &
  1849. ims,ime, jms,jme, kms,kme, &
  1850. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1851. !urban
  1852. IF(SF_URBAN_PHYSICS.eq.1) THEN
  1853. DO j=j_start(ij),j_end(ij) !urban
  1854. DO i=i_start(ij),i_end(ij) !urban
  1855. IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. & !urban
  1856. IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN !urban
  1857. U10(I,J) = U10_URB2D(I,J) !urban
  1858. V10(I,J) = V10_URB2D(I,J) !urban
  1859. PSIM(I,J) = PSIM_URB2D(I,J) !urban
  1860. PSIH(I,J) = PSIH_URB2D(I,J) !urban
  1861. GZ1OZ0(I,J) = GZ1OZ0_URB2D(I,J) !urban
  1862. !m AKHS(I,J) = AKHS_URB2D(I,J) !urban
  1863. AKHS(I,J) = CHS(I,J) !urban
  1864. AKMS(I,J) = AKMS_URB2D(I,J) !urban
  1865. END IF !urban
  1866. ENDDO !urban
  1867. ENDDO !urban
  1868. ENDIF
  1869. ! urban BEP
  1870. IF((SF_URBAN_PHYSICS.eq.2).OR.(SF_URBAN_PHYSICS.eq.3)) THEN
  1871. DO j=j_start(ij),j_end(ij) !urban
  1872. DO i=i_start(ij),i_end(ij) !urban
  1873. IF( IVGTYP(I,J) == ISURBAN .or. IVGTYP(I,J) == 31 .or. & !urban
  1874. IVGTYP(I,J) == 32 .or. IVGTYP(I,J) == 33 ) THEN !urban
  1875. T2(I,J) = TH_PHY(i,1,j)/((1.E5/PSFC(I,J))**RCP) !urban
  1876. TH2(I,J) = TH_PHY(i,1,j) !urban
  1877. Q2(I,J) = qv_curr(i,1,j) !urban
  1878. U10(I,J) = U_phy(I,1,J) !urban
  1879. V10(I,J) = V_phy(I,1,J) !urban
  1880. END IF !urban
  1881. ENDDO !urban
  1882. ENDDO !urban
  1883. ENDIF
  1884. !------------------------------------------------------------------
  1885. ELSE
  1886. CALL wrf_error_fatal('Lacking arguments for LSM in surface driver')
  1887. ENDIF
  1888. CASE (NOAHMPSCHEME)
  1889. IF (PRESENT(qv_curr) .AND. PRESENT(rainbl) .AND. &
  1890. ! PRESENT(emiss) .AND. PRESENT(t2) .AND. &
  1891. ! PRESENT(declin) .AND. PRESENT(coszen) .AND. &
  1892. ! PRESENT(hrang) .AND. PRESENT( xlat_urb2d) .AND. &
  1893. ! PRESENT(dzr) .AND. &
  1894. ! PRESENT( dzb) .AND. PRESENT(dzg) .AND. &
  1895. ! PRESENT(tr_urb2d) .AND. PRESENT(tb_urb2d) .AND. &
  1896. ! PRESENT(tg_urb2d) .AND. PRESENT(tc_urb2d) .AND. &
  1897. ! PRESENT(qc_urb2d) .AND. PRESENT(uc_urb2d) .AND. &
  1898. ! PRESENT(xxxr_urb2d) .AND. PRESENT(xxxb_urb2d) .AND. &
  1899. ! PRESENT(xxxg_urb2d) .AND. &
  1900. ! PRESENT(xxxc_urb2d) .AND. PRESENT(trl_urb3d) .AND. &
  1901. ! PRESENT(tbl_urb3d) .AND. PRESENT(tgl_urb3d) .AND. &
  1902. ! PRESENT(sh_urb2d) .AND. PRESENT(lh_urb2d) .AND. &
  1903. ! PRESENT(g_urb2d) .AND. PRESENT(rn_urb2d) .AND. &
  1904. ! PRESENT(ts_urb2d) .AND. &
  1905. ! PRESENT(frc_urb2d) .AND. PRESENT(utype_urb2d) .AND. &
  1906. .TRUE. ) THEN
  1907. !------------------------------------------------------------------
  1908. IF( PRESENT(sr) ) THEN
  1909. frpcpn=.true.
  1910. ENDIF
  1911. IF ( FRACTIONAL_SEAICE == 1) THEN
  1912. ! The fields passed to LSM need to represent the full ice values, not
  1913. ! the fractional values. Convert ALBEDO and EMISS from the blended value
  1914. ! to a value representing only the sea-ice portion. Albedo over open
  1915. ! water is taken to be 0.08. Emissivity over open water is taken to be 0.98
  1916. DO j = j_start(ij) , j_end(ij)
  1917. DO i = i_start(ij) , i_end(ij)
  1918. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN
  1919. ALBEDO(I,J) = (ALBEDO(I,J)-(1.-XICE(I,J))*0.08)/XICE(I,J)
  1920. EMISS(I,J) = (EMISS(I,J)-(1.-XICE(I,J))*0.98)/XICE(I,J)
  1921. ENDIF
  1922. ENDDO
  1923. ENDDO
  1924. IF ( isisfc ) THEN
  1925. ! Use surface layer routine values from the ice portion of grid point
  1926. ELSE
  1927. !
  1928. ! We don't have surface layer routine values at this time, so
  1929. ! just use what we have. Use ice component of TSK
  1930. !
  1931. CALL get_local_ice_tsk( ims, ime, jms, jme, &
  1932. i_start(ij), i_end(ij), &
  1933. j_start(ij), j_end(ij), &
  1934. itimestep, .false., tice2tsk_if2cold, &
  1935. XICE, XICE_THRESHOLD, &
  1936. SST, TSK, TSK_SEA, TSK_LOCAL )
  1937. DO j = j_start(ij) , j_end(ij)
  1938. DO i = i_start(ij) , i_end(ij)
  1939. TSK(i,j) = TSK_LOCAL(i,j)
  1940. ENDDO
  1941. ENDDO
  1942. ENDIF
  1943. ENDIF
  1944. CALL wrf_debug(100,'in NOAHMP DRV')
  1945. CALL noahmplsm(dz8w,qv_curr,p8w,t_phy,tsk, &
  1946. hfx,qfx,lh,grdflx,qgh,gsw,swdown,glw,smstav,smstot, &
  1947. sfcrunoff,udrunoff,ivgtyp,isltyp,vegfra, &
  1948. albedo,albbck,znt,z0, tmn,xland,xice, xice_threshold, isice,emiss, embck, &
  1949. snowc,qsfc,rainbl, &
  1950. num_soil_layers,dtbl,dzs,itimestep, &
  1951. smois,tslb,snow,canwat, &
  1952. chs, chs2, cqs2, cpm,rcp,SR,chklowq,qz0, &
  1953. myj,br,frpcpn, &
  1954. sh2o,snowh, & !h
  1955. u_phy,v_phy, & !I
  1956. coszen, xlat_urb2d, & !I
  1957. snoalb, & !I
  1958. snotime, & !io
  1959. acsnom,acsnow, & !o
  1960. idveg ,iopt_crs ,iopt_btr ,iopt_run ,iopt_sfc ,iopt_frz ,iopt_inf , &
  1961. iopt_rad ,iopt_alb ,iopt_snf ,iopt_tbot,iopt_stc , &
  1962. isnowxy ,tvxy ,tgxy ,canicexy , &
  1963. canliqxy ,eahxy ,tahxy ,cmxy ,chxy , &
  1964. fwetxy ,sneqvoxy ,alboldxy ,qsnowxy ,wslakexy ,zwtxy ,waxy , &
  1965. wtxy ,tsnoxy ,zsnsoxy ,snicexy ,snliqxy ,lfmassxy ,rtmassxy , &
  1966. stmassxy ,woodxy ,stblcpxy ,fastcpxy ,lai ,xsaixy , &
  1967. tradxy ,tsxy ,neexy ,gppxy ,nppxy ,fvegxy ,qinxy , &
  1968. runsfxy ,runsbxy ,ecanxy ,edirxy ,etranxy ,fsaxy ,firaxy , &
  1969. aparxy ,psnxy ,savxy ,sagxy , &
  1970. fsnoxy ,YR ,JULIAN_IN, &
  1971. potevp, & !o
  1972. !jref:start
  1973. qc_curr ,pblh ,isurban ,iz0tlnd ,dx , & !I
  1974. chstarxy , t2mvxy ,t2mbxy ,rssunxy ,rsshaxy , bgapxy, &
  1975. wgapxy , gapxy ,tgvxy ,tgbxy ,q2mvxy ,q2mbxy, shdmax ,chvxy,chbxy , & !O
  1976. !jref:end
  1977. ids,ide, jds,jde, kds,kde, &
  1978. ims,ime, jms,jme, kms,kme, &
  1979. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1980. call seaice_noah( SEAICE_ALBEDO_OPT, &
  1981. & t_phy, qv_curr, p8w, dz8w, num_soil_layers, dt, frpcpn, sr, &
  1982. & glw, swdown, rainbl, snoalb, qgh, xice, xice_threshold, &
  1983. & tslb, emiss, albedo, albbck, z0, tsk, snow, snowc, snowh, &
  1984. & chs, chs2, cqs2, &
  1985. & br, znt, lh, hfx, qfx, potevp, grdflx, qsfc, acsnow, &
  1986. & acsnom, snopcx, sfcrunoff, noahres, &
  1987. & sf_urban_physics, b_t_bep, b_q_bep, rho, &
  1988. & ids,ide, jds,jde, kds,kde, &
  1989. & ims,ime, jms,jme, kms,kme, &
  1990. & i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  1991. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  1992. ! LSM Returns full land/ice values, no fractional values.
  1993. ! We return to a fractional component here. SFLX currently hard-wires
  1994. ! emissivity over sea ice to 0.98, the same value as over open water, so
  1995. ! the fractional consideration doesn't have any effect for emissivity.
  1996. DO j=j_start(ij),j_end(ij)
  1997. DO i=i_start(ij),i_end(ij)
  1998. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  1999. albedo(i,j) = ( albedo(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.08 )
  2000. emiss(i,j) = ( emiss(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.98 )
  2001. ENDIF
  2002. ENDDO
  2003. ENDDO
  2004. IF ( isisfc ) THEN
  2005. DO j=j_start(ij),j_end(ij)
  2006. DO i=i_start(ij),i_end(ij)
  2007. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2008. ! Weighted average of fields between ice-cover values and open-water values.
  2009. flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flhc_sea(i,j) )
  2010. flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flqc_sea(i,j) )
  2011. cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cpm_sea(i,j) )
  2012. cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cqs2_sea(i,j) )
  2013. chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs2_sea(i,j) )
  2014. chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs_sea(i,j) )
  2015. qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qsfc_sea(i,j) )
  2016. qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qgh_sea(i,j) )
  2017. qz0(i,j) = ( qz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qz0_sea(i,j) )
  2018. hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * hfx_sea(i,j) )
  2019. qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qfx_sea(i,j) )
  2020. lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * lh_sea(i,j) )
  2021. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) )
  2022. ENDIF
  2023. ENDDO
  2024. ENDDO
  2025. ELSE
  2026. DO j = j_start(ij) , j_end(ij)
  2027. DO i = i_start(ij) , i_end(ij)
  2028. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2029. ! Compute TSK as the open-water and ice-cover average
  2030. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) )
  2031. ENDIF
  2032. ENDDO
  2033. ENDDO
  2034. ENDIF
  2035. ENDIF
  2036. DO j=j_start(ij),j_end(ij)
  2037. DO i=i_start(ij),i_end(ij)
  2038. ! CHKLOWQ(I,J)= 1.0
  2039. SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL
  2040. SFCEXC(I,J)= CHS(I,J)
  2041. IF(PRESENT(ACHFX))ACHFX(I,J)=ACHFX(I,J) + HFX(I,J)*DT
  2042. IF(PRESENT(ACLHF))ACLHF(I,J)=ACLHF(I,J) + LH(I,J)*DT
  2043. IF(PRESENT(ACGRDFLX))ACGRDFLX(I,J)=ACGRDFLX(I,J) + GRDFLX(I,J)*DT
  2044. ! Check that SFCDIAGS can declare these as intent(out)
  2045. T2(I,J) = -1.E36
  2046. TH2(I,J) = -1.E36
  2047. Q2(I,J) = -1.E36
  2048. ENDDO
  2049. ENDDO
  2050. !jref: sfc diagnostics
  2051. DO j=j_start(ij),j_end(ij)
  2052. DO i=i_start(ij),i_end(ij)
  2053. IF (IVGTYP(I,J) == ISWATER .OR. IVGTYP(I,J) == ISICE) THEN
  2054. IF(CQS2(I,J).lt.1.E-5) then
  2055. Q2(I,J)=QSFC(I,J)
  2056. ELSE
  2057. Q2(I,J) = QSFC(I,J) - QFX(I,J)/(PSFC(I,J)/(R_d * TSK(I,J))*CQS2(I,J))
  2058. ENDIF
  2059. IF(CHS2(I,J).lt.1.E-5) then
  2060. T2(I,J) = TSK(I,J)
  2061. ELSE
  2062. T2(I,J) = TSK(I,J) - HFX(I,J)/(PSFC(I,J)/(R_d * TSK(I,J))*CP*CHS2(I,J))
  2063. ENDIF
  2064. TH2(I,J) = T2(I,J)*(1.E5/PSFC(I,J))**ROVCP
  2065. ELSEIF (IVGTYP(I,J) == ISURBAN ) THEN
  2066. Q2(I,J) = q2mbxy(i,j)
  2067. T2(I,J) = t2mbxy(i,j)
  2068. TH2(I,J) = T2(i,j)*(1.E5/PSFC(i,j))**RCP
  2069. ELSE
  2070. T2(I,J) = fvegxy(i,j)*t2mvxy(i,j) + (1.-fvegxy(i,j))*t2mbxy(i,j)
  2071. Q2(I,J) = fvegxy(i,j)*q2mvxy(i,j) + (1.-fvegxy(i,j))*q2mbxy(i,j)
  2072. TH2(I,J) = T2(i,j)*(1.E5/PSFC(i,j))**RCP
  2073. ENDIF
  2074. ENDDO
  2075. ENDDO
  2076. ! CALL SFCDIAGS(HFX,QFX,TSK,QSFC,CHS2,CQS2,T2,TH2,Q2, &
  2077. ! PSFC,CP,R_d,RCP, &
  2078. ! ids,ide, jds,jde, kds,kde, &
  2079. ! ims,ime, jms,jme, kms,kme, &
  2080. ! i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  2081. !jref: sfc diagnostics end
  2082. !------------------------------------------------------------------
  2083. ELSE
  2084. CALL wrf_error_fatal('Lacking arguments for NOAHMPLSM in surface driver')
  2085. ENDIF
  2086. CASE (RUCLSMSCHEME)
  2087. IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. &
  2088. ! PRESENT(emiss) .AND. PRESENT(t2) .AND. &
  2089. PRESENT(qsg) .AND. PRESENT(qvg) .AND. &
  2090. PRESENT(qcg) .AND. PRESENT(soilt1) .AND. &
  2091. PRESENT(tsnav) .AND. PRESENT(smfr3d) .AND. &
  2092. PRESENT(keepfr3dflag) .AND. PRESENT(rainbl) .AND. &
  2093. PRESENT(dew) .AND. &
  2094. .TRUE. ) THEN
  2095. IF( PRESENT(sr) ) THEN
  2096. frpcpn=.true.
  2097. ELSE
  2098. SR = 1.
  2099. ENDIF
  2100. CALL wrf_debug(100,'in RUC LSM')
  2101. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  2102. ! The fields passed to LSMRUC need to represent the full ice values, not
  2103. ! the fractional values. Convert ALBEDO and EMISS from the blended value
  2104. ! to a value representing only the sea-ice portion. Albedo over open
  2105. ! water is taken to be 0.08. Emissivity over open water is taken to be 0.98
  2106. DO j = j_start(ij) , j_end(ij)
  2107. DO i = i_start(ij) , i_end(ij)
  2108. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN
  2109. ALBEDO(I,J) = (ALBEDO(I,J) - (1.-XICE(I,J))*0.08) / XICE(I,J)
  2110. EMISS(I,J) = (EMISS(I,J) - (1.-XICE(I,J))*0.98) / XICE(I,J)
  2111. ENDIF
  2112. ENDDO
  2113. ENDDO
  2114. IF ( isisfc ) THEN
  2115. !
  2116. ! use surface layer routine values from the ice portion of grid point
  2117. !
  2118. ELSE
  2119. !
  2120. ! don't have srfc layer routine values at this time, so just use what you have
  2121. ! use ice component of TSK
  2122. !
  2123. CALL get_local_ice_tsk( ims, ime, jms, jme, &
  2124. i_start(ij), i_end(ij), &
  2125. j_start(ij), j_end(ij), &
  2126. itimestep, .false., tice2tsk_if2cold, &
  2127. XICE, XICE_THRESHOLD, &
  2128. SST, TSK, TSK_SEA, TSK_LOCAL )
  2129. DO j = j_start(ij) , j_end(ij)
  2130. DO i = i_start(ij) , i_end(ij)
  2131. TSK(i,j) = TSK_LOCAL(i,j)
  2132. ENDDO
  2133. ENDDO
  2134. ENDIF
  2135. ENDIF
  2136. CALL LSMRUC(dtbl,itimestep,num_soil_layers, &
  2137. zs,rainbl,snow,snowh,snowc,sr,frpcpn, &
  2138. dz8w,p8w,t_phy,qv_curr,qc_curr,rho, & !p8w in [pa]
  2139. glw,gsw,emiss,chklowq, &
  2140. chs,flqc,flhc,mavail,canwat,vegfra,albedo,znt, &
  2141. z0,snoalb, albbck, lai, & !new
  2142. mminlu, landusef, nlcat, mosaic_lu, &
  2143. mosaic_soil, soilctop, nscat, & !new
  2144. qsfc,qsg,qvg,qcg,dew,soilt1,tsnav, &
  2145. tmn,ivgtyp,isltyp,xland, &
  2146. iswater,isice,xice,xice_threshold, &
  2147. cp,rovcp,g,xlv,stbolt, &
  2148. smois,sh2o,smstav,smstot,tslb,tsk,hfx,qfx,lh, &
  2149. sfcrunoff,udrunoff,sfcexc, &
  2150. sfcevp,grdflx,acsnow,acsnom, &
  2151. smfr3d,keepfr3dflag, &
  2152. myj, &
  2153. ids,ide, jds,jde, kds,kde, &
  2154. ims,ime, jms,jme, kms,kme, &
  2155. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  2156. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  2157. ! LSMRUC Returns full land/ice values, no fractional values.
  2158. ! We return to a fractional component here.
  2159. DO j=j_start(ij),j_end(ij)
  2160. DO i=i_start(ij),i_end(ij)
  2161. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2162. albedo(i,j) = ( albedo(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.08 )
  2163. emiss(i,j) = ( emiss(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.98 )
  2164. ENDIF
  2165. ENDDO
  2166. ENDDO
  2167. if ( isisfc ) then
  2168. !
  2169. ! back to ice and ocean average
  2170. !
  2171. DO j=j_start(ij),j_end(ij)
  2172. DO i=i_start(ij),i_end(ij)
  2173. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2174. flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * flhc_sea(i,j) )
  2175. flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * flqc_sea(i,j) )
  2176. cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * cpm_sea(i,j) )
  2177. cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * cqs2_sea(i,j) )
  2178. chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * chs2_sea(i,j) )
  2179. chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * chs_sea(i,j) )
  2180. qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * QSFC_SEA(i,j) )
  2181. qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * qgh_sea(i,j) )
  2182. hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * HFX_SEA(i,j) )
  2183. qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * QFX_SEA(i,j) )
  2184. lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * LH_SEA(i,j) )
  2185. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * TSK_SEA(i,j) )
  2186. ENDIF
  2187. ENDDO
  2188. ENDDO
  2189. else
  2190. !
  2191. ! tsk back to liquid and ice average
  2192. !
  2193. DO j = j_start(ij) , j_end(ij)
  2194. DO i = i_start(ij) , i_end(ij)
  2195. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2196. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.-XICE(i,j)) * TSK_SEA(i,j) )
  2197. ENDIF
  2198. ENDDO
  2199. ENDDO
  2200. endif
  2201. ENDIF
  2202. CALL SFCDIAGS_RUCLSM(HFX,QFX,TSK,QSFC,CQS2,CQS2,T2,TH2,Q2, &
  2203. T_PHY,QV_CURR,RHO,P8W, &
  2204. PSFC,CP,R_d,RCP, &
  2205. ids,ide, jds,jde, kds,kde, &
  2206. ims,ime, jms,jme, kms,kme, &
  2207. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte )
  2208. ELSE
  2209. CALL wrf_error_fatal('Lacking arguments for RUCLSM in surface driver')
  2210. ENDIF
  2211. CASE (PXLSMSCHEME)
  2212. IF (PRESENT(qv_curr) .AND. PRESENT(qc_curr) .AND. &
  2213. PRESENT(emiss) .AND. PRESENT(t2) .AND. &
  2214. PRESENT(rainbl) .AND. &
  2215. .TRUE. ) THEN
  2216. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  2217. CALL WRF_ERROR_FATAL("PXLSM not adapted for FRACTIONAL_SEAICE=1 option")
  2218. IF ( isisfc ) THEN
  2219. !
  2220. ! use surface layer routine values from the ice portion of grid point
  2221. !
  2222. ELSE
  2223. !
  2224. ! don't have srfc layer routine values at this time, so just use what you have
  2225. ! use ice component of TSK
  2226. !
  2227. CALL get_local_ice_tsk( ims, ime, jms, jme, &
  2228. i_start(ij), i_end(ij), &
  2229. j_start(ij), j_end(ij), &
  2230. itimestep, .false., tice2tsk_if2cold, &
  2231. XICE, XICE_THRESHOLD, &
  2232. SST, TSK, TSK_SEA, TSK_LOCAL )
  2233. DO j = j_start(ij) , j_end(ij)
  2234. DO i=i_start(ij) , i_end(ij)
  2235. TSK(i,j) = TSK_LOCAL(i,j)
  2236. ENDDO
  2237. ENDDO
  2238. ENDIF
  2239. ENDIF
  2240. CALL wrf_debug(100,'in P-X LSM')
  2241. CALL PXLSM(u_phy, v_phy, dz8w, qv_curr, t_phy, th_phy, rho,&
  2242. psfc, gsw, glw, rainbl, emiss, &
  2243. ITIMESTEP, num_soil_layers, DT, anal_interval, &
  2244. xland, xice, albbck, albedo, snoalb, smois, tslb, &
  2245. mavail,T2, Q2, &
  2246. zs, dzs, psih, &
  2247. landusef,soilctop,soilcbot,vegfra, vegf_px, &
  2248. isltyp,ra,rs,lai,nlcat,nscat, &
  2249. hfx,qfx,lh,tsk,sst,znt,canwat, &
  2250. grdflx,shdmin,shdmax, &
  2251. snowc,pblh,rmol,ust,capg,dtbl, &
  2252. t2_ndg_old,t2_ndg_new,q2_ndg_old,q2_ndg_new, &
  2253. sn_ndg_old, sn_ndg_new, snow, snowh,snowncv, &
  2254. t2obs, q2obs, pxlsm_smois_init, pxlsm_soil_nudge, &
  2255. ids,ide, jds,jde, kds,kde, &
  2256. ims,ime, jms,jme, kms,kme, &
  2257. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte)
  2258. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  2259. IF ( isisfc ) THEN
  2260. !
  2261. ! back to ice and ocean average
  2262. !
  2263. DO j = j_start(ij) , j_end(ij)
  2264. DO i = i_start(ij) , i_end(ij)
  2265. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2266. flhc(i,j) = ( flhc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flhc_sea(i,j) )
  2267. flqc(i,j) = ( flqc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * flqc_sea(i,j) )
  2268. cpm(i,j) = ( cpm(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cpm_sea(i,j) )
  2269. cqs2(i,j) = ( cqs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * cqs2_sea(i,j) )
  2270. chs2(i,j) = ( chs2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs2_sea(i,j) )
  2271. chs(i,j) = ( chs(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * chs_sea(i,j) )
  2272. qsfc(i,j) = ( qsfc(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * QSFC_SEA(i,j) )
  2273. qgh(i,j) = ( qgh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * QGH_SEA(i,j) )
  2274. hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * HFX_SEA(i,j) )
  2275. qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * QFX_SEA(i,j) )
  2276. lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * LH_SEA(i,j) )
  2277. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * TSK_SEA(i,j) )
  2278. psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PSIH_SEA(i,j) )
  2279. pblh(i,j) = ( pblh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PBLH_SEA(i,j) )
  2280. rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * RMOL_SEA(i,j) )
  2281. ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * UST_SEA(i,j) )
  2282. ENDIF
  2283. ENDDO
  2284. ENDDO
  2285. ELSE
  2286. !
  2287. ! tsk back to liquid and ice average
  2288. !
  2289. DO j=j_start(ij),j_end(ij)
  2290. DO i=i_start(ij),i_end(ij)
  2291. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2292. tsk(i,j)=tsk(i,j)*XICE(i,j)+(1.0-XICE(i,j))*TSK_SEA(i,j)
  2293. ENDIF
  2294. ENDDO
  2295. ENDDO
  2296. ENDIF
  2297. ENDIF
  2298. DO j=j_start(ij),j_end(ij)
  2299. DO i=i_start(ij),i_end(ij)
  2300. CHKLOWQ(I,J)= 1.0
  2301. TH2(I,J) = T2(I,J)*(1.E5/PSFC(I,J))**RCP
  2302. SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL
  2303. ENDDO
  2304. ENDDO
  2305. ELSE
  2306. CALL wrf_error_fatal('Lacking arguments for P-X LSM in surface driver')
  2307. ENDIF
  2308. CASE (SSIBSCHEME)
  2309. IF(PRESENT(alswvisdir))THEN
  2310. !---Fernando De Sales (fds 06/2010)--------------------------------------
  2311. CALL wrf_debug(100,'in SSIB')
  2312. !
  2313. IF ( FRACTIONAL_SEAICE == 1) THEN
  2314. ! The fields passed to SSIB need to represent the full ice values, not
  2315. ! the fractional values. Convert ALBEDO from the blended value
  2316. ! to a value representing only the sea-ice portion. Albedo over open
  2317. ! water is taken to be 0.08.
  2318. DO j = j_start(ij) , j_end(ij)
  2319. DO i = i_start(ij) , i_end(ij)
  2320. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN
  2321. ALBEDO(I,J) = (ALBEDO(I,J)-(1.-XICE(I,J))*0.08)/XICE(I,J)
  2322. ENDIF
  2323. ENDDO
  2324. ENDDO
  2325. ELSE
  2326. ! we shouldn't be here. must have fractional seaice for SSIB to work properly (fds 12/2010)
  2327. ENDIF
  2328. !
  2329. !This stuff is not needed anymore since isisfc is always TRUE for SSIB
  2330. !Keep it for later use when code is adapted for isisfc=FALSE
  2331. ! IF ( isisfc ) THEN
  2332. ! ! Use surface layer routine values from the ice portion of grid point
  2333. ! ELSE
  2334. ! !
  2335. ! ! We don't have surface layer routine values at this time, so
  2336. ! ! just use what we have. Use ice component of TSK
  2337. ! !
  2338. ! DO j = j_start(ij) , j_end(ij)
  2339. ! DO i = i_start(ij) , i_end(ij)
  2340. ! IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1 ) ) THEN
  2341. ! IF ( SST(i,j) .LT. 271.4 ) THEN
  2342. ! SST(i,j) = 271.4
  2343. ! ENDIF
  2344. ! TSK_SEA(i,j) = SST(i,j)
  2345. ! ! Convert TSK from our ice/water average value to value good for solid-ice surface.
  2346. ! TSK(i,j) = ( TSK(i,j) - (1.-XICE(i,j)) *SST(i,j) ) / XICE(i,j)
  2347. ! IF (XICE(i,j).lt.0.2 .and. TSK(i,j).lt.253.15) THEN
  2348. ! TSK(i,j) = 253.15
  2349. ! ENDIF
  2350. ! IF (XICE(i,j).lt.0.1 .and. TSK(i,j).lt.263.15) THEN
  2351. ! TSK(i,j) = 263.15
  2352. ! ENDIF
  2353. ! ELSE
  2354. ! TSK_SEA(i,j) = TSK(i,j)
  2355. ! ENDIF
  2356. ! ENDDO
  2357. ! ENDDO
  2358. ! ENDIF
  2359. !
  2360. day=float(int(julian_in+0.01))+1.
  2361. DO j=j_start(ij),j_end(ij)
  2362. DO i=i_start(ij),i_end(ij)
  2363. !check land mask and land-use map !fds (02/2012)
  2364. ! IF(itimestep .EQ. 1 ) THEN
  2365. ! IF(IVGTYP(i,j).NE.ISWATER)THEN
  2366. ! XLAND(I,J)=1.0
  2367. ! ELSE
  2368. ! XLAND(I,J)=2.0
  2369. ! ENDIF
  2370. ! IF (IVGTYP(I,J).LE.0 .AND. XLAND(I,J).NE.ISWATER ) IVGTYP(I,J) = 7.0
  2371. ! ENDIF
  2372. !
  2373. ! IF(XLAND(I,J).LT.1.5 .AND. IVGTYP(I,J).NE.ISICE) THEN !land and seaice-free points
  2374. IF(XLAND(I,J).LT.1.5) THEN !land points, including land ice points
  2375. CLOUDFRAC=0.
  2376. IF(PRESENT(CLDFRA))THEN
  2377. DO K=KMS,KME
  2378. CLOUDFRAC=AMAX1(CLOUDFRAC,AMIN1(CLDFRA(I,K,J),1.0))
  2379. ENDDO
  2380. ENDIF
  2381. CALL ssib( i, j, DTBL, itimestep, xlat_urb2d(i,j), coszen(i,j), &
  2382. rainncv(i,j), raincv(i,j), glw(i,j), dz8w(i,1,j), &
  2383. smois(i,1,j), smois(i,2,j), smois(i,3,j), &
  2384. tslb(i,1,j), tslb(i,2,j), tslb(i,3,j), &
  2385. snow(i,j), sfcrunoff(i,j), &
  2386. u_phytmp(i,1,j),v_phytmp(i,1,j),qv_curr(i,1,j),t_phy(i,1,j), &
  2387. p_phy(i,1,j), psfc(i,j), ivgtyp(i,j), &
  2388. swdown(i,j), canwat(i,j), &
  2389. alswvisdir(i,j),alswvisdif(i,j),alswnirdir(i,j),alswnirdif(i,j), &
  2390. swvisdir(i,j), swvisdif(i,j), swnirdir(i,j), swnirdif(i,j), &
  2391. hfx(i,j), lh(i,j), grdflx(i,j), qfx(i,j), tsk(i,j), &
  2392. ust(i,j), ssib_br(i,j), ssib_fm(i,j), ssib_fh(i,j), ssib_cm(i,j), &
  2393. ssib_lhf(i,j), ssib_shf(i,j), ssib_ghf(i,j), ssib_egs(i,j), &
  2394. ssib_eci(i,j), ssib_ect(i,j), ssib_egi(i,j), ssib_egt(i,j), &
  2395. ssib_sdn(i,j), ssib_sup(i,j), ssib_ldn(i,j), ssib_lup(i,j), &
  2396. ssib_wat(i,j), ssib_shc(i,j), ssib_shg(i,j), ssib_lai(i,j), &
  2397. ssib_vcf(i,j), ssib_z00(i,j), ssib_veg(i,j), ssibxdd(i,j), &
  2398. isnow(i,j), swe(i,j), snowden(i,j), snowdepth(i,j),tkair(i,j), &
  2399. dzo1(i,j), wo1(i,j), tssn1(i,j), tssno1(i,j), bwo1(i,j), bto1(i,j), &
  2400. cto1(i,j), fio1(i,j), flo1(i,j), bio1(i,j), blo1(i,j), ho1(i,j), &
  2401. dzo2(i,j), wo2(i,j), tssn2(i,j), tssno2(i,j), bwo2(i,j), bto2(i,j), &
  2402. cto2(i,j), fio2(i,j), flo2(i,j), bio2(i,j), blo2(i,j), ho2(i,j), &
  2403. dzo3(i,j), wo3(i,j), tssn3(i,j), tssno3(i,j), bwo3(i,j), bto3(i,j), &
  2404. cto3(i,j), fio3(i,j), flo3(i,j), bio3(i,j), blo3(i,j), ho3(i,j), &
  2405. dzo4(i,j), wo4(i,j), tssn4(i,j), tssno4(i,j), bwo4(i,j), bto4(i,j), &
  2406. cto4(i,j), fio4(i,j), flo4(i,j), bio4(i,j), blo4(i,j), ho4(i,j), &
  2407. day, cloudfrac, q2(i,j), t2(i,j), albedo(i,j), &
  2408. ra_sw_physics, mminlu &
  2409. )
  2410. BR(i,j)=ssib_br(i,j)
  2411. ZNT(i,j) = ssib_z00(i,j)
  2412. SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL
  2413. snowh(i,j) = snowdepth(i,j)
  2414. IF (itimestep .ne. 1) THEN
  2415. ZDIFF=(0.5*dz8w(i,1,j))-SSiBXDD(I,J)
  2416. IF(ZDIFF.LE.ZNT(I,J)) ZDIFF=ZNT(I,J)+0.2
  2417. GZ1OZ0(I,J)=ALOG(ZDIFF/ZNT(I,J))
  2418. ENDIF
  2419. ! Overwrite WSPD to remove convective velocity (wspd=wspd1 in YSU)
  2420. WSPD(I,J)=sqrt( u_phytmp(i,1,j)*u_phytmp(i,1,j) + &
  2421. v_phytmp(i,1,j)*v_phytmp(i,1,j) ) + 1.e-9
  2422. ELSE IF (XICE(I,J) .GE. XICE_THRESHOLD) THEN !sea ice points
  2423. CLOUDFRAC=0.
  2424. DO K=KMS,KME
  2425. CLOUDFRAC=AMAX1(CLOUDFRAC,AMIN1(CLDFRA(I,K,J),1.0))
  2426. ENDDO
  2427. ! CALL wrf_message ( 'Calling ssib_seaice' ) !fds
  2428. CALL ssib_seaice &
  2429. ( i, j, DTBL, itimestep, xlat_urb2d(i,j), coszen(i,j), &
  2430. rainncv(i,j), raincv(i,j), glw(i,j), dz8w(i,1,j), &
  2431. smois(i,1,j), smois(i,2,j), smois(i,3,j), &
  2432. tslb(i,1,j), tslb(i,2,j), tslb(i,3,j), &
  2433. snow(i,j), sfcrunoff(i,j), xicem(i,j), &
  2434. u_phytmp(i,1,j),v_phytmp(i,1,j),qv_curr(i,1,j),t_phy(i,1,j), &
  2435. p_phy(i,1,j), psfc(i,j), &
  2436. swdown(i,j), canwat(i,j), &
  2437. alswvisdir(i,j),alswvisdif(i,j),alswnirdir(i,j),alswnirdif(i,j), &
  2438. swvisdir(i,j), swvisdif(i,j), swnirdir(i,j), swnirdif(i,j), &
  2439. hfx(i,j), lh(i,j), grdflx(i,j), qfx(i,j), tsk(i,j), &
  2440. ust(i,j), ssib_br(i,j), ssib_fm(i,j), ssib_fh(i,j), ssib_cm(i,j), &
  2441. ssib_lhf(i,j), ssib_shf(i,j), ssib_ghf(i,j), &
  2442. ssib_sdn(i,j), ssib_sup(i,j), ssib_ldn(i,j), ssib_lup(i,j), &
  2443. ssib_wat(i,j), &
  2444. ssib_z00(i,j), ssib_veg(i,j), &
  2445. day, cloudfrac, q2(i,j), t2(i,j), albedo(i,j), &
  2446. ra_sw_physics,xice_threshold &
  2447. )
  2448. BR(i,j)=ssib_br(i,j)
  2449. ZNT(i,j) = ssib_z00(i,j)
  2450. SFCEVP(I,J)= SFCEVP(I,J) + QFX(I,J)*DTBL
  2451. t2(i,j) = tsk(i,j) !use SSiB's TGEFF as 2m temperature (Nov/2011)
  2452. IF (itimestep .ne. 1) THEN
  2453. ZDIFF=(0.5*dz8w(i,1,j))-SSiBXDD(I,J)
  2454. IF(ZDIFF.LE.ZNT(I,J)) ZDIFF=ZNT(I,J)+0.2
  2455. GZ1OZ0(I,J)=ALOG(ZDIFF/ZNT(I,J))
  2456. ENDIF
  2457. ! Overwrite WSPD to remove convective velocity (wspd=wspd1 in YSU)
  2458. WSPD(I,J)=sqrt( u_phytmp(i,1,j)*u_phytmp(i,1,j) + &
  2459. v_phytmp(i,1,j)*v_phytmp(i,1,j) ) + 1.e-9
  2460. ENDIF
  2461. ENDDO
  2462. ENDDO
  2463. !
  2464. IF ( FRACTIONAL_SEAICE == 1 ) THEN
  2465. ! SSIB_seaice returns full land/ice albedo values, no fractional values.
  2466. ! We return to a fractional component here.
  2467. DO j=j_start(ij),j_end(ij)
  2468. DO i=i_start(ij),i_end(ij)
  2469. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2470. albedo(i,j) = ( albedo(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * 0.08 )
  2471. ENDIF
  2472. ENDDO
  2473. ENDDO
  2474. !
  2475. IF ( isisfc ) THEN
  2476. DO j=j_start(ij),j_end(ij)
  2477. DO i=i_start(ij),i_end(ij)
  2478. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2479. ! Weighted average of fields between ice-cover values and open-water values.
  2480. hfx(i,j) = ( hfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * hfx_sea(i,j) )
  2481. qfx(i,j) = ( qfx(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * qfx_sea(i,j) )
  2482. lh(i,j) = ( lh(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * lh_sea(i,j) )
  2483. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) )
  2484. ENDIF
  2485. ENDDO
  2486. ENDDO
  2487. ELSE
  2488. DO j = j_start(ij) , j_end(ij)
  2489. DO i = i_start(ij) , i_end(ij)
  2490. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2491. ! Compute TSK as the open-water and ice-cover average
  2492. tsk(i,j) = ( tsk(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * tsk_sea(i,j) )
  2493. ENDIF
  2494. ENDDO
  2495. ENDDO
  2496. ENDIF
  2497. ENDIF
  2498. ELSE
  2499. CALL wrf_error_fatal('Lacking arguments for SSIB in surface driver')
  2500. ENDIF
  2501. !end ssib
  2502. !-------------------------------------------------------------------
  2503. CASE DEFAULT
  2504. IF ( itimestep .eq. 1 ) THEN
  2505. WRITE( message , * ) &
  2506. 'No land surface physics option is used: sf_surface_physics = ', sf_surface_physics
  2507. CALL wrf_message ( message )
  2508. ENDIF
  2509. END SELECT sfc_select
  2510. ENDDO
  2511. !$OMP END PARALLEL DO
  2512. 430 CONTINUE
  2513. #if ( EM_CORE==1)
  2514. IF (omlcall .EQ. 1) THEN
  2515. ! simple ocean mixed layer model based Pollard, Rhines and Thompson (1973)
  2516. CALL wrf_debug( 100, 'Call OCEANML' )
  2517. !$OMP PARALLEL DO &
  2518. !$OMP PRIVATE ( ij )
  2519. DO ij = 1 , num_tiles
  2520. CALL oceanml(tml,t0ml,hml,h0ml,huml,hvml,ust,u_phy,v_phy, &
  2521. tmoml,f,g,oml_gamma, &
  2522. xland,hfx,lh,tsk,gsw,glw,emiss, &
  2523. dtbl,STBOLT, &
  2524. ids,ide, jds,jde, kds,kde, &
  2525. ims,ime, jms,jme, kms,kme, &
  2526. i_start(ij),i_end(ij), j_start(ij),j_end(ij), kts,kte)
  2527. ENDDO
  2528. !$OMP END PARALLEL DO
  2529. ENDIF
  2530. #endif
  2531. ! Reset RAINBL in mm (Accumulation between PBL calls)
  2532. IF ( PRESENT( rainbl ) ) THEN
  2533. !$OMP PARALLEL DO &
  2534. !$OMP PRIVATE ( ij, i, j, k )
  2535. DO ij = 1 , num_tiles
  2536. DO j=j_start(ij),j_end(ij)
  2537. DO i=i_start(ij),i_end(ij)
  2538. RAINBL(i,j) = 0.
  2539. ENDDO
  2540. ENDDO
  2541. ENDDO
  2542. !$OMP END PARALLEL DO
  2543. ENDIF
  2544. IF( PRESENT(slope_rad).AND. radiation )THEN
  2545. ! topographic slope effects removed from SWDOWN and GSW here for output
  2546. IF (slope_rad .EQ. 1) THEN
  2547. !$OMP PARALLEL DO &
  2548. !$OMP PRIVATE ( ij, i, j, k )
  2549. DO ij = 1 , num_tiles
  2550. DO j=j_start(ij),j_end(ij)
  2551. DO i=i_start(ij),i_end(ij)
  2552. IF(SWNORM(I,J) .GT. 1.E-3)THEN ! daytime
  2553. SWSAVE = SWDOWN(i,j)
  2554. ! SWDOWN contains unaffected SWDOWN in output
  2555. SWDOWN(i,j) = SWNORM(i,j)
  2556. ! SWNORM contains slope-affected SWDOWN in output
  2557. SWNORM(i,j) = SWSAVE
  2558. GSW(i,j) = GSWSAVE(i,j)
  2559. ENDIF
  2560. ENDDO
  2561. ENDDO
  2562. ENDDO
  2563. !$OMP END PARALLEL DO
  2564. ENDIF
  2565. ENDIF
  2566. ENDIF
  2567. END SUBROUTINE surface_driver
  2568. !-------------------------------------------------------------------------
  2569. !-------------------------------------------------------------------------
  2570. subroutine myjsfc_seaice_wrapper(ITIMESTEP,HT,DZ, &
  2571. & PMID,PINT,TH,T,QV,QC,U,V,Q2, &
  2572. & TSK,QSFC,THZ0,QZ0,UZ0,VZ0, &
  2573. & LOWLYR,XLAND,IVGTYP,ISURBAN,IZ0TLND, &
  2574. & TICE2TSK_IF2COLD, & ! Extra for wrapper
  2575. & XICE_THRESHOLD, & ! Extra for wrapper
  2576. & XICE,SST, & ! Extra for wrapper
  2577. & CHS_SEA, CHS2_SEA, CQS2_SEA, CPM_SEA, & ! Extra for wrapper
  2578. & FLHC_SEA, FLQC_SEA, QSFC_SEA, & ! Extra for wrapper
  2579. & QGH_SEA, QZ0_SEA, HFX_SEA, QFX_SEA, & ! Extra for wrapper
  2580. & FLX_LH_SEA, TSK_SEA, & ! Extra for wrapper
  2581. & USTAR,ZNT,Z0BASE,PBLH,MAVAIL,RMOL, &
  2582. & AKHS,AKMS, &
  2583. & BR, &
  2584. & CHS,CHS2,CQS2,HFX,QFX,FLX_LH,FLHC,FLQC, &
  2585. & QGH,CPM,CT, &
  2586. & U10,V10,T02,TH02,TSHLTR,TH10,Q02,QSHLTR,Q10,PSHLTR, &
  2587. & P1000, &
  2588. & IDS,IDE,JDS,JDE,KDS,KDE, &
  2589. & IMS,IME,JMS,JME,KMS,KME, &
  2590. & ITS,ITE,JTS,JTE,KTS,KTE )
  2591. ! USE module_model_constants
  2592. USE module_sf_myjsfc
  2593. IMPLICIT NONE
  2594. INTEGER, INTENT(IN) :: ITIMESTEP
  2595. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: HT
  2596. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: DZ
  2597. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PMID
  2598. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: PINT
  2599. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: TH
  2600. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: T
  2601. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: QV
  2602. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: QC
  2603. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: U
  2604. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: V
  2605. REAL,DIMENSION(IMS:IME,KMS:KME,JMS:JME),INTENT(IN) :: Q2 ! Q2 is TKE?
  2606. ! REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: TSK
  2607. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: TSK
  2608. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: QSFC
  2609. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: THZ0
  2610. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: QZ0
  2611. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: UZ0
  2612. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: VZ0
  2613. INTEGER,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: LOWLYR
  2614. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: XLAND
  2615. INTEGER,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: IVGTYP
  2616. INTEGER :: ISURBAN
  2617. INTEGER :: IZ0TLND
  2618. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: XICE ! Extra for wrapper
  2619. ! REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: SST ! Extra for wrapper
  2620. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: SST ! Extra for wrapper
  2621. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: BR
  2622. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS_SEA ! Extra for wrapper
  2623. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS2_SEA ! Extra for wrapper
  2624. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CQS2_SEA ! Extra for wrapper
  2625. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CPM_SEA ! Extra for wrapper
  2626. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QZ0_SEA ! Extra for wrapper
  2627. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QSFC_SEA ! Extra for wrapper
  2628. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QGH_SEA ! Extra for wrapper
  2629. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLHC_SEA ! Extra for wrapper
  2630. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLQC_SEA ! Extra for wrapper
  2631. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HFX_SEA ! Extra for wrapper
  2632. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QFX_SEA ! Extra for wrapper
  2633. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLX_LH_SEA ! Extra for wrapper
  2634. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TSK_SEA ! Extra for wrapper
  2635. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: USTAR
  2636. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: ZNT
  2637. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: Z0BASE
  2638. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: PBLH
  2639. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(IN) :: MAVAIL
  2640. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: RMOL
  2641. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: AKHS
  2642. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(INOUT) :: AKMS
  2643. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS
  2644. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CHS2
  2645. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CQS2
  2646. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: HFX
  2647. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QFX
  2648. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLX_LH
  2649. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLHC
  2650. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: FLQC
  2651. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QGH
  2652. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CPM
  2653. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: CT
  2654. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: U10
  2655. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: V10
  2656. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: T02
  2657. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TH02
  2658. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TSHLTR
  2659. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: TH10
  2660. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: Q02
  2661. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: QSHLTR
  2662. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: Q10
  2663. REAL,DIMENSION(IMS:IME,JMS:JME), INTENT(OUT) :: PSHLTR
  2664. REAL, INTENT(IN) :: P1000
  2665. REAL, INTENT(IN) :: XICE_THRESHOLD
  2666. LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD
  2667. INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE, &
  2668. & IMS,IME,JMS,JME,KMS,KME, &
  2669. & ITS,ITE,JTS,JTE,KTS,KTE
  2670. ! Local
  2671. INTEGER :: i
  2672. INTEGER :: j
  2673. REAL, DIMENSION( ims:ime, jms:jme ) :: ct_sea
  2674. REAL, DIMENSION( ims:ime, jms:jme ) :: u10_sea
  2675. REAL, DIMENSION( ims:ime, jms:jme ) :: v10_sea
  2676. REAL, DIMENSION( ims:ime, jms:jme ) :: t02_sea
  2677. REAL, DIMENSION( ims:ime, jms:jme ) :: th02_sea
  2678. REAL, DIMENSION( ims:ime, jms:jme ) :: tshltr_sea
  2679. REAL, DIMENSION( ims:ime, jms:jme ) :: pshltr_sea
  2680. REAL, DIMENSION( ims:ime, jms:jme ) :: qshltr_sea
  2681. REAL, DIMENSION( ims:ime, jms:jme ) :: th10_sea
  2682. REAL, DIMENSION( ims:ime, jms:jme ) :: q02_sea
  2683. REAL, DIMENSION( ims:ime, jms:jme ) :: q10_sea
  2684. REAL, DIMENSION( ims:ime, jms:jme ) :: thz0_sea
  2685. REAL, DIMENSION( ims:ime, jms:jme ) :: uz0_sea
  2686. REAL, DIMENSION( ims:ime, jms:jme ) :: vz0_sea
  2687. REAL, DIMENSION( ims:ime, jms:jme ) :: ustar_sea
  2688. REAL, DIMENSION( ims:ime, jms:jme ) :: pblh_sea
  2689. REAL, DIMENSION( ims:ime, jms:jme ) :: rmol_sea
  2690. REAL, DIMENSION( ims:ime, jms:jme ) :: akhs_sea
  2691. REAL, DIMENSION( ims:ime, jms:jme ) :: akms_sea
  2692. REAL, DIMENSION( ims:ime, jms:jme ) :: xland_sea
  2693. REAL, DIMENSION( ims:ime, jms:jme ) :: mavail_sea
  2694. REAL, DIMENSION( ims:ime, jms:jme ) :: znt_sea
  2695. REAL, DIMENSION( ims:ime, jms:jme ) :: z0base_sea
  2696. REAL, DIMENSION( ims:ime, jms:jme ) :: br_sea
  2697. REAL, DIMENSION( ims:ime, jms:jme ) :: QSFC_HOLD
  2698. REAL, DIMENSION( ims:ime, jms:jme ) :: QZ0_HOLD
  2699. REAL, DIMENSION( ims:ime, jms:jme ) :: THZ0_HOLD
  2700. REAL, DIMENSION( ims:ime, jms:jme ) :: UZ0_HOLD
  2701. REAL, DIMENSION( ims:ime, jms:jme ) :: VZ0_HOLD
  2702. REAL, DIMENSION( ims:ime, jms:jme ) :: USTAR_HOLD
  2703. REAL, DIMENSION( ims:ime, jms:jme ) :: ZNT_HOLD
  2704. REAL, DIMENSION( ims:ime, jms:jme ) :: PBLH_HOLD
  2705. REAL, DIMENSION( ims:ime, jms:jme ) :: RMOL_HOLD
  2706. REAL, DIMENSION( ims:ime, jms:jme ) :: AKHS_HOLD
  2707. REAL, DIMENSION( ims:ime, jms:jme ) :: AKMS_HOLD
  2708. REAL, DIMENSION( ims:ime, jms:jme ) :: TSK_LOCAL
  2709. REAL :: PSFC
  2710. ! Set things up for the frozen-surface call to myjsfc
  2711. ! Is SST local here, or are the changes to be fed back to the calling routines?
  2712. ! We want a TSK valid for the ice-covered regions of the grid cell.
  2713. CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, &
  2714. itimestep, .true., tice2tsk_if2cold, &
  2715. XICE, XICE_THRESHOLD, &
  2716. SST, TSK, TSK_SEA, TSK_LOCAL )
  2717. DO j = JTS , JTE
  2718. DO i = ITS , ITE
  2719. TSK(i,j) = TSK_LOCAL(i,j)
  2720. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2721. ! Over fractional sea-ice points, back out an ice portion of QSFC as well.
  2722. ! QSFC_SEA calculation as done in myjsfc for open water points
  2723. PSFC = PINT(I,LOWLYR(I,J),J)
  2724. QSFC_SEA(i,j) = PQ0SEA/PSFC*EXP(A2S*(TSK(i,j)-A3S)/(TSK(i,j)-A4S))
  2725. QSFC(i,j) = QSFC(i,j) - (1.0-XICE(i,j)) * QSFC_SEA(i,j) / XICE(i,j)
  2726. !
  2727. HFX_SEA(i,j) = HFX(i,j)
  2728. QFX_SEA(i,j) = QFX(i,j)
  2729. FLX_LH_SEA(i,j) = FLX_LH(i,j)
  2730. ENDIF
  2731. ENDDO
  2732. ENDDO
  2733. !
  2734. ! frozen ocean call for sea ice points
  2735. !
  2736. ! Strictly INTENT(IN) to MYJSFC, should be unchanged by call.
  2737. ! DZ
  2738. ! HT
  2739. ! LOWLYR
  2740. ! MAVAIL
  2741. ! PINT
  2742. ! PMID
  2743. ! QC
  2744. ! QV
  2745. ! Q2
  2746. ! T
  2747. ! TH
  2748. ! TSK
  2749. ! U
  2750. ! V
  2751. ! XLAND
  2752. ! Z0BASE
  2753. ! INTENT (INOUT), updated by MYJSFC. Values will need to be saved before the first call to MYJSFC, so that
  2754. ! the second call to MYJSFC does not double-count the effect.
  2755. ! Save INTENT(INOUT) variables before the frozen-water/true-land call to MYJSFC:
  2756. QSFC_HOLD = QSFC
  2757. QZ0_HOLD = QZ0
  2758. THZ0_HOLD = THZ0
  2759. UZ0_HOLD = UZ0
  2760. VZ0_HOLD = VZ0
  2761. USTAR_HOLD = USTAR
  2762. ZNT_HOLD = ZNT
  2763. PBLH_HOLD = PBLH
  2764. RMOL_HOLD = RMOL
  2765. AKHS_HOLD = AKHS
  2766. AKMS_HOLD = AKMS
  2767. ! Strictly INTENT(OUT): Set by MYJSFC
  2768. ! CHS
  2769. ! CHS2
  2770. ! CPM
  2771. ! CQS2
  2772. ! CT
  2773. ! FLHC
  2774. ! FLQC
  2775. ! FLX_LH
  2776. ! HFX
  2777. ! PSHLTR
  2778. ! QFX
  2779. ! QGH
  2780. ! QSHLTR
  2781. ! Q02
  2782. ! Q10
  2783. ! TH02
  2784. ! TH10
  2785. ! TSHLTR
  2786. ! T02
  2787. ! U10
  2788. ! V10
  2789. ! Frozen-water/true-land call.
  2790. CALL MYJSFC ( ITIMESTEP, HT, DZ, & ! I,I,I,
  2791. & PMID, PINT, TH, T, QV, QC, U, V, Q2, & ! I,I,I,I,I,I,I,I,I,
  2792. & TSK, QSFC, THZ0, QZ0, UZ0, VZ0, & ! I,IO,IO,IO,IO,IO,
  2793. & LOWLYR, XLAND, IVGTYP, ISURBAN, IZ0TLND, & ! I,I,I,I,I
  2794. & USTAR, ZNT, Z0BASE, PBLH, MAVAIL, RMOL, & ! IO,IO,I,IO,I,IO,
  2795. & AKHS, AKMS, & ! IO,IO,
  2796. & BR, & ! O
  2797. & CHS, CHS2, CQS2, HFX, QFX, FLX_LH, FLHC, FLQC, & ! O,O,O,0,0,0,0,0,
  2798. & QGH, CPM, CT, U10, V10, T02, & ! 0,0,0,0,0,0,
  2799. & TH02, TSHLTR, TH10, Q02, & ! 0,0,0,0,
  2800. & QSHLTR, Q10, PSHLTR, & ! 0,0,0,
  2801. & P1000, & ! I
  2802. & ids,ide, jds,jde, kds,kde, &
  2803. & ims,ime, jms,jme, kms,kme, &
  2804. & its,ite, jts,jte, kts,kte )
  2805. ! Set up things for the open ocean call.
  2806. DO j = JTS, JTE
  2807. DO i = ITS, ITE
  2808. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .AND. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2809. XLAND_SEA(i,j)=2.
  2810. MAVAIL_SEA(I,J) = 1.
  2811. ZNT_SEA(I,J) = 0.0001
  2812. Z0BASE_SEA(I,J) = ZNT_SEA(I,J)
  2813. IF ( SST(i,j) .LT. 271.4 ) THEN
  2814. SST(i,j) = 271.4
  2815. ENDIF
  2816. TSK_SEA(i,j) = SST(i,j)
  2817. PSFC = PINT(I,LOWLYR(I,J),J)
  2818. QSFC_SEA(I,J) = PQ0SEA/PSFC*EXP(A2S*(TSK_SEA(i,j)-A3S)/(TSK_SEA(i,j)-A4S))
  2819. ELSE
  2820. ! This should be a land point or a true open water point
  2821. XLAND_SEA(i,j)=xland(i,j)
  2822. MAVAIL_SEA(i,j) = mavail(i,j)
  2823. ZNT_SEA(I,J) = ZNT_HOLD(I,J)
  2824. Z0BASE_SEA(I,J) = Z0BASE(I,J)
  2825. TSK_SEA(i,j) = TSK(i,j)
  2826. QSFC_SEA(i,j) = QSFC_HOLD(i,j)
  2827. ENDIF
  2828. ENDDO
  2829. ENDDO
  2830. QZ0_SEA = QZ0_HOLD
  2831. THZ0_SEA = THZ0_HOLD
  2832. UZ0_SEA = UZ0_HOLD
  2833. VZ0_SEA = VZ0_HOLD
  2834. USTAR_SEA = USTAR_HOLD
  2835. PBLH_SEA = PBLH_HOLD
  2836. RMOL_SEA = RMOL_HOLD
  2837. AKHS_SEA = AKHS_HOLD
  2838. AKMS_SEA = AKMS_HOLD
  2839. !
  2840. ! open water call
  2841. !
  2842. CALL MYJSFC ( ITIMESTEP, HT, DZ, & ! I,I,I,
  2843. & PMID, PINT, TH, T, QV, QC, U, V, Q2, & ! I,I,I,I,I,I,I,I,I,
  2844. & TSK_SEA, QSFC_SEA, THZ0_SEA, QZ0_SEA, UZ0_SEA, VZ0_SEA, & ! I,IO,IO,IO,IO,IO,
  2845. & LOWLYR, XLAND_SEA, IVGTYP, ISURBAN, IZ0TLND, & ! I,I,I,I,I,
  2846. & USTAR_SEA, ZNT_SEA, Z0BASE_SEA, PBLH_SEA, MAVAIL_SEA, RMOL_SEA, & ! IO,IO,I,IO,I,IO,
  2847. & AKHS_SEA, AKMS_SEA, & ! IO,IO,
  2848. & BR_SEA, & ! dummy space holder
  2849. & CHS_SEA, CHS2_SEA, CQS2_SEA, HFX_SEA, QFX_SEA, FLX_LH_SEA, FLHC_SEA, & ! 0,0,0,0,0,0,0,
  2850. & FLQC_SEA, QGH_SEA, CPM_SEA, CT_SEA, U10_SEA, V10_SEA, T02_SEA, TH02_SEA, & ! 0,0,0,0,0,0,0,0,
  2851. & TSHLTR_SEA, TH10_SEA, Q02_SEA, QSHLTR_SEA, Q10_SEA, PSHLTR_SEA, & ! 0,0,0,0,0,0,
  2852. & p1000, & ! I
  2853. & ids,ide, jds,jde, kds,kde, &
  2854. & ims,ime, jms,jme, kms,kme, &
  2855. & its,ite, jts,jte, kts,kte )
  2856. !
  2857. ! Scale the appropriate terms between open-water values and ice-covered values
  2858. !
  2859. DO j = JTS, JTE
  2860. DO i = ITS, ITE
  2861. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  2862. ! Over sea-ice points, blend the results.
  2863. ! INTENT(OUT) from MYJSFC
  2864. ! CHS wait
  2865. ! CHS2 wait
  2866. ! CPM wait
  2867. ! CQS2 wait
  2868. CT(i,j) = CT(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * CT_SEA (i,j)
  2869. ! FLHC(i,j) = FLHC(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * FLHC_SEA (i,j)
  2870. ! FLQC(i,j) = FLQC(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * FLQC_SEA (i,j)
  2871. ! FLX_LH wait
  2872. ! HFX wait
  2873. PSHLTR(i,j) = PSHLTR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * PSHLTR_SEA(i,j)
  2874. ! QFX wait
  2875. ! QGH wait
  2876. QSHLTR(i,j) = QSHLTR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * QSHLTR_SEA(i,j)
  2877. Q02(i,j) = Q02(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * Q02_SEA(i,j)
  2878. Q10(i,j) = Q10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * Q10_SEA(i,j)
  2879. TH02(i,j) = TH02(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * TH02_SEA(i,j)
  2880. TH10(i,j) = TH10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * TH10_SEA(i,j)
  2881. TSHLTR(i,j) = TSHLTR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * TSHLTR_SEA(i,j)
  2882. T02(i,j) = T02(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * T02_SEA(i,j)
  2883. U10(i,j) = U10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * U10_SEA(i,j)
  2884. V10(i,j) = V10(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * V10_SEA(i,j)
  2885. ! INTENT(INOUT): updated by MYJSFC
  2886. ! QSFC: wait
  2887. THZ0(i,j) = THZ0(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * THZ0_SEA(i,j)
  2888. ! qz0 wait
  2889. UZ0(i,j) = UZ0(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * UZ0_SEA(i,j)
  2890. VZ0(i,j) = VZ0(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * VZ0_SEA(i,j)
  2891. USTAR(i,j) = USTAR(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * USTAR_SEA(i,j)
  2892. ! ZNT wait
  2893. PBLH(i,j) = PBLH(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * PBLH_SEA(i,j)
  2894. RMOL(i,j) = RMOL(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * RMOL_SEA(i,j)
  2895. AKHS(i,j) = AKHS(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * AKHS_SEA(i,j)
  2896. AKMS(i,j) = AKMS(i,j) * XICE(i,j) + (1.0-XICE(i,j)) * AKMS_SEA(i,j)
  2897. ! tsk(i,j) = tsk(i,j)*XICE(i,j) + (1.0-XICE(i,j))*TSK_SEA(i,j)
  2898. ELSE
  2899. ! We're not over sea ice. Take the results from the first call.
  2900. ENDIF
  2901. ENDDO
  2902. ENDDO
  2903. END SUBROUTINE myjsfc_seaice_wrapper
  2904. !-------------------------------------------------------------------------
  2905. SUBROUTINE mynn_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
  2906. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  2907. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  2908. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, &
  2909. U10,V10,TH2,T2,Q2, &
  2910. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  2911. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  2912. KARMAN,EOMEG,STBOLT, &
  2913. &itimestep,ch,th3d,pi3d,qc3d, &
  2914. &tsq,qsq,cov,qcg, &
  2915. XICE,SST,TSK_SEA, &
  2916. CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
  2917. HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
  2918. TICE2TSK_IF2COLD,XICE_THRESHOLD, &
  2919. ids,ide, jds,jde, kds,kde, &
  2920. ims,ime, jms,jme, kms,kme, &
  2921. its,ite, jts,jte, kts,kte)
  2922. ! ustm,ck,cka,cd,cda,isftcflx,iz0tlnd )
  2923. USE module_sf_mynn, ONLY: sfclay_mynn
  2924. implicit none
  2925. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  2926. ims,ime, jms,jme, kms,kme, &
  2927. its,ite, jts,jte, kts,kte
  2928. INTEGER, INTENT(IN ) :: ISFFLX
  2929. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  2930. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  2931. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  2932. INTENT(IN ) :: dz8w
  2933. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  2934. INTENT(IN ) :: QV3D, &
  2935. P3D, &
  2936. T3D
  2937. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2938. INTENT(IN ) :: MAVAIL, &
  2939. PBLH, &
  2940. XLAND
  2941. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2942. INTENT(OUT ) :: U10, &
  2943. V10, &
  2944. TH2, &
  2945. T2, &
  2946. Q2, &
  2947. QSFC
  2948. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2949. INTENT(INOUT) :: REGIME, &
  2950. HFX, &
  2951. QFX, &
  2952. LH, &
  2953. MOL,RMOL,TSK
  2954. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2955. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  2956. PSIM,PSIH
  2957. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  2958. INTENT(IN ) :: U3D, &
  2959. V3D
  2960. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2961. INTENT(IN ) :: PSFC
  2962. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2963. INTENT(INOUT) :: ZNT, &
  2964. ZOL, &
  2965. UST, &
  2966. CPM, &
  2967. CHS2, &
  2968. CQS2, &
  2969. CHS
  2970. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2971. INTENT(INOUT) :: FLHC,FLQC
  2972. REAL, DIMENSION( ims:ime, jms:jme ) , &
  2973. INTENT(INOUT) :: &
  2974. QGH
  2975. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  2976. ! from mynn subroutine
  2977. INTEGER, INTENT(in) :: itimestep
  2978. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN) :: qcg
  2979. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: ch
  2980. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
  2981. &QC3D,&
  2982. &th3d,pi3d,tsq,qsq,cov
  2983. ! REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ) , &
  2984. ! INTENT(OUT) :: ck,cka,cd,cda,ustm
  2985. ! INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX,IZ0TLND
  2986. !--------------------------------------------------------------------
  2987. ! New for wrapper
  2988. !--------------------------------------------------------------------
  2989. LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD
  2990. REAL, INTENT(IN) :: XICE_THRESHOLD
  2991. REAL, DIMENSION( ims:ime, jms:jme ), &
  2992. INTENT(IN) :: XICE
  2993. REAL, DIMENSION( ims:ime, jms:jme ), &
  2994. INTENT(INOUT) :: SST
  2995. REAL, DIMENSION( ims:ime, jms:jme ), &
  2996. INTENT(OUT) :: TSK_SEA, &
  2997. CHS2_SEA, &
  2998. CHS_SEA, &
  2999. CPM_SEA, &
  3000. CQS2_SEA, &
  3001. FLHC_SEA, &
  3002. FLQC_SEA, &
  3003. HFX_SEA, &
  3004. LH_SEA, &
  3005. QFX_SEA, &
  3006. QGH_SEA, &
  3007. QSFC_SEA, &
  3008. ZNT_SEA
  3009. !--------------------------------------------------------------------
  3010. ! Local
  3011. !--------------------------------------------------------------------
  3012. INTEGER :: I, J
  3013. REAL, DIMENSION( ims:ime, jms:jme ) :: XLAND_SEA, &
  3014. MAVAIL_sea, &
  3015. TSK_LOCAL, &
  3016. BR_HOLD, &
  3017. CHS2_HOLD, &
  3018. CHS_HOLD, &
  3019. CPM_HOLD, &
  3020. CQS2_HOLD, &
  3021. FLHC_HOLD, &
  3022. FLQC_HOLD, &
  3023. GZ1OZ0_HOLD, &
  3024. HFX_HOLD, &
  3025. LH_HOLD, &
  3026. MOL_HOLD, &
  3027. PSIH_HOLD, &
  3028. PSIM_HOLD, &
  3029. QFX_HOLD, &
  3030. QGH_HOLD, &
  3031. REGIME_HOLD, &
  3032. RMOL_HOLD, &
  3033. UST_HOLD, &
  3034. WSPD_HOLD, &
  3035. ZNT_HOLD, &
  3036. CH_HOLD, & ! new
  3037. ZOL_HOLD, &
  3038. Q2_SEA, &
  3039. T2_SEA, &
  3040. TH2_SEA, &
  3041. U10_SEA, &
  3042. V10_SEA
  3043. REAL, DIMENSION( ims:ime, jms:jme ) :: &
  3044. BR_SEA, &
  3045. GZ1OZ0_SEA, &
  3046. MOL_SEA, &
  3047. PSIH_SEA, &
  3048. PSIM_SEA, &
  3049. REGIME_SEA, &
  3050. RMOL_SEA, &
  3051. UST_SEA, &
  3052. WSPD_SEA, &
  3053. CH_SEA, & ! new
  3054. ZOL_SEA
  3055. ! INTENT(IN) to SFCLAY; unchanged by the call
  3056. ! ISFFLX
  3057. ! SVP1,SVP2,SVP3,SVPT0
  3058. ! EP1,EP2,KARMAN,EOMEG,STBOLT
  3059. ! CP,G,ROVCP,R,XLV,DX
  3060. ! dz8w
  3061. ! QV3D
  3062. ! P3D
  3063. ! T3D
  3064. ! MAVAIL
  3065. ! PBLH
  3066. ! XLAND
  3067. ! TSK
  3068. ! U3D
  3069. ! V3D
  3070. ! PSFC
  3071. CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, &
  3072. itimestep, .true., tice2tsk_if2cold, &
  3073. XICE, XICE_THRESHOLD, &
  3074. SST, TSK, TSK_SEA, TSK_LOCAL )
  3075. ! DFS 8/25/10 Set TSK to ice value
  3076. DO j = JTS , JTE
  3077. DO i = ITS , ITE
  3078. TSK(i,j) = TSK_LOCAL(i,j)
  3079. ENDDO
  3080. ENDDO
  3081. ! INTENT (INOUT) to SFCLAY: Save the variables before the first call
  3082. ! (for land/frozen water) to SFCLAY, to keep from double-counting the
  3083. ! effects of that routine
  3084. BR_HOLD = BR
  3085. CHS2_HOLD = CHS2
  3086. CHS_HOLD = CHS
  3087. CPM_HOLD = CPM
  3088. CQS2_HOLD = CQS2
  3089. FLHC_HOLD = FLHC
  3090. FLQC_HOLD = FLQC
  3091. GZ1OZ0_HOLD = GZ1OZ0
  3092. HFX_HOLD = HFX
  3093. LH_HOLD = LH
  3094. MOL_HOLD = MOL
  3095. PSIH_HOLD = PSIH
  3096. PSIM_HOLD = PSIM
  3097. QFX_HOLD = QFX
  3098. QGH_HOLD = QGH
  3099. REGIME_HOLD = REGIME
  3100. RMOL_HOLD = RMOL
  3101. UST_HOLD = UST
  3102. WSPD_HOLD = WSPD
  3103. ZNT_HOLD = ZNT
  3104. ZOL_HOLD = ZOL
  3105. CH_HOLD = CH
  3106. ! INTENT(OUT) from SFCLAY. Input shouldn't matter, but we'll want to
  3107. ! keep things around for weighting after the second call to SFCLAY.
  3108. ! Q2
  3109. ! QSFC
  3110. ! T2
  3111. ! TH2
  3112. ! U10
  3113. ! V10
  3114. ! land/frozen-water call
  3115. ! call sfclay(U3D,V3D,T3D,QV3D,P3D,dz8w, & ! I
  3116. ! CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & !
  3117. ! I,I,I,I,I,I,IO,IO,IO,IO,
  3118. ! ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  3119. ! XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC,QGH,QSFC,RMOL, &
  3120. ! U10,V10,TH2,T2,Q2, &
  3121. ! GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  3122. ! SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  3123. ! KARMAN,EOMEG,STBOLT, &
  3124. ! P1000, &
  3125. ! ids,ide, jds,jde, kds,kde, &
  3126. ! ims,ime, jms,jme, kms,kme, &
  3127. ! its,ite, jts,jte, kts,kte, &
  3128. ! ustm,ck,cka,cd,cda,isftcflx,iz0tlnd )
  3129. CALL SFCLAY_mynn(U3D,V3D,T3D,QV3D,P3D,dz8w, &
  3130. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  3131. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  3132. XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC,QGH,QSFC,RMOL, &
  3133. U10,V10,TH2,T2,Q2, &
  3134. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  3135. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
  3136. &itimestep,ch,th3d,pi3d,qc3d, &
  3137. &tsq,qsq,cov,qcg, &
  3138. ids,ide, jds,jde, kds,kde, &
  3139. ims,ime, jms,jme, kms,kme, &
  3140. its,ite, jts,jte, kts,kte )
  3141. ! Set up for open-water call
  3142. DO j = JTS , JTE
  3143. DO i = ITS , ITE
  3144. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  3145. XLAND_SEA(i,j)=2.
  3146. MAVAIL_SEA(I,J) =1.
  3147. ZNT_SEA(I,J) = 0.0001
  3148. TSK_SEA(i,j) = SST(i,j)
  3149. IF ( SST(i,j) .LT. 271.4 ) THEN
  3150. SST(i,j) = 271.4
  3151. TSK_SEA(i,j) = SST(i,j)
  3152. ENDIF
  3153. ELSE
  3154. XLAND_SEA(i,j) = XLAND(i,j)
  3155. MAVAIL_SEA(i,j) = MAVAIL(i,j)
  3156. ZNT_SEA(i,j) = ZNT_HOLD(i,j)
  3157. TSK_SEA(i,j) = TSK_LOCAL(i,j)
  3158. ENDIF
  3159. ENDDO
  3160. ENDDO
  3161. ! Restore the values from before the land/frozen-water call
  3162. BR_SEA = BR_HOLD
  3163. CHS2_SEA = CHS2_HOLD
  3164. CHS_SEA = CHS_HOLD
  3165. CPM_SEA = CPM_HOLD
  3166. CQS2_SEA = CQS2_HOLD
  3167. FLHC_SEA = FLHC_HOLD
  3168. FLQC_SEA = FLQC_HOLD
  3169. GZ1OZ0_SEA = GZ1OZ0_HOLD
  3170. HFX_SEA = HFX_HOLD
  3171. LH_SEA = LH_HOLD
  3172. MOL_SEA = MOL_HOLD
  3173. PSIH_SEA = PSIH_HOLD
  3174. PSIM_SEA = PSIM_HOLD
  3175. QFX_SEA = QFX_HOLD
  3176. QGH_SEA = QGH_HOLD
  3177. REGIME_SEA = REGIME_HOLD
  3178. RMOL_SEA = RMOL_HOLD
  3179. UST_SEA = UST_HOLD
  3180. WSPD_SEA = WSPD_HOLD
  3181. ZOL_SEA = ZOL_HOLD
  3182. CH_SEA = CH_HOLD
  3183. ! open-water call
  3184. ! call sfclay(U3D,V3D,T3D,QV3D,P3D,dz8w, & ! I
  3185. ! CP,G,ROVCP,R,XLV,PSFC, & ! I
  3186. ! CHS_SEA,CHS2_SEA,CQS2_SEA,CPM_SEA, & ! I/O
  3187. ! ZNT_SEA,UST_SEA, & ! I/O
  3188. ! PBLH,MAVAIL_SEA, & ! I
  3189. ! ZOL_SEA,MOL_SEA,REGIME_SEA,PSIM_SEA,PSIH_SEA, & ! I/O
  3190. ! XLAND_SEA, & ! I
  3191. ! HFX_SEA,QFX_SEA,LH_SEA, & ! I/O
  3192. ! TSK_SEA, & ! I
  3193. ! FLHC_SEA,FLQC_SEA,QGH_SEA,QSFC_sea,RMOL_SEA, & ! I/O
  3194. ! U10_sea,V10_sea,TH2_sea,T2_sea,Q2_sea, & ! O
  3195. ! GZ1OZ0_SEA,WSPD_SEA,BR_SEA, & ! I/O
  3196. ! ISFFLX,DX, &
  3197. ! SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  3198. ! KARMAN,EOMEG,STBOLT,
  3199. ! P1000, &
  3200. ! ids,ide, jds,jde, kds,kde, &
  3201. ! ims,ime, jms,jme, kms,kme, &
  3202. ! its,ite, jts,jte, kts,kte, & ! 0
  3203. ! ustm_sea,ck_sea,cka_sea,cd_sea,cda_sea,isftcflx,iz0tlnd )
  3204. CALL SFCLAY_mynn(U3D,V3D,T3D,QV3D,P3D,dz8w, &
  3205. CP,G,ROVCP,R,XLV,PSFC, &
  3206. CHS_SEA,CHS2_SEA,CQS2_SEA,CPM_SEA, &
  3207. ZNT_SEA,UST_SEA, &
  3208. PBLH,MAVAIL_SEA, &
  3209. ZOL_SEA,MOL_SEA,REGIME_SEA,PSIM_SEA,PSIH_SEA, &
  3210. XLAND_SEA, &
  3211. HFX_SEA,QFX_SEA,LH_SEA, &
  3212. TSK_SEA, &
  3213. FLHC_SEA,FLQC_SEA,QGH_SEA,QSFC_sea,RMOL_SEA, &
  3214. U10_sea,V10_sea,TH2_sea,T2_sea,Q2_sea, &
  3215. GZ1OZ0_SEA,WSPD_SEA,BR_SEA, &
  3216. ISFFLX,DX, &
  3217. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
  3218. &itimestep,CH_SEA,th3d,pi3d,qc3d, &
  3219. &tsq,qsq,cov,qcg, &
  3220. ids,ide, jds,jde, kds,kde, &
  3221. ims,ime, jms,jme, kms,kme, &
  3222. its,ite, jts,jte, kts,kte )
  3223. DO j = JTS , JTE
  3224. DO i = ITS, ITE
  3225. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and.( XICE(i,j) .LE. 1.0 ) ) THEN
  3226. ! weighted average for sea ice points
  3227. br(i,j) = ( br(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * br_sea(i,j) )
  3228. ! CHS2 -- wait
  3229. ! CHS -- wait
  3230. ! CPM -- wait
  3231. ! CQS2 -- wait
  3232. ! FLHC -- wait
  3233. ! FLQC -- wait
  3234. gz1oz0(i,j) = ( gz1oz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * gz1oz0_sea(i,j) )
  3235. ! HFX -- wait
  3236. ! LH -- wait
  3237. mol(i,j) = ( mol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * mol_sea(i,j) )
  3238. psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psih_sea(i,j) )
  3239. psim(i,j) = ( psim(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psim_sea(i,j) )
  3240. ! QFX -- wait
  3241. ! QGH -- wait
  3242. if ( XICE(i,j).GE. 0.5 ) regime(i,j) = regime_hold(i,j)
  3243. rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * rmol_sea(i,j) )
  3244. ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * ust_sea(i,j) )
  3245. wspd(i,j) = ( wspd(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * wspd_sea(i,j) )
  3246. zol(i,j) = ( zol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * zol_sea(i,j) )
  3247. ch(i,j) = ( ch(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * ch_sea(i,j) )
  3248. ! INTENT(OUT)
  3249. ! --------------------------------------------------------------------
  3250. q2(i,j) = ( q2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * q2_sea(i,j) )
  3251. ! QSFC -- wait
  3252. t2(i,j) = ( t2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * t2_sea(i,j) )
  3253. th2(i,j) = ( th2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * th2_sea(i,j) )
  3254. u10(i,j) = ( u10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * u10_sea(i,j) )
  3255. ! IF ( PRESENT ( USTM ) ) THEN
  3256. ! USTM(i,j) = ( USTM(i,j) * XICE(i,j) ) + (
  3257. ! (1.0-XICE(i,j)) * USTM_sea(i,j) )
  3258. ! ENDIF
  3259. v10(i,j) = ( v10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * v10_sea(i,j) )
  3260. ENDIF
  3261. END DO
  3262. END DO
  3263. !
  3264. ! tsk(i,j) = tsk(i,j)*XICE(i,j) + (1.0-XICE(i,j))*TSK_SEA(i,j)
  3265. !
  3266. END SUBROUTINE mynn_seaice_wrapper
  3267. !-------------------------------------------------------------------------
  3268. SUBROUTINE sf_gfs_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D, &
  3269. CP,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  3270. ZNT,UST,PSIM,PSIH, &
  3271. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC, &
  3272. QGH,QSFC,U10,V10, &
  3273. GZ1OZ0,WSPD,BR,ISFFLX, &
  3274. EP1,EP2,KARMAN,itimestep, &
  3275. TICE2TSK_IF2COLD, &
  3276. XICE_THRESHOLD, &
  3277. CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA, &
  3278. FLHC_SEA, FLQC_SEA, &
  3279. HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA,&
  3280. UST_SEA, ZNT_SEA, SST, XICE, &
  3281. ids,ide, jds,jde, kds,kde, &
  3282. ims,ime, jms,jme, kms,kme, &
  3283. its,ite, jts,jte, kts,kte )
  3284. USE module_sf_gfs
  3285. implicit none
  3286. INTEGER, INTENT(IN) :: ids,ide, jds,jde, kds,kde, &
  3287. ims,ime, jms,jme, kms,kme, &
  3288. its,ite, jts,jte, kts,kte, &
  3289. ISFFLX,itimestep
  3290. REAL, INTENT(IN) :: &
  3291. CP, &
  3292. EP1, &
  3293. EP2, &
  3294. KARMAN, &
  3295. R, &
  3296. ROVCP, &
  3297. XLV
  3298. REAL, DIMENSION(ims:ime, kms:kme, jms:jme), INTENT(IN) :: &
  3299. P3D, &
  3300. QV3D, &
  3301. T3D, &
  3302. U3D, &
  3303. V3D
  3304. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
  3305. TSK, &
  3306. PSFC, &
  3307. XLAND
  3308. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
  3309. UST, &
  3310. ZNT
  3311. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  3312. BR, &
  3313. CHS, &
  3314. CHS2, &
  3315. CPM, &
  3316. CQS2, &
  3317. FLHC, &
  3318. FLQC, &
  3319. GZ1OZ0, &
  3320. HFX, &
  3321. LH, &
  3322. PSIM, &
  3323. PSIH, &
  3324. QFX, &
  3325. QGH, &
  3326. QSFC, &
  3327. U10, &
  3328. V10, &
  3329. WSPD
  3330. REAL, DIMENSION(ims:ime, jms:jme), INTENT(IN) :: &
  3331. XICE
  3332. REAL, DIMENSION(ims:ime, jms:jme), INTENT(OUT) :: &
  3333. CHS_SEA, &
  3334. CHS2_SEA, &
  3335. CPM_SEA, &
  3336. CQS2_SEA, &
  3337. FLHC_SEA, &
  3338. FLQC_SEA, &
  3339. HFX_SEA, &
  3340. LH_SEA, &
  3341. QFX_SEA, &
  3342. QGH_SEA, &
  3343. QSFC_SEA, &
  3344. UST_SEA, &
  3345. ZNT_SEA
  3346. REAL, DIMENSION(ims:ime, jms:jme), INTENT(INOUT) :: &
  3347. SST
  3348. REAL, INTENT(IN) :: &
  3349. XICE_THRESHOLD
  3350. LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD
  3351. !-------------------------------------------------------------------------
  3352. ! Local
  3353. !-------------------------------------------------------------------------
  3354. INTEGER :: I
  3355. INTEGER :: J
  3356. REAL, DIMENSION(ims:ime, jms:jme) :: &
  3357. BR_SEA, &
  3358. GZ1OZ0_SEA, &
  3359. PSIM_SEA, &
  3360. PSIH_SEA, &
  3361. U10_SEA, &
  3362. V10_SEA, &
  3363. WSPD_SEA, &
  3364. XLAND_SEA, &
  3365. TSK_SEA, &
  3366. UST_HOLD, &
  3367. ZNT_HOLD, &
  3368. TSK_LOCAL
  3369. CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, &
  3370. itimestep, .true., tice2tsk_if2cold, &
  3371. XICE, XICE_THRESHOLD, &
  3372. SST, TSK, TSK_SEA, TSK_LOCAL )
  3373. !
  3374. ! Set up for frozen ocean call for sea ice points
  3375. !
  3376. ! Strictly INTENT(IN), Should be unchanged by SF_GFS:
  3377. ! CP
  3378. ! EP1
  3379. ! EP2
  3380. ! KARMAN
  3381. ! R
  3382. ! ROVCP
  3383. ! XLV
  3384. ! P3D
  3385. ! QV3D
  3386. ! T3D
  3387. ! U3D
  3388. ! V3D
  3389. ! TSK
  3390. ! PSFC
  3391. ! XLAND
  3392. ! ISFFLX
  3393. ! ITIMESTEP
  3394. ! Intent (INOUT), original value is used and changed by SF_GFS.
  3395. ! UST
  3396. ! ZNT
  3397. ZNT_HOLD = ZNT
  3398. UST_HOLD = UST
  3399. ! Strictly INTENT (OUT), set by SF_GFS:
  3400. ! BR
  3401. ! CHS -- used by LSM routines
  3402. ! CHS2 -- used by LSM routines
  3403. ! CPM -- used by LSM routines
  3404. ! CQS2 -- used by LSM routines
  3405. ! FLHC
  3406. ! FLQC
  3407. ! GZ1OZ0
  3408. ! HFX -- used by LSM routines
  3409. ! LH -- used by LSM routines
  3410. ! PSIM
  3411. ! PSIH
  3412. ! QFX -- used by LSM routines
  3413. ! QGH -- used by LSM routines
  3414. ! QSFC -- used by LSM routines
  3415. ! U10
  3416. ! V10
  3417. ! WSPD
  3418. !
  3419. ! Frozen ocean / true land call.
  3420. !
  3421. CALL SF_GFS(U3D,V3D,T3D,QV3D,P3D, &
  3422. CP,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM_SEA, &
  3423. ZNT,UST,PSIM,PSIH, &
  3424. XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC, &
  3425. QGH,QSFC,U10,V10, &
  3426. GZ1OZ0,WSPD,BR,ISFFLX, &
  3427. EP1,EP2,KARMAN,ITIMESTEP, &
  3428. ids,ide, jds,jde, kds,kde, &
  3429. ims,ime, jms,jme, kms,kme, &
  3430. its,ite, jts,jte, kts,kte )
  3431. ! Set up for open-water call
  3432. DO j = JTS , JTE
  3433. DO i = ITS , ITE
  3434. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  3435. ! Sets up things for open ocean fraction of sea-ice points
  3436. XLAND_SEA(i,j)=2.
  3437. ZNT_SEA(I,J) = 0.0001
  3438. IF ( SST(i,j) .LT. 271.4 ) THEN
  3439. SST(i,j) = 271.4
  3440. ENDIF
  3441. TSK_SEA(i,j) = SST(i,j)
  3442. ELSE
  3443. ! Fully open ocean or true land points
  3444. XLAND_SEA(i,j)=xland(i,j)
  3445. ZNT_SEA(I,J) = ZNT_HOLD(I,J)
  3446. UST_SEA(i,j) = UST_HOLD(i,j)
  3447. TSK_SEA(i,j) = TSK(i,j)
  3448. ENDIF
  3449. ENDDO
  3450. ENDDO
  3451. ! Open-water call
  3452. ! _SEA variables are held for later use as the result of the open-water call.
  3453. CALL SF_GFS(U3D,V3D,T3D,QV3D,P3D, &
  3454. CP,ROVCP,R,XLV,PSFC,CHS_SEA,CHS2_SEA,CQS2_SEA,CPM, &
  3455. ZNT_SEA,UST_SEA,PSIM_SEA,PSIH_SEA, &
  3456. XLAND,HFX_SEA,QFX_SEA,LH_SEA,TSK_SEA,FLHC_SEA,FLQC_SEA, &
  3457. QGH_SEA,QSFC_SEA,U10_SEA,V10_SEA, &
  3458. GZ1OZ0_SEA,WSPD_SEA,BR_SEA,ISFFLX, &
  3459. EP1,EP2,KARMAN,ITIMESTEP, &
  3460. ids,ide, jds,jde, kds,kde, &
  3461. ims,ime, jms,jme, kms,kme, &
  3462. its,ite, jts,jte, kts,kte )
  3463. ! Weighting, after our two calls to SF_GFS
  3464. DO j = JTS , JTE
  3465. DO i = ITS , ITE
  3466. ! Over sea-ice points, weight the results. Otherwise, just take the results from the
  3467. ! first call to SF_GFS_
  3468. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  3469. ! Weight a number of fields (between open-water results
  3470. ! and full ice results) by sea-ice fraction.
  3471. BR(i,j) = ( BR(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * BR_SEA(i,j) )
  3472. ! CHS, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3473. ! CHS2, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3474. ! CPM, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3475. ! CQS2, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3476. ! FLHC(i,j) = ( FLHC(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * FLHC_SEA(i,j) )
  3477. ! FLQC(i,j) = ( FLQC(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * FLQC_SEA(i,j) )
  3478. GZ1OZ0(i,j) = ( GZ1OZ0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * GZ1OZ0_SEA(i,j) )
  3479. ! HFX, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3480. ! LH, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3481. PSIM(i,j) = ( PSIM(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PSIM_SEA(i,j) )
  3482. PSIH(i,j) = ( PSIH(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * PSIH_SEA(i,j) )
  3483. ! QFX, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3484. ! QGH, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3485. ! QSFC, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3486. U10(i,j) = ( U10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * U10_SEA(i,j) )
  3487. V10(i,j) = ( V10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * V10_SEA(i,j) )
  3488. WSPD(i,j) = ( WSPD(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * WSPD_SEA(i,j) )
  3489. ! UST, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3490. ! ZNT, used by the LSM routines, is not updated yet. Return results from both calls in separate variables
  3491. ENDIF
  3492. ENDDO
  3493. ENDDO
  3494. END SUBROUTINE sf_gfs_seaice_wrapper
  3495. !-------------------------------------------------------------------------
  3496. !-------------------------------------------------------------------------
  3497. SUBROUTINE sfclay_seaice_wrapper(U3D,V3D,T3D,QV3D,P3D,dz8w, &
  3498. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  3499. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  3500. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, &
  3501. U10,V10,TH2,T2,Q2, &
  3502. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  3503. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  3504. KARMAN,EOMEG,STBOLT, &
  3505. P1000, &
  3506. XICE,SST,TSK_SEA, &
  3507. CHS2_SEA,CHS_SEA,CPM_SEA,CQS2_SEA,FLHC_SEA,FLQC_SEA, &
  3508. HFX_SEA,LH_SEA,QFX_SEA,QGH_SEA,QSFC_SEA,ZNT_SEA, &
  3509. ITIMESTEP,TICE2TSK_IF2COLD,XICE_THRESHOLD, &
  3510. ids,ide, jds,jde, kds,kde, &
  3511. ims,ime, jms,jme, kms,kme, &
  3512. its,ite, jts,jte, kts,kte, &
  3513. ustm,ck,cka,cd,cda,isftcflx,iz0tlnd, &
  3514. sf_surface_physics )
  3515. USE module_sf_sfclay
  3516. implicit none
  3517. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  3518. ims,ime, jms,jme, kms,kme, &
  3519. its,ite, jts,jte, kts,kte
  3520. INTEGER, INTENT(IN ) :: ISFFLX
  3521. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  3522. REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
  3523. REAL, INTENT(IN ) :: P1000
  3524. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  3525. INTENT(IN ) :: dz8w
  3526. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  3527. INTENT(IN ) :: QV3D, &
  3528. P3D, &
  3529. T3D
  3530. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3531. INTENT(IN ) :: MAVAIL, &
  3532. PBLH, &
  3533. XLAND, &
  3534. TSK
  3535. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3536. INTENT(OUT ) :: U10, &
  3537. V10, &
  3538. TH2, &
  3539. T2, &
  3540. Q2, &
  3541. QSFC
  3542. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3543. INTENT(INOUT) :: REGIME, &
  3544. HFX, &
  3545. QFX, &
  3546. LH, &
  3547. MOL,RMOL
  3548. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3549. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  3550. PSIM,PSIH
  3551. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  3552. INTENT(IN ) :: U3D, &
  3553. V3D
  3554. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3555. INTENT(IN ) :: PSFC
  3556. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3557. INTENT(INOUT) :: ZNT, &
  3558. ZOL, &
  3559. UST, &
  3560. CPM, &
  3561. CHS2, &
  3562. CQS2, &
  3563. CHS
  3564. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3565. INTENT(INOUT) :: FLHC,FLQC
  3566. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3567. INTENT(INOUT) :: &
  3568. QGH
  3569. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  3570. REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ) , &
  3571. INTENT(OUT) :: ck,cka,cd,cda,ustm
  3572. INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX,IZ0TLND
  3573. !--------------------------------------------------------------------
  3574. ! New for wrapper
  3575. !--------------------------------------------------------------------
  3576. INTEGER, INTENT(IN) :: ITIMESTEP, sf_surface_physics
  3577. LOGICAL, INTENT(IN) :: TICE2TSK_IF2COLD
  3578. REAL, INTENT(IN) :: XICE_THRESHOLD
  3579. REAL, DIMENSION( ims:ime, jms:jme ), &
  3580. INTENT(IN) :: XICE
  3581. REAL, DIMENSION( ims:ime, jms:jme ), &
  3582. INTENT(INOUT) :: SST
  3583. REAL, DIMENSION( ims:ime, jms:jme ), &
  3584. INTENT(OUT) :: TSK_SEA, &
  3585. CHS2_SEA, &
  3586. CHS_SEA, &
  3587. CPM_SEA, &
  3588. CQS2_SEA, &
  3589. FLHC_SEA, &
  3590. FLQC_SEA, &
  3591. HFX_SEA, &
  3592. LH_SEA, &
  3593. QFX_SEA, &
  3594. QGH_SEA, &
  3595. QSFC_SEA, &
  3596. ZNT_SEA
  3597. !--------------------------------------------------------------------
  3598. ! Local
  3599. !--------------------------------------------------------------------
  3600. INTEGER :: I, J
  3601. REAL, DIMENSION( ims:ime, jms:jme ) :: XLAND_SEA, &
  3602. MAVAIL_sea, &
  3603. TSK_LOCAL, &
  3604. BR_HOLD, &
  3605. CHS2_HOLD, &
  3606. CHS_HOLD, &
  3607. CPM_HOLD, &
  3608. CQS2_HOLD, &
  3609. FLHC_HOLD, &
  3610. FLQC_HOLD, &
  3611. GZ1OZ0_HOLD, &
  3612. HFX_HOLD, &
  3613. LH_HOLD, &
  3614. MOL_HOLD, &
  3615. PSIH_HOLD, &
  3616. PSIM_HOLD, &
  3617. QFX_HOLD, &
  3618. QGH_HOLD, &
  3619. REGIME_HOLD, &
  3620. RMOL_HOLD, &
  3621. UST_HOLD, &
  3622. WSPD_HOLD, &
  3623. ZNT_HOLD, &
  3624. ZOL_HOLD, &
  3625. TH2_HOLD, & !ssib
  3626. T2_HOLD, & !ssib
  3627. Q2_HOLD, & !ssib
  3628. TSK_HOLD, & !ssib
  3629. CD_SEA, &
  3630. CDA_SEA, &
  3631. CK_SEA, &
  3632. CKA_SEA, &
  3633. Q2_SEA, &
  3634. T2_SEA, &
  3635. TH2_SEA, &
  3636. U10_SEA, &
  3637. USTM_SEA, &
  3638. V10_SEA
  3639. REAL, DIMENSION( ims:ime, jms:jme ) :: &
  3640. BR_SEA, &
  3641. GZ1OZ0_SEA, &
  3642. MOL_SEA, &
  3643. PSIH_SEA, &
  3644. PSIM_SEA, &
  3645. REGIME_SEA, &
  3646. RMOL_SEA, &
  3647. UST_SEA, &
  3648. WSPD_SEA, &
  3649. ZOL_SEA
  3650. ! INTENT(IN) to SFCLAY; unchanged by the call
  3651. ! ISFFLX
  3652. ! SVP1,SVP2,SVP3,SVPT0
  3653. ! EP1,EP2,KARMAN,EOMEG,STBOLT
  3654. ! CP,G,ROVCP,R,XLV,DX
  3655. ! ISFTCFLX,IZ0TLND
  3656. ! P1000
  3657. ! dz8w
  3658. ! QV3D
  3659. ! P3D
  3660. ! T3D
  3661. ! MAVAIL
  3662. ! PBLH
  3663. ! XLAND
  3664. ! TSK
  3665. ! U3D
  3666. ! V3D
  3667. ! PSFC
  3668. CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, &
  3669. itimestep, .true., tice2tsk_if2cold, &
  3670. XICE, XICE_THRESHOLD, &
  3671. SST, TSK, TSK_SEA, TSK_LOCAL )
  3672. ! INTENT (INOUT) to SFCLAY: Save the variables before the first call
  3673. ! (for land/frozen water) to SFCLAY, to keep from double-counting the
  3674. ! effects of that routine
  3675. BR_HOLD = BR
  3676. CHS2_HOLD = CHS2
  3677. CHS_HOLD = CHS
  3678. CPM_HOLD = CPM
  3679. CQS2_HOLD = CQS2
  3680. FLHC_HOLD = FLHC
  3681. FLQC_HOLD = FLQC
  3682. GZ1OZ0_HOLD = GZ1OZ0
  3683. HFX_HOLD = HFX
  3684. LH_HOLD = LH
  3685. MOL_HOLD = MOL
  3686. PSIH_HOLD = PSIH
  3687. PSIM_HOLD = PSIM
  3688. QFX_HOLD = QFX
  3689. QGH_HOLD = QGH
  3690. REGIME_HOLD = REGIME
  3691. RMOL_HOLD = RMOL
  3692. UST_HOLD = UST
  3693. WSPD_HOLD = WSPD
  3694. ZNT_HOLD = ZNT
  3695. ZOL_HOLD = ZOL
  3696. !also save these variables for SSIB (fds 12/2010)
  3697. TH2_HOLD = TH2
  3698. T2_HOLD = T2
  3699. Q2_HOLD = Q2
  3700. TSK_HOLD = TSK
  3701. ! INTENT(OUT) from SFCLAY. Input shouldn't matter, but we'll want to
  3702. ! keep things around for weighting after the second call to SFCLAY.
  3703. ! CD
  3704. ! CDA
  3705. ! CK
  3706. ! CKA
  3707. ! Q2
  3708. ! QSFC
  3709. ! T2
  3710. ! TH2
  3711. ! U10
  3712. ! USTM
  3713. ! V10
  3714. ! land/frozen-water call
  3715. call sfclay(U3D,V3D,T3D,QV3D,P3D,dz8w, & ! I
  3716. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, & ! I,I,I,I,I,I,IO,IO,IO,IO,
  3717. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  3718. XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC,QGH,QSFC,RMOL, &
  3719. U10,V10,TH2,T2,Q2, &
  3720. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  3721. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  3722. KARMAN,EOMEG,STBOLT, &
  3723. P1000, &
  3724. ids,ide, jds,jde, kds,kde, &
  3725. ims,ime, jms,jme, kms,kme, &
  3726. its,ite, jts,jte, kts,kte, &
  3727. ustm,ck,cka,cd,cda,isftcflx,iz0tlnd )
  3728. !
  3729. !Restore land-point values calculated by SSiB (fds 12/2010)
  3730. IF (itimestep .gt. 1 .and. sf_surface_physics .EQ. 8) then
  3731. DO j = JTS , JTE
  3732. DO i = ITS, ITE
  3733. IF ( XLAND(I,J) .LT. 1.5 ) THEN
  3734. BR(I,J) = BR_HOLD(I,J)
  3735. TH2(I,J) = TH2_HOLD(I,J)
  3736. T2(I,J) = T2_HOLD(I,J)
  3737. Q2(I,J) = Q2_HOLD(I,J)
  3738. HFX(I,J) = HFX_HOLD(I,J)
  3739. QFX(I,J) = QFX_HOLD(I,J)
  3740. LH(I,J) = LH_HOLD(I,J)
  3741. GZ1OZ0(I,J) = GZ1OZ0_HOLD(I,J)
  3742. WSPD(I,J) = WSPD_HOLD(I,J)
  3743. ZNT(I,J) = ZNT_HOLD(I,J)
  3744. UST(I,J) = UST_HOLD(I,J)
  3745. ! TSK(I,J) = TSK_HOLD(I,J)
  3746. ENDIF
  3747. ENDDO
  3748. ENDDO
  3749. ENDIF
  3750. !
  3751. ! Set up for open-water call
  3752. DO j = JTS , JTE
  3753. DO i = ITS , ITE
  3754. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  3755. XLAND_SEA(i,j)=2.
  3756. MAVAIL_SEA(I,J) =1.
  3757. ZNT_SEA(I,J) = 0.0001
  3758. TSK_SEA(i,j) = SST(i,j)
  3759. IF ( SST(i,j) .LT. 271.4 ) THEN
  3760. SST(i,j) = 271.4
  3761. TSK_SEA(i,j) = SST(i,j)
  3762. ENDIF
  3763. ELSE
  3764. XLAND_SEA(i,j) = XLAND(i,j)
  3765. MAVAIL_SEA(i,j) = MAVAIL(i,j)
  3766. ZNT_SEA(i,j) = ZNT_HOLD(i,j)
  3767. TSK_SEA(i,j) = TSK_LOCAL(i,j)
  3768. ENDIF
  3769. ENDDO
  3770. ENDDO
  3771. ! Restore the values from before the land/frozen-water call
  3772. BR_SEA = BR_HOLD
  3773. CHS2_SEA = CHS2_HOLD
  3774. CHS_SEA = CHS_HOLD
  3775. CPM_SEA = CPM_HOLD
  3776. CQS2_SEA = CQS2_HOLD
  3777. FLHC_SEA = FLHC_HOLD
  3778. FLQC_SEA = FLQC_HOLD
  3779. GZ1OZ0_SEA = GZ1OZ0_HOLD
  3780. HFX_SEA = HFX_HOLD
  3781. LH_SEA = LH_HOLD
  3782. MOL_SEA = MOL_HOLD
  3783. PSIH_SEA = PSIH_HOLD
  3784. PSIM_SEA = PSIM_HOLD
  3785. QFX_SEA = QFX_HOLD
  3786. QGH_SEA = QGH_HOLD
  3787. REGIME_SEA = REGIME_HOLD
  3788. RMOL_SEA = RMOL_HOLD
  3789. UST_SEA = UST_HOLD
  3790. WSPD_SEA = WSPD_HOLD
  3791. ZOL_SEA = ZOL_HOLD
  3792. !
  3793. ! open-water call
  3794. call sfclay(U3D,V3D,T3D,QV3D,P3D,dz8w, & ! I
  3795. CP,G,ROVCP,R,XLV,PSFC, & ! I
  3796. CHS_SEA,CHS2_SEA,CQS2_SEA,CPM_SEA, & ! I/O
  3797. ZNT_SEA,UST_SEA, & ! I/O
  3798. PBLH,MAVAIL_SEA, & ! I
  3799. ZOL_SEA,MOL_SEA,REGIME_SEA,PSIM_SEA,PSIH_SEA, & ! I/O
  3800. XLAND_SEA, & ! I
  3801. HFX_SEA,QFX_SEA,LH_SEA, & ! I/O
  3802. TSK_SEA, & ! I
  3803. FLHC_SEA,FLQC_SEA,QGH_SEA,QSFC_sea,RMOL_SEA, & ! I/O
  3804. U10_sea,V10_sea,TH2_sea,T2_sea,Q2_sea, & ! O
  3805. GZ1OZ0_SEA,WSPD_SEA,BR_SEA, & ! I/O
  3806. ISFFLX,DX, &
  3807. SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
  3808. KARMAN,EOMEG,STBOLT, &
  3809. P1000, &
  3810. ids,ide, jds,jde, kds,kde, &
  3811. ims,ime, jms,jme, kms,kme, &
  3812. its,ite, jts,jte, kts,kte, & ! 0
  3813. ustm_sea,ck_sea,cka_sea,cd_sea,cda_sea,isftcflx,iz0tlnd )
  3814. !
  3815. DO j = JTS , JTE
  3816. DO i = ITS, ITE
  3817. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and.( XICE(i,j) .LE. 1.0 ) ) THEN
  3818. ! weighted average for sea ice points
  3819. br(i,j) = ( br(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * br_sea(i,j) )
  3820. ! CHS2 -- wait
  3821. ! CHS -- wait
  3822. ! CPM -- wait
  3823. ! CQS2 -- wait
  3824. ! FLHC -- wait
  3825. ! FLQC -- wait
  3826. gz1oz0(i,j) = ( gz1oz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * gz1oz0_sea(i,j) )
  3827. ! HFX -- wait
  3828. ! LH -- wait
  3829. mol(i,j) = ( mol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * mol_sea(i,j) )
  3830. psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psih_sea(i,j) )
  3831. psim(i,j) = ( psim(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psim_sea(i,j) )
  3832. ! QFX -- wait
  3833. ! QGH -- wait
  3834. if ( XICE(i,j).GE. 0.5 ) regime(i,j) = regime_hold(i,j)
  3835. rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * rmol_sea(i,j) )
  3836. ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * ust_sea(i,j) )
  3837. wspd(i,j) = ( wspd(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * wspd_sea(i,j) )
  3838. zol(i,j) = ( zol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * zol_sea(i,j) )
  3839. ! INTENT(OUT) --------------------------------------------------------------------
  3840. IF ( PRESENT ( CD ) ) THEN
  3841. CD(i,j) = ( CD(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CD_sea(i,j) )
  3842. ENDIF
  3843. IF ( PRESENT ( CDA ) ) THEN
  3844. CDA(i,j) = ( CDA(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CDA_sea(i,j) )
  3845. ENDIF
  3846. IF ( PRESENT ( CK ) ) THEN
  3847. CK(i,j) = ( CK(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CK_sea(i,j) )
  3848. ENDIF
  3849. IF ( PRESENT ( CKA ) ) THEN
  3850. CKA(i,j) = ( CKA(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * CKA_sea(i,j) )
  3851. ENDIF
  3852. q2(i,j) = ( q2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * q2_sea(i,j) )
  3853. ! QSFC -- wait
  3854. t2(i,j) = ( t2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * t2_sea(i,j) )
  3855. th2(i,j) = ( th2(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * th2_sea(i,j) )
  3856. u10(i,j) = ( u10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * u10_sea(i,j) )
  3857. IF ( PRESENT ( USTM ) ) THEN
  3858. USTM(i,j) = ( USTM(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * USTM_sea(i,j) )
  3859. ENDIF
  3860. v10(i,j) = ( v10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * v10_sea(i,j) )
  3861. ENDIF
  3862. END DO
  3863. END DO
  3864. !
  3865. ! tsk(i,j) = tsk(i,j)*XICE(i,j) + (1.0-XICE(i,j))*TSK_SEA(i,j)
  3866. !
  3867. END SUBROUTINE sfclay_seaice_wrapper
  3868. !-------------------------------------------------------------------------
  3869. !-------------------------------------------------------------------------
  3870. SUBROUTINE pxsfclay_seaice_wrapper(U3D,V3D,T3D,TH3D,QV3D,P3D,dz8w, &
  3871. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  3872. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  3873. XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, &
  3874. U10,V10, &
  3875. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  3876. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, &
  3877. XICE, SST, ITIMESTEP, TICE2TSK_IF2COLD,XICE_THRESHOLD, &
  3878. CHS_SEA, CHS2_SEA, CPM_SEA, CQS2_SEA, FLHC_SEA, FLQC_SEA, &
  3879. HFX_SEA, LH_SEA, QFX_SEA, QGH_SEA, QSFC_SEA, TSK_SEA, &
  3880. ids,ide, jds,jde, kds,kde, &
  3881. ims,ime, jms,jme, kms,kme, &
  3882. its,ite, jts,jte, kts,kte )
  3883. USE module_sf_pxsfclay
  3884. implicit none
  3885. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  3886. ims,ime, jms,jme, kms,kme, &
  3887. its,ite, jts,jte, kts,kte
  3888. INTEGER, INTENT(IN ) :: ISFFLX
  3889. LOGICAL, INTENT(IN ) :: TICE2TSK_IF2COLD
  3890. REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
  3891. REAL, INTENT(IN ) :: EP1,EP2,KARMAN
  3892. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  3893. INTENT(IN ) :: dz8w
  3894. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  3895. INTENT(IN ) :: QV3D, &
  3896. P3D, &
  3897. T3D, &
  3898. TH3D
  3899. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3900. INTENT(IN ) :: MAVAIL, &
  3901. PBLH, &
  3902. XLAND, &
  3903. TSK
  3904. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
  3905. INTENT(IN ) :: U3D, &
  3906. V3D
  3907. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3908. INTENT(IN ) :: PSFC
  3909. REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
  3910. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3911. INTENT(OUT ) :: U10, &
  3912. V10, &
  3913. QSFC
  3914. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3915. INTENT(INOUT) :: REGIME, &
  3916. HFX, &
  3917. QFX, &
  3918. LH, &
  3919. MOL,RMOL
  3920. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3921. INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
  3922. PSIM,PSIH
  3923. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3924. INTENT(INOUT) :: ZNT, &
  3925. ZOL, &
  3926. UST, &
  3927. CPM, &
  3928. CHS2, &
  3929. CQS2, &
  3930. CHS
  3931. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3932. INTENT(INOUT) :: FLHC,FLQC
  3933. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3934. INTENT(INOUT) :: QGH
  3935. !--------------------------------------------------------------------
  3936. ! For wrapper
  3937. !--------------------------------------------------------------------
  3938. INTEGER, INTENT(IN) :: ITIMESTEP
  3939. REAL, INTENT(IN) :: XICE_THRESHOLD
  3940. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3941. INTENT(IN) :: XICE
  3942. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3943. INTENT(OUT) :: TSK_SEA
  3944. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3945. INTENT(INOUT) :: SST
  3946. !--------------------------------------------------------------------
  3947. ! Local
  3948. !--------------------------------------------------------------------
  3949. INTEGER :: I, J
  3950. REAL, DIMENSION( ims:ime, jms:jme ) , &
  3951. INTENT(OUT) :: CHS_SEA, &
  3952. CHS2_SEA, &
  3953. CPM_SEA, &
  3954. CQS2_SEA, &
  3955. FLHC_SEA, &
  3956. FLQC_SEA, &
  3957. HFX_SEA, &
  3958. LH_SEA, &
  3959. QFX_SEA, &
  3960. QGH_SEA, &
  3961. QSFC_SEA
  3962. REAL, DIMENSION( ims:ime, jms:jme ) :: BR_HOLD, &
  3963. CHS_HOLD, &
  3964. CHS2_HOLD, &
  3965. CPM_HOLD, &
  3966. CQS2_HOLD, &
  3967. FLHC_HOLD, &
  3968. FLQC_HOLD, &
  3969. GZ1OZ0_HOLD, &
  3970. HFX_HOLD, &
  3971. LH_HOLD, &
  3972. MOL_HOLD, &
  3973. PSIH_HOLD, &
  3974. PSIM_HOLD, &
  3975. QFX_HOLD, &
  3976. QGH_HOLD, &
  3977. REGIME_HOLD, &
  3978. RMOL_HOLD, &
  3979. UST_HOLD, &
  3980. WSPD_HOLD, &
  3981. ZNT_HOLD, &
  3982. ZOL_HOLD, &
  3983. TSK_LOCAL
  3984. REAL, DIMENSION( ims:ime, jms:jme ) :: XLAND_SEA, &
  3985. MAVAIL_SEA, &
  3986. BR_SEA, &
  3987. GZ1OZ0_SEA, &
  3988. MOL_SEA, &
  3989. PSIH_SEA, &
  3990. PSIM_SEA, &
  3991. REGIME_SEA, &
  3992. RMOL_SEA, &
  3993. UST_SEA, &
  3994. WSPD_SEA, &
  3995. ZNT_SEA, &
  3996. ZOL_SEA, &
  3997. U10_SEA, &
  3998. V10_SEA
  3999. CALL get_local_ice_tsk( ims, ime, jms, jme, its, ite, jts, jte, &
  4000. itimestep, .true., tice2tsk_if2cold, &
  4001. XICE, XICE_THRESHOLD, &
  4002. SST, TSK, TSK_SEA, TSK_LOCAL )
  4003. !
  4004. ! INTENT (INOUT) to PXSFCLAY: Save the variables before the first call
  4005. ! (for land/frozen water) to SFCLAY, to keep from double-counting the
  4006. ! effects of that routine
  4007. !
  4008. BR_HOLD = BR
  4009. CHS_HOLD = CHS
  4010. CHS2_HOLD = CHS2
  4011. CPM_HOLD = CPM
  4012. CQS2_HOLD = CQS2
  4013. FLHC_HOLD = FLHC
  4014. FLQC_HOLD = FLQC
  4015. GZ1OZ0_HOLD = GZ1OZ0
  4016. HFX_HOLD = HFX
  4017. LH_HOLD = LH
  4018. MOL_HOLD = MOL
  4019. PSIH_HOLD = PSIH
  4020. PSIM_HOLD = PSIM
  4021. QFX_HOLD = QFX
  4022. QGH_HOLD = QGH
  4023. REGIME_HOLD = REGIME
  4024. RMOL_HOLD = RMOL
  4025. UST_HOLD = UST
  4026. WSPD_HOLD = WSPD
  4027. ZNT_HOLD = ZNT
  4028. ZOL_HOLD = ZOL
  4029. ! INTENT(OUT) from PXSFCLAY. Input shouldn't matter, but we'll want to
  4030. ! keep things around for weighting after the second call to PXSFCLAY.
  4031. ! U10
  4032. ! V10
  4033. ! QSFC
  4034. ! Land/frozen-water call.
  4035. CALL pxsfclay(U3D,V3D,T3D,TH3D,QV3D,P3D,dz8w, &
  4036. CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
  4037. ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
  4038. XLAND,HFX,QFX,LH,TSK_LOCAL,FLHC,FLQC,QGH,QSFC,RMOL, &
  4039. U10,V10, &
  4040. GZ1OZ0,WSPD,BR,ISFFLX,DX, &
  4041. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, &
  4042. ids,ide, jds,jde, kds,kde, &
  4043. ims,ime, jms,jme, kms,kme, &
  4044. its,ite, jts,jte, kts,kte )
  4045. DO j = JTS , JTE
  4046. DO i= ITS , ITE
  4047. IF( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  4048. ! Sets up things for open ocean.
  4049. XLAND_SEA(i,j)=2.
  4050. MAVAIL_SEA(I,J) =1.
  4051. ZNT_SEA(I,J) = 0.0001
  4052. TSK_SEA(i,j) = SST(i,j)
  4053. if ( SST(i,j) .LT. 271.4 ) then
  4054. SST(i,j) = 271.4
  4055. TSK_SEA(i,j) = SST(i,j)
  4056. endif
  4057. ELSE
  4058. XLAND_SEA(i,j)=xland(i,j)
  4059. MAVAIL_SEA(i,j) = mavail(i,j)
  4060. ZNT_SEA(I,J) = ZNT_HOLD(I,J)
  4061. TSK_SEA(i,j) = TSK(i,j)
  4062. ENDIF
  4063. ENDDO
  4064. ENDDO
  4065. ! INTENT(INOUT) variables held over from before the first call to PXSFCLAY:
  4066. BR_SEA = BR_HOLD
  4067. CHS_SEA = CHS_HOLD
  4068. CHS2_SEA = CHS2_HOLD
  4069. CPM_SEA = CPM_HOLD
  4070. CQS2_SEA = CQS2_HOLD
  4071. FLHC_SEA = FLHC_HOLD
  4072. FLQC_SEA = FLQC_HOLD
  4073. GZ1OZ0_SEA = GZ1OZ0_HOLD
  4074. HFX_SEA = HFX_HOLD
  4075. LH_SEA = LH_HOLD
  4076. MOL_SEA = MOL_HOLD
  4077. PSIH_SEA = PSIH_HOLD
  4078. PSIM_SEA = PSIM_HOLD
  4079. QFX_SEA = QFX_HOLD
  4080. QGH_SEA = QGH_HOLD
  4081. REGIME_SEA = REGIME_HOLD
  4082. RMOL_SEA = RMOL_HOLD
  4083. UST_SEA = UST_HOLD
  4084. WSPD_SEA = WSPD_HOLD
  4085. ZOL_SEA = ZOL_HOLD
  4086. ! Open-water call.
  4087. ! Variables newly set (INTENT(OUT)) or changed (INTENT(INOUT)) by
  4088. ! PXSFCLAY are here appended with the "_SEA" label.
  4089. ! Special intent(IN) variables here: XLAND_SEA, MAVAIL_SEA, TSK_SEA
  4090. CALL pxsfclay(U3D,V3D,T3D,TH3D,QV3D,P3D,dz8w, &
  4091. CP,G,ROVCP,R,XLV,PSFC,CHS_SEA,CHS2_SEA,CQS2_SEA,CPM_SEA, &
  4092. ZNT_SEA,UST_SEA,PBLH,MAVAIL_SEA,ZOL_SEA,MOL_SEA,REGIME_SEA,PSIM_SEA,PSIH_SEA, &
  4093. XLAND_SEA,HFX_SEA,QFX_SEA,LH_SEA,TSK_SEA,FLHC_SEA,FLQC_SEA,QGH_SEA,QSFC_SEA,RMOL_SEA, &
  4094. U10_SEA,V10_SEA, &
  4095. GZ1OZ0_SEA,WSPD_SEA,BR_SEA,ISFFLX,DX, &
  4096. SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN, &
  4097. ids,ide, jds,jde, kds,kde, &
  4098. ims,ime, jms,jme, kms,kme, &
  4099. its,ite, jts,jte, kts,kte )
  4100. DO j = JTS , JTE
  4101. DO i = ITS , ITE
  4102. IF ( ( XICE(I,J) .GE. XICE_THRESHOLD ) .and. ( XICE(i,j) .LE. 1.0 ) ) THEN
  4103. ! INTENT (INOUT) for PXSFCLAY:
  4104. br(i,j) = ( br(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * br_sea(i,j) )
  4105. gz1oz0(i,j) = ( gz1oz0(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * gz1oz0_sea(i,j) )
  4106. mol(i,j) = ( mol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * mol_sea(i,j) )
  4107. psih(i,j) = ( psih(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psih_sea(i,j) )
  4108. psim(i,j) = ( psim(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * psim_sea(i,j) )
  4109. rmol(i,j) = ( rmol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * rmol_sea(i,j) )
  4110. ust(i,j) = ( ust(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * ust_sea(i,j) )
  4111. wspd(i,j) = ( wspd(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * wspd_sea(i,j) )
  4112. zol(i,j) = ( zol(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * zol_sea(i,j) )
  4113. ! REGIME: Special case for this variable. Just take the land values.
  4114. ! CHS -- wait
  4115. ! CHS2 -- wait
  4116. ! CPM -- wait
  4117. ! CQS2 -- wait
  4118. ! FLHC -- wait
  4119. ! FLQC -- wait
  4120. ! HFX -- wait
  4121. ! LH -- wait
  4122. ! QFX -- wait
  4123. ! QGH -- wait
  4124. ! INTENT (OUT) from PXSFCLAY:
  4125. u10(i,j) = ( u10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * u10_sea(i,j) )
  4126. v10(i,j) = ( v10(i,j) * XICE(i,j) ) + ( (1.0-XICE(i,j)) * v10_sea(i,j) )
  4127. ! QSFC -- wait
  4128. ENDIF
  4129. ENDDO
  4130. ENDDO
  4131. END SUBROUTINE pxsfclay_seaice_wrapper
  4132. !-------------------------------------------------------------------------
  4133. SUBROUTINE TOPO_RAD_ADJ_DRVR (XLAT,XLONG,COSZEN, &
  4134. shadowmask, &
  4135. declin, &
  4136. SWDOWN,GSW,SWNORM,GSWSAVE,solcon,hrang2d, &
  4137. slope_in,slp_azi_in, &
  4138. ids, ide, jds, jde, kds, kde, &
  4139. ims, ime, jms, jme, kms, kme, &
  4140. its, ite, jts, jte, kts, kte )
  4141. !------------------------------------------------------------------
  4142. IMPLICIT NONE
  4143. !------------------------------------------------------------------
  4144. INTEGER, INTENT(IN) :: its,ite,jts,jte,kts,kte, &
  4145. ims,ime,jms,jme,kms,kme, &
  4146. ids,ide,jds,jde,kds,kde
  4147. INTEGER, DIMENSION( ims:ime, jms:jme ), &
  4148. INTENT(IN) :: shadowmask
  4149. REAL, DIMENSION( ims:ime, jms:jme ), &
  4150. INTENT(IN ) :: XLAT,XLONG
  4151. REAL, DIMENSION( ims:ime, jms:jme ), &
  4152. INTENT(INOUT) :: SWDOWN,GSW,SWNORM,GSWSAVE
  4153. real,intent(in) :: solcon
  4154. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: hrang2d,coszen
  4155. REAL, INTENT(IN ) :: declin
  4156. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: slope_in,slp_azi_in
  4157. ! LOCAL VARS
  4158. integer :: i,j
  4159. real :: pi,degrad
  4160. integer :: shadow
  4161. real :: swdown_teradj,swdown_in,xlat1,xlong1
  4162. !------------------------------------------------------------------
  4163. pi = 4.*atan(1.)
  4164. degrad=pi/180.
  4165. DO J=jts,jte
  4166. DO I=its,ite
  4167. SWNORM(i,j) = SWDOWN(i,j) ! save
  4168. IF(SWDOWN(I,J) .GT. 1.E-3)THEN ! daytime
  4169. shadow = shadowmask(i,j)
  4170. SWDOWN_IN = SWDOWN(i,j)
  4171. XLAT1 = XLAT(i,j)
  4172. XLONG1 = XLONG(i,j)
  4173. CALL TOPO_RAD_ADJ (XLAT1,XLONG1,COSZEN(i,j), &
  4174. DECLIN,DEGRAD, &
  4175. SWDOWN_IN,solcon,hrang2d(i,j),SWDOWN_teradj, &
  4176. kts,kte, &
  4177. slope_in(i,j),slp_azi_in(i,j), &
  4178. shadow , i,j &
  4179. )
  4180. GSWSAVE(I,J) = GSW(I,J) ! save
  4181. GSW(I,J) = GSW(I,J)*SWDOWN_teradj/SWDOWN(i,j)
  4182. SWDOWN(i,j) = SWDOWN_teradj
  4183. ENDIF ! daytime
  4184. ENDDO ! i_loop
  4185. ENDDO ! j_loop
  4186. END SUBROUTINE TOPO_RAD_ADJ_DRVR
  4187. !------------------------------------------------------------------
  4188. !------------------------------------------------------------------
  4189. SUBROUTINE TOPO_RAD_ADJ (XLAT1,XLONG1,COSZEN, &
  4190. DECLIN,DEGRAD, &
  4191. SWDOWN_IN,solcon,hrang,SWDOWN_teradj, &
  4192. kts,kte, &
  4193. slope,slp_azi, &
  4194. shadow &
  4195. ,i,j)
  4196. !------------------------------------------------------------------
  4197. IMPLICIT NONE
  4198. !------------------------------------------------------------------
  4199. INTEGER, INTENT(IN) :: kts,kte
  4200. REAL, INTENT(IN) :: COSZEN,DECLIN, &
  4201. XLAT1,XLONG1,DEGRAD
  4202. REAL, INTENT(IN) :: SWDOWN_IN,solcon,hrang
  4203. INTEGER, INTENT(IN) :: shadow
  4204. REAL, INTENT(IN) :: slp_azi,slope
  4205. REAL, INTENT(OUT) :: SWDOWN_teradj
  4206. ! LOCAL VARS
  4207. REAL :: XT24,TLOCTM,CSZA,XXLAT
  4208. REAL :: diffuse_frac,corr_fac,csza_slp
  4209. integer :: i,j
  4210. !------------------------------------------------------------------
  4211. SWDOWN_teradj=SWDOWN_IN
  4212. CSZA=COSZEN
  4213. XXLAT=XLAT1*DEGRAD
  4214. ! RETURN IF NIGHT
  4215. IF(CSZA.LE.1.E-9) return
  4216. ! Parameterize diffuse fraction of global solar radiation as a function of the ratio between TOA radiation and surface global radiation
  4217. diffuse_frac = min(1.,1./(max(0.1,2.1-2.8*log(log(csza*solcon/max(SWDOWN_IN,1.e-3))))))
  4218. if ((slope.eq.0).or.(diffuse_frac.eq.1).or.(csza.lt.1.e-2)) then ! no topographic effects when all radiation diffuse or sun too close to horizon
  4219. corr_fac = 1
  4220. goto 140
  4221. endif
  4222. ! cosine of zenith angle over sloping topography
  4223. csza_slp = ((SIN(XXLAT)*COS(HRANG))* &
  4224. (-cos(slp_azi)*sin(slope))-SIN(HRANG)*(sin(slp_azi)*sin(slope))+ &
  4225. (COS(XXLAT)*COS(HRANG))*cos(slope))* &
  4226. COS(DECLIN)+(COS(XXLAT)*(cos(slp_azi)*sin(slope))+ &
  4227. SIN(XXLAT)*cos(slope))*SIN(DECLIN)
  4228. IF(csza_slp.LE.1.E-4) csza_slp = 0
  4229. ! Topographic shading
  4230. if (shadow.eq.1) csza_slp = 0
  4231. ! Correction factor for sloping topography; the diffuse fraction of solar radiation is assumed to be unaffected by the slope
  4232. corr_fac = diffuse_frac + (1-diffuse_frac)*csza_slp/csza
  4233. 140 continue
  4234. SWDOWN_teradj=(1.)*SWDOWN_IN*corr_fac
  4235. END SUBROUTINE TOPO_RAD_ADJ
  4236. !=======================================================================
  4237. SUBROUTINE get_local_ice_tsk ( ims, ime, jms, jme, &
  4238. its, ite, jts, jte, &
  4239. itimestep, &
  4240. sfc_layer_values, &
  4241. tice2tsk_if2cold, &
  4242. XICE, XICE_THRESHOLD, &
  4243. SST, TSK, TSK_SEA, TSK_ICE )
  4244. !<DESCRIPTION>
  4245. !
  4246. ! For grid cells with a fractional ice area, derive the ice surface
  4247. ! temperature from the area-averaged surface temperature (the blended
  4248. ! result of the open-water values (SST) and the ice-covered value).
  4249. !
  4250. !</DESCRIPTION>
  4251. IMPLICIT NONE
  4252. INTEGER, INTENT(IN) :: ims, ime, jms, jme !-- start/end index for i/j in memory
  4253. INTEGER, INTENT(IN) :: its, ite, jts, jte !-- start/end index for i/j in tile
  4254. INTEGER, INTENT(IN) :: itimestep !-- timestep
  4255. LOGICAL, INTENT(IN) :: sfc_layer_values !-- True if there are surface layer routine values
  4256. !-- available from the ice portion of the grid point
  4257. !-- (i.e. called from a seaice_wrapper subroutine)
  4258. LOGICAL, INTENT(IN) :: tice2tsk_if2cold !-- True to set TSK_ICE to TSK. This may be
  4259. !-- necessary to avoid unphysically low ice
  4260. !-- temperatures is there is a mis-match between
  4261. !-- ice fraction and surface temperature.
  4262. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: XICE ! Ice fraction
  4263. REAL , INTENT(IN) :: XICE_THRESHOLD
  4264. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(IN) :: TSK ! Surface temperature (K)
  4265. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(INOUT) :: SST ! Sea surface temperature (K)
  4266. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: TSK_SEA ! Sfc temp of open water portion of grid cell
  4267. REAL, DIMENSION( ims:ime , jms:jme ), INTENT(OUT) :: TSK_ICE ! Sfc temp of ice oprtion of grid cell
  4268. ! Local
  4269. INTEGER :: i,j
  4270. DO j = JTS , JTE
  4271. DO i = ITS , ITE
  4272. IF ( ( XICE(i,j) >= XICE_THRESHOLD ) .AND. ( XICE(I,J) <= 1.0 ) ) THEN
  4273. IF ( SST(i,j) < 271.4 ) THEN
  4274. SST(i,j) = 271.4
  4275. ENDIF
  4276. IF (sfc_layer_values) THEN
  4277. IF ( SST(i,j) > 273. .AND. itimestep <= 3) then
  4278. ! Why the dependence on the time step count, here?
  4279. IF ( XICE(i,j) >= 0.6 ) THEN
  4280. SST(i,j) = 271.4
  4281. ELSEIF ( XICE(i,j) >= 0.4 ) THEN
  4282. SST(i,j) = 273.
  4283. ELSEIF (XICE(i,j) >= 0.2 .AND. SST(i,j) > 275.) THEN
  4284. SST(i,j) = 275.
  4285. ELSEIF (SST(i,j) > 278.) THEN
  4286. SST(i,j) = 278.
  4287. ENDIF
  4288. ENDIF
  4289. ENDIF
  4290. TSK_SEA(i,j) = SST(i,j)
  4291. IF ( tice2tsk_if2cold ) THEN
  4292. !------------------------------------------------------------------------------------
  4293. ! This avoids unphysically low ice temperatures for grid cells with low ice fractions
  4294. ! and low area-averaged temperatures. This can happen when the initial ice fraction
  4295. ! and surface temperature come from different data sets.
  4296. !------------------------------------------------------------------------------------
  4297. TSK_ICE(i,j) = MIN( TSK(i,j), 273.15 )
  4298. ELSE
  4299. TSK_ICE(i,j) = ( TSK(i,j) - (1.0-XICE(i,j)) * SST(i,j) ) / XICE(i,j)
  4300. ENDIF
  4301. IF ( ( XICE(i,j) < 0.2 ) .AND. ( TSK(i,j) < 253.15 ) ) THEN
  4302. TSK_ICE(i,j) = 253.15
  4303. ENDIF
  4304. IF ( ( XICE(i,j) < 0.1 ) .AND. ( TSK(i,j) < 263.15 ) ) THEN
  4305. TSK_ICE(i,j) = 263.15
  4306. ENDIF
  4307. ELSE
  4308. ! land/open-water point
  4309. TSK_SEA(i,j) = TSK(i,j)
  4310. TSK_ICE(i,j) = TSK(i,j)
  4311. ENDIF
  4312. ENDDO
  4313. ENDDO
  4314. END SUBROUTINE get_local_ice_tsk
  4315. !=======================================================================
  4316. !=======================================================================
  4317. END MODULE module_surface_driver