@theerapat-s28/ts-structural-eng-tools 1.5.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 +34 -3
- 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/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/index.d.ts +4 -0
- package/dist/core/index.js +12 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/types/section-properties.type.d.ts +13 -0
- package/dist/core/types/section-properties.type.js +3 -0
- package/dist/core/types/section-properties.type.js.map +1 -0
- package/dist/esm/core/constants/frame.constant.js +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 +8 -4
- package/dist/index.js +37 -1
- package/dist/index.js.map +1 -1
- package/dist/rc/index.d.ts +2 -0
- package/dist/rc/index.js +3 -1
- package/dist/rc/index.js.map +1 -1
- package/dist/rc/rc-section-properties.d.ts +35 -0
- package/dist/rc/rc-section-properties.js +59 -0
- package/dist/rc/rc-section-properties.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +19 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matrix.d.ts +45 -0
- package/dist/utils/matrix.js +157 -0
- package/dist/utils/matrix.js.map +1 -0
- package/dist/utils/skyline.d.ts +49 -0
- package/dist/utils/skyline.js +161 -0
- package/dist/utils/skyline.js.map +1 -0
- package/package.json +20 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rc-beam.type.js","sourceRoot":"","sources":["../../../../src/core/types/rc-beam.type.ts"],"names":[],"mappings":"AAoDA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAwB;IACzD,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"section-properties.type.js","sourceRoot":"","sources":["../../../../src/core/types/section-properties.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit.type.js","sourceRoot":"","sources":["../../../../src/core/types/unit.type.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { zeros } from "../../../utils/matrix.js";
|
|
2
|
+
/**
|
|
3
|
+
* Local DOF indices (0-based) whose reference-matrix rotation sign is opposite to the
|
|
4
|
+
* right-hand rule: R2 and R3 at the start and end nodes.
|
|
5
|
+
*/
|
|
6
|
+
const FLIPPED_DOFS = [4, 5, 10, 11];
|
|
7
|
+
/**
|
|
8
|
+
* Local stiffness matrix of a 3D prismatic beam element, exactly as in the reference
|
|
9
|
+
* "Complete Beam Stiffness Matrix".
|
|
10
|
+
*
|
|
11
|
+
* DOF order for node i then node j: [U1, U2, U3, R1, R2, R3]. Local 1 runs along the member.
|
|
12
|
+
* The reference matrix measures the bending rotations R2 and R3 opposite to the right-hand
|
|
13
|
+
* rule; use `beam3dLocalStiffnessRightHanded` for the right-handed form.
|
|
14
|
+
*
|
|
15
|
+
* The reference uses one `EI`; here the U2–R3 terms use `E·I33` and the U3–R2 terms use
|
|
16
|
+
* `E·I22`, which reduces to the reference when `I22 = I33`.
|
|
17
|
+
*
|
|
18
|
+
* @param E - Young's modulus in MPa
|
|
19
|
+
* @param G - Shear modulus in MPa
|
|
20
|
+
* @param A - Area in mm²
|
|
21
|
+
* @param I22 - Second moment about local 2 in mm⁴
|
|
22
|
+
* @param I33 - Second moment about local 3 in mm⁴
|
|
23
|
+
* @param J - Torsion constant in mm⁴
|
|
24
|
+
* @param L - Member length in mm
|
|
25
|
+
* @returns 12×12 symmetric matrix in N and mm
|
|
26
|
+
*/
|
|
27
|
+
export const beam3dLocalStiffness = (E, G, A, I22, I33, J, L) => {
|
|
28
|
+
const k = zeros(12, 12);
|
|
29
|
+
// 1-based row/column, upper triangle as written in the reference; mirrored for symmetry.
|
|
30
|
+
const set = (row, col, value) => {
|
|
31
|
+
k[row - 1][col - 1] = value;
|
|
32
|
+
k[col - 1][row - 1] = value;
|
|
33
|
+
};
|
|
34
|
+
const ax = (E * A) / L;
|
|
35
|
+
const tor = (G * J) / L;
|
|
36
|
+
// U2–R3 bending (I33)
|
|
37
|
+
const a3 = (12 * E * I33) / L ** 3;
|
|
38
|
+
const b3 = (6 * E * I33) / L ** 2;
|
|
39
|
+
const c3 = (4 * E * I33) / L;
|
|
40
|
+
const d3 = (2 * E * I33) / L;
|
|
41
|
+
// U3–R2 bending (I22)
|
|
42
|
+
const a2 = (12 * E * I22) / L ** 3;
|
|
43
|
+
const b2 = (6 * E * I22) / L ** 2;
|
|
44
|
+
const c2 = (4 * E * I22) / L;
|
|
45
|
+
const d2 = (2 * E * I22) / L;
|
|
46
|
+
set(1, 1, ax);
|
|
47
|
+
set(1, 7, -ax);
|
|
48
|
+
set(7, 7, ax);
|
|
49
|
+
set(2, 2, a3);
|
|
50
|
+
set(2, 6, -b3);
|
|
51
|
+
set(2, 8, -a3);
|
|
52
|
+
set(2, 12, -b3);
|
|
53
|
+
set(6, 6, c3);
|
|
54
|
+
set(6, 8, b3);
|
|
55
|
+
set(6, 12, d3);
|
|
56
|
+
set(8, 8, a3);
|
|
57
|
+
set(8, 12, b3);
|
|
58
|
+
set(12, 12, c3);
|
|
59
|
+
set(3, 3, a2);
|
|
60
|
+
set(3, 5, b2);
|
|
61
|
+
set(3, 9, -a2);
|
|
62
|
+
set(3, 11, b2);
|
|
63
|
+
set(5, 5, c2);
|
|
64
|
+
set(5, 9, -b2);
|
|
65
|
+
set(5, 11, d2);
|
|
66
|
+
set(9, 9, a2);
|
|
67
|
+
set(9, 11, -b2);
|
|
68
|
+
set(11, 11, c2);
|
|
69
|
+
set(4, 4, tor);
|
|
70
|
+
set(4, 10, -tor);
|
|
71
|
+
set(10, 10, tor);
|
|
72
|
+
return k;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Converts a local matrix between the reference rotation convention and the right-hand rule
|
|
76
|
+
* (`D·k·D`, with `D` flipping the sign of R2 and R3 at both ends). The conversion is its own inverse.
|
|
77
|
+
*/
|
|
78
|
+
export const flipBendingRotationSigns = (k) => {
|
|
79
|
+
const flipped = new Set(FLIPPED_DOFS);
|
|
80
|
+
return k.map((row, i) => row.map((value, j) => (flipped.has(i) !== flipped.has(j) ? -value : value)));
|
|
81
|
+
};
|
|
82
|
+
/** Same element as `beam3dLocalStiffness` with all rotations following the right-hand rule. */
|
|
83
|
+
export const beam3dLocalStiffnessRightHanded = (E, G, A, I22, I33, J, L) => flipBendingRotationSigns(beam3dLocalStiffness(E, G, A, I22, I33, J, L));
|
|
84
|
+
//# sourceMappingURL=beam-3d-stiffness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beam-3d-stiffness.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/beam-3d-stiffness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { FrameAnalysisError, FrameErrors } from "../../../core/errors/frame-analysis.error.js";
|
|
2
|
+
// 4-point Gauss–Legendre rule, exact for the cubic integrands used here
|
|
3
|
+
const GAUSS_POINTS = [
|
|
4
|
+
-0.8611363115940526, -0.3399810435848563, 0.3399810435848563, 0.8611363115940526,
|
|
5
|
+
];
|
|
6
|
+
const GAUSS_WEIGHTS = [
|
|
7
|
+
0.3478548451374538, 0.6521451548625461, 0.6521451548625461, 0.3478548451374538,
|
|
8
|
+
];
|
|
9
|
+
/**
|
|
10
|
+
* Equivalent nodal loads of a unit transverse/axial load at distance `x`, from the
|
|
11
|
+
* Euler–Bernoulli shape functions: the exact fixed-end solution for a prismatic member.
|
|
12
|
+
* Returned per unit of load, right-hand local DOF order [i: U1..R3, j: U1..R3].
|
|
13
|
+
*/
|
|
14
|
+
const unitEquivalentLoad = (axis, x, L) => {
|
|
15
|
+
const xi = x / L;
|
|
16
|
+
const out = new Array(12).fill(0);
|
|
17
|
+
if (axis === 1) {
|
|
18
|
+
out[0] = 1 - xi;
|
|
19
|
+
out[6] = xi;
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
const n1 = 1 - 3 * xi ** 2 + 2 * xi ** 3;
|
|
23
|
+
const n2 = L * (xi - 2 * xi ** 2 + xi ** 3);
|
|
24
|
+
const n3 = 3 * xi ** 2 - 2 * xi ** 3;
|
|
25
|
+
const n4 = L * (-(xi ** 2) + xi ** 3);
|
|
26
|
+
if (axis === 2) {
|
|
27
|
+
// load along local 2: force U2, moment about 3 (R3 = +dv/dx)
|
|
28
|
+
out[1] = n1;
|
|
29
|
+
out[5] = n2;
|
|
30
|
+
out[7] = n3;
|
|
31
|
+
out[11] = n4;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// load along local 3: force U3, moment about 2 (R2 = −dw/dx)
|
|
35
|
+
out[2] = n1;
|
|
36
|
+
out[4] = -n2;
|
|
37
|
+
out[8] = n3;
|
|
38
|
+
out[10] = -n4;
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Fixed-end forces of a member under local loads: the end forces (right-hand local axes,
|
|
44
|
+
* N and N·mm) that hold both ends fully fixed. Equivalent nodal loads are the negative.
|
|
45
|
+
*
|
|
46
|
+
* @param loads - Loads in local axes, N and mm
|
|
47
|
+
* @param L - Member length in mm
|
|
48
|
+
* @throws {FrameAnalysisError} 308 if a load lies outside the member
|
|
49
|
+
*/
|
|
50
|
+
export const fixedEndForces = (loads, L) => {
|
|
51
|
+
const equivalent = new Array(12).fill(0);
|
|
52
|
+
const add = (unit, factor) => {
|
|
53
|
+
for (let i = 0; i < 12; i++)
|
|
54
|
+
equivalent[i] += unit[i] * factor;
|
|
55
|
+
};
|
|
56
|
+
for (const load of loads) {
|
|
57
|
+
if (load.type === "point") {
|
|
58
|
+
if (!(load.a >= 0 && load.a <= L))
|
|
59
|
+
throw new FrameAnalysisError(FrameErrors.LOAD_OUTSIDE_MEMBER);
|
|
60
|
+
add(unitEquivalentLoad(load.axis, load.a, L), load.P);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
if (!(load.start >= 0 && load.end <= L && load.start < load.end)) {
|
|
64
|
+
throw new FrameAnalysisError(FrameErrors.LOAD_OUTSIDE_MEMBER);
|
|
65
|
+
}
|
|
66
|
+
const half = (load.end - load.start) / 2;
|
|
67
|
+
const mid = (load.end + load.start) / 2;
|
|
68
|
+
GAUSS_POINTS.forEach((p, index) => {
|
|
69
|
+
add(unitEquivalentLoad(load.axis, mid + half * p, L), load.w * half * GAUSS_WEIGHTS[index]);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return equivalent.map((v) => -v);
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=fixed-end-forces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-end-forces.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/fixed-end-forces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FrameAnalysisError, FrameErrors } from "../../../core/errors/frame-analysis.error.js";
|
|
2
|
+
import { solveLinearSystem } from "../../../utils/matrix.js";
|
|
3
|
+
/**
|
|
4
|
+
* Statically condenses released local DOFs out of a member, so those DOFs carry no force.
|
|
5
|
+
*
|
|
6
|
+
* With released set r and retained set c:
|
|
7
|
+
* `k* = k_cc − k_cr·k_rr⁻¹·k_rc`, `f* = f_c − k_cr·k_rr⁻¹·f_r`.
|
|
8
|
+
* The stiffness is condensed once; the returned function condenses the fixed-end forces of
|
|
9
|
+
* each load case.
|
|
10
|
+
*
|
|
11
|
+
* @param k - 12×12 local stiffness (right-hand)
|
|
12
|
+
* @param released - Local DOF indices (0–11) to release
|
|
13
|
+
* @throws {FrameAnalysisError} 307 if the released set makes the member a mechanism
|
|
14
|
+
*/
|
|
15
|
+
export const condenseMember = (k, released) => {
|
|
16
|
+
if (released.length === 0) {
|
|
17
|
+
return { k, condenseFixedEndForces: (fixed) => [...fixed] };
|
|
18
|
+
}
|
|
19
|
+
const retained = Array.from({ length: 12 }, (_, i) => i).filter((i) => !released.includes(i));
|
|
20
|
+
const sub = (rows, cols) => rows.map((r) => cols.map((c) => k[r][c]));
|
|
21
|
+
const krr = sub(released, released);
|
|
22
|
+
const krc = sub(released, retained);
|
|
23
|
+
const kcr = sub(retained, released);
|
|
24
|
+
const kcc = sub(retained, retained);
|
|
25
|
+
// [k_rr⁻¹·k_rc | k_rr⁻¹]
|
|
26
|
+
const rhs = released.map((_, i) => [...krc[i], ...released.map((__, j) => (i === j ? 1 : 0))]);
|
|
27
|
+
const solved = solveLinearSystem(krr, rhs);
|
|
28
|
+
if (!solved)
|
|
29
|
+
throw new FrameAnalysisError(FrameErrors.INVALID_RELEASE);
|
|
30
|
+
const nc = retained.length;
|
|
31
|
+
const kStar = k.map((row) => row.map(() => 0));
|
|
32
|
+
retained.forEach((r, ri) => {
|
|
33
|
+
retained.forEach((c, ci) => {
|
|
34
|
+
let value = kcc[ri][ci];
|
|
35
|
+
released.forEach((_, j) => {
|
|
36
|
+
value -= kcr[ri][j] * solved[j][ci];
|
|
37
|
+
});
|
|
38
|
+
kStar[r][c] = value;
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
// k_cr·k_rr⁻¹, applied to f_r for every load case
|
|
42
|
+
const kcrKrrInv = retained.map((_, ri) => released.map((__, m) => released.reduce((s, ___, j) => s + kcr[ri][j] * solved[j][nc + m], 0)));
|
|
43
|
+
return {
|
|
44
|
+
k: kStar,
|
|
45
|
+
condenseFixedEndForces: (fixed) => {
|
|
46
|
+
const fStar = new Array(12).fill(0);
|
|
47
|
+
const fr = released.map((r) => fixed[r]);
|
|
48
|
+
retained.forEach((r, ri) => {
|
|
49
|
+
fStar[r] = fixed[r] - kcrKrrInv[ri].reduce((s, v, m) => s + v * fr[m], 0);
|
|
50
|
+
});
|
|
51
|
+
return fStar;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=static-condensation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-condensation.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/static-condensation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAe,MAAM,mBAAmB,CAAC;AAQnE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,QAAkB,EAAmB,EAAE;IAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC,EAAE,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,GAAG,GAAG,CAAC,IAAc,EAAE,IAAc,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1F,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,yBAAyB;IACzB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,kBAAkB,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACvE,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE3B,MAAM,KAAK,GAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;QACzB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;YACzB,IAAI,KAAK,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxB,KAAK,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CACvC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC/F,CAAC;IAEF,OAAO;QACL,CAAC,EAAE,KAAK;QACR,sBAAsB,EAAE,CAAC,KAAK,EAAE,EAAE;YAChC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE;gBACzB,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5E,CAAC,CAAC,CAAC;YACH,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { analyzeFrame, createFrameAnalysis } from "./solver/analyze-frame.js";
|
|
2
|
+
export { validateFrameModel } from "./validation/validate-model.js";
|
|
3
|
+
export { beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, } from "./elements/beam-3d-stiffness.js";
|
|
4
|
+
export { memberAxes } from "./transformation/coordinate-transform.js";
|
|
5
|
+
export { memberDemandEnvelope } from "./post/demand-envelope.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/fea/frame/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { roundToDecimalPlaces } from "../../../utils/math.js";
|
|
2
|
+
/** Demands of one diagram; Vu between `from` and `to`. */
|
|
3
|
+
const diagramDemands = (diagram, from, to) => {
|
|
4
|
+
const { N, M3, V2 } = diagram.extremes;
|
|
5
|
+
const moments = {
|
|
6
|
+
MuPositive: Math.max(M3.max.value, 0),
|
|
7
|
+
MuNegative: Math.max(-M3.min.value, 0),
|
|
8
|
+
Nu: Math.abs(N.max.value) >= Math.abs(N.min.value) ? N.max.value : N.min.value,
|
|
9
|
+
};
|
|
10
|
+
if (diagram.stations.length === 0) {
|
|
11
|
+
// analysed with diagrams: "extremes" — Vu over the whole length comes from the extremes
|
|
12
|
+
if (from > 0) {
|
|
13
|
+
throw new Error('shearCriticalDistance needs member stations: analyse with diagrams: "full", or pass a diagram from createFrameAnalysis(...).memberDiagram.');
|
|
14
|
+
}
|
|
15
|
+
return { ...moments, Vu: Math.max(Math.abs(V2.max.value), Math.abs(V2.min.value)) };
|
|
16
|
+
}
|
|
17
|
+
// V2 is piecewise linear with stations at every breakpoint, so interpolation is exact.
|
|
18
|
+
// Stations at a point load come as a (left, right) pair sharing the same x.
|
|
19
|
+
const v2At = (x, side) => {
|
|
20
|
+
const stations = diagram.stations;
|
|
21
|
+
const hits = stations.filter((s) => s.x === x);
|
|
22
|
+
if (hits.length > 0)
|
|
23
|
+
return side === "left" ? hits[0].V2 : hits[hits.length - 1].V2;
|
|
24
|
+
for (let i = 0; i < stations.length - 1; i++) {
|
|
25
|
+
const a = stations[i];
|
|
26
|
+
const b = stations[i + 1];
|
|
27
|
+
if (a.x < x && x < b.x)
|
|
28
|
+
return a.V2 + ((b.V2 - a.V2) * (x - a.x)) / (b.x - a.x);
|
|
29
|
+
}
|
|
30
|
+
return stations[stations.length - 1].V2;
|
|
31
|
+
};
|
|
32
|
+
const candidates = [v2At(from, "right"), v2At(to, "left")];
|
|
33
|
+
for (const s of diagram.stations) {
|
|
34
|
+
if (s.x >= from && s.x <= to)
|
|
35
|
+
candidates.push(s.V2);
|
|
36
|
+
}
|
|
37
|
+
return { ...moments, Vu: roundToDecimalPlaces(Math.max(...candidates.map(Math.abs)), 4) + 0 };
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Reduces a member's force diagrams to the demands used in beam design — Mu⁺, Mu⁻, Vu, Nu —
|
|
41
|
+
* enveloped over load combinations (and optionally load cases), with the governing id of each.
|
|
42
|
+
* Works on plain numbers and does not depend on the `rc` module.
|
|
43
|
+
*
|
|
44
|
+
* @param result - Result of `analyzeFrame`
|
|
45
|
+
* @param memberId - Member to reduce
|
|
46
|
+
* @param options - Combinations and/or cases to envelope, `shearCriticalDistance` in mm
|
|
47
|
+
* @returns Demands in kN and kN·m with their governing load case or combination
|
|
48
|
+
* @throws {Error} if the member or a requested id is not in the result, if nothing is selected,
|
|
49
|
+
* or if `shearCriticalDistance` is used on a result analysed with `diagrams: "extremes"`
|
|
50
|
+
*/
|
|
51
|
+
export const memberDemandEnvelope = (result, memberId, options = {}) => {
|
|
52
|
+
const pick = (source, ids, label) => ids.map((id) => {
|
|
53
|
+
const r = source[id];
|
|
54
|
+
if (!r)
|
|
55
|
+
throw new Error(`${label} "${id}" is not in the frame result.`);
|
|
56
|
+
return r;
|
|
57
|
+
});
|
|
58
|
+
const combinationIds = options.combinations ?? (options.cases ? [] : Object.keys(result.combinations));
|
|
59
|
+
const selected = [
|
|
60
|
+
...pick(result.combinations, combinationIds, "Load combination"),
|
|
61
|
+
...pick(result.cases, options.cases ?? [], "Load case"),
|
|
62
|
+
];
|
|
63
|
+
if (selected.length === 0) {
|
|
64
|
+
throw new Error("No load combinations or cases selected; the result has no combinations, so pass `cases`.");
|
|
65
|
+
}
|
|
66
|
+
const diagrams = selected.map((r) => {
|
|
67
|
+
const diagram = r.memberDiagrams.find((d) => d.memberId === memberId);
|
|
68
|
+
if (!diagram)
|
|
69
|
+
throw new Error(`Member ${String(memberId)} is not in the frame result.`);
|
|
70
|
+
return { id: r.id, diagram };
|
|
71
|
+
});
|
|
72
|
+
const L = diagrams[0].diagram.length;
|
|
73
|
+
const from = Math.min(Math.max(options.shearCriticalDistance ?? 0, 0), L / 2);
|
|
74
|
+
const to = L - from;
|
|
75
|
+
const envelope = {
|
|
76
|
+
MuPositive: 0,
|
|
77
|
+
MuNegative: 0,
|
|
78
|
+
Vu: 0,
|
|
79
|
+
Nu: 0,
|
|
80
|
+
governing: { MuPositive: null, MuNegative: null, Vu: null, Nu: null },
|
|
81
|
+
};
|
|
82
|
+
for (const { id, diagram } of diagrams) {
|
|
83
|
+
const d = diagramDemands(diagram, from, to);
|
|
84
|
+
for (const key of ["MuPositive", "MuNegative", "Vu"]) {
|
|
85
|
+
if (d[key] > envelope[key]) {
|
|
86
|
+
envelope[key] = d[key];
|
|
87
|
+
envelope.governing[key] = id;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (Math.abs(d.Nu) > Math.abs(envelope.Nu)) {
|
|
91
|
+
envelope.Nu = d.Nu;
|
|
92
|
+
envelope.governing.Nu = id;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { memberId, ...envelope, VuRange: { from, to } };
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=demand-envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demand-envelope.js","sourceRoot":"","sources":["../../../../../src/fea/frame/post/demand-envelope.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
const DISPLACEMENT_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
2
|
+
const REACTION_KEYS = ["fx", "fy", "fz", "mx", "my", "mz"];
|
|
3
|
+
const COMPONENTS = ["N", "V2", "V3", "T", "M2", "M3", "u1", "u2", "u3"];
|
|
4
|
+
/** Keeps the larger max and smaller min; the first combination wins a tie. */
|
|
5
|
+
const update = (bound, max, min) => {
|
|
6
|
+
if (!bound)
|
|
7
|
+
return { max, min };
|
|
8
|
+
return {
|
|
9
|
+
max: max.value > bound.max.value ? max : bound.max,
|
|
10
|
+
min: min.value < bound.min.value ? min : bound.min,
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Max/min of every presented result across combinations, each with the combination that
|
|
15
|
+
* governs it. Combinations must come from the same model (same nodes and members, same order).
|
|
16
|
+
*
|
|
17
|
+
* @param results - Combination results, in model order
|
|
18
|
+
*/
|
|
19
|
+
export const buildEnvelope = (results) => {
|
|
20
|
+
const first = results[0];
|
|
21
|
+
const nodalDisplacements = first.nodalDisplacements.map((d, n) => {
|
|
22
|
+
const entry = { nodeId: d.nodeId };
|
|
23
|
+
for (const key of DISPLACEMENT_KEYS) {
|
|
24
|
+
let bound;
|
|
25
|
+
for (const r of results) {
|
|
26
|
+
const g = { value: r.nodalDisplacements[n][key], combinationId: r.id };
|
|
27
|
+
bound = update(bound, g, g);
|
|
28
|
+
}
|
|
29
|
+
entry[key] = bound;
|
|
30
|
+
}
|
|
31
|
+
return entry;
|
|
32
|
+
});
|
|
33
|
+
const reactions = first.reactions.map((d, n) => {
|
|
34
|
+
const entry = { nodeId: d.nodeId };
|
|
35
|
+
for (const key of REACTION_KEYS) {
|
|
36
|
+
let bound;
|
|
37
|
+
for (const r of results) {
|
|
38
|
+
const g = { value: r.reactions[n][key], combinationId: r.id };
|
|
39
|
+
bound = update(bound, g, g);
|
|
40
|
+
}
|
|
41
|
+
entry[key] = bound;
|
|
42
|
+
}
|
|
43
|
+
return entry;
|
|
44
|
+
});
|
|
45
|
+
const members = first.memberDiagrams.map((d, m) => {
|
|
46
|
+
const extremes = {};
|
|
47
|
+
for (const c of COMPONENTS) {
|
|
48
|
+
let bound;
|
|
49
|
+
for (const r of results) {
|
|
50
|
+
const e = r.memberDiagrams[m].extremes[c];
|
|
51
|
+
bound = update(bound, { ...e.max, combinationId: r.id }, { ...e.min, combinationId: r.id });
|
|
52
|
+
}
|
|
53
|
+
extremes[c] = bound;
|
|
54
|
+
}
|
|
55
|
+
return { memberId: d.memberId, extremes };
|
|
56
|
+
});
|
|
57
|
+
return { combinationIds: results.map((r) => r.id), nodalDisplacements, reactions, members };
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../../../../../src/fea/frame/post/envelope.ts"],"names":[],"mappings":"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"}
|