Coupled Thermomechanics Bar Problem

Overview

This problem is one of 1D, coupled heat transfer and solid mechanics. The domain is a bar fixed at the left end with the right end free to displace due to thermal expansion. The left end of the bar has a set temperature, and the right end has a flux boundary condition where the flux depends on the total displacement of the bar. Thus, the displacement depends on temperature, which in turn depends on displacement.

Bar Problem Details

  • is the x-coordinate

  • is displacement

  • is the length (10)

  • is the coefficient of thermal expansion (1E-6)

  • is temperature

  • is the initial temperature of the bar (300)

  • is the fixed temperature at the left end of the bar ()

  • is the thermal conductivity (1000)

  • is a constant (28500)

  • is a constant (1E6)

  • is the flux ()

With a fixed temperature at one end and a flux boundary condition at the other, the temperature in the bar will vary linearly. The displacement at the end of the bar is then

The differential equation for heat transfer in the bar is which after integration becomes where and are constants of integration.

= , which leads to .

We also have .

To solve for T(L), we have

Table 1: Results for bar with coupled thermomechanics.

Analytic ValueBison ValueError
u(L)1.5E-31.5E-30%
q-3E4-3E40%
T(L)6006000%

Input Syntax

#
# Quantity  Analytical
# --------  ----------
#   u(L)      1.5e-3
#   q           -3e4
#   T(L)         600
#
[Mesh<<<{"href": "../../../syntax/Mesh/index.html"}>>>]
  use_displaced_mesh<<<{"description": "Create the displaced mesh if the 'displacements' parameter is set. If this is 'false', a displaced mesh will not be created, regardless of whether 'displacements' is set."}>>> = false
  [bar]
    type = GeneratedMeshGenerator<<<{"description": "Create a line, square, or cube mesh with uniformly spaced or biased elements.", "href": "../../../source/meshgenerators/GeneratedMeshGenerator.html"}>>>
    dim<<<{"description": "The dimension of the mesh to be generated"}>>> = 3
    nx<<<{"description": "Number of elements in the X direction"}>>> = 10
    ny<<<{"description": "Number of elements in the Y direction"}>>> = 1
    nz<<<{"description": "Number of elements in the Z direction"}>>> = 1
    xmax<<<{"description": "Upper X Coordinate of the generated mesh"}>>> = 10
  []
[]

[GlobalParams<<<{"href": "../../../syntax/GlobalParams/index.html"}>>>]
  displacements = 'disp_x disp_y disp_z'
[]

[AuxVariables<<<{"href": "../../../syntax/AuxVariables/index.html"}>>>]
  [unity]
    initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 1
  []
[]

[Variables<<<{"href": "../../../syntax/Variables/index.html"}>>>]
  [temperature]
    initial_condition<<<{"description": "Specifies a constant initial condition for this variable"}>>> = 300
  []
[]

[Kernels<<<{"href": "../../../syntax/Kernels/index.html"}>>>]
  [heat]
    type = HeatConduction<<<{"description": "Diffusive heat conduction term $-\\nabla\\cdot(k\\nabla T)$ of the thermal energy conservation equation", "href": "../../../source/kernels/HeatConduction.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    use_displaced_mesh<<<{"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."}>>> = false
  []
[]

[Physics<<<{"href": "../../../syntax/Physics/index.html"}>>>]
  [SolidMechanics<<<{"href": "../../../syntax/Physics/SolidMechanics/index.html"}>>>]
    [QuasiStatic<<<{"href": "../../../syntax/Physics/SolidMechanics/QuasiStatic/index.html"}>>>]
      [all]
        strain<<<{"description": "Strain formulation"}>>> = SMALL
        incremental<<<{"description": "Use incremental or total strain (if not explicitly specified this defaults to incremental for finite strain and total for small strain)"}>>> = true
        add_variables<<<{"description": "Add the displacement variables"}>>> = true
        eigenstrain_names<<<{"description": "List of eigenstrains to be applied in this strain calculation"}>>> = eigenstrain
        generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'strain_xx strain_yy strain_zz'
        temperature<<<{"description": "The temperature"}>>> = temperature
      []
    []
  []
[]

[BCs<<<{"href": "../../../syntax/NuclearMaterials/BCs/index.html"}>>>]
  [x]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = left
    value<<<{"description": "Value of the BC"}>>> = 0.0
  []
  [y]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_y
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'top bottom'
    value<<<{"description": "Value of the BC"}>>> = 0.0
  []
  [z_bot]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = disp_z
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'top bottom'
    value<<<{"description": "Value of the BC"}>>> = 0.0
  []
  [T]
    type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../../source/bcs/DirichletBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'left'
    value<<<{"description": "Value of the BC"}>>> = 300
  []
  [flux]
    type = MatNeumannBC<<<{"description": "Imposes the integrated boundary condition $\\frac{C \\partial u}{\\partial n}=M*h$, where $h$ is a constant, $M$ is a material property, and $C$ is a coefficient defined by the kernel for $u$.", "href": "../../../source/bcs/MatNeumannBC.html"}>>>
    variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
    value<<<{"description": "For a Laplacian problem, the value of the gradient dotted with the normals on the boundary."}>>> = 1
    boundary_material<<<{"description": "Material property multiplying the constant that will be enforced by the BC"}>>> = flux_material
  []
[]

[Materials<<<{"href": "../../../syntax/Materials/index.html"}>>>]
  [elasticity_tensor]
    type = ComputeIsotropicElasticityTensor<<<{"description": "Compute a constant isotropic elasticity tensor.", "href": "../../../source/materials/ComputeIsotropicElasticityTensor.html"}>>>
    youngs_modulus<<<{"description": "Young's modulus of the material."}>>> = 1
    poissons_ratio<<<{"description": "Poisson's ratio for the material."}>>> = 0
  []
  [small_stress]
    type = ComputeFiniteStrainElasticStress<<<{"description": "Compute stress using elasticity for finite strains", "href": "../../../source/materials/ComputeFiniteStrainElasticStress.html"}>>>
  []
  [thermal_expansion_strain]
    type = ComputeThermalExpansionEigenstrain<<<{"description": "Computes eigenstrain due to thermal expansion with a constant coefficient", "href": "../../../source/materials/ComputeThermalExpansionEigenstrain.html"}>>>
    stress_free_temperature<<<{"description": "Reference temperature at which there is no thermal expansion for thermal eigenstrain calculation"}>>> = 300
    thermal_expansion_coeff<<<{"description": "Thermal expansion coefficient"}>>> = 1e-6
    temperature<<<{"description": "Coupled temperature"}>>> = temperature
    eigenstrain_name<<<{"description": "Material property name for the eigenstrain tensor computed by this model. IMPORTANT: The name of this property must also be provided to the strain calculator."}>>> = eigenstrain
  []
  [k]
    type = ParsedMaterial<<<{"description": "Parsed expression Material.", "href": "../../../source/materials/ParsedMaterial.html"}>>>
    property_name<<<{"description": "Name of the parsed material property"}>>> = thermal_conductivity
    expression<<<{"description": "Parsed function (see FParser) expression for the parsed material"}>>> = 1000
  []
  [flux]
    type = ParsedMaterial<<<{"description": "Parsed expression Material.", "href": "../../../source/materials/ParsedMaterial.html"}>>>
    property_name<<<{"description": "Name of the parsed material property"}>>> = flux_material
    coupled_variables<<<{"description": "Vector of variables used in the parsed function"}>>> = disp_x
    expression<<<{"description": "Parsed function (see FParser) expression for the parsed material"}>>> = '28500 + 1e6 * disp_x'
    boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = right
  []
[]

[Executioner<<<{"href": "../../../syntax/Executioner/index.html"}>>>]
  type = Transient
  solve_type = Newton

  l_max_its = 50
  nl_max_its = 50
  nl_rel_tol = 1e-14
  nl_abs_tol = 1e-10
  l_tol = 1e-9

  start_time = 0.0
  end_time = 1.0
  dt = 1.0
  dtmin = 1.0
[]

[Outputs<<<{"href": "../../../syntax/Outputs/index.html"}>>>]
  csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]

[Postprocessors<<<{"href": "../../../syntax/Postprocessors/index.html"}>>>]
  [analytical_T]
    type = ParsedPostprocessor<<<{"description": "Computes a parsed expression with post-processors", "href": "../../../source/postprocessors/ParsedPostprocessor.html"}>>>
    pp_names<<<{"description": "Post-processors arguments"}>>> = ''
    constant_names<<<{"description": "Vector of constants used in the parsed function (use this for kB etc.)"}>>> = 'beta L k gamma alpha T0'
    constant_expressions<<<{"description": "Vector of values for the constants in constant_names (can be an FParser expression)"}>>> = '28500 10 1000 1e6 1e-6 300'
    expression<<<{"description": "function expression"}>>> = 'gammaTerm := 1-gamma*alpha*L*L/2/k;
                (beta*L/k + gammaTerm*T0)/gammaTerm'
  []
  [analytical_u]
    type = ParsedPostprocessor<<<{"description": "Computes a parsed expression with post-processors", "href": "../../../source/postprocessors/ParsedPostprocessor.html"}>>>
    pp_names<<<{"description": "Post-processors arguments"}>>> = 'analytical_T'
    constant_names<<<{"description": "Vector of constants used in the parsed function (use this for kB etc.)"}>>> = 'L alpha T0'
    constant_expressions<<<{"description": "Vector of values for the constants in constant_names (can be an FParser expression)"}>>> = '10 1e-6 300'
    expression<<<{"description": "function expression"}>>> = 'alpha*L/2*(analytical_T-T0)'
  []
  [analytical_flux]
    type = ParsedPostprocessor<<<{"description": "Computes a parsed expression with post-processors", "href": "../../../source/postprocessors/ParsedPostprocessor.html"}>>>
    pp_names<<<{"description": "Post-processors arguments"}>>> = 'analytical_u'
    constant_names<<<{"description": "Vector of constants used in the parsed function (use this for kB etc.)"}>>> = 'beta gamma'
    constant_expressions<<<{"description": "Vector of values for the constants in constant_names (can be an FParser expression)"}>>> = '28500 1e6'
    expression<<<{"description": "function expression"}>>> = '-beta-gamma*analytical_u'
  []
  [bison_u]
    type = SideAverageValue<<<{"description": "Computes the average value of a variable on a sideset. Note that this cannot be used on the centerline of an axisymmetric model.", "href": "../../../source/postprocessors/SideAverageValue.html"}>>>
    variable<<<{"description": "The name of the variable which this postprocessor integrates"}>>> = disp_x
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
  []
  [bison_T]
    type = SideAverageValue<<<{"description": "Computes the average value of a variable on a sideset. Note that this cannot be used on the centerline of an axisymmetric model.", "href": "../../../source/postprocessors/SideAverageValue.html"}>>>
    variable<<<{"description": "The name of the variable which this postprocessor integrates"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
  []
  [bison_flux]
    type = SideDiffusiveFluxAverage<<<{"description": "Computes the integral of the diffusive flux over the specified boundary", "href": "../../../source/postprocessors/SideDiffusiveFluxAverage.html"}>>>
    variable<<<{"description": "The name of the variable which this postprocessor integrates"}>>> = temperature
    boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
    diffusivity<<<{"description": "The name of the diffusivity material property that will be used in the flux computation. This must be provided if the variable is of finite element type"}>>> = thermal_conductivity
  []
  [error_u]
    type = ParsedPostprocessor<<<{"description": "Computes a parsed expression with post-processors", "href": "../../../source/postprocessors/ParsedPostprocessor.html"}>>>
    expression<<<{"description": "function expression"}>>> = '(bison_u-analytical_u)/analytical_u*100'
    pp_names<<<{"description": "Post-processors arguments"}>>> = 'bison_u analytical_u'
  []
  [error_T]
    type = ParsedPostprocessor<<<{"description": "Computes a parsed expression with post-processors", "href": "../../../source/postprocessors/ParsedPostprocessor.html"}>>>
    expression<<<{"description": "function expression"}>>> = '(bison_T-analytical_T)/analytical_T*100'
    pp_names<<<{"description": "Post-processors arguments"}>>> = 'bison_T analytical_T'
  []
  [error_flux]
    type = ParsedPostprocessor<<<{"description": "Computes a parsed expression with post-processors", "href": "../../../source/postprocessors/ParsedPostprocessor.html"}>>>
    expression<<<{"description": "function expression"}>>> = '(bison_flux-analytical_flux)/analytical_flux*100'
    pp_names<<<{"description": "Post-processors arguments"}>>> = 'bison_flux analytical_flux'
  []
[]
(assessment/verification/Thermomechanics/bar/bar.i)