@theerapat-s28/ts-structural-eng-tools 2.3.0 → 3.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.
- package/CHANGELOG.md +80 -1
- package/README.md +35 -11
- 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
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isValidShellQuad = exports.shellAxes = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../../core/constants/frame.constant");
|
|
5
|
+
const quad_geometry_1 = require("./quad-geometry");
|
|
6
|
+
const sub = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
7
|
+
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
8
|
+
const cross = (a, b) => [
|
|
9
|
+
a[1] * b[2] - a[2] * b[1],
|
|
10
|
+
a[2] * b[0] - a[0] * b[2],
|
|
11
|
+
a[0] * b[1] - a[1] * b[0],
|
|
12
|
+
];
|
|
13
|
+
const unit = (a) => {
|
|
14
|
+
const n = Math.hypot(a[0], a[1], a[2]);
|
|
15
|
+
return [a[0] / n, a[1] / n, a[2] / n];
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Local axes of a four-node shell element, ETABS-style, and its corners on the mean plane.
|
|
19
|
+
*
|
|
20
|
+
* - Local 3 is the unit normal `n ∥ d₁ × d₂` of the diagonals `d₁ = x₃ − x₁`, `d₂ = x₄ − x₂`: the
|
|
21
|
+
* right-hand rule around the nodes, as for null areas (for four nodes Newell's vector area is
|
|
22
|
+
* exactly `½ d₁ × d₂`).
|
|
23
|
+
* - Non-horizontal element: local 2 is +Z projected onto the plane (upward on a wall) and
|
|
24
|
+
* local 1 = 2 × 3 is horizontal.
|
|
25
|
+
* - Horizontal element (the normal's horizontal part below the vertical-member tolerance):
|
|
26
|
+
* local 1 = +X and local 2 = 3 × 1, so local 2 = +Y when local 3 = +Z.
|
|
27
|
+
* - `angle` then rotates local 1 and 2 about local 3 by the right-hand rule.
|
|
28
|
+
*
|
|
29
|
+
* The mean plane passes through the centroid with normal n; a warped element's corners lie
|
|
30
|
+
* alternately h above and below it.
|
|
31
|
+
*
|
|
32
|
+
* @param points - The four corners in global axes (mm), in order around the element
|
|
33
|
+
* @param angle - Rotation of local 1 and 2 about local 3 in rad (default 0)
|
|
34
|
+
*/
|
|
35
|
+
const shellAxes = (points, angle = 0) => {
|
|
36
|
+
const e3 = unit(cross(sub(points[2], points[0]), sub(points[3], points[1])));
|
|
37
|
+
let e1;
|
|
38
|
+
let e2;
|
|
39
|
+
if (Math.hypot(e3[0], e3[1]) < frame_constant_1.VERTICAL_MEMBER_TOLERANCE) {
|
|
40
|
+
e1 = [1, 0, 0];
|
|
41
|
+
e2 = cross(e3, e1);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
e2 = unit([-e3[2] * e3[0], -e3[2] * e3[1], 1 - e3[2] * e3[2]]); // Z − (Z·n)·n
|
|
45
|
+
e1 = cross(e2, e3);
|
|
46
|
+
}
|
|
47
|
+
if (angle !== 0) {
|
|
48
|
+
const c = Math.cos(angle);
|
|
49
|
+
const s = Math.sin(angle);
|
|
50
|
+
const r1 = [c * e1[0] + s * e2[0], c * e1[1] + s * e2[1], c * e1[2] + s * e2[2]];
|
|
51
|
+
const r2 = [-s * e1[0] + c * e2[0], -s * e1[1] + c * e2[1], -s * e1[2] + c * e2[2]];
|
|
52
|
+
e1 = r1;
|
|
53
|
+
e2 = r2;
|
|
54
|
+
}
|
|
55
|
+
const origin = [0, 1, 2].map((k) => (points[0][k] + points[1][k] + points[2][k] + points[3][k]) / 4);
|
|
56
|
+
const relative = points.map((p) => sub(p, origin));
|
|
57
|
+
return {
|
|
58
|
+
lambda: [e1, e2, e3],
|
|
59
|
+
origin,
|
|
60
|
+
corners: relative.map((r) => [dot(r, e1), dot(r, e2)]),
|
|
61
|
+
offsets: relative.map((r) => dot(r, e3)),
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
exports.shellAxes = shellAxes;
|
|
65
|
+
/**
|
|
66
|
+
* Whether four corners make a valid shell element: no repeated corner, a non-degenerate
|
|
67
|
+
* convex quadrilateral in order around it (det J > 0 at every corner of the bilinear map), and
|
|
68
|
+
* no corner farther than `SHELL_WARPING_LIMIT · √A` from the mean plane.
|
|
69
|
+
*/
|
|
70
|
+
const isValidShellQuad = (points) => {
|
|
71
|
+
const size = Math.max(...points.map((p, i) => {
|
|
72
|
+
const q = points[(i + 1) % 4];
|
|
73
|
+
return Math.hypot(q[0] - p[0], q[1] - p[1], q[2] - p[2]);
|
|
74
|
+
}));
|
|
75
|
+
const tolerance = frame_constant_1.AREA_GEOMETRY_TOLERANCE * size;
|
|
76
|
+
for (let i = 0; i < 4; i++) {
|
|
77
|
+
for (let j = i + 1; j < 4; j++) {
|
|
78
|
+
const [p, q] = [points[i], points[j]];
|
|
79
|
+
if (!(Math.hypot(q[0] - p[0], q[1] - p[1], q[2] - p[2]) > tolerance))
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const d1 = [0, 1, 2].map((k) => points[2][k] - points[0][k]);
|
|
84
|
+
const d2 = [0, 1, 2].map((k) => points[3][k] - points[1][k]);
|
|
85
|
+
const area = Math.hypot(d1[1] * d2[2] - d1[2] * d2[1], d1[2] * d2[0] - d1[0] * d2[2], d1[0] * d2[1] - d1[1] * d2[0]) / 2;
|
|
86
|
+
if (!(area > tolerance * size))
|
|
87
|
+
return false;
|
|
88
|
+
const axes = (0, exports.shellAxes)(points);
|
|
89
|
+
for (const [xi, eta] of [
|
|
90
|
+
[-1, -1],
|
|
91
|
+
[1, -1],
|
|
92
|
+
[1, 1],
|
|
93
|
+
[-1, 1],
|
|
94
|
+
]) {
|
|
95
|
+
if (!((0, quad_geometry_1.quadJacobian)(axes.corners, xi, eta).detJ > (frame_constant_1.AREA_GEOMETRY_TOLERANCE * area) / 4)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return Math.max(...axes.offsets.map(Math.abs)) <= frame_constant_1.SHELL_WARPING_LIMIT * Math.sqrt(area);
|
|
100
|
+
};
|
|
101
|
+
exports.isValidShellQuad = isValidShellQuad;
|
|
102
|
+
//# sourceMappingURL=shell-axes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-axes.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/shell/shell-axes.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,5 @@ export { beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, } from "./elemen
|
|
|
6
6
|
export { memberAxes } from "./transformation/coordinate-transform";
|
|
7
7
|
export { memberDemandEnvelope } from "./post/demand-envelope";
|
|
8
8
|
export type { MemberDemandEnvelope, DemandEnvelopeOptions } from "./post/demand-envelope";
|
|
9
|
-
export type { FrameId, FrameNode, DofRestraint, Restraint, DofRelease, MemberEndRelease, Member, NodalLoad, LoadDirection, UniformMemberLoad, PointMemberLoad, TrapezoidalMemberLoad, TorqueMemberLoad, MemberLoad, AreaDistribution, NullArea, AreaLoadDirection, AreaLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, FrameModel, } from "./types/model.type";
|
|
10
|
-
export type { NodalDisplacement, NodalReaction, MemberEndForce, MemberEndForces, ReleaseDeformation, MemberReleaseDeformations, AutoRestrainedDof, MemberStation, StationComponent, ExtremeValue, MemberDiagram, GoverningValue, GoverningExtremeValue, Bound, FrameCaseResult, FrameEnvelope, FrameResult, } from "./types/results.type";
|
|
9
|
+
export type { FrameId, FrameNode, DofRestraint, Restraint, LineRestraint, DofRelease, MemberEndRelease, Member, NodalLoad, LoadDirection, UniformMemberLoad, PointMemberLoad, TrapezoidalMemberLoad, TorqueMemberLoad, MemberLoad, AreaDistribution, NullArea, ShellType, ShellSection, ShellModifiers, ShellArea, ShellMesh, AreaLoadDirection, AreaLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, FrameModel, } from "./types/model.type";
|
|
10
|
+
export type { NodalDisplacement, NodalReaction, MemberEndForce, MemberEndForces, ReleaseDeformation, MemberReleaseDeformations, AutoRestrainedDof, MemberStation, StationComponent, ExtremeValue, MemberDiagram, ShellCornerForces, ShellForceComponent, ShellElementForces, FrameMesh, GoverningValue, GoverningExtremeValue, Bound, FrameCaseResult, FrameEnvelope, FrameResult, } from "./types/results.type";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Warnings } from "../../../core/types/output-message.type";
|
|
2
|
+
import type { FrameId, FrameModel, Member } from "../types/model.type";
|
|
3
|
+
import type { FrameMesh } from "../types/results.type";
|
|
4
|
+
import { type ShellElement } from "./mesh-shells";
|
|
5
|
+
/** A member with the generated mesh nodes lying inside it, where the solver splits it. */
|
|
6
|
+
export interface SplitMember extends Member {
|
|
7
|
+
/** Generated node ids strictly between its ends, in order from the start. */
|
|
8
|
+
through?: FrameId[];
|
|
9
|
+
}
|
|
10
|
+
/** The model the solver analyses: shells meshed, line restraints spread to their nodes. */
|
|
11
|
+
export interface ExpandedModel {
|
|
12
|
+
/**
|
|
13
|
+
* Nodes include the generated ones; `shells` are the elements; members list the generated
|
|
14
|
+
* nodes they pass through; restraints include the lines.
|
|
15
|
+
*/
|
|
16
|
+
model: FrameModel & {
|
|
17
|
+
shells: ShellElement[];
|
|
18
|
+
members: SplitMember[];
|
|
19
|
+
};
|
|
20
|
+
/** The shell mesh for the result; undefined without shells. */
|
|
21
|
+
mesh: FrameMesh | undefined;
|
|
22
|
+
warnings: Warnings;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Meshes a valid model's shell areas, spreads its line restraints and marks the members that
|
|
26
|
+
* generated nodes split (see `meshShells`).
|
|
27
|
+
* Without shells and line restraints the model is returned as it is.
|
|
28
|
+
*/
|
|
29
|
+
export declare const expandModel: (model: FrameModel) => ExpandedModel;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.expandModel = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
const shell_axes_1 = require("../elements/shell/shell-axes");
|
|
6
|
+
const mesh_shells_1 = require("./mesh-shells");
|
|
7
|
+
const DOF_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
8
|
+
/**
|
|
9
|
+
* Restraints of every node on each line restraint's segment (ends included), merged with the
|
|
10
|
+
* point restraints: a DOF fixed by either is fixed.
|
|
11
|
+
*/
|
|
12
|
+
const spreadLineRestraints = (model, nodes) => {
|
|
13
|
+
const lines = model.lineRestraints ?? [];
|
|
14
|
+
if (lines.length === 0)
|
|
15
|
+
return model.restraints;
|
|
16
|
+
const position = new Map(nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
|
|
17
|
+
const merged = new Map(model.restraints.map((r) => [r.nodeId, { ...r }]));
|
|
18
|
+
for (const line of lines) {
|
|
19
|
+
const [P, Q] = line.nodeIds.map((id) => position.get(id));
|
|
20
|
+
for (const node of nodes) {
|
|
21
|
+
const on = line.nodeIds.includes(node.id) ||
|
|
22
|
+
(0, mesh_shells_1.pointOnSegment)([node.x, node.y, node.z], P, Q, true) !== null;
|
|
23
|
+
if (!on)
|
|
24
|
+
continue;
|
|
25
|
+
const restraint = merged.get(node.id) ?? { nodeId: node.id };
|
|
26
|
+
for (const key of DOF_KEYS)
|
|
27
|
+
if (line[key] === true)
|
|
28
|
+
restraint[key] = true;
|
|
29
|
+
merged.set(node.id, restraint);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return [...merged.values()];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Warnings for member nodes lying inside a shell area but not on its mesh: such a node is not
|
|
36
|
+
* connected to the shell.
|
|
37
|
+
*/
|
|
38
|
+
const disconnectedNodes = (model, meshNodes) => {
|
|
39
|
+
const warnings = [];
|
|
40
|
+
const shells = model.shells ?? [];
|
|
41
|
+
const position = new Map(model.nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
|
|
42
|
+
const memberNodes = new Set(model.members.flatMap((m) => [m.startNodeId, m.endNodeId]));
|
|
43
|
+
for (const shell of shells) {
|
|
44
|
+
const points = shell.nodeIds.map((id) => position.get(id));
|
|
45
|
+
const axes = (0, shell_axes_1.shellAxes)(points);
|
|
46
|
+
const size = Math.max(...axes.corners.map(([x, y]) => Math.hypot(x, y)));
|
|
47
|
+
const tolerance = frame_constant_1.AREA_GEOMETRY_TOLERANCE * size;
|
|
48
|
+
for (const id of memberNodes) {
|
|
49
|
+
if (meshNodes.has(id))
|
|
50
|
+
continue;
|
|
51
|
+
const p = position.get(id);
|
|
52
|
+
const r = [p[0] - axes.origin[0], p[1] - axes.origin[1], p[2] - axes.origin[2]];
|
|
53
|
+
const [e1, e2, e3] = axes.lambda;
|
|
54
|
+
const z = r[0] * e3[0] + r[1] * e3[1] + r[2] * e3[2];
|
|
55
|
+
if (Math.abs(z) > Math.max(tolerance, ...axes.offsets.map(Math.abs)))
|
|
56
|
+
continue;
|
|
57
|
+
const x = r[0] * e1[0] + r[1] * e1[1] + r[2] * e1[2];
|
|
58
|
+
const y = r[0] * e2[0] + r[1] * e2[1] + r[2] * e2[2];
|
|
59
|
+
const inside = axes.corners.every(([ax, ay], k) => {
|
|
60
|
+
const [bx, by] = axes.corners[(k + 1) % 4];
|
|
61
|
+
return (bx - ax) * (y - ay) - (by - ay) * (x - ax) > tolerance * size;
|
|
62
|
+
});
|
|
63
|
+
if (inside) {
|
|
64
|
+
warnings.push({
|
|
65
|
+
reference: "Shell area meshing",
|
|
66
|
+
message: `Node "${String(id)}" lies inside shell area "${String(shell.id)}" but not on its mesh, so its members are not connected to the shell; divide the area through the node.`,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return warnings;
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* The generated nodes lying strictly inside each member (a beam along a meshed edge), so the
|
|
75
|
+
* member can be split there and share them with the shells.
|
|
76
|
+
*/
|
|
77
|
+
const splitMembers = (model, generated) => {
|
|
78
|
+
if (generated.length === 0)
|
|
79
|
+
return model.members;
|
|
80
|
+
const position = new Map(model.nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
|
|
81
|
+
return model.members.map((member) => {
|
|
82
|
+
const [P, Q] = [position.get(member.startNodeId), position.get(member.endNodeId)];
|
|
83
|
+
const lo = [0, 1, 2].map((k) => Math.min(P[k], Q[k]));
|
|
84
|
+
const hi = [0, 1, 2].map((k) => Math.max(P[k], Q[k]));
|
|
85
|
+
const slack = frame_constant_1.AREA_GEOMETRY_TOLERANCE * Math.hypot(Q[0] - P[0], Q[1] - P[1], Q[2] - P[2]);
|
|
86
|
+
const through = [];
|
|
87
|
+
for (const node of generated) {
|
|
88
|
+
const x = [node.x, node.y, node.z];
|
|
89
|
+
if (x.some((v, k) => v < lo[k] - slack || v > hi[k] + slack))
|
|
90
|
+
continue;
|
|
91
|
+
const t = (0, mesh_shells_1.pointOnSegment)(x, P, Q);
|
|
92
|
+
if (t !== null)
|
|
93
|
+
through.push({ id: node.id, t });
|
|
94
|
+
}
|
|
95
|
+
return through.length === 0
|
|
96
|
+
? member
|
|
97
|
+
: { ...member, through: through.sort((a, b) => a.t - b.t).map((h) => h.id) };
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Meshes a valid model's shell areas, spreads its line restraints and marks the members that
|
|
102
|
+
* generated nodes split (see `meshShells`).
|
|
103
|
+
* Without shells and line restraints the model is returned as it is.
|
|
104
|
+
*/
|
|
105
|
+
const expandModel = (model) => {
|
|
106
|
+
const shells = model.shells ?? [];
|
|
107
|
+
if (shells.length === 0) {
|
|
108
|
+
return {
|
|
109
|
+
model: { ...model, shells: [], restraints: spreadLineRestraints(model, model.nodes) },
|
|
110
|
+
mesh: undefined,
|
|
111
|
+
warnings: [],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const meshed = (0, mesh_shells_1.meshShells)(model.nodes, shells);
|
|
115
|
+
const nodes = [...model.nodes, ...meshed.nodes];
|
|
116
|
+
const meshNodes = new Set(meshed.elements.flatMap((e) => e.nodeIds));
|
|
117
|
+
return {
|
|
118
|
+
model: {
|
|
119
|
+
...model,
|
|
120
|
+
nodes,
|
|
121
|
+
members: splitMembers(model, meshed.nodes),
|
|
122
|
+
shells: meshed.elements,
|
|
123
|
+
restraints: spreadLineRestraints(model, nodes),
|
|
124
|
+
},
|
|
125
|
+
mesh: {
|
|
126
|
+
nodes: meshed.nodes,
|
|
127
|
+
shells: meshed.elements.map(({ id, areaId, nodeIds }) => ({ id, areaId, nodeIds })),
|
|
128
|
+
},
|
|
129
|
+
warnings: disconnectedNodes(model, meshNodes),
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
exports.expandModel = expandModel;
|
|
133
|
+
//# sourceMappingURL=expand-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expand-model.js","sourceRoot":"","sources":["../../../../src/fea/frame/mesh/expand-model.ts"],"names":[],"mappings":";;;AAAA,uEAA6E;AAG7E,6DAAoE;AAGpE,+CAA8E;AAE9E,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAoB/D;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAAC,KAAiB,EAAE,KAA0B,EAAe,EAAE;IAC1F,MAAM,KAAK,GAAG,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,UAAU,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,GAAG,CAAqB,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;QAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,GACN,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,IAAA,4BAAc,EAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;YAChE,IAAI,CAAC,EAAE;gBAAE,SAAS;YAClB,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;YAC7D,KAAK,MAAM,GAAG,IAAI,QAAQ;gBAAE,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI;oBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC1E,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAiB,EAAE,SAAuB,EAAY,EAAE;IACjF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAgB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACxF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAA,sBAAS,EAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,wCAAuB,GAAG,IAAI,CAAC;QACjD,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;YAC5B,MAAM,CAAC,GAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAAE,SAAS;YAC/E,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChD,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;YACxE,CAAC,CAAC,CAAC;YACH,IAAI,MAAM,EAAE,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;oBACZ,SAAS,EAAE,oBAAoB;oBAC/B,OAAO,EAAE,SAAS,MAAM,CAAC,EAAE,CAAC,6BAA6B,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,yGAAyG;iBACnL,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAE,SAAsB,EAAiB,EAAE;IAChF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAgB,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAClC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC,CAAC;QACpF,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,wCAAuB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAiC,EAAE,CAAC;QACjD,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;gBAAE,SAAS;YACvE,MAAM,CAAC,GAAG,IAAA,4BAAc,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC;YACzB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAiB,EAAE;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;YACrF,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,wBAAU,EAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,OAAO;QACL,KAAK,EAAE;YACL,GAAG,KAAK;YACR,KAAK;YACL,OAAO,EAAE,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;YAC1C,MAAM,EAAE,MAAM,CAAC,QAAQ;YACvB,UAAU,EAAE,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC;SAC/C;QACD,IAAI,EAAE;YACJ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;SACpF;QACD,QAAQ,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC;KAC9C,CAAC;AACJ,CAAC,CAAC;AA1BW,QAAA,WAAW,eA0BtB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Vec3 } from "../elements/shell/shell-axes";
|
|
2
|
+
import type { FrameId, FrameNode, ShellArea } from "../types/model.type";
|
|
3
|
+
/** A shell element of the analysed model: a shell area, or one element of its mesh. */
|
|
4
|
+
export interface ShellElement extends ShellArea {
|
|
5
|
+
/** The shell area it belongs to (its own id when the area is one element). */
|
|
6
|
+
areaId: FrameId;
|
|
7
|
+
}
|
|
8
|
+
/** The result of meshing a model's shell areas. */
|
|
9
|
+
export interface ShellMeshResult {
|
|
10
|
+
/** Generated nodes, in global coordinates (mm). */
|
|
11
|
+
nodes: FrameNode[];
|
|
12
|
+
/** Every shell element, area by area in model order. */
|
|
13
|
+
elements: ShellElement[];
|
|
14
|
+
/** Areas that could not be meshed (no conforming division counts, a bad generated element, or a generated id already in use). */
|
|
15
|
+
problems: FrameId[];
|
|
16
|
+
}
|
|
17
|
+
/** Parameter t ∈ (0, 1) of `x` on the segment p → q when it lies strictly inside it, else null. */
|
|
18
|
+
export declare const pointOnSegment: (x: Vec3, p: Vec3, q: Vec3, inclusive?: boolean) => number | null;
|
|
19
|
+
/**
|
|
20
|
+
* Meshes the shell areas of a model whose shells and nodes are valid.
|
|
21
|
+
*
|
|
22
|
+
* - Each area edge is cut into segments at the model nodes lying on it (hard points), so an
|
|
23
|
+
* edge shared whole by two areas, or partly where areas meet at a node (a T-junction), shares
|
|
24
|
+
* its segments.
|
|
25
|
+
* - Every segment gets a division count: at least 1, at least `length / maxSize` for an area
|
|
26
|
+
* with `mesh.maxSize`, and raised until in every area opposite edges add up to the same
|
|
27
|
+
* count (and at least `mesh.divisions`), adding each division where the elements are longest.
|
|
28
|
+
* - Segment nodes are evenly spaced; interior nodes come from transfinite interpolation of the
|
|
29
|
+
* four edges, so a planar area stays planar.
|
|
30
|
+
*
|
|
31
|
+
* An area that ends with 1 × 1 divisions is its own element, with its own id. Generated ids:
|
|
32
|
+
* `"<a>~<b>:<k>"` for the k-th node from model node a to b on a segment, `"<areaId>:<i>,<j>"`
|
|
33
|
+
* for interior nodes and for elements.
|
|
34
|
+
*
|
|
35
|
+
* @param nodes - Model nodes
|
|
36
|
+
* @param shells - Shell areas, each with 4 valid corner nodes
|
|
37
|
+
*/
|
|
38
|
+
export declare const meshShells: (nodes: FrameNode[], shells: ShellArea[]) => ShellMeshResult;
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.meshShells = exports.pointOnSegment = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
const shell_axes_1 = require("../elements/shell/shell-axes");
|
|
6
|
+
const sub = (p, q) => [p[0] - q[0], p[1] - q[1], p[2] - q[2]];
|
|
7
|
+
const dot = (p, q) => p[0] * q[0] + p[1] * q[1] + p[2] * q[2];
|
|
8
|
+
const lerp = (p, q, t) => [
|
|
9
|
+
p[0] + (q[0] - p[0]) * t,
|
|
10
|
+
p[1] + (q[1] - p[1]) * t,
|
|
11
|
+
p[2] + (q[2] - p[2]) * t,
|
|
12
|
+
];
|
|
13
|
+
/** A string that tells `1` and `"1"` apart, for ordering and map keys. */
|
|
14
|
+
const idKey = (id) => `${typeof id}:${String(id)}`;
|
|
15
|
+
/** Parameter t ∈ (0, 1) of `x` on the segment p → q when it lies strictly inside it, else null. */
|
|
16
|
+
const pointOnSegment = (x, p, q, inclusive = false) => {
|
|
17
|
+
const d = sub(q, p);
|
|
18
|
+
const L2 = dot(d, d);
|
|
19
|
+
if (!(L2 > 0))
|
|
20
|
+
return null;
|
|
21
|
+
const L = Math.sqrt(L2);
|
|
22
|
+
const tolerance = frame_constant_1.AREA_GEOMETRY_TOLERANCE * L;
|
|
23
|
+
const t = dot(sub(x, p), d) / L2;
|
|
24
|
+
const margin = inclusive ? -tolerance / L : tolerance / L;
|
|
25
|
+
if (t < margin || t > 1 - margin)
|
|
26
|
+
return null;
|
|
27
|
+
const off = sub(x, lerp(p, q, t));
|
|
28
|
+
return Math.hypot(off[0], off[1], off[2]) <= tolerance ? t : null;
|
|
29
|
+
};
|
|
30
|
+
exports.pointOnSegment = pointOnSegment;
|
|
31
|
+
/**
|
|
32
|
+
* Meshes the shell areas of a model whose shells and nodes are valid.
|
|
33
|
+
*
|
|
34
|
+
* - Each area edge is cut into segments at the model nodes lying on it (hard points), so an
|
|
35
|
+
* edge shared whole by two areas, or partly where areas meet at a node (a T-junction), shares
|
|
36
|
+
* its segments.
|
|
37
|
+
* - Every segment gets a division count: at least 1, at least `length / maxSize` for an area
|
|
38
|
+
* with `mesh.maxSize`, and raised until in every area opposite edges add up to the same
|
|
39
|
+
* count (and at least `mesh.divisions`), adding each division where the elements are longest.
|
|
40
|
+
* - Segment nodes are evenly spaced; interior nodes come from transfinite interpolation of the
|
|
41
|
+
* four edges, so a planar area stays planar.
|
|
42
|
+
*
|
|
43
|
+
* An area that ends with 1 × 1 divisions is its own element, with its own id. Generated ids:
|
|
44
|
+
* `"<a>~<b>:<k>"` for the k-th node from model node a to b on a segment, `"<areaId>:<i>,<j>"`
|
|
45
|
+
* for interior nodes and for elements.
|
|
46
|
+
*
|
|
47
|
+
* @param nodes - Model nodes
|
|
48
|
+
* @param shells - Shell areas, each with 4 valid corner nodes
|
|
49
|
+
*/
|
|
50
|
+
const meshShells = (nodes, shells) => {
|
|
51
|
+
const position = new Map(nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
|
|
52
|
+
const segments = new Map();
|
|
53
|
+
const segmentOf = (p, q) => {
|
|
54
|
+
const forward = idKey(p) < idKey(q);
|
|
55
|
+
const [a, b] = forward ? [p, q] : [q, p];
|
|
56
|
+
const key = `${idKey(a)}|${idKey(b)}`;
|
|
57
|
+
let segment = segments.get(key);
|
|
58
|
+
if (!segment) {
|
|
59
|
+
const d = sub(position.get(b), position.get(a));
|
|
60
|
+
segment = { a, b, length: Math.hypot(d[0], d[1], d[2]), count: 1 };
|
|
61
|
+
segments.set(key, segment);
|
|
62
|
+
}
|
|
63
|
+
return { segment, forward };
|
|
64
|
+
};
|
|
65
|
+
// ---- Edges cut at the model nodes lying on them -------------------------------------
|
|
66
|
+
const plans = shells.map((shell) => {
|
|
67
|
+
const corners = shell.nodeIds;
|
|
68
|
+
const edges = [0, 1, 2, 3].map((i) => {
|
|
69
|
+
const [p, q] = [corners[i], corners[(i + 1) % 4]];
|
|
70
|
+
const [P, Q] = [position.get(p), position.get(q)];
|
|
71
|
+
const inside = [];
|
|
72
|
+
for (const node of nodes) {
|
|
73
|
+
if (corners.includes(node.id))
|
|
74
|
+
continue;
|
|
75
|
+
const t = (0, exports.pointOnSegment)([node.x, node.y, node.z], P, Q);
|
|
76
|
+
if (t !== null)
|
|
77
|
+
inside.push({ id: node.id, t });
|
|
78
|
+
}
|
|
79
|
+
const chain = [p, ...inside.sort((x, y) => x.t - y.t).map((h) => h.id), q];
|
|
80
|
+
return chain.slice(1).map((id, k) => segmentOf(chain[k], id));
|
|
81
|
+
});
|
|
82
|
+
const d = shell.mesh?.divisions;
|
|
83
|
+
return { shell, edges, minimum: d ? [d[0], d[1]] : [1, 1] };
|
|
84
|
+
});
|
|
85
|
+
// ---- Division counts ---------------------------------------------------------------
|
|
86
|
+
for (const { shell, edges } of plans) {
|
|
87
|
+
const maxSize = shell.mesh?.maxSize;
|
|
88
|
+
if (maxSize === undefined)
|
|
89
|
+
continue;
|
|
90
|
+
for (const { segment } of edges.flat()) {
|
|
91
|
+
segment.count = Math.max(segment.count, Math.ceil(segment.length / maxSize - 1e-9));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const total = (edge) => edge.reduce((sum, { segment }) => sum + segment.count, 0);
|
|
95
|
+
const growTo = (edge, target) => {
|
|
96
|
+
while (total(edge) < target) {
|
|
97
|
+
// one more division where the elements are longest
|
|
98
|
+
const longest = edge.reduce((best, s) => s.segment.length / s.segment.count > best.segment.length / best.segment.count ? s : best);
|
|
99
|
+
longest.segment.count++;
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const balanced = () => plans.every(({ edges, minimum }) => total(edges[0]) === total(edges[2]) &&
|
|
103
|
+
total(edges[1]) === total(edges[3]) &&
|
|
104
|
+
total(edges[0]) >= minimum[0] &&
|
|
105
|
+
total(edges[1]) >= minimum[1]);
|
|
106
|
+
const maxPasses = 10 + 4 * plans.length;
|
|
107
|
+
for (let pass = 0; pass < maxPasses && !balanced(); pass++) {
|
|
108
|
+
for (const { edges, minimum } of plans) {
|
|
109
|
+
for (const [p, q, least] of [
|
|
110
|
+
[0, 2, minimum[0]],
|
|
111
|
+
[1, 3, minimum[1]],
|
|
112
|
+
]) {
|
|
113
|
+
const target = Math.max(total(edges[p]), total(edges[q]), least);
|
|
114
|
+
growTo(edges[p], target);
|
|
115
|
+
growTo(edges[q], target);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (!balanced()) {
|
|
120
|
+
return {
|
|
121
|
+
nodes: [],
|
|
122
|
+
elements: [],
|
|
123
|
+
problems: plans
|
|
124
|
+
.filter(({ edges }) => total(edges[0]) !== total(edges[2]) || total(edges[1]) !== total(edges[3]))
|
|
125
|
+
.map((p) => p.shell.id),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// ---- Nodes along segments ---------------------------------------------------------
|
|
129
|
+
const generated = [];
|
|
130
|
+
const generate = (id, at) => {
|
|
131
|
+
generated.push({ id, x: at[0], y: at[1], z: at[2] });
|
|
132
|
+
position.set(id, at);
|
|
133
|
+
};
|
|
134
|
+
for (const segment of segments.values()) {
|
|
135
|
+
const [A, B] = [position.get(segment.a), position.get(segment.b)];
|
|
136
|
+
segment.chain = [segment.a];
|
|
137
|
+
for (let k = 1; k < segment.count; k++) {
|
|
138
|
+
const id = `${String(segment.a)}~${String(segment.b)}:${k}`;
|
|
139
|
+
generate(id, lerp(A, B, k / segment.count));
|
|
140
|
+
segment.chain.push(id);
|
|
141
|
+
}
|
|
142
|
+
segment.chain.push(segment.b);
|
|
143
|
+
}
|
|
144
|
+
// ---- Areas ------------------------------------------------------------------------
|
|
145
|
+
const elements = [];
|
|
146
|
+
const problems = [];
|
|
147
|
+
for (const { shell, edges } of plans) {
|
|
148
|
+
// node ids along each edge, corner i → corner i + 1
|
|
149
|
+
const along = edges.map((edge) => edge.flatMap(({ segment, forward }, k) => {
|
|
150
|
+
const chain = forward ? segment.chain : [...segment.chain].reverse();
|
|
151
|
+
return k === 0 ? chain : chain.slice(1);
|
|
152
|
+
}));
|
|
153
|
+
const n1 = along[0].length - 1;
|
|
154
|
+
const n2 = along[1].length - 1;
|
|
155
|
+
const { mesh: _mesh, ...properties } = shell;
|
|
156
|
+
if (n1 === 1 && n2 === 1) {
|
|
157
|
+
elements.push({ ...properties, areaId: shell.id });
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const bottom = along[0];
|
|
161
|
+
const right = along[1];
|
|
162
|
+
const top = [...along[2]].reverse();
|
|
163
|
+
const left = [...along[3]].reverse();
|
|
164
|
+
const fractions = (ids) => {
|
|
165
|
+
const out = [0];
|
|
166
|
+
for (let k = 1; k < ids.length; k++) {
|
|
167
|
+
const d = sub(position.get(ids[k]), position.get(ids[k - 1]));
|
|
168
|
+
out.push(out[k - 1] + Math.hypot(d[0], d[1], d[2]));
|
|
169
|
+
}
|
|
170
|
+
return out.map((v) => v / out[out.length - 1]);
|
|
171
|
+
};
|
|
172
|
+
const [uB, uT, vL, vR] = [bottom, top, left, right].map(fractions);
|
|
173
|
+
const C = shell.nodeIds.map((id) => position.get(id));
|
|
174
|
+
const grid = [];
|
|
175
|
+
for (let i = 0; i <= n1; i++) {
|
|
176
|
+
grid.push([]);
|
|
177
|
+
for (let j = 0; j <= n2; j++) {
|
|
178
|
+
if (j === 0)
|
|
179
|
+
grid[i].push(bottom[i]);
|
|
180
|
+
else if (j === n2)
|
|
181
|
+
grid[i].push(top[i]);
|
|
182
|
+
else if (i === 0)
|
|
183
|
+
grid[i].push(left[j]);
|
|
184
|
+
else if (i === n1)
|
|
185
|
+
grid[i].push(right[j]);
|
|
186
|
+
else {
|
|
187
|
+
// transfinite (Coons) interpolation of the four edges
|
|
188
|
+
const v0 = (vL[j] + vR[j]) / 2;
|
|
189
|
+
const u0 = (uB[i] + uT[i]) / 2;
|
|
190
|
+
const u = (1 - v0) * uB[i] + v0 * uT[i];
|
|
191
|
+
const v = (1 - u0) * vL[j] + u0 * vR[j];
|
|
192
|
+
const [B, T, L, R] = [bottom[i], top[i], left[j], right[j]].map((id) => position.get(id));
|
|
193
|
+
const at = [0, 1, 2].map((k) => (1 - v) * B[k] +
|
|
194
|
+
v * T[k] +
|
|
195
|
+
(1 - u) * L[k] +
|
|
196
|
+
u * R[k] -
|
|
197
|
+
((1 - u) * (1 - v) * C[0][k] +
|
|
198
|
+
u * (1 - v) * C[1][k] +
|
|
199
|
+
u * v * C[2][k] +
|
|
200
|
+
(1 - u) * v * C[3][k]));
|
|
201
|
+
const id = `${String(shell.id)}:${i},${j}`;
|
|
202
|
+
generate(id, at);
|
|
203
|
+
grid[i].push(id);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
let ok = true;
|
|
208
|
+
for (let j = 0; j < n2; j++) {
|
|
209
|
+
for (let i = 0; i < n1; i++) {
|
|
210
|
+
const nodeIds = [grid[i][j], grid[i + 1][j], grid[i + 1][j + 1], grid[i][j + 1]];
|
|
211
|
+
if (!(0, shell_axes_1.isValidShellQuad)(nodeIds.map((id) => position.get(id))))
|
|
212
|
+
ok = false;
|
|
213
|
+
elements.push({
|
|
214
|
+
...properties,
|
|
215
|
+
id: `${String(shell.id)}:${i},${j}`,
|
|
216
|
+
nodeIds,
|
|
217
|
+
areaId: shell.id,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (!ok)
|
|
222
|
+
problems.push(shell.id);
|
|
223
|
+
}
|
|
224
|
+
// ---- Generated ids must be new ----------------------------------------------------
|
|
225
|
+
const taken = new Set(nodes.map((n) => idKey(n.id)));
|
|
226
|
+
for (const node of generated) {
|
|
227
|
+
if (taken.has(idKey(node.id))) {
|
|
228
|
+
const owner = elements.find((e) => e.nodeIds.includes(node.id));
|
|
229
|
+
if (owner && !problems.includes(owner.areaId))
|
|
230
|
+
problems.push(owner.areaId);
|
|
231
|
+
}
|
|
232
|
+
taken.add(idKey(node.id));
|
|
233
|
+
}
|
|
234
|
+
const shellIds = new Set();
|
|
235
|
+
for (const element of elements) {
|
|
236
|
+
const key = idKey(element.id);
|
|
237
|
+
if (shellIds.has(key) && !problems.includes(element.areaId))
|
|
238
|
+
problems.push(element.areaId);
|
|
239
|
+
shellIds.add(key);
|
|
240
|
+
}
|
|
241
|
+
return { nodes: generated, elements, problems };
|
|
242
|
+
};
|
|
243
|
+
exports.meshShells = meshShells;
|
|
244
|
+
//# sourceMappingURL=mesh-shells.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mesh-shells.js","sourceRoot":"","sources":["../../../../src/fea/frame/mesh/mesh-shells.ts"],"names":[],"mappings":"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"}
|