The dropped object analysis is performed in two stages. The initial static determines the static equilibrium configuration of the system. The dynamic analysis models the collision between the falling container and the riser.
The base of the riser is fixed in all translational degrees of freedom, while the upper end is attached to the vessel. The container is restrained from motion in the initial static analysis, and then allowed to free-fall in the subsequent dynamic analysis.
Clashing is a complex and highly non-linear phenomenon, so the use of relatively small time steps is essential, in order to accurately capture the moment of impact, and the subsequent structural response. Flexcom automatically reduces the solution time step in anticipation of contact, and once the components have separated after impact, the time step begins to increase again. This approach facilitates a robust and accurate contact model, while also ensuring an efficient simulation.
The recovered object analysis is performed in two stages. The initial static is used to set the model configuration and define the balloon elements attached to the container for later modification in a subsequent dynamic analysis.
The dynamic analysis is used to load the dll which changes the element buoyancy diameters on the balloon as required throughout the analysis to replicate the inflating lift balloon. The source code for the user defined element dll is shown below.
subroutine user_defined_element(iter,time,ramp,nnode,nncon,ncord,nndof,nelmn,necon,nedof,ndamp,elmcon, &
nodcon,intoun,ietoue,etype,edamp,cord,displacement,velocity,acceleration,trgb,tglu,disp_prev,pos_prev, &
vel_prev,acc_prev,axial_force,y_shear,z_shear,torque,y_bending,z_bending,eff_tension,y_curvature, &
z_curvature,length,eiyy,eizz,gj,ea,mass,polar,dint,ddrag,dbuoy,dout,dcont,fluid,damper)
!dec$ attributes dllexport, stdcall, reference :: user_defined_element
implicit none
! Input variables - cannot be modified within this subroutine
integer, intent(in) :: iter
!dec$ attributes value :: iter
real(8), intent(in) :: time
!dec$ attributes value :: time
real(8), intent(in) :: ramp
!dec$ attributes value :: ramp
integer(4), intent(in) :: nnode
!dec$ attributes value :: nnode
integer(4), intent(in) :: nncon
!dec$ attributes value :: nncon
integer(4), intent(in) :: ncord
!dec$ attributes value :: ncord
integer(4), intent(in) :: nndof
!dec$ attributes value :: nndof
integer(4), intent(in) :: nelmn
!dec$ attributes value :: nelmn
integer(4), intent(in) :: necon
!dec$ attributes value :: necon
integer(4), intent(in) :: nedof
!dec$ attributes value :: nedof
integer(4), intent(in) :: ndamp
!dec$ attributes value :: ndamp
integer(4), intent(in), dimension(nncon, nelmn) :: elmcon
!dec$ attributes reference :: elmcon
integer(4), intent(in), dimension(necon,nnode) :: nodcon
!dec$ attributes reference :: nodcon
integer(4), intent(in), dimension(nnode) :: intoun
!dec$ attributes reference :: intoun
integer(4), intent(in), dimension(nelmn) :: ietoue
!dec$ attributes reference :: ietoue
integer(4), intent(in), dimension(nelmn) :: etype
!dec$ attributes reference :: etype
integer(4), intent(in), dimension(nelmn) :: edamp
!dec$ attributes reference :: edamp
real(8), intent(in), dimension(ncord,nnode) :: cord
!dec$ attributes reference :: cord
real(8), intent(in), dimension(nndof,nnode) :: displacement
!dec$ attributes reference :: displacement
real(8), intent(in), dimension(nndof,nnode) :: velocity
!dec$ attributes reference :: velocity
real(8), intent(in), dimension(nndof,nnode) :: acceleration
!dec$ attributes reference :: acceleration
real(8), intent(in), dimension(3,3,nelmn) :: trgb
!dec$ attributes reference :: trgb
real(8), intent(in), dimension(3,3,nelmn) :: tglu
!dec$ attributes reference :: tglu
real(8), intent(in), dimension(nndof,nnode) :: disp_prev
!dec$ attributes reference :: disp_prev
real(8), intent(in), dimension(nndof,nnode) :: pos_prev
!dec$ attributes reference :: pos_prev
real(8), intent(in), dimension(nndof,nnode) :: vel_prev
!dec$ attributes reference :: vel_prev
real(8), intent(in), dimension(nndof,nnode) :: acc_prev
!dec$ attributes reference :: acc_prev
real(8), intent(in), dimension(nelmn,3) :: axial_force
!dec$ attributes reference :: axial_force
real(8), intent(in), dimension(nelmn,3) :: y_shear
!dec$ attributes reference :: y_shear
real(8), intent(in), dimension(nelmn,3) :: z_shear
!dec$ attributes reference :: z_shear
real(8), intent(in), dimension(nelmn,3) :: torque
!dec$ attributes reference :: torque
real(8), intent(in), dimension(nelmn,3) :: y_bending
!dec$ attributes reference :: y_bending
real(8), intent(in), dimension(nelmn,3) :: z_bending
!dec$ attributes reference :: z_bending
real(8), intent(in), dimension(nelmn,3) :: eff_tension
!dec$ attributes reference :: eff_tension
real(8), intent(in), dimension(nelmn,3) :: y_curvature
!dec$ attributes reference :: y_curvature
real(8), intent(in), dimension(nelmn,3) :: z_curvature
!dec$ attributes reference :: z_curvature
! Output variables - can be modified within this subroutine if required
real(8), intent(inout), dimension(nelmn) :: length
!dec$ attributes reference :: length
real(8), intent(inout), dimension(nelmn) :: eiyy
!dec$ attributes reference :: eiyy
real(8), intent(inout), dimension(nelmn) :: eizz
!dec$ attributes reference :: eizz
real(8), intent(inout), dimension(nelmn) :: gj
!dec$ attributes reference :: gj
real(8), intent(inout), dimension(nelmn) :: ea
!dec$ attributes reference :: ea
real(8), intent(inout), dimension(nelmn) :: mass
!dec$ attributes reference :: mass
real(8), intent(inout), dimension(nelmn) :: polar
!dec$ attributes reference :: polar
real(8), intent(inout), dimension(nelmn) :: dint
!dec$ attributes reference :: dint
real(8), intent(inout), dimension(nelmn) :: ddrag
!dec$ attributes reference :: ddrag
real(8), intent(inout), dimension(nelmn) :: dbuoy
!dec$ attributes reference :: dbuoy
real(8), intent(inout), dimension(nelmn) :: dout
!dec$ attributes reference :: dout
real(8), intent(inout), dimension(nelmn) :: dcont
!dec$ attributes reference :: dcont
real(8), intent(inout), dimension(nelmn,4) :: fluid
!dec$ attributes reference :: fluid
real(8), intent(inout), dimension(ndamp,4) :: damper
!dec$ attributes reference :: damper
! Variable names
! iter : Current iteration
! time : Current timestep
! ramp : Ramp
! nnode : Number of nodes in the model
! nncon : Number of nodes with connected elements
! ncord : Number of coordinates
! nndof : Number of degrees of freedom per node (6)
! nelmn : Number of elements in the model
! necon : Number of elements connected
! nedof : Number of degrees of freedom per element (14)
! ndamp : Number of damper elements
! elmcon : Element connectivity array
! nodcon : Node connectivity array
! intoun : Internal node to user node numbering array
! ietoue : Internal element to user element numbering array
! etype : Element type - (1) Beam, (2) Spring, (3) Hinge, (4) Damper
! edamp : Damper element number array
! cord : Initial nodal co-ordinates
! displacement : Nodal displacements at previous iteration
! velocity : Nodal velocities at previous iteration
! acceleration : Nodal accelerations at previous iteration
! trgb : Rigid body rotation (local undeformed -> convected) transformation matrix
! tglu : Global to local undeformed transformation matrix
! disp_prev : Nodal displacements at previous timestep
! pos_prev : Nodal positions at previous timestep
! vel_prev : Nodal velocities at previous timestep
! acc_prev : Nodal accelerations at previous timestep
! axial_force : Axial force in elements at previous timestep
! y_shear : Y Shear forces in elements at previous timestep
! z_shear : Z Shear forces in elements at previous timestep
! torque : Torque in elements at previous timestep
! y_bending : Y bending moments in elements at previous timestep
! z_bending : Z bending moments in elements at previous timestep
! eff_tension : Effective Tension in elements at previous timestep
! y_curvature : Y curvatures in elements at previous timestep
! z_curvature : Z curvatures in elements at previous timestep
! length : Element natural length
! eiyy : Element linear EIyy
! eizz : Element linear EIzz
! gj : Element linear GJ
! ea : Element linear EA
! mass : Element mass per unit length
! polar : Element polar inertia per unit length
! dint : Element internal diameters
! ddrag : Element drag diameters
! dbuoy : Element buoyancy diameters
! dout : Element outer diameters
! dcont : Element contact diameters
! fluid : Element fluid contents -
! (1) Top elevation (fluid head)
! (2) Density
! (3) Internal pressure
! (4) Velocity
! damper : Element contact diameters
! (1) C0
! (2) C1
! (3) C2
! (4) C0_Threshold
! Declare local variables...
integer :: i
! Insert user code below this line...
do i = 1, nelmn
if( ietoue(i) == 853 )then
dbuoy(i) = 2.0d0 + 0.02d0 * (time / 100.0d0)
else if( ietoue(i) == 854 )then
dbuoy(i) = 2.0d0 + 0.02d0 * (time / 100.0d0)
else if( ietoue(i) == 855 )then
dbuoy(i) = 2.0d0 + 0.02d0 * (time / 100.0d0)
else if( ietoue(i) == 856 )then
dbuoy(i) = 2.0d0 + 0.02d0 * (time / 100.0d0)
end if
end do
end subroutine user_defined_element