@theerapat-s28/ts-structural-eng-tools 2.3.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.
- package/CHANGELOG.md +28 -1
- package/README.md +8 -5
- package/dist/core/constants/frame.constant.d.ts +15 -0
- package/dist/core/constants/frame.constant.js +16 -1
- package/dist/core/constants/frame.constant.js.map +1 -1
- package/dist/core/errors/frame-analysis.error.d.ts +1 -0
- package/dist/core/errors/frame-analysis.error.js +18 -2
- package/dist/core/errors/frame-analysis.error.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/esm/core/constants/frame.constant.js +15 -0
- package/dist/esm/core/constants/frame.constant.js.map +1 -1
- package/dist/esm/core/errors/frame-analysis.error.js +18 -2
- package/dist/esm/core/errors/frame-analysis.error.js.map +1 -1
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/fea/frame/elements/shell/dkq-plate.js +109 -0
- package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/flat-shell.js +111 -0
- package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/membrane-quad.js +107 -0
- package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/quad-geometry.js +127 -0
- package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/rigidity.js +19 -0
- package/dist/esm/fea/frame/elements/shell/rigidity.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/shell-axes.js +97 -0
- package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +1 -0
- package/dist/esm/fea/frame/mesh/expand-model.js +129 -0
- package/dist/esm/fea/frame/mesh/expand-model.js.map +1 -0
- package/dist/esm/fea/frame/mesh/mesh-shells.js +239 -0
- package/dist/esm/fea/frame/mesh/mesh-shells.js.map +1 -0
- package/dist/esm/fea/frame/post/envelope.js +38 -1
- package/dist/esm/fea/frame/post/envelope.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js +51 -2
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/post/present-state.js +34 -16
- package/dist/esm/fea/frame/post/present-state.js.map +1 -1
- package/dist/esm/fea/frame/post/shell-forces.js +111 -0
- package/dist/esm/fea/frame/post/shell-forces.js.map +1 -0
- package/dist/esm/fea/frame/solver/analyze-frame.js +27 -7
- package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/esm/fea/frame/solver/auto-restraint.js +58 -10
- package/dist/esm/fea/frame/solver/auto-restraint.js.map +1 -1
- package/dist/esm/fea/frame/solver/frame-system.js +148 -40
- package/dist/esm/fea/frame/solver/frame-system.js.map +1 -1
- package/dist/esm/fea/frame/solver/global-assembly.js +5 -3
- package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -1
- package/dist/esm/fea/frame/solver/load-case-solver.js +102 -9
- package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-model.js +120 -3
- package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/fea/frame/elements/shell/dkq-plate.d.ts +50 -0
- package/dist/fea/frame/elements/shell/dkq-plate.js +115 -0
- package/dist/fea/frame/elements/shell/dkq-plate.js.map +1 -0
- package/dist/fea/frame/elements/shell/flat-shell.d.ts +63 -0
- package/dist/fea/frame/elements/shell/flat-shell.js +118 -0
- package/dist/fea/frame/elements/shell/flat-shell.js.map +1 -0
- package/dist/fea/frame/elements/shell/membrane-quad.d.ts +61 -0
- package/dist/fea/frame/elements/shell/membrane-quad.js +113 -0
- package/dist/fea/frame/elements/shell/membrane-quad.js.map +1 -0
- package/dist/fea/frame/elements/shell/quad-geometry.d.ts +71 -0
- package/dist/fea/frame/elements/shell/quad-geometry.js +136 -0
- package/dist/fea/frame/elements/shell/quad-geometry.js.map +1 -0
- package/dist/fea/frame/elements/shell/rigidity.d.ts +14 -0
- package/dist/fea/frame/elements/shell/rigidity.js +23 -0
- package/dist/fea/frame/elements/shell/rigidity.js.map +1 -0
- package/dist/fea/frame/elements/shell/shell-axes.d.ts +43 -0
- package/dist/fea/frame/elements/shell/shell-axes.js +102 -0
- package/dist/fea/frame/elements/shell/shell-axes.js.map +1 -0
- package/dist/fea/frame/index.d.ts +2 -2
- package/dist/fea/frame/mesh/expand-model.d.ts +29 -0
- package/dist/fea/frame/mesh/expand-model.js +133 -0
- package/dist/fea/frame/mesh/expand-model.js.map +1 -0
- package/dist/fea/frame/mesh/mesh-shells.d.ts +38 -0
- package/dist/fea/frame/mesh/mesh-shells.js +244 -0
- package/dist/fea/frame/mesh/mesh-shells.js.map +1 -0
- package/dist/fea/frame/post/envelope.js +38 -1
- package/dist/fea/frame/post/envelope.js.map +1 -1
- package/dist/fea/frame/post/member-diagram.d.ts +21 -1
- package/dist/fea/frame/post/member-diagram.js +53 -3
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/post/present-state.d.ts +3 -2
- package/dist/fea/frame/post/present-state.js +33 -15
- package/dist/fea/frame/post/present-state.js.map +1 -1
- package/dist/fea/frame/post/shell-forces.d.ts +27 -0
- package/dist/fea/frame/post/shell-forces.js +116 -0
- package/dist/fea/frame/post/shell-forces.js.map +1 -0
- package/dist/fea/frame/solver/analyze-frame.d.ts +8 -4
- package/dist/fea/frame/solver/analyze-frame.js +27 -7
- package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/fea/frame/solver/auto-restraint.d.ts +23 -10
- package/dist/fea/frame/solver/auto-restraint.js +60 -11
- package/dist/fea/frame/solver/auto-restraint.js.map +1 -1
- package/dist/fea/frame/solver/frame-system.d.ts +47 -8
- package/dist/fea/frame/solver/frame-system.js +146 -38
- package/dist/fea/frame/solver/frame-system.js.map +1 -1
- package/dist/fea/frame/solver/global-assembly.d.ts +11 -0
- package/dist/fea/frame/solver/global-assembly.js +7 -4
- package/dist/fea/frame/solver/global-assembly.js.map +1 -1
- package/dist/fea/frame/solver/load-case-solver.d.ts +11 -1
- package/dist/fea/frame/solver/load-case-solver.js +100 -7
- package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +82 -4
- package/dist/fea/frame/types/results.type.d.ts +61 -1
- package/dist/fea/frame/validation/validate-model.d.ts +3 -2
- package/dist/fea/frame/validation/validate-model.js +120 -3
- package/dist/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- 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
|
-
/**
|
|
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
|
|
43
|
-
* stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and
|
|
44
|
-
* once for all load cases. Joint rotations that
|
|
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}
|
|
48
|
-
* a
|
|
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
|
|
18
|
-
* stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and
|
|
19
|
-
* once for all load cases. Joint rotations that
|
|
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}
|
|
23
|
-
* a
|
|
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
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
37
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
55
|
-
|
|
56
|
-
|
|
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
|
|
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
|
|
80
|
-
for (const eqs of
|
|
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
|
-
|
|
89
|
-
//
|
|
90
|
-
|
|
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 <
|
|
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],
|
|
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
|
|
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":"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"}
|
|
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
|
|
6
|
-
const
|
|
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
|
|
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;
|
|
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: {
|
|
@@ -6,6 +6,7 @@ const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.erro
|
|
|
6
6
|
const matrix_1 = require("../../../utils/matrix");
|
|
7
7
|
const skyline_1 = require("../../../utils/skyline");
|
|
8
8
|
const fixed_end_forces_1 = require("../elements/fixed-end-forces");
|
|
9
|
+
const shell_forces_1 = require("../post/shell-forces");
|
|
9
10
|
const validate_model_1 = require("../validation/validate-model");
|
|
10
11
|
const global_assembly_1 = require("./global-assembly");
|
|
11
12
|
const GLOBAL_DIRECTIONS = {
|
|
@@ -52,6 +53,41 @@ const toLocalLoads = (load, lambda, L) => {
|
|
|
52
53
|
};
|
|
53
54
|
});
|
|
54
55
|
};
|
|
56
|
+
/**
|
|
57
|
+
* The part of a member's local loads that falls on one of its pieces, `[offset, offset + L]`,
|
|
58
|
+
* in the piece's own positions. A distributed load or torque is cut at the piece ends; a point
|
|
59
|
+
* load goes to the piece it lies in (at an interior node, to the piece that starts there).
|
|
60
|
+
*/
|
|
61
|
+
const clipLoads = (loads, offset, L, last) => {
|
|
62
|
+
const end = offset + L;
|
|
63
|
+
const tolerance = 1e-9 * end;
|
|
64
|
+
const out = [];
|
|
65
|
+
for (const load of loads) {
|
|
66
|
+
if (load.type === "point") {
|
|
67
|
+
const inside = load.a >= offset - tolerance && (load.a < end - tolerance || last);
|
|
68
|
+
if (inside)
|
|
69
|
+
out.push({ ...load, a: Math.min(L, Math.max(0, load.a - offset)) });
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const from = Math.max(load.start, offset);
|
|
73
|
+
const to = Math.min(load.end, end);
|
|
74
|
+
if (to - from <= tolerance)
|
|
75
|
+
continue;
|
|
76
|
+
if (load.type === "torque") {
|
|
77
|
+
out.push({ ...load, start: from - offset, end: to - offset });
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
out.push({
|
|
81
|
+
...load,
|
|
82
|
+
w1: (0, fixed_end_forces_1.loadIntensity)(load, from),
|
|
83
|
+
w2: (0, fixed_end_forces_1.loadIntensity)(load, to),
|
|
84
|
+
start: from - offset,
|
|
85
|
+
end: to - offset,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return out;
|
|
90
|
+
};
|
|
55
91
|
/**
|
|
56
92
|
* Solves one load case against the prepared, factorised system.
|
|
57
93
|
*
|
|
@@ -60,6 +96,14 @@ const toLocalLoads = (load, lambda, L) => {
|
|
|
60
96
|
* @param loadCase - The load case (id and self-weight multiplier)
|
|
61
97
|
* @param loads - The nodal and member loads tagged with this load case
|
|
62
98
|
*
|
|
99
|
+
* Shell areas take `selfWeight · unitWeight · thickness · modifiers.weight` per unit area along
|
|
100
|
+
* −Z and their `AreaLoad`s as forces at their corners, each corner the share `∫ Nᵢ dA` of the
|
|
101
|
+
* element's area on its mean plane (no corner moments, so a warped element's offsets do not load
|
|
102
|
+
* the rotations auto-restraint holds).
|
|
103
|
+
*
|
|
104
|
+
* @param loads - The nodal and member loads tagged with this load case, and its area loads on
|
|
105
|
+
* shell areas
|
|
106
|
+
*
|
|
63
107
|
* @throws {FrameAnalysisError} 304 if a load has a moment about a joint rotation that nothing
|
|
64
108
|
* resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
|
|
65
109
|
* requested for a member without `unitWeight`
|
|
@@ -67,15 +111,18 @@ const toLocalLoads = (load, lambda, L) => {
|
|
|
67
111
|
const solveLoadCase = (system, loadCase, loads) => {
|
|
68
112
|
const { members, dofCount, boundary, equation, free, factor, nodeIndex, memberIndex } = system;
|
|
69
113
|
const F = new Array(dofCount).fill(0);
|
|
70
|
-
const
|
|
114
|
+
const groups = system.memberGroups;
|
|
115
|
+
const loadsByMember = groups.map(() => []);
|
|
71
116
|
for (const load of loads.memberLoads) {
|
|
72
117
|
loadsByMember[memberIndex.get(load.memberId)].push(load);
|
|
73
118
|
}
|
|
74
119
|
const selfWeight = loadCase.selfWeight ?? 0;
|
|
75
|
-
|
|
76
|
-
|
|
120
|
+
// local loads of each model member, then of each piece it is analysed as
|
|
121
|
+
const memberLoads = members.map(() => []);
|
|
122
|
+
groups.forEach((group, g) => {
|
|
123
|
+
const memberLoadsHere = [...loadsByMember[g]];
|
|
77
124
|
if (selfWeight !== 0) {
|
|
78
|
-
const { unitWeight, A } =
|
|
125
|
+
const { unitWeight, A } = group.section;
|
|
79
126
|
if (unitWeight === undefined)
|
|
80
127
|
throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.MISSING_UNIT_WEIGHT);
|
|
81
128
|
// kN/m³ · m² = kN/m
|
|
@@ -84,19 +131,58 @@ const solveLoadCase = (system, loadCase, loads) => {
|
|
|
84
131
|
memberLoadsHere.push({
|
|
85
132
|
loadCase: loadCase.id,
|
|
86
133
|
type: "udl",
|
|
87
|
-
memberId:
|
|
134
|
+
memberId: group.id,
|
|
88
135
|
direction: "Z",
|
|
89
136
|
w,
|
|
90
137
|
});
|
|
91
138
|
}
|
|
92
139
|
}
|
|
93
|
-
|
|
140
|
+
const local = memberLoadsHere.flatMap((load) => toLocalLoads(load, group.lambda, group.length));
|
|
141
|
+
if (group.pieces.length === 1) {
|
|
142
|
+
memberLoads[group.pieces[0]] = local;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
group.pieces.forEach((p, k) => {
|
|
146
|
+
const piece = members[p];
|
|
147
|
+
memberLoads[p] = clipLoads(local, piece.offset, piece.length, k === group.pieces.length - 1);
|
|
148
|
+
});
|
|
94
149
|
});
|
|
95
150
|
const fixed = members.map((member, m) => {
|
|
96
151
|
const condensed = member.condenseFixedEndForces((0, fixed_end_forces_1.fixedEndForces)(memberLoads[m], member.length));
|
|
97
152
|
(0, global_assembly_1.scatterMemberForces)(F, member, condensed, -1);
|
|
98
153
|
return condensed;
|
|
99
154
|
});
|
|
155
|
+
// Shell surface loads, kN/m² as a global vector per shell, then N at the corners
|
|
156
|
+
const shellPressure = system.shells.map(() => [0, 0, 0]);
|
|
157
|
+
for (const load of loads.shellLoads ?? []) {
|
|
158
|
+
// every element of the area
|
|
159
|
+
for (const s of system.shellsByArea.get(load.areaId) ?? []) {
|
|
160
|
+
const normal = system.shells[s].element.axes.lambda[2];
|
|
161
|
+
const e = load.direction === "3" ? normal : GLOBAL_DIRECTIONS[load.direction];
|
|
162
|
+
// per projected area → per true area: Aproj / A = |n · e|
|
|
163
|
+
const q = load.projected
|
|
164
|
+
? load.q * Math.abs(normal[0] * e[0] + normal[1] * e[1] + normal[2] * e[2])
|
|
165
|
+
: load.q;
|
|
166
|
+
for (let k = 0; k < 3; k++)
|
|
167
|
+
shellPressure[s][k] += q * e[k];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
system.shells.forEach((shell, s) => {
|
|
171
|
+
if (selfWeight !== 0) {
|
|
172
|
+
// kN/m³ · mm · 10⁻³ = kN/m²
|
|
173
|
+
const { unitWeight = 0, thickness } = shell.section;
|
|
174
|
+
shellPressure[s][2] -=
|
|
175
|
+
selfWeight * unitWeight * thickness * (shell.modifiers.weight ?? 1) * 1e-3;
|
|
176
|
+
}
|
|
177
|
+
const p = shellPressure[s];
|
|
178
|
+
if (p[0] === 0 && p[1] === 0 && p[2] === 0)
|
|
179
|
+
return;
|
|
180
|
+
shell.nodeIndices.forEach((node, i) => {
|
|
181
|
+
// kN/m² = 10⁻³ N/mm², times mm²
|
|
182
|
+
for (let k = 0; k < 3; k++)
|
|
183
|
+
F[6 * node + k] += p[k] * 1e-3 * shell.cornerAreas[i];
|
|
184
|
+
});
|
|
185
|
+
});
|
|
100
186
|
for (const load of loads.nodalLoads) {
|
|
101
187
|
const base = 6 * nodeIndex.get(load.nodeId);
|
|
102
188
|
[load.fx, load.fy, load.fz].forEach((v, k) => (F[base + k] += (v ?? 0) * 1e3));
|
|
@@ -134,8 +220,14 @@ const solveLoadCase = (system, loadCase, loads) => {
|
|
|
134
220
|
(0, global_assembly_1.scatterMemberForces)(KU, member, elastic, 1);
|
|
135
221
|
return elastic.map((v, i) => v + fixed[m][i]);
|
|
136
222
|
});
|
|
223
|
+
for (const shell of system.shells) {
|
|
224
|
+
const dofs = (0, global_assembly_1.elementDofs)(shell.nodeIndices);
|
|
225
|
+
const forces = (0, matrix_1.matVec)(shell.element.kGlobal, dofs.map((d) => U[d]));
|
|
226
|
+
dofs.forEach((d, a) => (KU[d] += forces[a]));
|
|
227
|
+
}
|
|
137
228
|
const R = KU.map((v, i) => (boundary.restrained[i] ? v - F[i] : 0));
|
|
138
|
-
|
|
229
|
+
const shellForces = system.shells.map((shell) => (0, shell_forces_1.shellRawForces)(shell, U));
|
|
230
|
+
return { U, R, F, memberForces, shellForces, memberLoads };
|
|
139
231
|
};
|
|
140
232
|
exports.solveLoadCase = solveLoadCase;
|
|
141
233
|
const scaleLoad = (load, factor) => {
|
|
@@ -160,6 +252,7 @@ const combineStates = (terms) => {
|
|
|
160
252
|
R: add((s) => s.R, first.R.length),
|
|
161
253
|
F: add((s) => s.F, first.F.length),
|
|
162
254
|
memberForces: first.memberForces.map((_, m) => add((s) => s.memberForces[m], 12)),
|
|
255
|
+
shellForces: first.shellForces.map((f, sh) => add((s) => s.shellForces[sh], f.length)),
|
|
163
256
|
memberLoads: first.memberLoads.map((_, m) => terms.flatMap(({ state, factor }) => factor === 0 ? [] : state.memberLoads[m].map((l) => scaleLoad(l, factor)))),
|
|
164
257
|
};
|
|
165
258
|
};
|