@theerapat-s28/ts-structural-eng-tools 1.5.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/README.md +57 -6
  2. package/dist/core/constants/frame.constant.d.ts +19 -0
  3. package/dist/core/constants/frame.constant.js +23 -0
  4. package/dist/core/constants/frame.constant.js.map +1 -0
  5. package/dist/core/errors/frame-analysis.error.d.ts +36 -0
  6. package/dist/core/errors/frame-analysis.error.js +86 -0
  7. package/dist/core/errors/frame-analysis.error.js.map +1 -0
  8. package/dist/core/index.d.ts +4 -0
  9. package/dist/core/index.js +13 -1
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/types/section-properties.type.d.ts +13 -0
  12. package/dist/core/types/section-properties.type.js +3 -0
  13. package/dist/core/types/section-properties.type.js.map +1 -0
  14. package/dist/esm/core/constants/frame.constant.js +20 -0
  15. package/dist/esm/core/constants/frame.constant.js.map +1 -0
  16. package/dist/esm/core/constants/rc.constant.js +63 -0
  17. package/dist/esm/core/constants/rc.constant.js.map +1 -0
  18. package/dist/esm/core/errors/frame-analysis.error.js +82 -0
  19. package/dist/esm/core/errors/frame-analysis.error.js.map +1 -0
  20. package/dist/esm/core/errors/rc-design.error.js +64 -0
  21. package/dist/esm/core/errors/rc-design.error.js.map +1 -0
  22. package/dist/esm/core/index.js +9 -0
  23. package/dist/esm/core/index.js.map +1 -0
  24. package/dist/esm/core/types/output-message.type.js +2 -0
  25. package/dist/esm/core/types/output-message.type.js.map +1 -0
  26. package/dist/esm/core/types/plate-jacketing.type.js +18 -0
  27. package/dist/esm/core/types/plate-jacketing.type.js.map +1 -0
  28. package/dist/esm/core/types/rc-beam.type.js +11 -0
  29. package/dist/esm/core/types/rc-beam.type.js.map +1 -0
  30. package/dist/esm/core/types/section-properties.type.js +2 -0
  31. package/dist/esm/core/types/section-properties.type.js.map +1 -0
  32. package/dist/esm/core/types/unit.type.js +2 -0
  33. package/dist/esm/core/types/unit.type.js.map +1 -0
  34. package/dist/esm/fea/frame/area/area-geometry.js +132 -0
  35. package/dist/esm/fea/frame/area/area-geometry.js.map +1 -0
  36. package/dist/esm/fea/frame/area/distribute-area-loads.js +267 -0
  37. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -0
  38. package/dist/esm/fea/frame/area/edge-members.js +62 -0
  39. package/dist/esm/fea/frame/area/edge-members.js.map +1 -0
  40. package/dist/esm/fea/frame/elements/beam-3d-stiffness.js +84 -0
  41. package/dist/esm/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
  42. package/dist/esm/fea/frame/elements/fixed-end-forces.js +88 -0
  43. package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -0
  44. package/dist/esm/fea/frame/elements/static-condensation.js +55 -0
  45. package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -0
  46. package/dist/esm/fea/frame/index.js +7 -0
  47. package/dist/esm/fea/frame/index.js.map +1 -0
  48. package/dist/esm/fea/frame/post/demand-envelope.js +97 -0
  49. package/dist/esm/fea/frame/post/demand-envelope.js.map +1 -0
  50. package/dist/esm/fea/frame/post/envelope.js +59 -0
  51. package/dist/esm/fea/frame/post/envelope.js.map +1 -0
  52. package/dist/esm/fea/frame/post/member-diagram.js +375 -0
  53. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -0
  54. package/dist/esm/fea/frame/post/present-state.js +106 -0
  55. package/dist/esm/fea/frame/post/present-state.js.map +1 -0
  56. package/dist/esm/fea/frame/solver/analyze-frame.js +131 -0
  57. package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -0
  58. package/dist/esm/fea/frame/solver/boundary-conditions.js +33 -0
  59. package/dist/esm/fea/frame/solver/boundary-conditions.js.map +1 -0
  60. package/dist/esm/fea/frame/solver/combinations.js +69 -0
  61. package/dist/esm/fea/frame/solver/combinations.js.map +1 -0
  62. package/dist/esm/fea/frame/solver/frame-system.js +122 -0
  63. package/dist/esm/fea/frame/solver/frame-system.js.map +1 -0
  64. package/dist/esm/fea/frame/solver/global-assembly.js +27 -0
  65. package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -0
  66. package/dist/esm/fea/frame/solver/load-case-solver.js +133 -0
  67. package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -0
  68. package/dist/esm/fea/frame/transformation/coordinate-transform.js +71 -0
  69. package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -0
  70. package/dist/esm/fea/frame/types/model.type.js +2 -0
  71. package/dist/esm/fea/frame/types/model.type.js.map +1 -0
  72. package/dist/esm/fea/frame/types/results.type.js +2 -0
  73. package/dist/esm/fea/frame/types/results.type.js.map +1 -0
  74. package/dist/esm/fea/frame/validation/validate-model.js +389 -0
  75. package/dist/esm/fea/frame/validation/validate-model.js.map +1 -0
  76. package/dist/esm/fea/index.js +3 -0
  77. package/dist/esm/fea/index.js.map +1 -0
  78. package/dist/esm/index.js +10 -0
  79. package/dist/esm/index.js.map +1 -0
  80. package/dist/esm/package.json +1 -0
  81. package/dist/esm/rc/general.js +32 -0
  82. package/dist/esm/rc/general.js.map +1 -0
  83. package/dist/esm/rc/index.js +5 -0
  84. package/dist/esm/rc/index.js.map +1 -0
  85. package/dist/esm/rc/rc-bar-layout.js +89 -0
  86. package/dist/esm/rc/rc-bar-layout.js.map +1 -0
  87. package/dist/esm/rc/rc-beam-design.js +320 -0
  88. package/dist/esm/rc/rc-beam-design.js.map +1 -0
  89. package/dist/esm/rc/rc-section-properties.js +55 -0
  90. package/dist/esm/rc/rc-section-properties.js.map +1 -0
  91. package/dist/esm/strengthening/index.js +4 -0
  92. package/dist/esm/strengthening/index.js.map +1 -0
  93. package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js +338 -0
  94. package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js.map +1 -0
  95. package/dist/esm/strengthening/rc-beam-side-plate-shear.js +381 -0
  96. package/dist/esm/strengthening/rc-beam-side-plate-shear.js.map +1 -0
  97. package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js +90 -0
  98. package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -0
  99. package/dist/esm/utils/index.js +5 -0
  100. package/dist/esm/utils/index.js.map +1 -0
  101. package/dist/esm/utils/math.js +30 -0
  102. package/dist/esm/utils/math.js.map +1 -0
  103. package/dist/esm/utils/matrix.js +145 -0
  104. package/dist/esm/utils/matrix.js.map +1 -0
  105. package/dist/esm/utils/merge-warning.js +11 -0
  106. package/dist/esm/utils/merge-warning.js.map +1 -0
  107. package/dist/esm/utils/skyline.js +151 -0
  108. package/dist/esm/utils/skyline.js.map +1 -0
  109. package/dist/fea/frame/area/area-geometry.d.ts +56 -0
  110. package/dist/fea/frame/area/area-geometry.js +142 -0
  111. package/dist/fea/frame/area/area-geometry.js.map +1 -0
  112. package/dist/fea/frame/area/distribute-area-loads.d.ts +30 -0
  113. package/dist/fea/frame/area/distribute-area-loads.js +272 -0
  114. package/dist/fea/frame/area/distribute-area-loads.js.map +1 -0
  115. package/dist/fea/frame/area/edge-members.d.ts +25 -0
  116. package/dist/fea/frame/area/edge-members.js +67 -0
  117. package/dist/fea/frame/area/edge-members.js.map +1 -0
  118. package/dist/fea/frame/elements/beam-3d-stiffness.d.ts +29 -0
  119. package/dist/fea/frame/elements/beam-3d-stiffness.js +90 -0
  120. package/dist/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
  121. package/dist/fea/frame/elements/fixed-end-forces.d.ts +36 -0
  122. package/dist/fea/frame/elements/fixed-end-forces.js +93 -0
  123. package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -0
  124. package/dist/fea/frame/elements/static-condensation.d.ts +19 -0
  125. package/dist/fea/frame/elements/static-condensation.js +59 -0
  126. package/dist/fea/frame/elements/static-condensation.js.map +1 -0
  127. package/dist/fea/frame/index.d.ts +10 -0
  128. package/dist/fea/frame/index.js +18 -0
  129. package/dist/fea/frame/index.js.map +1 -0
  130. package/dist/fea/frame/post/demand-envelope.d.ts +36 -0
  131. package/dist/fea/frame/post/demand-envelope.js +101 -0
  132. package/dist/fea/frame/post/demand-envelope.js.map +1 -0
  133. package/dist/fea/frame/post/envelope.d.ts +8 -0
  134. package/dist/fea/frame/post/envelope.js +63 -0
  135. package/dist/fea/frame/post/envelope.js.map +1 -0
  136. package/dist/fea/frame/post/member-diagram.d.ts +26 -0
  137. package/dist/fea/frame/post/member-diagram.js +379 -0
  138. package/dist/fea/frame/post/member-diagram.js.map +1 -0
  139. package/dist/fea/frame/post/present-state.d.ts +19 -0
  140. package/dist/fea/frame/post/present-state.js +111 -0
  141. package/dist/fea/frame/post/present-state.js.map +1 -0
  142. package/dist/fea/frame/solver/analyze-frame.d.ts +70 -0
  143. package/dist/fea/frame/solver/analyze-frame.js +136 -0
  144. package/dist/fea/frame/solver/analyze-frame.js.map +1 -0
  145. package/dist/fea/frame/solver/boundary-conditions.d.ts +14 -0
  146. package/dist/fea/frame/solver/boundary-conditions.js +37 -0
  147. package/dist/fea/frame/solver/boundary-conditions.js.map +1 -0
  148. package/dist/fea/frame/solver/combinations.d.ts +11 -0
  149. package/dist/fea/frame/solver/combinations.js +73 -0
  150. package/dist/fea/frame/solver/combinations.js.map +1 -0
  151. package/dist/fea/frame/solver/frame-system.d.ts +42 -0
  152. package/dist/fea/frame/solver/frame-system.js +126 -0
  153. package/dist/fea/frame/solver/frame-system.js.map +1 -0
  154. package/dist/fea/frame/solver/global-assembly.d.ts +17 -0
  155. package/dist/fea/frame/solver/global-assembly.js +33 -0
  156. package/dist/fea/frame/solver/global-assembly.js.map +1 -0
  157. package/dist/fea/frame/solver/load-case-solver.d.ts +34 -0
  158. package/dist/fea/frame/solver/load-case-solver.js +138 -0
  159. package/dist/fea/frame/solver/load-case-solver.js.map +1 -0
  160. package/dist/fea/frame/transformation/coordinate-transform.d.ts +21 -0
  161. package/dist/fea/frame/transformation/coordinate-transform.js +76 -0
  162. package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -0
  163. package/dist/fea/frame/types/model.type.d.ts +170 -0
  164. package/dist/fea/frame/types/model.type.js +3 -0
  165. package/dist/fea/frame/types/model.type.js.map +1 -0
  166. package/dist/fea/frame/types/results.type.d.ts +134 -0
  167. package/dist/fea/frame/types/results.type.js +3 -0
  168. package/dist/fea/frame/types/results.type.js.map +1 -0
  169. package/dist/fea/frame/validation/validate-model.d.ts +18 -0
  170. package/dist/fea/frame/validation/validate-model.js +395 -0
  171. package/dist/fea/frame/validation/validate-model.js.map +1 -0
  172. package/dist/fea/index.d.ts +1 -0
  173. package/dist/fea/index.js +19 -0
  174. package/dist/fea/index.js.map +1 -0
  175. package/dist/index.d.ts +8 -4
  176. package/dist/index.js +37 -1
  177. package/dist/index.js.map +1 -1
  178. package/dist/rc/index.d.ts +2 -0
  179. package/dist/rc/index.js +3 -1
  180. package/dist/rc/index.js.map +1 -1
  181. package/dist/rc/rc-section-properties.d.ts +35 -0
  182. package/dist/rc/rc-section-properties.js +59 -0
  183. package/dist/rc/rc-section-properties.js.map +1 -0
  184. package/dist/utils/index.d.ts +4 -0
  185. package/dist/utils/index.js +19 -1
  186. package/dist/utils/index.js.map +1 -1
  187. package/dist/utils/matrix.d.ts +45 -0
  188. package/dist/utils/matrix.js +157 -0
  189. package/dist/utils/matrix.js.map +1 -0
  190. package/dist/utils/skyline.d.ts +49 -0
  191. package/dist/utils/skyline.js +161 -0
  192. package/dist/utils/skyline.js.map +1 -0
  193. package/package.json +28 -4
@@ -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,19 @@
1
+ import { type Matrix } from "../../../utils/matrix";
2
+ export interface CondensedMember {
3
+ k: Matrix;
4
+ /** Condenses a 12-term fixed-end force vector; the result is zero at released DOFs. */
5
+ condenseFixedEndForces: (fixed: number[]) => number[];
6
+ }
7
+ /**
8
+ * Statically condenses released local DOFs out of a member, so those DOFs carry no force.
9
+ *
10
+ * With released set r and retained set c:
11
+ * `k* = k_cc − k_cr·k_rr⁻¹·k_rc`, `f* = f_c − k_cr·k_rr⁻¹·f_r`.
12
+ * The stiffness is condensed once; the returned function condenses the fixed-end forces of
13
+ * each load case.
14
+ *
15
+ * @param k - 12×12 local stiffness (right-hand)
16
+ * @param released - Local DOF indices (0–11) to release
17
+ * @throws {FrameAnalysisError} 307 if the released set makes the member a mechanism
18
+ */
19
+ export declare const condenseMember: (k: Matrix, released: number[]) => CondensedMember;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.condenseMember = void 0;
4
+ const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
5
+ const matrix_1 = require("../../../utils/matrix");
6
+ /**
7
+ * Statically condenses released local DOFs out of a member, so those DOFs carry no force.
8
+ *
9
+ * With released set r and retained set c:
10
+ * `k* = k_cc − k_cr·k_rr⁻¹·k_rc`, `f* = f_c − k_cr·k_rr⁻¹·f_r`.
11
+ * The stiffness is condensed once; the returned function condenses the fixed-end forces of
12
+ * each load case.
13
+ *
14
+ * @param k - 12×12 local stiffness (right-hand)
15
+ * @param released - Local DOF indices (0–11) to release
16
+ * @throws {FrameAnalysisError} 307 if the released set makes the member a mechanism
17
+ */
18
+ const condenseMember = (k, released) => {
19
+ if (released.length === 0) {
20
+ return { k, condenseFixedEndForces: (fixed) => [...fixed] };
21
+ }
22
+ const retained = Array.from({ length: 12 }, (_, i) => i).filter((i) => !released.includes(i));
23
+ const sub = (rows, cols) => rows.map((r) => cols.map((c) => k[r][c]));
24
+ const krr = sub(released, released);
25
+ const krc = sub(released, retained);
26
+ const kcr = sub(retained, released);
27
+ const kcc = sub(retained, retained);
28
+ // [k_rr⁻¹·k_rc | k_rr⁻¹]
29
+ const rhs = released.map((_, i) => [...krc[i], ...released.map((__, j) => (i === j ? 1 : 0))]);
30
+ const solved = (0, matrix_1.solveLinearSystem)(krr, rhs);
31
+ if (!solved)
32
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.INVALID_RELEASE);
33
+ const nc = retained.length;
34
+ const kStar = k.map((row) => row.map(() => 0));
35
+ retained.forEach((r, ri) => {
36
+ retained.forEach((c, ci) => {
37
+ let value = kcc[ri][ci];
38
+ released.forEach((_, j) => {
39
+ value -= kcr[ri][j] * solved[j][ci];
40
+ });
41
+ kStar[r][c] = value;
42
+ });
43
+ });
44
+ // k_cr·k_rr⁻¹, applied to f_r for every load case
45
+ const kcrKrrInv = retained.map((_, ri) => released.map((__, m) => released.reduce((s, ___, j) => s + kcr[ri][j] * solved[j][nc + m], 0)));
46
+ return {
47
+ k: kStar,
48
+ condenseFixedEndForces: (fixed) => {
49
+ const fStar = new Array(12).fill(0);
50
+ const fr = released.map((r) => fixed[r]);
51
+ retained.forEach((r, ri) => {
52
+ fStar[r] = fixed[r] - kcrKrrInv[ri].reduce((s, v, m) => s + v * fr[m], 0);
53
+ });
54
+ return fStar;
55
+ },
56
+ };
57
+ };
58
+ exports.condenseMember = condenseMember;
59
+ //# 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,10 @@
1
+ export { analyzeFrame, createFrameAnalysis } from "./solver/analyze-frame";
2
+ export type { AnalyzeFrameOptions, FrameAnalysis } from "./solver/analyze-frame";
3
+ export { validateFrameModel } from "./validation/validate-model";
4
+ export { distributeAreaLoads } from "./area/distribute-area-loads";
5
+ export { beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, } from "./elements/beam-3d-stiffness";
6
+ export { memberAxes } from "./transformation/coordinate-transform";
7
+ export { memberDemandEnvelope } from "./post/demand-envelope";
8
+ export type { MemberDemandEnvelope, DemandEnvelopeOptions } from "./post/demand-envelope";
9
+ export type { FrameId, FrameNode, DofRestraint, Restraint, MemberEndRelease, Member, NodalLoad, LoadDirection, UniformMemberLoad, PointMemberLoad, TrapezoidalMemberLoad, TorqueMemberLoad, MemberLoad, AreaDistribution, NullArea, AreaLoadDirection, AreaLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, FrameModel, } from "./types/model.type";
10
+ export type { NodalDisplacement, NodalReaction, MemberEndForce, MemberEndForces, MemberStation, StationComponent, ExtremeValue, MemberDiagram, GoverningValue, GoverningExtremeValue, Bound, FrameCaseResult, FrameEnvelope, FrameResult, } from "./types/results.type";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memberDemandEnvelope = exports.memberAxes = exports.beam3dLocalStiffnessRightHanded = exports.beam3dLocalStiffness = exports.distributeAreaLoads = exports.validateFrameModel = exports.createFrameAnalysis = exports.analyzeFrame = void 0;
4
+ var analyze_frame_1 = require("./solver/analyze-frame");
5
+ Object.defineProperty(exports, "analyzeFrame", { enumerable: true, get: function () { return analyze_frame_1.analyzeFrame; } });
6
+ Object.defineProperty(exports, "createFrameAnalysis", { enumerable: true, get: function () { return analyze_frame_1.createFrameAnalysis; } });
7
+ var validate_model_1 = require("./validation/validate-model");
8
+ Object.defineProperty(exports, "validateFrameModel", { enumerable: true, get: function () { return validate_model_1.validateFrameModel; } });
9
+ var distribute_area_loads_1 = require("./area/distribute-area-loads");
10
+ Object.defineProperty(exports, "distributeAreaLoads", { enumerable: true, get: function () { return distribute_area_loads_1.distributeAreaLoads; } });
11
+ var beam_3d_stiffness_1 = require("./elements/beam-3d-stiffness");
12
+ Object.defineProperty(exports, "beam3dLocalStiffness", { enumerable: true, get: function () { return beam_3d_stiffness_1.beam3dLocalStiffness; } });
13
+ Object.defineProperty(exports, "beam3dLocalStiffnessRightHanded", { enumerable: true, get: function () { return beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded; } });
14
+ var coordinate_transform_1 = require("./transformation/coordinate-transform");
15
+ Object.defineProperty(exports, "memberAxes", { enumerable: true, get: function () { return coordinate_transform_1.memberAxes; } });
16
+ var demand_envelope_1 = require("./post/demand-envelope");
17
+ Object.defineProperty(exports, "memberDemandEnvelope", { enumerable: true, get: function () { return demand_envelope_1.memberDemandEnvelope; } });
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fea/frame/index.ts"],"names":[],"mappings":";;;AAAA,wDAA2E;AAAlE,6GAAA,YAAY,OAAA;AAAE,oHAAA,mBAAmB,OAAA;AAE1C,8DAAiE;AAAxD,oHAAA,kBAAkB,OAAA;AAC3B,sEAAmE;AAA1D,4HAAA,mBAAmB,OAAA;AAC5B,kEAGsC;AAFpC,yHAAA,oBAAoB,OAAA;AACpB,oIAAA,+BAA+B,OAAA;AAEjC,8EAAmE;AAA1D,kHAAA,UAAU,OAAA;AACnB,0DAA8D;AAArD,uHAAA,oBAAoB,OAAA"}
@@ -0,0 +1,36 @@
1
+ import type { FrameId } from "../types/model.type";
2
+ import type { FrameResult } from "../types/results.type";
3
+ export interface MemberDemandEnvelope {
4
+ memberId: FrameId;
5
+ MuPositive: number;
6
+ MuNegative: number;
7
+ Vu: number;
8
+ Nu: number;
9
+ VuRange: {
10
+ from: number;
11
+ to: number;
12
+ };
13
+ /** Load case or combination id producing each demand; null when that demand is zero. */
14
+ governing: Record<"MuPositive" | "MuNegative" | "Vu" | "Nu", string | null>;
15
+ }
16
+ export interface DemandEnvelopeOptions {
17
+ /** Combination ids to envelope. Default: every combination, unless `cases` is given. */
18
+ combinations?: string[];
19
+ /** Load case ids to envelope as well (or instead). Default: none. */
20
+ cases?: string[];
21
+ /** mm. Take Vu only between this distance from each end, e.g. the effective depth d. Default 0. */
22
+ shearCriticalDistance?: number;
23
+ }
24
+ /**
25
+ * Reduces a member's force diagrams to the demands used in beam design — Mu⁺, Mu⁻, Vu, Nu —
26
+ * enveloped over load combinations (and optionally load cases), with the governing id of each.
27
+ * Works on plain numbers and does not depend on the `rc` module.
28
+ *
29
+ * @param result - Result of `analyzeFrame`
30
+ * @param memberId - Member to reduce
31
+ * @param options - Combinations and/or cases to envelope, `shearCriticalDistance` in mm
32
+ * @returns Demands in kN and kN·m with their governing load case or combination
33
+ * @throws {Error} if the member or a requested id is not in the result, if nothing is selected,
34
+ * or if `shearCriticalDistance` is used on a result analysed with `diagrams: "extremes"`
35
+ */
36
+ export declare const memberDemandEnvelope: (result: FrameResult, memberId: FrameId, options?: DemandEnvelopeOptions) => MemberDemandEnvelope;
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.memberDemandEnvelope = void 0;
4
+ const math_1 = require("../../../utils/math");
5
+ /** Demands of one diagram; Vu between `from` and `to`. */
6
+ const diagramDemands = (diagram, from, to) => {
7
+ const { N, M3, V2 } = diagram.extremes;
8
+ const moments = {
9
+ MuPositive: Math.max(M3.max.value, 0),
10
+ MuNegative: Math.max(-M3.min.value, 0),
11
+ Nu: Math.abs(N.max.value) >= Math.abs(N.min.value) ? N.max.value : N.min.value,
12
+ };
13
+ if (diagram.stations.length === 0) {
14
+ // analysed with diagrams: "extremes" — Vu over the whole length comes from the extremes
15
+ if (from > 0) {
16
+ throw new Error('shearCriticalDistance needs member stations: analyse with diagrams: "full", or pass a diagram from createFrameAnalysis(...).memberDiagram.');
17
+ }
18
+ return { ...moments, Vu: Math.max(Math.abs(V2.max.value), Math.abs(V2.min.value)) };
19
+ }
20
+ // V2 is piecewise linear with stations at every breakpoint, so interpolation is exact.
21
+ // Stations at a point load come as a (left, right) pair sharing the same x.
22
+ const v2At = (x, side) => {
23
+ const stations = diagram.stations;
24
+ const hits = stations.filter((s) => s.x === x);
25
+ if (hits.length > 0)
26
+ return side === "left" ? hits[0].V2 : hits[hits.length - 1].V2;
27
+ for (let i = 0; i < stations.length - 1; i++) {
28
+ const a = stations[i];
29
+ const b = stations[i + 1];
30
+ if (a.x < x && x < b.x)
31
+ return a.V2 + ((b.V2 - a.V2) * (x - a.x)) / (b.x - a.x);
32
+ }
33
+ return stations[stations.length - 1].V2;
34
+ };
35
+ const candidates = [v2At(from, "right"), v2At(to, "left")];
36
+ for (const s of diagram.stations) {
37
+ if (s.x >= from && s.x <= to)
38
+ candidates.push(s.V2);
39
+ }
40
+ return { ...moments, Vu: (0, math_1.roundToDecimalPlaces)(Math.max(...candidates.map(Math.abs)), 4) + 0 };
41
+ };
42
+ /**
43
+ * Reduces a member's force diagrams to the demands used in beam design — Mu⁺, Mu⁻, Vu, Nu —
44
+ * enveloped over load combinations (and optionally load cases), with the governing id of each.
45
+ * Works on plain numbers and does not depend on the `rc` module.
46
+ *
47
+ * @param result - Result of `analyzeFrame`
48
+ * @param memberId - Member to reduce
49
+ * @param options - Combinations and/or cases to envelope, `shearCriticalDistance` in mm
50
+ * @returns Demands in kN and kN·m with their governing load case or combination
51
+ * @throws {Error} if the member or a requested id is not in the result, if nothing is selected,
52
+ * or if `shearCriticalDistance` is used on a result analysed with `diagrams: "extremes"`
53
+ */
54
+ const memberDemandEnvelope = (result, memberId, options = {}) => {
55
+ const pick = (source, ids, label) => ids.map((id) => {
56
+ const r = source[id];
57
+ if (!r)
58
+ throw new Error(`${label} "${id}" is not in the frame result.`);
59
+ return r;
60
+ });
61
+ const combinationIds = options.combinations ?? (options.cases ? [] : Object.keys(result.combinations));
62
+ const selected = [
63
+ ...pick(result.combinations, combinationIds, "Load combination"),
64
+ ...pick(result.cases, options.cases ?? [], "Load case"),
65
+ ];
66
+ if (selected.length === 0) {
67
+ throw new Error("No load combinations or cases selected; the result has no combinations, so pass `cases`.");
68
+ }
69
+ const diagrams = selected.map((r) => {
70
+ const diagram = r.memberDiagrams.find((d) => d.memberId === memberId);
71
+ if (!diagram)
72
+ throw new Error(`Member ${String(memberId)} is not in the frame result.`);
73
+ return { id: r.id, diagram };
74
+ });
75
+ const L = diagrams[0].diagram.length;
76
+ const from = Math.min(Math.max(options.shearCriticalDistance ?? 0, 0), L / 2);
77
+ const to = L - from;
78
+ const envelope = {
79
+ MuPositive: 0,
80
+ MuNegative: 0,
81
+ Vu: 0,
82
+ Nu: 0,
83
+ governing: { MuPositive: null, MuNegative: null, Vu: null, Nu: null },
84
+ };
85
+ for (const { id, diagram } of diagrams) {
86
+ const d = diagramDemands(diagram, from, to);
87
+ for (const key of ["MuPositive", "MuNegative", "Vu"]) {
88
+ if (d[key] > envelope[key]) {
89
+ envelope[key] = d[key];
90
+ envelope.governing[key] = id;
91
+ }
92
+ }
93
+ if (Math.abs(d.Nu) > Math.abs(envelope.Nu)) {
94
+ envelope.Nu = d.Nu;
95
+ envelope.governing.Nu = id;
96
+ }
97
+ }
98
+ return { memberId, ...envelope, VuRange: { from, to } };
99
+ };
100
+ exports.memberDemandEnvelope = memberDemandEnvelope;
101
+ //# 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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"}
@@ -0,0 +1,8 @@
1
+ import type { FrameCaseResult, FrameEnvelope } from "../types/results.type";
2
+ /**
3
+ * Max/min of every presented result across combinations, each with the combination that
4
+ * governs it. Combinations must come from the same model (same nodes and members, same order).
5
+ *
6
+ * @param results - Combination results, in model order
7
+ */
8
+ export declare const buildEnvelope: (results: FrameCaseResult[]) => FrameEnvelope;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildEnvelope = void 0;
4
+ const DISPLACEMENT_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
5
+ const REACTION_KEYS = ["fx", "fy", "fz", "mx", "my", "mz"];
6
+ const COMPONENTS = ["N", "V2", "V3", "T", "M2", "M3", "u1", "u2", "u3"];
7
+ /** Keeps the larger max and smaller min; the first combination wins a tie. */
8
+ const update = (bound, max, min) => {
9
+ if (!bound)
10
+ return { max, min };
11
+ return {
12
+ max: max.value > bound.max.value ? max : bound.max,
13
+ min: min.value < bound.min.value ? min : bound.min,
14
+ };
15
+ };
16
+ /**
17
+ * Max/min of every presented result across combinations, each with the combination that
18
+ * governs it. Combinations must come from the same model (same nodes and members, same order).
19
+ *
20
+ * @param results - Combination results, in model order
21
+ */
22
+ const buildEnvelope = (results) => {
23
+ const first = results[0];
24
+ const nodalDisplacements = first.nodalDisplacements.map((d, n) => {
25
+ const entry = { nodeId: d.nodeId };
26
+ for (const key of DISPLACEMENT_KEYS) {
27
+ let bound;
28
+ for (const r of results) {
29
+ const g = { value: r.nodalDisplacements[n][key], combinationId: r.id };
30
+ bound = update(bound, g, g);
31
+ }
32
+ entry[key] = bound;
33
+ }
34
+ return entry;
35
+ });
36
+ const reactions = first.reactions.map((d, n) => {
37
+ const entry = { nodeId: d.nodeId };
38
+ for (const key of REACTION_KEYS) {
39
+ let bound;
40
+ for (const r of results) {
41
+ const g = { value: r.reactions[n][key], combinationId: r.id };
42
+ bound = update(bound, g, g);
43
+ }
44
+ entry[key] = bound;
45
+ }
46
+ return entry;
47
+ });
48
+ const members = first.memberDiagrams.map((d, m) => {
49
+ const extremes = {};
50
+ for (const c of COMPONENTS) {
51
+ let bound;
52
+ for (const r of results) {
53
+ const e = r.memberDiagrams[m].extremes[c];
54
+ bound = update(bound, { ...e.max, combinationId: r.id }, { ...e.min, combinationId: r.id });
55
+ }
56
+ extremes[c] = bound;
57
+ }
58
+ return { memberId: d.memberId, extremes };
59
+ });
60
+ return { combinationIds: results.map((r) => r.id), nodalDisplacements, reactions, members };
61
+ };
62
+ exports.buildEnvelope = buildEnvelope;
63
+ //# sourceMappingURL=envelope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../../src/fea/frame/post/envelope.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { SectionProperties } from "../../../core/types/section-properties.type";
2
+ import type { Matrix } from "../../../utils/matrix";
3
+ import type { LocalMemberLoad } from "../elements/fixed-end-forces";
4
+ import type { FrameId } from "../types/model.type";
5
+ import type { MemberDiagram } from "../types/results.type";
6
+ /** The member data a diagram needs. */
7
+ export interface DiagramMember {
8
+ id: FrameId;
9
+ length: number;
10
+ section: Pick<SectionProperties, "E" | "A" | "I22" | "I33">;
11
+ lambda: Matrix;
12
+ released: boolean[];
13
+ }
14
+ /**
15
+ * Builds the force and displacement diagrams of one member from its end forces, its end
16
+ * displacements and its loads.
17
+ *
18
+ * @param member - Member geometry, section, axes and end releases
19
+ * @param startForce - Force the start node exerts on the member, right-hand local, N and N·mm
20
+ * @param endDisplacements - The 12 local right-hand displacements of the member's end nodes, mm and rad
21
+ * @param loads - Member loads in local axes, N and mm
22
+ * @param stationCount - Number of evenly spaced stations (at least 2); load breakpoints and
23
+ * zero-shear points are added, with both sides reported at a point load
24
+ * @param withStations - false returns the extremes only, with an empty `stations` array
25
+ */
26
+ export declare const memberDiagram: (member: DiagramMember, startForce: number[], endDisplacements: number[], loads: LocalMemberLoad[], stationCount?: number, withStations?: boolean) => MemberDiagram;