1.2.1 VDISP
User subroutine to specify prescribed boundary conditions.

Product: Abaqus/Explicit  

References

Overview

User subroutine VDISP:

Initialization

At the beginning of a step user subroutine VDISP is called twice to establish all required initial conditions.

The first call to user subroutine VDISP is made to establish the startup mean velocity, which is indicated by the passing of a step time value of into the subroutine, where is the current time increment. If displacement is prescribed, the returned variable, rval, corresponds to the displacement at . In this case rval should be set equal to , where , and are the initial displacement, velocity, and acceleration, respectively. If velocity is prescribed, the returned variable corresponds to the mean velocity at . In this case rval should be set equal to . If acceleration is prescribed, the returned variable corresponds to the acceleration at . In this case rval should be set equal to . The initial displacement and velocity are passed into the user subroutine in the arrays u and v, respectively.

The second call to user subroutine VDISP is made to establish the initial acceleration, which is indicated by the passing of a step time value of zero into the subroutine. If displacement is prescribed, the returned variable should be set equal to the displacement at . If velocity is prescribed, the returned variable should be set equal to the mean velocity at . If acceleration is prescribed, the returned variable should be set equal to the acceleration at zero step time.

Time incrementation

During time incrementation user subroutine VDISP is called once for each increment to establish all required prescribed conditions.

If displacement is prescribed, the returned variable should be set equal to the displacement at stepTime+dtNext, where stepTime is the step time and dtNext is the next time increment. If velocity is prescribed, the returned variable should be set equal to the mean velocity at stepTime+dtNext/2. If acceleration is prescribed, the returned variable should be set equal to the acceleration at stepTime.

User subroutine interface

      subroutine vdisp(
c Read only variables -
     1   nblock, nDof, nCoord, kstep, kinc,
     2   stepTime, totalTime, dtNext, dt,
     3   cbname, jBCType, jDof, jNodeUid, amp,
     4   coordNp, u, v, a, rf, rmass, rotaryI,
c Write only variable -
     5   rval )
c
      include 'vaba_param.inc'
c
      character*80 cbname
      dimension jDof(nDof), jNodeUid(nblock), 
     1          amp(nblock), coordNp(nCoord,nblock),
     2          u(nDof,nblock), v(nDof,nblock), a(nDof,nblock),
     3          rf(nDof,nblock), rmass(nblock), rotaryI(3,3,nblock),
     4          rval(nDof,nblock)
c
      do 100 k = 1, nblock
      do 100 j = 1, nDof
         if( jDof(j) .gt. 0 ) then
            user coding to define rval(j, k)
         end if
  100 continue
c
      return
      end

Variable to be defined

rval(nDof, nblock)

Values of the prescribed variable for degrees of freedom 1–6 (translation and rotation) at the nodes. The variable can be displacement, velocity, or acceleration, depending on the type specified in the associated boundary condition. The variable type is indicated by jBCType.

Variables passed in for information

nblock

Number of nodal points to be processed in this call to VDISP.

nDof

Number of degrees of freedom (equals 6).

nCoord

Number of coordinate components (equals 3).

kstep

Step number.

kinc

Increment number.

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.

dtNext

Next time increment size.

dt

Current time increment size.

cbname

User-specified name corresponding to the associated boundary condition.

jBCType

Indicator for type of prescribed variable: 0 for displacement, 1 for velocity, and 2 for acceleration.

jDof(nDof)

Indicator for prescribed degrees of freedom. The values given by rval(j,k) are prescribed only if jDof(j) equals 1.

jNodeUid(nblock)

Node numbers.

amp(nblock)

Amplitude values corresponding to the associated amplitude functions. These values are passed in for information only and will not contribute to the values of the prescribed variable automatically.

coordNp(nCoord, nblock)

Nodal point coordinates.

u(nDof, nblock)

Nodal point displacements at stepTime. All translations are included if one or more translational degrees of freedom are prescribed. All rotations are included if one or more rotational degrees of freedom are prescribed.

v(nDof, nblock)

Nodal point velocities at zero step time during initialization or nodal point mean velocities at stepTime-dt/2 during time incrementation. All translational velocities are included if one or more translational degrees of freedom are prescribed. All angular velocities are included if one or more rotational degrees of freedom are prescribed.

a(nDof, nblock)

Nodal point accelerations at stepTime before the boundary condition is prescribed. All translational accelerations are included if one or more translational degrees of freedom are prescribed. All angular accelerations are included if one or more rotational degrees of freedom are prescribed.

rf(nDof, nblock)

Nodal point reaction at stepTime-dt. All reaction forces are included if one or more translational degrees of freedom are prescribed. All reaction moments are included if one or more rotational degrees of freedom are prescribed.

rmass(nblock)

Nodal point masses.

rotaryI(3, 3, nblock)

Nodal point rotary inertia.

Example: Imposition of acceleration on a rigid body with nonzero initial velocity

In this example a sinusoidal acceleration is imposed on the reference node of a rigid body. Nonzero initial velocity is also specified for the rigid body. User subroutine VDISP given below illustrates how the return value array is to be computed for different phases of the solution. The analysis results show that both the initial velocity and acceleration are correctly specified.

Input file

*HEADING
 Test VDISP with S4R element
*NODE, NSET=NALL
 1,
 2, 2., 0.
 3, 0., 2.
 4, 2., 2.
 9, 1., 1., 0.
*ELEMENT, TYPE=S4R, ELSET=SHELL
 10, 1,2,4,3
*SHELL SECTION, ELSET=SHELL, MATERIAL=ELSHELL
  2.0000000e-02,     3 
*MATERIAL, NAME=ELSHELL
*DENSITY
7850.0, 
*ELASTIC
  2.5000000e+11,   3.0000000e-01
*RIGID BODY, REF NODE=9, ELSET=SHELL
*INITIAL CONDITIONS, Type=VELOCITY
 9, 1, 0.4
*STEP
*DYNAMIC, EXPLICIT, DIRECT USER CONTROL
 0.01, 0.8
*BOUNDARY, USER, TYPE=ACCELERATION
 9, 1
*OUTPUT,HISTORY, TIME INTERVAL=0.01, OP=NEW
*NODE OUTPUT, NSET=NALL
 U, V, A
*END STEP

User subroutine

      subroutine vdisp(
c Read only variables -
     *   nblock, nDof, nCoord, kstep, kinc, 
     *   stepTime, totalTime, dtNext, dt, 
     *   cbname, jBCType, jDof, jNodeUid, amp,
     *   coordNp, u, v, a, rf, rmass, rotaryI, 
c Write only variable -
     *   rval )
c
      include 'vaba_param.inc'
      parameter( zero = 0.d0, half = 0.5d0, one = 1.d0 )
c
      character*80 cbname
      dimension jDof(nDof), jNodeUid(nblock), 
     *   amp(nblock), coordNp(nCoord,nblock), 
     *   u(nDof,nblock), v(nDof,nblock), a(nDof,nblock), 
     *   rf(nDof,nblock), rmass(nblock), 
     *   rotaryI(3,3,nblock), rval(nDof,nblock)
c      
c     Impose acceleration
c
      if( jBCType .eq. 2 ) then
c
         if( stepTime .lt. zero ) then
c
c           Initialization 1
c
            a0  = zero
            do 310 k=1, nblock
            do 310 j=1, nDof
               if ( jDof(j) .gt. 0 ) then
                  v0 = v(j,k)
                  rval(j,k)  = v0/dt - a0*half 
               end if
310         continue
c
         else if( stepTime .eq. zero ) then
c
c           Initialization 2
c
            a0 = zero
            do 320 k=1, nblock
            do 320 j=1, nDof
               if ( jDof(j) .gt. 0 ) then
                  rval(j,k) = a0
               end if
320         continue
c
         else
c
c           Time incrementation
c
            amplitude = 2.0
            period = 0.8
            twopi = 6.2831853d0
c
            do 350 k=1, nblock
            do 350 j=1, nDof
               if ( jDof(j) .gt. 0 ) then
                  rval(j,k) = amplitude*
*                           sin( twopi*stepTime / period )
               end if
350         continue      
         end if
      end if
c
      return
      end