PageRenderTime 90ms CodeModel.GetById 28ms RepoModel.GetById 1ms app.codeStats 0ms

/wrfv2_fire/phys/module_sf_oml.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 312 lines | 166 code | 41 blank | 105 comment | 6 complexity | 73b7b3f68bb3e5b9a7564fc4b85b15d7 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_sf_oml
  4. CONTAINS
  5. !----------------------------------------------------------------
  6. SUBROUTINE OCEANML(tml,t0ml,hml,h0ml,huml,hvml,ust,u_phy,v_phy, &
  7. tmoml,f,g,oml_gamma, &
  8. XLAND,HFX,LH,TSK,GSW,GLW,EMISS, &
  9. DELTSM,STBOLT, &
  10. ids,ide, jds,jde, kds,kde, &
  11. ims,ime, jms,jme, kms,kme, &
  12. its,ite, jts,jte, kts,kte )
  13. !----------------------------------------------------------------
  14. IMPLICIT NONE
  15. !----------------------------------------------------------------
  16. !
  17. ! SUBROUTINE OCEANML CALCULATES THE SEA SURFACE TEMPERATURE (TSK)
  18. ! FROM A SIMPLE OCEAN MIXED LAYER MODEL BASED ON
  19. ! (Pollard, Rhines and Thompson (1973).
  20. !
  21. !-- TML ocean mixed layer temperature (K)
  22. !-- T0ML ocean mixed layer temperature (K) at initial time
  23. !-- TMOML top 200 m ocean mean temperature (K) at initial time
  24. !-- HML ocean mixed layer depth (m)
  25. !-- H0ML ocean mixed layer depth (m) at initial time
  26. !-- HUML ocean mixed layer u component of wind
  27. !-- HVML ocean mixed layer v component of wind
  28. !-- OML_GAMMA deep water lapse rate (K m-1)
  29. !-- UAIR,VAIR lowest model level wind component
  30. !-- UST frictional velocity
  31. !-- HFX upward heat flux at the surface (W/m^2)
  32. !-- LH latent heat flux at the surface (W/m^2)
  33. !-- TSK surface temperature (K)
  34. !-- GSW downward short wave flux at ground surface (W/m^2)
  35. !-- GLW downward long wave flux at ground surface (W/m^2)
  36. !-- EMISS emissivity of the surface
  37. !-- XLAND land mask (1 for land, 2 for water)
  38. !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
  39. !-- F Coriolis parameter
  40. !-- DT time step (second)
  41. !-- G acceleration due to gravity
  42. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  43. ims,ime, jms,jme, kms,kme, &
  44. its,ite, jts,jte, kts,kte
  45. REAL, INTENT(IN ) :: DELTSM, STBOLT
  46. REAL, DIMENSION( ims:ime, jms:jme ) , &
  47. INTENT(IN ) :: EMISS, &
  48. XLAND, &
  49. GSW, &
  50. GLW, &
  51. HFX, &
  52. LH
  53. REAL, DIMENSION( ims:ime, jms:jme ) , &
  54. INTENT(INOUT) :: TSK
  55. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(INOUT) :: &
  56. TML,T0ML,HML,H0ML,HUML,HVML
  57. REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), INTENT(IN ) :: &
  58. U_PHY,V_PHY
  59. REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: &
  60. UST, F, TMOML
  61. REAL, INTENT(IN ) :: G
  62. REAL, INTENT(IN ) :: OML_GAMMA
  63. ! LOCAL VARS
  64. INTEGER :: I,J
  65. DO J=jts,jte
  66. DO i=its,ite
  67. IF (XLAND(I,J).GT.1.5) THEN
  68. CALL OML1D(I,J,TML(i,j),T0ML(i,j),HML(i,j),H0ML(i,j), &
  69. HUML(i,j),HVML(i,j),TSK(i,j),HFX(i,j), &
  70. LH(i,j),GSW(i,j),GLW(i,j),TMOML(i,j), &
  71. U_PHY(i,kts,j),V_PHY(i,kts,j),UST(i,j),F(i,j), &
  72. EMISS(i,j),STBOLT,G,DELTSM,OML_GAMMA, &
  73. ids,ide, jds,jde, kds,kde, &
  74. ims,ime, jms,jme, kms,kme, &
  75. its,ite, jts,jte, kts,kte )
  76. ENDIF
  77. ENDDO
  78. ENDDO
  79. END SUBROUTINE OCEANML
  80. !----------------------------------------------------------------
  81. SUBROUTINE OML1D(I,J,TML,T0ML,H,H0,HUML, &
  82. HVML,TSK,HFX, &
  83. LH,GSW,GLW,TMOML, &
  84. UAIR,VAIR,UST,F,EMISS,STBOLT,G,DT,OML_GAMMA, &
  85. ids,ide, jds,jde, kds,kde, &
  86. ims,ime, jms,jme, kms,kme, &
  87. its,ite, jts,jte, kts,kte )
  88. !----------------------------------------------------------------
  89. IMPLICIT NONE
  90. !----------------------------------------------------------------
  91. !
  92. ! SUBROUTINE OCEANML CALCULATES THE SEA SURFACE TEMPERATURE (TSK)
  93. ! FROM A SIMPLE OCEAN MIXED LAYER MODEL BASED ON
  94. ! (Pollard, Rhines and Thompson (1973).
  95. !
  96. !-- TML ocean mixed layer temperature (K)
  97. !-- T0ML ocean mixed layer temperature (K) at initial time
  98. !-- TMOML top 200 m ocean mean temperature (K) at initial time
  99. !-- H ocean mixed layer depth (m)
  100. !-- H0 ocean mixed layer depth (m) at initial time
  101. !-- HUML ocean mixed layer u component of wind
  102. !-- HVML ocean mixed layer v component of wind
  103. !-- OML_GAMMA deep water lapse rate (K m-1)
  104. !-- OMLCALL whether to call oml model
  105. !-- UAIR,VAIR lowest model level wind component
  106. !-- UST frictional velocity
  107. !-- HFX upward heat flux at the surface (W/m^2)
  108. !-- LH latent heat flux at the surface (W/m^2)
  109. !-- TSK surface temperature (K)
  110. !-- GSW downward short wave flux at ground surface (W/m^2)
  111. !-- GLW downward long wave flux at ground surface (W/m^2)
  112. !-- EMISS emissivity of the surface
  113. !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
  114. !-- F Coriolis parameter
  115. !-- DT time step (second)
  116. !-- G acceleration due to gravity
  117. !
  118. !----------------------------------------------------------------
  119. INTEGER, INTENT(IN ) :: I, J
  120. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  121. ims,ime, jms,jme, kms,kme, &
  122. its,ite, jts,jte, kts,kte
  123. REAL, INTENT(INOUT) :: TML, H, H0, HUML, HVML, TSK
  124. REAL, INTENT(IN ) :: T0ML, HFX, LH, GSW, GLW, &
  125. UAIR, VAIR, UST, F, EMISS, TMOML
  126. REAL, INTENT(IN) :: STBOLT, G, DT, OML_GAMMA
  127. ! Local
  128. REAL :: rhoair, rhowater, Gam, alp, BV2, A1, A2, B2, u, v, wspd, &
  129. hu1, hv1, hu2, hv2, taux, tauy, tauxair, tauyair, q, hold, &
  130. hsqrd, thp, cwater, ust2
  131. CHARACTER(LEN=120) :: time_series
  132. hu1=huml
  133. hv1=hvml
  134. rhoair=1.
  135. rhowater=1000.
  136. cwater=4200.
  137. ! Deep ocean lapse rate (K/m) - from Rich
  138. Gam=oml_gamma
  139. ! if(i.eq.1 .and. j.eq.1 .or. i.eq.105.and.j.eq.105) print *, 'gamma = ', gam
  140. ! Gam=0.14
  141. ! Gam=5.6/40.
  142. ! Gam=5./100.
  143. ! Thermal expansion coeff (/K)
  144. ! alp=.0002
  145. ! temp dependence (/K)
  146. alp=max((tml-273.15)*1.e-5, 1.e-6)
  147. BV2=alp*g*Gam
  148. thp=t0ml-Gam*(h-h0)
  149. A1=(tml-thp)*h - 0.5*Gam*h*h
  150. if(h.ne.0.)then
  151. u=hu1/h
  152. v=hv1/h
  153. else
  154. u=0.
  155. v=0.
  156. endif
  157. ! time step
  158. q=(-hfx-lh+gsw+glw-stbolt*emiss*tml*tml*tml*tml)/(rhowater*cwater)
  159. ! wspd=max(sqrt(uair*uair+vair*vair),0.1)
  160. wspd=sqrt(uair*uair+vair*vair)
  161. if (wspd .lt. 1.e-10 ) then
  162. ! print *, 'i,j,wspd are ', i,j,wspd
  163. wspd = 1.e-10
  164. endif
  165. ! limit ust to 1.6 to give a value of ust for water of 0.05
  166. ! ust2=min(ust, 1.6)
  167. ! new limit for ust: reduce atmospheric ust by half for ocean
  168. ust2=0.5*ust
  169. tauxair=ust2*ust2*uair/wspd
  170. taux=rhoair/rhowater*tauxair
  171. tauyair=ust2*ust2*vair/wspd
  172. tauy=rhoair/rhowater*tauyair
  173. ! note: forward-backward coriolis force for effective time-centering
  174. hu2=hu1+dt*( f*hv1 + taux)
  175. hv2=hv1+dt*(-f*hu2 + tauy)
  176. ! consider the flux effect
  177. A2=A1+q*dt
  178. huml=hu2
  179. hvml=hv2
  180. hold=h
  181. B2=hu2*hu2+hv2*hv2
  182. hsqrd=-A2/Gam + sqrt(A2*A2/(Gam*Gam) + 2.*B2/BV2)
  183. h=sqrt(max(hsqrd,0.0))
  184. ! limit to positive h change
  185. if(h.lt.hold)h=hold
  186. ! no change unless tml is warmer than layer mean temp tmol or tsk-5 (see omlinit)
  187. if(tml.ge.tmoml .and. h.ne.0.)then
  188. ! no change unless tml is warmer than layer mean temp tmoml or tsk-5 (see omlinit)
  189. if(tml.ge.tmoml)then
  190. tml=max(t0ml - Gam*(h-h0) + 0.5*Gam*h + A2/h, tmoml)
  191. else
  192. tml=tmoml
  193. endif
  194. u=hu2/h
  195. v=hv2/h
  196. else
  197. tml=t0ml
  198. u=0.
  199. v=0.
  200. endif
  201. tsk=tml
  202. ! if(h.gt.100.)print *,i,j,h,tml,' h,tml'
  203. ! ww: output point data
  204. ! if( (i.eq.190 .and. j.eq.115) .or. (i.eq.170 .and. j.eq.125) ) then
  205. ! write(jtime,fmt='("TS ",f10.0)') float(itimestep)
  206. ! CALL wrf_message ( TRIM(jtime) )
  207. ! write(time_series,fmt='("OML",2I4,2F9.5,2F8.2,2E15.5,F8.3)') &
  208. ! i,j,u,v,tml,h,taux,tauy,a2
  209. ! CALL wrf_message ( TRIM(time_series) )
  210. ! end if
  211. END SUBROUTINE OML1D
  212. !================================================================
  213. SUBROUTINE omlinit(oml_hml0, tsk, &
  214. tml,t0ml,hml,h0ml,huml,hvml,tmoml, &
  215. allowed_to_read, start_of_simulation, &
  216. ids,ide, jds,jde, kds,kde, &
  217. ims,ime, jms,jme, kms,kme, &
  218. its,ite, jts,jte, kts,kte )
  219. !----------------------------------------------------------------
  220. IMPLICIT NONE
  221. !----------------------------------------------------------------
  222. LOGICAL , INTENT(IN) :: allowed_to_read
  223. LOGICAL , INTENT(IN) :: start_of_simulation
  224. INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
  225. ims,ime, jms,jme, kms,kme, &
  226. its,ite, jts,jte, kts,kte
  227. REAL, DIMENSION( ims:ime, jms:jme ) , &
  228. INTENT(IN) :: TSK
  229. REAL, DIMENSION( ims:ime, jms:jme ) , &
  230. INTENT(INOUT) :: TML, T0ML, HML, H0ML, HUML, HVML, TMOML
  231. REAL , INTENT(IN ) :: oml_hml0
  232. ! LOCAR VAR
  233. INTEGER :: L,J,I,itf,jtf
  234. CHARACTER*1024 message
  235. !----------------------------------------------------------------
  236. itf=min0(ite,ide-1)
  237. jtf=min0(jte,jde-1)
  238. IF(start_of_simulation) THEN
  239. DO J=jts,jtf
  240. DO I=its,itf
  241. TML(I,J)=TSK(I,J)
  242. T0ML(I,J)=TSK(I,J)
  243. ENDDO
  244. ENDDO
  245. IF (oml_hml0 .gt. 0.) THEN
  246. WRITE(message,*)'Initializing OML with HML0 = ', oml_hml0
  247. CALL wrf_debug (0, TRIM(message))
  248. DO J=jts,jtf
  249. DO I=its,itf
  250. HML(I,J)=oml_hml0
  251. H0ML(I,J)=HML(I,J)
  252. HUML(I,J)=0.
  253. HVML(I,J)=0.
  254. TMOML(I,J)=TSK(I,J)-5.
  255. ENDDO
  256. ENDDO
  257. ELSE
  258. WRITE(message,*)'Initializing OML with real HML0, h(1,1) = ', h0ml(1,1)
  259. CALL wrf_debug (0, TRIM(message))
  260. DO J=jts,jtf
  261. DO I=its,itf
  262. HML(I,J)=H0ML(I,J)
  263. ! fill in near coast area with SST: 200 K was set as missing value in ocean pre-processing code
  264. IF(TMOML(I,J).GT.200. .and. TMOML(I,J).LE.201.) TMOML(I,J)=TSK(I,J)
  265. ENDDO
  266. ENDDO
  267. ENDIF
  268. ENDIF
  269. END SUBROUTINE omlinit
  270. !-------------------------------------------------------------------
  271. END MODULE module_sf_oml