PageRenderTime 50ms CodeModel.GetById 2ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/phys/module_sf_sstskin.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 141 lines | 78 code | 11 blank | 52 comment | 3 complexity | 62ebc1222f1a4b7c1dc34f0fe5536b46 MD5 | raw file
Possible License(s): AGPL-1.0
  1. !WRF:MODEL_LAYER:PHYSICS
  2. !
  3. MODULE module_sf_sstskin
  4. CONTAINS
  5. SUBROUTINE sst_skin_update(xland,glw,gsw,hfx,qfx,tsk,ust,emiss, &
  6. dtw1,sstsk,dt,stbolt, &
  7. ids, ide, jds, jde, kds, kde, &
  8. ims, ime, jms, jme, kms, kme, &
  9. its, ite, jts, jte, kts, kte )
  10. USE module_wrf_error
  11. IMPLICIT NONE
  12. !---------------------------------------------------------------------
  13. INTEGER , INTENT(IN) :: ids, ide, jds, jde, kds, kde, &
  14. ims, ime, jms, jme, kms, kme, &
  15. its, ite, jts, jte, kts, kte
  16. REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: xland, glw, gsw
  17. REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: hfx, qfx, tsk
  18. REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(IN ) :: ust, emiss
  19. REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(INOUT ) :: dtw1 ! warm temp difference (C)
  20. REAL, DIMENSION( ims:ime , jms:jme ) , INTENT(INOUT ) :: sstsk ! skin sst (K)
  21. REAL, INTENT(IN ) :: DT ! model time step
  22. REAL, INTENT(IN ) :: STBOLT ! Stefan-Boltzmann constant (W/m^2/K^4)
  23. !---------------------------------------------------------------------
  24. ! Local
  25. REAL :: lw, sw, q, qn, zeta, dep, dtw3, skinmax, skinmin
  26. REAL :: fs, con1, con2, con3, con4, con5, zlan, q2, ts, phi, qn1
  27. REAL :: usw, qo, swo, us, tb, dtc, dtw, alw, dtwo, delt, f1
  28. INTEGER :: i, j, k
  29. !---------------------------------------------------------------------
  30. INTEGER , PARAMETER :: n=1152
  31. REAL , PARAMETER :: z1=3.,an=.3,zk=.4,rho=1.2,rhow=1025.,cw=4190.
  32. REAL , PARAMETER :: g=9.8,znuw=1.e-6,zkw=1.4e-7,sdate=1201.6667
  33. ! parameter(g=9.8,delt=900.,znuw=1.e-6,zkw=1.4e-7)
  34. !
  35. ! Input arguments
  36. ! (all fluxes are positive downwards)
  37. ! real qo ! LH + SH + LW (W/m^2), + down
  38. ! real swo ! Net shortwave flux (W/m^2), + down
  39. ! real u ! Wind speed (m/s)
  40. ! real us ! Atmospheric friction velocity (m/s)
  41. ! real tb ! Bulk temperature (deg C)
  42. ! real dtwo ! Warm layer temp. diff. from previous time (deg C)
  43. ! Local variables
  44. ! real lw
  45. ! real sw
  46. ! real q ! LH + SH + LW
  47. ! real qn ! Q + R_s - R(-d)
  48. ! real zeta ! -z / L
  49. ! real dep ! Skin layer depth (m)
  50. ! real dtw3
  51. ! Output variables
  52. ! real dtw ! Warm layer temp. diff. (deg C)
  53. ! real dtc ! Cool skin temp. diff. (deg C)
  54. ! real ts ! Skin temperature (deg C)
  55. ! q=lh+sh+lwo
  56. !
  57. skinmax=-9999.
  58. skinmin=9999.
  59. do i=its,ite
  60. do j=jts,jte
  61. !
  62. if(xland(i,j).ge.1.5) then
  63. qo=glw(i,j)-emiss(i,j)*stbolt*(sstsk(i,j)**4)-2.5e6*qfx(i,j)-hfx(i,j)
  64. swo=gsw(i,j)
  65. us=MAX(ust(i,j), 0.01)
  66. tb=tsk(i,j)-273.15
  67. dtwo=dtw1(i,j)
  68. delt=dt
  69. !
  70. q=qo/(rhow*cw)
  71. sw=swo/(rhow*cw)
  72. ! TEMPORARY KLUDGE
  73. ! f1=1.-0.28*exp(-71.5*z1)-0.27*exp(-2.8*z1)-0.45*exp(-0.07*z1)
  74. f1=1. -0.27*exp(-2.8*z1)-0.45*exp(-0.07*z1)
  75. ! cool skin
  76. dtc=0.0
  77. ! tb in C
  78. alw=1.e-5*max(tb,1.)
  79. con4=16.*g*alw*znuw**3/zkw**2
  80. usw=sqrt(rho/rhow)*us
  81. con5=con4/usw**4
  82. ! otherwise, iterations would be needed for the computation of fs
  83. ! iteration impact is less than 0.03C
  84. q2=max(1./(rhow*cw),-q)
  85. zlan=6./(1.+(con5*q2)**0.75)**0.333
  86. dep=zlan*znuw/usw ! skin layer depth (m)
  87. fs=0.065+11.*dep-(6.6e-5/dep)*(1.-exp(-dep/8.e-4))
  88. fs=max(fs,0.01) ! fract. of solar rad. absorbed in sublayer
  89. dtc=dep*(q+sw*fs)/zkw ! cool skin temp. diff (deg C)
  90. dtc=min(dtc,0.)
  91. ! warm layer (X. Zeng)
  92. dtw=0.0
  93. ! tb in C
  94. alw=1.e-5*max(tb,1.)
  95. con1=sqrt(5.*z1*g*alw/an)
  96. con2=zk*g*alw
  97. qn=q+sw*f1
  98. usw=sqrt(rho/rhow)*us
  99. ! does not change when qn is positive
  100. if(dtwo.gt.0..and.qn.lt.0.) then
  101. qn1=sqrt(dtwo)*usw**2/con1
  102. qn=max(qn,qn1)
  103. endif
  104. zeta=z1*con2*qn/usw**3
  105. if(zeta.gt.0.) then
  106. phi=1.+5.*zeta
  107. else
  108. phi=1./sqrt(1.-16.*zeta)
  109. endif
  110. con3=zk*usw/(z1*phi)
  111. ! use all SW flux
  112. dtw=(dtwo+(an+1.)/an*(q+sw*f1)* &
  113. delt/z1)/(1.+(an+1.)*con3*delt)
  114. dtw=max(0.,dtw)
  115. dtwo=dtw
  116. ts = tb + dtw + dtc
  117. !
  118. skinmax=amax1(skinmax,ts-tb)
  119. skinmin=amin1(skinmin,ts-tb)
  120. sstsk(i,j)=ts+273.15 ! convert ts (in C) to sstsk (in K)
  121. dtw1(i,j)=dtw ! dtw always in C
  122. endif
  123. !
  124. end do
  125. end do
  126. ! print *, 'check skin sst skinmax = ', skinmax, ' skinmin = ', skinmin
  127. !
  128. return
  129. END SUBROUTINE sst_skin_update
  130. END MODULE module_sf_sstskin