pressure_expol Subroutine

public subroutine pressure_expol(me, state, bcBuffer, globBC, levelDesc, tree, nSize, iLevel, sim_time, neigh, layout, fieldProp, varPos, nScalars, varSys, derVarPos, physics, iField, mixture)

Outlet Pressure extrapolation boundary. qVal for this boundary must be 0.0

This is taken from the paper: M. Junk and Z. Yang, Asymptotic Analysis of Lattice Boltzmann Outflow Treatments Commun. Comput. Phys., pp. 1-11, 2011.

This boundary condition prescribes density = 1.0 at outlet by forcing the equlibirium part of in normal direction (equation 3.13a): For non-normal direction, is extrapolated from neighrbors by (equation 3.13b):


  boundary_condition = {
    { label = 'outlet',
       kind = 'pressure_expol',
       pressure = 'pressure_out',
  variable = {
    name = 'pressure_out',
    ncomponents = 1,
    vartype = 'st_fun',
    st_fun = 1.0

DISCLAIMER: This BC requires pre-collision PDF from 1st and 2nd neighbor which are not available if those neighbors are boundary halo on different process. So, if you encounter a problem with this BC, please check the domain distribution to verify whether 2 neighbors of boundary elements are in one process. The domain distribution can be changed by shifting the boundary by one element or by changing the origin of bounding cube or by using different number of MPI processes.

This subroutine's interface must match the abstract interface definition boundaryRoutine in bc/mus_bc_header_module.f90 in order to be callable via fnct function pointer.


class(boundary_type) :: me

global boundary type

real(kind=rk), intent(inout) :: state(:)

Current state vector of iLevel

real(kind=rk), intent(in) :: bcBuffer(:)

state values of boundary elements of all fields of iLevel

type(glob_boundary_type), intent(in) :: globBC

scheme global boundary type

type(tem_levelDesc_type), intent(in) :: levelDesc

iLevel descriptor

type(treelmesh_type), intent(in) :: tree

Treelm Mesh

integer, intent(in) :: nSize

size of state array ( in terms of elements )

integer, intent(in) :: iLevel

the level On which this boundary was invoked

type(tem_time_type), intent(in) :: sim_time

global time information

integer, intent(in) :: neigh(:)

connectivity array corresponding to state vector

type(mus_scheme_layout_type), intent(in) :: layout

stencil layout information

type(mus_field_prop_type), intent(in) :: fieldProp

fluid parameters and properties

integer, intent(in) :: varPos(:)

pointer to field variable in the state vector

integer, intent(in) :: nScalars

number of Scalars in the scheme var system

type(tem_varSys_type), intent(in) :: varSys

scheme variable system

type(mus_derVarPos_type), intent(in) :: derVarPos

position of derived quantities in varsys

type(mus_physics_type), intent(in) :: physics

scheme global boundary type

integer, intent(in) :: iField

current field

type(mus_mixture_type), intent(in) :: mixture

mixture info



real(kind=rk), private :: fTmp(nScalars*globBC%nElems(iLevel))
real(kind=rk), private :: fTmp_1
real(kind=rk), private :: fTmp_2
real(kind=rk), private :: fEq(layout%fStencil%QQ*globBC%nElems(iLevel))
real(kind=rk), private :: fEq0(layout%fStencil%QQ*globBC%nElems(iLevel))
real(kind=rk), private :: rho(globBC%nElems(iLevel))
real(kind=rk), private :: inv_rho_phy
real(kind=rk), private :: velocity(3,globBC%nElems(iLevel))
real(kind=rk), private :: vel_res(globBC%nElems(iLevel)*3)
integer, private :: iDir
integer, private :: iElem
integer, private :: QQ
integer, private :: elemPos
integer, private :: invDir
integer, private :: posInBuffer
integer, private :: iLink
integer, private :: bcPress_pos
logical, private :: axisNormal