13

enter image description here

I'm trying to get the displacements u(x,y) and v(x,y) of a beam simply suported, the stress distribution in the middle section should be a linear function: enter image description here

but i'm getting this:

enter image description here

My code is:

Needs["NDSolve`FEM`"];
PS = {
  Inactive[
     Div][{{0, -((Y \[Nu])/(1 - \[Nu]^2))}, {-((Y (1 - \[Nu]))/(
        2 (1 - \[Nu]^2))), 0}}.Inactive[Grad][v[x, y], {x, y}], {x, 
     y}] + Inactive[
     Div][{{-(Y/(1 - \[Nu]^2)), 
       0}, {0, -((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2)))}}.Inactive[Grad][
      u[x, y], {x, y}], {x, y}],
  Inactive[
     Div][{{0, -((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2)))}, {-((Y \[Nu])/(
        1 - \[Nu]^2)), 0}}.Inactive[Grad][u[x, y], {x, y}], {x, y}] + 
   Inactive[
     Div][{{-((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2))), 
       0}, {0, -(Y/(1 - \[Nu]^2))}}.Inactive[Grad][
      v[x, y], {x, y}], {x, y}]
  }

L = 2;
q = 6000;
Propiedades = {Y -> 205940000000, \[Nu] -> 30/100};

h1 = 1/2;
h2 = 2;
h3 = 3;

Reg1 = Rectangle[{0, 0}, {L, h1}];
Reg2 = Rectangle[{0, 0}, {L, h2}];
Reg3 = Rectangle[{0, 0}, {L, h3}];

Mesh1 = ToElementMesh[Reg1, MeshQualityGoal -> 0];
Mesh2 = ToElementMesh[Reg2];
Mesh3 = ToElementMesh[Reg3];
{u1, v1, \[Sigma]x1, \[Sigma]y1, \[Tau]xy1} = NDSolveValue[{
     PS == {0, NeumannValue[-q, {0 <= x <= L, y == h1}]},
     \[Sigma]x[x, y] == 
      Y/(1 - \[Nu]^2) (D[u[x, y], x] + \[Nu] D[v[x, y], y]),
     \[Sigma]y[x, y] == 
      Y/(1 - \[Nu]^2) (D[v[x, y], y] + \[Nu] D[u[x, y], x]),
     \[Sigma]xy[x, y] == (Y*\[Nu])/(
       1 - \[Nu]^2) (D[u[x, y], x] + D[v[x, y], y]),
     DirichletCondition[v[x, y] == 0, {x == 0, y == 0}],
     DirichletCondition[v[x, y] == 0, {x == L, y == 0}],
     DirichletCondition[u[x, y] == 0, {x == 0, y == 0}]
     } /. Propiedades, {u, 
    v, \[Sigma]x, \[Sigma]y, \[Sigma]xy}, {x, y} \[Element] Mesh1];

DMesh1 = ElementMeshDeformation[Mesh1, {u1, v1}, 
   "ScalingFactor" -> 2000000];

Row[{
  Show[{Mesh1[
     "Wireframe"[
      "ElementMeshDirective" -> 
       Directive[EdgeForm[Gray], FaceForm[]]]], 
    Graphics[{EdgeForm[Thickness[0.001]], RGBColor[0, 0, 0, 0.1], 
      Reg1}]}, ImageSize -> 300, Epilog -> {
     Scale[Translate[Apoyo2, {-0.5, -0.5}], 0.2],
     Scale[Translate[Apoyo1, {-0.5 + L, -0.5}], 0.2]
     }, PlotRange -> {{-0.1, L + 0.1}, {-0.15, h1 + 0.15}}],
  Show[{
    Mesh1[
     "Wireframe"[
      "ElementMeshDirective" -> 
       Directive[EdgeForm[Gray], FaceForm[]]]],
    DMesh1[
     "Wireframe"[
      "ElementMeshDirective" -> 
       Directive[EdgeForm[RGBColor[0, 0.3, 0.8]], FaceForm[]]]]
    }, ImageSize -> 300]
  }]

Plot[\[Sigma]x1[L/2, y]/1000, {y, 0, h1}, Filling -> Axis, 
 AxesLabel -> {"h[m]", 
   "\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)[kPa]"}, 
 ImageSize -> 400]

I don't why is this happening, but when i set the y coordinate in the Dirichlet Condition to y=h1/2 i get the correct stress distribution

Gonza_
  • 153
  • 6

1 Answers1

17

Your boundary conditions seem to be not quite correct according to the mechanical problem. Sorry, I don't have the time to go through your code today, but I got a version running, although this will take some time and might be an overkill, since it is based on the full 3D theory. I have to go home now, I will try to take a look at your code again tomorrow, if nobody else finds the error.


EDIT: correction of your boundary conditions

Hey Gonza_! In your code, you wanted to treat the mechanical problem as follows.

enter image description here

You only had a slight syntax error in your boundary conditions

(*Wrong*)
bcwrong = {
   DirichletCondition[v[x, y] == 0, {x == 0, y == 0}]
   , DirichletCondition[u[x, y] == 0, {x == 0, y == 0}]
   , DirichletCondition[v[x, y] == 0, {x == L, y == 0}]
   };
(*Correct*)
bccorrect = {
   DirichletCondition[{u[x, y] == 0, v[x, y] == 0}, x == 0 && y == 0]
   , DirichletCondition[v[x, y] == 0, x == L && y == 0]
   };

The difference is that the bcwrong impose a vanishing displacement field at every point with x==0 and at every point with y==0. The correct syntax is given in bccorrect. Working code:

Needs["NDSolve`FEM`"];
(*Geometry*)
L = 2;
h1 = 1/2;
Reg1 = Rectangle[{0, 0}, {L, h1}];
Mesh1 = ToElementMesh[Reg1, MeshQualityGoal -> 0];
(*Forces*)
q = 6000;
(*Material properties*)
Propiedades = {Y -> 205940000000, \[Nu] -> 30/100};
(*2D Hooke's law*)
hl = {
   \[Sigma]x[x, y] == 
    Y/(1 - \[Nu]^2) (D[u[x, y], x] + \[Nu] D[v[x, y], y])
   , \[Sigma]y[x, y] == 
    Y/(1 - \[Nu]^2) (D[v[x, y], y] + \[Nu] D[u[x, y], x])
   , \[Sigma]xy[x, 
     y] == (Y*\[Nu])/(1 - \[Nu]^2) (D[u[x, y], x] + D[v[x, y], y])
   };
(*Equations*)
PS = {Inactive[
      Div][{{0, -((Y \[Nu])/(1 - \[Nu]^2))}, {-((Y (1 - \[Nu]))/(2 (1 \
- \[Nu]^2))), 0}}.Inactive[Grad][v[x, y], {x, y}], {x, y}] + 
    Inactive[
      Div][{{-(Y/(1 - \[Nu]^2)), 
        0}, {0, -((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2)))}}.Inactive[Grad][
       u[x, y], {x, y}], {x, y}], 
   Inactive[
      Div][{{0, -((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2)))}, {-((Y \
\[Nu])/(1 - \[Nu]^2)), 0}}.Inactive[Grad][u[x, y], {x, y}], {x, y}] + 
    Inactive[
      Div][{{-((Y (1 - \[Nu]))/(2 (1 - \[Nu]^2))), 
        0}, {0, -(Y/(1 - \[Nu]^2))}}.Inactive[Grad][
       v[x, y], {x, y}], {x, y}]};
(*BCs*)
(*Neumann*)
bcN = {0, NeumannValue[-q, y == h1]};
(*Wrong*)
bcwrong = {
   DirichletCondition[v[x, y] == 0, {x == 0, y == 0}]
   , DirichletCondition[u[x, y] == 0, {x == 0, y == 0}]
   , DirichletCondition[v[x, y] == 0, {x == L, y == 0}]
   };
(*Correct*)
bccorrect = {
   DirichletCondition[{u[x, y] == 0, v[x, y] == 0}, x == 0 && y == 0]
   , DirichletCondition[v[x, y] == 0, x == L && y == 0]
   };
(*FEM-solution*)
{u1, v1, \[Sigma]x1, \[Sigma]y1, \[Tau]xy1} = 
  NDSolveValue[{PS == bcN, hl, bccorrect} /. Propiedades, {u, 
    v, \[Sigma]x, \[Sigma]y, \[Sigma]xy}
   , Element[{x, y}, Mesh1]];
(*Deformation*)
DMesh1 = ElementMeshDeformation[Mesh1, {u1, v1}, 
   "ScalingFactor" -> 6*10^4];
Show[{Mesh1[
   "Wireframe"[
    "ElementMeshDirective" -> Directive[EdgeForm[Gray], FaceForm[]]]],
   DMesh1[
   "Wireframe"[
    "ElementMeshDirective" -> 
     Directive[EdgeForm[RGBColor[0, 0.3, 0.8]], FaceForm[]]]]}, 
 ImageSize -> 300]
(*Normal stress at x=L/2 depending on y*)
Plot[\[Sigma]x1[L/2, y]/1000, {y, 0, h1}, Filling -> Axis, 
 AxesLabel -> {"h[m]", 
   "\!\(\*SubscriptBox[\(\[Sigma]\), \(x\)]\)[kPa]"}, 
 ImageSize -> 400]

enter image description here


General 3D theory

I treated the problem as follows (length in x direction L1, in virtual y direction L2 and in z direction L3)

enter image description here

First, let's get a reference solution of the 1D theory:

(*Geometry - in m*)
L1 = 2;
L2 = 0.1;
L3 = 0.2;
Iy = L2*L3^3/12;
(*Force and densities - in N*)
F = 10;
qA = F/(L1*L2); (*area density - for 3D FEM*)
ql = qA*L2; (*line density - for 1D theory*)
(*Material parameters*)
Em = 2.1*10^9; (*Young's modulus*)
nu = 0.3;(*Poisson's ration*)
(*1D theory*)
wsol1D = DSolveValue[{
    Em*Iy*D[w[x], {x, 4}] == ql
    , (w[0]) == 0, (w[L1]) == 0
    , (w''[0]) == 0, (w''[L1]) == 0
    }, w, x];
My = -Em*Iy*wsol1D''[x];(*Moment*)
sig = My/Iy*z;(*normal stress*)
GraphicsRow[{
  Plot[wsol1D[x], {x, 0, L1}, AxesLabel -> {"x", "w(x)"}]
  , Plot[sig /. x -> L1/2, {z, -L3/2, L3/2}, 
   AxesLabel -> {"z", "\[Sigma](x=L1/2,z)"}]
  }
 , ImageSize -> Large
 ]

enter image description here

Now, let's get the full 3D FEM solution (takes 1.4 seconds for me) with a area force density

(*FEM solution*)
Needs["NDSolve`FEM`"]
(******************************)
(*Region definition*)
reg = Cuboid[{0, -L2/2, -L3/2}, {L1, L2/2, L3/2}];
(******************************)
(*Isotropic material stiffness - fourth-order tensor*)
(*Identities*)
I2 = IdentityMatrix@3;
IdI = TensorProduct[I2, I2];
I4 = TensorTranspose[IdI, {1, 3, 2, 4}];
IS = (I4 + TensorTranspose[I4, {1, 2, 4, 3}])/2;
(*Isotropic projectors*)
P1 = 1/3*IdI;
P2 = IS - P1;
(*Isotropic stiffness*)
Ciso = l1*P1 + l2*P2;
l1 = 3*Km;
l2 = 2*Gm;
Km = 1/3*Em/(1 - 2*nu);
Gm = 1/2*Em/(1 + nu);
(******************************)
(*Equations*)
eq = Table[
   Inactive[Div][
     Ciso[[i, ;; , 1, ;;]].Inactive[Grad][u[x, y, z], {x, y, z}], {x, 
      y, z}]
    + Inactive[Div][
     Ciso[[i, ;; , 2, ;;]].Inactive[Grad][v[x, y, z], {x, y, z}], {x, 
      y, z}]
    + Inactive[Div][
     Ciso[[i, ;; , 3, ;;]].Inactive[Grad][w[x, y, z], {x, y, z}], {x, 
      y, z}]
   , {i, 3}
   ];
(******************************)
(*BCs*)
(*Dirichlet*)
bcD = {
   DirichletCondition[{u[x, y, z] == 0, v[x, y, z] == 0, 
     w[x, y, z] == 0}, x == 0 && z == 0]
   , DirichletCondition[{v[x, y, z] == 0, w[x, y, z] == 0}, 
    x == L1 && z == 0]
   };
(*Neumann*)
bcN = {0, 0, NeumannValue[-qA, z == -L3/2]};
(******************************)
(*Solution*)
{usol, vsol, wsol} = 
   NDSolveValue[{eq == bcN, bcD}, {u, v, w}, Element[{x, y, z}, reg], 
    Method -> {"PDEDiscretization" -> {"FiniteElement", 
        "MeshOptions" -> {"MaxCellMeasure" -> 0.0001, 
          "MeshOrder" -> 2}}}
    ]; // AbsoluteTiming

{1.4435, Null}

You can take a look at the deformed mesh if you want

mesh = usol["ElementMesh"];
Show[{
  mesh["Wireframe"]
  , ElementMeshDeformation[mesh, {usol, vsol, wsol}, 
    "ScalingFactor" -> 10^4][
   "Wireframe"[
    "ElementMeshDirective" -> Directive[EdgeForm[Red], FaceForm[]]]]
  }, Axes -> True, AxesLabel -> {x, y, z}]

enter image description here

The FEM solution (FEM solution as red points) is in good accordance with the analytical 1D theory

Plot[wsol1D[x], {x, 0, L1}, 
 Epilog -> {PointSize -> Medium, Red, 
   Point[Table[{x, wsol[x, 0, 0]}, {x, 0, L1, L1/10}]]}]

enter image description here

You can get the stress distribution at any point with the full 3D Hooke's law $\sigma_{ij} = C_{ijkl} u_{k,l}$ (FEM solution as red points) (remark: you dont need to symmetrize the displacement grandient in my code in order to obtain the infinitesimal strain, since the stiffness $C_{ijkl}$ I used symmetrizes automatically the mapped tensor). Let's get $\sigma_{xx} = \sigma_{11}$

uv[x_, y_, z_] := {usol[x, y, z], vsol[x, y, z], wsol[x, y, z]}
eps[xs_, ys_, zs_] := 
 D[uv[x, y, z], {{x, y, z}, 1}] /. {x -> xs, y -> ys, z -> zs}
(*linear map of second order tensor B over fourth-order tensor A*)
lm[A_, B_] := TensorContract[TensorProduct[A, B], {{3, 5}, {4, 6}}]
(*Get Cauchy stress sigma_xx = sigma[[1,1]], at x=L1/2 depending on z with 3D Hooke's law*)
sigloc = lm[Ciso, eps[L1/2, 0, z]][[1, 1]];
siglocdata = Table[{zi, sigloc /. z -> zi}, {zi, -L3/2, L3/2, L3/10}];
Plot[sig /. x -> L1/2, {z, -L3/2, L3/2}, 
 AxesLabel -> {"z", "\[Sigma](x=L1/2,z)"}, 
 Epilog -> {PointSize -> Medium, Red, Point@siglocdata}]

enter image description here

Mauricio Fernández
  • 5,463
  • 21
  • 45
  • Thank you very much for your help! yeah, i knowed that the problem was in the boundary conditions. It's my first time using FEM and i really didn't know how to define the conditions. – Gonza_ Nov 29 '16 at 08:46
  • Very nice answer! Two small remarks. The deformation is in the positive z axis, but the force is in the negative z axis, probably a sign issue. Concerning the (small) discrepancy between beam theory and the FEM, I think some of that is due to numerical error and some it due to the difference in the theory behind the two approaches. It would be nice to show a pre-stressed beam, which looks like it would not be too hard in your formulation - though that had not been asked for ;-) It's great to seem some struct. mech. knowledge here. – user21 Nov 29 '16 at 08:53
  • @Gonza_ what do you all think should we have a FEM for structural mechanics tutorial? – user21 Nov 29 '16 at 08:54
  • @Gonza_ no worries, I just added the response to your code, you only had a small syntax error. – Mauricio Fernández Nov 29 '16 at 09:20
  • @user21 thank you! It was kind of fun to work on a good example between the 1D theory and the FEM solution combined with the full 3D theory. I used the $z$ axis in that direction since it is the "common" way to do it where I studied. I think this one would actually be a very good introduction example for structural mechanics. – Mauricio Fernández Nov 29 '16 at 09:23
  • @user21 I think a structural mechanics tutorial would be an excellent idea. I had a look at the OP approach and I could not see anything wrong with it. Can you see the problem? Is it permitted to apply boundary conditions to a single point? – Hugh Nov 29 '16 at 09:40
  • @Hugh the problem was in his boundary conditions, I edited my answer an corrected his code. You can impose conditions on single points, see my correction. – Mauricio Fernández Nov 29 '16 at 09:43
  • @MauricioLobos Thanks, I did not spot your recent edit. The point you describe is important and easily missed. I will have to think of a way of reading the condition and remembering the correct viewpoint. – Hugh Nov 29 '16 at 09:52
  • @Hugh, when I first saw this I did think that something was wrong with the BCs. But I did not see that OP used {predicate1, predicate2} when OP meant predicate1 && predicate2 both are valid and documented syntax (last point in DirichletCondition) – user21 Nov 29 '16 at 09:55
  • @user21. Thanks; so I must remember that the boundary condition can be expanded rather like expanding brackets. – Hugh Nov 29 '16 at 10:11
  • @user21 I'm studying FEM to do a practical work for the university and it would be great to have a tutorial for structural mechanics! – Gonza_ Nov 29 '16 at 10:25
  • @MauricioLobos i saw your edit. Thank you again, I didn't expect that that was the problem! – Gonza_ Nov 29 '16 at 10:25
  • @user21 what is the bounty for? Are you looking for something specific or just the pre-stressed beam? I got interested :D – Mauricio Fernández Dec 01 '16 at 07:19
  • @MauricioLobos, the bounty is for you, for, what I think,. is a nice answer. – user21 Dec 01 '16 at 13:52
  • @user21 Oh wow, thank you, very appreciated :D! – Mauricio Fernández Dec 01 '16 at 13:55