Skip to content

Evaluation

Tianhao Fu edited this page Nov 24, 2025 · 3 revisions

Safety Factors

Once we have the bridge, we can now evaluate its performance. To do this, we need to use the Evaluator class. Currently, it only supports evaluating with a uniform material. In the example below, we use the default material, which is the matboard.

The coordinate system we use is coherent with the sign convention above, where the position of the train is the position of the first wheel.

We can plot the safety factors against train positions.

from bridger import *

cross_section = CIV102Beam()
bridge = BeamBridge(452, cross_section)
evaluator = Evaluator(bridge, Material())
evaluator.plot_safety_factors(save_as="assets/images/safety_factors.png")

safety factors

Notice that the factor of safety of glue is way too high, so all other curves are squeezed together. We can set the color of glue to None to remove it from the plot.

from bridger import *

cross_section = CIV102Beam()
bridge = BeamBridge(452, cross_section)
evaluator = Evaluator(bridge, Material())
evaluator.plot_safety_factors(
    colors=("blue", "purple", "cyan", None, "yellow", "green"), 
    save_as="assets/images/safety_factors_no_glue.png"
)

safety factors no glue

Dead Zones

from bridger import *

cross_section = CIV102Beam()
bridge = BeamBridge(452, cross_section)
evaluator = Evaluator(bridge, Material())
safety_factors = evaluator.pass_the_train()

Evaluator.pass_the_train() returns six lists of safety factors. Each list corresponds to the safety factors when the train is at different positions. We can then calculate the dead zones, also known as the intervals where any type of safety factor is less than the threshold (1 by default, 0.6 in this case).

from bridger import *

cross_section = CIV102Beam()
bridge = BeamBridge(452, cross_section)
evaluator = Evaluator(bridge, Material(), safety_factor_threshold=.6)
safety_factors = evaluator.pass_the_train()
dead_zones = evaluator.dead_zones(*safety_factors)
print(dead_zones)  # [(20, 343)]

The dead zones are tuples of two integers representing the start and end positions of each interval. [(20, 343)] means that when the first wheel of the train is at any position between 20 and 343 millimeters from the start, the bridge will fail.

Maximum Load

To determine the maximum load under given conditions, we can use the Evaluator.maximum_load() method.

from bridger import *

cross_section = CIV102Beam()
bridge = BeamBridge(452, cross_section)
evaluator = Evaluator(bridge, Material())
max_load, cause = evaluator.maximum_load()
print(f"The maximum load is {max_load} N, limited by {cause}")

It returns a float number representing the maximum load and a string representing the reason.

The maximum load is 240.0889550207032 N, limited by flexural buckling

Please let us know your questions through Issues.

Clone this wiki locally