| 1 | !WRF:MODEL_LAYER:PHYSICS |
|---|
| 2 | ! |
|---|
| 3 | MODULE module_sf_idealscmsfclay |
|---|
| 4 | |
|---|
| 5 | CONTAINS |
|---|
| 6 | |
|---|
| 7 | !------------------------------------------------------------------- |
|---|
| 8 | SUBROUTINE idealscmsfclay(u3d,v3d,th3d,qv3d,p3d,pi3d,rho,z,ht, & |
|---|
| 9 | cp,g,rovcp,r,xlv,psfc,chs,chs2,cqs2,cpm, & |
|---|
| 10 | znt,ust,mavail,xland, & |
|---|
| 11 | hfx,qfx,lh,tsk,flhc,flqc,qgh,qsfc, & |
|---|
| 12 | u10,v10,th2,t2,q2, & |
|---|
| 13 | svp1,svp2,svp3,svpt0,ep1,ep2, & |
|---|
| 14 | karman,fCor,exch_temf, & |
|---|
| 15 | hfx_force, lh_force, tsk_force, & |
|---|
| 16 | hfx_force_tend, lh_force_tend, tsk_force_tend, & |
|---|
| 17 | dt,itimestep, & |
|---|
| 18 | ids,ide, jds,jde, kds,kde, & |
|---|
| 19 | ims,ime, jms,jme, kms,kme, & |
|---|
| 20 | its,ite, jts,jte, kts,kte & |
|---|
| 21 | ) |
|---|
| 22 | !------------------------------------------------------------------- |
|---|
| 23 | IMPLICIT NONE |
|---|
| 24 | !------------------------------------------------------------------- |
|---|
| 25 | !-- u3d 3D u-velocity interpolated to theta points (m/s) |
|---|
| 26 | !-- v3d 3D v-velocity interpolated to theta points (m/s) |
|---|
| 27 | !-- th3d potential temperature (K) |
|---|
| 28 | !-- qv3d 3D water vapor mixing ratio (Kg/Kg) |
|---|
| 29 | !-- p3d 3D pressure (Pa) |
|---|
| 30 | !-- cp heat capacity at constant pressure for dry air (J/kg/K) |
|---|
| 31 | !-- g acceleration due to gravity (m/s^2) |
|---|
| 32 | !-- rovcp R/CP |
|---|
| 33 | !-- r gas constant for dry air (J/kg/K) |
|---|
| 34 | !-- xlv latent heat of vaporization for water (J/kg) |
|---|
| 35 | !-- psfc surface pressure (Pa) |
|---|
| 36 | !-- chs heat/moisture exchange coefficient for LSM (m/s) |
|---|
| 37 | !-- chs2 |
|---|
| 38 | !-- cqs2 |
|---|
| 39 | !-- cpm |
|---|
| 40 | !-- znt roughness length (m) |
|---|
| 41 | !-- ust u* in similarity theory (m/s) |
|---|
| 42 | !-- mavail surface moisture availability (between 0 and 1) |
|---|
| 43 | !-- xland land mask (1 for land, 2 for water) |
|---|
| 44 | !-- hfx upward heat flux at the surface (W/m^2) |
|---|
| 45 | !-- qfx upward moisture flux at the surface (kg/m^2/s) |
|---|
| 46 | !-- lh net upward latent heat flux at surface (W/m^2) |
|---|
| 47 | !-- tsk surface temperature (K) |
|---|
| 48 | !-- flhc exchange coefficient for heat (W/m^2/K) |
|---|
| 49 | !-- flqc exchange coefficient for moisture (kg/m^2/s) |
|---|
| 50 | !-- qgh lowest-level saturated mixing ratio |
|---|
| 51 | !-- qsfc ground saturated mixing ratio |
|---|
| 52 | !-- u10 diagnostic 10m u wind |
|---|
| 53 | !-- v10 diagnostic 10m v wind |
|---|
| 54 | !-- th2 diagnostic 2m theta (K) |
|---|
| 55 | !-- t2 diagnostic 2m temperature (K) |
|---|
| 56 | !-- q2 diagnostic 2m mixing ratio (kg/kg) |
|---|
| 57 | !-- svp1 constant for saturation vapor pressure (kPa) |
|---|
| 58 | !-- svp2 constant for saturation vapor pressure (dimensionless) |
|---|
| 59 | !-- svp3 constant for saturation vapor pressure (K) |
|---|
| 60 | !-- svpt0 constant for saturation vapor pressure (K) |
|---|
| 61 | !-- ep1 constant for virtual temperature (R_v/R_d - 1) (dimensionless) |
|---|
| 62 | !-- ep2 constant for specific humidity calculation |
|---|
| 63 | ! (R_d/R_v) (dimensionless) |
|---|
| 64 | !-- karman Von Karman constant |
|---|
| 65 | !-- fCor Coriolis parameter |
|---|
| 66 | !-- ids start index for i in domain |
|---|
| 67 | !-- ide end index for i in domain |
|---|
| 68 | !-- jds start index for j in domain |
|---|
| 69 | !-- jde end index for j in domain |
|---|
| 70 | !-- kds start index for k in domain |
|---|
| 71 | !-- kde end index for k in domain |
|---|
| 72 | !-- ims start index for i in memory |
|---|
| 73 | !-- ime end index for i in memory |
|---|
| 74 | !-- jms start index for j in memory |
|---|
| 75 | !-- jme end index for j in memory |
|---|
| 76 | !-- kms start index for k in memory |
|---|
| 77 | !-- kme end index for k in memory |
|---|
| 78 | !-- its start index for i in tile |
|---|
| 79 | !-- ite end index for i in tile |
|---|
| 80 | !-- jts start index for j in tile |
|---|
| 81 | !-- jte end index for j in tile |
|---|
| 82 | !-- kts start index for k in tile |
|---|
| 83 | !-- kte end index for k in tile |
|---|
| 84 | !------------------------------------------------------------------- |
|---|
| 85 | INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & |
|---|
| 86 | ims,ime, jms,jme, kms,kme, & |
|---|
| 87 | its,ite, jts,jte, kts,kte |
|---|
| 88 | ! |
|---|
| 89 | REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , & |
|---|
| 90 | INTENT(IN ) :: u3d, v3d, th3d, qv3d, p3d, pi3d, rho, z |
|---|
| 91 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
|---|
| 92 | INTENT(IN ) :: mavail, xland, fCor, ht, psfc, znt |
|---|
| 93 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
|---|
| 94 | INTENT(INOUT) :: hfx, qfx, lh, flhc, flqc, tsk |
|---|
| 95 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
|---|
| 96 | INTENT(INOUT) :: ust, chs2, cqs2, chs, cpm, qgh, qsfc |
|---|
| 97 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
|---|
| 98 | INTENT(OUT ) :: u10, v10, th2, t2, q2 |
|---|
| 99 | REAL, DIMENSION( ims:ime, jms:jme ) , & |
|---|
| 100 | INTENT( OUT) :: exch_temf |
|---|
| 101 | |
|---|
| 102 | REAL, INTENT(INOUT) :: hfx_force, lh_force, tsk_force |
|---|
| 103 | REAL, INTENT(IN ) :: hfx_force_tend, lh_force_tend, tsk_force_tend |
|---|
| 104 | REAL, INTENT(IN ) :: dt |
|---|
| 105 | INTEGER, INTENT(IN ) :: itimestep |
|---|
| 106 | |
|---|
| 107 | REAL, INTENT(IN ) :: cp,g,rovcp,r,xlv |
|---|
| 108 | REAL, INTENT(IN ) :: svp1,svp2,svp3,svpt0 |
|---|
| 109 | REAL, INTENT(IN ) :: ep1,ep2,karman |
|---|
| 110 | ! |
|---|
| 111 | ! LOCAL VARS |
|---|
| 112 | |
|---|
| 113 | INTEGER :: J |
|---|
| 114 | ! |
|---|
| 115 | ! WA 1/6/10 This routine just populates HFX, QFX, and TSK |
|---|
| 116 | ! with the suitable converted forcing values. |
|---|
| 117 | ! Note that flhc,flqc are not populated, this will NOT WORK with |
|---|
| 118 | ! an LSM. |
|---|
| 119 | |
|---|
| 120 | ! Update forcing fluxes to the current timestep |
|---|
| 121 | hfx_force = hfx_force + dt*hfx_force_tend |
|---|
| 122 | lh_force = lh_force + dt*lh_force_tend |
|---|
| 123 | tsk_force = tsk_force + dt*tsk_force_tend |
|---|
| 124 | |
|---|
| 125 | DO J=jts,jte |
|---|
| 126 | |
|---|
| 127 | CALL idealscmsfclay1d(j,u1d=u3d(ims,kms,j),v1d=v3d(ims,kms,j), & |
|---|
| 128 | th1d=th3d(ims,kms,j),qv1d=qv3d(ims,kms,j),p1d=p3d(ims,kms,j), & |
|---|
| 129 | pi1d=pi3d(ims,kms,j),rho=rho(ims,kms,j),z=z(ims,kms,j),& |
|---|
| 130 | zsrf=ht(ims,j), & |
|---|
| 131 | cp=cp,g=g,rovcp=rovcp,r=r,xlv=xlv,psfc=psfc(ims,j), & |
|---|
| 132 | chs=chs(ims,j),chs2=chs2(ims,j),cqs2=cqs2(ims,j), & |
|---|
| 133 | cpm=cpm(ims,j),znt=znt(ims,j),ust=ust(ims,j), & |
|---|
| 134 | mavail=mavail(ims,j),xland=xland(ims,j), & |
|---|
| 135 | hfx=hfx(ims,j),qfx=qfx(ims,j),lh=lh(ims,j),tsk=tsk(ims,j), & |
|---|
| 136 | flhc=flhc(ims,j),flqc=flqc(ims,j),qgh=qgh(ims,j), & |
|---|
| 137 | qsfc=qsfc(ims,j),u10=u10(ims,j),v10=v10(ims,j), & |
|---|
| 138 | th2=th2(ims,j),t2=t2(ims,j),q2=q2(ims,j), & |
|---|
| 139 | svp1=svp1,svp2=svp2,svp3=svp3,svpt0=svpt0, & |
|---|
| 140 | ep1=ep1,ep2=ep2,karman=karman,fCor=fCor(ims,j), & |
|---|
| 141 | exch_temfx=exch_temf(ims,j), & |
|---|
| 142 | hfx_force=hfx_force,lh_force=lh_force,tsk_force=tsk_force, & |
|---|
| 143 | hfx_force_tend=hfx_force_tend, & |
|---|
| 144 | lh_force_tend=lh_force_tend, & |
|---|
| 145 | tsk_force_tend=tsk_force_tend, & |
|---|
| 146 | dt=dt,itimestep=itimestep, & |
|---|
| 147 | ids=ids,ide=ide, jds=jds,jde=jde, kds=kds,kde=kde, & |
|---|
| 148 | ims=ims,ime=ime, jms=jms,jme=jme, kms=kms,kme=kme, & |
|---|
| 149 | its=its,ite=ite, jts=jts,jte=jte, kts=kts,kte=kte & |
|---|
| 150 | ) |
|---|
| 151 | ENDDO |
|---|
| 152 | |
|---|
| 153 | END SUBROUTINE idealscmsfclay |
|---|
| 154 | |
|---|
| 155 | |
|---|
| 156 | !------------------------------------------------------------------- |
|---|
| 157 | SUBROUTINE idealscmsfclay1d(j,u1d,v1d,th1d,qv1d,p1d, & |
|---|
| 158 | pi1d,rho,z,zsrf,cp,g,rovcp,r,xlv,psfc, & |
|---|
| 159 | chs,chs2,cqs2,cpm,znt,ust, & |
|---|
| 160 | mavail,xland,hfx,qfx,lh,tsk, & |
|---|
| 161 | flhc,flqc,qgh,qsfc,u10,v10, & |
|---|
| 162 | th2,t2,q2,svp1,svp2,svp3,svpt0, & |
|---|
| 163 | ep1,ep2,karman,fCor, & |
|---|
| 164 | exch_temfx, & |
|---|
| 165 | hfx_force,lh_force,tsk_force, & |
|---|
| 166 | hfx_force_tend,lh_force_tend,tsk_force_tend, & |
|---|
| 167 | dt,itimestep, & |
|---|
| 168 | ids,ide, jds,jde, kds,kde, & |
|---|
| 169 | ims,ime, jms,jme, kms,kme, & |
|---|
| 170 | its,ite, jts,jte, kts,kte & |
|---|
| 171 | ) |
|---|
| 172 | !!------------------------------------------------------------------- |
|---|
| 173 | IMPLICIT NONE |
|---|
| 174 | !!------------------------------------------------------------------- |
|---|
| 175 | INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, & |
|---|
| 176 | ims,ime, jms,jme, kms,kme, & |
|---|
| 177 | its,ite, jts,jte, kts,kte, & |
|---|
| 178 | j |
|---|
| 179 | |
|---|
| 180 | REAL, DIMENSION( ims:ime ), INTENT(IN ) :: & |
|---|
| 181 | u1d,v1d,qv1d,p1d,th1d,pi1d,rho,z,zsrf |
|---|
| 182 | REAL, INTENT(IN ) :: cp,g,rovcp,r,xlv |
|---|
| 183 | REAL, DIMENSION( ims:ime ), INTENT(IN ) :: psfc,znt |
|---|
| 184 | REAL, DIMENSION( ims:ime ), INTENT(INOUT) :: & |
|---|
| 185 | chs,chs2,cqs2,cpm,ust |
|---|
| 186 | REAL, DIMENSION( ims:ime ), INTENT(IN ) :: mavail,xland |
|---|
| 187 | REAL, DIMENSION( ims:ime ), INTENT(INOUT) :: & |
|---|
| 188 | hfx,qfx,lh |
|---|
| 189 | REAL, DIMENSION( ims:ime ), INTENT(INOUT) :: tsk |
|---|
| 190 | REAL, DIMENSION( ims:ime ), INTENT( OUT) :: & |
|---|
| 191 | flhc,flqc |
|---|
| 192 | REAL, DIMENSION( ims:ime ), INTENT(INOUT) :: & |
|---|
| 193 | qgh,qsfc |
|---|
| 194 | REAL, DIMENSION( ims:ime ), INTENT( OUT) :: & |
|---|
| 195 | u10,v10,th2,t2,q2 |
|---|
| 196 | REAL, INTENT(IN ) :: svp1,svp2,svp3,svpt0 |
|---|
| 197 | REAL, INTENT(IN ) :: ep1,ep2,karman |
|---|
| 198 | REAL, DIMENSION( ims:ime ), INTENT(IN ) :: fCor |
|---|
| 199 | REAL, DIMENSION( ims:ime ), INTENT( OUT) :: exch_temfx |
|---|
| 200 | REAL, INTENT(INOUT) :: hfx_force,lh_force,tsk_force |
|---|
| 201 | REAL, INTENT(IN ) :: hfx_force_tend,lh_force_tend,tsk_force_tend |
|---|
| 202 | REAL, INTENT(IN ) :: dt |
|---|
| 203 | INTEGER, INTENT(IN ) :: itimestep |
|---|
| 204 | ! |
|---|
| 205 | !! LOCAL VARS |
|---|
| 206 | ! TE model constants |
|---|
| 207 | logical, parameter :: MFopt = .true. ! Use mass flux or not |
|---|
| 208 | real, parameter :: TEmin = 1e-3 |
|---|
| 209 | real, parameter :: ftau0 = 0.17 |
|---|
| 210 | real, parameter :: fth0 = 0.145 |
|---|
| 211 | real, parameter :: Cf = 0.185 |
|---|
| 212 | real, parameter :: CN = 2.0 |
|---|
| 213 | ! real, parameter :: Ceps = ftau0**1.5 |
|---|
| 214 | real, parameter :: Ceps = 0.070 |
|---|
| 215 | real, parameter :: Cgamma = Ceps |
|---|
| 216 | real, parameter :: Cphi = Ceps |
|---|
| 217 | ! real, parameter :: PrT0 = Cphi/Ceps * ftau0**2. / 2 / fth0**2. |
|---|
| 218 | real, parameter :: PrT0 = Cphi/Ceps * ftau0**2 / 2. / fth0**2 |
|---|
| 219 | ! |
|---|
| 220 | integer :: i |
|---|
| 221 | real :: e1 |
|---|
| 222 | real, dimension( its:ite) :: wstr, ang, wm |
|---|
| 223 | real, dimension( its:ite) :: z0t |
|---|
| 224 | real, dimension( its:ite) :: dthdz, dqtdz, dudz, dvdz |
|---|
| 225 | real, dimension( its:ite) :: lepsmin |
|---|
| 226 | real, dimension( its:ite) :: thetav |
|---|
| 227 | real, dimension( its:ite) :: zt,zm |
|---|
| 228 | real, dimension( its:ite) :: N2, S, Ri, beta, ftau, fth, ratio |
|---|
| 229 | real, dimension( its:ite) :: TKE, TE2 |
|---|
| 230 | real, dimension( its:ite) :: ustrtilde, linv, leps |
|---|
| 231 | real, dimension( its:ite) :: km, kh |
|---|
| 232 | real, dimension( its:ite) :: qsfc_air |
|---|
| 233 | !!------------------------------------------------------------------- |
|---|
| 234 | |
|---|
| 235 | !!!!!!! ****** |
|---|
| 236 | ! WA Known outages: None |
|---|
| 237 | |
|---|
| 238 | do i = its,ite ! Main loop |
|---|
| 239 | |
|---|
| 240 | ! WA 1/6/10 This routine just populates HFX, QFX, and TSK |
|---|
| 241 | ! with the suitable converted forcing values. |
|---|
| 242 | |
|---|
| 243 | ! Surface fluxes |
|---|
| 244 | ust(i) = sqrt(ftau(i)/ftau0) * sqrt(u1d(i)**2. + v1d(i)**2.) * leps(i) / log(zm(i)/znt(i)) / zt(i) |
|---|
| 245 | ang(i) = atan2(v1d(i),u1d(i)) |
|---|
| 246 | |
|---|
| 247 | ! Populate surface heat and moisture fluxes |
|---|
| 248 | hfx(i) = hfx_force |
|---|
| 249 | lh(i) = lh_force |
|---|
| 250 | qfx(i) = lh(i) / xlv |
|---|
| 251 | tsk(i) = tsk_force |
|---|
| 252 | |
|---|
| 253 | ! Populate exchange coefficients |
|---|
| 254 | flhc(i) = hfx(i) / (tsk(i) - th1d(i)*pi1d(i)) |
|---|
| 255 | exch_temfx(i) = flhc(i) / (rho(i) * cp) |
|---|
| 256 | ! flqc(i) = qfx(i) / (qsfc_air(i) - qv1d(i)) |
|---|
| 257 | flqc(i) = exch_temfx(i) * mavail(i) |
|---|
| 258 | |
|---|
| 259 | end do ! Main loop |
|---|
| 260 | |
|---|
| 261 | END SUBROUTINE idealscmsfclay1d |
|---|
| 262 | |
|---|
| 263 | !==================================================================== |
|---|
| 264 | SUBROUTINE idealscmsfclayinit( allowed_to_read ) |
|---|
| 265 | |
|---|
| 266 | LOGICAL , INTENT(IN) :: allowed_to_read |
|---|
| 267 | |
|---|
| 268 | END SUBROUTINE idealscmsfclayinit |
|---|
| 269 | |
|---|
| 270 | !------------------------------------------------------------------- |
|---|
| 271 | |
|---|
| 272 | END MODULE module_sf_idealscmsfclay |
|---|