@theerapat-s28/ts-structural-eng-tools 1.5.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -6
- package/dist/core/constants/frame.constant.d.ts +19 -0
- package/dist/core/constants/frame.constant.js +23 -0
- package/dist/core/constants/frame.constant.js.map +1 -0
- package/dist/core/errors/frame-analysis.error.d.ts +36 -0
- package/dist/core/errors/frame-analysis.error.js +86 -0
- package/dist/core/errors/frame-analysis.error.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +13 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types/section-properties.type.d.ts +13 -0
- package/dist/core/types/section-properties.type.js +3 -0
- package/dist/core/types/section-properties.type.js.map +1 -0
- package/dist/esm/core/constants/frame.constant.js +20 -0
- package/dist/esm/core/constants/frame.constant.js.map +1 -0
- package/dist/esm/core/constants/rc.constant.js +63 -0
- package/dist/esm/core/constants/rc.constant.js.map +1 -0
- package/dist/esm/core/errors/frame-analysis.error.js +82 -0
- package/dist/esm/core/errors/frame-analysis.error.js.map +1 -0
- package/dist/esm/core/errors/rc-design.error.js +64 -0
- package/dist/esm/core/errors/rc-design.error.js.map +1 -0
- package/dist/esm/core/index.js +9 -0
- package/dist/esm/core/index.js.map +1 -0
- package/dist/esm/core/types/output-message.type.js +2 -0
- package/dist/esm/core/types/output-message.type.js.map +1 -0
- package/dist/esm/core/types/plate-jacketing.type.js +18 -0
- package/dist/esm/core/types/plate-jacketing.type.js.map +1 -0
- package/dist/esm/core/types/rc-beam.type.js +11 -0
- package/dist/esm/core/types/rc-beam.type.js.map +1 -0
- package/dist/esm/core/types/section-properties.type.js +2 -0
- package/dist/esm/core/types/section-properties.type.js.map +1 -0
- package/dist/esm/core/types/unit.type.js +2 -0
- package/dist/esm/core/types/unit.type.js.map +1 -0
- package/dist/esm/fea/frame/area/area-geometry.js +132 -0
- package/dist/esm/fea/frame/area/area-geometry.js.map +1 -0
- package/dist/esm/fea/frame/area/distribute-area-loads.js +267 -0
- package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -0
- package/dist/esm/fea/frame/area/edge-members.js +62 -0
- package/dist/esm/fea/frame/area/edge-members.js.map +1 -0
- package/dist/esm/fea/frame/elements/beam-3d-stiffness.js +84 -0
- package/dist/esm/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
- package/dist/esm/fea/frame/elements/fixed-end-forces.js +88 -0
- package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -0
- package/dist/esm/fea/frame/elements/static-condensation.js +55 -0
- package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -0
- package/dist/esm/fea/frame/index.js +7 -0
- package/dist/esm/fea/frame/index.js.map +1 -0
- package/dist/esm/fea/frame/post/demand-envelope.js +97 -0
- package/dist/esm/fea/frame/post/demand-envelope.js.map +1 -0
- package/dist/esm/fea/frame/post/envelope.js +59 -0
- package/dist/esm/fea/frame/post/envelope.js.map +1 -0
- package/dist/esm/fea/frame/post/member-diagram.js +375 -0
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -0
- package/dist/esm/fea/frame/post/present-state.js +106 -0
- package/dist/esm/fea/frame/post/present-state.js.map +1 -0
- package/dist/esm/fea/frame/solver/analyze-frame.js +131 -0
- package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -0
- package/dist/esm/fea/frame/solver/boundary-conditions.js +33 -0
- package/dist/esm/fea/frame/solver/boundary-conditions.js.map +1 -0
- package/dist/esm/fea/frame/solver/combinations.js +69 -0
- package/dist/esm/fea/frame/solver/combinations.js.map +1 -0
- package/dist/esm/fea/frame/solver/frame-system.js +122 -0
- package/dist/esm/fea/frame/solver/frame-system.js.map +1 -0
- package/dist/esm/fea/frame/solver/global-assembly.js +27 -0
- package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -0
- package/dist/esm/fea/frame/solver/load-case-solver.js +133 -0
- package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -0
- package/dist/esm/fea/frame/transformation/coordinate-transform.js +71 -0
- package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -0
- package/dist/esm/fea/frame/types/model.type.js +2 -0
- package/dist/esm/fea/frame/types/model.type.js.map +1 -0
- package/dist/esm/fea/frame/types/results.type.js +2 -0
- package/dist/esm/fea/frame/types/results.type.js.map +1 -0
- package/dist/esm/fea/frame/validation/validate-model.js +389 -0
- package/dist/esm/fea/frame/validation/validate-model.js.map +1 -0
- package/dist/esm/fea/index.js +3 -0
- package/dist/esm/fea/index.js.map +1 -0
- package/dist/esm/index.js +10 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/rc/general.js +32 -0
- package/dist/esm/rc/general.js.map +1 -0
- package/dist/esm/rc/index.js +5 -0
- package/dist/esm/rc/index.js.map +1 -0
- package/dist/esm/rc/rc-bar-layout.js +89 -0
- package/dist/esm/rc/rc-bar-layout.js.map +1 -0
- package/dist/esm/rc/rc-beam-design.js +320 -0
- package/dist/esm/rc/rc-beam-design.js.map +1 -0
- package/dist/esm/rc/rc-section-properties.js +55 -0
- package/dist/esm/rc/rc-section-properties.js.map +1 -0
- package/dist/esm/strengthening/index.js +4 -0
- package/dist/esm/strengthening/index.js.map +1 -0
- package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js +338 -0
- package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js.map +1 -0
- package/dist/esm/strengthening/rc-beam-side-plate-shear.js +381 -0
- package/dist/esm/strengthening/rc-beam-side-plate-shear.js.map +1 -0
- package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js +90 -0
- package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -0
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/math.js +30 -0
- package/dist/esm/utils/math.js.map +1 -0
- package/dist/esm/utils/matrix.js +145 -0
- package/dist/esm/utils/matrix.js.map +1 -0
- package/dist/esm/utils/merge-warning.js +11 -0
- package/dist/esm/utils/merge-warning.js.map +1 -0
- package/dist/esm/utils/skyline.js +151 -0
- package/dist/esm/utils/skyline.js.map +1 -0
- package/dist/fea/frame/area/area-geometry.d.ts +56 -0
- package/dist/fea/frame/area/area-geometry.js +142 -0
- package/dist/fea/frame/area/area-geometry.js.map +1 -0
- package/dist/fea/frame/area/distribute-area-loads.d.ts +30 -0
- package/dist/fea/frame/area/distribute-area-loads.js +272 -0
- package/dist/fea/frame/area/distribute-area-loads.js.map +1 -0
- package/dist/fea/frame/area/edge-members.d.ts +25 -0
- package/dist/fea/frame/area/edge-members.js +67 -0
- package/dist/fea/frame/area/edge-members.js.map +1 -0
- package/dist/fea/frame/elements/beam-3d-stiffness.d.ts +29 -0
- package/dist/fea/frame/elements/beam-3d-stiffness.js +90 -0
- package/dist/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
- package/dist/fea/frame/elements/fixed-end-forces.d.ts +36 -0
- package/dist/fea/frame/elements/fixed-end-forces.js +93 -0
- package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -0
- package/dist/fea/frame/elements/static-condensation.d.ts +19 -0
- package/dist/fea/frame/elements/static-condensation.js +59 -0
- package/dist/fea/frame/elements/static-condensation.js.map +1 -0
- package/dist/fea/frame/index.d.ts +10 -0
- package/dist/fea/frame/index.js +18 -0
- package/dist/fea/frame/index.js.map +1 -0
- package/dist/fea/frame/post/demand-envelope.d.ts +36 -0
- package/dist/fea/frame/post/demand-envelope.js +101 -0
- package/dist/fea/frame/post/demand-envelope.js.map +1 -0
- package/dist/fea/frame/post/envelope.d.ts +8 -0
- package/dist/fea/frame/post/envelope.js +63 -0
- package/dist/fea/frame/post/envelope.js.map +1 -0
- package/dist/fea/frame/post/member-diagram.d.ts +26 -0
- package/dist/fea/frame/post/member-diagram.js +379 -0
- package/dist/fea/frame/post/member-diagram.js.map +1 -0
- package/dist/fea/frame/post/present-state.d.ts +19 -0
- package/dist/fea/frame/post/present-state.js +111 -0
- package/dist/fea/frame/post/present-state.js.map +1 -0
- package/dist/fea/frame/solver/analyze-frame.d.ts +70 -0
- package/dist/fea/frame/solver/analyze-frame.js +136 -0
- package/dist/fea/frame/solver/analyze-frame.js.map +1 -0
- package/dist/fea/frame/solver/boundary-conditions.d.ts +14 -0
- package/dist/fea/frame/solver/boundary-conditions.js +37 -0
- package/dist/fea/frame/solver/boundary-conditions.js.map +1 -0
- package/dist/fea/frame/solver/combinations.d.ts +11 -0
- package/dist/fea/frame/solver/combinations.js +73 -0
- package/dist/fea/frame/solver/combinations.js.map +1 -0
- package/dist/fea/frame/solver/frame-system.d.ts +42 -0
- package/dist/fea/frame/solver/frame-system.js +126 -0
- package/dist/fea/frame/solver/frame-system.js.map +1 -0
- package/dist/fea/frame/solver/global-assembly.d.ts +17 -0
- package/dist/fea/frame/solver/global-assembly.js +33 -0
- package/dist/fea/frame/solver/global-assembly.js.map +1 -0
- package/dist/fea/frame/solver/load-case-solver.d.ts +34 -0
- package/dist/fea/frame/solver/load-case-solver.js +138 -0
- package/dist/fea/frame/solver/load-case-solver.js.map +1 -0
- package/dist/fea/frame/transformation/coordinate-transform.d.ts +21 -0
- package/dist/fea/frame/transformation/coordinate-transform.js +76 -0
- package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -0
- package/dist/fea/frame/types/model.type.d.ts +170 -0
- package/dist/fea/frame/types/model.type.js +3 -0
- package/dist/fea/frame/types/model.type.js.map +1 -0
- package/dist/fea/frame/types/results.type.d.ts +134 -0
- package/dist/fea/frame/types/results.type.js +3 -0
- package/dist/fea/frame/types/results.type.js.map +1 -0
- package/dist/fea/frame/validation/validate-model.d.ts +18 -0
- package/dist/fea/frame/validation/validate-model.js +395 -0
- package/dist/fea/frame/validation/validate-model.js.map +1 -0
- package/dist/fea/index.d.ts +1 -0
- package/dist/fea/index.js +19 -0
- package/dist/fea/index.js.map +1 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/rc/index.d.ts +2 -0
- package/dist/rc/index.js +3 -1
- package/dist/rc/index.js.map +1 -1
- package/dist/rc/rc-section-properties.d.ts +35 -0
- package/dist/rc/rc-section-properties.js +59 -0
- package/dist/rc/rc-section-properties.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +19 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matrix.d.ts +45 -0
- package/dist/utils/matrix.js +157 -0
- package/dist/utils/matrix.js.map +1 -0
- package/dist/utils/skyline.d.ts +49 -0
- package/dist/utils/skyline.js +161 -0
- package/dist/utils/skyline.js.map +1 -0
- package/package.json +28 -4
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memberDiagram = void 0;
|
|
4
|
+
const math_1 = require("../../../utils/math");
|
|
5
|
+
const FORCE_COMPONENTS = ["N", "V2", "V3", "T", "M2", "M3"];
|
|
6
|
+
const DISPLACEMENT_COMPONENTS = ["u1", "u2", "u3"];
|
|
7
|
+
const COMPONENTS = [...FORCE_COMPONENTS, ...DISPLACEMENT_COMPONENTS];
|
|
8
|
+
/** Evenly spaced grid for the deflection extremes (force extremes need no grid: see below). */
|
|
9
|
+
const DEFLECTION_GRID_INTERVALS = 40;
|
|
10
|
+
/** Golden-section steps refining each deflection extreme between its neighbouring grid points. */
|
|
11
|
+
const REFINE_STEPS = 30;
|
|
12
|
+
const GOLDEN = (Math.sqrt(5) - 1) / 2;
|
|
13
|
+
// 3-point Gauss–Legendre rule on [−1, 1], exact up to degree 5
|
|
14
|
+
const GAUSS3_POINTS = [-Math.sqrt(3 / 5), 0, Math.sqrt(3 / 5)];
|
|
15
|
+
const GAUSS3_WEIGHTS = [5 / 9, 8 / 9, 5 / 9];
|
|
16
|
+
const FORCE_DECIMALS = 4;
|
|
17
|
+
const DISPLACEMENT_DECIMALS = 5;
|
|
18
|
+
/**
|
|
19
|
+
* Internal forces at distance `x` from the member start, in N and N·mm. Taken from the
|
|
20
|
+
* free body of the segment [0, x]; N is positive in tension, `M3` is positive for sagging
|
|
21
|
+
* when local 2 points up. At a point load, `side` picks the value just before or after it.
|
|
22
|
+
*
|
|
23
|
+
* @param startForce - Right-hand local force the start node exerts on the member: [F1, F2, F3, M1, M2, M3]
|
|
24
|
+
*/
|
|
25
|
+
const internalForces = (startForce, loads, x, side) => {
|
|
26
|
+
const [f1, f2, f3, m1, m2, m3] = startForce;
|
|
27
|
+
// Q[axis]: resultant of loads in [0, x]; I[axis]: ∫(s − x)·q ds over [0, x]; Qt: torque in [0, x]
|
|
28
|
+
const Q = [0, 0, 0, 0];
|
|
29
|
+
const I = [0, 0, 0, 0];
|
|
30
|
+
let Qt = 0;
|
|
31
|
+
for (const load of loads) {
|
|
32
|
+
if (load.type === "torque") {
|
|
33
|
+
const m = Math.min(x, load.end);
|
|
34
|
+
if (m > load.start)
|
|
35
|
+
Qt += load.t * (m - load.start);
|
|
36
|
+
}
|
|
37
|
+
else if (load.type === "point") {
|
|
38
|
+
const included = side === "left" ? load.a < x : load.a <= x;
|
|
39
|
+
if (included) {
|
|
40
|
+
Q[load.axis] += load.P;
|
|
41
|
+
I[load.axis] += load.P * (load.a - x);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const m = Math.min(x, load.end);
|
|
46
|
+
if (m > load.start) {
|
|
47
|
+
// q(s) = w1 + k·(s − start); in u = s − x over [a, b]: q = w1 + k·(u − a)
|
|
48
|
+
const k = (load.w2 - load.w1) / (load.end - load.start);
|
|
49
|
+
const a = load.start - x;
|
|
50
|
+
const b = m - x;
|
|
51
|
+
Q[load.axis] += load.w1 * (b - a) + (k * (b - a) ** 2) / 2;
|
|
52
|
+
I[load.axis] += ((load.w1 - k * a) * (b ** 2 - a ** 2)) / 2 + (k * (b ** 3 - a ** 3)) / 3;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
N: -f1 - Q[1],
|
|
58
|
+
V2: -f2 - Q[2],
|
|
59
|
+
V3: -f3 - Q[3],
|
|
60
|
+
T: -m1 - Qt,
|
|
61
|
+
M2: -m2 - x * f3 + I[3],
|
|
62
|
+
M3: -m3 + x * f2 - I[2],
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Local displacements u1, u2, u3 (mm) at every grid point, from Euler–Bernoulli kinematics:
|
|
67
|
+
* `u1' = N/EA`, `u2'' = M3/EI33` (R3 = u2'), `u3'' = −M2/EI22` (R2 = −u3').
|
|
68
|
+
*
|
|
69
|
+
* Each field is `a + b·x + x·∫₀ˣκ − ∫₀ˣ s·κ`, with the running integrals accumulated once along
|
|
70
|
+
* the sorted grid. The grid contains every load breakpoint, so each interval lies inside one
|
|
71
|
+
* smooth piece where N is at most quadratic and M at most cubic, and one 3-point Gauss panel per
|
|
72
|
+
* interval integrates the (at most quartic) integrands exactly.
|
|
73
|
+
*
|
|
74
|
+
* The constants come from the member's own end displacements: end translations first, an end
|
|
75
|
+
* rotation only where a translation is released. A released rotation (hinge) never enters, so
|
|
76
|
+
* the curve is correct at hinged ends whose rotation differs from the node's.
|
|
77
|
+
*/
|
|
78
|
+
const displacementsOnGrid = (member, startForce, endDisplacements, loads, grid) => {
|
|
79
|
+
const { E, A, I22, I33 } = member.section;
|
|
80
|
+
const L = member.length;
|
|
81
|
+
const n = grid.length;
|
|
82
|
+
// integrands: [N/EA, M3/EI33, s·M3/EI33, −M2/EI22, −s·M2/EI22]
|
|
83
|
+
const integrands = (s) => {
|
|
84
|
+
const f = internalForces(startForce, loads, s, "right");
|
|
85
|
+
const k3 = f.M3 / (E * I33);
|
|
86
|
+
const k2 = -f.M2 / (E * I22);
|
|
87
|
+
return [f.N / (E * A), k3, s * k3, k2, s * k2];
|
|
88
|
+
};
|
|
89
|
+
/** ∫ₐᵇ of every integrand: one 3-point Gauss panel, interior points only (no load side). */
|
|
90
|
+
const panel = (a, b) => {
|
|
91
|
+
const half = (b - a) / 2;
|
|
92
|
+
const mid = (a + b) / 2;
|
|
93
|
+
const out = [0, 0, 0, 0, 0];
|
|
94
|
+
GAUSS3_POINTS.forEach((p, k) => {
|
|
95
|
+
const g = integrands(mid + half * p);
|
|
96
|
+
for (let c = 0; c < 5; c++)
|
|
97
|
+
out[c] += half * GAUSS3_WEIGHTS[k] * g[c];
|
|
98
|
+
});
|
|
99
|
+
return out;
|
|
100
|
+
};
|
|
101
|
+
const cumulative = Array.from({ length: 5 }, () => new Float64Array(n));
|
|
102
|
+
for (let i = 1; i < n; i++) {
|
|
103
|
+
const g = panel(grid[i - 1], grid[i]);
|
|
104
|
+
for (let c = 0; c < 5; c++)
|
|
105
|
+
cumulative[c][i] = cumulative[c][i - 1] + g[c];
|
|
106
|
+
}
|
|
107
|
+
const [strain, k3, sk3, k2, sk2] = cumulative;
|
|
108
|
+
const last = n - 1;
|
|
109
|
+
/** a, b of `u = a + b·x + P(x)` from the first independent pair of end conditions. */
|
|
110
|
+
const planeConstants = (translation, rotation, rotationSign, PL, // P(L)
|
|
111
|
+
dPL) => {
|
|
112
|
+
const { released } = member;
|
|
113
|
+
// rows [ca, cb | rhs] of ca·a + cb·b = rhs
|
|
114
|
+
const conditions = [];
|
|
115
|
+
if (!released[translation])
|
|
116
|
+
conditions.push([1, 0, endDisplacements[translation]]);
|
|
117
|
+
if (!released[6 + translation]) {
|
|
118
|
+
conditions.push([1, L, endDisplacements[6 + translation] - PL]);
|
|
119
|
+
}
|
|
120
|
+
if (!released[rotation])
|
|
121
|
+
conditions.push([0, 1, rotationSign * endDisplacements[rotation]]);
|
|
122
|
+
if (!released[6 + rotation]) {
|
|
123
|
+
conditions.push([0, 1, rotationSign * endDisplacements[6 + rotation] - dPL]);
|
|
124
|
+
}
|
|
125
|
+
for (let i = 0; i < conditions.length; i++) {
|
|
126
|
+
for (let j = i + 1; j < conditions.length; j++) {
|
|
127
|
+
const [a1, b1, r1] = conditions[i];
|
|
128
|
+
const [a2, b2, r2] = conditions[j];
|
|
129
|
+
const det = a1 * b2 - a2 * b1;
|
|
130
|
+
if (Math.abs(det) > 1e-12 * Math.max(1, L)) {
|
|
131
|
+
return { a: (r1 * b2 - r2 * b1) / det, b: (a1 * r2 - a2 * r1) / det };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { a: 0, b: 0 }; // unreachable: such releases are rejected as a mechanism (307)
|
|
136
|
+
};
|
|
137
|
+
const P3 = (i) => grid[i] * k3[i] - sk3[i];
|
|
138
|
+
const P2 = (i) => grid[i] * k2[i] - sk2[i];
|
|
139
|
+
const plane2 = planeConstants(1, 5, 1, P3(last), k3[last]); // u2, with u2' = R3
|
|
140
|
+
const plane3 = planeConstants(2, 4, -1, P2(last), k2[last]); // u3, with u3' = −R2
|
|
141
|
+
const axialStart = member.released[0] ? endDisplacements[6] - strain[last] : endDisplacements[0];
|
|
142
|
+
const onGrid = grid.map((x, i) => ({
|
|
143
|
+
u1: axialStart + strain[i],
|
|
144
|
+
u2: plane2.a + plane2.b * x + P3(i),
|
|
145
|
+
u3: plane3.a + plane3.b * x + P2(i),
|
|
146
|
+
}));
|
|
147
|
+
/** Displacement anywhere: the grid value plus one exact Gauss panel to x. */
|
|
148
|
+
const at = (x) => {
|
|
149
|
+
let lo = 0;
|
|
150
|
+
let hi = last;
|
|
151
|
+
while (lo < hi) {
|
|
152
|
+
const mid = (lo + hi + 1) >> 1;
|
|
153
|
+
if (grid[mid] <= x)
|
|
154
|
+
lo = mid;
|
|
155
|
+
else
|
|
156
|
+
hi = mid - 1;
|
|
157
|
+
}
|
|
158
|
+
const a = grid[lo];
|
|
159
|
+
if (x - a <= 0)
|
|
160
|
+
return onGrid[lo];
|
|
161
|
+
const g = panel(a, x);
|
|
162
|
+
const c = cumulative.map((col, k) => col[lo] + g[k]);
|
|
163
|
+
return {
|
|
164
|
+
u1: axialStart + c[0],
|
|
165
|
+
u2: plane2.a + plane2.b * x + (x * c[1] - c[2]),
|
|
166
|
+
u3: plane3.a + plane3.b * x + (x * c[3] - c[4]),
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
return { onGrid, at };
|
|
170
|
+
};
|
|
171
|
+
const SCALE = {
|
|
172
|
+
N: 1e-3,
|
|
173
|
+
V2: 1e-3,
|
|
174
|
+
V3: 1e-3,
|
|
175
|
+
T: 1e-6,
|
|
176
|
+
M2: 1e-6,
|
|
177
|
+
M3: 1e-6,
|
|
178
|
+
u1: 1,
|
|
179
|
+
u2: 1,
|
|
180
|
+
u3: 1,
|
|
181
|
+
};
|
|
182
|
+
const present = (c, value) => (0, math_1.roundToDecimalPlaces)(value * SCALE[c], c === "u1" || c === "u2" || c === "u3" ? DISPLACEMENT_DECIMALS : FORCE_DECIMALS) + 0;
|
|
183
|
+
/**
|
|
184
|
+
* Builds the force and displacement diagrams of one member from its end forces, its end
|
|
185
|
+
* displacements and its loads.
|
|
186
|
+
*
|
|
187
|
+
* @param member - Member geometry, section, axes and end releases
|
|
188
|
+
* @param startForce - Force the start node exerts on the member, right-hand local, N and N·mm
|
|
189
|
+
* @param endDisplacements - The 12 local right-hand displacements of the member's end nodes, mm and rad
|
|
190
|
+
* @param loads - Member loads in local axes, N and mm
|
|
191
|
+
* @param stationCount - Number of evenly spaced stations (at least 2); load breakpoints and
|
|
192
|
+
* zero-shear points are added, with both sides reported at a point load
|
|
193
|
+
* @param withStations - false returns the extremes only, with an empty `stations` array
|
|
194
|
+
*/
|
|
195
|
+
const memberDiagram = (member, startForce, endDisplacements, loads, stationCount = 21, withStations = true) => {
|
|
196
|
+
const L = member.length;
|
|
197
|
+
const tolerance = 1e-9 * L;
|
|
198
|
+
const breakpoints = new Set([0, L]);
|
|
199
|
+
for (const load of loads) {
|
|
200
|
+
if (load.type === "point")
|
|
201
|
+
breakpoints.add(load.a);
|
|
202
|
+
else {
|
|
203
|
+
breakpoints.add(load.start);
|
|
204
|
+
breakpoints.add(load.end);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const sortedBreaks = [...breakpoints].sort((a, b) => a - b);
|
|
208
|
+
const isBreak = (x) => sortedBreaks.some((b) => Math.abs(b - x) < tolerance);
|
|
209
|
+
/** Sorted, with points closer than the tolerance merged (the first one kept). */
|
|
210
|
+
const mergeSorted = (values) => {
|
|
211
|
+
const sorted = [...values].sort((a, b) => a - b);
|
|
212
|
+
const out = [];
|
|
213
|
+
for (const v of sorted)
|
|
214
|
+
if (out.length === 0 || v - out[out.length - 1] >= tolerance)
|
|
215
|
+
out.push(v);
|
|
216
|
+
return out;
|
|
217
|
+
};
|
|
218
|
+
// Inside each piece between breakpoints N and V are at most quadratic (linear loads), so the
|
|
219
|
+
// quadratic through both ends and the midpoint is exact. Its roots (zero shear: the moment
|
|
220
|
+
// extremes) and its vertex (zero load: the N and V extremes) are added to the grid.
|
|
221
|
+
const roots = [];
|
|
222
|
+
for (let i = 0; i < sortedBreaks.length - 1; i++) {
|
|
223
|
+
const xa = sortedBreaks[i];
|
|
224
|
+
const xb = sortedBreaks[i + 1];
|
|
225
|
+
const fa = internalForces(startForce, loads, xa, "right");
|
|
226
|
+
const fm = internalForces(startForce, loads, (xa + xb) / 2, "right");
|
|
227
|
+
const fb = internalForces(startForce, loads, xb, "left");
|
|
228
|
+
const inside = (t) => t > 0 && t < 1 && roots.push(xa + (xb - xa) * t);
|
|
229
|
+
for (const key of ["N", "V2", "V3"]) {
|
|
230
|
+
// f(t) = A·t² + B·t + C on t ∈ [0, 1]
|
|
231
|
+
const C = fa[key];
|
|
232
|
+
const A = 2 * fa[key] - 4 * fm[key] + 2 * fb[key];
|
|
233
|
+
const B = 4 * fm[key] - 3 * fa[key] - fb[key];
|
|
234
|
+
const scale = Math.max(Math.abs(fa[key]), Math.abs(fm[key]), Math.abs(fb[key]));
|
|
235
|
+
const curved = Math.abs(A) > 1e-12 * scale;
|
|
236
|
+
if (curved)
|
|
237
|
+
inside(-B / (2 * A));
|
|
238
|
+
if (key === "N")
|
|
239
|
+
continue;
|
|
240
|
+
if (!curved) {
|
|
241
|
+
if (Math.abs(B) > 1e-12 * scale)
|
|
242
|
+
inside(-C / B);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
const disc = B * B - 4 * A * C;
|
|
246
|
+
if (disc >= 0) {
|
|
247
|
+
const sq = Math.sqrt(disc);
|
|
248
|
+
inside((-B - sq) / (2 * A));
|
|
249
|
+
inside((-B + sq) / (2 * A));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const coarse = Array.from({ length: DEFLECTION_GRID_INTERVALS + 1 }, (_, i) => (L * i) / DEFLECTION_GRID_INTERVALS);
|
|
255
|
+
const count = Math.max(2, Math.floor(stationCount));
|
|
256
|
+
const uniform = withStations
|
|
257
|
+
? Array.from({ length: count }, (_, i) => (L * i) / (count - 1))
|
|
258
|
+
: [];
|
|
259
|
+
// One grid for everything: breakpoints, zero-shear points, stations and the deflection grid
|
|
260
|
+
const grid = mergeSorted([...sortedBreaks, ...roots, ...uniform, ...coarse]);
|
|
261
|
+
const field = displacementsOnGrid(member, startForce, endDisplacements, loads, grid);
|
|
262
|
+
const displacements = field.onGrid;
|
|
263
|
+
const gridIndex = (x) => {
|
|
264
|
+
let lo = 0;
|
|
265
|
+
let hi = grid.length - 1;
|
|
266
|
+
while (lo < hi) {
|
|
267
|
+
const mid = (lo + hi) >> 1;
|
|
268
|
+
if (grid[mid] < x - tolerance)
|
|
269
|
+
lo = mid + 1;
|
|
270
|
+
else
|
|
271
|
+
hi = mid;
|
|
272
|
+
}
|
|
273
|
+
return lo;
|
|
274
|
+
};
|
|
275
|
+
// ---- Stations -------------------------------------------------------------------
|
|
276
|
+
const stations = [];
|
|
277
|
+
if (withStations) {
|
|
278
|
+
const [l1, l2, l3] = member.lambda;
|
|
279
|
+
const toStation = (x, f, u) => {
|
|
280
|
+
const station = { x: (0, math_1.roundToDecimalPlaces)(x, 3) };
|
|
281
|
+
for (const c of FORCE_COMPONENTS)
|
|
282
|
+
station[c] = present(c, f[c]);
|
|
283
|
+
for (const c of DISPLACEMENT_COMPONENTS)
|
|
284
|
+
station[c] = present(c, u[c]);
|
|
285
|
+
// global = Σ local component × its axis direction
|
|
286
|
+
const g = [0, 1, 2].map((k) => u.u1 * l1[k] + u.u2 * l2[k] + u.u3 * l3[k]);
|
|
287
|
+
station.ux = (0, math_1.roundToDecimalPlaces)(g[0], DISPLACEMENT_DECIMALS) + 0;
|
|
288
|
+
station.uy = (0, math_1.roundToDecimalPlaces)(g[1], DISPLACEMENT_DECIMALS) + 0;
|
|
289
|
+
station.uz = (0, math_1.roundToDecimalPlaces)(g[2], DISPLACEMENT_DECIMALS) + 0;
|
|
290
|
+
return station;
|
|
291
|
+
};
|
|
292
|
+
const stationXs = mergeSorted([...uniform, ...sortedBreaks, ...roots]);
|
|
293
|
+
for (const x of stationXs) {
|
|
294
|
+
const u = displacements[gridIndex(x)];
|
|
295
|
+
const right = internalForces(startForce, loads, x, "right");
|
|
296
|
+
if (isBreak(x) && x > 0 && x < L) {
|
|
297
|
+
const left = internalForces(startForce, loads, x, "left");
|
|
298
|
+
if (FORCE_COMPONENTS.some((c) => Math.abs(left[c] - right[c]) > 1e-9)) {
|
|
299
|
+
stations.push(toStation(x, left, u));
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
stations.push(toStation(x, right, u));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
// ---- Extremes -------------------------------------------------------------------
|
|
306
|
+
// N and V are at most quadratic, T linear and M at most cubic inside each piece, so their
|
|
307
|
+
// extremes lie at a breakpoint (either side), a zero-load or a zero-shear point — all on the
|
|
308
|
+
// grid, so these are exact.
|
|
309
|
+
// Deflections are taken on the grid, then refined by golden-section search.
|
|
310
|
+
const extremes = {};
|
|
311
|
+
const best = {};
|
|
312
|
+
const consider = (c, value, x, i) => {
|
|
313
|
+
const b = best[c];
|
|
314
|
+
if (!b)
|
|
315
|
+
best[c] = { max: [value, x, i], min: [value, x, i] };
|
|
316
|
+
else {
|
|
317
|
+
if (value > b.max[0])
|
|
318
|
+
b.max = [value, x, i];
|
|
319
|
+
if (value < b.min[0])
|
|
320
|
+
b.min = [value, x, i];
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
grid.forEach((x, i) => {
|
|
324
|
+
const sides = isBreak(x) && x > 0 && x < L ? ["right", "left"] : ["right"];
|
|
325
|
+
for (const side of sides) {
|
|
326
|
+
const f = internalForces(startForce, loads, x, side);
|
|
327
|
+
for (const c of FORCE_COMPONENTS)
|
|
328
|
+
consider(c, f[c], x, i);
|
|
329
|
+
}
|
|
330
|
+
for (const c of DISPLACEMENT_COMPONENTS)
|
|
331
|
+
consider(c, displacements[i][c], x, i);
|
|
332
|
+
});
|
|
333
|
+
const refine = (c, i, sign) => {
|
|
334
|
+
// maximise sign·u between the neighbouring grid points
|
|
335
|
+
let a = grid[Math.max(0, i - 1)];
|
|
336
|
+
let b = grid[Math.min(grid.length - 1, i + 1)];
|
|
337
|
+
const value = (x) => sign * field.at(x)[c];
|
|
338
|
+
let x1 = b - GOLDEN * (b - a);
|
|
339
|
+
let x2 = a + GOLDEN * (b - a);
|
|
340
|
+
let f1 = value(x1);
|
|
341
|
+
let f2 = value(x2);
|
|
342
|
+
for (let step = 0; step < REFINE_STEPS; step++) {
|
|
343
|
+
if (f1 < f2) {
|
|
344
|
+
a = x1;
|
|
345
|
+
x1 = x2;
|
|
346
|
+
f1 = f2;
|
|
347
|
+
x2 = a + GOLDEN * (b - a);
|
|
348
|
+
f2 = value(x2);
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
b = x2;
|
|
352
|
+
x2 = x1;
|
|
353
|
+
f2 = f1;
|
|
354
|
+
x1 = b - GOLDEN * (b - a);
|
|
355
|
+
f1 = value(x1);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return f1 >= f2 ? [sign * f1, x1] : [sign * f2, x2];
|
|
359
|
+
};
|
|
360
|
+
for (const c of DISPLACEMENT_COMPONENTS) {
|
|
361
|
+
const b = best[c];
|
|
362
|
+
const [maxValue, maxX] = refine(c, b.max[2], 1);
|
|
363
|
+
if (maxValue > b.max[0])
|
|
364
|
+
b.max = [maxValue, maxX, b.max[2]];
|
|
365
|
+
const [minValue, minX] = refine(c, b.min[2], -1);
|
|
366
|
+
if (minValue < b.min[0])
|
|
367
|
+
b.min = [minValue, minX, b.min[2]];
|
|
368
|
+
}
|
|
369
|
+
for (const c of COMPONENTS) {
|
|
370
|
+
const make = ([value, x]) => ({
|
|
371
|
+
value: present(c, value),
|
|
372
|
+
x: (0, math_1.roundToDecimalPlaces)(x, 3),
|
|
373
|
+
});
|
|
374
|
+
extremes[c] = { max: make(best[c].max), min: make(best[c].min) };
|
|
375
|
+
}
|
|
376
|
+
return { memberId: member.id, length: L, stations, extremes };
|
|
377
|
+
};
|
|
378
|
+
exports.memberDiagram = memberDiagram;
|
|
379
|
+
//# sourceMappingURL=member-diagram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-diagram.js","sourceRoot":"","sources":["../../../../src/fea/frame/post/member-diagram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { FrameSystem } from "../solver/frame-system";
|
|
2
|
+
import type { RawState } from "../solver/load-case-solver";
|
|
3
|
+
import type { FrameCaseResult, MemberDiagram } from "../types/results.type";
|
|
4
|
+
/**
|
|
5
|
+
* The presented diagram of member `m` in a raw state.
|
|
6
|
+
*
|
|
7
|
+
* @param stations - Evenly spaced stations
|
|
8
|
+
* @param withStations - false keeps only the extremes (empty `stations`)
|
|
9
|
+
*/
|
|
10
|
+
export declare const presentMemberDiagram: (system: FrameSystem, state: RawState, m: number, stations?: number, withStations?: boolean) => MemberDiagram;
|
|
11
|
+
/**
|
|
12
|
+
* Rounds a raw state into the presented result of one load case or combination.
|
|
13
|
+
*
|
|
14
|
+
* @param diagram - Evenly spaced station count, and whether to return stations or only extremes
|
|
15
|
+
*/
|
|
16
|
+
export declare const presentState: (system: FrameSystem, state: RawState, meta: Pick<FrameCaseResult, "id" | "kind" | "name" | "type">, diagram?: {
|
|
17
|
+
stations?: number;
|
|
18
|
+
withStations?: boolean;
|
|
19
|
+
}) => FrameCaseResult;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.presentState = exports.presentMemberDiagram = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
const math_1 = require("../../../utils/math");
|
|
6
|
+
const matrix_1 = require("../../../utils/matrix");
|
|
7
|
+
const global_assembly_1 = require("../solver/global-assembly");
|
|
8
|
+
const member_diagram_1 = require("./member-diagram");
|
|
9
|
+
const FORCE_DECIMALS = 4;
|
|
10
|
+
const DISPLACEMENT_DECIMALS = 5;
|
|
11
|
+
const ROTATION_DECIMALS = 8;
|
|
12
|
+
const roundForce = (value, factor) => (0, math_1.roundToDecimalPlaces)(value * factor, FORCE_DECIMALS) + 0; // + 0 turns -0 into 0
|
|
13
|
+
const endForce = (f) => ({
|
|
14
|
+
f1: roundForce(f[0], 1e-3),
|
|
15
|
+
f2: roundForce(f[1], 1e-3),
|
|
16
|
+
f3: roundForce(f[2], 1e-3),
|
|
17
|
+
m1: roundForce(f[3], 1e-6),
|
|
18
|
+
m2: roundForce(f[4], 1e-6),
|
|
19
|
+
m3: roundForce(f[5], 1e-6),
|
|
20
|
+
});
|
|
21
|
+
/** Global force and moment residual of applied loads plus reactions, in kN and kN·m. */
|
|
22
|
+
const equilibrium = (system, state) => {
|
|
23
|
+
const { F, R } = state;
|
|
24
|
+
const total = { fx: 0, fy: 0, fz: 0, mx: 0, my: 0, mz: 0 };
|
|
25
|
+
let loadScale = 0;
|
|
26
|
+
system.nodes.forEach((node, n) => {
|
|
27
|
+
const q = (k) => F[6 * n + k] + R[6 * n + k]; // applied + reaction
|
|
28
|
+
const fx = q(0);
|
|
29
|
+
const fy = q(1);
|
|
30
|
+
const fz = q(2);
|
|
31
|
+
total.fx += fx;
|
|
32
|
+
total.fy += fy;
|
|
33
|
+
total.fz += fz;
|
|
34
|
+
total.mx += q(3) + node.y * fz - node.z * fy;
|
|
35
|
+
total.my += q(4) + node.z * fx - node.x * fz;
|
|
36
|
+
total.mz += q(5) + node.x * fy - node.y * fx;
|
|
37
|
+
loadScale += Math.abs(F[6 * n]) + Math.abs(F[6 * n + 1]) + Math.abs(F[6 * n + 2]);
|
|
38
|
+
});
|
|
39
|
+
const span = Math.max(1, ...system.nodes.map((n) => Math.hypot(n.x, n.y, n.z)));
|
|
40
|
+
const force = Math.hypot(total.fx, total.fy, total.fz); // N
|
|
41
|
+
const moment = Math.hypot(total.mx, total.my, total.mz); // N·mm
|
|
42
|
+
const scale = Math.max(loadScale, 1);
|
|
43
|
+
return {
|
|
44
|
+
force: force * 1e-3,
|
|
45
|
+
moment: moment * 1e-6,
|
|
46
|
+
exceeded: force > frame_constant_1.EQUILIBRIUM_TOLERANCE * scale || moment > frame_constant_1.EQUILIBRIUM_TOLERANCE * scale * span,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* The presented diagram of member `m` in a raw state.
|
|
51
|
+
*
|
|
52
|
+
* @param stations - Evenly spaced stations
|
|
53
|
+
* @param withStations - false keeps only the extremes (empty `stations`)
|
|
54
|
+
*/
|
|
55
|
+
const presentMemberDiagram = (system, state, m, stations, withStations = true) => {
|
|
56
|
+
const member = system.members[m];
|
|
57
|
+
return (0, member_diagram_1.memberDiagram)(member, state.memberForces[m].slice(0, 6), (0, matrix_1.matVec)(member.T, (0, global_assembly_1.memberDofs)(member).map((d) => state.U[d])), state.memberLoads[m], stations, withStations);
|
|
58
|
+
};
|
|
59
|
+
exports.presentMemberDiagram = presentMemberDiagram;
|
|
60
|
+
/**
|
|
61
|
+
* Rounds a raw state into the presented result of one load case or combination.
|
|
62
|
+
*
|
|
63
|
+
* @param diagram - Evenly spaced station count, and whether to return stations or only extremes
|
|
64
|
+
*/
|
|
65
|
+
const presentState = (system, state, meta, diagram = {}) => {
|
|
66
|
+
const { U, R } = state;
|
|
67
|
+
const warnings = [];
|
|
68
|
+
const residual = equilibrium(system, state);
|
|
69
|
+
if (residual.exceeded) {
|
|
70
|
+
warnings.push({
|
|
71
|
+
reference: "Frame analysis, global equilibrium check",
|
|
72
|
+
message: `Global equilibrium residual is ${residual.force.toExponential(2)} kN and ${residual.moment.toExponential(2)} kN·m; the stiffness matrix may be ill-conditioned.`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
const mm = (v) => (0, math_1.roundToDecimalPlaces)(v, DISPLACEMENT_DECIMALS) + 0;
|
|
76
|
+
const rad = (v) => (0, math_1.roundToDecimalPlaces)(v, ROTATION_DECIMALS) + 0;
|
|
77
|
+
return {
|
|
78
|
+
...meta,
|
|
79
|
+
nodalDisplacements: system.nodes.map((node, n) => ({
|
|
80
|
+
nodeId: node.id,
|
|
81
|
+
ux: mm(U[6 * n]),
|
|
82
|
+
uy: mm(U[6 * n + 1]),
|
|
83
|
+
uz: mm(U[6 * n + 2]),
|
|
84
|
+
rx: rad(U[6 * n + 3]),
|
|
85
|
+
ry: rad(U[6 * n + 4]),
|
|
86
|
+
rz: rad(U[6 * n + 5]),
|
|
87
|
+
})),
|
|
88
|
+
reactions: system.nodes.map((node, n) => ({
|
|
89
|
+
nodeId: node.id,
|
|
90
|
+
fx: roundForce(R[6 * n], 1e-3),
|
|
91
|
+
fy: roundForce(R[6 * n + 1], 1e-3),
|
|
92
|
+
fz: roundForce(R[6 * n + 2], 1e-3),
|
|
93
|
+
mx: roundForce(R[6 * n + 3], 1e-6),
|
|
94
|
+
my: roundForce(R[6 * n + 4], 1e-6),
|
|
95
|
+
mz: roundForce(R[6 * n + 5], 1e-6),
|
|
96
|
+
})),
|
|
97
|
+
memberEndForces: system.members.map((member, m) => ({
|
|
98
|
+
memberId: member.id,
|
|
99
|
+
start: endForce(state.memberForces[m].slice(0, 6)),
|
|
100
|
+
end: endForce(state.memberForces[m].slice(6, 12)),
|
|
101
|
+
})),
|
|
102
|
+
memberDiagrams: system.members.map((_, m) => (0, exports.presentMemberDiagram)(system, state, m, diagram.stations, diagram.withStations ?? true)),
|
|
103
|
+
equilibriumResidual: {
|
|
104
|
+
force: (0, math_1.roundToDecimalPlaces)(residual.force, 8),
|
|
105
|
+
moment: (0, math_1.roundToDecimalPlaces)(residual.moment, 8),
|
|
106
|
+
},
|
|
107
|
+
warnings,
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
exports.presentState = presentState;
|
|
111
|
+
//# sourceMappingURL=present-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"present-state.js","sourceRoot":"","sources":["../../../../src/fea/frame/post/present-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { FrameId, FrameModel } from "../types/model.type";
|
|
2
|
+
import type { FrameResult, MemberDiagram } from "../types/results.type";
|
|
3
|
+
export interface AnalyzeFrameOptions {
|
|
4
|
+
/** Number of evenly spaced stations per member diagram (default 21). */
|
|
5
|
+
stations?: number;
|
|
6
|
+
/**
|
|
7
|
+
* `"full"` (default) returns every member diagram with its `stations`; `"extremes"` keeps
|
|
8
|
+
* each diagram's `extremes` (so the envelope and `memberDemandEnvelope` still work) but leaves
|
|
9
|
+
* `stations` empty, which makes large results far smaller. Full diagrams are then available on
|
|
10
|
+
* demand from `createFrameAnalysis(...).memberDiagram`.
|
|
11
|
+
*/
|
|
12
|
+
diagrams?: "full" | "extremes";
|
|
13
|
+
}
|
|
14
|
+
/** An analysed model whose member diagrams can be computed on demand. */
|
|
15
|
+
export interface FrameAnalysis {
|
|
16
|
+
/** The same result `analyzeFrame` returns. */
|
|
17
|
+
result: FrameResult;
|
|
18
|
+
/**
|
|
19
|
+
* The full diagram (stations and extremes) of one member for one load case or combination,
|
|
20
|
+
* computed from the stored solution without re-analysing.
|
|
21
|
+
*
|
|
22
|
+
* @param resultId - Load case or combination id
|
|
23
|
+
* @param memberId - Member id
|
|
24
|
+
* @param stations - Evenly spaced stations (default: the analysis option, else 21)
|
|
25
|
+
* @throws {Error} if either id is not in the model
|
|
26
|
+
*/
|
|
27
|
+
memberDiagram: (resultId: string, memberId: FrameId, stations?: number) => MemberDiagram;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Analyses a 3D frame like `analyzeFrame` and keeps the solution, so that full member diagrams
|
|
31
|
+
* can be requested later one member at a time — e.g. analyse with `diagrams: "extremes"` and
|
|
32
|
+
* draw a member's diagram when the user selects it. Run it in a Web Worker for large models.
|
|
33
|
+
*
|
|
34
|
+
* @param model - Nodes, members, restraints, load cases, loads tagged with their load case,
|
|
35
|
+
* null areas, and combinations
|
|
36
|
+
* @param options - Diagram station count and detail
|
|
37
|
+
* @returns `{ result, memberDiagram }`
|
|
38
|
+
* @throws {FrameAnalysisError} 301–317 for an invalid model (with `details` and every problem in
|
|
39
|
+
* `issues`), 304 for an unstable structure
|
|
40
|
+
*/
|
|
41
|
+
export declare const createFrameAnalysis: (model: FrameModel, options?: AnalyzeFrameOptions) => FrameAnalysis;
|
|
42
|
+
/**
|
|
43
|
+
* Analyses a 3D frame by the direct stiffness method (linear elastic, small displacements)
|
|
44
|
+
* for every load case, then forms every load combination by superposition.
|
|
45
|
+
*
|
|
46
|
+
* The model is validated first (`validateFrameModel`). The stiffness matrix is assembled once
|
|
47
|
+
* in skyline storage with the nodes in reverse Cuthill–McKee order and factorised once; each
|
|
48
|
+
* load case is a separate solve. A combination is the factored sum of its load cases (nested
|
|
49
|
+
* combinations are expanded), and its member diagrams are rebuilt from the combined end forces
|
|
50
|
+
* and factored member loads, so their extremes are exact rather than sums of case extremes.
|
|
51
|
+
*
|
|
52
|
+
* Units: node coordinates, section properties and positions in mm and MPa; loads in kN, kN·m
|
|
53
|
+
* and kN/m; springs in kN/mm and kN·m/rad; unit weight in kN/m³. Results are in kN, kN·m, mm
|
|
54
|
+
* and rad. Global axes X, Y, Z are right-handed with Z up; members use ETABS-style local axes
|
|
55
|
+
* 1, 2, 3 (see `memberAxes`). Member end forces and diagrams use right-hand rotations.
|
|
56
|
+
*
|
|
57
|
+
* Area loads on null areas (`areas`, `areaLoads`) are first turned into member loads on the
|
|
58
|
+
* members along each area's edges (see `distributeAreaLoads`); the areas add no stiffness.
|
|
59
|
+
*
|
|
60
|
+
* Model and result are plain data (JSON-serialisable), so the analysis can run in a Web Worker.
|
|
61
|
+
*
|
|
62
|
+
* @param model - Nodes, members, restraints, load cases, loads tagged with their load case,
|
|
63
|
+
* null areas, and combinations
|
|
64
|
+
* @param options - Diagram station count and detail
|
|
65
|
+
* @returns `cases` and `combinations` keyed by id, `envelope` over the combinations,
|
|
66
|
+
* `calculationDetails`, `units` and `warnings`
|
|
67
|
+
* @throws {FrameAnalysisError} 301–317 for an invalid model (with `details` and every problem in
|
|
68
|
+
* `issues`), 304 for an unstable structure
|
|
69
|
+
*/
|
|
70
|
+
export declare const analyzeFrame: (model: FrameModel, options?: AnalyzeFrameOptions) => FrameResult;
|