xwallfun Subroutine

public subroutine xwallfun()

Uses

  • proc~~xwallfun~~UsesGraph proc~xwallfun modibm::xwallfun module~initfac initfac proc~xwallfun->module~initfac module~modfields modfields proc~xwallfun->module~modfields module~modglobal modglobal proc~xwallfun->module~modglobal module~initfac->module~modglobal module~modmpi modmpi module~initfac->module~modmpi netcdf netcdf module~initfac->netcdf mpi mpi module~modmpi->mpi

Arguments

None

Calls

proc~~xwallfun~~CallsGraph proc~xwallfun modibm::xwallfun proc~wfgr wf_gr.f90::wfGR proc~xwallfun->proc~wfgr proc~wfmneutral wfmneutral.f90::wfmneutral proc~xwallfun->proc~wfmneutral proc~wfuno wf_uno.f90::wfuno proc~xwallfun->proc~wfuno proc~xwallscalar modibm::xwallscalar proc~xwallfun->proc~xwallscalar proc~unoh wf_uno.f90::unoh proc~wfuno->proc~unoh

Called by

proc~~xwallfun~~CalledByGraph proc~xwallfun modibm::xwallfun proc~ibmwallfun modibm::ibmwallfun proc~ibmwallfun->proc~xwallfun program~dalesurban DALESURBAN program~dalesurban->proc~ibmwallfun

Contents

Source Code


Source Code

   subroutine xwallfun
      use modglobal, only:dzf, dzhiq, dzhi, dxf, dxfi, dxhi, dyi, lles, nsv, numol, ltempeq, lmoist, &
         ih, jh, kh, ihc, jhc, khc, dxh, dy, dt, totavtime, rk3step, ib, ie, kb, ke, iwallmom, iwalltemp, iwallmoist, iwallscal, nblocks
      use modfields, only:um, up, v0, w0, vp, wp, shear, thl0, thlp, qt0, qtp, sv0, svp, momfluxb, tfluxb, exnf, cth, qfluxb
      use initfac, only:fachf, block, faclGR, facef, facqsat, fachurel, facf, facT, facz0,facz0h
      integer i, j, k, n, nc, jl, ju, kl, ku, im, jm, jp, km, m
      if (iwallmom == 1) then !fixed flux
      !not implemented
      else if (iwallmom == 2) then !wall function
         do n = 1, nxwall
            k = block(ixwall(n), 8) !west side
            call wfuno(ih, jh, kh, vp, wp, thlp, momfluxb, tfluxb, cth, bcTfluxA, v0, w0, thl0, facT(k, 1), facz0(k), facz0h(k), ixwall(n), 1, 11)
            k = block(ixwall(n), 9) !east side
            call wfuno(ih, jh, kh, vp, wp, thlp, momfluxb, tfluxb, cth, bcTfluxA, v0, w0, thl0, facT(k, 1), facz0(k), facz0h(k), ixwall(n), 1, 21)
         end do
      else if (iwallmom == 3) then
         do n = 1, nxwall
            k = block(ixwall(n), 8) !west side
            call wfmneutral(ih, jh, kh, vp, wp, momfluxb, v0, w0, facz0(k), ixwall(n), 1, 11)
            k = block(ixwall(n), 9) !east side
            call wfmneutral(ih, jh, kh, vp, wp, momfluxb, v0, w0, facz0(k), ixwall(n), 1, 21)
        end do
      end if

      if (ltempeq) then
      if (iwalltemp == 1) then !fixed flux
         do n = 1, nxwall 
            call xwallscalar(ih, jh, kh, thl0, thlp, bctfxm, bctfxp, ixwall(n))
         end do
      else if (iwalltemp == 2) then
         do n = 1, nxwall
            k = block(ixwall(n), 8) !west side
            call wfuno(ih, jh, kh, vp, wp, thlp, momfluxb, tfluxb, cth, bcTfluxA, v0, w0, thl0, facT(k, 1), facz0(k), facz0h(k), ixwall(n), 1, 12) !left wall
            fachf(k) = fachf(k) + bcTfluxA !accumulate flux from that facet (can be on multiple processors, will be MPI_ALLREDUCEd in modEB)

            k = block(ixwall(n), 9) !east side
            call wfuno(ih, jh, kh, vp, wp, thlp, momfluxb, tfluxb, cth, bcTfluxA, v0, w0, thl0, facT(k, 1), facz0(k), facz0h(k), ixwall(n), 1, 22) !right wall
            fachf(k) = fachf(k) + bcTfluxA
         end do
      end if
      end if

      if (lmoist) then
      if (iwallmoist == 1) then !fixed flux
         do n = 1, nxwall 
            call xwallscalar(ih, jh, kh, qt0, qtp, bcqfxm, bcqfxp, ixwall(n))
         end do
      end if
      if ((ltempeq) .and. (iwallmoist == 2)) then
         do n = 1, nxwall
            k = block(ixwall(n), 8)
            if (faclGR(k)) then !only if it is a vegetated surface
               call wfGR(ih, jh, kh, qtp, qfluxb, cth, bcqfluxA, qt0(:, :, :), facqsat(k), fachurel(k), facf(k, 4), facf(k, 5), ixwall(n), 1, 12) !left wall
               facef(k) = facef(k) + bcqfluxA
            end if
            k = block(ixwall(n), 9)
            if (faclGR(k)) then
               call wfGR(ih, jh, kh, qtp, qfluxb, cth, bcqfluxA, qt0(:, :, :), facqsat(k), fachurel(k), facf(k, 4), facf(k, 5), ixwall(n), 1, 22) !right wall
               facef(k) = facef(k) + bcqfluxA
            end if
         end do
      end if
      end if

      if (nsv>0) then
      if (iwallscal == 1) then !fixed flux
         do n = 1, nxwall 
            do m= 1, nsv
               call xwallscalar(ihc, jhc, khc, sv0(:,:,:,m), svp(:,:,:,m), 0., 0., ixwall(n))
            end do
         end do
      end if
      end if

   end subroutine xwallfun