$$ \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 ```
LNOD1=LNODS(IELEM,1)NODE51
LNOD3=LNODS(IELEM,3)NODE52
LNOD5=LNODS(IELEM,5)NODE53
LNOD7=LNODS(IELEM,7)NODE54
KOUNT=1NODE55
40 COORD(LNODE,KOUNT)=(COORD(LNOD1,KOUNT)+COORD(LNOD3,KOUNT)NODE56
+COORD(LNOD5,KOUNT)+COORD(LNOD7,KOUNT))/4.0NODE57
KOUNT=KOUNT+1NODE58
IF(KOUNT.EQ.2) GO TO 40NODE59
30 CONTINUENODE60
RETURNNODE61
ENDNODE62
# 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().
SUBROUTINE GAUSSQ(NGAUS,POSGP,WEIGP)GAUS1
C***************GAUS2
CGAUS3
C****THIS SUBROUTINE SETS UP THE GAUSS-LEGENDRE INTEGRATION CONSTANTSGAUS4
CGAUS5
C***************GAUS6
DIMENSION POSGP(4),WEIGP(4)GAUS7
IF(NGAUS.GT.2) GO TO 4GAUS8
2POSGP(1)=-0.577350269189626GAUS9
WEIGP(1)=1.0GAUS10
GO TO 6GAUS11
4POSGP(1)=-0.774596669241483GAUS12
5POSGP(2)=0.0GAUS13
WEIGP(1)=0.555555555555556GAUS14
WEIGP(2)=0.888888888888889GAUS15
6KGAUS=NGAUS/2GAUS16
DO 8 IGASH=1,KGAUSGAUS17
JGASH=NGAUS+1-IGASHGAUS18
POSGP(JGASH)=-POSGP(IGASH)GAUS19
WEIGP(JGASH)=WEIGP(IGASH)GAUS20
8CONTINUEGAUS21
RETURNGAUS22
ENDGAUS23
# 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 ```