CHEERSafe Loading and Failure Check Workflow¶
This notebook runs LoadingAndFailureCheck for one building, one wind direction, and one wind speed. Wind speed is passed in mph for the bundled wind-pressure equations.
InĀ [1]:
Copied!
from pathlib import Path
import os
repo_root = Path.cwd()
while not (repo_root / "pyproject.toml").exists() and repo_root != repo_root.parent:
repo_root = repo_root.parent
os.chdir(repo_root)
repo_root
from pathlib import Path
import os
repo_root = Path.cwd()
while not (repo_root / "pyproject.toml").exists() and repo_root != repo_root.parent:
repo_root = repo_root.parent
os.chdir(repo_root)
repo_root
Out[1]:
PosixPath('/home/mammad/Documents/EDU/cope/CHEERSafe/LossModel')
InĀ [2]:
Copied!
from cheersafe.config import Config
Config.reset_flags()
Config.NUM_OF_WORKERS = 1
Config.NUM_OF_WORKERS_SAMPLING = 1
Config.RANDOM_SEED = 42
from cheersafe.config import Config
Config.reset_flags()
Config.NUM_OF_WORKERS = 1
Config.NUM_OF_WORKERS_SAMPLING = 1
Config.RANDOM_SEED = 42
InĀ [3]:
Copied!
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from cheersafe.config import Config
from cheersafe.loads import LoadingAndFailureCheck
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from cheersafe.config import Config
from cheersafe.loads import LoadingAndFailureCheck
InĀ [4]:
Copied!
import numpy as np
from cheersafe.inventory import BuildingInventory
def demo_building():
return BuildingInventory(buildings_file_name="BuildingGeometry_Old.json").buildings[0]
def demo_resistances(building):
num_panel = int(np.sum(building.NumPanel))
num_connection = int(np.sum(building.NumConnection))
num_opening = int(
building.DoorFront
+ building.DoorBack
+ building.DoorGarage
+ building.OpeningFront
+ building.OpeningBack
+ 2 * (building.OpeningSideH + building.OpeningSideR)
)
return {
"rRSt": np.full(num_panel, 225.0),
"rRCt": np.full(num_panel, 70.0),
"rRWCt": np.full(num_connection, 2825.0),
"rOt": np.full(num_opening, 150.0),
"rWt": np.full(12, 3000.0),
}
import numpy as np
from cheersafe.inventory import BuildingInventory
def demo_building():
return BuildingInventory(buildings_file_name="BuildingGeometry_Old.json").buildings[0]
def demo_resistances(building):
num_panel = int(np.sum(building.NumPanel))
num_connection = int(np.sum(building.NumConnection))
num_opening = int(
building.DoorFront
+ building.DoorBack
+ building.DoorGarage
+ building.OpeningFront
+ building.OpeningBack
+ 2 * (building.OpeningSideH + building.OpeningSideR)
)
return {
"rRSt": np.full(num_panel, 225.0),
"rRCt": np.full(num_panel, 70.0),
"rRWCt": np.full(num_connection, 2825.0),
"rOt": np.full(num_opening, 150.0),
"rWt": np.full(12, 3000.0),
}
InĀ [5]:
Copied!
building = demo_building()
resistance = demo_resistances(building)
check = LoadingAndFailureCheck(
Building=building,
WindOrientation=0,
WindSpeed=95.0,
**resistance,
)
loads = check.get_final_loads()
resistance_after = check.get_final_resistance()
pd.DataFrame({
"component": list(loads),
"load_count": [np.size(value) for value in loads.values()],
"mean_abs_final_load": [float(np.mean(np.abs(value))) for value in loads.values()],
"remaining_resistance_count": [int(np.count_nonzero(resistance_after[key])) for key in loads],
})
building = demo_building()
resistance = demo_resistances(building)
check = LoadingAndFailureCheck(
Building=building,
WindOrientation=0,
WindSpeed=95.0,
**resistance,
)
loads = check.get_final_loads()
resistance_after = check.get_final_resistance()
pd.DataFrame({
"component": list(loads),
"load_count": [np.size(value) for value in loads.values()],
"mean_abs_final_load": [float(np.mean(np.abs(value))) for value in loads.values()],
"remaining_resistance_count": [int(np.count_nonzero(resistance_after[key])) for key in loads],
})
Out[5]:
| component | load_count | mean_abs_final_load | remaining_resistance_count | |
|---|---|---|---|---|
| 0 | Openings | 18 | 17.578550 | 18 |
| 1 | Walls | 12 | 88.965033 | 12 |
| 2 | Roof Sheathings | 96 | 18.188491 | 96 |
| 3 | Roof Coverings | 96 | 15.360562 | 96 |
| 4 | Roof-Wall Connections | 94 | 178.973660 | 94 |
InĀ [6]:
Copied!
fig, ax = plt.subplots(figsize=(7, 4))
components = list(loads)
means = [float(np.mean(np.abs(loads[name]))) for name in components]
ax.bar(components, means, color="tab:orange")
ax.set_ylabel("Mean absolute final load")
ax.set_title("Final load summary for one wind scenario")
ax.tick_params(axis="x", rotation=25)
plt.tight_layout()
plt.show()
fig, ax = plt.subplots(figsize=(7, 4))
components = list(loads)
means = [float(np.mean(np.abs(loads[name]))) for name in components]
ax.bar(components, means, color="tab:orange")
ax.set_ylabel("Mean absolute final load")
ax.set_title("Final load summary for one wind scenario")
ax.tick_params(axis="x", rotation=25)
plt.tight_layout()
plt.show()
In manual execution mode, call each calculation method and assign its returned outputs in the dependency order.
InĀ [7]:
Copied!
Config.AUTO_EXECUTE_METHODS = False
manual = LoadingAndFailureCheck(Building=building, WindOrientation=0, WindSpeed=95.0, **demo_resistances(building))
manual.PressureZoneCoordinate, manual.NumZone = manual.fn_pressure_zone_coordinate()
manual.PressureZoneArea, manual.PanelArea = manual.fn_preprocess_rs()
manual.qh = 0.00256 * 0.85 * manual.WindSpeed ** 2
manual.pRS = manual.fn_initial_load_rs()
manual.pRC = manual.fn_initial_load_rc()
manual.pRWC = manual.fn_initial_load_rwc()
manual.pO = manual.fn_initial_load_o()
manual.pW = manual.fn_initial_load_w()
initial_resistance = manual.fn_initial_failure_check()
manual.rRSt = initial_resistance["Roof Sheathings"]
manual.rRCt = initial_resistance["Roof Coverings"]
manual.rRWCt = initial_resistance["Roof-Wall Connections"]
manual.rOt = initial_resistance["Openings"]
manual.rWt = initial_resistance["Walls"]
manual.pInternal = manual.fn_pressure_internal()
manual.pfRC = manual.fn_final_load_rc()
manual.pfRS = manual.fn_final_load_rs() if manual.pInternal else manual.pRS
manual.pfRWC = manual.fn_final_load_rwc() if manual.pInternal else manual.pRWC
manual.pfO = manual.fn_final_load_o() if manual.pInternal else manual.pO
manual.pfW = manual.fn_final_load_w() if manual.pInternal else manual.pW
manual.rRWCt, manual.RWCFails = manual.fn_final_failure_check_rwc()
print(f"internal pressure: {manual.pInternal:.3f}")
print(f"RWC failure flags: {manual.RWCFails}")
Config.reset_flags()
Config.AUTO_EXECUTE_METHODS = False
manual = LoadingAndFailureCheck(Building=building, WindOrientation=0, WindSpeed=95.0, **demo_resistances(building))
manual.PressureZoneCoordinate, manual.NumZone = manual.fn_pressure_zone_coordinate()
manual.PressureZoneArea, manual.PanelArea = manual.fn_preprocess_rs()
manual.qh = 0.00256 * 0.85 * manual.WindSpeed ** 2
manual.pRS = manual.fn_initial_load_rs()
manual.pRC = manual.fn_initial_load_rc()
manual.pRWC = manual.fn_initial_load_rwc()
manual.pO = manual.fn_initial_load_o()
manual.pW = manual.fn_initial_load_w()
initial_resistance = manual.fn_initial_failure_check()
manual.rRSt = initial_resistance["Roof Sheathings"]
manual.rRCt = initial_resistance["Roof Coverings"]
manual.rRWCt = initial_resistance["Roof-Wall Connections"]
manual.rOt = initial_resistance["Openings"]
manual.rWt = initial_resistance["Walls"]
manual.pInternal = manual.fn_pressure_internal()
manual.pfRC = manual.fn_final_load_rc()
manual.pfRS = manual.fn_final_load_rs() if manual.pInternal else manual.pRS
manual.pfRWC = manual.fn_final_load_rwc() if manual.pInternal else manual.pRWC
manual.pfO = manual.fn_final_load_o() if manual.pInternal else manual.pO
manual.pfW = manual.fn_final_load_w() if manual.pInternal else manual.pW
manual.rRWCt, manual.RWCFails = manual.fn_final_failure_check_rwc()
print(f"internal pressure: {manual.pInternal:.3f}")
print(f"RWC failure flags: {manual.RWCFails}")
Config.reset_flags()
internal pressure: 2.828 RWC failure flags: [0 0 0 0]