We note in passing that expressions (4.24) and (4.25) could be written in the standard finite element form
$$
\Delta V ^ {n} = \int_ {V} \boldsymbol {B} ^ {T} \boldsymbol {D} \epsilon d V + \Delta \boldsymbol {f} ^ {n}
$$
$$
\boldsymbol {K} ^ {(e)} = \int_ {V} \boldsymbol {B} ^ {T} \boldsymbol {D} \boldsymbol {B} d V, \tag {4.26}
$$
since for the linear element considered
$$
\boldsymbol {B} = \left[ - \frac {1}{L}, \frac {1}{L} \right]
$$
$$
\boldsymbol {D} = \boldsymbol {E}
$$
$$
\int_ {V} d V = A L. \tag {4.27}
$$
The displacements at time $t_{n+1}$ are then obtained by simple accumulation as
$$
\varphi^ {n + 1} = \varphi^ {n} + \Delta \varphi^ {n}. \tag {4.28}
$$
The stress increment is given from (4.1) and (4.7) to be
$$
\Delta \sigma^ {n} = E \Delta \epsilon_ {e} ^ {n} = E \left(\Delta \epsilon^ {n} - \Delta \epsilon_ {v p} ^ {n}\right), \tag {4.29}
$$
or
$$
\Delta \sigma^ {n} = E \left(\frac {\Delta \phi_ {1} ^ {n} - \Delta \phi_ {2} ^ {n}}{L} - \dot {\epsilon} _ {v p} ^ {n} \Delta t _ {n}\right), \tag {4.30}
$$
where $\Delta\phi_{1}^{n}$ and $\Delta\phi_{2}^{n}$ are the displacement changes at the nodes of the element.
The stress at time $t_{n+1}$ is then given by
$$
\sigma^ {n + 1} = \sigma^ {n} + \Delta \sigma^ {n}. \tag {4.31}
$$
The total viscoplastic strain at time $t_{n+1}$ is
$$
\epsilon_ {v p} ^ {n + 1} = \epsilon_ {v p} ^ {n} + \Delta \epsilon_ {v p} ^ {n}, \tag {4.32}
$$
and finally the viscoplastic strain rate at $t_{n+1}$ is given, from (4.14) as
$$
\dot {\epsilon} _ {v p} ^ {n + 1} = \gamma \left[ \sigma^ {n + 1} - \left(\sigma_ {Y} + H ^ {\prime} \epsilon_ {v p} ^ {n + 1}\right) \right]. \tag {4.33}
$$
In employing the Euler scheme for time-stepping, we are effectively linearising the variation of quantities over the increment. Therefore the total stresses $\sigma^{n+1}$ obtained by accumulating all such stress increments may not be in exact equilibrium with the applied forces. It is therefore necessary to introduce an equilibrium correction procedure into the numerical solution algorithm. The simplest approach is to evaluate the out-of-balance nodal forces at the end of each time step and consider these forces as additional forces to be applied at the beginning of the next time increment.
The out-of-balance or residual forces, $\psi$ , for the general element are given as the algebraic sum of the applied nodal loads and the nodal forces equivalent to the element stress, so that
$$
\psi^ {n + 1} = A \sigma^ {n + 1} \left[ \begin{array}{c} 1 \\ - 1 \end{array} \right] + f ^ {n + 1}, \tag {4.34}
$$
in which $\sigma^{n+1}$ is the element stress and $f^{n+1}$ are the total applied forces at time $t_{n+1}$ . These residual forces are then added to the pseudo forces to give for the next time increment
$$
\Delta V ^ {n + 1} = A E \dot {\epsilon} _ {v p} ^ {n + 1} \Delta t _ {n + 1} \left[ \begin{array}{c} 1 \\ - 1 \end{array} \right] + \Delta f ^ {n + 1} + \psi^ {n + 1}. \tag {4.35}
$$
This sequence is repeated for each time step until solution is either obtained for the desired time duration or until steady state conditions are achieved. Steady state conditions are deemed to have been achieved when the viscoplastic strain rate, $\dot{\epsilon}_{vp}^{n}$ , becomes tolerably small.
# 4.4 Limiting time-step length
The critical time-step length for viscoplastic solution using the Euler time marching scheme has been established by Cormeau. $^{(1)}$ For the uniaxial case considered in this chapter the limiting value is
$$
\Delta t \leqslant \frac {\sigma_ {Y}}{\gamma E}. \tag {4.36}
$$
Alternatively the time-step length can be limited according to a semi-empirical relationship. Such an approach is essential for some general continuum problems where a theoretical value of the critical time-step length may not exist. The most obvious procedure is to limit the viscoplastic strain increment to be some specified factor, $\tau$ , of the total current strain,
$$
\dot {\epsilon} _ {v p} ^ {n} \Delta t _ {n} \leqslant \tau \epsilon^ {n}. \tag {4.37}
$$
Since each element generally has a different strain level, expression (4.37) will yield a different limiting step value when applied to each element in turn. Therefore the limiting value is restricted according to
$$
\Delta t _ {n} \leqslant \tau \left[ \frac {\epsilon^ {n}}{\dot {\epsilon} _ {v p} {} ^ {n}} \right] _ {\min}, \tag {4.38}
$$
where the minimum value of $\Delta t_{n}$ obtained after considering each element is taken. Stability of the solution process is also aided by restricting the length of successive time steps according to
$$
\Delta t _ {n + 1} \leqslant k \Delta t _ {n}, \tag {4.39}
$$
where k is a specified constant generally chosen in the range 1·5–2·0.
# 4.5 Computational procedure
Before proceeding with the development of a computer code for the solution of one-dimensional viscoplastic problems we will first summarise the essential steps of the computation. Solution to the problem must commence from the known initial conditions at time t = 0 which of course correspond to the initial elastic response. At this stage $\varphi^{0}, f^{0}, \epsilon^{0}, \sigma^{0}$ are known and $\epsilon_{vp}^{0} = 0$ . The general procedure for advancing the solution from a time $t_{n}$ to time $t_{n+1}$ is the following.
Stage I At time $t = t_{n}$ the values of $\sigma^{n}$ , $\epsilon^{n}$ , $\epsilon_{vp}^{n}$ and $f^{n}$ are known for each element and the nodal displacements are also known. The viscoplastic strain rate for each element is then evaluated according to (4.14) as
$$
\dot {\epsilon} _ {v p} ^ {n} = \gamma \left[ \sigma^ {n} - \left(\sigma_ {Y} + H ^ {\prime} \epsilon_ {v p} ^ {n}\right) \right]. \tag {4.40}
$$
Stage 2 (a) Compute the displacement increments, $\Delta \varphi^n$ , according to (4.22)-(4.25), as
$$
\Delta \varphi^ {n} = [ K ] ^ {- 1} \Delta V ^ {n},
$$
where
$$
\Delta V ^ {n} = A E \dot {\epsilon} _ {v p} ^ {n} \Delta t _ {n} \left[ \begin{array}{c} 1 \\ - 1 \end{array} \right] + \Delta f ^ {n},
$$
and the stiffness matrix for an individual element is
$$
\boldsymbol {K} ^ {(e)} = \frac {E A}{L} \left[ \begin{array}{c c} 1 & - 1 \\ - 1 & 1 \end{array} \right].
$$
(b) Calculate the stress increment $\Delta\sigma^{n}$ and the viscoplastic strain increment $\Delta\epsilon_{vp}^{n}$ for each element as
$$
\Delta \sigma^ {n} = E \left(\frac {\Delta \phi_ {1} ^ {n} - \Delta \phi_ {2} ^ {n}}{L} - \dot {\epsilon} _ {v p} ^ {n} \Delta t _ {n}\right),
$$
$$
\Delta \epsilon_ {v p} ^ {n} = \dot {\epsilon} _ {v p} ^ {n} \Delta t _ {n}.
$$
Stage 3 Determine the total displacements, stresses and viscoplastic strain
$$
\varphi^ {n + 1} = \varphi^ {n} + \Delta \varphi^ {n},
$$
$$
\sigma^ {n + 1} = \sigma^ {n} + \Delta \sigma^ {n},
$$
$$
\epsilon_ {v p} ^ {n + 1} = \epsilon_ {v p} ^ {n} + \Delta \epsilon_ {v p} ^ {n}.
$$
Stage 4 Calculate the viscoplastic strain rate for each element
$$
\dot {\epsilon} _ {v p} ^ {n + 1} = \gamma [ \sigma^ {n + 1} - (\sigma_ {Y} + H ^ {\prime} \epsilon_ {v p} ^ {n + 1}) ].
$$
Stage 5 Apply the equilibrium correction. Evaluate the residual forces, for each element, as
$$
\psi^ {n + 1} = A \sigma^ {n + 1} \left[ \begin{array}{c} 1 \\ - 1 \end{array} \right] + f ^ {n + 1}.
$$
Add these into the vector of incremental pseudo loads for use in the next time step
$$
\Delta V ^ {n + 1} = A E \dot {\epsilon} _ {v p} ^ {n + 1} \Delta t _ {n + 1} \left[ \begin{array}{c} 1 \\ - 1 \end{array} \right] + \Delta f ^ {n + 1} + \psi^ {n + 1}.
$$
Stage 6 Check to see if the viscoplastic strain rate $\dot{\epsilon}_{vp}^{n+1}$ in each element has become tolerably small. If so, steady state conditions have been reached and the solution is either terminated or the next load increment is applied. If $\dot{\epsilon}_{vp}^{n+1}$ is non-zero return to Stage 1 and repeat the entire procedure for the next time step.
# 4.6 Program structure
The organisation of the one-dimensional viscoplastic program is shown in Fig. 4.4 where, in particular, the order in which subroutines are accessed is indicated. The operations undertaken by the program are those described in Section 4.5. Many of the subroutines employed are common to the one-dimensional plasticity application described in Chapter 3 and, since they are used in the present program without modification, the reader will be referred to the appropriate section for details. Only the additional subroutines necessary to complete the computer package will be described in this chapter.
With reference to Fig. 4.4 the following subroutines have been already described where indicated below:
Subroutine ASSEMB —Section 3.4.2
Subroutine GREDUC—Section 3.4.3
Subroutine BAKSUB —Section 3.4.4
Subroutine RESOLV —Section 3.4.5
Subroutine RESULT —Section 3.5
Subroutine INITIAL —Section 3.6\*
Also, Subroutine DATA described in Section 3.2 is used with some minor modifications. A viscoplastic material in one dimension requires five individual quantities to describe it completely. Thus NPROP becomes 5 and the following quantities must be specified as material properties.
PROPS (NUMAT, 1)—The elastic modulus, E, of the material
PROPS (NUMAT, 2)—The cross-sectional area, A, of the element
PROPS (NUMAT, 3)—The uniaxial yield stress, $\sigma_{Y}$ , of the material
PROPS (NUMAT, 4)—The linear strain hardening parameter, $H'$ , for the material
PROPS (NUMAT, 5)—The fluidity parameter, $\gamma$ , controlling the viscoplastic strain rate.
\* Subroutine NONAL, described in Section 3.3, is also employed but with IITER now replaced by the time step index, ISTEP.

flowchart
```mermaid
graph TD
A["START"] --> B["DATA\nInput data defining geometry, loading, boundary conditions, material properties, etc."]
B --> C["STUNVP\nCalculate the stiffness matrix for each element"]
C --> D["ASSEMB\nAssemble the element loads and stiffnesses to give the global stiffness matrix and load vector"]
D --> E["GREDUC, BAKSUB & RESOLV\nSolve the resulting system of simultaneous equations for the displacements φ"]
E --> F["INCVP\na) Evaluate quantities at the end of the timestep\nb) Calculate the pseudo loads for application during the next time step"]
F --> G["CONVP\nCheck for convergence of the time stepping process to steady state conditions"]
G --> H["RESULT\nPrint the results for the current timestep"]
H --> I["END"]
I --> J["LOAD INCREMENT LOOP"]
J --> K["TIME STEPPING LOOP"]
K --> A
```
| 30 CONTINUE | INVP | 45 |
| DTIME=DNEXT | INVP | 46 |
| IF(ISTEP.EQ.1) DTIME=DTINT | INVP | 47 |
| DO 50 IELEM=1,NELEM | INVP | 48 |
| LPROP=MATNO(IELEM) | INVP | 49 |
| YOUNG=PROPS(LPROP,1) | INVP | 50 |
| XAREA=PROPS(LPROP,2) | INVP | 51 |
| FACTR=(YOUNG*VIVEL(IELEM)*DTIME-STRES(IELEM,1))*XAREA | INVP | 52 |
| IF(COORD(NODE2).GT.COORD(NODE1)) GO TO 40 | INVP | 53 |
| ELOAD(IELEM,1)= FACTR | INVP | 54 |
| ELOAD(IELEM,2)=-FACTR | INVP | 55 |
| GO TO 50 | INVP | 56 |
| 40 ELOAD(IELEM,1)=-FACTR | INVP | 57 |
| ELOAD(IELEM,2)= FACTR | INVP | 58 |
| 50 CONTINUE | INVP | 59 |
| DO 60 IELEM=1,NELEM | INVP | 60 |
| DO 60 IEVAB=1,NEVAB | INVP | 61 |
| 60 ELOAD(IELEM,IEVAB)=ELOAD(IELEM,IEVAB)+TLOAD(IELEM,IEVAB) | INVP | 62 |
| RETURN | INVP | 63 |
| END | INVP | 64 |