1 !WRF:MODEL_LAYER:PHYSICS
3 MODULE module_sf_sfclay
5 REAL , PARAMETER :: VCONVC=1.
6 REAL , PARAMETER :: CZO=0.0185
7 REAL , PARAMETER :: OZO=1.59E-5
9 REAL, DIMENSION(0:1000 ),SAVE :: PSIMTB,PSIHTB
13 !-------------------------------------------------------------------
14 SUBROUTINE SFCLAY(U3D,V3D,T3D,QV3D,P3D,dz8w, &
15 CP,G,ROVCP,R,XLV,PSFC,CHS,CHS2,CQS2,CPM, &
16 ZNT,UST,PBLH,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
17 XLAND,HFX,QFX,LH,TSK,FLHC,FLQC,QGH,QSFC,RMOL, &
19 GZ1OZ0,WSPD,BR,ISFFLX,DX, &
20 SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
21 KARMAN,EOMEG,STBOLT, &
23 ids,ide, jds,jde, kds,kde, &
24 ims,ime, jms,jme, kms,kme, &
25 its,ite, jts,jte, kts,kte, &
27 ustm,ck,cka,cd,cda,isftcflx )
28 !-------------------------------------------------------------------
30 !-------------------------------------------------------------------
31 !-- U3D 3D u-velocity interpolated to theta points (m/s)
32 !-- V3D 3D v-velocity interpolated to theta points (m/s)
33 !-- T3D temperature (K)
34 !-- QV3D 3D water vapor mixing ratio (Kg/Kg)
35 !-- P3D 3D pressure (Pa)
36 !-- dz8w dz between full levels (m)
37 !-- CP heat capacity at constant pressure for dry air (J/kg/K)
38 !-- G acceleration due to gravity (m/s^2)
40 !-- R gas constant for dry air (J/kg/K)
41 !-- XLV latent heat of vaporization for water (J/kg)
42 !-- PSFC surface pressure (Pa)
43 !-- ZNT roughness length (m)
44 !-- UST u* in similarity theory (m/s)
45 !-- USTM u* in similarity theory (m/s) without vconv correction
46 ! used to couple with TKE scheme
47 !-- PBLH PBL height from previous time (m)
48 !-- MAVAIL surface moisture availability (between 0 and 1)
49 !-- ZOL z/L height over Monin-Obukhov length
50 !-- MOL T* (similarity theory) (K)
51 !-- REGIME flag indicating PBL regime (stable, unstable, etc.)
52 !-- PSIM similarity stability function for momentum
53 !-- PSIH similarity stability function for heat
54 !-- XLAND land mask (1 for land, 2 for water)
55 !-- HFX upward heat flux at the surface (W/m^2)
56 !-- QFX upward moisture flux at the surface (kg/m^2/s)
57 !-- LH net upward latent heat flux at surface (W/m^2)
58 !-- TSK surface temperature (K)
59 !-- FLHC exchange coefficient for heat (W/m^2/K)
60 !-- FLQC exchange coefficient for moisture (kg/m^2/s)
61 !-- CHS heat/moisture exchange coefficient for LSM (m/s)
62 !-- QGH lowest-level saturated mixing ratio
63 !-- QSFC ground saturated mixing ratio
64 !-- uratx ratio of surface U to U10
65 !-- vratx ratio of surface V to V10
66 !-- tratx ratio of surface T to TH2
67 !-- U10 diagnostic 10m u wind
68 !-- V10 diagnostic 10m v wind
69 !-- TH2 diagnostic 2m theta (K)
70 !-- T2 diagnostic 2m temperature (K)
71 !-- Q2 diagnostic 2m mixing ratio (kg/kg)
72 !-- GZ1OZ0 log(z/z0) where z0 is roughness length
73 !-- WSPD wind speed at lowest model level (m/s)
74 !-- BR bulk Richardson number in surface layer
75 !-- ISFFLX isfflx=1 for surface heat and moisture fluxes
76 !-- DX horizontal grid size (m)
77 !-- SVP1 constant for saturation vapor pressure (kPa)
78 !-- SVP2 constant for saturation vapor pressure (dimensionless)
79 !-- SVP3 constant for saturation vapor pressure (K)
80 !-- SVPT0 constant for saturation vapor pressure (K)
81 !-- EP1 constant for virtual temperature (R_v/R_d - 1) (dimensionless)
82 !-- EP2 constant for specific humidity calculation
83 ! (R_d/R_v) (dimensionless)
84 !-- KARMAN Von Karman constant
85 !-- EOMEG angular velocity of earth's rotation (rad/s)
86 !-- STBOLT Stefan-Boltzmann constant (W/m^2/K^4)
87 !-- ck enthalpy exchange coeff at 10 meters
88 !-- cd momentum exchange coeff at 10 meters
89 !-- cka enthalpy exchange coeff at the lowest model level
90 !-- cda momentum exchange coeff at the lowest model level
91 !-- isftcflx =0, (Charnock and Carlson-Boland); =1, AHW Ck, Cd
92 !-- ids start index for i in domain
93 !-- ide end index for i in domain
94 !-- jds start index for j in domain
95 !-- jde end index for j in domain
96 !-- kds start index for k in domain
97 !-- kde end index for k in domain
98 !-- ims start index for i in memory
99 !-- ime end index for i in memory
100 !-- jms start index for j in memory
101 !-- jme end index for j in memory
102 !-- kms start index for k in memory
103 !-- kme end index for k in memory
104 !-- its start index for i in tile
105 !-- ite end index for i in tile
106 !-- jts start index for j in tile
107 !-- jte end index for j in tile
108 !-- kts start index for k in tile
109 !-- kte end index for k in tile
110 !-------------------------------------------------------------------
111 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
112 ims,ime, jms,jme, kms,kme, &
113 its,ite, jts,jte, kts,kte
115 INTEGER, INTENT(IN ) :: ISFFLX
116 REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
117 REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
118 REAL, INTENT(IN ) :: P1000mb
120 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
123 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
124 INTENT(IN ) :: QV3D, &
128 REAL, DIMENSION( ims:ime, jms:jme ) , &
129 INTENT(IN ) :: MAVAIL, &
133 REAL, DIMENSION( ims:ime, jms:jme ) , &
134 INTENT(OUT ) :: U10, &
142 REAL, DIMENSION( ims:ime, jms:jme ) , &
143 INTENT(INOUT) :: REGIME, &
148 !m the following 5 are change to memory size
150 REAL, DIMENSION( ims:ime, jms:jme ) , &
151 INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
154 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ) , &
155 INTENT(IN ) :: U3D, &
158 REAL, DIMENSION( ims:ime, jms:jme ) , &
161 REAL, DIMENSION( ims:ime, jms:jme ) , &
162 INTENT(INOUT) :: ZNT, &
170 REAL, DIMENSION( ims:ime, jms:jme ) , &
171 INTENT(INOUT) :: FLHC,FLQC
173 REAL, DIMENSION( ims:ime, jms:jme ) , &
179 REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
181 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ) , &
182 INTENT(OUT) :: uratx,vratx,tratx
184 REAL, OPTIONAL, DIMENSION( ims:ime, jms:jme ) , &
185 INTENT(OUT) :: ck,cka,cd,cda,ustm
187 INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX
191 REAL, DIMENSION( its:ite ) :: U1D, &
197 REAL, DIMENSION( its:ite ) :: dz8w1d
203 dz8w1d(I) = dz8w(i,1,j)
214 ! Sending array starting locations of optional variables may cause
215 ! troubles, so we explicitly change the call.
217 CALL SFCLAY1D(J,U1D,V1D,T1D,QV1D,P1D,dz8w1d, &
218 CP,G,ROVCP,R,XLV,PSFC(ims,j),CHS(ims,j),CHS2(ims,j),&
219 CQS2(ims,j),CPM(ims,j),PBLH(ims,j), RMOL(ims,j), &
220 ZNT(ims,j),UST(ims,j),MAVAIL(ims,j),ZOL(ims,j), &
221 MOL(ims,j),REGIME(ims,j),PSIM(ims,j),PSIH(ims,j), &
222 XLAND(ims,j),HFX(ims,j),QFX(ims,j),TSK(ims,j), &
223 U10(ims,j),V10(ims,j),TH2(ims,j),T2(ims,j), &
224 Q2(ims,j),FLHC(ims,j),FLQC(ims,j),QGH(ims,j), &
225 QSFC(ims,j),LH(ims,j), &
226 GZ1OZ0(ims,j),WSPD(ims,j),BR(ims,j),ISFFLX,DX, &
227 SVP1,SVP2,SVP3,SVPT0,EP1,EP2,KARMAN,EOMEG,STBOLT, &
229 ids,ide, jds,jde, kds,kde, &
230 ims,ime, jms,jme, kms,kme, &
231 its,ite, jts,jte, kts,kte &
233 ,uratx(ims,j),vratx(ims,j),tratx(ims,j), &
235 USTM(ims,j),CK(ims,j),CKA(ims,j), &
236 CD(ims,j),CDA(ims,j) &
242 END SUBROUTINE SFCLAY
245 !-------------------------------------------------------------------
246 SUBROUTINE SFCLAY1D(J,UX,VX,T1D,QV1D,P1D,dz8w1d, &
247 CP,G,ROVCP,R,XLV,PSFCPA,CHS,CHS2,CQS2,CPM,PBLH,RMOL, &
248 ZNT,UST,MAVAIL,ZOL,MOL,REGIME,PSIM,PSIH, &
250 U10,V10,TH2,T2,Q2,FLHC,FLQC,QGH, &
251 QSFC,LH,GZ1OZ0,WSPD,BR,ISFFLX,DX, &
252 SVP1,SVP2,SVP3,SVPT0,EP1,EP2, &
253 KARMAN,EOMEG,STBOLT, &
255 ids,ide, jds,jde, kds,kde, &
256 ims,ime, jms,jme, kms,kme, &
257 its,ite, jts,jte, kts,kte, &
261 !-------------------------------------------------------------------
263 !-------------------------------------------------------------------
264 REAL, PARAMETER :: XKA=2.4E-5
265 REAL, PARAMETER :: PRT=1.
267 INTEGER, INTENT(IN ) :: ids,ide, jds,jde, kds,kde, &
268 ims,ime, jms,jme, kms,kme, &
269 its,ite, jts,jte, kts,kte, &
272 INTEGER, INTENT(IN ) :: ISFFLX
273 REAL, INTENT(IN ) :: SVP1,SVP2,SVP3,SVPT0
274 REAL, INTENT(IN ) :: EP1,EP2,KARMAN,EOMEG,STBOLT
275 REAL, INTENT(IN ) :: P1000mb
278 REAL, DIMENSION( ims:ime ) , &
279 INTENT(IN ) :: MAVAIL, &
284 REAL, DIMENSION( ims:ime ) , &
285 INTENT(IN ) :: PSFCPA
287 REAL, DIMENSION( ims:ime ) , &
288 INTENT(INOUT) :: REGIME, &
292 !m the following 5 are changed to memory size---
294 REAL, DIMENSION( ims:ime ) , &
295 INTENT(INOUT) :: GZ1OZ0,WSPD,BR, &
298 REAL, DIMENSION( ims:ime ) , &
299 INTENT(INOUT) :: ZNT, &
307 REAL, DIMENSION( ims:ime ) , &
308 INTENT(INOUT) :: FLHC,FLQC
310 REAL, DIMENSION( ims:ime ) , &
314 REAL, DIMENSION( ims:ime ) , &
315 INTENT(OUT) :: U10,V10, &
319 REAL, INTENT(IN ) :: CP,G,ROVCP,R,XLV,DX
321 ! MODULE-LOCAL VARIABLES, DEFINED IN SUBROUTINE SFCLAY
322 REAL, DIMENSION( its:ite ), INTENT(IN ) :: dz8w1d
324 REAL, DIMENSION( its:ite ), INTENT(IN ) :: UX, &
330 REAL, OPTIONAL, DIMENSION( ims:ime ) , &
331 INTENT(OUT) :: uratx,vratx,tratx
333 REAL, OPTIONAL, DIMENSION( ims:ime ) , &
334 INTENT(OUT) :: ck,cka,cd,cda,ustm
336 INTEGER, OPTIONAL, INTENT(IN ) :: ISFTCFLX
340 REAL, DIMENSION( its:ite ) :: ZA, &
353 REAL, DIMENSION( its:ite ) :: &
357 REAL, DIMENSION( its:ite) :: SCR3,SCR4
358 REAL, DIMENSION( its:ite ) :: THGB, PSFC
362 INTEGER :: N,I,K,KK,L,NZOL,NK,NZOL2,NZOL10
364 REAL :: PL,THCON,TVCON,E1
365 REAL :: ZL,TSKV,DTHVDZ,DTHVM,VCONV,RZOL,RZOL2,RZOL10,ZOL2,ZOL10
366 REAL :: DTG,PSIX,DTTHX,PSIX10,PSIT,PSIT2,PSIQ,PSIQ2,PSIQ10
367 REAL :: FLUXC,VSGD,Z0Q
368 !-------------------------------------------------------------------
373 PSFC(I)=PSFCPA(I)/1000.
376 !----CONVERT GROUND TEMPERATURE TO POTENTIAL TEMPERATURE:
381 ! THGB(I)=TSK(I)*(100./PSFC(I))**ROVCP
382 THGB(I)=TSK(I)*(P1000mb/PSFCPA(I))**ROVCP
385 !-----DECOUPLE FLUX-FORM VARIABLES TO GIVE U,V,T,THETA,THETA-VIR.,
386 ! T-VIR., QV, AND QC AT CROSS POINTS AND AT KTAU-1.
389 ! THE BOUNDARY WINDS MAY NOT BE ADEQUATELY AFFECTED BY FRICTION,
390 ! SO USE ONLY INTERIOR VALUES OF UX AND VX TO CALCULATE
402 !.....SCR3(I,K) STORE TEMPERATURE,
403 ! SCR4(I,K) STORE VIRTUAL TEMPERATURE.
409 ! THCON=(100./PL)**ROVCP
410 THCON=(P1000mb*0.001/PL)**ROVCP
424 ! IF(IDRY.EQ.1)GOTO 80
429 SCR4(I)=SCR3(I)*TVCON
433 E1=SVP1*EXP(SVP2*(TGDSA(I)-SVPT0)/(TGDSA(I)-SVP3))
434 QSFC(I)=EP2*E1/(PSFC(I)-E1)
435 ! QGH CHANGED TO USE LOWEST-LEVEL AIR TEMP CONSISTENT WITH MYJSFC CHANGE
437 E1=SVP1*EXP(SVP2*(T1D(I)-SVPT0)/(T1D(I)-SVP3))
439 QGH(I)=EP2*E1/(PL-E1)
440 CPM(I)=CP*(1.+0.8*QX(I))
444 !-----COMPUTE THE HEIGHT OF FULL- AND HALF-SIGMA LEVELS ABOVE GROUND
445 ! LEVEL, AND THE LAYER THICKNESSES.
449 RHOX(I)=PSFC(I)*1000./(R*SCR4(I))
453 ZQKL(I)=dz8w1d(I)+ZQKLP1(I)
457 ZA(I)=0.5*(ZQKL(I)+ZQKLP1(I))
464 !-----CALCULATE BULK RICHARDSON NO. OF SURFACE LAYER, ACCORDING TO
468 GZ1OZ0(I)=ALOG(ZA(I)/ZNT(I))
469 GZ2OZ0(I)=ALOG(2./ZNT(I))
470 GZ10OZ0(I)=ALOG(10./ZNT(I))
471 IF((XLAND(I)-1.5).GE.0)THEN
476 WSPD(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
478 TSKV=THGB(I)*(1.+EP1*QSFC(I)*MAVAIL(I))
479 DTHVDZ=(THVX(I)-TSKV)
480 ! Convective velocity scale Vc and subgrid-scale velocity Vsg
481 ! following Beljaars (1995, QJRMS) and Mahrt and Sun (1995, MWR)
484 ! VCONV = 0.25*sqrt(g/tskv*pblh(i)*dthvm)
485 ! Use Beljaars over land, old MM5 (Wyngaard) formula over water
486 if (xland(i).lt.1.5) then
487 fluxc = max(hfx(i)/rhox(i)/cp &
488 + ep1*tskv*qfx(i)/rhox(i),0.)
489 VCONV = vconvc*(g/tgdsa(i)*pblh(i)*fluxc)**.33
496 VCONV = 2.*SQRT(DTHVM)
498 ! Mahrt and Sun low-res correction
499 VSGD = 0.32 * (max(dx/5000.-1.,0.))**.33
500 WSPD(I)=SQRT(WSPD(I)*WSPD(I)+VCONV*VCONV+vsgd*vsgd)
501 WSPD(I)=AMAX1(WSPD(I),0.1)
502 BR(I)=GOVRTH(I)*ZA(I)*DTHVDZ/(WSPD(I)*WSPD(I))
503 ! IF PREVIOUSLY UNSTABLE, DO NOT LET INTO REGIMES 1 AND 2
504 IF(MOL(I).LT.0.)BR(I)=AMIN1(BR(I),0.0)
506 RMOL(I)=-GOVRTH(I)*DTHVDZ*ZA(I)*KARMAN
512 !-----DIAGNOSE BASIC PARAMETERS FOR THE APPROPRIATED STABILITY CLASS:
515 ! THE STABILITY CLASSES ARE DETERMINED BY BR (BULK RICHARDSON NO.)
516 ! AND HOL (HEIGHT OF PBL/MONIN-OBUKHOV LENGTH).
518 ! CRITERIA FOR THE CLASSES ARE AS FOLLOWS:
521 ! REPRESENTS NIGHTTIME STABLE CONDITIONS (REGIME=1),
523 ! 2. BR .LT. 0.2 .AND. BR .GT. 0.0;
524 ! REPRESENTS DAMPED MECHANICAL TURBULENT CONDITIONS
528 ! REPRESENTS FORCED CONVECTION CONDITIONS (REGIME=3),
531 ! REPRESENTS FREE CONVECTION CONDITIONS (REGIME=4).
537 !CC REMOVE REGIME 3 DEPENDENCE ON PBL HEIGHT
538 !CC IF(BR(I).LT.0..AND.HOL(I,J).GT.1.5)GOTO 310
539 IF(BR(I).LT.0.)GOTO 310
541 !-----CLASS 1; STABLE (NIGHTTIME) CONDITIONS:
543 IF(BR(I).LT.0.2)GOTO 270
545 PSIM(I)=-10.*GZ1OZ0(I)
546 ! LOWER LIMIT ON PSI IN STABLE CONDITIONS
547 PSIM(I)=AMAX1(PSIM(I),-10.)
549 PSIM10(I)=10./ZA(I)*PSIM(I)
550 PSIM10(I)=AMAX1(PSIM10(I),-10.)
552 PSIM2(I)=2./ZA(I)*PSIM(I)
553 PSIM2(I)=AMAX1(PSIM2(I),-10.)
556 ! 1.0 over Monin-Obukhov length
557 IF(UST(I).LT.0.01)THEN
558 RMOL(I)=BR(I)*GZ1OZ0(I) !ZA/L
560 RMOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I)) !ZA/L
562 RMOL(I)=AMIN1(RMOL(I),9.999) ! ZA/L
563 RMOL(I) = RMOL(I)/ZA(I) !1.0/L
567 !-----CLASS 2; DAMPED MECHANICAL TURBULENCE:
569 270 IF(BR(I).EQ.0.0)GOTO 280
571 PSIM(I)=-5.0*BR(I)*GZ1OZ0(I)/(1.1-5.0*BR(I))
572 ! LOWER LIMIT ON PSI IN STABLE CONDITIONS
573 PSIM(I)=AMAX1(PSIM(I),-10.)
574 !.....AKB(1976), EQ(16).
576 PSIM10(I)=10./ZA(I)*PSIM(I)
577 PSIM10(I)=AMAX1(PSIM10(I),-10.)
579 PSIM2(I)=2./ZA(I)*PSIM(I)
580 PSIM2(I)=AMAX1(PSIM2(I),-10.)
583 ! Linear form: PSIM = -0.5*ZA/L; e.g, see eqn 16 of
584 ! Blackadar, Modeling the nocturnal boundary layer, Preprints,
585 ! Third Symposium on Atmospheric Turbulence Diffusion and Air Quality,
587 ZOL(I) = BR(I)*GZ1OZ0(I)/(1.00001-5.0*BR(I))
589 if ( ZOL(I) .GT. 0.5 ) then ! linear form ok
590 ! Holtslag and de Bruin, J. App. Meteor 27, 689-704, 1988;
591 ! see also, Launiainen, Boundary-Layer Meteor 76,165-179, 1995
592 ! Eqn (8) of Launiainen, 1995
593 ZOL(I) = ( 1.89*GZ1OZ0(I) + 44.2 ) * BR(I)*BR(I) &
594 + ( 1.18*GZ1OZ0(I) - 1.37 ) * BR(I)
595 ZOL(I)=AMIN1(ZOL(I),9.999)
598 ! 1.0 over Monin-Obukhov length
599 RMOL(I)= ZOL(I)/ZA(I)
603 !-----CLASS 3; FORCED CONVECTION:
614 IF(UST(I).LT.0.01)THEN
615 ZOL(I)=BR(I)*GZ1OZ0(I)
617 ZOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I))
620 RMOL(I) = ZOL(I)/ZA(I)
624 !-----CLASS 4; FREE CONVECTION:
628 IF(UST(I).LT.0.01)THEN
629 ZOL(I)=BR(I)*GZ1OZ0(I)
631 ZOL(I)=KARMAN*GOVRTH(I)*ZA(I)*MOL(I)/(UST(I)*UST(I))
633 ZOL10=10./ZA(I)*ZOL(I)
635 ZOL(I)=AMIN1(ZOL(I),0.)
636 ZOL(I)=AMAX1(ZOL(I),-9.9999)
637 ZOL10=AMIN1(ZOL10,0.)
638 ZOL10=AMAX1(ZOL10,-9.9999)
640 ZOL2=AMAX1(ZOL2,-9.9999)
641 NZOL=INT(-ZOL(I)*100.)
642 RZOL=-ZOL(I)*100.-NZOL
643 NZOL10=INT(-ZOL10*100.)
644 RZOL10=-ZOL10*100.-NZOL10
645 NZOL2=INT(-ZOL2*100.)
646 RZOL2=-ZOL2*100.-NZOL2
647 PSIM(I)=PSIMTB(NZOL)+RZOL*(PSIMTB(NZOL+1)-PSIMTB(NZOL))
648 PSIH(I)=PSIHTB(NZOL)+RZOL*(PSIHTB(NZOL+1)-PSIHTB(NZOL))
649 PSIM10(I)=PSIMTB(NZOL10)+RZOL10*(PSIMTB(NZOL10+1)-PSIMTB(NZOL10))
650 PSIH10(I)=PSIHTB(NZOL10)+RZOL10*(PSIHTB(NZOL10+1)-PSIHTB(NZOL10))
651 PSIM2(I)=PSIMTB(NZOL2)+RZOL2*(PSIMTB(NZOL2+1)-PSIMTB(NZOL2))
652 PSIH2(I)=PSIHTB(NZOL2)+RZOL2*(PSIHTB(NZOL2+1)-PSIHTB(NZOL2))
654 !---LIMIT PSIH AND PSIM IN THE CASE OF THIN LAYERS AND HIGH ROUGHNESS
655 !--- THIS PREVENTS DENOMINATOR IN FLUXES FROM GETTING TOO SMALL
656 ! PSIH(I)=AMIN1(PSIH(I),0.9*GZ1OZ0(I))
657 ! PSIM(I)=AMIN1(PSIM(I),0.9*GZ1OZ0(I))
658 PSIH(I)=AMIN1(PSIH(I),0.9*GZ1OZ0(I))
659 PSIM(I)=AMIN1(PSIM(I),0.9*GZ1OZ0(I))
660 PSIH2(I)=AMIN1(PSIH2(I),0.9*GZ2OZ0(I))
661 PSIM10(I)=AMIN1(PSIM10(I),0.9*GZ10OZ0(I))
662 ! AHW: mods to compute ck, cd
663 PSIH10(I)=AMIN1(PSIH10(I),0.9*GZ10OZ0(I))
665 RMOL(I) = ZOL(I)/ZA(I)
669 !-----COMPUTE THE FRICTIONAL VELOCITY:
670 ! ZA(1982) EQS(2.60),(2.61).
674 PSIX=GZ1OZ0(I)-PSIM(I)
675 PSIX10=GZ10OZ0(I)-PSIM10(I)
676 ! LOWER LIMIT ADDED TO PREVENT LARGE FLHC IN SOIL MODEL
677 ! ACTIVATES IN UNSTABLE CONDITIONS WITH THIN LAYERS OR HIGH Z0
678 PSIT=AMAX1(GZ1OZ0(I)-PSIH(I),2.)
680 IF((XLAND(I)-1.5).GE.0)THEN
685 PSIQ=ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-PSIH(I)
686 PSIT2=GZ2OZ0(I)-PSIH2(I)
687 PSIQ2=ALOG(KARMAN*UST(I)*2./XKA+2./ZL)-PSIH2(I)
688 ! AHW: mods to compute ck, cd
689 PSIQ10=ALOG(KARMAN*UST(I)*10./XKA+10./ZL)-PSIH10(I)
690 IF ( PRESENT(ISFTCFLX) ) THEN
691 IF ( ISFTCFLX.EQ.1 .AND. (XLAND(I)-1.5).GE.0. ) THEN
692 Z0Q = 1.e-4 + 1.e-3*(MAX(0.,UST(I)-1.))**2
693 ! Z0Q = 0.62*1.5E-5/UST(I) + 1.E-3*(MAX(0.,UST(I)-1.))**2
694 PSIQ=ALOG(ZA(I)/Z0Q)-PSIH(I)
696 PSIQ2=ALOG(2./Z0Q)-PSIH2(I)
697 PSIQ10=ALOG(10./Z0Q)-PSIH10(I)
701 IF(PRESENT(ck) .and. PRESENT(cd) .and. PRESENT(cka) .and. PRESENT(cda)) THEN
702 Ck(I)=(karman/psix10)*(karman/psiq10)
703 Cd(I)=(karman/psix10)*(karman/psix10)
704 Cka(I)=(karman/psix)*(karman/psiq)
705 Cda(I)=(karman/psix)*(karman/psix)
707 ! TO PREVENT OSCILLATIONS AVERAGE WITH OLD VALUE
708 UST(I)=0.5*UST(I)+0.5*KARMAN*WSPD(I)/PSIX
709 ! TKE coupling: compute ust without vconv for use in tke scheme
710 WSPDI(I)=SQRT(UX(I)*UX(I)+VX(I)*VX(I))
711 IF ( PRESENT(USTM) ) THEN
712 USTM(I)=0.5*USTM(I)+0.5*KARMAN*WSPDI(I)/PSIX
714 U10(I)=UX(I)*PSIX10/PSIX
715 V10(I)=VX(I)*PSIX10/PSIX
716 TH2(I)=THGB(I)+DTG*PSIT2/PSIT
717 Q2(I)=QSFC(I)+(QX(I)-QSFC(I))*PSIQ2/PSIQ
718 ! T2(I) = TH2(I)*(PSFC(I)/100.)**ROVCP
719 T2(I) = TH2(I)*(PSFCPA(I)/P1000mb)**ROVCP
720 ! LATER Q2 WILL BE OVERWRITTEN FOR LAND POINTS IN SURFCE
724 ! write(*,1002)UST(I),KARMAN*WSPD(I),PSIX,KARMAN*WSPD(I)/PSIX
726 IF(PRESENT(uratx) .and. PRESENT(vratx) .and. PRESENT(tratx))THEN
727 IF(ABS(U10(I)) .GT. 1.E-10) THEN
728 uratx(I) = UX(I)/U10(I)
732 IF(ABS(V10(I)) .GT. 1.E-10) THEN
733 vratx(I) = VX(I)/V10(I)
737 tratx(I) = THX(I)/TH2(I)
740 IF((XLAND(I)-1.5).LT.0.)THEN
741 UST(I)=AMAX1(UST(I),0.1)
743 MOL(I)=KARMAN*DTG/PSIT/PRT
749 !-----COMPUTE THE SURFACE SENSIBLE AND LATENT HEAT FLUXES:
756 IF (ISFFLX.EQ.0) GOTO 410
758 !-----OVER WATER, ALTER ROUGHNESS LENGTH (ZNT) ACCORDING TO WIND (UST).
761 IF((XLAND(I)-1.5).GE.0)THEN
762 ZNT(I)=CZO*UST(I)*UST(I)/G+OZO
763 ! AHW: change roughness length, and hence the drag coefficients Ck and Cd
764 IF ( PRESENT(ISFTCFLX) ) THEN
765 IF ( ISFTCFLX.EQ.1 ) THEN
766 ZNT(I)=10.*exp(-9.*UST(I)**(-.3333))
767 ZNT(I)=MIN(ZNT(I),2.85e-3)
768 ZNT(I)=ZNT(I) + 0.11*1.5E-5/AMAX1(UST(I),0.01)
769 ! ZNT(I)=MAX(ZNT(I),1.27e-7)
776 FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/DENOMQ(I)
777 ! FLQC(I)=RHOX(I)*MAVAIL(I)*UST(I)*KARMAN/( &
778 ! ALOG(KARMAN*UST(I)*ZA(I)/XKA+ZA(I)/ZL)-PSIH(I))
779 DTTHX=ABS(THX(I)-THGB(I))
780 IF(DTTHX.GT.1.E-5)THEN
781 FLHC(I)=CPM(I)*RHOX(I)*UST(I)*MOL(I)/(THX(I)-THGB(I))
782 ! write(*,1001)FLHC(I),CPM(I),RHOX(I),UST(I),MOL(I),THX(I),THGB(I),I
783 1001 format(f8.5,2x,f12.7,2x,f12.10,2x,f12.10,2x,f13.10,2x,f12.8,f12.8,2x,i3)
790 !-----COMPUTE SURFACE MOIST FLUX:
792 ! IF(IDRY.EQ.1)GOTO 390
795 QFX(I)=FLQC(I)*(QSFC(I)-QX(I))
796 QFX(I)=AMAX1(QFX(I),0.)
800 !-----COMPUTE SURFACE HEAT FLUX:
804 IF(XLAND(I)-1.5.GT.0.)THEN
805 HFX(I)=FLHC(I)*(THGB(I)-THX(I))
806 ELSEIF(XLAND(I)-1.5.LT.0.)THEN
807 HFX(I)=FLHC(I)*(THGB(I)-THX(I))
808 HFX(I)=AMAX1(HFX(I),-250.)
813 IF((XLAND(I)-1.5).GE.0)THEN
818 CHS(I)=UST(I)*KARMAN/(ALOG(KARMAN*UST(I)*ZA(I) &
819 /XKA+ZA(I)/ZL)-PSIH(I))
820 ! GZ2OZ0(I)=ALOG(2./ZNT(I))
821 ! PSIM2(I)=-10.*GZ2OZ0(I)
822 ! PSIM2(I)=AMAX1(PSIM2(I),-10.)
824 CQS2(I)=UST(I)*KARMAN/(ALOG(KARMAN*UST(I)*2.0 &
825 /XKA+2.0/ZL)-PSIH2(I))
826 CHS2(I)=UST(I)*KARMAN/(GZ2OZ0(I)-PSIH2(I))
832 ! IF(UST(I).GE.0.1) THEN
833 ! RMOL(I)=RMOL(I)*(-FLHC(I))/(UST(I)*UST(I)*UST(I))
835 ! RMOL(I)=RMOL(I)*(-FLHC(I))/(0.1*0.1*0.1)
841 END SUBROUTINE SFCLAY1D
843 !====================================================================
844 SUBROUTINE sfclayinit( allowed_to_read )
846 LOGICAL , INTENT(IN) :: allowed_to_read
853 PSIMTB(N)=2*ALOG(0.5*(1+X))+ALOG(0.5*(1+X*X))- &
854 2.*ATAN(X)+2.*ATAN(1.)
856 PSIHTB(N)=2*ALOG(0.5*(1+Y))
859 END SUBROUTINE sfclayinit
861 !-------------------------------------------------------------------
863 END MODULE module_sf_sfclay