385 lines
12 KiB
Markdown
385 lines
12 KiB
Markdown
<!-- 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.
|