@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.
Files changed (35) hide show
  1. package/README.md +13 -3
  2. package/dist/core/constants/rc.constant.d.ts +7 -0
  3. package/dist/core/constants/rc.constant.js +20 -1
  4. package/dist/core/constants/rc.constant.js.map +1 -1
  5. package/dist/core/errors/rc-design.error.js +15 -0
  6. package/dist/core/errors/rc-design.error.js.map +1 -1
  7. package/dist/core/index.d.ts +3 -3
  8. package/dist/core/index.js +5 -1
  9. package/dist/core/index.js.map +1 -1
  10. package/dist/core/types/plate-jacketing.type.d.ts +37 -0
  11. package/dist/core/types/plate-jacketing.type.js +8 -0
  12. package/dist/core/types/plate-jacketing.type.js.map +1 -1
  13. package/dist/core/types/rc-beam.type.d.ts +8 -1
  14. package/dist/core/types/rc-beam.type.js +8 -1
  15. package/dist/core/types/rc-beam.type.js.map +1 -1
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +8 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/rc/rc-bar-layout.d.ts +5 -4
  20. package/dist/rc/rc-bar-layout.js +6 -5
  21. package/dist/rc/rc-bar-layout.js.map +1 -1
  22. package/dist/rc/rc-beam-design.d.ts +24 -2
  23. package/dist/rc/rc-beam-design.js +57 -17
  24. package/dist/rc/rc-beam-design.js.map +1 -1
  25. package/dist/strengthening/index.d.ts +1 -0
  26. package/dist/strengthening/index.js +5 -1
  27. package/dist/strengthening/index.js.map +1 -1
  28. package/dist/strengthening/rc-beam-plate-interface-bolts.js.map +1 -1
  29. package/dist/strengthening/rc-beam-side-plate-shear.d.ts +254 -0
  30. package/dist/strengthening/rc-beam-side-plate-shear.js +420 -0
  31. package/dist/strengthening/rc-beam-side-plate-shear.js.map +1 -0
  32. package/dist/strengthening/rc-beam-steel-plate-jacketing.d.ts +32 -3
  33. package/dist/strengthening/rc-beam-steel-plate-jacketing.js +30 -21
  34. package/dist/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -1
  35. 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
- │ └── rc-beam-plate-interface-bolts.ts # Interface shear flow and required interface bolts
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;IAC9B,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;CACF,CAAC"}
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"}
@@ -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";
@@ -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; } });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;AAQ3B,qEAA2E;AAAlE,mHAAA,WAAW,OAAA;AAAE,sHAAA,cAAc,OAAA;AAIpC,YAAY;AACZ,uDAMiC;AAL/B,iIAAA,kCAAkC,OAAA;AAClC,uHAAA,wBAAwB,OAAA;AACxB,8HAAA,+BAA+B,OAAA;AAC/B,qIAAA,sCAAsC,OAAA;AACtC,qHAAA,sBAAsB,OAAA;AAGxB,SAAS;AACT,4DAAiE;AAAxD,gHAAA,aAAa,OAAA;AAAE,yGAAA,MAAM,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;AAVD;;;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"}
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: RebarGroupInput;
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 || section.d_ <= 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":";;AAoDA,gDAEC;AAFD,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,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AAC1F,CAAC"}
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,iDAKyB;AAJvB,yIAAA,wCAAwC,OAAA;AACxC,wHAAA,uBAAuB,OAAA;AACvB,kHAAA,iBAAiB,OAAA;AACjB,8HAAA,6BAA6B,OAAA;AAuB/B,+BAWgB;AAVd,0GAAA,kBAAkB,OAAA;AAClB,mGAAA,WAAW,OAAA;AACX,sGAAA,cAAc,OAAA;AACd,0HAAA,kCAAkC,OAAA;AAClC,gHAAA,wBAAwB,OAAA;AACxB,uHAAA,+BAA+B,OAAA;AAC/B,8HAAA,sCAAsC,OAAA;AACtC,8GAAA,sBAAsB,OAAA;AACtB,qGAAA,aAAa,OAAA;AACb,8FAAA,MAAM,OAAA;AAGR,YAAY;AACZ,iCAA8E;AAArE,uGAAA,cAAc,OAAA;AAAE,6GAAA,oBAAoB,OAAA;AAAE,sGAAA,aAAa,OAAA"}
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, top/bottom bar groups, and optional
12
- * cover / stirrup diameter / max aggregate size (default to ACI 318-19
13
- * Table 20.6.1.3.1 values for cast-in-place beams not exposed to weather
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
@@ -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, top/bottom bar groups, and optional
90
- * cover / stirrup diameter / max aggregate size (default to ACI 318-19
91
- * Table 20.6.1.3.1 values for cast-in-place beams not exposed to weather
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;;;;;;;;;;;;;;;GAeG;AACI,MAAM,iBAAiB,GAAG,CAAC,KAA6B,EAAE,EAAE;IACjE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,kBAAkB,CAAC;IAC5D,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,WAAW,CAAC,wBAAwB,CAAC;IACtF,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,IAAI,WAAW,CAAC,0BAA0B,CAAC;IAE1F,MAAM,GAAG,GAAG,uBAAuB,CACjC,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,CAAC,EACP,KAAK,EACL,eAAe,EACf,gBAAgB,CACjB,CAAC;IACF,MAAM,MAAM,GAAG,uBAAuB,CACpC,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,CAAC,EACP,KAAK,EACL,eAAe,EACf,gBAAgB,CACjB,CAAC;IAEF,IAAI,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,+BAAa,CAAC,wBAAM,CAAC,iCAAiC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACpE,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACxD,GAAG,EAAE;YACH,cAAc,EAAE,GAAG,CAAC,cAAc;YAClC,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;SAC3C;QACD,MAAM,EAAE;YACN,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;SAC9C;QACD,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,QAAQ;KACnB,CAAC;AACJ,CAAC,CAAC;AAzCW,QAAA,iBAAiB,qBAyC5B"}
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} If the tensile steel does not yield
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: any;
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} If the tensile steel does not yield
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, h, d } = singlySection;
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
- ro: As / (b * d),
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, h, d, d_ } = doublySection;
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
- // Assume Compression steel is not yielding and tensile steel is yielding.
285
- // Solving for c using quadratic equation
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
- const quadResults = MyMath.solveQuadratic(A, B, C);
290
- const c = Math.max(...quadResults); // Take the maximum root for c
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 = (RCConstants.CONCRETE_ULTIMATE_STRAIN * (d - c)) / c;
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
- throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.COMP_STEEL_DISTANCE_OVER_AC);
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
- ro_: MyMath.roundToDecimalPlaces(As_ / (b * (h - d_)), 6), // TODO: check if this is correct
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
  };