ocs-calculators 0.1.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/dist/index.cjs ADDED
@@ -0,0 +1,1327 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AIR_DENSITY_KG_PER_M3: () => AIR_DENSITY_KG_PER_M3,
24
+ CONVENTIONAL_MARGIN_MM: () => CONVENTIONAL_MARGIN_MM,
25
+ COPPER_ALLOY_ALPHA_PER_DEG_C: () => COPPER_ALLOY_ALPHA_PER_DEG_C,
26
+ COPPER_ALPHA_PER_DEG_C: () => COPPER_ALPHA_PER_DEG_C,
27
+ DEFAULT_BASE_AMBIENT_TEMP_DEG_C: () => DEFAULT_BASE_AMBIENT_TEMP_DEG_C,
28
+ DEFAULT_ICE_DENSITY_KG_PER_M3: () => DEFAULT_ICE_DENSITY_KG_PER_M3,
29
+ DEFAULT_MIN_END_VOLTAGE_V: () => DEFAULT_MIN_END_VOLTAGE_V,
30
+ DEFAULT_PANTOGRAPH_HEIGHT_M: () => DEFAULT_PANTOGRAPH_HEIGHT_M,
31
+ DEFAULT_REPLACEMENT_THRESHOLD_PERCENT: () => DEFAULT_REPLACEMENT_THRESHOLD_PERCENT,
32
+ DEFAULT_WARN_THRESHOLD: () => DEFAULT_WARN_THRESHOLD,
33
+ G0: () => G0,
34
+ IACS_RESISTIVITY_OHM_MM2_PER_M: () => IACS_RESISTIVITY_OHM_MM2_PER_M,
35
+ MIN_MARGIN_MM: () => MIN_MARGIN_MM,
36
+ NOMINAL_SECTION_MM2: () => NOMINAL_SECTION_MM2,
37
+ REFERENCE_DENSITY_G_PER_CM3: () => REFERENCE_DENSITY_G_PER_CM3,
38
+ REF_TARGET_COEFF: () => REF_TARGET_COEFF,
39
+ REF_TARGET_OFFSET_N: () => REF_TARGET_OFFSET_N,
40
+ STANDARD_GAUGE_M: () => STANDARD_GAUGE_M,
41
+ TB2809_AMPACITY_A: () => TB2809_AMPACITY_A,
42
+ TB2809_WIRE_PARAMS: () => TB2809_WIRE_PARAMS,
43
+ TRANSMISSION_RATIOS: () => TRANSMISSION_RATIOS,
44
+ WIRE_PRESETS: () => WIRE_PRESETS,
45
+ ampacityDeratingFactor: () => ampacityDeratingFactor,
46
+ ampacityMeta: () => ampacityMeta,
47
+ assessContactForce: () => assessContactForce,
48
+ cantShiftM: () => cantShiftM,
49
+ copperMeta: () => copperMeta,
50
+ curveStaggerCheck: () => curveStaggerCheck,
51
+ curveStaggerMeta: () => curveStaggerMeta,
52
+ deratedAmpacityA: () => deratedAmpacityA,
53
+ deriveLinearMassKgPerM: () => deriveLinearMassKgPerM,
54
+ dropperLengths: () => dropperLengths,
55
+ dropperMeta: () => dropperMeta,
56
+ dropperPositionsM: () => dropperPositionsM,
57
+ elongationMM: () => elongationMM,
58
+ equivalentSpanM: () => equivalentSpanM,
59
+ findAmpacityA: () => findAmpacityA,
60
+ findWirePreset: () => findWirePreset,
61
+ forceMeta: () => forceMeta,
62
+ iceLoadNPerM: () => iceLoadNPerM,
63
+ icingCheck: () => icingCheck,
64
+ icingMeta: () => icingMeta,
65
+ kmHToMPerS: () => kmHToMPerS,
66
+ maxParabolaSagM: () => maxParabolaSagM,
67
+ naturalFrequencyHz: () => naturalFrequencyHz,
68
+ nominalSectionMM2: () => nominalSectionMM2,
69
+ parabolaSagM: () => parabolaSagM,
70
+ referenceTargetForceN: () => referenceTargetForceN,
71
+ requiredStrokeMM: () => requiredStrokeMM,
72
+ resistanceAtTempOhmPerKm: () => resistanceAtTempOhmPerKm,
73
+ sagM: () => sagM,
74
+ sectionFromDiameterMM2: () => sectionFromDiameterMM2,
75
+ shortCircuitCheck: () => shortCircuitCheck,
76
+ shortCircuitMinSectionMM2: () => shortCircuitMinSectionMM2,
77
+ solveTensionN: () => solveTensionN,
78
+ stateCoefficientK: () => stateCoefficientK,
79
+ statisticalForcesN: () => statisticalForcesN,
80
+ strokeCheck: () => strokeCheck,
81
+ strokeMeta: () => strokeMeta,
82
+ tensionAt: () => tensionAt,
83
+ tensionCurve: () => tensionCurve,
84
+ tensionMeta: () => tensionMeta,
85
+ versineM: () => versineM,
86
+ voltageDropCheck: () => voltageDropCheck,
87
+ voltageDropMeta: () => voltageDropMeta,
88
+ wavePropagationSpeedMPerS: () => wavePropagationSpeedMPerS,
89
+ waveSpeedCheck: () => waveSpeedCheck,
90
+ wavespeedMeta: () => wavespeedMeta,
91
+ wearMeta: () => wearMeta,
92
+ wearRatio: () => wearRatio,
93
+ weightOfPresetNPerM: () => weightOfPresetNPerM,
94
+ weightPerLengthNPerM: () => weightPerLengthNPerM,
95
+ windClearanceCheck: () => windClearanceCheck,
96
+ windDeflectionM: () => windDeflectionM,
97
+ windLoadNPerM: () => windLoadNPerM,
98
+ windMeta: () => windMeta,
99
+ wireLookup: () => wireLookup
100
+ });
101
+ module.exports = __toCommonJS(index_exports);
102
+
103
+ // src/types.ts
104
+ var G0 = 9.81;
105
+
106
+ // src/common/resistance.ts
107
+ var COPPER_ALPHA_PER_DEG_C = 393e-5;
108
+ var IACS_RESISTIVITY_OHM_MM2_PER_M = 0.017241;
109
+ function resistanceAtTempOhmPerKm(r20OhmPerKm, tempDegC, alphaPerDegC = COPPER_ALPHA_PER_DEG_C) {
110
+ if (!(r20OhmPerKm > 0)) {
111
+ throw new RangeError(`20\u2103 \u5355\u4F4D\u7535\u963B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${r20OhmPerKm} \u03A9/km`);
112
+ }
113
+ if (!(alphaPerDegC > 0)) {
114
+ throw new RangeError(`\u7535\u963B\u6E29\u5EA6\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${alphaPerDegC} /\u2103`);
115
+ }
116
+ return r20OhmPerKm * (1 + alphaPerDegC * (tempDegC - 20));
117
+ }
118
+
119
+ // src/common/ice.ts
120
+ var DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;
121
+ function iceLoadNPerM(params) {
122
+ const { wireDiameterM, iceThicknessM } = params;
123
+ const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;
124
+ if (!(wireDiameterM > 0)) {
125
+ throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
126
+ }
127
+ if (!(iceThicknessM >= 0)) {
128
+ throw new RangeError(`\u8986\u51B0\u539A\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${iceThicknessM} m`);
129
+ }
130
+ if (!(rho > 0)) {
131
+ throw new RangeError(`\u51B0\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${rho} kg/m\xB3`);
132
+ }
133
+ if (iceThicknessM === 0) return 0;
134
+ return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);
135
+ }
136
+
137
+ // src/data/wire-specs.ts
138
+ var REFERENCE_DENSITY_G_PER_CM3 = 8.94;
139
+ function deriveLinearMassKgPerM(crossSectionMM2, densityGPerCm3 = REFERENCE_DENSITY_G_PER_CM3) {
140
+ return crossSectionMM2 * 1e-6 * densityGPerCm3 * 1e3;
141
+ }
142
+ var COPPER_ALLOY_ALPHA_PER_DEG_C = 17e-6;
143
+ var WIRE_PRESETS = [
144
+ {
145
+ id: "cthm120",
146
+ name: "CTHM-120\uFF08\u94DC\u9541 120\uFF09",
147
+ nameEn: "CTHM-120 (CuMg 120 mm\xB2)",
148
+ crossSectionMM2: 120,
149
+ elasticModulusGPa: 120,
150
+ expansionPerDegC: COPPER_ALLOY_ALPHA_PER_DEG_C,
151
+ linearMassKgPerM: deriveLinearMassKgPerM(120)
152
+ },
153
+ {
154
+ id: "cthm150",
155
+ name: "CTHM-150\uFF08\u94DC\u9541 150\uFF09",
156
+ nameEn: "CTHM-150 (CuMg 150 mm\xB2)",
157
+ crossSectionMM2: 150,
158
+ elasticModulusGPa: 120,
159
+ expansionPerDegC: COPPER_ALLOY_ALPHA_PER_DEG_C,
160
+ linearMassKgPerM: deriveLinearMassKgPerM(150)
161
+ },
162
+ {
163
+ id: "ctha120",
164
+ name: "CTHA-120\uFF08\u94DC\u94F6 120\uFF09",
165
+ nameEn: "CTHA-120 (CuAg 120 mm\xB2)",
166
+ crossSectionMM2: 120,
167
+ elasticModulusGPa: 120,
168
+ expansionPerDegC: COPPER_ALLOY_ALPHA_PER_DEG_C,
169
+ linearMassKgPerM: deriveLinearMassKgPerM(120)
170
+ }
171
+ ];
172
+ function findWirePreset(id) {
173
+ return WIRE_PRESETS.find((w) => w.id === id);
174
+ }
175
+ function weightPerLengthNPerM(linearMassKgPerM) {
176
+ return linearMassKgPerM * G0;
177
+ }
178
+ function weightOfPresetNPerM(spec) {
179
+ return weightPerLengthNPerM(spec.linearMassKgPerM);
180
+ }
181
+
182
+ // src/data/tb2809-ampacity.ts
183
+ var M = (type, materialZh, sections, indoor95, outdoor95, indoor150, outdoor150) => {
184
+ const conditions = [
185
+ ["indoor-95", indoor95],
186
+ ["outdoor-95", outdoor95],
187
+ ["indoor-150", indoor150],
188
+ ["outdoor-150", outdoor150]
189
+ ];
190
+ const out = [];
191
+ for (const section of sections) {
192
+ for (const [condition, pair] of conditions) {
193
+ const value = section === 120 ? pair[0] : pair[1];
194
+ out.push({
195
+ type,
196
+ materialZh,
197
+ crossSectionMM2: section,
198
+ condition,
199
+ ampacityA: value ?? null
200
+ });
201
+ }
202
+ }
203
+ return out;
204
+ };
205
+ var TB2809_AMPACITY_A = [
206
+ ...M("CT", "\u94DC", [120, 150], [360, 425], [495, 570], [null, null], [null, null]),
207
+ ...M("CTA", "\u94DC\u94F6", [120, 150], [360, 425], [495, 570], [515, 620], [680, 785]),
208
+ ...M("CTS", "\u94DC\u9521", [120, 150], [360, 425], [490, 565], [515, 620], [680, 790]),
209
+ ...M("CTSM", "\u94DC\u9521", [120, 150], [330, 400], [455, 525], [490, 560], [630, 730]),
210
+ ...M("CTSH", "\u94DC\u9521", [120, 150], [310, 360], [420, 480], [450, 520], [580, 670]),
211
+ ...M("CTM", "\u94DC\u9541", [120, 150], [330, 400], [455, 525], [490, 560], [630, 730]),
212
+ ...M("CTMM", "\u94DC\u9541", [120, 150], [310, 360], [420, 480], [450, 520], [580, 670]),
213
+ ...M("CTMH", "\u94DC\u9541", [120, 150], [300, 340], [410, 460], [430, 500], [560, 650]),
214
+ ...M("CTCZ", "\u94DC\u94EC\u9506", [150], [null, 395], [null, 505], [null, 580], [null, 710])
215
+ ];
216
+ function findAmpacityA(params) {
217
+ const row = TB2809_AMPACITY_A.find(
218
+ (e) => e.type === params.type && e.crossSectionMM2 === params.crossSectionMM2 && e.condition === params.condition
219
+ );
220
+ return row === void 0 ? void 0 : row.ampacityA;
221
+ }
222
+
223
+ // src/tension/meta.ts
224
+ var tensionMeta = {
225
+ name: "\u5F20\u529B-\u6E29\u5EA6\u5B89\u88C5\u66F2\u7EBF",
226
+ nameEn: "Tension-Temperature Installation Curve",
227
+ summary: "\u6309\u5F20\u529B-\u6E29\u5EA6\u72B6\u6001\u65B9\u7A0B\u6C42\u89E3\u5404\u6E29\u5EA6\u6863\u7684\u65BD\u5DE5\u5F20\u529B\u4E0E\u5F1B\u5EA6\uFF0C\u751F\u6210\u5B89\u88C5\u66F2\u7EBF\u8868\uFF1B\u652F\u6301\u5F53\u91CF\u8DE8\u8DDD\uFF08\u591A\u8DE8\u951A\u6BB5\uFF09\u4E0E\u8986\u51B0\u5DE5\u51B5\u6821\u6838\u3002",
228
+ formula: [
229
+ "\u72B6\u6001\u65B9\u7A0B\uFF1AT\u2082 \u2212 g\u2082\xB2l\xB2EA/(24T\u2082\xB2) = T\u2081 \u2212 g\u2081\xB2l\xB2EA/(24T\u2081\xB2) \u2212 \u03B1EA(t\u2082 \u2212 t\u2081)",
230
+ "\u8DE8\u4E2D\u5F1B\u5EA6\uFF08\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Af = gl\xB2/(8T)",
231
+ "\u5F53\u91CF\u8DE8\u8DDD\uFF1Al_D = \u221A(\u03A3l\u1D62\xB3 / \u03A3l\u1D62)",
232
+ "\u8986\u51B0\u8377\u8F7D\uFF08\u51B0\u7B52\u6A21\u578B\uFF09\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)"
233
+ ],
234
+ references: [
235
+ "TB 10009-2016\u300A\u94C1\u8DEF\u7535\u529B\u7275\u5F15\u4F9B\u7535\u8BBE\u8BA1\u89C4\u8303\u300B\u2014\u2014 \u4EC5\u89C4\u5B9A\u63A5\u89E6\u7EBF\u6700\u5C0F\u5F20\u529B\u3001\u5F20\u529B\u786E\u5B9A\u539F\u5219\u4E0E\u5F20\u529B\u5DEE\u9650\u503C\uFF0C\u4E0D\u542B\u5F20\u529B-\u6E29\u5EA6\u72B6\u6001\u65B9\u7A0B\u672C\u8EAB",
236
+ "\u5F20\u529B-\u6E29\u5EA6\u72B6\u6001\u65B9\u7A0B\u4E3A\u901A\u7528\u67D4\u7D22\u72B6\u6001\u65B9\u7A0B\uFF0C\u5177\u4F53\u5F62\u5F0F\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u53CA\u63A5\u89E6\u7F51\u8BBE\u8BA1\u6559\u6750/\u624B\u518C\u4E3A\u51C6",
237
+ "\u7EBF\u6750 E / \u03B1 / \u7EBF\u5BC6\u5EA6\u4E3A\u6807\u79F0\u53C2\u8003\u503C\uFF0C\u5B9E\u9645\u4EE5\u4EA7\u54C1\u6280\u672F\u6761\u4EF6\u4E3A\u51C6"
238
+ ],
239
+ scope: [
240
+ "\u5F39\u6027\u6A21\u91CF E\uFF1A50 ~ 200 GPa",
241
+ "\u622A\u9762\u79EF A\uFF1A50 ~ 250 mm\xB2",
242
+ "\u8DE8\u8DDD l\uFF1A20 ~ 90 m",
243
+ "\u5F1B\u5EA6\u91C7\u7528\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u4E0D\u9002\u7528\u4E8E\u5927\u5F1B\u5EA6\uFF08f/l > 1/10\uFF09\u5DE5\u51B5",
244
+ "\u8986\u51B0\u6A21\u578B\u4E3A\u5747\u5300\u51B0\u7B52\u5047\u8BBE\uFF0C\u4E0D\u8003\u8651\u4E0D\u5747\u5300\u8986\u51B0\u4E0E\u8131\u51B0\u8DF3\u8DC3"
245
+ ],
246
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
247
+ online: "https://www.itswe.com/calculator/tension/"
248
+ };
249
+
250
+ // src/tension/index.ts
251
+ function sagM(weightPerLengthNPerM2, spanM, tensionN) {
252
+ if (!(tensionN > 0)) {
253
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
254
+ }
255
+ return weightPerLengthNPerM2 * spanM * spanM / (8 * tensionN);
256
+ }
257
+ function equivalentSpanM(spansM) {
258
+ if (spansM.length === 0) {
259
+ throw new RangeError("\u8DE8\u8DDD\u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A");
260
+ }
261
+ let sumCubed = 0;
262
+ let sum = 0;
263
+ for (const s of spansM) {
264
+ if (!(s > 0)) {
265
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${s}`);
266
+ }
267
+ sumCubed += s * s * s;
268
+ sum += s;
269
+ }
270
+ return Math.sqrt(sumCubed / sum);
271
+ }
272
+ function stateCoefficientK(weightPerLengthNPerM2, spanM, elasticModulusGPa, crossSectionMM2) {
273
+ const ePa = elasticModulusGPa * 1e9;
274
+ const aM2 = crossSectionMM2 * 1e-6;
275
+ return weightPerLengthNPerM2 * weightPerLengthNPerM2 * spanM * spanM * ePa * aM2 / 24;
276
+ }
277
+ function solveTensionN(K, targetN) {
278
+ const hOf = (t) => t - K / (t * t) - targetN;
279
+ let lo = Math.max(targetN, 1e-9);
280
+ let hi = lo + 1;
281
+ let guard = 0;
282
+ while (hOf(hi) < 0 && guard++ < 200) {
283
+ hi = lo + (hi - lo) * 2;
284
+ if (!Number.isFinite(hi)) break;
285
+ }
286
+ let iterations = 0;
287
+ for (let i = 0; i < 200; i++) {
288
+ iterations = i + 1;
289
+ const mid = 0.5 * (lo + hi);
290
+ if (hOf(mid) < 0) {
291
+ lo = mid;
292
+ } else {
293
+ hi = mid;
294
+ }
295
+ if (hi - lo <= 1e-12 * Math.max(1, hi)) break;
296
+ }
297
+ const tensionN = 0.5 * (lo + hi);
298
+ return { tensionN, iterations, residualN: hOf(tensionN) };
299
+ }
300
+ function tensionAt(input) {
301
+ const T1N = input.baseTensionKN * 1e3;
302
+ if (!(T1N > 0)) {
303
+ throw new RangeError(`\u57FA\u51C6\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.baseTensionKN} kN`);
304
+ }
305
+ if (!(input.spanM > 0)) {
306
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.spanM} m`);
307
+ }
308
+ const K = stateCoefficientK(
309
+ input.weightPerLengthNPerM,
310
+ input.spanM,
311
+ input.elasticModulusGPa,
312
+ input.crossSectionMM2
313
+ );
314
+ const ePa = input.elasticModulusGPa * 1e9;
315
+ const aM2 = input.crossSectionMM2 * 1e-6;
316
+ const alphaEA = input.expansionPerDegC * ePa * aM2;
317
+ const fBase = T1N - K / (T1N * T1N);
318
+ const target = fBase - alphaEA * (input.targetTempDegC - input.baseTempDegC);
319
+ const { tensionN, iterations, residualN } = solveTensionN(K, target);
320
+ return {
321
+ targetTempDegC: input.targetTempDegC,
322
+ tensionKN: tensionN / 1e3,
323
+ sagM: sagM(input.weightPerLengthNPerM, input.spanM, tensionN),
324
+ iterations,
325
+ residualN
326
+ };
327
+ }
328
+ function tensionCurve(base, tempsDegC) {
329
+ return tempsDegC.map((t) => tensionAt({ ...base, targetTempDegC: t }));
330
+ }
331
+
332
+ // src/dropper/meta.ts
333
+ var dropperMeta = {
334
+ name: "\u540A\u5F26\u957F\u5EA6\u8BA1\u7B97",
335
+ nameEn: "Dropper Length Calculator",
336
+ summary: "\u6309\u629B\u7269\u7EBF\u5F1B\u5EA6\u516C\u5F0F\u8BA1\u7B97\u94FE\u5F62\u60AC\u6302\u5404\u540A\u5F26\u957F\u5EA6\uFF0C\u652F\u6301\u7B80\u5355\u94FE\u5F62\u4E0E\u5F39\u6027\u94FE\u5F62\u4E24\u79CD\u60AC\u6302\u7C7B\u578B\u3002",
337
+ formula: [
338
+ "\u63A5\u89E6\u7EBF\u5F1B\u5EA6\uFF08\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Af_c(x) = q_c\xB7x\xB7(L\u2212x) / (2\xB7T_c)",
339
+ "\u627F\u529B\u7D22\u5F1B\u5EA6\uFF1Af_m(x) = q_m\xB7x\xB7(L\u2212x) / (2\xB7T_m)",
340
+ "\u7B80\u5355\u94FE\u5F62\uFF1Al_i = H \u2212 f_c(x_i)",
341
+ "\u5F39\u6027\u94FE\u5F62\uFF08\u8BA1\u5165\u627F\u529B\u7D22\u5F1B\u5EA6\uFF09\uFF1Al_i = H \u2212 f_c(x_i) + f_m(x_i)",
342
+ "\u8DE8\u4E2D\u6700\u5927\u5F1B\u5EA6\uFF1Af_max = q_c\xB7L\xB2 / (8\xB7T_c)"
343
+ ],
344
+ references: [
345
+ "\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u9002\u7528\u4E8E f/L \u2264 1/10 \u7684\u5C0F\u5F1B\u5EA6\u5DE5\u51B5",
346
+ "\u540A\u5F26\u95F4\u8DDD\u987B\u80FD\u6574\u9664\u8DE8\u8DDD\uFF1B\u5B9E\u9645\u540A\u5F26\u5E03\u7F6E\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6",
347
+ "\u5F39\u6027\u94FE\u5F62\u60AC\u6302\u987B\u540C\u65F6\u63D0\u4F9B\u627F\u529B\u7D22\u5F20\u529B\u4E0E\u5355\u4F4D\u8377\u8F7D"
348
+ ],
349
+ scope: [
350
+ "\u8DE8\u8DDD L\uFF1A5 ~ 80 m",
351
+ "\u63A5\u89E6\u7EBF\u5F20\u529B T_c\uFF1A1 ~ 40 kN",
352
+ "\u7ED3\u6784\u9AD8\u5EA6 H\uFF1A0.3 ~ 3 m",
353
+ "\u63A5\u89E6\u7EBF\u5355\u4F4D\u8377\u8F7D q_c\uFF1A0.001 ~ 0.1 kN/m",
354
+ "\u540A\u5F26\u95F4\u8DDD d\uFF1A1 ~ 15 m\uFF0C\u987B\u80FD\u6574\u9664\u8DE8\u8DDD",
355
+ "\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u5927\u5F1B\u5EA6\u5DE5\u51B5\u8BEF\u5DEE\u589E\u5927",
356
+ "\u672A\u8BA1\u5165\u540A\u5F26\u81EA\u8EAB\u4F38\u957F\u3001\u6E29\u5EA6\u53D8\u5316\u4E0E\u96F6\u90E8\u4EF6\u5236\u9020\u516C\u5DEE"
357
+ ],
358
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
359
+ online: "https://www.itswe.com/calculator/dropper/"
360
+ };
361
+
362
+ // src/dropper/index.ts
363
+ function parabolaSagM(xM, spanM, loadKNPerM, tensionKN) {
364
+ if (!(tensionKN > 0)) {
365
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionKN} kN`);
366
+ }
367
+ if (xM < 0 || xM > spanM) {
368
+ throw new RangeError(`\u4F4D\u7F6E x = ${xM} m \u8D85\u51FA\u8DE8\u8DDD 0 ~ ${spanM} m`);
369
+ }
370
+ return loadKNPerM * xM * (spanM - xM) / (2 * tensionKN);
371
+ }
372
+ function maxParabolaSagM(spanM, loadKNPerM, tensionKN) {
373
+ return loadKNPerM * spanM * spanM / (8 * tensionKN);
374
+ }
375
+ function dropperPositionsM(spanM, spacingM) {
376
+ if (!(spanM > 0)) {
377
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
378
+ }
379
+ if (!(spacingM > 0)) {
380
+ throw new RangeError(`\u540A\u5F26\u95F4\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spacingM} m`);
381
+ }
382
+ const intervals = spanM / spacingM;
383
+ const rounded = Math.round(intervals);
384
+ if (Math.abs(intervals - rounded) > 1e-9 || rounded < 1) {
385
+ throw new RangeError(
386
+ `\u540A\u5F26\u95F4\u8DDD ${spacingM} m \u4E0D\u80FD\u6574\u9664\u8DE8\u8DDD ${spanM} m\uFF08\u5F97\u5230 ${intervals} \u6BB5\uFF09`
387
+ );
388
+ }
389
+ return Array.from({ length: rounded + 1 }, (_, i) => i * spacingM);
390
+ }
391
+ function dropperLengths(input) {
392
+ const {
393
+ suspension,
394
+ spanM,
395
+ contactTensionKN,
396
+ structureHeightM,
397
+ contactLoadKNPerM,
398
+ dropperSpacingM: spacingM
399
+ } = input;
400
+ if (!(contactTensionKN > 0)) {
401
+ throw new RangeError(`\u63A5\u89E6\u7EBF\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${contactTensionKN} kN`);
402
+ }
403
+ if (!(contactLoadKNPerM > 0)) {
404
+ throw new RangeError(`\u63A5\u89E6\u7EBF\u5355\u4F4D\u8377\u8F7D\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${contactLoadKNPerM} kN/m`);
405
+ }
406
+ if (!(structureHeightM > 0)) {
407
+ throw new RangeError(`\u7ED3\u6784\u9AD8\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${structureHeightM} m`);
408
+ }
409
+ if (suspension === "elastic") {
410
+ const m = input.messenger;
411
+ if (!m) {
412
+ throw new RangeError("\u5F39\u6027\u94FE\u5F62\u60AC\u6302\u5FC5\u987B\u63D0\u4F9B\u627F\u529B\u7D22\u53C2\u6570\uFF08messenger\uFF09");
413
+ }
414
+ if (!(m.tensionKN > 0) || !(m.loadKNPerM > 0)) {
415
+ throw new RangeError("\u627F\u529B\u7D22\u5F20\u529B\u4E0E\u5355\u4F4D\u8377\u8F7D\u5FC5\u987B\u4E3A\u6B63\u6570");
416
+ }
417
+ }
418
+ const positions = dropperPositionsM(spanM, spacingM);
419
+ const messenger = suspension === "elastic" ? input.messenger : null;
420
+ const points = positions.map((xM, index) => {
421
+ const contactSag = parabolaSagM(
422
+ xM,
423
+ spanM,
424
+ contactLoadKNPerM,
425
+ contactTensionKN
426
+ );
427
+ const messengerSag = messenger && messenger !== null ? parabolaSagM(xM, spanM, messenger.loadKNPerM, messenger.tensionKN) : 0;
428
+ const dropperLengthM = structureHeightM - contactSag + messengerSag;
429
+ if (dropperLengthM <= 0) {
430
+ throw new RangeError(
431
+ `x = ${xM} m \u5904\u540A\u5F26\u957F\u5EA6\u975E\u6B63\uFF08${dropperLengthM.toFixed(4)} m\uFF09\uFF1A\u7ED3\u6784\u9AD8\u5EA6 ${structureHeightM} m \u4E0D\u8DB3\uFF0C\u8BF7\u590D\u6838\u8F93\u5165`
432
+ );
433
+ }
434
+ return { index, positionM: xM, contactSagM: contactSag, messengerSagM: messengerSag, dropperLengthM };
435
+ });
436
+ let maxSagM = 0;
437
+ let shortestDropperM = Number.POSITIVE_INFINITY;
438
+ for (const p of points) {
439
+ if (p.contactSagM > maxSagM) maxSagM = p.contactSagM;
440
+ if (p.dropperLengthM < shortestDropperM) shortestDropperM = p.dropperLengthM;
441
+ }
442
+ return {
443
+ points,
444
+ maxSagM,
445
+ shortestDropperM,
446
+ count: points.length
447
+ };
448
+ }
449
+
450
+ // src/wind/meta.ts
451
+ var windMeta = {
452
+ name: "\u98CE\u504F\u9650\u754C\u6821\u9A8C",
453
+ nameEn: "Wind Deflection Clearance Check",
454
+ summary: "\u8BA1\u7B97\u7EBF\u7D22\u5728\u98CE\u8377\u8F7D\u4F5C\u7528\u4E0B\u7684\u8DE8\u4E2D\u504F\u79FB b\uFF0C\u53E0\u52A0\u62C9\u51FA\u503C\u540E\u4E0E\u9650\u754C\u5141\u8BB8\u503C\u6BD4\u8F83\uFF0C\u7ED9\u51FA\u5408\u683C/\u8D85\u9650\u7ED3\u8BBA\u3002",
455
+ formula: [
456
+ "\u5355\u4F4D\u98CE\u8377\u8F7D\uFF1Ap = \xBD\xB7\u03C1\xB7v\xB2\xB7d\xB7\u03B1\xB7sin\xB2\u03B8\uFF08\u03C1 = 1.225 kg/m\xB3\uFF09",
457
+ "\u8DE8\u4E2D\u98CE\u504F\uFF08\u7B80\u652F\u7D22\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Ab = p\xB7L\xB2 / (8\xB7T)",
458
+ "\u9650\u754C\u6821\u9A8C\uFF1Ab + a \u2264 \u9650\u754C\u5141\u8BB8\u503C\uFF0C\u6EE1\u8DB3\u5224\u4E3A\u5408\u683C"
459
+ ],
460
+ references: [
461
+ "\u7B80\u652F\u7D22\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u9002\u7528\u4E8E f/L \u2264 1/10 \u5DE5\u51B5",
462
+ "\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A\u5706\u67F1\u5F62\u7EBF\u7D22\u5E38\u53D6 1.2",
463
+ "\u9650\u754C\u5141\u8BB8\u503C\u6309\u53D7\u7535\u5F13\u52A8\u6001\u5305\u7EDC\u7EBF\u53D6\u503C"
464
+ ],
465
+ scope: [
466
+ "\u98CE\u901F v\uFF1A0 ~ 60 m/s",
467
+ "\u98CE\u5411\u4E0E\u7EBF\u8DEF\u5939\u89D2 \u03B8\uFF1A0 ~ 180\xB0\uFF0C90\xB0 \u4E3A\u5782\u76F4\u4E8E\u7EBF\u8DEF",
468
+ "\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 30 mm",
469
+ "\u7EBF\u7D22\u5F20\u529B T\uFF1A1 ~ 40 kN",
470
+ "\u8DE8\u8DDD L\uFF1A5 ~ 80 m",
471
+ "\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A0.5 ~ 2.0",
472
+ "\u62C9\u51FA\u503C a\uFF1A0 ~ 0.6 m",
473
+ "\u9650\u754C\u5141\u8BB8\u503C\uFF1A0.1 ~ 2 m",
474
+ "\u672A\u8BA1\u5165\u7EBF\u7D22\u98CE\u81F4\u632F\u52A8\u3001\u9A70\u632F\u4E0E\u8986\u51B0\u9644\u52A0\u98CE\u8F7D"
475
+ ],
476
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
477
+ online: "https://www.itswe.com/calculator/wind/"
478
+ };
479
+
480
+ // src/wind/index.ts
481
+ var AIR_DENSITY_KG_PER_M3 = 1.225;
482
+ function windLoadNPerM(params) {
483
+ const {
484
+ windSpeedMPerS,
485
+ windAngleDeg,
486
+ wireDiameterMM,
487
+ dragCoefficient,
488
+ airDensityKgPerM3
489
+ } = params;
490
+ if (!(windSpeedMPerS >= 0)) {
491
+ throw new RangeError(`\u98CE\u901F\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${windSpeedMPerS} m/s`);
492
+ }
493
+ if (!(wireDiameterMM > 0)) {
494
+ throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterMM} mm`);
495
+ }
496
+ if (!(dragCoefficient > 0)) {
497
+ throw new RangeError(`\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${dragCoefficient}`);
498
+ }
499
+ if (!(windAngleDeg >= 0 && windAngleDeg <= 180)) {
500
+ throw new RangeError(
501
+ `\u98CE\u5411\u4E0E\u7EBF\u8DEF\u5939\u89D2\u5E94\u4E3A 0 ~ 180\xB0\uFF0C\u6536\u5230 ${windAngleDeg}\xB0`
502
+ );
503
+ }
504
+ const rho = airDensityKgPerM3 ?? AIR_DENSITY_KG_PER_M3;
505
+ if (!(rho > 0)) {
506
+ throw new RangeError(`\u7A7A\u6C14\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${rho} kg/m\xB3`);
507
+ }
508
+ const dM = wireDiameterMM * 1e-3;
509
+ const sinTheta = Math.sin(windAngleDeg * Math.PI / 180);
510
+ return 0.5 * rho * windSpeedMPerS * windSpeedMPerS * dM * dragCoefficient * sinTheta * sinTheta;
511
+ }
512
+ function windDeflectionM(windLoadNPerM2, spanM, tensionKN) {
513
+ if (!(windLoadNPerM2 >= 0)) {
514
+ throw new RangeError(`\u5355\u4F4D\u98CE\u8377\u8F7D\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${windLoadNPerM2} N/m`);
515
+ }
516
+ if (!(spanM > 0)) {
517
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
518
+ }
519
+ if (!(tensionKN > 0)) {
520
+ throw new RangeError(`\u7EBF\u7D22\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionKN} kN`);
521
+ }
522
+ return windLoadNPerM2 * spanM * spanM / (8 * tensionKN * 1e3);
523
+ }
524
+ function windClearanceCheck(input) {
525
+ const { staggerM, clearanceLimitM } = input;
526
+ if (!(staggerM >= 0)) {
527
+ throw new RangeError(`\u62C9\u51FA\u503C\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${staggerM} m`);
528
+ }
529
+ if (!(clearanceLimitM > 0)) {
530
+ throw new RangeError(`\u9650\u754C\u5141\u8BB8\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${clearanceLimitM} m`);
531
+ }
532
+ const p = windLoadNPerM(input);
533
+ const b = windDeflectionM(p, input.spanM, input.tensionKN);
534
+ const totalOffsetM = b + staggerM;
535
+ return {
536
+ windLoadNPerM: p,
537
+ deflectionM: b,
538
+ totalOffsetM,
539
+ clearanceLimitM,
540
+ marginM: clearanceLimitM - totalOffsetM,
541
+ passes: totalOffsetM <= clearanceLimitM
542
+ };
543
+ }
544
+
545
+ // src/force/meta.ts
546
+ var forceMeta = {
547
+ name: "\u5F13\u7F51\u63A5\u89E6\u529B\u7EDF\u8BA1\u8BC4\u4EF7",
548
+ nameEn: "Pantograph-Catenary Contact Force Statistical Assessment",
549
+ summary: "\u6309 EN 50367 \u7EDF\u8BA1\u8BC4\u4EF7\u4F53\u7CFB\uFF0C\u7531\u5E73\u5747\u63A5\u89E6\u529B Fm \u4E0E\u6807\u51C6\u5DEE \u03C3 \u8BA1\u7B97 Fmax=Fm+3\u03C3\u3001Fmin=Fm\u22123\u03C3\uFF0C\u5BF9\u7167\u9A8C\u6536\u9650\u503C\u7ED9\u51FA\u5224\u5B9A\uFF0C\u9002\u7528\u4E8E C1 \u68C0\u6D4B\u6570\u636E\u8BC4\u4EF7\u3002",
550
+ formula: [
551
+ "\u7EDF\u8BA1\u8BC4\u4EF7\uFF1AFmax = Fm + 3\u03C3\uFF0CFmin = Fm \u2212 3\u03C3",
552
+ "\u53C2\u8003\u76EE\u6807\u529B\uFF08AC \u4F53\u7CFB\uFF09\uFF1AFref = 0.00097\xB7v\xB2 + 70\uFF08v \u5355\u4F4D km/h\uFF09",
553
+ "DC 3kV \u4F53\u7CFB\uFF1AFref = 0.00097\xB7v\xB2 + 110",
554
+ "DC 1.5kV \u4F53\u7CFB\uFF1AFref = 0.00097\xB7v\xB2 + 140"
555
+ ],
556
+ references: [
557
+ "\u7EDF\u8BA1\u8BC4\u4EF7\u6846\u67B6\u4F9D\u636E EN 50367\uFF1B\u6D4B\u91CF\u65B9\u6CD5\u89C1 EN 50317",
558
+ "AC \u4F53\u7CFB\u5E38\u6570\u5F15\u81EA EN 50367 \u88686\uFF1BDC \u4F53\u7CFB\u5E38\u6570\u5F15\u81EA TSI ENE 2011/274/EU",
559
+ "\u9A8C\u6536\u4E0A\u4E0B\u9650\u987B\u6309\u73B0\u884C\u9A8C\u6536\u5927\u7EB2/\u5408\u540C\u586B\u5199\uFF0C\u672C\u6A21\u5757\u4E0D\u5185\u7F6E\u9650\u503C",
560
+ "v = 200 km/h \u65F6 AC \u4F53\u7CFB Fref = 108.8 N"
561
+ ],
562
+ scope: [
563
+ "Fm \u4E0E \u03C3 \u5E94\u53D6\u81EA\u540C\u4E00\u68C0\u6D4B\u533A\u6BB5\u7684\u7EDF\u8BA1\u503C\uFF08C1 \u68C0\u6D4B\u6570\u636E\uFF09",
564
+ "3\u03C3 \u51C6\u5219\u662F\u7EDF\u8BA1\u6781\u503C\u8FD1\u4F3C\uFF0C\u4E0D\u66FF\u4EE3\u9010\u70B9\u8D85\u9650\u7EDF\u8BA1",
565
+ "\u672A\u8003\u8651\u79BB\u7EBF\u7387\u3001\u71C3\u5F27\u7387\u7B49\u5176\u4ED6\u63A5\u89E6\u8D28\u91CF\u6307\u6807",
566
+ "\u5206\u6863\u8868\u503C\u4E0E\u5141\u5DEE\u5E26\u4EE5\u6807\u51C6\u539F\u6587\u4E3A\u51C6"
567
+ ],
568
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
569
+ online: "https://www.itswe.com/calculator/force/"
570
+ };
571
+
572
+ // src/force/index.ts
573
+ var REF_TARGET_COEFF = 97e-5;
574
+ var REF_TARGET_OFFSET_N = {
575
+ ac: 70,
576
+ dc3kv: 110,
577
+ dc15kv: 140
578
+ };
579
+ function referenceTargetForceN(speedKmH, system = "ac") {
580
+ if (!(speedKmH >= 0)) {
581
+ throw new RangeError(`\u901F\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${speedKmH} km/h`);
582
+ }
583
+ return REF_TARGET_COEFF * speedKmH * speedKmH + REF_TARGET_OFFSET_N[system];
584
+ }
585
+ function statisticalForcesN(meanForceN, stdDevN) {
586
+ if (!(meanForceN > 0)) {
587
+ throw new RangeError(`\u5E73\u5747\u63A5\u89E6\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${meanForceN} N`);
588
+ }
589
+ if (!(stdDevN >= 0)) {
590
+ throw new RangeError(`\u6807\u51C6\u5DEE\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${stdDevN} N`);
591
+ }
592
+ const threeSigma = 3 * stdDevN;
593
+ return { maxN: meanForceN + threeSigma, minN: meanForceN - threeSigma };
594
+ }
595
+ function assessContactForce(input) {
596
+ const { meanForceN, stdDevN, speedKmH, maxLimitN, minLimitN } = input;
597
+ const { maxN, minN } = statisticalForcesN(meanForceN, stdDevN);
598
+ const referenceTargetN = speedKmH === null ? null : referenceTargetForceN(speedKmH, input.system ?? "ac");
599
+ const meanDeviationN = referenceTargetN === null ? null : meanForceN - referenceTargetN;
600
+ const maxVerdict = maxLimitN === null ? "not-assessed" : maxN <= maxLimitN ? "pass" : "fail";
601
+ const minVerdict = minLimitN === null ? "not-assessed" : minN >= minLimitN ? "pass" : "fail";
602
+ return {
603
+ meanForceN,
604
+ stdDevN,
605
+ maxForceN: maxN,
606
+ minForceN: minN,
607
+ referenceTargetN,
608
+ meanDeviationN,
609
+ maxVerdict,
610
+ minVerdict
611
+ };
612
+ }
613
+
614
+ // src/ampacity/meta.ts
615
+ var ampacityMeta = {
616
+ name: "\u8F7D\u6D41\u91CF\u4FEE\u6B63\u4E0E\u77ED\u8DEF\u70ED\u7A33\u5B9A",
617
+ nameEn: "Ampacity Derating and Short-Circuit Thermal Stability",
618
+ summary: "\u6309\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63\u6301\u7EED\u8F7D\u6D41\u91CF\uFF0C\u5E76\u6309\u77ED\u8DEF\u70ED\u7A33\u5B9A\u6821\u6838\u6700\u5C0F\u622A\u9762\uFF0C\u7528\u4E8E\u63A5\u89E6\u7EBF/\u9644\u52A0\u5BFC\u7EBF\u622A\u9762\u9009\u578B\u4E0E\u6821\u6838\u3002",
619
+ formula: [
620
+ "\u8F7D\u6D41\u91CF\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63\uFF1AI(Ta) = I\u2080\xB7\u221A((Tmax \u2212 Ta) / (Tmax \u2212 T\u2080))",
621
+ "\u77ED\u8DEF\u70ED\u7A33\u5B9A\u6700\u5C0F\u622A\u9762\uFF1AS \u2265 I_k\xB7\u221At_k / C"
622
+ ],
623
+ references: [
624
+ "\u5141\u8BB8\u5DE5\u4F5C\u6E29\u5EA6\uFF1A\u94DC 95\u2103\u3001\u94DC\u5408\u91D1 150\u2103\uFF08TB/T 2809-2017 \u88685\uFF09",
625
+ "\u57FA\u51C6\u8F7D\u6D41\u91CF I\u2080 \u53EF\u6309 TB/T 2809-2017 \u88685 \u53D6\u503C\uFF08\u5BA4\u5185\u4E3A\u65E0\u98CE\u65E0\u65E5\u7167\u8BD5\u9A8C\u6761\u4EF6\u4E0B\u987B\u7B26\u5408\u503C\uFF0C\u5BA4\u5916\u503C\u5B9C\u53C2\u7167\uFF09",
626
+ "\u70ED\u7A33\u5B9A\u7CFB\u6570 C \u5C5E\u8BBE\u8BA1\u8F93\u5165\uFF0C\u987B\u6309\u8BBE\u8BA1\u624B\u518C\u4E0E\u4EA7\u54C1\u6280\u672F\u6761\u4EF6\u53D6\u503C"
627
+ ],
628
+ scope: [
629
+ "\u4FEE\u6B63\u5F0F\u4EC5\u8986\u76D6\u73AF\u5883\u6E29\u5EA6\u9879",
630
+ "\u9AD8\u6D77\u62D4\u3001\u96A7\u9053\u3001\u65E5\u7167\u53E0\u52A0\u573A\u666F\u987B\u53E6\u884C\u53E0\u52A0\u6563\u70ED\u4FEE\u6B63",
631
+ "\u77ED\u8DEF\u7535\u6D41 I_k \u5E94\u4E3A\u4F9B\u7535\u8BA1\u7B97\u7ED9\u51FA\u7684\u70ED\u7A33\u5B9A\u7B49\u6548\u503C",
632
+ "\u5207\u9664\u65F6\u95F4 t_k \u4E3A\u4FDD\u62A4\u52A8\u4F5C\u5168\u5207\u9664\u65F6\u95F4",
633
+ "\u672A\u8003\u8651\u90BB\u8FD1\u91D1\u5C5E\u56DE\u6D41\u3001\u96C6\u80A4\u6548\u5E94\u4E0E\u77ED\u65F6\u8FC7\u8F7D\u5DE5\u51B5"
634
+ ],
635
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
636
+ online: "https://www.itswe.com/calculator/ampacity/"
637
+ };
638
+
639
+ // src/ampacity/index.ts
640
+ var DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;
641
+ function ampacityDeratingFactor(input) {
642
+ const {
643
+ maxAllowedTempDegC: tMax,
644
+ ambientTempDegC: tAmbient,
645
+ baseAmbientTempDegC: tBaseOpt
646
+ } = input;
647
+ const tBase = tBaseOpt ?? DEFAULT_BASE_AMBIENT_TEMP_DEG_C;
648
+ if (!(input.baseAmpacityA > 0)) {
649
+ throw new RangeError(`\u57FA\u51C6\u8F7D\u6D41\u91CF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.baseAmpacityA} A`);
650
+ }
651
+ if (!(tMax > tBase)) {
652
+ throw new RangeError(
653
+ `\u5141\u8BB8\u6E29\u5EA6 ${tMax} \u2103 \u5FC5\u987B\u9AD8\u4E8E\u57FA\u51C6\u73AF\u5883\u6E29\u5EA6 ${tBase} \u2103`
654
+ );
655
+ }
656
+ if (!(tAmbient < tMax)) {
657
+ throw new RangeError(
658
+ `\u5B9E\u9645\u73AF\u5883\u6E29\u5EA6 ${tAmbient} \u2103 \u5DF2\u8FBE\u5230\u6216\u8D85\u8FC7\u5141\u8BB8\u6E29\u5EA6 ${tMax} \u2103\uFF0C\u65E0\u6CD5\u6301\u7EED\u8FD0\u884C`
659
+ );
660
+ }
661
+ if (!(tAmbient >= -273.15)) {
662
+ throw new RangeError(`\u73AF\u5883\u6E29\u5EA6\u4E0D\u80FD\u4F4E\u4E8E\u7EDD\u5BF9\u96F6\u5EA6\uFF0C\u6536\u5230 ${tAmbient} \u2103`);
663
+ }
664
+ return Math.sqrt((tMax - tAmbient) / (tMax - tBase));
665
+ }
666
+ function deratedAmpacityA(input) {
667
+ return input.baseAmpacityA * ampacityDeratingFactor(input);
668
+ }
669
+ function shortCircuitMinSectionMM2(shortCircuitCurrentKA, clearingTimeS, thermalCoefficientC) {
670
+ if (!(shortCircuitCurrentKA > 0)) {
671
+ throw new RangeError(
672
+ `\u77ED\u8DEF\u7535\u6D41\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${shortCircuitCurrentKA} kA`
673
+ );
674
+ }
675
+ if (!(clearingTimeS > 0)) {
676
+ throw new RangeError(`\u5207\u9664\u65F6\u95F4\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${clearingTimeS} s`);
677
+ }
678
+ if (!(thermalCoefficientC > 0)) {
679
+ throw new RangeError(
680
+ `\u70ED\u7A33\u5B9A\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${thermalCoefficientC} A\xB7\u221As/mm\xB2`
681
+ );
682
+ }
683
+ const iA = shortCircuitCurrentKA * 1e3;
684
+ return iA * Math.sqrt(clearingTimeS) / thermalCoefficientC;
685
+ }
686
+ function shortCircuitCheck(input) {
687
+ const minSectionMM2 = shortCircuitMinSectionMM2(
688
+ input.shortCircuitCurrentKA,
689
+ input.clearingTimeS,
690
+ input.thermalCoefficientC
691
+ );
692
+ const verdict = input.selectedSectionMM2 === null ? "not-assessed" : input.selectedSectionMM2 >= minSectionMM2 ? "pass" : "fail";
693
+ return { minSectionMM2, selectedSectionMM2: input.selectedSectionMM2, verdict };
694
+ }
695
+
696
+ // src/wear/meta.ts
697
+ var wearMeta = {
698
+ name: "\u63A5\u89E6\u7EBF\u78E8\u8017\u7387",
699
+ nameEn: "Contact Wire Wear Ratio",
700
+ summary: "\u6839\u636E\u539F\u622A\u9762\u79EF\u4E0E\u5B9E\u6D4B\u6B8B\u5B58\u622A\u9762\u8BA1\u7B97\u78E8\u8017\u7387 \u03B7\uFF0C\u03B7 > 20% \u65F6\u5EFA\u8BAE\u66F4\u6362\u63A5\u89E6\u7EBF\u3002",
701
+ formula: [
702
+ "\u78E8\u8017\u7387\uFF1A\u03B7 = (A\u2080 \u2212 A) / A\u2080 \xD7 100%",
703
+ "\u5224\u5B9A\u51C6\u5219\uFF1A\u03B7 > 20% \u5EFA\u8BAE\u66F4\u6362\u63A5\u89E6\u7EBF",
704
+ "\u6B8B\u5F84\u6362\u7B97\uFF08\u8FD1\u4F3C\uFF09\uFF1AA = \u03C0\xB7d\xB2 / 4"
705
+ ],
706
+ references: [
707
+ "\u539F\u622A\u9762\u79EF\u6765\u6E90 TB/T 2809-2017\u300A\u7535\u6C14\u5316\u94C1\u8DEF\u7528\u94DC\u53CA\u94DC\u5408\u91D1\u63A5\u89E6\u7EBF\u300B",
708
+ "\u6807\u79F0\u622A\u9762 120/150 mm\xB2 \u4E3A\u540D\u4E49\u503C\uFF0C\u6807\u51C6\u53E6\u5217\u8BA1\u7B97\u622A\u9762 121/151 mm\xB2\uFF0C\u5B9E\u9645\u622A\u9762\u7531 TB/T 2809-2017 \u88682 \u5916\u5F62\u5C3A\u5BF8\u516C\u5DEE\u5E26\u63A7\u5236",
709
+ "\u78E8\u8017\u66F4\u6362\u9608\u503C\u8BF7\u4EE5\u6700\u65B0\u7248\u8FD0\u7EF4\u89C4\u7A0B\u4E3A\u51C6"
710
+ ],
711
+ scope: [
712
+ "\u6B8B\u5F84\u6362\u7B97\u6309\u5706\u622A\u9762\u8FD1\u4F3C\uFF0C\u63A5\u89E6\u7EBF\u5B9E\u9645\u4E3A\u68AF\u5F62\u622A\u9762\uFF0C\u6362\u7B97\u503C\u5B58\u5728\u7CFB\u7EDF\u6027\u504F\u5DEE",
713
+ "\u672A\u8003\u8651\u78E8\u8017\u6CBF\u8DE8\u8DDD\u65B9\u5411\u7684\u4E0D\u5747\u5300\u5206\u5E03",
714
+ "\u5B9E\u9645\u4EA7\u54C1\u622A\u9762\u4EE5\u51FA\u5382\u68C0\u9A8C\u5355\u4E3A\u51C6"
715
+ ],
716
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
717
+ online: "https://www.itswe.com/calculator/wear/"
718
+ };
719
+
720
+ // src/wear/index.ts
721
+ var DEFAULT_REPLACEMENT_THRESHOLD_PERCENT = 20;
722
+ var NOMINAL_SECTION_MM2 = {
723
+ "CTHM-120": 120,
724
+ "CTHM-150": 150,
725
+ "CTHA-120": 120,
726
+ "CTHA-150": 150,
727
+ "CTHS-120": 120,
728
+ "CTHS-150": 150
729
+ };
730
+ function sectionFromDiameterMM2(diameterMM) {
731
+ if (!(diameterMM > 0)) {
732
+ throw new RangeError(`\u6B8B\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${diameterMM} mm`);
733
+ }
734
+ return Math.PI * diameterMM * diameterMM / 4;
735
+ }
736
+ function wearRatio(input) {
737
+ const { originalSectionMM2: a0 } = input;
738
+ if (!(a0 > 0)) {
739
+ throw new RangeError(`\u539F\u622A\u9762\u79EF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${a0} mm\xB2`);
740
+ }
741
+ const residualSectionMM2 = input.mode === "area" ? input.residualSectionMM2 : sectionFromDiameterMM2(input.residualDiameterMM);
742
+ if (!(residualSectionMM2 > 0)) {
743
+ throw new RangeError(`\u6B8B\u622A\u9762\u79EF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${residualSectionMM2} mm\xB2`);
744
+ }
745
+ if (residualSectionMM2 > a0) {
746
+ throw new RangeError(
747
+ `\u6B8B\u622A\u9762\u79EF ${residualSectionMM2.toFixed(2)} mm\xB2 \u4E0D\u80FD\u5927\u4E8E\u539F\u622A\u9762\u79EF ${a0} mm\xB2`
748
+ );
749
+ }
750
+ const thresholdPercent = input.replacementThresholdPercent ?? DEFAULT_REPLACEMENT_THRESHOLD_PERCENT;
751
+ if (!(thresholdPercent > 0)) {
752
+ throw new RangeError(`\u66F4\u6362\u9608\u503C\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${thresholdPercent}%`);
753
+ }
754
+ const sectionLossMM2 = a0 - residualSectionMM2;
755
+ const wearPercent = sectionLossMM2 / a0 * 100;
756
+ return {
757
+ originalSectionMM2: a0,
758
+ residualSectionMM2,
759
+ sectionLossMM2,
760
+ wearPercent,
761
+ thresholdPercent,
762
+ verdict: wearPercent > thresholdPercent ? "replace" : "keep"
763
+ };
764
+ }
765
+ function nominalSectionMM2(model) {
766
+ return NOMINAL_SECTION_MM2[model];
767
+ }
768
+
769
+ // src/copper/meta.ts
770
+ var copperMeta = {
771
+ name: "\u63A5\u89E6\u7EBF\u53C2\u6570\u901F\u67E5",
772
+ nameEn: "Contact Wire Parameter Lookup",
773
+ summary: "\u5185\u7F6E CTHM / CTHA / CTHS \u7CFB\u5217 120/150 mm\xB2 \u63A5\u89E6\u7EBF\u53C2\u6570\u8868\uFF0C\u6309\u957F\u5EA6\u4E0E\u73AF\u5883\u6E29\u5EA6\u7ED9\u51FA\u603B\u91CD\u91CF\u4E0E\u6E29\u5EA6\u4FEE\u6B63\u7535\u963B\u3002",
774
+ formula: [
775
+ "\u7535\u963B\u6E29\u5EA6\u4FEE\u6B63\uFF08\u03B1 = 0.00393 /\u2103\uFF09\uFF1Ar_T = r\u2082\u2080\xB7[1 + \u03B1\xB7(T \u2212 20)]",
776
+ "\u603B\u91CD\u91CF\uFF1AW = w\u2080 \xD7 l\uFF08w\u2080 \u5355\u4F4D\u91CD\u91CF kg/km\uFF0Cl \u957F\u5EA6 km\uFF09"
777
+ ],
778
+ references: [
779
+ "\u5185\u7F6E\u53C2\u6570\u8868\u6765\u6E90 TB/T 2809-2017\u300A\u7535\u6C14\u5316\u94C1\u8DEF\u7528\u94DC\u53CA\u94DC\u5408\u91D1\u63A5\u89E6\u7EBF\u300B\uFF082018-05-01 \u5B9E\u65BD\uFF09",
780
+ "\u5355\u4F4D\u91CD\u91CF\u4E3A\u6807\u79F0\u503C",
781
+ "\u8F7D\u6D41\u91CF\u4E3A 150\u2103 \u6301\u7EED\u503C\uFF0C\u5BA4\u5185/\u5BA4\u5916\u53CC\u53E3\u5F84\u6309\u6807\u51C6\u88685",
782
+ "r\u2082\u2080 \u9664 CTHM-120 \u53D6\u7ED9\u5B9A\u503C\u5916\uFF0C\u5747\u6309\u5BFC\u7535\u7387\u53CD\u7B97\u4F30\u7B97\uFF08IACS \u6807\u51C6\u7535\u963B\u7387 0.017241 \u03A9\xB7mm\xB2/m \xF7 \u5BFC\u7535\u7387 \xF7 \u622A\u9762\u79EF\uFF1B0.017241 = 1/58\uFF09",
783
+ "\u6B63\u5F0F\u5DE5\u7A0B\u4EE5\u4EA7\u54C1\u6807\u51C6\u4E0E\u51FA\u5382\u68C0\u9A8C\u5355\u4E3A\u51C6"
784
+ ],
785
+ scope: [
786
+ "\u6E29\u5EA6\u4FEE\u6B63\u4EC5\u8986\u76D6\u7535\u963B\uFF0C\u672A\u4FEE\u6B63\u5355\u4F4D\u91CD\u91CF\u4E0E\u8F7D\u6D41\u91CF",
787
+ "\u9002\u7528\u6E29\u5EA6 \u221240 ~ 90 \u2103",
788
+ "\u8F7D\u6D41\u91CF\u4E3A 150\u2103 \u5141\u8BB8\u6E29\u5EA6\u4E0B\u7684\u6301\u7EED\u503C\uFF0C\u672A\u505A\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63"
789
+ ],
790
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
791
+ online: "https://www.itswe.com/calculator/copper/"
792
+ };
793
+
794
+ // src/copper/index.ts
795
+ var TB2809_WIRE_PARAMS = {
796
+ "CTHM-120": {
797
+ unitWeightKgPerKm: 1082,
798
+ r20OhmPerKm: 0.2113,
799
+ ampacityIndoor150A: 430,
800
+ ampacityOutdoor150A: 560,
801
+ note: "\u53D6\u6807\u51C6 CTMH \u884C\uFF08\u9AD8\u5F3A\u5EA6\u94DC\u9541\u5408\u91D1\uFF09\uFF0C\u03C1 \u6309\u6807\u51C6\u4E0A\u9650 0.02535 \u8BA1\u7B97"
802
+ },
803
+ "CTHM-150": {
804
+ unitWeightKgPerKm: 1350,
805
+ r20OhmPerKm: 0.169,
806
+ ampacityIndoor150A: 500,
807
+ ampacityOutdoor150A: 650,
808
+ note: "\u53D6\u6807\u51C6 CTMH \u884C\uFF08\u9AD8\u5F3A\u5EA6\u94DC\u9541\u5408\u91D1\uFF09"
809
+ },
810
+ "CTHA-120": {
811
+ unitWeightKgPerKm: 1070,
812
+ r20OhmPerKm: 0.1481,
813
+ ampacityIndoor150A: 515,
814
+ ampacityOutdoor150A: 680,
815
+ note: "\u53D6\u6807\u51C6 CTA \u884C\uFF08\u94DC\u94F6\u5408\u91D1\uFF09\uFF0C\u03C1 \u2264 0.01777"
816
+ },
817
+ "CTHA-150": {
818
+ unitWeightKgPerKm: 1330,
819
+ r20OhmPerKm: 0.1185,
820
+ ampacityIndoor150A: 620,
821
+ ampacityOutdoor150A: 785,
822
+ note: "\u53D6\u6807\u51C6 CTA \u884C\uFF08\u94DC\u94F6\u5408\u91D1\uFF09"
823
+ },
824
+ "CTHS-120": {
825
+ unitWeightKgPerKm: 1080,
826
+ r20OhmPerKm: 0.1916,
827
+ ampacityIndoor150A: 515,
828
+ ampacityOutdoor150A: 680,
829
+ note: "\u53D6\u6807\u51C6 CTS \u884C\uFF08\u94DC\u9521\u5408\u91D1\uFF09\uFF0C\u8F7D\u6D41\u91CF\u6309 CTS \u884C\u53D6\u503C"
830
+ },
831
+ "CTHS-150": {
832
+ unitWeightKgPerKm: 1345,
833
+ r20OhmPerKm: 0.1533,
834
+ ampacityIndoor150A: 620,
835
+ ampacityOutdoor150A: 790,
836
+ note: "\u53D6\u6807\u51C6 CTS \u884C\uFF08\u94DC\u9521\u5408\u91D1\uFF09\uFF0C\u8F7D\u6D41\u91CF\u6309 CTS \u884C\u53D6\u503C"
837
+ }
838
+ };
839
+ function wireLookup(input) {
840
+ const { model, lengthKm, ambientTempDegC } = input;
841
+ const params = TB2809_WIRE_PARAMS[model];
842
+ if (params === void 0) {
843
+ throw new RangeError(`\u672A\u77E5\u578B\u53F7\uFF1A${model}`);
844
+ }
845
+ if (!(lengthKm > 0)) {
846
+ throw new RangeError(`\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${lengthKm} km`);
847
+ }
848
+ if (ambientTempDegC < -40 || ambientTempDegC > 90) {
849
+ throw new RangeError(`\u9002\u7528\u6E29\u5EA6\u4E3A \u221240 ~ 90 \u2103\uFF0C\u6536\u5230 ${ambientTempDegC} \u2103`);
850
+ }
851
+ const rT = resistanceAtTempOhmPerKm(params.r20OhmPerKm, ambientTempDegC);
852
+ return {
853
+ model,
854
+ ...params,
855
+ totalWeightKg: params.unitWeightKgPerKm * lengthKm,
856
+ rTOhmPerKm: rT,
857
+ totalResistanceOhm: rT * lengthKm
858
+ };
859
+ }
860
+
861
+ // src/stroke/meta.ts
862
+ var strokeMeta = {
863
+ name: "\u8865\u507F\u884C\u7A0B",
864
+ nameEn: "Compensation Stroke",
865
+ summary: "\u6309\u6E29\u5EA6\u4F38\u7F29\u91CF\u516C\u5F0F\u8BA1\u7B97\u951A\u6BB5\u7EBF\u7D22\u4F38\u7F29\u91CF\u4E0E\u8865\u507F\u88C5\u7F6E\u6240\u9700\u884C\u7A0B\uFF0C\u53EF\u5BF9\u7167\u88C5\u7F6E\u8BB8\u7528\u884C\u7A0B\u6821\u6838\u3002",
866
+ formula: [
867
+ "\u6E29\u5EA6\u4F38\u7F29\u91CF\uFF1A\u0394L = \u03B1\xB7L\xB7\u0394t",
868
+ "\u8865\u507F\u884C\u7A0B\u8BBE\u8BA1\u503C\uFF08\u542B\u88D5\u5EA6\uFF09\uFF1AS = n\xB7\u0394L + S\u2080"
869
+ ],
870
+ references: [
871
+ "\u5168\u8865\u507F\u951A\u6BB5\u63A5\u89E6\u7EBF\u4E0E\u627F\u529B\u7D22\u987B\u5206\u522B\u8BA1\u7B97\uFF08\u5404\u81EA \u03B1/L \u4E0D\u540C\uFF09\uFF1B\u534A\u8865\u507F\u4EC5\u8BA1\u7B97\u63A5\u89E6\u7EBF\u4FA7",
872
+ "\u4F20\u52A8\u6BD4\u5E38\u89C1\u89C4\u683C\uFF1A\u6ED1\u8F6E\u7EC4 1:2/1:3\uFF08\u4E3B\u6D41\uFF09\u30011:4 \u89C1\u4E8E\u6559\u6750\u6848\u4F8B\uFF0C\u65E0\u6807\u51C6\u7EDF\u4E00\u6863\u4F4D\u8868",
873
+ "\u5B89\u88C5\u88D5\u5EA6\u53EF\u53C2\u7167\u8865\u507F\u5668 a/b \u503C\uFF1A\u4EFB\u4F55\u60C5\u51B5\u4E0B\u4E0D\u5C0F\u4E8E 200mm\uFF08\u539F\u94C1\u8FD0\u30142007\u301569\u53F7\u7B2C87\u6761\uFF0C\u5DF2\u7531\u94C1\u603B\u8FD0\u30142017\u30159\u53F7\u627F\u63A5\uFF09\uFF1B\u8BBE\u8BA1\u53D6\u503C\u60EF\u4F8B\u4E0D\u5C0F\u4E8E 300mm\uFF0C\u5C5E\u6559\u6750/\u8BBE\u8BA1\u60EF\u4F8B\u800C\u975E\u89C4\u7A0B\u6761\u6B3E",
874
+ "\u8865\u507F\u88C5\u7F6E\u4EA7\u54C1\u8981\u6C42\u89C1 TB/T 2075.12-2024\uFF08\u6ED1\u8F6E\u8865\u507F\u88C5\u7F6E\uFF09\u3001TB/T 2075.13-2024\uFF08\u68D8\u8F6E\u8865\u507F\u88C5\u7F6E\uFF09\u4E0E TB/T 2073-2020\uFF08\u96F6\u90E8\u4EF6\u6280\u672F\u6761\u4EF6\uFF09"
875
+ ],
876
+ scope: [
877
+ "\u951A\u6BB5\u957F\u5EA6 L \u4E3A\u4E24\u7AEF\u951A\u56FA\u70B9\u4E4B\u95F4\u957F\u5EA6",
878
+ "\u8BBE\u8BA1\u6E29\u5DEE \u0394t \u4E3A\u6700\u9AD8\u4E0E\u6700\u4F4E\u8BBE\u8BA1\u6E29\u5EA6\u4E4B\u5DEE",
879
+ "\u94DC\u5408\u91D1\u7EBF\u81A8\u80C0\u7CFB\u6570\u7EA6 1.7\xD710\u207B\u2075/\u2103\uFF08EN 50149 \u94DC\u9521\u63A5\u89E6\u7EBF\u6570\u636E\u8868\uFF09",
880
+ "\u5168\u8865\u507F\u951A\u6BB5\u627F\u529B\u7D22\u4FA7\u987B\u53E6\u884C\u8BA1\u7B97",
881
+ "\u53C2\u6570\u53D6\u503C\u4EE5\u8BBE\u8BA1\u89C4\u7A0B\u4E3A\u51C6"
882
+ ],
883
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
884
+ online: "https://www.itswe.com/calculator/stroke/"
885
+ };
886
+
887
+ // src/stroke/index.ts
888
+ var TRANSMISSION_RATIOS = [2, 3, 4];
889
+ var MIN_MARGIN_MM = 200;
890
+ var CONVENTIONAL_MARGIN_MM = 300;
891
+ function elongationMM(expansionPerDegC, anchorLengthM, tempRangeDegC) {
892
+ if (!(expansionPerDegC > 0)) {
893
+ throw new RangeError(`\u7EBF\u81A8\u80C0\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${expansionPerDegC} 1/\u2103`);
894
+ }
895
+ if (!(anchorLengthM > 0)) {
896
+ throw new RangeError(`\u951A\u6BB5\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${anchorLengthM} m`);
897
+ }
898
+ if (!(tempRangeDegC > 0)) {
899
+ throw new RangeError(`\u8BBE\u8BA1\u6E29\u5DEE\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tempRangeDegC} \u2103`);
900
+ }
901
+ return expansionPerDegC * anchorLengthM * tempRangeDegC * 1e3;
902
+ }
903
+ function requiredStrokeMM(elongation, ratio, marginMM) {
904
+ if (!(elongation >= 0)) {
905
+ throw new RangeError(`\u4F38\u7F29\u91CF\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${elongation} mm`);
906
+ }
907
+ if (!(marginMM >= 0)) {
908
+ throw new RangeError(`\u5B89\u88C5\u88D5\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${marginMM} mm`);
909
+ }
910
+ return ratio * elongation + marginMM;
911
+ }
912
+ function strokeCheck(input) {
913
+ const { transmissionRatio, allowableStrokeMM } = input;
914
+ if (!TRANSMISSION_RATIOS.includes(transmissionRatio)) {
915
+ throw new RangeError(
916
+ `\u4F20\u52A8\u6BD4\u5E94\u4E3A ${TRANSMISSION_RATIOS.map((r) => `1:${r}`).join(" / ")}\uFF0C\u6536\u5230 1:${transmissionRatio}`
917
+ );
918
+ }
919
+ if (!(input.marginMM >= 0)) {
920
+ throw new RangeError(`\u5B89\u88C5\u88D5\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${input.marginMM} mm`);
921
+ }
922
+ const elongation = elongationMM(
923
+ input.expansionPerDegC,
924
+ input.anchorLengthM,
925
+ input.tempRangeDegC
926
+ );
927
+ const perDegreeMM = elongation / input.tempRangeDegC;
928
+ const required = requiredStrokeMM(elongation, transmissionRatio, input.marginMM);
929
+ if (allowableStrokeMM === null) {
930
+ return {
931
+ perDegreeMM,
932
+ elongationMM: elongation,
933
+ requiredStrokeMM: required,
934
+ allowableStrokeMM: null,
935
+ marginMM: null,
936
+ verdict: "not-assessed"
937
+ };
938
+ }
939
+ if (!(allowableStrokeMM > 0)) {
940
+ throw new RangeError(`\u88C5\u7F6E\u8BB8\u7528\u884C\u7A0B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${allowableStrokeMM} mm`);
941
+ }
942
+ return {
943
+ perDegreeMM,
944
+ elongationMM: elongation,
945
+ requiredStrokeMM: required,
946
+ allowableStrokeMM,
947
+ marginMM: allowableStrokeMM - required,
948
+ verdict: required <= allowableStrokeMM ? "pass" : "fail"
949
+ };
950
+ }
951
+
952
+ // src/wavespeed/meta.ts
953
+ var wavespeedMeta = {
954
+ name: "\u6CE2\u901F\u5229\u7528\u7387",
955
+ nameEn: "Wave Propagation Speed Utilisation",
956
+ summary: "\u7531\u63A5\u89E6\u7EBF\u5F20\u529B\u4E0E\u7EBF\u5BC6\u5EA6\u6C42\u6CE2\u4F20\u64AD\u901F\u5EA6 c \u4E0E\u6CE2\u901F\u5229\u7528\u7387 \u03B2 = v/c\uFF0C\u7ED9\u51FA\u8DE8\u8DDD\u524D\u4E09\u9636\u56FA\u6709\u9891\u7387\u4E0E\u4E00\u9636\u5171\u632F\u8F66\u901F\u3002",
957
+ formula: [
958
+ "\u6CE2\u4F20\u64AD\u901F\u5EA6\uFF1Ac = \u221A(T/\u03C1)\uFF08T \u53D6 N\uFF0C\u03C1 \u53D6 kg/m\uFF09",
959
+ "\u6CE2\u901F\u5229\u7528\u7387\uFF1A\u03B2 = v / c\uFF08v \u6362\u7B97\u4E3A m/s\uFF09",
960
+ "\u4E24\u7AEF\u56FA\u5B9A\u5F26\u56FA\u6709\u9891\u7387\uFF1Af_n = n/(2L)\xB7\u221A(T/\u03C1)",
961
+ "\u4E00\u9636\u5171\u632F\u8F66\u901F\uFF1Av_res = f\u2081\xB7L = c/2\uFF08\u8DE8\u8DDD\u901A\u8FC7\u9891\u7387 v/L \u4E0E f\u2081 \u76F8\u9047\uFF09"
962
+ ],
963
+ references: [
964
+ "\u4F9D\u636E\u672C\u7AD9 \u5F13\u7F51\u5173\u7CFB / \u6CE2\u4F20\u64AD \u6761\u76EE",
965
+ "\u03B2 \u8FBE 0.7 \u65F6\u63D0\u793A\u63A5\u8FD1\u5171\u632F\u533A\uFF0C\u8BE5\u9608\u503C\u5C5E\u5DE5\u7A0B\u7ECF\u9A8C\u503C\uFF0C\u8BF7\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6"
966
+ ],
967
+ scope: [
968
+ "\u5F20\u529B T\uFF1A5 ~ 40 kN",
969
+ "\u7EBF\u5BC6\u5EA6 \u03C1\uFF1A0.5 ~ 3 kg/m",
970
+ "\u901F\u5EA6 v\uFF1A20 ~ 500 km/h",
971
+ "\u8DE8\u8DDD l\uFF1A30 ~ 90 m",
972
+ "\u4E24\u7AEF\u56FA\u5B9A\u5F26\u6A21\u578B\uFF0C\u672A\u8003\u8651\u5F39\u6027\u652F\u627F\u4E0E\u963B\u5C3C",
973
+ "\u672A\u8003\u8651\u627F\u529B\u7D22\u4E0E\u540A\u5F26\u5BF9\u6CE2\u4F20\u64AD\u7684\u5F71\u54CD"
974
+ ],
975
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
976
+ online: "https://www.itswe.com/calculator/wavespeed/"
977
+ };
978
+
979
+ // src/wavespeed/index.ts
980
+ var DEFAULT_WARN_THRESHOLD = 0.7;
981
+ function wavePropagationSpeedMPerS(tensionKN, linearMassKgPerM) {
982
+ if (!(tensionKN > 0)) {
983
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionKN} kN`);
984
+ }
985
+ if (!(linearMassKgPerM > 0)) {
986
+ throw new RangeError(`\u7EBF\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${linearMassKgPerM} kg/m`);
987
+ }
988
+ return Math.sqrt(tensionKN * 1e3 / linearMassKgPerM);
989
+ }
990
+ function naturalFrequencyHz(n, spanM, waveSpeedMPerS) {
991
+ if (!Number.isInteger(n) || n < 1) {
992
+ throw new RangeError(`\u9636\u6B21\u5FC5\u987B\u4E3A\u6B63\u6574\u6570\uFF0C\u6536\u5230 ${n}`);
993
+ }
994
+ if (!(spanM > 0)) {
995
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
996
+ }
997
+ if (!(waveSpeedMPerS > 0)) {
998
+ throw new RangeError(`\u6CE2\u901F\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${waveSpeedMPerS} m/s`);
999
+ }
1000
+ return n / (2 * spanM) * waveSpeedMPerS;
1001
+ }
1002
+ function kmHToMPerS(speedKmH) {
1003
+ return speedKmH / 3.6;
1004
+ }
1005
+ function waveSpeedCheck(input) {
1006
+ const { tensionKN, linearMassKgPerM, speedKmH, spanM } = input;
1007
+ if (!(speedKmH >= 0)) {
1008
+ throw new RangeError(`\u901F\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${speedKmH} km/h`);
1009
+ }
1010
+ if (!(spanM > 0)) {
1011
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
1012
+ }
1013
+ const c = wavePropagationSpeedMPerS(tensionKN, linearMassKgPerM);
1014
+ const beta = kmHToMPerS(speedKmH) / c;
1015
+ const fns = [1, 2, 3].map((n) => naturalFrequencyHz(n, spanM, c));
1016
+ const f1 = fns[0];
1017
+ if (f1 === void 0) {
1018
+ throw new Error("\u56FA\u6709\u9891\u7387\u8BA1\u7B97\u5931\u8D25");
1019
+ }
1020
+ const threshold = input.warnThreshold ?? DEFAULT_WARN_THRESHOLD;
1021
+ return {
1022
+ waveSpeedMPerS: c,
1023
+ beta,
1024
+ betaPercent: beta * 100,
1025
+ naturalFrequenciesHz: fns,
1026
+ resonanceSpeedKmH: f1 * spanM * 3.6,
1027
+ warn: beta >= threshold
1028
+ };
1029
+ }
1030
+
1031
+ // src/voltage-drop/meta.ts
1032
+ var voltageDropMeta = {
1033
+ name: "\u7535\u538B\u964D\u6821\u6838",
1034
+ nameEn: "Voltage Drop Check",
1035
+ summary: "\u6309\u6E29\u5EA6\u4FEE\u6B63\u540E\u7684\u5355\u4F4D\u7535\u963B\u8BA1\u7B97\u4F9B\u7535\u81C2\u7535\u538B\u635F\u5931 \u0394U \u4E0E\u672B\u7AEF\u7535\u538B\uFF0C\u7528\u4E8E\u4F9B\u7535\u81C2\u957F\u5EA6\u4E0E\u5BFC\u7EBF\u622A\u9762\u6821\u6838\u3002",
1036
+ formula: [
1037
+ "\u5355\u4F4D\u7535\u963B\u6E29\u5EA6\u4FEE\u6B63\uFF1Ar_T = r\u2082\u2080\xB7[1 + \u03B1\xB7(T \u2212 20)]\uFF08\u03B1 = 0.00393 /\u2103\uFF09",
1038
+ "\u5E76\u8054 n \u8DEF\u65F6\uFF1Ar_T / n",
1039
+ "\u7535\u538B\u635F\u5931\uFF1A\u0394U = I \xB7 r_T \xB7 L\uFF08r_T \u5355\u4F4D \u03A9/km\uFF0CL \u5355\u4F4D km\uFF09",
1040
+ "\u672B\u7AEF\u7535\u538B\uFF1AU_end = U\u2080 \u2212 \u0394U\uFF1B\u538B\u964D\u7387 = \u0394U / U\u2080"
1041
+ ],
1042
+ references: [
1043
+ "\u4F9D\u636E\u672C\u7AD9 \u4F9B\u7535\u8BA1\u7B97 / \u7535\u6C14\u8BBE\u8BA1 \u6761\u76EE",
1044
+ "\u672B\u7AEF\u7535\u538B\u9650\u503C\uFF1A25kV \u4F53\u7CFB\u5E38\u6309 20kV \u638C\u63E1\uFF1B\u5B9E\u9645\u9650\u503C\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E0E\u4F9B\u7535\u8BA1\u7B97\u4E66\u4E3A\u51C6"
1045
+ ],
1046
+ scope: [
1047
+ "\u6BCD\u7EBF\u7535\u538B U\u2080\uFF1A20000 ~ 30000 V",
1048
+ "\u6301\u7EED\u7535\u6D41 I\uFF1A10 ~ 3000 A",
1049
+ "\u5355\u4F4D\u7535\u963B r\u2082\u2080\uFF1A0.05 ~ 1 \u03A9/km",
1050
+ "\u4F9B\u7535\u81C2\u7B49\u6548\u957F\u5EA6 L\uFF1A1 ~ 60 km",
1051
+ "\u73AF\u5883\u6E29\u5EA6\uFF1A\u221240 ~ 80 \u2103",
1052
+ "\u5355\u56DE\u8DEF\u96C6\u4E2D\u8D1F\u8377\u6A21\u578B\uFF0C\u672A\u8003\u8651\u8D1F\u8377\u6CBF\u4F9B\u7535\u81C2\u5206\u5E03\u4E0E\u518D\u751F\u5236\u52A8"
1053
+ ],
1054
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
1055
+ online: "https://www.itswe.com/calculator/voltage-drop/"
1056
+ };
1057
+
1058
+ // src/voltage-drop/index.ts
1059
+ var DEFAULT_MIN_END_VOLTAGE_V = 2e4;
1060
+ function voltageDropCheck(input) {
1061
+ const { busVoltageV, currentA, r20OhmPerKm, feederLengthKm } = input;
1062
+ if (!(busVoltageV > 0)) {
1063
+ throw new RangeError(`\u6BCD\u7EBF\u7535\u538B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${busVoltageV} V`);
1064
+ }
1065
+ if (!(currentA > 0)) {
1066
+ throw new RangeError(`\u6301\u7EED\u7535\u6D41\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${currentA} A`);
1067
+ }
1068
+ if (!(feederLengthKm > 0)) {
1069
+ throw new RangeError(`\u4F9B\u7535\u81C2\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${feederLengthKm} km`);
1070
+ }
1071
+ const parallelCount = input.parallelCount ?? 1;
1072
+ if (!(parallelCount > 0) || !Number.isInteger(parallelCount)) {
1073
+ throw new RangeError(`\u5E76\u8054\u5BFC\u7EBF\u6570\u5FC5\u987B\u4E3A\u6B63\u6574\u6570\uFF0C\u6536\u5230 ${parallelCount}`);
1074
+ }
1075
+ const minEndVoltageV = input.minEndVoltageV ?? DEFAULT_MIN_END_VOLTAGE_V;
1076
+ const rT = resistanceAtTempOhmPerKm(r20OhmPerKm, input.tempDegC ?? 25) / parallelCount;
1077
+ const voltageDropV = currentA * rT * feederLengthKm;
1078
+ const endVoltageV = busVoltageV - voltageDropV;
1079
+ return {
1080
+ rTOhmPerKm: rT,
1081
+ voltageDropV,
1082
+ endVoltageV,
1083
+ dropPercent: voltageDropV / busVoltageV * 100,
1084
+ passes: endVoltageV >= minEndVoltageV
1085
+ };
1086
+ }
1087
+
1088
+ // src/curve-stagger/meta.ts
1089
+ var curveStaggerMeta = {
1090
+ name: "\u66F2\u7EBF\u62C9\u51FA\u503C\u6821\u6838",
1091
+ nameEn: "Curve Stagger Clearance Check",
1092
+ summary: "\u8BA1\u7B97\u66F2\u7EBF\u533A\u6BB5\u8DE8\u4E2D\u7EFC\u5408\u504F\u79FB\uFF08\u62C9\u51FA\u503C\u5747\u503C\u3001\u66F2\u7EBF\u77E2\u5EA6\u3001\u98CE\u504F\u7684\u7EC4\u5408\uFF09\uFF0C\u4E0E\u53D7\u7535\u5F13\u5BB9\u8BB8\u504F\u79FB\u6BD4\u8F83\u7ED9\u51FA\u5224\u5B9A\u3002",
1093
+ formula: [
1094
+ "\u5E73\u5747\u62C9\u51FA\u503C\uFF1A\u0101 = (a\u2081 + a\u2082) / 2",
1095
+ "\u66F2\u7EBF\u77E2\u5EA6\uFF1Ac = l\xB2 / (8R)\uFF08\u76F4\u7EBF\u6BB5 R = \u221E \u65F6 c = 0\uFF09",
1096
+ "\u8D85\u9AD8\u6A2A\u79FB\uFF1A\u03B4 = H\xB7h / l\u2080",
1097
+ "\u8DE8\u4E2D\u98CE\u504F\uFF1Ap_w = (\xBD\xB7\u03C1\xB7v\xB2\xB7d\xB7\u03B1) \xB7 l\xB2 / (8T)\uFF08\u53D6\u98CE\u5411\u5782\u76F4\u7EBF\u8DEF\u7684\u6700\u4E0D\u5229\u5DE5\u51B5\uFF09",
1098
+ "\u7EFC\u5408\u504F\u79FB\uFF1Ae = max(|\u0101 + c|, |\u0101 \u2212 c|) + p_w \u2264 [e]"
1099
+ ],
1100
+ references: [
1101
+ "\u4F9D\u636E\u672C\u7AD9 \u62C9\u51FA\u503C\u8BBE\u8BA1 \u6761\u76EE",
1102
+ "\u98CE\u504F\u53D6\u98CE\u5411\u5782\u76F4\u7EBF\u8DEF\u7684\u6700\u4E0D\u5229\u5DE5\u51B5\uFF08sin\xB2\u03B8 = 1\uFF09",
1103
+ "\u5BB9\u8BB8\u504F\u79FB [e] \u6309\u53D7\u7535\u5F13\u52A8\u6001\u5305\u7EDC\u7EBF\u53D6\u503C\uFF0C\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6"
1104
+ ],
1105
+ scope: [
1106
+ "\u66F2\u7EBF\u534A\u5F84 R\uFF1A0 ~ 20000 m\uFF08\u76F4\u7EBF\u4F20 0 \u6216 Infinity\uFF09",
1107
+ "\u8DE8\u8DDD l\uFF1A20 ~ 80 m",
1108
+ "\u62C9\u51FA\u503C a\u2081/a\u2082\uFF1A\u22120.6 ~ 0.6 m\uFF08\u66F2\u7EBF\u5185\u4FA7\u4E3A\u6B63\uFF09",
1109
+ "\u98CE\u901F v\uFF1A0 ~ 60 m/s",
1110
+ "\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 30 mm",
1111
+ "\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570 \u03B1\uFF1A0.5 ~ 2",
1112
+ "\u5F20\u529B T\uFF1A5 ~ 40 kN",
1113
+ "\u6ED1\u677F\u9762\u8DDD\u8F68\u9762 H\uFF1A4 ~ 8 m\uFF1B\u5916\u8F68\u8D85\u9AD8 h\uFF1A0 ~ 0.25 m\uFF1B\u8F68\u8DDD l\u2080 \u9ED8\u8BA4 1.435 m",
1114
+ "\u26A0\uFE0F \u7AD9\u70B9\u6E90\u7801\u7684 JSDoc \u5199\u660E\u7EFC\u5408\u504F\u79FB\u542B\u8D85\u9AD8\u6A2A\u79FB\u9879 \u2213\u03B4\uFF0C\u4F46\u5B9E\u73B0\u4E2D \u03B4 \u4EC5\u8BA1\u7B97\u8FD4\u56DE\u3001\u672A\u53C2\u4E0E e \u7684\u5408\u6210\u3002\u672C\u5E93\u6309\u5B9E\u73B0\u884C\u4E3A\u5BF9\u9F50\uFF0C\u8BE6\u89C1\u6D4B\u8BD5\u4E2D\u7684\u8BF4\u660E"
1115
+ ],
1116
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
1117
+ online: "https://www.itswe.com/calculator/curve-stagger/"
1118
+ };
1119
+
1120
+ // src/curve-stagger/index.ts
1121
+ var STANDARD_GAUGE_M = 1.435;
1122
+ var DEFAULT_PANTOGRAPH_HEIGHT_M = 6;
1123
+ function versineM(spanM, curveRadiusM) {
1124
+ if (!(spanM > 0)) {
1125
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
1126
+ }
1127
+ if (!(curveRadiusM > 0) || !Number.isFinite(curveRadiusM)) {
1128
+ return 0;
1129
+ }
1130
+ return spanM * spanM / (8 * curveRadiusM);
1131
+ }
1132
+ function cantShiftM(cantM, pantographHeightM = DEFAULT_PANTOGRAPH_HEIGHT_M, gaugeM = STANDARD_GAUGE_M) {
1133
+ if (!(cantM >= 0)) {
1134
+ throw new RangeError(`\u5916\u8F68\u8D85\u9AD8\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${cantM} m`);
1135
+ }
1136
+ if (!(pantographHeightM > 0)) {
1137
+ throw new RangeError(`\u6ED1\u677F\u9762\u8DDD\u8F68\u9762\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${pantographHeightM} m`);
1138
+ }
1139
+ if (!(gaugeM > 0)) {
1140
+ throw new RangeError(`\u8F68\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${gaugeM} m`);
1141
+ }
1142
+ return pantographHeightM * cantM / gaugeM;
1143
+ }
1144
+ function curveStaggerCheck(input) {
1145
+ const { spanM, stagger1M, stagger2M, wireDiameterM, dragCoefficient, tensionN } = input;
1146
+ if (!(tensionN > 0)) {
1147
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
1148
+ }
1149
+ if (!(wireDiameterM > 0)) {
1150
+ throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
1151
+ }
1152
+ if (!(dragCoefficient > 0)) {
1153
+ throw new RangeError(`\u98CE\u8F7D\u4F53\u578B\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${dragCoefficient}`);
1154
+ }
1155
+ if (!(input.windSpeedMPerS >= 0)) {
1156
+ throw new RangeError(`\u98CE\u901F\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${input.windSpeedMPerS} m/s`);
1157
+ }
1158
+ if (!(input.allowableOffsetM > 0)) {
1159
+ throw new RangeError(`\u5BB9\u8BB8\u504F\u79FB\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.allowableOffsetM} m`);
1160
+ }
1161
+ const meanStaggerM = (stagger1M + stagger2M) / 2;
1162
+ const c = versineM(spanM, input.curveRadiusM);
1163
+ const delta = cantShiftM(
1164
+ input.cantM ?? 0,
1165
+ input.pantographHeightM ?? DEFAULT_PANTOGRAPH_HEIGHT_M,
1166
+ input.gaugeM ?? STANDARD_GAUGE_M
1167
+ );
1168
+ const rhoAir = 1.225;
1169
+ const windLoadNPerM2 = 0.5 * rhoAir * input.windSpeedMPerS * input.windSpeedMPerS * wireDiameterM * dragCoefficient;
1170
+ const pw = windLoadNPerM2 * spanM * spanM / (8 * tensionN);
1171
+ const offsetPlusM = Math.abs(meanStaggerM + c) + pw;
1172
+ const offsetMinusM = Math.abs(meanStaggerM - c) + pw;
1173
+ const maxOffsetM = Math.max(offsetPlusM, offsetMinusM);
1174
+ return {
1175
+ meanStaggerM,
1176
+ versineM: c,
1177
+ cantShiftM: delta,
1178
+ windOffsetM: pw,
1179
+ offsetPlusM,
1180
+ offsetMinusM,
1181
+ maxOffsetM,
1182
+ passes: maxOffsetM <= input.allowableOffsetM
1183
+ };
1184
+ }
1185
+
1186
+ // src/icing/meta.ts
1187
+ var icingMeta = {
1188
+ name: "\u8986\u51B0\u8377\u8F7D\u6821\u6838",
1189
+ nameEn: "Ice Load Check",
1190
+ summary: "\u6309\u51B0\u7B52\u6A21\u578B\u8BA1\u7B97\u8986\u51B0\u8377\u8F7D\uFF0C\u7ED9\u51FA\u8986\u51B0\u540E\u7684\u603B\u5782\u76F4\u8377\u8F7D\u3001\u5F1B\u5EA6\u53CA\u76F8\u5BF9\u65E0\u51B0\u5DE5\u51B5\u7684\u589E\u5E45\u3002",
1191
+ formula: [
1192
+ "\u51B0\u7B52\u6A21\u578B\u51B0\u91CD\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)",
1193
+ "\u8986\u51B0\u540E\u603B\u5782\u76F4\u8377\u8F7D\uFF1Ag_total = g_self + g_ice",
1194
+ "\u65E0\u51B0\u5F1B\u5EA6\uFF1Af\u2080 = g_self\xB7l\xB2 / (8T)",
1195
+ "\u8986\u51B0\u5F1B\u5EA6\uFF1Af_ice = g_total\xB7l\xB2 / (8T)",
1196
+ "\u5F1B\u5EA6\u589E\u5E45\uFF1A(f_ice / f\u2080 \u2212 1) \xD7 100%"
1197
+ ],
1198
+ references: [
1199
+ "\u4F9D\u636E\u672C\u7AD9 \u8986\u51B0\u8377\u8F7D / \u8377\u8F7D\u8BA1\u7B97 \u6761\u76EE",
1200
+ "\u51B0\u5BC6\u5EA6\u9ED8\u8BA4 900 kg/m\xB3\uFF0C\u8F7B\u8986\u51B0\u5730\u533A\u53EF\u53D6\u66F4\u5C0F\u503C\uFF0C\u4EE5\u5F53\u5730\u6C14\u8C61\u8D44\u6599\u4E3A\u51C6",
1201
+ "\u5747\u5300\u51B0\u7B52\u5047\u8BBE\uFF0C\u672A\u8003\u8651\u4E0D\u89C4\u5219\u8986\u51B0\u5F62\u6001"
1202
+ ],
1203
+ scope: [
1204
+ "\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 40 mm",
1205
+ "\u8986\u51B0\u539A\u5EA6 b\uFF1A0 ~ 50 mm\uFF080 \u8868\u793A\u65E0\u51B0\uFF09",
1206
+ "\u5F20\u529B T\uFF1A1 ~ 40 kN",
1207
+ "\u8DE8\u8DDD l\uFF1A10 ~ 90 m",
1208
+ "\u7EBF\u7D22\u81EA\u91CD g_self\uFF1A1 ~ 60 N/m",
1209
+ "\u51B0\u5BC6\u5EA6 \u03C1_ice\uFF1A500 ~ 950 kg/m\xB3",
1210
+ "\u5747\u5300\u51B0\u7B52\u6A21\u578B\uFF0C\u672A\u8003\u8651\u4E0D\u5747\u5300\u8986\u51B0\u3001\u8131\u51B0\u8DF3\u8DC3\u4E0E\u98CE\u51B0\u7EC4\u5408",
1211
+ "\u5F1B\u5EA6\u6309\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u672A\u8003\u8651\u8986\u51B0\u540E\u5F20\u529B\u53D8\u5316\uFF08\u672A\u4E0E\u72B6\u6001\u65B9\u7A0B\u8026\u5408\uFF09"
1212
+ ],
1213
+ disclaimer: "\u672C\u5DE5\u5177\u7ED3\u679C\u4EC5\u4F9B\u53C2\u8003\uFF0C\u5DE5\u7A0B\u5E94\u7528\u4EE5\u8BBE\u8BA1\u6587\u4EF6\u4E3A\u51C6\u3002\u8BE6\u89C1 DISCLAIMER.md\u3002",
1214
+ online: "https://www.itswe.com/calculator/icing/"
1215
+ };
1216
+
1217
+ // src/icing/index.ts
1218
+ function icingCheck(input) {
1219
+ const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;
1220
+ if (!(tensionN > 0)) {
1221
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
1222
+ }
1223
+ if (!(spanM > 0)) {
1224
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
1225
+ }
1226
+ if (!(selfWeightNPerM > 0)) {
1227
+ throw new RangeError(`\u7EBF\u7D22\u81EA\u91CD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${selfWeightNPerM} N/m`);
1228
+ }
1229
+ const iceParams = {
1230
+ wireDiameterM,
1231
+ iceThicknessM,
1232
+ ...input.iceDensityKgPerM3 === void 0 ? {} : { iceDensityKgPerM3: input.iceDensityKgPerM3 }
1233
+ };
1234
+ const gIce = iceLoadNPerM(iceParams);
1235
+ const gTotal = selfWeightNPerM + gIce;
1236
+ const fNoIce = selfWeightNPerM * spanM * spanM / (8 * tensionN);
1237
+ const fIce = gTotal * spanM * spanM / (8 * tensionN);
1238
+ return {
1239
+ iceLoadNPerM: gIce,
1240
+ totalLoadNPerM: gTotal,
1241
+ sagNoIceM: fNoIce,
1242
+ sagWithIceM: fIce,
1243
+ growthPercent: (fIce / fNoIce - 1) * 100,
1244
+ heavy: gIce > selfWeightNPerM
1245
+ };
1246
+ }
1247
+ // Annotate the CommonJS export names for ESM import in node:
1248
+ 0 && (module.exports = {
1249
+ AIR_DENSITY_KG_PER_M3,
1250
+ CONVENTIONAL_MARGIN_MM,
1251
+ COPPER_ALLOY_ALPHA_PER_DEG_C,
1252
+ COPPER_ALPHA_PER_DEG_C,
1253
+ DEFAULT_BASE_AMBIENT_TEMP_DEG_C,
1254
+ DEFAULT_ICE_DENSITY_KG_PER_M3,
1255
+ DEFAULT_MIN_END_VOLTAGE_V,
1256
+ DEFAULT_PANTOGRAPH_HEIGHT_M,
1257
+ DEFAULT_REPLACEMENT_THRESHOLD_PERCENT,
1258
+ DEFAULT_WARN_THRESHOLD,
1259
+ G0,
1260
+ IACS_RESISTIVITY_OHM_MM2_PER_M,
1261
+ MIN_MARGIN_MM,
1262
+ NOMINAL_SECTION_MM2,
1263
+ REFERENCE_DENSITY_G_PER_CM3,
1264
+ REF_TARGET_COEFF,
1265
+ REF_TARGET_OFFSET_N,
1266
+ STANDARD_GAUGE_M,
1267
+ TB2809_AMPACITY_A,
1268
+ TB2809_WIRE_PARAMS,
1269
+ TRANSMISSION_RATIOS,
1270
+ WIRE_PRESETS,
1271
+ ampacityDeratingFactor,
1272
+ ampacityMeta,
1273
+ assessContactForce,
1274
+ cantShiftM,
1275
+ copperMeta,
1276
+ curveStaggerCheck,
1277
+ curveStaggerMeta,
1278
+ deratedAmpacityA,
1279
+ deriveLinearMassKgPerM,
1280
+ dropperLengths,
1281
+ dropperMeta,
1282
+ dropperPositionsM,
1283
+ elongationMM,
1284
+ equivalentSpanM,
1285
+ findAmpacityA,
1286
+ findWirePreset,
1287
+ forceMeta,
1288
+ iceLoadNPerM,
1289
+ icingCheck,
1290
+ icingMeta,
1291
+ kmHToMPerS,
1292
+ maxParabolaSagM,
1293
+ naturalFrequencyHz,
1294
+ nominalSectionMM2,
1295
+ parabolaSagM,
1296
+ referenceTargetForceN,
1297
+ requiredStrokeMM,
1298
+ resistanceAtTempOhmPerKm,
1299
+ sagM,
1300
+ sectionFromDiameterMM2,
1301
+ shortCircuitCheck,
1302
+ shortCircuitMinSectionMM2,
1303
+ solveTensionN,
1304
+ stateCoefficientK,
1305
+ statisticalForcesN,
1306
+ strokeCheck,
1307
+ strokeMeta,
1308
+ tensionAt,
1309
+ tensionCurve,
1310
+ tensionMeta,
1311
+ versineM,
1312
+ voltageDropCheck,
1313
+ voltageDropMeta,
1314
+ wavePropagationSpeedMPerS,
1315
+ waveSpeedCheck,
1316
+ wavespeedMeta,
1317
+ wearMeta,
1318
+ wearRatio,
1319
+ weightOfPresetNPerM,
1320
+ weightPerLengthNPerM,
1321
+ windClearanceCheck,
1322
+ windDeflectionM,
1323
+ windLoadNPerM,
1324
+ windMeta,
1325
+ wireLookup
1326
+ });
1327
+ //# sourceMappingURL=index.cjs.map