@theerapat-s28/ts-structural-eng-tools 3.2.0 → 3.4.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 +33 -1
- package/README.md +77 -18
- package/dist/core/constants/fea.constant.d.ts +21 -0
- package/dist/core/constants/fea.constant.js +26 -0
- package/dist/core/constants/fea.constant.js.map +1 -0
- package/dist/core/constants/frame.constant.d.ts +6 -32
- package/dist/core/constants/frame.constant.js +8 -33
- package/dist/core/constants/frame.constant.js.map +1 -1
- package/dist/core/constants/rc.constant.d.ts +8 -0
- package/dist/core/constants/rc.constant.js +10 -1
- package/dist/core/constants/rc.constant.js.map +1 -1
- package/dist/core/constants/shell.constant.d.ts +23 -0
- package/dist/core/constants/shell.constant.js +28 -0
- package/dist/core/constants/shell.constant.js.map +1 -0
- package/dist/core/errors/fea.error.d.ts +5 -0
- package/dist/core/errors/fea.error.js +9 -1
- package/dist/core/errors/fea.error.js.map +1 -1
- package/dist/core/index.d.ts +4 -2
- package/dist/core/index.js +18 -10
- package/dist/core/index.js.map +1 -1
- package/dist/esm/core/constants/fea.constant.js +23 -0
- package/dist/esm/core/constants/fea.constant.js.map +1 -0
- package/dist/esm/core/constants/frame.constant.js +7 -32
- package/dist/esm/core/constants/frame.constant.js.map +1 -1
- package/dist/esm/core/constants/rc.constant.js +9 -0
- package/dist/esm/core/constants/rc.constant.js.map +1 -1
- package/dist/esm/core/constants/shell.constant.js +25 -0
- package/dist/esm/core/constants/shell.constant.js.map +1 -0
- package/dist/esm/core/errors/fea.error.js +9 -1
- package/dist/esm/core/errors/fea.error.js.map +1 -1
- package/dist/esm/core/index.js +4 -2
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/fea/analysis/index.js +1 -0
- package/dist/esm/fea/analysis/index.js.map +1 -1
- package/dist/esm/fea/analysis/mesh/expand-model.js +27 -44
- package/dist/esm/fea/analysis/mesh/expand-model.js.map +1 -1
- package/dist/esm/fea/analysis/mesh/member-connectivity.js +67 -0
- package/dist/esm/fea/analysis/mesh/member-connectivity.js.map +1 -0
- package/dist/esm/fea/analysis/post/envelope.js +70 -0
- package/dist/esm/fea/analysis/post/envelope.js.map +1 -1
- package/dist/esm/fea/analysis/post/present-state.js +11 -4
- package/dist/esm/fea/analysis/post/present-state.js.map +1 -1
- package/dist/esm/fea/analysis/post/wall-forces.js +299 -0
- package/dist/esm/fea/analysis/post/wall-forces.js.map +1 -0
- package/dist/esm/fea/analysis/post/wall-geometry.js +173 -0
- package/dist/esm/fea/analysis/post/wall-geometry.js.map +1 -0
- package/dist/esm/fea/analysis/solver/analysis-system.js +1 -1
- package/dist/esm/fea/analysis/solver/analysis-system.js.map +1 -1
- package/dist/esm/fea/analysis/solver/analyze.js +21 -5
- package/dist/esm/fea/analysis/solver/analyze.js.map +1 -1
- package/dist/esm/fea/analysis/solver/load-case-solver.js +4 -3
- package/dist/esm/fea/analysis/solver/load-case-solver.js.map +1 -1
- package/dist/esm/fea/analysis/validation/validate-model.js +20 -2
- package/dist/esm/fea/analysis/validation/validate-model.js.map +1 -1
- package/dist/esm/fea/analysis/validation/validate-walls.js +226 -0
- package/dist/esm/fea/analysis/validation/validate-walls.js.map +1 -0
- package/dist/esm/fea/frame/area/area-geometry.js +1 -1
- package/dist/esm/fea/frame/area/area-geometry.js.map +1 -1
- package/dist/esm/fea/frame/area/area-member-loads.js +1 -1
- package/dist/esm/fea/frame/area/area-member-loads.js.map +1 -1
- package/dist/esm/fea/frame/area/edge-members.js +1 -1
- package/dist/esm/fea/frame/area/edge-members.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js +16 -4
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/solver/nodes-along-members.js +73 -0
- package/dist/esm/fea/frame/solver/nodes-along-members.js.map +1 -0
- package/dist/esm/fea/frame/solver/system-member.js +4 -4
- package/dist/esm/fea/frame/solver/system-member.js.map +1 -1
- package/dist/esm/fea/frame/transformation/coordinate-transform.js +1 -1
- package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-members.js +6 -2
- package/dist/esm/fea/frame/validation/validate-members.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-null-areas.js +1 -1
- package/dist/esm/fea/frame/validation/validate-null-areas.js.map +1 -1
- package/dist/esm/fea/shared/solver/auto-restraint.js +1 -1
- package/dist/esm/fea/shared/solver/auto-restraint.js.map +1 -1
- package/dist/esm/fea/shared/validation/issues.js +8 -0
- package/dist/esm/fea/shared/validation/issues.js.map +1 -1
- package/dist/esm/fea/shell/elements/membrane-quad.js +1 -1
- package/dist/esm/fea/shell/elements/shell-axes.js +2 -1
- package/dist/esm/fea/shell/elements/shell-axes.js.map +1 -1
- package/dist/esm/fea/shell/mesh/mesh-shells.js +1 -1
- package/dist/esm/fea/shell/mesh/mesh-shells.js.map +1 -1
- package/dist/esm/fea/shell/post/strip-forces.js +341 -0
- package/dist/esm/fea/shell/post/strip-forces.js.map +1 -0
- package/dist/esm/fea/shell/solver/shell-loads.js +3 -0
- package/dist/esm/fea/shell/solver/shell-loads.js.map +1 -1
- package/dist/esm/fea/shell/validation/validate-shells.js +9 -2
- package/dist/esm/fea/shell/validation/validate-shells.js.map +1 -1
- package/dist/esm/fea/shell/validation/validate-strips.js +99 -0
- package/dist/esm/fea/shell/validation/validate-strips.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/rc/rc-section-properties.js +1 -1
- package/dist/esm/rc/rc-section-properties.js.map +1 -1
- package/dist/fea/analysis/index.d.ts +4 -2
- package/dist/fea/analysis/index.js +3 -1
- package/dist/fea/analysis/index.js.map +1 -1
- package/dist/fea/analysis/mesh/expand-model.d.ts +10 -7
- package/dist/fea/analysis/mesh/expand-model.js +28 -45
- package/dist/fea/analysis/mesh/expand-model.js.map +1 -1
- package/dist/fea/analysis/mesh/member-connectivity.d.ts +43 -0
- package/dist/fea/analysis/mesh/member-connectivity.js +72 -0
- package/dist/fea/analysis/mesh/member-connectivity.js.map +1 -0
- package/dist/fea/analysis/post/envelope.js +70 -0
- package/dist/fea/analysis/post/envelope.js.map +1 -1
- package/dist/fea/analysis/post/present-state.d.ts +8 -1
- package/dist/fea/analysis/post/present-state.js +12 -5
- package/dist/fea/analysis/post/present-state.js.map +1 -1
- package/dist/fea/analysis/post/wall-forces.d.ts +65 -0
- package/dist/fea/analysis/post/wall-forces.js +305 -0
- package/dist/fea/analysis/post/wall-forces.js.map +1 -0
- package/dist/fea/analysis/post/wall-geometry.d.ts +73 -0
- package/dist/fea/analysis/post/wall-geometry.js +188 -0
- package/dist/fea/analysis/post/wall-geometry.js.map +1 -0
- package/dist/fea/analysis/solver/analysis-system.d.ts +1 -1
- package/dist/fea/analysis/solver/analysis-system.js +2 -2
- package/dist/fea/analysis/solver/analysis-system.js.map +1 -1
- package/dist/fea/analysis/solver/analyze.d.ts +12 -3
- package/dist/fea/analysis/solver/analyze.js +21 -5
- package/dist/fea/analysis/solver/analyze.js.map +1 -1
- package/dist/fea/analysis/solver/load-case-solver.d.ts +1 -0
- package/dist/fea/analysis/solver/load-case-solver.js +5 -4
- package/dist/fea/analysis/solver/load-case-solver.js.map +1 -1
- package/dist/fea/analysis/types/model.type.d.ts +58 -1
- package/dist/fea/analysis/types/results.type.d.ts +136 -2
- package/dist/fea/analysis/validation/validate-model.d.ts +1 -1
- package/dist/fea/analysis/validation/validate-model.js +20 -2
- package/dist/fea/analysis/validation/validate-model.js.map +1 -1
- package/dist/fea/analysis/validation/validate-walls.d.ts +35 -0
- package/dist/fea/analysis/validation/validate-walls.js +230 -0
- package/dist/fea/analysis/validation/validate-walls.js.map +1 -0
- package/dist/fea/frame/area/area-geometry.js +5 -5
- package/dist/fea/frame/area/area-geometry.js.map +1 -1
- package/dist/fea/frame/area/area-member-loads.js +7 -7
- package/dist/fea/frame/area/area-member-loads.js.map +1 -1
- package/dist/fea/frame/area/edge-members.js +2 -2
- package/dist/fea/frame/area/edge-members.js.map +1 -1
- package/dist/fea/frame/index.d.ts +1 -1
- package/dist/fea/frame/post/member-diagram.d.ts +14 -5
- package/dist/fea/frame/post/member-diagram.js +18 -5
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/solver/nodes-along-members.d.ts +31 -0
- package/dist/fea/frame/solver/nodes-along-members.js +77 -0
- package/dist/fea/frame/solver/nodes-along-members.js.map +1 -0
- package/dist/fea/frame/solver/system-member.d.ts +6 -5
- package/dist/fea/frame/solver/system-member.js +4 -4
- package/dist/fea/frame/solver/system-member.js.map +1 -1
- package/dist/fea/frame/transformation/coordinate-transform.js +2 -2
- package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +6 -0
- package/dist/fea/frame/types/results.type.d.ts +20 -0
- package/dist/fea/frame/validation/validate-members.d.ts +2 -2
- package/dist/fea/frame/validation/validate-members.js +6 -2
- package/dist/fea/frame/validation/validate-members.js.map +1 -1
- package/dist/fea/frame/validation/validate-null-areas.js +2 -2
- package/dist/fea/frame/validation/validate-null-areas.js.map +1 -1
- package/dist/fea/shared/solver/auto-restraint.js +3 -3
- package/dist/fea/shared/solver/auto-restraint.js.map +1 -1
- package/dist/fea/shared/validation/issues.js +8 -0
- package/dist/fea/shared/validation/issues.js.map +1 -1
- package/dist/fea/shell/elements/membrane-quad.js +2 -2
- package/dist/fea/shell/elements/shell-axes.js +6 -5
- package/dist/fea/shell/elements/shell-axes.js.map +1 -1
- package/dist/fea/shell/index.d.ts +2 -2
- package/dist/fea/shell/mesh/mesh-shells.js +2 -2
- package/dist/fea/shell/mesh/mesh-shells.js.map +1 -1
- package/dist/fea/shell/post/strip-forces.d.ts +69 -0
- package/dist/fea/shell/post/strip-forces.js +349 -0
- package/dist/fea/shell/post/strip-forces.js.map +1 -0
- package/dist/fea/shell/solver/shell-loads.d.ts +3 -1
- package/dist/fea/shell/solver/shell-loads.js +3 -0
- package/dist/fea/shell/solver/shell-loads.js.map +1 -1
- package/dist/fea/shell/types/model.type.d.ts +31 -0
- package/dist/fea/shell/types/results.type.d.ts +54 -0
- package/dist/fea/shell/validation/validate-shells.d.ts +7 -2
- package/dist/fea/shell/validation/validate-shells.js +9 -2
- package/dist/fea/shell/validation/validate-shells.js.map +1 -1
- package/dist/fea/shell/validation/validate-strips.d.ts +11 -0
- package/dist/fea/shell/validation/validate-strips.js +103 -0
- package/dist/fea/shell/validation/validate-strips.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/rc/rc-section-properties.js +4 -4
- package/dist/rc/rc-section-properties.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.reachesCut = exports.areasAcrossCut = exports.fromNegativeSide = exports.wallCutPositions = exports.wallTolerance = exports.wallExtent = exports.wallAxes = exports.horizontalInPlane = exports.polygonNormal = exports.cross = exports.dot = exports.sub = void 0;
|
|
4
|
+
const fea_constant_1 = require("../../../core/constants/fea.constant");
|
|
5
|
+
const sub = (p, q) => [p[0] - q[0], p[1] - q[1], p[2] - q[2]];
|
|
6
|
+
exports.sub = sub;
|
|
7
|
+
const dot = (p, q) => p[0] * q[0] + p[1] * q[1] + p[2] * q[2];
|
|
8
|
+
exports.dot = dot;
|
|
9
|
+
const cross = (p, q) => [
|
|
10
|
+
p[1] * q[2] - p[2] * q[1],
|
|
11
|
+
p[2] * q[0] - p[0] * q[2],
|
|
12
|
+
p[0] * q[1] - p[1] * q[0],
|
|
13
|
+
];
|
|
14
|
+
exports.cross = cross;
|
|
15
|
+
const norm = (p) => Math.hypot(p[0], p[1], p[2]);
|
|
16
|
+
const unit = (p) => {
|
|
17
|
+
const n = norm(p);
|
|
18
|
+
return n > 0 ? [p[0] / n, p[1] / n, p[2] / n] : [0, 0, 0];
|
|
19
|
+
};
|
|
20
|
+
/** Unit normal of a polygon by Newell's method (zero for a degenerate polygon). */
|
|
21
|
+
const polygonNormal = (points) => {
|
|
22
|
+
const n = [0, 0, 0];
|
|
23
|
+
points.forEach((p, i) => {
|
|
24
|
+
const q = points[(i + 1) % points.length];
|
|
25
|
+
n[0] += (p[1] - q[1]) * (p[2] + q[2]);
|
|
26
|
+
n[1] += (p[2] - q[2]) * (p[0] + q[0]);
|
|
27
|
+
n[2] += (p[0] - q[0]) * (p[1] + q[1]);
|
|
28
|
+
});
|
|
29
|
+
return unit(n);
|
|
30
|
+
};
|
|
31
|
+
exports.polygonNormal = polygonNormal;
|
|
32
|
+
/** The horizontal direction in a vertical plane of normal `n`, toward +X (+Y if along Y). */
|
|
33
|
+
const horizontalInPlane = (n) => {
|
|
34
|
+
const d = unit([-n[1], n[0], 0]);
|
|
35
|
+
const flip = Math.abs(d[0]) > fea_constant_1.VERTICAL_MEMBER_TOLERANCE ? d[0] < 0 : d[1] < 0;
|
|
36
|
+
return flip ? [-d[0], -d[1], -d[2]] : d;
|
|
37
|
+
};
|
|
38
|
+
exports.horizontalInPlane = horizontalInPlane;
|
|
39
|
+
/**
|
|
40
|
+
* Axes of a pier or spandrel (see `WallPier`, `WallSpandrel`).
|
|
41
|
+
*
|
|
42
|
+
* - Pier: 1 = +Z; 2 = global X rotated by `angle` about +Z, else the horizontal direction of
|
|
43
|
+
* the area with the largest horizontal extent (the first wins a tie), else global X; 3 = 1 × 2.
|
|
44
|
+
* - Spandrel: 1 = horizontal in the plane of its first area, toward +X (+Y for a plane parallel
|
|
45
|
+
* to Y), reversed by `reverse`; 2 = +Z; 3 = 1 × 2.
|
|
46
|
+
*/
|
|
47
|
+
const wallAxes = (kind, shape, options) => {
|
|
48
|
+
const up = [0, 0, 1];
|
|
49
|
+
if (kind === "pier") {
|
|
50
|
+
let e2 = [1, 0, 0];
|
|
51
|
+
if (options.angle !== undefined) {
|
|
52
|
+
e2 = [Math.cos(options.angle), Math.sin(options.angle), 0];
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
let best = 0;
|
|
56
|
+
for (const area of shape.areas) {
|
|
57
|
+
if (area.elements.length === 0)
|
|
58
|
+
continue;
|
|
59
|
+
const d = (0, exports.horizontalInPlane)((0, exports.polygonNormal)(area.elements[0]));
|
|
60
|
+
const s = area.elements.flat().map((p) => (0, exports.dot)(p, d));
|
|
61
|
+
const extent = Math.max(...s) - Math.min(...s);
|
|
62
|
+
if (extent > best) {
|
|
63
|
+
best = extent;
|
|
64
|
+
e2 = d;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return [up, e2, (0, exports.cross)(up, e2)];
|
|
69
|
+
}
|
|
70
|
+
const first = shape.areas.find((a) => a.elements.length > 0);
|
|
71
|
+
let e1 = first ? (0, exports.horizontalInPlane)((0, exports.polygonNormal)(first.elements[0])) : [1, 0, 0];
|
|
72
|
+
if (options.reverse)
|
|
73
|
+
e1 = [-e1[0], -e1[1], -e1[2]];
|
|
74
|
+
return [e1, up, (0, exports.cross)(e1, up)];
|
|
75
|
+
};
|
|
76
|
+
exports.wallAxes = wallAxes;
|
|
77
|
+
/** Smallest and largest coordinate along `e1` of every element corner and member end. */
|
|
78
|
+
const wallExtent = (shape, e1) => {
|
|
79
|
+
const s = [
|
|
80
|
+
...shape.areas.flatMap((a) => a.elements.flat()),
|
|
81
|
+
...shape.members.flatMap((m) => m.pieces.flat()),
|
|
82
|
+
].map((p) => (0, exports.dot)(p, e1));
|
|
83
|
+
return { min: Math.min(...s), max: Math.max(...s) };
|
|
84
|
+
};
|
|
85
|
+
exports.wallExtent = wallExtent;
|
|
86
|
+
/** The distance within which a point counts as on a cut (see `WALL_CUT_TOLERANCE`). */
|
|
87
|
+
const wallTolerance = (extent) => fea_constant_1.WALL_CUT_TOLERANCE * Math.max(extent.max - extent.min, 1);
|
|
88
|
+
exports.wallTolerance = wallTolerance;
|
|
89
|
+
const range = (points, e1) => {
|
|
90
|
+
const s = points.map((p) => (0, exports.dot)(p, e1));
|
|
91
|
+
return { min: Math.min(...s), max: Math.max(...s) };
|
|
92
|
+
};
|
|
93
|
+
/** Whether anything of the shape lies on the negative / positive side touching the cut at s. */
|
|
94
|
+
const touching = (shape, e1, s, tol) => {
|
|
95
|
+
let negative = false;
|
|
96
|
+
let positive = false;
|
|
97
|
+
const check = (points) => {
|
|
98
|
+
const r = range(points, e1);
|
|
99
|
+
if (r.max - r.min <= tol)
|
|
100
|
+
return; // lies in the cut plane
|
|
101
|
+
if (Math.abs(r.max - s) <= tol)
|
|
102
|
+
negative = true;
|
|
103
|
+
if (Math.abs(r.min - s) <= tol)
|
|
104
|
+
positive = true;
|
|
105
|
+
};
|
|
106
|
+
shape.areas.forEach((a) => a.elements.forEach(check));
|
|
107
|
+
shape.members.forEach((m) => m.pieces.forEach(check));
|
|
108
|
+
return { negative, positive };
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* The cuts of a pier or spandrel, in order along axis 1.
|
|
112
|
+
*
|
|
113
|
+
* - Pier: at each elevation where one of its areas or members starts or ends, a `"top"` cut
|
|
114
|
+
* when something of the pier ends there from below and a `"bottom"` cut when something starts
|
|
115
|
+
* there going up (the top first); then each extra cut not at such an elevation, as `"cut"`.
|
|
116
|
+
* - Spandrel: `"left"` at its smallest coordinate, `"right"` at its largest, and each extra cut
|
|
117
|
+
* strictly between them as `"cut"`.
|
|
118
|
+
*
|
|
119
|
+
* @param extra - The extra cuts as coordinates along axis 1 (mm)
|
|
120
|
+
*/
|
|
121
|
+
const wallCutPositions = (kind, shape, e1, extra = []) => {
|
|
122
|
+
const extent = (0, exports.wallExtent)(shape, e1);
|
|
123
|
+
const tol = (0, exports.wallTolerance)(extent);
|
|
124
|
+
const auto = [];
|
|
125
|
+
const addAuto = (s) => {
|
|
126
|
+
if (!auto.some((a) => Math.abs(a - s) <= tol))
|
|
127
|
+
auto.push(s);
|
|
128
|
+
};
|
|
129
|
+
if (kind === "pier") {
|
|
130
|
+
for (const area of shape.areas) {
|
|
131
|
+
if (area.elements.length === 0)
|
|
132
|
+
continue;
|
|
133
|
+
const r = range(area.elements.flat(), e1);
|
|
134
|
+
addAuto(r.min);
|
|
135
|
+
addAuto(r.max);
|
|
136
|
+
}
|
|
137
|
+
for (const member of shape.members) {
|
|
138
|
+
const r = range(member.pieces.flat(), e1);
|
|
139
|
+
addAuto(r.min);
|
|
140
|
+
addAuto(r.max);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
addAuto(extent.min);
|
|
145
|
+
addAuto(extent.max);
|
|
146
|
+
}
|
|
147
|
+
auto.sort((a, b) => a - b);
|
|
148
|
+
const cuts = [];
|
|
149
|
+
for (const s of auto) {
|
|
150
|
+
if (kind === "spandrel") {
|
|
151
|
+
cuts.push({ s, face: s === extent.min ? "left" : "right" });
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const side = touching(shape, e1, s, tol);
|
|
155
|
+
if (side.negative)
|
|
156
|
+
cuts.push({ s, face: "top" });
|
|
157
|
+
if (side.positive)
|
|
158
|
+
cuts.push({ s, face: "bottom" });
|
|
159
|
+
}
|
|
160
|
+
extra.forEach((s, cut) => {
|
|
161
|
+
if (auto.some((a) => Math.abs(a - s) <= tol))
|
|
162
|
+
return;
|
|
163
|
+
if (cuts.some((c) => c.face === "cut" && Math.abs(c.s - s) <= tol))
|
|
164
|
+
return;
|
|
165
|
+
cuts.push({ s, face: "cut", cut });
|
|
166
|
+
});
|
|
167
|
+
// stable: a "top" stays before the "bottom" at the same level
|
|
168
|
+
return cuts.sort((a, b) => a.s - b.s);
|
|
169
|
+
};
|
|
170
|
+
exports.wallCutPositions = wallCutPositions;
|
|
171
|
+
/** Whether a face takes the elements on the negative side of its cut (below, or to the left). */
|
|
172
|
+
const fromNegativeSide = (face) => face === "top" || face === "right" || face === "cut";
|
|
173
|
+
exports.fromNegativeSide = fromNegativeSide;
|
|
174
|
+
/** Areas with a shell element on both sides of the cut at s (no mesh line there). */
|
|
175
|
+
const areasAcrossCut = (shape, e1, s, tol) => shape.areas
|
|
176
|
+
.filter((a) => a.elements.some((el) => {
|
|
177
|
+
const r = range(el, e1);
|
|
178
|
+
return r.min < s - tol && r.max > s + tol;
|
|
179
|
+
}))
|
|
180
|
+
.map((a) => a.areaId);
|
|
181
|
+
exports.areasAcrossCut = areasAcrossCut;
|
|
182
|
+
/** Whether some element or member of the shape reaches the cut at s. */
|
|
183
|
+
const reachesCut = (shape, e1, s, tol) => [...shape.areas.flatMap((a) => a.elements), ...shape.members.flatMap((m) => m.pieces)].some((points) => {
|
|
184
|
+
const r = range(points, e1);
|
|
185
|
+
return r.min <= s + tol && r.max >= s - tol;
|
|
186
|
+
});
|
|
187
|
+
exports.reachesCut = reachesCut;
|
|
188
|
+
//# sourceMappingURL=wall-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wall-geometry.js","sourceRoot":"","sources":["../../../../src/fea/analysis/post/wall-geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ export interface AnalysisSystem {
|
|
|
13
13
|
memberIndex: Map<FeaId, number>;
|
|
14
14
|
/** Model members, in model order. */
|
|
15
15
|
memberGroups: MemberGroup[];
|
|
16
|
-
/** The pieces that are assembled: one per member unless
|
|
16
|
+
/** The pieces that are assembled: one per member unless nodes inside it split it. */
|
|
17
17
|
members: SystemMember[];
|
|
18
18
|
shellIndex: Map<FeaId, number>;
|
|
19
19
|
/** Element indices of each shell area. */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.prepareAnalysisSystem = void 0;
|
|
4
|
-
const
|
|
4
|
+
const fea_constant_1 = require("../../../core/constants/fea.constant");
|
|
5
5
|
const fea_error_1 = require("../../../core/errors/fea.error");
|
|
6
6
|
const member_assembly_1 = require("../../frame/solver/member-assembly");
|
|
7
7
|
const system_member_1 = require("../../frame/solver/system-member");
|
|
@@ -144,7 +144,7 @@ const prepareAnalysisSystem = (model) => {
|
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
|
-
const result = (0, skyline_1.skylineFactor)(K,
|
|
147
|
+
const result = (0, skyline_1.skylineFactor)(K, fea_constant_1.SINGULARITY_TOLERANCE);
|
|
148
148
|
if (!result.ok) {
|
|
149
149
|
const dof = free[result.failedPivot];
|
|
150
150
|
(0, issues_1.throwIssues)([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-system.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/analysis-system.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"analysis-system.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/analysis-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ export interface Analysis {
|
|
|
37
37
|
* case, null areas, and combinations
|
|
38
38
|
* @param options - Diagram station count and detail
|
|
39
39
|
* @returns `{ result, memberDiagram }`
|
|
40
|
-
* @throws {FeaError} 301–317, 326 and
|
|
40
|
+
* @throws {FeaError} 301–317, 326, 327 and 329–331 for an invalid model (with `details` and
|
|
41
41
|
* every problem in `issues`), 328 for a translation nothing resists at a node connected only
|
|
42
42
|
* to shells, 304 for an unstable structure
|
|
43
43
|
*/
|
|
@@ -58,10 +58,19 @@ export declare const createAnalysis: (model: FeaModel, options?: AnalyzeOptions)
|
|
|
58
58
|
* and rad. Global axes X, Y, Z are right-handed with Z up; members use ETABS-style local axes
|
|
59
59
|
* 1, 2, 3 (see `memberAxes`). Member end forces and diagrams use right-hand rotations.
|
|
60
60
|
*
|
|
61
|
+
* A member is connected to every model node lying on it between its ends, as if it were split
|
|
62
|
+
* there, unless it sets `connectIntermediateNodes: false`; it is still reported as one member.
|
|
63
|
+
* The connections are listed in `calculationDetails.intermediateNodes`; a node close to a
|
|
64
|
+
* member but not on it is not connected, and is listed in `calculationDetails.nearMissNodes`
|
|
65
|
+
* with a warning. `memberConnectivity` makes the same check without analysing.
|
|
66
|
+
*
|
|
61
67
|
* Area loads on null areas (`areas`, `areaLoads`) are first turned into member loads on the
|
|
62
68
|
* members along each area's edges (see `distributeAreaLoads`); the areas add no stiffness.
|
|
63
69
|
* Shell areas (`shells`) are four-node flat shell elements with their own stiffness; area loads
|
|
64
|
-
* and self-weight on them act as forces at their corners.
|
|
70
|
+
* and self-weight on them act as forces at their corners. Strips (`strips`) integrate the shell
|
|
71
|
+
* forces across cuts at stations along them (`stripForces`), for strip design of slabs.
|
|
72
|
+
* Piers and spandrels (`piers`, `spandrels`) sum the nodal forces of their shell elements and
|
|
73
|
+
* members on cuts across them (`pierForces`, `spandrelForces`), for wall design.
|
|
65
74
|
*
|
|
66
75
|
* Model and result are plain data (JSON-serialisable), so the analysis can run in a Web Worker.
|
|
67
76
|
*
|
|
@@ -70,7 +79,7 @@ export declare const createAnalysis: (model: FeaModel, options?: AnalyzeOptions)
|
|
|
70
79
|
* @param options - Diagram station count and detail
|
|
71
80
|
* @returns `cases` and `combinations` keyed by id, `envelope` over the combinations,
|
|
72
81
|
* `calculationDetails`, `units` and `warnings`
|
|
73
|
-
* @throws {FeaError} 301–317, 326 and
|
|
82
|
+
* @throws {FeaError} 301–317, 326, 327 and 329–331 for an invalid model (with `details` and
|
|
74
83
|
* every problem in `issues`), 328 for a translation nothing resists at a node connected only
|
|
75
84
|
* to shells, 304 for an unstable structure
|
|
76
85
|
*/
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.analyze = exports.createAnalysis = void 0;
|
|
4
4
|
const area_member_loads_1 = require("../../frame/area/area-member-loads");
|
|
5
|
+
const strip_forces_1 = require("../../shell/post/strip-forces");
|
|
5
6
|
const issues_1 = require("../../shared/validation/issues");
|
|
6
7
|
const math_1 = require("../../../utils/math");
|
|
7
8
|
const envelope_1 = require("../post/envelope");
|
|
9
|
+
const wall_forces_1 = require("../post/wall-forces");
|
|
8
10
|
const present_state_1 = require("../post/present-state");
|
|
9
11
|
const expand_model_1 = require("../mesh/expand-model");
|
|
10
12
|
const validate_model_1 = require("../validation/validate-model");
|
|
@@ -43,7 +45,7 @@ const groupByCase = (loads = []) => {
|
|
|
43
45
|
* case, null areas, and combinations
|
|
44
46
|
* @param options - Diagram station count and detail
|
|
45
47
|
* @returns `{ result, memberDiagram }`
|
|
46
|
-
* @throws {FeaError} 301–317, 326 and
|
|
48
|
+
* @throws {FeaError} 301–317, 326, 327 and 329–331 for an invalid model (with `details` and
|
|
47
49
|
* every problem in `issues`), 328 for a translation nothing resists at a node connected only
|
|
48
50
|
* to shells, 304 for an unstable structure
|
|
49
51
|
*/
|
|
@@ -57,6 +59,8 @@ const createAnalysis = (model, options = {}) => {
|
|
|
57
59
|
const resolved = (0, combinations_1.resolveCombinations)(combinations, new Set(model.loadCases.map((c) => c.id)));
|
|
58
60
|
const withStations = (options.diagrams ?? "full") === "full";
|
|
59
61
|
const fromAreas = (0, area_member_loads_1.areaMemberLoads)(model);
|
|
62
|
+
const strips = (0, strip_forces_1.prepareStrips)(model.strips ?? [], system.shells);
|
|
63
|
+
const walls = (0, wall_forces_1.prepareWalls)(model, system);
|
|
60
64
|
const states = new Map();
|
|
61
65
|
const cases = {};
|
|
62
66
|
const nodalByCase = groupByCase(model.nodalLoads);
|
|
@@ -73,7 +77,7 @@ const createAnalysis = (model, options = {}) => {
|
|
|
73
77
|
shellLoads: shellByCase.get(loadCase.id) ?? [],
|
|
74
78
|
});
|
|
75
79
|
states.set(loadCase.id, state);
|
|
76
|
-
cases[loadCase.id] = (0, present_state_1.presentState)(system, state, { id: loadCase.id, kind: "case", name: loadCase.name, type: loadCase.type }, { stations: options.stations, withStations });
|
|
80
|
+
cases[loadCase.id] = (0, present_state_1.presentState)(system, state, { id: loadCase.id, kind: "case", name: loadCase.name, type: loadCase.type }, { stations: options.stations, withStations }, strips.strips, walls);
|
|
77
81
|
}
|
|
78
82
|
const combinationStates = new Map();
|
|
79
83
|
const combinationResults = {};
|
|
@@ -82,11 +86,12 @@ const createAnalysis = (model, options = {}) => {
|
|
|
82
86
|
const terms = [...resolved.get(combination.id)].map(([caseId, factor]) => ({ state: states.get(caseId), factor }));
|
|
83
87
|
const state = (0, load_case_solver_1.combineStates)(terms);
|
|
84
88
|
combinationStates.set(combination.id, state);
|
|
85
|
-
combinationResults[combination.id] = (0, present_state_1.presentState)(system, state, { id: combination.id, kind: "combination", name: combination.name }, { stations: options.stations, withStations });
|
|
89
|
+
combinationResults[combination.id] = (0, present_state_1.presentState)(system, state, { id: combination.id, kind: "combination", name: combination.name }, { stations: options.stations, withStations }, strips.strips, walls);
|
|
86
90
|
}
|
|
87
91
|
const warnings = [
|
|
88
92
|
...fromAreas.warnings,
|
|
89
93
|
...expanded.warnings,
|
|
94
|
+
...strips.warnings,
|
|
90
95
|
...[...Object.values(cases), ...Object.values(combinationResults)].flatMap((r) => r.warnings.map((w) => ({
|
|
91
96
|
...w,
|
|
92
97
|
message: `${r.kind === "case" ? "Load case" : "Load combination"} "${r.id}": ${w.message}`,
|
|
@@ -108,6 +113,8 @@ const createAnalysis = (model, options = {}) => {
|
|
|
108
113
|
loadCaseCount: model.loadCases.length,
|
|
109
114
|
combinationCount: combinations.length,
|
|
110
115
|
autoRestrainedDofs: autoRestrainedDofs(system),
|
|
116
|
+
intermediateNodes: expanded.connectivity.intermediateNodes,
|
|
117
|
+
nearMissNodes: expanded.connectivity.nearMissNodes,
|
|
111
118
|
},
|
|
112
119
|
units: {
|
|
113
120
|
force: "kN",
|
|
@@ -150,10 +157,19 @@ exports.createAnalysis = createAnalysis;
|
|
|
150
157
|
* and rad. Global axes X, Y, Z are right-handed with Z up; members use ETABS-style local axes
|
|
151
158
|
* 1, 2, 3 (see `memberAxes`). Member end forces and diagrams use right-hand rotations.
|
|
152
159
|
*
|
|
160
|
+
* A member is connected to every model node lying on it between its ends, as if it were split
|
|
161
|
+
* there, unless it sets `connectIntermediateNodes: false`; it is still reported as one member.
|
|
162
|
+
* The connections are listed in `calculationDetails.intermediateNodes`; a node close to a
|
|
163
|
+
* member but not on it is not connected, and is listed in `calculationDetails.nearMissNodes`
|
|
164
|
+
* with a warning. `memberConnectivity` makes the same check without analysing.
|
|
165
|
+
*
|
|
153
166
|
* Area loads on null areas (`areas`, `areaLoads`) are first turned into member loads on the
|
|
154
167
|
* members along each area's edges (see `distributeAreaLoads`); the areas add no stiffness.
|
|
155
168
|
* Shell areas (`shells`) are four-node flat shell elements with their own stiffness; area loads
|
|
156
|
-
* and self-weight on them act as forces at their corners.
|
|
169
|
+
* and self-weight on them act as forces at their corners. Strips (`strips`) integrate the shell
|
|
170
|
+
* forces across cuts at stations along them (`stripForces`), for strip design of slabs.
|
|
171
|
+
* Piers and spandrels (`piers`, `spandrels`) sum the nodal forces of their shell elements and
|
|
172
|
+
* members on cuts across them (`pierForces`, `spandrelForces`), for wall design.
|
|
157
173
|
*
|
|
158
174
|
* Model and result are plain data (JSON-serialisable), so the analysis can run in a Web Worker.
|
|
159
175
|
*
|
|
@@ -162,7 +178,7 @@ exports.createAnalysis = createAnalysis;
|
|
|
162
178
|
* @param options - Diagram station count and detail
|
|
163
179
|
* @returns `cases` and `combinations` keyed by id, `envelope` over the combinations,
|
|
164
180
|
* `calculationDetails`, `units` and `warnings`
|
|
165
|
-
* @throws {FeaError} 301–317, 326 and
|
|
181
|
+
* @throws {FeaError} 301–317, 326, 327 and 329–331 for an invalid model (with `details` and
|
|
166
182
|
* every problem in `issues`), 328 for a translation nothing resists at a node connected only
|
|
167
183
|
* to shells, 304 for an unstable structure
|
|
168
184
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/analyze.ts"],"names":[],"mappings":";;;AACA,6EAAwE;AAIxE,8DAAgE;AAChE,0CAAuD;AAEvD,+CAAiD;AACjD,yDAA2E;AAE3E,uDAAmD;AAEnD,iEAA6D;AAC7D,iDAAqD;AACrD,uDAA+E;AAC/E,yDAAiF;AA8BjF,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAElD,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,CAAC,MAAsB,EAAuB,EAAE,CACzE,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,2BAAoB,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAA6B,CAAC;IAC5F,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE;QAC7B,IAAI,EAAE,OAAO;QACb,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzD,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,oFAAoF;AACpF,MAAM,WAAW,GAAG,CAAiC,QAAa,EAAE,EAAoB,EAAE;IACxF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAe,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACvB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACI,MAAM,cAAc,GAAG,CAAC,KAAe,EAAE,UAA0B,EAAE,EAAY,EAAE;IACxF,MAAM,MAAM,GAAG,IAAA,8BAAa,EAAC,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,IAAA,0BAAW,EAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAA,uCAAqB,EAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAG,IAAA,kCAAmB,EAAC,YAAY,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,MAAM,CAAC;IAC7D,MAAM,SAAS,GAAG,IAAA,mCAAe,EAAC,KAAK,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/analyze.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.combineStates = exports.solveLoadCase = void 0;
|
|
4
|
-
const
|
|
4
|
+
const fea_constant_1 = require("../../../core/constants/fea.constant");
|
|
5
5
|
const fea_error_1 = require("../../../core/errors/fea.error");
|
|
6
6
|
const fixed_end_forces_1 = require("../../frame/elements/fixed-end-forces");
|
|
7
7
|
const member_assembly_1 = require("../../frame/solver/member-assembly");
|
|
@@ -37,7 +37,7 @@ const solveLoadCase = (system, loadCase, loads) => {
|
|
|
37
37
|
return condensed;
|
|
38
38
|
});
|
|
39
39
|
// Shell surface loads as forces at the element corners
|
|
40
|
-
(0, shell_loads_1.addShellLoads)(F, system.shells, system.shellsByArea, loads.shellLoads ?? [], selfWeight);
|
|
40
|
+
const shellPressures = (0, shell_loads_1.addShellLoads)(F, system.shells, system.shellsByArea, loads.shellLoads ?? [], selfWeight);
|
|
41
41
|
for (const load of loads.nodalLoads) {
|
|
42
42
|
const base = 6 * nodeIndex.get(load.nodeId);
|
|
43
43
|
[load.fx, load.fy, load.fz].forEach((v, k) => (F[base + k] += (v ?? 0) * 1e3));
|
|
@@ -51,7 +51,7 @@ const solveLoadCase = (system, loadCase, loads) => {
|
|
|
51
51
|
}
|
|
52
52
|
for (const { node, axis } of system.autoRestraints) {
|
|
53
53
|
const moment = axis.reduce((sum, a, i) => sum + a * F[6 * node + 3 + i], 0);
|
|
54
|
-
if (Math.abs(moment) >
|
|
54
|
+
if (Math.abs(moment) > fea_constant_1.SINGULARITY_TOLERANCE * momentScale) {
|
|
55
55
|
const lead = axis.reduce((best, a, i) => (Math.abs(a) > Math.abs(axis[best]) ? i : best), 0);
|
|
56
56
|
(0, issues_1.throwIssues)([
|
|
57
57
|
(0, issues_1.modelIssue)(fea_error_1.FeaErrors.STRUCTURE_UNSTABLE, {
|
|
@@ -82,7 +82,7 @@ const solveLoadCase = (system, loadCase, loads) => {
|
|
|
82
82
|
}
|
|
83
83
|
const R = KU.map((v, i) => (boundary.restrained[i] ? v - F[i] : 0));
|
|
84
84
|
const shellForces = system.shells.map((shell) => (0, shell_forces_1.shellRawForces)(shell, U));
|
|
85
|
-
return { U, R, F, memberForces, shellForces, memberLoads };
|
|
85
|
+
return { U, R, F, memberForces, shellForces, shellPressures, memberLoads };
|
|
86
86
|
};
|
|
87
87
|
exports.solveLoadCase = solveLoadCase;
|
|
88
88
|
/** Superposes factored states: `Σ factor × state`. Member loads are concatenated, scaled. */
|
|
@@ -101,6 +101,7 @@ const combineStates = (terms) => {
|
|
|
101
101
|
F: add((s) => s.F, first.F.length),
|
|
102
102
|
memberForces: first.memberForces.map((_, m) => add((s) => s.memberForces[m], 12)),
|
|
103
103
|
shellForces: first.shellForces.map((f, sh) => add((s) => s.shellForces[sh], f.length)),
|
|
104
|
+
shellPressures: first.shellPressures.map((_, sh) => add((s) => s.shellPressures[sh], 3)),
|
|
104
105
|
memberLoads: first.memberLoads.map((_, m) => terms.flatMap(({ state, factor }) => factor === 0 ? [] : state.memberLoads[m].map((l) => (0, member_loads_1.scaleMemberLoad)(l, factor)))),
|
|
105
106
|
};
|
|
106
107
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/load-case-solver.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/load-case-solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Member, MemberLoad, NullArea } from "../../frame/types/model.type";
|
|
2
2
|
import type { AreaLoad, FeaId, FeaNode, Restraint } from "../../shared/types/model.type";
|
|
3
|
-
import type { ShellArea } from "../../shell/types/model.type";
|
|
3
|
+
import type { ShellArea, ShellStrip } from "../../shell/types/model.type";
|
|
4
4
|
/**
|
|
5
5
|
* Fixed DOFs along a straight line: every node on the segment between two nodes, including the
|
|
6
6
|
* nodes the engine generates when it meshes shell areas, e.g. a wall base fixed along its
|
|
@@ -58,6 +58,48 @@ export interface LoadCombination {
|
|
|
58
58
|
name?: string;
|
|
59
59
|
terms: CombinationTerm[];
|
|
60
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* A wall pier, as in ETABS: shell areas (one or more wall legs, planar or not, connected or
|
|
63
|
+
* not) and members (boundary or embedded columns) whose forces `analyze` sums on horizontal
|
|
64
|
+
* cuts into one resultant per cut (`pierForces`). Cuts are taken at the bottom and top of each
|
|
65
|
+
* lift — between consecutive elevations where any of its areas or members starts or ends — and
|
|
66
|
+
* at the extra elevations in `cuts`.
|
|
67
|
+
*
|
|
68
|
+
* Pier axes: 1 = global +Z (up); 2 horizontal, along the longest area of the pier (pointing
|
|
69
|
+
* toward +X, or +Y for an area parallel to Y), or global X rotated by `angle` about +Z when
|
|
70
|
+
* given; 3 = 1 × 2. A pier adds nothing to the analysis.
|
|
71
|
+
*/
|
|
72
|
+
export interface WallPier {
|
|
73
|
+
id: FeaId;
|
|
74
|
+
/** Shell areas of the pier; all vertical. */
|
|
75
|
+
areaIds?: FeaId[];
|
|
76
|
+
/** Members of the pier; none horizontal. */
|
|
77
|
+
memberIds?: FeaId[];
|
|
78
|
+
/** Extra cut elevations (mm, global Z), within the pier and on the mesh lines of its areas. */
|
|
79
|
+
cuts?: number[];
|
|
80
|
+
/** Rotation of pier axis 2 from global X about +Z (rad); default along the longest area. */
|
|
81
|
+
angle?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A wall spandrel (coupling beam), as in ETABS: shell areas in one vertical plane, and members
|
|
85
|
+
* (beams along it), whose forces `analyze` sums on vertical cuts into one resultant per cut
|
|
86
|
+
* (`spandrelForces`): at its left and right ends and at the distances in `cuts`.
|
|
87
|
+
*
|
|
88
|
+
* Spandrel axes: 1 horizontal along the wall plane, pointing toward +X (toward +Y for a wall
|
|
89
|
+
* parallel to Y), or the opposite way with `reverse: true`; its left end is where 1 starts.
|
|
90
|
+
* 2 = global +Z, 3 = 1 × 2 (out of the wall plane). A spandrel adds nothing to the analysis.
|
|
91
|
+
*/
|
|
92
|
+
export interface WallSpandrel {
|
|
93
|
+
id: FeaId;
|
|
94
|
+
/** Shell areas of the spandrel (at least one), all in one vertical plane. */
|
|
95
|
+
areaIds: FeaId[];
|
|
96
|
+
/** Members of the spandrel; none normal to its axis 1. */
|
|
97
|
+
memberIds?: FeaId[];
|
|
98
|
+
/** Extra cuts, as distances from the left end along axis 1 (mm), on the mesh lines. */
|
|
99
|
+
cuts?: number[];
|
|
100
|
+
/** Reverse axis 1 (and so swap the left and right ends). Default false. */
|
|
101
|
+
reverse?: boolean;
|
|
102
|
+
}
|
|
61
103
|
export interface FeaModel {
|
|
62
104
|
nodes: FeaNode[];
|
|
63
105
|
/** Frame members; omit for a model of shells only, e.g. a mat foundation. */
|
|
@@ -77,4 +119,19 @@ export interface FeaModel {
|
|
|
77
119
|
/** Area loads of every load case, each tagged with its `loadCase`. */
|
|
78
120
|
areaLoads?: AreaLoad[];
|
|
79
121
|
combinations?: LoadCombination[];
|
|
122
|
+
/**
|
|
123
|
+
* Design strips across the shells: `analyze` returns the forces on cuts across each strip in
|
|
124
|
+
* every load case and combination (`stripForces`). They add nothing to the analysis.
|
|
125
|
+
*/
|
|
126
|
+
strips?: ShellStrip[];
|
|
127
|
+
/**
|
|
128
|
+
* Wall piers: `analyze` returns the resultant on cuts across each pier in every load case and
|
|
129
|
+
* combination (`pierForces`). They add nothing to the analysis.
|
|
130
|
+
*/
|
|
131
|
+
piers?: WallPier[];
|
|
132
|
+
/**
|
|
133
|
+
* Wall spandrels: `analyze` returns the resultant on cuts across each spandrel in every load
|
|
134
|
+
* case and combination (`spandrelForces`). They add nothing to the analysis.
|
|
135
|
+
*/
|
|
136
|
+
spandrels?: WallSpandrel[];
|
|
80
137
|
}
|