LinearFVPressureCorrectionDiffusionJump

Pressure correction diffusion kernel that adds a baffle jump contribution on internal faces.

Description

LinearFVPressureCorrectionDiffusionJump supplies the pressure-diffusion part of the linear finite-volume pressure equation when internal baffles permit different pressures on their two sides. It is intended for the segregated SIMPLE algorithm and is required by a PorousRhieChowMassFlux object that has pressure-jump models. The Rhie-Chow object, selected with "rhie_chow_user_object", identifies the baffle faces and provides the signed jumps and the momentum-pressure coupling coefficients.

The diffusion tensor is always the Ainv functor of the Rhie-Chow object and cannot be set by the user. Baffle faces build their half-cell mobilities directly from the Rhie-Chow momentum inverse, so the remaining faces must use the same coefficient for the pressure operator to be consistent.

The pressure variable selected by "variable" must use FVPressureJumpGreenGaussGradient as its gradient method.

Pressure equation

Separating the diagonal coefficient of momentum component gives

(1)

where contains the off-diagonal momentum operator and known sources. Multiplying by density and interpolating to a face splits the normal mass-flux density into , where is known from the momentum predictor and is assembled by a separate LinearFVDivergence object, and is the pressure contribution assembled here. Continuity is applied to the area-integrated fluxes , where includes the coordinate-system factor. After the pressure solve, the Rhie-Chow object evaluates the same face relation with unit area and stores the flux density , which the pressure-jump models consume.

On an ordinary face the cell-center pressure difference represents a resolved gradient. On a zero-thickness baffle part of that difference is a physical discontinuity. Applying the ordinary diffusion approximation to the complete difference would treat the jump as a gradient of order and produce a mesh-dependent, spurious flux. This object removes the jump before applying the pressure transmissibility.

Baffle face operator

Let face separate cells and , with unit normal pointing from to , and let and be the limiting pressures on the two sides. The element-oriented jump is

(2)

The half-cell geometry and normal mobilities on side are

(3)

where is the diagonal cell pressure mobility, including the porosity scaling applied by PorousRhieChowMassFlux. Both half-cell vectors follow the element-to-neighbor orientation, so a valid face has and . The half-cell conductances and explicit corrections are

(4)

where is the cell gradient from FVPressureJumpGreenGaussGradient. The first term of is the tangential part of the anisotropic mobility. The second is the nonorthogonal correction and is omitted when "use_nonorthogonal_correction" is disabled.

Each half cell carries the same flux,

(5)

Eliminating and with Eq. (2) gives

(6)

The transmissibility therefore acts only on the smooth part of the pressure drop. The one-sided pressures are reconstructed values, not degrees of freedom. Rearranged, : the cell-center difference equals the jump only when the face carries no pressure flux and .

The part of the face flux, which carries the body forces, is eliminated the same way. Each side obeys its own form of Eq. (1), so the complete mass flux through the half cell on side is with the one-sided flux , and is the same on both sides. Eliminating the face pressures as above gives

(7)

The flux therefore uses the same series weights as the pressure rather than a geometric average. A fluid at rest across a porosity or density jump has on each side, so the face flux vanishes even though . PorousRhieChowMassFlux stores as the baffle-face HbyA flux, which the separate LinearFVDivergence object assembles.

A baffle face requires finite, positive half-cell distances, normal mobilities, face area, and conductances, and finite corrections. Debug builds assert these conditions and report the face ID.

Faces that are not baffles use the inherited LinearFVPressureCorrectionDiffusion treatment, with the face Ainv interpolated according to "pressure_diffusion_interpolation". Boundary faces likewise use the inherited boundary treatment.

Assembly

The flux enters the two adjacent rows with opposite signs, giving the local system

(8)

The jump, the correction , the gradients, and all coefficient data are frozen during one pressure solve, so the jump enters only the right-hand side. Both matrix rows and the two right-hand-side entries sum to zero, which preserves local conservation and the constant-pressure nullspace. The jump changes the pressure difference needed to sustain a flux but does not create or remove mass. With the ordinary continuous-pressure operator is recovered.

Flux-dependent jump

A pressure-jump model can make the jump depend on the face flux, ; for example, BernoulliFormLossPressureJump combines a reversible dynamic-pressure change with an irreversible form loss. The derivative of is not assembled. Instead, before each pressure assembly the Rhie-Chow object updates the jump from the previous corrected flux with relaxation factor ,

(9)

and the pressure solve then uses Eq. (6) with . At convergence of the outer iteration the jump law and discrete continuity hold simultaneously.

Gradient reconstruction

A Green-Gauss gradient computed through a baffle would contain a spurious contribution and contaminate and . FVPressureJumpGreenGaussGradient avoids this by recovering and from the complete half-cell fluxes, with from Eq. (7), and using each only in the surface sum of its own cell. Including lets each face pressure follow the body-force pressure slope of its own side, for example the hydrostatic gradient. This solution gradient is distinct from FVReconstructedPressureGradient, which remains the pressure-velocity coupling gradient used by the momentum predictor.

Example Input Syntax

In this one-dimensional example, pressure_jump computes Bernoulli jumps on two internal baffles. The rc PorousRhieChowMassFlux object stores and relaxes those jumps and identifies p_diffusion as the pressure-flux discretization that must also be used when reconstructing the corrected face flux.

[UserObjects<<<{"href": "../../syntax/UserObjects/index.html"}>>>]
  [pressure_jump]
    type = BernoulliFormLossPressureJump<<<{"description": "Provides Bernoulli and form-loss pressure jumps to PorousRhieChowMassFlux.", "href": "../userobjects/BernoulliFormLossPressureJump.html"}>>>
    boundary<<<{"description": "The boundaries on which this pressure jump model applies."}>>> = 'baffle baffle2'
    porosity<<<{"description": "The porosity functor. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = porosity
    density<<<{"description": "The density functor. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = ${rho}
  []
  [rc]
    type = PorousRhieChowMassFlux<<<{"description": "Rhie-Chow mass flux object specialized for porous flow/baffle cases.", "href": "../userobjects/PorousRhieChowMassFlux.html"}>>>
    u<<<{"description": "The x-component of velocity"}>>> = superficial_u
    pressure<<<{"description": "The pressure variable."}>>> = pressure
    rho<<<{"description": "Density functor. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = ${rho}
    porosity<<<{"description": "Porosity functor (defaults to 1 for non-porous calculations). A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = porosity
    p_diffusion_kernel<<<{"description": "The LinearFVPressureCorrectionDiffusion kernel acting on the pressure."}>>> = p_diffusion
    pressure_jump_models<<<{"description": "Pressure jump models applied by this object."}>>> = pressure_jump
    pressure_jump_relaxation<<<{"description": "Under-relaxation factor for pressure jump updates."}>>> = 0.1
  []
[]
(modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/linear-segregated/1d-simple-channel/porous-baffle-1d.i)

The pressure kernel obtains signed jumps from rc. Nonorthogonal correction is disabled because the mesh is one-dimensional. The accompanying HbyA_divergence object supplies the momentum-predictor part of the pressure equation.

[LinearFVKernels<<<{"href": "../../syntax/LinearFVKernels/index.html"}>>>]
  [p_diffusion]
    type = LinearFVPressureCorrectionDiffusionJump<<<{"description": "Pressure correction diffusion kernel that adds a baffle jump contribution on internal faces.", "href": "LinearFVPressureCorrectionDiffusionJump.html"}>>>
    variable<<<{"description": "The name of the variable whose linear system this object contributes to"}>>> = pressure
    rhie_chow_user_object<<<{"description": "The rhie-chow user-object which provides baffle jump information."}>>> = rc
    use_nonorthogonal_correction<<<{"description": "If the nonorthogonal correction should be used when computing the normal gradient."}>>> = false
  []
[]
(modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/linear-segregated/1d-simple-channel/porous-baffle-1d.i)
[LinearFVKernels<<<{"href": "../../syntax/LinearFVKernels/index.html"}>>>]
  [HbyA_divergence]
    type = LinearFVDivergence<<<{"description": "Represents a divergence term. Note, this term does not contribute to the system matrix, only takes the divergence of a face flux field and adds it to the right hand side of the linear system.", "href": "LinearFVDivergence.html"}>>>
    variable<<<{"description": "The name of the variable whose linear system this object contributes to"}>>> = pressure
    face_flux<<<{"description": "Functor for the face flux. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = HbyA
    force_boundary_execution<<<{"description": "Whether to force execution of this object on all external boundaries."}>>> = true
  []
[]
(modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/linear-segregated/1d-simple-channel/porous-baffle-1d.i)

In this two-dimensional diagonal-baffle example, the jump model additionally includes entry, corner, and exit form losses, and the pressure kernel enables the nonorthogonal correction needed by the diagonal geometry.

[UserObjects<<<{"href": "../../syntax/UserObjects/index.html"}>>>]
  [pressure_jump]
    type = BernoulliFormLossPressureJump<<<{"description": "Provides Bernoulli and form-loss pressure jumps to PorousRhieChowMassFlux.", "href": "../userobjects/BernoulliFormLossPressureJump.html"}>>>
    boundary<<<{"description": "The boundaries on which this pressure jump model applies."}>>> = 'clean_to_porous diagonal_baffle porous_to_clean'
    porosity<<<{"description": "The porosity functor. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = porosity
    density<<<{"description": "The density functor. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = ${rho}
    form_loss<<<{"description": "Form-loss coefficients for each pressure-jump boundaries."}>>> = '${entry_form_loss} ${corner_form_loss} ${exit_form_loss}'
    reference_velocity_side<<<{"description": "Reference-velocity sides for each the pressure-jump boundaries. The default is lower_porosity."}>>> = 'lower_porosity lower_porosity lower_porosity'
  []
  [rc]
    type = PorousRhieChowMassFlux<<<{"description": "Rhie-Chow mass flux object specialized for porous flow/baffle cases.", "href": "../userobjects/PorousRhieChowMassFlux.html"}>>>
    u<<<{"description": "The x-component of velocity"}>>> = superficial_u
    v<<<{"description": "The y-component of velocity"}>>> = superficial_v
    pressure<<<{"description": "The pressure variable."}>>> = pressure
    rho<<<{"description": "Density functor. A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = ${rho}
    porosity<<<{"description": "Porosity functor (defaults to 1 for non-porous calculations). A functor is any of the following: a variable, a functor material property, a function, a postprocessor or a number."}>>> = porosity
    p_diffusion_kernel<<<{"description": "The LinearFVPressureCorrectionDiffusion kernel acting on the pressure."}>>> = p_diffusion
    pressure_projection_method<<<{"description": "The method to use in the pressure projection for Ainv - standard (SIMPLE) or consistent (SIMPLEC)"}>>> = consistent
    pressure_jump_models<<<{"description": "Pressure jump models applied by this object."}>>> = pressure_jump
    pressure_jump_relaxation<<<{"description": "Under-relaxation factor for pressure jump updates."}>>> = 0.1
  []
[]
(modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/linear-segregated/2d-diagonal-baffle/porous-baffle-straight-diagonal.i)
[Variables<<<{"href": "../../syntax/Variables/index.html"}>>>]
  [pressure]
    type = MooseLinearVariableFVReal<<<{"description": "Base class for Moose variables. This should never be the terminal object type", "href": "../variables/MooseLinearVariableFV.html"}>>>
    solver_sys<<<{"description": "If this variable is a solver variable, this is the solver system to which it should be added."}>>> = pressure_system
    initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 0.0
    gradient_method<<<{"description": "Default gradient computation method to register when a consumer requests gradients from this variable. This may be a built-in method name like 'green-gauss' or 'green-gauss-venkatakrishnan', or the name of an object in [FVGradientMethods]."}>>> = jump_aware
  []
[]
(modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/linear-segregated/2d-diagonal-baffle/porous-baffle-straight-diagonal.i)
[LinearFVKernels<<<{"href": "../../syntax/LinearFVKernels/index.html"}>>>]
  [p_diffusion]
    type = LinearFVPressureCorrectionDiffusionJump<<<{"description": "Pressure correction diffusion kernel that adds a baffle jump contribution on internal faces.", "href": "LinearFVPressureCorrectionDiffusionJump.html"}>>>
    variable<<<{"description": "The name of the variable whose linear system this object contributes to"}>>> = pressure
    rhie_chow_user_object<<<{"description": "The rhie-chow user-object which provides baffle jump information."}>>> = rc
    use_nonorthogonal_correction<<<{"description": "If the nonorthogonal correction should be used when computing the normal gradient."}>>> = true
  []
[]
(modules/navier_stokes/test/tests/finite_volume/pins/channel-flow/linear-segregated/2d-diagonal-baffle/porous-baffle-straight-diagonal.i)

Input Parameters

  • rhie_chow_user_objectThe rhie-chow user-object which provides baffle jump information.

    C++ Type:UserObjectName

    Controllable:No

    Description:The rhie-chow user-object which provides baffle jump information.

  • variableThe name of the variable whose linear system this object contributes to

    C++ Type:LinearVariableName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the variable whose linear system this object contributes to

Required Parameters

  • blockThe list of blocks (ids or names) that this object will be applied

    C++ Type:std::vector<SubdomainName>

    Controllable:No

    Description:The list of blocks (ids or names) that this object will be applied

  • force_boundary_executionFalseWhether to force execution of this object on all external boundaries.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Whether to force execution of this object on all external boundaries.

  • use_nonorthogonal_correctionTrueIf the nonorthogonal correction should be used when computing the normal gradient.

    Default:True

    C++ Type:bool

    Controllable:No

    Description:If the nonorthogonal correction should be used when computing the normal gradient.

  • use_nonorthogonal_correction_on_boundaryFalseIf the nonorthogonal correction should be used when computing the normal gradient.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:If the nonorthogonal correction should be used when computing the normal gradient.

Optional Parameters

  • absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution

  • extra_matrix_tagsThe extra tags for the matrices this Kernel should fill

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The extra tags for the matrices this Kernel should fill

  • extra_vector_tagsThe extra tags for the vectors this Kernel should fill

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The extra tags for the vectors this Kernel should fill

  • matrix_onlyFalseWhether this object is only doing assembly to matrices (no vectors)

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Whether this object is only doing assembly to matrices (no vectors)

  • matrix_tagssystemThe tag for the matrices this Kernel should fill

    Default:system

    C++ Type:MultiMooseEnum

    Options:nontime, system

    Controllable:No

    Description:The tag for the matrices this Kernel should fill

  • vector_tagsrhsThe tag for the vectors this Kernel should fill

    Default:rhs

    C++ Type:MultiMooseEnum

    Options:rhs, time

    Controllable:No

    Description:The tag for the vectors this Kernel should fill

Contribution To Tagged Field Data Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

  • implicitTrueDetermines whether this object is calculated using an implicit or explicit form

    Default:True

    C++ Type:bool

    Controllable:No

    Description:Determines whether this object is calculated using an implicit or explicit form

  • seed0The seed for the master random number generator

    Default:0

    C++ Type:unsigned int

    Controllable:No

    Description:The seed for the master random number generator

  • use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

Advanced Parameters

  • ghost_layers1The number of layers of elements to ghost.

    Default:1

    C++ Type:unsigned short

    Controllable:No

    Description:The number of layers of elements to ghost.

  • use_point_neighborsFalseWhether to use point neighbors, which introduces additional ghosting to that used for simple face neighbors.

    Default:False

    C++ Type:bool

    Controllable:No

    Description:Whether to use point neighbors, which introduces additional ghosting to that used for simple face neighbors.

Parallel Ghosting Parameters

Input Files