Usability of CalculiX for stacking problem

Hello there, I have no experience with CalculiX, but I have a question regarding the usefulness of CalculiX for the following use case:

My task is to create a simulation of stacked objects like a Jenga tower or a packed euro palette. The simulation should determine if the stack will hold or topple over.
Not all objects will be of equal size, objects might have different properties and might deform differently under stress.

Is this something CalculiX can do?

CalculiX can be used for this, especially if you’re interested in elastic or plastic deformation as part of the stacking behavior. However, for primarily rigid body interactions with many objects, a physics engine or DEM-based tool might be more efficient.

A Jenga tower is used by DS to demonstrate the general contact capabilities in Abaqus. Since CalculiX only has contact pairs, you would have to define many pairs to account for all possible interactions between the falling bricks. Or you can try adding one pair with all external surfaces as both master and slave surfaces (in Abaqus, this would lead to overconstraint, but CalculiX allows it).

However, for rigid multibody structures, it’s better to use MBD software. There aren’t many open-source choices though.

1 Like

Hello again,

I had some time to get more familiar with CalculiX, and I’m back with a few questions.

I created an input file for a simple example involving three stacked boxes. Here’s what I did:

  • Defined the nodes for each box (8 per box)
  • Grouped the nodes into elements (C3D8) and created appropriate node sets
  • Fixed the bottom nodes in Z using a boundary condition
  • Defined a material and assigned it to three solid sections corresponding to the three boxes
  • Created element-based surfaces for the top and bottom of each box
  • Defined surface interactions and contact behavior, then set up surface-to-surface contact pairs for the touching surfaces
  • Added a dynamic step (NLGEO) applying gravity over 10 seconds, and output the results to the .dat file

My questions are:

  • Does this approach seem correct overall, or are there any major or minor mistakes I might have made?
  • The .dat file contains values, but only for the first ~0.8 seconds, not for the defined 10 seconds of simulation time. Why is that?
  • Later on, objects will be more complex, with more nodes, maybe even different materials.
    What simulation duration can be expected for a lot of more complex objects, lets say 100 somehow shaped objects, is it seconds or minutes or rather hours or days?
  • Is it correct to apply gravity like this -9.81, 0, 0, -1? I read differing statements.
  • I also read about the different element types, is there a better one than C3D8 for my problem?

Thanks a lot for taking your time to answer.
My input file:

*HEADING
CALCULIXJOB_3BOXES

*NODE
1, -0.5,-0.5,0
2, 0.5,-0.5,0
3, 0.5,0.5,0
4, -0.5,0.5,0
5, -0.5,-0.5,1
6, 0.5,-0.5,1
7, 0.5,0.5,1
8, -0.5,0.5,1

9, -1,-1,1
10, 1,-1,1
11, 1,1,1
12, -1,1,1
13, -1,-1,3
14, 1,-1,3
15, 1,1,3
16, -1,1,3

17, -0.5,-0.5,3
18, 0.5,-0.5,3
19, 0.5,0.5,3
20, -0.5,0.5,3
21, -0.5,-0.5,4
22, 0.5,-0.5,4
23, 0.5,0.5,4
24, -0.5,0.5,4

*ELEMENT, TYPE=C3D8, ELSET=ELEMENTSET_BOTTOM
1,1,2,3,4,5,6,7,8

*ELEMENT, TYPE=C3D8, ELSET=ELEMENTSET_MIDDLE
2,9,10,11,12,13,14,15,16

*ELEMENT, TYPE=C3D8, ELSET=ELEMENTSET_TOP
3,17,18,19,20,21,22,23,24

*NSET, NSET=NODESET_BOTTOM
1,2,3,4,5,6,7,8

*NSET, NSET=NODESET_MIDDLE
9,10,11,12,13,14,15,16

*NSET, NSET=NODESET_TOP
17,18,19,20,21,22,23,24

*NSET, NSET=FIXED_NODES
1,2,3,4

*NSET, NSET=ALL_NODES
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
17,18,19,20,21,22,23,24

*ELSET, ELSET=ALL_ELEMENTS
1,2,3

*MATERIAL, NAME=CARDBOARD
*ELASTIC
300, 0.33
*DENSITY
1000

*SOLID SECTION, ELSET=ELEMENTSET_BOTTOM, MATERIAL=CARDBOARD

*SOLID SECTION, ELSET=ELEMENTSET_MIDDLE, MATERIAL=CARDBOARD

*SOLID SECTION, ELSET=ELEMENTSET_TOP, MATERIAL=CARDBOARD

*BOUNDARY
FIXED_NODES, 3

*SURFACE, NAME=SURFACE_BOTTOM_BOTTOM, TYPE=ELEMENT
ELEMENTSET_BOTTOM, S1

*SURFACE, NAME=SURFACE_BOTTOM_TOP, TYPE=ELEMENT
ELEMENTSET_BOTTOM, S2

*SURFACE, NAME=SURFACE_MIDDLE_BOTTOM, TYPE=ELEMENT
ELEMENTSET_MIDDLE, S1

*SURFACE, NAME=SURFACE_MIDDLE_TOP, TYPE=ELEMENT
ELEMENTSET_MIDDLE, S2

*SURFACE, NAME=SURFACE_TOP_BOTTOM, TYPE=ELEMENT
ELEMENTSET_TOP, S1

*SURFACE, NAME=SURFACE_TOP_TOP, TYPE=ELEMENT
ELEMENTSET_TOP, S2

*SURFACE INTERACTION, NAME=CONTACT1
*SURFACE BEHAVIOR, PRESSURE-OVERCLOSURE=HARD
*FRICTION
0.2

*CONTACT PAIR, INTERACTION=CONTACT1, TYPE=SURFACE TO SURFACE
SURFACE_MIDDLE_BOTTOM, SURFACE_BOTTOM_TOP

*CONTACT PAIR, INTERACTION=CONTACT1, TYPE=SURFACE TO SURFACE
SURFACE_TOP_BOTTOM, SURFACE_MIDDLE_TOP

*STEP, NLGEOM
*DYNAMIC
0.1, 10, 0.001, 0.1
*DLOAD
ALL_ELEMENTS, GRAV, -9.81, 0, 0, -1

*NODE PRINT, NSET=ALL_NODES
U
*EL PRINT, ELSET=ALL_ELEMENTS
S, E
*NODE FILE, NSET=ALL_NODES
U
*EL FILE, ELSET=ALL_ELEMENTS
S, E
*END STEP

@Grotenzark , before running a dynamic simulation it often makes sense to try with a nonlinear static first.
Your Youngs module seems far too low compared to your gravity load.
Your gravity load goes in wrong direction, you apply a negative load in a negative direction with ends with a gravity load positive in Z-direction
so you should either use this
ALL_ELEMENTS, GRAV, -9.81, 0, 0, 1
or this
ALL_ELEMENTS, GRAV, 9.81, 0, 0, -1
to obtain something like the picture