ocs-calculators 0.1.1 → 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 +10 -0
  2. package/README.md +22 -1
  3. package/README_EN.md +1 -1
  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 +148 -1198
  93. package/dist/index.cjs.map +1 -1
  94. package/dist/index.d.cts +14 -761
  95. package/dist/index.d.ts +14 -761
  96. package/dist/index.js +92 -1039
  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
@@ -0,0 +1,102 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkDGO2DCO5cjs = require('./chunk-DGO2DCO5.cjs');
4
+
5
+ // src/copper/meta.ts
6
+ var copperMeta = {
7
+ name: "\u63A5\u89E6\u7EBF\u53C2\u6570\u901F\u67E5",
8
+ nameEn: "Contact Wire Parameter Lookup",
9
+ 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",
10
+ formula: [
11
+ "\u7535\u963B\u6E29\u5EA6\u4FEE\u6B63\uFF08\u03B1 = 0.00393 /\u2103\uFF09\uFF1Ar_T = r\u2082\u2080\xB7[1 + \u03B1\xB7(T \u2212 20)]",
12
+ "\u603B\u91CD\u91CF\uFF1AW = w\u2080 \xD7 l\uFF08w\u2080 \u5355\u4F4D\u91CD\u91CF kg/km\uFF0Cl \u957F\u5EA6 km\uFF09"
13
+ ],
14
+ references: [
15
+ "\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",
16
+ "\u5355\u4F4D\u91CD\u91CF\u4E3A\u6807\u79F0\u503C",
17
+ "\u8F7D\u6D41\u91CF\u4E3A 150\u2103 \u6301\u7EED\u503C\uFF0C\u5BA4\u5185/\u5BA4\u5916\u53CC\u53E3\u5F84\u6309\u6807\u51C6\u88685",
18
+ "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",
19
+ "\u6B63\u5F0F\u5DE5\u7A0B\u4EE5\u4EA7\u54C1\u6807\u51C6\u4E0E\u51FA\u5382\u68C0\u9A8C\u5355\u4E3A\u51C6"
20
+ ],
21
+ scope: [
22
+ "\u6E29\u5EA6\u4FEE\u6B63\u4EC5\u8986\u76D6\u7535\u963B\uFF0C\u672A\u4FEE\u6B63\u5355\u4F4D\u91CD\u91CF\u4E0E\u8F7D\u6D41\u91CF",
23
+ "\u9002\u7528\u6E29\u5EA6 \u221240 ~ 90 \u2103",
24
+ "\u8F7D\u6D41\u91CF\u4E3A 150\u2103 \u5141\u8BB8\u6E29\u5EA6\u4E0B\u7684\u6301\u7EED\u503C\uFF0C\u672A\u505A\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63"
25
+ ],
26
+ 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",
27
+ online: "https://www.itswe.com/calculator/copper/"
28
+ };
29
+
30
+ // src/copper/index.ts
31
+ var TB2809_WIRE_PARAMS = {
32
+ "CTHM-120": {
33
+ unitWeightKgPerKm: 1082,
34
+ r20OhmPerKm: 0.2113,
35
+ ampacityIndoor150A: 430,
36
+ ampacityOutdoor150A: 560,
37
+ 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"
38
+ },
39
+ "CTHM-150": {
40
+ unitWeightKgPerKm: 1350,
41
+ r20OhmPerKm: 0.169,
42
+ ampacityIndoor150A: 500,
43
+ ampacityOutdoor150A: 650,
44
+ note: "\u53D6\u6807\u51C6 CTMH \u884C\uFF08\u9AD8\u5F3A\u5EA6\u94DC\u9541\u5408\u91D1\uFF09"
45
+ },
46
+ "CTHA-120": {
47
+ unitWeightKgPerKm: 1070,
48
+ r20OhmPerKm: 0.1481,
49
+ ampacityIndoor150A: 515,
50
+ ampacityOutdoor150A: 680,
51
+ note: "\u53D6\u6807\u51C6 CTA \u884C\uFF08\u94DC\u94F6\u5408\u91D1\uFF09\uFF0C\u03C1 \u2264 0.01777"
52
+ },
53
+ "CTHA-150": {
54
+ unitWeightKgPerKm: 1330,
55
+ r20OhmPerKm: 0.1185,
56
+ ampacityIndoor150A: 620,
57
+ ampacityOutdoor150A: 785,
58
+ note: "\u53D6\u6807\u51C6 CTA \u884C\uFF08\u94DC\u94F6\u5408\u91D1\uFF09"
59
+ },
60
+ "CTHS-120": {
61
+ unitWeightKgPerKm: 1080,
62
+ r20OhmPerKm: 0.1916,
63
+ ampacityIndoor150A: 515,
64
+ ampacityOutdoor150A: 680,
65
+ note: "\u53D6\u6807\u51C6 CTS \u884C\uFF08\u94DC\u9521\u5408\u91D1\uFF09\uFF0C\u8F7D\u6D41\u91CF\u6309 CTS \u884C\u53D6\u503C"
66
+ },
67
+ "CTHS-150": {
68
+ unitWeightKgPerKm: 1345,
69
+ r20OhmPerKm: 0.1533,
70
+ ampacityIndoor150A: 620,
71
+ ampacityOutdoor150A: 790,
72
+ note: "\u53D6\u6807\u51C6 CTS \u884C\uFF08\u94DC\u9521\u5408\u91D1\uFF09\uFF0C\u8F7D\u6D41\u91CF\u6309 CTS \u884C\u53D6\u503C"
73
+ }
74
+ };
75
+ function wireLookup(input) {
76
+ const { model, lengthKm, ambientTempDegC } = input;
77
+ const params = TB2809_WIRE_PARAMS[model];
78
+ if (params === void 0) {
79
+ throw new RangeError(`\u672A\u77E5\u578B\u53F7\uFF1A${model}`);
80
+ }
81
+ if (!(lengthKm > 0)) {
82
+ throw new RangeError(`\u957F\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${lengthKm} km`);
83
+ }
84
+ if (ambientTempDegC < -40 || ambientTempDegC > 90) {
85
+ throw new RangeError(`\u9002\u7528\u6E29\u5EA6\u4E3A \u221240 ~ 90 \u2103\uFF0C\u6536\u5230 ${ambientTempDegC} \u2103`);
86
+ }
87
+ const rT = _chunkDGO2DCO5cjs.resistanceAtTempOhmPerKm.call(void 0, params.r20OhmPerKm, ambientTempDegC);
88
+ return {
89
+ model,
90
+ ...params,
91
+ totalWeightKg: params.unitWeightKgPerKm * lengthKm,
92
+ rTOhmPerKm: rT,
93
+ totalResistanceOhm: rT * lengthKm
94
+ };
95
+ }
96
+
97
+
98
+
99
+
100
+
101
+ exports.copperMeta = copperMeta; exports.TB2809_WIRE_PARAMS = TB2809_WIRE_PARAMS; exports.wireLookup = wireLookup;
102
+ //# sourceMappingURL=chunk-MZBQ4546.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-MZBQ4546.cjs","../src/copper/meta.ts","../src/copper/index.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACFO,IAAM,WAAA,EAA6B;AAAA,EACxC,IAAA,EAAM,4CAAA;AAAA,EACN,MAAA,EAAQ,+BAAA;AAAA,EACR,OAAA,EACE,sOAAA;AAAA,EACF,OAAA,EAAS;AAAA,IACP,oIAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,8LAAA;AAAA,IACA,kDAAA;AAAA,IACA,iIAAA;AAAA,IACA,0QAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,gIAAA;AAAA,IACA,+CAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADGA;AACA;AEeO,IAAM,mBAAA,EAA8D;AAAA,EACzE,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa,MAAA;AAAA,IACb,kBAAA,EAAoB,GAAA;AAAA,IACpB,mBAAA,EAAqB,GAAA;AAAA,IACrB,IAAA,EAAM;AAAA,EACR,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa,KAAA;AAAA,IACb,kBAAA,EAAoB,GAAA;AAAA,IACpB,mBAAA,EAAqB,GAAA;AAAA,IACrB,IAAA,EAAM;AAAA,EACR,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa,MAAA;AAAA,IACb,kBAAA,EAAoB,GAAA;AAAA,IACpB,mBAAA,EAAqB,GAAA;AAAA,IACrB,IAAA,EAAM;AAAA,EACR,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa,MAAA;AAAA,IACb,kBAAA,EAAoB,GAAA;AAAA,IACpB,mBAAA,EAAqB,GAAA;AAAA,IACrB,IAAA,EAAM;AAAA,EACR,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa,MAAA;AAAA,IACb,kBAAA,EAAoB,GAAA;AAAA,IACpB,mBAAA,EAAqB,GAAA;AAAA,IACrB,IAAA,EAAM;AAAA,EACR,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,iBAAA,EAAmB,IAAA;AAAA,IACnB,WAAA,EAAa,MAAA;AAAA,IACb,kBAAA,EAAoB,GAAA;AAAA,IACpB,mBAAA,EAAqB,GAAA;AAAA,IACrB,IAAA,EAAM;AAAA,EACR;AACF,CAAA;AAuBO,SAAS,UAAA,CAAW,KAAA,EAA8C;AACvE,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAU,gBAAgB,EAAA,EAAI,KAAA;AAE7C,EAAA,MAAM,OAAA,EAAS,kBAAA,CAAmB,KAAK,CAAA;AACvC,EAAA,GAAA,CAAI,OAAA,IAAW,KAAA,CAAA,EAAW;AACxB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,8BAAA,EAAQ,KAAK,CAAA,CAAA;AACpC,EAAA;AACqB,EAAA;AACE,IAAA;AACvB,EAAA;AACmD,EAAA;AAC5B,IAAA;AACvB,EAAA;AAEwD,EAAA;AAEjD,EAAA;AACL,IAAA;AACG,IAAA;AACuC,IAAA;AAC9B,IAAA;AACa,IAAA;AAC3B,EAAA;AACF;AFtCgE;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-MZBQ4546.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const copperMeta: CalculatorMeta = {\n name: '接触线参数速查',\n nameEn: 'Contact Wire Parameter Lookup',\n summary:\n '内置 CTHM / CTHA / CTHS 系列 120/150 mm² 接触线参数表,按长度与环境温度给出总重量与温度修正电阻。',\n formula: [\n '电阻温度修正(α = 0.00393 /℃):r_T = r₂₀·[1 + α·(T − 20)]',\n '总重量:W = w₀ × l(w₀ 单位重量 kg/km,l 长度 km)',\n ],\n references: [\n '内置参数表来源 TB/T 2809-2017《电气化铁路用铜及铜合金接触线》(2018-05-01 实施)',\n '单位重量为标称值',\n '载流量为 150℃ 持续值,室内/室外双口径按标准表5',\n 'r₂₀ 除 CTHM-120 取给定值外,均按导电率反算估算(IACS 标准电阻率 0.017241 Ω·mm²/m ÷ 导电率 ÷ 截面积;0.017241 = 1/58)',\n '正式工程以产品标准与出厂检验单为准',\n ],\n scope: [\n '温度修正仅覆盖电阻,未修正单位重量与载流量',\n '适用温度 −40 ~ 90 ℃',\n '载流量为 150℃ 允许温度下的持续值,未做环境温度修正',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/copper/',\n};\n","export { copperMeta } from './meta';\n\n// 电阻温度修正与铜常数统一放在 src/common/resistance.ts(copper 与 voltage-drop 共用),\n// 由根 index 统一导出,此处仅内部引用,避免重复导出同名符号。\nimport { resistanceAtTempOhmPerKm } from '../common/resistance';\n\n/** 站点计算器内置的 6 个型号 */\nexport type CopperWireModel =\n | 'CTHM-120'\n | 'CTHM-150'\n | 'CTHA-120'\n | 'CTHA-150'\n | 'CTHS-120'\n | 'CTHS-150';\n\nexport interface WireParamEntry {\n /** 单位重量,kg/km(标称值) */\n readonly unitWeightKgPerKm: number;\n /** 20℃ 直流电阻,Ω/km */\n readonly r20OhmPerKm: number;\n /** 150℃ 持续载流量,室内口径,A */\n readonly ampacityIndoor150A: number;\n /** 150℃ 持续载流量,室外口径,A */\n readonly ampacityOutdoor150A: number;\n /** 口径说明:本行实际对应标准中的哪一行 */\n readonly note: string;\n}\n\n/**\n * 接触线参数表,来源 TB/T 2809-2017。\n *\n * 载流量为 150℃ 持续值(室内/室外双口径,标准表5)。\n *\n * 已与站点 `/calculator/assets/calc-core.js` 中的 COPPER_TABLE 逐项比对,\n * 6 个型号 × 4 项参数完全一致。\n *\n * 注:站点曾因显示层 `fmt()` 的尾零剥离正则把载流量渲染成 43/56(应为 430/560),\n * 已于 R38 之后修复。若再遇渲染值与本表不符,先确认是否为显示层问题:\n * 本表与服务端数据源始终一致。\n *\n * ⚠️ 注意型号口径:CTHM / CTHA / CTHS 是站点计算器的型号代码,与标准中的\n * CTMH / CTA / CTS 并非同名对应。`note` 字段说明各行实际取自标准的哪一行,\n * 交叉引用 TB/T 2809-2017 时请以 note 为准。\n */\nexport const TB2809_WIRE_PARAMS: Record<CopperWireModel, WireParamEntry> = {\n 'CTHM-120': {\n unitWeightKgPerKm: 1082,\n r20OhmPerKm: 0.2113,\n ampacityIndoor150A: 430,\n ampacityOutdoor150A: 560,\n note: '取标准 CTMH 行(高强度铜镁合金),ρ 按标准上限 0.02535 计算',\n },\n 'CTHM-150': {\n unitWeightKgPerKm: 1350,\n r20OhmPerKm: 0.169,\n ampacityIndoor150A: 500,\n ampacityOutdoor150A: 650,\n note: '取标准 CTMH 行(高强度铜镁合金)',\n },\n 'CTHA-120': {\n unitWeightKgPerKm: 1070,\n r20OhmPerKm: 0.1481,\n ampacityIndoor150A: 515,\n ampacityOutdoor150A: 680,\n note: '取标准 CTA 行(铜银合金),ρ ≤ 0.01777',\n },\n 'CTHA-150': {\n unitWeightKgPerKm: 1330,\n r20OhmPerKm: 0.1185,\n ampacityIndoor150A: 620,\n ampacityOutdoor150A: 785,\n note: '取标准 CTA 行(铜银合金)',\n },\n 'CTHS-120': {\n unitWeightKgPerKm: 1080,\n r20OhmPerKm: 0.1916,\n ampacityIndoor150A: 515,\n ampacityOutdoor150A: 680,\n note: '取标准 CTS 行(铜锡合金),载流量按 CTS 行取值',\n },\n 'CTHS-150': {\n unitWeightKgPerKm: 1345,\n r20OhmPerKm: 0.1533,\n ampacityIndoor150A: 620,\n ampacityOutdoor150A: 790,\n note: '取标准 CTS 行(铜锡合金),载流量按 CTS 行取值',\n },\n};\n\nexport interface CopperLookupInput {\n readonly model: CopperWireModel;\n /** 长度 l,km */\n readonly lengthKm: number;\n /** 环境温度 T,℃ */\n readonly ambientTempDegC: number;\n}\n\nexport interface CopperLookupResult extends WireParamEntry {\n readonly model: CopperWireModel;\n /** 总重量 W = w₀ × l,kg */\n readonly totalWeightKg: number;\n /** 温度修正电阻 r_T,Ω/km */\n readonly rTOhmPerKm: number;\n /** 全长温度修正电阻,Ω */\n readonly totalResistanceOhm: number;\n}\n\n/**\n * 按型号、长度与环境温度给出接触线参数速查结果。\n */\nexport function wireLookup(input: CopperLookupInput): CopperLookupResult {\n const { model, lengthKm, ambientTempDegC } = input;\n\n const params = TB2809_WIRE_PARAMS[model];\n if (params === undefined) {\n throw new RangeError(`未知型号:${model}`);\n }\n if (!(lengthKm > 0)) {\n throw new RangeError(`长度必须为正数,收到 ${lengthKm} km`);\n }\n if (ambientTempDegC < -40 || ambientTempDegC > 90) {\n throw new RangeError(`适用温度为 −40 ~ 90 ℃,收到 ${ambientTempDegC} ℃`);\n }\n\n const rT = resistanceAtTempOhmPerKm(params.r20OhmPerKm, ambientTempDegC);\n\n return {\n model,\n ...params,\n totalWeightKg: params.unitWeightKgPerKm * lengthKm,\n rTOhmPerKm: rT,\n totalResistanceOhm: rT * lengthKm,\n };\n}\n"]}
@@ -0,0 +1,91 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/ampacity/meta.ts
2
+ var ampacityMeta = {
3
+ name: "\u8F7D\u6D41\u91CF\u4FEE\u6B63\u4E0E\u77ED\u8DEF\u70ED\u7A33\u5B9A",
4
+ nameEn: "Ampacity Derating and Short-Circuit Thermal Stability",
5
+ 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",
6
+ formula: [
7
+ "\u8F7D\u6D41\u91CF\u73AF\u5883\u6E29\u5EA6\u4FEE\u6B63\uFF1AI(Ta) = I\u2080\xB7\u221A((Tmax \u2212 Ta) / (Tmax \u2212 T\u2080))",
8
+ "\u77ED\u8DEF\u70ED\u7A33\u5B9A\u6700\u5C0F\u622A\u9762\uFF1AS \u2265 I_k\xB7\u221At_k / C"
9
+ ],
10
+ references: [
11
+ "\u5141\u8BB8\u5DE5\u4F5C\u6E29\u5EA6\uFF1A\u94DC 95\u2103\u3001\u94DC\u5408\u91D1 150\u2103\uFF08TB/T 2809-2017 \u88685\uFF09",
12
+ "\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",
13
+ "\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"
14
+ ],
15
+ scope: [
16
+ "\u4FEE\u6B63\u5F0F\u4EC5\u8986\u76D6\u73AF\u5883\u6E29\u5EA6\u9879",
17
+ "\u9AD8\u6D77\u62D4\u3001\u96A7\u9053\u3001\u65E5\u7167\u53E0\u52A0\u573A\u666F\u987B\u53E6\u884C\u53E0\u52A0\u6563\u70ED\u4FEE\u6B63",
18
+ "\u77ED\u8DEF\u7535\u6D41 I_k \u5E94\u4E3A\u4F9B\u7535\u8BA1\u7B97\u7ED9\u51FA\u7684\u70ED\u7A33\u5B9A\u7B49\u6548\u503C",
19
+ "\u5207\u9664\u65F6\u95F4 t_k \u4E3A\u4FDD\u62A4\u52A8\u4F5C\u5168\u5207\u9664\u65F6\u95F4",
20
+ "\u672A\u8003\u8651\u90BB\u8FD1\u91D1\u5C5E\u56DE\u6D41\u3001\u96C6\u80A4\u6548\u5E94\u4E0E\u77ED\u65F6\u8FC7\u8F7D\u5DE5\u51B5"
21
+ ],
22
+ 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",
23
+ online: "https://www.itswe.com/calculator/ampacity/"
24
+ };
25
+
26
+ // src/ampacity/index.ts
27
+ var DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;
28
+ function ampacityDeratingFactor(input) {
29
+ const {
30
+ maxAllowedTempDegC: tMax,
31
+ ambientTempDegC: tAmbient,
32
+ baseAmbientTempDegC: tBaseOpt
33
+ } = input;
34
+ const tBase = _nullishCoalesce(tBaseOpt, () => ( DEFAULT_BASE_AMBIENT_TEMP_DEG_C));
35
+ if (!(input.baseAmpacityA > 0)) {
36
+ throw new RangeError(`\u57FA\u51C6\u8F7D\u6D41\u91CF\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.baseAmpacityA} A`);
37
+ }
38
+ if (!(tMax > tBase)) {
39
+ throw new RangeError(
40
+ `\u5141\u8BB8\u6E29\u5EA6 ${tMax} \u2103 \u5FC5\u987B\u9AD8\u4E8E\u57FA\u51C6\u73AF\u5883\u6E29\u5EA6 ${tBase} \u2103`
41
+ );
42
+ }
43
+ if (!(tAmbient < tMax)) {
44
+ throw new RangeError(
45
+ `\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`
46
+ );
47
+ }
48
+ if (!(tAmbient >= -273.15)) {
49
+ throw new RangeError(`\u73AF\u5883\u6E29\u5EA6\u4E0D\u80FD\u4F4E\u4E8E\u7EDD\u5BF9\u96F6\u5EA6\uFF0C\u6536\u5230 ${tAmbient} \u2103`);
50
+ }
51
+ return Math.sqrt((tMax - tAmbient) / (tMax - tBase));
52
+ }
53
+ function deratedAmpacityA(input) {
54
+ return input.baseAmpacityA * ampacityDeratingFactor(input);
55
+ }
56
+ function shortCircuitMinSectionMM2(shortCircuitCurrentKA, clearingTimeS, thermalCoefficientC) {
57
+ if (!(shortCircuitCurrentKA > 0)) {
58
+ throw new RangeError(
59
+ `\u77ED\u8DEF\u7535\u6D41\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${shortCircuitCurrentKA} kA`
60
+ );
61
+ }
62
+ if (!(clearingTimeS > 0)) {
63
+ throw new RangeError(`\u5207\u9664\u65F6\u95F4\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${clearingTimeS} s`);
64
+ }
65
+ if (!(thermalCoefficientC > 0)) {
66
+ throw new RangeError(
67
+ `\u70ED\u7A33\u5B9A\u7CFB\u6570\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${thermalCoefficientC} A\xB7\u221As/mm\xB2`
68
+ );
69
+ }
70
+ const iA = shortCircuitCurrentKA * 1e3;
71
+ return iA * Math.sqrt(clearingTimeS) / thermalCoefficientC;
72
+ }
73
+ function shortCircuitCheck(input) {
74
+ const minSectionMM2 = shortCircuitMinSectionMM2(
75
+ input.shortCircuitCurrentKA,
76
+ input.clearingTimeS,
77
+ input.thermalCoefficientC
78
+ );
79
+ const verdict = input.selectedSectionMM2 === null ? "not-assessed" : input.selectedSectionMM2 >= minSectionMM2 ? "pass" : "fail";
80
+ return { minSectionMM2, selectedSectionMM2: input.selectedSectionMM2, verdict };
81
+ }
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+ exports.ampacityMeta = ampacityMeta; exports.DEFAULT_BASE_AMBIENT_TEMP_DEG_C = DEFAULT_BASE_AMBIENT_TEMP_DEG_C; exports.ampacityDeratingFactor = ampacityDeratingFactor; exports.deratedAmpacityA = deratedAmpacityA; exports.shortCircuitMinSectionMM2 = shortCircuitMinSectionMM2; exports.shortCircuitCheck = shortCircuitCheck;
91
+ //# sourceMappingURL=chunk-NBFOB2PI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-NBFOB2PI.cjs","../src/ampacity/meta.ts","../src/ampacity/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-NBFOB2PI.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const ampacityMeta: CalculatorMeta = {\n name: '载流量修正与短路热稳定',\n nameEn: 'Ampacity Derating and Short-Circuit Thermal Stability',\n summary:\n '按环境温度修正持续载流量,并按短路热稳定校核最小截面,用于接触线/附加导线截面选型与校核。',\n formula: [\n '载流量环境温度修正:I(Ta) = I₀·√((Tmax − Ta) / (Tmax − T₀))',\n '短路热稳定最小截面:S ≥ I_k·√t_k / C',\n ],\n references: [\n '允许工作温度:铜 95℃、铜合金 150℃(TB/T 2809-2017 表5)',\n '基准载流量 I₀ 可按 TB/T 2809-2017 表5 取值(室内为无风无日照试验条件下须符合值,室外值宜参照)',\n '热稳定系数 C 属设计输入,须按设计手册与产品技术条件取值',\n ],\n scope: [\n '修正式仅覆盖环境温度项',\n '高海拔、隧道、日照叠加场景须另行叠加散热修正',\n '短路电流 I_k 应为供电计算给出的热稳定等效值',\n '切除时间 t_k 为保护动作全切除时间',\n '未考虑邻近金属回流、集肤效应与短时过载工况',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/ampacity/',\n};\n","export { ampacityMeta } from './meta';\n\n/** 基准环境温度 T₀,℃(TB/T 2809-2017 标准环境) */\nexport const DEFAULT_BASE_AMBIENT_TEMP_DEG_C = 25;\n\n/** 载流量环境温度修正输入 */\nexport interface AmpacityDeratingInput {\n /** 基准载流量 I₀,A(标准环境 T₀ 下的持续载流量) */\n readonly baseAmpacityA: number;\n /** 最高允许工作温度 Tmax,℃(铜 95、铜合金 150) */\n readonly maxAllowedTempDegC: number;\n /** 最不利实际环境温度 Ta,℃ */\n readonly ambientTempDegC: number;\n /** 基准环境温度 T₀,℃。缺省 25 ℃ */\n readonly baseAmbientTempDegC?: number;\n}\n\nexport interface AmpacityDeratingResult {\n /** 修正系数,无量纲 */\n readonly deratingFactor: number;\n /** 修正后载流量 I(Ta),A */\n readonly deratedAmpacityA: number;\n}\n\n/**\n * 环境温度修正系数:√((Tmax − Ta) / (Tmax − T₀))。\n *\n * Ta 越接近允许温度,系数越小;Ta = T₀ 时为 1;Ta > Tmax 无解,直接抛错。\n */\nexport function ampacityDeratingFactor(input: AmpacityDeratingInput): number {\n const {\n maxAllowedTempDegC: tMax,\n ambientTempDegC: tAmbient,\n baseAmbientTempDegC: tBaseOpt,\n } = input;\n const tBase = tBaseOpt ?? DEFAULT_BASE_AMBIENT_TEMP_DEG_C;\n\n if (!(input.baseAmpacityA > 0)) {\n throw new RangeError(`基准载流量必须为正数,收到 ${input.baseAmpacityA} A`);\n }\n if (!(tMax > tBase)) {\n throw new RangeError(\n `允许温度 ${tMax} ℃ 必须高于基准环境温度 ${tBase} ℃`,\n );\n }\n if (!(tAmbient < tMax)) {\n throw new RangeError(\n `实际环境温度 ${tAmbient} ℃ 已达到或超过允许温度 ${tMax} ℃,无法持续运行`,\n );\n }\n if (!(tAmbient >= -273.15)) {\n throw new RangeError(`环境温度不能低于绝对零度,收到 ${tAmbient} ℃`);\n }\n\n return Math.sqrt((tMax - tAmbient) / (tMax - tBase));\n}\n\n/**\n * 修正后载流量:I(Ta) = I₀·√((Tmax − Ta)/(Tmax − T₀)),A。\n *\n * ⚠️ 修正式仅覆盖环境温度项;高海拔、隧道、日照叠加场景须另行叠加修正。\n */\nexport function deratedAmpacityA(input: AmpacityDeratingInput): number {\n return input.baseAmpacityA * ampacityDeratingFactor(input);\n}\n\n/** 热稳定校核判定结果 */\nexport type ThermalStabilityVerdict = 'pass' | 'fail' | 'not-assessed';\n\nexport interface ShortCircuitCheckInput {\n /** 短路电流 I_k,kA(热稳定等效值,由供电计算给出) */\n readonly shortCircuitCurrentKA: number;\n /** 全切除时间 t_k,s */\n readonly clearingTimeS: number;\n /** 热稳定系数 C,A·√s/mm²(设计输入) */\n readonly thermalCoefficientC: number;\n /** 拟选截面,mm²。传 null 则仅输出最小截面,不判定 */\n readonly selectedSectionMM2: number | null;\n}\n\nexport interface ShortCircuitCheckResult {\n /** 最小热稳截面 S_min = I_k·√t_k / C,mm² */\n readonly minSectionMM2: number;\n readonly selectedSectionMM2: number | null;\n /** 拟选截面判定 */\n readonly verdict: ThermalStabilityVerdict;\n}\n\n/**\n * 短路热稳定最小截面:S_min = I_k·√t_k / C,mm²。\n *\n * @param shortCircuitCurrentKA 短路电流,kA\n * @param clearingTimeS 切除时间,s\n * @param thermalCoefficientC 热稳定系数,A·√s/mm²\n */\nexport function shortCircuitMinSectionMM2(\n shortCircuitCurrentKA: number,\n clearingTimeS: number,\n thermalCoefficientC: number,\n): number {\n if (!(shortCircuitCurrentKA > 0)) {\n throw new RangeError(\n `短路电流必须为正数,收到 ${shortCircuitCurrentKA} kA`,\n );\n }\n if (!(clearingTimeS > 0)) {\n throw new RangeError(`切除时间必须为正数,收到 ${clearingTimeS} s`);\n }\n if (!(thermalCoefficientC > 0)) {\n throw new RangeError(\n `热稳定系数必须为正数,收到 ${thermalCoefficientC} A·√s/mm²`,\n );\n }\n const iA = shortCircuitCurrentKA * 1000;\n return (iA * Math.sqrt(clearingTimeS)) / thermalCoefficientC;\n}\n\n/**\n * 短路热稳定校核:给出最小截面,并在提供拟选截面时判定是否满足 S ≥ S_min。\n */\nexport function shortCircuitCheck(input: ShortCircuitCheckInput): ShortCircuitCheckResult {\n const minSectionMM2 = shortCircuitMinSectionMM2(\n input.shortCircuitCurrentKA,\n input.clearingTimeS,\n input.thermalCoefficientC,\n );\n\n const verdict: ThermalStabilityVerdict =\n input.selectedSectionMM2 === null\n ? 'not-assessed'\n : input.selectedSectionMM2 >= minSectionMM2\n ? 'pass'\n : 'fail';\n\n return { minSectionMM2, selectedSectionMM2: input.selectedSectionMM2, verdict };\n}\n"]}
@@ -0,0 +1,88 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/wavespeed/meta.ts
2
+ var wavespeedMeta = {
3
+ name: "\u6CE2\u901F\u5229\u7528\u7387",
4
+ nameEn: "Wave Propagation Speed Utilisation",
5
+ 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",
6
+ formula: [
7
+ "\u6CE2\u4F20\u64AD\u901F\u5EA6\uFF1Ac = \u221A(T/\u03C1)\uFF08T \u53D6 N\uFF0C\u03C1 \u53D6 kg/m\uFF09",
8
+ "\u6CE2\u901F\u5229\u7528\u7387\uFF1A\u03B2 = v / c\uFF08v \u6362\u7B97\u4E3A m/s\uFF09",
9
+ "\u4E24\u7AEF\u56FA\u5B9A\u5F26\u56FA\u6709\u9891\u7387\uFF1Af_n = n/(2L)\xB7\u221A(T/\u03C1)",
10
+ "\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"
11
+ ],
12
+ references: [
13
+ "\u4F9D\u636E\u672C\u7AD9 \u5F13\u7F51\u5173\u7CFB / \u6CE2\u4F20\u64AD \u6761\u76EE",
14
+ "\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"
15
+ ],
16
+ scope: [
17
+ "\u5F20\u529B T\uFF1A5 ~ 40 kN",
18
+ "\u7EBF\u5BC6\u5EA6 \u03C1\uFF1A0.5 ~ 3 kg/m",
19
+ "\u901F\u5EA6 v\uFF1A20 ~ 500 km/h",
20
+ "\u8DE8\u8DDD l\uFF1A30 ~ 90 m",
21
+ "\u4E24\u7AEF\u56FA\u5B9A\u5F26\u6A21\u578B\uFF0C\u672A\u8003\u8651\u5F39\u6027\u652F\u627F\u4E0E\u963B\u5C3C",
22
+ "\u672A\u8003\u8651\u627F\u529B\u7D22\u4E0E\u540A\u5F26\u5BF9\u6CE2\u4F20\u64AD\u7684\u5F71\u54CD"
23
+ ],
24
+ 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",
25
+ online: "https://www.itswe.com/calculator/wavespeed/"
26
+ };
27
+
28
+ // src/wavespeed/index.ts
29
+ var DEFAULT_WARN_THRESHOLD = 0.7;
30
+ function wavePropagationSpeedMPerS(tensionKN, linearMassKgPerM) {
31
+ if (!(tensionKN > 0)) {
32
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionKN} kN`);
33
+ }
34
+ if (!(linearMassKgPerM > 0)) {
35
+ throw new RangeError(`\u7EBF\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${linearMassKgPerM} kg/m`);
36
+ }
37
+ return Math.sqrt(tensionKN * 1e3 / linearMassKgPerM);
38
+ }
39
+ function naturalFrequencyHz(n, spanM, waveSpeedMPerS) {
40
+ if (!Number.isInteger(n) || n < 1) {
41
+ throw new RangeError(`\u9636\u6B21\u5FC5\u987B\u4E3A\u6B63\u6574\u6570\uFF0C\u6536\u5230 ${n}`);
42
+ }
43
+ if (!(spanM > 0)) {
44
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
45
+ }
46
+ if (!(waveSpeedMPerS > 0)) {
47
+ throw new RangeError(`\u6CE2\u901F\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${waveSpeedMPerS} m/s`);
48
+ }
49
+ return n / (2 * spanM) * waveSpeedMPerS;
50
+ }
51
+ function kmHToMPerS(speedKmH) {
52
+ return speedKmH / 3.6;
53
+ }
54
+ function waveSpeedCheck(input) {
55
+ const { tensionKN, linearMassKgPerM, speedKmH, spanM } = input;
56
+ if (!(speedKmH >= 0)) {
57
+ throw new RangeError(`\u901F\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${speedKmH} km/h`);
58
+ }
59
+ if (!(spanM > 0)) {
60
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
61
+ }
62
+ const c = wavePropagationSpeedMPerS(tensionKN, linearMassKgPerM);
63
+ const beta = kmHToMPerS(speedKmH) / c;
64
+ const fns = [1, 2, 3].map((n) => naturalFrequencyHz(n, spanM, c));
65
+ const f1 = fns[0];
66
+ if (f1 === void 0) {
67
+ throw new Error("\u56FA\u6709\u9891\u7387\u8BA1\u7B97\u5931\u8D25");
68
+ }
69
+ const threshold = _nullishCoalesce(input.warnThreshold, () => ( DEFAULT_WARN_THRESHOLD));
70
+ return {
71
+ waveSpeedMPerS: c,
72
+ beta,
73
+ betaPercent: beta * 100,
74
+ naturalFrequenciesHz: fns,
75
+ resonanceSpeedKmH: f1 * spanM * 3.6,
76
+ warn: beta >= threshold
77
+ };
78
+ }
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+ exports.wavespeedMeta = wavespeedMeta; exports.DEFAULT_WARN_THRESHOLD = DEFAULT_WARN_THRESHOLD; exports.wavePropagationSpeedMPerS = wavePropagationSpeedMPerS; exports.naturalFrequencyHz = naturalFrequencyHz; exports.kmHToMPerS = kmHToMPerS; exports.waveSpeedCheck = waveSpeedCheck;
88
+ //# sourceMappingURL=chunk-NBHEOJ5A.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-NBHEOJ5A.cjs","../src/wavespeed/meta.ts","../src/wavespeed/index.ts"],"names":[],"mappings":"AAAA;ACEO,IAAM,cAAA,EAAgC;AAAA,EAC3C,IAAA,EAAM,gCAAA;AAAA,EACN,MAAA,EAAQ,oCAAA;AAAA,EACR,OAAA,EACE,8QAAA;AAAA,EACF,OAAA,EAAS;AAAA,IACP,wGAAA;AAAA,IACA,wFAAA;AAAA,IACA,8FAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY;AAAA,IACV,qFAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,KAAA,EAAO;AAAA,IACL,+BAAA;AAAA,IACA,6CAAA;AAAA,IACA,mCAAA;AAAA,IACA,+BAAA;AAAA,IACA,8GAAA;AAAA,IACA;AAAA,EACF,CAAA;AAAA,EACA,UAAA,EAAY,sKAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAA;ADDA;AACA;AExBO,IAAM,uBAAA,EAAyB,GAAA;AAoC/B,SAAS,yBAAA,CACd,SAAA,EACA,gBAAA,EACQ;AACR,EAAA,GAAA,CAAI,CAAA,CAAE,UAAA,EAAY,CAAA,CAAA,EAAI;AACpB,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,6DAAA,EAAc,SAAS,CAAA,GAAA,CAAK,CAAA;AAAA,EACnD;AACA,EAAA,GAAA,CAAI,CAAA,CAAE,iBAAA,EAAmB,CAAA,CAAA,EAAI;AAC3B,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,mEAAA,EAAe,gBAAgB,CAAA,KAAA,CAAO,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAM,UAAA,EAAY,IAAA,EAAO,gBAAgB,CAAA;AACvD;AASO,SAAS,kBAAA,CACd,CAAA,EACA,KAAA,EACA,cAAA,EACQ;AACR,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAC,EAAA,GAAK,EAAA,EAAI,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,mEAAA,EAAe,CAAC,CAAA,CAAA;AACvC,EAAA;AACkB,EAAA;AACwB,IAAA;AAC1C,EAAA;AAC2B,EAAA;AACU,IAAA;AACrC,EAAA;AAC2B,EAAA;AAC7B;AAGqD;AACjC,EAAA;AACpB;AAQuE;AACZ,EAAA;AAEnC,EAAA;AACsB,IAAA;AAC5C,EAAA;AACkB,EAAA;AACwB,IAAA;AAC1C,EAAA;AAE+D,EAAA;AAC3B,EAAA;AAC4B,EAAA;AAChD,EAAA;AACM,EAAA;AACM,IAAA;AAC5B,EAAA;AAEyC,EAAA;AAElC,EAAA;AACW,IAAA;AAChB,IAAA;AACoB,IAAA;AACE,IAAA;AACU,IAAA;AAClB,IAAA;AAChB,EAAA;AACF;AFrCiG;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-NBHEOJ5A.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const wavespeedMeta: CalculatorMeta = {\n name: '波速利用率',\n nameEn: 'Wave Propagation Speed Utilisation',\n summary:\n '由接触线张力与线密度求波传播速度 c 与波速利用率 β = v/c,给出跨距前三阶固有频率与一阶共振车速。',\n formula: [\n '波传播速度:c = √(T/ρ)(T 取 N,ρ 取 kg/m)',\n '波速利用率:β = v / c(v 换算为 m/s)',\n '两端固定弦固有频率:f_n = n/(2L)·√(T/ρ)',\n '一阶共振车速:v_res = f₁·L = c/2(跨距通过频率 v/L 与 f₁ 相遇)',\n ],\n references: [\n '依据本站 弓网关系 / 波传播 条目',\n 'β 达 0.7 时提示接近共振区,该阈值属工程经验值,请以设计文件为准',\n ],\n scope: [\n '张力 T:5 ~ 40 kN',\n '线密度 ρ:0.5 ~ 3 kg/m',\n '速度 v:20 ~ 500 km/h',\n '跨距 l:30 ~ 90 m',\n '两端固定弦模型,未考虑弹性支承与阻尼',\n '未考虑承力索与吊弦对波传播的影响',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/wavespeed/',\n};\n","export { wavespeedMeta } from './meta';\n\n/** 波速利用率告警阈值(工程经验值) */\nexport const DEFAULT_WARN_THRESHOLD = 0.7;\n\nexport interface WaveSpeedInput {\n /** 接触线张力 T,kN */\n readonly tensionKN: number;\n /** 线密度 ρ,kg/m */\n readonly linearMassKgPerM: number;\n /** 列车速度 v,km/h */\n readonly speedKmH: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 告警阈值 β。缺省 0.7 */\n readonly warnThreshold?: number;\n}\n\nexport interface WaveSpeedResult {\n /** 波传播速度 c = √(T/ρ),m/s */\n readonly waveSpeedMPerS: number;\n /** 波速利用率 β = v/c,无量纲 */\n readonly beta: number;\n /** 波速利用率,% */\n readonly betaPercent: number;\n /** 前三阶固有频率 f₁ ~ f₃,Hz */\n readonly naturalFrequenciesHz: readonly number[];\n /** 一阶共振车速 v_res = f₁·l,km/h */\n readonly resonanceSpeedKmH: number;\n /** β 是否达到告警阈值 */\n readonly warn: boolean;\n}\n\n/**\n * 波传播速度:c = √(T/ρ),m/s。\n *\n * @param tensionKN 接触线张力 T,kN\n * @param linearMassKgPerM 线密度 ρ,kg/m\n */\nexport function wavePropagationSpeedMPerS(\n tensionKN: number,\n linearMassKgPerM: number,\n): number {\n if (!(tensionKN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionKN} kN`);\n }\n if (!(linearMassKgPerM > 0)) {\n throw new RangeError(`线密度必须为正数,收到 ${linearMassKgPerM} kg/m`);\n }\n return Math.sqrt((tensionKN * 1e3) / linearMassKgPerM);\n}\n\n/**\n * 两端固定弦第 n 阶固有频率:f_n = n/(2L)·√(T/ρ) = n·c/(2L),Hz。\n *\n * @param n 阶次,正整数\n * @param spanM 跨距 L,m\n * @param waveSpeedMPerS 波速 c,m/s\n */\nexport function naturalFrequencyHz(\n n: number,\n spanM: number,\n waveSpeedMPerS: number,\n): number {\n if (!Number.isInteger(n) || n < 1) {\n throw new RangeError(`阶次必须为正整数,收到 ${n}`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(waveSpeedMPerS > 0)) {\n throw new RangeError(`波速必须为正数,收到 ${waveSpeedMPerS} m/s`);\n }\n return (n / (2 * spanM)) * waveSpeedMPerS;\n}\n\n/** km/h → m/s */\nexport function kmHToMPerS(speedKmH: number): number {\n return speedKmH / 3.6;\n}\n\n/**\n * 波速利用率校核。\n *\n * β = v/c;β 越接近 1 越接近共振区,达到阈值(默认 0.7)时告警。\n * 一阶共振车速 v_res 为跨距通过频率与一阶固有频率相遇时的车速。\n */\nexport function waveSpeedCheck(input: WaveSpeedInput): WaveSpeedResult {\n const { tensionKN, linearMassKgPerM, speedKmH, spanM } = input;\n\n if (!(speedKmH >= 0)) {\n throw new RangeError(`速度不能为负,收到 ${speedKmH} km/h`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n\n const c = wavePropagationSpeedMPerS(tensionKN, linearMassKgPerM);\n const beta = kmHToMPerS(speedKmH) / c;\n const fns = [1, 2, 3].map((n) => naturalFrequencyHz(n, spanM, c));\n const f1 = fns[0];\n if (f1 === undefined) {\n throw new Error('固有频率计算失败');\n }\n\n const threshold = input.warnThreshold ?? DEFAULT_WARN_THRESHOLD;\n\n return {\n waveSpeedMPerS: c,\n beta,\n betaPercent: beta * 100,\n naturalFrequenciesHz: fns,\n resonanceSpeedKmH: f1 * spanM * 3.6,\n warn: beta >= threshold,\n };\n}\n"]}
@@ -0,0 +1,91 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/icing/meta.ts
2
+ var icingMeta = {
3
+ name: "\u8986\u51B0\u8377\u8F7D\u6821\u6838",
4
+ nameEn: "Ice Load Check",
5
+ 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",
6
+ formula: [
7
+ "\u51B0\u7B52\u6A21\u578B\u51B0\u91CD\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)",
8
+ "\u8986\u51B0\u540E\u603B\u5782\u76F4\u8377\u8F7D\uFF1Ag_total = g_self + g_ice",
9
+ "\u65E0\u51B0\u5F1B\u5EA6\uFF1Af\u2080 = g_self\xB7l\xB2 / (8T)",
10
+ "\u8986\u51B0\u5F1B\u5EA6\uFF1Af_ice = g_total\xB7l\xB2 / (8T)",
11
+ "\u5F1B\u5EA6\u589E\u5E45\uFF1A(f_ice / f\u2080 \u2212 1) \xD7 100%"
12
+ ],
13
+ references: [
14
+ "\u4F9D\u636E\u672C\u7AD9 \u8986\u51B0\u8377\u8F7D / \u8377\u8F7D\u8BA1\u7B97 \u6761\u76EE",
15
+ "\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",
16
+ "\u5747\u5300\u51B0\u7B52\u5047\u8BBE\uFF0C\u672A\u8003\u8651\u4E0D\u89C4\u5219\u8986\u51B0\u5F62\u6001"
17
+ ],
18
+ scope: [
19
+ "\u7EBF\u7D22\u76F4\u5F84 d\uFF1A1 ~ 40 mm",
20
+ "\u8986\u51B0\u539A\u5EA6 b\uFF1A0 ~ 50 mm\uFF080 \u8868\u793A\u65E0\u51B0\uFF09",
21
+ "\u5F20\u529B T\uFF1A1 ~ 40 kN",
22
+ "\u8DE8\u8DDD l\uFF1A10 ~ 90 m",
23
+ "\u7EBF\u7D22\u81EA\u91CD g_self\uFF1A1 ~ 60 N/m",
24
+ "\u51B0\u5BC6\u5EA6 \u03C1_ice\uFF1A500 ~ 950 kg/m\xB3",
25
+ "\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",
26
+ "\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"
27
+ ],
28
+ 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",
29
+ online: "https://www.itswe.com/calculator/icing/"
30
+ };
31
+
32
+ // src/types.ts
33
+ var G0 = 9.81;
34
+
35
+ // src/common/ice.ts
36
+ var DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;
37
+ function iceLoadNPerM(params) {
38
+ const { wireDiameterM, iceThicknessM } = params;
39
+ const rho = _nullishCoalesce(params.iceDensityKgPerM3, () => ( DEFAULT_ICE_DENSITY_KG_PER_M3));
40
+ if (!(wireDiameterM > 0)) {
41
+ throw new RangeError(`\u7EBF\u7D22\u76F4\u5F84\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${wireDiameterM} m`);
42
+ }
43
+ if (!(iceThicknessM >= 0)) {
44
+ throw new RangeError(`\u8986\u51B0\u539A\u5EA6\u4E0D\u80FD\u4E3A\u8D1F\uFF0C\u6536\u5230 ${iceThicknessM} m`);
45
+ }
46
+ if (!(rho > 0)) {
47
+ throw new RangeError(`\u51B0\u5BC6\u5EA6\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${rho} kg/m\xB3`);
48
+ }
49
+ if (iceThicknessM === 0) return 0;
50
+ return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);
51
+ }
52
+
53
+ // src/icing/index.ts
54
+ function icingCheck(input) {
55
+ const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;
56
+ if (!(tensionN > 0)) {
57
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
58
+ }
59
+ if (!(spanM > 0)) {
60
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${spanM} m`);
61
+ }
62
+ if (!(selfWeightNPerM > 0)) {
63
+ throw new RangeError(`\u7EBF\u7D22\u81EA\u91CD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${selfWeightNPerM} N/m`);
64
+ }
65
+ const iceParams = {
66
+ wireDiameterM,
67
+ iceThicknessM,
68
+ ...input.iceDensityKgPerM3 === void 0 ? {} : { iceDensityKgPerM3: input.iceDensityKgPerM3 }
69
+ };
70
+ const gIce = iceLoadNPerM(iceParams);
71
+ const gTotal = selfWeightNPerM + gIce;
72
+ const fNoIce = selfWeightNPerM * spanM * spanM / (8 * tensionN);
73
+ const fIce = gTotal * spanM * spanM / (8 * tensionN);
74
+ return {
75
+ iceLoadNPerM: gIce,
76
+ totalLoadNPerM: gTotal,
77
+ sagNoIceM: fNoIce,
78
+ sagWithIceM: fIce,
79
+ growthPercent: (fIce / fNoIce - 1) * 100,
80
+ heavy: gIce > selfWeightNPerM
81
+ };
82
+ }
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+ exports.G0 = G0; exports.DEFAULT_ICE_DENSITY_KG_PER_M3 = DEFAULT_ICE_DENSITY_KG_PER_M3; exports.iceLoadNPerM = iceLoadNPerM; exports.icingMeta = icingMeta; exports.icingCheck = icingCheck;
91
+ //# sourceMappingURL=chunk-P6KUGPHD.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-P6KUGPHD.cjs","../src/icing/meta.ts","../src/types.ts","../src/common/ice.ts","../src/icing/index.ts"],"names":[],"mappings":"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","file":"/home/runner/work/ocs-calculators/ocs-calculators/dist/chunk-P6KUGPHD.cjs","sourcesContent":[null,"import type { CalculatorMeta } from '../types';\n\nexport const icingMeta: CalculatorMeta = {\n name: '覆冰荷载校核',\n nameEn: 'Ice Load Check',\n summary:\n '按冰筒模型计算覆冰荷载,给出覆冰后的总垂直荷载、弛度及相对无冰工况的增幅。',\n formula: [\n '冰筒模型冰重:g_ice = ρ_ice · g₀ · π · b · (d + b)',\n '覆冰后总垂直荷载:g_total = g_self + g_ice',\n '无冰弛度:f₀ = g_self·l² / (8T)',\n '覆冰弛度:f_ice = g_total·l² / (8T)',\n '弛度增幅:(f_ice / f₀ − 1) × 100%',\n ],\n references: [\n '依据本站 覆冰荷载 / 荷载计算 条目',\n '冰密度默认 900 kg/m³,轻覆冰地区可取更小值,以当地气象资料为准',\n '均匀冰筒假设,未考虑不规则覆冰形态',\n ],\n scope: [\n '线索直径 d:1 ~ 40 mm',\n '覆冰厚度 b:0 ~ 50 mm(0 表示无冰)',\n '张力 T:1 ~ 40 kN',\n '跨距 l:10 ~ 90 m',\n '线索自重 g_self:1 ~ 60 N/m',\n '冰密度 ρ_ice:500 ~ 950 kg/m³',\n '均匀冰筒模型,未考虑不均匀覆冰、脱冰跳跃与风冰组合',\n '弛度按抛物线近似,未考虑覆冰后张力变化(未与状态方程耦合)',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/icing/',\n};\n","/**\n * 全库公共类型定义。\n *\n * 命名约定(重要):\n * 所有数值字段的单位都写在变量名末尾,例如 tensionKN / spanM / crossSectionMM2。\n * 工程计算里单位混淆是头号 bug 来源,宁可名字长,也不要靠注释记单位。\n */\n\n/**\n * 每个计算器模块必须导出的元信息。\n * 这是本库区别于\"玩具代码\"的核心 —— 公式、依据、适用范围、免责声明全部可机读。\n */\nexport interface CalculatorMeta {\n /** 计算器中文名 */\n readonly name: string;\n /** 计算器英文名,用于国际检索 */\n readonly nameEn: string;\n /** 一句话用途说明 */\n readonly summary: string;\n /** 核心公式,LaTeX 或纯文本,可多条 */\n readonly formula: readonly string[];\n /** 参考依据:标准号、设计手册、教材。注意标注该标准是否真正包含此公式 */\n readonly references: readonly string[];\n /** 适用范围与已知限制 */\n readonly scope: readonly string[];\n /** 免责声明 */\n readonly disclaimer: string;\n /** 在线版本地址 */\n readonly online: string;\n}\n\n/** 重力加速度,N/kg(m/s²) */\nexport const G0 = 9.81;\n","/**\n * 覆冰冰筒模型 —— tension 与 icing 共用。\n *\n * 统一使用 SI 单位(米),与站点 calc-core.js 的 icingCheck 内部口径一致。\n * 页面侧若以 mm 采集,调用前需自行 /1000。\n */\n\nimport { G0 } from '../types';\n\n/** 冰密度常用值,kg/m³ */\nexport const DEFAULT_ICE_DENSITY_KG_PER_M3 = 900;\n\nexport interface IceLoadParams {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\n/**\n * 冰筒模型单位长度冰重:g_ice = ρ_ice·g₀·π·b·(d + b),N/m。\n *\n * 传 iceThicknessM = 0 时返回 0。\n */\nexport function iceLoadNPerM(params: IceLoadParams): number {\n const { wireDiameterM, iceThicknessM } = params;\n const rho = params.iceDensityKgPerM3 ?? DEFAULT_ICE_DENSITY_KG_PER_M3;\n\n if (!(wireDiameterM > 0)) {\n throw new RangeError(`线索直径必须为正数,收到 ${wireDiameterM} m`);\n }\n if (!(iceThicknessM >= 0)) {\n throw new RangeError(`覆冰厚度不能为负,收到 ${iceThicknessM} m`);\n }\n if (!(rho > 0)) {\n throw new RangeError(`冰密度必须为正数,收到 ${rho} kg/m³`);\n }\n if (iceThicknessM === 0) return 0;\n\n return rho * G0 * Math.PI * iceThicknessM * (wireDiameterM + iceThicknessM);\n}\n","export { icingMeta } from './meta';\n\n// 冰筒模型与 tension 模块共用 src/common/ice.ts,由根 index 统一导出\nimport { iceLoadNPerM, type IceLoadParams } from '../common/ice';\n\nexport interface IcingCheckInput {\n /** 线索直径 d,m */\n readonly wireDiameterM: number;\n /** 覆冰厚度 b,m。传 0 表示无冰 */\n readonly iceThicknessM: number;\n /** 线索张力 T,N */\n readonly tensionN: number;\n /** 跨距 l,m */\n readonly spanM: number;\n /** 线索自重 g_self,N/m */\n readonly selfWeightNPerM: number;\n /** 冰密度 ρ_ice,kg/m³。缺省 900 */\n readonly iceDensityKgPerM3?: number;\n}\n\nexport interface IcingCheckResult {\n /** 单位长度冰重 g_ice,N/m */\n readonly iceLoadNPerM: number;\n /** 覆冰后总垂直荷载 g_total,N/m */\n readonly totalLoadNPerM: number;\n /** 无冰弛度 f₀,m */\n readonly sagNoIceM: number;\n /** 覆冰弛度 f_ice,m */\n readonly sagWithIceM: number;\n /** 弛度增幅,% */\n readonly growthPercent: number;\n /** 冰重是否超过线索自重(重覆冰判据) */\n readonly heavy: boolean;\n}\n\n/**\n * 覆冰综合校核。\n *\n * 给出覆冰后的总垂直荷载、弛度及增幅;冰重超过线索自重时 `heavy` 为真。\n *\n * ⚠️ 弛度按抛物线近似,且**未与张力-温度状态方程耦合** —— 覆冰引起的\n * 张力变化未计入,大覆冰工况偏于乐观。\n */\nexport function icingCheck(input: IcingCheckInput): IcingCheckResult {\n const { wireDiameterM, iceThicknessM, tensionN, spanM, selfWeightNPerM } = input;\n\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n if (!(spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${spanM} m`);\n }\n if (!(selfWeightNPerM > 0)) {\n throw new RangeError(`线索自重必须为正数,收到 ${selfWeightNPerM} N/m`);\n }\n\n const iceParams: IceLoadParams = {\n wireDiameterM,\n iceThicknessM,\n ...(input.iceDensityKgPerM3 === undefined\n ? {}\n : { iceDensityKgPerM3: input.iceDensityKgPerM3 }),\n };\n const gIce = iceLoadNPerM(iceParams);\n const gTotal = selfWeightNPerM + gIce;\n\n const fNoIce = (selfWeightNPerM * spanM * spanM) / (8 * tensionN);\n const fIce = (gTotal * spanM * spanM) / (8 * tensionN);\n\n return {\n iceLoadNPerM: gIce,\n totalLoadNPerM: gTotal,\n sagNoIceM: fNoIce,\n sagWithIceM: fIce,\n growthPercent: (fIce / fNoIce - 1) * 100,\n heavy: gIce > selfWeightNPerM,\n };\n}\n"]}
@@ -0,0 +1,119 @@
1
+ // src/tension/meta.ts
2
+ var tensionMeta = {
3
+ name: "\u5F20\u529B-\u6E29\u5EA6\u5B89\u88C5\u66F2\u7EBF",
4
+ nameEn: "Tension-Temperature Installation Curve",
5
+ 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",
6
+ formula: [
7
+ "\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)",
8
+ "\u8DE8\u4E2D\u5F1B\u5EA6\uFF08\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF09\uFF1Af = gl\xB2/(8T)",
9
+ "\u5F53\u91CF\u8DE8\u8DDD\uFF1Al_D = \u221A(\u03A3l\u1D62\xB3 / \u03A3l\u1D62)",
10
+ "\u8986\u51B0\u8377\u8F7D\uFF08\u51B0\u7B52\u6A21\u578B\uFF09\uFF1Ag_ice = \u03C1_ice \xB7 g\u2080 \xB7 \u03C0 \xB7 b \xB7 (d + b)"
11
+ ],
12
+ references: [
13
+ "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",
14
+ "\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",
15
+ "\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"
16
+ ],
17
+ scope: [
18
+ "\u5F39\u6027\u6A21\u91CF E\uFF1A50 ~ 200 GPa",
19
+ "\u622A\u9762\u79EF A\uFF1A50 ~ 250 mm\xB2",
20
+ "\u8DE8\u8DDD l\uFF1A20 ~ 90 m",
21
+ "\u5F1B\u5EA6\u91C7\u7528\u629B\u7269\u7EBF\u8FD1\u4F3C\uFF0C\u4E0D\u9002\u7528\u4E8E\u5927\u5F1B\u5EA6\uFF08f/l > 1/10\uFF09\u5DE5\u51B5",
22
+ "\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"
23
+ ],
24
+ 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",
25
+ online: "https://www.itswe.com/calculator/tension/"
26
+ };
27
+
28
+ // src/tension/index.ts
29
+ function sagM(weightPerLengthNPerM, spanM, tensionN) {
30
+ if (!(tensionN > 0)) {
31
+ throw new RangeError(`\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${tensionN} N`);
32
+ }
33
+ return weightPerLengthNPerM * spanM * spanM / (8 * tensionN);
34
+ }
35
+ function equivalentSpanM(spansM) {
36
+ if (spansM.length === 0) {
37
+ throw new RangeError("\u8DE8\u8DDD\u6570\u7EC4\u4E0D\u80FD\u4E3A\u7A7A");
38
+ }
39
+ let sumCubed = 0;
40
+ let sum = 0;
41
+ for (const s of spansM) {
42
+ if (!(s > 0)) {
43
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${s}`);
44
+ }
45
+ sumCubed += s * s * s;
46
+ sum += s;
47
+ }
48
+ return Math.sqrt(sumCubed / sum);
49
+ }
50
+ function stateCoefficientK(weightPerLengthNPerM, spanM, elasticModulusGPa, crossSectionMM2) {
51
+ const ePa = elasticModulusGPa * 1e9;
52
+ const aM2 = crossSectionMM2 * 1e-6;
53
+ return weightPerLengthNPerM * weightPerLengthNPerM * spanM * spanM * ePa * aM2 / 24;
54
+ }
55
+ function solveTensionN(K, targetN) {
56
+ const hOf = (t) => t - K / (t * t) - targetN;
57
+ let lo = Math.max(targetN, 1e-9);
58
+ let hi = lo + 1;
59
+ let guard = 0;
60
+ while (hOf(hi) < 0 && guard++ < 200) {
61
+ hi = lo + (hi - lo) * 2;
62
+ if (!Number.isFinite(hi)) break;
63
+ }
64
+ let iterations = 0;
65
+ for (let i = 0; i < 200; i++) {
66
+ iterations = i + 1;
67
+ const mid = 0.5 * (lo + hi);
68
+ if (hOf(mid) < 0) {
69
+ lo = mid;
70
+ } else {
71
+ hi = mid;
72
+ }
73
+ if (hi - lo <= 1e-12 * Math.max(1, hi)) break;
74
+ }
75
+ const tensionN = 0.5 * (lo + hi);
76
+ return { tensionN, iterations, residualN: hOf(tensionN) };
77
+ }
78
+ function tensionAt(input) {
79
+ const T1N = input.baseTensionKN * 1e3;
80
+ if (!(T1N > 0)) {
81
+ throw new RangeError(`\u57FA\u51C6\u5F20\u529B\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.baseTensionKN} kN`);
82
+ }
83
+ if (!(input.spanM > 0)) {
84
+ throw new RangeError(`\u8DE8\u8DDD\u5FC5\u987B\u4E3A\u6B63\u6570\uFF0C\u6536\u5230 ${input.spanM} m`);
85
+ }
86
+ const K = stateCoefficientK(
87
+ input.weightPerLengthNPerM,
88
+ input.spanM,
89
+ input.elasticModulusGPa,
90
+ input.crossSectionMM2
91
+ );
92
+ const ePa = input.elasticModulusGPa * 1e9;
93
+ const aM2 = input.crossSectionMM2 * 1e-6;
94
+ const alphaEA = input.expansionPerDegC * ePa * aM2;
95
+ const fBase = T1N - K / (T1N * T1N);
96
+ const target = fBase - alphaEA * (input.targetTempDegC - input.baseTempDegC);
97
+ const { tensionN, iterations, residualN } = solveTensionN(K, target);
98
+ return {
99
+ targetTempDegC: input.targetTempDegC,
100
+ tensionKN: tensionN / 1e3,
101
+ sagM: sagM(input.weightPerLengthNPerM, input.spanM, tensionN),
102
+ iterations,
103
+ residualN
104
+ };
105
+ }
106
+ function tensionCurve(base, tempsDegC) {
107
+ return tempsDegC.map((t) => tensionAt({ ...base, targetTempDegC: t }));
108
+ }
109
+
110
+ export {
111
+ tensionMeta,
112
+ sagM,
113
+ equivalentSpanM,
114
+ stateCoefficientK,
115
+ solveTensionN,
116
+ tensionAt,
117
+ tensionCurve
118
+ };
119
+ //# sourceMappingURL=chunk-QTPXTDGY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tension/meta.ts","../src/tension/index.ts"],"sourcesContent":["import type { CalculatorMeta } from '../types';\n\nexport const tensionMeta: CalculatorMeta = {\n name: '张力-温度安装曲线',\n nameEn: 'Tension-Temperature Installation Curve',\n summary:\n '按张力-温度状态方程求解各温度档的施工张力与弛度,生成安装曲线表;支持当量跨距(多跨锚段)与覆冰工况校核。',\n formula: [\n '状态方程:T₂ − g₂²l²EA/(24T₂²) = T₁ − g₁²l²EA/(24T₁²) − αEA(t₂ − t₁)',\n '跨中弛度(抛物线近似):f = gl²/(8T)',\n '当量跨距:l_D = √(Σlᵢ³ / Σlᵢ)',\n '覆冰荷载(冰筒模型):g_ice = ρ_ice · g₀ · π · b · (d + b)',\n ],\n references: [\n 'TB 10009-2016《铁路电力牵引供电设计规范》—— 仅规定接触线最小张力、张力确定原则与张力差限值,不含张力-温度状态方程本身',\n '张力-温度状态方程为通用柔索状态方程,具体形式以设计文件及接触网设计教材/手册为准',\n '线材 E / α / 线密度为标称参考值,实际以产品技术条件为准',\n ],\n scope: [\n '弹性模量 E:50 ~ 200 GPa',\n '截面积 A:50 ~ 250 mm²',\n '跨距 l:20 ~ 90 m',\n '弛度采用抛物线近似,不适用于大弛度(f/l > 1/10)工况',\n '覆冰模型为均匀冰筒假设,不考虑不均匀覆冰与脱冰跳跃',\n ],\n disclaimer: '本工具结果仅供参考,工程应用以设计文件为准。详见 DISCLAIMER.md。',\n online: 'https://www.itswe.com/calculator/tension/',\n};\n","export { tensionMeta } from './meta';\n\n/** 单个温度档的输入参数 */\nexport interface TensionPointInput {\n /** 基准工况张力 T₁,kN */\n readonly baseTensionKN: number;\n /** 基准温度 t₁,℃ */\n readonly baseTempDegC: number;\n /** 目标温度 t₂,℃ */\n readonly targetTempDegC: number;\n /** 单位自重荷载 g,N/m(覆冰工况传自重与冰重的组合值) */\n readonly weightPerLengthNPerM: number;\n /** 计算跨距 l,m(多跨锚段传当量跨距 l_D) */\n readonly spanM: number;\n /** 弹性模量 E,GPa */\n readonly elasticModulusGPa: number;\n /** 截面积 A,mm² */\n readonly crossSectionMM2: number;\n /** 线膨胀系数 α,1/℃ */\n readonly expansionPerDegC: number;\n}\n\n/** 安装曲线公共参数(不含目标温度) */\nexport type TensionCurveInput = Omit<TensionPointInput, 'targetTempDegC'>;\n\n/** 单个温度档的计算结果 */\nexport interface TensionResult {\n /** 目标温度 t₂,℃ */\n readonly targetTempDegC: number;\n /** 该温度下的张力 T₂,kN */\n readonly tensionKN: number;\n /** 跨中弛度 f,m(抛物线近似) */\n readonly sagM: number;\n /** 求解迭代次数 */\n readonly iterations: number;\n /** 状态方程残差,N(用于校验收敛,应接近 0) */\n readonly residualN: number;\n}\n\n/**\n * 跨中弛度,抛物线近似:f = gl²/(8T)\n * @param weightPerLengthNPerM 单位自重荷载 g,N/m\n * @param spanM 跨距 l,m\n * @param tensionN 张力 T,N\n * @returns 弛度 f,m\n */\nexport function sagM(\n weightPerLengthNPerM: number,\n spanM: number,\n tensionN: number,\n): number {\n if (!(tensionN > 0)) {\n throw new RangeError(`张力必须为正数,收到 ${tensionN} N`);\n }\n return (weightPerLengthNPerM * spanM * spanM) / (8 * tensionN);\n}\n\n/**\n * 当量跨距(多跨锚段归算):l_D = √(Σlᵢ³ / Σlᵢ)\n * @param spansM 各跨跨距,m\n * @returns 当量跨距 l_D,m\n */\nexport function equivalentSpanM(spansM: readonly number[]): number {\n if (spansM.length === 0) {\n throw new RangeError('跨距数组不能为空');\n }\n let sumCubed = 0;\n let sum = 0;\n for (const s of spansM) {\n if (!(s > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${s}`);\n }\n sumCubed += s * s * s;\n sum += s;\n }\n return Math.sqrt(sumCubed / sum);\n}\n\n/**\n * 覆冰荷载(均匀冰筒模型)与 icing 模块共用 `src/common/ice.ts`,\n * 由根 index 统一导出,此处不再重复定义。\n */\n\n/**\n * 状态方程系数 K = g²l²EA/24,单位 N³。\n * 使状态方程可写成 F(T) = T − K/T² 的紧凑形式。\n */\nexport function stateCoefficientK(\n weightPerLengthNPerM: number,\n spanM: number,\n elasticModulusGPa: number,\n crossSectionMM2: number,\n): number {\n const ePa = elasticModulusGPa * 1e9;\n const aM2 = crossSectionMM2 * 1e-6;\n return (weightPerLengthNPerM * weightPerLengthNPerM * spanM * spanM * ePa * aM2) / 24;\n}\n\n/**\n * 求解状态方程 T − K/T² = target 的正根。\n *\n * h(T) = T − K/T² − target 在 T > 0 上严格单调递增(h′ = 1 + 2K/T³ > 0),\n * 因此用二分法必定收敛。又由 T = target + K/T² 可知 T > target,\n * 可直接取 target 作为下界,bracket 很紧。\n */\nexport function solveTensionN(\n K: number,\n targetN: number,\n): { tensionN: number; iterations: number; residualN: number } {\n const hOf = (t: number): number => t - K / (t * t) - targetN;\n\n let lo = Math.max(targetN, 1e-9);\n let hi = lo + 1;\n let guard = 0;\n while (hOf(hi) < 0 && guard++ < 200) {\n hi = lo + (hi - lo) * 2;\n if (!Number.isFinite(hi)) break;\n }\n\n let iterations = 0;\n for (let i = 0; i < 200; i++) {\n iterations = i + 1;\n const mid = 0.5 * (lo + hi);\n if (hOf(mid) < 0) {\n lo = mid;\n } else {\n hi = mid;\n }\n if (hi - lo <= 1e-12 * Math.max(1, hi)) break;\n }\n\n const tensionN = 0.5 * (lo + hi);\n return { tensionN, iterations, residualN: hOf(tensionN) };\n}\n\n/**\n * 求某一温度档的张力与弛度。\n *\n * 状态方程:T₂ − g²l²EA/(24T₂²) = T₁ − g²l²EA/(24T₁²) − αEA(t₂ − t₁)\n */\nexport function tensionAt(input: TensionPointInput): TensionResult {\n const T1N = input.baseTensionKN * 1000;\n if (!(T1N > 0)) {\n throw new RangeError(`基准张力必须为正数,收到 ${input.baseTensionKN} kN`);\n }\n if (!(input.spanM > 0)) {\n throw new RangeError(`跨距必须为正数,收到 ${input.spanM} m`);\n }\n\n const K = stateCoefficientK(\n input.weightPerLengthNPerM,\n input.spanM,\n input.elasticModulusGPa,\n input.crossSectionMM2,\n );\n const ePa = input.elasticModulusGPa * 1e9;\n const aM2 = input.crossSectionMM2 * 1e-6;\n const alphaEA = input.expansionPerDegC * ePa * aM2;\n\n const fBase = T1N - K / (T1N * T1N);\n const target = fBase - alphaEA * (input.targetTempDegC - input.baseTempDegC);\n\n const { tensionN, iterations, residualN } = solveTensionN(K, target);\n\n return {\n targetTempDegC: input.targetTempDegC,\n tensionKN: tensionN / 1000,\n sagM: sagM(input.weightPerLengthNPerM, input.spanM, tensionN),\n iterations,\n residualN,\n };\n}\n\n/**\n * 批量求解多个温度档,生成安装曲线表。\n */\nexport function tensionCurve(\n base: TensionCurveInput,\n tempsDegC: readonly number[],\n): TensionResult[] {\n return tempsDegC.map((t) => tensionAt({ ...base, targetTempDegC: t }));\n}\n"],"mappings":"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","names":[]}