@theerapat-s28/ts-structural-eng-tools 2.3.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +80 -1
- package/README.md +35 -11
- package/dist/core/constants/frame.constant.d.ts +15 -0
- package/dist/core/constants/frame.constant.js +16 -1
- package/dist/core/constants/frame.constant.js.map +1 -1
- package/dist/core/errors/frame-analysis.error.d.ts +1 -0
- package/dist/core/errors/frame-analysis.error.js +18 -2
- package/dist/core/errors/frame-analysis.error.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/esm/core/constants/frame.constant.js +15 -0
- package/dist/esm/core/constants/frame.constant.js.map +1 -1
- package/dist/esm/core/errors/frame-analysis.error.js +18 -2
- package/dist/esm/core/errors/frame-analysis.error.js.map +1 -1
- package/dist/esm/core/index.js +1 -1
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/fea/frame/elements/shell/dkq-plate.js +109 -0
- package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/flat-shell.js +111 -0
- package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/membrane-quad.js +107 -0
- package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/quad-geometry.js +127 -0
- package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/rigidity.js +19 -0
- package/dist/esm/fea/frame/elements/shell/rigidity.js.map +1 -0
- package/dist/esm/fea/frame/elements/shell/shell-axes.js +97 -0
- package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +1 -0
- package/dist/esm/fea/frame/mesh/expand-model.js +129 -0
- package/dist/esm/fea/frame/mesh/expand-model.js.map +1 -0
- package/dist/esm/fea/frame/mesh/mesh-shells.js +239 -0
- package/dist/esm/fea/frame/mesh/mesh-shells.js.map +1 -0
- package/dist/esm/fea/frame/post/envelope.js +38 -1
- package/dist/esm/fea/frame/post/envelope.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js +51 -2
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/post/present-state.js +34 -16
- package/dist/esm/fea/frame/post/present-state.js.map +1 -1
- package/dist/esm/fea/frame/post/shell-forces.js +111 -0
- package/dist/esm/fea/frame/post/shell-forces.js.map +1 -0
- package/dist/esm/fea/frame/solver/analyze-frame.js +27 -7
- package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/esm/fea/frame/solver/auto-restraint.js +58 -10
- package/dist/esm/fea/frame/solver/auto-restraint.js.map +1 -1
- package/dist/esm/fea/frame/solver/frame-system.js +148 -40
- package/dist/esm/fea/frame/solver/frame-system.js.map +1 -1
- package/dist/esm/fea/frame/solver/global-assembly.js +5 -3
- package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -1
- package/dist/esm/fea/frame/solver/load-case-solver.js +102 -9
- package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-model.js +120 -3
- package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/fea/frame/elements/shell/dkq-plate.d.ts +50 -0
- package/dist/fea/frame/elements/shell/dkq-plate.js +115 -0
- package/dist/fea/frame/elements/shell/dkq-plate.js.map +1 -0
- package/dist/fea/frame/elements/shell/flat-shell.d.ts +63 -0
- package/dist/fea/frame/elements/shell/flat-shell.js +118 -0
- package/dist/fea/frame/elements/shell/flat-shell.js.map +1 -0
- package/dist/fea/frame/elements/shell/membrane-quad.d.ts +61 -0
- package/dist/fea/frame/elements/shell/membrane-quad.js +113 -0
- package/dist/fea/frame/elements/shell/membrane-quad.js.map +1 -0
- package/dist/fea/frame/elements/shell/quad-geometry.d.ts +71 -0
- package/dist/fea/frame/elements/shell/quad-geometry.js +136 -0
- package/dist/fea/frame/elements/shell/quad-geometry.js.map +1 -0
- package/dist/fea/frame/elements/shell/rigidity.d.ts +14 -0
- package/dist/fea/frame/elements/shell/rigidity.js +23 -0
- package/dist/fea/frame/elements/shell/rigidity.js.map +1 -0
- package/dist/fea/frame/elements/shell/shell-axes.d.ts +43 -0
- package/dist/fea/frame/elements/shell/shell-axes.js +102 -0
- package/dist/fea/frame/elements/shell/shell-axes.js.map +1 -0
- package/dist/fea/frame/index.d.ts +2 -2
- package/dist/fea/frame/mesh/expand-model.d.ts +29 -0
- package/dist/fea/frame/mesh/expand-model.js +133 -0
- package/dist/fea/frame/mesh/expand-model.js.map +1 -0
- package/dist/fea/frame/mesh/mesh-shells.d.ts +38 -0
- package/dist/fea/frame/mesh/mesh-shells.js +244 -0
- package/dist/fea/frame/mesh/mesh-shells.js.map +1 -0
- package/dist/fea/frame/post/envelope.js +38 -1
- package/dist/fea/frame/post/envelope.js.map +1 -1
- package/dist/fea/frame/post/member-diagram.d.ts +21 -1
- package/dist/fea/frame/post/member-diagram.js +53 -3
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/post/present-state.d.ts +3 -2
- package/dist/fea/frame/post/present-state.js +33 -15
- package/dist/fea/frame/post/present-state.js.map +1 -1
- package/dist/fea/frame/post/shell-forces.d.ts +27 -0
- package/dist/fea/frame/post/shell-forces.js +116 -0
- package/dist/fea/frame/post/shell-forces.js.map +1 -0
- package/dist/fea/frame/solver/analyze-frame.d.ts +8 -4
- package/dist/fea/frame/solver/analyze-frame.js +27 -7
- package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
- package/dist/fea/frame/solver/auto-restraint.d.ts +23 -10
- package/dist/fea/frame/solver/auto-restraint.js +60 -11
- package/dist/fea/frame/solver/auto-restraint.js.map +1 -1
- package/dist/fea/frame/solver/frame-system.d.ts +47 -8
- package/dist/fea/frame/solver/frame-system.js +146 -38
- package/dist/fea/frame/solver/frame-system.js.map +1 -1
- package/dist/fea/frame/solver/global-assembly.d.ts +11 -0
- package/dist/fea/frame/solver/global-assembly.js +7 -4
- package/dist/fea/frame/solver/global-assembly.js.map +1 -1
- package/dist/fea/frame/solver/load-case-solver.d.ts +11 -1
- package/dist/fea/frame/solver/load-case-solver.js +100 -7
- package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +82 -4
- package/dist/fea/frame/types/results.type.d.ts +61 -1
- package/dist/fea/frame/validation/validate-model.d.ts +3 -2
- package/dist/fea/frame/validation/validate-model.js +120 -3
- package/dist/fea/frame/validation/validate-model.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,7 @@ const distribute_area_loads_1 = require("../area/distribute-area-loads");
|
|
|
6
6
|
const envelope_1 = require("../post/envelope");
|
|
7
7
|
const present_state_1 = require("../post/present-state");
|
|
8
8
|
const validate_model_1 = require("../validation/validate-model");
|
|
9
|
+
const expand_model_1 = require("../mesh/expand-model");
|
|
9
10
|
const combinations_1 = require("./combinations");
|
|
10
11
|
const frame_system_1 = require("./frame-system");
|
|
11
12
|
const load_case_solver_1 = require("./load-case-solver");
|
|
@@ -41,14 +42,16 @@ const groupByCase = (loads = []) => {
|
|
|
41
42
|
* null areas, and combinations
|
|
42
43
|
* @param options - Diagram station count and detail
|
|
43
44
|
* @returns `{ result, memberDiagram }`
|
|
44
|
-
* @throws {FrameAnalysisError} 301–317 for an invalid model (with `details` and
|
|
45
|
-
* `issues`),
|
|
45
|
+
* @throws {FrameAnalysisError} 301–317, 326 and 327 for an invalid model (with `details` and
|
|
46
|
+
* every problem in `issues`), 328 for a translation nothing resists at a node connected only
|
|
47
|
+
* to shells, 304 for an unstable structure
|
|
46
48
|
*/
|
|
47
49
|
const createFrameAnalysis = (model, options = {}) => {
|
|
48
50
|
const issues = (0, validate_model_1.validateFrameModel)(model);
|
|
49
51
|
if (issues.length > 0)
|
|
50
52
|
(0, validate_model_1.throwIssues)(issues);
|
|
51
|
-
const
|
|
53
|
+
const expanded = (0, expand_model_1.expandModel)(model);
|
|
54
|
+
const system = (0, frame_system_1.prepareFrameSystem)(expanded.model);
|
|
52
55
|
const combinations = model.combinations ?? [];
|
|
53
56
|
const resolved = (0, combinations_1.resolveCombinations)(combinations, new Set(model.loadCases.map((c) => c.id)));
|
|
54
57
|
const withStations = (options.diagrams ?? "full") === "full";
|
|
@@ -60,10 +63,13 @@ const createFrameAnalysis = (model, options = {}) => {
|
|
|
60
63
|
...(model.memberLoads ?? []),
|
|
61
64
|
...fromAreas.memberLoads,
|
|
62
65
|
]);
|
|
66
|
+
// area loads on shells load the shell elements; those on null areas became member loads
|
|
67
|
+
const shellByCase = groupByCase((model.areaLoads ?? []).filter((load) => system.shellsByArea.has(load.areaId)));
|
|
63
68
|
for (const loadCase of model.loadCases) {
|
|
64
69
|
const state = (0, load_case_solver_1.solveLoadCase)(system, loadCase, {
|
|
65
70
|
nodalLoads: nodalByCase.get(loadCase.id) ?? [],
|
|
66
71
|
memberLoads: memberByCase.get(loadCase.id) ?? [],
|
|
72
|
+
shellLoads: shellByCase.get(loadCase.id) ?? [],
|
|
67
73
|
});
|
|
68
74
|
states.set(loadCase.id, state);
|
|
69
75
|
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 });
|
|
@@ -79,6 +85,7 @@ const createFrameAnalysis = (model, options = {}) => {
|
|
|
79
85
|
}
|
|
80
86
|
const warnings = [
|
|
81
87
|
...fromAreas.warnings,
|
|
88
|
+
...expanded.warnings,
|
|
82
89
|
...[...Object.values(cases), ...Object.values(combinationResults)].flatMap((r) => r.warnings.map((w) => ({
|
|
83
90
|
...w,
|
|
84
91
|
message: `${r.kind === "case" ? "Load case" : "Load combination"} "${r.id}": ${w.message}`,
|
|
@@ -89,9 +96,11 @@ const createFrameAnalysis = (model, options = {}) => {
|
|
|
89
96
|
cases,
|
|
90
97
|
combinations: combinationResults,
|
|
91
98
|
envelope: combinationList.length > 0 ? (0, envelope_1.buildEnvelope)(combinationList) : undefined,
|
|
99
|
+
...(expanded.mesh ? { mesh: expanded.mesh } : {}),
|
|
92
100
|
calculationDetails: {
|
|
93
101
|
nodeCount: system.nodes.length,
|
|
94
|
-
memberCount: system.
|
|
102
|
+
memberCount: system.memberGroups.length,
|
|
103
|
+
shellCount: system.shells.length,
|
|
95
104
|
dofCount: system.dofCount,
|
|
96
105
|
freeDofCount: system.free.length,
|
|
97
106
|
profileSize: system.profileSize,
|
|
@@ -99,7 +108,15 @@ const createFrameAnalysis = (model, options = {}) => {
|
|
|
99
108
|
combinationCount: combinations.length,
|
|
100
109
|
autoRestrainedDofs: autoRestrainedDofs(system),
|
|
101
110
|
},
|
|
102
|
-
units: {
|
|
111
|
+
units: {
|
|
112
|
+
force: "kN",
|
|
113
|
+
moment: "kN·m",
|
|
114
|
+
length: "mm",
|
|
115
|
+
rotation: "rad",
|
|
116
|
+
forcePerLength: "kN/m",
|
|
117
|
+
momentPerLength: "kN·m/m",
|
|
118
|
+
stress: "MPa",
|
|
119
|
+
},
|
|
103
120
|
warnings,
|
|
104
121
|
};
|
|
105
122
|
return {
|
|
@@ -133,6 +150,8 @@ exports.createFrameAnalysis = createFrameAnalysis;
|
|
|
133
150
|
*
|
|
134
151
|
* Area loads on null areas (`areas`, `areaLoads`) are first turned into member loads on the
|
|
135
152
|
* members along each area's edges (see `distributeAreaLoads`); the areas add no stiffness.
|
|
153
|
+
* Shell areas (`shells`) are four-node flat shell elements with their own stiffness; area loads
|
|
154
|
+
* and self-weight on them act as forces at their corners.
|
|
136
155
|
*
|
|
137
156
|
* Model and result are plain data (JSON-serialisable), so the analysis can run in a Web Worker.
|
|
138
157
|
*
|
|
@@ -141,8 +160,9 @@ exports.createFrameAnalysis = createFrameAnalysis;
|
|
|
141
160
|
* @param options - Diagram station count and detail
|
|
142
161
|
* @returns `cases` and `combinations` keyed by id, `envelope` over the combinations,
|
|
143
162
|
* `calculationDetails`, `units` and `warnings`
|
|
144
|
-
* @throws {FrameAnalysisError} 301–317 for an invalid model (with `details` and
|
|
145
|
-
* `issues`),
|
|
163
|
+
* @throws {FrameAnalysisError} 301–317, 326 and 327 for an invalid model (with `details` and
|
|
164
|
+
* every problem in `issues`), 328 for a translation nothing resists at a node connected only
|
|
165
|
+
* to shells, 304 for an unstable structure
|
|
146
166
|
*/
|
|
147
167
|
const analyzeFrame = (model, options = {}) => (0, exports.createFrameAnalysis)(model, options).result;
|
|
148
168
|
exports.analyzeFrame = analyzeFrame;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyze-frame.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/analyze-frame.ts"],"names":[],"mappings":";;;AACA,0CAAuD;AAEvD,yEAAgE;AAChE,+CAAiD;AACjD,yDAA2E;AAQ3E,iEAA+E;AAC/E,iDAAqD;AACrD,iDAAsE;AACtE,yDAAiF;AA8BjF,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAElD,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,CAAC,MAAmB,EAAuB,EAAE,CACtE,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
|
|
1
|
+
{"version":3,"file":"analyze-frame.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/analyze-frame.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { Matrix } from "../../../utils/matrix";
|
|
2
1
|
import type { BoundaryConditions } from "./boundary-conditions";
|
|
2
|
+
import type { StiffnessElement } from "./global-assembly";
|
|
3
3
|
/** A rotation direction at a node that no member, restraint or spring resists. */
|
|
4
4
|
export interface AutoRestraint {
|
|
5
5
|
node: number;
|
|
@@ -10,19 +10,32 @@ export interface AutoRestraint {
|
|
|
10
10
|
* Finds the joint rotations that nothing resists, so they can be held instead of making the
|
|
11
11
|
* stiffness singular — e.g. a truss joint where every member releases its end moments.
|
|
12
12
|
*
|
|
13
|
-
* For each node with
|
|
14
|
-
*
|
|
13
|
+
* For each node with elements, the free rotational block `B` (3×3, global) of the assembled
|
|
14
|
+
* element stiffness plus rotational springs is decomposed; every eigenvector whose eigenvalue
|
|
15
15
|
* is below `SINGULARITY_TOLERANCE` times the block's largest diagonal is a null direction `n`.
|
|
16
|
-
* Each
|
|
16
|
+
* Each element's global stiffness is positive semi-definite, so `nᵀ·B·n = 0` makes the whole
|
|
17
17
|
* stiffness column of `n` zero: the rotation along `n` is decoupled from every other DOF, and a
|
|
18
18
|
* spring `k·n·nᵀ` there carries no force unless a load has a moment component along `n`.
|
|
19
19
|
*
|
|
20
20
|
* @param nodeCount - Number of nodes
|
|
21
|
-
* @param
|
|
21
|
+
* @param elements - Node indices and global stiffness (6 DOFs per node) of every element, members
|
|
22
|
+
* included (N and mm)
|
|
22
23
|
* @param boundary - Fixed DOFs and spring stiffnesses
|
|
23
24
|
*/
|
|
24
|
-
export declare const findAutoRestraints: (nodeCount: number,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
export declare const findAutoRestraints: (nodeCount: number, elements: StiffnessElement[], boundary: BoundaryConditions) => AutoRestraint[];
|
|
26
|
+
/** A translation direction at a node that nothing resists. */
|
|
27
|
+
export interface UnresistedTranslation {
|
|
28
|
+
node: number;
|
|
29
|
+
axis: [number, number, number];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Finds the translations that nothing resists at the given nodes: the null directions of each
|
|
33
|
+
* node's free translational block (3×3, global) of the assembled element stiffness plus
|
|
34
|
+
* translational springs, by the same eigen-decomposition as `findAutoRestraints`. Such a
|
|
35
|
+
* direction is decoupled from every other DOF, so the structure is a mechanism there.
|
|
36
|
+
*
|
|
37
|
+
* @param nodes - Node indices to check, e.g. nodes connected only to shells
|
|
38
|
+
* @param elements - Node indices and global stiffness (6 DOFs per node) of every element
|
|
39
|
+
* @param boundary - Fixed DOFs and spring stiffnesses
|
|
40
|
+
*/
|
|
41
|
+
export declare const findUnresistedTranslations: (nodes: Iterable<number>, elements: StiffnessElement[], boundary: BoundaryConditions) => UnresistedTranslation[];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.findAutoRestraints = void 0;
|
|
3
|
+
exports.findUnresistedTranslations = exports.findAutoRestraints = void 0;
|
|
4
4
|
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
5
|
/**
|
|
6
6
|
* Eigen-decomposition of a small symmetric matrix by cyclic Jacobi rotations.
|
|
@@ -55,26 +55,27 @@ const symmetricEigen = (M) => {
|
|
|
55
55
|
* Finds the joint rotations that nothing resists, so they can be held instead of making the
|
|
56
56
|
* stiffness singular — e.g. a truss joint where every member releases its end moments.
|
|
57
57
|
*
|
|
58
|
-
* For each node with
|
|
59
|
-
*
|
|
58
|
+
* For each node with elements, the free rotational block `B` (3×3, global) of the assembled
|
|
59
|
+
* element stiffness plus rotational springs is decomposed; every eigenvector whose eigenvalue
|
|
60
60
|
* is below `SINGULARITY_TOLERANCE` times the block's largest diagonal is a null direction `n`.
|
|
61
|
-
* Each
|
|
61
|
+
* Each element's global stiffness is positive semi-definite, so `nᵀ·B·n = 0` makes the whole
|
|
62
62
|
* stiffness column of `n` zero: the rotation along `n` is decoupled from every other DOF, and a
|
|
63
63
|
* spring `k·n·nᵀ` there carries no force unless a load has a moment component along `n`.
|
|
64
64
|
*
|
|
65
65
|
* @param nodeCount - Number of nodes
|
|
66
|
-
* @param
|
|
66
|
+
* @param elements - Node indices and global stiffness (6 DOFs per node) of every element, members
|
|
67
|
+
* included (N and mm)
|
|
67
68
|
* @param boundary - Fixed DOFs and spring stiffnesses
|
|
68
69
|
*/
|
|
69
|
-
const findAutoRestraints = (nodeCount,
|
|
70
|
+
const findAutoRestraints = (nodeCount, elements, boundary) => {
|
|
70
71
|
const blocks = new Array(nodeCount).fill(null);
|
|
71
|
-
for (const
|
|
72
|
-
|
|
72
|
+
for (const element of elements) {
|
|
73
|
+
element.nodes.forEach((node, position) => {
|
|
73
74
|
const block = (blocks[node] ?? (blocks[node] = [0, 1, 2].map(() => [0, 0, 0])));
|
|
74
|
-
const base = 6 *
|
|
75
|
+
const base = 6 * position + 3;
|
|
75
76
|
for (let i = 0; i < 3; i++) {
|
|
76
77
|
for (let j = 0; j < 3; j++)
|
|
77
|
-
block[i][j] +=
|
|
78
|
+
block[i][j] += element.kGlobal[base + i][base + j];
|
|
78
79
|
}
|
|
79
80
|
});
|
|
80
81
|
}
|
|
@@ -83,7 +84,7 @@ const findAutoRestraints = (nodeCount, members, boundary) => {
|
|
|
83
84
|
const restraints = [];
|
|
84
85
|
blocks.forEach((block, node) => {
|
|
85
86
|
if (!block)
|
|
86
|
-
return; // a node without
|
|
87
|
+
return; // a node without elements is a mechanism, left for the factorisation
|
|
87
88
|
const free = [0, 1, 2].filter((i) => !boundary.fixed[6 * node + 3 + i]);
|
|
88
89
|
if (free.length === 0)
|
|
89
90
|
return;
|
|
@@ -105,4 +106,52 @@ const findAutoRestraints = (nodeCount, members, boundary) => {
|
|
|
105
106
|
return restraints;
|
|
106
107
|
};
|
|
107
108
|
exports.findAutoRestraints = findAutoRestraints;
|
|
109
|
+
/**
|
|
110
|
+
* Finds the translations that nothing resists at the given nodes: the null directions of each
|
|
111
|
+
* node's free translational block (3×3, global) of the assembled element stiffness plus
|
|
112
|
+
* translational springs, by the same eigen-decomposition as `findAutoRestraints`. Such a
|
|
113
|
+
* direction is decoupled from every other DOF, so the structure is a mechanism there.
|
|
114
|
+
*
|
|
115
|
+
* @param nodes - Node indices to check, e.g. nodes connected only to shells
|
|
116
|
+
* @param elements - Node indices and global stiffness (6 DOFs per node) of every element
|
|
117
|
+
* @param boundary - Fixed DOFs and spring stiffnesses
|
|
118
|
+
*/
|
|
119
|
+
const findUnresistedTranslations = (nodes, elements, boundary) => {
|
|
120
|
+
const blocks = new Map();
|
|
121
|
+
for (const node of nodes)
|
|
122
|
+
blocks.set(node, [0, 1, 2].map(() => [0, 0, 0]));
|
|
123
|
+
for (const element of elements) {
|
|
124
|
+
element.nodes.forEach((node, position) => {
|
|
125
|
+
const block = blocks.get(node);
|
|
126
|
+
if (!block)
|
|
127
|
+
return;
|
|
128
|
+
const base = 6 * position;
|
|
129
|
+
for (let i = 0; i < 3; i++) {
|
|
130
|
+
for (let j = 0; j < 3; j++)
|
|
131
|
+
block[i][j] += element.kGlobal[base + i][base + j];
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const unresisted = [];
|
|
136
|
+
blocks.forEach((block, node) => {
|
|
137
|
+
const free = [0, 1, 2].filter((i) => !boundary.fixed[6 * node + i]);
|
|
138
|
+
if (free.length === 0)
|
|
139
|
+
return;
|
|
140
|
+
const sub = free.map((i) => free.map((j) => block[i][j] + (i === j ? boundary.spring[6 * node + i] : 0)));
|
|
141
|
+
const scale = Math.max(...sub.map((row, i) => Math.abs(row[i])));
|
|
142
|
+
const { values, vectors } = symmetricEigen(sub);
|
|
143
|
+
values.forEach((value, e) => {
|
|
144
|
+
if (scale > 0 && value > frame_constant_1.SINGULARITY_TOLERANCE * scale)
|
|
145
|
+
return;
|
|
146
|
+
const axis = [0, 0, 0];
|
|
147
|
+
free.forEach((i, k) => (axis[i] = vectors[e][k]));
|
|
148
|
+
const lead = axis.reduce((best, c, i) => (Math.abs(c) > Math.abs(axis[best]) ? i : best), 0);
|
|
149
|
+
if (axis[lead] < 0)
|
|
150
|
+
axis.forEach((c, i) => (axis[i] = -c));
|
|
151
|
+
unresisted.push({ node, axis });
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
return unresisted;
|
|
155
|
+
};
|
|
156
|
+
exports.findUnresistedTranslations = findUnresistedTranslations;
|
|
108
157
|
//# sourceMappingURL=auto-restraint.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-restraint.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/auto-restraint.ts"],"names":[],"mappings":";;;AAAA,uEAA2E;
|
|
1
|
+
{"version":3,"file":"auto-restraint.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/auto-restraint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
import type { SectionProperties } from "../../../core/types/section-properties.type";
|
|
2
2
|
import type { Matrix } from "../../../utils/matrix";
|
|
3
3
|
import { type SkylineMatrix } from "../../../utils/skyline";
|
|
4
|
+
import { type FlatShellElement } from "../elements/shell/flat-shell";
|
|
4
5
|
import { type CondensedMember } from "../elements/static-condensation";
|
|
5
|
-
import type { FrameId, FrameModel, FrameNode } from "../types/model.type";
|
|
6
|
+
import type { FrameId, FrameModel, FrameNode, ShellModifiers, ShellSection, ShellType } from "../types/model.type";
|
|
6
7
|
import { type AutoRestraint } from "./auto-restraint";
|
|
7
8
|
import { type BoundaryConditions } from "./boundary-conditions";
|
|
8
9
|
import { type AssemblyMember } from "./global-assembly";
|
|
9
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* A member, or a piece of one, with everything that does not depend on the loads. A member is
|
|
12
|
+
* cut into pieces where generated shell-mesh nodes lie inside it; otherwise it is one piece.
|
|
13
|
+
*/
|
|
10
14
|
export interface SystemMember extends AssemblyMember {
|
|
11
15
|
id: FrameId;
|
|
16
|
+
/** Distance of the piece's start from the member's start (mm); 0 for a whole member. */
|
|
17
|
+
offset: number;
|
|
12
18
|
section: SectionProperties;
|
|
13
19
|
length: number;
|
|
14
20
|
lambda: Matrix;
|
|
@@ -19,12 +25,43 @@ export interface SystemMember extends AssemblyMember {
|
|
|
19
25
|
/** The member's own end displacements from its end nodes' (differ across releases). */
|
|
20
26
|
memberEndDisplacements: CondensedMember["memberEndDisplacements"];
|
|
21
27
|
}
|
|
28
|
+
/** A model member and the pieces it is analysed as (one unless the shell mesh splits it). */
|
|
29
|
+
export interface MemberGroup {
|
|
30
|
+
id: FrameId;
|
|
31
|
+
/** Indices into `FrameSystem.members`, from the member's start to its end. */
|
|
32
|
+
pieces: number[];
|
|
33
|
+
section: SectionProperties;
|
|
34
|
+
length: number;
|
|
35
|
+
lambda: Matrix;
|
|
36
|
+
}
|
|
37
|
+
/** A shell area with everything that does not depend on the loads. */
|
|
38
|
+
export interface SystemShell {
|
|
39
|
+
id: FrameId;
|
|
40
|
+
/** The shell area the element belongs to (its own id when the area is one element). */
|
|
41
|
+
areaId: FrameId;
|
|
42
|
+
nodeIndices: number[];
|
|
43
|
+
type: ShellType;
|
|
44
|
+
section: ShellSection;
|
|
45
|
+
modifiers: ShellModifiers;
|
|
46
|
+
/** Axes, corner transformations and local and global stiffness. */
|
|
47
|
+
element: FlatShellElement;
|
|
48
|
+
/** ∫ Nᵢ dA of each corner on the mean plane (mm²): its share of a uniform surface load. */
|
|
49
|
+
cornerAreas: number[];
|
|
50
|
+
}
|
|
22
51
|
/** The load-independent part of a frame analysis: geometry, stiffness and its factorisation. */
|
|
23
52
|
export interface FrameSystem {
|
|
24
53
|
nodes: FrameNode[];
|
|
25
54
|
nodeIndex: Map<FrameId, number>;
|
|
55
|
+
/** Index into `memberGroups` of each model member. */
|
|
26
56
|
memberIndex: Map<FrameId, number>;
|
|
57
|
+
/** Model members, in model order. */
|
|
58
|
+
memberGroups: MemberGroup[];
|
|
59
|
+
/** The pieces that are assembled: one per member unless the shell mesh splits it. */
|
|
27
60
|
members: SystemMember[];
|
|
61
|
+
shellIndex: Map<FrameId, number>;
|
|
62
|
+
/** Element indices of each shell area. */
|
|
63
|
+
shellsByArea: Map<FrameId, number[]>;
|
|
64
|
+
shells: SystemShell[];
|
|
28
65
|
dofCount: number;
|
|
29
66
|
boundary: BoundaryConditions;
|
|
30
67
|
/** Equation number of each global DOF in the factorised system, −1 for a fixed DOF. */
|
|
@@ -39,12 +76,14 @@ export interface FrameSystem {
|
|
|
39
76
|
profileSize: number;
|
|
40
77
|
}
|
|
41
78
|
/**
|
|
42
|
-
* Builds the member matrices of a model that passed `validateFrameModel`, assembles
|
|
43
|
-
* stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and
|
|
44
|
-
* once for all load cases. Joint rotations that
|
|
45
|
-
* held by a spring along each null direction, which carries no force.
|
|
79
|
+
* Builds the member and shell matrices of a model that passed `validateFrameModel`, assembles
|
|
80
|
+
* the free stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and
|
|
81
|
+
* factorises it once for all load cases. Joint rotations that nothing resists (e.g. at truss
|
|
82
|
+
* joints) are held by a spring along each null direction, which carries no force.
|
|
46
83
|
*
|
|
47
|
-
* @throws {FrameAnalysisError}
|
|
48
|
-
* a
|
|
84
|
+
* @throws {FrameAnalysisError} 328 if a node connected only to shells has a translation that
|
|
85
|
+
* nothing resists (a membrane's out-of-plane or a plate's in-plane direction), with `nodeId`,
|
|
86
|
+
* `shellId` and `dof`; 304 if the structure is a mechanism; `details` names a node and a DOF
|
|
87
|
+
* involved in it
|
|
49
88
|
*/
|
|
50
89
|
export declare const prepareFrameSystem: (model: FrameModel) => FrameSystem;
|