Calculate thermal expansion from a temperature field

Hi,

I’m currently trying my hand at a thermal analysis, but unfortunately it’s not going as well as I’d expected. For the initial setup:

I have a model made up of C3D10 elements. A few nodes are fixed to prevent the model from moving in space. I have a temperature for each node that I would like to specify. CalculiX should then calculate the thermal strain (i.e., the displacement of all nodes) resulting from this temperature field.

My input file (solve_therm.inp) looks like this

*INCLUDE, INPUT=model.inp

*MATERIAL, NAME=generic
*ELASTIC, TYPE=ISO
525, 0.3
*EXPANSION, TYPE=ISO
0.4
*SOLID SECTION, ELSET=EALL, MATERIAL=generic

*STEP
*STATIC
*BOUNDARY
fixed, 1, 3, 0
*INCLUDE, INPUT=therm_boundary.inp
*NODE FILE
U
*END STEP

And the file content for the boundary conditions looks like this:

1,11,11, 5.643741273e+01
2,11,11, 5.414079499e+01
3,11,11, 1.761354130e+02
4,11,11, 4.460606464e+00
5,11,11, 7.423315814e+01
6,11,11, 8.601981278e+01
7,11,11, 3.460357794e+01
8,11,11, 4.604850232e+01
9,11,11, 5.263491499e+01
10,11,11, 9.986451767e+01
11,11,11, 7.811955094e+01
(...)

When I run this model with ccx -i solve_therm, the calculation completes without any error messages, but the displacements of all nodes are 0. Did I forget to define something? Or is the *STATIC environment not the right one for this type of problem?

When I replace the temperature boundary conditions with mechanical ones for testing purposes (e.g., applying a *CLOAD to some nodes), I get displacement solutions. The model itself (i.e., everything in the model.inp file) appears to be fault-free.

P.S.: I haven’t entered any actual material data yet. These are still dummy variables. There should still be some kind of (none zero) solution, though.

What’s the reference temperature? Did you intialize the field to a given temperature via *initial conditions, type=temperature?

You can use this type of step if you don’t need to model heat transfer, but temperatures have to be applied as a predefined field, not boundary condition in this case:

*TEMPERATURE
node, value

Well, both of your tips were really helpful. I hadn’t actually defined an initial temperature. It really doesn’t work without it. And when I then changed the boundary condition from
1,11,11, 5.643741273e+01
(...)
to
*TEMPERATURE, OP=NEW
1,11,11, 5.643741273e+01
(...)
, a displacement solution was calculated. Thank you both so much!

What I haven’t quite figured out yet is the difference between defining a temperature using dof 11 and defining it using *TEMPERATURE. Obviously, they’re not the same thing, but I can’t tell from the manual when to use one and when to use the other.

Boundary condition (*BOUNDARY) can be used on DOF 11 (temperature) only in procedures where temperature is a primary variable - heat transfer is simulated. So just *HEAT TRANSFER, *COUPLED TEMPERATURE-DISPLACEMENT and *UNCOUPLED TEMPERATURE-DISPLACEMENT.

Conversely, the temperature defined field (*TEMPERATURE) is used in procedures with no temperature DOF (purely mechanical analyses - heat transfer not simulated) such as *STATIC and *DYNAMIC. It applies a temperature gradient that affects just the thermal expansion and temperature-dependent material properties.

Thank you very much for the explanation. Everything you’ve explained makes sense, but I still need to let it sink in a bit.

Since the idea of temperature definitions in purely mechanical analyses can be confusing, I’ll also put it differently:

In a heat transfer or coupled analysis, you apply the temperature as an initial condition or boundary condition to the nodes that have temperature as the degree of freedom. So you initialize and prescribe (control) this degree of freedom. If there’s only an initial condition, the temperature at the node can change freely due to heat transfer through the mesh. If there’s a boundary condition, this nodal temperature follows its definition (including amplitude for time variation).

In a purely mechanical (static or dynamic) analysis, you can also apply an initial temperature, but it doesn’t initialize the temperature (11th) degree of freedom. Instead, it’s interpolated to material points and used only as a reference for temperature-dependent properties and thermal expansion. If you also apply the defined temperature field (*TEMPERATURE), it will be interpolated to material points as well and used to change temperature-dependent material properties and to calculate the thermal strain from the temperature gradient:

ε_th = α (T - T_0) - α (T_i - T_0)

where α is the thermal expansion coefficient, T is the current temperature (due to heat transfer/BCs in a thermal/coupled analyses or due to a defined temperature field in a mechanical analysis), T_0 is the temperature after which the thermal expansion will start (this is specified together with the expansion coefficient), and T_i is the initial temperature.

So, to sum up, *BOUNDARY primarily controls the heat transfer (and also affects temperature-dependent material properties and thermal expansion in coupled analyses) while *TEMPERATURE is only a reference value for the material properties and thermal expansion calculations in analyses with no heat transfer.

As a side note, in Abaqus, it’s a bit clearer because there are separate finite elements with and without temperature DOFs. In CalculiX, the same elements are used in all procedures, and their DOFs are activated by these procedures accordingly.

2 Likes