# Calculate thermal expansion from a temperature field

**URL:** <https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909>\
**Category:** Model setup\
**Created:** [April 19, 2026, 9:44pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909 "2026-04-19T21:44:58Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nobody-86](https://avatars.discourse-cdn.com/v4/letter/n/e495f1/32.png) [@Nobody-86](https://calculix.discourse.group/u/Nobody-86)\
**Post date:** [April 19, 2026, 9:44pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/1 "2026-04-19T21:44:58Z")

</div>

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

```auto
*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:

```auto
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.

---

<div class="post-metadata">

**Author:** ![jbr](https://avatars.discourse-cdn.com/v4/letter/j/ecccb3/32.png) [@jbr](https://calculix.discourse.group/u/jbr)\
**Post date:** [April 19, 2026, 10:00pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/2 "2026-04-19T22:00:59Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Calc\_em](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@Calc\_em](https://calculix.discourse.group/u/Calc_em)\
**Post date:** [April 19, 2026, 10:22pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/3 "2026-04-19T22:22:27Z")

</div>

> [@Nobody-86](#):
>
> Or is the `*STATIC` environment not the right one for this type of problem?

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:

```auto
*TEMPERATURE
node, value

```

---

<div class="post-metadata">

**Author:** ![Nobody-86](https://avatars.discourse-cdn.com/v4/letter/n/e495f1/32.png) [@Nobody-86](https://calculix.discourse.group/u/Nobody-86)\
**Post date:** [April 20, 2026, 4:06pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/4 "2026-04-20T16:06:36Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Calc\_em](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@Calc\_em](https://calculix.discourse.group/u/Calc_em)\
**Post date:** [April 20, 2026, 4:17pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/5 "2026-04-20T16:17:38Z")

</div>

> [@Nobody-86](#):
>
> 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.

---

<div class="post-metadata">

**Author:** ![Nobody-86](https://avatars.discourse-cdn.com/v4/letter/n/e495f1/32.png) [@Nobody-86](https://calculix.discourse.group/u/Nobody-86)\
**Post date:** [April 20, 2026, 4:32pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/6 "2026-04-20T16:32:13Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Calc\_em](https://avatars.discourse-cdn.com/v4/letter/c/43a26b/32.png) [@Calc\_em](https://calculix.discourse.group/u/Calc_em)\
**Post date:** [April 20, 2026, 5:53pm UTC](https://calculix.discourse.group/t/calculate-thermal-expansion-from-a-temperature-field/3909/7 "2026-04-20T17:53:22Z")

</div>

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.
