# 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), ``` ```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. # 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}}, $$ 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 ``` C return end # 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' ``` ```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): ```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 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.