@theerapat-s28/ts-structural-eng-tools 2.2.0 → 3.0.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 (120) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/README.md +8 -5
  3. package/dist/core/constants/frame.constant.d.ts +15 -0
  4. package/dist/core/constants/frame.constant.js +16 -1
  5. package/dist/core/constants/frame.constant.js.map +1 -1
  6. package/dist/core/errors/frame-analysis.error.d.ts +1 -0
  7. package/dist/core/errors/frame-analysis.error.js +18 -2
  8. package/dist/core/errors/frame-analysis.error.js.map +1 -1
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.js +2 -1
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/esm/core/constants/frame.constant.js +15 -0
  13. package/dist/esm/core/constants/frame.constant.js.map +1 -1
  14. package/dist/esm/core/errors/frame-analysis.error.js +18 -2
  15. package/dist/esm/core/errors/frame-analysis.error.js.map +1 -1
  16. package/dist/esm/core/index.js +1 -1
  17. package/dist/esm/core/index.js.map +1 -1
  18. package/dist/esm/fea/frame/area/distribute-area-loads.js +10 -5
  19. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -1
  20. package/dist/esm/fea/frame/elements/shell/dkq-plate.js +109 -0
  21. package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +1 -0
  22. package/dist/esm/fea/frame/elements/shell/flat-shell.js +111 -0
  23. package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +1 -0
  24. package/dist/esm/fea/frame/elements/shell/membrane-quad.js +107 -0
  25. package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +1 -0
  26. package/dist/esm/fea/frame/elements/shell/quad-geometry.js +127 -0
  27. package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +1 -0
  28. package/dist/esm/fea/frame/elements/shell/rigidity.js +19 -0
  29. package/dist/esm/fea/frame/elements/shell/rigidity.js.map +1 -0
  30. package/dist/esm/fea/frame/elements/shell/shell-axes.js +97 -0
  31. package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +1 -0
  32. package/dist/esm/fea/frame/mesh/expand-model.js +129 -0
  33. package/dist/esm/fea/frame/mesh/expand-model.js.map +1 -0
  34. package/dist/esm/fea/frame/mesh/mesh-shells.js +239 -0
  35. package/dist/esm/fea/frame/mesh/mesh-shells.js.map +1 -0
  36. package/dist/esm/fea/frame/post/envelope.js +38 -1
  37. package/dist/esm/fea/frame/post/envelope.js.map +1 -1
  38. package/dist/esm/fea/frame/post/member-diagram.js +51 -2
  39. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
  40. package/dist/esm/fea/frame/post/present-state.js +34 -16
  41. package/dist/esm/fea/frame/post/present-state.js.map +1 -1
  42. package/dist/esm/fea/frame/post/shell-forces.js +111 -0
  43. package/dist/esm/fea/frame/post/shell-forces.js.map +1 -0
  44. package/dist/esm/fea/frame/solver/analyze-frame.js +27 -7
  45. package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
  46. package/dist/esm/fea/frame/solver/auto-restraint.js +58 -10
  47. package/dist/esm/fea/frame/solver/auto-restraint.js.map +1 -1
  48. package/dist/esm/fea/frame/solver/frame-system.js +148 -40
  49. package/dist/esm/fea/frame/solver/frame-system.js.map +1 -1
  50. package/dist/esm/fea/frame/solver/global-assembly.js +5 -3
  51. package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -1
  52. package/dist/esm/fea/frame/solver/load-case-solver.js +111 -11
  53. package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
  54. package/dist/esm/fea/frame/validation/validate-model.js +133 -3
  55. package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
  56. package/dist/esm/index.js +1 -1
  57. package/dist/esm/index.js.map +1 -1
  58. package/dist/fea/frame/area/distribute-area-loads.d.ts +3 -2
  59. package/dist/fea/frame/area/distribute-area-loads.js +10 -5
  60. package/dist/fea/frame/area/distribute-area-loads.js.map +1 -1
  61. package/dist/fea/frame/elements/shell/dkq-plate.d.ts +50 -0
  62. package/dist/fea/frame/elements/shell/dkq-plate.js +115 -0
  63. package/dist/fea/frame/elements/shell/dkq-plate.js.map +1 -0
  64. package/dist/fea/frame/elements/shell/flat-shell.d.ts +63 -0
  65. package/dist/fea/frame/elements/shell/flat-shell.js +118 -0
  66. package/dist/fea/frame/elements/shell/flat-shell.js.map +1 -0
  67. package/dist/fea/frame/elements/shell/membrane-quad.d.ts +61 -0
  68. package/dist/fea/frame/elements/shell/membrane-quad.js +113 -0
  69. package/dist/fea/frame/elements/shell/membrane-quad.js.map +1 -0
  70. package/dist/fea/frame/elements/shell/quad-geometry.d.ts +71 -0
  71. package/dist/fea/frame/elements/shell/quad-geometry.js +136 -0
  72. package/dist/fea/frame/elements/shell/quad-geometry.js.map +1 -0
  73. package/dist/fea/frame/elements/shell/rigidity.d.ts +14 -0
  74. package/dist/fea/frame/elements/shell/rigidity.js +23 -0
  75. package/dist/fea/frame/elements/shell/rigidity.js.map +1 -0
  76. package/dist/fea/frame/elements/shell/shell-axes.d.ts +43 -0
  77. package/dist/fea/frame/elements/shell/shell-axes.js +102 -0
  78. package/dist/fea/frame/elements/shell/shell-axes.js.map +1 -0
  79. package/dist/fea/frame/index.d.ts +2 -2
  80. package/dist/fea/frame/mesh/expand-model.d.ts +29 -0
  81. package/dist/fea/frame/mesh/expand-model.js +133 -0
  82. package/dist/fea/frame/mesh/expand-model.js.map +1 -0
  83. package/dist/fea/frame/mesh/mesh-shells.d.ts +38 -0
  84. package/dist/fea/frame/mesh/mesh-shells.js +244 -0
  85. package/dist/fea/frame/mesh/mesh-shells.js.map +1 -0
  86. package/dist/fea/frame/post/envelope.js +38 -1
  87. package/dist/fea/frame/post/envelope.js.map +1 -1
  88. package/dist/fea/frame/post/member-diagram.d.ts +21 -1
  89. package/dist/fea/frame/post/member-diagram.js +53 -3
  90. package/dist/fea/frame/post/member-diagram.js.map +1 -1
  91. package/dist/fea/frame/post/present-state.d.ts +3 -2
  92. package/dist/fea/frame/post/present-state.js +33 -15
  93. package/dist/fea/frame/post/present-state.js.map +1 -1
  94. package/dist/fea/frame/post/shell-forces.d.ts +27 -0
  95. package/dist/fea/frame/post/shell-forces.js +116 -0
  96. package/dist/fea/frame/post/shell-forces.js.map +1 -0
  97. package/dist/fea/frame/solver/analyze-frame.d.ts +8 -4
  98. package/dist/fea/frame/solver/analyze-frame.js +27 -7
  99. package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
  100. package/dist/fea/frame/solver/auto-restraint.d.ts +23 -10
  101. package/dist/fea/frame/solver/auto-restraint.js +60 -11
  102. package/dist/fea/frame/solver/auto-restraint.js.map +1 -1
  103. package/dist/fea/frame/solver/frame-system.d.ts +47 -8
  104. package/dist/fea/frame/solver/frame-system.js +146 -38
  105. package/dist/fea/frame/solver/frame-system.js.map +1 -1
  106. package/dist/fea/frame/solver/global-assembly.d.ts +11 -0
  107. package/dist/fea/frame/solver/global-assembly.js +7 -4
  108. package/dist/fea/frame/solver/global-assembly.js.map +1 -1
  109. package/dist/fea/frame/solver/load-case-solver.d.ts +11 -1
  110. package/dist/fea/frame/solver/load-case-solver.js +109 -9
  111. package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
  112. package/dist/fea/frame/types/model.type.d.ts +95 -3
  113. package/dist/fea/frame/types/results.type.d.ts +61 -1
  114. package/dist/fea/frame/validation/validate-model.d.ts +3 -2
  115. package/dist/fea/frame/validation/validate-model.js +133 -3
  116. package/dist/fea/frame/validation/validate-model.js.map +1 -1
  117. package/dist/index.d.ts +2 -2
  118. package/dist/index.js +3 -2
  119. package/dist/index.js.map +1 -1
  120. package/package.json +1 -1
@@ -1,14 +1,20 @@
1
1
  import type { SectionProperties } from "../../../core/types/section-properties.type";
2
2
  import type { Matrix } from "../../../utils/matrix";
3
3
  import { type SkylineMatrix } from "../../../utils/skyline";
4
+ import { type FlatShellElement } from "../elements/shell/flat-shell";
4
5
  import { type CondensedMember } from "../elements/static-condensation";
5
- import type { FrameId, FrameModel, FrameNode } from "../types/model.type";
6
+ import type { FrameId, FrameModel, FrameNode, ShellModifiers, ShellSection, ShellType } from "../types/model.type";
6
7
  import { type AutoRestraint } from "./auto-restraint";
7
8
  import { type BoundaryConditions } from "./boundary-conditions";
8
9
  import { type AssemblyMember } from "./global-assembly";
9
- /** A member with everything that does not depend on the loads. */
10
+ /**
11
+ * A member, or a piece of one, with everything that does not depend on the loads. A member is
12
+ * cut into pieces where generated shell-mesh nodes lie inside it; otherwise it is one piece.
13
+ */
10
14
  export interface SystemMember extends AssemblyMember {
11
15
  id: FrameId;
16
+ /** Distance of the piece's start from the member's start (mm); 0 for a whole member. */
17
+ offset: number;
12
18
  section: SectionProperties;
13
19
  length: number;
14
20
  lambda: Matrix;
@@ -19,12 +25,43 @@ export interface SystemMember extends AssemblyMember {
19
25
  /** The member's own end displacements from its end nodes' (differ across releases). */
20
26
  memberEndDisplacements: CondensedMember["memberEndDisplacements"];
21
27
  }
28
+ /** A model member and the pieces it is analysed as (one unless the shell mesh splits it). */
29
+ export interface MemberGroup {
30
+ id: FrameId;
31
+ /** Indices into `FrameSystem.members`, from the member's start to its end. */
32
+ pieces: number[];
33
+ section: SectionProperties;
34
+ length: number;
35
+ lambda: Matrix;
36
+ }
37
+ /** A shell area with everything that does not depend on the loads. */
38
+ export interface SystemShell {
39
+ id: FrameId;
40
+ /** The shell area the element belongs to (its own id when the area is one element). */
41
+ areaId: FrameId;
42
+ nodeIndices: number[];
43
+ type: ShellType;
44
+ section: ShellSection;
45
+ modifiers: ShellModifiers;
46
+ /** Axes, corner transformations and local and global stiffness. */
47
+ element: FlatShellElement;
48
+ /** ∫ Nᵢ dA of each corner on the mean plane (mm²): its share of a uniform surface load. */
49
+ cornerAreas: number[];
50
+ }
22
51
  /** The load-independent part of a frame analysis: geometry, stiffness and its factorisation. */
23
52
  export interface FrameSystem {
24
53
  nodes: FrameNode[];
25
54
  nodeIndex: Map<FrameId, number>;
55
+ /** Index into `memberGroups` of each model member. */
26
56
  memberIndex: Map<FrameId, number>;
57
+ /** Model members, in model order. */
58
+ memberGroups: MemberGroup[];
59
+ /** The pieces that are assembled: one per member unless the shell mesh splits it. */
27
60
  members: SystemMember[];
61
+ shellIndex: Map<FrameId, number>;
62
+ /** Element indices of each shell area. */
63
+ shellsByArea: Map<FrameId, number[]>;
64
+ shells: SystemShell[];
28
65
  dofCount: number;
29
66
  boundary: BoundaryConditions;
30
67
  /** Equation number of each global DOF in the factorised system, −1 for a fixed DOF. */
@@ -39,12 +76,14 @@ export interface FrameSystem {
39
76
  profileSize: number;
40
77
  }
41
78
  /**
42
- * Builds the member matrices of a model that passed `validateFrameModel`, assembles the free
43
- * stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and factorises it
44
- * once for all load cases. Joint rotations that no member resists (e.g. at truss joints) are
45
- * held by a spring along each null direction, which carries no force.
79
+ * Builds the member and shell matrices of a model that passed `validateFrameModel`, assembles
80
+ * the free stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and
81
+ * factorises it once for all load cases. Joint rotations that nothing resists (e.g. at truss
82
+ * joints) are held by a spring along each null direction, which carries no force.
46
83
  *
47
- * @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
48
- * a DOF involved in it
84
+ * @throws {FrameAnalysisError} 328 if a node connected only to shells has a translation that
85
+ * nothing resists (a membrane's out-of-plane or a plate's in-plane direction), with `nodeId`,
86
+ * `shellId` and `dof`; 304 if the structure is a mechanism; `details` names a node and a DOF
87
+ * involved in it
49
88
  */
50
89
  export declare const prepareFrameSystem: (model: FrameModel) => FrameSystem;
@@ -6,6 +6,8 @@ const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.erro
6
6
  const skyline_1 = require("../../../utils/skyline");
7
7
  const beam_3d_stiffness_1 = require("../elements/beam-3d-stiffness");
8
8
  const end_releases_1 = require("../elements/end-releases");
9
+ const flat_shell_1 = require("../elements/shell/flat-shell");
10
+ const quad_geometry_1 = require("../elements/shell/quad-geometry");
9
11
  const static_condensation_1 = require("../elements/static-condensation");
10
12
  const coordinate_transform_1 = require("../transformation/coordinate-transform");
11
13
  const validate_model_1 = require("../validation/validate-model");
@@ -14,46 +16,152 @@ const boundary_conditions_1 = require("./boundary-conditions");
14
16
  const global_assembly_1 = require("./global-assembly");
15
17
  const DOF_NAMES = ["ux", "uy", "uz", "rx", "ry", "rz"];
16
18
  /**
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. Joint rotations that no member resists (e.g. at truss joints) are
20
- * held by a spring along each null direction, which carries no force.
19
+ * Builds the member and shell matrices of a model that passed `validateFrameModel`, assembles
20
+ * the free stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and
21
+ * factorises it once for all load cases. Joint rotations that nothing resists (e.g. at truss
22
+ * joints) are held by a spring along each null direction, which carries no force.
21
23
  *
22
- * @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
23
- * a DOF involved in it
24
+ * @throws {FrameAnalysisError} 328 if a node connected only to shells has a translation that
25
+ * nothing resists (a membrane's out-of-plane or a plate's in-plane direction), with `nodeId`,
26
+ * `shellId` and `dof`; 304 if the structure is a mechanism; `details` names a node and a DOF
27
+ * involved in it
24
28
  */
25
29
  const prepareFrameSystem = (model) => {
26
30
  const { nodes, members, restraints } = model;
31
+ // shell elements: after `expandModel` they carry their area's id
32
+ const shells = (model.shells ?? []);
27
33
  const nodeIndex = new Map(nodes.map((n, i) => [n.id, i]));
28
34
  const memberIndex = new Map(members.map((m, i) => [m.id, i]));
35
+ const shellIndex = new Map(shells.map((sh, i) => [sh.id, i]));
29
36
  const dofCount = 6 * nodes.length;
30
37
  const boundary = (0, boundary_conditions_1.buildBoundaryConditions)(restraints, nodeIndex, dofCount);
31
- const systemMembers = members.map((member) => {
32
- const start = nodes[nodeIndex.get(member.startNodeId)];
33
- const end = nodes[nodeIndex.get(member.endNodeId)];
34
- const { length, lambda } = (0, coordinate_transform_1.memberAxes)([start.x, start.y, start.z], [end.x, end.y, end.z], member.angle ?? 0);
38
+ const point = (id) => {
39
+ const n = nodes[nodeIndex.get(id)];
40
+ return [n.x, n.y, n.z];
41
+ };
42
+ const systemMembers = [];
43
+ const memberGroups = members.map((member) => {
44
+ // pieces between the member's ends and the mesh nodes inside it (see `expandModel`)
45
+ const chain = [member.startNodeId, ...(member.through ?? []), member.endNodeId];
46
+ const whole = (0, coordinate_transform_1.memberAxes)(point(member.startNodeId), point(member.endNodeId), member.angle ?? 0);
35
47
  const { E, G, A, I22, I33, J } = member.section;
36
- const releases = (0, end_releases_1.memberEndReleases)(member.releases);
37
- const condensed = (0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, length), releases);
48
+ const pieces = [];
49
+ let offset = 0;
50
+ for (let k = 0; k + 1 < chain.length; k++) {
51
+ const { length, lambda } = chain.length === 2
52
+ ? whole
53
+ : (0, coordinate_transform_1.memberAxes)(point(chain[k]), point(chain[k + 1]), member.angle ?? 0);
54
+ // releases only at the member's own ends
55
+ const releases = (0, end_releases_1.memberEndReleases)({
56
+ start: k === 0 ? member.releases?.start : undefined,
57
+ end: k === chain.length - 2 ? member.releases?.end : undefined,
58
+ });
59
+ const condensed = (0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, length), releases);
60
+ pieces.push(systemMembers.length);
61
+ systemMembers.push({
62
+ id: member.id,
63
+ offset,
64
+ section: member.section,
65
+ startIndex: nodeIndex.get(chain[k]),
66
+ endIndex: nodeIndex.get(chain[k + 1]),
67
+ T: (0, coordinate_transform_1.transformationMatrix)(lambda),
68
+ k: condensed.k,
69
+ hasReleases: releases.length > 0,
70
+ condenseFixedEndForces: condensed.condenseFixedEndForces,
71
+ memberEndDisplacements: condensed.memberEndDisplacements,
72
+ length,
73
+ lambda,
74
+ });
75
+ offset += length;
76
+ }
38
77
  return {
39
78
  id: member.id,
79
+ pieces,
40
80
  section: member.section,
41
- startIndex: nodeIndex.get(member.startNodeId),
42
- endIndex: nodeIndex.get(member.endNodeId),
43
- T: (0, coordinate_transform_1.transformationMatrix)(lambda),
44
- k: condensed.k,
45
- hasReleases: releases.length > 0,
46
- condenseFixedEndForces: condensed.condenseFixedEndForces,
47
- memberEndDisplacements: condensed.memberEndDisplacements,
48
- length,
49
- lambda,
81
+ length: whole.length,
82
+ lambda: whole.lambda,
83
+ };
84
+ });
85
+ const systemShells = shells.map((shell) => {
86
+ const nodeIndices = shell.nodeIds.map((id) => nodeIndex.get(id));
87
+ const points = nodeIndices.map((n) => [nodes[n].x, nodes[n].y, nodes[n].z]);
88
+ const { thickness, E, nu } = shell.section;
89
+ const m = shell.modifiers ?? {};
90
+ const type = shell.type ?? "shell";
91
+ const element = (0, flat_shell_1.flatShellElement)(points, {
92
+ E,
93
+ nu,
94
+ t: thickness,
95
+ type,
96
+ membraneModifiers: [m.f11 ?? 1, m.f22 ?? 1, m.f12 ?? 1],
97
+ bendingModifiers: [m.m11 ?? 1, m.m22 ?? 1, m.m12 ?? 1],
98
+ }, shell.angle ?? 0);
99
+ return {
100
+ id: shell.id,
101
+ areaId: shell.areaId ?? shell.id,
102
+ nodeIndices,
103
+ type,
104
+ section: shell.section,
105
+ modifiers: m,
106
+ element,
107
+ cornerAreas: (0, quad_geometry_1.cornerAreas)(element.axes.corners),
50
108
  };
51
109
  });
110
+ const shellsByArea = new Map();
111
+ systemShells.forEach((sh, s) => {
112
+ const list = shellsByArea.get(sh.areaId);
113
+ if (list)
114
+ list.push(s);
115
+ else
116
+ shellsByArea.set(sh.areaId, [s]);
117
+ });
118
+ // Everything that adds stiffness, as elements over 6 DOFs per node; members have 2 nodes
119
+ const memberElements = systemMembers.map((m) => ({
120
+ nodes: [m.startIndex, m.endIndex],
121
+ kGlobal: (0, global_assembly_1.memberGlobalStiffness)(m),
122
+ }));
123
+ const shellElements = systemShells.map((sh) => ({
124
+ nodes: sh.nodeIndices,
125
+ kGlobal: sh.element.kGlobal,
126
+ }));
127
+ const elements = [...memberElements, ...shellElements];
128
+ // ---- Translations no shell resists at nodes without members (membrane / plate only) --
129
+ const memberNodes = new Set(systemMembers.flatMap((m) => [m.startIndex, m.endIndex]));
130
+ const shellOnlyNodes = new Set(systemShells.flatMap((sh) => sh.nodeIndices).filter((n) => !memberNodes.has(n)));
131
+ const unresisted = (0, auto_restraint_1.findUnresistedTranslations)([...shellOnlyNodes].sort((a, b) => a - b), // issues in model order
132
+ shellElements, boundary);
133
+ if (unresisted.length > 0) {
134
+ (0, validate_model_1.throwIssues)(unresisted.map(({ node, axis }) => {
135
+ const lead = axis.reduce((best, c, i) => (Math.abs(c) > Math.abs(axis[best]) ? i : best), 0);
136
+ return (0, validate_model_1.frameIssue)(frame_analysis_error_1.FrameErrors.SHELL_DOF_UNSUPPORTED, {
137
+ nodeId: nodes[node].id,
138
+ shellId: systemShells.find((sh) => sh.nodeIndices.includes(node))?.id,
139
+ dof: DOF_NAMES[lead],
140
+ });
141
+ }));
142
+ }
52
143
  // ---- Equation numbering: nodes in RCM order, fixed DOFs skipped ------------------
53
144
  const adjacency = nodes.map(() => []);
54
- for (const m of systemMembers) {
55
- adjacency[m.startIndex].push(m.endIndex);
56
- adjacency[m.endIndex].push(m.startIndex);
145
+ for (const element of memberElements) {
146
+ for (const a of element.nodes) {
147
+ for (const b of element.nodes)
148
+ if (a !== b)
149
+ adjacency[a].push(b);
150
+ }
151
+ }
152
+ // shells share edges: add each neighbour once (members keep their own order unchanged)
153
+ if (shellElements.length > 0) {
154
+ const known = adjacency.map((list) => new Set(list));
155
+ for (const element of shellElements) {
156
+ for (const a of element.nodes) {
157
+ for (const b of element.nodes) {
158
+ if (a !== b && !known[a].has(b)) {
159
+ known[a].add(b);
160
+ adjacency[a].push(b);
161
+ }
162
+ }
163
+ }
164
+ }
57
165
  }
58
166
  const equation = new Int32Array(dofCount).fill(-1);
59
167
  const free = [];
@@ -66,18 +174,13 @@ const prepareFrameSystem = (model) => {
66
174
  }
67
175
  }
68
176
  }
69
- const kGlobal = systemMembers.map(global_assembly_1.memberGlobalStiffness);
70
- const autoRestraints = (0, auto_restraint_1.findAutoRestraints)(nodes.length, systemMembers.map((m, i) => ({
71
- startIndex: m.startIndex,
72
- endIndex: m.endIndex,
73
- kGlobal: kGlobal[i],
74
- })), boundary);
177
+ const autoRestraints = (0, auto_restraint_1.findAutoRestraints)(nodes.length, elements, boundary);
75
178
  // ---- Profile, assembly and factorisation -----------------------------------------
76
179
  let factor = null;
77
180
  if (free.length > 0) {
78
181
  const first = free.map((_, e) => e);
79
- const memberEquations = systemMembers.map((m) => (0, global_assembly_1.memberDofs)(m).map((d) => equation[d]));
80
- for (const eqs of memberEquations) {
182
+ const elementEquations = elements.map((el) => (0, global_assembly_1.elementDofs)(el.nodes).map((d) => equation[d]));
183
+ for (const eqs of elementEquations) {
81
184
  const active = eqs.filter((e) => e >= 0);
82
185
  const low = Math.min(...active);
83
186
  for (const e of active)
@@ -85,14 +188,15 @@ const prepareFrameSystem = (model) => {
85
188
  first[e] = low;
86
189
  }
87
190
  const K = (0, skyline_1.createSkyline)(first);
88
- memberEquations.forEach((eqs, index) => {
89
- // a member's 12 DOFs are distinct, so each unordered pair and each diagonal is added once
90
- for (let a = 0; a < 12; a++) {
191
+ elementEquations.forEach((eqs, index) => {
192
+ // an element's nodes, hence its DOFs, are distinct: each pair and diagonal is added once
193
+ const k = elements[index].kGlobal;
194
+ for (let a = 0; a < eqs.length; a++) {
91
195
  if (eqs[a] < 0)
92
196
  continue;
93
- for (let b = 0; b < 12; b++) {
197
+ for (let b = 0; b < eqs.length; b++) {
94
198
  if (eqs[b] >= eqs[a])
95
- (0, skyline_1.skylineAdd)(K, eqs[a], eqs[b], kGlobal[index][a][b]);
199
+ (0, skyline_1.skylineAdd)(K, eqs[a], eqs[b], k[a][b]);
96
200
  }
97
201
  }
98
202
  });
@@ -100,7 +204,7 @@ const prepareFrameSystem = (model) => {
100
204
  if (boundary.spring[dof] > 0)
101
205
  (0, skyline_1.skylineAdd)(K, e, e, boundary.spring[dof]);
102
206
  });
103
- // k·n·nᵀ on the node's free rotations, inside the profile: its members span all 6 node DOFs
207
+ // k·n·nᵀ on the node's free rotations, inside the profile: its elements span all 6 node DOFs
104
208
  for (const { node, axis, stiffness } of autoRestraints) {
105
209
  for (let i = 0; i < 3; i++) {
106
210
  const ei = equation[6 * node + 3 + i];
@@ -129,7 +233,11 @@ const prepareFrameSystem = (model) => {
129
233
  nodes,
130
234
  nodeIndex,
131
235
  memberIndex,
236
+ memberGroups,
132
237
  members: systemMembers,
238
+ shellIndex,
239
+ shellsByArea,
240
+ shells: systemShells,
133
241
  dofCount,
134
242
  boundary,
135
243
  equation,
@@ -1 +1 @@
1
- {"version":3,"file":"frame-system.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/frame-system.ts"],"names":[],"mappings":";;;AAAA,uEAA2E;AAC3E,gFAAoE;AAGpE,gDAO4B;AAE5B,qEAAgF;AAChF,2DAA6D;AAC7D,yEAAuF;AACvF,iFAA0F;AAE1F,iEAAuE;AACvE,qDAA0E;AAC1E,+DAAyF;AACzF,uDAA2F;AAE3F,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAoChE;;;;;;;;GAQG;AACI,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAe,EAAE;IACnE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAA,6CAAuB,EAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE1E,MAAM,aAAa,GAAmB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAW,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAW,CAAC,CAAC;QAC7D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,iCAAU,EACnC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAC3B,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,KAAK,IAAI,CAAC,CAClB,CAAC;QACF,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAA,gCAAiB,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAA,oCAAc,EAC9B,IAAA,mDAA+B,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,EAC7D,QAAQ,CACT,CAAC;QACF,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAW;YACvD,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAW;YACnD,CAAC,EAAE,IAAA,2CAAoB,EAAC,MAAM,CAAC;YAC/B,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAChC,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;YACxD,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;YACxD,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,qFAAqF;IACrF,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,IAAA,6BAAmB,EAAC,SAAS,CAAC,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,uCAAqB,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,IAAA,mCAAkB,EACvC,KAAK,CAAC,MAAM,EACZ,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;KACpB,CAAC,CAAC,EACH,QAAQ,CACT,CAAC;IAEF,qFAAqF;IACrF,IAAI,MAAM,GAAyB,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,4BAAU,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC7D,CAAC;QAED,MAAM,CAAC,GAAG,IAAA,uBAAa,EAAC,KAAK,CAAC,CAAC;QAC/B,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACrC,0FAA0F;YAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;wBAAE,IAAA,oBAAU,EAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtB,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAA,oBAAU,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,4FAA4F;QAC5F,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,cAAc,EAAE,CAAC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtC,IAAI,EAAE,GAAG,CAAC;oBAAE,SAAS;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACtC,IAAI,EAAE,IAAI,EAAE;wBAAE,IAAA,oBAAU,EAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,CAAC,EAAE,sCAAqB,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACrC,IAAA,4BAAW,EAAC;gBACV,IAAA,2BAAU,EAAC,kCAAW,CAAC,kBAAkB,EAAE;oBACzC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;oBACrC,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;iBACxB,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,CAAC,CAAC;IACb,CAAC;IAED,OAAO;QACL,KAAK;QACL,SAAS;QACT,WAAW;QACX,OAAO,EAAE,aAAa;QACtB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,IAAI;QACJ,cAAc;QACd,MAAM;QACN,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC,CAAC;AA/HW,QAAA,kBAAkB,sBA+H7B"}
1
+ {"version":3,"file":"frame-system.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/frame-system.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,21 @@
1
1
  import { type Matrix } from "../../../utils/matrix";
2
+ /**
3
+ * A stiffness contribution to the global system: the nodes it connects and its stiffness over
4
+ * their DOFs (6 per node, in node order) in global axes. A member is a 2-node element; elements
5
+ * with more nodes assemble the same way.
6
+ */
7
+ export interface StiffnessElement {
8
+ nodes: number[];
9
+ kGlobal: Matrix;
10
+ }
2
11
  export interface AssemblyMember {
3
12
  startIndex: number;
4
13
  endIndex: number;
5
14
  T: Matrix;
6
15
  k: Matrix;
7
16
  }
17
+ /** Global DOF numbers (6 per node, in node order) of an element connecting `nodes`. */
18
+ export declare const elementDofs: (nodes: readonly number[]) => number[];
8
19
  /** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
9
20
  export declare const memberDofs: (member: Pick<AssemblyMember, "startIndex" | "endIndex">) => number[];
10
21
  /** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
@@ -1,16 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.scatterMemberForces = exports.memberGlobalStiffness = exports.memberDofs = void 0;
3
+ exports.scatterMemberForces = exports.memberGlobalStiffness = exports.memberDofs = exports.elementDofs = void 0;
4
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) => {
5
+ /** Global DOF numbers (6 per node, in node order) of an element connecting `nodes`. */
6
+ const elementDofs = (nodes) => {
7
7
  const dofs = [];
8
- for (const node of [member.startIndex, member.endIndex]) {
8
+ for (const node of nodes) {
9
9
  for (let k = 0; k < 6; k++)
10
10
  dofs.push(6 * node + k);
11
11
  }
12
12
  return dofs;
13
13
  };
14
+ exports.elementDofs = elementDofs;
15
+ /** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
16
+ const memberDofs = (member) => (0, exports.elementDofs)([member.startIndex, member.endIndex]);
14
17
  exports.memberDofs = memberDofs;
15
18
  /** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
16
19
  const memberGlobalStiffness = (member) => (0, matrix_1.matMul)((0, matrix_1.transpose)(member.T), (0, matrix_1.matMul)(member.k, member.T));
@@ -1 +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"}
1
+ {"version":3,"file":"global-assembly.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/global-assembly.ts"],"names":[],"mappings":";;;AAAA,8CAAmE;AAmBnE,uFAAuF;AAChF,MAAM,WAAW,GAAG,CAAC,KAAwB,EAAY,EAAE;IAChE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,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,WAAW,eAMtB;AAEF,iEAAiE;AAC1D,MAAM,UAAU,GAAG,CAAC,MAAuD,EAAY,EAAE,CAC9F,IAAA,mBAAW,EAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AADvC,QAAA,UAAU,cAC6B;AAEpD,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"}
@@ -1,5 +1,5 @@
1
1
  import { type LocalMemberLoad } from "../elements/fixed-end-forces";
2
- import type { LoadCase, MemberLoad, NodalLoad } from "../types/model.type";
2
+ import type { AreaLoad, LoadCase, MemberLoad, NodalLoad } from "../types/model.type";
3
3
  import type { FrameSystem } from "./frame-system";
4
4
  /**
5
5
  * Unrounded result of one load case or combination, in N and mm. Every field is linear in the
@@ -10,6 +10,7 @@ export interface RawState {
10
10
  R: number[];
11
11
  F: number[];
12
12
  memberForces: number[][];
13
+ shellForces: number[][];
13
14
  memberLoads: LocalMemberLoad[][];
14
15
  }
15
16
  /**
@@ -20,6 +21,14 @@ export interface RawState {
20
21
  * @param loadCase - The load case (id and self-weight multiplier)
21
22
  * @param loads - The nodal and member loads tagged with this load case
22
23
  *
24
+ * Shell areas take `selfWeight · unitWeight · thickness · modifiers.weight` per unit area along
25
+ * −Z and their `AreaLoad`s as forces at their corners, each corner the share `∫ Nᵢ dA` of the
26
+ * element's area on its mean plane (no corner moments, so a warped element's offsets do not load
27
+ * the rotations auto-restraint holds).
28
+ *
29
+ * @param loads - The nodal and member loads tagged with this load case, and its area loads on
30
+ * shell areas
31
+ *
23
32
  * @throws {FrameAnalysisError} 304 if a load has a moment about a joint rotation that nothing
24
33
  * resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
25
34
  * requested for a member without `unitWeight`
@@ -27,6 +36,7 @@ export interface RawState {
27
36
  export declare const solveLoadCase: (system: FrameSystem, loadCase: LoadCase, loads: {
28
37
  nodalLoads: NodalLoad[];
29
38
  memberLoads: MemberLoad[];
39
+ shellLoads?: AreaLoad[];
30
40
  }) => RawState;
31
41
  /** Superposes factored states: `Σ factor × state`. Member loads are concatenated, scaled. */
32
42
  export declare const combineStates: (terms: {