subroutine bottom
!kind of obsolete when road facets are being used
!vegetated floor not added (could simply be copied from vegetated horizontal facets)
use modglobal, only:ib, ie, ih, jh, kh, jb, je, kb, numol, prandtlmol, dzh, nsv, &
dxf, dxhi, dzf, dzfi, numoli, ltempeq, khc, lmoist, BCbotT, BCbotq, BCbotm, BCbots, dzh2i
use modfields, only : u0,v0,e120,um,vm,w0,wm,e12m,thl0,qt0,sv0,thlm,qtm,svm,up,vp,thlp,qtp,svp,shear,momfluxb,tfluxb,cth
use modsurfdata, only:thlflux, qtflux, svflux, ustar, thvs, wtsurf, wqsurf, thls, z0, z0h
use modsubgriddata, only:ekm, ekh
use modmpi, only:myid
implicit none
integer :: i, j, jp, jm, m
!momentum
if (BCbotm.eq.2) then
call wfuno(ih, jh, kh, up, vp, thlp, momfluxb, tfluxb, cth, bcTfluxA, u0, v0, thl0, thls, z0, z0h, 0, 1, 91)
elseif (BCbotm.eq.3) then
call wfmneutral(ih, jh, kh, up, vp, momfluxb, u0, v0, z0, 0, 1, 91)
else
write(0, *) "ERROR: bottom boundary type for momentum undefined"
stop 1
end if
if (ltempeq) then
if (BCbotT.eq.1) then !neumann/fixed flux bc for temperature
do j = jb, je
do i = ib, ie
thlp(i, j, kb) = thlp(i, j, kb) &
+ ( &
0.5*(dzf(kb - 1)*ekh(i, j, kb) + dzf(kb)*ekh(i, j, kb - 1)) &
*(thl0(i, j, kb) - thl0(i, j, kb - 1)) &
*dzh2i(kb) &
- wtsurf &
)*dzfi(kb)
end do
end do
else if (BCbotT.eq.2) then !wall function bc for temperature (fixed temperature)
call wfuno(ih, jh, kh, up, vp, thlp, momfluxb, tfluxb, cth, bcTfluxA, u0, v0, thl0, thls, z0, z0h, 0, 1, 92)
else
write(0, *) "ERROR: bottom boundary type for temperature undefined"
stop 1
end if
end if ! ltempeq
if (lmoist) then
if (BCbotq.eq.1) then !neumann/fixed flux bc for moisture
do j = jb, je
do i = ib, ie
qtp(i, j, kb) = qtp(i, j, kb) + ( &
0.5*(dzf(kb - 1)*ekh(i, j, kb) + dzf(kb)*ekh(i, j, kb - 1)) &
*(qt0(i, j, kb) - qt0(i, j, kb - 1)) &
*dzh2i(kb) &
+ wqsurf &
)*dzfi(kb)
end do
end do
else
write(0, *) "ERROR: bottom boundary type for moisture undefined"
stop 1
end if !
end if !lmoist
if (nsv>0) then
if (BCbots.eq.1) then !neumann/fixed flux bc for moisture
do j = jb, je
do i = ib, ie
do m = 1, nsv
svp(i, j, kb, m) = svp(i, j, kb, m) + ( &
0.5*(dzf(kb - 1)*ekh(i, j, kb) + dzf(kb)*ekh(i, j, kb - 1)) &
*(sv0(i, j, kb, m) - sv0(i, j, kb - 1, m)) &
*dzh2i(kb) &
+ 0. &
)*dzfi(kb)
end do
end do
end do
else
write(0, *) "ERROR: bottom boundary type for scalars undefined"
stop 1
end if !
end if
e120(:, :, kb - 1) = e120(:, :, kb)
e12m(:, :, kb - 1) = e12m(:, :, kb)
wm(:, :, kb) = 0.
w0(:, :, kb) = 0.
return
end subroutine bottom