Let us consider sound in a glass. Numerical model has been described here. FEM code is given by
<< NDSolve`FEM`;
L = 0.14; L1 = 0.01; del = 0.003; r1 = 0.085/2; r2 = 0.055/2;
polygon =
Polygon[{{0, 0, 0}, {r2 + del, 0, 0}, {r2 + del, 0, L1}, {r1 + del,
0, L}, {r1, 0, L}, {r2, 0, L1}, {0, 0, L1}}];
Needs["OpenCascadeLink`"]
shape = OpenCascadeShape[polygon];
axis = {{0, 0, 0}, {0, 0, 3/2 L}}; sweep =
OpenCascadeShapeRotationalSweep[shape, axis, 2 Pi];
bmesh = OpenCascadeShapeSurfaceMeshToBoundaryMesh[sweep,
"ShapeSurfaceMeshOptions" -> {"LinearDeflection" -> 0.0003}];
Show[Graphics3D[{{Red, polygon}, {Blue, Thick, Arrow[axis]}}],
bmesh["Wireframe"], Boxed -> False]
mesh = ToElementMesh[bmesh, AccuracyGoal -> 5, PrecisionGoal -> 5,
"MeshOrder" -> 1]
mesh["Wireframe"]
param = {Y -> 56*10^9, \[Nu] -> 25/100}; rho = 2500; cg =
Sqrt[56.*10^9/rho]; nu = 1;
ClearAll[stressOperator];
stressOperator[
Y_, \[Nu]_] := {Inactive[
Div][{{0, 0, -((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu])))}, {0, 0,
0}, {-Y/(2*(1 + \[Nu])), 0, 0}} .
Inactive[Grad][w[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{0, -((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu]))),
0}, {-Y/(2*(1 + \[Nu])), 0, 0}, {0, 0, 0}} .
Inactive[Grad][v[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{-((Y*(1 - \[Nu]))/((1 - 2*\[Nu])*(1 + \[Nu]))), 0,
0}, {0, -Y/(2*(1 + \[Nu])), 0}, {0, 0, -Y/(2*(1 + \[Nu]))}} .
Inactive[Grad][u[t, x, y, z], {x, y, z}], {x, y, z}],
Inactive[
Div][{{0, 0, 0}, {0,
0, -((Y*\[Nu])/((1 -
2*\[Nu])*(1 + \[Nu])))}, {0, -Y/(2*(1 + \[Nu])), 0}} .
Inactive[Grad][w[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{0, -Y/(2*(1 + \[Nu])),
0}, {-((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu]))), 0, 0}, {0, 0,
0}} . Inactive[Grad][u[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{-Y/(2*(1 + \[Nu])), 0,
0}, {0, -((Y*(1 - \[Nu]))/((1 - 2*\[Nu])*(1 + \[Nu]))),
0}, {0, 0, -Y/(2*(1 + \[Nu]))}} .
Inactive[Grad][v[t, x, y, z], {x, y, z}], {x, y, z}],
Inactive[
Div][{{0, 0, 0}, {0,
0, -Y/(2*(1 + \[Nu]))}, {0, -((Y*\[Nu])/((1 -
2*\[Nu])*(1 + \[Nu]))), 0}} .
Inactive[Grad][v[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{0, 0, -Y/(2*(1 + \[Nu]))}, {0, 0,
0}, {-((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu]))), 0, 0}} .
Inactive[Grad][u[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{-Y/(2*(1 + \[Nu])), 0, 0}, {0, -Y/(2*(1 + \[Nu])),
0}, {0, 0, -((Y*(1 - \[Nu]))/((1 - 2*\[Nu])*(1 + \[Nu])))}} .
Inactive[Grad][w[t, x, y, z], {x, y, z}], {x, y, z}]};
{vals, funs} =
NDEigensystem[{stressOperator[56*10^9, 1/4] +
rho {D[u[t, x, y, z], {t, 2}], D[v[t, x, y, z], {t, 2}],
D[w[t, x, y, z], {t, 2}]} +
0 nu {D[u[t, x, y, z], {t, 1}], D[v[t, x, y, z], {t, 1}],
D[w[t, x, y, z], {t, 1}]} == {0, 0, 0},
DirichletCondition[{u[t, x, y, z] == 0, v[t, x, y, z] == 0,
w[t, x, y, z] == 0}, z == 0]}, {u, v, w},
t, {x, y, z} \[Element] mesh, 12];
In v.12.1 we have
Abs[vals]/(2 Pi)
Out[]= {1973.97, 1973.97, 1974.85, 1974.85, 2169.46, 2169.46, \
2250.23, 2250.23, 4183.75, 4183.75, 5532.1, 5532.1}
In v.13.01 there are two warnings
Eigensystem::maxit2: Warning: maximum number of iterations, 1000, has been reached by the Arnoldi algorithm without convergence to the specified tolerance, but the current best computed value has been returned. You can use method options with Method -> {Arnoldi, opts} to increase the size of basis vectors, the maximum number of iterations, reduce the tolerance, or use an estimate as a shift, any of which may help.
Eigensystem::chnpdef: Warning: there is a possibility that the second matrix SparseArray[Specified elements: 705552
Dimensions: {64620,64620}
in the first argument is not positive definite, which is necessary for the Arnoldi method to give accurate results.
But nevertheless we have same results as above
Abs[vals]/(2 Pi)
Out[]= {1973.97, 1973.97, 1974.85, 1974.85, 2169.46, 2169.46, \
2250.23, 2250.23, 4183.75, 4183.75, 5532.1, 5532.1}
In v.13.2.1 we have 3 warnings and nothing out
Eigensystem::arerr: Could not continue Arnoldi algorithm because the required eigenvectors cannot be computed.
Set::shape: Lists {vals,funs} and NDEigensystem[...,12] are not the same shape.
Eigensystem::arerr: Could not continue Arnoldi algorithm because the required eigenvectors cannot be computed.
What happened with Arnoldi algorithm between v. 12.1 and v.13.2.1?
Update 1. We can force Arnoldi algorithm with using options for NDEigensystem
and removing options in mesh generator as follows
<< NDSolve`FEM`;
L = 0.14; L1 = 0.01; del = 0.003; r1 = 0.085/2; r2 = 0.055/2;
polygon =
Polygon[{{0, 0, 0}, {r2 + del, 0, 0}, {r2 + del, 0, L1}, {r1 + del,
0, L}, {r1, 0, L}, {r2, 0, L1}, {0, 0, L1}}];
Needs["OpenCascadeLink`"]
shape = OpenCascadeShape[polygon];
axis = {{0, 0, 0}, {0, 0, 3/2 L}}; sweep =
OpenCascadeShapeRotationalSweep[shape, axis, 2 Pi];
bmesh = OpenCascadeShapeSurfaceMeshToBoundaryMesh[sweep,
"ShapeSurfaceMeshOptions" -> {"LinearDeflection" -> 0.0003}];
Show[Graphics3D[{{Red, polygon}, {Blue, Thick, Arrow[axis]}}],
bmesh["Wireframe"], Boxed -> False]
mesh = ToElementMesh[bmesh]
mesh["Wireframe"]
param = {Y -> 56*10^9, \[Nu] -> 25/100}; rho = 2500; cg =
Sqrt[56.*10^9/rho]; nu = 1;
ClearAll[stressOperator];
stressOperator[
Y_, \[Nu]_] := {Inactive[
Div][{{0, 0, -((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu])))}, {0, 0,
0}, {-Y/(2*(1 + \[Nu])), 0, 0}} .
Inactive[Grad][w[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{0, -((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu]))),
0}, {-Y/(2*(1 + \[Nu])), 0, 0}, {0, 0, 0}} .
Inactive[Grad][v[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{-((Y*(1 - \[Nu]))/((1 - 2*\[Nu])*(1 + \[Nu]))), 0,
0}, {0, -Y/(2*(1 + \[Nu])), 0}, {0, 0, -Y/(2*(1 + \[Nu]))}} .
Inactive[Grad][u[t, x, y, z], {x, y, z}], {x, y, z}],
Inactive[
Div][{{0, 0, 0}, {0,
0, -((Y*\[Nu])/((1 -
2*\[Nu])*(1 + \[Nu])))}, {0, -Y/(2*(1 + \[Nu])), 0}} .
Inactive[Grad][w[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{0, -Y/(2*(1 + \[Nu])),
0}, {-((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu]))), 0, 0}, {0, 0,
0}} . Inactive[Grad][u[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{-Y/(2*(1 + \[Nu])), 0,
0}, {0, -((Y*(1 - \[Nu]))/((1 - 2*\[Nu])*(1 + \[Nu]))),
0}, {0, 0, -Y/(2*(1 + \[Nu]))}} .
Inactive[Grad][v[t, x, y, z], {x, y, z}], {x, y, z}],
Inactive[
Div][{{0, 0, 0}, {0,
0, -Y/(2*(1 + \[Nu]))}, {0, -((Y*\[Nu])/((1 -
2*\[Nu])*(1 + \[Nu]))), 0}} .
Inactive[Grad][v[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{0, 0, -Y/(2*(1 + \[Nu]))}, {0, 0,
0}, {-((Y*\[Nu])/((1 - 2*\[Nu])*(1 + \[Nu]))), 0, 0}} .
Inactive[Grad][u[t, x, y, z], {x, y, z}], {x, y, z}] +
Inactive[
Div][{{-Y/(2*(1 + \[Nu])), 0, 0}, {0, -Y/(2*(1 + \[Nu])),
0}, {0, 0, -((Y*(1 - \[Nu]))/((1 - 2*\[Nu])*(1 + \[Nu])))}} .
Inactive[Grad][w[t, x, y, z], {x, y, z}], {x, y, z}]};
{vals, funs} =
NDEigensystem[{stressOperator[56.*10^9, 1./4] +
rho {D[u[t, x, y, z], {t, 2}], D[v[t, x, y, z], {t, 2}],
D[w[t, x, y, z], {t, 2}]} +
0 nu {D[u[t, x, y, z], {t, 1}], D[v[t, x, y, z], {t, 1}],
D[w[t, x, y, z], {t, 1}]} == {0, 0, 0},
DirichletCondition[{u[t, x, y, z] == 0, v[t, x, y, z] == 0,
w[t, x, y, z] == 0}, z == 0]}, {u, v, w},
t, {x, y, z} \[Element] mesh, 6,
Method -> {"Eigensystem" -> {"Arnoldi", "MaxIterations" -> 1000,
Tolerance -> 0.01}}];
With this code we have
Abs[vals]/(2 Pi)
Out[]= {1375.35, 1375.35, 1375.4, 1375.4, 1943.75, 1943.75}
This result is differ from that we discussed here. Nevertheless visualization shows that fifth eigenfunction looks like fifth one in v.12.1,
{DensityPlot3D[Re[funs[[1, 1]][x, y, z]], {x, y, z} \[Element] mesh,
ColorFunction -> "Rainbow", OpacityFunction -> None, Boxed -> False,
PlotLabel -> Row[{"f = ", Abs[vals [[1]]]/2/Pi}],
BoxRatios -> Automatic, PlotPoints -> 50], DensityPlot3D[Re[funs[[5, 1]][x, y, z]], {x, y, z} \[Element] mesh,
ColorFunction -> "Rainbow", OpacityFunction -> None, Boxed -> False,
PlotLabel -> Row[{"f = ", Abs[vals [[5]]]/2/Pi}],
BoxRatios -> Automatic, PlotPoints -> 50]}
Update 2. As it mentioned by user21 we generate mesh
in v.12.2 and then export it in v.13.2 using DumpSave["mesh.mx", mesh]
in v.12.2 and << mesh.mx
in v.13.2. The result of
{vals, funs} =
NDEigensystem[{stressOperator[56*10^9, 1/4] +
rho {D[u[t, x, y, z], {t, 2}], D[v[t, x, y, z], {t, 2}],
D[w[t, x, y, z], {t, 2}]} +
0 nu {D[u[t, x, y, z], {t, 1}], D[v[t, x, y, z], {t, 1}],
D[w[t, x, y, z], {t, 1}]} == {0, 0, 0},
DirichletCondition[{u[t, x, y, z] == 0, v[t, x, y, z] == 0,
w[t, x, y, z] == 0}, z == 0]}, {u, v, w},
t, {x, y, z} \[Element] mesh, 12];
in v.13.2 is same as in v.12.2. For example,
Abs[vals]/(2 Pi)
Out[]= {1973.97, 1973.97, 1974.85, 1974.85, 2169.46, 2169.46, \
2250.23, 2250.23, 4183.75, 4183.75, 5532.1, 5532.1}
Visualization
{DensityPlot3D[Re[funs[[1, 1]][x, y, z]], {x, y, z} \[Element] mesh,
ColorFunction -> "Rainbow", OpacityFunction -> None, Boxed -> False,
PlotLabel -> Row[{"f = ", Abs[vals [[1]]]/2/Pi}],
BoxRatios -> Automatic, PlotPoints -> 50],DensityPlot3D[
Re[funs[[5, 1]][x, y, z]], {x, y, z} \[Element] mesh,
ColorFunction -> "Rainbow", OpacityFunction -> None, Boxed -> False,
PlotLabel -> Row[{"f = ", Abs[vals[[5]]]/2/Pi}],
BoxRatios -> Automatic, PlotPoints -> 50],
DensityPlot3D[Re[funs[[7, 1]][x, y, z]], {x, y, z} \[Element] mesh,
ColorFunction -> "Rainbow", OpacityFunction -> None, Boxed -> False,
PlotLabel -> Row[{"f = ", Abs[vals[[7]]]/2/Pi}],
BoxRatios -> Automatic, PlotPoints -> 50]}
$Version
out"13.2.1 for Microsoft Windows (64-bit) (January 27, 2023)"
$\endgroup$