add documents
This commit is contained in:
+431
@@ -0,0 +1,431 @@
|
||||
<!-- source-page: 181 -->
|
||||
|
||||
$$
|
||||
\left[ \begin{array}{l} x ^ {(e)} \\ y ^ {(e)} \end{array} \right] = \sum_ {i = 1} ^ {r} \left[ \begin{array}{c c} N _ {i} ^ {(e)} & 0 \\ 0 & N _ {i} ^ {(e)} \end{array} \right] \left[ \begin{array}{l} x _ {i} ^ {(e)} \\ y _ {i} ^ {(e)} \end{array} \right], \tag {6.43}
|
||||
$$
|
||||
|
||||
in which $N_{i}^{(e)}$ are the same shape functions used in the displacement representation. We may then evaluate the Jacobian matrix as
|
||||
|
||||
$$
|
||||
\boldsymbol {J} ^ {(e)} = \left[ \begin{array}{l l} \frac {\partial x}{\partial \xi} & \frac {\partial y}{\partial \xi} \\ \frac {\partial x}{\partial \eta} & \frac {\partial y}{\partial \eta} \end{array} \right] = \left[ \begin{array}{l l} \sum_ {i = 1} ^ {r} \frac {\partial N _ {i} ^ {(e)}}{\partial \xi} x _ {i} ^ {(e)} & \sum_ {i = 1} ^ {r} \frac {\partial N _ {i} ^ {(e)}}{\partial \xi} y _ {i} ^ {(e)} \\ \sum_ {i = 1} ^ {r} \frac {\partial N _ {i} ^ {(e)}}{\partial \eta} x _ {i} ^ {(e)} & \sum_ {i = 1} ^ {r} \frac {\partial N _ {i} ^ {(e)}}{\partial \eta} y _ {i} ^ {(e)} \end{array} \right]. \tag {6.44}
|
||||
$$
|
||||
|
||||
The inverse of $J^{(e)}$ is then evaluated using the expression
|
||||
|
||||
$$
|
||||
[ \boldsymbol {J} ^ {(e)} ] ^ {- 1} = \left[ \begin{array}{l l} \frac {\partial \xi}{\partial x} & \frac {\partial \eta}{\partial x} \\ \frac {\partial \xi}{\partial y} & \frac {\partial \eta}{\partial y} \end{array} \right] = \frac {1}{\det \boldsymbol {J} ^ {(e)}} \left[ \begin{array}{c c} \frac {\partial y}{\partial \eta} & - \frac {\partial y}{\partial \xi} \\ - \frac {\partial x}{\partial \eta} & \frac {\partial x}{\partial \xi} \end{array} \right]. \tag {6.45}
|
||||
$$
|
||||
|
||||
The strain displacement relationships are expressed as
|
||||
|
||||
$$
|
||||
\epsilon^ {(e)} = \sum_ {i = 1} ^ {r} B _ {i} ^ {(e)} d _ {i} ^ {(e)}, \tag {6.46}
|
||||
$$
|
||||
|
||||
in which $B_{t}^{(e)}$ is the strain matrix.
|
||||
|
||||
The discretised elemental volume (or area in the case of Mindlin plates) is given as
|
||||
|
||||
$$
|
||||
d \Omega^ {(e)} = h ^ {(e)} \det J ^ {(e)} d \xi d \eta , \tag {6.47}
|
||||
$$
|
||||
|
||||
where $h^{(e)}$ has been defined in Table 6.1 in which we also summarise the expressions for $d_{i}^{(e)}$ , $B_{i}^{(e)}$ and $d\Omega^{(e)}$ for the four applications.
|
||||
|
||||
The Cartesian shape function derivatives used in the strain-displacement matrices in Table 6.1 may be obtained using the chain rule of differentiation
|
||||
|
||||
$$
|
||||
\frac {\partial N _ {i} ^ {(e)}}{\partial x} = \frac {\partial N _ {i} ^ {(e)}}{\partial \xi} \frac {\partial \xi}{\partial x} + \frac {\partial N _ {i} ^ {(e)}}{\partial \eta} \frac {\partial \eta}{\partial x}, \tag {6.48}
|
||||
$$
|
||||
|
||||
\* For axisymmetric problems replace x and y by r and z respectively.
|
||||
|
||||
<!-- source-page: 182 -->
|
||||
|
||||
<table><tr><td>Application</td><td> $d_i^{(e)}$ </td><td> $B_i^{(e)}$ </td><td> $d\Omega^{(e)}$ </td></tr><tr><td>Plane stress</td><td> $\begin{bmatrix} u_i^{(e)} \\ v_i^{(e)}\end{bmatrix}$ </td><td> $\begin{bmatrix} \left(\frac{\partial N_i}{\partial x}\right)^{(e)} & 0 \\ 0 & \left(\frac{\partial N_i}{\partial y}\right)^{(e)} \\ \left(\frac{\partial N_i}{\partial y}\right)^{(e)} & \left(\frac{\partial N_i}{\partial x}\right)^{(e)}\end{bmatrix}$ </td><td> $t^{(e)} \det J^{(e)}d\xi d\eta$ </td></tr><tr><td>Plane strain</td><td> $\begin{bmatrix} u_i^{(e)} \\ v_i^{(e)}\end{bmatrix}$ </td><td> $\begin{bmatrix} \left(\frac{\partial N_i}{\partial x}\right)^{(e)} & 0 \\ 0 & \left(\frac{\partial N_i}{\partial y}\right)^{(e)} \\ \left(\frac{\partial N_i}{\partial y}\right)^{(e)} \quad \left(\frac{\partial N_i}{\partial x}\right)^{(e)}\end{bmatrix}$ </td><td> $\det J^{(e)}d\xi d\eta$ </td></tr><tr><td>Axial symmetry</td><td> $\begin{bmatrix} u_i^{(e)} \\ w_i^{(e)}\end{bmatrix}$ </td><td> $\begin{bmatrix} \left(\frac{\partial N_i}{\partial r}\right)^{(e)} & 0 \\ \left(\frac{N_i}{r}\right)^{(e)} & 0 \\ 0 & \left(\frac{\partial N_i}{\partial z}\right)^{(e)} \\ \left(\frac{\partial N_i}{\partial z}\right)^{(e)} & \left(\frac{\partial N_i}{\partial r}\right)^{(e)}\end{bmatrix}$ </td><td> $2\pi r^{(e)} \det J^{(e)}d\xi d\eta$ </td></tr><tr><td>Mindlin plate</td><td> $\begin{bmatrix} w_i^{(e)} \\ \theta_{xi^{(e)}} \\ \theta_{yi^{(e)}}\end{bmatrix}$ </td><td> $\begin{bmatrix} 0 & \left(-\frac{\partial N_i}{\partial x}\right)^{(e)} & 0 \\ 0 & 0 & \left(-\frac{\partial N_i}{\partial y}\right)^{(e)} \\ 0 & \left(-\frac{\partial N_i}{\partial y}\right)^{(e)} & \left(-\frac{\partial N_i}{\partial x}\right)^{(e)} \\ \left(\frac{\partial N_i}{\partial x}\right)^{(e)} & -N_i^{(e)} & 0 \\ \left(\frac{\partial N_i}{\partial y}\right)^{(e)} & 0 & -N_i^{(e)}\end{bmatrix}$ </td><td> $\det J^{(e)}d\xi d\eta$ </td></tr></table>
|
||||
|
||||
Table 6.1 Nodal displacements, strain matrices and elemental volumes or areas for two-dimensional solid mechanics applications.
|
||||
|
||||
<!-- source-page: 183 -->
|
||||
|
||||
and
|
||||
|
||||
$$
|
||||
\frac {\partial N _ {i} ^ {(e)}}{\partial y} = \frac {\partial N _ {i} ^ {(e)}}{\partial \eta} \frac {\partial \eta}{\partial y} + \frac {\partial N _ {i} ^ {(e)}}{\partial \xi} \frac {\partial \xi}{\partial y},
|
||||
$$
|
||||
|
||||
in which the terms $\partial \xi / \partial x$ , $\partial \eta / \partial x$ , $\partial \eta / \partial y$ and $\partial \xi / \partial y$ may be obtained from the inverse of the Jacobian matrix given in (6.45).
|
||||
|
||||
Since we have a linear stress-strain relationship within each element of the form
|
||||
|
||||
$$
|
||||
\sigma^ {(e)} = D ^ {(e)} \epsilon^ {(e)} = D ^ {(e)} \left(\sum_ {j = 1} ^ {r} B _ {j} ^ {(e)} d _ {j} ^ {(e)}\right), \tag {6.49}
|
||||
$$
|
||||
|
||||
then the contribution from element $e$ to the first term in (6.41) is given as
|
||||
|
||||
$$
|
||||
\sum_ {j = 1} ^ {r} \boldsymbol {K} _ {i j} ^ {(e)} \boldsymbol {d} _ {j} ^ {(e)} \equiv \int_ {\Omega^ {(e)}} \left[ \boldsymbol {B} _ {i} ^ {(e)} \right] ^ {T} \boldsymbol {D} ^ {(e)} \left(\sum_ {j = 1} ^ {r} \boldsymbol {B} _ {j} ^ {(e)} \boldsymbol {d} _ {j} ^ {(e)}\right) d \Omega , \tag {6.50}
|
||||
$$
|
||||
|
||||
where $K_{ij}^{(e)}$ is the submatrix of element stiffness matrix $K^{(e)}$ .
|
||||
|
||||
The contribution from element e to the second term in (6.41) is given as
|
||||
|
||||
$$
|
||||
f _ {B _ {i} ^ {(e)}} = \int_ {\Omega^ {(e)}} [ N _ {i} ^ {(e)} ] ^ {T} b ^ {(e)} d \Omega . \tag {6.51}
|
||||
$$
|
||||
|
||||
For the third term, the contribution from element e is
|
||||
|
||||
$$
|
||||
f _ {T _ {i}} ^ {(e)} = \int_ {I _ {t} ^ {(e)}} [ N _ {i} ^ {(e)} ] ^ {T} t ^ {(e)} d \Gamma , \tag {6.52}
|
||||
$$
|
||||
|
||||
where $\Gamma_t^{(e)}$ is that part of $\Gamma_t$ which coincides with a boundary of element $e$ . Of course for many elements there will be no contribution to $f_{Tt}^{(e)}$ .
|
||||
|
||||
# 6.3.2 Evaluation of the stiffness matrix and consistent load vector
|
||||
|
||||
Let us now consider the evaluation of K.
|
||||
|
||||
The integration is now performed in the natural coordinate system. Thus the submatrix of the stiffness matrix $K^{(e)}$ linking nodes i and j has the form
|
||||
|
||||
$$
|
||||
\boldsymbol {K} _ {i j} ^ {(e)} = \int_ {- 1} ^ {+ 1} \int_ {- 1} ^ {+ 1} \left[ \boldsymbol {B} _ {i} ^ {(e)} \right] ^ {T} \boldsymbol {D} ^ {(e)} \boldsymbol {B} _ {j} ^ {(e)} h ^ {(e)} \det \boldsymbol {J} ^ {(e)} d \xi d \eta . \tag {6.53}
|
||||
$$
|
||||
|
||||
The elements of $K_{ij}^{(e)}$ are evaluated numerically. If the integrand in (6.53) is denoted as
|
||||
|
||||
$$
|
||||
[ \boldsymbol {B} _ {i} ^ {(e)} ] ^ {T} \boldsymbol {D} ^ {(e)} \boldsymbol {B} _ {j} ^ {(e)} h ^ {(e)} \det \boldsymbol {J} ^ {(e)} = \boldsymbol {T} _ {i j} ^ {(e)}, \tag {6.54}
|
||||
$$
|
||||
|
||||
then
|
||||
|
||||
$$
|
||||
\boldsymbol {K} _ {i j} ^ {(e)} = \int_ {- 1} ^ {+ 1} \int_ {- 1} ^ {+ 1} \boldsymbol {T} _ {i j} ^ {(e)} d \xi d \eta . \tag {6.55}
|
||||
$$
|
||||
|
||||
<!-- source-page: 184 -->
|
||||
|
||||
The numerical integration for a quadrilateral element with $n \times n$ sampling points leads to
|
||||
|
||||
$$
|
||||
\boldsymbol {K} _ {i j} ^ {(e)} = \sum_ {p - 1} ^ {n} \sum_ {q = 1} ^ {n} \boldsymbol {T} \left(\xi_ {p}, \bar {\eta} _ {q}\right) _ {i j} W _ {p} W _ {q}, \tag {6.56}
|
||||
$$
|
||||
|
||||
where $W_{p}$ and $W_{q}$ are weighting factors and $(\bar{\xi}_{p}, \bar{\eta}_{q})$ is a sampling position. The consistent nodal forces at node i caused by body forces are
|
||||
|
||||
$$
|
||||
\boldsymbol {f} _ {B _ {i}} ^ {(e)} = \int_ {- 1} ^ {+ 1} \int_ {- 1} ^ {+ 1} \left[ \boldsymbol {N} _ {i} ^ {(e)} \right] ^ {T} \boldsymbol {b} ^ {(e)} h ^ {(e)} \det \boldsymbol {J} ^ {(e)} d \xi d \eta . \tag {6.57}
|
||||
$$
|
||||
|
||||
The components of $f_{Bt}^{(e)}$ are evaluated numerically. If the integrand in (6.57) is denoted as
|
||||
|
||||
$$
|
||||
\boldsymbol {g} _ {i} ^ {(e)} = \left[ N _ {i} ^ {(e)} \right] ^ {T} \boldsymbol {b} ^ {(e)} h ^ {(e)} \det \boldsymbol {J} ^ {(e)}, \tag {6.58}
|
||||
$$
|
||||
|
||||
then
|
||||
|
||||
$$
|
||||
\boldsymbol {f} _ {B _ {i}} ^ {(e)} = \int_ {- 1} ^ {+ 1} \int_ {- 1} ^ {+ 1} \boldsymbol {g} _ {i} ^ {(e)} d \xi d \eta . \tag {6.59}
|
||||
$$
|
||||
|
||||
The numerical integration for a quadrilateral with $n \times n$ sampling points leads to
|
||||
|
||||
$$
|
||||
f _ {B _ {i}} ^ {(e)} = \sum_ {p = 1} ^ {n} \sum_ {q = 1} ^ {n} \mathbf {g} (\bar {\xi} _ {p}, \bar {\eta} _ {q}) _ {i} ^ {(e)} W _ {p} W _ {q}, \tag {6.60}
|
||||
$$
|
||||
|
||||
where $W_{p}$ and $W_{q}$ are weighting factors and $(\bar{\xi}_p,\bar{\eta}_q)$ is a sampling position.
|
||||
|
||||
The consistent nodal forces for boundary tractions have been dealt with in the authors' previous book $^{(4)}$ and will be summarised in Section 6.4.5.
|
||||
|
||||
The computer implementation of numerically integrated isoparametric elements has been described in detail in the text of Finite Element Programming. $^{(4)}$ Here we simply summarise in Fig. 6.6 the main steps involved in evaluating the element stiffness matrix.
|
||||
|
||||
# 6.4 Standard subroutines for linear elastic finite element analysis
|
||||
|
||||
Many of the subroutines required for elasto-plastic finite element analysis are common to the corresponding linear elastic application. In this section we present all the standard linear elastic subroutines required for later use in Chapters 7, 8 and 9. The function of each subroutine is explained and a FORTRAN listing is provided. The subroutines presented are drawn from Ref. 4 where a detailed description is provided.
|
||||
|
||||
In order to make all subroutines modular in form we have adopted a type of dynamic dimensioning. Thus no COMMON blocks are used in the programs in Part II. Dimensions are fixed in the main or master routine and all necessary information is transmitted between routines by the use of
|
||||
|
||||
<!-- source-page: 185 -->
|
||||
|
||||
# SUBROUTINE STIF2D
|
||||
|
||||
Dimensions and common blocks.
|
||||
|
||||
→ Enter loop over all elements.
|
||||
|
||||
Retrieve element geometry and material properties for the current element.
|
||||
|
||||
Zero the stiffness array.
|
||||
|
||||
Call a routine which sets up $D^{(e)}$ the constitutive matrix.
|
||||
|
||||
Enter loops covering all integration points.
|
||||
|
||||
Look up sampling position for the current integration point $(\tilde{\xi}_p, \bar{\eta}_q)$ .
|
||||
|
||||
Call shape function routine SFR2—given $(\bar{\xi}_{p}, \bar{\eta}_{q})$ this will return the shape functions $N_{i}^{(e)}$ and their derivatives $\partial N_{i}^{(e)}/\partial\xi$ and $\partial N_{i}^{(e)}/\partial\eta$ at the point $(\bar{\xi}_{p}, \bar{\eta}_{q})$ .
|
||||
|
||||
Call JACOB2—given $N_{i}^{(e)}$ , $\partial N_{i}^{(e)}/\partial\xi$ and $\partial N_{i}^{(e)}/\partial\eta$ at point $(\bar{\xi}_{p},\bar{\eta}_{q})$ ; this will return Cartesian shape function derivatives $\partial N_{i}^{(e)}/\partial x$ and $\partial N_{i}^{(e)}/\partial y$ , the Jacobian matrix $J^{(e)}$ , its inverse $[J^{(e)}]^{-1}$ and its determinant $\det J^{(e)}$ and the x and y (or r and z) coordinates all at the point $(\bar{\xi}_{p},\bar{\eta}_{q})$ .
|
||||
|
||||
Call strain matrix routine—given $N_{i}^{(e)}$ , $\partial N_{i}^{(e)}/\partial x$ and $\partial N_{i}^{(e)}/\partial y$ at $(\bar{\xi}_{p}, \bar{\eta}_{q})$ this will return the strain matrix $\boldsymbol{B}_{i}^{(e)}$ .
|
||||
|
||||
Call a routine to evaluate $D^{(e)} B^{(e)}$ .
|
||||
|
||||
Evaluate $[B_{i}^{(e)}]D^{(e)}B_{j}^{(e)}\det J^{(e)}\times\text{integration weights and assemble them into the element stiffness array }K_{ij}^{(e)}$ .
|
||||
|
||||
Assemble $D^{(e)}B^{(e)}$ into a stress array for later evaluation of stresses from the nodal displacements.
|
||||
|
||||
End integration loops.
|
||||
|
||||
Write stiffness matrix and stress matrix onto file for use in the solution routine.
|
||||
|
||||
End element loop.
|
||||
|
||||
RETURN
|
||||
END
|
||||
|
||||
Fig. 6.6 Evaluation of element stiffness matrices for numerically integrated isoparametric elements.
|
||||
|
||||
<!-- source-page: 186 -->
|
||||
|
||||
arguments (and also peripherals in certain instances). Apart from the modularity, this approach has the advantage that maximum dimensions can be updated in a very simple and straightforward manner. Only the DIMENSION statement in the main segment and some statements in a subroutine which sets the maximum dimensions sizes need modification.
|
||||
|
||||
As an example, the relevant statements in a dynamically dimensioned program are listed below.
|
||||
|
||||
```txt
|
||||
PROGRAM FRED ( )
|
||||
DIMENSION AMATX (200, 5), ...*
|
||||
.
|
||||
.
|
||||
.
|
||||
CALL DIMENS (MROWS, MCOLS)
|
||||
.
|
||||
.
|
||||
.
|
||||
CALL DUMMY (AMATX, MROWS, MCOLS)
|
||||
.
|
||||
.
|
||||
.
|
||||
STOP
|
||||
END
|
||||
SUBROUTINE DIMENS (MROWS, MCOLS)
|
||||
MROWS =200*
|
||||
MCOLS = 5*
|
||||
RETURN
|
||||
END
|
||||
SUBROUTINE DUMMY (AMATX, MROWS, MCOLS)
|
||||
DIMENSION AMATX (MROWS, MCOLS)
|
||||
.
|
||||
.
|
||||
.
|
||||
RETURN
|
||||
END
|
||||
```
|
||||
|
||||
Note that AMATX ( ) has fixed dimensions in the main routine FRED. Subroutine DIMENS assigns values of 200 and 5 to the dimensions MROWS and MCOLS respectively.† In subroutine DUMMY we transmit AMATX,
|
||||
|
||||
† Alternatively a DATA statement can be used.
|
||||
|
||||
<!-- source-page: 187 -->
|
||||
|
||||
MROWS and MCOLS via the argument and therefore the DIMENSION statement in DUMMY refers to AMATX (MCOLS, MROWS) and not AMATX (200, 5). To update FRED for arrays AMATX with different maximum dimensions, we simply modify those statements indicated by an asterisk.
|
||||
|
||||
Note also that the use of such arguments is not very expensive since only the address of the first term of an array is passed through the argument and not of all the terms in the array.
|
||||
|
||||
More sophisticated versions of this approach can be implemented as illustrated in the book by Irons and Ahmad. $^{(5)}$ Such approaches undoubtedly save core storage but they do require careful housekeeping and checking procedures.
|
||||
|
||||
In Part III we have generally dispensed with the use of maximum dimension variables in the programs. Thus main segment FRED would then be written as
|
||||
|
||||
PROGRAM FRED ( )
|
||||
DIMENSION AMATX (200, 5), ...
|
||||
.
|
||||
.
|
||||
.
|
||||
CALL DUMMY (AMATX)
|
||||
.
|
||||
.
|
||||
.
|
||||
STOP
|
||||
END
|
||||
SUBROUTINE DUMMY (AMATX)
|
||||
DIMENSION AMATX (200, 1)†
|
||||
.
|
||||
.
|
||||
.
|
||||
RETURN
|
||||
END
|
||||
|
||||
Although this approach uses nonstandard FORTRAN IV it does work on most machines and it has been adopted elsewhere in the literature. $^{(6)}$ If more than one subroutine such as DUMMY uses AMATX then the relevant dimensions must be identical in all of these subroutines.
|
||||
|
||||
The list of variables in the argument list will differ between linear and nonlinear applications. For each subroutine presented in this section the form of the argument list and the dimension statements will be those required for two-dimensional elasto-plastic applications.
|
||||
|
||||
<!-- source-page: 188 -->
|
||||
|
||||
# 6.4.1 Subroutine NODEXY for generating coordinate values for midside nodes
|
||||
|
||||
For the quadratic 8- and 9-node elements described in Section 6.3 subroutine NODEXY checks each midside node (a midside node being recognisable from the element topology cards). If both coordinates of a midside node are found to be zero, its coordinates are linearly interpolated between the two adjacent corner nodes. Subroutine NODEXY is common to plane stress/strain, axisymmetric and plate bending situations.
|
||||
|
||||
```fortran
|
||||
SUBROUTINE NODEXY(COORD, LNODS, MELEM, MPOIN, NELEM, NNODE) NODE 1
|
||||
C*******************************
|
||||
C
|
||||
C**** THIS SUBROUTINE INTERPOLATES THE MIDE SIDE NODES OF STRAIGHT NODE 2
|
||||
C SIDES OF ELEMENTS AND THE CENTRAL NODE OF 9 NODED ELEMENTS NODE 3
|
||||
C
|
||||
C*******************************
|
||||
DIMENSION COORD(MPOIN, 2), LNODS(MELEM, 9) NODE 5
|
||||
IF(NNODE.EQ.4) RETURN NODE 6
|
||||
C
|
||||
C*** LOOP OVER EACH ELEMENT NODE 7
|
||||
C
|
||||
DO 30 IELEM=1, NELEM NODE 8
|
||||
C
|
||||
C*** LOOP OVER EACH ELEMENT EDGE NODE 9
|
||||
C
|
||||
NNOD1=9 NODE 10
|
||||
IF(NNODE.EQ.8) NNOD1=7 NODE 11
|
||||
DO 20 INODE=1, NNOD1, 2 NODE 12
|
||||
IF(INODE.EQ.9) GO TO 50 NODE 13
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE FIRST NODE NODE 14
|
||||
C
|
||||
NODST=LNODS(IELEM, INODE) NODE 15
|
||||
IGASH=INODE+2 NODE 16
|
||||
IF(IGASH.GT.8) IGASH=1 NODE 17
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE LAST NODE NODE 18
|
||||
C
|
||||
NODFN=LNODS(IELEM, IGASH) NODE 19
|
||||
MIDPT=INODE+1 NODE 20
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE LAST NODE NODE 21
|
||||
C
|
||||
NODFN=LNODS(IELEM, IGASH) NODE 22
|
||||
MIDPT=INODE+1 NODE 23
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE LAST NODE NODE 24
|
||||
C
|
||||
NODFN=LNODS(IELEM, IGASH) NODE 25
|
||||
MIDPT=INODE+1 NODE 26
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE LAST NODE NODE 27
|
||||
C
|
||||
NODFN=LNODS(IELEM, IGASH) NODE 28
|
||||
MIDPT=INODE+1 NODE 29
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE LAST NODE NODE 30
|
||||
C
|
||||
NODFN=LNODS(IELEM, IGASH) NODE 31
|
||||
MIDPT=INODE+1 NODE 32
|
||||
C
|
||||
C*** COMPUTE THE NODE NUMBER OF THE LAST NODE NODE 33
|
||||
C
|
||||
NODFN=LNODS(IELEM, MIDPT) NODE 34
|
||||
TOTAL=ABS(COORD(NODMD, 1))+ABS(COORD(NODMD, 2)) NODE 35
|
||||
C
|
||||
C*** IF THE COORDINATES OF THE INTERMEDIATE NODE ARE BOTH ZERO NODE 36
|
||||
C INTERPOLATE BY A STRAIGHT LINE NODE 37
|
||||
C
|
||||
IF(TOTAL.GT.0.0) GO TO 20 NODE 38
|
||||
KOUNT=1 NODE 39
|
||||
10 COORD(NODMD, KOUNT)=(COORD(NODST, KOUNT)+COORD(NODFN, KOUNT))/2.0 NODE 40
|
||||
KOUNT=KOUNT+1 NODE 41
|
||||
IF(KOUNT.EQ.2) GO TO 42 NODE 42
|
||||
20 CONTINUE NODE 43
|
||||
GO TO 30 NODE 44
|
||||
50 LNODE=LNODS(IELEM, INODE) NODE 45
|
||||
TOTAL=ABS(COORD(LNODE, 1))+ABS(COORD(LNODE, 2)) NODE 46
|
||||
IF(TOTAL.GT.0.0) GO TO 30 NODE 47
|
||||
50 LNODE=LNODS(IELEM, INODE) NODE 48
|
||||
TOTAL=ABS(COORD(LNODE, 1))+ABS(COORD(LNODE, 2)) NODE 49
|
||||
IF(TOTAL.GT.0.0) GO TO 30 NODE 50
|
||||
```
|
||||
|
||||
<!-- source-page: 189 -->
|
||||
|
||||
<table><tr><td>LNOD1=LNODS(IELEM,1)</td><td>NODE</td><td>51</td></tr><tr><td>LNOD3=LNODS(IELEM,3)</td><td>NODE</td><td>52</td></tr><tr><td>LNOD5=LNODS(IELEM,5)</td><td>NODE</td><td>53</td></tr><tr><td>LNOD7=LNODS(IELEM,7)</td><td>NODE</td><td>54</td></tr><tr><td>KOUNT=1</td><td>NODE</td><td>55</td></tr><tr><td>40 COORD(LNODE,KOUNT)=(COORD(LNOD1,KOUNT)+COORD(LNOD3,KOUNT)</td><td>NODE</td><td>56</td></tr><tr><td>+COORD(LNOD5,KOUNT)+COORD(LNOD7,KOUNT))/4.0</td><td>NODE</td><td>57</td></tr><tr><td>KOUNT=KOUNT+1</td><td>NODE</td><td>58</td></tr><tr><td>IF(KOUNT.EQ.2) GO TO 40</td><td>NODE</td><td>59</td></tr><tr><td>30 CONTINUE</td><td>NODE</td><td>60</td></tr><tr><td>RETURN</td><td>NODE</td><td>61</td></tr><tr><td>END</td><td>NODE</td><td>62</td></tr></table>
|
||||
|
||||
# 6.4.2 Subroutine GAUSSQ for generating Gaussian quadrature data
|
||||
|
||||
The function of this subroutine is to set up the sampling point positions and weighting factors for numerical integration. The Gauss quadrature processes utilised in this text are restricted to either two or three point integration rules.\* The role of numerical integration in the isoparametric formulation was discussed in detail in Section 6.3. The order of integration rule to be employed is defined by NGAUS and the sampling point positions and weighting factors are stored respectively in arrays POSGP() and WEIGP().
|
||||
|
||||
<table><tr><td></td><td>SUBROUTINE GAUSSQ(NGAUS,POSGP,WEIGP)</td><td>GAUS</td><td>1</td></tr><tr><td>C</td><td>***************</td><td>GAUS</td><td>2</td></tr><tr><td>C</td><td></td><td>GAUS</td><td>3</td></tr><tr><td>C****</td><td>THIS SUBROUTINE SETS UP THE GAUSS-LEGENDRE INTEGRATION CONSTANTS</td><td>GAUS</td><td>4</td></tr><tr><td>C</td><td></td><td>GAUS</td><td>5</td></tr><tr><td>C</td><td>***************</td><td>GAUS</td><td>6</td></tr><tr><td></td><td>DIMENSION POSGP(4),WEIGP(4)</td><td>GAUS</td><td>7</td></tr><tr><td></td><td>IF(NGAUS.GT.2) GO TO 4</td><td>GAUS</td><td>8</td></tr><tr><td>2</td><td>POSGP(1)=-0.577350269189626</td><td>GAUS</td><td>9</td></tr><tr><td></td><td>WEIGP(1)=1.0</td><td>GAUS</td><td>10</td></tr><tr><td></td><td>GO TO 6</td><td>GAUS</td><td>11</td></tr><tr><td>4</td><td>POSGP(1)=-0.774596669241483</td><td>GAUS</td><td>12</td></tr><tr><td>5</td><td>POSGP(2)=0.0</td><td>GAUS</td><td>13</td></tr><tr><td></td><td>WEIGP(1)=0.555555555555556</td><td>GAUS</td><td>14</td></tr><tr><td></td><td>WEIGP(2)=0.888888888888889</td><td>GAUS</td><td>15</td></tr><tr><td>6</td><td>KGAUS=NGAUS/2</td><td>GAUS</td><td>16</td></tr><tr><td></td><td>DO 8 IGASH=1,KGAUS</td><td>GAUS</td><td>17</td></tr><tr><td></td><td>JGASH=NGAUS+1-IGASH</td><td>GAUS</td><td>18</td></tr><tr><td></td><td>POSGP(JGASH)=-POSGP(IGASH)</td><td>GAUS</td><td>19</td></tr><tr><td></td><td>WEIGP(JGASH)=WEIGP(IGASH)</td><td>GAUS</td><td>20</td></tr><tr><td>8</td><td>CONTINUE</td><td>GAUS</td><td>21</td></tr><tr><td></td><td>RETURN</td><td>GAUS</td><td>22</td></tr><tr><td></td><td>END</td><td>GAUS</td><td>23</td></tr></table>
|
||||
|
||||
# 6.4.3 Subroutine SFR2 for evaluating the element shape functions
|
||||
|
||||
The role of this subroutine is to evaluate the shape functions $N_{i}^{(e)}(\xi, \eta)$ and their derivatives $\partial N_{i}^{(e)} / \partial \xi$ , $\partial N_{i}^{(e)} / \partial \eta$ at any sampling point $\xi_{P}$ , $\eta_{P}$ within the element for each of the 4-, 8- or 9-noded elements described in Section 6.1. The shape functions for these elements are listed in Figs. 6.1(a), (b) and (c). The sampling point coordinates $\xi_{P}, \eta_{P}$ are specified as EXISP and ETASP respectively. The evaluated shape functions for each node of an element are stored in array SHAPE (INODE) and their derivatives in
|
||||
|
||||
\- Except for selectively integrated 4-node Mindlin plates in which we modify GAUSSQ so that if NGAUS = 1 then POSGP(1) = 0·0 and WEIGP(1) = 2·0.
|
||||
|
||||
<!-- source-page: 190 -->
|
||||
|
||||
array DERIV (INODE, IDIME) where INODE ranges over the element nodes and IDIME over the coordinate dimensions.
|
||||
|
||||
```csv
|
||||
SUBROUTINE SFR2(DERIV,ETASP,EXISP,NNODE,SHAPE) SFR2 1
|
||||
C***** THIS SUBROUTINE EVALUATES SHAPE FUNCTIONS AND THEIR DERIVATIVES SFR2 2
|
||||
C FOR LINEAR,QUADRATIC LAGRANGIAN AND SERENDIPITY SFR2 3
|
||||
C ISOPARAMETRIC 2-D ELEMENTS SFR2 4
|
||||
C SFR2 5
|
||||
C***** DIMENSION DERIV(2,9),SHAPE(9) SFR2 6
|
||||
S=EXISP SFR2 7
|
||||
T=ETASP SFR2 8
|
||||
IF(NNODE.GT.4) GO TO 10 SFR2 9
|
||||
ST=S*T SFR2 10
|
||||
C SFR2 11
|
||||
C *** SHAPE FUNCTIONS FOR 4 NODED ELEMENT SFR2 12
|
||||
C SFR2 13
|
||||
SHAPE(1)=(1-T-S+ST)*0.25 SFR2 14
|
||||
SHAPE(2)=(1-T+S-ST)*0.25 SFR2 15
|
||||
SHAPE(3)=(1+T+S+ST)*0.25 SFR2 16
|
||||
SHAPE(4)=(1+T-S-ST)*0.25 SFR2 17
|
||||
C SFR2 18
|
||||
C *** SHAPE FUNCTION DERIVATIVES SFR2 19
|
||||
C SFR2 20
|
||||
DERIV(1,1)=(-1+T)*0.25 SFR2 21
|
||||
DERIV(1,2)=(+1-T)*0.25 SFR2 22
|
||||
DERIV(1,3)=(+1+T)*0.25 SFR2 23
|
||||
DERIV(1,4)=(-1-T)*0.25 SFR2 24
|
||||
DERIV(2,1)=(-1+S)*0.25 SFR2 25
|
||||
DERIV(2,2)=(-1-S)*0.25 SFR2 26
|
||||
DERIV(2,3)=(+1+S)*0.25 SFR2 27
|
||||
DERIV(2,4)=(+1-S)*0.25 SFR2 28
|
||||
RETURN SFR2 29
|
||||
10 IF(NNODE.GT.8)GO TO 30 SFR2 30
|
||||
S2=S*2.0 SFR2 31
|
||||
T2=T*2.0 SFR2 32
|
||||
SS=S*S SFR2 33
|
||||
TT=T*T SFR2 34
|
||||
ST=S*T SFR2 35
|
||||
SST=S*S*T SFR2 36
|
||||
STT=S*T*T SFR2 37
|
||||
ST2=S*T*2.0 SFR2 38
|
||||
C SFR2 39
|
||||
C *** SHAPE FUNCTIONS FOR 8 NODED ELEMENT SFR2 40
|
||||
C SFR2 41
|
||||
SHAPE(1)=(-1.0+ST+SS+TT-SST-STT)/4.0 SFR2 42
|
||||
SHAPE(2)=(1.0-T-SS+SST)/2.0 SFR2 43
|
||||
SHAPE(3)=(-1.0-ST+SS+TT-SST+STT)/4.0 SFR2 44
|
||||
SHAPE(4)=(1.0+S-TT-STT)/2.0 SFR2 45
|
||||
SHAPE(5)=(-1.0+ST+SS+TT+SST+STT)/4.0 SFR2 46
|
||||
SHAPE(6)=(1.0+T-SS-SST)/2.0 SFR2 47
|
||||
SHAPE(7)=(-1.0-ST+SS+TT+SST-STT)/4.0 SFR2 48
|
||||
SHAPE(8)=(1.0-S-TT+STT)/2.0 SFR2 49
|
||||
C *** SHAPE FUNCTION DERIVATIVES SFR2 50
|
||||
C SFR2 51
|
||||
DERIV(1,1)=(T+S2-ST2-TT)/4.0 SFR2 52
|
||||
DERIV(1,2)=-S+ST SFR2 53
|
||||
DERIV(1,3)=(-T+S2-ST2+TT)/4.0 SFR2 54
|
||||
DERIV(1,4)=(1.0-TT)/2.0 SFR2 55
|
||||
DERIV(1,5)=(T+S2+ST2+TT)/4.0 SFR2 56
|
||||
DERIV(1,6)=-S-ST SFR2 57
|
||||
DERIV(1,7)=(-T+S2-ST2+TT)/4.0 SFR2 58
|
||||
DERIV(1,8)=(-T+S2-ST2+TT)/4.0 SFR2 59
|
||||
DERIV(1,9)=(-T+S2-ST2+TT)/4.0 SFR2 60
|
||||
DERIV(2,0)=(-T+S2-ST2+TT)/4.0 SFR2 61
|
||||
```
|
||||
Reference in New Issue
Block a user