$$
\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.
| Application | $d_i^{(e)}$ | $B_i^{(e)}$ | $d\Omega^{(e)}$ |
| Plane stress | $\begin{bmatrix} u_i^{(e)} \\ v_i^{(e)}\end{bmatrix}$ | $\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}$ | $t^{(e)} \det J^{(e)}d\xi d\eta$ |
| Plane strain | $\begin{bmatrix} u_i^{(e)} \\ v_i^{(e)}\end{bmatrix}$ | $\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}$ | $\det J^{(e)}d\xi d\eta$ |
| Axial symmetry | $\begin{bmatrix} u_i^{(e)} \\ w_i^{(e)}\end{bmatrix}$ | $\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}$ | $2\pi r^{(e)} \det J^{(e)}d\xi d\eta$ |
| Mindlin plate | $\begin{bmatrix} w_i^{(e)} \\ \theta_{xi^{(e)}} \\ \theta_{yi^{(e)}}\end{bmatrix}$ | $\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}$ | $\det J^{(e)}d\xi d\eta$ |
Table 6.1 Nodal displacements, strain matrices and elemental volumes or areas for two-dimensional solid mechanics applications.
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}
$$
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
# 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.
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.
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.
# 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
```
| SUBROUTINE GAUSSQ(NGAUS,POSGP,WEIGP) | GAUS | 1 |
| C | *************** | GAUS | 2 |
| C | | GAUS | 3 |
| C**** | THIS SUBROUTINE SETS UP THE GAUSS-LEGENDRE INTEGRATION CONSTANTS | GAUS | 4 |
| C | | GAUS | 5 |
| C | *************** | GAUS | 6 |
| DIMENSION POSGP(4),WEIGP(4) | GAUS | 7 |
| IF(NGAUS.GT.2) GO TO 4 | GAUS | 8 |
| 2 | POSGP(1)=-0.577350269189626 | GAUS | 9 |
| WEIGP(1)=1.0 | GAUS | 10 |
| GO TO 6 | GAUS | 11 |
| 4 | POSGP(1)=-0.774596669241483 | GAUS | 12 |
| 5 | POSGP(2)=0.0 | GAUS | 13 |
| WEIGP(1)=0.555555555555556 | GAUS | 14 |
| WEIGP(2)=0.888888888888889 | GAUS | 15 |
| 6 | KGAUS=NGAUS/2 | GAUS | 16 |
| DO 8 IGASH=1,KGAUS | GAUS | 17 |
| JGASH=NGAUS+1-IGASH | GAUS | 18 |
| POSGP(JGASH)=-POSGP(IGASH) | GAUS | 19 |
| WEIGP(JGASH)=WEIGP(IGASH) | GAUS | 20 |
| 8 | CONTINUE | GAUS | 21 |
| RETURN | GAUS | 22 |
| END | GAUS | 23 |
# 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.
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
```