Files
MultiPhysicsVault/.raw/FiniteElementsinPlasticityTheoryandPractice/FiniteElementsinPlasticityTheoryandPractice_019.md
T
김경종 bd50e09e36
Tests / Hermetic test suite (push) Has been cancelled
Tests / Skill frontmatter validation (push) Has been cancelled
add documents
2026-06-02 11:38:52 +09:00

22 KiB


\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.

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.

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.

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