Dual crane (2-Hook) lifts#

This is a step-by-step description for performing dual crane or 2-Hook lift analysis.

A 2-Hook lift analysis is the same as a single hook lift analysis but with some additional variations (load-cases) performed.

The settings required for a 2-Hook lift are outlined in this section.

Just like for normal lifts, we need a Rigging Analysis node as well as a Rigging analysis section in the report.

An example model at the bottom of this section can be copy-pasted into DAVE if you wish to follow along.

Lifted object#

In the rigging-analysis node, select which of the nodes represents the lifted object.

image-20231219202538827

Hoists#

For a dual crane lift the two hoists need to be defined in the Rigging Analysis node:

image-20231219200349130

The first hoist (Bow hoist in this example) will be changed in height during reporting. The second hoist will remain at the same elevation.

If you have only one hoist but do still want to analyze the system as if it was a dual crane lift, for example because one end of the cargo is support on trailers, then select only Hoist 1 and check the “Treat as 2-Hook lift even if only one hoist is present”-box.

Hook elevation difference#

By default DNV prescribes a hook elevation difference of 1.0m or 3 degrees, whichever is governing. The values may be changed by the user.

image-20231229100815904

  • The analysis will start with the hook elevations as they are when starting the analysis. So minimize the tilt between the cranes before running the analysis. The button “auto elevation hoist 1” can be used to bring the system to a minimum tilt.

  • From these starting elevations, a hoist 1 will be lowered by the specified amount (default, 1m).

  • In this new situation the tilt is calculated. If it exceeds the 3 degrees (or any other specified amount) then the elevation difference in meters is governing. If the tilt is less than 3 degrees, then the hoist elevation difference [m] is increased till the specified amount of tilt is reached.

  • (To enforce one of the values to be governing, simply set the other to a very low value).

Entering a non-default value will list the user defined values in the “global factors” section.

Tilt Axis#

Select the local axis about which the tilt changes if the block heights change.

In the example the object will rotate about its green (Y) axis, so this needs to be set to ‘y’.

image-20231219201001504

Once this is selected, you may use the “Auto elevation hoist 1” button to change the elevation of hoist 1 such that the cargo is at zero tilt. If the cargo is not level at the start of the rigging analysis then this will be done automatically.

Crane slew#

If two cranes are used then the slew on one of those may be released to automatically slew. Checking the “AUTO” box effectively releases the slewing brake of that crane.

image-20231219202045659

Attention: If the cranes are on a ship, and the ship is not level, then the weight of the crane-boom will affect the slewing angle if the brake is released.

Analysis settings#

By default the dual crane analysis will be performed up till a hook-height deviation of 1m or a lifted object tilt of 3 degrees (whichever is reached first).

Again, this variation is performed on the hoist defined as Hoist 1 in the rigging analysis. The other hoist is left unchanged.

In this example the right hoist is hoist 1. The load-cases presented below are the loadcases for maximum and minimum tilt about the y axis of the lifted object.

image-20231219203048400

image-20231219203107250

Example:

# This is an example file for dual-crane lifts,
# you may copy-paste this into DAVE to thet this example model

def solved(number):
    return number

this_crane = Crane(s, name = "Bow crane")
this_crane.path = r"res: crane example.crane.csv"
this_crane.position = (50.0,0.0,0.0)
this_crane.rotation = (0.0,0.0,0.0)
this_crane.fixed = (True,True,True,True,True,True)
this_crane.auto_slew = False
this_crane.slew = -90.000
this_crane.jib_angle = 0.000
this_crane.boom_extension = 0.000
this_crane.boom_angle = 30.000

this_crane = Crane(s, name = "Stern crane")
this_crane.path = r"res: crane example.crane.csv"
this_crane.position = (0.0,0.0,0.0)
this_crane.rotation = (0.0,0.0,0.0)
this_crane.fixed = (True,True,True,True,True,True)
this_crane.auto_slew = True
this_crane.slew = -81.925
this_crane.jib_angle = 0.000
this_crane.boom_extension = 0.000
this_crane.boom_angle = 30.000

# code for Lifted Object
s.new_rigidbody(name='Lifted Object',
                mass=1000,
                cog=(0,
                     0,
                     0),
           position=(solved(26.979730211969695),
                     solved(-35.13187227283414),
                     solved(-20.162995460326606)),
           rotation=(solved(0.0105627),
                     solved(-3.57215e-05),
                     solved(-0.387525)),
           fixed =(False, False, False, False, False, False),
                )

liftpoint = LiftPoint(s, 'LP1')
liftpoint.mass=-0.000
liftpoint.cog=(0.000,0.000,0.000)
liftpoint.parent='Lifted Object'
liftpoint.position = (30.000,0.000,6.000)
liftpoint.rotation = (0.000,0.000,0.000)
liftpoint.fixed =(True, True, True, True, True, True)

s['LP1'].footprint = ((0.0, 0.0, 0.0), (0.5, 0.0, 0.0))
liftpoint.offset_h = 0.500
liftpoint.offset_v = 0.300
liftpoint.width = 0.100
liftpoint.diameter = 0.100
liftpoint.liftpoint_type = LiftPointType.PADEYE

liftpoint = LiftPoint(s, 'LP2')
liftpoint.mass=-0.000
liftpoint.cog=(0.000,0.000,0.000)
liftpoint.parent='Lifted Object'
liftpoint.position = (15.000,0.000,6.000)
liftpoint.rotation = (0.000,0.000,0.000)
liftpoint.fixed =(True, True, True, True, True, True)

s['LP2'].footprint = ((0.0, 0.0, 0.0), (0.5, 0.0, 0.0))
liftpoint.offset_h = 0.500
liftpoint.offset_v = 0.300
liftpoint.width = 0.100
liftpoint.diameter = 0.100
liftpoint.liftpoint_type = LiftPointType.PADEYE

liftpoint = LiftPoint(s, 'LP3')
liftpoint.mass=-0.000
liftpoint.cog=(0.000,0.000,0.000)
liftpoint.parent='Lifted Object'
liftpoint.position = (-15.000,0.000,6.000)
liftpoint.rotation = (0.000,0.000,0.000)
liftpoint.fixed =(True, True, True, True, True, True)

s['LP3'].footprint = ((0.0, 0.0, 0.0), (0.5, 0.0, 0.0))
liftpoint.offset_h = 0.500
liftpoint.offset_v = 0.300
liftpoint.width = 0.100
liftpoint.diameter = 0.100
liftpoint.liftpoint_type = LiftPointType.PADEYE

liftpoint = LiftPoint(s, 'LP4')
liftpoint.mass=-0.000
liftpoint.cog=(0.000,0.000,0.000)
liftpoint.parent='Lifted Object'
liftpoint.position = (-30.000,0.000,6.000)
liftpoint.rotation = (0.000,0.000,0.000)
liftpoint.fixed =(True, True, True, True, True, True)

s['LP4'].footprint = ((0.0, 0.0, 0.0), (0.5, 0.0, 0.0))
liftpoint.offset_h = 0.500
liftpoint.offset_v = 0.300
liftpoint.width = 0.100
liftpoint.diameter = 0.100
liftpoint.liftpoint_type = LiftPointType.PADEYE

# code for Visual
s.new_visual(name='Visual',
            parent='Lifted Object',
            path=r'res: plane_curved.stl',
            offset=(0, 0, 0), 
            rotation=(90, 0, 0), 
            scale=(1.5, 0.25, 0.4) )

this_hoist = Hoist(s, 'Bow hoist')
this_hoist.load_hook('res: hoist_example.hoist.dave', target = 'Bow crane/hoist_locations/main')
this_hoist.wire_length = 40.070

this_hoist = Hoist(s, 'Stern hoist')
this_hoist.load_hook('res: hoist_example.hoist.dave', target = 'Stern crane/hoist_locations/main')
this_hoist.wire_length = 40.000

r = RiggingString(s, name = "system",
    upper = ("Stern hoist/Block2p/prong3_sheave"),
    lower = ("LP4/circle"))
model = """
cables:
- EA: -1
  MBL_total: -1
  diameter: 20.0
  eyeA_length: 0.0
  eyeB_length: 0.0
  kgm: -1
  label: '#4 Remarks'
  length: 15.0
  length_definition: Ultimate length
  n_points: 3
  rigging_analysis_data:
    consequence: 1.3
    lifting: 1.2
    material: 1.5
    termination: 1.0
    wear_and_application: 1
  routing:
  - false
  - false
  spliceA_length: 0.0
  spliceB_length: 0.0
  type: Grommet
  wire_type: Steel IWRC
connections:
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 0
    kind: cable
  to:
    i_circle: 0
    kind: circle
- do_reverse_optimum: false
  from:
    i_circle: 1
    kind: circle
  to:
    i_shackle: 0
    kind: shackle
    location: bottom
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 2
    kind: cable
  to:
    i_shackle: 0
    kind: shackle
    location: top
linear_L0: null
linear_info: Not linearized yet
linear_k: null
linear_weight: null
shackles:
- kind: GP800
  label: '#8 '
  orientation: 0

"""
r.load_model(model)
r.full_representation = True

r = RiggingString(s, name = "system2",
    upper = ("Stern hoist/Block2p/prong1_sheave"),
    lower = ("LP3/circle"))
model = """
cables:
- EA: -1
  MBL_total: -1
  diameter: 20.0
  eyeA_length: 0.0
  eyeB_length: 0.0
  kgm: -1
  label: '#1 Remarks'
  length: 15.0
  length_definition: Ultimate length
  n_points: 3
  rigging_analysis_data:
    consequence: 1.3
    lifting: 1.2
    material: 1.5
    termination: 1.0
    wear_and_application: 1
  routing:
  - false
  - false
  spliceA_length: 0.0
  spliceB_length: 0.0
  type: Grommet
  wire_type: Steel IWRC
connections:
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 0
    kind: cable
  to:
    i_circle: 0
    kind: circle
- do_reverse_optimum: false
  from:
    i_circle: 1
    kind: circle
  to:
    i_shackle: 0
    kind: shackle
    location: bottom
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 2
    kind: cable
  to:
    i_shackle: 0
    kind: shackle
    location: top
linear_L0: null
linear_info: Not linearized yet
linear_k: null
linear_weight: null
shackles:
- kind: GP800
  label: '#7 '
  orientation: 0

"""
r.load_model(model)
r.full_representation = True

r = RiggingString(s, name = "system3",
    upper = ("Bow hoist/Block2p/prong3_sheave"),
    lower = ("LP2/circle"))
model = """
cables:
- EA: -1
  MBL_total: -1
  diameter: 20.0
  eyeA_length: 0.0
  eyeB_length: 0.0
  kgm: -1
  label: '#2 Remarks'
  length: 15.0
  length_definition: Ultimate length
  n_points: 3
  rigging_analysis_data:
    consequence: 1.3
    lifting: 1.2
    material: 1.5
    termination: 1.0
    wear_and_application: 1
  routing:
  - false
  - false
  spliceA_length: 0.0
  spliceB_length: 0.0
  type: Grommet
  wire_type: Steel IWRC
connections:
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 0
    kind: cable
  to:
    i_circle: 0
    kind: circle
- do_reverse_optimum: false
  from:
    i_circle: 1
    kind: circle
  to:
    i_shackle: 0
    kind: shackle
    location: bottom
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 2
    kind: cable
  to:
    i_shackle: 0
    kind: shackle
    location: top
linear_L0: null
linear_info: Not linearized yet
linear_k: null
linear_weight: null
shackles:
- kind: GP800
  label: '#6 '
  orientation: 0

"""
r.load_model(model)
r.full_representation = True

r = RiggingString(s, name = "system4",
    upper = ("Bow hoist/Block2p/prong1_sheave"),
    lower = ("LP1/circle"))
model = """
cables:
- EA: -1
  MBL_total: -1
  diameter: 20.0
  eyeA_length: 0.0
  eyeB_length: 0.0
  kgm: -1
  label: '#3 Remarks'
  length: 15.0
  length_definition: Ultimate length
  n_points: 3
  rigging_analysis_data:
    consequence: 1.3
    lifting: 1.2
    material: 1.5
    termination: 1.0
    wear_and_application: 1
  routing:
  - true
  - true
  spliceA_length: 0.0
  spliceB_length: 0.0
  type: Grommet
  wire_type: Steel IWRC
connections:
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 0
    kind: cable
  to:
    i_circle: 0
    kind: circle
- do_reverse_optimum: false
  from:
    i_circle: 1
    kind: circle
  to:
    i_shackle: 0
    kind: shackle
    location: bottom
- do_reverse_optimum: false
  from:
    i_cable: 0
    i_point: 2
    kind: cable
  to:
    i_shackle: 0
    kind: shackle
    location: top
linear_L0: null
linear_info: Not linearized yet
linear_k: null
linear_weight: null
shackles:
- kind: GP800
  label: '#5 '
  orientation: 0

"""
r.load_model(model)
r.full_representation = True

# Rigging Analysis
ra = RiggingAnalysis(s, "Rigging Analysis")
ra.WCF = 1
ra.COGIF = 1
ra.DAF = 1
ra.SKEW = 1
ra.YAW = 1
ra.enforce_dual_crane = False
ra.lifted_object = s["Lifted Object"]
ra.hoist1 = s["Bow hoist"]
ra.hoist2 = s["Stern hoist"]
ra.dual_crane_tilt_axis = "y"


# Reports

# Exporting report report
report_contents = r"""
- author: DAVE Manual
  date: ''
  name: report
  number: DUAL-CRANE-EXAMPLE
  project: Example projects
  store_intermediate_results_folder: null
  title: Report title
  type: General_report_data
  version: '1.0'
- AutoSkew: false
  DefaultDelta: 2.0
  DoFriction: true
  FrictionConfiguration:
    system/Grommet1: -1
    system2/Grommet1: -1
    system3/Grommet1: -1
    system4/Grommet1: -1
  pairs: []
  smart: true
  type: RiggingAnalysisSection
"""
s.reports.append(Report(s,yml=report_contents))