@theerapat-s28/ts-structural-eng-tools 1.4.0 → 2.0.1

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 (192) hide show
  1. package/README.md +44 -4
  2. package/dist/core/constants/frame.constant.d.ts +14 -0
  3. package/dist/core/constants/frame.constant.js +18 -0
  4. package/dist/core/constants/frame.constant.js.map +1 -0
  5. package/dist/core/constants/rc.constant.d.ts +7 -0
  6. package/dist/core/constants/rc.constant.js +20 -1
  7. package/dist/core/constants/rc.constant.js.map +1 -1
  8. package/dist/core/errors/frame-analysis.error.d.ts +33 -0
  9. package/dist/core/errors/frame-analysis.error.js +74 -0
  10. package/dist/core/errors/frame-analysis.error.js.map +1 -0
  11. package/dist/core/errors/rc-design.error.js +8 -0
  12. package/dist/core/errors/rc-design.error.js.map +1 -1
  13. package/dist/core/index.d.ts +7 -3
  14. package/dist/core/index.js +16 -1
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/core/types/plate-jacketing.type.d.ts +37 -0
  17. package/dist/core/types/plate-jacketing.type.js +8 -0
  18. package/dist/core/types/plate-jacketing.type.js.map +1 -1
  19. package/dist/core/types/section-properties.type.d.ts +13 -0
  20. package/dist/core/types/section-properties.type.js +3 -0
  21. package/dist/core/types/section-properties.type.js.map +1 -0
  22. package/dist/esm/core/constants/frame.constant.js +15 -0
  23. package/dist/esm/core/constants/frame.constant.js.map +1 -0
  24. package/dist/esm/core/constants/rc.constant.js +63 -0
  25. package/dist/esm/core/constants/rc.constant.js.map +1 -0
  26. package/dist/esm/core/errors/frame-analysis.error.js +70 -0
  27. package/dist/esm/core/errors/frame-analysis.error.js.map +1 -0
  28. package/dist/esm/core/errors/rc-design.error.js +64 -0
  29. package/dist/esm/core/errors/rc-design.error.js.map +1 -0
  30. package/dist/esm/core/index.js +9 -0
  31. package/dist/esm/core/index.js.map +1 -0
  32. package/dist/esm/core/types/output-message.type.js +2 -0
  33. package/dist/esm/core/types/output-message.type.js.map +1 -0
  34. package/dist/esm/core/types/plate-jacketing.type.js +18 -0
  35. package/dist/esm/core/types/plate-jacketing.type.js.map +1 -0
  36. package/dist/esm/core/types/rc-beam.type.js +11 -0
  37. package/dist/esm/core/types/rc-beam.type.js.map +1 -0
  38. package/dist/esm/core/types/section-properties.type.js +2 -0
  39. package/dist/esm/core/types/section-properties.type.js.map +1 -0
  40. package/dist/esm/core/types/unit.type.js +2 -0
  41. package/dist/esm/core/types/unit.type.js.map +1 -0
  42. package/dist/esm/fea/frame/elements/beam-3d-stiffness.js +84 -0
  43. package/dist/esm/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
  44. package/dist/esm/fea/frame/elements/fixed-end-forces.js +75 -0
  45. package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -0
  46. package/dist/esm/fea/frame/elements/static-condensation.js +55 -0
  47. package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -0
  48. package/dist/esm/fea/frame/index.js +6 -0
  49. package/dist/esm/fea/frame/index.js.map +1 -0
  50. package/dist/esm/fea/frame/post/demand-envelope.js +97 -0
  51. package/dist/esm/fea/frame/post/demand-envelope.js.map +1 -0
  52. package/dist/esm/fea/frame/post/envelope.js +59 -0
  53. package/dist/esm/fea/frame/post/envelope.js.map +1 -0
  54. package/dist/esm/fea/frame/post/member-diagram.js +332 -0
  55. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -0
  56. package/dist/esm/fea/frame/post/present-state.js +106 -0
  57. package/dist/esm/fea/frame/post/present-state.js.map +1 -0
  58. package/dist/esm/fea/frame/solver/analyze-frame.js +123 -0
  59. package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -0
  60. package/dist/esm/fea/frame/solver/boundary-conditions.js +33 -0
  61. package/dist/esm/fea/frame/solver/boundary-conditions.js.map +1 -0
  62. package/dist/esm/fea/frame/solver/combinations.js +69 -0
  63. package/dist/esm/fea/frame/solver/combinations.js.map +1 -0
  64. package/dist/esm/fea/frame/solver/frame-system.js +122 -0
  65. package/dist/esm/fea/frame/solver/frame-system.js.map +1 -0
  66. package/dist/esm/fea/frame/solver/global-assembly.js +27 -0
  67. package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -0
  68. package/dist/esm/fea/frame/solver/load-case-solver.js +119 -0
  69. package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -0
  70. package/dist/esm/fea/frame/transformation/coordinate-transform.js +71 -0
  71. package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -0
  72. package/dist/esm/fea/frame/types/model.type.js +2 -0
  73. package/dist/esm/fea/frame/types/model.type.js.map +1 -0
  74. package/dist/esm/fea/frame/types/results.type.js +2 -0
  75. package/dist/esm/fea/frame/types/results.type.js.map +1 -0
  76. package/dist/esm/fea/frame/validation/validate-model.js +292 -0
  77. package/dist/esm/fea/frame/validation/validate-model.js.map +1 -0
  78. package/dist/esm/fea/index.js +3 -0
  79. package/dist/esm/fea/index.js.map +1 -0
  80. package/dist/esm/index.js +10 -0
  81. package/dist/esm/index.js.map +1 -0
  82. package/dist/esm/package.json +1 -0
  83. package/dist/esm/rc/general.js +32 -0
  84. package/dist/esm/rc/general.js.map +1 -0
  85. package/dist/esm/rc/index.js +5 -0
  86. package/dist/esm/rc/index.js.map +1 -0
  87. package/dist/esm/rc/rc-bar-layout.js +89 -0
  88. package/dist/esm/rc/rc-bar-layout.js.map +1 -0
  89. package/dist/esm/rc/rc-beam-design.js +320 -0
  90. package/dist/esm/rc/rc-beam-design.js.map +1 -0
  91. package/dist/esm/rc/rc-section-properties.js +55 -0
  92. package/dist/esm/rc/rc-section-properties.js.map +1 -0
  93. package/dist/esm/strengthening/index.js +4 -0
  94. package/dist/esm/strengthening/index.js.map +1 -0
  95. package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js +338 -0
  96. package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js.map +1 -0
  97. package/dist/esm/strengthening/rc-beam-side-plate-shear.js +381 -0
  98. package/dist/esm/strengthening/rc-beam-side-plate-shear.js.map +1 -0
  99. package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js +90 -0
  100. package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -0
  101. package/dist/esm/utils/index.js +5 -0
  102. package/dist/esm/utils/index.js.map +1 -0
  103. package/dist/esm/utils/math.js +30 -0
  104. package/dist/esm/utils/math.js.map +1 -0
  105. package/dist/esm/utils/matrix.js +145 -0
  106. package/dist/esm/utils/matrix.js.map +1 -0
  107. package/dist/esm/utils/merge-warning.js +11 -0
  108. package/dist/esm/utils/merge-warning.js.map +1 -0
  109. package/dist/esm/utils/skyline.js +151 -0
  110. package/dist/esm/utils/skyline.js.map +1 -0
  111. package/dist/fea/frame/elements/beam-3d-stiffness.d.ts +29 -0
  112. package/dist/fea/frame/elements/beam-3d-stiffness.js +90 -0
  113. package/dist/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
  114. package/dist/fea/frame/elements/fixed-end-forces.d.ts +22 -0
  115. package/dist/fea/frame/elements/fixed-end-forces.js +79 -0
  116. package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -0
  117. package/dist/fea/frame/elements/static-condensation.d.ts +19 -0
  118. package/dist/fea/frame/elements/static-condensation.js +59 -0
  119. package/dist/fea/frame/elements/static-condensation.js.map +1 -0
  120. package/dist/fea/frame/index.d.ts +9 -0
  121. package/dist/fea/frame/index.js +16 -0
  122. package/dist/fea/frame/index.js.map +1 -0
  123. package/dist/fea/frame/post/demand-envelope.d.ts +36 -0
  124. package/dist/fea/frame/post/demand-envelope.js +101 -0
  125. package/dist/fea/frame/post/demand-envelope.js.map +1 -0
  126. package/dist/fea/frame/post/envelope.d.ts +8 -0
  127. package/dist/fea/frame/post/envelope.js +63 -0
  128. package/dist/fea/frame/post/envelope.js.map +1 -0
  129. package/dist/fea/frame/post/member-diagram.d.ts +26 -0
  130. package/dist/fea/frame/post/member-diagram.js +336 -0
  131. package/dist/fea/frame/post/member-diagram.js.map +1 -0
  132. package/dist/fea/frame/post/present-state.d.ts +19 -0
  133. package/dist/fea/frame/post/present-state.js +111 -0
  134. package/dist/fea/frame/post/present-state.js.map +1 -0
  135. package/dist/fea/frame/solver/analyze-frame.d.ts +67 -0
  136. package/dist/fea/frame/solver/analyze-frame.js +128 -0
  137. package/dist/fea/frame/solver/analyze-frame.js.map +1 -0
  138. package/dist/fea/frame/solver/boundary-conditions.d.ts +14 -0
  139. package/dist/fea/frame/solver/boundary-conditions.js +37 -0
  140. package/dist/fea/frame/solver/boundary-conditions.js.map +1 -0
  141. package/dist/fea/frame/solver/combinations.d.ts +11 -0
  142. package/dist/fea/frame/solver/combinations.js +73 -0
  143. package/dist/fea/frame/solver/combinations.js.map +1 -0
  144. package/dist/fea/frame/solver/frame-system.d.ts +42 -0
  145. package/dist/fea/frame/solver/frame-system.js +126 -0
  146. package/dist/fea/frame/solver/frame-system.js.map +1 -0
  147. package/dist/fea/frame/solver/global-assembly.d.ts +17 -0
  148. package/dist/fea/frame/solver/global-assembly.js +33 -0
  149. package/dist/fea/frame/solver/global-assembly.js.map +1 -0
  150. package/dist/fea/frame/solver/load-case-solver.d.ts +34 -0
  151. package/dist/fea/frame/solver/load-case-solver.js +124 -0
  152. package/dist/fea/frame/solver/load-case-solver.js.map +1 -0
  153. package/dist/fea/frame/transformation/coordinate-transform.d.ts +21 -0
  154. package/dist/fea/frame/transformation/coordinate-transform.js +76 -0
  155. package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -0
  156. package/dist/fea/frame/types/model.type.d.ts +112 -0
  157. package/dist/fea/frame/types/model.type.js +3 -0
  158. package/dist/fea/frame/types/model.type.js.map +1 -0
  159. package/dist/fea/frame/types/results.type.d.ts +134 -0
  160. package/dist/fea/frame/types/results.type.js +3 -0
  161. package/dist/fea/frame/types/results.type.js.map +1 -0
  162. package/dist/fea/frame/validation/validate-model.d.ts +18 -0
  163. package/dist/fea/frame/validation/validate-model.js +298 -0
  164. package/dist/fea/frame/validation/validate-model.js.map +1 -0
  165. package/dist/fea/index.d.ts +1 -0
  166. package/dist/fea/index.js +19 -0
  167. package/dist/fea/index.js.map +1 -0
  168. package/dist/index.d.ts +9 -5
  169. package/dist/index.js +44 -1
  170. package/dist/index.js.map +1 -1
  171. package/dist/rc/index.d.ts +2 -0
  172. package/dist/rc/index.js +3 -1
  173. package/dist/rc/index.js.map +1 -1
  174. package/dist/rc/rc-section-properties.d.ts +35 -0
  175. package/dist/rc/rc-section-properties.js +59 -0
  176. package/dist/rc/rc-section-properties.js.map +1 -0
  177. package/dist/strengthening/index.d.ts +1 -0
  178. package/dist/strengthening/index.js +5 -1
  179. package/dist/strengthening/index.js.map +1 -1
  180. package/dist/strengthening/rc-beam-side-plate-shear.d.ts +254 -0
  181. package/dist/strengthening/rc-beam-side-plate-shear.js +420 -0
  182. package/dist/strengthening/rc-beam-side-plate-shear.js.map +1 -0
  183. package/dist/utils/index.d.ts +4 -0
  184. package/dist/utils/index.js +19 -1
  185. package/dist/utils/index.js.map +1 -1
  186. package/dist/utils/matrix.d.ts +45 -0
  187. package/dist/utils/matrix.js +157 -0
  188. package/dist/utils/matrix.js.map +1 -0
  189. package/dist/utils/skyline.d.ts +49 -0
  190. package/dist/utils/skyline.js +161 -0
  191. package/dist/utils/skyline.js.map +1 -0
  192. package/package.json +20 -2
@@ -0,0 +1,70 @@
1
+ export class FrameAnalysisError extends Error {
2
+ constructor(std = { code: 0, message: "Unknown error" }, details = {}, issues) {
3
+ super(std.message);
4
+ this.code = std.code;
5
+ this.message = std.message;
6
+ this.details = details;
7
+ this.issues = issues ?? [{ code: std.code, message: std.message, details }];
8
+ Object.setPrototypeOf(this, FrameAnalysisError.prototype);
9
+ }
10
+ }
11
+ export const FrameErrors = {
12
+ // 3XX : Frame analysis errors
13
+ ZERO_LENGTH_MEMBER: {
14
+ code: 301,
15
+ message: "A member's start and end nodes coincide; the member has zero length.",
16
+ },
17
+ UNKNOWN_NODE_REFERENCE: {
18
+ code: 302,
19
+ message: "A member, restraint or load refers to a node or member id that is not in the model.",
20
+ },
21
+ DUPLICATE_ID: {
22
+ code: 303,
23
+ message: "Node ids, member ids and restrained node ids must each be unique, and load case and combination ids must be unique across both lists.",
24
+ },
25
+ STRUCTURE_UNSTABLE: {
26
+ code: 304,
27
+ message: "The restrained structure is unstable (singular stiffness matrix); add supports or members to prevent a mechanism.",
28
+ },
29
+ INVALID_SECTION_PROPERTIES: {
30
+ code: 305,
31
+ message: "Member section properties E, G, A, I22, I33 and J must all be positive, and unitWeight, when given, must not be negative.",
32
+ },
33
+ NO_RESTRAINTS: {
34
+ code: 306,
35
+ message: "The model has no restrained degrees of freedom.",
36
+ },
37
+ INVALID_RELEASE: {
38
+ code: 307,
39
+ message: "The end releases on a member make it a mechanism (rigid-body motion within the member).",
40
+ },
41
+ LOAD_OUTSIDE_MEMBER: {
42
+ code: 308,
43
+ message: "A member load lies outside the member, or its start is not before its end.",
44
+ },
45
+ UNKNOWN_LOAD_CASE: {
46
+ code: 309,
47
+ message: "A load or a load combination term refers to a load case or combination that is not in the model, or a term names neither.",
48
+ },
49
+ CIRCULAR_COMBINATION: {
50
+ code: 310,
51
+ message: "Load combinations reference each other in a loop.",
52
+ },
53
+ INVALID_LOAD_FACTOR: {
54
+ code: 311,
55
+ message: "A combination factor or self-weight multiplier is not a finite number, or a load combination has no terms.",
56
+ },
57
+ NO_LOAD_CASES: {
58
+ code: 312,
59
+ message: "The model has no load cases; define at least one in loadCases.",
60
+ },
61
+ MISSING_UNIT_WEIGHT: {
62
+ code: 313,
63
+ message: "A load case requests self-weight but a member section has no unitWeight; set unitWeight (0 for a weightless member).",
64
+ },
65
+ INVALID_INPUT_VALUE: {
66
+ code: 314,
67
+ message: "An input value is invalid: a number that is not finite (NaN, Infinity or not a number), a negative spring stiffness, or a value outside its allowed options.",
68
+ },
69
+ };
70
+ //# sourceMappingURL=frame-analysis.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-analysis.error.js","sourceRoot":"","sources":["../../../../src/core/errors/frame-analysis.error.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAO3C,YACE,MAA8B,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EACnE,UAA6B,EAAE,EAC/B,MAA0B;QAE1B,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;CACF;AAcD,MAAM,CAAC,MAAM,WAAW,GAA2C;IACjE,8BAA8B;IAC9B,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,sEAAsE;KAChF;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,qFAAqF;KAC/F;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,GAAG;QACT,OAAO,EACL,uIAAuI;KAC1I;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,mHAAmH;KACtH;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,iDAAiD;KAC3D;IACD,eAAe,EAAE;QACf,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yFAAyF;KAC5F;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,4EAA4E;KACtF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,mDAAmD;KAC7D;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,gEAAgE;KAC1E;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,sHAAsH;KACzH;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,8JAA8J;KACjK;CACF,CAAC"}
@@ -0,0 +1,64 @@
1
+ export class RCDesignError extends Error {
2
+ constructor(std = { code: 0, message: "Unknown error" }) {
3
+ super(std.message);
4
+ this.code = std.code;
5
+ this.message = std.message;
6
+ Object.setPrototypeOf(this, RCDesignError.prototype);
7
+ }
8
+ }
9
+ export const Errors = {
10
+ // 1XX : RC Beam Design Errors
11
+ /**
12
+ * @deprecated Never thrown since 1.4.0. A section whose compression steel
13
+ * lies below the neutral axis is valid — that steel acts in tension and
14
+ * `rectBeamMomentCapacity` now returns a reduced Mn with a warning instead.
15
+ * Retained so existing `Errors.COMP_STEEL_DISTANCE_OVER_AC` references and
16
+ * `code === 101` checks keep compiling; safe to delete in the next major.
17
+ */
18
+ COMP_STEEL_DISTANCE_OVER_AC: {
19
+ code: 101,
20
+ message: "d' of compressive steel is greater than c, consider using singly reinforced section.",
21
+ },
22
+ TENSILE_STEEL_NOT_YIELDING: {
23
+ code: 102,
24
+ message: "Out of tension controlled region, tensile steel is not yielding.",
25
+ },
26
+ SECTION_TOO_NARROW_FOR_BAR: {
27
+ code: 103,
28
+ message: "Section width is too narrow to fit even one bar of the given diameter with the required cover and spacing.",
29
+ },
30
+ BAR_LAYOUT_EXCEEDS_SECTION_HEIGHT: {
31
+ code: 104,
32
+ message: "Combined top and bottom rebar layers exceed the section height h.",
33
+ },
34
+ SHEAR_STRENGTH_EXCEEDS_MAX: {
35
+ code: 105,
36
+ message: "Vs exceeds 0.66*sqrt(fc')*bw*d (ACI318-19, 22.5.1.2); section is too small for shear, increase bw or d.",
37
+ },
38
+ // 2XX : Strengthening / plate-to-concrete connection errors
39
+ NON_POSITIVE_SHEAR_FLOW: {
40
+ code: 201,
41
+ message: "Interface shear flow requires a positive shear force V and at least one jacketing plate with non-zero area.",
42
+ },
43
+ INVALID_BOLT_CAPACITY: {
44
+ code: 202,
45
+ message: "Resolved bolt shear capacity is not positive; check Ase, futa, or the supplied phiVboltOverride.",
46
+ },
47
+ PLATE_OUTSIDE_SECTION: {
48
+ code: 203,
49
+ message: "Inconsistent jacketed section geometry; plate and section dimensions must be positive and d must lie within h.",
50
+ },
51
+ CRACKED_NA_NOT_FOUND: {
52
+ code: 204,
53
+ message: "No valid cracked neutral axis was found within the concrete depth; check the section and plate properties.",
54
+ },
55
+ SIDE_PLATE_GEOMETRY_INVALID: {
56
+ code: 205,
57
+ message: "Inconsistent side plate geometry; thickness, engaged depth, fy and sides must be positive, the depth must fit within the section, and a stripped layout requires a positive width and spacing.",
58
+ },
59
+ STRENGTHENED_SHEAR_NO_HEADROOM: {
60
+ code: 206,
61
+ message: "Existing Vs already reaches 0.66*sqrt(fc')*bw*d (ACI318-19, 22.5.1.2); the web crushes before any added side plate force can be developed, so shear strengthening cannot be realised on this section.",
62
+ },
63
+ };
64
+ //# sourceMappingURL=rc-design.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-design.error.js","sourceRoot":"","sources":["../../../../src/core/errors/rc-design.error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAItC,YAAY,MAAyB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE;QACxE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;CACF;AAOD,MAAM,CAAC,MAAM,MAAM,GAAsC;IACvD,8BAA8B;IAE9B;;;;;;OAMG;IACH,2BAA2B,EAAE;QAC3B,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,sFAAsF;KAChG;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,kEAAkE;KAC5E;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,iCAAiC,EAAE;QACjC,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,mEAAmE;KAC7E;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yGAAyG;KAC5G;IAED,4DAA4D;IAC5D,uBAAuB,EAAE;QACvB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,6GAA6G;KAChH;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,kGAAkG;KACrG;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gHAAgH;KACnH;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,2BAA2B,EAAE;QAC3B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gMAAgM;KACnM;IACD,8BAA8B,EAAE;QAC9B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,uMAAuM;KAC1M;CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { isSinglyReinforced } from "./types/rc-beam.type.js";
2
+ export { hasTopPlate, hasBottomPlate, hasSidePlate } from "./types/plate-jacketing.type.js";
3
+ // Constants
4
+ export { FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, } from "./constants/rc.constant.js";
5
+ export { CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, } from "./constants/frame.constant.js";
6
+ // Errors
7
+ export { RCDesignError, Errors } from "./errors/rc-design.error.js";
8
+ export { FrameAnalysisError, FrameErrors } from "./errors/frame-analysis.error.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAW1D,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAKzF,YAAY;AACZ,OAAO,EACL,kCAAkC,EAClC,wBAAwB,EACxB,+BAA+B,EAC/B,sCAAsC,EACtC,sBAAsB,EACtB,6BAA6B,EAC7B,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=output-message.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-message.type.js","sourceRoot":"","sources":["../../../../src/core/types/output-message.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * A plate counts as present only when both its width and thickness are positive,
3
+ * so a bottom-only jacket may omit the top plate fields or pass them as zero.
4
+ */
5
+ export function hasTopPlate(props) {
6
+ return (props.topSteelWidth ?? 0) > 0 && (props.topSteelThickness ?? 0) > 0;
7
+ }
8
+ export function hasBottomPlate(props) {
9
+ return (props.bottomSteelWidth ?? 0) > 0 && (props.bottomSteelThickness ?? 0) > 0;
10
+ }
11
+ /**
12
+ * A side plate counts as present only when both its thickness and engaged depth
13
+ * are positive.
14
+ */
15
+ export function hasSidePlate(props) {
16
+ return props.thickness > 0 && props.depth > 0;
17
+ }
18
+ //# sourceMappingURL=plate-jacketing.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plate-jacketing.type.js","sourceRoot":"","sources":["../../../../src/core/types/plate-jacketing.type.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AACpF,CAAC;AA6DD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAA0B;IACrD,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * A section counts as singly reinforced when it carries no compression steel.
3
+ *
4
+ * `d_` is deliberately not sign-checked: it is measured from the extreme
5
+ * concrete compression fibre, so compression steel above that face — a steel
6
+ * plate bonded to the top of the beam — legitimately has `d_ <= 0`.
7
+ */
8
+ export function isSinglyReinforced(section) {
9
+ return !("As_" in section) || !("d_" in section) || section.As_ <= 0;
10
+ }
11
+ //# sourceMappingURL=rc-beam.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-beam.type.js","sourceRoot":"","sources":["../../../../src/core/types/rc-beam.type.ts"],"names":[],"mappings":"AAoDA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAwB;IACzD,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=section-properties.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-properties.type.js","sourceRoot":"","sources":["../../../../src/core/types/section-properties.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=unit.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit.type.js","sourceRoot":"","sources":["../../../../src/core/types/unit.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { zeros } from "../../../utils/matrix.js";
2
+ /**
3
+ * Local DOF indices (0-based) whose reference-matrix rotation sign is opposite to the
4
+ * right-hand rule: R2 and R3 at the start and end nodes.
5
+ */
6
+ const FLIPPED_DOFS = [4, 5, 10, 11];
7
+ /**
8
+ * Local stiffness matrix of a 3D prismatic beam element, exactly as in the reference
9
+ * "Complete Beam Stiffness Matrix".
10
+ *
11
+ * DOF order for node i then node j: [U1, U2, U3, R1, R2, R3]. Local 1 runs along the member.
12
+ * The reference matrix measures the bending rotations R2 and R3 opposite to the right-hand
13
+ * rule; use `beam3dLocalStiffnessRightHanded` for the right-handed form.
14
+ *
15
+ * The reference uses one `EI`; here the U2–R3 terms use `E·I33` and the U3–R2 terms use
16
+ * `E·I22`, which reduces to the reference when `I22 = I33`.
17
+ *
18
+ * @param E - Young's modulus in MPa
19
+ * @param G - Shear modulus in MPa
20
+ * @param A - Area in mm²
21
+ * @param I22 - Second moment about local 2 in mm⁴
22
+ * @param I33 - Second moment about local 3 in mm⁴
23
+ * @param J - Torsion constant in mm⁴
24
+ * @param L - Member length in mm
25
+ * @returns 12×12 symmetric matrix in N and mm
26
+ */
27
+ export const beam3dLocalStiffness = (E, G, A, I22, I33, J, L) => {
28
+ const k = zeros(12, 12);
29
+ // 1-based row/column, upper triangle as written in the reference; mirrored for symmetry.
30
+ const set = (row, col, value) => {
31
+ k[row - 1][col - 1] = value;
32
+ k[col - 1][row - 1] = value;
33
+ };
34
+ const ax = (E * A) / L;
35
+ const tor = (G * J) / L;
36
+ // U2–R3 bending (I33)
37
+ const a3 = (12 * E * I33) / L ** 3;
38
+ const b3 = (6 * E * I33) / L ** 2;
39
+ const c3 = (4 * E * I33) / L;
40
+ const d3 = (2 * E * I33) / L;
41
+ // U3–R2 bending (I22)
42
+ const a2 = (12 * E * I22) / L ** 3;
43
+ const b2 = (6 * E * I22) / L ** 2;
44
+ const c2 = (4 * E * I22) / L;
45
+ const d2 = (2 * E * I22) / L;
46
+ set(1, 1, ax);
47
+ set(1, 7, -ax);
48
+ set(7, 7, ax);
49
+ set(2, 2, a3);
50
+ set(2, 6, -b3);
51
+ set(2, 8, -a3);
52
+ set(2, 12, -b3);
53
+ set(6, 6, c3);
54
+ set(6, 8, b3);
55
+ set(6, 12, d3);
56
+ set(8, 8, a3);
57
+ set(8, 12, b3);
58
+ set(12, 12, c3);
59
+ set(3, 3, a2);
60
+ set(3, 5, b2);
61
+ set(3, 9, -a2);
62
+ set(3, 11, b2);
63
+ set(5, 5, c2);
64
+ set(5, 9, -b2);
65
+ set(5, 11, d2);
66
+ set(9, 9, a2);
67
+ set(9, 11, -b2);
68
+ set(11, 11, c2);
69
+ set(4, 4, tor);
70
+ set(4, 10, -tor);
71
+ set(10, 10, tor);
72
+ return k;
73
+ };
74
+ /**
75
+ * Converts a local matrix between the reference rotation convention and the right-hand rule
76
+ * (`D·k·D`, with `D` flipping the sign of R2 and R3 at both ends). The conversion is its own inverse.
77
+ */
78
+ export const flipBendingRotationSigns = (k) => {
79
+ const flipped = new Set(FLIPPED_DOFS);
80
+ return k.map((row, i) => row.map((value, j) => (flipped.has(i) !== flipped.has(j) ? -value : value)));
81
+ };
82
+ /** Same element as `beam3dLocalStiffness` with all rotations following the right-hand rule. */
83
+ export const beam3dLocalStiffnessRightHanded = (E, G, A, I22, I33, J, L) => flipBendingRotationSigns(beam3dLocalStiffness(E, G, A, I22, I33, J, L));
84
+ //# sourceMappingURL=beam-3d-stiffness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beam-3d-stiffness.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/beam-3d-stiffness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { FrameAnalysisError, FrameErrors } from "../../../core/errors/frame-analysis.error.js";
2
+ // 4-point Gauss–Legendre rule, exact for the cubic integrands used here
3
+ const GAUSS_POINTS = [
4
+ -0.8611363115940526, -0.3399810435848563, 0.3399810435848563, 0.8611363115940526,
5
+ ];
6
+ const GAUSS_WEIGHTS = [
7
+ 0.3478548451374538, 0.6521451548625461, 0.6521451548625461, 0.3478548451374538,
8
+ ];
9
+ /**
10
+ * Equivalent nodal loads of a unit transverse/axial load at distance `x`, from the
11
+ * Euler–Bernoulli shape functions: the exact fixed-end solution for a prismatic member.
12
+ * Returned per unit of load, right-hand local DOF order [i: U1..R3, j: U1..R3].
13
+ */
14
+ const unitEquivalentLoad = (axis, x, L) => {
15
+ const xi = x / L;
16
+ const out = new Array(12).fill(0);
17
+ if (axis === 1) {
18
+ out[0] = 1 - xi;
19
+ out[6] = xi;
20
+ return out;
21
+ }
22
+ const n1 = 1 - 3 * xi ** 2 + 2 * xi ** 3;
23
+ const n2 = L * (xi - 2 * xi ** 2 + xi ** 3);
24
+ const n3 = 3 * xi ** 2 - 2 * xi ** 3;
25
+ const n4 = L * (-(xi ** 2) + xi ** 3);
26
+ if (axis === 2) {
27
+ // load along local 2: force U2, moment about 3 (R3 = +dv/dx)
28
+ out[1] = n1;
29
+ out[5] = n2;
30
+ out[7] = n3;
31
+ out[11] = n4;
32
+ }
33
+ else {
34
+ // load along local 3: force U3, moment about 2 (R2 = −dw/dx)
35
+ out[2] = n1;
36
+ out[4] = -n2;
37
+ out[8] = n3;
38
+ out[10] = -n4;
39
+ }
40
+ return out;
41
+ };
42
+ /**
43
+ * Fixed-end forces of a member under local loads: the end forces (right-hand local axes,
44
+ * N and N·mm) that hold both ends fully fixed. Equivalent nodal loads are the negative.
45
+ *
46
+ * @param loads - Loads in local axes, N and mm
47
+ * @param L - Member length in mm
48
+ * @throws {FrameAnalysisError} 308 if a load lies outside the member
49
+ */
50
+ export const fixedEndForces = (loads, L) => {
51
+ const equivalent = new Array(12).fill(0);
52
+ const add = (unit, factor) => {
53
+ for (let i = 0; i < 12; i++)
54
+ equivalent[i] += unit[i] * factor;
55
+ };
56
+ for (const load of loads) {
57
+ if (load.type === "point") {
58
+ if (!(load.a >= 0 && load.a <= L))
59
+ throw new FrameAnalysisError(FrameErrors.LOAD_OUTSIDE_MEMBER);
60
+ add(unitEquivalentLoad(load.axis, load.a, L), load.P);
61
+ }
62
+ else {
63
+ if (!(load.start >= 0 && load.end <= L && load.start < load.end)) {
64
+ throw new FrameAnalysisError(FrameErrors.LOAD_OUTSIDE_MEMBER);
65
+ }
66
+ const half = (load.end - load.start) / 2;
67
+ const mid = (load.end + load.start) / 2;
68
+ GAUSS_POINTS.forEach((p, index) => {
69
+ add(unitEquivalentLoad(load.axis, mid + half * p, L), load.w * half * GAUSS_WEIGHTS[index]);
70
+ });
71
+ }
72
+ }
73
+ return equivalent.map((v) => -v);
74
+ };
75
+ //# sourceMappingURL=fixed-end-forces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixed-end-forces.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/fixed-end-forces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { FrameAnalysisError, FrameErrors } from "../../../core/errors/frame-analysis.error.js";
2
+ import { solveLinearSystem } from "../../../utils/matrix.js";
3
+ /**
4
+ * Statically condenses released local DOFs out of a member, so those DOFs carry no force.
5
+ *
6
+ * With released set r and retained set c:
7
+ * `k* = k_cc − k_cr·k_rr⁻¹·k_rc`, `f* = f_c − k_cr·k_rr⁻¹·f_r`.
8
+ * The stiffness is condensed once; the returned function condenses the fixed-end forces of
9
+ * each load case.
10
+ *
11
+ * @param k - 12×12 local stiffness (right-hand)
12
+ * @param released - Local DOF indices (0–11) to release
13
+ * @throws {FrameAnalysisError} 307 if the released set makes the member a mechanism
14
+ */
15
+ export const condenseMember = (k, released) => {
16
+ if (released.length === 0) {
17
+ return { k, condenseFixedEndForces: (fixed) => [...fixed] };
18
+ }
19
+ const retained = Array.from({ length: 12 }, (_, i) => i).filter((i) => !released.includes(i));
20
+ const sub = (rows, cols) => rows.map((r) => cols.map((c) => k[r][c]));
21
+ const krr = sub(released, released);
22
+ const krc = sub(released, retained);
23
+ const kcr = sub(retained, released);
24
+ const kcc = sub(retained, retained);
25
+ // [k_rr⁻¹·k_rc | k_rr⁻¹]
26
+ const rhs = released.map((_, i) => [...krc[i], ...released.map((__, j) => (i === j ? 1 : 0))]);
27
+ const solved = solveLinearSystem(krr, rhs);
28
+ if (!solved)
29
+ throw new FrameAnalysisError(FrameErrors.INVALID_RELEASE);
30
+ const nc = retained.length;
31
+ const kStar = k.map((row) => row.map(() => 0));
32
+ retained.forEach((r, ri) => {
33
+ retained.forEach((c, ci) => {
34
+ let value = kcc[ri][ci];
35
+ released.forEach((_, j) => {
36
+ value -= kcr[ri][j] * solved[j][ci];
37
+ });
38
+ kStar[r][c] = value;
39
+ });
40
+ });
41
+ // k_cr·k_rr⁻¹, applied to f_r for every load case
42
+ const kcrKrrInv = retained.map((_, ri) => released.map((__, m) => released.reduce((s, ___, j) => s + kcr[ri][j] * solved[j][nc + m], 0)));
43
+ return {
44
+ k: kStar,
45
+ condenseFixedEndForces: (fixed) => {
46
+ const fStar = new Array(12).fill(0);
47
+ const fr = released.map((r) => fixed[r]);
48
+ retained.forEach((r, ri) => {
49
+ fStar[r] = fixed[r] - kcrKrrInv[ri].reduce((s, v, m) => s + v * fr[m], 0);
50
+ });
51
+ return fStar;
52
+ },
53
+ };
54
+ };
55
+ //# sourceMappingURL=static-condensation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-condensation.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/static-condensation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { analyzeFrame, createFrameAnalysis } from "./solver/analyze-frame.js";
2
+ export { validateFrameModel } from "./validation/validate-model.js";
3
+ export { beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, } from "./elements/beam-3d-stiffness.js";
4
+ export { memberAxes } from "./transformation/coordinate-transform.js";
5
+ export { memberDemandEnvelope } from "./post/demand-envelope.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fea/frame/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { roundToDecimalPlaces } from "../../../utils/math.js";
2
+ /** Demands of one diagram; Vu between `from` and `to`. */
3
+ const diagramDemands = (diagram, from, to) => {
4
+ const { N, M3, V2 } = diagram.extremes;
5
+ const moments = {
6
+ MuPositive: Math.max(M3.max.value, 0),
7
+ MuNegative: Math.max(-M3.min.value, 0),
8
+ Nu: Math.abs(N.max.value) >= Math.abs(N.min.value) ? N.max.value : N.min.value,
9
+ };
10
+ if (diagram.stations.length === 0) {
11
+ // analysed with diagrams: "extremes" — Vu over the whole length comes from the extremes
12
+ if (from > 0) {
13
+ throw new Error('shearCriticalDistance needs member stations: analyse with diagrams: "full", or pass a diagram from createFrameAnalysis(...).memberDiagram.');
14
+ }
15
+ return { ...moments, Vu: Math.max(Math.abs(V2.max.value), Math.abs(V2.min.value)) };
16
+ }
17
+ // V2 is piecewise linear with stations at every breakpoint, so interpolation is exact.
18
+ // Stations at a point load come as a (left, right) pair sharing the same x.
19
+ const v2At = (x, side) => {
20
+ const stations = diagram.stations;
21
+ const hits = stations.filter((s) => s.x === x);
22
+ if (hits.length > 0)
23
+ return side === "left" ? hits[0].V2 : hits[hits.length - 1].V2;
24
+ for (let i = 0; i < stations.length - 1; i++) {
25
+ const a = stations[i];
26
+ const b = stations[i + 1];
27
+ if (a.x < x && x < b.x)
28
+ return a.V2 + ((b.V2 - a.V2) * (x - a.x)) / (b.x - a.x);
29
+ }
30
+ return stations[stations.length - 1].V2;
31
+ };
32
+ const candidates = [v2At(from, "right"), v2At(to, "left")];
33
+ for (const s of diagram.stations) {
34
+ if (s.x >= from && s.x <= to)
35
+ candidates.push(s.V2);
36
+ }
37
+ return { ...moments, Vu: roundToDecimalPlaces(Math.max(...candidates.map(Math.abs)), 4) + 0 };
38
+ };
39
+ /**
40
+ * Reduces a member's force diagrams to the demands used in beam design — Mu⁺, Mu⁻, Vu, Nu —
41
+ * enveloped over load combinations (and optionally load cases), with the governing id of each.
42
+ * Works on plain numbers and does not depend on the `rc` module.
43
+ *
44
+ * @param result - Result of `analyzeFrame`
45
+ * @param memberId - Member to reduce
46
+ * @param options - Combinations and/or cases to envelope, `shearCriticalDistance` in mm
47
+ * @returns Demands in kN and kN·m with their governing load case or combination
48
+ * @throws {Error} if the member or a requested id is not in the result, if nothing is selected,
49
+ * or if `shearCriticalDistance` is used on a result analysed with `diagrams: "extremes"`
50
+ */
51
+ export const memberDemandEnvelope = (result, memberId, options = {}) => {
52
+ const pick = (source, ids, label) => ids.map((id) => {
53
+ const r = source[id];
54
+ if (!r)
55
+ throw new Error(`${label} "${id}" is not in the frame result.`);
56
+ return r;
57
+ });
58
+ const combinationIds = options.combinations ?? (options.cases ? [] : Object.keys(result.combinations));
59
+ const selected = [
60
+ ...pick(result.combinations, combinationIds, "Load combination"),
61
+ ...pick(result.cases, options.cases ?? [], "Load case"),
62
+ ];
63
+ if (selected.length === 0) {
64
+ throw new Error("No load combinations or cases selected; the result has no combinations, so pass `cases`.");
65
+ }
66
+ const diagrams = selected.map((r) => {
67
+ const diagram = r.memberDiagrams.find((d) => d.memberId === memberId);
68
+ if (!diagram)
69
+ throw new Error(`Member ${String(memberId)} is not in the frame result.`);
70
+ return { id: r.id, diagram };
71
+ });
72
+ const L = diagrams[0].diagram.length;
73
+ const from = Math.min(Math.max(options.shearCriticalDistance ?? 0, 0), L / 2);
74
+ const to = L - from;
75
+ const envelope = {
76
+ MuPositive: 0,
77
+ MuNegative: 0,
78
+ Vu: 0,
79
+ Nu: 0,
80
+ governing: { MuPositive: null, MuNegative: null, Vu: null, Nu: null },
81
+ };
82
+ for (const { id, diagram } of diagrams) {
83
+ const d = diagramDemands(diagram, from, to);
84
+ for (const key of ["MuPositive", "MuNegative", "Vu"]) {
85
+ if (d[key] > envelope[key]) {
86
+ envelope[key] = d[key];
87
+ envelope.governing[key] = id;
88
+ }
89
+ }
90
+ if (Math.abs(d.Nu) > Math.abs(envelope.Nu)) {
91
+ envelope.Nu = d.Nu;
92
+ envelope.governing.Nu = id;
93
+ }
94
+ }
95
+ return { memberId, ...envelope, VuRange: { from, to } };
96
+ };
97
+ //# sourceMappingURL=demand-envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demand-envelope.js","sourceRoot":"","sources":["../../../../../src/fea/frame/post/demand-envelope.ts"],"names":[],"mappings":"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"}