Use Pint and unit-free variable names in concrete-beam

Convert input parsing to Pint (matching the other calculations), carry
units in the YAML values, and drop unit suffixes from input keys, local
variables, results keys, the Typst sheet, and tests.
This commit is contained in:
smillmorel 2026-09-21 12:44:28 -04:00
commit 8f91baee41
6 changed files with 176 additions and 165 deletions

View file

@ -10,54 +10,68 @@ try:
except ImportError: except ImportError:
raise SystemExit("Install PyYAML: python -m pip install pyyaml") raise SystemExit("Install PyYAML: python -m pip install pyyaml")
try:
from pint import DimensionalityError, UndefinedUnitError, UnitRegistry
except ImportError:
raise SystemExit("Install dependencies: python -m pip install -r requirements.txt")
HERE = Path(__file__).resolve().parent HERE = Path(__file__).resolve().parent
ureg = UnitRegistry()
ureg.define("kip = 1000 * force_pound")
ureg.define("ksi = kip / inch ** 2")
ureg.define("psf = force_pound / foot ** 2")
ureg.define("pcf = force_pound / foot ** 3")
def _require_positive(name: str, value: float) -> float:
if value <= 0: def quantity(value, unit: str, name: str) -> float:
try:
q = ureg.Quantity(value).to(unit)
except (DimensionalityError, UndefinedUnitError, TypeError, ValueError) as exc:
raise ValueError(f"{name}: expected {unit}, got {value!r}") from exc
magnitude = float(q.magnitude)
if magnitude <= 0:
raise ValueError(f"{name} must be positive") raise ValueError(f"{name} must be positive")
return value return magnitude
def compute(inp: dict) -> dict: def compute(inp: dict) -> dict:
span_ft = _require_positive("span_ft", float(inp["span_ft"])) span = quantity(inp["span"], "ft", "span")
tributary_ft = _require_positive("tributary_ft", float(inp["tributary_ft"])) tributary = quantity(inp["tributary"], "ft", "tributary")
D_psf = _require_positive("D_psf", float(inp["D_psf"])) D = quantity(inp["D"], "psf", "D")
L_psf = _require_positive("L_psf", float(inp["L_psf"])) L = quantity(inp["L"], "psf", "L")
bw_in = _require_positive("bw_in", float(inp["bw_in"])) bw = quantity(inp["bw"], "in", "bw")
h_in = _require_positive("h_in", float(inp["h_in"])) h = quantity(inp["h"], "in", "h")
d_in = _require_positive("d_in", float(inp["d_in"])) d = quantity(inp["d"], "in", "d")
fc_ksi = _require_positive("fc_ksi", float(inp["fc_ksi"])) fc = quantity(inp["fc"], "ksi", "fc")
fy_ksi = _require_positive("fy_ksi", float(inp["fy_ksi"])) fy = quantity(inp["fy"], "ksi", "fy")
As_in2 = _require_positive("As_in2", float(inp["As_in2"])) As = quantity(inp["As"], "in**2", "As")
concrete_pcf = _require_positive("concrete_pcf", float(inp["concrete_pcf"])) concrete_density = quantity(inp["concrete_density"], "pcf", "concrete_density")
self_weight_klf = (bw_in * h_in / 144.0) * concrete_pcf / 1000.0 self_weight = (bw * h / 144.0) * concrete_density / 1000.0
wD_klf = D_psf * tributary_ft / 1000.0 + self_weight_klf wD = D * tributary / 1000.0 + self_weight
wL_klf = L_psf * tributary_ft / 1000.0 wL = L * tributary / 1000.0
wu_klf = 1.2 * wD_klf + 1.6 * wL_klf wu = 1.2 * wD + 1.6 * wL
Mu_kipft = wu_klf * span_ft**2 / 8.0 Mu = wu * span**2 / 8.0
Vu_kip = wu_klf * span_ft / 2.0 Vu = wu * span / 2.0
fc_psi = fc_ksi * 1000.0 a = As * fy / (0.85 * fc * bw)
fy_psi = fy_ksi * 1000.0 beta1 = max(0.65, min(0.85, 0.85 - 0.05 * max(0.0, (fc * 1000.0 - 4000.0) / 1000.0)))
a_in = As_in2 * fy_ksi / (0.85 * fc_ksi * bw_in) c = a / beta1
beta1 = max(0.65, min(0.85, 0.85 - 0.05 * max(0.0, (fc_psi - 4000.0) / 1000.0))) et = 0.003 * (d - c) / c if c > 0 else 0.0
c_in = a_in / beta1
et = 0.003 * (d_in - c_in) / c_in if c_in > 0 else 0.0
if et >= 0.005: if et >= 0.005:
phi = 0.90 phi = 0.90
else: else:
phi = max(0.65, min(0.90, 0.65 + (et - 0.002) * 250.0 / 3.0)) phi = max(0.65, min(0.90, 0.65 + (et - 0.002) * 250.0 / 3.0))
Mn_kipft = As_in2 * fy_ksi * (d_in - a_in / 2.0) / 12.0 Mn = As * fy * (d - a / 2.0) / 12.0
phiMn_kipft = phi * Mn_kipft phiMn = phi * Mn
rho_min = max(3.0 * math.sqrt(fc_psi) / fy_psi, 200.0 / fy_psi) rho_min = max(3.0 * math.sqrt(fc * 1000.0) / (fy * 1000.0), 200.0 / (fy * 1000.0))
As_min_in2 = rho_min * bw_in * d_in As_min = rho_min * bw * d
Vc_kip = 2.0 * math.sqrt(fc_psi) * bw_in * d_in / 1000.0 Vc = 2.0 * math.sqrt(fc * 1000.0) * bw * d / 1000.0
phiVc_kip = 0.75 * Vc_kip phiVc = 0.75 * Vc
def q(value: float) -> float: def q(value: float) -> float:
return round(value, 6) return round(value, 6)
@ -68,46 +82,46 @@ def compute(inp: dict) -> dict:
"project": inp.get("project", ""), "project": inp.get("project", ""),
"prepared_by": inp.get("prepared_by", ""), "prepared_by": inp.get("prepared_by", ""),
"values": { "values": {
"span_ft": q(span_ft), "span": q(span),
"tributary_ft": q(tributary_ft), "tributary": q(tributary),
"D_psf": q(D_psf), "D": q(D),
"L_psf": q(L_psf), "L": q(L),
"self_weight_klf": q(self_weight_klf), "self_weight": q(self_weight),
"wD_klf": q(wD_klf), "wD": q(wD),
"wL_klf": q(wL_klf), "wL": q(wL),
"wu_klf": q(wu_klf), "wu": q(wu),
"Mu_kipft": q(Mu_kipft), "Mu": q(Mu),
"Vu_kip": q(Vu_kip), "Vu": q(Vu),
"bw_in": q(bw_in), "bw": q(bw),
"h_in": q(h_in), "h": q(h),
"d_in": q(d_in), "d": q(d),
"fc_ksi": q(fc_ksi), "fc": q(fc),
"fy_ksi": q(fy_ksi), "fy": q(fy),
"As_in2": q(As_in2), "As": q(As),
"a_in": q(a_in), "a": q(a),
"et": q(et), "et": q(et),
"phi": q(phi), "phi": q(phi),
"Mn_kipft": q(Mn_kipft), "Mn": q(Mn),
"phiMn_kipft": q(phiMn_kipft), "phiMn": q(phiMn),
"As_min_in2": q(As_min_in2), "As_min": q(As_min),
"Vc_kip": q(Vc_kip), "Vc": q(Vc),
"phiVc_kip": q(phiVc_kip), "phiVc": q(phiVc),
}, },
"checks": { "checks": {
"flexure": { "flexure": {
"demand": q(Mu_kipft), "demand": q(Mu),
"capacity": q(phiMn_kipft), "capacity": q(phiMn),
"ok": Mu_kipft <= phiMn_kipft, "ok": Mu <= phiMn,
}, },
"minimum_steel": { "minimum_steel": {
"demand": q(As_min_in2), "demand": q(As_min),
"capacity": q(As_in2), "capacity": q(As),
"ok": As_in2 >= As_min_in2, "ok": As >= As_min,
}, },
"shear": { "shear": {
"demand": q(Vu_kip), "demand": q(Vu),
"capacity": q(phiVc_kip), "capacity": q(phiVc),
"ok": Vu_kip <= phiVc_kip, "ok": Vu <= phiVc,
}, },
}, },
} }

View file

@ -705,28 +705,25 @@ o
endstream endstream
endobj endobj
208 0 obj 208 0 obj
<</Length 4688/Filter/FlateDecode>> <</Length 4693/Filter/FlateDecode>>
stream stream
xœÝY tTÕ¹þöùÏžI&™ÉÌ0yBd’8’IB"bbÕÉ‹ &€ ¢„LB"I&f<12>¦(–‹VF¯i›Zj[û¸\Kéh0EÁªE¯µ@ë«õ]K<>´×‚ZŒ›®½ÏL2 ˆ®ë½«kÝ™•™}öÙûû¿ÿûÿ½÷&`â°„¼†•]î£÷™ãì´¼¦Žåm×h+^´!?^ÞººÉÁV˜Ú xœÝY tTÕ¹þöùÏžI&™ÉÌ0yBt’8’IB"bâkò"¦„@P±„LB"I&fS*-<½b
Ð<EFBFBD>æÆz¿ù^Ì׸°¹¹±>&¤é€y €s›Ûºn2}@—æ{k ¡^{S·æ§åu[ýMü'úy€ùEîöú¶Æ×¦’0 $ÞÙv!Àâ<C380>ôoÈëèlì(zjŸHæ‰á ú{ˆÝ<CB86>š„p»v ´‘wûqšbÙìQăÆA¬ÃÌBO±YX‡A‹ô D/v¨™½ô.ºi/ἂnz—Ò£8È!ƒ½†îµBƒ¸ûi=4H‹ØdÖ†<C396>ì§zbÜ¢õ ¤Õ¢Ïé/x·ãv܃<C39C>à9Ål»ÀnlÄqlÕŽâjìÆ£xRÏ€€Í°ÁŽàCÜ¢=¤]¢5a#žD/¶c;[‡#ê`¼Á<C2BC>hÓ±»±À2ìàGøV©?Â<>ð¿a'€tSÈä2g±CJ·Ù^6C«Æ!fAæÓµt#½ÂÖëYú*:Š^ ´7ày~ÄäB¯9 ½¦&¶Z_ªÞ=Ò?m•¾”=„£&—y}Œ-Ob‡òØ­Õòj^­¿€&ìÀõÙk|šìxŽNbîÖ»\ŸM—¡=z¶âç! @3qèá›<C3A1>7ÂCðòÍÔ§õj°íìКØFôjâ9¨ ³Ð„t~ ëÙn“ 0¯A<C2AF>\ø…ÙÄuÒ²Ýö]š§Ò¿Ëwå"÷Ó‹3¼Ùã.Ýv³{æí²®v‡N<E280A1>š·HŸÈïâ“v‘'f—îÉzã³n¾áÍž3o‘;Ä’Ë˰åK˼ÙsêíÒ<òªlqF†7»¼LÝ“VwqÏ.î©\ºËÝÐìÞ`ß<>U´ÁÞXä…†fѧ7ó<37> ˜1y/tæ`b®=,†¯Ótä8<4öÃC‡‡ò&82ž GF³Žá M~Gô™mÐiš ûO½¥{ô¤"×—¿ÑºÏŽ<C38F>©û’6‘}Sì mK›àŒ‡ivšýø<C3BD>|‰ùöñ!»8~Ì~âXžÇƲÜpØ‘‘Ÿ”œ˜Ã²2M‰®¤‚ü géž+¾Y+†Å+ÌÃô+·WWÞ³ä'<27>üxéÖâÂéÓÙEÌÅ\ì¢ó³/.zý7Ï¿qñ¥€†õ§ÞÒ³ôÄaÚ}ç[ÌHsǧ$˜±'żə±ÑýËôMç:·¥XYŠžj³˜âËܺ)ñÒóíLJ åç; ”¶©¥¶µÕ˵”ŽS*Øj©×Z õÕª­<C2AA>Ò¦Ôk-ÆM×Þgf2 ˆ®Û{W׺3+3ûì³÷÷ÿ÷ÿ{ïÿLÀ$`M«zÜǾlN°Ð
g ÷ÀÛLJ<C387>Ù<>Ù<EFBFBD>9 ZºVtܨ­| ÐF|Eûš[ih@[›ý3¶Ç½ ˜opYkkscÜ^MÌ[\ÔÚÑs›é=º0‡ØÛM<>Úïu `~F^w4ÞÖÅѯÌ/pw6v4¿6<C2BF>¬€ù ùK]<5D>`že‰@æÝ
…ÎB‡³0Ï—ž79Ï<39>—‘—Ù<E28094>~Ö¯õ[úãHêOîOéOíO³-‰b>s–#k¦<6B>eeN™yÁ…³™Ê+óÌKYA~Rò9L¼ä;ßýjëÖŸ²G¹øgkôì'ÿˆÝvÏuû®iX´ñÉK¦¸µ‚;;=:­êÓ[ô_ÿøO¤ß¶ú Bç<42>W[›<E280BA>¡y? [L“aÅß„X<E2809E>eOü“´‡“I‡)®*Öf?<4ü¬rghxÈQX˜Ç\I³DÉÊ‘13C»åšÅ¿?ú½Ÿ‹—Øk¬ïk7ï8üýã.0vÐÞa3@°ïÁK‡n—™<E28094>;”Ç ºº›»J~¶ß d†ód„pHý=ÌîC-B¸K»Zô‚¦Æ…Ø!v{‡ðFqëñ³ÐÏØl¬Ç0€Åz¡;ÕÌ~z½´‡ñ,^A/½ÃŠé b‡‘Å^C÷ŒY¡a܃4Œ>¦ÅìBÖ<42>]ìQ}±îÐúÒêÑ<C3AA>çô<‡»pîÇ.ðœb¶žÝ‡ßb6á¶iÇpöà <­gAÀfØ`Gq
Yìèð0›!ž‡Ô{P,Ôçë=°c whkWi-Ø„§Ñ<C2A7>ØÁÖã(‚:˜oð£Ú ìÂì°;ùQ¾MêÁ<C3AA>ò£ü]ì<02>i
|“8\i›l®M1ƒ¶ml?=‘îpÆU$ë0i³ÓíLJòó‡Uôß–ñ?&)yYŽ‚D)ŒÓaײ2§° ¦ŒèÈV=òHÎ6ÿÁwÿüë¦mìo·¯¿mÆÛÖß¾ùÓgL–Þº«Ä¯Ä_Ä_Å3W±¿{ù•#‡_}ÙÐ¥Y,Ôo՗‰~_¹5ÙfÕH³Äi±ñÉDš#Ù §=9Áùå°[mÖ„d›ÍZbŸ`…-v“y¿Ãöć=Áj1ÃìŒqVÚÊ'Èäp$JêùÇ¥”μ9u‹Ìvþ¾Ùþ“mþ¾#¹P^.Î|ø"'cK|iº}¥]‹qÄ8SãS­SlS.rT:*<2A>‹­–%XÂLfÍlcÓÙL™6¬ –ÐÕ9 ™9®ÝÒvåµ¢f?«bûYs÷/ÅÇEÕÕÛ¯; Wo¡VÃW@».ôéýæó®OøÊ LŽ‘½8ôÄô<C384>#ߟlø”ñÁ˜BÆÍð<s›Hô>ÙpÊÅRô‹é/ û±ýì(Ñ ` ™\ævXéöÛÇfjµ8Ì,èú‰n¥WØ=G_MÇЯ<C390>–á<Ï<>š\è7ç ßÔÂÖèËÔ»Oú§­Ö—±‡qÌä2/§ЧeáiìT{´z^ËkõЂ<C390>Ø©>û<>O“ÏÑi¬Ç}š`×êsèô£O¯Á6<àbhnA}|‹ñÆÃx^¾…´>C V¤]…<>Z Û„~ížC€*0-ÈäDZ<C387>í1¹óZùQÀ…™M\'<27>!×mß­yªý»}×-v?³$Ë›;áÒm7»wcþnëwèÌ™ù‹õÉ|Én>e7yâvëžœ7>îæÞܹó»C,µ²" [¹¬Â›;·añnÍ#¯*–deys++Ô=iu7÷ìæžêe»ÝM­î<C2AD>ö<EFBFBD>9%íÍ%^hhz+ß‚îƒÎ\L̵—ÅñõšŽüƒGFfÂ~däÈHÁ$G–ÓåÈjÕ1¤É£o‰³íƒ÷ºMÓ€áÀ™?è½éÈ÷e$n²î·cSúþ”Ídß?LÛ3&9aš“a?q°Pb¾ybÄ.N·Ÿ<^à±±7vd¦¤&籜lS²+¥¨ð²Ùºç3_­£âæaúu;j«ï_úÈCß_¶­´xÆ v9s1»ü’ÜŸ”–¼þËç߸âj@Æ3Ðsô>$`::}—XÌÈp'¦%™±7ͼٙµÉýãÌÍ ;·§YYšžn³˜+ܺ)ùêKì'FŽŽ:Š‹g"ÿà›'FOŒØ<C592>Û<EFBFBD>;ŠÅÎb‡³¸À—Ypa<70>» « {ƒlP´ &<˜2˜:˜6˜>˜a[Ã|ÖlGÎ,ËÉž:ëÒË®`³”WæYW³¢Â”Ô ˜6|Õ7¾y{û¶GÙã<C399>_ñƒußûŇ{ŸÝyÿÍûolZ¼é髦ºµ¢[»š»?1½æ£/<äÿìOz*óÎ5—]ºøâúúÂû ÍÝbºVLõMŠYö&>M{9™t˜jâmö##£¿PŽ8Š‹ ˜+å
nÀë,že²Vö¦šaÖâ1+`‚;¶I ü*懮Ný 0=PçŸÑfpc0ÜÖƒ?†ÛÕ¯Gµ9Rð§pÛ„Iáv 2YZ¸‡"ö•pÛ:a –,Y9²feiwܸä7ǾõCñ{<7B> |îó;<3B><E¿Œ´·ØLì{ñ Æ2¡Ûe&ä<>°"G;6:ÊfŠç!õ‹ôz옂"ßWÆf›ksܰm;;@Oe:œ U©:LÚœLû‰‘ÂÂQý7eü<65>KJGŽ£(Y
[nÛÐìÚ<C3AC>RÐ<>ÕèD –£]pc*0 nä#y(€˰n” ]¢ <0B>hD=Ú<> 7*ÑŽäÀ<C3A4>b´¢nÔŽ`ÕU#‚hD'V¢~äÀ‚24âÔc!ºáFšQ<C5A1>v,W#ݨWøn´ nt ËЊ4À ?hC½º7§N¡H„¹ ” €V`¡²D‹ê—žå ³ÆÌ<C386>̎̋ݤz <0A>ºÂÞK»Ð<C2BB>"ä"þðø•èF‚ <1B>h@£šÛ©¼ËA;Ñ…ÙQho#ªŸ®²¼'”£–¡­`¦)Íÿw””1±œÑ²¡\=Üc8Ÿž5x¿Ä[ZÿWd¢ûs|n «(c.{dŒ¥f<C2A5>X7hú\.Ò³y ãtصœì©ìÒ©QÙêÇÏÛî?ôÎÞ²<C39E>½{׆;7n¼sÃ][>zÖdéo¸^üTüIüU<{=;ùë—_9zäÕ— ]ZÅ"ý ú281è«´¦Ú¬i–->1•Hs¤:á´§&Ù!¿v«Íš”j³YË쓬°Åo6pØžšä°'Y-f˜<66>qÎj[å$™ŽÔbI½ð„”ÒY\0·a±ÙÎÿb¶Ç…ÿd›ÿÅ‘Z,/—d?v¹“±¥¾ ݾʮÅ9âœé‰éÖ©¶©I—;ªÕÎ%VËR,e&³f¶±l–LVϊ膼ª¦ì¼<C3AC>7mí¸î¦*Qw€Õ°ª¬µ÷Ç⃒ÚÚ7ÔkG·R»á+ ÝúáÞSG?›tåI\'{ñVAôûû?b|8®@4Õ­æ™;D& ¿ðáÝg\|X!ž˜þZq0ÈŽa­¦â¼ÎY6kg¿W3ÌÚE˜<45>•0AƒÛð뙺:õ7‚Àôx@<40>F›Á<E280BA>áp[C~nSL¿ÓæHÃÛá¶ S Âí8d³Œp;%ìÊpÛ:i*[nÛÐêÚ‰rÐ…5èFV =pcš0n¢(‚˱n”¡ =¢ÝhF#:<3A> 7ªÑ‰&äÁ<C3A4>R´£nÔG±‚êªA4£«Ð ?ò`Ašq ±½p£ ­hD'V¨‘n4*|7ÚÐ 7ºÐ‹åhGšà†t QÝ›ˆÓ P$Â<ЉÊ@+±HÙ¢MõKÏòP„ÙãæGfGæŽÇnQ½†G=a磊=èB ò‘xü*ô"AЋn4¡YÍíVÞå¡ÍèÁœ´ˆ·ÕÏVYÞ“
¯M¡<EFBFBD>æ <EFBFBD>ݬî5†ýZ®¬H•%?‰Ó¤î6ŽX3"ld“¼ß…€bØ®æw„óܰÀ2t…#,ÿ–‡}i+ÁìR,Ææx=Ô¸6t„Ñ#r´ÁÝȤFµjŒ ΌʒL99ׯ¾¥ï4 õaÿŒl@7ÚŠäÚ5¢OZÐÎã©#G-Èõ.ùwaU8Ï¥ÅQMdO:€ÝŠç(¿ò@F¬ËЭøŒêðÙ$ºÔ¡­èV(†&«T4«5ßVFÆ{¬GüÑ ްíVfGEG¶¥.£±]¿A4«ž3ù‘=âg®ÚwÜ ÊQËÑŒv°Ó•æÿ;JʘXÎiÙP®îqœÏÎ ¼ÿÄ[ZÿWd¢û|n «(c.{dŒ¥fÝX 7hùD.Ò³ù
ÙXvKXÕ±Ñ?»×å ¶FžŽÍºQ<C2BA>V)=Ú¾<C39A>…ÈjhR{f{ØC#G 4™)Ò“€bTJÜ€F4(<cLt·†wÉH„¤çÒƒ–‘xQ¤Vçüð¬z,C@í £1ˆÞ‹F8}'<27>ç…Ä•Y36²V:θDÏ“^ɵmDJîócsÍPÃØÉëÏO‰lì2ömê{tÿø"±èÂjÅ·Ií;gŒRg›+5Y=Â_Z—šËµÙÑ$w™§<E284A2>#=S©iÄKÏ謋œ_ÒŠ¡W7ZÕÕ¨Gr®Tvy8 —£UyÓîëŒÚC¥w“àˆ<C3A0>ñú?×§è=Î?&ä§gfpv&cí<63>×åL Û•%éÉgïêF”ä§ä×67ÒÉÌȺŠ4†÷;ÉxÔÒ*å•_ÍÏ<ù˜9â÷ør|äÔÍŒÊ6cíT<C3AD>;g¤.ÆÙá*³¡5*+@ËkÄMJg#{ëÑ<C3AB>Žð)&W¿<m"3¢ãop>ûŠ‘q”÷äw0ÌQÚ9[¾Þ<>i—w»Õ¨± ¯C¡<EFBFBD>å <EFBFBD>ݪî5‡ýZ¡¬H•%?‰Ó¢î6G­6²IÞïA@1ìTó»ÂynX`9z–+¾4…•Ž`ö(ãs¼Mj\ºÂè9ÚàndR³Z5FgÇdI¶ŠœœëWßÒ÷šÐ†Æ°F6¡
gžµ^ÉÃÿéš•{lëÈ™=ºê"+JVÆÚ“ç’q¾ŒG”s°õjŒD6ÎE™U§×ÿ;Ög{eTZ†Šò\lQêr”+;5¨Æ|e§³1W¡µê^%êàÆ<Ô¢ Q‰2”£LÅ¥XÝ‘÷3Õj¼ Erí‰êÓ‚6´‡óxZ”㘹Þ%ÿ¬ç¹´8¦‰ìéB7ð£WñcãWȈµa9zŸ1>Þ‚D—:4¡½
• ÅÐdµÊ<EFBFBD>Vµæ{ÂÊÈx<C388>÷(‚?–áÁ(Û^¥anLtd[ê2ë±õD«ê9—¹Q?óÕ¾ãVÈÆz0°ÛªŽ<C2AA>þù½Ž(g°5òÌðp|Ö<>y´ZéÑñ©,DVC‹Ú3;Ã9b ÉL‘ž› Râ4£Iácbó¸=¼KF"$=—´EãD‰Z<E280B0> ³±µ3ŒÅ v/Sàì<C3A0>@žWfYpÜØÈZé:ç;Oz%×¶)¹Ï<C2B9>Ï5C c'o<O<%²±_ÈØw¨ï±ýãÓÄ¢kßµ Hì¼qJ<71>o®ÔdM”¿´.5—k9²£Iî2O»£=S©iÄKÏØ¬‹œ_ÒŠ¡W/ÚÕÕ˜Gr®TvE8 W ]yÓîëŽÙC¥w“`ÔÆD}‚ŸèSìç—aÒÓs38?“ñö&êr.ކŠ<E280A0>Ê’ôäãwu#JòSòë‡é F33²n&ž"ÍáýN2³´ZyåWó³Ïq.fGýž8CŽ<43>œºÙ1Ùf¬<66>š çŒÔÅ8›"\e6´ÇDbh;‡b͸Méldo#ºÐ>Åäê—§MdFlü Îç_12Žòžü†9J;çËûsíáòn¯5^áìóÖ+Ùãbø?]³r<C2B3>m<EFBFBD>žÙc«.²¢da¬=y.çËDD9§ +ѨÆHdã\”Yuvýñ±c}¼WF¥e¨(ÏÅ–¨R×¢RÙ©C-(;u˜ƒ¸¥¨W÷ªÑ7æ£uX„jT *.¥ê޼Ÿ­Vãõ¨VˆuX¨° Œz”*ì%p+lY©Öª«¹¨F-*ÔÜJ,V6*Ñ PëP¯°ça>jP­l5f-ÊQƒ…¨Pí*U<>öjQ§¾åøyŠ‹Átêb¬Žg%‘¢Ìæ¡õ(ǵụ(CµÂ“ü¥ý9ª]å9'Ì´Ti$‘%f9¢F]ÉÞ…¨Ç|Ô¡Aé)‘+Âlk•sPö¥R10"a0*Gæc‰Q…k±@±<>–„GÊëÊ™yÊê\Õk0« GY¶ÇPäs€´ið<69>ú/ŠZnPþ× Fi+ýmP*QŠyQÜHîT)ÉÛPc¡òOò«VJ yOª(õ¬‰Ž¬<C5BD>‰ŠŒi©Š›d.çKO¤" çô$‚6>:çÊŽˆ‰%ã&•ªQ£0•(WHF<48>‘<EFBFBD>ÕÊ×ò°¶¦‘÷FNc N2>µ*²×aax„<78>7Ñ c…Hþc^( –Çh6}‰(9GøÈl–Yv¶*rýI&r”ÌyQA昌’ÁÜX/†<>H†ó3²òj'èYG‘qŸfï0°"¶ÇGPê)u2;Ií§Â5ö®Jܦö½®ð¹<ë䎭ÇªÒØú37f¯<66>­Œ]¸J<C2B8>í˜0n¬×ØŸ<C398>3kì™'¶†;×ÉyJÎ<4A>PýFªcï6ž<36>b«_¿ªÓ<C2AA>Z0­JŒó#­LdõoT ‘§ù4(Ï—ñÏ{Ae×ð̰u6–Q_Êq†µà9Ô<ß 5ñ Qr‘IäÕª-K2*†F5FŽ•ý·Ox*6|øô1ˆøòIúËÞ :Ee-Ú¦–õd^·;ú|6¦‰TÀøu«cBÔDzO¢•œU‡J VÄ0—ÏwF<77>!ë
± –<>Q‹b…½n…-+Õju5•¨F™š[ŽEÊF9êj jö\ÌC*•M£Æ¬F)ª°eª]¡ªQÃ^5jÔ·?Wq1˜ÎGM”Õ±¬$rݳ¹(G-Jqyøn1JP©ð$i¶jW<6A>ðœfZ¬4’ȳ P¥®dïÔbjP§ô”Èea¶Õʇ٨ ûR®‘0•¢ó°X<C2B0>¨À嘯XHKóÃ#åõ|å<>ŒÌ\euŽê5˜Õ„£,Û£(ò9@Ú4xHýŽX®SþW¡Ji+ý­SÊQŒ¹#¸‘Ü©P’·¡ÆåŸäW©<”òžTQêY52²6**2¦Å*n’¹œ/=‘ŠÔ<C5A0>Ñ“ÚØèœ);"$–Œ›TªJ<C2AA>®Ã<”£T!=F>V*_KÃÚ˜FÞ9aŒ58ÉøT«È^‰áÞx/Œ"ù<>zaD 8üY¥Ùhô%¢äá#³YfÙéªÈõ'™ÈQ2 äUD™c2Jsc½6"q\ÎÏÈÊ«§odEÆ}‘½ÃÀŠØA©§ÔÉ`hì$Õ_ר»Êq“Ú÷:ÂçZð´“;ºz­J£ëÏ쨽6º0vá iÓòOü¾–¯ô^‰6ä+ŽrîmÈSUxò'T”ò·zõ:ó"nÿr<þe0¨ƒ ¸éqmK~lëR^:…%cÄ’±Ný<4E>H€Ø$õé„ĪmWŸIØb6Õ¶>öç*^êaV¬±Dx@,… fQxñjTl fVm“ÃU[Wý¤z4ÕÃ|K A­¥QA
5¶mܸÑ^c6άÑgžèîL'Wä)9{\õ©>Œ½Ûx6Š®~ýªN7jÁàHUbœ<1F>‘ÊDVÿFÅyj‘Oƒò|û¼Tv Ï [§cõ¥gX žAͳ<C38D>PãŸ%©‘D^¥Úò·$£b¨WcäXÙÿÕqOņ_<_>OÙT§¨¬E[”²žÌ ãvŽ<Ÿ<>j"0~ÝjõÑì“hE§Õ¡RƒåQÌåó<C3A5>QcȺBÚ´|‰ß×r•Þ+Ђ\ÅQν 9ª :]H¢ÖÒû§6ó÷½¿_?ur ?µ™N­ÓOž˜ÊO.¡“>ýÄTúÛ{ùüo§é½|úoAï
ï@RþV¯^§nÆÕá_ŽÇ¾Ìf£ 5p ×>¢­e‰oY‹'±Dô<44>X"Öªÿ › ><3E>p‚˜Cµíê3ÛA̦Úև߫àÅfÅ‹‡Äâ<C384>b…«FÅÀbfÕ6©1\µuÕOªGS=Ì·X<C2B7>ôéô‰ “ùô<C3B9>úx }ôá&þ‘ <E28098>öéžXÌ?ÜD®ÕOŸÂO,¦>ýøúû¹üï'éƒ\úoAô×|:æ¢÷ûhè½ úk!wÑ_häÏU|DÐHèÌ ¾3úŸ«èOÇüüOtÌOôÎÛ“ù;‚ÞžLo zs%ýAÐï‡è<E280A1>×Óù§éõtzm€~'è·‚^}%™¿*è•dzy€^z1™¿$èÅ- üÅdúÍZúu Ý’À<E28099>–ÐA‡eá‡ýÊB/ú¥ ç7:øóSè¿Rè9A¿ C›<ü<> Ÿ zv-=#èg‚~*èéV~PÐAO ú‰ ý[ø~ý8‘†Ÿâžܷ”?9DO®Ó÷ yø¾¥´Ï§yè A<>P¨¿”ÿHÐÞþR¾÷4ýp‡•ïô?=æ§ÿ´Ñn'ý‡ G…ï#zDÐ÷}ÏI úîwlü»…ô}û!ÿö4zÈAßÚååßZK»¼ôMA
>$h(têß)ý½ ú† Á¯§óA?}ýkvþõtúš<C3BA>¾j¡<6A>‚¾²ÃÊ¿"h‡•¶oËãÛmË£/÷—ò/ÐÀC|@Ð[—ò†è<E280A0>uúÖ{=|ëRÚêÓïôï‚î»×Ãï¢{=Ô¿ÉÃûKéK[ø—\´%<25>6oòðÍ~Ú´ÑÁ7yh£ƒît· »ݹÁÁï´ÁAÿ&h½ /:Êøè ‚ÖÝFw|~-¿CÐç×ÒÚ ès‚últ» Õ‚V êíIä½IÔbð½¬÷$RÏ~=褠Oït« .A<>ΠΎi¼³<C2BC>:¦Q» •…t‹ ¶Bj=M+†¨EP³ ¿ ¦åð&AËaçË/ FAË}VÐÍ7$ð›m´ÔO7=C7Þ<37>ÀotÑ ´DÐb]/h‘ …“ÓùÂBZ ¨AP½ ëÖÒ|Au.ª4<>yù<A5C4w}¦:<3A>f6U—;yu][™Æ¯TUîäU~šS™Æç QeU”;yÅl*/sðr'•‡4Ÿ/^/+Mâe* iðÅë¥>/M¢ÒÛï‹×}×$rŸ<72>|!¶Î¯_“ϯI¤kBÌçóëW ºŠyùU§éJAWL£AÅŽ2^ì§ËgfðËçÒlA—y]ü2A³æÒ¥üÒ¹TT<54>Á‹:Êx¡ ™^Ÿ™A”ïuñü4Ê‹OáyCäÍ<C3A4>Ľ.ò†4i6×î๓(WÒÐg\âá3]ŸÂ/ñÐt­„O4MÐÅ‚¦&‘'¥Œ{*é¢$Ê”<>”ije¹½<k-¹½tá\ºÀQÆ/”)hÊät>EÐdØùätÊ”.(MPjJO<>C)É^žRFÉ.;Oö’ËN“`ç“\ät”q§ órGÙ“’¸ÝAvC»$["OJ¢$C;›ÕÂm‰d3´³&Æs«…¬!æÛ£'ÆS¢Ì­Ùz‚ K|
úËQ?ÿKõÓŸ½û§‰ü]AšHïz{½%èÍzãõTþÆIz=•^ë£? ·ŠO¡8;™™˜—›q‘VÂé4iÌ˵b°sæ%؉…˜Ã6ãÿÏ ÿjÿä+ÿ¬?—y
úƒ W_Iä¯
z%‘^^Lä/ zqs1‘~¿†~WDG6Çñ#EtXСßZø!A¿µÐ ‚~#èù þü$ú¯$zNг}tp£‡ôkAϬ¡§=%èW‚žÜnåíô„ ÇíÛÇ÷¹è—ñ4øØôØÞ%ü±zl­¾wÀÃ÷.¡½>}ÀC<C380>
z¤<EFBFBD>B½Åü‚öôó='éçÛ­|· Ÿùéa?ý§<C3BD>v9é?ýTø>¥Ÿú± 9é!A?ü<><C3BC>ÿ0Ÿ~`£ï?èàߟJ:è{;½ü{kh§—¾+èAßÔÿíTÞï§oËο<C38E>Jß²Ó7-´CÐýÛ­ü~AÛ­´mkß&hkÝ×[Ìï룾{xŸ {·,á÷нkõ-wyø–%´Å§ß#èßÝ}—‡ß=@wy¨w£‡÷Ó<>›ãø<C3A3>.ÚG›6zø&?mÜàà=´ÁAwú† ÛݶÞÁo´ÞAÿ&h<> ¯;Jø×ëèVAko¢[n^ÃotóZs}MP<4D><50>¾*h• •‚º»âywu‡|/ë]ñÔµO:)èÓ;Ý(¨CP ½Žú¨½m*o¯£¶©Ô*hE>Ý ¨%ŸšOÒòjÔ(È/¨aÙ9¼AÐ2Øù²s¨^ÐRA× ºîê8~<7E><>–øéÚ§éš«ãø5.º:Ž Z䢫-´`b*_<>OóÕ ªtåš'¨ÆEÕ‚æ2/Ÿ+¨j€æL¥+*Sø³¨²ÔÉ+Sèòò~¹ ŠR'¯ðÓìò>{€ÊS¨¬ÔÉËfQi‰ƒ—:©4¤ù|±zIq/qPIHƒ/V/öÙxq‡Ø>_¬î»,žûlä ±µ¾Xý²øX~Y<]b>Ÿ_¿TÐ%ÌË/9I_tñT*Tè(á…~ºhF¿hÍt¡×Å/4s]<5D>—Æ/˜Cyi¼@P¾£„ç šáuñi”—F¹^ÏM¡œØ$ž3@Þì Üë"oH“f³íž=<3D>²%Ý>}úù>]Ðù±Iü|MÓŠø4AS<05>'hJy’J¸§œÎM ,A™ <SP†ÛË3Ö<33>ÛK“çÐ9Ž~Ž tA“&¦òI‚&ÂÎ'¦Rš TA)‚’“JxòlJJôò¤JtÙy¢—\vš;Ÿà"§£„;9˜—;JÈž<C388>Àí²Ú%ØâyB%ÚÙ¬n‹'›¡<E280BA>5>–[-d 1ßn=>–âenÍÒãYb“¸EPlÅØÉ,ÈļÜ$ˆ»ˆ´"N'Ic^®ƒ<>3/ÁN,Äüë7³éÿ^øWø’¯tüƒ–—y
endstream endstream
endobj endobj
209 0 obj 209 0 obj
@ -1191,12 +1188,12 @@ r
endstream endstream
endobj endobj
218 0 obj 218 0 obj
<</Title(Concrete Beam Analysis)/Author(Conemco Engineering)/Creator(Typst 0.15.1)/ModDate(D:20260903203734-04'00)/CreationDate(D:20260903203734-04'00)>> <</Title(Concrete Beam Analysis)/Author(Conemco Engineering)/Creator(Typst 0.15.1)/ModDate(D:20260921124408-04'00)/CreationDate(D:20260921124408-04'00)>>
endobj endobj
219 0 obj 219 0 obj
<</Length 1176/Type/Metadata/Subtype/XML>> <</Length 1176/Type/Metadata/Subtype/XML>>
stream stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><dc:title><rdf:Alt><rdf:li xml:lang="x-default">Concrete Beam Analysis</rdf:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>Conemco Engineering</rdf:li></rdf:Seq></dc:creator><xmp:CreatorTool>Typst 0.15.1</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>en</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-09-03T20:37:34-04:00</xmp:ModifyDate><xmp:CreateDate>2026-09-03T20:37:34-04:00</xmp:CreateDate><xmpTPg:NPages>2</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>LV3i1VpQNYDMq1s3457ZEQ==</xmpMM:InstanceID><xmpMM:DocumentID>6OKHFztuOUXX7fYilLhfDw==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?> <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?><x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="xmp-writer"><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" ><dc:title><rdf:Alt><rdf:li xml:lang="x-default">Concrete Beam Analysis</rdf:li></rdf:Alt></dc:title><dc:creator><rdf:Seq><rdf:li>Conemco Engineering</rdf:li></rdf:Seq></dc:creator><xmp:CreatorTool>Typst 0.15.1</xmp:CreatorTool><dc:language><rdf:Bag><rdf:li>en</rdf:li></rdf:Bag></dc:language><xmp:ModifyDate>2026-09-21T12:44:08-04:00</xmp:ModifyDate><xmp:CreateDate>2026-09-21T12:44:08-04:00</xmp:CreateDate><xmpTPg:NPages>2</xmpTPg:NPages><dc:format>application/pdf</dc:format><xmpMM:InstanceID>ZKKY70e37OpYXWBmV77P8g==</xmpMM:InstanceID><xmpMM:DocumentID>6OKHFztuOUXX7fYilLhfDw==</xmpMM:DocumentID><xmpMM:RenditionClass>proof</xmpMM:RenditionClass><pdf:PDFVersion>1.7</pdf:PDFVersion></rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end="r"?>
endstream endstream
endobj endobj
220 0 obj 220 0 obj
@ -1413,20 +1410,20 @@ xref
0000034595 00000 n 0000034595 00000 n
0000034672 00000 n 0000034672 00000 n
0000035131 00000 n 0000035131 00000 n
0000039890 00000 n 0000039895 00000 n
0000039972 00000 n 0000039977 00000 n
0000040745 00000 n 0000040750 00000 n
0000050159 00000 n 0000050164 00000 n
0000054744 00000 n 0000054749 00000 n
0000056402 00000 n 0000056407 00000 n
0000056809 00000 n 0000056814 00000 n
0000057152 00000 n 0000057157 00000 n
0000104750 00000 n 0000104755 00000 n
0000171864 00000 n 0000171869 00000 n
0000172035 00000 n 0000172040 00000 n
0000173289 00000 n 0000173294 00000 n
trailer trailer
<</Size 221/Root 220 0 R/Info 218 0 R/ID[(6OKHFztuOUXX7fYilLhfDw==)(LV3i1VpQNYDMq1s3457ZEQ==)]>> <</Size 221/Root 220 0 R/Info 218 0 R/ID[(6OKHFztuOUXX7fYilLhfDw==)(ZKKY70e37OpYXWBmV77P8g==)]>>
startxref startxref
173474 173479
%%EOF %%EOF

View file

@ -28,51 +28,51 @@ Simple-span rectangular beam under uniform gravity load. Numbers come from `calc
polygon(fill: black, (0pt, 0pt), (8pt, 10pt), (-8pt, 10pt)), polygon(fill: black, (0pt, 0pt), (8pt, 10pt), (-8pt, 10pt)),
) )
#v(2pt) #v(2pt)
#text(size: 9pt)[#n.span_ft ft simple span · #n.bw_in in × #n.h_in in section] #text(size: 9pt)[#n.span ft simple span · #n.bw in × #n.h in section]
] ]
} }
#figure( #figure(
beam-sketch, beam-sketch,
caption: [#n.span_ft ft simply supported beam, #n.bw_in in × #n.h_in in rectangular section.], caption: [#n.span ft simply supported beam, #n.bw in × #n.h in rectangular section.],
) )
== Loads and Beam Demand == Loads and Beam Demand
#calcline([$L = #n.span_ft " ft"$], [Simple span]) #calcline([$L = #n.span " ft"$], [Simple span])
#calcline([$B_t = #n.tributary_ft " ft"$], [Tributary width]) #calcline([$B_t = #n.tributary " ft"$], [Tributary width])
#calcline([$D = #n.D_psf " psf"$], [Dead load including superimposed dead]) #calcline([$D = #n.D " psf"$], [Dead load including superimposed dead])
#calcline([$L_L = #n.L_psf " psf"$], [Live load]) #calcline([$L_L = #n.L " psf"$], [Live load])
#calcline([$w_("sw") = #round(n.self_weight_klf, digits: 3) " kip/ft"$], [Beam self-weight]) #calcline([$w_("sw") = #round(n.self_weight, digits: 3) " kip/ft"$], [Beam self-weight])
#calcline( #calcline(
[$w_u = 1.2 w_D + 1.6 w_L = #round(n.wu_klf, digits: 3) " kip/ft"$], [$w_u = 1.2 w_D + 1.6 w_L = #round(n.wu, digits: 3) " kip/ft"$],
[Factored uniform line load], [Factored uniform line load],
) )
#calcline( #calcline(
[$M_u = w_u L^2 / 8 = #round(n.Mu_kipft) " kip·ft"$], [$M_u = w_u L^2 / 8 = #round(n.Mu) " kip·ft"$],
[Maximum positive moment], [Maximum positive moment],
) )
#calcline( #calcline(
[$V_u = w_u L / 2 = #round(n.Vu_kip) " kip"$], [$V_u = w_u L / 2 = #round(n.Vu) " kip"$],
[Support shear], [Support shear],
) )
== Flexural Strength == Flexural Strength
#calcline([$b_w = #n.bw_in " in"$], [Beam width]) #calcline([$b_w = #n.bw " in"$], [Beam width])
#calcline([$h = #n.h_in " in"$], [Overall depth]) #calcline([$h = #n.h " in"$], [Overall depth])
#calcline([$d = #n.d_in " in"$], [Effective depth]) #calcline([$d = #n.d " in"$], [Effective depth])
#calcline([$f'_c = #n.fc_ksi " ksi"$], [Concrete compressive strength]) #calcline([$f'_c = #n.fc " ksi"$], [Concrete compressive strength])
#calcline([$f_y = #n.fy_ksi " ksi"$], [Steel yield strength]) #calcline([$f_y = #n.fy " ksi"$], [Steel yield strength])
#calcline([$A_s = #n.As_in2 " in"^2$], [Provided tension steel (2 No. 5)]) #calcline([$A_s = #n.As " in"^2$], [Provided tension steel (2 No. 5)])
#calcline( #calcline(
[$a = A_s f_y / (0.85 f'_c b_w) = #round(n.a_in, digits: 3) " in"$], [$a = A_s f_y / (0.85 f'_c b_w) = #round(n.a, digits: 3) " in"$],
[Equivalent compression-block depth], [Equivalent compression-block depth],
) )
#calcline([$epsilon_t = #round(n.et, digits: 4)$], [Net tensile strain]) #calcline([$epsilon_t = #round(n.et, digits: 4)$], [Net tensile strain])
#calcline([$phi = #round(n.phi, digits: 2)$], [Strength reduction factor]) #calcline([$phi = #round(n.phi, digits: 2)$], [Strength reduction factor])
#calcline( #calcline(
[$phi M_n = phi A_s f_y (d - a/2) = #round(n.phiMn_kipft) " kip·ft"$], [$phi M_n = phi A_s f_y (d - a/2) = #round(n.phiMn) " kip·ft"$],
[Design flexural strength], [Design flexural strength],
) )
@ -89,8 +89,8 @@ Simple-span rectangular beam under uniform gravity load. Numbers come from `calc
== Minimum Steel and Concrete Shear == Minimum Steel and Concrete Shear
#calcline([$A_("s,min") = #round(n.As_min_in2, digits: 3) " in"^2$], [Minimum longitudinal steel]) #calcline([$A_("s,min") = #round(n.As_min, digits: 3) " in"^2$], [Minimum longitudinal steel])
#calcline([$A_("s,prov") = #round(n.As_in2, digits: 3) " in"^2$], [Provided longitudinal steel]) #calcline([$A_("s,prov") = #round(n.As, digits: 3) " in"^2$], [Provided longitudinal steel])
#v(7pt) #v(7pt)
#check( #check(
@ -104,8 +104,8 @@ Simple-span rectangular beam under uniform gravity load. Numbers come from `calc
) )
#v(10pt) #v(10pt)
#calcline([$V_c = 2 sqrt(f'_c) b_w d = #round(n.Vc_kip) " kip"$], [Concrete shear strength]) #calcline([$V_c = 2 sqrt(f'_c) b_w d = #round(n.Vc) " kip"$], [Concrete shear strength])
#calcline([$phi V_c = #round(n.phiVc_kip) " kip"$], [Design concrete shear strength]) #calcline([$phi V_c = #round(n.phiVc) " kip"$], [Design concrete shear strength])
#v(7pt) #v(7pt)
#check( #check(

View file

@ -1,15 +1,15 @@
project: "Deer Creek Shoring" project: "Deer Creek Shoring"
prepared_by: "Conemco Engineering" prepared_by: "Conemco Engineering"
span_ft: 16 span: "16 ft"
tributary_ft: 6.25 tributary: "6.25 ft"
D_psf: 55 D: "55 psf"
L_psf: 20 L: "20 psf"
bw_in: 8 bw: "8 in"
h_in: 12 h: "12 in"
d_in: 9.5 d: "9.5 in"
fc_ksi: 3.0 fc: "3.0 ksi"
fy_ksi: 60 fy: "60 ksi"
As_in2: 0.62 As: "0.62 in**2"
concrete_pcf: 150 concrete_density: "150 pcf"
load_combination: "1.2D + 1.6L" load_combination: "1.2D + 1.6L"

View file

@ -4,30 +4,30 @@
"project": "Deer Creek Shoring", "project": "Deer Creek Shoring",
"prepared_by": "Conemco Engineering", "prepared_by": "Conemco Engineering",
"values": { "values": {
"span_ft": 16.0, "span": 16.0,
"tributary_ft": 6.25, "tributary": 6.25,
"D_psf": 55.0, "D": 55.0,
"L_psf": 20.0, "L": 20.0,
"self_weight_klf": 0.1, "self_weight": 0.1,
"wD_klf": 0.44375, "wD": 0.44375,
"wL_klf": 0.125, "wL": 0.125,
"wu_klf": 0.7325, "wu": 0.7325,
"Mu_kipft": 23.44, "Mu": 23.44,
"Vu_kip": 5.86, "Vu": 5.86,
"bw_in": 8.0, "bw": 8.0,
"h_in": 12.0, "h": 12.0,
"d_in": 9.5, "d": 9.5,
"fc_ksi": 3.0, "fc": 3.0,
"fy_ksi": 60.0, "fy": 60.0,
"As_in2": 0.62, "As": 0.62,
"a_in": 1.823529, "a": 1.823529,
"et": 0.010285, "et": 0.010285,
"phi": 0.9, "phi": 0.9,
"Mn_kipft": 26.623529, "Mn": 26.623529,
"phiMn_kipft": 23.961176, "phiMn": 23.961176,
"As_min_in2": 0.253333, "As_min": 0.253333,
"Vc_kip": 8.325383, "Vc": 8.325383,
"phiVc_kip": 6.244037 "phiVc": 6.244037
}, },
"checks": { "checks": {
"flexure": { "flexure": {

View file

@ -23,24 +23,24 @@ def result():
def test_example_demands(result): def test_example_demands(result):
v = result["values"] v = result["values"]
assert v["self_weight_klf"] == pytest.approx(0.1) assert v["self_weight"] == pytest.approx(0.1)
assert v["wu_klf"] == pytest.approx(0.7325) assert v["wu"] == pytest.approx(0.7325)
assert v["Mu_kipft"] == pytest.approx(23.44) assert v["Mu"] == pytest.approx(23.44)
assert v["Vu_kip"] == pytest.approx(5.86) assert v["Vu"] == pytest.approx(5.86)
def test_example_flexure(result): def test_example_flexure(result):
v = result["values"] v = result["values"]
assert v["a_in"] == pytest.approx(1.823529, rel=1e-5) assert v["a"] == pytest.approx(1.823529, rel=1e-5)
assert v["et"] == pytest.approx(0.010283, rel=1e-3) assert v["et"] == pytest.approx(0.010283, rel=1e-3)
assert v["phi"] == pytest.approx(0.9) assert v["phi"] == pytest.approx(0.9)
assert v["phiMn_kipft"] == pytest.approx(23.961176, rel=1e-5) assert v["phiMn"] == pytest.approx(23.961176, rel=1e-5)
assert result["checks"]["flexure"]["ok"] is True assert result["checks"]["flexure"]["ok"] is True
def test_example_min_steel_and_shear(result): def test_example_min_steel_and_shear(result):
v = result["values"] v = result["values"]
assert v["As_min_in2"] == pytest.approx(0.253333, rel=1e-4) assert v["As_min"] == pytest.approx(0.253333, rel=1e-4)
assert v["phiVc_kip"] == pytest.approx(6.244016, rel=1e-4) assert v["phiVc"] == pytest.approx(6.244016, rel=1e-4)
assert result["checks"]["minimum_steel"]["ok"] is True assert result["checks"]["minimum_steel"]["ok"] is True
assert result["checks"]["shear"]["ok"] is True assert result["checks"]["shear"]["ok"] is True