@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,145 @@
|
|
|
1
|
+
/** Returns an m×n zero matrix. */
|
|
2
|
+
export const zeros = (m, n) => Array.from({ length: m }, () => new Array(n).fill(0));
|
|
3
|
+
/** Returns the n×n identity matrix. */
|
|
4
|
+
export const identity = (n) => {
|
|
5
|
+
const I = zeros(n, n);
|
|
6
|
+
for (let i = 0; i < n; i++)
|
|
7
|
+
I[i][i] = 1;
|
|
8
|
+
return I;
|
|
9
|
+
};
|
|
10
|
+
/** Returns the transpose of a matrix. */
|
|
11
|
+
export const transpose = (A) => {
|
|
12
|
+
const m = A.length;
|
|
13
|
+
const n = A[0].length;
|
|
14
|
+
const T = zeros(n, m);
|
|
15
|
+
for (let i = 0; i < m; i++) {
|
|
16
|
+
for (let j = 0; j < n; j++)
|
|
17
|
+
T[j][i] = A[i][j];
|
|
18
|
+
}
|
|
19
|
+
return T;
|
|
20
|
+
};
|
|
21
|
+
/** Returns the product A·B of an m×n and an n×p matrix. */
|
|
22
|
+
export const matMul = (A, B) => {
|
|
23
|
+
const m = A.length;
|
|
24
|
+
const n = B.length;
|
|
25
|
+
const p = B[0].length;
|
|
26
|
+
const C = zeros(m, p);
|
|
27
|
+
for (let i = 0; i < m; i++) {
|
|
28
|
+
for (let k = 0; k < n; k++) {
|
|
29
|
+
const aik = A[i][k];
|
|
30
|
+
if (aik === 0)
|
|
31
|
+
continue;
|
|
32
|
+
for (let j = 0; j < p; j++)
|
|
33
|
+
C[i][j] += aik * B[k][j];
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return C;
|
|
37
|
+
};
|
|
38
|
+
/** Returns the product A·x of an m×n matrix and an n-vector. */
|
|
39
|
+
export const matVec = (A, x) => A.map((row) => row.reduce((sum, a, j) => sum + a * x[j], 0));
|
|
40
|
+
/**
|
|
41
|
+
* Cholesky factorisation A = L·Lᵀ of a symmetric positive-definite matrix.
|
|
42
|
+
*
|
|
43
|
+
* @param A - Symmetric matrix (only the lower triangle is read)
|
|
44
|
+
* @param tolerance - A pivot at or below `tolerance` times its own diagonal term is treated as zero
|
|
45
|
+
* @returns The lower-triangular factor L, or `null` when A is not positive definite (singular or a mechanism)
|
|
46
|
+
*/
|
|
47
|
+
export const choleskyFactor = (A, tolerance = 1e-12) => {
|
|
48
|
+
const n = A.length;
|
|
49
|
+
const L = zeros(n, n);
|
|
50
|
+
for (let i = 0; i < n; i++) {
|
|
51
|
+
for (let j = 0; j <= i; j++) {
|
|
52
|
+
let sum = A[i][j];
|
|
53
|
+
for (let k = 0; k < j; k++)
|
|
54
|
+
sum -= L[i][k] * L[j][k];
|
|
55
|
+
if (i === j) {
|
|
56
|
+
if (!(sum > tolerance * A[i][i]))
|
|
57
|
+
return null;
|
|
58
|
+
L[i][i] = Math.sqrt(sum);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
L[i][j] = sum / L[j][j];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return L;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Solves A·x = b from the Cholesky factor L of A (forward then back substitution), so one
|
|
69
|
+
* factorisation serves any number of right-hand sides.
|
|
70
|
+
*
|
|
71
|
+
* @param L - Lower-triangular factor from `choleskyFactor`
|
|
72
|
+
* @param b - Right-hand side
|
|
73
|
+
*/
|
|
74
|
+
export const choleskySolveFactored = (L, b) => {
|
|
75
|
+
const n = L.length;
|
|
76
|
+
const y = new Array(n).fill(0);
|
|
77
|
+
for (let i = 0; i < n; i++) {
|
|
78
|
+
let sum = b[i];
|
|
79
|
+
for (let k = 0; k < i; k++)
|
|
80
|
+
sum -= L[i][k] * y[k];
|
|
81
|
+
y[i] = sum / L[i][i];
|
|
82
|
+
}
|
|
83
|
+
const x = new Array(n).fill(0);
|
|
84
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
85
|
+
let sum = y[i];
|
|
86
|
+
for (let k = i + 1; k < n; k++)
|
|
87
|
+
sum -= L[k][i] * x[k];
|
|
88
|
+
x[i] = sum / L[i][i];
|
|
89
|
+
}
|
|
90
|
+
return x;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Solves A·x = b for a symmetric positive-definite A by Cholesky factorisation.
|
|
94
|
+
*
|
|
95
|
+
* @param A - Symmetric matrix (only the lower triangle is read)
|
|
96
|
+
* @param b - Right-hand side
|
|
97
|
+
* @param tolerance - A pivot at or below `tolerance` times its own diagonal term is treated as zero
|
|
98
|
+
* @returns The solution, or `null` when A is not positive definite (singular or a mechanism)
|
|
99
|
+
*/
|
|
100
|
+
export const choleskySolve = (A, b, tolerance = 1e-12) => {
|
|
101
|
+
const L = choleskyFactor(A, tolerance);
|
|
102
|
+
return L ? choleskySolveFactored(L, b) : null;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Solves A·X = B for a general square A by Gaussian elimination with partial pivoting.
|
|
106
|
+
*
|
|
107
|
+
* @param A - n×n matrix
|
|
108
|
+
* @param B - n×p right-hand-side matrix
|
|
109
|
+
* @param tolerance - A pivot at or below `tolerance` times the largest entry of A is treated as zero
|
|
110
|
+
* @returns The n×p solution, or `null` when A is singular
|
|
111
|
+
*/
|
|
112
|
+
export const solveLinearSystem = (A, B, tolerance = 1e-12) => {
|
|
113
|
+
const n = A.length;
|
|
114
|
+
const p = B[0].length;
|
|
115
|
+
const M = A.map((row, i) => [...row, ...B[i]]);
|
|
116
|
+
const scale = Math.max(...A.map((row) => Math.max(...row.map(Math.abs))));
|
|
117
|
+
for (let col = 0; col < n; col++) {
|
|
118
|
+
let pivot = col;
|
|
119
|
+
for (let r = col + 1; r < n; r++) {
|
|
120
|
+
if (Math.abs(M[r][col]) > Math.abs(M[pivot][col]))
|
|
121
|
+
pivot = r;
|
|
122
|
+
}
|
|
123
|
+
if (!(Math.abs(M[pivot][col]) > tolerance * scale))
|
|
124
|
+
return null;
|
|
125
|
+
[M[col], M[pivot]] = [M[pivot], M[col]];
|
|
126
|
+
for (let r = col + 1; r < n; r++) {
|
|
127
|
+
const factor = M[r][col] / M[col][col];
|
|
128
|
+
if (factor === 0)
|
|
129
|
+
continue;
|
|
130
|
+
for (let c = col; c < n + p; c++)
|
|
131
|
+
M[r][c] -= factor * M[col][c];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const X = zeros(n, p);
|
|
135
|
+
for (let c = 0; c < p; c++) {
|
|
136
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
137
|
+
let sum = M[i][n + c];
|
|
138
|
+
for (let k = i + 1; k < n; k++)
|
|
139
|
+
sum -= M[i][k] * X[k][c];
|
|
140
|
+
X[i][c] = sum / M[i][i];
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return X;
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=matrix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../../src/utils/matrix.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merges two warning arrays into a single combined array.
|
|
3
|
+
*
|
|
4
|
+
* @param existingWarnings - Warnings already accumulated
|
|
5
|
+
* @param newWarnings - Additional warnings to append
|
|
6
|
+
* @returns Combined warning array
|
|
7
|
+
*/
|
|
8
|
+
export const mergeWarnings = (existingWarnings, newWarnings) => {
|
|
9
|
+
return [...existingWarnings, ...newWarnings];
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=merge-warning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-warning.js","sourceRoot":"","sources":["../../../src/utils/merge-warning.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,gBAA0B,EAAE,WAAqB,EAAY,EAAE;IAC3F,OAAO,CAAC,GAAG,gBAAgB,EAAE,GAAG,WAAW,CAAC,CAAC;AAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/** Creates a zero skyline matrix with the given first row of each column (`first[j] ≤ j`). */
|
|
2
|
+
export const createSkyline = (first) => {
|
|
3
|
+
const n = first.length;
|
|
4
|
+
const firstRows = Int32Array.from(first);
|
|
5
|
+
const columns = Array.from({ length: n }, (_, j) => new Float64Array(j - firstRows[j] + 1));
|
|
6
|
+
return { n, first: firstRows, columns };
|
|
7
|
+
};
|
|
8
|
+
/** Adds `value` to A[i][j] (and so to A[j][i]); the entry must lie inside the profile. */
|
|
9
|
+
export const skylineAdd = (S, i, j, value) => {
|
|
10
|
+
const row = Math.min(i, j);
|
|
11
|
+
const col = Math.max(i, j);
|
|
12
|
+
const offset = row - S.first[col];
|
|
13
|
+
if (offset < 0)
|
|
14
|
+
throw new Error(`Skyline entry (${row}, ${col}) is outside the profile.`);
|
|
15
|
+
S.columns[col][offset] += value;
|
|
16
|
+
};
|
|
17
|
+
/** Reads A[i][j] (0 outside the profile). */
|
|
18
|
+
export const skylineGet = (S, i, j) => {
|
|
19
|
+
const row = Math.min(i, j);
|
|
20
|
+
const col = Math.max(i, j);
|
|
21
|
+
const offset = row - S.first[col];
|
|
22
|
+
return offset < 0 ? 0 : S.columns[col][offset];
|
|
23
|
+
};
|
|
24
|
+
/** Number of stored entries, a measure of memory and of factorisation work. */
|
|
25
|
+
export const skylineSize = (S) => S.columns.reduce((sum, column) => sum + column.length, 0);
|
|
26
|
+
/**
|
|
27
|
+
* Factorises a symmetric positive-definite skyline matrix in place as A = Uᵀ·U (U upper
|
|
28
|
+
* triangular, same profile).
|
|
29
|
+
*
|
|
30
|
+
* @param S - Matrix, overwritten by U
|
|
31
|
+
* @param tolerance - A pivot at or below `tolerance` times its own diagonal term is treated as zero
|
|
32
|
+
* @returns `{ ok: true }`, or `{ ok: false, failedPivot }` with the index of the first pivot that
|
|
33
|
+
* failed (A is singular or indefinite there — for a structure, a mechanism involving that DOF)
|
|
34
|
+
*/
|
|
35
|
+
export const skylineFactor = (S, tolerance = 1e-12) => {
|
|
36
|
+
const { n, first, columns } = S;
|
|
37
|
+
for (let j = 0; j < n; j++) {
|
|
38
|
+
const colJ = columns[j];
|
|
39
|
+
const fj = first[j];
|
|
40
|
+
for (let i = fj; i < j; i++) {
|
|
41
|
+
const colI = columns[i];
|
|
42
|
+
const fi = first[i];
|
|
43
|
+
const k0 = Math.max(fi, fj);
|
|
44
|
+
let sum = colJ[i - fj];
|
|
45
|
+
for (let k = k0; k < i; k++)
|
|
46
|
+
sum -= colI[k - fi] * colJ[k - fj];
|
|
47
|
+
colJ[i - fj] = sum / colI[i - fi];
|
|
48
|
+
}
|
|
49
|
+
const diagonal = colJ[j - fj];
|
|
50
|
+
let sum = diagonal;
|
|
51
|
+
for (let k = fj; k < j; k++)
|
|
52
|
+
sum -= colJ[k - fj] * colJ[k - fj];
|
|
53
|
+
if (!(sum > tolerance * diagonal))
|
|
54
|
+
return { ok: false, failedPivot: j };
|
|
55
|
+
colJ[j - fj] = Math.sqrt(sum);
|
|
56
|
+
}
|
|
57
|
+
return { ok: true };
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Solves A·x = b from the factor produced by `skylineFactor` (forward then back substitution).
|
|
61
|
+
* One factorisation serves any number of right-hand sides.
|
|
62
|
+
*/
|
|
63
|
+
export const skylineSolve = (U, b) => {
|
|
64
|
+
const { n, first, columns } = U;
|
|
65
|
+
const y = Array.from(b);
|
|
66
|
+
// Uᵀ·y = b
|
|
67
|
+
for (let j = 0; j < n; j++) {
|
|
68
|
+
const col = columns[j];
|
|
69
|
+
const fj = first[j];
|
|
70
|
+
let sum = y[j];
|
|
71
|
+
for (let k = fj; k < j; k++)
|
|
72
|
+
sum -= col[k - fj] * y[k];
|
|
73
|
+
y[j] = sum / col[j - fj];
|
|
74
|
+
}
|
|
75
|
+
// U·x = y
|
|
76
|
+
for (let j = n - 1; j >= 0; j--) {
|
|
77
|
+
const col = columns[j];
|
|
78
|
+
const fj = first[j];
|
|
79
|
+
y[j] /= col[j - fj];
|
|
80
|
+
const xj = y[j];
|
|
81
|
+
for (let k = fj; k < j; k++)
|
|
82
|
+
y[k] -= col[k - fj] * xj;
|
|
83
|
+
}
|
|
84
|
+
return y;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Reverse Cuthill–McKee ordering of a graph, which keeps connected vertices close together and
|
|
88
|
+
* so narrows the band of the matrix built on it. Each connected component starts from a
|
|
89
|
+
* pseudo-peripheral vertex.
|
|
90
|
+
*
|
|
91
|
+
* @param adjacency - Neighbours of each vertex (undirected)
|
|
92
|
+
* @returns The vertices in their new order (`order[k]` = original index of the k-th vertex)
|
|
93
|
+
*/
|
|
94
|
+
export const reverseCuthillMcKee = (adjacency) => {
|
|
95
|
+
const n = adjacency.length;
|
|
96
|
+
const degree = adjacency.map((neighbours) => neighbours.length);
|
|
97
|
+
const visited = new Uint8Array(n);
|
|
98
|
+
const order = [];
|
|
99
|
+
/** Breadth-first levels from `start`, within unvisited vertices. */
|
|
100
|
+
const levels = (start) => {
|
|
101
|
+
const level = new Int32Array(n).fill(-1);
|
|
102
|
+
level[start] = 0;
|
|
103
|
+
const queue = [start];
|
|
104
|
+
let last = start;
|
|
105
|
+
for (let q = 0; q < queue.length; q++) {
|
|
106
|
+
const v = queue[q];
|
|
107
|
+
for (const w of adjacency[v]) {
|
|
108
|
+
if (!visited[w] && level[w] < 0) {
|
|
109
|
+
level[w] = level[v] + 1;
|
|
110
|
+
queue.push(w);
|
|
111
|
+
if (level[w] > level[last] || (level[w] === level[last] && degree[w] < degree[last])) {
|
|
112
|
+
last = w;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { depth: level[last], last };
|
|
118
|
+
};
|
|
119
|
+
const byDegree = Array.from({ length: n }, (_, i) => i).sort((a, b) => degree[a] - degree[b]);
|
|
120
|
+
for (const seed of byDegree) {
|
|
121
|
+
if (visited[seed])
|
|
122
|
+
continue;
|
|
123
|
+
// pseudo-peripheral start: move to the far end of the BFS until the depth stops growing
|
|
124
|
+
let start = seed;
|
|
125
|
+
let { depth, last } = levels(start);
|
|
126
|
+
for (let iteration = 0; iteration < 8; iteration++) {
|
|
127
|
+
const next = levels(last);
|
|
128
|
+
if (next.depth <= depth)
|
|
129
|
+
break;
|
|
130
|
+
start = last;
|
|
131
|
+
depth = next.depth;
|
|
132
|
+
last = next.last;
|
|
133
|
+
}
|
|
134
|
+
const component = [start];
|
|
135
|
+
visited[start] = 1;
|
|
136
|
+
for (let q = 0; q < component.length; q++) {
|
|
137
|
+
const neighbours = adjacency[component[q]]
|
|
138
|
+
.filter((w) => !visited[w])
|
|
139
|
+
.sort((a, b) => degree[a] - degree[b]);
|
|
140
|
+
for (const w of neighbours) {
|
|
141
|
+
if (!visited[w]) {
|
|
142
|
+
visited[w] = 1;
|
|
143
|
+
component.push(w);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
order.push(...component);
|
|
148
|
+
}
|
|
149
|
+
return order.reverse();
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=skyline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skyline.js","sourceRoot":"","sources":["../../../src/utils/skyline.ts"],"names":[],"mappings":"AAaA,8FAA8F;AAC9F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAwB,EAAiB,EAAE;IACvE,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5F,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC,CAAC;AAEF,0FAA0F;AAC1F,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAE,CAAS,EAAE,CAAS,EAAE,KAAa,EAAQ,EAAE;IACxF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,KAAK,GAAG,2BAA2B,CAAC,CAAC;IAC1F,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;AAClC,CAAC,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAgB,EAAE,CAAS,EAAE,CAAS,EAAU,EAAE;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAU,EAAE,CACtD,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,CAAgB,EAChB,SAAS,GAAG,KAAK,EACkC,EAAE;IACrD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACpB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YACvB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAChE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC9B,IAAI,GAAG,GAAG,QAAQ,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,CAAC,GAAG,GAAG,SAAS,GAAG,QAAQ,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAgB,EAAE,CAAoB,EAAY,EAAE;IAC/E,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,WAAW;IACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3B,CAAC;IACD,UAAU;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,SAAqB,EAAY,EAAE;IACrE,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,oEAAoE;IACpE,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACxB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACd,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;wBACrF,IAAI,GAAG,CAAC,CAAC;oBACX,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;IACtC,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5B,wFAAwF;QACxF,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,CAAC;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK;gBAAE,MAAM;YAC/B,KAAK,GAAG,IAAI,CAAC;YACb,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACnB,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,SAAS,GAAa,CAAC,KAAK,CAAC,CAAC;QACpC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;iBACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;iBAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBACf,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC;AACzB,CAAC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type Matrix } from "../../../utils/matrix";
|
|
2
|
+
/**
|
|
3
|
+
* Local stiffness matrix of a 3D prismatic beam element, exactly as in the reference
|
|
4
|
+
* "Complete Beam Stiffness Matrix".
|
|
5
|
+
*
|
|
6
|
+
* DOF order for node i then node j: [U1, U2, U3, R1, R2, R3]. Local 1 runs along the member.
|
|
7
|
+
* The reference matrix measures the bending rotations R2 and R3 opposite to the right-hand
|
|
8
|
+
* rule; use `beam3dLocalStiffnessRightHanded` for the right-handed form.
|
|
9
|
+
*
|
|
10
|
+
* The reference uses one `EI`; here the U2–R3 terms use `E·I33` and the U3–R2 terms use
|
|
11
|
+
* `E·I22`, which reduces to the reference when `I22 = I33`.
|
|
12
|
+
*
|
|
13
|
+
* @param E - Young's modulus in MPa
|
|
14
|
+
* @param G - Shear modulus in MPa
|
|
15
|
+
* @param A - Area in mm²
|
|
16
|
+
* @param I22 - Second moment about local 2 in mm⁴
|
|
17
|
+
* @param I33 - Second moment about local 3 in mm⁴
|
|
18
|
+
* @param J - Torsion constant in mm⁴
|
|
19
|
+
* @param L - Member length in mm
|
|
20
|
+
* @returns 12×12 symmetric matrix in N and mm
|
|
21
|
+
*/
|
|
22
|
+
export declare const beam3dLocalStiffness: (E: number, G: number, A: number, I22: number, I33: number, J: number, L: number) => Matrix;
|
|
23
|
+
/**
|
|
24
|
+
* Converts a local matrix between the reference rotation convention and the right-hand rule
|
|
25
|
+
* (`D·k·D`, with `D` flipping the sign of R2 and R3 at both ends). The conversion is its own inverse.
|
|
26
|
+
*/
|
|
27
|
+
export declare const flipBendingRotationSigns: (k: Matrix) => Matrix;
|
|
28
|
+
/** Same element as `beam3dLocalStiffness` with all rotations following the right-hand rule. */
|
|
29
|
+
export declare const beam3dLocalStiffnessRightHanded: (E: number, G: number, A: number, I22: number, I33: number, J: number, L: number) => Matrix;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.beam3dLocalStiffnessRightHanded = exports.flipBendingRotationSigns = exports.beam3dLocalStiffness = void 0;
|
|
4
|
+
const matrix_1 = require("../../../utils/matrix");
|
|
5
|
+
/**
|
|
6
|
+
* Local DOF indices (0-based) whose reference-matrix rotation sign is opposite to the
|
|
7
|
+
* right-hand rule: R2 and R3 at the start and end nodes.
|
|
8
|
+
*/
|
|
9
|
+
const FLIPPED_DOFS = [4, 5, 10, 11];
|
|
10
|
+
/**
|
|
11
|
+
* Local stiffness matrix of a 3D prismatic beam element, exactly as in the reference
|
|
12
|
+
* "Complete Beam Stiffness Matrix".
|
|
13
|
+
*
|
|
14
|
+
* DOF order for node i then node j: [U1, U2, U3, R1, R2, R3]. Local 1 runs along the member.
|
|
15
|
+
* The reference matrix measures the bending rotations R2 and R3 opposite to the right-hand
|
|
16
|
+
* rule; use `beam3dLocalStiffnessRightHanded` for the right-handed form.
|
|
17
|
+
*
|
|
18
|
+
* The reference uses one `EI`; here the U2–R3 terms use `E·I33` and the U3–R2 terms use
|
|
19
|
+
* `E·I22`, which reduces to the reference when `I22 = I33`.
|
|
20
|
+
*
|
|
21
|
+
* @param E - Young's modulus in MPa
|
|
22
|
+
* @param G - Shear modulus in MPa
|
|
23
|
+
* @param A - Area in mm²
|
|
24
|
+
* @param I22 - Second moment about local 2 in mm⁴
|
|
25
|
+
* @param I33 - Second moment about local 3 in mm⁴
|
|
26
|
+
* @param J - Torsion constant in mm⁴
|
|
27
|
+
* @param L - Member length in mm
|
|
28
|
+
* @returns 12×12 symmetric matrix in N and mm
|
|
29
|
+
*/
|
|
30
|
+
const beam3dLocalStiffness = (E, G, A, I22, I33, J, L) => {
|
|
31
|
+
const k = (0, matrix_1.zeros)(12, 12);
|
|
32
|
+
// 1-based row/column, upper triangle as written in the reference; mirrored for symmetry.
|
|
33
|
+
const set = (row, col, value) => {
|
|
34
|
+
k[row - 1][col - 1] = value;
|
|
35
|
+
k[col - 1][row - 1] = value;
|
|
36
|
+
};
|
|
37
|
+
const ax = (E * A) / L;
|
|
38
|
+
const tor = (G * J) / L;
|
|
39
|
+
// U2–R3 bending (I33)
|
|
40
|
+
const a3 = (12 * E * I33) / L ** 3;
|
|
41
|
+
const b3 = (6 * E * I33) / L ** 2;
|
|
42
|
+
const c3 = (4 * E * I33) / L;
|
|
43
|
+
const d3 = (2 * E * I33) / L;
|
|
44
|
+
// U3–R2 bending (I22)
|
|
45
|
+
const a2 = (12 * E * I22) / L ** 3;
|
|
46
|
+
const b2 = (6 * E * I22) / L ** 2;
|
|
47
|
+
const c2 = (4 * E * I22) / L;
|
|
48
|
+
const d2 = (2 * E * I22) / L;
|
|
49
|
+
set(1, 1, ax);
|
|
50
|
+
set(1, 7, -ax);
|
|
51
|
+
set(7, 7, ax);
|
|
52
|
+
set(2, 2, a3);
|
|
53
|
+
set(2, 6, -b3);
|
|
54
|
+
set(2, 8, -a3);
|
|
55
|
+
set(2, 12, -b3);
|
|
56
|
+
set(6, 6, c3);
|
|
57
|
+
set(6, 8, b3);
|
|
58
|
+
set(6, 12, d3);
|
|
59
|
+
set(8, 8, a3);
|
|
60
|
+
set(8, 12, b3);
|
|
61
|
+
set(12, 12, c3);
|
|
62
|
+
set(3, 3, a2);
|
|
63
|
+
set(3, 5, b2);
|
|
64
|
+
set(3, 9, -a2);
|
|
65
|
+
set(3, 11, b2);
|
|
66
|
+
set(5, 5, c2);
|
|
67
|
+
set(5, 9, -b2);
|
|
68
|
+
set(5, 11, d2);
|
|
69
|
+
set(9, 9, a2);
|
|
70
|
+
set(9, 11, -b2);
|
|
71
|
+
set(11, 11, c2);
|
|
72
|
+
set(4, 4, tor);
|
|
73
|
+
set(4, 10, -tor);
|
|
74
|
+
set(10, 10, tor);
|
|
75
|
+
return k;
|
|
76
|
+
};
|
|
77
|
+
exports.beam3dLocalStiffness = beam3dLocalStiffness;
|
|
78
|
+
/**
|
|
79
|
+
* Converts a local matrix between the reference rotation convention and the right-hand rule
|
|
80
|
+
* (`D·k·D`, with `D` flipping the sign of R2 and R3 at both ends). The conversion is its own inverse.
|
|
81
|
+
*/
|
|
82
|
+
const flipBendingRotationSigns = (k) => {
|
|
83
|
+
const flipped = new Set(FLIPPED_DOFS);
|
|
84
|
+
return k.map((row, i) => row.map((value, j) => (flipped.has(i) !== flipped.has(j) ? -value : value)));
|
|
85
|
+
};
|
|
86
|
+
exports.flipBendingRotationSigns = flipBendingRotationSigns;
|
|
87
|
+
/** Same element as `beam3dLocalStiffness` with all rotations following the right-hand rule. */
|
|
88
|
+
const beam3dLocalStiffnessRightHanded = (E, G, A, I22, I33, J, L) => (0, exports.flipBendingRotationSigns)((0, exports.beam3dLocalStiffness)(E, G, A, I22, I33, J, L));
|
|
89
|
+
exports.beam3dLocalStiffnessRightHanded = beam3dLocalStiffnessRightHanded;
|
|
90
|
+
//# 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,22 @@
|
|
|
1
|
+
/** A member load resolved into local axes, in N and mm. */
|
|
2
|
+
export type LocalMemberLoad = {
|
|
3
|
+
type: "udl";
|
|
4
|
+
axis: 1 | 2 | 3;
|
|
5
|
+
w: number;
|
|
6
|
+
start: number;
|
|
7
|
+
end: number;
|
|
8
|
+
} | {
|
|
9
|
+
type: "point";
|
|
10
|
+
axis: 1 | 2 | 3;
|
|
11
|
+
P: number;
|
|
12
|
+
a: number;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Fixed-end forces of a member under local loads: the end forces (right-hand local axes,
|
|
16
|
+
* N and N·mm) that hold both ends fully fixed. Equivalent nodal loads are the negative.
|
|
17
|
+
*
|
|
18
|
+
* @param loads - Loads in local axes, N and mm
|
|
19
|
+
* @param L - Member length in mm
|
|
20
|
+
* @throws {FrameAnalysisError} 308 if a load lies outside the member
|
|
21
|
+
*/
|
|
22
|
+
export declare const fixedEndForces: (loads: LocalMemberLoad[], L: number) => number[];
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fixedEndForces = void 0;
|
|
4
|
+
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
5
|
+
// 4-point Gauss–Legendre rule, exact for the cubic integrands used here
|
|
6
|
+
const GAUSS_POINTS = [
|
|
7
|
+
-0.8611363115940526, -0.3399810435848563, 0.3399810435848563, 0.8611363115940526,
|
|
8
|
+
];
|
|
9
|
+
const GAUSS_WEIGHTS = [
|
|
10
|
+
0.3478548451374538, 0.6521451548625461, 0.6521451548625461, 0.3478548451374538,
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Equivalent nodal loads of a unit transverse/axial load at distance `x`, from the
|
|
14
|
+
* Euler–Bernoulli shape functions: the exact fixed-end solution for a prismatic member.
|
|
15
|
+
* Returned per unit of load, right-hand local DOF order [i: U1..R3, j: U1..R3].
|
|
16
|
+
*/
|
|
17
|
+
const unitEquivalentLoad = (axis, x, L) => {
|
|
18
|
+
const xi = x / L;
|
|
19
|
+
const out = new Array(12).fill(0);
|
|
20
|
+
if (axis === 1) {
|
|
21
|
+
out[0] = 1 - xi;
|
|
22
|
+
out[6] = xi;
|
|
23
|
+
return out;
|
|
24
|
+
}
|
|
25
|
+
const n1 = 1 - 3 * xi ** 2 + 2 * xi ** 3;
|
|
26
|
+
const n2 = L * (xi - 2 * xi ** 2 + xi ** 3);
|
|
27
|
+
const n3 = 3 * xi ** 2 - 2 * xi ** 3;
|
|
28
|
+
const n4 = L * (-(xi ** 2) + xi ** 3);
|
|
29
|
+
if (axis === 2) {
|
|
30
|
+
// load along local 2: force U2, moment about 3 (R3 = +dv/dx)
|
|
31
|
+
out[1] = n1;
|
|
32
|
+
out[5] = n2;
|
|
33
|
+
out[7] = n3;
|
|
34
|
+
out[11] = n4;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// load along local 3: force U3, moment about 2 (R2 = −dw/dx)
|
|
38
|
+
out[2] = n1;
|
|
39
|
+
out[4] = -n2;
|
|
40
|
+
out[8] = n3;
|
|
41
|
+
out[10] = -n4;
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Fixed-end forces of a member under local loads: the end forces (right-hand local axes,
|
|
47
|
+
* N and N·mm) that hold both ends fully fixed. Equivalent nodal loads are the negative.
|
|
48
|
+
*
|
|
49
|
+
* @param loads - Loads in local axes, N and mm
|
|
50
|
+
* @param L - Member length in mm
|
|
51
|
+
* @throws {FrameAnalysisError} 308 if a load lies outside the member
|
|
52
|
+
*/
|
|
53
|
+
const fixedEndForces = (loads, L) => {
|
|
54
|
+
const equivalent = new Array(12).fill(0);
|
|
55
|
+
const add = (unit, factor) => {
|
|
56
|
+
for (let i = 0; i < 12; i++)
|
|
57
|
+
equivalent[i] += unit[i] * factor;
|
|
58
|
+
};
|
|
59
|
+
for (const load of loads) {
|
|
60
|
+
if (load.type === "point") {
|
|
61
|
+
if (!(load.a >= 0 && load.a <= L))
|
|
62
|
+
throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.LOAD_OUTSIDE_MEMBER);
|
|
63
|
+
add(unitEquivalentLoad(load.axis, load.a, L), load.P);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
if (!(load.start >= 0 && load.end <= L && load.start < load.end)) {
|
|
67
|
+
throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.LOAD_OUTSIDE_MEMBER);
|
|
68
|
+
}
|
|
69
|
+
const half = (load.end - load.start) / 2;
|
|
70
|
+
const mid = (load.end + load.start) / 2;
|
|
71
|
+
GAUSS_POINTS.forEach((p, index) => {
|
|
72
|
+
add(unitEquivalentLoad(load.axis, mid + half * p, L), load.w * half * GAUSS_WEIGHTS[index]);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return equivalent.map((v) => -v);
|
|
77
|
+
};
|
|
78
|
+
exports.fixedEndForces = fixedEndForces;
|
|
79
|
+
//# 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,19 @@
|
|
|
1
|
+
import { type Matrix } from "../../../utils/matrix";
|
|
2
|
+
export interface CondensedMember {
|
|
3
|
+
k: Matrix;
|
|
4
|
+
/** Condenses a 12-term fixed-end force vector; the result is zero at released DOFs. */
|
|
5
|
+
condenseFixedEndForces: (fixed: number[]) => number[];
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Statically condenses released local DOFs out of a member, so those DOFs carry no force.
|
|
9
|
+
*
|
|
10
|
+
* With released set r and retained set c:
|
|
11
|
+
* `k* = k_cc − k_cr·k_rr⁻¹·k_rc`, `f* = f_c − k_cr·k_rr⁻¹·f_r`.
|
|
12
|
+
* The stiffness is condensed once; the returned function condenses the fixed-end forces of
|
|
13
|
+
* each load case.
|
|
14
|
+
*
|
|
15
|
+
* @param k - 12×12 local stiffness (right-hand)
|
|
16
|
+
* @param released - Local DOF indices (0–11) to release
|
|
17
|
+
* @throws {FrameAnalysisError} 307 if the released set makes the member a mechanism
|
|
18
|
+
*/
|
|
19
|
+
export declare const condenseMember: (k: Matrix, released: number[]) => CondensedMember;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.condenseMember = void 0;
|
|
4
|
+
const frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
|
|
5
|
+
const matrix_1 = require("../../../utils/matrix");
|
|
6
|
+
/**
|
|
7
|
+
* Statically condenses released local DOFs out of a member, so those DOFs carry no force.
|
|
8
|
+
*
|
|
9
|
+
* With released set r and retained set c:
|
|
10
|
+
* `k* = k_cc − k_cr·k_rr⁻¹·k_rc`, `f* = f_c − k_cr·k_rr⁻¹·f_r`.
|
|
11
|
+
* The stiffness is condensed once; the returned function condenses the fixed-end forces of
|
|
12
|
+
* each load case.
|
|
13
|
+
*
|
|
14
|
+
* @param k - 12×12 local stiffness (right-hand)
|
|
15
|
+
* @param released - Local DOF indices (0–11) to release
|
|
16
|
+
* @throws {FrameAnalysisError} 307 if the released set makes the member a mechanism
|
|
17
|
+
*/
|
|
18
|
+
const condenseMember = (k, released) => {
|
|
19
|
+
if (released.length === 0) {
|
|
20
|
+
return { k, condenseFixedEndForces: (fixed) => [...fixed] };
|
|
21
|
+
}
|
|
22
|
+
const retained = Array.from({ length: 12 }, (_, i) => i).filter((i) => !released.includes(i));
|
|
23
|
+
const sub = (rows, cols) => rows.map((r) => cols.map((c) => k[r][c]));
|
|
24
|
+
const krr = sub(released, released);
|
|
25
|
+
const krc = sub(released, retained);
|
|
26
|
+
const kcr = sub(retained, released);
|
|
27
|
+
const kcc = sub(retained, retained);
|
|
28
|
+
// [k_rr⁻¹·k_rc | k_rr⁻¹]
|
|
29
|
+
const rhs = released.map((_, i) => [...krc[i], ...released.map((__, j) => (i === j ? 1 : 0))]);
|
|
30
|
+
const solved = (0, matrix_1.solveLinearSystem)(krr, rhs);
|
|
31
|
+
if (!solved)
|
|
32
|
+
throw new frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.INVALID_RELEASE);
|
|
33
|
+
const nc = retained.length;
|
|
34
|
+
const kStar = k.map((row) => row.map(() => 0));
|
|
35
|
+
retained.forEach((r, ri) => {
|
|
36
|
+
retained.forEach((c, ci) => {
|
|
37
|
+
let value = kcc[ri][ci];
|
|
38
|
+
released.forEach((_, j) => {
|
|
39
|
+
value -= kcr[ri][j] * solved[j][ci];
|
|
40
|
+
});
|
|
41
|
+
kStar[r][c] = value;
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
// k_cr·k_rr⁻¹, applied to f_r for every load case
|
|
45
|
+
const kcrKrrInv = retained.map((_, ri) => released.map((__, m) => released.reduce((s, ___, j) => s + kcr[ri][j] * solved[j][nc + m], 0)));
|
|
46
|
+
return {
|
|
47
|
+
k: kStar,
|
|
48
|
+
condenseFixedEndForces: (fixed) => {
|
|
49
|
+
const fStar = new Array(12).fill(0);
|
|
50
|
+
const fr = released.map((r) => fixed[r]);
|
|
51
|
+
retained.forEach((r, ri) => {
|
|
52
|
+
fStar[r] = fixed[r] - kcrKrrInv[ri].reduce((s, v, m) => s + v * fr[m], 0);
|
|
53
|
+
});
|
|
54
|
+
return fStar;
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
exports.condenseMember = condenseMember;
|
|
59
|
+
//# sourceMappingURL=static-condensation.js.map
|