The Macaulay spreadsheet now includes a ConBeam() function, analysing continuous beams with any number of segments of different stiffness, subject to any combination of distributed or point loads and moments. The spreadsheet also includes an example, together with output of the same beam from Strand7, which is in exact agreement. The revised spreadsheet (including open source code) may be downloaded from Macaulay.zip.
The algorithm used by the ConBeam function is:
- Find the deflections at the internal supports under the specified loading, treating the beam as simply supported at the end supports only.
- Find the deflection at the support positions due to a unit upward load applied at each support.
- Use this data to find the reaction force at each internal support.
- Find the shear forces, moments, curvatures, slopes and deflections at each output point under the specified applied load plus the reaction forces at the internal supports
The code for generation of the reaction loads is shown below:
If NumSupports > 2 Then ' Find deflections at support positions for unit load at each internal support W = 1 SSSupports(1, 1) = SupportA(1) SSSupports(2, 1) = SupportA(NumSupports) SupportLoadA(1, 2) = W For i = 2 To NumSupports - 1 SupportLoadA(1, 1) = SupportA(i) SuppRes = SSSpan(Segments, DLoads, SupportLoadA, ISupportA, 0, 1) For j = 1 To NumSupports - 2 SupportF(i - 1, j) = SuppRes(j, 4) Next j Next i If NumSupports > 3 Then InvSupportF = WorksheetFunction.MInverse(SupportF) Else InvSupportF = 1 / SupportF(1, 1) End If ' Find deflection at internal supports for simply supported span between end supports SuppRes = SSSpan(Segments, DLoads, PLoads, ISupportA, NumDloads, NumPloads) For i = 1 To NumSupports - 2 SuppDef(i, 1) = -SuppRes(i, 4) Next i ' Find reactions at internal supports and add to PLoads2 array If NumSupports > 3 Then IntReact = WorksheetFunction.MMult(InvSupportF, SuppDef) Else IntReact = InvSupportF * SuppDef(1, 1) End If ReDim PLoads2(1 To NumPloads + NumSupports - 2, 1 To 3) For i = 1 To NumPloads PLoads2(i, 1) = PLoads(i, 1) PLoads2(i, 2) = PLoads(i, 2) PLoads2(i, 3) = PLoads(i, 3) Next i k = 0 If NumSupports > 3 Then For j = i To i + NumSupports - 3 k = k + 1 PLoads2(j, 2) = IntReact(k, 1) PLoads2(j, 1) = SupportA(k + 1) Next j Else PLoads2(i, 2) = IntReact PLoads2(i, 1) = SupportA(2) End If NumPloads = NumPloads + NumSupports - 2 Else ' single span SSSupports(1, 1) = 0 'Segments(1, 2) SSSupports(2, 1) = Spans(1, 2) PLoads2 = PLoads End If
The input and output from the example in the spreadsheet are shown below: