-
Notifications
You must be signed in to change notification settings - Fork 0
Evaluation
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")
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"
)
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.
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
If you find our work helpful, please cite our design report.
@techreport{team602civ102,
title = {CIV102 Bridge Project Design Report},
author = {Chan, D. and Zhou, J. and Saxena, N. and Fu, T.},
institution = {Faculty of Applied Science and Engineering, University of Toronto},
year = {2025},
month = {November},
type = {Course Project Report},
course = {CIV102: Structures and Materials},
note = {Team 602}
}