@theerapat-s28/ts-structural-eng-tools 1.4.0 → 2.0.1
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 +44 -4
- package/dist/core/constants/frame.constant.d.ts +14 -0
- package/dist/core/constants/frame.constant.js +18 -0
- package/dist/core/constants/frame.constant.js.map +1 -0
- package/dist/core/constants/rc.constant.d.ts +7 -0
- package/dist/core/constants/rc.constant.js +20 -1
- package/dist/core/constants/rc.constant.js.map +1 -1
- package/dist/core/errors/frame-analysis.error.d.ts +33 -0
- package/dist/core/errors/frame-analysis.error.js +74 -0
- package/dist/core/errors/frame-analysis.error.js.map +1 -0
- package/dist/core/errors/rc-design.error.js +8 -0
- package/dist/core/errors/rc-design.error.js.map +1 -1
- package/dist/core/index.d.ts +7 -3
- package/dist/core/index.js +16 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types/plate-jacketing.type.d.ts +37 -0
- package/dist/core/types/plate-jacketing.type.js +8 -0
- package/dist/core/types/plate-jacketing.type.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 +15 -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 +70 -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/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 +75 -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 +6 -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 +332 -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 +123 -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 +119 -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 +292 -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/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 +22 -0
- package/dist/fea/frame/elements/fixed-end-forces.js +79 -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 +9 -0
- package/dist/fea/frame/index.js +16 -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 +336 -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 +67 -0
- package/dist/fea/frame/solver/analyze-frame.js +128 -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 +124 -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 +112 -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 +298 -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 +9 -5
- package/dist/index.js +44 -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/strengthening/index.d.ts +1 -0
- package/dist/strengthening/index.js +5 -1
- package/dist/strengthening/index.js.map +1 -1
- package/dist/strengthening/rc-beam-side-plate-shear.d.ts +254 -0
- package/dist/strengthening/rc-beam-side-plate-shear.js +420 -0
- package/dist/strengthening/rc-beam-side-plate-shear.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 +20 -2
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareFrameSystem = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
6
|
+
const skyline_1 = require("../../../utils/skyline");
|
|
7
|
+
const beam_3d_stiffness_1 = require("../elements/beam-3d-stiffness");
|
|
8
|
+
const static_condensation_1 = require("../elements/static-condensation");
|
|
9
|
+
const coordinate_transform_1 = require("../transformation/coordinate-transform");
|
|
10
|
+
const validate_model_1 = require("../validation/validate-model");
|
|
11
|
+
const boundary_conditions_1 = require("./boundary-conditions");
|
|
12
|
+
const global_assembly_1 = require("./global-assembly");
|
|
13
|
+
const RELEASE_KEYS = ["u1", "u2", "u3", "r1", "r2", "r3"];
|
|
14
|
+
const DOF_NAMES = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
15
|
+
const releasedIndices = (release, offset) => RELEASE_KEYS.flatMap((key, k) => (release?.[key] ? [offset + k] : []));
|
|
16
|
+
/**
|
|
17
|
+
* Builds the member matrices of a model that passed `validateFrameModel`, assembles the free
|
|
18
|
+
* stiffness in skyline storage with nodes in reverse Cuthill–McKee order, and factorises it
|
|
19
|
+
* once for all load cases.
|
|
20
|
+
*
|
|
21
|
+
* @throws {FrameAnalysisError} 304 if the structure is a mechanism; `details` names a node and
|
|
22
|
+
* a DOF involved in it
|
|
23
|
+
*/
|
|
24
|
+
const prepareFrameSystem = (model) => {
|
|
25
|
+
const { nodes, members, restraints } = model;
|
|
26
|
+
const nodeIndex = new Map(nodes.map((n, i) => [n.id, i]));
|
|
27
|
+
const memberIndex = new Map(members.map((m, i) => [m.id, i]));
|
|
28
|
+
const dofCount = 6 * nodes.length;
|
|
29
|
+
const boundary = (0, boundary_conditions_1.buildBoundaryConditions)(restraints, nodeIndex, dofCount);
|
|
30
|
+
const systemMembers = members.map((member) => {
|
|
31
|
+
const start = nodes[nodeIndex.get(member.startNodeId)];
|
|
32
|
+
const end = nodes[nodeIndex.get(member.endNodeId)];
|
|
33
|
+
const { length, lambda } = (0, coordinate_transform_1.memberAxes)([start.x, start.y, start.z], [end.x, end.y, end.z], member.angle ?? 0);
|
|
34
|
+
const { E, G, A, I22, I33, J } = member.section;
|
|
35
|
+
const releasedDofs = [
|
|
36
|
+
...releasedIndices(member.releases?.start, 0),
|
|
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);
|
|
40
|
+
return {
|
|
41
|
+
id: member.id,
|
|
42
|
+
section: member.section,
|
|
43
|
+
startIndex: nodeIndex.get(member.startNodeId),
|
|
44
|
+
endIndex: nodeIndex.get(member.endNodeId),
|
|
45
|
+
T: (0, coordinate_transform_1.transformationMatrix)(lambda),
|
|
46
|
+
k: condensed.k,
|
|
47
|
+
condenseFixedEndForces: condensed.condenseFixedEndForces,
|
|
48
|
+
released: Array.from({ length: 12 }, (_, i) => releasedDofs.includes(i)),
|
|
49
|
+
length,
|
|
50
|
+
lambda,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
// ---- Equation numbering: nodes in RCM order, fixed DOFs skipped ------------------
|
|
54
|
+
const adjacency = nodes.map(() => []);
|
|
55
|
+
for (const m of systemMembers) {
|
|
56
|
+
adjacency[m.startIndex].push(m.endIndex);
|
|
57
|
+
adjacency[m.endIndex].push(m.startIndex);
|
|
58
|
+
}
|
|
59
|
+
const equation = new Int32Array(dofCount).fill(-1);
|
|
60
|
+
const free = [];
|
|
61
|
+
for (const node of (0, skyline_1.reverseCuthillMcKee)(adjacency)) {
|
|
62
|
+
for (let k = 0; k < 6; k++) {
|
|
63
|
+
const dof = 6 * node + k;
|
|
64
|
+
if (!boundary.fixed[dof]) {
|
|
65
|
+
equation[dof] = free.length;
|
|
66
|
+
free.push(dof);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// ---- Profile, assembly and factorisation -----------------------------------------
|
|
71
|
+
let factor = null;
|
|
72
|
+
if (free.length > 0) {
|
|
73
|
+
const first = free.map((_, e) => e);
|
|
74
|
+
const memberEquations = systemMembers.map((m) => (0, global_assembly_1.memberDofs)(m).map((d) => equation[d]));
|
|
75
|
+
for (const eqs of memberEquations) {
|
|
76
|
+
const active = eqs.filter((e) => e >= 0);
|
|
77
|
+
const low = Math.min(...active);
|
|
78
|
+
for (const e of active)
|
|
79
|
+
if (low < first[e])
|
|
80
|
+
first[e] = low;
|
|
81
|
+
}
|
|
82
|
+
const K = (0, skyline_1.createSkyline)(first);
|
|
83
|
+
systemMembers.forEach((m, index) => {
|
|
84
|
+
const kGlobal = (0, global_assembly_1.memberGlobalStiffness)(m);
|
|
85
|
+
const eqs = memberEquations[index];
|
|
86
|
+
// a member's 12 DOFs are distinct, so each unordered pair and each diagonal is added once
|
|
87
|
+
for (let a = 0; a < 12; a++) {
|
|
88
|
+
if (eqs[a] < 0)
|
|
89
|
+
continue;
|
|
90
|
+
for (let b = 0; b < 12; b++) {
|
|
91
|
+
if (eqs[b] >= eqs[a])
|
|
92
|
+
(0, skyline_1.skylineAdd)(K, eqs[a], eqs[b], kGlobal[a][b]);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
free.forEach((dof, e) => {
|
|
97
|
+
if (boundary.spring[dof] > 0)
|
|
98
|
+
(0, skyline_1.skylineAdd)(K, e, e, boundary.spring[dof]);
|
|
99
|
+
});
|
|
100
|
+
const result = (0, skyline_1.skylineFactor)(K, frame_constant_1.SINGULARITY_TOLERANCE);
|
|
101
|
+
if (!result.ok) {
|
|
102
|
+
const dof = free[result.failedPivot];
|
|
103
|
+
(0, validate_model_1.throwIssues)([
|
|
104
|
+
(0, validate_model_1.frameIssue)(frame_analysis_error_1.FrameErrors.STRUCTURE_UNSTABLE, {
|
|
105
|
+
nodeId: nodes[Math.floor(dof / 6)].id,
|
|
106
|
+
dof: DOF_NAMES[dof % 6],
|
|
107
|
+
}),
|
|
108
|
+
]);
|
|
109
|
+
}
|
|
110
|
+
factor = K;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
nodes,
|
|
114
|
+
nodeIndex,
|
|
115
|
+
memberIndex,
|
|
116
|
+
members: systemMembers,
|
|
117
|
+
dofCount,
|
|
118
|
+
boundary,
|
|
119
|
+
equation,
|
|
120
|
+
free,
|
|
121
|
+
factor,
|
|
122
|
+
profileSize: factor ? (0, skyline_1.skylineSize)(factor) : 0,
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
exports.prepareFrameSystem = prepareFrameSystem;
|
|
126
|
+
//# sourceMappingURL=frame-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-system.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/frame-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type Matrix } from "../../../utils/matrix";
|
|
2
|
+
export interface AssemblyMember {
|
|
3
|
+
startIndex: number;
|
|
4
|
+
endIndex: number;
|
|
5
|
+
T: Matrix;
|
|
6
|
+
k: Matrix;
|
|
7
|
+
}
|
|
8
|
+
/** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
|
|
9
|
+
export declare const memberDofs: (member: Pick<AssemblyMember, "startIndex" | "endIndex">) => number[];
|
|
10
|
+
/** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
|
|
11
|
+
export declare const memberGlobalStiffness: (member: AssemblyMember) => Matrix;
|
|
12
|
+
/**
|
|
13
|
+
* Adds `sign · Tᵀ·f` of one member's local end-force vector to a global vector (N and N·mm).
|
|
14
|
+
* With `sign = −1` and fixed-end forces this adds the equivalent nodal loads; with `sign = +1`
|
|
15
|
+
* and `k·u` it adds the member's elastic end forces.
|
|
16
|
+
*/
|
|
17
|
+
export declare const scatterMemberForces: (target: number[], member: Pick<AssemblyMember, "startIndex" | "endIndex" | "T">, localForces: number[], sign: 1 | -1) => void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scatterMemberForces = exports.memberGlobalStiffness = exports.memberDofs = void 0;
|
|
4
|
+
const matrix_1 = require("../../../utils/matrix");
|
|
5
|
+
/** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
|
|
6
|
+
const memberDofs = (member) => {
|
|
7
|
+
const dofs = [];
|
|
8
|
+
for (const node of [member.startIndex, member.endIndex]) {
|
|
9
|
+
for (let k = 0; k < 6; k++)
|
|
10
|
+
dofs.push(6 * node + k);
|
|
11
|
+
}
|
|
12
|
+
return dofs;
|
|
13
|
+
};
|
|
14
|
+
exports.memberDofs = memberDofs;
|
|
15
|
+
/** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
|
|
16
|
+
const memberGlobalStiffness = (member) => (0, matrix_1.matMul)((0, matrix_1.transpose)(member.T), (0, matrix_1.matMul)(member.k, member.T));
|
|
17
|
+
exports.memberGlobalStiffness = memberGlobalStiffness;
|
|
18
|
+
/**
|
|
19
|
+
* Adds `sign · Tᵀ·f` of one member's local end-force vector to a global vector (N and N·mm).
|
|
20
|
+
* With `sign = −1` and fixed-end forces this adds the equivalent nodal loads; with `sign = +1`
|
|
21
|
+
* and `k·u` it adds the member's elastic end forces.
|
|
22
|
+
*/
|
|
23
|
+
const scatterMemberForces = (target, member, localForces, sign) => {
|
|
24
|
+
const dofs = (0, exports.memberDofs)(member);
|
|
25
|
+
for (let a = 0; a < 12; a++) {
|
|
26
|
+
let value = 0;
|
|
27
|
+
for (let j = 0; j < 12; j++)
|
|
28
|
+
value += member.T[j][a] * localForces[j];
|
|
29
|
+
target[dofs[a]] += sign * value;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.scatterMemberForces = scatterMemberForces;
|
|
33
|
+
//# sourceMappingURL=global-assembly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-assembly.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/global-assembly.ts"],"names":[],"mappings":";;;AAAA,8CAAmE;AASnE,iEAAiE;AAC1D,MAAM,UAAU,GAAG,CAAC,MAAuD,EAAY,EAAE;IAC9F,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AANW,QAAA,UAAU,cAMrB;AAEF,gEAAgE;AACzD,MAAM,qBAAqB,GAAG,CAAC,MAAsB,EAAU,EAAE,CACtE,IAAA,eAAM,EAAC,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAD7C,QAAA,qBAAqB,yBACwB;AAE1D;;;;GAIG;AACI,MAAM,mBAAmB,GAAG,CACjC,MAAgB,EAChB,MAA6D,EAC7D,WAAqB,EACrB,IAAY,EACN,EAAE;IACR,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,mBAAmB,uBAY9B"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type LocalMemberLoad } from "../elements/fixed-end-forces";
|
|
2
|
+
import type { LoadCase, MemberLoad, NodalLoad } from "../types/model.type";
|
|
3
|
+
import type { FrameSystem } from "./frame-system";
|
|
4
|
+
/**
|
|
5
|
+
* Unrounded result of one load case or combination, in N and mm. Every field is linear in the
|
|
6
|
+
* loads, so combinations are formed by factoring and adding states.
|
|
7
|
+
*/
|
|
8
|
+
export interface RawState {
|
|
9
|
+
U: number[];
|
|
10
|
+
R: number[];
|
|
11
|
+
F: number[];
|
|
12
|
+
memberForces: number[][];
|
|
13
|
+
memberLoads: LocalMemberLoad[][];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Solves one load case against the prepared, factorised system.
|
|
17
|
+
*
|
|
18
|
+
* Self-weight is `selfWeight · unitWeight · A` per unit member length along global −Z.
|
|
19
|
+
*
|
|
20
|
+
* @param loadCase - The load case (id and self-weight multiplier)
|
|
21
|
+
* @param loads - The nodal and member loads tagged with this load case
|
|
22
|
+
*
|
|
23
|
+
* @throws {FrameAnalysisError} 308 for a load outside its member, 313 if self-weight is
|
|
24
|
+
* requested for a member without `unitWeight`
|
|
25
|
+
*/
|
|
26
|
+
export declare const solveLoadCase: (system: FrameSystem, loadCase: LoadCase, loads: {
|
|
27
|
+
nodalLoads: NodalLoad[];
|
|
28
|
+
memberLoads: MemberLoad[];
|
|
29
|
+
}) => RawState;
|
|
30
|
+
/** Superposes factored states: `Σ factor × state`. Member loads are concatenated, scaled. */
|
|
31
|
+
export declare const combineStates: (terms: {
|
|
32
|
+
state: RawState;
|
|
33
|
+
factor: number;
|
|
34
|
+
}[]) => RawState;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.combineStates = exports.solveLoadCase = void 0;
|
|
4
|
+
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
5
|
+
const matrix_1 = require("../../../utils/matrix");
|
|
6
|
+
const skyline_1 = require("../../../utils/skyline");
|
|
7
|
+
const fixed_end_forces_1 = require("../elements/fixed-end-forces");
|
|
8
|
+
const global_assembly_1 = require("./global-assembly");
|
|
9
|
+
const GLOBAL_DIRECTIONS = {
|
|
10
|
+
X: [1, 0, 0],
|
|
11
|
+
Y: [0, 1, 0],
|
|
12
|
+
Z: [0, 0, 1],
|
|
13
|
+
};
|
|
14
|
+
/** Resolves a member load into local-axis loads in N and mm. */
|
|
15
|
+
const toLocalLoads = (load, lambda, L) => {
|
|
16
|
+
const components = (direction) => {
|
|
17
|
+
if (direction === "1" || direction === "2" || direction === "3") {
|
|
18
|
+
return [{ axis: Number(direction), factor: 1 }];
|
|
19
|
+
}
|
|
20
|
+
const v = GLOBAL_DIRECTIONS[direction];
|
|
21
|
+
return [1, 2, 3]
|
|
22
|
+
.map((axis) => ({
|
|
23
|
+
axis,
|
|
24
|
+
factor: lambda[axis - 1][0] * v[0] + lambda[axis - 1][1] * v[1] + lambda[axis - 1][2] * v[2],
|
|
25
|
+
}))
|
|
26
|
+
.filter((c) => Math.abs(c.factor) > 1e-12);
|
|
27
|
+
};
|
|
28
|
+
return components(load.direction).map(({ axis, factor }) => load.type === "udl"
|
|
29
|
+
? {
|
|
30
|
+
type: "udl",
|
|
31
|
+
axis,
|
|
32
|
+
w: load.w * factor, // kN/m = N/mm
|
|
33
|
+
start: load.start ?? 0,
|
|
34
|
+
end: load.end ?? L,
|
|
35
|
+
}
|
|
36
|
+
: { type: "point", axis, P: load.P * factor * 1e3, a: load.a });
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Solves one load case against the prepared, factorised system.
|
|
40
|
+
*
|
|
41
|
+
* Self-weight is `selfWeight · unitWeight · A` per unit member length along global −Z.
|
|
42
|
+
*
|
|
43
|
+
* @param loadCase - The load case (id and self-weight multiplier)
|
|
44
|
+
* @param loads - The nodal and member loads tagged with this load case
|
|
45
|
+
*
|
|
46
|
+
* @throws {FrameAnalysisError} 308 for a load outside its member, 313 if self-weight is
|
|
47
|
+
* requested for a member without `unitWeight`
|
|
48
|
+
*/
|
|
49
|
+
const solveLoadCase = (system, loadCase, loads) => {
|
|
50
|
+
const { members, dofCount, boundary, equation, free, factor, nodeIndex, memberIndex } = system;
|
|
51
|
+
const F = new Array(dofCount).fill(0);
|
|
52
|
+
const loadsByMember = members.map(() => []);
|
|
53
|
+
for (const load of loads.memberLoads) {
|
|
54
|
+
loadsByMember[memberIndex.get(load.memberId)].push(load);
|
|
55
|
+
}
|
|
56
|
+
const selfWeight = loadCase.selfWeight ?? 0;
|
|
57
|
+
const memberLoads = members.map((member, m) => {
|
|
58
|
+
const memberLoadsHere = [...loadsByMember[m]];
|
|
59
|
+
if (selfWeight !== 0) {
|
|
60
|
+
const { unitWeight, A } = member.section;
|
|
61
|
+
if (unitWeight === undefined)
|
|
62
|
+
throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.MISSING_UNIT_WEIGHT);
|
|
63
|
+
// kN/m³ · m² = kN/m
|
|
64
|
+
const w = -selfWeight * unitWeight * A * 1e-6;
|
|
65
|
+
if (w !== 0) {
|
|
66
|
+
memberLoadsHere.push({
|
|
67
|
+
loadCase: loadCase.id,
|
|
68
|
+
type: "udl",
|
|
69
|
+
memberId: member.id,
|
|
70
|
+
direction: "Z",
|
|
71
|
+
w,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return memberLoadsHere.flatMap((load) => toLocalLoads(load, member.lambda, member.length));
|
|
76
|
+
});
|
|
77
|
+
const fixed = members.map((member, m) => {
|
|
78
|
+
const condensed = member.condenseFixedEndForces((0, fixed_end_forces_1.fixedEndForces)(memberLoads[m], member.length));
|
|
79
|
+
(0, global_assembly_1.scatterMemberForces)(F, member, condensed, -1);
|
|
80
|
+
return condensed;
|
|
81
|
+
});
|
|
82
|
+
for (const load of loads.nodalLoads) {
|
|
83
|
+
const base = 6 * nodeIndex.get(load.nodeId);
|
|
84
|
+
[load.fx, load.fy, load.fz].forEach((v, k) => (F[base + k] += (v ?? 0) * 1e3));
|
|
85
|
+
[load.mx, load.my, load.mz].forEach((v, k) => (F[base + 3 + k] += (v ?? 0) * 1e6));
|
|
86
|
+
}
|
|
87
|
+
const U = new Array(dofCount).fill(0);
|
|
88
|
+
if (factor) {
|
|
89
|
+
const solution = (0, skyline_1.skylineSolve)(factor, free.map((dof) => F[dof]));
|
|
90
|
+
free.forEach((dof) => (U[dof] = solution[equation[dof]]));
|
|
91
|
+
}
|
|
92
|
+
// Elastic end forces k·u per member; their global sum is K·U, from which R = K·U − F
|
|
93
|
+
const KU = new Array(dofCount).fill(0);
|
|
94
|
+
const memberForces = members.map((member, m) => {
|
|
95
|
+
const uLocal = (0, matrix_1.matVec)(member.T, (0, global_assembly_1.memberDofs)(member).map((d) => U[d]));
|
|
96
|
+
const elastic = (0, matrix_1.matVec)(member.k, uLocal);
|
|
97
|
+
(0, global_assembly_1.scatterMemberForces)(KU, member, elastic, 1);
|
|
98
|
+
return elastic.map((v, i) => v + fixed[m][i]);
|
|
99
|
+
});
|
|
100
|
+
const R = KU.map((v, i) => (boundary.restrained[i] ? v - F[i] : 0));
|
|
101
|
+
return { U, R, F, memberForces, memberLoads };
|
|
102
|
+
};
|
|
103
|
+
exports.solveLoadCase = solveLoadCase;
|
|
104
|
+
const scaleLoad = (load, factor) => load.type === "udl" ? { ...load, w: load.w * factor } : { ...load, P: load.P * factor };
|
|
105
|
+
/** Superposes factored states: `Σ factor × state`. Member loads are concatenated, scaled. */
|
|
106
|
+
const combineStates = (terms) => {
|
|
107
|
+
const first = terms[0].state;
|
|
108
|
+
const add = (pick, length) => {
|
|
109
|
+
const out = new Array(length).fill(0);
|
|
110
|
+
for (const { state, factor } of terms) {
|
|
111
|
+
pick(state).forEach((v, i) => (out[i] += factor * v));
|
|
112
|
+
}
|
|
113
|
+
return out;
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
U: add((s) => s.U, first.U.length),
|
|
117
|
+
R: add((s) => s.R, first.R.length),
|
|
118
|
+
F: add((s) => s.F, first.F.length),
|
|
119
|
+
memberForces: first.memberForces.map((_, m) => add((s) => s.memberForces[m], 12)),
|
|
120
|
+
memberLoads: first.memberLoads.map((_, m) => terms.flatMap(({ state, factor }) => factor === 0 ? [] : state.memberLoads[m].map((l) => scaleLoad(l, factor)))),
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
exports.combineStates = combineStates;
|
|
124
|
+
//# sourceMappingURL=load-case-solver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/load-case-solver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Matrix } from "../../../utils/matrix";
|
|
2
|
+
/**
|
|
3
|
+
* ETABS-style local axes of a member as the rows of a 3×3 direction-cosine matrix.
|
|
4
|
+
*
|
|
5
|
+
* Local 1 runs from the start to the end node. For a non-vertical member local 3 is
|
|
6
|
+
* horizontal (`1 × Z`) and local 2 lies in the vertical plane pointing up; for a vertical
|
|
7
|
+
* member local 2 is global +X and local 3 is `1 × 2`. `angle` then rotates local 2 and 3
|
|
8
|
+
* about local 1 by the right-hand rule.
|
|
9
|
+
*
|
|
10
|
+
* @param start - Start node coordinates in mm
|
|
11
|
+
* @param end - End node coordinates in mm
|
|
12
|
+
* @param angle - Member angle in rad (default 0)
|
|
13
|
+
* @returns `{ length, lambda }` with `lambda` rows = local 1, 2, 3 in global components
|
|
14
|
+
* @throws {FrameAnalysisError} 301 if the nodes coincide
|
|
15
|
+
*/
|
|
16
|
+
export declare const memberAxes: (start: [number, number, number], end: [number, number, number], angle?: number) => {
|
|
17
|
+
length: number;
|
|
18
|
+
lambda: Matrix;
|
|
19
|
+
};
|
|
20
|
+
/** Builds the 12×12 transformation `T` (global → local) from the 3×3 direction cosines. */
|
|
21
|
+
export declare const transformationMatrix: (lambda: Matrix) => Matrix;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transformationMatrix = exports.memberAxes = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
6
|
+
const matrix_1 = require("../../../utils/matrix");
|
|
7
|
+
const cross = (a, b) => [
|
|
8
|
+
a[1] * b[2] - a[2] * b[1],
|
|
9
|
+
a[2] * b[0] - a[0] * b[2],
|
|
10
|
+
a[0] * b[1] - a[1] * b[0],
|
|
11
|
+
];
|
|
12
|
+
const norm = (a) => Math.hypot(a[0], a[1], a[2]);
|
|
13
|
+
const scale = (a, s) => [a[0] * s, a[1] * s, a[2] * s];
|
|
14
|
+
/**
|
|
15
|
+
* ETABS-style local axes of a member as the rows of a 3×3 direction-cosine matrix.
|
|
16
|
+
*
|
|
17
|
+
* Local 1 runs from the start to the end node. For a non-vertical member local 3 is
|
|
18
|
+
* horizontal (`1 × Z`) and local 2 lies in the vertical plane pointing up; for a vertical
|
|
19
|
+
* member local 2 is global +X and local 3 is `1 × 2`. `angle` then rotates local 2 and 3
|
|
20
|
+
* about local 1 by the right-hand rule.
|
|
21
|
+
*
|
|
22
|
+
* @param start - Start node coordinates in mm
|
|
23
|
+
* @param end - End node coordinates in mm
|
|
24
|
+
* @param angle - Member angle in rad (default 0)
|
|
25
|
+
* @returns `{ length, lambda }` with `lambda` rows = local 1, 2, 3 in global components
|
|
26
|
+
* @throws {FrameAnalysisError} 301 if the nodes coincide
|
|
27
|
+
*/
|
|
28
|
+
const memberAxes = (start, end, angle = 0) => {
|
|
29
|
+
const d = [end[0] - start[0], end[1] - start[1], end[2] - start[2]];
|
|
30
|
+
const length = norm(d);
|
|
31
|
+
if (!(length > 0))
|
|
32
|
+
throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.ZERO_LENGTH_MEMBER);
|
|
33
|
+
const e1 = scale(d, 1 / length);
|
|
34
|
+
let e2;
|
|
35
|
+
let e3;
|
|
36
|
+
if (Math.hypot(e1[0], e1[1]) < frame_constant_1.VERTICAL_MEMBER_TOLERANCE) {
|
|
37
|
+
e2 = [1, 0, 0];
|
|
38
|
+
e3 = cross(e1, e2);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
const c = cross(e1, [0, 0, 1]);
|
|
42
|
+
e3 = scale(c, 1 / norm(c));
|
|
43
|
+
e2 = cross(e3, e1);
|
|
44
|
+
}
|
|
45
|
+
if (angle !== 0) {
|
|
46
|
+
const cos = Math.cos(angle);
|
|
47
|
+
const sin = Math.sin(angle);
|
|
48
|
+
const r2 = [
|
|
49
|
+
cos * e2[0] + sin * e3[0],
|
|
50
|
+
cos * e2[1] + sin * e3[1],
|
|
51
|
+
cos * e2[2] + sin * e3[2],
|
|
52
|
+
];
|
|
53
|
+
const r3 = [
|
|
54
|
+
-sin * e2[0] + cos * e3[0],
|
|
55
|
+
-sin * e2[1] + cos * e3[1],
|
|
56
|
+
-sin * e2[2] + cos * e3[2],
|
|
57
|
+
];
|
|
58
|
+
e2 = r2;
|
|
59
|
+
e3 = r3;
|
|
60
|
+
}
|
|
61
|
+
return { length, lambda: [e1, e2, e3] };
|
|
62
|
+
};
|
|
63
|
+
exports.memberAxes = memberAxes;
|
|
64
|
+
/** Builds the 12×12 transformation `T` (global → local) from the 3×3 direction cosines. */
|
|
65
|
+
const transformationMatrix = (lambda) => {
|
|
66
|
+
const T = (0, matrix_1.zeros)(12, 12);
|
|
67
|
+
for (let block = 0; block < 4; block++) {
|
|
68
|
+
for (let i = 0; i < 3; i++) {
|
|
69
|
+
for (let j = 0; j < 3; j++)
|
|
70
|
+
T[3 * block + i][3 * block + j] = lambda[i][j];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return T;
|
|
74
|
+
};
|
|
75
|
+
exports.transformationMatrix = transformationMatrix;
|
|
76
|
+
//# sourceMappingURL=coordinate-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinate-transform.js","sourceRoot":"","sources":["../../../../src/fea/frame/transformation/coordinate-transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { SectionProperties } from "../../../core/types/section-properties.type";
|
|
2
|
+
export type FrameId = string | number;
|
|
3
|
+
export interface FrameNode {
|
|
4
|
+
id: FrameId;
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
z: number;
|
|
8
|
+
}
|
|
9
|
+
/** A restrained DOF: `true` is fixed, a number is a spring stiffness, omitted/`false` is free. */
|
|
10
|
+
export type DofRestraint = boolean | number;
|
|
11
|
+
export interface Restraint {
|
|
12
|
+
nodeId: FrameId;
|
|
13
|
+
ux?: DofRestraint;
|
|
14
|
+
uy?: DofRestraint;
|
|
15
|
+
uz?: DofRestraint;
|
|
16
|
+
rx?: DofRestraint;
|
|
17
|
+
ry?: DofRestraint;
|
|
18
|
+
rz?: DofRestraint;
|
|
19
|
+
}
|
|
20
|
+
/** Local end DOFs of a member that transmit no force (hinges, rollers…). */
|
|
21
|
+
export interface MemberEndRelease {
|
|
22
|
+
u1?: boolean;
|
|
23
|
+
u2?: boolean;
|
|
24
|
+
u3?: boolean;
|
|
25
|
+
r1?: boolean;
|
|
26
|
+
r2?: boolean;
|
|
27
|
+
r3?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface Member {
|
|
30
|
+
id: FrameId;
|
|
31
|
+
startNodeId: FrameId;
|
|
32
|
+
endNodeId: FrameId;
|
|
33
|
+
section: SectionProperties;
|
|
34
|
+
angle?: number;
|
|
35
|
+
releases?: {
|
|
36
|
+
start?: MemberEndRelease;
|
|
37
|
+
end?: MemberEndRelease;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export interface NodalLoad {
|
|
41
|
+
loadCase: string;
|
|
42
|
+
nodeId: FrameId;
|
|
43
|
+
fx?: number;
|
|
44
|
+
fy?: number;
|
|
45
|
+
fz?: number;
|
|
46
|
+
mx?: number;
|
|
47
|
+
my?: number;
|
|
48
|
+
mz?: number;
|
|
49
|
+
}
|
|
50
|
+
/** Load direction: local member axes "1", "2", "3" or global axes "X", "Y", "Z". */
|
|
51
|
+
export type LoadDirection = "1" | "2" | "3" | "X" | "Y" | "Z";
|
|
52
|
+
/** Uniform load per unit length of member, along the whole member or from `start` to `end`. */
|
|
53
|
+
export interface UniformMemberLoad {
|
|
54
|
+
loadCase: string;
|
|
55
|
+
type: "udl";
|
|
56
|
+
memberId: FrameId;
|
|
57
|
+
direction: LoadDirection;
|
|
58
|
+
w: number;
|
|
59
|
+
start?: number;
|
|
60
|
+
end?: number;
|
|
61
|
+
}
|
|
62
|
+
export interface PointMemberLoad {
|
|
63
|
+
loadCase: string;
|
|
64
|
+
type: "point";
|
|
65
|
+
memberId: FrameId;
|
|
66
|
+
direction: LoadDirection;
|
|
67
|
+
P: number;
|
|
68
|
+
a: number;
|
|
69
|
+
}
|
|
70
|
+
export type MemberLoad = UniformMemberLoad | PointMemberLoad;
|
|
71
|
+
/** Descriptive category of a load case; it labels the case and does not change the analysis. */
|
|
72
|
+
export type LoadCaseType = "dead" | "superDead" | "live" | "roofLive" | "snow" | "wind" | "seismic" | "other";
|
|
73
|
+
/**
|
|
74
|
+
* One independently analysed set of loads, e.g. dead, superimposed dead or live. The loads
|
|
75
|
+
* themselves are listed in `FrameModel.nodalLoads` and `FrameModel.memberLoads`, each tagged
|
|
76
|
+
* with its `loadCase`.
|
|
77
|
+
*/
|
|
78
|
+
export interface LoadCase {
|
|
79
|
+
id: string;
|
|
80
|
+
name?: string;
|
|
81
|
+
type?: LoadCaseType;
|
|
82
|
+
/**
|
|
83
|
+
* Self-weight multiplier (1 = full self-weight). Applies `selfWeight · unitWeight · A` per unit
|
|
84
|
+
* length of every member along global −Z. Default 0.
|
|
85
|
+
*/
|
|
86
|
+
selfWeight?: number;
|
|
87
|
+
}
|
|
88
|
+
/** One term of a load combination: a factor times a load case or another combination. */
|
|
89
|
+
export type CombinationTerm = {
|
|
90
|
+
case: string;
|
|
91
|
+
factor: number;
|
|
92
|
+
} | {
|
|
93
|
+
combination: string;
|
|
94
|
+
factor: number;
|
|
95
|
+
};
|
|
96
|
+
/** A linear combination (sum of factored terms) of load cases and other combinations. */
|
|
97
|
+
export interface LoadCombination {
|
|
98
|
+
id: string;
|
|
99
|
+
name?: string;
|
|
100
|
+
terms: CombinationTerm[];
|
|
101
|
+
}
|
|
102
|
+
export interface FrameModel {
|
|
103
|
+
nodes: FrameNode[];
|
|
104
|
+
members: Member[];
|
|
105
|
+
restraints: Restraint[];
|
|
106
|
+
loadCases: LoadCase[];
|
|
107
|
+
/** Nodal loads of every load case, each tagged with its `loadCase`. */
|
|
108
|
+
nodalLoads?: NodalLoad[];
|
|
109
|
+
/** Member loads of every load case, each tagged with its `loadCase`. */
|
|
110
|
+
memberLoads?: MemberLoad[];
|
|
111
|
+
combinations?: LoadCombination[];
|
|
112
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.type.js","sourceRoot":"","sources":["../../../../src/fea/frame/types/model.type.ts"],"names":[],"mappings":""}
|