If movement is removed there, deformation of the ring under variable load remains. This can be calculated in the model of an elastic body with the addition of Rayleigh damping. The animation shows the deformation of a rubber ring calculated using FEM and Mathematica 12.
Addendum Code (taken from tutorial and modified for this case) to compute animation
Needs["NDSolve`FEM`"]; \[CapitalOmega] =
ImplicitRegion[4^2 <= x^2 + y^2 <= 5^2, {x, y}];
mesh = ToElementMesh[\[CapitalOmega], {{-5, 5}, {-5, 5}},
"MaxCellMeasure" -> 0.03];
mesh["Wireframe"]
diffusionCoefficients =
"DiffusionCoefficients" -> {{{{-(Y/(1 - \[Nu]^2)),
0}, {0, -((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2)))}}, {{0, -((
Y \[Nu])/(1 - \[Nu]^2))}, {-((Y (1 - \[Nu]))/(
2 (1 - \[Nu]^2))),
0}}}, {{{0, -((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2)))}, {-((
Y \[Nu])/(1 - \[Nu]^2)),
0}}, {{-((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2))),
0}, {0, -(Y/(1 - \[Nu]^2))}}}} /. {Y -> 10^2, \[Nu] ->
33/100}; massCoefficients = "MassCoefficients" -> {{1, 0}, {0, 1}};
vd = NDSolve`VariableData[{"Time", "DependentVariables",
"Space"} -> {t, {u, v}, {x, y}}];
sd = NDSolve`SolutionData[{"Time", "Space"} -> {0.,
ToNumericalRegion[mesh]}];
methodData = InitializePDEMethodData[vd, sd];
loadCoefficients = "LoadCoefficients" -> {{0}, {0}};
"LoadCoefficients" -> {{0}, {0}};
Subscript[\[CapitalGamma], Nv] =
NeumannValue[-3 Sin[Pi t] Sign[y], -1 <= x <=
1]; Subscript[\[CapitalGamma], Du] =
DirichletCondition[u[x, y] == 0,
x == 0]; Subscript[\[CapitalGamma], Nu] =
NeumannValue[0, -1 <= x <= 1];
Subscript[\[CapitalGamma], Dv] =
DirichletCondition[v[x, y] == 0, y == 0];
initCoeffs =
InitializePDECoefficients[vd,
sd, {diffusionCoefficients, massCoefficients, loadCoefficients}];
initBCs =
InitializeBoundaryConditions[vd,
sd, {{Subscript[\[CapitalGamma], Du], Subscript[\[CapitalGamma],
Nu]}, {Subscript[\[CapitalGamma], Dv], Subscript[\[CapitalGamma],
Nv]}}];
sdpde = DiscretizePDE[initCoeffs, methodData, sd, "Stationary"];
sbcs = DiscretizeBoundaryConditions[initBCs, methodData, sd,
"Stationary"];
rhs[t_?NumericQ, uv_, duv_] :=
Module[{l, s, d, m, tdpde, tbcs, rayleighDamping},
NDSolve`SetSolutionDataComponent[sd, "Time", t];
{l, s, d, m} = sdpde["SystemMatrices"];
tdpde = DiscretizePDE[initCoeffs, methodData, sd, "Transient"];
tbcs = DiscretizeBoundaryConditions[initBCs, methodData, sd,
"Transient"];
{l, s, d, m} += tdpde["SystemMatrices"];
rayleighDamping = 0.1*m + 0.04*s;
DeployBoundaryConditions[{l, s, rayleighDamping, m}, tbcs];
DeployBoundaryConditions[{l, s, rayleighDamping, m}, sbcs];
l - s . uv - rayleighDamping . duv
]
dof = methodData["DegreesOfFreedom"];
init = dinit = ConstantArray[0, {dof, 1}];
mass = sdpde["MassMatrix"];
stiff = sdpde["StiffnessMatrix"];
rd = 0.1*mass + 0.04*stiff;
sparsity =
ArrayFlatten[{{mass["PatternArray"],
mass["PatternArray"]}, {rd["PatternArray"], rd["PatternArray"]}}];
Dynamic["time: " <> ToString[CForm[currentTime]]]
AbsoluteTiming[
tfun = NDSolveValue[{
mass . uv''[ t] == rhs[t, uv[t], uv'[t]]
, uv[ 0] == init, uv'[ 0] == dinit}, uv, {t, 0, 2}
, Method -> {"EquationSimplification" -> "Residual"}
, Jacobian -> {Automatic, Sparse -> sparsity}
, EvaluationMonitor :> (currentTime = t;)
]]
Visualization
split = Span @@@
Transpose[{Most[# + 1], Rest[#]} &[methodData["IncidentOffsets"]]];
graphics = Function[t,
dmesh = ElementMeshDeformation[mesh, Part[tfun[t], #] & /@ split];
Show[{
mesh["Wireframe"["MeshElement" -> "BoundaryElements"]],
dmesh[
"Wireframe"[
"ElementMeshDirective" ->
Directive[EdgeForm[Red], FaceForm[]]]]
}, PlotRange -> {{-6, 6}, {-5.5, 5.5}}]] /@ Range[0, 2, .1];
ListAnimate[graphics, SaveDefinitions -> True]