ocs-calculators 0.1.0 → 0.1.2

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