Reaction loads issue

70 views
Skip to first unread message

Roger Bergua

unread,
Jan 7, 2026, 6:23:20 PM (4 days ago) Jan 7
to ProjectChrono
Hi all,

I'm modeling a very easy cantilever beam in the vertical direction. The system has just one cylindrical hollow beam (Euler-Bernoulli) and a clamp condition (ChBody + ChLinkMateGeneric).

The beam has the next properties:
Length: = 2 m 
Outer diameter: Do = 0.2 m
Inne diameter: Di = 0.15 m
Density: rho = 7,860 kg/m^3

The mass of the beam is:
m = pi*((Do/2)^2-(Di/2)^2)*L*rho = 216.06 kg

By applying one acceleration of 10 m/s^2 along x in the radial direction of the beam, the expected applied loads at the clamp side would be:
Fx = 216.06*10 = 2160.6 N
Fy = 0 N
Fz = 0 N
Mx = 0 Nm
My = 216.06*10*(L/2) = 2160.6 Nm
Mz = 0 Nm

I can reproduce this values perfectly in pyChrono.

However, by applying the -10 m/s^2 acceleration along the z direction (i.e., along the beam longitudinal axis) I should get:
Fx = 0 N
Fy = 0 N
Fz = 216.06*(-10) = -2160.6 N
Mx = 0 Nm
My = 0 Nm
Mz = 0 Nm

Instead of this, pyChrono returns Fz = -617.3 N

I'm unable to understand how this value is computed. Maybe there is a better/recommended way to get the loads at the clamp side or the beam itself?

Attached you can find the model in pyChrono to reproduce the above results.

Thanks for the support!

 

 
Reaction_loads_issue.py

Roger Bergua

unread,
Jan 7, 2026, 7:52:04 PM (4 days ago) Jan 7
to ProjectChrono
Attaching the pyChrono file in *.txt format.
Reaction_loads_issue.txt

Radu Serban

unread,
Jan 9, 2026, 7:54:58 AM (3 days ago) Jan 9
to ProjectChrono

Hi Roger,

 

This appears to be a bug in the nonlinear static analysis.

 

I didn’t implement this, so I’m not exactly sure what the thought process was but it’s certainly flawed. There is a static analysis -- so-called “incremental” -- where the external load is applied incrementally (over a given number of iterations, by default 6). However, this load scaling was also used for ChStaticNonLinearAnalysis (which is what you end up running when you call sys.DoStaticNonlinear).  But that is incorrect: indeed, the scaling goes to 1.0 after the specified number of “incremental steps” but, if the nonlinear solver converges in fewer iterations than that, you end up with a solution corresponding to the incorrect load. 

 

I pushed a fix where I removed this “incremental scaling” from all static analysis algorithms, except the one that is meant to use it.

With that, your code generates the expected results.

By the way, you can explicitly create an analysis object so that you can optionally modify various parameters and options. Instead of:

system.DoStaticNonlinear()

use:

static_analysis = ChStaticNonLinearAnalysis()

static_analysis.SetMaxIterations(20)

static_analysis.SetCorrectionTolerance(1e-4, 1e-8)  # test on correction vector

#static_analysis.SetResidualTolerance(1e-8)          # test on residual vector

static_analysis.SetVerbose(True)

system.DoStaticAnalysis(static_analysis)

 

If I recall correctly, you are using a PyChrono conda package. It will take a little bit longer until we build and upload new conda packages. You can wait for those, or else build PyChrono from sources yourself.

 

--Radu

--
You received this message because you are subscribed to the Google Groups "ProjectChrono" group.
To unsubscribe from this group and stop receiving emails from it, send an email to projectchron...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/projectchrono/4f0211fc-e642-4e2f-89d4-583c1e267f13n%40googlegroups.com.

Roger Bergua

unread,
Jan 9, 2026, 2:22:56 PM (2 days ago) Jan 9
to ProjectChrono
Hi Radu,

Thank you very much for the feedback! 

I use the PyChrono conda package. But I can wait. One relatively easy work around to get the proper load is to run a dynamic simulation till reaching the equilibrium of the system and look at the loads at that instant. No worries.

Roger 

Radu Serban

unread,
Jan 11, 2026, 7:58:42 AM (16 hours ago) Jan 11
to ProjectChrono

Roger – new PyChrono conda packages are available at https://anaconda.org/channels/projectchrono/packages/pychrono/files.  Look for files ending with “_45”.

Roger Bergua

unread,
Jan 11, 2026, 9:06:49 AM (15 hours ago) Jan 11
to ProjectChrono
Excellent! Thank you, Radu!
Reply all
Reply to author
Forward
0 new messages