We are trying to implement buckling using a newly implemented FEM solver. However, if we try to reproduce the buckling phenomena using a thin rod, it is just compressed, and we cannot observe the buckling phenomenon. It may be due to the absence of small noise in the shape of the rod, but we are not sure how to implement this phenomenon. The code we use is attached below.
Needs["NDSolve`FEM`"];
length = 50;
radius = 1;
YoungModulus = 260000;
PoissonRatio = 0.3;
MassDensity = 1300;
Pressure = -1 100000 ;
MaxCellMeasureLength = radius/4;
vars = {{u[x, y, z], v[x, y, z], w[x, y, z]}, {x, y, z}}; pars = <|
"YoungModulus" -> YoungModulus , "PoissonRatio" -> PoissonRatio,
"MassDensity" -> MassDensity|>;
op1 = SolidMechanicsPDEComponent[vars, pars];
[CapitalOmega] = Cylinder[{{0, 0, 0}, {0, 0, length}}, radius];
mesh = ToElementMesh[[CapitalOmega] , MeshQualityGoal -> 1,
MaxCellMeasure -> {"Length" -> MaxCellMeasureLength}];
Subscript[[CapitalGamma], load] =
SolidBoundaryLoadValue[ElementMarker == 2, vars,
pars, <|"Pressure" -> Pressure {0, 0, 1}|>];
Subscript[[CapitalGamma], base] =
SolidDisplacementCondition[ElementMarker == 3, vars,
pars, <|"Displacement" -> {0, 0, 0}|>];
pde = {op1 == Subscript[[CapitalGamma], load],
Subscript[[CapitalGamma], base]};
measure =
AbsoluteTiming[
MaxMemoryUsed[
displacement =
NDSolveValue[
pde, {u[x, y, z], v[x, y, z],
w[x, y, z]}, {x, y, z} [Element] mesh]
]/(1024.^2)];
Print["Time -> ", measure[[1]], "\nMemory -> ", measure[[2]]];
visualizeDeformation[fun : {__InterpolatingFunction},
OptionsPattern[]] :=
Module[{mesh}, mesh = fun[[1]]["ElementMesh"];
Show[{mesh["Wireframe"["MeshElement" -> "BoundaryElements"]],
ElementMeshDeformation[mesh, fun, "ScalingFactor" -> 1
][
"Wireframe"[
"ElementMeshDirective" ->
Directive[EdgeForm[Red], FaceForm[]]]]}, Axes -> True]];
visualizeDeformation[displacement[[All, 0]]]
2023/12/4 Thank you very much for all the comments - they are all informative. But I think I need to clarify why I need the slight shape deviation. I am dealing with interdigitation of blood vessels caused by blood pressure or vessel growth to a longitudinal direction, which seems to have a certain characteristic length. My main interest is where this length comes from.
I started from the linear theory to predict initial growth of pattern as we usually do in other PDE. Euler-Bernoulli beam theory is
0 = -P h''(x) - EI h''''(x)
where P is the pressure caused by growth, and EI is Young's modulus times inertia. This describes the balance of force from pressure and force from elasticity, so if we assume the viscosity-dominant condition in which growth is slow and the growth of the deviation is proportional to the force, the dynamic version of the equation becomes
Then by the linear stability analysis we can obtain
which seem to match the numerical simulation result.
L = 6.28;
EI = 1;
P = 25;
simulationLength = 10;
dx = 0.2;
dt = 0.0001;
nStep = 100;
loopPerStep = Round[simulationLength/dt/nStep];
n = Round[L/dx];
h0 = Table[0.01 (RandomReal[] - 0.5), {n}];
dd[l_] := (RotateLeft[l] + RotateRight[l] - 2 l)/dx/dx;
dhdt[h_] := h + dt (-P dd[h] - EI dd[dd[h]]);
oneStep[h_] := Nest[dhdt, h0, loopPerStep];
result = NestList[oneStep, h0, nStep];
{ Sqrt[P/(2 EI)] // N, ListLinePlot[result[[2]]]}
I am curious whether we could obtain similar winding pattern using FEM simulation. I am not sure whether I can get this by simply changing the pressure direction, and still want to know how to introduce slight shape deviation (in this case h0 = Table[0.01 (RandomReal[] - 0.5), {n}];)
Thank you very much in advance.






NDEigensystem[{op1, Subscript[\[CapitalGamma], base]}, {u[x, y, z], v[x, y, z], w[x, y, z]}, {x, y, z} \[Element] mesh, 1]is all that is needed? – user21 Oct 11 '23 at 07:51