potential_neumann Subroutine

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

Linkwise neumann potential non-equilibrium boundary condition for curved and straight walls (zero gradient). For straight wall, values are extrapolated along boundary normal instead of along the link. The accuracy of straight wall depends on the qVal defined in config file and default is set to 0.5

The pdf is decomposed into equilibrium (eq) and non-equilibrium (neq) part: - f_eq is calculated by weighting a fictitious potential, which is obtained by an extrapolation using the fluid neighbor(s) - f_neq is approximated by second-order extrapolation using the fluid neighbor(s) - for qVal < 0.75 even the second neighbor is used for the extrapolations - boundary potential (pot_b) has to be extrapolated using two fluid neighb: pot_b = (4*pot_f - pot_ff)/3 (typo in paper) - Linkwise: as much as possible is outsourced to the subroutine "mus_set_nonEqExpol"

NOTE: - possibility to extend the equation to extraplotate pot_b by a gradient if a non-zero one is desired (see: Huang H, Lee T S, and Shu C. “Thermal curved boundary treatment for the thermal lattice Boltzmann equation,” Int. J. Mod. Phys. C, vol. 17(05), pp. 631-643, 2006) - more accurate schemes to determine pot_b can be found in: Chen Q, Zhang X, and Zhang J. “Improved treatments for general boundary conditions in the lattice Boltzmann method for convection- diffusion and heat transfer processes,” Phys Rev E, vol. 88(3), 033304, 2013


boundary_condition = {
  { label = 'outer',
    kind = 'potential_neumann_link',
    curved = true

This is described in the paper: Luo, K.; Wu, J.; Yi HL. & Tan HP. (2016). A lattice Boltzmann method for electric field-space charge coupled problems. Proceedings of the 2016 Electrostatics Joint Conference (June 2016).

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


proc~~potential_neumann~~CallsGraph proc~potential_neumann potential_neumann neighbufferpost neighbufferpost proc~potential_neumann->neighbufferpost



integer, private :: iDir
real(kind=rk), private :: feq_b
real(kind=rk), private :: fneq_b
real(kind=rk), private :: pot_b
real(kind=rk), private :: feq_f
real(kind=rk), private :: fneq_f
real(kind=rk), private :: pot_f
real(kind=rk), private :: feq_ff
real(kind=rk), private :: fneq_ff
real(kind=rk), private :: pot_ff
real(kind=rk), private :: pdf_f(layout%fStencil%QQ)
real(kind=rk), private :: pdf_ff(layout%fStencil%QQ)
real(kind=rk), private :: surChargeDens_w(me%links(iLevel)%nVals)
integer, private :: iLink
integer, private :: QQ
integer, private :: bcSCD_pos
real(kind=rk), private :: inv_permittivity
real(kind=rk), private :: normal(3)
real(kind=rk), private :: surChargeDens_fac