@theerapat-s28/ts-structural-eng-tools 1.4.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 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)
@@ -125,6 +126,14 @@ Summarised below; see the [full API reference](https://theerapat-s28.github.io/t
125
126
 
126
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.
127
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
+
128
137
  ### General Utilities
129
138
 
130
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"}
@@ -56,5 +56,13 @@ exports.Errors = {
56
56
  code: 204,
57
57
  message: "No valid cracked neutral axis was found within the concrete depth; check the section and plate properties.",
58
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
+ },
59
67
  };
60
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;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;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"}
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"}
@@ -1,2 +1,3 @@
1
1
  export { calculateSteelJacketedBeamMomentCapacity } from "./rc-beam-steel-plate-jacketing";
2
2
  export { plateInterfaceShearFlow, boltShearCapacity, plateInterfaceBoltRequirement, } from "./rc-beam-plate-interface-bolts";
3
+ export { sidePlateShearCapacityByWebYielding, sidePlateShearCapacityByTensionTie, compareSidePlateShearCapacity, } from "./rc-beam-side-plate-shear";
@@ -1,10 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.plateInterfaceBoltRequirement = exports.boltShearCapacity = exports.plateInterfaceShearFlow = exports.calculateSteelJacketedBeamMomentCapacity = void 0;
3
+ exports.compareSidePlateShearCapacity = exports.sidePlateShearCapacityByTensionTie = exports.sidePlateShearCapacityByWebYielding = exports.plateInterfaceBoltRequirement = exports.boltShearCapacity = exports.plateInterfaceShearFlow = exports.calculateSteelJacketedBeamMomentCapacity = void 0;
4
4
  var rc_beam_steel_plate_jacketing_1 = require("./rc-beam-steel-plate-jacketing");
5
5
  Object.defineProperty(exports, "calculateSteelJacketedBeamMomentCapacity", { enumerable: true, get: function () { return rc_beam_steel_plate_jacketing_1.calculateSteelJacketedBeamMomentCapacity; } });
6
6
  var rc_beam_plate_interface_bolts_1 = require("./rc-beam-plate-interface-bolts");
7
7
  Object.defineProperty(exports, "plateInterfaceShearFlow", { enumerable: true, get: function () { return rc_beam_plate_interface_bolts_1.plateInterfaceShearFlow; } });
8
8
  Object.defineProperty(exports, "boltShearCapacity", { enumerable: true, get: function () { return rc_beam_plate_interface_bolts_1.boltShearCapacity; } });
9
9
  Object.defineProperty(exports, "plateInterfaceBoltRequirement", { enumerable: true, get: function () { return rc_beam_plate_interface_bolts_1.plateInterfaceBoltRequirement; } });
10
+ var rc_beam_side_plate_shear_1 = require("./rc-beam-side-plate-shear");
11
+ Object.defineProperty(exports, "sidePlateShearCapacityByWebYielding", { enumerable: true, get: function () { return rc_beam_side_plate_shear_1.sidePlateShearCapacityByWebYielding; } });
12
+ Object.defineProperty(exports, "sidePlateShearCapacityByTensionTie", { enumerable: true, get: function () { return rc_beam_side_plate_shear_1.sidePlateShearCapacityByTensionTie; } });
13
+ Object.defineProperty(exports, "compareSidePlateShearCapacity", { enumerable: true, get: function () { return rc_beam_side_plate_shear_1.compareSidePlateShearCapacity; } });
10
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strengthening/index.ts"],"names":[],"mappings":";;;AAAA,iFAA2F;AAAlF,yJAAA,wCAAwC,OAAA;AACjD,iFAIyC;AAHvC,wIAAA,uBAAuB,OAAA;AACvB,kIAAA,iBAAiB,OAAA;AACjB,8IAAA,6BAA6B,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strengthening/index.ts"],"names":[],"mappings":";;;AAAA,iFAA2F;AAAlF,yJAAA,wCAAwC,OAAA;AACjD,iFAIyC;AAHvC,wIAAA,uBAAuB,OAAA;AACvB,kIAAA,iBAAiB,OAAA;AACjB,8IAAA,6BAA6B,OAAA;AAE/B,uEAIoC;AAHlC,+IAAA,mCAAmC,OAAA;AACnC,8IAAA,kCAAkC,OAAA;AAClC,yIAAA,6BAA6B,OAAA"}
@@ -0,0 +1,254 @@
1
+ import { StirrupShearSection } from "../core/types/rc-beam.type";
2
+ import { SidePlateShearProps } from "../core/types/plate-jacketing.type";
3
+ /**
4
+ * Shear capacity of a beam strengthened with bolted steel side plates, treating
5
+ * each plate as a supplementary web that resists in-plane shear.
6
+ *
7
+ * The plate reaches the von Mises shear yield stress of 0.6 fy (AISC 360 G2.1):
8
+ *
9
+ * - continuous: `Vp = nSides · 0.6 fy · tp · dp`
10
+ * - strips: `Vp = nSides · 0.6 fy · tp · dp · wp / s`
11
+ *
12
+ * Strips are handled as the fraction `wp / s` of a continuous web, which is an
13
+ * approximation — a discrete strip works more as a tension tie than as a web
14
+ * panel, which is what `sidePlateShearCapacityByTensionTie` models. Run both and
15
+ * take the lower value, or call `compareSidePlateShearCapacity`.
16
+ *
17
+ * ACI 318-19 has no provisions for steel side plates in shear; a warning always
18
+ * says so.
19
+ *
20
+ * @param section - Original beam shear properties (fc_, bw, d, Av, fyt, s, optional lambda)
21
+ * @param plates - Side plate geometry, strength, layout, and optional anchorage
22
+ * @returns `before` and `after` results, each with `phiVn` (kN), `calculationDetails`,
23
+ * `unit`, and `warnings`; `after` also carries `phiVp` and `governedBy`
24
+ * @throws {RCDesignError} 205 if the plate geometry is inconsistent, 206 if the
25
+ * existing Vs leaves no headroom under the ACI 318-19 22.5.1.2 maximum, 202 if
26
+ * the supplied bolt capacity is invalid
27
+ */
28
+ export declare const sidePlateShearCapacityByWebYielding: (section: StirrupShearSection, plates: SidePlateShearProps) => {
29
+ method: "webYielding" | "tensionTie";
30
+ before: {
31
+ phiVn: number;
32
+ calculationDetails: {
33
+ phiVc: number;
34
+ phiVs: number;
35
+ Vc: number;
36
+ Vs: number;
37
+ };
38
+ unit: string;
39
+ warnings: {
40
+ reference?: string;
41
+ message: string;
42
+ }[];
43
+ };
44
+ after: {
45
+ phiVn: number;
46
+ phiVp: number;
47
+ governedBy: "plateCapacity" | "anchorage" | "webCrushing";
48
+ calculationDetails: {
49
+ phiVc: number;
50
+ phiVs: number;
51
+ Vp: number;
52
+ VpEffective: number;
53
+ maxVs: number;
54
+ headroom: number;
55
+ phiVpPlate: number;
56
+ phiVanchorage: number | null;
57
+ anchorageRows: number | null;
58
+ phiVbolt: number | null;
59
+ sides: number;
60
+ coverageRatio: number;
61
+ } & {
62
+ tauY: number;
63
+ slenderness: number;
64
+ slendernessLimit: number;
65
+ };
66
+ unit: string;
67
+ warnings: {
68
+ reference?: string;
69
+ message: string;
70
+ }[];
71
+ };
72
+ };
73
+ /**
74
+ * Shear capacity of a beam strengthened with bolted steel side plates, treating
75
+ * each plate as a tension tie crossing the diagonal crack, following the bonded
76
+ * shear reinforcement model of ACI 440.2R-17 §11.4 with steel in place of FRP:
77
+ *
78
+ * `Vp = nSides · tp · wp · ffe · (sin α + cos α) · dp / s`
79
+ *
80
+ * with `ffe = min(fy, Es · 0.004)` — the 0.004 strain cap of 440.2R §11.4, which
81
+ * keeps the crack tight enough for aggregate interlock — and the additional
82
+ * reduction factor `psi_f = 0.85` for two-sided bonded strengthening. A continuous
83
+ * plate is the case `wp = s`, `α = 90°`.
84
+ *
85
+ * Note that for structural steel `Es · 0.004 = 800 MPa` sits above any normal `fy`,
86
+ * so the strain cap does not bind and the tie reaches yield; this model therefore
87
+ * usually returns a higher capacity than `sidePlateShearCapacityByWebYielding` for
88
+ * a continuous plate. Neither is code-sanctioned for steel side plates — a warning
89
+ * always says so.
90
+ *
91
+ * @param section - Original beam shear properties (fc_, bw, d, Av, fyt, s, optional lambda)
92
+ * @param plates - Side plate geometry, strength, layout, and optional anchorage
93
+ * @returns `before` and `after` results, each with `phiVn` (kN), `calculationDetails`,
94
+ * `unit`, and `warnings`; `after` also carries `phiVp` and `governedBy`
95
+ * @throws {RCDesignError} 205 if the plate geometry is inconsistent, 206 if the
96
+ * existing Vs leaves no headroom under the ACI 318-19 22.5.1.2 maximum, 202 if
97
+ * the supplied bolt capacity is invalid
98
+ */
99
+ export declare const sidePlateShearCapacityByTensionTie: (section: StirrupShearSection, plates: SidePlateShearProps) => {
100
+ method: "webYielding" | "tensionTie";
101
+ before: {
102
+ phiVn: number;
103
+ calculationDetails: {
104
+ phiVc: number;
105
+ phiVs: number;
106
+ Vc: number;
107
+ Vs: number;
108
+ };
109
+ unit: string;
110
+ warnings: {
111
+ reference?: string;
112
+ message: string;
113
+ }[];
114
+ };
115
+ after: {
116
+ phiVn: number;
117
+ phiVp: number;
118
+ governedBy: "plateCapacity" | "anchorage" | "webCrushing";
119
+ calculationDetails: {
120
+ phiVc: number;
121
+ phiVs: number;
122
+ Vp: number;
123
+ VpEffective: number;
124
+ maxVs: number;
125
+ headroom: number;
126
+ phiVpPlate: number;
127
+ phiVanchorage: number | null;
128
+ anchorageRows: number | null;
129
+ phiVbolt: number | null;
130
+ sides: number;
131
+ coverageRatio: number;
132
+ } & {
133
+ ffe: number;
134
+ strainLimitedStress: number;
135
+ orientation: number;
136
+ psi: number;
137
+ };
138
+ unit: string;
139
+ warnings: {
140
+ reference?: string;
141
+ message: string;
142
+ }[];
143
+ };
144
+ };
145
+ /**
146
+ * Runs both side plate shear models on the same section and reports the lower
147
+ * result as governing, which is the intended entry point when selecting a
148
+ * conservative design capacity.
149
+ *
150
+ * @param section - Original beam shear properties (fc_, bw, d, Av, fyt, s, optional lambda)
151
+ * @param plates - Side plate geometry, strength, layout, and optional anchorage
152
+ * @returns `webYielding` and `tensionTie` results plus `governing`, holding the
153
+ * lower `phiVn`, its `phiVp`, and the `method` that produced it
154
+ * @throws {RCDesignError} Whatever either model throws — see their documentation
155
+ */
156
+ export declare const compareSidePlateShearCapacity: (section: StirrupShearSection, plates: SidePlateShearProps) => {
157
+ webYielding: {
158
+ method: "webYielding" | "tensionTie";
159
+ before: {
160
+ phiVn: number;
161
+ calculationDetails: {
162
+ phiVc: number;
163
+ phiVs: number;
164
+ Vc: number;
165
+ Vs: number;
166
+ };
167
+ unit: string;
168
+ warnings: {
169
+ reference?: string;
170
+ message: string;
171
+ }[];
172
+ };
173
+ after: {
174
+ phiVn: number;
175
+ phiVp: number;
176
+ governedBy: "plateCapacity" | "anchorage" | "webCrushing";
177
+ calculationDetails: {
178
+ phiVc: number;
179
+ phiVs: number;
180
+ Vp: number;
181
+ VpEffective: number;
182
+ maxVs: number;
183
+ headroom: number;
184
+ phiVpPlate: number;
185
+ phiVanchorage: number | null;
186
+ anchorageRows: number | null;
187
+ phiVbolt: number | null;
188
+ sides: number;
189
+ coverageRatio: number;
190
+ } & {
191
+ tauY: number;
192
+ slenderness: number;
193
+ slendernessLimit: number;
194
+ };
195
+ unit: string;
196
+ warnings: {
197
+ reference?: string;
198
+ message: string;
199
+ }[];
200
+ };
201
+ };
202
+ tensionTie: {
203
+ method: "webYielding" | "tensionTie";
204
+ before: {
205
+ phiVn: number;
206
+ calculationDetails: {
207
+ phiVc: number;
208
+ phiVs: number;
209
+ Vc: number;
210
+ Vs: number;
211
+ };
212
+ unit: string;
213
+ warnings: {
214
+ reference?: string;
215
+ message: string;
216
+ }[];
217
+ };
218
+ after: {
219
+ phiVn: number;
220
+ phiVp: number;
221
+ governedBy: "plateCapacity" | "anchorage" | "webCrushing";
222
+ calculationDetails: {
223
+ phiVc: number;
224
+ phiVs: number;
225
+ Vp: number;
226
+ VpEffective: number;
227
+ maxVs: number;
228
+ headroom: number;
229
+ phiVpPlate: number;
230
+ phiVanchorage: number | null;
231
+ anchorageRows: number | null;
232
+ phiVbolt: number | null;
233
+ sides: number;
234
+ coverageRatio: number;
235
+ } & {
236
+ ffe: number;
237
+ strainLimitedStress: number;
238
+ orientation: number;
239
+ psi: number;
240
+ };
241
+ unit: string;
242
+ warnings: {
243
+ reference?: string;
244
+ message: string;
245
+ }[];
246
+ };
247
+ };
248
+ governing: {
249
+ method: "webYielding" | "tensionTie";
250
+ phiVn: number;
251
+ phiVp: number;
252
+ governedBy: "plateCapacity" | "anchorage" | "webCrushing";
253
+ };
254
+ };
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.compareSidePlateShearCapacity = exports.sidePlateShearCapacityByTensionTie = exports.sidePlateShearCapacityByWebYielding = void 0;
37
+ const rc_design_error_1 = require("../core/errors/rc-design.error");
38
+ const MyMath = __importStar(require("../utils/math"));
39
+ const RCConstants = __importStar(require("../core/constants/rc.constant"));
40
+ const rc_beam_design_1 = require("../rc/rc-beam-design");
41
+ const rc_beam_plate_interface_bolts_1 = require("./rc-beam-plate-interface-bolts");
42
+ const plate_jacketing_type_1 = require("../core/types/plate-jacketing.type");
43
+ const resolveSidePlateGeometry = (plates) => {
44
+ const sides = plates.sides ?? RCConstants.DEFAULT_SIDE_PLATE_SIDES;
45
+ const Es = plates.Es ?? RCConstants.DEFAULT_PLATE_ELASTIC_MODULUS;
46
+ const strips = plates.configuration === "strips";
47
+ // A continuous plate is the limiting case of strips with wp = s, so it carries
48
+ // a coverage ratio of 1 and the vertical orientation the model assumes.
49
+ const wp = strips ? (plates.width ?? 0) : null;
50
+ const s = strips ? (plates.spacing ?? 0) : null;
51
+ const angle = strips
52
+ ? (plates.angle ?? RCConstants.DEFAULT_SIDE_PLATE_ANGLE)
53
+ : RCConstants.DEFAULT_SIDE_PLATE_ANGLE;
54
+ return {
55
+ sides,
56
+ tp: plates.thickness,
57
+ dp: plates.depth,
58
+ wp,
59
+ s,
60
+ coverageRatio: strips && s !== null && s > 0 ? wp / s : 1,
61
+ angleRad: (angle * Math.PI) / 180,
62
+ Es,
63
+ fy: plates.fy,
64
+ configuration: plates.configuration,
65
+ };
66
+ };
67
+ const validateSidePlateGeometry = (section, plates, geo) => {
68
+ if (!(0, plate_jacketing_type_1.hasSidePlate)(plates) ||
69
+ geo.fy <= 0 ||
70
+ geo.Es <= 0 ||
71
+ (geo.sides !== 1 && geo.sides !== 2) ||
72
+ section.bw <= 0 ||
73
+ section.d <= 0 ||
74
+ geo.dp > section.d) {
75
+ throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.SIDE_PLATE_GEOMETRY_INVALID);
76
+ }
77
+ if (geo.configuration === "strips") {
78
+ const wp = geo.wp ?? 0;
79
+ const s = geo.s ?? 0;
80
+ // A strip wider than its pitch is a continuous plate described wrongly, and
81
+ // an inclination outside (0, 90] has no meaning in the tie model.
82
+ if (wp <= 0 || s <= 0 || wp > s || geo.angleRad <= 0 || geo.angleRad > Math.PI / 2) {
83
+ throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.SIDE_PLATE_GEOMETRY_INVALID);
84
+ }
85
+ }
86
+ if (plates.anchorage !== undefined) {
87
+ const { boltsPerRow, rowSpacing } = plates.anchorage;
88
+ if (boltsPerRow <= 0 || rowSpacing <= 0) {
89
+ throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.SIDE_PLATE_GEOMETRY_INVALID);
90
+ }
91
+ }
92
+ };
93
+ /**
94
+ * Shear capacity of the section before strengthening: φVc + φVs.
95
+ *
96
+ * A section with no stirrups (`Av <= 0` or `s <= 0`) contributes φVs = 0 rather
97
+ * than dividing by a zero spacing.
98
+ *
99
+ * An existing Vs beyond the ACI 318-19 22.5.1.2 maximum reaches `stirrupShearCapacity`
100
+ * as error 105 ("section too small for shear"). In the strengthening context the
101
+ * useful diagnosis is the more specific one — the web is already at its ceiling, so
102
+ * no added plate force can be developed — so it is re-thrown as 206.
103
+ */
104
+ const baselineShearCapacity = (section) => {
105
+ const concrete = (0, rc_beam_design_1.concreteShearCapacity)(section);
106
+ const hasStirrups = section.Av > 0 && section.s > 0;
107
+ let stirrups;
108
+ if (hasStirrups) {
109
+ try {
110
+ stirrups = (0, rc_beam_design_1.stirrupShearCapacity)(section);
111
+ }
112
+ catch (error) {
113
+ if (error instanceof rc_design_error_1.RCDesignError && error.code === rc_design_error_1.Errors.SHEAR_STRENGTH_EXCEEDS_MAX.code) {
114
+ throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.STRENGTHENED_SHEAR_NO_HEADROOM);
115
+ }
116
+ throw error;
117
+ }
118
+ }
119
+ else {
120
+ stirrups = { phiVs: 0, calculationDetails: { Vs: 0 }, warnings: [] };
121
+ }
122
+ return {
123
+ phiVn: MyMath.roundToDecimalPlaces(concrete.phiVc + stirrups.phiVs, 2),
124
+ phiVc: concrete.phiVc,
125
+ phiVs: stirrups.phiVs,
126
+ Vc: concrete.calculationDetails.Vc,
127
+ Vs: stirrups.calculationDetails.Vs,
128
+ warnings: [...concrete.warnings, ...stirrups.warnings],
129
+ };
130
+ };
131
+ /**
132
+ * Design strength the bolt group can drag into the concrete across a 45° crack.
133
+ *
134
+ * The crack's horizontal projection is taken as `dp`, so the rows anchoring the
135
+ * plate beyond it number `floor(dp / rowSpacing)`, at least one — the same
136
+ * `dfv / sf` counting ACI 440.2R uses for bonded shear reinforcement.
137
+ *
138
+ * The returned value already carries the anchor φ of 0.65 from `boltShearCapacity`,
139
+ * so it is compared against the plate's φVp on a design-strength basis.
140
+ */
141
+ const anchorageCapacity = (anchorage, geo, warnings) => {
142
+ const boltResult = (0, rc_beam_plate_interface_bolts_1.boltShearCapacity)(anchorage.bolt);
143
+ warnings.push(...boltResult.warnings);
144
+ const exactRows = geo.dp / anchorage.rowSpacing;
145
+ const rows = Math.max(1, Math.floor(exactRows));
146
+ if (exactRows < 1) {
147
+ warnings.push({
148
+ message: `Bolt row spacing (${anchorage.rowSpacing} mm) exceeds the engaged plate depth (${geo.dp} mm); only one row was taken as crossing the assumed 45 degree crack.`,
149
+ });
150
+ }
151
+ // Same minimum anchor spacing `plateInterfaceBoltRequirement` checks, so the two
152
+ // strengthening paths hold bolt layouts to one rule.
153
+ if (anchorage.bolt.diameter !== undefined) {
154
+ const minSpacing = RCConstants.MIN_ANCHOR_SPACING_DIAMETER_FACTOR * anchorage.bolt.diameter;
155
+ if (anchorage.rowSpacing < minSpacing) {
156
+ warnings.push({
157
+ reference: "ACI318-19, 17.9.2",
158
+ message: `Bolt row spacing (${anchorage.rowSpacing} mm) is below the minimum anchor spacing of 4*da (${minSpacing} mm); use a larger pitch, a smaller bolt, or fewer rows.`,
159
+ });
160
+ }
161
+ }
162
+ return {
163
+ phiVanchorage: MyMath.roundToDecimalPlaces(geo.sides * rows * anchorage.boltsPerRow * boltResult.phiVbolt, 2),
164
+ rows,
165
+ phiVbolt: boltResult.phiVbolt,
166
+ boltsPerRow: anchorage.boltsPerRow,
167
+ };
168
+ };
169
+ /** Detailing and modelling warnings shared by both capacity models. */
170
+ const collectCommonWarnings = (section, plates, geo, warnings) => {
171
+ warnings.push({
172
+ message: "ACI 318-19 contains no provisions for steel side plates in shear; this capacity is an engineering model, not a code-sanctioned calculation, and must be confirmed against test data or a specialist review.",
173
+ });
174
+ if (geo.dp < section.d) {
175
+ warnings.push({
176
+ message: `Engaged plate depth dp (${geo.dp} mm) is less than the effective depth d (${section.d} mm); only the plated depth was taken as resisting shear.`,
177
+ });
178
+ }
179
+ // Strip pitch is checked against ACI 318-19 9.7.6.2.2 alone, in `assembleResult`
180
+ // where Vp is known. ACI 440.2R-17 11.4.2 defers to the ACI 318 limits for internal
181
+ // steel shear reinforcement rather than imposing its own, so that one check
182
+ // satisfies both documents. (The `wf + d/4` rule of ACI 440.2R-08 did not survive
183
+ // into the 2017 edition and is deliberately not applied.)
184
+ if (geo.sides === 1) {
185
+ warnings.push({
186
+ message: "A plate on one face only loads the section eccentrically; the resulting torsion and out-of-plane twist are not captured by this in-plane shear model and must be assessed separately.",
187
+ });
188
+ }
189
+ if (plates.anchorage === undefined) {
190
+ warnings.push({
191
+ message: "No anchorage was supplied, so the reported capacity assumes the plate is fully developed; the bolt group or bond must be checked separately.",
192
+ });
193
+ }
194
+ };
195
+ /**
196
+ * Applies the ACI 318-19 22.5.1.2 web crushing cap and the anchorage limit, then
197
+ * assembles the `before`/`after` result both models return.
198
+ *
199
+ * The cap `Vs + Vp <= 0.66 sqrt(fc') bw d` — mirrored for bonded shear
200
+ * strengthening by ACI 440.2R-17 11.4.3, Eq. (11.4.3) — is a property of the concrete web, so
201
+ * it limits the plate force the web can host rather than invalidating the design:
202
+ * the plate contribution is truncated to the remaining headroom and a warning
203
+ * says so. Only a section whose existing Vs already exhausts the cap throws,
204
+ * because there no strengthening at all can be developed.
205
+ *
206
+ * @param VpNominal - Plate nominal shear contribution in N, before φ and before
207
+ * any model-specific reduction factor
208
+ * @param reductionFactor - Model-specific factor applied to the plate term only
209
+ * (1.0 for web yielding, psi_f for the tension tie)
210
+ */
211
+ const assembleResult = (section, plates, geo, VpNominal, reductionFactor, method, modelDetails, warnings) => {
212
+ const before = baselineShearCapacity(section);
213
+ const baseWarnings = [...before.warnings, ...warnings];
214
+ const VpModelKN = VpNominal * reductionFactor * 0.001;
215
+ const maxVsKN = RCConstants.MAX_VS_COEFFICIENT * Math.sqrt(section.fc_) * section.bw * section.d * 0.001;
216
+ const headroomKN = maxVsKN - before.Vs;
217
+ if (headroomKN <= 0) {
218
+ throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.STRENGTHENED_SHEAR_NO_HEADROOM);
219
+ }
220
+ const VpEffectiveKN = Math.min(VpModelKN, headroomKN);
221
+ const webCrushingGoverns = VpEffectiveKN < VpModelKN;
222
+ if (webCrushingGoverns) {
223
+ baseWarnings.push({
224
+ reference: "ACI318-19, 22.5.1.2",
225
+ message: `Plate contribution of ${MyMath.roundToDecimalPlaces(VpModelKN, 2)} kN truncated to the remaining web capacity of ${MyMath.roundToDecimalPlaces(headroomKN, 2)} kN, so that Vs + Vp stays within 0.66*sqrt(fc')*bw*d (${MyMath.roundToDecimalPlaces(maxVsKN, 2)} kN); a thinner or shallower plate carries the section just as far.`,
226
+ });
227
+ }
228
+ // ACI 318-19 9.7.6.2.2 halves the permitted spacing once the shear reinforcement
229
+ // carries more than 0.33*sqrt(fc')*bw*d. The plate is what usually pushes a section
230
+ // over that threshold, so the limit is keyed off Vs + Vp rather than Vs alone.
231
+ if (geo.configuration === "strips" && geo.s !== null) {
232
+ const sqrtFc = Math.sqrt(section.fc_);
233
+ const vsThresholdKN = RCConstants.VS_SPACING_THRESHOLD_COEFFICIENT * sqrtFc * section.bw * section.d * 0.001;
234
+ const highShear = before.Vs + VpEffectiveKN > vsThresholdKN;
235
+ const maxSpacing = highShear
236
+ ? Math.min(RCConstants.MAX_STIRRUP_SPACING_HIGH_VS_DEPTH_FACTOR * section.d, RCConstants.MAX_STIRRUP_SPACING_HIGH_VS)
237
+ : Math.min(RCConstants.MAX_STIRRUP_SPACING_LOW_VS_DEPTH_FACTOR * section.d, RCConstants.MAX_STIRRUP_SPACING_LOW_VS);
238
+ if (geo.s > maxSpacing) {
239
+ baseWarnings.push({
240
+ reference: "ACI318-19, 9.7.6.2.2",
241
+ message: `Strip pitch (${geo.s} mm) exceeds the maximum shear reinforcement spacing of ${MyMath.roundToDecimalPlaces(maxSpacing, 2)} mm${highShear ? `, tightened because Vs + Vp (${MyMath.roundToDecimalPlaces(before.Vs + VpEffectiveKN, 2)} kN) exceeds 0.33*sqrt(fc')*bw*d (${MyMath.roundToDecimalPlaces(vsThresholdKN, 2)} kN)` : ""}; a diagonal crack can pass between strips without crossing one.`,
242
+ });
243
+ }
244
+ }
245
+ const phiVpPlate = MyMath.roundToDecimalPlaces(RCConstants.SHEAR_STRENGTH_REDUCTION_FACTOR * VpEffectiveKN, 2);
246
+ const anchorage = plates.anchorage !== undefined ? anchorageCapacity(plates.anchorage, geo, baseWarnings) : null;
247
+ const anchorageGoverns = anchorage !== null && anchorage.phiVanchorage < phiVpPlate;
248
+ const phiVp = anchorageGoverns
249
+ ? anchorage.phiVanchorage
250
+ : phiVpPlate;
251
+ let governedBy = "plateCapacity";
252
+ if (anchorageGoverns) {
253
+ governedBy = "anchorage";
254
+ }
255
+ else if (webCrushingGoverns) {
256
+ governedBy = "webCrushing";
257
+ }
258
+ return {
259
+ method,
260
+ before: {
261
+ phiVn: before.phiVn,
262
+ calculationDetails: {
263
+ phiVc: before.phiVc,
264
+ phiVs: before.phiVs,
265
+ Vc: before.Vc,
266
+ Vs: before.Vs,
267
+ },
268
+ unit: "kN",
269
+ warnings: before.warnings,
270
+ },
271
+ after: {
272
+ phiVn: MyMath.roundToDecimalPlaces(before.phiVn + phiVp, 2),
273
+ phiVp: MyMath.roundToDecimalPlaces(phiVp, 2),
274
+ governedBy,
275
+ calculationDetails: {
276
+ phiVc: before.phiVc,
277
+ phiVs: before.phiVs,
278
+ Vp: MyMath.roundToDecimalPlaces(VpModelKN, 2),
279
+ VpEffective: MyMath.roundToDecimalPlaces(VpEffectiveKN, 2),
280
+ maxVs: MyMath.roundToDecimalPlaces(maxVsKN, 2),
281
+ headroom: MyMath.roundToDecimalPlaces(headroomKN, 2),
282
+ phiVpPlate,
283
+ phiVanchorage: anchorage !== null ? anchorage.phiVanchorage : null,
284
+ anchorageRows: anchorage !== null ? anchorage.rows : null,
285
+ phiVbolt: anchorage !== null ? anchorage.phiVbolt : null,
286
+ sides: geo.sides,
287
+ coverageRatio: MyMath.roundToDecimalPlaces(geo.coverageRatio, 4),
288
+ ...modelDetails,
289
+ },
290
+ unit: "kN",
291
+ warnings: baseWarnings,
292
+ },
293
+ };
294
+ };
295
+ /**
296
+ * Shear capacity of a beam strengthened with bolted steel side plates, treating
297
+ * each plate as a supplementary web that resists in-plane shear.
298
+ *
299
+ * The plate reaches the von Mises shear yield stress of 0.6 fy (AISC 360 G2.1):
300
+ *
301
+ * - continuous: `Vp = nSides · 0.6 fy · tp · dp`
302
+ * - strips: `Vp = nSides · 0.6 fy · tp · dp · wp / s`
303
+ *
304
+ * Strips are handled as the fraction `wp / s` of a continuous web, which is an
305
+ * approximation — a discrete strip works more as a tension tie than as a web
306
+ * panel, which is what `sidePlateShearCapacityByTensionTie` models. Run both and
307
+ * take the lower value, or call `compareSidePlateShearCapacity`.
308
+ *
309
+ * ACI 318-19 has no provisions for steel side plates in shear; a warning always
310
+ * says so.
311
+ *
312
+ * @param section - Original beam shear properties (fc_, bw, d, Av, fyt, s, optional lambda)
313
+ * @param plates - Side plate geometry, strength, layout, and optional anchorage
314
+ * @returns `before` and `after` results, each with `phiVn` (kN), `calculationDetails`,
315
+ * `unit`, and `warnings`; `after` also carries `phiVp` and `governedBy`
316
+ * @throws {RCDesignError} 205 if the plate geometry is inconsistent, 206 if the
317
+ * existing Vs leaves no headroom under the ACI 318-19 22.5.1.2 maximum, 202 if
318
+ * the supplied bolt capacity is invalid
319
+ */
320
+ const sidePlateShearCapacityByWebYielding = (section, plates) => {
321
+ const warnings = [];
322
+ const geo = resolveSidePlateGeometry(plates);
323
+ validateSidePlateGeometry(section, plates, geo);
324
+ collectCommonWarnings(section, plates, geo, warnings);
325
+ const tauY = RCConstants.PLATE_SHEAR_YIELD_COEFFICIENT * geo.fy; // MPa
326
+ const VpNominal = geo.sides * tauY * geo.tp * geo.dp * geo.coverageRatio; // N
327
+ // AISC 360 G2.1(a): beyond this slenderness the panel buckles in shear before it
328
+ // yields. The concrete restrains the inner face, so this is a warning, not a limit.
329
+ const slenderness = geo.dp / geo.tp;
330
+ const slendernessLimit = RCConstants.PLATE_SHEAR_SLENDERNESS_COEFFICIENT * Math.sqrt(geo.Es / geo.fy);
331
+ if (slenderness > slendernessLimit) {
332
+ warnings.push({
333
+ reference: "AISC360-22, G2.1",
334
+ message: `Plate slenderness dp/tp (${MyMath.roundToDecimalPlaces(slenderness, 1)}) exceeds 2.24*sqrt(Es/fy) (${MyMath.roundToDecimalPlaces(slendernessLimit, 1)}); shear buckling may precede yielding unless the plate is stiffened or continuously restrained by the concrete.`,
335
+ });
336
+ }
337
+ return assembleResult(section, plates, geo, VpNominal, 1.0, "webYielding", {
338
+ tauY: MyMath.roundToDecimalPlaces(tauY, 2),
339
+ slenderness: MyMath.roundToDecimalPlaces(slenderness, 1),
340
+ slendernessLimit: MyMath.roundToDecimalPlaces(slendernessLimit, 1),
341
+ }, warnings);
342
+ };
343
+ exports.sidePlateShearCapacityByWebYielding = sidePlateShearCapacityByWebYielding;
344
+ /**
345
+ * Shear capacity of a beam strengthened with bolted steel side plates, treating
346
+ * each plate as a tension tie crossing the diagonal crack, following the bonded
347
+ * shear reinforcement model of ACI 440.2R-17 §11.4 with steel in place of FRP:
348
+ *
349
+ * `Vp = nSides · tp · wp · ffe · (sin α + cos α) · dp / s`
350
+ *
351
+ * with `ffe = min(fy, Es · 0.004)` — the 0.004 strain cap of 440.2R §11.4, which
352
+ * keeps the crack tight enough for aggregate interlock — and the additional
353
+ * reduction factor `psi_f = 0.85` for two-sided bonded strengthening. A continuous
354
+ * plate is the case `wp = s`, `α = 90°`.
355
+ *
356
+ * Note that for structural steel `Es · 0.004 = 800 MPa` sits above any normal `fy`,
357
+ * so the strain cap does not bind and the tie reaches yield; this model therefore
358
+ * usually returns a higher capacity than `sidePlateShearCapacityByWebYielding` for
359
+ * a continuous plate. Neither is code-sanctioned for steel side plates — a warning
360
+ * always says so.
361
+ *
362
+ * @param section - Original beam shear properties (fc_, bw, d, Av, fyt, s, optional lambda)
363
+ * @param plates - Side plate geometry, strength, layout, and optional anchorage
364
+ * @returns `before` and `after` results, each with `phiVn` (kN), `calculationDetails`,
365
+ * `unit`, and `warnings`; `after` also carries `phiVp` and `governedBy`
366
+ * @throws {RCDesignError} 205 if the plate geometry is inconsistent, 206 if the
367
+ * existing Vs leaves no headroom under the ACI 318-19 22.5.1.2 maximum, 202 if
368
+ * the supplied bolt capacity is invalid
369
+ */
370
+ const sidePlateShearCapacityByTensionTie = (section, plates) => {
371
+ const warnings = [];
372
+ const geo = resolveSidePlateGeometry(plates);
373
+ validateSidePlateGeometry(section, plates, geo);
374
+ collectCommonWarnings(section, plates, geo, warnings);
375
+ const strainLimitedStress = geo.Es * RCConstants.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT; // MPa
376
+ const ffe = Math.min(geo.fy, strainLimitedStress);
377
+ if (ffe < geo.fy) {
378
+ warnings.push({
379
+ reference: "ACI440.2R-17, 11.4",
380
+ message: `Effective plate stress limited to ${MyMath.roundToDecimalPlaces(ffe, 2)} MPa by the 0.004 strain cap, below fy (${geo.fy} MPa); the plate does not reach yield.`,
381
+ });
382
+ }
383
+ const orientation = Math.sin(geo.angleRad) + Math.cos(geo.angleRad);
384
+ const VpNominal = geo.sides * geo.tp * ffe * geo.dp * geo.coverageRatio * orientation; // N
385
+ return assembleResult(section, plates, geo, VpNominal, RCConstants.SIDE_PLATE_REDUCTION_FACTOR_PSI, "tensionTie", {
386
+ ffe: MyMath.roundToDecimalPlaces(ffe, 2),
387
+ strainLimitedStress: MyMath.roundToDecimalPlaces(strainLimitedStress, 2),
388
+ orientation: MyMath.roundToDecimalPlaces(orientation, 4),
389
+ psi: RCConstants.SIDE_PLATE_REDUCTION_FACTOR_PSI,
390
+ }, warnings);
391
+ };
392
+ exports.sidePlateShearCapacityByTensionTie = sidePlateShearCapacityByTensionTie;
393
+ /**
394
+ * Runs both side plate shear models on the same section and reports the lower
395
+ * result as governing, which is the intended entry point when selecting a
396
+ * conservative design capacity.
397
+ *
398
+ * @param section - Original beam shear properties (fc_, bw, d, Av, fyt, s, optional lambda)
399
+ * @param plates - Side plate geometry, strength, layout, and optional anchorage
400
+ * @returns `webYielding` and `tensionTie` results plus `governing`, holding the
401
+ * lower `phiVn`, its `phiVp`, and the `method` that produced it
402
+ * @throws {RCDesignError} Whatever either model throws — see their documentation
403
+ */
404
+ const compareSidePlateShearCapacity = (section, plates) => {
405
+ const webYielding = (0, exports.sidePlateShearCapacityByWebYielding)(section, plates);
406
+ const tensionTie = (0, exports.sidePlateShearCapacityByTensionTie)(section, plates);
407
+ const governing = tensionTie.after.phiVn < webYielding.after.phiVn ? tensionTie : webYielding;
408
+ return {
409
+ webYielding,
410
+ tensionTie,
411
+ governing: {
412
+ method: governing.method,
413
+ phiVn: governing.after.phiVn,
414
+ phiVp: governing.after.phiVp,
415
+ governedBy: governing.after.governedBy,
416
+ },
417
+ };
418
+ };
419
+ exports.compareSidePlateShearCapacity = compareSidePlateShearCapacity;
420
+ //# sourceMappingURL=rc-beam-side-plate-shear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-beam-side-plate-shear.js","sourceRoot":"","sources":["../../src/strengthening/rc-beam-side-plate-shear.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theerapat-s28/ts-structural-eng-tools",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "TypeScript structural-engineering helper functions and beam design utilities",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",