@theerapat-s28/ts-structural-eng-tools 1.0.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -3
- package/dist/core/constants/rc.constant.d.ts +23 -0
- package/dist/core/constants/rc.constant.js +42 -1
- package/dist/core/constants/rc.constant.js.map +1 -1
- package/dist/core/errors/rc-design.error.js +29 -0
- package/dist/core/errors/rc-design.error.js.map +1 -1
- package/dist/core/index.d.ts +4 -3
- package/dist/core/index.js +7 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types/plate-jacketing.type.d.ts +31 -4
- package/dist/core/types/plate-jacketing.type.js +12 -0
- package/dist/core/types/plate-jacketing.type.js.map +1 -1
- package/dist/core/types/rc-beam.type.d.ts +30 -0
- package/dist/core/types/rc-beam.type.js +1 -4
- package/dist/core/types/rc-beam.type.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/rc/index.d.ts +2 -1
- package/dist/rc/index.js +6 -1
- package/dist/rc/index.js.map +1 -1
- package/dist/rc/rc-bar-layout.d.ts +34 -0
- package/dist/rc/rc-bar-layout.js +125 -0
- package/dist/rc/rc-bar-layout.js.map +1 -0
- package/dist/rc/rc-beam-design.d.ts +58 -1
- package/dist/rc/rc-beam-design.js +144 -5
- package/dist/rc/rc-beam-design.js.map +1 -1
- package/dist/strengthening/index.d.ts +1 -0
- package/dist/strengthening/index.js +5 -1
- package/dist/strengthening/index.js.map +1 -1
- package/dist/strengthening/rc-beam-plate-interface-bolts.d.ts +134 -0
- package/dist/strengthening/rc-beam-plate-interface-bolts.js +377 -0
- package/dist/strengthening/rc-beam-plate-interface-bolts.js.map +1 -0
- package/dist/strengthening/rc-beam-steel-plate-jacketing.js +23 -13
- package/dist/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -1
- package/dist/utils/math.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,377 @@
|
|
|
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.plateInterfaceBoltRequirement = exports.boltShearCapacity = exports.plateInterfaceShearFlow = 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 general_1 = require("../rc/general");
|
|
41
|
+
const rc_beam_type_1 = require("../core/types/rc-beam.type");
|
|
42
|
+
const plate_jacketing_type_1 = require("../core/types/plate-jacketing.type");
|
|
43
|
+
const resolveGeometry = (section, plates) => {
|
|
44
|
+
const tTop = (0, plate_jacketing_type_1.hasTopPlate)(plates) ? plates.topSteelThickness : 0;
|
|
45
|
+
const tBottom = (0, plate_jacketing_type_1.hasBottomPlate)(plates) ? plates.bottomSteelThickness : 0;
|
|
46
|
+
const ATop = (0, plate_jacketing_type_1.hasTopPlate)(plates) ? plates.topSteelWidth * tTop : 0;
|
|
47
|
+
const ABottom = (0, plate_jacketing_type_1.hasBottomPlate)(plates) ? plates.bottomSteelWidth * tBottom : 0;
|
|
48
|
+
const singly = (0, rc_beam_type_1.isSinglyReinforced)(section);
|
|
49
|
+
const doubly = section;
|
|
50
|
+
return {
|
|
51
|
+
tTop,
|
|
52
|
+
tBottom,
|
|
53
|
+
ATop,
|
|
54
|
+
ABottom,
|
|
55
|
+
yTop: tTop / 2,
|
|
56
|
+
yBottom: tTop + section.h + tBottom / 2,
|
|
57
|
+
yConcreteTop: tTop,
|
|
58
|
+
yConcreteBottom: tTop + section.h,
|
|
59
|
+
yTensionSteel: tTop + section.d,
|
|
60
|
+
yCompSteel: singly ? null : tTop + doubly.d_,
|
|
61
|
+
As_: singly ? 0 : doubly.As_,
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
const validateGeometry = (section, geo) => {
|
|
65
|
+
if (section.b <= 0 ||
|
|
66
|
+
section.h <= 0 ||
|
|
67
|
+
section.d <= 0 ||
|
|
68
|
+
section.d >= section.h ||
|
|
69
|
+
section.As <= 0) {
|
|
70
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.PLATE_OUTSIDE_SECTION);
|
|
71
|
+
}
|
|
72
|
+
if (geo.yCompSteel !== null && geo.yCompSteel >= geo.yTensionSteel) {
|
|
73
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.PLATE_OUTSIDE_SECTION);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Solves the cracked-section neutral axis depth (from the datum) by setting the
|
|
78
|
+
* first moment of the transformed areas about the neutral axis to zero.
|
|
79
|
+
*
|
|
80
|
+
* @param compSteelInCompression - Whether the compression rebar is assumed to sit
|
|
81
|
+
* above the neutral axis, which decides between the (n-1) and n modular ratios
|
|
82
|
+
*/
|
|
83
|
+
const solveCrackedNeutralAxis = (section, geo, ns, np, compSteelInCompression) => {
|
|
84
|
+
const { b } = section;
|
|
85
|
+
const AsTr = ns * section.As;
|
|
86
|
+
const ATopTr = np * geo.ATop;
|
|
87
|
+
const ABottomTr = np * geo.ABottom;
|
|
88
|
+
// Compression rebar displaces concrete that is already counted in the block,
|
|
89
|
+
// so it is transformed with (n - 1); below the neutral axis it acts in tension
|
|
90
|
+
// and takes the full n.
|
|
91
|
+
const AsCompTr = compSteelInCompression ? (ns - 1) * geo.As_ : ns * geo.As_;
|
|
92
|
+
const a = b / 2;
|
|
93
|
+
const bq = -b * geo.yConcreteTop + ATopTr + AsCompTr + AsTr + ABottomTr;
|
|
94
|
+
const c = (b * geo.yConcreteTop * geo.yConcreteTop) / 2 -
|
|
95
|
+
ATopTr * geo.yTop -
|
|
96
|
+
AsCompTr * (geo.yCompSteel ?? 0) -
|
|
97
|
+
AsTr * geo.yTensionSteel -
|
|
98
|
+
ABottomTr * geo.yBottom;
|
|
99
|
+
const roots = MyMath.solveQuadratic(a, bq, c);
|
|
100
|
+
const valid = roots.filter((root) => root > geo.yConcreteTop && root < geo.yConcreteBottom);
|
|
101
|
+
return valid.length > 0 ? Math.max(...valid) : null;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Builds the transformed-section parts and the neutral axis depth for the
|
|
105
|
+
* requested section state.
|
|
106
|
+
*/
|
|
107
|
+
const buildTransformedSection = (section, geo, ns, np, sectionState, warnings) => {
|
|
108
|
+
const parts = [];
|
|
109
|
+
if (geo.ATop > 0) {
|
|
110
|
+
parts.push({
|
|
111
|
+
A: np * geo.ATop,
|
|
112
|
+
y: geo.yTop,
|
|
113
|
+
I: (np * (geo.ATop / geo.tTop) * geo.tTop ** 3) / 12,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if (geo.ABottom > 0) {
|
|
117
|
+
parts.push({
|
|
118
|
+
A: np * geo.ABottom,
|
|
119
|
+
y: geo.yBottom,
|
|
120
|
+
I: (np * (geo.ABottom / geo.tBottom) * geo.tBottom ** 3) / 12,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
let ybar;
|
|
124
|
+
if (sectionState === "uncracked") {
|
|
125
|
+
parts.push({
|
|
126
|
+
A: section.b * section.h,
|
|
127
|
+
y: geo.yConcreteTop + section.h / 2,
|
|
128
|
+
I: (section.b * section.h ** 3) / 12,
|
|
129
|
+
});
|
|
130
|
+
parts.push({ A: (ns - 1) * section.As, y: geo.yTensionSteel, I: 0 });
|
|
131
|
+
if (geo.As_ > 0 && geo.yCompSteel !== null) {
|
|
132
|
+
parts.push({ A: (ns - 1) * geo.As_, y: geo.yCompSteel, I: 0 });
|
|
133
|
+
}
|
|
134
|
+
const sumA = parts.reduce((acc, part) => acc + part.A, 0);
|
|
135
|
+
ybar = parts.reduce((acc, part) => acc + part.A * part.y, 0) / sumA;
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
let compSteelInCompression = true;
|
|
139
|
+
let na = solveCrackedNeutralAxis(section, geo, ns, np, true);
|
|
140
|
+
if (na !== null && geo.yCompSteel !== null && geo.yCompSteel > na) {
|
|
141
|
+
// The assumed compression rebar is actually below the neutral axis; re-solve
|
|
142
|
+
// with it on the tension side.
|
|
143
|
+
compSteelInCompression = false;
|
|
144
|
+
na = solveCrackedNeutralAxis(section, geo, ns, np, false);
|
|
145
|
+
warnings.push({
|
|
146
|
+
reference: "ACI318-19, 22.2.2.1",
|
|
147
|
+
message: "Compression reinforcement lies below the cracked neutral axis; it was transformed as tension steel.",
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (na === null) {
|
|
151
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.CRACKED_NA_NOT_FOUND);
|
|
152
|
+
}
|
|
153
|
+
ybar = na;
|
|
154
|
+
const c = ybar - geo.yConcreteTop; // depth of the concrete compression zone
|
|
155
|
+
parts.push({
|
|
156
|
+
A: section.b * c,
|
|
157
|
+
y: geo.yConcreteTop + c / 2,
|
|
158
|
+
I: (section.b * c ** 3) / 12,
|
|
159
|
+
});
|
|
160
|
+
parts.push({ A: ns * section.As, y: geo.yTensionSteel, I: 0 });
|
|
161
|
+
if (geo.As_ > 0 && geo.yCompSteel !== null) {
|
|
162
|
+
parts.push({
|
|
163
|
+
A: compSteelInCompression ? (ns - 1) * geo.As_ : ns * geo.As_,
|
|
164
|
+
y: geo.yCompSteel,
|
|
165
|
+
I: 0,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const Itr = parts.reduce((acc, part) => acc + part.I + part.A * (part.y - ybar) ** 2, 0);
|
|
170
|
+
return { ybar, Itr };
|
|
171
|
+
};
|
|
172
|
+
/**
|
|
173
|
+
* Calculates the horizontal shear flow that must be transferred across each
|
|
174
|
+
* concrete-to-plate interface of a steel plate jacketed beam, q = V·Q/I, using an
|
|
175
|
+
* elastic transformed section.
|
|
176
|
+
*
|
|
177
|
+
* `Q` at an interface is the first moment of the area beyond that cut — the plate
|
|
178
|
+
* itself — while `ybar` and `Itr` come from one solve that includes every plate
|
|
179
|
+
* present, so adding a top plate also changes the bottom interface shear flow.
|
|
180
|
+
*
|
|
181
|
+
* @param input - Section, plate properties, factored shear V (kN), and section state
|
|
182
|
+
* @returns Object containing per-interface `top`/`bottom` shear flow (`null` when the
|
|
183
|
+
* plate is absent), `calculationDetails`, `unit`, and `warnings`
|
|
184
|
+
* @throws {RCDesignError} If V is not positive or no plate is present (201), the
|
|
185
|
+
* geometry is inconsistent (203), or no cracked neutral axis exists (204)
|
|
186
|
+
*/
|
|
187
|
+
const plateInterfaceShearFlow = (input) => {
|
|
188
|
+
const warnings = [];
|
|
189
|
+
const { section, plates, V } = input;
|
|
190
|
+
const sectionState = input.sectionState ?? "cracked";
|
|
191
|
+
if (V <= 0 || (!(0, plate_jacketing_type_1.hasTopPlate)(plates) && !(0, plate_jacketing_type_1.hasBottomPlate)(plates))) {
|
|
192
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.NON_POSITIVE_SHEAR_FLOW);
|
|
193
|
+
}
|
|
194
|
+
const geo = resolveGeometry(section, plates);
|
|
195
|
+
validateGeometry(section, geo);
|
|
196
|
+
const Ec = (0, general_1.concreteElasticModulus)(section.fc_);
|
|
197
|
+
const ns = section.Es / Ec;
|
|
198
|
+
const np = plates.Es / Ec;
|
|
199
|
+
const { ybar, Itr } = buildTransformedSection(section, geo, ns, np, sectionState, warnings);
|
|
200
|
+
const VinN = V * 1000;
|
|
201
|
+
const interfaceAt = (A, y) => {
|
|
202
|
+
const Q = np * A * Math.abs(y - ybar);
|
|
203
|
+
return {
|
|
204
|
+
q: MyMath.roundToDecimalPlaces((VinN * Q) / Itr, 2),
|
|
205
|
+
Q: MyMath.roundToDecimalPlaces(Q, 0),
|
|
206
|
+
leverArm: MyMath.roundToDecimalPlaces(Math.abs(y - ybar), 2),
|
|
207
|
+
};
|
|
208
|
+
};
|
|
209
|
+
if (geo.ATop > 0 && geo.yTop > ybar) {
|
|
210
|
+
warnings.push({
|
|
211
|
+
reference: "ACI318-19, 22.2.2.1",
|
|
212
|
+
message: "Top plate centroid lies below the neutral axis; the plate is in tension, so the assumed compression-face behaviour does not apply.",
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
top: geo.ATop > 0 ? interfaceAt(geo.ATop, geo.yTop) : null,
|
|
217
|
+
bottom: geo.ABottom > 0 ? interfaceAt(geo.ABottom, geo.yBottom) : null,
|
|
218
|
+
calculationDetails: {
|
|
219
|
+
Ec: MyMath.roundToDecimalPlaces(Ec, 2),
|
|
220
|
+
ns: MyMath.roundToDecimalPlaces(ns, 3),
|
|
221
|
+
np: MyMath.roundToDecimalPlaces(np, 3),
|
|
222
|
+
ybar: MyMath.roundToDecimalPlaces(ybar, 2),
|
|
223
|
+
Itr: MyMath.roundToDecimalPlaces(Itr, 0),
|
|
224
|
+
sectionState,
|
|
225
|
+
},
|
|
226
|
+
unit: "N/mm",
|
|
227
|
+
warnings,
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
exports.plateInterfaceShearFlow = plateInterfaceShearFlow;
|
|
231
|
+
/**
|
|
232
|
+
* Calculates the design shear strength of a single anchor bolt from the steel
|
|
233
|
+
* strength per ACI 318-19 17.7.1.2b, Vsa = 0.6 Ase,V futa, with φ = 0.65 from
|
|
234
|
+
* Table 17.5.3 and the futa cap of 17.6.1.2.
|
|
235
|
+
*
|
|
236
|
+
* Concrete breakout (17.7.2) and pryout (17.7.3) depend on edge distances, anchor
|
|
237
|
+
* spacing and embedment depth, and are NOT evaluated here — a warning always says so.
|
|
238
|
+
* Supply `phiVboltOverride` to use a manufacturer or ESR value instead.
|
|
239
|
+
*
|
|
240
|
+
* @param bolt - Anchor properties (Ase, futa, optional fya, diameter, shearPlanes, override)
|
|
241
|
+
* @returns Object containing `phiVbolt` (kN), `calculationDetails`, `unit`, and `warnings`
|
|
242
|
+
* @throws {RCDesignError} If the resolved capacity is not positive (202)
|
|
243
|
+
*/
|
|
244
|
+
const boltShearCapacity = (bolt) => {
|
|
245
|
+
const warnings = [];
|
|
246
|
+
const shearPlanes = bolt.shearPlanes ?? 1;
|
|
247
|
+
warnings.push({
|
|
248
|
+
reference: "ACI318-19, 17.7.2",
|
|
249
|
+
message: "Only anchor steel strength in shear is evaluated; concrete breakout and pryout must be checked separately.",
|
|
250
|
+
});
|
|
251
|
+
if (bolt.phiVboltOverride !== undefined) {
|
|
252
|
+
if (bolt.phiVboltOverride <= 0) {
|
|
253
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.INVALID_BOLT_CAPACITY);
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
phiVbolt: MyMath.roundToDecimalPlaces(bolt.phiVboltOverride, 2),
|
|
257
|
+
calculationDetails: { source: "override", shearPlanes },
|
|
258
|
+
unit: "kN",
|
|
259
|
+
warnings,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
if (bolt.Ase <= 0 || bolt.futa <= 0 || shearPlanes <= 0) {
|
|
263
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.INVALID_BOLT_CAPACITY);
|
|
264
|
+
}
|
|
265
|
+
const cap = Math.min(bolt.fya !== undefined ? RCConstants.ANCHOR_FUTA_FYA_FACTOR * bolt.fya : Infinity, RCConstants.MAX_ANCHOR_FUTA);
|
|
266
|
+
const futaEffective = Math.min(bolt.futa, cap);
|
|
267
|
+
if (futaEffective < bolt.futa) {
|
|
268
|
+
warnings.push({
|
|
269
|
+
reference: "ACI318-19, 17.6.1.2",
|
|
270
|
+
message: `futa (${bolt.futa} MPa) exceeds the limit of min(1.9*fya, ${RCConstants.MAX_ANCHOR_FUTA} MPa); capped at ${MyMath.roundToDecimalPlaces(futaEffective, 2)} MPa.`,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
const Vsa = RCConstants.ANCHOR_STEEL_SHEAR_COEFFICIENT * bolt.Ase * futaEffective * shearPlanes; // N
|
|
274
|
+
return {
|
|
275
|
+
phiVbolt: MyMath.roundToDecimalPlaces(RCConstants.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR * Vsa * 0.001, 2),
|
|
276
|
+
calculationDetails: {
|
|
277
|
+
source: "ACI318-19, 17.7.1.2b",
|
|
278
|
+
Vsa: MyMath.roundToDecimalPlaces(Vsa * 0.001, 2),
|
|
279
|
+
futaEffective: MyMath.roundToDecimalPlaces(futaEffective, 2),
|
|
280
|
+
shearPlanes,
|
|
281
|
+
},
|
|
282
|
+
unit: "kN",
|
|
283
|
+
warnings,
|
|
284
|
+
};
|
|
285
|
+
};
|
|
286
|
+
exports.boltShearCapacity = boltShearCapacity;
|
|
287
|
+
const designInterface = (demand, plateArea, plateFy, phiVboltKN, boltsPerRow, transferLength, label, warnings) => {
|
|
288
|
+
const phiVboltN = phiVboltKN * 1000;
|
|
289
|
+
// Spacing that keeps the bolt row capacity at or above the shear flow demand
|
|
290
|
+
const spacingFromShearFlow = (boltsPerRow * phiVboltN) / demand.q; // mm
|
|
291
|
+
let requiredSpacing = spacingFromShearFlow;
|
|
292
|
+
if (requiredSpacing > RCConstants.MAX_PLATE_BOLT_SPACING) {
|
|
293
|
+
requiredSpacing = RCConstants.MAX_PLATE_BOLT_SPACING;
|
|
294
|
+
warnings.push({
|
|
295
|
+
message: `${label} plate: shear flow allows a pitch of ${MyMath.roundToDecimalPlaces(spacingFromShearFlow, 1)} mm, capped at the detailing limit of ${RCConstants.MAX_PLATE_BOLT_SPACING} mm.`,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
const rows = Math.ceil(transferLength / requiredSpacing) + 1;
|
|
299
|
+
const boltCountFromShearFlow = rows * boltsPerRow;
|
|
300
|
+
// The plate must also develop its own yield force over the transfer length
|
|
301
|
+
const plateForce = plateArea * plateFy; // N
|
|
302
|
+
const boltCountFromPlateForce = Math.ceil(plateForce / phiVboltN);
|
|
303
|
+
const governedBy = boltCountFromPlateForce > boltCountFromShearFlow ? "plateForce" : "shearFlow";
|
|
304
|
+
const boltCount = Math.max(boltCountFromShearFlow, boltCountFromPlateForce);
|
|
305
|
+
return {
|
|
306
|
+
q: demand.q,
|
|
307
|
+
Q: demand.Q,
|
|
308
|
+
leverArm: demand.leverArm,
|
|
309
|
+
requiredSpacing: MyMath.roundToDecimalPlaces(requiredSpacing, 1),
|
|
310
|
+
boltCount,
|
|
311
|
+
governedBy,
|
|
312
|
+
calculationDetails: {
|
|
313
|
+
spacingFromShearFlow: MyMath.roundToDecimalPlaces(spacingFromShearFlow, 1),
|
|
314
|
+
rows,
|
|
315
|
+
boltCountFromShearFlow,
|
|
316
|
+
boltCountFromPlateForce,
|
|
317
|
+
plateForce: MyMath.roundToDecimalPlaces(plateForce * 0.001, 2),
|
|
318
|
+
},
|
|
319
|
+
};
|
|
320
|
+
};
|
|
321
|
+
/**
|
|
322
|
+
* Determines the bolts required to transfer horizontal shear across each
|
|
323
|
+
* concrete-to-plate interface of a steel plate jacketed beam.
|
|
324
|
+
*
|
|
325
|
+
* For each plate present, the required bolt pitch follows from the interface shear
|
|
326
|
+
* flow (s = n·φVbolt / q) and the bolt count is taken as the larger of that pitch
|
|
327
|
+
* over the transfer length and the count needed to develop the full plate yield
|
|
328
|
+
* force (Ap·fy / φVbolt). `governedBy` reports which one controls.
|
|
329
|
+
*
|
|
330
|
+
* @param input - Section, plates, V (kN), bolt properties, bolts per row, and transfer length (mm)
|
|
331
|
+
* @returns Object containing per-interface `top`/`bottom` results (`null` when the plate
|
|
332
|
+
* is absent), `calculationDetails`, `unit`, and `warnings`
|
|
333
|
+
* @throws {RCDesignError} If V is not positive or no plate is present (201), the bolt
|
|
334
|
+
* capacity is invalid (202), the geometry is inconsistent (203), or no cracked
|
|
335
|
+
* neutral axis exists (204)
|
|
336
|
+
*/
|
|
337
|
+
const plateInterfaceBoltRequirement = (input) => {
|
|
338
|
+
const { plates, bolt, boltsPerRow, transferLength } = input;
|
|
339
|
+
if (boltsPerRow <= 0 || transferLength <= 0) {
|
|
340
|
+
throw new rc_design_error_1.RCDesignError(rc_design_error_1.Errors.PLATE_OUTSIDE_SECTION);
|
|
341
|
+
}
|
|
342
|
+
const flow = (0, exports.plateInterfaceShearFlow)(input);
|
|
343
|
+
const boltResult = (0, exports.boltShearCapacity)(bolt);
|
|
344
|
+
const warnings = [...flow.warnings, ...boltResult.warnings];
|
|
345
|
+
const geo = resolveGeometry(input.section, plates);
|
|
346
|
+
const top = flow.top !== null
|
|
347
|
+
? designInterface(flow.top, geo.ATop, plates.fy, boltResult.phiVbolt, boltsPerRow, transferLength, "top", warnings)
|
|
348
|
+
: null;
|
|
349
|
+
const bottom = flow.bottom !== null
|
|
350
|
+
? designInterface(flow.bottom, geo.ABottom, plates.fy, boltResult.phiVbolt, boltsPerRow, transferLength, "bottom", warnings)
|
|
351
|
+
: null;
|
|
352
|
+
if (bolt.diameter !== undefined) {
|
|
353
|
+
const minSpacing = RCConstants.MIN_ANCHOR_SPACING_DIAMETER_FACTOR * bolt.diameter;
|
|
354
|
+
for (const result of [top, bottom]) {
|
|
355
|
+
if (result !== null && result.requiredSpacing < minSpacing) {
|
|
356
|
+
warnings.push({
|
|
357
|
+
reference: "ACI318-19, 17.9.2",
|
|
358
|
+
message: `Required pitch (${result.requiredSpacing} mm) is below the minimum anchor spacing of 4*da (${minSpacing} mm); use a larger bolt or more bolts per row.`,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
top,
|
|
365
|
+
bottom,
|
|
366
|
+
calculationDetails: {
|
|
367
|
+
...flow.calculationDetails,
|
|
368
|
+
phiVbolt: boltResult.phiVbolt,
|
|
369
|
+
boltsPerRow,
|
|
370
|
+
transferLength,
|
|
371
|
+
},
|
|
372
|
+
unit: "kN",
|
|
373
|
+
warnings,
|
|
374
|
+
};
|
|
375
|
+
};
|
|
376
|
+
exports.plateInterfaceBoltRequirement = plateInterfaceBoltRequirement;
|
|
377
|
+
//# sourceMappingURL=rc-beam-plate-interface-bolts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rc-beam-plate-interface-bolts.js","sourceRoot":"","sources":["../../src/strengthening/rc-beam-plate-interface-bolts.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ exports.calculateSteelJacketedBeamMomentCapacity = void 0;
|
|
|
4
4
|
const rc_beam_design_1 = require("../rc/rc-beam-design");
|
|
5
5
|
const math_1 = require("../utils/math");
|
|
6
6
|
const rc_beam_type_1 = require("../core/types/rc-beam.type");
|
|
7
|
+
const plate_jacketing_type_1 = require("../core/types/plate-jacketing.type");
|
|
7
8
|
const merge_warning_1 = require("../utils/merge-warning");
|
|
8
9
|
/**
|
|
9
10
|
* Calculates the moment capacity of an RC beam strengthened with steel plate jacketing.
|
|
@@ -21,16 +22,23 @@ const calculateSteelJacketedBeamMomentCapacity = (section, jacketedProperties) =
|
|
|
21
22
|
const originalResult = (0, rc_beam_design_1.rectBeamMomentCapacity)(section);
|
|
22
23
|
// Convert steel plate strength to the same as rebar strength
|
|
23
24
|
const n = jacketedProperties.fy / section.fy;
|
|
25
|
+
// A plate only counts when both its width and thickness are positive, so a
|
|
26
|
+
// bottom-only jacket may omit the top plate fields entirely.
|
|
27
|
+
const topSteelThickness = (0, plate_jacketing_type_1.hasTopPlate)(jacketedProperties)
|
|
28
|
+
? jacketedProperties.topSteelThickness
|
|
29
|
+
: 0;
|
|
30
|
+
const bottomSteelThickness = (0, plate_jacketing_type_1.hasBottomPlate)(jacketedProperties)
|
|
31
|
+
? jacketedProperties.bottomSteelThickness
|
|
32
|
+
: 0;
|
|
24
33
|
// Calculate the effective area of the steel plates converted to rebar.
|
|
25
|
-
const plateTopSteelArea =
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
plateBottomSteelArea) /
|
|
34
|
+
const plateTopSteelArea = (0, plate_jacketing_type_1.hasTopPlate)(jacketedProperties)
|
|
35
|
+
? n * jacketedProperties.topSteelWidth * topSteelThickness
|
|
36
|
+
: 0;
|
|
37
|
+
const plateBottomSteelArea = (0, plate_jacketing_type_1.hasBottomPlate)(jacketedProperties)
|
|
38
|
+
? n * jacketedProperties.bottomSteelWidth * bottomSteelThickness
|
|
39
|
+
: 0;
|
|
40
|
+
let newD = ((topSteelThickness + section.d) * section.As +
|
|
41
|
+
(topSteelThickness + section.h + bottomSteelThickness / 2) * plateBottomSteelArea) /
|
|
34
42
|
(section.As + plateBottomSteelArea);
|
|
35
43
|
let newD_ = undefined;
|
|
36
44
|
let modifiedSection;
|
|
@@ -47,9 +55,8 @@ const calculateSteelJacketedBeamMomentCapacity = (section, jacketedProperties) =
|
|
|
47
55
|
// Doubly reinforced section
|
|
48
56
|
const doublySection = section;
|
|
49
57
|
newD_ =
|
|
50
|
-
((
|
|
51
|
-
|
|
52
|
-
(jacketedProperties.topSteelThickness / 2) * plateTopSteelArea) /
|
|
58
|
+
((topSteelThickness + doublySection.d_) * doublySection.As_ +
|
|
59
|
+
(topSteelThickness / 2) * plateTopSteelArea) /
|
|
53
60
|
(doublySection.As_ + plateTopSteelArea);
|
|
54
61
|
modifiedSection = {
|
|
55
62
|
...doublySection,
|
|
@@ -65,7 +72,10 @@ const calculateSteelJacketedBeamMomentCapacity = (section, jacketedProperties) =
|
|
|
65
72
|
}
|
|
66
73
|
// Calculate the moment capacity of the modified (after strengthening) section
|
|
67
74
|
let jacketedResult = (0, rc_beam_design_1.rectBeamMomentCapacity)(modifiedSection);
|
|
68
|
-
jacketedResult = {
|
|
75
|
+
jacketedResult = {
|
|
76
|
+
...jacketedResult,
|
|
77
|
+
warnings: (0, merge_warning_1.mergeWarnings)(jacketedResult.warnings, warnings),
|
|
78
|
+
};
|
|
69
79
|
return {
|
|
70
80
|
before: originalResult,
|
|
71
81
|
after: jacketedResult,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc-beam-steel-plate-jacketing.js","sourceRoot":"","sources":["../../src/strengthening/rc-beam-steel-plate-jacketing.ts"],"names":[],"mappings":";;;AAAA,2DAAgE;AAChE,0CAAuD;AAEvD,+DAIsC;
|
|
1
|
+
{"version":3,"file":"rc-beam-steel-plate-jacketing.js","sourceRoot":"","sources":["../../src/strengthening/rc-beam-steel-plate-jacketing.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACI,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAY,EAAE;IAC1E,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC,CAAC;AATW,QAAA,cAAc,kBASzB;AAEF;;;;;;GAMG;AACI,MAAM,oBAAoB,GAAG,
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/utils/math.ts"],"names":[],"mappings":";;;AAAA;;;;;;;GAOG;AACI,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAY,EAAE;IAC1E,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AACxB,CAAC,CAAC;AATW,QAAA,cAAc,kBASzB;AAEF;;;;;;GAMG;AACI,MAAM,oBAAoB,GAAG,CAAC,KAAa,EAAE,aAAqB,EAAU,EAAE;IACnF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;AAC7C,CAAC,CAAC;AAHW,QAAA,oBAAoB,wBAG/B"}
|
package/package.json
CHANGED