Buckling of composite panels

I converted your modified model to COSMIC NASTRAN (another of my favorite open source codes, even if outdated) and looks like it still struggles to find the eigenvalues. Most efficient method there is FEER method (1995) a predecessor of arpack implementation but didn’t catch the eigenvalues very well (a couple of spurious modes) but provided an approximation so from those values I used the inverse power method which is very slow and has many limitations but quite accurate when you are searching for a specific eigenvalue. Shapes and eigenvalues look correct to me and should differ only slightly from those provided by Abaqus (different element formulation). I provide all files in this link

Results can be plotted using pyNastran.

first mode: 1.234892E+00

1 Like

Using Calculix 2.20 (with SPOOLES) on FreeBSD, I get:

     B U C K L I N G   F A C T O R   O U T P U T

 MODE NO       BUCKLING
                FACTOR

      1   0.1148593E+01

This is what it looks like:

Your material properties seem a little bit off to me.

Although trained as a mechanical engineer, I’ve spent my whole career in composites. When I started, software for calculating laminate properties was thin on the ground. Especially free/open source software.
So I wrote my own (in Python), based on the ready available literature, called lamprop.
It calculates properties based on both classical laminate theory and the more recent work of Ever J. Barbero.

Details of how it calculates the results can be found in the file lp/core.py in the abovementioned repository. It uses some simplifications w.r.t. fiber/lamina properties because outside of textbooks the data for classical laminate theory of fiber reinforced plastics is hard to find.

This is what I get when I calculate values for your laminates, based on 60% fiber volume fraction for unidirectional carbon fiber and 55% for glass fiber.
These are reasonably obtainable values, both for RTM-light, vacuum infusion and autoclave processing.
(The input data for lamprop is shown below the results.)

Generated by lamprop 2022-06-22
laminate: Carbon_UD
thickness: 0.28 mm, density: 1.54 g/cm³
fiber volume fraction: 60%, fiber weight fraction: 69.8%
laminate weight: 430 g/m², resin consumption: 130 g/m²
num weight angle   vf fiber
    [g/m²]   [°]  [%]
  1    300     0   60 pyrofilTR30S
In-plane engineering properties:
E_x  = 142240 MPa, E_y  = 15779 MPa, E_z  = 15779 MPa 
G_xy  = 4960 MPa, G_xz  = 4133 MPa, G_yz  = 7043 MPa 
ν_xy = 0.22000
α_x = -1.469e-07 K⁻¹, α_y =   2.4e-05 K⁻¹
Engineering properties derived from 3D stiffness matrix:
E_x = 142240 MPa, E_y = 15779 MPa, E_z = 15779 MPa
G_xy = 4960 MPa, G_xz = 4960 MPa, G_yz = 8452 MPa
ν_xy = 0.220, ν_xz = 0.220, ν_yz = -0.067
** Material data for CalculiX / Abaqus (SI units):
*MATERIAL,NAME=Carbon_UD
*ELASTIC,TYPE=ORTHO
1.437e+11,3.288e+09,1.592e+10,3.288e+09,-9.798e+08,1.592e+10,4.96e+09,4.96e+09,
8.452e+09,293
*DENSITY
1538

Generated by lamprop 2022-06-22
laminate: Glass_UD
thickness: 0.21 mm, density: 1.95 g/cm³
fiber volume fraction: 55%, fiber weight fraction: 73.3%
laminate weight: 410 g/m², resin consumption: 110 g/m²
num weight angle   vf fiber
    [g/m²]   [°]  [%]
  1    300     0   55 e-glas
In-plane engineering properties:
E_x  = 41545 MPa, E_y  = 11873 MPa, E_z  = 11873 MPa 
G_xy  = 4271 MPa, G_xz  = 3559 MPa, G_yz  = 4832 MPa 
ν_xy = 0.29400
α_x = 6.465e-06 K⁻¹, α_y =   2.2e-05 K⁻¹
Engineering properties derived from 3D stiffness matrix:
E_x = 41545 MPa, E_y = 11873 MPa, E_z = 11873 MPa
G_xy = 4271 MPa, G_xz = 4271 MPa, G_yz = 5798 MPa
ν_xy = 0.294, ν_xz = 0.294, ν_yz = 0.024
** Material data for CalculiX / Abaqus (SI units):
*MATERIAL,NAME=Glass_UD
*ELASTIC,TYPE=ORTHO
4.376e+10,3.766e+09,1.22e+10,3.766e+09,6.072e+08,1.22e+10,4.271e+09,4.271e+09,
5.798e+09,293
*DENSITY
1952

Generated by lamprop 2022-06-22
laminate: Glass_Biax
thickness: 0.84 mm, density: 1.95 g/cm³
fiber volume fraction: 55%, fiber weight fraction: 73.3%
laminate weight: 1638 g/m², resin consumption: 438 g/m²
num weight angle   vf fiber
    [g/m²]   [°]  [%]
  1    300    45   55 e-glas
  2    300   -45   55 e-glas
  3    300   -45   55 e-glas
  4    300    45   55 e-glas
In-plane engineering properties:
E_x  = 13390 MPa, E_y  = 13390 MPa, E_z  = 11873 MPa 
G_xy  = 11903 MPa, G_xz  = 4196 MPa, G_yz  = 4196 MPa 
ν_xy = 0.56756
α_x = 1.042e-05 K⁻¹, α_y = 1.042e-05 K⁻¹
Engineering properties derived from 3D stiffness matrix:
E_x = 13390 MPa, E_y = 13390 MPa, E_z = 11903 MPa
G_xy = 12108 MPa, G_xz = 5035 MPa, G_yz = 5035 MPa
ν_xy = 0.568, ν_xz = 0.077, ν_yz = 0.077
** Material data for CalculiX / Abaqus (SI units):
*MATERIAL,NAME=Glass_Biax
*ELASTIC,TYPE=ORTHO
2.015e+10,1.16e+10,2.015e+10,2.187e+09,2.187e+09,1.22e+10,1.211e+10,5.035e+09,
5.035e+09,293
*DENSITY
1952

Input data:

Fiber definition
ν12 is estimated 0.20 unless known.
α1 for carbon is estimated -0.12e-6 unless known
    E1      ν12     α1          ρ       name
Carbon
f:  235000  0.20    -0.5e-6     1.79    pyrofilTR30S
Glass
ν12 is estimated 0.33 unless known.
α1 for glass is estimated 5e-6 unless known
f:  73000   0.33    5.3e-6      2.60    e-glas

Matrix definition
ν is estimated 0.36 unless known.
α is estimated 40e-6 unless known.
    Em      ν       α       ρ       name
Epoxies
r:  3100    0.25    40e-6   1.16    SRinfugreen810

Laminate definition
t: Carbon_UD
m: 0.60 SRinfugreen810
l: 300  0 pyrofilTR30S

t: Glass_UD
m: 0.55 SRinfugreen810
l: 300  0 e-glas

t: Glass_Biax
m: 0.55 SRinfugreen810
l: 300  45 e-glas
l: 300 -45 e-glas
s:

Personally I don’t use shell elements all that much, because most of my work deals with sandwiches. And I’ve had no luck getting the connection of shell elements to the solid core elements to work. So I tend to model everything in C3D20 elements.

1 Like

This is a good idea. I am looking to doing the same.
Any chance you can share your patch?

Edit

I did it myself. Here is the patch. Tested with ccx 2.20 supplied with Debian 12.

Enhance *BUCKLE to take sigma as its 5th parameter
Author: David Osterberg
Last-Update: 2024-06-24
---
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
Index: calculix-ccx-2.20/ccx_2.20/src/arpackbu.c
===================================================================
--- calculix-ccx-2.20.orig/ccx_2.20/src/arpackbu.c
+++ calculix-ccx-2.20/ccx_2.20/src/arpackbu.c
@@ -92,7 +92,7 @@ void arpackbu(double *co, ITG *nk, ITG *
     time=0.,*epn=NULL,*fnr=NULL,*fni=NULL,*emn=NULL,*cdn=NULL,
     *xstateini=NULL,*xstiff=NULL,*stiini=NULL,*vini=NULL,*stx=NULL,
     *enern=NULL,*xstaten=NULL,*eei=NULL,*enerini=NULL,*cocon=NULL,
-    *shcon=NULL,*physcon=NULL,*qfx=NULL,*qfn=NULL,tol, *cgr=NULL,
+    *shcon=NULL,*physcon=NULL,*qfx=NULL,*qfn=NULL,tol,sigma_bu, *cgr=NULL,
     *xloadold=NULL,reltime,*vr=NULL,*vi=NULL,*stnr=NULL,*stni=NULL,
     *vmax=NULL,*stnmax=NULL,*cs=NULL,*springarea=NULL,*eenmax=NULL,
     *emeini=NULL,*doubleglob=NULL,*au=NULL,*clearini=NULL,
@@ -118,6 +118,7 @@ void arpackbu(double *co, ITG *nk, ITG *
   ncv=mei[1];
   mxiter=mei[2];
   tol=fei[0];
+  sigma_bu=fei[1];

   /* calculating the stresses due to the buckling load; this is a second
      order calculation if iperturb != 0 */
@@ -491,7 +492,7 @@ void arpackbu(double *co, ITG *nk, ITG *
      else sigma is set to buckling factor/500, and a new iteration is
      started */

-  sigma=1.;
+  sigma=sigma_bu;

   do{

Index: calculix-ccx-2.20/ccx_2.20/src/buckles.f
===================================================================
--- calculix-ccx-2.20.orig/ccx_2.20/src/buckles.f
+++ calculix-ccx-2.20/ccx_2.20/src/buckles.f
@@ -33,7 +33,7 @@
      &  nforc,nload,ithermal(*),iprestr,i,nk,iperturb(*),iline,ipol,inl,
      &  ipoinp(2,*),inp(3,*),nev,isolver,nbody,ipoinpc(0:*),ier
 !
-      real*8 fei(3),t0(*),t1(*),tol
+      real*8 fei(4),t0(*),t1(*),tol,sigma
 !
       if(istep.lt.1) then
          write(*,*) '*ERROR reading *BUCKLE: *BUCKLE can only be used'
@@ -164,6 +164,15 @@
       if(mxiter.le.0) then
          mxiter=1000
       endif
+      read(textpart(5)(1:20),'(f20.0)',iostat=istat) sigma
+      if(istat.gt.0) then
+         call inputerror(inpc,ipoinpc,iline,
+     &        "*BUCKLE%",ier)
+         return
+      endif
+      if(sigma.eq.0.d0) then
+         sigma=1.0
+      endif
 !
 !     removing the natural boundary conditions
 !
@@ -181,6 +190,7 @@
       mei(2)=ncv
       mei(3)=mxiter
       fei(1)=tol
+      fei(2)=sigma
 !
       call getnewline(inpc,textpart,istat,n,key,iline,ipol,inl,
      &     ipoinp,inp,ipoinpc)

1 Like

sorry for the late response. Well done, my solution is fairly the same: code modified v2.20
https://drive.google.com/drive/folders/12RB2Daf1vUG-wfU7-iovT_KKvtbswE4N?usp=sharing

Can you submit a PR to the main repo for Guido to update this moving forward?
https://github.com/Dhondtguido/CalculiX/pulls