What I really like about Finite Element Analysis (FEA) is, that it’s full of small things that make you say “ah, so this is what it does!”. Degrees of Freedom is just like that. It’s critical to understand the very basics, but there are a few fun nuances here and there as well. Let’s take a look at what Degrees of Freedom (DoF) are!

Degree of Freedom (DoF) is a “possibility” to move in a defined direction. There are 6 DoF in a 3D space: you can move or rotate along axis x, y or z. Together, those components describe a motion in 3D. DoF in FEA also do other things: they control supports, information about stresses and more!

Before we go into the more abstract things (like the 7th DoF in beam models) let’s start with the basics. This way we will be on the same page when more complex topics will appear!

Is a Degree really Free?

You may have noticed, that I used a weird definition for a Degree of Freedom. I called it a “possibility” to move in a defined direction. And I think that this is a good starting point for our discussion about Degrees of Freedom.

When it is “possible” to move?

Imagine you are walking down the corridol. Since you are moving along it’s length it’s rather clear that you have the “possibility” to move along that coridol. That would be a Degree of Freedom by the definition I just wrote.

But imagine that the corridol ends with a wooden wall… You can’t move any more – but is the movement “possible”?

And believe it or not, the answer is: yes it is! You could for instance destroy the wall, and more on.

This bring us to a very disturbing question… if that is the case, when the movement is not “possible”?

Degrees of Freedom are not related to the fact that something can or cannot more in a given direction, but that the movement is “possible” at all. This is tightly correlated with how many dimensions the space of your model has! As I mentioned a 3D space (space that has 3 dimensions) has 6 movement directions possible. But for the start, let’s think about something simpler.

Traveling along the string – a 1D space

I could start with 0D space, but this is rather depressing (and has no practical utility).

Instead, let’s start with a classical 1D space. It is here, mostly as it will make things easier to understand. There aren’t a lot of practical uses for 1D FEA… in fact, it is almost only used when you want to fo FEA by hand. Since you are dealing with only 1 dimension, the matrixes are small, so there is less work for everybody. This is also, why it is a good place to start.

Imagine you have a piece of a string:

Space with 1 dimension, is precisely like the string. You have points “on” the string, and they can only move “along” the string. So there is only one “direction” of movement possible. This direction is “along the string”. Note, that it doesn’t matter if the movement is “forward” (from A to B) or “backward” (from B to A). This is still one “direction”, but we will consider movement “positive” or “negative” in such cases. This is why I marked an axis X, that defines which direction is the “positive” one.

A string is a 1 dimension space because the point cannot “jump” vertically on the picture above. That would mean movement “outside” of the string, and this wouldn’t be a 1 dimension space in such a case! The same is true for the “inward the screen” direction in this case.

This means that in order to describe a movement of a point, you only need one number. That is, how far along the string your point moved. This value can be positive, or negative as I just described.

End of math, let’s get back to FEA!

In a 1D space, you can only have forces acting along the string. All others would require an additional dimension.

This means for instance, that there cannot be bending etc. Technically even buckling is impossible in compression (there is nowhere to buckle to – you can only shorten or elongate!). This means that the only thing we have to consider is tension or compression.

To model our 1D string in FEA, you will need a series of 1D Finite Elements:

Our model already has all the things that a proper model needs. I assumed that the string is attached to the wall in point A and that there is a pulling force at the other end (E). Note, that while point A cannot move (it’s supported) movement of this point along the axis X is still “possible”. By this, I simply mean that in a 1D space, movement along the axis X is possible.

I won’t bother to do the FEA by hand here (if you are in such sort of thing, read this instead). Instead, let’s assume that each element elongated 1mm. This means that point B moves 1mm to the right. Point C moves 2mm, point D moves 3mm and point E traveled 4mm. Note that the only deformation we have is “along” our 1 dimension (in this case axis X).

As you know each finite element has nodes (I marked them with letters A-E). This means that the first element from the left (with nodes A and B), “shares” node B with the second element (which have nodes B and C). This is how they are connected in our FEA model. If you need a refresher on how this works, read this!

Think what sort of information this node B has to “share” between both elements to “connect them”. Not much really… it only needs to tell both elements, how much it has traveled along axis X. This way both elements know if they are elongated or shortened (if they take into account the info from their second node as well), and proper strain (and then stress) can be calculated.

The fact that node B needs to share only 1 information between elements (deformation along axis X) means, that this is a 1DoF system, and our elements are 1DoF elements.

Living on a plate – a 2D space

All right, now we are entering into an actually useful realm. In fact, when I was starting my FEA career, 2D models were still pretty popular, and not all companies calculated their structures in 3D. To this day there are programs that can operate only in a 2D space!

You already know quite a lot about directions, but of course, there is more!

Now, we are talking about a piece of paper:

You may notice, that this is a very similar problem to the 1D string we have just discussed. We still have support in “X” direction (DoF “along X” is blocked). We are applying the same tension on the right, and technically this *should* work as our previous case… well it won’t!

You see in a 2D space there are more “movement possibilities” that in a 1D space we described before… and we are making nothing about those! The first one is quite obvious, movement along Y:

You see, if we would apply even the smallest load in the vertical direction (along Y) our model will simply “slide to eternity”. There is no support in the vertical direction, but the movement is possible! In 1D space, we didn’t have to worry about it – the 1D space made that movement impossible!

All right then, let’s modify our support in point A to block vertical movement as well:

Note, that our model does not “slide to eternity” anymore… but it can “spin for eternity” around point A instead! While point A cannot “move” (authors often call such movement “translation”), nothing blocks its rotation! Applying vertical load in node C will cause infinite rotation of the model.

This is how we discover another “movement” possibility – that is rotation. It’s impossible in 1D space, but in 2D one rotation direction is possible. In order to block it, we should make a *rigid* support in point A, or support another node in the vertical direction. Let’s go with the rigid option since we want to “discover” all DoF in this article!

The thing about *rigid* supports

“Rigid support” is a funny term. It can mean a LOT depending on the context. In essence rigid supports blocks rotation, and pinned supports do not block rotation (like in the example above).

However, it’s not always obvious which rotations should be blocked for the support to be rigid. This is not a problem in 2D space (there is only one rotation aviable), but it will be a bit more fun in a 3D space. We will get to that.

Up to this point, our beloved solver wouldn’t calculate our 2D model. Even with only horizontal force, the model is “unstable”. Even if there are no loads acting in the unsupported direction, the movement there is “possible” and “not blocked”. This means that the solver sees this problem as “unsolvable” and will throw errors at you (you know, the infamous non-convergence ones).

Now we are ready to actually solve our model:

First of all, let’s say this is a stick, not a string. Strings aren’t great in bending situations, and would behave in a rather complicated manner I don’t want to get into that here. Sticks are much more “normal” when it comes to that!

Share this post with your Friends!

Note, that the “real” deformation is a really smoothly curved line. But FEA isn’t as smart, especially since I used only 2 Finite Elements to model a cantilever (not very smart, but of course I did it on purpose). Since our elements have only 2 nodes each (beginning and the end), they can only be a straight line. This makes the shape a bit awkward in FEA, as you can see above. Of course, adding more elements would help, as well as using higher-order elements. You can learn more about elements here!

Since we are discussing Degrees of Freedom the most important thing from this example is: how much information nodes have to share?

The first part of the answer is pretty obvious. Movement along axis X and axis Y are definitely important. This is how you can say “how far” the node traveled in a 2D space. But we already know that this is not enough! We had to support our model with *rigid* support blocking rotation. The same rotation node B shared between elements on the drawing above. Note, that they are not in line, and there is a certain “angle” between them, as they try to fit as best as they can to actual deformation. This is a 3rd DoF in a 2D space… rotation “in-plane”.

Degrees of Freedon in a 2D space:

As I just claritied there are 3 DoF in a 2D space:

  • Movement along axis X
  • Movement along axis Y
  • Rotation “in plane” – that would be rotation around axis Z

What Degrees of Freedom “gives” you?

I could easily end here, but as I told you at the begining there is more to the “DoF” than just possibility of movement. In fact, there is plenty more! Let’s take a look at some important things!

Support your DoF!

The first important thing is, that you need to support each DoF of your model.

In a 1D space, this was easy. We could only move along the string, so supporting one point to block the possible movement and keeping that point “in place” was sufficient. In a 1D space you need to block only 1 DoF to make your model work!

In a 2D space, things became a bit more messy. Each node has 3 DoF carying both translations (along X and Y) and an in-plane rotation. This means, that we have to support 3 DoF in our model to make it stable. And we did that!

Of course, the same will apply to a 3D space… but we will get there.

What is important here is, that you how many DoF you need to support for your single model to “work”.

Note, that above I used the word “single model”. Sometimes in analysis, you may have several “pieces” of your model connected somehow, but not completely. In those cases, supports will require a different amount of DoF blocked, depending on how many pieces you have, and how they are connected with each other. But for a single model, the above is true.

Next thing is the internal forces. Those also depend on the amount of DoF each node in your system has! Since in 2D a single model has 3 DoF, you have to support 3 DoF to make it work!

DoF and internal forces!

In a 1D space nodes had only 1 DoF. This was “move along the string” information. Such situation means, that in our model we can only have tension or compression in elements… we couldn’t transfer any other information between elements! This is only one internal force, called “normal force” (since it acts in a direction “normal” to the cross section).

The equation for beams is simple 1 DoF = 1 Internal Force

Since we already know that a 2D space have 3 DoF, let’s wonder what internal forces are possible in beams in 2D space.

The first one is pretty obvious: the “normal force” we just described! The second is shear force, and the third is the in-plane bending. So again, our beam elements have 3 DoF each node… leading to 3 different internal forces. Beams are cute this way!

Elements in space!

So far we used beams (line elements) that are usually referred to as 1D elements. Of course, in a 2D space, we can use 2D elements as well!

Of course, in a 2D space, those still have 3 DoF in each node. The same ones as the beam elements we used so far. Each node of our element can move along X, along Y and rotate in-plane. The same stuff applies.

The only difference is, that 2D elements have different “internal forces” as beams do. I suspect, that you are more familiar with stresses (as they are used in the design) so let’s go with stresses instead (there is a 1:1 correlation in 2D plates, so it’s basically the same thing). I don’t want to derail the subject to much, so let’s just say, that there are 3 unique stress components in a 2D space:

Your element can be in tension or compression along axis x, the same along axis y and in shear. Note, that this time I used small letters for axis description. This is because for each element “local” coordinate system is used, instead of the global one. This is a completely different topic about how FEA works.

Local and global coordinate systems

In short all finite elements (beams, plates and solids) have their own coordinate system each. Those do not have to be aligned with your model coordinate system (usually called “global”) and all stresses and internal forces relate to the local coordinate system of the element (I will call it “local” but “elements” sounds nice too).

In the examples here I try to keep the local and global coordinate systems of elements aligned, not to add more confusion to the topic. But the local/global coordinate system is a cool thing on it’s own for sure!

With those 3 components, you can describe everything that is happening with your 2D element. So 3 DoF leads to 3 unique stress components as well! This may seem that there is always the same amount of stress/internal forces components as there is DoF in each node… but things will complicate further down the road.

10 FEA lessons I wish I knew a decade ago!

Join the course, don’t learn the hard way!

Things start to disappear in 2D elements!

This will come into play later, but let’s make a small observation already. Bending has disappeared! I mean, there is no bending stress (if that is even a thing!). While we could say that the normal stress along X is the “normal force” in a beam, and shear stress relates to shear force in a beam… additional normal stress in Y appeared. There is obviously no value correlated with this in beams, as they are 1D elements, so they don’t consider Y normal direction by default. But what happened to bending moment we had in beams?

It obviously didn’t disappear! Simply put, the bending moment is carried as a difference between normal stresses in various nodes! Imagine a bending like this:

Note, that if we would model this as a beam (on the left) model will only “see” the axis. In such a case bending moment will be assigned to the cross-section. This is the DoF that shares information about rotation between elements.

But in 2D we don’t need this. I’m sure you know how the stress distribution looks like in bending. If you ave several 2D elements along the height of this plate, you don’t need to carry the information about rotation to catch bending. All you need is the information about how high is the normal stress on the top, in the middle and at the bottom parts of your plate. This will nicely describe bending for you!

The rotation in the nodes “in-plane” of the 2D elements is useful when you want to connect a beam to the plate and in similar cases. Some FEA packages may use 2D elements that do not have “in-plane rotations” at nodes as well, but I think this is not a popular choice in 2D.

Living in a box – a 3D space

Finally, we got to the place where you most likely operate in FEA. To be honest, we covered most of the things already, so this will be rather quick. This is why I like to start with spaces with fewer dimensions. You can discuss thing on simpler examples first. Here, we will more or less sum up what you’ve already learned!

Firstly, the beam models, so 1D elements in a 3D space. I’m not much of an artist when it comes to drawings, so you will have to use some imagination here. No worries, only a little 😛

Remember when we just moved from 1D space to 2D space a while back? The first thing I’ve described was, that we needed additional support in Y because otherwise, our model will “slide to eternity”. Of course, the same happens in 3D… but twice! Once along axis Y (up and down on the drawing above) and once again axis Z (into the drawing and out).

In a 3D space, we have 3 translations. Movement is possible along axis X, Y and Z. Of course, our model doesn’t have to move orthogonally. It can go in “any” direction, even if this is not along any of those axes. However, each translation can be shown as a sum of movement along those 3 axes. This is why we use them!

Nice! We already have 3 DoF here! But of course, there is more.

After we figured out how to block translations in 2D, there was another problem. Having one node that didn’t move, but our model could still rotate around that point. I called that “in-plane rotation”… since our 2D model had only one plane! Now the rotation is possible in 3 directions. 2 of them are easy to see!

Firstly, our model can rotate around axis Z – just as in 2D task. This was the first rotation we had to block, to make our cantilever stable in 2D. Secondly, the same can happen around axis Y. It’s the same situation, but rotation happens inward into the picture as if point C was pushed into your screen.

All right, we can rotate around axis Y and Z already. That was simple. Now the last part: rotation around X. It’s a bit more difficult to see since this means that our beam rotates around its own axis! This is called torsion, and sometimes can be a pain.

This gives us a total of 6 DoF: 3 translations and 3 rotations around axis X, Y and Z. Nice! We’ve got there!

The second thing about *rigid* supports

I already started this topic when we first “discovered” rotations. I told you then, that the *rigid* support has the rotations blocked, while pinned support has rotations free. Since in 2D there was only one rotation possible, this was simple.

Now, in 3D you shuld ask: which rotations?!?

That is a very good one. Clasically, a rigid connection should have all 3 rotations blocked.

However, people usually discuss only 2 rotations (since they are of bigger interest). Someone can say something like “rigid in Z direction”. This means, that the rotation around axis Z is blocked, while around axis Y is free (traditionally torsion will be blocked in supports. This is around axis X in our example, but of course can differ in your model).

This may seem complicated, I know. It is always best to discuss which directions should be supported (“blocked”) and which should be free. Mistakes in this area can gave pretty bad consequences, so it’s better to be sure!

It seems we have the beams figured out! Of course, as you already know, in beams each DoF is “associated” with internal force. It’s the same as last time. Along the beam there is a “normal force”. In 2D we had a shear force, now there are two (since shearing can happen in 2 perpendicular directions). in 2D there was one bending moment, now we have two (the same thing, bending can happen in two perpendicular planes). And finally the Torsional moment, the one responsible for rotating our beam around its own axis.

I think that at this point it’s obvious to you, that nodes have to communicate 6 values between elements to describe what is going on. This means that we have 6 DoF in each node!

2D elements in 3D space

Of course, you will use other elements than beams in 3D space as well. Planar elements are next on the list!

I think you already know where this is going right? Of course, there are 3 translations and 3 rotations in each node. I guess I don’t have to draw the translations for you – they are simply along axis X, Y, and Z as in all the previous cases. The rotations are also quite simple, but I figured a nice way to draw them, so why not:

Above you se 4 finite elements A-D. Only A and D are on the same plane. Element B rotated around axis Y in relation to element A. Element C rotated around axis X in relation to element A. And Element D is in the same plane, but it rotated in this plane (this is the same in-plane rotation we discussed in 2D space). I’ve marked the angles of rotation to make it a bit easier to see what I mean.

I hope, that at this point it is obvious that each node has 6 DoF (3 translations and 3 rotations)

The less obvious stuff…

But you see, things start to get more complicated when it comes to stresses. Even as we have 6DoF in each node… each element (the QUAD4 one) has 4 nodes. This means, that it doesn’t have a clear “in” and “out” nodes as beam element does. You know, in a beam element internal forces comes “in” and one end, and goes “out” on the other end. It cannot “go somewhere else”. Since we have 6 DoF at the “in” and 6 DoF and the “out”… there must be 6 internal forces. Each for each element.

In planes, stress can come “in” at one node, and go “out” on 3 nodes, or maybe one specific one, etc. Stress has “choices” where to go to. This means that even since each node has 6 DoF, inside a finite element “more” is actually happening.

This is why there are more stress components in 2D elements in 3D space than there is DoF per node. Let’s take a look at the possible stresses in a single plate element in 3D.

  • You already know about the first 3 components. We have discussed those in a 2D space. The only interesting thing here is, that their distribution through “thickness” of the element is constant. It must be… in 2D our element had no “thickness”!

  • The next part is pretty easy to imagine. It’s the bending. You already saw that elements can bend “out of plane”. This means that there will be some normal stress from bending in them. This stress can easily be added to the stress from the normal force (above), but here distribution varies through-thickness of the element (this is why I draw a “fake” thickness to illustrate the distribution). There are two components of this bending – bending around axis X and around axis Y of the element local coordinate system:

  • The next two are shear components. But not “in-plane” like the first one we already discussed. Those are “out-of-plane” shear vectors, and there are two of them, as you can see below:

  • And finally the torsion. I think it is the hardest one to get, so let’s dive a bit deeper. Think about the normal stress in the Y direction. This was the first step in this list. It has a uniform distribution through-thickness of the element. What happens if the distribution stops being uniform? Bending appears (I described it with subscript “MY”). The same is true for the normal stress in X direction – the nonuniform distribution is causing bending I described with subscript “MX” above. And what happens if the last “2D stress” (shear) gets a nonuniform distribution through thickness? This time a torsional moment appear. And this is the last component. Normal stress can be different on “sides X and Y”, but the in-plane shear stress is equal. This is also true for torsional stress, that is equal on both edges.

And those are all of the components. Quite a few isn’t it? Definitely more than 6!

I listed them here, so you can see with your own eyes, that the number of internal forces/stresses in 2D and 3D elements, does not have to be equal to the amount of DoF each node have. It just happens to be the case for beams.

3D elements in a 3D space!

Well… if you think that this is a pinnacle of what “FEA people” can accomplish, you will be disappointed. First of all, you already know that in a 3D space, 6 movements are possible. That is 3 translations and 3 rotations. You also know, that apart from the beams, there aren’t as many internal forces/stress types as DOF in each node. There can be plenty more.

FEA solvers “communicate” with deformations. By this, I mean that nodes “share” deformations between elements, not stresses or forces. Each element will then do whatever it sees fit with the deformation input it got from all the nodes and will calculate forces/stresses on its own. This even leads to funny situations at times… but this is not a topic for this post!

So following the logic I have described so far, it would be easy to assume that each node in a 3D element in a 3D space has 6 DoF. But this is not true most of the time! Remember how I explained that plates don’t need “rotation” in their nodes to carry bending in-plane in a 2D problem. You know, this below:

It’s exactly like that in solid elements. You don’t need the rotations… simply because you can carry bending as a difference in normal stress in any given direction. Just as you can see above. This means, that in many FEA codes 3D elements are implemented only with translations in nodes! This means that each node has only 3 DoF!

This leads to a funny situation, where you can’t make a *rigid* connection between the beam and a solid in a 3D space… since solid won’t “take” the rotations. This means, that the solver will always treat this as pinned connection instead! The same goes for connection 2D elements to 3D elements. The line of connection will always be a hinge… since solid won’t take the bending moment, the plate element wants to transfer. It’s just as if you defined a pinned connection along the connecting edge.

I won’t go into the stress tensor of solid elements. This is a pretty well-known thing, and since you already know there can be more stress components than DoF in each node, it’s also not relevant to the topic. If you want to learn about the stress component, I would start in Wikipedia… but there is a lot of math there and surprisingly little drawings!

7th DoF!

Ok, I admit, I left the most bizarre thing at the end! If you are into steel structures, especially when you use beam models, you most likely heard that the ruckus caused by the “7th Degree of Freedom” in the software industry.

Since we are talking about DoF here, I believe it’s only fair to mention it!

We already established that there are 6 ways in which you can move in a 3D space… so what on earth does the 7th DoF?

In short, warping really likes 7th DoF. This is a thing that happens in cross-sections under torsion. The crucial thing is, that “on average” the cross-section stays in place (doesn’t move at all). This is why it’s somewhat independent of the 3 rotations and 3 translations we talked about before. You can actually see below that 2 corners go outward, and 2 corners go inward if you apply torsion to a rectangle. This is warping in its glory:

As I already mentioned, all the normal stresses that this produces are self-contained (its sum is zero). So nobody really cared all that much!

But this is a pretty nifty trick if you want to do Linear Buckling Analysis LBA for beam models. With only 6 DoF the only thing that can produce buckling is compression. If you would take a simply supported beam in bending LBA would tell you “there is no compression, so no buckling”. This means that with 6 DoF, LBA in beam models can’t predict Lateral Torsional Buckling (if you are not familiar with the term, you should really read this!). With the 7th DoF implemented, the nodes can share the information about warping between elements… and this allows LBA to “see” lateral-torsional buckling of bent beams. And that is it!

Pretty useful stuff, but if you don’t have 7th DoF, you can always model the beam you are interested in with plates… then lateral-torsional buckling works like a charm with LBA. Additionally, you can check all the local buckling failures and other interesting things!


Oh, wow… now that was a long one wan’t it?

I will try to briefly recap all the things I have mentioned here:

  • Degree of Freedom (DoF) is a possibility to move in a given direction. But not understood as “movement is free” or “movement is blocked”, but rather is it possible to move in this direction, taking into account how many dimensions the space of the task has.
  • Nodes connecting finite elements share information about all possible movements between the elements. Each node has as many DoF as many movements are possible. This means:
    • 1 is a 1D space (1 translation)
    • 3 in a 2D space (2 translation and 1 rotation)
    • 6 in a 3D space (3 translations and 3 rotations)
  • Sometimes, depending on element type it’s unnecessary to have all DoF in the nodes. The best example comes from 3D elements, that usually have only 3DoF (3 translations) in each node.
  • On another hand, in some rare cases, it’s actually cool to have more than 6DoF in a 3D space. That is the case with 7th DoF in beam models, that allows verifying lateral-torsional buckling for beams in bending.
  • In beams, you have as many internal forces as DoF in each node. This means:
    • 1 internal force (normal force) in 1D space
    • 3 internal forces (normal and shear force and in-plane bending moment) in 2D space
    • 6 internal forces (normal, 2x shear, 2x bending and torsion) in a 3D space (+eventual warping if you have 7th DoF implemented)
  • The above is not true for plates and solid elements. They have more nodes per element, and this allows them to “capture” more complex behaviors with less DoF per node. This means that they can have more stress components than DoF in each node.

And that is it! I really hope that you have enjoyed the post. Definitely let me know in the comments below, and don’t forget to share this article with your friends!