SUBROUTINE SFCUPD(pres,hgt,temp,dewpt,q,theta, 1,9
+ u,v,sfctf,sfcdpf,orig,nlev,maxlev,
> kmod,pres_mod,orgtf,orgdpf,weightq)
IMPLICIT NONE
Logical weightq
C
C Mixes out lower portion of thermodynamic profile based on
C updated surface conditions provided by user.
C
C Important note: nlev can be changed by this routine.
C make sure all variables are updated so
C they match reported heights/press.
C
C Keith Brewster, March 1992
C OU SoM
c
c Modified Nov 1992, Richard Carpenter, Univ. of Okla.
c weightq: If true, weight modified mixing ratio. If false, set it
c const in the modified layer.
C
C Arguments
C
INTEGER maxlev
REAL pres(maxlev),hgt(maxlev),temp(maxlev),dewpt(maxlev),
+ q(maxlev),u(maxlev),v(maxlev),theta(maxlev)
INTEGER nlev, kmod
LOGICAL orig
C
C Constants
C
REAL RCp
PARAMETER (RCp = 0.286)
C
C Functions
C
REAL DWPTOQ,PR_DWPT
C
C Misc internal variables
C
REAL orgtf,sfctf,sfctk,sfcth, pres_mod
REAL wgt,qsum,wgtsum,dpavg,qavg,qmix
REAL orgdpf,sfcdpf,sfcdpc
REAL w1,w2,dth,elen
INTEGER nn,k,km1,kp1,ktop
C
C Get temperature update from user
C
orgtf=(temp(1)*9./5.) + 32.
WRITE(6,805) orgtf,' F', temp(1),' C'
805 FORMAT(' Sounding sfc temp:', 2(f6.1,a),
+ /,' Enter new sfc temp (F), -99 for no change: ')
read(5,*) sfctf
IF(sfctf .GT. -98.) THEN
orig=.false.
C
C Convert F to Kelvin
C
sfctk=((sfctf - 32.) * (5./9.)) + 273.15
C
C Find sfc theta
C
sfcth=sfctk*((1000./pres(1))**RCp)
IF(sfcth.GT.theta(1)) THEN
C
C Search through sounding to found where sfc theta intersects sounding
C
c kmod=ktop is the top of the modified layer. (RLC 11/13/92)
c
nn=nlev
DO k=2,nlev
IF(theta(k).GT.sfcth) THEN
C
C Make room for new level...move what's above this
C level up one index
C
CALL MOVLEV
(pres,k,nlev,maxlev)
CALL MOVLEV
(hgt,k,nlev,maxlev)
CALL MOVLEV
(temp,k,nlev,maxlev)
CALL MOVLEV
(theta,k,nlev,maxlev)
CALL MOVLEV
(dewpt,k,nlev,maxlev)
CALL MOVLEV
(q,k,nlev,maxlev)
CALL MOVLEV
(u,k,nlev,maxlev)
CALL MOVLEV
(v,k,nlev,maxlev)
C
C Note through the action of MOVLEV, what was at level k
C is now at kp1
C
ktop=k
km1=k-1
kp1=k+1
dth=theta(kp1)-theta(k-1)
w1=(sfcth-theta(k-1))/dth
w2=1.-w1
theta(k)=sfcth
pres(k )=w2*pres(km1) + w1*pres(kp1)
hgt(k ) =-9999.
q(k) =w2*q(km1) + w1*q(kp1)
dewpt(k)=PR_DWPT(q(k),pres(k))
u(k) =w2*u(km1) + w1*u(kp1)
v(k) =w2*v(km1) + w1*v(kp1)
temp(k)=(theta(k)*((pres(k)/1000.)**RCp)) - 273.15
IF(dewpt(k).GT.temp(k)) THEN
dewpt(k)=temp(k)
q(k) = DWPTOQ(pres(k),temp(k),dewpt(k))
END IF
nn=nlev+1
GO TO 25
END IF
END DO
25 CONTINUE
nlev=nn
c
c Update modified levels (do loop moved RLC 01/93)
c
Do k=2,ktop-1
theta(k)=sfcth
temp(k)=(theta(k)*((pres(k)/1000.)**RCp)) - 273.15
hgt(k)=-9999.
IF(dewpt(k).GT.temp(k)) THEN
dewpt(k)=temp(k)
q(k) = DWPTOQ(pres(k),temp(k),dewpt(k))
END IF
End Do
ELSE
ktop=1
END IF
C
C Update surface temperature itself
C
theta(1)=sfcth
temp(1)=sfctk-273.15
IF(dewpt(1).GT.temp(1)) THEN
dewpt(1)=temp(1)
q(1) = DWPTOQ(pres(1),temp(1),dewpt(1))
END IF
ELSE ! no temperature change at all
ktop=1
END IF
C
C Next, attend to the moisture update.
C Find mean Q in mixed layer.
C
IF(ktop.GT.1) THEN
wgt=0.5*(pres(1)-pres(2))
qsum=wgt*q(1)
wgtsum=wgt
k = 1
DO k=2,(ktop-1)
wgt=0.5*(pres(k-1)-pres(k+1))
qsum=qsum+wgt*q(k)
wgtsum=wgtsum+wgt
END DO
wgt=0.5*(pres(ktop-1)-pres(ktop)) !RLC 01/93
qsum=qsum+wgt*q(ktop)
wgtsum=wgtsum+wgt
k = ktop
IF(wgtsum.NE. 0.) THEN
qavg=qsum/wgtsum
ELSE
qavg=0.
END IF
ELSE
qavg=q(1)
END IF
C
C report average depwt in mixed layer as a surface dew-point
C in degrees F, and get user-updated surface dewpt
C
pres_mod = pres(ktop)
dpavg=PR_DWPT(qavg,pres(1))
orgdpf=(dpavg*9./5.) + 32.
WRITE(6,810) pres(ktop),orgdpf,' F',dpavg,' C'
810 FORMAT(' Mixed layer extends to',F8.1,' mb',/
+' Sfc dew-point from avg mixing ratio in mixed layer:',2(f6.1,a))
If (ktop.NE.1) Then
Print 811
811 Format (' Enter dew-point representative of mixed layer (F),',
+/' Use -99. for no change in moisture.')
Else
Print *, 'No mixed layer'
Return
End If
C
read(5,*) sfcdpf
IF(sfcdpf .GT. -98.) THEN
orig=.false.
C
C Find mixing ratio corresponding to that dewpt
C
sfcdpc=(sfcdpf - 32.) * (5./9.)
qmix= DWPTOQ(pres(1),temp(1),sfcdpc)
C
C Set all mixing ratios in mixed layer to be equal to that q
C
If (.NOT. weightq) Then
Print *, '% Sfcupd: Mixing ratios in mixed layer set constant'
DO k=1,ktop
q(k)=qmix
END DO
C
C Instead, change mixing ratio to be a weighted mean of the
C specified sfc mixing ratio and the previously observed value.
C The e-length for the weighting is a function of the depth of the
C mixed layer for deep mixed layers (> 300. mb depth) mixed layer.
C
Else
Print *, '% Sfcupd: Mixing ratios in mixed layer are weighted'
elen=MAX(300.,(pres(1)-pres(ktop)))
elen=0.5*elen
q(1)=qmix
DO k=2,ktop
wgt=exp((pres(k)-pres(1))/elen)
q(k)=(wgt*qmix) + ((1.-wgt)*q(k))
END DO
End If
C
C Convert new mixing ratios to dewpts
C
CALL CALDEWP
(pres,q,dewpt,ktop,maxlev)
END IF
C
C Check for consistency with temperature profile
C
DO k=1,ktop
IF(dewpt(k).GT.temp(k)) THEN
dewpt(k) = (temp(k) - 0.2) ! not quite saturated
q(k) = DWPTOQ(pres(k),temp(k),dewpt(k))
END IF
END DO
C
C Done
c
kmod = ktop
If (sfctf.EQ.-99.) sfctf = orgtf
If (sfcdpf.EQ.-99.) sfcdpf = orgdpf
C
RETURN
END
C
SUBROUTINE MOVLEV(Z,k,nlev,maxlev) 8
IMPLICIT NONE
C
C Arguments
C
INTEGER k,nlev,maxlev
REAL Z(maxlev)
C
C Misc internal variables
C
INTEGER i
C
DO i=nlev,k,-1
Z(i+1)=Z(i)
END DO
RETURN
END