@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,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeFrame = exports.createFrameAnalysis = void 0;
4
+ const distribute_area_loads_1 = require("../area/distribute-area-loads");
5
+ const envelope_1 = require("../post/envelope");
6
+ const present_state_1 = require("../post/present-state");
7
+ const validate_model_1 = require("../validation/validate-model");
8
+ const combinations_1 = require("./combinations");
9
+ const frame_system_1 = require("./frame-system");
10
+ const load_case_solver_1 = require("./load-case-solver");
11
+ /** Groups loads by their load case id, keeping the input order within each case. */
12
+ const groupByCase = (loads = []) => {
13
+ const groups = new Map();
14
+ for (const load of loads) {
15
+ const group = groups.get(load.loadCase);
16
+ if (group)
17
+ group.push(load);
18
+ else
19
+ groups.set(load.loadCase, [load]);
20
+ }
21
+ return groups;
22
+ };
23
+ /**
24
+ * Analyses a 3D frame like `analyzeFrame` and keeps the solution, so that full member diagrams
25
+ * can be requested later one member at a time — e.g. analyse with `diagrams: "extremes"` and
26
+ * draw a member's diagram when the user selects it. Run it in a Web Worker for large models.
27
+ *
28
+ * @param model - Nodes, members, restraints, load cases, loads tagged with their load case,
29
+ * null areas, and combinations
30
+ * @param options - Diagram station count and detail
31
+ * @returns `{ result, memberDiagram }`
32
+ * @throws {FrameAnalysisError} 301–317 for an invalid model (with `details` and every problem in
33
+ * `issues`), 304 for an unstable structure
34
+ */
35
+ const createFrameAnalysis = (model, options = {}) => {
36
+ const issues = (0, validate_model_1.validateFrameModel)(model);
37
+ if (issues.length > 0)
38
+ (0, validate_model_1.throwIssues)(issues);
39
+ const system = (0, frame_system_1.prepareFrameSystem)(model);
40
+ const combinations = model.combinations ?? [];
41
+ const resolved = (0, combinations_1.resolveCombinations)(combinations, new Set(model.loadCases.map((c) => c.id)));
42
+ const withStations = (options.diagrams ?? "full") === "full";
43
+ const fromAreas = (0, distribute_area_loads_1.areaMemberLoads)(model);
44
+ const states = new Map();
45
+ const cases = {};
46
+ const nodalByCase = groupByCase(model.nodalLoads);
47
+ const memberByCase = groupByCase([
48
+ ...(model.memberLoads ?? []),
49
+ ...fromAreas.memberLoads,
50
+ ]);
51
+ for (const loadCase of model.loadCases) {
52
+ const state = (0, load_case_solver_1.solveLoadCase)(system, loadCase, {
53
+ nodalLoads: nodalByCase.get(loadCase.id) ?? [],
54
+ memberLoads: memberByCase.get(loadCase.id) ?? [],
55
+ });
56
+ states.set(loadCase.id, state);
57
+ cases[loadCase.id] = (0, present_state_1.presentState)(system, state, { id: loadCase.id, kind: "case", name: loadCase.name, type: loadCase.type }, { stations: options.stations, withStations });
58
+ }
59
+ const combinationStates = new Map();
60
+ const combinationResults = {};
61
+ for (const combination of combinations) {
62
+ // Non-empty: validation rejects combinations without terms
63
+ const terms = [...resolved.get(combination.id)].map(([caseId, factor]) => ({ state: states.get(caseId), factor }));
64
+ const state = (0, load_case_solver_1.combineStates)(terms);
65
+ combinationStates.set(combination.id, state);
66
+ combinationResults[combination.id] = (0, present_state_1.presentState)(system, state, { id: combination.id, kind: "combination", name: combination.name }, { stations: options.stations, withStations });
67
+ }
68
+ const warnings = [
69
+ ...fromAreas.warnings,
70
+ ...[...Object.values(cases), ...Object.values(combinationResults)].flatMap((r) => r.warnings.map((w) => ({
71
+ ...w,
72
+ message: `${r.kind === "case" ? "Load case" : "Load combination"} "${r.id}": ${w.message}`,
73
+ }))),
74
+ ];
75
+ const combinationList = combinations.map((c) => combinationResults[c.id]);
76
+ const result = {
77
+ cases,
78
+ combinations: combinationResults,
79
+ envelope: combinationList.length > 0 ? (0, envelope_1.buildEnvelope)(combinationList) : undefined,
80
+ calculationDetails: {
81
+ nodeCount: system.nodes.length,
82
+ memberCount: system.members.length,
83
+ dofCount: system.dofCount,
84
+ freeDofCount: system.free.length,
85
+ profileSize: system.profileSize,
86
+ loadCaseCount: model.loadCases.length,
87
+ combinationCount: combinations.length,
88
+ },
89
+ units: { force: "kN", moment: "kN·m", length: "mm", rotation: "rad" },
90
+ warnings,
91
+ };
92
+ return {
93
+ result,
94
+ memberDiagram: (resultId, memberId, stations) => {
95
+ const state = combinationStates.get(resultId) ?? states.get(resultId);
96
+ if (!state)
97
+ throw new Error(`Load case or combination "${resultId}" is not in the model.`);
98
+ const m = system.memberIndex.get(memberId);
99
+ if (m === undefined)
100
+ throw new Error(`Member ${String(memberId)} is not in the model.`);
101
+ return (0, present_state_1.presentMemberDiagram)(system, state, m, stations ?? options.stations);
102
+ },
103
+ };
104
+ };
105
+ exports.createFrameAnalysis = createFrameAnalysis;
106
+ /**
107
+ * Analyses a 3D frame by the direct stiffness method (linear elastic, small displacements)
108
+ * for every load case, then forms every load combination by superposition.
109
+ *
110
+ * The model is validated first (`validateFrameModel`). The stiffness matrix is assembled once
111
+ * in skyline storage with the nodes in reverse Cuthill–McKee order and factorised once; each
112
+ * load case is a separate solve. A combination is the factored sum of its load cases (nested
113
+ * combinations are expanded), and its member diagrams are rebuilt from the combined end forces
114
+ * and factored member loads, so their extremes are exact rather than sums of case extremes.
115
+ *
116
+ * Units: node coordinates, section properties and positions in mm and MPa; loads in kN, kN·m
117
+ * and kN/m; springs in kN/mm and kN·m/rad; unit weight in kN/m³. Results are in kN, kN·m, mm
118
+ * and rad. Global axes X, Y, Z are right-handed with Z up; members use ETABS-style local axes
119
+ * 1, 2, 3 (see `memberAxes`). Member end forces and diagrams use right-hand rotations.
120
+ *
121
+ * Area loads on null areas (`areas`, `areaLoads`) are first turned into member loads on the
122
+ * members along each area's edges (see `distributeAreaLoads`); the areas add no stiffness.
123
+ *
124
+ * Model and result are plain data (JSON-serialisable), so the analysis can run in a Web Worker.
125
+ *
126
+ * @param model - Nodes, members, restraints, load cases, loads tagged with their load case,
127
+ * null areas, and combinations
128
+ * @param options - Diagram station count and detail
129
+ * @returns `cases` and `combinations` keyed by id, `envelope` over the combinations,
130
+ * `calculationDetails`, `units` and `warnings`
131
+ * @throws {FrameAnalysisError} 301–317 for an invalid model (with `details` and every problem in
132
+ * `issues`), 304 for an unstable structure
133
+ */
134
+ const analyzeFrame = (model, options = {}) => (0, exports.createFrameAnalysis)(model, options).result;
135
+ exports.analyzeFrame = analyzeFrame;
136
+ //# sourceMappingURL=analyze-frame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-frame.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/analyze-frame.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Restraint } from "../types/model.type";
2
+ export interface BoundaryConditions {
3
+ fixed: boolean[];
4
+ spring: number[];
5
+ restrained: boolean[];
6
+ }
7
+ /**
8
+ * Collects restraints into per-DOF fixed flags and spring stiffnesses.
9
+ *
10
+ * @param restraints - Model restraints
11
+ * @param nodeIndex - Map from node id to node index (6 DOFs per node)
12
+ * @param dofCount - Total number of global DOFs
13
+ */
14
+ export declare const buildBoundaryConditions: (restraints: Restraint[], nodeIndex: Map<Restraint["nodeId"], number>, dofCount: number) => BoundaryConditions;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildBoundaryConditions = void 0;
4
+ const DOF_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
5
+ /** Spring stiffness unit conversion: kN/mm → N/mm, kN·m/rad → N·mm/rad. */
6
+ const SPRING_FACTOR = [1e3, 1e3, 1e3, 1e6, 1e6, 1e6];
7
+ const parse = (value, factor) => {
8
+ if (value === true)
9
+ return { fixed: true, spring: 0 };
10
+ if (typeof value === "number" && value > 0)
11
+ return { fixed: false, spring: value * factor };
12
+ return { fixed: false, spring: 0 };
13
+ };
14
+ /**
15
+ * Collects restraints into per-DOF fixed flags and spring stiffnesses.
16
+ *
17
+ * @param restraints - Model restraints
18
+ * @param nodeIndex - Map from node id to node index (6 DOFs per node)
19
+ * @param dofCount - Total number of global DOFs
20
+ */
21
+ const buildBoundaryConditions = (restraints, nodeIndex, dofCount) => {
22
+ const fixed = new Array(dofCount).fill(false);
23
+ const spring = new Array(dofCount).fill(0);
24
+ for (const restraint of restraints) {
25
+ const base = 6 * nodeIndex.get(restraint.nodeId);
26
+ DOF_KEYS.forEach((key, k) => {
27
+ const parsed = parse(restraint[key], SPRING_FACTOR[k]);
28
+ if (parsed.fixed)
29
+ fixed[base + k] = true;
30
+ spring[base + k] = parsed.spring;
31
+ });
32
+ }
33
+ const restrained = fixed.map((f, i) => f || spring[i] > 0);
34
+ return { fixed, spring, restrained };
35
+ };
36
+ exports.buildBoundaryConditions = buildBoundaryConditions;
37
+ //# sourceMappingURL=boundary-conditions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary-conditions.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/boundary-conditions.ts"],"names":[],"mappings":";;;AAEA,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAE/D,2EAA2E;AAC3E,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAQrD,MAAM,KAAK,GAAG,CACZ,KAA+B,EAC/B,MAAc,EACsB,EAAE;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IAC5F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,uBAAuB,GAAG,CACrC,UAAuB,EACvB,SAA2C,EAC3C,QAAgB,EACI,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAU,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,GAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAY,CAAC;QAC7D,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YACzC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC,CAAC;AAjBW,QAAA,uBAAuB,2BAiBlC"}
@@ -0,0 +1,11 @@
1
+ import type { LoadCombination } from "../types/model.type";
2
+ /**
3
+ * Expands every combination into net factors on load cases, following nested combinations.
4
+ *
5
+ * @param combinations - Model combinations
6
+ * @param caseIds - Ids of the model's load cases
7
+ * @returns For each combination id, the net factor on each load case it uses
8
+ * @throws {FrameAnalysisError} 309 for an unknown or missing reference, 310 for a loop,
9
+ * 311 for a non-finite factor or an empty combination
10
+ */
11
+ export declare const resolveCombinations: (combinations: LoadCombination[], caseIds: Set<string>) => Map<string, Map<string, number>>;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveCombinations = void 0;
4
+ const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
5
+ /**
6
+ * Expands every combination into net factors on load cases, following nested combinations.
7
+ *
8
+ * @param combinations - Model combinations
9
+ * @param caseIds - Ids of the model's load cases
10
+ * @returns For each combination id, the net factor on each load case it uses
11
+ * @throws {FrameAnalysisError} 309 for an unknown or missing reference, 310 for a loop,
12
+ * 311 for a non-finite factor or an empty combination
13
+ */
14
+ const resolveCombinations = (combinations, caseIds) => {
15
+ const byId = new Map(combinations.map((c) => [c.id, c]));
16
+ for (const combination of combinations) {
17
+ if (!Array.isArray(combination.terms) || combination.terms.length === 0) {
18
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.INVALID_LOAD_FACTOR, {
19
+ combinationId: combination.id,
20
+ });
21
+ }
22
+ for (const term of combination.terms) {
23
+ if (!Number.isFinite(term.factor))
24
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.INVALID_LOAD_FACTOR, {
25
+ combinationId: combination.id,
26
+ });
27
+ const isCase = "case" in term && term.case !== undefined;
28
+ const isCombination = "combination" in term && term.combination !== undefined;
29
+ if (isCase === isCombination)
30
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.UNKNOWN_LOAD_CASE, {
31
+ combinationId: combination.id,
32
+ });
33
+ if (isCase && !caseIds.has(term.case)) {
34
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.UNKNOWN_LOAD_CASE, {
35
+ combinationId: combination.id,
36
+ });
37
+ }
38
+ if (isCombination && !byId.has(term.combination)) {
39
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.UNKNOWN_LOAD_CASE, {
40
+ combinationId: combination.id,
41
+ });
42
+ }
43
+ }
44
+ }
45
+ const resolved = new Map();
46
+ const visiting = new Set();
47
+ const resolve = (id) => {
48
+ const done = resolved.get(id);
49
+ if (done)
50
+ return done;
51
+ if (visiting.has(id)) {
52
+ throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.CIRCULAR_COMBINATION, { combinationId: id });
53
+ }
54
+ visiting.add(id);
55
+ const factors = new Map();
56
+ const addFactor = (caseId, factor) => factors.set(caseId, (factors.get(caseId) ?? 0) + factor);
57
+ for (const term of byId.get(id).terms) {
58
+ if ("case" in term) {
59
+ addFactor(term.case, term.factor);
60
+ }
61
+ else {
62
+ resolve(term.combination).forEach((f, caseId) => addFactor(caseId, term.factor * f));
63
+ }
64
+ }
65
+ visiting.delete(id);
66
+ resolved.set(id, factors);
67
+ return factors;
68
+ };
69
+ combinations.forEach((c) => resolve(c.id));
70
+ return resolved;
71
+ };
72
+ exports.resolveCombinations = resolveCombinations;
73
+ //# sourceMappingURL=combinations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinations.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/combinations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { SectionProperties } from "../../../core/types/section-properties.type";
2
+ import type { Matrix } from "../../../utils/matrix";
3
+ import { type SkylineMatrix } from "../../../utils/skyline";
4
+ import type { FrameId, FrameModel, FrameNode } from "../types/model.type";
5
+ import { type BoundaryConditions } from "./boundary-conditions";
6
+ import { type AssemblyMember } from "./global-assembly";
7
+ /** A member with everything that does not depend on the loads. */
8
+ export interface SystemMember extends AssemblyMember {
9
+ id: FrameId;
10
+ section: SectionProperties;
11
+ length: number;
12
+ lambda: Matrix;
13
+ released: boolean[];
14
+ /** Condenses a member's fixed-end forces for its end releases. */
15
+ condenseFixedEndForces: (fixed: number[]) => number[];
16
+ }
17
+ /** The load-independent part of a frame analysis: geometry, stiffness and its factorisation. */
18
+ export interface FrameSystem {
19
+ nodes: FrameNode[];
20
+ nodeIndex: Map<FrameId, number>;
21
+ memberIndex: Map<FrameId, number>;
22
+ members: SystemMember[];
23
+ dofCount: number;
24
+ boundary: BoundaryConditions;
25
+ /** Equation number of each global DOF in the factorised system, −1 for a fixed DOF. */
26
+ equation: Int32Array;
27
+ /** Global DOF of each equation. */
28
+ free: number[];
29
+ /** Skyline Cholesky factor of the free stiffness including springs; null when nothing is free. */
30
+ factor: SkylineMatrix | null;
31
+ /** Stored entries of the factor (a measure of bandwidth, memory and work). */
32
+ profileSize: number;
33
+ }
34
+ /**
35
+ * Builds the member matrices of a model that passed `validateFrameModel`, assembles the free
36
+ * stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and factorises it
37
+ * once for all load cases.
38
+ *
39
+ * @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
40
+ * a DOF involved in it
41
+ */
42
+ export declare const prepareFrameSystem: (model: FrameModel) => FrameSystem;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prepareFrameSystem = void 0;
4
+ const frame_constant_1 = require("../../../core/constants/frame.constant");
5
+ const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
6
+ const skyline_1 = require("../../../utils/skyline");
7
+ const beam_3d_stiffness_1 = require("../elements/beam-3d-stiffness");
8
+ const static_condensation_1 = require("../elements/static-condensation");
9
+ const coordinate_transform_1 = require("../transformation/coordinate-transform");
10
+ const validate_model_1 = require("../validation/validate-model");
11
+ const boundary_conditions_1 = require("./boundary-conditions");
12
+ const global_assembly_1 = require("./global-assembly");
13
+ const RELEASE_KEYS = ["u1", "u2", "u3", "r1", "r2", "r3"];
14
+ const DOF_NAMES = ["ux", "uy", "uz", "rx", "ry", "rz"];
15
+ const releasedIndices = (release, offset) => RELEASE_KEYS.flatMap((key, k) => (release?.[key] ? [offset + k] : []));
16
+ /**
17
+ * Builds the member matrices of a model that passed `validateFrameModel`, assembles the free
18
+ * stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and factorises it
19
+ * once for all load cases.
20
+ *
21
+ * @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
22
+ * a DOF involved in it
23
+ */
24
+ const prepareFrameSystem = (model) => {
25
+ const { nodes, members, restraints } = model;
26
+ const nodeIndex = new Map(nodes.map((n, i) => [n.id, i]));
27
+ const memberIndex = new Map(members.map((m, i) => [m.id, i]));
28
+ const dofCount = 6 * nodes.length;
29
+ const boundary = (0, boundary_conditions_1.buildBoundaryConditions)(restraints, nodeIndex, dofCount);
30
+ const systemMembers = members.map((member) => {
31
+ const start = nodes[nodeIndex.get(member.startNodeId)];
32
+ const end = nodes[nodeIndex.get(member.endNodeId)];
33
+ const { length, lambda } = (0, coordinate_transform_1.memberAxes)([start.x, start.y, start.z], [end.x, end.y, end.z], member.angle ?? 0);
34
+ const { E, G, A, I22, I33, J } = member.section;
35
+ const releasedDofs = [
36
+ ...releasedIndices(member.releases?.start, 0),
37
+ ...releasedIndices(member.releases?.end, 6),
38
+ ];
39
+ const condensed = (0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, length), releasedDofs);
40
+ return {
41
+ id: member.id,
42
+ section: member.section,
43
+ startIndex: nodeIndex.get(member.startNodeId),
44
+ endIndex: nodeIndex.get(member.endNodeId),
45
+ T: (0, coordinate_transform_1.transformationMatrix)(lambda),
46
+ k: condensed.k,
47
+ condenseFixedEndForces: condensed.condenseFixedEndForces,
48
+ released: Array.from({ length: 12 }, (_, i) => releasedDofs.includes(i)),
49
+ length,
50
+ lambda,
51
+ };
52
+ });
53
+ // ---- Equation numbering: nodes in RCM order, fixed DOFs skipped ------------------
54
+ const adjacency = nodes.map(() => []);
55
+ for (const m of systemMembers) {
56
+ adjacency[m.startIndex].push(m.endIndex);
57
+ adjacency[m.endIndex].push(m.startIndex);
58
+ }
59
+ const equation = new Int32Array(dofCount).fill(-1);
60
+ const free = [];
61
+ for (const node of (0, skyline_1.reverseCuthillMcKee)(adjacency)) {
62
+ for (let k = 0; k < 6; k++) {
63
+ const dof = 6 * node + k;
64
+ if (!boundary.fixed[dof]) {
65
+ equation[dof] = free.length;
66
+ free.push(dof);
67
+ }
68
+ }
69
+ }
70
+ // ---- Profile, assembly and factorisation -----------------------------------------
71
+ let factor = null;
72
+ if (free.length > 0) {
73
+ const first = free.map((_, e) => e);
74
+ const memberEquations = systemMembers.map((m) => (0, global_assembly_1.memberDofs)(m).map((d) => equation[d]));
75
+ for (const eqs of memberEquations) {
76
+ const active = eqs.filter((e) => e >= 0);
77
+ const low = Math.min(...active);
78
+ for (const e of active)
79
+ if (low < first[e])
80
+ first[e] = low;
81
+ }
82
+ const K = (0, skyline_1.createSkyline)(first);
83
+ systemMembers.forEach((m, index) => {
84
+ const kGlobal = (0, global_assembly_1.memberGlobalStiffness)(m);
85
+ const eqs = memberEquations[index];
86
+ // a member's 12 DOFs are distinct, so each unordered pair and each diagonal is added once
87
+ for (let a = 0; a < 12; a++) {
88
+ if (eqs[a] < 0)
89
+ continue;
90
+ for (let b = 0; b < 12; b++) {
91
+ if (eqs[b] >= eqs[a])
92
+ (0, skyline_1.skylineAdd)(K, eqs[a], eqs[b], kGlobal[a][b]);
93
+ }
94
+ }
95
+ });
96
+ free.forEach((dof, e) => {
97
+ if (boundary.spring[dof] > 0)
98
+ (0, skyline_1.skylineAdd)(K, e, e, boundary.spring[dof]);
99
+ });
100
+ const result = (0, skyline_1.skylineFactor)(K, frame_constant_1.SINGULARITY_TOLERANCE);
101
+ if (!result.ok) {
102
+ const dof = free[result.failedPivot];
103
+ (0, validate_model_1.throwIssues)([
104
+ (0, validate_model_1.frameIssue)(frame_analysis_error_1.FrameErrors.STRUCTURE_UNSTABLE, {
105
+ nodeId: nodes[Math.floor(dof / 6)].id,
106
+ dof: DOF_NAMES[dof % 6],
107
+ }),
108
+ ]);
109
+ }
110
+ factor = K;
111
+ }
112
+ return {
113
+ nodes,
114
+ nodeIndex,
115
+ memberIndex,
116
+ members: systemMembers,
117
+ dofCount,
118
+ boundary,
119
+ equation,
120
+ free,
121
+ factor,
122
+ profileSize: factor ? (0, skyline_1.skylineSize)(factor) : 0,
123
+ };
124
+ };
125
+ exports.prepareFrameSystem = prepareFrameSystem;
126
+ //# sourceMappingURL=frame-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-system.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/frame-system.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type Matrix } from "../../../utils/matrix";
2
+ export interface AssemblyMember {
3
+ startIndex: number;
4
+ endIndex: number;
5
+ T: Matrix;
6
+ k: Matrix;
7
+ }
8
+ /** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
9
+ export declare const memberDofs: (member: Pick<AssemblyMember, "startIndex" | "endIndex">) => number[];
10
+ /** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
11
+ export declare const memberGlobalStiffness: (member: AssemblyMember) => Matrix;
12
+ /**
13
+ * Adds `sign · Tᵀ·f` of one member's local end-force vector to a global vector (N and N·mm).
14
+ * With `sign = −1` and fixed-end forces this adds the equivalent nodal loads; with `sign = +1`
15
+ * and `k·u` it adds the member's elastic end forces.
16
+ */
17
+ export declare const scatterMemberForces: (target: number[], member: Pick<AssemblyMember, "startIndex" | "endIndex" | "T">, localForces: number[], sign: 1 | -1) => void;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scatterMemberForces = exports.memberGlobalStiffness = exports.memberDofs = void 0;
4
+ const matrix_1 = require("../../../utils/matrix");
5
+ /** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
6
+ const memberDofs = (member) => {
7
+ const dofs = [];
8
+ for (const node of [member.startIndex, member.endIndex]) {
9
+ for (let k = 0; k < 6; k++)
10
+ dofs.push(6 * node + k);
11
+ }
12
+ return dofs;
13
+ };
14
+ exports.memberDofs = memberDofs;
15
+ /** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
16
+ const memberGlobalStiffness = (member) => (0, matrix_1.matMul)((0, matrix_1.transpose)(member.T), (0, matrix_1.matMul)(member.k, member.T));
17
+ exports.memberGlobalStiffness = memberGlobalStiffness;
18
+ /**
19
+ * Adds `sign · Tᵀ·f` of one member's local end-force vector to a global vector (N and N·mm).
20
+ * With `sign = −1` and fixed-end forces this adds the equivalent nodal loads; with `sign = +1`
21
+ * and `k·u` it adds the member's elastic end forces.
22
+ */
23
+ const scatterMemberForces = (target, member, localForces, sign) => {
24
+ const dofs = (0, exports.memberDofs)(member);
25
+ for (let a = 0; a < 12; a++) {
26
+ let value = 0;
27
+ for (let j = 0; j < 12; j++)
28
+ value += member.T[j][a] * localForces[j];
29
+ target[dofs[a]] += sign * value;
30
+ }
31
+ };
32
+ exports.scatterMemberForces = scatterMemberForces;
33
+ //# sourceMappingURL=global-assembly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-assembly.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/global-assembly.ts"],"names":[],"mappings":";;;AAAA,8CAAmE;AASnE,iEAAiE;AAC1D,MAAM,UAAU,GAAG,CAAC,MAAuD,EAAY,EAAE;IAC9F,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AANW,QAAA,UAAU,cAMrB;AAEF,gEAAgE;AACzD,MAAM,qBAAqB,GAAG,CAAC,MAAsB,EAAU,EAAE,CACtE,IAAA,eAAM,EAAC,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAD7C,QAAA,qBAAqB,yBACwB;AAE1D;;;;GAIG;AACI,MAAM,mBAAmB,GAAG,CACjC,MAAgB,EAChB,MAA6D,EAC7D,WAAqB,EACrB,IAAY,EACN,EAAE;IACR,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,mBAAmB,uBAY9B"}
@@ -0,0 +1,34 @@
1
+ import { type LocalMemberLoad } from "../elements/fixed-end-forces";
2
+ import type { LoadCase, MemberLoad, NodalLoad } from "../types/model.type";
3
+ import type { FrameSystem } from "./frame-system";
4
+ /**
5
+ * Unrounded result of one load case or combination, in N and mm. Every field is linear in the
6
+ * loads, so combinations are formed by factoring and adding states.
7
+ */
8
+ export interface RawState {
9
+ U: number[];
10
+ R: number[];
11
+ F: number[];
12
+ memberForces: number[][];
13
+ memberLoads: LocalMemberLoad[][];
14
+ }
15
+ /**
16
+ * Solves one load case against the prepared, factorised system.
17
+ *
18
+ * Self-weight is `selfWeight · unitWeight · A` per unit member length along global −Z.
19
+ *
20
+ * @param loadCase - The load case (id and self-weight multiplier)
21
+ * @param loads - The nodal and member loads tagged with this load case
22
+ *
23
+ * @throws {FrameAnalysisError} 308 for a load outside its member, 313 if self-weight is
24
+ * requested for a member without `unitWeight`
25
+ */
26
+ export declare const solveLoadCase: (system: FrameSystem, loadCase: LoadCase, loads: {
27
+ nodalLoads: NodalLoad[];
28
+ memberLoads: MemberLoad[];
29
+ }) => RawState;
30
+ /** Superposes factored states: `Σ factor × state`. Member loads are concatenated, scaled. */
31
+ export declare const combineStates: (terms: {
32
+ state: RawState;
33
+ factor: number;
34
+ }[]) => RawState;