C0.2 Force Densities

Objectives

We introduce the important notion of force density. For a mathematical background, you can find below the seminal paper by Shek. He introduced the force density method in the context of the design of the Munich Olympic Roofs, as the precise construction of these ambitious cable-net geometries required numerical form finding methods - instead of using only physical models and photogrammetry: Schek, H.J., 1974. The force density method for form finding and computation of general networks. Computer methods in applied mechanics and engineering, 3(1), pp.115-134.

h. Force per length

Instead of defining forces for each of the edges, we will now use force densities. These are the ratios between the forces and lengths per edge. So the same force gives a higher force density in a short edge than in a long edge.

q:=FLq := \frac{F}{L}

Why would we use force densities? The concept was originally introduced as a mathematical trick to allow solving the equilibrium equations without the need for iteration. To explain more in detail: the edge lengths in the equations are dependent on the coordinates of the edge start and end nodes:

L0j=(xjx0)2+(yjy0)2+(zjz0)2L_{0j} = \sqrt{(x_j−x_0)^2 + (y_j−y_0)^2 + (z_j−z_0)^2}

By predefining the force densities for each of the edges, the lengths are taken out of the equations. Hence, the length in the denominator does no longer need to be updated for the new geometry at each step, and the equilibrium can be described as a linear system of equations:

j=14Fjxjx0Lj=j=14qj.(xjx0)=0j=14Fjyjy0Lj=j=14qj.(yjy0)=0j=14Fjzjz0Lj=j=14qj.(zjz0)=0\sum_{j=1}^4 F_{j}\frac{x_j - x_0}{L_j} = \sum_{j=1}^4 q_{j} . (x_j - x_0) = 0 \\\sum_{j=1}^4 F_{j}\frac{y_j - y_0}{L_j} = \sum_{j=1}^4 q_{j} . (y_j - y_0) = 0 \\\sum_{j=1}^4 F_{j}\frac{z_j - z_0}{L_j} = \sum_{j=1}^4 q_{j} . (z_j - z_0) = 0

Physically, a force density might not be as intuitive to grasp as a force. However, the force density could be interpreted as the density of woman/man-power pulling on a rope: a constant spacing of persons pulling gives the same force density, regardless of the length of rope.

# replace:
# network.update_dea(f=1)
# with:
network.update_dea(q=0.1)
def update_residuals(network):
# replace:
# F = network.edge_attribute(edge, 'f')
# L = network.edge_length(*edge)
# R[0] += F * (B[0] - A[0]) / L
            
# with:
Q = network.edge_attribute(edge, 'q')
R[0] += Q * (B[0] - A[0])

Last updated