@theerapat-s28/ts-structural-eng-tools 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/dist/core/constants/rc.constant.d.ts +7 -0
- package/dist/core/constants/rc.constant.js +20 -1
- package/dist/core/constants/rc.constant.js.map +1 -1
- package/dist/core/errors/rc-design.error.js +15 -0
- package/dist/core/errors/rc-design.error.js.map +1 -1
- package/dist/core/index.d.ts +3 -3
- package/dist/core/index.js +5 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types/plate-jacketing.type.d.ts +37 -0
- package/dist/core/types/plate-jacketing.type.js +8 -0
- package/dist/core/types/plate-jacketing.type.js.map +1 -1
- package/dist/core/types/rc-beam.type.d.ts +8 -1
- package/dist/core/types/rc-beam.type.js +8 -1
- package/dist/core/types/rc-beam.type.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/rc/rc-bar-layout.d.ts +5 -4
- package/dist/rc/rc-bar-layout.js +6 -5
- package/dist/rc/rc-bar-layout.js.map +1 -1
- package/dist/rc/rc-beam-design.d.ts +24 -2
- package/dist/rc/rc-beam-design.js +57 -17
- package/dist/rc/rc-beam-design.js.map +1 -1
- package/dist/strengthening/index.d.ts +1 -0
- package/dist/strengthening/index.js +5 -1
- package/dist/strengthening/index.js.map +1 -1
- package/dist/strengthening/rc-beam-plate-interface-bolts.js.map +1 -1
- package/dist/strengthening/rc-beam-side-plate-shear.d.ts +254 -0
- package/dist/strengthening/rc-beam-side-plate-shear.js +420 -0
- package/dist/strengthening/rc-beam-side-plate-shear.js.map +1 -0
- package/dist/strengthening/rc-beam-steel-plate-jacketing.d.ts +32 -3
- package/dist/strengthening/rc-beam-steel-plate-jacketing.js +30 -21
- package/dist/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -65,7 +65,8 @@ src/
|
|
|
65
65
|
├── strengthening/ # Strengthening methods
|
|
66
66
|
│ ├── index.ts
|
|
67
67
|
│ ├── rc-beam-steel-plate-jacketing.ts # Moment capacity before/after plate jacketing
|
|
68
|
-
│
|
|
68
|
+
│ ├── rc-beam-plate-interface-bolts.ts # Interface shear flow and required interface bolts
|
|
69
|
+
│ └── rc-beam-side-plate-shear.ts # Shear capacity before/after bolted side plates (two models)
|
|
69
70
|
├── core/ # Shared infrastructure
|
|
70
71
|
│ ├── index.ts
|
|
71
72
|
│ ├── constants/ # RC design constants (ACI 318)
|
|
@@ -110,20 +111,29 @@ Summarised below; see the [full API reference](https://theerapat-s28.github.io/t
|
|
|
110
111
|
|
|
111
112
|
### RC Beam Design
|
|
112
113
|
|
|
113
|
-
- **`rectBeamMomentCapacity(section)`** — Computes φMn for a rectangular RC beam (singly or doubly reinforced). Returns `phiMn` in kN·m with calculation details and ACI 318-19 warnings.
|
|
114
|
+
- **`rectBeamMomentCapacity(section)`** — Computes φMn for a rectangular RC beam (singly or doubly reinforced). Returns `phiMn` in kN·m with calculation details and ACI 318-19 warnings. `calculationDetails` reports `c`, `a`, `beta1`, `d`, `As` and `ro` for either section type, plus `d_`, `As_`, `fs_` and `ro_` when compression steel is present.
|
|
115
|
+
- **`rectBeamBarLayout(input)`** — Lays bar groups out into the minimum number of layers that satisfy ACI 318-19 25.2.1 / 25.2.2 spacing, and returns the resulting `d` and `d_` ready to feed into `rectBeamMomentCapacity`. `topBars` is optional; omit it for a section with no top reinforcement.
|
|
114
116
|
- **`concreteShearCapacity(section)`** — Computes φVc, the concrete contribution to shear capacity (ACI 318-19, 22.5.5.1).
|
|
115
117
|
- **`stirrupShearCapacity(section)`** — Computes φVs, the stirrup contribution to shear capacity (ACI 318-19, 22.5.10.5.3).
|
|
116
118
|
- **`checkStirrupRequirement(input)`** — Determines whether stirrups are required, and the required Av/s ratio and max spacing (ACI 318-19, 9.6.3.1, 9.6.3.3, 9.7.6.2.2).
|
|
117
119
|
|
|
118
120
|
### Strengthening
|
|
119
121
|
|
|
120
|
-
- **`calculateSteelJacketedBeamMomentCapacity(section, jacketedProperties)`** — Computes φMn for a beam strengthened with steel plate jacketing, as a `before` / `after` pair.
|
|
122
|
+
- **`calculateSteelJacketedBeamMomentCapacity(section, jacketedProperties)`** — Computes φMn for a beam strengthened with steel plate jacketing, as a `before` / `after` pair. The bottom plate is added to the tension steel and the top plate to the compression steel, which turns an originally singly reinforced section into a doubly reinforced one.
|
|
121
123
|
- **`plateInterfaceShearFlow(input)`** — Computes the shear flow `q = V·Q/I` (N/mm) to transfer across each concrete-to-plate interface, from a cracked (default) or uncracked elastic transformed section. Returns a per-plate `top` / `bottom` result, `null` where a plate is absent.
|
|
122
124
|
- **`boltShearCapacity(bolt)`** — Computes φVsa for one anchor bolt from the steel strength (ACI 318-19, 17.7.1.2b, φ per Table 17.5.3). Concrete breakout and pryout are not evaluated and must be checked separately.
|
|
123
125
|
- **`plateInterfaceBoltRequirement(input)`** — Computes the required bolt pitch and count at each interface, taking the larger of the shear-flow requirement (`s = n·φVbolt / q`) and the count needed to develop the full plate yield force, and reports which one governs.
|
|
124
126
|
|
|
125
127
|
Both plates are independently optional: a plate counts as present only when its width and thickness are both positive, so the same functions cover a bottom-only jacket and a top-and-bottom jacket. Use `hasTopPlate(props)` / `hasBottomPlate(props)` to test for presence.
|
|
126
128
|
|
|
129
|
+
Plates bolted to the sides of the web strengthen the beam in shear instead. ACI 318-19 has no provisions for steel side plates, so two independent models are offered and both return a `before` / `after` pair of `phiVn` (kN) for a continuous plate or discrete strips, with the plate contribution limited by the bolt anchorage and by the ACI 318-19 22.5.1.2 web-crushing cap. Use `hasSidePlate(props)` to test for presence.
|
|
130
|
+
|
|
131
|
+
- **`sidePlateShearCapacityByWebYielding(section, plates)`** — Takes each plate as a supplementary web reaching the von Mises shear yield stress `0.6·fy` (AISC 360 G2.1), and warns on plate slenderness beyond `2.24·√(Es/fy)`.
|
|
132
|
+
- **`sidePlateShearCapacityByTensionTie(section, plates)`** — Takes each plate as a tension tie crossing the diagonal crack, per the bonded shear reinforcement model of ACI 440.2R-17 §11.4 with steel in place of FRP: `ffe = min(fy, Es·0.004)` and `psi_f = 0.85`. Supports inclined strips.
|
|
133
|
+
|
|
134
|
+
ACI 440.2R-17 11.4.2 (spacing, which defers to the ACI 318 limits) and 11.4.3 (`Vs + Vf ≤ 0.66·√f'c·bw·d`) are verified against the guide; the subsections carrying the 0.004 strain cap and `psi_f` are still cited at §11.4 only. See the citation-status note at the top of `src/strengthening/rc-beam-side-plate-shear.ts`.
|
|
135
|
+
- **`compareSidePlateShearCapacity(section, plates)`** — Runs both models and reports the lower `phiVn` as `governing`; the intended entry point for a conservative design capacity.
|
|
136
|
+
|
|
127
137
|
### General Utilities
|
|
128
138
|
|
|
129
139
|
- **`concreteBeta(fc_)`** — ACI 318 β₁ factor
|
|
@@ -22,4 +22,11 @@ export declare const ANCHOR_STEEL_SHEAR_COEFFICIENT = 0.6;
|
|
|
22
22
|
export declare const ANCHOR_FUTA_FYA_FACTOR = 1.9;
|
|
23
23
|
export declare const MAX_ANCHOR_FUTA = 860;
|
|
24
24
|
export declare const MIN_ANCHOR_SPACING_DIAMETER_FACTOR = 4;
|
|
25
|
+
export declare const DEFAULT_PLATE_ELASTIC_MODULUS = 200000;
|
|
26
|
+
export declare const PLATE_SHEAR_YIELD_COEFFICIENT = 0.6;
|
|
27
|
+
export declare const PLATE_SHEAR_SLENDERNESS_COEFFICIENT = 2.24;
|
|
28
|
+
export declare const SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = 0.004;
|
|
29
|
+
export declare const SIDE_PLATE_REDUCTION_FACTOR_PSI = 0.85;
|
|
30
|
+
export declare const DEFAULT_SIDE_PLATE_SIDES = 2;
|
|
31
|
+
export declare const DEFAULT_SIDE_PLATE_ANGLE = 90;
|
|
25
32
|
export declare const MAX_PLATE_BOLT_SPACING = 300;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MAX_PLATE_BOLT_SPACING = exports.MIN_ANCHOR_SPACING_DIAMETER_FACTOR = exports.MAX_ANCHOR_FUTA = exports.ANCHOR_FUTA_FYA_FACTOR = exports.ANCHOR_STEEL_SHEAR_COEFFICIENT = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_AV_ABSOLUTE_COEFFICIENT = exports.MIN_AV_SQRT_FC_COEFFICIENT = exports.MAX_STIRRUP_SPACING_HIGH_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_HIGH_VS = exports.MAX_STIRRUP_SPACING_LOW_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_LOW_VS = exports.VS_SPACING_THRESHOLD_COEFFICIENT = exports.MAX_VS_COEFFICIENT = exports.SQRT_FC_SHEAR_LIMIT = exports.CONCRETE_SHEAR_VC_COEFFICIENT = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_LAYER_CLEAR_SPACING = exports.AGGREGATE_SPACING_FACTOR = exports.MIN_BAR_CLEAR_SPACING = exports.DEFAULT_MAX_AGGREGATE_SIZE = exports.DEFAULT_STIRRUP_DIAMETER = exports.DEFAULT_BEAM_COVER = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = void 0;
|
|
3
|
+
exports.MAX_PLATE_BOLT_SPACING = exports.DEFAULT_SIDE_PLATE_ANGLE = exports.DEFAULT_SIDE_PLATE_SIDES = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_SLENDERNESS_COEFFICIENT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.DEFAULT_PLATE_ELASTIC_MODULUS = exports.MIN_ANCHOR_SPACING_DIAMETER_FACTOR = exports.MAX_ANCHOR_FUTA = exports.ANCHOR_FUTA_FYA_FACTOR = exports.ANCHOR_STEEL_SHEAR_COEFFICIENT = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_AV_ABSOLUTE_COEFFICIENT = exports.MIN_AV_SQRT_FC_COEFFICIENT = exports.MAX_STIRRUP_SPACING_HIGH_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_HIGH_VS = exports.MAX_STIRRUP_SPACING_LOW_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_LOW_VS = exports.VS_SPACING_THRESHOLD_COEFFICIENT = exports.MAX_VS_COEFFICIENT = exports.SQRT_FC_SHEAR_LIMIT = exports.CONCRETE_SHEAR_VC_COEFFICIENT = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_LAYER_CLEAR_SPACING = exports.AGGREGATE_SPACING_FACTOR = exports.MIN_BAR_CLEAR_SPACING = exports.DEFAULT_MAX_AGGREGATE_SIZE = exports.DEFAULT_STIRRUP_DIAMETER = exports.DEFAULT_BEAM_COVER = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = void 0;
|
|
4
4
|
exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = 0.9;
|
|
5
5
|
exports.CONCRETE_ULTIMATE_STRAIN = 0.003;
|
|
6
6
|
// ACI 318-19 Table 20.6.1.3.1: cast-in-place beams, not exposed to weather or in contact with ground
|
|
@@ -41,6 +41,25 @@ exports.ANCHOR_FUTA_FYA_FACTOR = 1.9;
|
|
|
41
41
|
exports.MAX_ANCHOR_FUTA = 860; // MPa
|
|
42
42
|
// ACI 318-19 17.9.2: min center-to-center spacing of cast-in anchors = 4 * da
|
|
43
43
|
exports.MIN_ANCHOR_SPACING_DIAMETER_FACTOR = 4;
|
|
44
|
+
// Default elastic modulus of structural steel plate, used when the plate props omit Es
|
|
45
|
+
exports.DEFAULT_PLATE_ELASTIC_MODULUS = 200000; // MPa
|
|
46
|
+
// AISC 360 G2.1 / von Mises: shear yield stress of a steel web = 0.6 * Fy
|
|
47
|
+
exports.PLATE_SHEAR_YIELD_COEFFICIENT = 0.6;
|
|
48
|
+
// AISC 360 G2.1(a): a web of slenderness h/tw <= 2.24*sqrt(E/Fy) reaches shear
|
|
49
|
+
// yielding before shear buckling
|
|
50
|
+
exports.PLATE_SHEAR_SLENDERNESS_COEFFICIENT = 2.24; // * sqrt(Es / fy)
|
|
51
|
+
// ACI 440.2R-17, 11.4: effective strain in bonded shear reinforcement is capped
|
|
52
|
+
// to preserve aggregate interlock in the concrete. Subsection unverified — see the
|
|
53
|
+
// TODO in strengthening/rc-beam-side-plate-shear.ts.
|
|
54
|
+
exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = 0.004;
|
|
55
|
+
// ACI 440.2R-17, 11.4: additional reduction factor psi_f for two-sided bonded
|
|
56
|
+
// shear strengthening (not fully wrapped). Subsection unverified — see the TODO in
|
|
57
|
+
// strengthening/rc-beam-side-plate-shear.ts.
|
|
58
|
+
exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = 0.85;
|
|
59
|
+
// Both faces of the web plated, unless the caller says otherwise
|
|
60
|
+
exports.DEFAULT_SIDE_PLATE_SIDES = 2;
|
|
61
|
+
// Vertical strips, unless the caller gives an inclination
|
|
62
|
+
exports.DEFAULT_SIDE_PLATE_ANGLE = 90; // degrees from the beam axis
|
|
44
63
|
// Practical detailing limit on bolt pitch along a bonded strengthening plate,
|
|
45
64
|
// so the plate is restrained against local buckling / peeling between fasteners
|
|
46
65
|
exports.MAX_PLATE_BOLT_SPACING = 300; // mm
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc.constant.js","sourceRoot":"","sources":["../../../src/core/constants/rc.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,kCAAkC,GAAG,GAAG,CAAC;AACzC,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAE9C,qGAAqG;AACxF,QAAA,kBAAkB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AACtD,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,KAAK;AACpC,QAAA,0BAA0B,GAAG,EAAE,CAAC,CAAC,iCAAiC;AAE/E,wEAAwE;AAC3D,QAAA,qBAAqB,GAAG,EAAE,CAAC,CAAC,KAAK;AACjC,QAAA,wBAAwB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9C,uDAAuD;AAC1C,QAAA,uBAAuB,GAAG,EAAE,CAAC,CAAC,KAAK;AAEhD,yDAAyD;AAC5C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,kFAAkF;AACrE,QAAA,6BAA6B,GAAG,IAAI,CAAC;AAElD,gFAAgF;AAChF,6DAA6D;AAChD,QAAA,mBAAmB,GAAG,GAAG,CAAC,CAAC,MAAM;AAE9C,qEAAqE;AACxD,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAEvC,yFAAyF;AAC5E,QAAA,gCAAgC,GAAG,IAAI,CAAC,CAAC,uBAAuB;AAE7E,6EAA6E;AAChE,QAAA,0BAA0B,GAAG,GAAG,CAAC,CAAC,KAAK;AACvC,QAAA,uCAAuC,GAAG,GAAG,CAAC,CAAC,MAAM;AAElE,4EAA4E;AAC/D,QAAA,2BAA2B,GAAG,GAAG,CAAC,CAAC,KAAK;AACxC,QAAA,wCAAwC,GAAG,IAAI,CAAC,CAAC,MAAM;AAEpE,0FAA0F;AAC7E,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,2BAA2B,GAAG,IAAI,CAAC;AAEhD,+EAA+E;AAClE,QAAA,sCAAsC,GAAG,IAAI,CAAC;AAE3D,iDAAiD;AACpC,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAElD,qEAAqE;AACxD,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAC7B,QAAA,eAAe,GAAG,GAAG,CAAC,CAAC,MAAM;AAE1C,8EAA8E;AACjE,QAAA,kCAAkC,GAAG,CAAC,CAAC;AAEpD,8EAA8E;AAC9E,gFAAgF;AACnE,QAAA,sBAAsB,GAAG,GAAG,CAAC,CAAC,KAAK"}
|
|
1
|
+
{"version":3,"file":"rc.constant.js","sourceRoot":"","sources":["../../../src/core/constants/rc.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,kCAAkC,GAAG,GAAG,CAAC;AACzC,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAE9C,qGAAqG;AACxF,QAAA,kBAAkB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AACtD,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,KAAK;AACpC,QAAA,0BAA0B,GAAG,EAAE,CAAC,CAAC,iCAAiC;AAE/E,wEAAwE;AAC3D,QAAA,qBAAqB,GAAG,EAAE,CAAC,CAAC,KAAK;AACjC,QAAA,wBAAwB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9C,uDAAuD;AAC1C,QAAA,uBAAuB,GAAG,EAAE,CAAC,CAAC,KAAK;AAEhD,yDAAyD;AAC5C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,kFAAkF;AACrE,QAAA,6BAA6B,GAAG,IAAI,CAAC;AAElD,gFAAgF;AAChF,6DAA6D;AAChD,QAAA,mBAAmB,GAAG,GAAG,CAAC,CAAC,MAAM;AAE9C,qEAAqE;AACxD,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAEvC,yFAAyF;AAC5E,QAAA,gCAAgC,GAAG,IAAI,CAAC,CAAC,uBAAuB;AAE7E,6EAA6E;AAChE,QAAA,0BAA0B,GAAG,GAAG,CAAC,CAAC,KAAK;AACvC,QAAA,uCAAuC,GAAG,GAAG,CAAC,CAAC,MAAM;AAElE,4EAA4E;AAC/D,QAAA,2BAA2B,GAAG,GAAG,CAAC,CAAC,KAAK;AACxC,QAAA,wCAAwC,GAAG,IAAI,CAAC,CAAC,MAAM;AAEpE,0FAA0F;AAC7E,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,2BAA2B,GAAG,IAAI,CAAC;AAEhD,+EAA+E;AAClE,QAAA,sCAAsC,GAAG,IAAI,CAAC;AAE3D,iDAAiD;AACpC,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAElD,qEAAqE;AACxD,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAC7B,QAAA,eAAe,GAAG,GAAG,CAAC,CAAC,MAAM;AAE1C,8EAA8E;AACjE,QAAA,kCAAkC,GAAG,CAAC,CAAC;AAEpD,uFAAuF;AAC1E,QAAA,6BAA6B,GAAG,MAAM,CAAC,CAAC,MAAM;AAE3D,0EAA0E;AAC7D,QAAA,6BAA6B,GAAG,GAAG,CAAC;AAEjD,+EAA+E;AAC/E,iCAAiC;AACpB,QAAA,mCAAmC,GAAG,IAAI,CAAC,CAAC,kBAAkB;AAE3E,gFAAgF;AAChF,mFAAmF;AACnF,qDAAqD;AACxC,QAAA,iCAAiC,GAAG,KAAK,CAAC;AAEvD,8EAA8E;AAC9E,mFAAmF;AACnF,6CAA6C;AAChC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,iEAAiE;AACpD,QAAA,wBAAwB,GAAG,CAAC,CAAC;AAE1C,0DAA0D;AAC7C,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AAEzE,8EAA8E;AAC9E,gFAAgF;AACnE,QAAA,sBAAsB,GAAG,GAAG,CAAC,CAAC,KAAK"}
|
|
@@ -12,6 +12,13 @@ class RCDesignError extends Error {
|
|
|
12
12
|
exports.RCDesignError = RCDesignError;
|
|
13
13
|
exports.Errors = {
|
|
14
14
|
// 1XX : RC Beam Design Errors
|
|
15
|
+
/**
|
|
16
|
+
* @deprecated Never thrown since 1.4.0. A section whose compression steel
|
|
17
|
+
* lies below the neutral axis is valid — that steel acts in tension and
|
|
18
|
+
* `rectBeamMomentCapacity` now returns a reduced Mn with a warning instead.
|
|
19
|
+
* Retained so existing `Errors.COMP_STEEL_DISTANCE_OVER_AC` references and
|
|
20
|
+
* `code === 101` checks keep compiling; safe to delete in the next major.
|
|
21
|
+
*/
|
|
15
22
|
COMP_STEEL_DISTANCE_OVER_AC: {
|
|
16
23
|
code: 101,
|
|
17
24
|
message: "d' of compressive steel is greater than c, consider using singly reinforced section.",
|
|
@@ -49,5 +56,13 @@ exports.Errors = {
|
|
|
49
56
|
code: 204,
|
|
50
57
|
message: "No valid cracked neutral axis was found within the concrete depth; check the section and plate properties.",
|
|
51
58
|
},
|
|
59
|
+
SIDE_PLATE_GEOMETRY_INVALID: {
|
|
60
|
+
code: 205,
|
|
61
|
+
message: "Inconsistent side plate geometry; thickness, engaged depth, fy and sides must be positive, the depth must fit within the section, and a stripped layout requires a positive width and spacing.",
|
|
62
|
+
},
|
|
63
|
+
STRENGTHENED_SHEAR_NO_HEADROOM: {
|
|
64
|
+
code: 206,
|
|
65
|
+
message: "Existing Vs already reaches 0.66*sqrt(fc')*bw*d (ACI318-19, 22.5.1.2); the web crushes before any added side plate force can be developed, so shear strengthening cannot be realised on this section.",
|
|
66
|
+
},
|
|
52
67
|
};
|
|
53
68
|
//# sourceMappingURL=rc-design.error.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc-design.error.js","sourceRoot":"","sources":["../../../src/core/errors/rc-design.error.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IAItC,YAAY,MAAyB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE;QACxE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAVD,sCAUC;AAOY,QAAA,MAAM,GAAsC;IACvD,8BAA8B;
|
|
1
|
+
{"version":3,"file":"rc-design.error.js","sourceRoot":"","sources":["../../../src/core/errors/rc-design.error.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAc,SAAQ,KAAK;IAItC,YAAY,MAAyB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE;QACxE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAVD,sCAUC;AAOY,QAAA,MAAM,GAAsC;IACvD,8BAA8B;IAE9B;;;;;;OAMG;IACH,2BAA2B,EAAE;QAC3B,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,sFAAsF;KAChG;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,kEAAkE;KAC5E;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,iCAAiC,EAAE;QACjC,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,mEAAmE;KAC7E;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yGAAyG;KAC5G;IAED,4DAA4D;IAC5D,uBAAuB,EAAE;QACvB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,6GAA6G;KAChH;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,kGAAkG;KACrG;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gHAAgH;KACnH;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,2BAA2B,EAAE;QAC3B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gMAAgM;KACnM;IACD,8BAA8B,EAAE;QAC9B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,uMAAuM;KAC1M;CACF,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export type { RectBeamSection, RectSinglyBeamSection, RectDoublyBeamSection, RectShearSection, StirrupShearSection, ShearReinforcementCheckInput, RebarGroupInput, RectBeamBarLayoutInput, } from "./types/rc-beam.type";
|
|
2
2
|
export { isSinglyReinforced } from "./types/rc-beam.type";
|
|
3
|
-
export type { SteelJacketedProps, SectionState, PlateShearFlowInput, BoltProps, PlateInterfaceBoltInput, } from "./types/plate-jacketing.type";
|
|
4
|
-
export { hasTopPlate, hasBottomPlate } from "./types/plate-jacketing.type";
|
|
3
|
+
export type { SteelJacketedProps, SectionState, PlateShearFlowInput, BoltProps, PlateInterfaceBoltInput, SidePlateConfiguration, SidePlateAnchorage, SidePlateShearProps, } from "./types/plate-jacketing.type";
|
|
4
|
+
export { hasTopPlate, hasBottomPlate, hasSidePlate } from "./types/plate-jacketing.type";
|
|
5
5
|
export type { Warnings, calculationResult } from "./types/output-message.type";
|
|
6
6
|
export type { unit } from "./types/unit.type";
|
|
7
|
-
export { FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, } from "./constants/rc.constant";
|
|
7
|
+
export { FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, } from "./constants/rc.constant";
|
|
8
8
|
export { RCDesignError, Errors } from "./errors/rc-design.error";
|
package/dist/core/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Errors = exports.RCDesignError = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = void 0;
|
|
3
|
+
exports.Errors = exports.RCDesignError = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasSidePlate = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = void 0;
|
|
4
4
|
var rc_beam_type_1 = require("./types/rc-beam.type");
|
|
5
5
|
Object.defineProperty(exports, "isSinglyReinforced", { enumerable: true, get: function () { return rc_beam_type_1.isSinglyReinforced; } });
|
|
6
6
|
var plate_jacketing_type_1 = require("./types/plate-jacketing.type");
|
|
7
7
|
Object.defineProperty(exports, "hasTopPlate", { enumerable: true, get: function () { return plate_jacketing_type_1.hasTopPlate; } });
|
|
8
8
|
Object.defineProperty(exports, "hasBottomPlate", { enumerable: true, get: function () { return plate_jacketing_type_1.hasBottomPlate; } });
|
|
9
|
+
Object.defineProperty(exports, "hasSidePlate", { enumerable: true, get: function () { return plate_jacketing_type_1.hasSidePlate; } });
|
|
9
10
|
// Constants
|
|
10
11
|
var rc_constant_1 = require("./constants/rc.constant");
|
|
11
12
|
Object.defineProperty(exports, "FLEXURAL_STRENGTH_REDUCTION_FACTOR", { enumerable: true, get: function () { return rc_constant_1.FLEXURAL_STRENGTH_REDUCTION_FACTOR; } });
|
|
@@ -13,6 +14,9 @@ Object.defineProperty(exports, "CONCRETE_ULTIMATE_STRAIN", { enumerable: true, g
|
|
|
13
14
|
Object.defineProperty(exports, "SHEAR_STRENGTH_REDUCTION_FACTOR", { enumerable: true, get: function () { return rc_constant_1.SHEAR_STRENGTH_REDUCTION_FACTOR; } });
|
|
14
15
|
Object.defineProperty(exports, "ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR", { enumerable: true, get: function () { return rc_constant_1.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR; } });
|
|
15
16
|
Object.defineProperty(exports, "MAX_PLATE_BOLT_SPACING", { enumerable: true, get: function () { return rc_constant_1.MAX_PLATE_BOLT_SPACING; } });
|
|
17
|
+
Object.defineProperty(exports, "PLATE_SHEAR_YIELD_COEFFICIENT", { enumerable: true, get: function () { return rc_constant_1.PLATE_SHEAR_YIELD_COEFFICIENT; } });
|
|
18
|
+
Object.defineProperty(exports, "SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT", { enumerable: true, get: function () { return rc_constant_1.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT; } });
|
|
19
|
+
Object.defineProperty(exports, "SIDE_PLATE_REDUCTION_FACTOR_PSI", { enumerable: true, get: function () { return rc_constant_1.SIDE_PLATE_REDUCTION_FACTOR_PSI; } });
|
|
16
20
|
// Errors
|
|
17
21
|
var rc_design_error_1 = require("./errors/rc-design.error");
|
|
18
22
|
Object.defineProperty(exports, "RCDesignError", { enumerable: true, get: function () { return rc_design_error_1.RCDesignError; } });
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;AAW3B,qEAAyF;AAAhF,mHAAA,WAAW,OAAA;AAAE,sHAAA,cAAc,OAAA;AAAE,oHAAA,YAAY,OAAA;AAIlD,YAAY;AACZ,uDASiC;AAR/B,iIAAA,kCAAkC,OAAA;AAClC,uHAAA,wBAAwB,OAAA;AACxB,8HAAA,+BAA+B,OAAA;AAC/B,qIAAA,sCAAsC,OAAA;AACtC,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAC7B,gIAAA,iCAAiC,OAAA;AACjC,8HAAA,+BAA+B,OAAA;AAGjC,SAAS;AACT,4DAAiE;AAAxD,gHAAA,aAAa,OAAA;AAAE,yGAAA,MAAM,OAAA"}
|
|
@@ -33,3 +33,40 @@ export interface PlateInterfaceBoltInput extends PlateShearFlowInput {
|
|
|
33
33
|
boltsPerRow: number;
|
|
34
34
|
transferLength: number;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* How the side plates are laid out along the span.
|
|
38
|
+
*
|
|
39
|
+
* `"continuous"` is an unbroken plate over the strengthened length; `"strips"`
|
|
40
|
+
* are discrete plates of width `width` repeating at pitch `spacing`, acting like
|
|
41
|
+
* external stirrups.
|
|
42
|
+
*/
|
|
43
|
+
export type SidePlateConfiguration = "continuous" | "strips";
|
|
44
|
+
/**
|
|
45
|
+
* Bolt group anchoring the side plates to the web.
|
|
46
|
+
*
|
|
47
|
+
* `rowSpacing` is the horizontal pitch of the vertical bolt rows along the span;
|
|
48
|
+
* for a stripped layout it is normally the strip spacing itself. `boltsPerRow`
|
|
49
|
+
* counts the bolts in one vertical row, on one face of the beam.
|
|
50
|
+
*/
|
|
51
|
+
export interface SidePlateAnchorage {
|
|
52
|
+
bolt: BoltProps;
|
|
53
|
+
boltsPerRow: number;
|
|
54
|
+
rowSpacing: number;
|
|
55
|
+
}
|
|
56
|
+
export interface SidePlateShearProps {
|
|
57
|
+
fy: number;
|
|
58
|
+
Es?: number;
|
|
59
|
+
thickness: number;
|
|
60
|
+
depth: number;
|
|
61
|
+
configuration: SidePlateConfiguration;
|
|
62
|
+
width?: number;
|
|
63
|
+
spacing?: number;
|
|
64
|
+
angle?: number;
|
|
65
|
+
sides?: 1 | 2;
|
|
66
|
+
anchorage?: SidePlateAnchorage;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* A side plate counts as present only when both its thickness and engaged depth
|
|
70
|
+
* are positive.
|
|
71
|
+
*/
|
|
72
|
+
export declare function hasSidePlate(props: SidePlateShearProps): boolean;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.hasTopPlate = hasTopPlate;
|
|
4
4
|
exports.hasBottomPlate = hasBottomPlate;
|
|
5
|
+
exports.hasSidePlate = hasSidePlate;
|
|
5
6
|
/**
|
|
6
7
|
* A plate counts as present only when both its width and thickness are positive,
|
|
7
8
|
* so a bottom-only jacket may omit the top plate fields or pass them as zero.
|
|
@@ -12,4 +13,11 @@ function hasTopPlate(props) {
|
|
|
12
13
|
function hasBottomPlate(props) {
|
|
13
14
|
return (props.bottomSteelWidth ?? 0) > 0 && (props.bottomSteelThickness ?? 0) > 0;
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* A side plate counts as present only when both its thickness and engaged depth
|
|
18
|
+
* are positive.
|
|
19
|
+
*/
|
|
20
|
+
function hasSidePlate(props) {
|
|
21
|
+
return props.thickness > 0 && props.depth > 0;
|
|
22
|
+
}
|
|
15
23
|
//# sourceMappingURL=plate-jacketing.type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plate-jacketing.type.js","sourceRoot":"","sources":["../../../src/core/types/plate-jacketing.type.ts"],"names":[],"mappings":";;AAeA,kCAEC;AAED,wCAEC;
|
|
1
|
+
{"version":3,"file":"plate-jacketing.type.js","sourceRoot":"","sources":["../../../src/core/types/plate-jacketing.type.ts"],"names":[],"mappings":";;AAeA,kCAEC;AAED,wCAEC;AAiED,oCAEC;AA7ED;;;GAGG;AACH,SAAgB,WAAW,CAAC,KAAyB;IACnD,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,SAAgB,cAAc,CAAC,KAAyB;IACtD,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACpF,CAAC;AA6DD;;;GAGG;AACH,SAAgB,YAAY,CAAC,KAA0B;IACrD,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -36,10 +36,17 @@ export interface RebarGroupInput {
|
|
|
36
36
|
export interface RectBeamBarLayoutInput {
|
|
37
37
|
b: number;
|
|
38
38
|
h: number;
|
|
39
|
-
topBars
|
|
39
|
+
topBars?: RebarGroupInput;
|
|
40
40
|
bottomBars: RebarGroupInput;
|
|
41
41
|
cover?: number;
|
|
42
42
|
stirrupDiameter?: number;
|
|
43
43
|
maxAggregateSize?: number;
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* A section counts as singly reinforced when it carries no compression steel.
|
|
47
|
+
*
|
|
48
|
+
* `d_` is deliberately not sign-checked: it is measured from the extreme
|
|
49
|
+
* concrete compression fibre, so compression steel above that face — a steel
|
|
50
|
+
* plate bonded to the top of the beam — legitimately has `d_ <= 0`.
|
|
51
|
+
*/
|
|
45
52
|
export declare function isSinglyReinforced(section: RectBeamSection): section is RectSinglyBeamSection;
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSinglyReinforced = isSinglyReinforced;
|
|
4
|
+
/**
|
|
5
|
+
* A section counts as singly reinforced when it carries no compression steel.
|
|
6
|
+
*
|
|
7
|
+
* `d_` is deliberately not sign-checked: it is measured from the extreme
|
|
8
|
+
* concrete compression fibre, so compression steel above that face — a steel
|
|
9
|
+
* plate bonded to the top of the beam — legitimately has `d_ <= 0`.
|
|
10
|
+
*/
|
|
4
11
|
function isSinglyReinforced(section) {
|
|
5
|
-
return !("As_" in section) || !("d_" in section) || section.As_ <= 0
|
|
12
|
+
return !("As_" in section) || !("d_" in section) || section.As_ <= 0;
|
|
6
13
|
}
|
|
7
14
|
//# sourceMappingURL=rc-beam.type.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc-beam.type.js","sourceRoot":"","sources":["../../../src/core/types/rc-beam.type.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"rc-beam.type.js","sourceRoot":"","sources":["../../../src/core/types/rc-beam.type.ts"],"names":[],"mappings":";;AA2DA,gDAEC;AATD;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,OAAwB;IACzD,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { rectBeamMomentCapacity, rectBeamBarLayout, concreteShearCapacity, stirrupShearCapacity, checkStirrupRequirement, concreteBeta, concreteElasticModulus, psiToMpa, } from "./rc";
|
|
2
|
-
export { calculateSteelJacketedBeamMomentCapacity, plateInterfaceShearFlow, boltShearCapacity, plateInterfaceBoltRequirement, } from "./strengthening";
|
|
3
|
-
export type { RectBeamSection, RectSinglyBeamSection, RectDoublyBeamSection, RectShearSection, StirrupShearSection, ShearReinforcementCheckInput, RebarGroupInput, RectBeamBarLayoutInput, SteelJacketedProps, SectionState, PlateShearFlowInput, BoltProps, PlateInterfaceBoltInput, Warnings, calculationResult, unit, } from "./core";
|
|
4
|
-
export { isSinglyReinforced, hasTopPlate, hasBottomPlate, FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, RCDesignError, Errors, } from "./core";
|
|
2
|
+
export { calculateSteelJacketedBeamMomentCapacity, plateInterfaceShearFlow, boltShearCapacity, plateInterfaceBoltRequirement, sidePlateShearCapacityByWebYielding, sidePlateShearCapacityByTensionTie, compareSidePlateShearCapacity, } from "./strengthening";
|
|
3
|
+
export type { RectBeamSection, RectSinglyBeamSection, RectDoublyBeamSection, RectShearSection, StirrupShearSection, ShearReinforcementCheckInput, RebarGroupInput, RectBeamBarLayoutInput, SteelJacketedProps, SectionState, PlateShearFlowInput, BoltProps, PlateInterfaceBoltInput, SidePlateConfiguration, SidePlateAnchorage, SidePlateShearProps, Warnings, calculationResult, unit, } from "./core";
|
|
4
|
+
export { isSinglyReinforced, hasTopPlate, hasBottomPlate, hasSidePlate, FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, RCDesignError, Errors, } from "./core";
|
|
5
5
|
export { solveQuadratic, roundToDecimalPlaces, mergeWarnings } from "./utils";
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.mergeWarnings = exports.roundToDecimalPlaces = exports.solveQuadratic = exports.Errors = exports.RCDesignError = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = exports.plateInterfaceBoltRequirement = exports.boltShearCapacity = exports.plateInterfaceShearFlow = exports.calculateSteelJacketedBeamMomentCapacity = exports.psiToMpa = exports.concreteElasticModulus = exports.concreteBeta = exports.checkStirrupRequirement = exports.stirrupShearCapacity = exports.concreteShearCapacity = exports.rectBeamBarLayout = exports.rectBeamMomentCapacity = void 0;
|
|
3
|
+
exports.mergeWarnings = exports.roundToDecimalPlaces = exports.solveQuadratic = exports.Errors = exports.RCDesignError = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasSidePlate = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = exports.compareSidePlateShearCapacity = exports.sidePlateShearCapacityByTensionTie = exports.sidePlateShearCapacityByWebYielding = exports.plateInterfaceBoltRequirement = exports.boltShearCapacity = exports.plateInterfaceShearFlow = exports.calculateSteelJacketedBeamMomentCapacity = exports.psiToMpa = exports.concreteElasticModulus = exports.concreteBeta = exports.checkStirrupRequirement = exports.stirrupShearCapacity = exports.concreteShearCapacity = exports.rectBeamBarLayout = exports.rectBeamMomentCapacity = void 0;
|
|
4
4
|
// RC Beam Design
|
|
5
5
|
var rc_1 = require("./rc");
|
|
6
6
|
Object.defineProperty(exports, "rectBeamMomentCapacity", { enumerable: true, get: function () { return rc_1.rectBeamMomentCapacity; } });
|
|
@@ -17,15 +17,22 @@ Object.defineProperty(exports, "calculateSteelJacketedBeamMomentCapacity", { enu
|
|
|
17
17
|
Object.defineProperty(exports, "plateInterfaceShearFlow", { enumerable: true, get: function () { return strengthening_1.plateInterfaceShearFlow; } });
|
|
18
18
|
Object.defineProperty(exports, "boltShearCapacity", { enumerable: true, get: function () { return strengthening_1.boltShearCapacity; } });
|
|
19
19
|
Object.defineProperty(exports, "plateInterfaceBoltRequirement", { enumerable: true, get: function () { return strengthening_1.plateInterfaceBoltRequirement; } });
|
|
20
|
+
Object.defineProperty(exports, "sidePlateShearCapacityByWebYielding", { enumerable: true, get: function () { return strengthening_1.sidePlateShearCapacityByWebYielding; } });
|
|
21
|
+
Object.defineProperty(exports, "sidePlateShearCapacityByTensionTie", { enumerable: true, get: function () { return strengthening_1.sidePlateShearCapacityByTensionTie; } });
|
|
22
|
+
Object.defineProperty(exports, "compareSidePlateShearCapacity", { enumerable: true, get: function () { return strengthening_1.compareSidePlateShearCapacity; } });
|
|
20
23
|
var core_1 = require("./core");
|
|
21
24
|
Object.defineProperty(exports, "isSinglyReinforced", { enumerable: true, get: function () { return core_1.isSinglyReinforced; } });
|
|
22
25
|
Object.defineProperty(exports, "hasTopPlate", { enumerable: true, get: function () { return core_1.hasTopPlate; } });
|
|
23
26
|
Object.defineProperty(exports, "hasBottomPlate", { enumerable: true, get: function () { return core_1.hasBottomPlate; } });
|
|
27
|
+
Object.defineProperty(exports, "hasSidePlate", { enumerable: true, get: function () { return core_1.hasSidePlate; } });
|
|
24
28
|
Object.defineProperty(exports, "FLEXURAL_STRENGTH_REDUCTION_FACTOR", { enumerable: true, get: function () { return core_1.FLEXURAL_STRENGTH_REDUCTION_FACTOR; } });
|
|
25
29
|
Object.defineProperty(exports, "CONCRETE_ULTIMATE_STRAIN", { enumerable: true, get: function () { return core_1.CONCRETE_ULTIMATE_STRAIN; } });
|
|
26
30
|
Object.defineProperty(exports, "SHEAR_STRENGTH_REDUCTION_FACTOR", { enumerable: true, get: function () { return core_1.SHEAR_STRENGTH_REDUCTION_FACTOR; } });
|
|
27
31
|
Object.defineProperty(exports, "ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR", { enumerable: true, get: function () { return core_1.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR; } });
|
|
28
32
|
Object.defineProperty(exports, "MAX_PLATE_BOLT_SPACING", { enumerable: true, get: function () { return core_1.MAX_PLATE_BOLT_SPACING; } });
|
|
33
|
+
Object.defineProperty(exports, "PLATE_SHEAR_YIELD_COEFFICIENT", { enumerable: true, get: function () { return core_1.PLATE_SHEAR_YIELD_COEFFICIENT; } });
|
|
34
|
+
Object.defineProperty(exports, "SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT", { enumerable: true, get: function () { return core_1.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT; } });
|
|
35
|
+
Object.defineProperty(exports, "SIDE_PLATE_REDUCTION_FACTOR_PSI", { enumerable: true, get: function () { return core_1.SIDE_PLATE_REDUCTION_FACTOR_PSI; } });
|
|
29
36
|
Object.defineProperty(exports, "RCDesignError", { enumerable: true, get: function () { return core_1.RCDesignError; } });
|
|
30
37
|
Object.defineProperty(exports, "Errors", { enumerable: true, get: function () { return core_1.Errors; } });
|
|
31
38
|
// Utilities
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iBAAiB;AACjB,2BASc;AARZ,4GAAA,sBAAsB,OAAA;AACtB,uGAAA,iBAAiB,OAAA;AACjB,2GAAA,qBAAqB,OAAA;AACrB,0GAAA,oBAAoB,OAAA;AACpB,6GAAA,uBAAuB,OAAA;AACvB,kGAAA,YAAY,OAAA;AACZ,4GAAA,sBAAsB,OAAA;AACtB,8FAAA,QAAQ,OAAA;AAGV,gBAAgB;AAChB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iBAAiB;AACjB,2BASc;AARZ,4GAAA,sBAAsB,OAAA;AACtB,uGAAA,iBAAiB,OAAA;AACjB,2GAAA,qBAAqB,OAAA;AACrB,0GAAA,oBAAoB,OAAA;AACpB,6GAAA,uBAAuB,OAAA;AACvB,kGAAA,YAAY,OAAA;AACZ,4GAAA,sBAAsB,OAAA;AACtB,8FAAA,QAAQ,OAAA;AAGV,gBAAgB;AAChB,iDAQyB;AAPvB,yIAAA,wCAAwC,OAAA;AACxC,wHAAA,uBAAuB,OAAA;AACvB,kHAAA,iBAAiB,OAAA;AACjB,8HAAA,6BAA6B,OAAA;AAC7B,oIAAA,mCAAmC,OAAA;AACnC,mIAAA,kCAAkC,OAAA;AAClC,8HAAA,6BAA6B,OAAA;AA0B/B,+BAegB;AAdd,0GAAA,kBAAkB,OAAA;AAClB,mGAAA,WAAW,OAAA;AACX,sGAAA,cAAc,OAAA;AACd,oGAAA,YAAY,OAAA;AACZ,0HAAA,kCAAkC,OAAA;AAClC,gHAAA,wBAAwB,OAAA;AACxB,uHAAA,+BAA+B,OAAA;AAC/B,8HAAA,sCAAsC,OAAA;AACtC,8GAAA,sBAAsB,OAAA;AACtB,qHAAA,6BAA6B,OAAA;AAC7B,yHAAA,iCAAiC,OAAA;AACjC,uHAAA,+BAA+B,OAAA;AAC/B,qGAAA,aAAa,OAAA;AACb,8FAAA,MAAM,OAAA;AAGR,YAAY;AACZ,iCAA8E;AAArE,uGAAA,cAAc,OAAA;AAAE,6GAAA,oBAAoB,OAAA;AAAE,sGAAA,aAAa,OAAA"}
|
|
@@ -8,10 +8,11 @@ import { Warnings } from "../core/types/output-message.type";
|
|
|
8
8
|
* the top (compression) face so they plug directly into
|
|
9
9
|
* {@link rectBeamMomentCapacity}'s `d` / `d_` inputs.
|
|
10
10
|
*
|
|
11
|
-
* @param input - Section dimensions,
|
|
12
|
-
* cover / stirrup diameter / max aggregate size (
|
|
13
|
-
* Table 20.6.1.3.1 values for cast-in-place beams not
|
|
14
|
-
* or in contact with ground)
|
|
11
|
+
* @param input - Section dimensions, the bottom bar group, and optional
|
|
12
|
+
* `topBars` / cover / stirrup diameter / max aggregate size (the last three
|
|
13
|
+
* default to ACI 318-19 Table 20.6.1.3.1 values for cast-in-place beams not
|
|
14
|
+
* exposed to weather or in contact with ground). Omit `topBars` for a section
|
|
15
|
+
* with no top reinforcement; `d_` is then 0.
|
|
15
16
|
* @returns `d`, `d_`, per-group layer counts and areas, `unit`, and `warnings`
|
|
16
17
|
* @throws {RCDesignError} If a bar does not fit within the section width, or
|
|
17
18
|
* if the combined top/bottom layers exceed the section height
|
package/dist/rc/rc-bar-layout.js
CHANGED
|
@@ -86,10 +86,11 @@ const calculateBarGroupLayout = (group, b, cover, stirrupDiameter, maxAggregateS
|
|
|
86
86
|
* the top (compression) face so they plug directly into
|
|
87
87
|
* {@link rectBeamMomentCapacity}'s `d` / `d_` inputs.
|
|
88
88
|
*
|
|
89
|
-
* @param input - Section dimensions,
|
|
90
|
-
* cover / stirrup diameter / max aggregate size (
|
|
91
|
-
* Table 20.6.1.3.1 values for cast-in-place beams not
|
|
92
|
-
* or in contact with ground)
|
|
89
|
+
* @param input - Section dimensions, the bottom bar group, and optional
|
|
90
|
+
* `topBars` / cover / stirrup diameter / max aggregate size (the last three
|
|
91
|
+
* default to ACI 318-19 Table 20.6.1.3.1 values for cast-in-place beams not
|
|
92
|
+
* exposed to weather or in contact with ground). Omit `topBars` for a section
|
|
93
|
+
* with no top reinforcement; `d_` is then 0.
|
|
93
94
|
* @returns `d`, `d_`, per-group layer counts and areas, `unit`, and `warnings`
|
|
94
95
|
* @throws {RCDesignError} If a bar does not fit within the section width, or
|
|
95
96
|
* if the combined top/bottom layers exceed the section height
|
|
@@ -99,7 +100,7 @@ const rectBeamBarLayout = (input) => {
|
|
|
99
100
|
const cover = input.cover ?? RCConstants.DEFAULT_BEAM_COVER;
|
|
100
101
|
const stirrupDiameter = input.stirrupDiameter ?? RCConstants.DEFAULT_STIRRUP_DIAMETER;
|
|
101
102
|
const maxAggregateSize = input.maxAggregateSize ?? RCConstants.DEFAULT_MAX_AGGREGATE_SIZE;
|
|
102
|
-
const top = calculateBarGroupLayout(input.topBars, input.b, cover, stirrupDiameter, maxAggregateSize);
|
|
103
|
+
const top = calculateBarGroupLayout(input.topBars ?? { count: 0, diameter: 0 }, input.b, cover, stirrupDiameter, maxAggregateSize);
|
|
103
104
|
const bottom = calculateBarGroupLayout(input.bottomBars, input.b, cover, stirrupDiameter, maxAggregateSize);
|
|
104
105
|
if (top.outerExtent + bottom.outerExtent > input.h) {
|
|
105
106
|
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.BAR_LAYOUT_EXCEEDS_SECTION_HEIGHT);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc-bar-layout.js","sourceRoot":"","sources":["../../src/rc/rc-bar-layout.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,sEAAyE;AACzE,wDAA0C;AAM1C,6EAA+D;AAU/D;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,CAC9B,KAAsB,EACtB,CAAS,EACT,KAAa,EACb,eAAuB,EACvB,gBAAwB,EACR,EAAE;IAClB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAElC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,OAAO;YACL,cAAc,EAAE,CAAC;YACjB,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,EAAE,EAAE,CAAC;SACN,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC9B,WAAW,CAAC,qBAAqB,EACjC,QAAQ,EACR,WAAW,CAAC,wBAAwB,GAAG,gBAAgB,CACxD,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC9B,KAAK,EACL,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,GAAG,eAAe,CAAC,CAAC,CAC9E,CAAC;IAEF,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,+BAAa,CAAC,wBAAM,CAAC,0BAA0B,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,KAAK,GAAG,cAAc,CAAC;IACzC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CACxD,CAAC;IAEF,MAAM,UAAU,GAAG,QAAQ,GAAG,WAAW,CAAC,uBAAuB,CAAC;IAClE,MAAM,kBAAkB,GAAG,KAAK,GAAG,eAAe,GAAG,QAAQ,GAAG,CAAC,CAAC;IAElE,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,kBAAkB,GAAG,CAAC,GAAG,UAAU,CAAC,EAC9D,CAAC,CACF,CAAC;IAEF,OAAO;QACL,cAAc;QACd,YAAY;QACZ,gBAAgB,EAAE,WAAW,GAAG,KAAK;QACrC,WAAW,EACT,KAAK;YACL,eAAe;YACf,cAAc,GAAG,QAAQ;YACzB,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,uBAAuB;QAC5D,EAAE,EAAE,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC;KAC1C,CAAC;AACJ,CAAC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"rc-bar-layout.js","sourceRoot":"","sources":["../../src/rc/rc-bar-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,39 @@
|
|
|
1
1
|
import { RectBeamSection, RectShearSection, StirrupShearSection, ShearReinforcementCheckInput } from "../core/types/rc-beam.type";
|
|
2
2
|
import { Warnings } from "../core/types/output-message.type";
|
|
3
|
+
/**
|
|
4
|
+
* Shape of `rectBeamMomentCapacity`'s `calculationDetails`. The first six keys
|
|
5
|
+
* are reported for every section; the rest only when compression steel is
|
|
6
|
+
* present, so callers need not branch on the section type to read the common
|
|
7
|
+
* ones.
|
|
8
|
+
*/
|
|
9
|
+
type MomentCalculationDetails = {
|
|
10
|
+
c: number;
|
|
11
|
+
a: number;
|
|
12
|
+
beta1: number;
|
|
13
|
+
d: number;
|
|
14
|
+
As: number;
|
|
15
|
+
ro: number;
|
|
16
|
+
d_?: number;
|
|
17
|
+
As_?: number;
|
|
18
|
+
fs_?: number;
|
|
19
|
+
ro_?: number;
|
|
20
|
+
};
|
|
3
21
|
/**
|
|
4
22
|
* Calculates the nominal moment capacity (φMn) of a rectangular RC beam section.
|
|
5
23
|
*
|
|
6
24
|
* Supports both singly and doubly reinforced sections. Automatically determines
|
|
7
25
|
* the reinforcement configuration from the input and applies ACI 318-19 checks.
|
|
8
26
|
*
|
|
27
|
+
* Compression steel below the neutral axis is handled by strain compatibility —
|
|
28
|
+
* it acts in tension and reduces Mn, with a warning — rather than rejected.
|
|
29
|
+
*
|
|
9
30
|
* @param section - Beam cross-section properties (singly or doubly reinforced)
|
|
10
31
|
* @returns Object containing `phiMn` (kN·m), `calculationDetails`, `unit`, and `warnings`
|
|
11
|
-
* @throws {RCDesignError}
|
|
32
|
+
* @throws {RCDesignError} 102 if the section is not tension controlled
|
|
12
33
|
*/
|
|
13
34
|
export declare const rectBeamMomentCapacity: (section: RectBeamSection) => {
|
|
14
35
|
phiMn: number;
|
|
15
|
-
calculationDetails:
|
|
36
|
+
calculationDetails: MomentCalculationDetails;
|
|
16
37
|
unit: string;
|
|
17
38
|
warnings: Warnings;
|
|
18
39
|
};
|
|
@@ -73,3 +94,4 @@ export declare const checkStirrupRequirement: (input: ShearReinforcementCheckInp
|
|
|
73
94
|
unit: string;
|
|
74
95
|
warnings: Warnings;
|
|
75
96
|
};
|
|
97
|
+
export {};
|
|
@@ -45,16 +45,15 @@ const general_1 = require("./general");
|
|
|
45
45
|
* Supports both singly and doubly reinforced sections. Automatically determines
|
|
46
46
|
* the reinforcement configuration from the input and applies ACI 318-19 checks.
|
|
47
47
|
*
|
|
48
|
+
* Compression steel below the neutral axis is handled by strain compatibility —
|
|
49
|
+
* it acts in tension and reduces Mn, with a warning — rather than rejected.
|
|
50
|
+
*
|
|
48
51
|
* @param section - Beam cross-section properties (singly or doubly reinforced)
|
|
49
52
|
* @returns Object containing `phiMn` (kN·m), `calculationDetails`, `unit`, and `warnings`
|
|
50
|
-
* @throws {RCDesignError}
|
|
53
|
+
* @throws {RCDesignError} 102 if the section is not tension controlled
|
|
51
54
|
*/
|
|
52
55
|
const rectBeamMomentCapacity = (section) => {
|
|
53
56
|
const warnings = [];
|
|
54
|
-
const concreteUltimateStrain = RCConstants.CONCRETE_ULTIMATE_STRAIN;
|
|
55
|
-
const steelYieldStrain = section.fy / section.Es;
|
|
56
|
-
const beta1 = (0, general_1.concreteBeta)(section.fc_);
|
|
57
|
-
const Ec = (0, general_1.concreteElasticModulus)(section.fc_);
|
|
58
57
|
const minSteel = Math.max((0.25 * Math.sqrt(section.fc_) * section.b * section.d) / section.fy, (1.4 * section.b * section.d) / section.fy);
|
|
59
58
|
if (section.As < minSteel) {
|
|
60
59
|
// Add a warning if the area of steel is less than the minimum required.
|
|
@@ -256,7 +255,7 @@ const checkStirrupRequirement = (input) => {
|
|
|
256
255
|
};
|
|
257
256
|
exports.checkStirrupRequirement = checkStirrupRequirement;
|
|
258
257
|
const calculateRectSinglyMn = (singlySection) => {
|
|
259
|
-
const { Es, fy, fc_, As, b,
|
|
258
|
+
const { Es, fy, fc_, As, b, d } = singlySection;
|
|
260
259
|
const warnings = [];
|
|
261
260
|
const steelYieldStrain = fy / Es;
|
|
262
261
|
const Ac = (As * fy) / (0.85 * fc_);
|
|
@@ -271,35 +270,74 @@ const calculateRectSinglyMn = (singlySection) => {
|
|
|
271
270
|
return {
|
|
272
271
|
Mn: As * fy * (d - y_) * 0.001 * 0.001, // Convert to kN-m
|
|
273
272
|
calculationDetails: {
|
|
274
|
-
|
|
273
|
+
c: MyMath.roundToDecimalPlaces(c, 2),
|
|
274
|
+
a: MyMath.roundToDecimalPlaces(a, 2),
|
|
275
|
+
beta1: MyMath.roundToDecimalPlaces(beta1, 3),
|
|
276
|
+
d: d,
|
|
277
|
+
As: As,
|
|
278
|
+
ro: MyMath.roundToDecimalPlaces(As / (b * d), 6),
|
|
275
279
|
},
|
|
276
280
|
warnings: warnings,
|
|
277
281
|
};
|
|
278
282
|
};
|
|
279
283
|
const calculateRectDoublyMn = (doublySection) => {
|
|
280
|
-
const { Es, fy, fc_, As, As_, b,
|
|
284
|
+
const { Es, fy, fc_, As, As_, b, d, d_ } = doublySection;
|
|
281
285
|
const warnings = [];
|
|
282
286
|
const steelYieldStrain = fy / Es;
|
|
283
287
|
const beta1 = (0, general_1.concreteBeta)(fc_);
|
|
284
|
-
//
|
|
285
|
-
//
|
|
288
|
+
// Compression-positive: negative once d_ falls below the neutral axis, where
|
|
289
|
+
// the "compression" steel is really in tension.
|
|
290
|
+
const compressionSteelStrainAt = (neutralAxis) => (RCConstants.CONCRETE_ULTIMATE_STRAIN * (neutralAxis - d_)) / neutralAxis;
|
|
291
|
+
// Tension-positive, the opposite convention.
|
|
292
|
+
const tensileSteelStrainAt = (neutralAxis) => (RCConstants.CONCRETE_ULTIMATE_STRAIN * (d - neutralAxis)) / neutralAxis;
|
|
293
|
+
// First solve assuming the compression steel stays elastic and the tensile
|
|
294
|
+
// steel yields, so its force is Es * strain: solve for c by quadratic.
|
|
286
295
|
const A = 0.85 * fc_ * b * beta1;
|
|
287
296
|
const B = RCConstants.CONCRETE_ULTIMATE_STRAIN * As_ * Es - As * fy;
|
|
288
297
|
const C = -RCConstants.CONCRETE_ULTIMATE_STRAIN * As_ * Es * d_;
|
|
289
|
-
|
|
290
|
-
|
|
298
|
+
// Compression steel above the concrete face (a top plate) makes d_ negative,
|
|
299
|
+
// and both roots are then positive — so pick the root the elastic assumption
|
|
300
|
+
// actually holds for rather than simply the larger one.
|
|
301
|
+
const roots = MyMath.solveQuadratic(A, B, C).filter((root) => root > 0);
|
|
302
|
+
const elasticRoot = roots.find((root) => Math.abs(Es * compressionSteelStrainAt(root)) <= fy);
|
|
303
|
+
let c;
|
|
304
|
+
let fs_;
|
|
305
|
+
if (elasticRoot !== undefined) {
|
|
306
|
+
c = elasticRoot;
|
|
307
|
+
fs_ = Es * compressionSteelStrainAt(c);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
// No solution keeps the compression steel elastic, so re-solve equilibrium
|
|
311
|
+
// with it at its yield stress (ACI318-19, 20.2.2.4). Steel below the
|
|
312
|
+
// neutral axis yields in tension instead, reversing the sign.
|
|
313
|
+
const yieldsInCompression = roots.length === 0 || compressionSteelStrainAt(roots[0]) > 0;
|
|
314
|
+
fs_ = yieldsInCompression ? fy : -fy;
|
|
315
|
+
c = ((As - (yieldsInCompression ? As_ : -As_)) * fy) / (0.85 * fc_ * b * beta1);
|
|
316
|
+
}
|
|
317
|
+
if (c <= 0) {
|
|
318
|
+
// Compression steel alone outweighs the tension steel: no equilibrium
|
|
319
|
+
// exists with the tension steel yielding, so the section is not tension
|
|
320
|
+
// controlled by definition.
|
|
321
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.TENSILE_STEEL_NOT_YIELDING);
|
|
322
|
+
}
|
|
291
323
|
const a = c * beta1;
|
|
292
|
-
const tensileSteelStrain = (
|
|
293
|
-
const compressionSteelStrain = (RCConstants.CONCRETE_ULTIMATE_STRAIN * (c - d_)) / c;
|
|
324
|
+
const tensileSteelStrain = tensileSteelStrainAt(c);
|
|
294
325
|
if (tensileSteelStrain < steelYieldStrain + RCConstants.CONCRETE_ULTIMATE_STRAIN) {
|
|
295
326
|
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.TENSILE_STEEL_NOT_YIELDING);
|
|
296
327
|
}
|
|
328
|
+
// A section whose compression steel sits below the neutral axis is still a
|
|
329
|
+
// valid section — that steel simply acts in tension and reduces Mn, which
|
|
330
|
+
// the negative fs_ already accounts for. Warn rather than reject it.
|
|
297
331
|
if (d_ > c) {
|
|
298
|
-
|
|
332
|
+
warnings.push({
|
|
333
|
+
reference: "ACI318-19, 22.2.1.2",
|
|
334
|
+
message: `d' (${MyMath.roundToDecimalPlaces(d_, 2)} mm) > c (${MyMath.roundToDecimalPlaces(c, 2)} mm): ` +
|
|
335
|
+
`the compression steel lies below the neutral axis and acts in tension ` +
|
|
336
|
+
`(fs' = ${MyMath.roundToDecimalPlaces(fs_, 2)} MPa), reducing Mn.`,
|
|
337
|
+
});
|
|
299
338
|
}
|
|
300
339
|
const y_ = a / 2;
|
|
301
340
|
const Ac = b * a;
|
|
302
|
-
const fs_ = Es * compressionSteelStrain;
|
|
303
341
|
return {
|
|
304
342
|
Mn: (0.85 * fc_ * Ac * (d - y_) + As_ * fs_ * (d - d_)) * 0.001 * 0.001, // Convert to kN-m
|
|
305
343
|
calculationDetails: {
|
|
@@ -312,7 +350,9 @@ const calculateRectDoublyMn = (doublySection) => {
|
|
|
312
350
|
As_: As_,
|
|
313
351
|
fs_: MyMath.roundToDecimalPlaces(fs_, 2),
|
|
314
352
|
ro: MyMath.roundToDecimalPlaces(As / (b * d), 6),
|
|
315
|
-
|
|
353
|
+
// Compression reinforcement ratio on the same basis as ro, so the two are
|
|
354
|
+
// directly comparable.
|
|
355
|
+
ro_: MyMath.roundToDecimalPlaces(As_ / (b * d), 6),
|
|
316
356
|
},
|
|
317
357
|
warnings: warnings,
|
|
318
358
|
};
|