Catenary using Dynamic Relaxation


Could someone explain me if it is theoretically possible (or not) to obtain a 2D catenary shape using the dynamic relaxation method (DRM) and/or kangaroo 2, which is based on the DRM as far as I know?

I tried to find out the answer to this question in the literature. In the book “Shell Structures for Architecture: Form Finding and Optimization” Chapter 10.3.6: Dynamic relaxation, for example, it is stated that the loads for the DRM are not shape dependent, because they are a function of the initial lengths and that these loads can only be calculated once.
However I do not understand, why shape depent loads cannot be incorporated, because it is possible to calculate the loads in every iteration as a function of the current lengths. I wrote a script myself, however I did not obtain the analytical solution for a catenary, unfortunately.

Best Regards

Hi @Ralph2

Yes, you can generate an accurate discretization of a true catenary curve - either by keeping the lengths strongly fixed, or with the DynamicWeight1d elements, as I described here

Hi @DanielPiker

Thank you very much for your help! By changing the sum of the lengths in the length goal to the desired length, I obtained the catenary I wanted, with only very small differences to the catenary obtained with the catenary tool in Grasshopper.

However, I am still not sure, if it is possible to obtain a catenary with the DRM, as described in the following paper:

“Form Finding and Analysis of Tension Structures by Dynamic Relaxation” (M. R. Barnes, 1999). (

Do you know if it is possible, perhaps with a small adaptation to the DRM as described in this paper, to obtain a catenary curve? Or is this only possible by using the constraint projections in the Kangaroo2 algorithm?

With a catenary, I mean an inextensible chain with the loadcase selfweight. I’d like to solve the following problem with the DRM (or an adaptation of the DRM):
Point A and B are known, and the length of the catenary is chosen (which should be equal or larger to the distance between A and B).

Of course I could solve this problem with the usual cosh formula, but I’d like to obtain a static solution using a pseudo-dynamic procedure.

Best Regards!

Using the conventional form of dynamic relaxation (like K1), it’s a bit harder to generate a precise catenary with equal segment lengths because the stiffness is limited by the timestep. You can always make the timestep smaller - for more complex setups that becomes impractical at some point because of computation time, but for a single curve that wouldn’t really be an issue.
With the constraint projection in K2 it’s possible to use much higher stiffness values and still converge quickly.

As for the other approach where you adjust the weight of the segments as their length changes, that doesn’t require high stiffness values so will work easily in either the projected approach in K2 or conventional force based DR.
This approach of adjusting the loads as the lengths change was an idea from @j.e.harding written about in this paper:
If you also want to have the total length of the resulting curve be some given value, you’ll also need to include that in the loop.

Also btw - when analysing results, if you’re comparing to the Grasshopper Catenary component, note that it is also a discrete approximation - a polyline with 50 points. I believe a catenary can never be perfectly represented by a NURBS curve.

1 Like

Hi @DanielPiker

Thank you for you reply again.

I’m not sure if I fully understand the influence of the stiffness and the loads in the “classic” DRM".

My script is written so, that the sum of the loads is equal to the real weight (L * A * gamma), and the stiffness is E * A. Therefore my solution is independent on A, because they cancel eachother out. The solution is, however, dependent on E, so I do not understand how it is possible to obtain the same catenary with the “classic” DRM as the catenary constructed using the coordinates of both anchor points and the desired length.

I tried to adjust the loads in each step. In my test case it only changed the result by a very small amount due to very small strains in my cable.

Do you have an idea, how to include the desired total length in the loop?

I’d like to try to write a script myself, which solves my problem similar to the Kangaroo2 solver, by adding the desired length as a goal with a very heigh strength. I read your explanation about Kangaroo2 in this topic: How does Kangaroo solver work? - #3 by DanielPiker and I also read the projective dynamics paper ( You wrote that the Kangaroo2 solver can be seen as a form of the DRM. Does the K2 solver use the explicit time integrating scheme as in the “classic” DRM, or does it rely on solving optimization problems as described in the projective dynamics paper?

Best Regards

When using constant loads and equal rest lengths for the segments, what matters for how accurately it represents a mathematical catenary is the really the ratio of elastic stiffness to load.
A true catenary is defined as the curve formed by an idealised perfectly inextensible and flexible cable under a load constantly distributed along its length. So it has nothing to do with just how heavy or stiff the cable is (or rather it assumes a physically impossible infinitely stiff cable).
Since dynamic relaxation works with finite stiffnesses, to model this inextensibility we just need to use an extremely high stiffness relative to the downward force from the weight. We can make this ratio so high that it is effectively infinite for all practical purposes, even so the difference is less than the numerical error always present when modelling anything with floating point coordinates. Well before reaching that level of accuracy these become purely academic distinctions, since these length differences at building scale are less than the size of a single atom and I don’t know of any contractors who build to those tolerances.
This is all true whether using classical DR, or the projective method in K2, the main difference being just that the projective method can reach this high precision much faster without needing to worry about adjusting the timestep to keep stability.

To form-find a catenary of desired total length, you could -
A - Simply set the desired value as the total rest length of the segments and use very stiff length goals. You can also start with the stiffness moderately high, let it converge, then gradually increase the stiffness all the way up to something like 10e30 (doing it this way will converge faster than just using a super high stiffness value right from the start).
B - Write a script with dynamic weights that update with lengths as described in the last post, and include a strength multiplier of (current total length)/(target total length) in the force calculation at each iteration.

Hi @DanielPiker,

I tried to write a script for the option B of your lost post with dynamic weights and a strength factor. I tried many different combinations for the settings of dt, EA, M_total and the number of iterations. Unfortunatly, it does not work as it should: I do not get a catenary similar to the exact solution. I’d be really thankfull if you could have a look at the script I wrote. Perhaps you know what I’m doing wrong. At the moment, I don’t know where I can find my mistake.

My script is written in Matlab, but I’ll upload it as a text file.
Catenary_DRM.txt (4.4 KB)

Below a plot of my current solution.

Hey, did you manage to find a solution? I am also looking for scripts that applies Barnes methods directly for my paper. I am looking for something that works on a mesh.


Try PlanB as well: a “direct” way to cut the mustard:

1 Like

Thank you