Modelling variable stiffness composites

Hi all,

I would like to share a simple python script that I recently wrote to model a variable stiffness / steered fibre composite panel in compression with CalculiX - in case this is of interest to the community.
I would also be interested to hear if anyone else has attempted to manually expand composite shell models - maybe using other tools such as gmesh?

Here is an overview of what I did:

Variable stiffness composites are laminated composites where both the steering angle and thickness of each ply can change as function of location on the ply, manufactured using AFP / ATL or in my case RTS technology.

The model is parametric, so you can edit the number of plies and steering angles at control points in the PARAMS. It currently assumes RTS manufacturing technology where the local ply thickness is linked to the local sheering angle. As a result, I cannot use the normal composite shell material definition in CalculiX. Instead, the script has these main steps (in the main() function):

  1. Create a 2D mesh of the plate using CGX - this could be imported from another process
  2. Import the 2D mesh into python and calculate the element and node normals (set to z-direction at the moment for the flat panel, but could be calculated from the 2D mesh or maybe even imported??)
  3. Offset the 2D mesh nodes by the local thickness distribution for each laminate substack
  4. Create new elements for each substack
  5. Define the material stiffness properties for each substack (multiple properties per substack depending on the local shearing angle and baseline lamina stiffness) from classical laminate theory
  6. Apply boundary conditions and calculate the model mass (optimisation objective)
  7. Write CCX input files, execute the analysis and read the buckling factor outputs

The model can grow quite quickly in size, since we create a new C3D20R element for each new ply or substack (where you can bunch similar +/- plies together) through the thickness.

The stand-alone python script is on Github: compute.py
And this tutorial covers the design optimisation aspect using the dapta app (disclaimer: I work for Dapta Ltd): Example of a variable stiffness plate in compression

3 Likes

Really Nice @OliviaS

Congratullations, really nice work. Hope Mr. Dhondt implement this spatial dependent material properties like stifness or thickness.

May I ask you something?. When you say, “A second kinematic coupling is applied to the top edge of the plate to keep it straight, whilst allowing nodes to slide in the x and y directions”.

How do the plate buckle with such a BC? Are you only looking for shear modes?

Regards

Thanks @Disla.
Actually the panel is more or less in pure compression along the x axis in this example.
The couplings are used to allow Poissons ratio related expansion in Y on the top edge whilst keeping the edge straight - replicating the assumptions of the reference paper: “In all analysed cases, the four edges are supported against transverse displacement, are free to slide, and are forced to remain straight - the latter condition is not generally guaranteed due to the variable stiffness nature of the laminate.”

There are 2 kinematic couplings defined in the model parametric inputs:

    "support_ymax": {
        "lines": [6, 7, 8],
        "kinematic": "23",
        "ref_node_SPC": "346",
        "surface_vector": [0.0, 1.0, 0.0],
    },
    "loaded_xmax": {
        "lines": [3, 4, 5],
        "kinematic": "13",
        "ref_node_SPC": "356",
        "surface_vector": [1.0, 0.0, 0.0],
        "ref_node_forces": [-10000.0, 0.0, 0.0],
    },

The compression load is applied on the RHS of the panel through the “loaded_xmax” kinematic coupling.
The top edge of the panel is supported through the second kinematic coupling at “support_ymax”. Notice that the {“kinematic”: “23”} statement means the kinematic coupling constrains the node Y and Z displacements only, and nodes are free to move in X on the top edge.
So the generated input file boundary conditions will actually look like this:

############################ SPC constraints on LHS / BOT and inner edges
*BOUNDARY
NFIXED_Y0, 2, ,
NFIXED_Y0, 3, ,
NFIXED_X0, 1, ,
NFIXED_X0, 3, ,
NSUPPORT_Z, 3, ,
############################ COUPLING on TOP edge
*NODE, NSET=NSUPPORT_YMAX
70001,6.250000e-01,7.500000e-01,3.336890e-03
*COUPLING, REF NODE=70001, SURFACE=SSUPPORT_YMAX, CONSTRAINT NAME=SUPPORT_YMAX
*KINEMATIC
2
3
*BOUNDARY
70001, 3, ,
70001, 4, ,
70001, 5, ,
70001, 6, ,
############################ COUPLING on RHS edge
*NODE, NSET=NLOADED_XMAX
70002,1.250000e+00,3.650000e-01,3.323804e-03
*COUPLING, REF NODE=70002, SURFACE=SLOADED_XMAX, CONSTRAINT NAME=LOADED_XMAX
*KINEMATIC
1
3
*BOUNDARY
70002, 3, ,
70002, 4, ,
70002, 5, ,
70002, 6, ,

Really impressive and specially known that you have been able to apply kinematic constrains to laminated shells.
Very clever approach from my point of view.
Thanks for sharing