!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
! version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
***S/P LIN_SGOFLX1_AD
*
subroutine lin_sgoflx1_ad(uu,vv,utend,vtend, 1,34
+ tth,ttf,ss,ssh,
+ uu5,vv5,tth5,ttf5,
+ ilev,lref,ilg,il1,il2,
+ grav,rgas,rgocp,tau,taufac,
+ gc,height,slope,xcent,mtdir,
+ psurf,fcor,
+ gwdrag,blocking,orolift,leewave,
+ aa1,aa2,applytend)
*
#include "phy_macros_f.h"
#include "impnone.cdk"
*
*
logical gwdrag,blocking,orolift,leewave,applytend
*
integer ilev,lref,ilg,il1,il2
real grav,rgas,rgocp,tau,taufac
real*8 aa1,aa2
real*8 uu(ilg,ilev), vv(ilg,ilev), utend(ilg,ilev),
+ vtend(ilg,ilev), tth(ilg,ilev), ttf(ilg,ilev),
+ uu5(ilg,ilev), vv5(ilg,ilev),
+ tth5(ilg,ilev), ttf5(ilg,ilev),
+ ss(ilg,ilev), ssh(ilg,ilev), gc(ilg),
+ height(ilg), slope(ilg), xcent(ilg),
+ mtdir(ilg), psurf(ilg), fcor(ilg)
*
*Author
* A. Zadra - May 2002
*
*Object
* Simplified version of subgrid orographic drag (sgoflx2) scheme:
* - reduced, non-smoothed buoyancy frequency
* - shortened gravity-wave drag (McFarlane 87)
* - shortened low-level blocking (Lott & Miller 97)
* - orographic lift (not yet included)
* - lee-wave breaking (not yet included)
*
*
*Arguments
*
*
**
AUTOMATIC ( VMOD5 , REAL*8 , (ILG ) )
AUTOMATIC ( UUB5 , REAL*8 , (ILG ) )
AUTOMATIC ( VVB5 , REAL*8 , (ILG ) )
AUTOMATIC ( UB5 , REAL*8 , (ILG ) )
AUTOMATIC ( VB5 , REAL*8 , (ILG ) )
AUTOMATIC ( VMODB5 , REAL*8 , (ILG ) )
AUTOMATIC ( UAV5 , REAL*8 , (ILG ) )
AUTOMATIC ( VAV5 , REAL*8 , (ILG ) )
AUTOMATIC ( VELAV5 , REAL*8 , (ILG ) )
AUTOMATIC ( DELZ5 , REAL*8 , (ILG ) )
AUTOMATIC ( HBLK5 , REAL*8 , (ILG ) )
AUTOMATIC ( FDIR5 , REAL*8 , (ILG ) )
AUTOMATIC ( PSI5 , REAL*8 , (ILG ) )
AUTOMATIC ( CPSI5 , REAL*8 , (ILG ) )
AUTOMATIC ( SPSI5 , REAL*8 , (ILG ) )
AUTOMATIC ( AMPD5 , REAL*8 , (ILG ) )
c
AUTOMATIC ( VMOD , REAL*8 , (ILG ) )
AUTOMATIC ( UUB , REAL*8 , (ILG ) )
AUTOMATIC ( VVB , REAL*8 , (ILG ) )
AUTOMATIC ( DRAG , INTEGER , (ILG ) )
AUTOMATIC ( UB , REAL*8 , (ILG ) )
AUTOMATIC ( VB , REAL*8 , (ILG ) )
AUTOMATIC ( VMODB , REAL*8 , (ILG ) )
AUTOMATIC ( ENV , REAL*8 , (ILG ) )
AUTOMATIC ( SLP2 , REAL*8 , (ILG ) )
AUTOMATIC ( SLPF , REAL*8 , (ILG ) )
AUTOMATIC ( GAMMA , REAL*8 , (ILG ) )
AUTOMATIC ( THETA , REAL*8 , (ILG ) )
AUTOMATIC ( IZT1 , INTEGER , (ILG ) )
AUTOMATIC ( IZT2 , INTEGER , (ILG ) )
AUTOMATIC ( IZT3 , INTEGER , (ILG ) )
AUTOMATIC ( IZB , INTEGER , (ILG ) )
AUTOMATIC ( UAV , REAL*8 , (ILG ) )
AUTOMATIC ( VAV , REAL*8 , (ILG ) )
AUTOMATIC ( VELAV , REAL*8 , (ILG ) )
AUTOMATIC ( DELZ , REAL*8 , (ILG ) )
AUTOMATIC ( FDIR , REAL*8 , (ILG ) )
AUTOMATIC ( BLOFF , REAL*8 , (ILG ) )
AUTOMATIC ( PSI , REAL*8 , (ILG ) )
AUTOMATIC ( CPSI , REAL*8 , (ILG ) )
AUTOMATIC ( SPSI , REAL*8 , (ILG ) )
AUTOMATIC ( AMPD , REAL*8 , (ILG ) )
c
AUTOMATIC ( UTEND5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTEND5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( U5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( V5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( TF5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( TH5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( AUX5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( BVFREQ5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDGWD5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDGWD5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VELN5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ASQ5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ASQI5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ASQS5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( DEPFAC5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( GRAD5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( DENFAC5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ETA , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ZB5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( FVERT5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( IMPAUX5 , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDLLB5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDLLB5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDLFT5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDLFT5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDLWB5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDLWB5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDTOT5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDTOT5, REAL*8 , (ILG,ILEV) )
AUTOMATIC ( AUX , REAL*8 , (ILG,ILEV) )
c
AUTOMATIC ( U , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( V , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( TF , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( TH , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( S , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( SH , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( BVFREQ , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDGWD , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDGWD , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VELN , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ASQ , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ASQI , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ASQS , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( DEPFAC , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( GRAD , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( DENFAC , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( ZB , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( FVERT , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( IMPAUX , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDLLB , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDLLB , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDLFT , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDLFT , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDLWB , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDLWB , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( UTENDTOT , REAL*8 , (ILG,ILEV) )
AUTOMATIC ( VTENDTOT , REAL*8 , (ILG,ILEV) )
**
integer i,l,ii,len,lrefm,jyes,jno
real*8 dz,dz5,uparl5,piotwo,vmin,v0,hmin,zero,unit,cdblk
**
vmin = 2.
v0 = 1.e-12
hmin = 3.
zero = 0.
unit = 1.
cdblk = 1.
**
len = il2 - il1 + 1
lref = ilev
lrefm = lref - 1
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c *** TRAJECTORY ***
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c INITIAL STEPS
c
c--------------------------------------------------------------------
c Initialize total tendency
c
do l=1,ilev
do i=il1,il2
utend5(i,l) = zero
vtend5(i,l) = zero
enddo
enddo
c-------------------------------------------------------------------
c Find and gather active grid columns
c
c Wind and unit vector at reference level LREFM:
c
do i=il1,il2
vmod5(i) = sqrt ( uu5(i,lrefm)**2 + vv5(i,lrefm)**2 )
if (vmod5(i).le.vmin) vmod5(i) = vmin
uub5(i) = uu5(i,lrefm)/vmod5(i)
vvb5(i) = vv5(i,lrefm)/vmod5(i)
enddo
c
c-------------------------------------------------------------------
c Gather columns where orographic drag is active
c
jyes = 0
jno = len + 1
c
do i=il1,il2
if ( gc(i).eq.-1. .and. vmod5(i).gt.vmin .and.
+ height(i).ge.hmin ) then
jyes = jyes + 1
drag(jyes) = i
else
jno = jno - 1
drag(jno) = i
endif
enddo
c
c Check if there is AT LEAST ONE active column
c
if (jyes.le.0) then
goto 600
endif
c
do i=1,len
ii = drag(i) + il1 - 1
ub5(i) = uub5(ii)
vb5(i) = vvb5(ii)
vmodb5(i) = vmod5(ii)
env(i) = height(ii)
slp2(i) = slope(ii)
gamma
(i) = xcent(ii)
theta(i) = mtdir(ii)
enddo
c
do i=1,len
if (env(i) .lt. hmin) then
slpf(i) = slp2(i)/hmin
else
slpf(i) = slp2(i)/env(i)
endif
enddo
c
do l=1,ilev
do i=1,len
ii = drag(i) + il1 - 1
u5(i,l) = uu5(ii,l)
v5(i,l) = vv5(ii,l)
tf5(i,l) = ttf5(ii,l)
th5(i,l) = tth5(ii,l)
s(i,l) = ss(ii,l)
sh(i,l) = ssh(ii,l)
enddo
enddo
c
c--------------------------------------------------------------------
c Recalculate temperature at intermediate levels
c using a geometric average:
c
do l=1,ilev-1
do i=1,len
th5(i,l) = sqrt( tf5(i,l)*tf5(i,l+1) )
enddo
enddo
do i=1,len
th5(i,ilev) = tf5(i,ilev)
enddo
c
c--------------------------------------------------------------------
c Calculate BF frequency at all active levels (no smoothing):
c
do l=2,ilev
do i=1,len
aux5(i,l) = ( grav*grav/(rgas*tf5(i,l)) )*
+ ( rgocp - (s(i,l)/tf5(i,l))*
+ (th5(i,l)- th5(i,l-1))/
+ (sh(i,l) - sh(i,l-1)) )
if (aux5(i,l).le.1.0e-10) then
bvfreq5(i,l) = 1.0e-5
else
bvfreq5(i,l) = sqrt( aux5(i,l) )
endif
enddo
enddo
do i=1,len
bvfreq5(i,1) = bvfreq5(i,2)
enddo
c
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c GRAVITY-WAVE DRAG
c
c--------------------------------------------------------------------
c Initialize tendencies
do l=1,ilev
do i=1,len
utendgwd5(i,l) = zero
vtendgwd5(i,l) = zero
enddo
enddo
c
if (gwdrag) then
c
c--------------------------------------------------------------------
c Project wind field on reference wind:
c
do l=1,ilev
do i=1,jyes
veln5(i,l) = u5(i,l)*ub5(i)+v5(i,l)*vb5(i)
if (veln5(i,l).le.v0) veln5(i,l) = v0
enddo
enddo
c
c--------------------------------------------------------------------
c Stress field
c
c Compute stress at reference level:
c
do i=1,jyes
asq5(i,lref) = env(i)*env(i)
asqs5(i,lref) = env(i)*env(i)
asqi5(i,lref) = env(i)*env(i)
depfac5(i,lref) = taufac*grav
+ *(bvfreq5(i,lrefm)*s(i,lrefm)*vmodb5(i)/tf5(i,lrefm))
+ *asq5(i,lref)/rgas
enddo
c
c Compute stress at other levels (bottom-up):
c
do l=lrefm,1,-1
do i=1,jyes
asqi5(i,l) = asq5(i,l+1)
+ *(bvfreq5(i,l+1)*s(i,l+1)*veln5(i,l+1)/tf5(i,l+1))
+ /(bvfreq5(i,l) *s(i,l) *veln5(i,l) /tf5(i,l) )
if (veln5(i,l).ge.1.) then
asqs5(i,l) = 0.5*(veln5(i,l)/bvfreq5(i,l))**2
else
asqs5(i,l) = 1.e-6
endif
if (asqi5(i,l).le.asqs5(i,l)) then
asq5(i,l) = asqi5(i,l)
else
asq5(i,l) = asqs5(i,l)
endif
depfac5(i,l) = taufac*grav
+ *(bvfreq5(i,l)*s(i,l)*veln5(i,l)/tf5(i,l))
+ *asq5(i,l)/rgas
enddo
enddo
do i=1,jyes
depfac5(i,lref) = depfac5(i,lrefm)
enddo
c
c--------------------------------------------------------------------
c Compute gwd tendencies:
c
do i=1,jyes
if ((depfac5(i,2) - depfac5(i,1)).gt.1.e-10) then
eta(i,1) = 1.
else
eta(i,1) = 0.
endif
c
grad5(i,1) = 2.*eta(i,1)*depfac5(i,1)
+ /( 2.*sh(i,1) + eta(i,1)*3.*tau*depfac5(i,1)/veln5(i,1) )
utendgwd5(i,1) = -ub5(i)*grad5(i,1)
vtendgwd5(i,1) = -vb5(i)*grad5(i,1)
denfac5(i,1) = grad5(i,1)*3.*tau*depfac5(i,1)/veln5(i,1)
utendgwd5(i,lref) = zero
vtendgwd5(i,lref) = zero
enddo
c
do l=2,lrefm
do i=1,jyes
if ((depfac5(i,l) - depfac5(i,l-1)).gt.1.e-10) then
eta(i,l) = 1.
else
eta(i,l) = 0.
endif
grad5(i,l) = ( 2.*depfac5(i,l)-2.*depfac5(i,l-1) +
+ eta(i,l)*denfac5(i,l-1) )/
+ ( 2.*(sh(i,l)-sh(i,l-1)) +
+ eta(i,l)*3.*tau*depfac5(i,l)/veln5(i,l) )
utendgwd5(i,l) = -ub5(i)*grad5(i,l)
vtendgwd5(i,l) = -vb5(i)*grad5(i,l)
denfac5(i,l) = grad5(i,l)*3.*tau*depfac5(i,l)/veln5(i,l)
enddo
enddo
c
endif
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c LOW-LEVEL BLOCKING
c
c--------------------------------------------------------------------
c Initialize arrays
do l=1,ilev
do i=1,len
zb5(i,l) = zero
utendllb5(i,l) = zero
vtendllb5(i,l) = zero
enddo
enddo
c
do i=1,len
izt1(i) = ilev-1
izt2(i) = ilev
izt3(i) = ilev
hblk5(i) = zero
izb(i) = ilev
uav5(i) = v0
vav5(i) = v0
velav5(i) = v0
delz5(i) = zero
fdir5(i) = unit
bloff(i) = 0
enddo
c
if (blocking) then
c--------------------------------------------------------------------
c Build elevation field:
do i=1,jyes
zb5(i,ilev) = -(rgas/grav)*tf5(i,ilev)*log(sh(i,ilev))
enddo
do l=ilev-1,1,-1
do i=1,jyes
zb5(i,l) = zb5(i,l+1) +
+ (rgas/grav)*tf5(i,l)*log(sh(i,l+1)/sh(i,l))
enddo
enddo
c
c--------------------------------------------------------------------
c Blocking height
c
c Find maximum blocking level, upper level for averaging and
c lower level for averaging:
do l=ilev-2,1,-1
do i=1,jyes
if (zb5(i,l).lt.(1.5*env(i))) izt3(i) = l
if (zb5(i,l).lt. env(i) ) izt1(i) = l
enddo
enddo
c
do l=ilev-1,1,-1
do i=1,jyes
if (zb5(i,l).lt.(0.5*env(i))) izt2(i) = l
enddo
enddo
c
c Compute averages:
do l=ilev,2,-1
do i=1,jyes
if (l.le.izt2(i) .and. l.ge.izt1(i)) then
dz5 = zb5(i,l-1) - zb5(i,l)
delz5(i) = delz5(i) + dz5
uav5(i) = uav5(i) + dz5*u5(i,l)
vav5(i) = vav5(i) + dz5*v5(i,l)
endif
enddo
enddo
do i=1,jyes
uav5(i) = uav5(i)/delz5(i)
vav5(i) = vav5(i)/delz5(i)
if (abs(vav5(i)).lt.v0 .and. abs(uav5(i)).lt.v0) then
velav5(i) = v0
else
velav5(i) = sqrt( uav5(i)**2 + vav5(i)**2 )
endif
enddo
c
c Compute blocking height and blocking level:
c
do l=2,ilev
do i=1,jyes
if (l.ge.izt3(i) .and. bloff(i).eq.0) then
dz5 = zb5(i,l-1) - zb5(i,l)
uparl5 = (u5(i,l)*uav5(i) + v5(i,l)*vav5(i))/velav5(i)
if (uparl5 .lt. v0) then
izb(i) = l-1
bloff(i) = 1
else
hblk5(i) = hblk5(i) + dz5*bvfreq5(i,l)/uparl5
if (hblk5(i) .gt. 0.5) then
izb(i) = l-1
bloff(i) = 1
endif
endif
endif
enddo
enddo
c
c--------------------------------------------------------------------
c Compute directional factor:
c
piotwo = .5*acos(-1.)
do i=1,jyes
c
c Angle between mean wind and topography:
if ( abs(vav5(i)) .lt. v0 .and. abs(uav5(i)) .lt. v0) then
psi5(i) = zero
else
psi5(i) = theta(i) - atan2(vav5(i),uav5(i))
if (psi5(i) .gt. piotwo ) psi5(i) = psi5(i) - 2.*piotwo
if (psi5(i) .lt. (-piotwo)) psi5(i) = psi5(i) + 2.*piotwo
endif
cpsi5(i) = ( cos(psi5(i)) )**2
spsi5(i) = ( sin(psi5(i)) )**2
c
c Directional factor:
ampd5(i) = cpsi5(i) + gamma
(i)*spsi5(i)
if (ampd5(i) .lt. 1.e-10) then
ampd5(i) = zero
else
ampd5(i) = 2. - ( gamma
(i)*cpsi5(i) + spsi5(i) )
+ /( cpsi5(i) + gamma
(i)*spsi5(i) )
if (ampd5(i).lt.zero) ampd5(i) = zero
endif
fdir5(i) = ampd5(i)*
+ ( (1.-.18*gamma
(i) -.04*(gamma
(i)**2))*cpsi5(i)
+ +( .48*gamma
(i) +.30*(gamma
(i)**2))*spsi5(i) )
c
enddo
c--------------------------------------------------------------------
c Compute llb tendencies:
c
do l=ilev,1,-1
do i=1,jyes
if ( velav5(i).ge.vmin .and.
+ l.gt.izb(i) .and. zb5(i,izb(i)).ge.hmin ) then
c
c Vertical factor:
fvert5(i,l) = sqrt( (zb5(i,izb(i)) - zb5(i,l))
+ /(0.5*env(i) + zb5(i,l)) )
c
* Implicit calculation of llb tendencies:
*
impaux5(i,l) = 0.5*cdblk*slpf(i)*fdir5(i)*fvert5(i,l)
+ *sqrt(u5(i,l)*u5(i,l) + v5(i,l)*v5(i,l))
utendllb5(i,l) = -impaux5(i,l)*u5(i,l)
+ /(1.0+impaux5(i,l)*tau)
vtendllb5(i,l) = -impaux5(i,l)*v5(i,l)
+ /(1.0+impaux5(i,l)*tau)
*
endif
enddo
enddo
c
endif
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c OROGRAPHIC LIFT
c
c--------------------------------------------------------------------
c Initialize arrays
do l=1,ilev
do i=1,len
utendlft5(i,l) = zero
vtendlft5(i,l) = zero
enddo
enddo
c
if (orolift) then
c
endif
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c LEE-WAVE BREAKING
c
c--------------------------------------------------------------------
c Initialize arrays
do l=1,ilev
do i=1,len
utendlwb5(i,l) = zero
vtendlwb5(i,l) = zero
enddo
enddo
c
if (leewave) then
c
endif
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c TOTAL DRAG AND RESULTING WIND FIELD
c
c--------------------------------------------------------------------
do l=1,ilev
do i=1,len
utendtot5(i,l) = zero
vtendtot5(i,l) = zero
enddo
enddo
c
c Add and scatter tendencies
do l=1,ilev
do i=1,jyes
utendtot5(i,l) = utendgwd5(i,l) +
+ utendllb5(i,l) +
+ utendlft5(i,l) +
+ utendlwb5(i,l)
vtendtot5(i,l) = vtendgwd5(i,l) +
+ vtendllb5(i,l) +
+ vtendlft5(i,l) +
+ vtendlwb5(i,l)
enddo
enddo
c
do l=1,ilev
do i=1,len
ii = drag(i) + il1 - 1
utend5(ii,l) = utendtot5(i,l)
vtend5(ii,l) = vtendtot5(i,l)
enddo
enddo
c
c--------------------------------------------------------------------
600 continue
c--------------------------------------------------------------------
c
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c *** ADJOINT MODEL ***
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c Initialize adjoint fields
c
dz = 0.
c
do i=1,ilg
fdir(i) = 0.
spsi(i) = 0.
cpsi(i) = 0.
ampd(i) = 0.
psi
(i) = 0.
uav(i) = 0.
vav(i) = 0.
velav(i) = 0.
delz(i) = 0.
vb(i) = 0.
ub(i) = 0.
vmodb(i) = 0.
vmod(i) = 0.
vvb(i) = 0.
uub(i) = 0.
enddo
c
do l=1,ilev
do i=1,ilg
vtendtot(i,l) = 0.
utendtot(i,l) = 0.
vtendlwb(i,l) = 0.
vtendlft(i,l) = 0.
vtendllb(i,l) = 0.
vtendgwd(i,l) = 0.
utendlwb(i,l) = 0.
utendlft(i,l) = 0.
utendllb(i,l) = 0.
utendgwd(i,l) = 0.
impaux(i,l) = 0.
v(i,l) = 0.
u(i,l) = 0.
fvert(i,l) = 0.
zb(i,l) = 0.
veln(i,l) = 0.
depfac(i,l) = 0.
grad(i,l) = 0.
denfac(i,l) = 0.
asq(i,l) = 0.
bvfreq(i,l) = 0.
asqi(i,l) = 0.
asqs(i,l) = 0.
aux(i,l) = 0.
tf(i,l) = 0.
th(i,l) = 0.
enddo
enddo
c
c
if (applytend) then
c
do l=ilev,1,-1
do i=il2,il1,-1
vtend(i,l) = vtend(i,l) + tau*vv(i,l)
vv(i,l) = vv(i,l)
utend(i,l) = utend(i,l) + tau*uu(i,l)
uu(i,l) = uu(i,l)
enddo
enddo
c
endif
c
if (jyes.le.0) then
goto 700
endif
c
do l=ilev,1,-1
do i=len,1,-1
ii = drag(i) + il1 - 1
vtendtot(i,l) = vtendtot(i,l) + vtend(ii,l)
vtend(ii,l) = 0.
utendtot(i,l) = utendtot(i,l) + utend(ii,l)
utend(ii,l) = 0.
enddo
enddo
c
do l=ilev,1,-1
do i=len,1,-1
vtendlwb(i,l) = vtendlwb(i,l) + vtendtot(i,l)
vtendlft(i,l) = vtendlft(i,l) + vtendtot(i,l)
vtendllb(i,l) = vtendllb(i,l) + vtendtot(i,l)
vtendgwd(i,l) = vtendgwd(i,l) + vtendtot(i,l)
vtendtot(i,l) = 0.
utendlwb(i,l) = utendlwb(i,l) + utendtot(i,l)
utendlft(i,l) = utendlft(i,l) + utendtot(i,l)
utendllb(i,l) = utendllb(i,l) + utendtot(i,l)
utendgwd(i,l) = utendgwd(i,l) + utendtot(i,l)
utendtot(i,l) = 0.
enddo
enddo
c
do l=ilev,1,-1
do i=len,1,-1
vtendtot(i,l) = 0.
utendtot(i,l) = 0.
enddo
enddo
c
c LEE-WAVE BREAKING
if (leewave) then
c
endif
do l=ilev,1,-1
do i=len,1,-1
vtendlwb(i,l) = 0.
utendlwb(i,l) = 0.
enddo
enddo
c
c OROGRAPHIC LIFT
if (orolift) then
c
endif
do l=ilev,1,-1
do i=len,1,-1
vtendlft(i,l) = 0.
utendlft(i,l) = 0.
enddo
enddo
c
c LOW-LEVEL BLOCKING
if (blocking) then
c
do l=1,ilev
do i=jyes,1,-1
if ( velav5(i).ge.vmin .and.
+ l.gt.izb(i) .and. zb5(i,izb(i)).ge.hmin ) then
impaux(i,l) = impaux(i,l)
+ -vtendllb(i,l)*v5(i,l)/((1.0+impaux5(i,l)*tau)**2)
v(i,l) = v(i,l)
+ -vtendllb(i,l)*impaux5(i,l)/(1.0+impaux5(i,l)*tau)
vtendllb(i,l) = 0.
*
impaux(i,l) = impaux(i,l)
+ -utendllb(i,l)*u5(i,l)/((1.0+impaux5(i,l)*tau)**2)
u(i,l) = u(i,l)
+ -utendllb(i,l)*impaux5(i,l)/(1.0+impaux5(i,l)*tau)
utendllb(i,l) = 0.
*
v(i,l) = v(i,l)
+ +impaux(i,l)*0.5*cdblk*slpf(i)*fdir5(i)*fvert5(i,l)
+ *v5(i,l)/sqrt(u5(i,l)*u5(i,l) + v5(i,l)*v5(i,l))
u(i,l) = u(i,l)
+ +impaux(i,l)*0.5*cdblk*slpf(i)*fdir5(i)*fvert5(i,l)
+ *u5(i,l)/sqrt(u5(i,l)*u5(i,l) + v5(i,l)*v5(i,l))
fvert(i,l) = fvert(i,l)
+ +impaux(i,l)*aa2*0.5*cdblk*slpf(i)*fdir5(i)
+ *sqrt(u5(i,l)*u5(i,l) + v5(i,l)*v5(i,l))
fdir(i) = fdir(i)
+ +impaux(i,l)*aa1*0.5*cdblk*slpf(i)*fvert5(i,l)
+ *sqrt(u5(i,l)*u5(i,l) + v5(i,l)*v5(i,l))
impaux(i,l) = 0.
c
zb(i,l) = zb(i,l)
+ - fvert(i,l)*.5*fvert5(i,l)*
+ ( 1./(zb5(i,izb(i)) - zb5(i,l)) +
+ 1./(0.5*env(i) + zb5(i,l)) )
zb(i,izb(i)) = zb(i,izb(i))
+ + fvert(i,l)*.5*fvert5(i,l)/
+ (zb5(i,izb(i)) - zb5(i,l))
fvert(i,l) = 0.
c
endif
enddo
enddo
c
do i=jyes,1,-1
spsi(i) = spsi(i)
+ + fdir(i)*ampd5(i)*
+ ( .48*gamma
(i) +.30*(gamma
(i)**2))
cpsi(i) = cpsi(i)
+ + fdir(i)*ampd5(i)*
+ (1.-.18*gamma
(i) -.04*(gamma
(i)**2))
ampd(i) = ampd(i)
+ + fdir(i)*
+ ( (1.-.18*gamma
(i) -.04*(gamma
(i)**2))*cpsi5(i)
+ +( .48*gamma
(i) +.30*(gamma
(i)**2))*spsi5(i) )
fdir(i) = 0.
c
if ((cpsi5(i) + gamma
(i)*spsi5(i)) .lt. 1.e-10) then
ampd(i) = 0.
else
if (ampd5(i).lt.zero) ampd(i) = 0.
spsi(i) = spsi(i)
+ + ampd(i)*(
+ gamma
(i)*( gamma
(i)*cpsi5(i) + spsi5(i) )/
+ (( cpsi5(i) + gamma
(i)*spsi5(i) )**2) -
+ 1./( cpsi5(i) + gamma
(i)*spsi5(i) ) )
cpsi(i) = cpsi(i)
+ + ampd(i)*(
+ ( gamma
(i)*cpsi5(i) + spsi5(i) )/
+ (( cpsi5(i) + gamma
(i)*spsi5(i) )**2) -
+ gamma
(i)/( cpsi5(i) + gamma
(i)*spsi5(i) ) )
ampd(i) = 0.
endif
psi
(i) = psi
(i) + spsi(i)*sin(2*psi5(i))
spsi(i) = 0.
psi
(i) = psi
(i) - cpsi(i)*sin(2*psi5(i))
cpsi(i) = 0.
if ( abs(vav5(i)) .lt. v0 .and. abs(uav5(i)) .lt. v0) then
psi
(i) = 0.
else
uav(i) = uav(i) + psi
(i)*vav5(i)/(velav5(i)**2)
vav(i) = vav(i) - psi
(i)*uav5(i)/(velav5(i)**2)
psi
(i) = 0.
endif
enddo
c
do i=jyes,1,-1
if (abs(vav5(i)).lt.v0 .and. abs(uav5(i)).lt.v0) then
velav(i) = 0.
else
vav(i) = vav(i) + velav(i)*vav5(i)/velav5(i)
uav(i) = uav(i) + velav(i)*uav5(i)/velav5(i)
velav(i) = 0.
endif
delz(i) = delz(i) - vav(i)*vav5(i)/delz5(i)
vav(i) = vav(i)/delz5(i)
delz(i) = delz(i) - uav(i)*uav5(i)/delz5(i)
uav(i) = uav(i)/delz5(i)
enddo
c
do l=2,ilev
do i=jyes,1,-1
if (l.le.izt2(i) .and. l.ge.izt1(i)) then
dz5 = zb5(i,l-1) - zb5(i,l)
v(i,l) = v(i,l) + vav(i)*dz5
dz = dz + vav(i)*v5(i,l)
vav(i) = vav(i)
u(i,l) = u(i,l) + uav(i)*dz5
dz = dz + uav(i)*u5(i,l)
uav(i) = uav(i)
dz = dz + delz(i)
delz(i) = delz(i)
zb(i,l) = zb(i,l) - dz
zb(i,l-1) = zb(i,l-1) + dz
dz = 0.
endif
enddo
enddo
c
do l=1,ilev-1
do i=jyes,1,-1
tf(i,l) = tf(i,l)
+ + zb(i,l)*(rgas/grav)*log(sh(i,l+1)/sh(i,l))
zb(i,l+1) = zb(i,l+1) + zb(i,l)
zb(i,l) = 0.
enddo
enddo
do i=jyes,1,-1
tf(i,ilev) = tf(i,ilev)
+ - zb(i,ilev)*(rgas/grav)*log(sh(i,ilev))
zb(i,ilev) = 0.
enddo
c
endif
c
do i=len,1,-1
uav(i) = 0.
vav(i) = 0.
velav(i) = 0.
delz(i) = 0.
fdir(i) = 0.
enddo
c
do l=ilev,1,-1
do i=len,1,-1
zb(i,l) = 0.
utendllb(i,l) = 0.
vtendllb(i,l) = 0.
enddo
enddo
c
c GRAVITY-WAVE DRAG
if (gwdrag) then
c
do l=lrefm,2,-1
do i=jyes,1,-1
veln(i,l) = veln(i,l)
+ - denfac(i,l)*denfac5(i,l)/veln5(i,l)
depfac(i,l) = depfac(i,l)
+ + denfac(i,l)*denfac5(i,l)/depfac5(i,l)
grad(i,l) = grad(i,l)
+ + denfac(i,l)*3.*tau*depfac5(i,l)/veln5(i,l)
denfac(i,l) = 0.
c
grad(i,l) = grad(i,l) - vtendgwd(i,l)*vb5(i)
vb(i) = vb(i) - vtendgwd(i,l)*grad5(i,l)
vtendgwd(i,l) = 0.
c
grad(i,l) = grad(i,l) - utendgwd(i,l)*ub5(i)
ub(i) = ub(i) - utendgwd(i,l)*grad5(i,l)
utendgwd(i,l) = 0.
c
veln(i,l) = veln(i,l)
+ + grad(i,l)*grad5(i,l)*eta(i,l)*3.*tau*
+ depfac5(i,l)*(1./(veln5(i,l)**2))/
+ ( 2.*(sh(i,l)-sh(i,l-1)) +
+ eta(i,l)*3.*tau*depfac5(i,l)/veln5(i,l) )
depfac(i,l) = depfac(i,l)
+ + grad(i,l)*( 2./
+ ( 2.*(sh(i,l)-sh(i,l-1)) +
+ eta(i,l)*3.*tau*depfac5(i,l)/veln5(i,l) )
+ -(grad5(i,l)*eta(i,l)*3.*tau/veln5(i,l))/
+ ( 2.*(sh(i,l)-sh(i,l-1)) +
+ eta(i,l)*3.*tau*depfac5(i,l)/veln5(i,l) ) )
denfac(i,l-1) = denfac(i,l-1)
+ + grad(i,l)*eta(i,l)/
+ ( 2.*(sh(i,l)-sh(i,l-1)) +
+ eta(i,l)*3.*tau*depfac5(i,l)/veln5(i,l) )
depfac(i,l-1) = depfac(i,l-1)
+ - grad(i,l)*2./
+ ( 2.*(sh(i,l)-sh(i,l-1)) +
+ eta(i,l)*3.*tau*depfac5(i,l)/veln5(i,l) )
grad(i,l) = 0.
enddo
enddo
c
do i=jyes,1,-1
vtendgwd(i,lref) = 0.
utendgwd(i,lref) = 0.
c
veln(i,1) = veln(i,1)
+ - denfac(i,1)*denfac5(i,1)/veln5(i,1)
depfac(i,1) = depfac(i,1)
+ + denfac(i,1)*denfac5(i,1)/depfac5(i,1)
grad(i,1) = grad(i,1)
+ + denfac(i,1)*3.*tau*depfac5(i,1)/veln5(i,1)
denfac(i,1) = 0.
c
grad(i,1) = grad(i,1) - vtendgwd(i,1)*vb5(i)
vb(i) = vb(i) - vtendgwd(i,1)*grad5(i,1)
vtendgwd(i,1) = 0.
c
grad(i,1) = grad(i,1) - utendgwd(i,1)*ub5(i)
ub(i) = ub(i) - utendgwd(i,1)*grad5(i,1)
utendgwd(i,1) = 0.
c
veln(i,1) = veln(i,1)
+ + grad(i,1)*grad5(i,1)*eta(i,1)*3.*tau*
+ depfac5(i,1)*(1./(veln5(i,1)**2))/
+ ( 2.*sh(i,1)+eta(i,1)*3.*tau*
+ depfac5(i,1)/veln5(i,1) )
depfac(i,1) = depfac(i,1)
+ + grad(i,1)*( 2.*eta(i,1)/
+ ( 2.*sh(i,1)+eta(i,1)*3.*tau*depfac5(i,1)
+ /veln5(i,1) )
+ -(grad5(i,1)*eta(i,1)*3.*tau/veln5(i,1))/
+ ( 2.*sh(i,1)+eta(i,1)*3.*tau*depfac5(i,1)
+ /veln5(i,1) ) )
grad(i,1) = 0.
enddo
c
do i=jyes,1,-1
depfac(i,lrefm) = depfac(i,lrefm) + depfac(i,lref)
depfac(i,lref) = 0.
enddo
c
do l=1,lrefm
do i=jyes,1,-1
asq(i,l) = asq(i,l)
+ + depfac(i,l)*depfac5(i,l)/asq5(i,l)
tf(i,l) = tf(i,l)
+ - depfac(i,l)*depfac5(i,l)/tf5(i,l)
veln(i,l) = veln(i,l)
+ + depfac(i,l)*depfac5(i,l)/veln5(i,l)
bvfreq(i,l) = bvfreq(i,l)
+ + depfac(i,l)*depfac5(i,l)/bvfreq5(i,l)
depfac(i,l) = 0.
if (asqi5(i,l).le.asqs5(i,l)) then
asqi(i,l) = asqi(i,l) + asq(i,l)
asq(i,l) = 0.
else
asqs(i,l) = asqs(i,l) + asq(i,l)
asq(i,l) = 0.
endif
if (veln5(i,l).ge.1.) then
bvfreq(i,l) = bvfreq(i,l)
+ - asqs(i,l)*2.*asqs5(i,l)/bvfreq5(i,l)
veln(i,l) = veln(i,l)
+ + asqs(i,l)*2.*asqs5(i,l)/veln5(i,l)
asqs(i,l) = 0.
else
asqs(i,l) = 0.
endif
tf(i,l) = tf(i,l)
+ + asqi(i,l)*asqi5(i,l)/tf5(i,l)
veln(i,l) = veln(i,l)
+ - asqi(i,l)*asqi5(i,l)/veln5(i,l)
bvfreq(i,l) = bvfreq(i,l)
+ - asqi(i,l)*asqi5(i,l)/bvfreq5(i,l)
tf(i,l+1) = tf(i,l+1)
+ - asqi(i,l)*asqi5(i,l)/tf5(i,l+1)
veln(i,l+1) = veln(i,l+1)
+ + asqi(i,l)*asqi5(i,l)/veln5(i,l+1)
bvfreq(i,l+1) = bvfreq(i,l+1)
+ + asqi(i,l)*asqi5(i,l)/bvfreq5(i,l+1)
asq(i,l+1) = asq(i,l+1)
+ + asqi(i,l)*asqi5(i,l)/asq5(i,l+1)
asqi(i,l) = 0.
enddo
enddo
c
do i=jyes,1,-1
asq(i,lref) = asq(i,lref)
+ + depfac(i,lref)*depfac5(i,lref)/asq5(i,lref)
tf(i,lrefm) = tf(i,lrefm)
+ - depfac(i,lref)*depfac5(i,lref)/tf5(i,lrefm)
vmodb(i) = vmodb(i)
+ + depfac(i,lref)*depfac5(i,lref)/vmodb5(i)
bvfreq(i,lrefm) = bvfreq(i,lrefm)
+ + depfac(i,lref)*depfac5(i,lref)/bvfreq5(i,lrefm)
depfac(i,lref) = 0.
c
asqi(i,lref) = 0.
asqs(i,lref) = 0.
asq(i,lref) = 0.
enddo
c
do l=ilev,1,-1
do i=jyes,1,-1
if (veln5(i,l).le.v0) veln(i,l) = 0.
vb(i) = vb(i) + veln(i,l)*v5(i,l)
v(i,l) = v(i,l) + veln(i,l)*vb5(i)
ub(i) = ub(i) + veln(i,l)*u5(i,l)
u(i,l) = u(i,l) + veln(i,l)*ub5(i)
veln(i,l) = 0.
enddo
enddo
c
endif
c
do l=ilev,1,-1
do i=len,1,-1
vtendgwd(i,l) = 0.
utendgwd(i,l) = 0.
enddo
enddo
c
do i=len,1,-1
bvfreq(i,2) = bvfreq(i,2) + bvfreq(i,1)
bvfreq(i,1) = 0.
enddo
c
do l=ilev,2,-1
do i=len,1,-1
if (aux5(i,l).le.1.0e-10) then
bvfreq(i,l) = 0.
else
aux(i,l) = aux(i,l)
+ + bvfreq(i,l)*0.5/sqrt( aux5(i,l) )
bvfreq(i,l) = 0.
endif
th(i,l-1) = th(i,l-1)
+ + aux(i,l)*(grav*grav/(rgas*tf5(i,l)))*
+ (s(i,l)/tf5(i,l))/(sh(i,l) - sh(i,l-1))
th(i,l) = th(i,l)
+ - aux(i,l)*(grav*grav/(rgas*tf5(i,l)))*
+ (s(i,l)/tf5(i,l))/(sh(i,l) - sh(i,l-1))
tf(i,l) = tf(i,l)
+ + aux(i,l)*( (grav*grav/(rgas*tf5(i,l)))*
+ (s(i,l)/(tf5(i,l)**2))*
+ (th5(i,l)-th5(i,l-1))/(sh(i,l)-sh(i,l-1))
+ - aux5(i,l)/tf5(i,l) )
aux(i,l) = 0.
enddo
enddo
c
do i=len,1,-1
tf(i,ilev) = tf(i,ilev) + th(i,ilev)
th(i,ilev) = 0.
enddo
do l=ilev-1,1,-1
do i=len,1,-1
tf(i,l+1) = tf(i,l+1)
+ + th(i,l)*0.5*tf5(i,l)/th5(i,l)
tf(i,l) = tf(i,l)
+ + th(i,l)*0.5*tf5(i,l+1)/th5(i,l)
th(i,l) = 0.
enddo
enddo
c
do l=ilev,1,-1
do i=len,1,-1
ii = drag(i) + il1 - 1
tth(ii,l) = tth(ii,l) + th(i,l)
th(i,l) = 0.
ttf(ii,l) = ttf(ii,l) + tf(i,l)
tf(i,l) = 0.
vv(ii,l) = vv(ii,l) + v(i,l)
v(i,l) = 0.
uu(ii,l) = uu(ii,l) + u(i,l)
u(i,l) = 0.
enddo
enddo
c
do i=len,1,-1
ii = drag(i) + il1 - 1
vmod(ii) = vmod(ii) + vmodb(i)
vmodb(i) = 0.
vvb(ii) = vvb(ii) + vb(i)
vb(i) = 0.
uub(ii) = uub(ii) + ub(i)
ub(i) = 0.
enddo
c
700 continue
c
do i=il2,il1,-1
vmod(i) = vmod(i)
+ - vvb(i)*vvb5(i)/vmod5(i)
vv(i,lrefm) = vv(i,lrefm)
+ + vvb(i)/vmod5(i)
vvb(i) = 0.
vmod(i) = vmod(i)
+ - uub(i)*uub5(i)/vmod5(i)
uu(i,lrefm) = uu(i,lrefm)
+ + uub(i)/vmod5(i)
uub(i) = 0.
if (vmod5(i).le.vmin) vmod(i) = 0.
vv(i,lrefm) = vv(i,lrefm) + vmod(i)*vvb5(i)
uu(i,lrefm) = uu(i,lrefm) + vmod(i)*uub5(i)
vmod(i) = 0.
enddo
c
do l=ilev,1,-1
do i=il2,il1,-1
vtend(i,l) = 0.
utend(i,l) = 0.
enddo
enddo
c
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
return
end