In an analysis of a TLP tether, it is required to invoke the user-subroutine option to superpose the motion due to TLP setdown on the motion due to TLP heave. The user-subroutine facility is required because of course the TLP setdown is very much a time dependent quantity, since it is a function of the instantaneous TLP surge. The actual equation defining the magnitude of the setdown is:
(1)
where:
•S(t) is the setdown value at time t
•L is the tether length
• is the TLP surge at time t
The example user subroutine is shown in the table below.
Example User-Subroutine
! Subroutine usrdsp -- to prescribe time-dependent displacements.
! Do not modify the following lines.
subroutine usrdsp(node, ndof, time, ramp, dispx, dispy, dispz, disp)
!dec$ attributes dllexport, stdcall, reference :: usrdsp
implicit none
integer, intent(in) :: node
!dec$ attributes reference :: node
integer, intent(in) :: ndof
!dec$ attributes reference :: ndof
real(8), intent(in) :: time
!dec$ attributes reference :: time
real(8), intent(in) :: ramp
!dec$ attributes reference :: ramp
real(8), intent(in) :: dispx
!dec$ attributes reference :: dispx
real(8), intent(in) :: dispy
!dec$ attributes reference :: dispy
real(8), intent(in) :: dispz
!dec$ attributes reference :: dispz
real(8), intent(inout) :: disp
!dec$ attributes reference :: disp
!
! Variable Names
!
! node : The number of the node for which usrdsp is being called.
! ndof : The number of the degree of freedom (dof) for which usrdsp
! is being called.
! time : The present simulation time.
! ramp : The current value of the ramp being applied to loads and
! displacements.
!
! dispx : The displacement value currently in the array of nodal
! displacements for the vertical dof at this node.
! If heave motions have been specified at this node, dispx will
! contain the heave calculated at this time.
! dispy : The displacement value currently in the array of nodal
! displacements for dof 2 at this node.
! dispz : The displacement value currently in the array of nodal
! displacements for dof 3 at this node.
!
! disp : The displacement value to be assigned to this node and dof
! for this time value (user-specified).
!
! Declare local variables.
real(8) :: setdown
! Insert coding to define user-specified motion below this line.
setdown = 315.d0 - dsqrt(315.d0**2 - dispy**2)
disp = dispx - setdown
! Notes: (i) Setdown based on tether length of 315m
! (ii) Setdown superposed on motion due to heave
! (iii) dispx, dispy and dispz already have ramp applied,
! so do not apply ramp to setdown
! Do not alter the next line.
end subroutine usrdsp