The latest version of the 3DFrame spreadsheet (previously presented here) includes provision for spring end releases, allowing for either rotational or translational springs in any direction. These springs are now incorporated in the model by adjustment of the beam properties, rather than by addition of new dummy spring members, as used in previous versions. This avoids the creation of new nodes (which potentially made the stiffness matrix solution much less efficient for large models), but does require more work in setting up the model:

- The structure stiffness matrix must be modified to allow for the increased flexibility of each member with any spring end releases.
- The nodal loads must also be adjusted, with the loads being those that would be generated by the applied loads on a member with the specified spring restraints, rather than fully fixed end conditions.
- The frame analysis returns the deflections and rotations of each node, so the additional deflections of beam ends with spring releases must be added after the global analysis, if deflections along the length of the beam are required.

The adjusted stiffness matrix for a 2D beam with a rotational spring release at end 1 is:

Ks is the spring stiffness in Moment/radian or Force/Length units.

For a 3D beam similar adjustments must be made for rotational and translation springs at both ends, for all three principal axes. The VBA code is:

Function AddSprings3(km, SpringA, NDim)
Dim Beta As Double, OneOBeta As Double, Kt As Double, Ks As Double, i As Long, j As Long, BmEnd As Long, k As Long, i_s As Long
Dim km2 As Variant, kms(1 To 4, 1 To 4) As Double, ii As Long, jj As Long, io As Long, jo As Long, kk As Long, ia As Variant
Dim kmw As Variant
If TypeName(km) = "Range" Then
kmw = km.Value2
Else
ReDim kmw(1 To 12, 1 To 12)
For i = 1 To 12
For j = 1 To 12
kmw(i, j) = km(i, j)
Next j
Next i
End If
If TypeName(SpringA) = "Range" Then SpringA = SpringA.Value2
Select Case NDim
Case 3
For i = 1 To 3
' Check if any spring releases exist
Select Case i
Case 1
ia = Array(2, 4, 8, 10)
Case 2
ia = Array(1, 5, 7, 11)
Case 3
ia = Array(3, 6, 9, 12)
End Select
Ks = SpringA(1, ia(1)) + SpringA(1, ia(2)) + SpringA(1, ia(3)) + SpringA(1, ia(4))
If Ks > 0 Then
' Copy the stiffnes values for Axis i to a 4x4 array
ReDim km2(1 To 4, 1 To 4)
For ii = 1 To 4
For jj = 1 To 4
km2(ii, jj) = km(ia(ii), ia(jj))
Next jj
Next ii
For BmEnd = 1 To 2
kk = i
If i < 3 Then kk = 3 - i Kt = SpringA(1, (BmEnd - 1) * 6 + kk) If Kt > 0 Then ' Adjust matrix for translational springs
kk = (BmEnd * 2) - 1
Beta = Kt + km2(kk, kk)
OneOBeta = 1 / Beta
For ii = 1 To 4
kms(kk, ii) = OneOBeta * Kt * km2(kk, ii)
If ii <> kk Then kms(ii, kk) = kms(kk, ii)
Next ii
For ii = 1 To 4
If ii <> kk Then
For jj = 1 To 4
If jj <> kk Then kms(ii, jj) = OneOBeta * (Beta * km2(ii, jj) - km2(ii, kk) * km2(kk, jj))
Next jj
End If
Next ii
For ii = 1 To 4
For jj = 1 To 4
km2(ii, jj) = kms(ii, jj)
Next jj
Next ii
End If
Ks = SpringA(1, (BmEnd - 1) * 6 + 3 + i)
If Ks > 0 Then ' Adjust matrix for rotational springs
kk = (BmEnd * 2)
Beta = Ks + km2(kk, kk)
OneOBeta = 1 / Beta
For ii = 1 To 4
kms(kk, ii) = OneOBeta * Ks * km2(kk, ii)
If ii <> kk Then kms(ii, kk) = kms(kk, ii)
Next ii
For ii = 1 To 4
If ii <> kk Then
For jj = 1 To 4
If jj <> kk Then kms(ii, jj) = OneOBeta * (Beta * km2(ii, jj) - km2(ii, kk) * km2(kk, jj))
Next jj
End If
Next ii
If BmEnd = 1 Then
For ii = 1 To 4
For jj = 1 To 4
km2(ii, jj) = kms(ii, jj)
Next jj
Next ii
End If
End If
Next BmEnd
For ii = 1 To 4
For jj = 1 To 4
kmw(ia(ii), ia(jj)) = kms(ii, jj)
Next jj
Next ii
End If
Next i
Case Else
AddSprings3 = "Invalid NDim"
End Select
AddSprings3 = kmw
End Function

Adjustments to the end forces are found using the REAct3D function, previously described here. The procedure is:

- For each principal axis, find the reaction force and moment at End 1, and the deflection and slope at End2 of the beam, due to the applied loading, treating the beam as a cantilever fixed at End1, with any specified spring releases.
- Find the deflection and rotation at End2 due to unit applied force and moment, including the effect of spring releases.
- Calculate the end loads at End 2 required to return the beam to zero deflection and rotation.
- Combine the loads from Steps 1 and 3.

Note that in the current version the spring stiffness is required to be greater than zero. Any end release with zero or negative stiffness, or left blank, is taken as a rigid connection.

The latest version of the spreadsheet, including full open-source code, can be downloaded from: 3DFrame.zip.

See 3DFrame with spring releases for more information, including links to installation instructions for the compiled solvers.