This tutorial describes how to pre-process, run and post-process a case
involving linear-elastic, steady-state stress analysis on a square plate with a
circular hole at its centre. The plate dimensions are: side length 4 and
radius 0.5 . It is loaded with a uniform traction of 10
over its left and right faces as shown in 2.15. Two symmetry planes
can be identified for this geometry and therefore the solution domain
need only cover a quarter of the geometry, shown by the shaded area in
2.15.
Figure 2.15:
Geometry of the plate with a hole.
The problem can be approximated as 2-dimensional since the load
is applied in the plane of the plate. In a Cartesian coordinate system
there are two possible assumptions to take in regard to the behaviour of
the structure in the third dimension: (1) the plane stress condition, in
which the stress components acting out of the 2D plane are assumed to be
negligible; (2) the plane strain condition, in which the strain components out
of the 2D plane are assumed negligible. The plane stress condition is
appropriate for solids whose third dimension is thin as in this case; the
plane strain condition is applicable for solids where the third dimension is
thick.
An analytical solution exists for loading of an infinitely large, thin plate with a
circular hole. The solution for the stress normal to the vertical plane of symmetry
is
(2.14)
Results from the simulation will be compared with this solution. At the end of
the tutorial, the user can: investigate the sensitivity of the solution to
mesh resolution and mesh grading; and, increase the size of the plate in
comparison to the hole to try to estimate the error in comparing the analytical
solution for an infinite plate to the solution of this problem of a finite
plate.
The domain consists of four blocks, some of which have arc-shaped edges. The
block structure for the part of the mesh in the plane is shown in
2.16. As already mentioned in 2.1.1.1, all geometries are generated in 3
dimensions in OpenFOAM even if the case is to be as a 2 dimensional
problem. Therefore a dimension of the block in the direction has to be
chosen; here, 0.5 is selected. It does not affect the solution since
the traction boundary condition is specified as a stress rather than a
force, thereby making the solution independent of the cross-sectional area.
Figure 2.16:
Block structure of the mesh for the plate with a hole.
The user should change into the plateHole case in the
$FOAM_RUN/tutorials/solidDisplacementFoam directory and open the
constant/polyMesh/blockMeshDict file in an editor, as listed below
Until now, we have only specified straight edges in the geometries of previous
tutorials but here we need to specify curved edges. These are specified under the
edges keyword entry which is a list of non-straight edges. The syntax of each list
entry begins with the type of curve, including arc, simpleSpline, polyLine etc.,
described further in 5.3.1. In this example, all the edges are circular and so can be
specified by the arc keyword entry. The following entries are the labels of the
start and end vertices of the arc and a point vector through which the circular arc
passes.
The blocks in this blockMeshDict do not all have the same orientation. As can
be seen in 2.16 the direction of block 0 is equivalent to the direction
for block 4. This means care must be taken when defining the number and
distribution of cells in each block so that the cells match up at the block
faces.
6 patches are defined: one for each side of the plate, one for the hole and one
for the front and back planes. The left and down patches are both a symmetry
plane. Since this is a geometric constraint, it is included in the definition of the
mesh, rather than being purely a specification on the boundary condition of the
fields. Therefore they are defined as such using a special symmetryPlane type as
shown in the blockMeshDict.
The frontAndBack patch represents the plane which is ignored in a 2D
case. Again this is a geometric constraint so is defined within the mesh,
using the empty type as shown in the blockMeshDict. For further details
of boundary types and geometric constraints, the user should refer to
5.2.1.
The remaining patches are of the regular patch type. The mesh should be
generated using blockMesh and can be viewed in paraFoam as described in 2.1.2. It
should appear as in 2.17.
Once the mesh generation is complete, the initial field with boundary
conditions must be set. For a stress analysis case without thermal stresses, only
displacement D needs to be set. The 0/D is as follows:
Firstly, it can be seen that the displacement initial conditions are set to .
The left and down patches must be both of symmetryPlane type since they are
specified as such in the mesh description in the constant/polyMesh/boundary file.
Similarly the frontAndBack patch is declared empty.
The other patches are traction boundary conditions, set by a specialist traction
boundary type. The traction boundary conditions are specified by a linear
combination of: (1) a boundary traction vector under keyword traction; (2) a
pressure that produces a traction normal to the boundary surface that is defined
as negative when pointing out of the surface, under keyword pressure. The up
and hole patches are zero traction so the boundary traction and pressure are set
to zero. For the right patch the traction should be and the
pressure should be 0 .
The physical properties for the case are set in the mechanicalProperties
dictionary in the constant directory. For this problem, we need to specify the
mechanical properties of steel given in 2.1. In the mechanical properties
dictionary, the user must also set planeStress to yes.
The temperature field variable T is present in the solidDisplacementFoam solver
since the user may opt to solve a thermal equation that is coupled with the
momentum equation through the thermal stresses that are generated. The user
specifies at run time whether OpenFOAM should solve the thermal equation by
the thermalStress switch in the thermalProperties dictionary. This dictionary
also sets the thermal properties for the case, e.g. for steel as listed in
2.2.
Property
Units
Keyword
Value
Specific heat capacity
C
434
Thermal conductivity
k
60.5
Thermal expansion coeff.
alpha
Table 2.2:
Thermal properties for steel
In this case we do not want to solve for the thermal equation. Therefore we
must set the thermalStress keyword entry to no in the thermalProperties
dictionary.
As before, the information relating to the control of the solution procedure are
read in from the controlDict dictionary. For this case, the startTime is 0 . The
time step is not important since this is a steady state case; in this situation it is
best to set the time step deltaT to 1 so it simply acts as an iteration
counter for the steady-state case. The endTime, set to 100, then acts as
a limit on the number of iterations. The writeInterval can be set to
.
Let us turn our attention to the fvSchemes dictionary. Firstly, the problem we
are analysing is steady-state so the user should select SteadyState for the time
derivatives in timeScheme. This essentially switches off the time derivative terms.
Not all solvers, especially in fluid dynamics, work for both steady-state and
transient problems but solidDisplacementFoam does work, since the base algorithm
is the same for both types of simulation.
The momentum equation in linear-elastic stress analysis includes several
explicit terms containing the gradient of displacement. The calculations benefit
from accurate and smooth evaluation of the gradient. Normally, in the finite
volume method the discretisation is based on Gauss’s theorem The Gauss
method is sufficiently accurate for most purposes but, in this case, the least
squares method will be used. The user should therefore open the fvSchemes
dictionary in the system directory and ensure the leastSquares method is
selected for the grad(U) gradient discretisation scheme in the gradSchemes
sub-dictionary:
The fvSolution dictionary in the system directory controls the linear equation solvers
and algorithms used in the solution. The user should first look at the solvers
sub-dictionary and notice that the GAMG solver is included with entries listed
below. The solver tolerance should be set to for this problem. The solver
relative tolerance, denoted by relTol, sets the required reduction in the residuals
within each iteration. It is uneconomical to set a tight (low) relative tolerance
within each iteration since a lot of terms are explicit and are updated as part of
the segregated iterative procedure. Therefore a reasonable value for the relative
tolerance is , or possibly even higher, say , or in some case even
.