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.