<!-- source-page: 571 -->

# 1.2.26 VUVISCOSITY: User subroutine to define the shear viscosity for equation of state models.

# Product: Abaqus/Explicit

# References

• “Equation of state,” Section 25.2.1 of the Abaqus Analysis User’s Guide   
• \*EOS   
• \*VISCOSITY   
• “VUVISCOSITY,” Section 4.1.40 of the Abaqus Verification Guide

# Overview

User subroutine VUVISCOSITY:

• is called at all material points of elements with an equation of state for which the material definition includes user-defined viscous shear behavior;   
• can be used to define a material’s isotropic viscous behavior;   
• can use and update solution-dependent state variables; and   
• can be used in conjunction with user subroutine VUSDFLD to redefine any field variables before they are passed in.

# User subroutine interface

```prolog
subroutine vuviscosity(
C Read only -
* nblock,
* jElem, kIntPt, kLayer, kSecPt,
* steppTime, totalTime, dt, cmname,
* nstatev, nfieldv, nprops,
* props, tempOld, tempNew, fieldOld, fieldNew,
* stateOld,
* shrRate,
C Write only -
* viscosity,
* stateNew )
C
include 'vaba_param.inc'
C
dimension props(nprops), tempOld(nblock), tempNew(nblock), 
```

<!-- source-page: 572 -->

```txt
1 fieldOld(nblock, nfieldv), fieldNew(nblock, nfieldv),
2 stateOld(nblock, nstatev), eqps(nblock), eqpsRate(nblock),
3 viscosity(nblock),
4 stateNew(nblock, nstatev), jElem(nblock)
C
    character*80 cmname
C
    do 100 km = 1, nblock
    user coding
100 continue
C
    return
    end 
```

# Variables to be defined

viscosity(nblock)

Array containing the viscosity at the material points. (Units of FL−2 T.)

stateNew(nblock,nstatev)

Array containing the state variables at the material points at the end of the increment. The allocation of this array is described in “Solution-dependent state variables” in “User subroutines: overview,” Section 18.1.1 of the Abaqus Analysis User’s Guide.

# Variables passed in for information

nblock

Number of material points to be processed in this call to VUVISCOSITY.

jElem(nblock)

Array of element numbers.

kIntPt

Integration point number.

kLayer

Layer number (for composite shells).

kSecPt

Section point number within the current layer.

stepTime

Value of time since the step began.

totalTime

Value of total time. The time at the beginning of the step is given by totalTime-stepTime.

<!-- source-page: 573 -->

# dt

Time increment size.

# cmname

Material name, left justified. It is passed in as an uppercase character string. Some internal material models are given names starting with the “ABQ\_” character string. To avoid conflict, “ABQ\_” should not be used as the leading string for cmname.

# nstatev

Number of user-defined state variables that are associated with this material type (see “Allocating space” in “User subroutines: overview,” Section 18.1.1 of the Abaqus Analysis User’s Guide).

# nfieldv

Number of user-defined external field variables.

# nprops

User-specified number of user-defined material properties.

# tempOld(nblock)

Temperatures at the material points at the beginning of the increment.

# tempNew(nblock)

Temperatures at the material points at the end of the increment.

# fieldOld(nblock,nfieldv)

Values of the user-defined field variables at the material points at the beginning of the increment.

# fieldNew(nblock,nfieldv)

Values of the user-defined field variables at the material points at the end of the increment.

# stateOld(nblock,nstatev)

State variables at the material points at the beginning of the increment.

# shrRate(nblock)

Equivalent shear strain rate, , at the material points.

# Example: Cross viscosity model

As a simple example of the coding of subroutine VUVISCOSITY, consider the Cross viscosity model. The Cross model is commonly used when it is necessary to describe the low shear rate behavior of the viscosity. The viscosity is expressed as

$$
\eta = \frac {\eta_ {0}}{1 + (\lambda \dot {\gamma}) ^ {1 - n}},
$$

<!-- source-page: 574 -->

where $\eta _ { 0 }$ is the Newtonian viscosity, is the flow index in the power law regime, and is a constant with units of time, such that $1 / \lambda$ corresponds to the critical shear rate at which the fluid changes from Newtonian to power law behavior.

The subroutine would be coded as follows:

```txt
subroutine vuviscosity (
C Read only -
    * nblock,
    * jElem, kIntPt, kLayer, kSecPt,
    * steTime, totalTime, dt, cmname,
    * nstatev, nfieldv, nprops,
    * props, tempOld, tempNew, fieldOld, fieldNew,
    * stateOld,
    * shrRate,
C Write only -
    * viscosity,
    * stateNew )
C
    include 'vaba_param.inc'
C
    dimension props(nprops),
    * tempOld(nblock),
    * fieldOld(nblock, nfieldv),
    * stateOld(nblock, nstatev),
    * shrRate(nblock),
    * tempNew(nblock),
    * fieldNew(nblock, nfieldv),
    * viscosity(nblock),
    * stateNew(nblock, nstatev)
C
    character*80 cmname
C
    parameter (one = 1.d0 )
C
C Cross viscosity
C
    eta0 = props(1)
    rlambda = props(2)
    rn = props(3)
C
    do k = 1, nblock
    viscosity(k) = eta0 / (one + (rlambda * shrRate(k)) ** (one - rn))
    end do 
```

<!-- source-page: 575 -->

C

return
end

<!-- source-page: 576 -->

<!-- source-page: 577 -->

# 1.2.27 VWAVE: User subroutine to define wave kinematics for an Abaqus/Aqua analysis.

Products: Abaqus/Explicit Abaqus/Aqua

# References

• “Abaqus/Aqua analysis,” Section 6.11.1 of the Abaqus Analysis User’s Guide   
• \*AQUA   
• \*WAVE   
• \*WIND

# Overview

User subroutine VWAVE:

• will be called for a collection of points (typically load integration points) for which an Abaqus/Aqua load and a user-defined gravity wave are specified;   
• can be used to define wave kinematics to provide unsteady contributions to fluid variables—such as velocity, acceleration, pressure, gradient of pressure along elevation, and the instantaneous freesurface elevation—as a function of time and space; and   
• will be called twice within an increment for each Abaqus/Aqua load. The first call is used to obtain the instantaneous wave-surface elevation at the nodes of the elements on which the loads are applied. The second call is used to obtain desired fluid variables at the integration points for the load calculations.

# User subroutine interface

```python
subroutine vwave(
C Write only -
    1 fWaveSurf, fUnsteadyVel, fFluidAcc,
    2 fUnsteadyPress, fUnsteadyDPressDZ,
C Read/Write -
    1 ScaleSteady, ScaleUnsteady,
C Read only -
    1 kStep, kInc,
    2 nblock, ndim, nprops, naquaconst, nwindconst,
    3 nstatevar, nfieldvar, iElemType, iLoadType, sname,
    4 lUpdFluidVar, Coord, Velocity, StateVar, FieldVar,
    5 DirVec, AquaSteadyConstants, WindConstants,
    6 fSteadyVel, Props, dt, timeTotal, timeStep)
C
    include 'vaba_param.inc' 
```

<!-- source-page: 578 -->

```txt
parameter ( j_upd_FreeSurf = 0,
1 j_upd_FluidVarBuoyancy = 1,
2 j_upd_FluidVarDrag = 2,
3 j_upd_FluidVarInertia = 3, 
```  
The types of distributed loads:

```javascript
1 j_lcr_PB = 51,
2 j_lcr_DragFDD = 53, j_lcr_DragWDD = 54,
3 j_lcr_DragFDT = 55, j_lcr_DragFI = 56,
4 j_lcr_DragFD1 = 57, j_lcr_DragFD2 = 58,
5 j_lcr_DragWD1 = 59, j_lcr_DragWD2 = 60,
6 j_lcr_DragFI1 = 61, j_lcr_DragFI2 = 62, 
```  
The types of concentrated loads:

```python
1 j_ccr_TSB = 1002, j_ccr_DragTFD = 1004,  
2 j_ccr_DragTWD = 1005, j_ccr_DragTSI = 1006) 
```

dimension Props(nProps), Coord(nblock,ndim),   
```txt
1 Velocity(nblock,ndim), StateVar(nblock,nstatevar),
2 FieldVar(nblock,nfieldvar), DirVec(nblock,ndim),
3 fWaveSurf(nblock), fFluidAcc(nblock,ndim),
4 fUnsteadyVel(nblock,ndim), fUnsteadyPress(nblock),
5 fUnsteadyDPressDZ(nblock), fSteadyVel(nblock,ndim),
6 AquaSteadyConstants(naquaconst), WindConstants(nwindconst) 
```  
character\*80 sname   
The following if test and do loop structure illustrates proper usage of this user subroutine.

if (lUpdFluidVar .eq. j\_upd\_FreeSurf) then This part is executed at the first call.   
```txt
do kn = 1, nblock
    User coding to update fWaveSurf
    optionally update StateVar
end do 
```  
else   
This part is executed at the second call.   
if (lUpdFluidVar .eq. j\_upd\_FluidVarBuoyancy) then Update variables for buoyancy loads (PB, TSB):

<!-- source-page: 579 -->

```lua
do kn = 1, nblock
    user coding to update fUnsteadyPress, fUnsteadyDPressDZ
    end do
    optionally update multipliers ScaleSteady, ScaleUnsteady
    else if (lUpdFluidVar .eq. j_upd_FluidVarDrag) then
    Update variables for drag loads (FDD, FDT, FD1, FD2, TFD):
    do kn = 1, nblock
    User coding to update fUnsteadyVel
    end do
    optionally update multipliers ScaleSteady, ScaleUnsteady
    else if (lUpdFluidVar .eq. j_upd_FluidVarInertia) then
    Update variables for inertia loads (FI, FI1, FI2, TSI):
    do kn = 1, nblock
    User coding to update fFluidAcc
    end do
    optionally update multipliers ScaleSteady, ScaleUnsteady
    end if
    end if
    return
    end 
```

# Variables to be defined

# fWaveSurf(nblock)

This array contains the instantaneous fluid free surface elevation at the elemental nodes and is calculated when the flag lUpdFluidVar has the value j\_upd\_FreeSurf. The incoming array contains the still free-surface elevation value for each node. The nodal values, as seen in the first call, are used to identify the wet portion of an element.

# fUnsteadyVel(nblock, ndim)

This array contains the unsteady part of the fluid velocity at load integration points and is calculated when the flag lUpdFluidVar has the value j\_upd\_FluidVarDrag. The incoming array contains zeros.

# fFluidAcc(nblock, ndim)

This array contains the fluid acceleration at load integration points and is calculated when the flag lUpdFluidVar has the value j\_upd\_FluidVarInertia. The incoming array contains zeros.

# fUnsteadyPress(nblock)

This array contains the unsteady part of the fluid pressure at load integration points and is calculated when the flag lUpdFluidVar has the value j\_upd\_FluidVarBuoyancy. The incoming array contains zeros. The steady part of the pressure is not stored but is calculated by Abaqus/Explicit at

<!-- source-page: 580 -->

each load integration point based on the data provided under the \*AQUA option and is scaled by the ScaleSteady parameter.

# fUnsteadyDPressDZ(nblock)

This array contains the unsteady part of the gradient of fluid pressure along elevation at load integration points and is calculated when the flag lUpdFluidVar has the value j\_upd\_FluidVarBuoyancy. The incoming array contains zeros. Similar to steady pressures, the gradients are not stored but are calculated by Abaqus/Explicit at each load integration point based on the data provided in the fluid variable definition and scaled by the ScaleSteady parameter.

# Variables that can be updated

The fluid variables—such as velocity, acceleration, pressure, and pressure gradient along elevation—used in load calculations are split in steady and unsteady parts. The following real variables scale each of those parts:

# ScaleSteady

This variable is used by Abaqus/Explicit to scale the steady part of the fluid variables. For drag loads this variable is the amplitude value provided for this purpose on the load data line as explained in “Abaqus/Aqua analysis,” Section 6.11.1 of the Abaqus Analysis User’s Guide. For all other loads its incoming value is one. The user can optionally update this variable.

# ScaleUnsteady

This variable is used by Abaqus/Explicit to scale the unsteady part of the fluid variables. The user is expected to define unscaled values for unsteady fluid variables. For drag loads this variable is the amplitude value provided for this purpose on the load data line, as explained in “Abaqus/Aqua analysis,” Section 6.11.1 of the Abaqus Analysis User’s Guide. For all other loads its incoming value is one. The user can optionally update this variable.

# Variables passed in for information

kStep

Step number.

kInc

Increment number.

nblock

Number of nodes or load integration points, where the wave effects are to be computed.

ndim

Dimension of the problem (two- or three-dimensional problem).

nprops

The number of properties (real numbers) for the user-defined wave.
