Refine beam section figure and derive As from bars
- Derive As from the provided longitudinal bars instead of taking it as input; drop the redundant As_bars output and update tests. - Draw a fixed schematic 1 in cover and pin the bottom bars to the stirrup's bottom leg so the figure no longer depends on cover or d. - Fixed stirrup stroke with a rounded 3 pt corner radius. - Right-align the figure, constrain its caption to the image width, and shorten the caption to "Beam cross-section". - Document input.yaml fields.
This commit is contained in:
parent
25f66bb4da
commit
759d5e3bae
8 changed files with 638 additions and 680 deletions
|
|
@ -1,35 +1,28 @@
|
|||
// Generated by beam_section.py from input.yaml - do not edit by hand.
|
||||
#let beam-section() = {
|
||||
box(width: 302pt, height: 246pt)[
|
||||
#place(dx: 80pt, dy: 34pt, rect(width: 112pt, height: 168pt, fill: rgb("#f2f2f2"), stroke: 1pt + black))
|
||||
#place(dx: 103.6pt, dy: 57.62pt, rect(width: 64.75pt, height: 120.8pt, radius: 1.5pt, stroke: 5.25pt + black))
|
||||
#place(dx: 106.2pt, dy: 162.6pt, circle(radius: 4.375pt, fill: black))
|
||||
#place(dx: 157pt, dy: 162.6pt, circle(radius: 4.375pt, fill: black))
|
||||
#place(dx: 106.2pt, dy: 60.25pt, circle(radius: 3.5pt, fill: black))
|
||||
#place(dx: 158.8pt, dy: 60.25pt, circle(radius: 3.5pt, fill: black))
|
||||
#place(line(start: (80pt, 218pt), end: (192pt, 218pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (80pt, 214pt), end: (80pt, 222pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (192pt, 214pt), end: (192pt, 222pt), stroke: 0.6pt + black))
|
||||
#place(dx: 80pt, dy: 221pt, box(width: 112pt, align(center)[$b_w = 8 " in"$]))
|
||||
#place(line(start: (68pt, 34pt), end: (68pt, 202pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (64pt, 34pt), end: (72pt, 34pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (64pt, 202pt), end: (72pt, 202pt), stroke: 0.6pt + black))
|
||||
#place(dx: 2pt, dy: 113pt, text(size: 8pt)[$h = 12 " in"$])
|
||||
#place(line(start: (50pt, 34pt), end: (50pt, 167pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (46pt, 34pt), end: (54pt, 34pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (46pt, 167pt), end: (54pt, 167pt), stroke: 0.6pt + black))
|
||||
#place(dx: 2pt, dy: 95.5pt, text(size: 8pt)[$d = 9.5 " in"$])
|
||||
#place(line(start: (162.2pt, 63.75pt), end: (204pt, 52pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 160.8pt, dy: 62.25pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 208pt, dy: 46pt, text(size: 7.5pt)[2 No. 4 hanger \ bars])
|
||||
#place(line(start: (168.4pt, 118pt), end: (204pt, 114pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 166.9pt, dy: 116.5pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 208pt, dy: 108pt, text(size: 7.5pt)[No. 3 stirrup \ at 6 in o.c.])
|
||||
#place(line(start: (161.4pt, 167pt), end: (204pt, 184pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 159.9pt, dy: 165.5pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 208pt, dy: 178pt, text(size: 7.5pt)[2 No. 5 bottom \ $A_s = 0.62 " in"^2$])
|
||||
#place(line(start: (103.6pt, 178.4pt), end: (40pt, 228pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 102.1pt, dy: 176.9pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 2pt, dy: 232pt, text(size: 7.5pt)[cover = 1.5 in])
|
||||
box(width: 180pt, height: 180pt)[
|
||||
#place(dx: 48pt, dy: 28pt, rect(width: 76pt, height: 114pt, fill: rgb("#f2f2f2"), stroke: 1pt + black))
|
||||
#place(dx: 58.5pt, dy: 38.5pt, rect(width: 55pt, height: 93pt, radius: 3pt, stroke: 2pt + black))
|
||||
#place(dx: 59.5pt, dy: 124.6pt, circle(radius: 2.969pt, fill: black))
|
||||
#place(dx: 106.6pt, dy: 124.6pt, circle(radius: 2.969pt, fill: black))
|
||||
#place(dx: 59.5pt, dy: 39.5pt, circle(radius: 2.375pt, fill: black))
|
||||
#place(dx: 107.8pt, dy: 39.5pt, circle(radius: 2.375pt, fill: black))
|
||||
#place(line(start: (48pt, 158pt), end: (124pt, 158pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (48pt, 155pt), end: (48pt, 161pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (124pt, 155pt), end: (124pt, 161pt), stroke: 0.6pt + black))
|
||||
#place(dx: 48pt, dy: 161pt, box(width: 76pt, align(center, text(size: 7pt)[$b_w = 8 " in"$])))
|
||||
#place(line(start: (42pt, 28pt), end: (42pt, 142pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (39pt, 28pt), end: (45pt, 28pt), stroke: 0.6pt + black))
|
||||
#place(line(start: (39pt, 142pt), end: (45pt, 142pt), stroke: 0.6pt + black))
|
||||
#place(dx: 0.5pt, dy: 82pt, text(size: 7pt)[$h = 12 " in"$])
|
||||
#place(line(start: (110.1pt, 41.88pt), end: (129pt, 42pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 108.6pt, dy: 40.38pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 132pt, dy: 37pt, text(size: 7pt)[2 No. 4 hanger \ bars])
|
||||
#place(line(start: (113.5pt, 85pt), end: (129pt, 82pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 112pt, dy: 83.5pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 132pt, dy: 77pt, text(size: 7pt)[No. 3 stirrup \ at 6 in o.c.])
|
||||
#place(line(start: (109.5pt, 127.5pt), end: (129pt, 128pt), stroke: 0.5pt + rgb("#626b73")))
|
||||
#place(dx: 108pt, dy: 126pt, circle(radius: 1.5pt, fill: black))
|
||||
#place(dx: 132pt, dy: 123pt, text(size: 7pt)[2 No. 5 bottom \ $A_s = 0.6136 " in"^2$])
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,11 +6,15 @@ from pathlib import Path
|
|||
|
||||
HERE = Path(__file__).resolve().parent
|
||||
|
||||
SCALE = 14.0 # points per inch
|
||||
LEFT = 80.0
|
||||
RIGHT = 110.0
|
||||
TOP = 34.0
|
||||
BOTTOM = 44.0
|
||||
SCALE = 9.5 # points per inch
|
||||
LEFT = 48.0
|
||||
RIGHT = 56.0
|
||||
TOP = 28.0
|
||||
BOTTOM = 38.0
|
||||
|
||||
STIRRUP_STROKE = 2.0 # drawn stirrup line width, points
|
||||
STIRRUP_RADIUS = 3.0 # drawn stirrup corner radius, points
|
||||
DRAW_COVER = 1.0 # schematic cover shown in the drawing, inches
|
||||
|
||||
MUTED = 'rgb("#626b73")'
|
||||
|
||||
|
|
@ -19,9 +23,9 @@ def _f(value: float) -> str:
|
|||
return f"{value:.4g}"
|
||||
|
||||
|
||||
def _centers(size: float, number: int, bw: float, cover: float, stirrup_db: float) -> list[float]:
|
||||
def _centers(size: float, number: int, bw: float, edge: float) -> list[float]:
|
||||
half = size / 2.0
|
||||
left = cover + stirrup_db + half
|
||||
left = edge + half
|
||||
right = bw - left
|
||||
if number == 1:
|
||||
return [bw / 2.0]
|
||||
|
|
@ -32,10 +36,7 @@ def render(values: dict) -> str:
|
|||
s = SCALE
|
||||
bw = float(values["bw"])
|
||||
h = float(values["h"])
|
||||
d = float(values["d"])
|
||||
cover = float(values["cover"])
|
||||
stirrup_size = int(values["stirrup_size"])
|
||||
stirrup_db = float(values["stirrup_db"])
|
||||
stirrup_spacing = float(values["stirrup_spacing"])
|
||||
bar_size = int(values["bar_size"])
|
||||
bar_db = float(values["bar_db"])
|
||||
|
|
@ -58,11 +59,12 @@ def render(values: dict) -> str:
|
|||
def sy(y_in: float) -> float:
|
||||
return oy + (h - y_in) * s
|
||||
|
||||
inset = cover + stirrup_db / 2.0
|
||||
y_bottom = h - d
|
||||
bottom = _centers(bar_db, n_bars, bw, cover, stirrup_db)
|
||||
top_y = h - (cover + stirrup_db + top_bar_db / 2.0)
|
||||
top = _centers(top_bar_db, n_top_bars, bw, cover, stirrup_db)
|
||||
edge = DRAW_COVER + STIRRUP_STROKE / s
|
||||
inset = DRAW_COVER + STIRRUP_STROKE / s / 2.0
|
||||
y_bottom = edge + bar_db / 2.0
|
||||
bottom = _centers(bar_db, n_bars, bw, edge)
|
||||
top_y = h - (edge + top_bar_db / 2.0)
|
||||
top = _centers(top_bar_db, n_top_bars, bw, edge)
|
||||
|
||||
lines: list[str] = []
|
||||
add = lines.append
|
||||
|
|
@ -77,7 +79,7 @@ def render(values: dict) -> str:
|
|||
add(
|
||||
f" #place(dx: {_f(sx(inset))}pt, dy: {_f(sy(h - inset))}pt, "
|
||||
f"rect(width: {_f((bw - 2.0 * inset) * s)}pt, height: {_f((h - 2.0 * inset) * s)}pt, "
|
||||
f"radius: 1.5pt, stroke: {_f(stirrup_db * s)}pt + black))"
|
||||
f"radius: {_f(STIRRUP_RADIUS)}pt, stroke: {_f(STIRRUP_STROKE)}pt + black))"
|
||||
)
|
||||
|
||||
for x_in in bottom:
|
||||
|
|
@ -100,47 +102,31 @@ def render(values: dict) -> str:
|
|||
)
|
||||
for tick in (ox, ox + w_sec):
|
||||
add(
|
||||
f" #place(line(start: ({_f(tick)}pt, {_f(dim_y - 4)}pt), end: ({_f(tick)}pt, {_f(dim_y + 4)}pt), "
|
||||
f" #place(line(start: ({_f(tick)}pt, {_f(dim_y - 3)}pt), end: ({_f(tick)}pt, {_f(dim_y + 3)}pt), "
|
||||
f"stroke: 0.6pt + black))"
|
||||
)
|
||||
add(
|
||||
f" #place(dx: {_f(ox)}pt, dy: {_f(dim_y + 3)}pt, "
|
||||
f'box(width: {_f(w_sec)}pt, align(center)[$b_w = {_f(bw)} " in"$]))'
|
||||
f'box(width: {_f(w_sec)}pt, align(center, text(size: 7pt)[$b_w = {_f(bw)} " in"$])))'
|
||||
)
|
||||
|
||||
x_h = ox - 12.0
|
||||
x_h = ox - 6.0
|
||||
add(
|
||||
f" #place(line(start: ({_f(x_h)}pt, {_f(oy)}pt), end: ({_f(x_h)}pt, {_f(oy + h_sec)}pt), "
|
||||
f"stroke: 0.6pt + black))"
|
||||
)
|
||||
for tick in (oy, oy + h_sec):
|
||||
add(
|
||||
f" #place(line(start: ({_f(x_h - 4)}pt, {_f(tick)}pt), end: ({_f(x_h + 4)}pt, {_f(tick)}pt), "
|
||||
f" #place(line(start: ({_f(x_h - 3)}pt, {_f(tick)}pt), end: ({_f(x_h + 3)}pt, {_f(tick)}pt), "
|
||||
f"stroke: 0.6pt + black))"
|
||||
)
|
||||
add(
|
||||
f" #place(dx: 2pt, dy: {_f(oy + h_sec / 2.0 - 5)}pt, "
|
||||
f'text(size: 8pt)[$h = {_f(h)} " in"$])'
|
||||
f" #place(dx: 0.5pt, dy: {_f(oy + h_sec / 2.0 - 3)}pt, "
|
||||
f'text(size: 7pt)[$h = {_f(h)} " in"$])'
|
||||
)
|
||||
|
||||
x_d = ox - 30.0
|
||||
d_end = oy + d * s
|
||||
add(
|
||||
f" #place(line(start: ({_f(x_d)}pt, {_f(oy)}pt), end: ({_f(x_d)}pt, {_f(d_end)}pt), "
|
||||
f"stroke: 0.6pt + black))"
|
||||
)
|
||||
for tick in (oy, d_end):
|
||||
add(
|
||||
f" #place(line(start: ({_f(x_d - 4)}pt, {_f(tick)}pt), end: ({_f(x_d + 4)}pt, {_f(tick)}pt), "
|
||||
f"stroke: 0.6pt + black))"
|
||||
)
|
||||
add(
|
||||
f" #place(dx: 2pt, dy: {_f((oy + d_end) / 2.0 - 5)}pt, "
|
||||
f'text(size: 8pt)[$d = {_f(d)} " in"$])'
|
||||
)
|
||||
|
||||
label_x = ox + w_sec + 16.0
|
||||
lead_x = ox + w_sec + 12.0
|
||||
label_x = ox + w_sec + 8.0
|
||||
lead_x = ox + w_sec + 5.0
|
||||
|
||||
def leader(fx: float, fy: float, lx: float, ly: float) -> None:
|
||||
add(
|
||||
|
|
@ -149,28 +135,22 @@ def render(values: dict) -> str:
|
|||
)
|
||||
add(f" #place(dx: {_f(fx - 1.5)}pt, dy: {_f(fy - 1.5)}pt, circle(radius: 1.5pt, fill: black))")
|
||||
|
||||
leader(sx(top[-1]), sy(top_y), lead_x, oy + 18.0)
|
||||
leader(sx(top[-1]), sy(top_y), lead_x, oy + 14.0)
|
||||
add(
|
||||
f" #place(dx: {_f(label_x)}pt, dy: {_f(oy + 12)}pt, "
|
||||
f"text(size: 7.5pt)[{n_top_bars} No. {top_bar_size} hanger \\ bars])"
|
||||
f" #place(dx: {_f(label_x)}pt, dy: {_f(oy + 9)}pt, "
|
||||
f"text(size: 7pt)[{n_top_bars} No. {top_bar_size} hanger \\ bars])"
|
||||
)
|
||||
|
||||
leader(sx(bw - inset), sy(h / 2.0), lead_x, oy + h_sec / 2.0 - 4.0)
|
||||
leader(sx(bw - inset), sy(h / 2.0), lead_x, oy + h_sec / 2.0 - 3.0)
|
||||
add(
|
||||
f" #place(dx: {_f(label_x)}pt, dy: {_f(oy + h_sec / 2.0 - 10)}pt, "
|
||||
f"text(size: 7.5pt)[No. {stirrup_size} stirrup \\ at {_f(stirrup_spacing)} in o.c.])"
|
||||
f" #place(dx: {_f(label_x)}pt, dy: {_f(oy + h_sec / 2.0 - 8)}pt, "
|
||||
f"text(size: 7pt)[No. {stirrup_size} stirrup \\ at {_f(stirrup_spacing)} in o.c.])"
|
||||
)
|
||||
|
||||
leader(sx(bottom[-1]), sy(y_bottom), lead_x, oy + h_sec - 18.0)
|
||||
leader(sx(bottom[-1]), sy(y_bottom), lead_x, oy + h_sec - 14.0)
|
||||
add(
|
||||
f" #place(dx: {_f(label_x)}pt, dy: {_f(oy + h_sec - 24)}pt, "
|
||||
f'text(size: 7.5pt)[{n_bars} No. {bar_size} bottom \\ $A_s = {_f(As)} " in"^2$])'
|
||||
)
|
||||
|
||||
leader(sx(inset), sy(inset), 40.0, oy + h_sec + 26.0)
|
||||
add(
|
||||
f" #place(dx: 2pt, dy: {_f(oy + h_sec + 30)}pt, "
|
||||
f'text(size: 7.5pt)[cover = {_f(cover)} in])'
|
||||
f" #place(dx: {_f(label_x)}pt, dy: {_f(oy + h_sec - 19)}pt, "
|
||||
f'text(size: 7pt)[{n_bars} No. {bar_size} bottom \\ $A_s = {_f(As)} " in"^2$])'
|
||||
)
|
||||
|
||||
add(" ]")
|
||||
|
|
|
|||
|
|
@ -63,7 +63,6 @@ def compute(inp: dict) -> dict:
|
|||
d = quantity(inp["d"], "in", "d")
|
||||
fc = quantity(inp["fc"], "ksi", "fc")
|
||||
fy = quantity(inp["fy"], "ksi", "fy")
|
||||
As = quantity(inp["As"], "in**2", "As")
|
||||
concrete_density = quantity(inp["concrete_density"], "pcf", "concrete_density")
|
||||
cover = quantity(inp["cover"], "in", "cover")
|
||||
stirrup_size = bar_number(inp["stirrup_size"], "stirrup_size")
|
||||
|
|
@ -73,6 +72,11 @@ def compute(inp: dict) -> dict:
|
|||
top_bar_size = bar_number(inp["top_bar_size"], "top_bar_size")
|
||||
n_top_bars = count(inp["n_top_bars"], "n_top_bars")
|
||||
|
||||
stirrup_db = stirrup_size / 8.0
|
||||
bar_db = bar_size / 8.0
|
||||
top_bar_db = top_bar_size / 8.0
|
||||
As = n_bars * math.pi * bar_db**2 / 4.0
|
||||
|
||||
self_weight = (bw * h / 144.0) * concrete_density / 1000.0
|
||||
wD = D * tributary / 1000.0 + self_weight
|
||||
wL = L * tributary / 1000.0
|
||||
|
|
@ -97,11 +101,6 @@ def compute(inp: dict) -> dict:
|
|||
Vc = 2.0 * math.sqrt(fc * 1000.0) * bw * d / 1000.0
|
||||
phiVc = 0.75 * Vc
|
||||
|
||||
stirrup_db = stirrup_size / 8.0
|
||||
bar_db = bar_size / 8.0
|
||||
top_bar_db = top_bar_size / 8.0
|
||||
As_bars = n_bars * math.pi * bar_db**2 / 4.0
|
||||
|
||||
bottom_centroid = h - d
|
||||
min_bottom_centroid = cover + stirrup_db + bar_db / 2.0
|
||||
if bottom_centroid < min_bottom_centroid:
|
||||
|
|
@ -153,7 +152,6 @@ def compute(inp: dict) -> dict:
|
|||
"top_bar_size": top_bar_size,
|
||||
"n_top_bars": n_top_bars,
|
||||
"top_bar_db": q(top_bar_db),
|
||||
"As_bars": q(As_bars),
|
||||
},
|
||||
"checks": {
|
||||
"flexure": {
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -40,13 +40,10 @@ Simple-span rectangular beam under uniform gravity load. Numbers come from `calc
|
|||
|
||||
== Section and Reinforcement
|
||||
|
||||
#figure(
|
||||
#align(right, block(width: 2.5in, figure(
|
||||
beam-section(),
|
||||
caption: [
|
||||
Beam cross-section: #n.bw in × #n.h in, No. #n.stirrup_size stirrups at #n.stirrup_spacing in
|
||||
on center, and #n.n_bars No. #n.bar_size longitudinal bars (A_s = #n.As in²).
|
||||
],
|
||||
)
|
||||
caption: [Beam cross-section],
|
||||
)))
|
||||
|
||||
== Loads and Beam Demand
|
||||
|
||||
|
|
@ -75,7 +72,7 @@ Simple-span rectangular beam under uniform gravity load. Numbers come from `calc
|
|||
#calcline([$d = #n.d " in"$], [Effective depth])
|
||||
#calcline([$f'_c = #n.fc " ksi"$], [Concrete compressive strength])
|
||||
#calcline([$f_y = #n.fy " ksi"$], [Steel yield strength])
|
||||
#calcline([$A_s = #n.As " in"^2$], [Provided tension steel (2 No. 5)])
|
||||
#calcline([$A_s = #n.As " in"^2$], [Provided tension steel (#n.n_bars No. #n.bar_size)])
|
||||
#calcline(
|
||||
[$a = A_s f_y / (0.85 f'_c b_w) = #round(n.a, digits: 3) " in"$],
|
||||
[Equivalent compression-block depth],
|
||||
|
|
|
|||
|
|
@ -1,23 +1,42 @@
|
|||
# Project name shown in the Typst report header.
|
||||
project: "Deer Creek Shoring"
|
||||
# Person or organization shown in the Typst report footer.
|
||||
prepared_by: "Conemco Engineering"
|
||||
|
||||
# Simple span used for the moment and shear demands.
|
||||
span: "16 ft"
|
||||
# Tributary width carried by the beam.
|
||||
tributary: "6.25 ft"
|
||||
# Dead load including superimposed dead (psf).
|
||||
D: "55 psf"
|
||||
# Live load (psf).
|
||||
L: "20 psf"
|
||||
# Beam web width b_w.
|
||||
bw: "8 in"
|
||||
# Overall beam depth h.
|
||||
h: "12 in"
|
||||
# Effective depth to the tension-steel centroid, used for flexure.
|
||||
d: "9.5 in"
|
||||
# Concrete compressive strength f'_c.
|
||||
fc: "3.0 ksi"
|
||||
# Steel yield strength f_y.
|
||||
fy: "60 ksi"
|
||||
As: "0.62 in**2"
|
||||
# Concrete unit weight used for the beam self-weight.
|
||||
concrete_density: "150 pcf"
|
||||
# Factored load combination applied to the demands.
|
||||
load_combination: "1.2D + 1.6L"
|
||||
|
||||
# Clear cover from the concrete face to the stirrup.
|
||||
cover: "1.5 in"
|
||||
# Stirrup bar number (#3).
|
||||
stirrup_size: 3
|
||||
# Stirrup spacing along the span, on center.
|
||||
stirrup_spacing: "6 in"
|
||||
# Bottom (tension) longitudinal bar number (#5).
|
||||
bar_size: 5
|
||||
# Number of bottom longitudinal bars.
|
||||
n_bars: 2
|
||||
# Top (hanger) longitudinal bar number (#4).
|
||||
top_bar_size: 4
|
||||
# Number of top hanger bars.
|
||||
n_top_bars: 2
|
||||
|
|
|
|||
|
|
@ -19,12 +19,12 @@
|
|||
"d": 9.5,
|
||||
"fc": 3.0,
|
||||
"fy": 60.0,
|
||||
"As": 0.62,
|
||||
"a": 1.823529,
|
||||
"et": 0.010285,
|
||||
"As": 0.613592,
|
||||
"a": 1.804683,
|
||||
"et": 0.010423,
|
||||
"phi": 0.9,
|
||||
"Mn": 26.623529,
|
||||
"phiMn": 23.961176,
|
||||
"Mn": 26.377285,
|
||||
"phiMn": 23.739557,
|
||||
"As_min": 0.253333,
|
||||
"Vc": 8.325383,
|
||||
"phiVc": 6.244037,
|
||||
|
|
@ -37,18 +37,17 @@
|
|||
"bar_db": 0.625,
|
||||
"top_bar_size": 4,
|
||||
"n_top_bars": 2,
|
||||
"top_bar_db": 0.5,
|
||||
"As_bars": 0.613592
|
||||
"top_bar_db": 0.5
|
||||
},
|
||||
"checks": {
|
||||
"flexure": {
|
||||
"demand": 23.44,
|
||||
"capacity": 23.961176,
|
||||
"capacity": 23.739557,
|
||||
"ok": true
|
||||
},
|
||||
"minimum_steel": {
|
||||
"demand": 0.253333,
|
||||
"capacity": 0.62,
|
||||
"capacity": 0.613592,
|
||||
"ok": true
|
||||
},
|
||||
"shear": {
|
||||
|
|
|
|||
|
|
@ -40,10 +40,10 @@ def test_example_demands(result):
|
|||
|
||||
def test_example_flexure(result):
|
||||
v = result["values"]
|
||||
assert v["a"] == pytest.approx(1.823529, rel=1e-5)
|
||||
assert v["et"] == pytest.approx(0.010283, rel=1e-3)
|
||||
assert v["a"] == pytest.approx(1.804683, rel=1e-5)
|
||||
assert v["et"] == pytest.approx(0.010423, rel=1e-3)
|
||||
assert v["phi"] == pytest.approx(0.9)
|
||||
assert v["phiMn"] == pytest.approx(23.961176, rel=1e-5)
|
||||
assert v["phiMn"] == pytest.approx(23.739557, rel=1e-5)
|
||||
assert result["checks"]["flexure"]["ok"] is True
|
||||
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ def test_reinforcement_geometry(result):
|
|||
assert v["top_bar_size"] == 4
|
||||
assert v["n_top_bars"] == 2
|
||||
assert v["top_bar_db"] == pytest.approx(0.5)
|
||||
assert v["As_bars"] == pytest.approx(2 * math.pi * 0.625**2 / 4.0, rel=1e-6)
|
||||
assert v["As"] == pytest.approx(2 * math.pi * 0.625**2 / 4.0, rel=1e-6)
|
||||
|
||||
|
||||
def test_rejects_depth_without_room_for_bars():
|
||||
|
|
|
|||
Loading…
Reference in a new issue