PINSFVMomentumFriction

This kernel adds the friction term to the porous media Navier Stokes momentum equations. This kernel must be used with the canonical PINSFV variable set, e.g. pressure and superficial velocity, and supports Darcy and Forchheimer friction models in two flavors:

Standard friction formulation

Set parameter: "standard_friction_formulation" = 'true'

Darcy drag model ϵFi=fiμϵvD,iϵ=fiμvD,i \epsilon F_i = - f_i \mu \epsilon \frac{v_{D,i}}{\epsilon} = -f_i \mu v_{D,i}(1) Forchheimer drag model ϵFi=fiρ2ϵvD,iϵvDϵ=fiρ2vD,ivDϵ \epsilon F_i = - f_i \frac{\rho}{2} \epsilon \frac{v_{D,i}}{\epsilon}\frac{|\vec{v_D}|}{\epsilon} = - f_i \frac{\rho}{2} v_{D,i} \frac{|\vec{v_D}|}{\epsilon}(2)

Simplified friction formulation

Set parameter: "standard_friction_formulation" = 'false'

Darcy drag model ϵFi=fiϵvD,iϵ=fivD,i \epsilon F_i = - f_i \epsilon \frac{v_{D,i}}{\epsilon} = -f_i v_{D,i}(3) Forchheimer drag model ϵFi=fiϵvD,iϵvDϵ=fivD,ivDϵ \epsilon F_i = - f_i \epsilon \frac{v_{D,i}}{\epsilon}\frac{|\vec{v_D}|}{\epsilon} = - f_i v_{D,i} \frac{|\vec{v_D}|}{\epsilon}(4)

where FiF_i is the i-th component of the friction force (denoted by Ff\mathbf{F_f} in Finite Volume Incompressible Porous media Navier Stokes, Eq. (1)), fif_i the friction factor, which may be anisotropic, μ\mu the fluid dynamic viscosity, ρ\rho the fluid density, and vD,iv_{D,i} the i-th component of the fluid superficial velocity. We have used a negative sign to match the notation used in Finite Volume Incompressible Porous media Navier Stokes, Eq. (1) where the friction force is on the right-hand-side of the equation. When moved to the left-hand side, which is done when setting up a Newton scheme, the term becomes positive which is what is shown in the source code itself. Darcy and Forchheimer terms represent fundamentally different friction effects. Darcy is meant to represent viscous effects and as shown in Eq. (1),Eq. (3), it has a linear dependence on the fluid velocity. Meanwhile, Forchheimer is meant to represent inertial effects and as shown in Eq. (2), Eq. (4) it has a quadratic dependence on velocity.

For the non-porous medium version of the above equations set parameter "is_porous_medium" to false. (epsilon = 1)

Computation of friction factors and pre-factors

To outline how friction factors for Darcy and Forchheimer may be calculated, let's consider a specific example. We'll draw from the Ergun equation, which is outlined here. Let's consider the form:

Δp=150μLdp2(1ϵ)2ϵ3vD+1.75Lρdp(1ϵ)ϵ3vDvD\Delta p = \frac{150\mu L}{d_p^2} \frac{(1-\epsilon)^2}{\epsilon^3} v_D + \frac{1.75 L \rho}{d_p} \frac{(1-\epsilon)}{\epsilon^3} |v_D| v_D

where LL is the bed length, μ\mu is the fluid dynamic viscosity and dpd_p is representative of the diameter of the pebbles in the pebble bed. We can divide the equation through by LL, recognize that Δp\Delta p denotes p0pLp_0 - p_L such that Δp/Lp\Delta p/L \approx -\nabla p, multiply the equation through by ϵ-\epsilon, move all terms to the left-hand-side, and do some term manipulation in order to yield:

ϵp+150μϵ(1ϵ)2ϵ2dp2vDϵ+1.75ϵ1ϵϵdpρvDϵvDϵ=0\epsilon \nabla p + 150\mu\epsilon\frac{(1-\epsilon)^2}{\epsilon^2 d_p^2} \frac{\vec{v_D}}{\epsilon} + 1.75\epsilon\frac{1-\epsilon}{\epsilon d_p} \rho \frac{|\vec{v}_D|}{\epsilon} \frac{\vec{v_D}}{\epsilon} = 0

If we define the hydraulic diameter as Dh=ϵdp1ϵD_h = \frac{\epsilon d_p}{1 - \epsilon}, then the above equation can be rewritten as:

ϵp+150μDh2vD+1.75DhρvDvDϵ=0\epsilon \nabla p + \frac{150\mu}{D_h^2} \vec{v_D} + \frac{1.75}{D_h} \rho \vec{v_D} \frac{|\vec{v}_D|}{\epsilon} = 0

Let's introduce the interstitial fluid velocity v=vD/ϵv = \vec{v_D} / \epsilon to rewrite the above equation as:

ϵp+ϵ150μDh2v+ϵ1.75Dhρvv=0\epsilon \nabla p + \epsilon\frac{150\mu}{D_h^2} \vec{v} + \epsilon\frac{1.75}{D_h} \rho \vec{v} |\vec{v}| = 0

Then dividing through by ϵ\epsilon:

p+150μDh2v+1.75Dhρvv=0 \nabla p + \frac{150\mu}{D_h^2} \vec{v} + \frac{1.75}{D_h} \rho \vec{v} |\vec{v}| = 0(5)

We are now very close the forms for Darcy and Forchheimer espoused by Holzmann and SimScale which is:

p+μDv+ρ2Fvv \nabla p + \mu D \vec{v} + \frac{\rho}{2} F |\vec{v}| \vec{v}(6)

Looking at Eq. (6) we can rearrange Eq. (5):

p+μ150Dh2v+ρ22(1.75)Dhvv=0\nabla p + \mu \frac{150}{D_h^2} \vec{v} + \frac{\rho}{2} \frac{2(1.75)}{D_h} \vec{v} |\vec{v}| = 0

and arrive at the Ergun expression for the Darcy coefficient:

150Dh2\frac{150}{D_h^2}

and the Ergun expression for the Forchheimer coefficient:

21.75Dh\frac{2 \cdot 1.75}{D_h}

where we have made the 21.752 \cdot 1.75 multiplication explicit to make the 1.75 factor from the Ergun wikipedia page more recognizable. We perform a similar separation in the implementation of the Ergun Forchheimer coefficient outlined in FunctorErgunDragCoefficients.

Input Parameters

  • momentum_componentThe component of the momentum equation that this kernel applies to.

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:x, y, z

    Controllable:No

    Description:The component of the momentum equation that this kernel applies to.

  • rhie_chow_user_objectThe rhie-chow user-object

    C++ Type:UserObjectName

    Unit:(no unit assumed)

    Controllable:No

    Description:The rhie-chow user-object

  • rhoThe density. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The density. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • variableThe name of the variable that this residual object operates on

    C++ Type:NonlinearVariableName

    Unit:(no unit assumed)

    Controllable:No

    Description:The name of the variable that this residual object operates on

Required Parameters

  • Darcy_nameName of the Darcy coefficients property. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:Name of the Darcy coefficients property. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • Forchheimer_nameName of the Forchheimer coefficients property. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:Name of the Forchheimer coefficients property. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

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

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

    Unit:(no unit assumed)

    Controllable:No

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

  • is_porous_mediumTrueBoolean to choose the type of medium.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Boolean to choose the type of medium.

  • muThe dynamic viscosity. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The dynamic viscosity. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • porosity1The porosity. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    Default:1

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The porosity. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

  • speedThe magnitude of the interstitial velocity. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The magnitude of the interstitial velocity. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • standard_friction_formulationTrueBoolean to choose the type of friction formulation.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Boolean to choose the type of friction formulation.

  • uThe velocity in the x direction. Superficial in the case of porous treatment, interstitial otherwise. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The velocity in the x direction. Superficial in the case of porous treatment, interstitial otherwise. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

  • vThe velocity in the y direction. Superficial in the case of porous treatment, interstitial otherwise. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The velocity in the y direction. Superficial in the case of porous treatment, interstitial otherwise. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

  • wThe velocity in the z direction. Superficial in the case of porous treatment, interstitial otherwise. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

    C++ Type:MooseFunctorName

    Unit:(no unit assumed)

    Controllable:No

    Description:The velocity in the z direction. Superficial in the case of porous treatment, interstitial otherwise. A functor is any of the following: a variable, a functor material property, a function, a post-processor, or a number.

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>

    Unit:(no unit assumed)

    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>

    Unit:(no unit assumed)

    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>

    Unit:(no unit assumed)

    Controllable:No

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

  • matrix_tagssystemThe tag for the matrices this Kernel should fill

    Default:system

    C++ Type:MultiMooseEnum

    Unit:(no unit assumed)

    Options:nontime, system

    Controllable:No

    Description:The tag for the matrices this Kernel should fill

  • vector_tagsnontimeThe tag for the vectors this Kernel should fill

    Default:nontime

    C++ Type:MultiMooseEnum

    Unit:(no unit assumed)

    Options:nontime, time

    Controllable:No

    Description:The tag for the vectors this Kernel should fill

Tagging Parameters

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

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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    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

    Unit:(no unit assumed)

    Controllable:No

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

Parallel Ghosting Parameters