@theerapat-s28/ts-structural-eng-tools 2.1.1 → 2.2.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 +15 -1
- package/README.md +5 -6
- package/dist/esm/fea/frame/elements/end-releases.js +20 -0
- package/dist/esm/fea/frame/elements/end-releases.js.map +1 -0
- package/dist/esm/fea/frame/elements/static-condensation.js +77 -26
- package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js +13 -35
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/post/present-state.js +38 -4
- package/dist/esm/fea/frame/post/present-state.js.map +1 -1
- package/dist/esm/fea/frame/solver/analyze-frame.js +13 -0
- package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/esm/fea/frame/solver/auto-restraint.js +104 -0
- package/dist/esm/fea/frame/solver/auto-restraint.js.map +1 -0
- package/dist/esm/fea/frame/solver/boundary-conditions.js +2 -3
- package/dist/esm/fea/frame/solver/boundary-conditions.js.map +1 -1
- package/dist/esm/fea/frame/solver/frame-system.js +30 -13
- package/dist/esm/fea/frame/solver/frame-system.js.map +1 -1
- package/dist/esm/fea/frame/solver/load-case-solver.js +23 -1
- package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-model.js +18 -8
- package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/fea/frame/elements/end-releases.d.ts +19 -0
- package/dist/fea/frame/elements/end-releases.js +24 -0
- package/dist/fea/frame/elements/end-releases.js.map +1 -0
- package/dist/fea/frame/elements/static-condensation.d.ts +29 -10
- package/dist/fea/frame/elements/static-condensation.js +77 -26
- package/dist/fea/frame/elements/static-condensation.js.map +1 -1
- package/dist/fea/frame/index.d.ts +2 -2
- package/dist/fea/frame/post/member-diagram.d.ts +3 -3
- package/dist/fea/frame/post/member-diagram.js +13 -35
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/post/present-state.js +38 -4
- package/dist/fea/frame/post/present-state.js.map +1 -1
- package/dist/fea/frame/solver/analyze-frame.js +13 -0
- package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/fea/frame/solver/auto-restraint.d.ts +28 -0
- package/dist/fea/frame/solver/auto-restraint.js +108 -0
- package/dist/fea/frame/solver/auto-restraint.js.map +1 -0
- package/dist/fea/frame/solver/boundary-conditions.js +2 -3
- package/dist/fea/frame/solver/boundary-conditions.js.map +1 -1
- package/dist/fea/frame/solver/frame-system.d.ts +11 -3
- package/dist/fea/frame/solver/frame-system.js +30 -13
- package/dist/fea/frame/solver/frame-system.js.map +1 -1
- package/dist/fea/frame/solver/load-case-solver.d.ts +2 -1
- package/dist/fea/frame/solver/load-case-solver.js +23 -1
- package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +13 -7
- package/dist/fea/frame/types/results.type.d.ts +33 -3
- package/dist/fea/frame/validation/validate-model.js +18 -8
- package/dist/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findAutoRestraints = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
/**
|
|
6
|
+
* Eigen-decomposition of a small symmetric matrix by cyclic Jacobi rotations.
|
|
7
|
+
*
|
|
8
|
+
* @returns Eigenvalues and the matching unit eigenvectors
|
|
9
|
+
*/
|
|
10
|
+
const symmetricEigen = (M) => {
|
|
11
|
+
const n = M.length;
|
|
12
|
+
const a = M.map((row) => [...row]);
|
|
13
|
+
const v = M.map((_, i) => M.map((__, j) => (i === j ? 1 : 0)));
|
|
14
|
+
const norm = Math.hypot(...a.flat());
|
|
15
|
+
for (let sweep = 0; sweep < 50; sweep++) {
|
|
16
|
+
let off = 0;
|
|
17
|
+
for (let p = 0; p < n; p++)
|
|
18
|
+
for (let q = p + 1; q < n; q++)
|
|
19
|
+
off += a[p][q] ** 2;
|
|
20
|
+
if (Math.sqrt(off) <= 1e-15 * norm)
|
|
21
|
+
break;
|
|
22
|
+
for (let p = 0; p < n; p++) {
|
|
23
|
+
for (let q = p + 1; q < n; q++) {
|
|
24
|
+
if (a[p][q] === 0)
|
|
25
|
+
continue;
|
|
26
|
+
// rotation angle that zeroes a[p][q]
|
|
27
|
+
const theta = (a[q][q] - a[p][p]) / (2 * a[p][q]);
|
|
28
|
+
const t = Math.sign(theta || 1) / (Math.abs(theta) + Math.sqrt(theta * theta + 1));
|
|
29
|
+
const c = 1 / Math.sqrt(t * t + 1);
|
|
30
|
+
const s = t * c;
|
|
31
|
+
for (let k = 0; k < n; k++) {
|
|
32
|
+
const akp = a[k][p];
|
|
33
|
+
const akq = a[k][q];
|
|
34
|
+
a[k][p] = c * akp - s * akq;
|
|
35
|
+
a[k][q] = s * akp + c * akq;
|
|
36
|
+
}
|
|
37
|
+
for (let k = 0; k < n; k++) {
|
|
38
|
+
const apk = a[p][k];
|
|
39
|
+
const aqk = a[q][k];
|
|
40
|
+
a[p][k] = c * apk - s * aqk;
|
|
41
|
+
a[q][k] = s * apk + c * aqk;
|
|
42
|
+
}
|
|
43
|
+
for (let k = 0; k < n; k++) {
|
|
44
|
+
const vkp = v[k][p];
|
|
45
|
+
const vkq = v[k][q];
|
|
46
|
+
v[k][p] = c * vkp - s * vkq;
|
|
47
|
+
v[k][q] = s * vkp + c * vkq;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { values: a.map((row, i) => row[i]), vectors: a.map((_, j) => v.map((row) => row[j])) };
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Finds the joint rotations that nothing resists, so they can be held instead of making the
|
|
56
|
+
* stiffness singular — e.g. a truss joint where every member releases its end moments.
|
|
57
|
+
*
|
|
58
|
+
* For each node with members, the free rotational block `B` (3×3, global) of the assembled
|
|
59
|
+
* member stiffness plus rotational springs is decomposed; every eigenvector whose eigenvalue
|
|
60
|
+
* is below `SINGULARITY_TOLERANCE` times the block's largest diagonal is a null direction `n`.
|
|
61
|
+
* Each member's global stiffness is positive semi-definite, so `nᵀ·B·n = 0` makes the whole
|
|
62
|
+
* stiffness column of `n` zero: the rotation along `n` is decoupled from every other DOF, and a
|
|
63
|
+
* spring `k·n·nᵀ` there carries no force unless a load has a moment component along `n`.
|
|
64
|
+
*
|
|
65
|
+
* @param nodeCount - Number of nodes
|
|
66
|
+
* @param members - Node indices and global 12×12 stiffness of every member (N and mm)
|
|
67
|
+
* @param boundary - Fixed DOFs and spring stiffnesses
|
|
68
|
+
*/
|
|
69
|
+
const findAutoRestraints = (nodeCount, members, boundary) => {
|
|
70
|
+
const blocks = new Array(nodeCount).fill(null);
|
|
71
|
+
for (const m of members) {
|
|
72
|
+
[m.startIndex, m.endIndex].forEach((node, end) => {
|
|
73
|
+
const block = (blocks[node] ?? (blocks[node] = [0, 1, 2].map(() => [0, 0, 0])));
|
|
74
|
+
const base = 6 * end + 3;
|
|
75
|
+
for (let i = 0; i < 3; i++) {
|
|
76
|
+
for (let j = 0; j < 3; j++)
|
|
77
|
+
block[i][j] += m.kGlobal[base + i][base + j];
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// fallback spring for a node whose whole rotational block is zero (pure truss joints)
|
|
82
|
+
const modelScale = Math.max(1, ...blocks.flatMap((b) => (b ? [Math.abs(b[0][0]), Math.abs(b[1][1]), Math.abs(b[2][2])] : [])));
|
|
83
|
+
const restraints = [];
|
|
84
|
+
blocks.forEach((block, node) => {
|
|
85
|
+
if (!block)
|
|
86
|
+
return; // a node without members is a mechanism, left for the factorisation
|
|
87
|
+
const free = [0, 1, 2].filter((i) => !boundary.fixed[6 * node + 3 + i]);
|
|
88
|
+
if (free.length === 0)
|
|
89
|
+
return;
|
|
90
|
+
const sub = free.map((i) => free.map((j) => block[i][j] + (i === j ? boundary.spring[6 * node + 3 + i] : 0)));
|
|
91
|
+
const scale = Math.max(...sub.map((row, i) => Math.abs(row[i])));
|
|
92
|
+
const { values, vectors } = symmetricEigen(sub);
|
|
93
|
+
values.forEach((value, e) => {
|
|
94
|
+
if (scale > 0 && value > frame_constant_1.SINGULARITY_TOLERANCE * scale)
|
|
95
|
+
return;
|
|
96
|
+
const axis = [0, 0, 0];
|
|
97
|
+
free.forEach((i, k) => (axis[i] = vectors[e][k]));
|
|
98
|
+
// deterministic sign: largest component positive
|
|
99
|
+
const lead = axis.reduce((best, c, i) => (Math.abs(c) > Math.abs(axis[best]) ? i : best), 0);
|
|
100
|
+
if (axis[lead] < 0)
|
|
101
|
+
axis.forEach((c, i) => (axis[i] = -c));
|
|
102
|
+
restraints.push({ node, axis, stiffness: scale > 0 ? scale : modelScale });
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
return restraints;
|
|
106
|
+
};
|
|
107
|
+
exports.findAutoRestraints = findAutoRestraints;
|
|
108
|
+
//# sourceMappingURL=auto-restraint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-restraint.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/auto-restraint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildBoundaryConditions = void 0;
|
|
4
|
+
const end_releases_1 = require("../elements/end-releases");
|
|
4
5
|
const DOF_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
5
|
-
/** Spring stiffness unit conversion: kN/mm → N/mm, kN·m/rad → N·mm/rad. */
|
|
6
|
-
const SPRING_FACTOR = [1e3, 1e3, 1e3, 1e6, 1e6, 1e6];
|
|
7
6
|
const parse = (value, factor) => {
|
|
8
7
|
if (value === true)
|
|
9
8
|
return { fixed: true, spring: 0 };
|
|
@@ -24,7 +23,7 @@ const buildBoundaryConditions = (restraints, nodeIndex, dofCount) => {
|
|
|
24
23
|
for (const restraint of restraints) {
|
|
25
24
|
const base = 6 * nodeIndex.get(restraint.nodeId);
|
|
26
25
|
DOF_KEYS.forEach((key, k) => {
|
|
27
|
-
const parsed = parse(restraint[key],
|
|
26
|
+
const parsed = parse(restraint[key], end_releases_1.SPRING_UNIT_FACTOR[k]);
|
|
28
27
|
if (parsed.fixed)
|
|
29
28
|
fixed[base + k] = true;
|
|
30
29
|
spring[base + k] = parsed.spring;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundary-conditions.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/boundary-conditions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"boundary-conditions.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/boundary-conditions.ts"],"names":[],"mappings":";;;AAAA,2DAA8D;AAG9D,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAQ/D,MAAM,KAAK,GAAG,CACZ,KAA+B,EAC/B,MAAc,EACsB,EAAE;IACtC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC;IAC5F,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACrC,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,uBAAuB,GAAG,CACrC,UAAuB,EACvB,SAA2C,EAC3C,QAAgB,EACI,EAAE;IACtB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAU,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,GAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAY,CAAC;QAC7D,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,iCAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,KAAK;gBAAE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YACzC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC,CAAC;AAjBW,QAAA,uBAAuB,2BAiBlC"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { SectionProperties } from "../../../core/types/section-properties.type";
|
|
2
2
|
import type { Matrix } from "../../../utils/matrix";
|
|
3
3
|
import { type SkylineMatrix } from "../../../utils/skyline";
|
|
4
|
+
import { type CondensedMember } from "../elements/static-condensation";
|
|
4
5
|
import type { FrameId, FrameModel, FrameNode } from "../types/model.type";
|
|
6
|
+
import { type AutoRestraint } from "./auto-restraint";
|
|
5
7
|
import { type BoundaryConditions } from "./boundary-conditions";
|
|
6
8
|
import { type AssemblyMember } from "./global-assembly";
|
|
7
9
|
/** A member with everything that does not depend on the loads. */
|
|
@@ -10,9 +12,12 @@ export interface SystemMember extends AssemblyMember {
|
|
|
10
12
|
section: SectionProperties;
|
|
11
13
|
length: number;
|
|
12
14
|
lambda: Matrix;
|
|
13
|
-
released
|
|
15
|
+
/** True when any end DOF is released or tied by a spring. */
|
|
16
|
+
hasReleases: boolean;
|
|
14
17
|
/** Condenses a member's fixed-end forces for its end releases. */
|
|
15
|
-
condenseFixedEndForces:
|
|
18
|
+
condenseFixedEndForces: CondensedMember["condenseFixedEndForces"];
|
|
19
|
+
/** The member's own end displacements from its end nodes' (differ across releases). */
|
|
20
|
+
memberEndDisplacements: CondensedMember["memberEndDisplacements"];
|
|
16
21
|
}
|
|
17
22
|
/** The load-independent part of a frame analysis: geometry, stiffness and its factorisation. */
|
|
18
23
|
export interface FrameSystem {
|
|
@@ -26,6 +31,8 @@ export interface FrameSystem {
|
|
|
26
31
|
equation: Int32Array;
|
|
27
32
|
/** Global DOF of each equation. */
|
|
28
33
|
free: number[];
|
|
34
|
+
/** Joint rotations held because nothing resists them (see `findAutoRestraints`). */
|
|
35
|
+
autoRestraints: AutoRestraint[];
|
|
29
36
|
/** Skyline Cholesky factor of the free stiffness including springs; null when nothing is free. */
|
|
30
37
|
factor: SkylineMatrix | null;
|
|
31
38
|
/** Stored entries of the factor (a measure of bandwidth, memory and work). */
|
|
@@ -34,7 +41,8 @@ export interface FrameSystem {
|
|
|
34
41
|
/**
|
|
35
42
|
* Builds the member matrices of a model that passed `validateFrameModel`, assembles the free
|
|
36
43
|
* stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and factorises it
|
|
37
|
-
* once for all load cases.
|
|
44
|
+
* once for all load cases. Joint rotations that no member resists (e.g. at truss joints) are
|
|
45
|
+
* held by a spring along each null direction, which carries no force.
|
|
38
46
|
*
|
|
39
47
|
* @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
|
|
40
48
|
* a DOF involved in it
|
|
@@ -5,18 +5,19 @@ const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
|
5
5
|
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
6
6
|
const skyline_1 = require("../../../utils/skyline");
|
|
7
7
|
const beam_3d_stiffness_1 = require("../elements/beam-3d-stiffness");
|
|
8
|
+
const end_releases_1 = require("../elements/end-releases");
|
|
8
9
|
const static_condensation_1 = require("../elements/static-condensation");
|
|
9
10
|
const coordinate_transform_1 = require("../transformation/coordinate-transform");
|
|
10
11
|
const validate_model_1 = require("../validation/validate-model");
|
|
12
|
+
const auto_restraint_1 = require("./auto-restraint");
|
|
11
13
|
const boundary_conditions_1 = require("./boundary-conditions");
|
|
12
14
|
const global_assembly_1 = require("./global-assembly");
|
|
13
|
-
const RELEASE_KEYS = ["u1", "u2", "u3", "r1", "r2", "r3"];
|
|
14
15
|
const DOF_NAMES = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
15
|
-
const releasedIndices = (release, offset) => RELEASE_KEYS.flatMap((key, k) => (release?.[key] ? [offset + k] : []));
|
|
16
16
|
/**
|
|
17
17
|
* Builds the member matrices of a model that passed `validateFrameModel`, assembles the free
|
|
18
18
|
* stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and factorises it
|
|
19
|
-
* once for all load cases.
|
|
19
|
+
* once for all load cases. Joint rotations that no member resists (e.g. at truss joints) are
|
|
20
|
+
* held by a spring along each null direction, which carries no force.
|
|
20
21
|
*
|
|
21
22
|
* @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
|
|
22
23
|
* a DOF involved in it
|
|
@@ -32,11 +33,8 @@ const prepareFrameSystem = (model) => {
|
|
|
32
33
|
const end = nodes[nodeIndex.get(member.endNodeId)];
|
|
33
34
|
const { length, lambda } = (0, coordinate_transform_1.memberAxes)([start.x, start.y, start.z], [end.x, end.y, end.z], member.angle ?? 0);
|
|
34
35
|
const { E, G, A, I22, I33, J } = member.section;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
...releasedIndices(member.releases?.end, 6),
|
|
38
|
-
];
|
|
39
|
-
const condensed = (0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, length), releasedDofs);
|
|
36
|
+
const releases = (0, end_releases_1.memberEndReleases)(member.releases);
|
|
37
|
+
const condensed = (0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, length), releases);
|
|
40
38
|
return {
|
|
41
39
|
id: member.id,
|
|
42
40
|
section: member.section,
|
|
@@ -44,8 +42,9 @@ const prepareFrameSystem = (model) => {
|
|
|
44
42
|
endIndex: nodeIndex.get(member.endNodeId),
|
|
45
43
|
T: (0, coordinate_transform_1.transformationMatrix)(lambda),
|
|
46
44
|
k: condensed.k,
|
|
45
|
+
hasReleases: releases.length > 0,
|
|
47
46
|
condenseFixedEndForces: condensed.condenseFixedEndForces,
|
|
48
|
-
|
|
47
|
+
memberEndDisplacements: condensed.memberEndDisplacements,
|
|
49
48
|
length,
|
|
50
49
|
lambda,
|
|
51
50
|
};
|
|
@@ -67,6 +66,12 @@ const prepareFrameSystem = (model) => {
|
|
|
67
66
|
}
|
|
68
67
|
}
|
|
69
68
|
}
|
|
69
|
+
const kGlobal = systemMembers.map(global_assembly_1.memberGlobalStiffness);
|
|
70
|
+
const autoRestraints = (0, auto_restraint_1.findAutoRestraints)(nodes.length, systemMembers.map((m, i) => ({
|
|
71
|
+
startIndex: m.startIndex,
|
|
72
|
+
endIndex: m.endIndex,
|
|
73
|
+
kGlobal: kGlobal[i],
|
|
74
|
+
})), boundary);
|
|
70
75
|
// ---- Profile, assembly and factorisation -----------------------------------------
|
|
71
76
|
let factor = null;
|
|
72
77
|
if (free.length > 0) {
|
|
@@ -80,16 +85,14 @@ const prepareFrameSystem = (model) => {
|
|
|
80
85
|
first[e] = low;
|
|
81
86
|
}
|
|
82
87
|
const K = (0, skyline_1.createSkyline)(first);
|
|
83
|
-
|
|
84
|
-
const kGlobal = (0, global_assembly_1.memberGlobalStiffness)(m);
|
|
85
|
-
const eqs = memberEquations[index];
|
|
88
|
+
memberEquations.forEach((eqs, index) => {
|
|
86
89
|
// a member's 12 DOFs are distinct, so each unordered pair and each diagonal is added once
|
|
87
90
|
for (let a = 0; a < 12; a++) {
|
|
88
91
|
if (eqs[a] < 0)
|
|
89
92
|
continue;
|
|
90
93
|
for (let b = 0; b < 12; b++) {
|
|
91
94
|
if (eqs[b] >= eqs[a])
|
|
92
|
-
(0, skyline_1.skylineAdd)(K, eqs[a], eqs[b], kGlobal[a][b]);
|
|
95
|
+
(0, skyline_1.skylineAdd)(K, eqs[a], eqs[b], kGlobal[index][a][b]);
|
|
93
96
|
}
|
|
94
97
|
}
|
|
95
98
|
});
|
|
@@ -97,6 +100,19 @@ const prepareFrameSystem = (model) => {
|
|
|
97
100
|
if (boundary.spring[dof] > 0)
|
|
98
101
|
(0, skyline_1.skylineAdd)(K, e, e, boundary.spring[dof]);
|
|
99
102
|
});
|
|
103
|
+
// k·n·nᵀ on the node's free rotations, inside the profile: its members span all 6 node DOFs
|
|
104
|
+
for (const { node, axis, stiffness } of autoRestraints) {
|
|
105
|
+
for (let i = 0; i < 3; i++) {
|
|
106
|
+
const ei = equation[6 * node + 3 + i];
|
|
107
|
+
if (ei < 0)
|
|
108
|
+
continue;
|
|
109
|
+
for (let j = 0; j < 3; j++) {
|
|
110
|
+
const ej = equation[6 * node + 3 + j];
|
|
111
|
+
if (ej >= ei)
|
|
112
|
+
(0, skyline_1.skylineAdd)(K, ei, ej, stiffness * axis[i] * axis[j]);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
100
116
|
const result = (0, skyline_1.skylineFactor)(K, frame_constant_1.SINGULARITY_TOLERANCE);
|
|
101
117
|
if (!result.ok) {
|
|
102
118
|
const dof = free[result.failedPivot];
|
|
@@ -118,6 +134,7 @@ const prepareFrameSystem = (model) => {
|
|
|
118
134
|
boundary,
|
|
119
135
|
equation,
|
|
120
136
|
free,
|
|
137
|
+
autoRestraints,
|
|
121
138
|
factor,
|
|
122
139
|
profileSize: factor ? (0, skyline_1.skylineSize)(factor) : 0,
|
|
123
140
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame-system.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/frame-system.ts"],"names":[],"mappings":";;;AAAA,uEAA2E;AAC3E,gFAAoE;AAGpE,gDAO4B;AAE5B,qEAAgF;AAChF,
|
|
1
|
+
{"version":3,"file":"frame-system.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/frame-system.ts"],"names":[],"mappings":";;;AAAA,uEAA2E;AAC3E,gFAAoE;AAGpE,gDAO4B;AAE5B,qEAAgF;AAChF,2DAA6D;AAC7D,yEAAuF;AACvF,iFAA0F;AAE1F,iEAAuE;AACvE,qDAA0E;AAC1E,+DAAyF;AACzF,uDAA2F;AAE3F,MAAM,SAAS,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAoChE;;;;;;;;GAQG;AACI,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAe,EAAE;IACnE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,CAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAA,6CAAuB,EAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE1E,MAAM,aAAa,GAAmB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAW,CAAC,CAAC;QACjE,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAW,CAAC,CAAC;QAC7D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,iCAAU,EACnC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAC3B,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EACrB,MAAM,CAAC,KAAK,IAAI,CAAC,CAClB,CAAC;QACF,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,QAAQ,GAAG,IAAA,gCAAiB,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,IAAA,oCAAc,EAC9B,IAAA,mDAA+B,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,EAC7D,QAAQ,CACT,CAAC;QACF,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAW;YACvD,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAW;YACnD,CAAC,EAAE,IAAA,2CAAoB,EAAC,MAAM,CAAC;YAC/B,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;YAChC,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;YACxD,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;YACxD,MAAM;YACN,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,qFAAqF;IACrF,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,IAAA,6BAAmB,EAAC,SAAS,CAAC,EAAE,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,uCAAqB,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,IAAA,mCAAkB,EACvC,KAAK,CAAC,MAAM,EACZ,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;KACpB,CAAC,CAAC,EACH,QAAQ,CACT,CAAC;IAEF,qFAAqF;IACrF,IAAI,MAAM,GAAyB,IAAI,CAAC;IACxC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,eAAe,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,4BAAU,EAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,MAAM;gBAAE,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;oBAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAC7D,CAAC;QAED,MAAM,CAAC,GAAG,IAAA,uBAAa,EAAC,KAAK,CAAC,CAAC;QAC/B,eAAe,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YACrC,0FAA0F;YAC1F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;wBAAE,IAAA,oBAAU,EAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5E,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YACtB,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,IAAA,oBAAU,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QACH,4FAA4F;QAC5F,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,cAAc,EAAE,CAAC;YACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtC,IAAI,EAAE,GAAG,CAAC;oBAAE,SAAS;gBACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBACtC,IAAI,EAAE,IAAI,EAAE;wBAAE,IAAA,oBAAU,EAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,uBAAa,EAAC,CAAC,EAAE,sCAAqB,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACrC,IAAA,4BAAW,EAAC;gBACV,IAAA,2BAAU,EAAC,kCAAW,CAAC,kBAAkB,EAAE;oBACzC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;oBACrC,GAAG,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;iBACxB,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,CAAC,CAAC;IACb,CAAC;IAED,OAAO;QACL,KAAK;QACL,SAAS;QACT,WAAW;QACX,OAAO,EAAE,aAAa;QACtB,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,IAAI;QACJ,cAAc;QACd,MAAM;QACN,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,IAAA,qBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC,CAAC;AA/HW,QAAA,kBAAkB,sBA+H7B"}
|
|
@@ -20,7 +20,8 @@ export interface RawState {
|
|
|
20
20
|
* @param loadCase - The load case (id and self-weight multiplier)
|
|
21
21
|
* @param loads - The nodal and member loads tagged with this load case
|
|
22
22
|
*
|
|
23
|
-
* @throws {FrameAnalysisError}
|
|
23
|
+
* @throws {FrameAnalysisError} 304 if a load has a moment about a joint rotation that nothing
|
|
24
|
+
* resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
|
|
24
25
|
* requested for a member without `unitWeight`
|
|
25
26
|
*/
|
|
26
27
|
export declare const solveLoadCase: (system: FrameSystem, loadCase: LoadCase, loads: {
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.combineStates = exports.solveLoadCase = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
4
5
|
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
5
6
|
const matrix_1 = require("../../../utils/matrix");
|
|
6
7
|
const skyline_1 = require("../../../utils/skyline");
|
|
7
8
|
const fixed_end_forces_1 = require("../elements/fixed-end-forces");
|
|
9
|
+
const validate_model_1 = require("../validation/validate-model");
|
|
8
10
|
const global_assembly_1 = require("./global-assembly");
|
|
9
11
|
const GLOBAL_DIRECTIONS = {
|
|
10
12
|
X: [1, 0, 0],
|
|
@@ -51,7 +53,8 @@ const toLocalLoads = (load, lambda, L) => {
|
|
|
51
53
|
* @param loadCase - The load case (id and self-weight multiplier)
|
|
52
54
|
* @param loads - The nodal and member loads tagged with this load case
|
|
53
55
|
*
|
|
54
|
-
* @throws {FrameAnalysisError}
|
|
56
|
+
* @throws {FrameAnalysisError} 304 if a load has a moment about a joint rotation that nothing
|
|
57
|
+
* resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
|
|
55
58
|
* requested for a member without `unitWeight`
|
|
56
59
|
*/
|
|
57
60
|
const solveLoadCase = (system, loadCase, loads) => {
|
|
@@ -92,6 +95,25 @@ const solveLoadCase = (system, loadCase, loads) => {
|
|
|
92
95
|
[load.fx, load.fy, load.fz].forEach((v, k) => (F[base + k] += (v ?? 0) * 1e3));
|
|
93
96
|
[load.mx, load.my, load.mz].forEach((v, k) => (F[base + 3 + k] += (v ?? 0) * 1e6));
|
|
94
97
|
}
|
|
98
|
+
// A held rotation axis is decoupled from the structure: a moment about it has no load path.
|
|
99
|
+
let momentScale = 0;
|
|
100
|
+
for (let n = 0; n < system.nodes.length; n++) {
|
|
101
|
+
for (let k = 3; k < 6; k++)
|
|
102
|
+
momentScale = Math.max(momentScale, Math.abs(F[6 * n + k]));
|
|
103
|
+
}
|
|
104
|
+
for (const { node, axis } of system.autoRestraints) {
|
|
105
|
+
const moment = axis.reduce((sum, a, i) => sum + a * F[6 * node + 3 + i], 0);
|
|
106
|
+
if (Math.abs(moment) > frame_constant_1.SINGULARITY_TOLERANCE * momentScale) {
|
|
107
|
+
const lead = axis.reduce((best, a, i) => (Math.abs(a) > Math.abs(axis[best]) ? i : best), 0);
|
|
108
|
+
(0, validate_model_1.throwIssues)([
|
|
109
|
+
(0, validate_model_1.frameIssue)(frame_analysis_error_1.FrameErrors.STRUCTURE_UNSTABLE, {
|
|
110
|
+
nodeId: system.nodes[node].id,
|
|
111
|
+
dof: ["rx", "ry", "rz"][lead],
|
|
112
|
+
loadCaseId: loadCase.id,
|
|
113
|
+
}),
|
|
114
|
+
]);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
95
117
|
const U = new Array(dofCount).fill(0);
|
|
96
118
|
if (factor) {
|
|
97
119
|
const solution = (0, skyline_1.skylineSolve)(factor, free.map((dof) => F[dof]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/load-case-solver.ts"],"names":[],"mappings":";;;AAAA,gFAAwF;AACxF,8CAAwD;AACxD,gDAAkD;AAElD,mEAAoF;
|
|
1
|
+
{"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/load-case-solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,14 +17,20 @@ export interface Restraint {
|
|
|
17
17
|
ry?: DofRestraint;
|
|
18
18
|
rz?: DofRestraint;
|
|
19
19
|
}
|
|
20
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* How a member end DOF is tied to its node: `true` (or 0) is a full release that carries no
|
|
22
|
+
* force, a positive number is a spring stiffness in series with the member end (partial
|
|
23
|
+
* fixity), omitted/`false` is a rigid connection.
|
|
24
|
+
*/
|
|
25
|
+
export type DofRelease = boolean | number;
|
|
26
|
+
/** Local end DOFs of a member that are released (hinges, rollers…) or partially fixed. */
|
|
21
27
|
export interface MemberEndRelease {
|
|
22
|
-
u1?:
|
|
23
|
-
u2?:
|
|
24
|
-
u3?:
|
|
25
|
-
r1?:
|
|
26
|
-
r2?:
|
|
27
|
-
r3?:
|
|
28
|
+
u1?: DofRelease;
|
|
29
|
+
u2?: DofRelease;
|
|
30
|
+
u3?: DofRelease;
|
|
31
|
+
r1?: DofRelease;
|
|
32
|
+
r2?: DofRelease;
|
|
33
|
+
r3?: DofRelease;
|
|
28
34
|
}
|
|
29
35
|
export interface Member {
|
|
30
36
|
id: FrameId;
|
|
@@ -32,11 +32,37 @@ export interface MemberEndForces {
|
|
|
32
32
|
start: MemberEndForce;
|
|
33
33
|
end: MemberEndForce;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Relative displacement across the release at one member end, node minus member, in local
|
|
37
|
+
* axes 1, 2, 3 (right-hand rotations). 0 at rigidly connected DOFs. At a spring it equals the
|
|
38
|
+
* end force divided by the spring stiffness.
|
|
39
|
+
*/
|
|
40
|
+
export interface ReleaseDeformation {
|
|
41
|
+
u1: number;
|
|
42
|
+
u2: number;
|
|
43
|
+
u3: number;
|
|
44
|
+
r1: number;
|
|
45
|
+
r2: number;
|
|
46
|
+
r3: number;
|
|
47
|
+
}
|
|
48
|
+
export interface MemberReleaseDeformations {
|
|
49
|
+
memberId: FrameId;
|
|
50
|
+
start: ReleaseDeformation;
|
|
51
|
+
end: ReleaseDeformation;
|
|
52
|
+
}
|
|
53
|
+
/** A rotation direction at a node held by `analyzeFrame` because no member resists it. */
|
|
54
|
+
export interface AutoRestrainedDof {
|
|
55
|
+
nodeId: FrameId;
|
|
56
|
+
/** Unit vector of the held rotation axis, global X, Y, Z. */
|
|
57
|
+
axis: [number, number, number];
|
|
58
|
+
/** The global rotation DOF when `axis` is a global axis. */
|
|
59
|
+
dof?: "rx" | "ry" | "rz";
|
|
60
|
+
}
|
|
35
61
|
/**
|
|
36
62
|
* Internal forces and displacements at a distance `x` from the member start. Forces act on
|
|
37
|
-
* the positive (+1) face of the cut; N is positive in tension. Displacements
|
|
38
|
-
* rigid-body motion
|
|
39
|
-
* across a released
|
|
63
|
+
* the positive (+1) face of the cut; N is positive in tension. Displacements are the member's
|
|
64
|
+
* own, including its rigid-body motion: at the ends they equal the node displacements except
|
|
65
|
+
* across a released or spring end DOF (see `MemberReleaseDeformations`).
|
|
40
66
|
*/
|
|
41
67
|
export interface MemberStation {
|
|
42
68
|
x: number;
|
|
@@ -89,6 +115,8 @@ export interface FrameCaseResult {
|
|
|
89
115
|
nodalDisplacements: NodalDisplacement[];
|
|
90
116
|
reactions: NodalReaction[];
|
|
91
117
|
memberEndForces: MemberEndForces[];
|
|
118
|
+
/** One entry per member with any released or spring end DOF, in model order. */
|
|
119
|
+
releaseDeformations: MemberReleaseDeformations[];
|
|
92
120
|
memberDiagrams: MemberDiagram[];
|
|
93
121
|
equilibriumResidual: {
|
|
94
122
|
force: number;
|
|
@@ -123,6 +151,8 @@ export interface FrameResult {
|
|
|
123
151
|
profileSize: number;
|
|
124
152
|
loadCaseCount: number;
|
|
125
153
|
combinationCount: number;
|
|
154
|
+
/** Joint rotations held because every member there releases them (e.g. truss joints). */
|
|
155
|
+
autoRestrainedDofs: AutoRestrainedDof[];
|
|
126
156
|
};
|
|
127
157
|
units: {
|
|
128
158
|
force: "kN";
|
|
@@ -6,12 +6,12 @@ const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
|
6
6
|
const area_geometry_1 = require("../area/area-geometry");
|
|
7
7
|
const edge_members_1 = require("../area/edge-members");
|
|
8
8
|
const beam_3d_stiffness_1 = require("../elements/beam-3d-stiffness");
|
|
9
|
+
const end_releases_1 = require("../elements/end-releases");
|
|
9
10
|
const static_condensation_1 = require("../elements/static-condensation");
|
|
10
11
|
const combinations_1 = require("../solver/combinations");
|
|
11
12
|
const DOF_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
12
13
|
const NODAL_LOAD_KEYS = ["fx", "fy", "fz", "mx", "my", "mz"];
|
|
13
14
|
const SECTION_KEYS = ["E", "G", "A", "I22", "I33", "J"];
|
|
14
|
-
const RELEASE_KEYS = ["u1", "u2", "u3", "r1", "r2", "r3"];
|
|
15
15
|
const DIRECTIONS = new Set(["1", "2", "3", "X", "Y", "Z"]);
|
|
16
16
|
const AREA_DIRECTIONS = {
|
|
17
17
|
"3": "normal",
|
|
@@ -60,7 +60,6 @@ const throwIssues = (issues) => {
|
|
|
60
60
|
throw new frame_analysis_error_1.FrameAnalysisError({ code: first.code, message: first.message }, first.details, issues);
|
|
61
61
|
};
|
|
62
62
|
exports.throwIssues = throwIssues;
|
|
63
|
-
const releasedIndices = (release, offset) => RELEASE_KEYS.flatMap((key, k) => (release?.[key] ? [offset + k] : []));
|
|
64
63
|
/**
|
|
65
64
|
* Checks a frame model without analysing it and returns every problem found, each with the
|
|
66
65
|
* node, member, load case, combination and field it concerns. An empty array means the
|
|
@@ -145,6 +144,20 @@ const validateFrameModel = (model) => {
|
|
|
145
144
|
if (member.angle !== undefined && !isFiniteNumber(member.angle)) {
|
|
146
145
|
add(frame_analysis_error_1.FrameErrors.INVALID_INPUT_VALUE, { ...at, field: "angle" });
|
|
147
146
|
}
|
|
147
|
+
// each release value: true/false, or a spring stiffness ≥ 0 (0 = full release)
|
|
148
|
+
let releasesOk = true;
|
|
149
|
+
for (const end of ["start", "end"]) {
|
|
150
|
+
const release = member.releases?.[end];
|
|
151
|
+
if (release === undefined)
|
|
152
|
+
continue;
|
|
153
|
+
for (const key of end_releases_1.RELEASE_KEYS) {
|
|
154
|
+
const v = release[key];
|
|
155
|
+
if (v === undefined || typeof v === "boolean" || (isFiniteNumber(v) && v >= 0))
|
|
156
|
+
continue;
|
|
157
|
+
add(frame_analysis_error_1.FrameErrors.INVALID_INPUT_VALUE, { ...at, field: `releases.${end}.${key}` });
|
|
158
|
+
releasesOk = false;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
148
161
|
if (!geometryOk)
|
|
149
162
|
continue;
|
|
150
163
|
const a = nodeById.get(member.startNodeId);
|
|
@@ -155,14 +168,11 @@ const validateFrameModel = (model) => {
|
|
|
155
168
|
continue;
|
|
156
169
|
}
|
|
157
170
|
memberLength.set(member.id, L);
|
|
158
|
-
const
|
|
159
|
-
|
|
160
|
-
...releasedIndices(member.releases?.end, 6),
|
|
161
|
-
];
|
|
162
|
-
if (sectionOk && released.length > 0) {
|
|
171
|
+
const releases = releasesOk ? (0, end_releases_1.memberEndReleases)(member.releases) : [];
|
|
172
|
+
if (sectionOk && releases.length > 0) {
|
|
163
173
|
const { E, G, A, I22, I33, J } = section;
|
|
164
174
|
try {
|
|
165
|
-
(0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, L),
|
|
175
|
+
(0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, L), releases);
|
|
166
176
|
}
|
|
167
177
|
catch {
|
|
168
178
|
add(frame_analysis_error_1.FrameErrors.INVALID_RELEASE, at);
|