@theerapat-s28/ts-structural-eng-tools 1.5.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +57 -6
- package/dist/core/constants/frame.constant.d.ts +19 -0
- package/dist/core/constants/frame.constant.js +23 -0
- package/dist/core/constants/frame.constant.js.map +1 -0
- package/dist/core/errors/frame-analysis.error.d.ts +36 -0
- package/dist/core/errors/frame-analysis.error.js +86 -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 +13 -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 +20 -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 +82 -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/area/area-geometry.js +132 -0
- package/dist/esm/fea/frame/area/area-geometry.js.map +1 -0
- package/dist/esm/fea/frame/area/distribute-area-loads.js +267 -0
- package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -0
- package/dist/esm/fea/frame/area/edge-members.js +62 -0
- package/dist/esm/fea/frame/area/edge-members.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 +88 -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 +7 -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 +375 -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 +131 -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 +133 -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 +389 -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/area/area-geometry.d.ts +56 -0
- package/dist/fea/frame/area/area-geometry.js +142 -0
- package/dist/fea/frame/area/area-geometry.js.map +1 -0
- package/dist/fea/frame/area/distribute-area-loads.d.ts +30 -0
- package/dist/fea/frame/area/distribute-area-loads.js +272 -0
- package/dist/fea/frame/area/distribute-area-loads.js.map +1 -0
- package/dist/fea/frame/area/edge-members.d.ts +25 -0
- package/dist/fea/frame/area/edge-members.js +67 -0
- package/dist/fea/frame/area/edge-members.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 +36 -0
- package/dist/fea/frame/elements/fixed-end-forces.js +93 -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 +10 -0
- package/dist/fea/frame/index.js +18 -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 +379 -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 +70 -0
- package/dist/fea/frame/solver/analyze-frame.js +136 -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 +138 -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 +170 -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 +395 -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 +28 -4
|
@@ -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":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { AreaDistribution } from "../types/model.type";
|
|
2
|
+
export type Vec3 = [number, number, number];
|
|
3
|
+
export type Vec2 = [number, number];
|
|
4
|
+
/**
|
|
5
|
+
* The plane of a valid null area. `u` runs along edge 0 and `v = normal × u`, so the corners
|
|
6
|
+
* in (u, v) coordinates go counter-clockwise.
|
|
7
|
+
*/
|
|
8
|
+
export interface AreaPlane {
|
|
9
|
+
points: Vec3[];
|
|
10
|
+
normal: Vec3;
|
|
11
|
+
u: Vec3;
|
|
12
|
+
v: Vec3;
|
|
13
|
+
corners: Vec2[];
|
|
14
|
+
area: number;
|
|
15
|
+
size: number;
|
|
16
|
+
}
|
|
17
|
+
/** What makes a set of corners unusable as a null area. */
|
|
18
|
+
export type AreaGeometryProblem = "nodeCount" | "repeatedNode" | "degenerate" | "nonPlanar" | "nonConvex";
|
|
19
|
+
/** The 2D edge vector i → i + 1 of a polygon. */
|
|
20
|
+
export declare const edgeVector: (corners: Vec2[], i: number) => Vec2;
|
|
21
|
+
/**
|
|
22
|
+
* Builds the plane of an area from its corners, or names the problem: not 3 or 4 corners,
|
|
23
|
+
* two consecutive corners coinciding, no area, corners off one plane, or a polygon that is
|
|
24
|
+
* not strictly convex (a reflex corner, three corners in line or a crossed quad).
|
|
25
|
+
*
|
|
26
|
+
* @param points - Corner coordinates in mm, in order around the area
|
|
27
|
+
*/
|
|
28
|
+
export declare const areaPlane: (points: Vec3[]) => AreaPlane | {
|
|
29
|
+
problem: AreaGeometryProblem;
|
|
30
|
+
};
|
|
31
|
+
/** Whether edges i and j are parallel (either way round) within the tolerance. */
|
|
32
|
+
export declare const edgesParallel: (plane: AreaPlane, i: number, j: number) => boolean;
|
|
33
|
+
/** Whether a 4-corner area is a rectangle (every corner square within the tolerance). */
|
|
34
|
+
export declare const isRectangle: (plane: AreaPlane) => boolean;
|
|
35
|
+
/** Unit vector of edge i in global coordinates. */
|
|
36
|
+
export declare const edgeDirection: (plane: AreaPlane, i: number) => Vec3;
|
|
37
|
+
/** The edges that receive load, and for one-way the span direction in (u, v). */
|
|
38
|
+
export interface AreaSupports {
|
|
39
|
+
loadedEdges: number[];
|
|
40
|
+
span?: Vec2;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolves which edges of an area receive load from its distribution and `supportEdges`.
|
|
44
|
+
* Two-way loads every edge and takes no `supportEdges`. One-way spans parallel to the edges
|
|
45
|
+
* not listed, which must exist and all be parallel; cantilever takes exactly one edge.
|
|
46
|
+
*
|
|
47
|
+
* @returns The loaded edges, or `null` if `supportEdges` does not fit the distribution
|
|
48
|
+
*/
|
|
49
|
+
export declare const resolveAreaSupports: (plane: AreaPlane, distribution: AreaDistribution, supportEdges: unknown) => AreaSupports | null;
|
|
50
|
+
/**
|
|
51
|
+
* Clips a convex polygon to the half-plane `a · p ≤ c` (Sutherland–Hodgman, one plane).
|
|
52
|
+
*
|
|
53
|
+
* @param polygon - Corners in order, mm
|
|
54
|
+
* @returns The clipped polygon, in the same order; empty if nothing remains
|
|
55
|
+
*/
|
|
56
|
+
export declare const clipPolygon: (polygon: Vec2[], a: Vec2, c: number) => Vec2[];
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clipPolygon = exports.resolveAreaSupports = exports.edgeDirection = exports.isRectangle = exports.edgesParallel = exports.areaPlane = exports.edgeVector = void 0;
|
|
4
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
+
const sub = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
|
|
6
|
+
const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
|
|
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
|
+
const cross2 = (a, b) => a[0] * b[1] - a[1] * b[0];
|
|
15
|
+
const dot2 = (a, b) => a[0] * b[0] + a[1] * b[1];
|
|
16
|
+
/** The 2D edge vector i → i + 1 of a polygon. */
|
|
17
|
+
const edgeVector = (corners, i) => {
|
|
18
|
+
const a = corners[i];
|
|
19
|
+
const b = corners[(i + 1) % corners.length];
|
|
20
|
+
return [b[0] - a[0], b[1] - a[1]];
|
|
21
|
+
};
|
|
22
|
+
exports.edgeVector = edgeVector;
|
|
23
|
+
/**
|
|
24
|
+
* Builds the plane of an area from its corners, or names the problem: not 3 or 4 corners,
|
|
25
|
+
* two consecutive corners coinciding, no area, corners off one plane, or a polygon that is
|
|
26
|
+
* not strictly convex (a reflex corner, three corners in line or a crossed quad).
|
|
27
|
+
*
|
|
28
|
+
* @param points - Corner coordinates in mm, in order around the area
|
|
29
|
+
*/
|
|
30
|
+
const areaPlane = (points) => {
|
|
31
|
+
const n = points.length;
|
|
32
|
+
if (n !== 3 && n !== 4)
|
|
33
|
+
return { problem: "nodeCount" };
|
|
34
|
+
const edges = points.map((p, i) => sub(points[(i + 1) % n], p));
|
|
35
|
+
const size = Math.max(...edges.map(norm));
|
|
36
|
+
const tolerance = frame_constant_1.AREA_GEOMETRY_TOLERANCE * size;
|
|
37
|
+
if (!(size > 0) || edges.some((e) => norm(e) <= tolerance))
|
|
38
|
+
return { problem: "repeatedNode" };
|
|
39
|
+
// Newell's method: the vector area, exact for a planar polygon
|
|
40
|
+
const vectorArea = points.reduce((sum, p, i) => {
|
|
41
|
+
const c = cross(p, points[(i + 1) % n]);
|
|
42
|
+
return [sum[0] + c[0] / 2, sum[1] + c[1] / 2, sum[2] + c[2] / 2];
|
|
43
|
+
}, [0, 0, 0]);
|
|
44
|
+
const area = norm(vectorArea);
|
|
45
|
+
if (!(area > tolerance * size))
|
|
46
|
+
return { problem: "degenerate" };
|
|
47
|
+
const normal = scale(vectorArea, 1 / area);
|
|
48
|
+
const centroid = scale(points.reduce((s, p) => [s[0] + p[0], s[1] + p[1], s[2] + p[2]], [0, 0, 0]), 1 / n);
|
|
49
|
+
if (points.some((p) => Math.abs(dot(sub(p, centroid), normal)) > tolerance)) {
|
|
50
|
+
return { problem: "nonPlanar" };
|
|
51
|
+
}
|
|
52
|
+
const along = sub(edges[0], scale(normal, dot(edges[0], normal)));
|
|
53
|
+
const u = scale(along, 1 / norm(along));
|
|
54
|
+
const v = cross(normal, u);
|
|
55
|
+
const corners = points.map((p) => [dot(sub(p, points[0]), u), dot(sub(p, points[0]), v)]);
|
|
56
|
+
// Strictly convex: every turn is to the left by more than the tolerance (sine of the turn)
|
|
57
|
+
for (let i = 0; i < n; i++) {
|
|
58
|
+
const a = (0, exports.edgeVector)(corners, i);
|
|
59
|
+
const b = (0, exports.edgeVector)(corners, (i + 1) % n);
|
|
60
|
+
if (!(cross2(a, b) > frame_constant_1.AREA_GEOMETRY_TOLERANCE * Math.hypot(...a) * Math.hypot(...b))) {
|
|
61
|
+
return { problem: "nonConvex" };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return { points, normal, u, v, corners, area, size };
|
|
65
|
+
};
|
|
66
|
+
exports.areaPlane = areaPlane;
|
|
67
|
+
/** Whether edges i and j are parallel (either way round) within the tolerance. */
|
|
68
|
+
const edgesParallel = (plane, i, j) => {
|
|
69
|
+
const a = (0, exports.edgeVector)(plane.corners, i);
|
|
70
|
+
const b = (0, exports.edgeVector)(plane.corners, j);
|
|
71
|
+
return Math.abs(cross2(a, b)) <= frame_constant_1.AREA_GEOMETRY_TOLERANCE * Math.hypot(...a) * Math.hypot(...b);
|
|
72
|
+
};
|
|
73
|
+
exports.edgesParallel = edgesParallel;
|
|
74
|
+
/** Whether a 4-corner area is a rectangle (every corner square within the tolerance). */
|
|
75
|
+
const isRectangle = (plane) => plane.corners.length === 4 &&
|
|
76
|
+
plane.corners.every((_, i) => {
|
|
77
|
+
const a = (0, exports.edgeVector)(plane.corners, i);
|
|
78
|
+
const b = (0, exports.edgeVector)(plane.corners, (i + 1) % 4);
|
|
79
|
+
return Math.abs(dot2(a, b)) <= frame_constant_1.AREA_GEOMETRY_TOLERANCE * Math.hypot(...a) * Math.hypot(...b);
|
|
80
|
+
});
|
|
81
|
+
exports.isRectangle = isRectangle;
|
|
82
|
+
/** Unit vector of edge i in global coordinates. */
|
|
83
|
+
const edgeDirection = (plane, i) => {
|
|
84
|
+
const n = plane.points.length;
|
|
85
|
+
const d = sub(plane.points[(i + 1) % n], plane.points[i]);
|
|
86
|
+
return scale(d, 1 / norm(d));
|
|
87
|
+
};
|
|
88
|
+
exports.edgeDirection = edgeDirection;
|
|
89
|
+
/**
|
|
90
|
+
* Resolves which edges of an area receive load from its distribution and `supportEdges`.
|
|
91
|
+
* Two-way loads every edge and takes no `supportEdges`. One-way spans parallel to the edges
|
|
92
|
+
* not listed, which must exist and all be parallel; cantilever takes exactly one edge.
|
|
93
|
+
*
|
|
94
|
+
* @returns The loaded edges, or `null` if `supportEdges` does not fit the distribution
|
|
95
|
+
*/
|
|
96
|
+
const resolveAreaSupports = (plane, distribution, supportEdges) => {
|
|
97
|
+
const n = plane.corners.length;
|
|
98
|
+
if (distribution === "twoWay") {
|
|
99
|
+
return supportEdges === undefined ? { loadedEdges: [...Array(n).keys()] } : null;
|
|
100
|
+
}
|
|
101
|
+
if (!Array.isArray(supportEdges) ||
|
|
102
|
+
supportEdges.length === 0 ||
|
|
103
|
+
supportEdges.some((e) => !Number.isInteger(e) || e < 0 || e >= n) ||
|
|
104
|
+
new Set(supportEdges).size !== supportEdges.length) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
const loadedEdges = [...supportEdges].sort((a, b) => a - b);
|
|
108
|
+
if (distribution === "cantilever")
|
|
109
|
+
return loadedEdges.length === 1 ? { loadedEdges } : null;
|
|
110
|
+
const free = [...Array(n).keys()].filter((e) => !loadedEdges.includes(e));
|
|
111
|
+
if (free.length === 0 || free.some((e) => !(0, exports.edgesParallel)(plane, free[0], e)))
|
|
112
|
+
return null;
|
|
113
|
+
const d = (0, exports.edgeVector)(plane.corners, free[0]);
|
|
114
|
+
const length = Math.hypot(...d);
|
|
115
|
+
return { loadedEdges, span: [d[0] / length, d[1] / length] };
|
|
116
|
+
};
|
|
117
|
+
exports.resolveAreaSupports = resolveAreaSupports;
|
|
118
|
+
/**
|
|
119
|
+
* Clips a convex polygon to the half-plane `a · p ≤ c` (Sutherland–Hodgman, one plane).
|
|
120
|
+
*
|
|
121
|
+
* @param polygon - Corners in order, mm
|
|
122
|
+
* @returns The clipped polygon, in the same order; empty if nothing remains
|
|
123
|
+
*/
|
|
124
|
+
const clipPolygon = (polygon, a, c) => {
|
|
125
|
+
const out = [];
|
|
126
|
+
const side = (p) => dot2(a, p) - c;
|
|
127
|
+
for (let i = 0; i < polygon.length; i++) {
|
|
128
|
+
const p = polygon[i];
|
|
129
|
+
const q = polygon[(i + 1) % polygon.length];
|
|
130
|
+
const sp = side(p);
|
|
131
|
+
const sq = side(q);
|
|
132
|
+
if (sp <= 0)
|
|
133
|
+
out.push(p);
|
|
134
|
+
if ((sp < 0 && sq > 0) || (sp > 0 && sq < 0)) {
|
|
135
|
+
const t = sp / (sp - sq);
|
|
136
|
+
out.push([p[0] + t * (q[0] - p[0]), p[1] + t * (q[1] - p[1])]);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return out;
|
|
140
|
+
};
|
|
141
|
+
exports.clipPolygon = clipPolygon;
|
|
142
|
+
//# sourceMappingURL=area-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"area-geometry.js","sourceRoot":"","sources":["../../../../src/fea/frame/area/area-geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Warnings } from "../../../core/types/output-message.type";
|
|
2
|
+
import type { FrameModel, MemberLoad } from "../types/model.type";
|
|
3
|
+
/**
|
|
4
|
+
* Turns the area loads of a model into member loads, assuming the model is valid (as
|
|
5
|
+
* `validateFrameModel` checks): each area's edge profiles are built once, then scaled for each
|
|
6
|
+
* of its loads and split into global X, Y and Z trapezoidal loads (plus torques for a cantilever).
|
|
7
|
+
* Everything is linear in `q`, so load-case superposition still holds.
|
|
8
|
+
*/
|
|
9
|
+
export declare const areaMemberLoads: (model: FrameModel) => {
|
|
10
|
+
memberLoads: MemberLoad[];
|
|
11
|
+
warnings: Warnings;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The member loads that a model's null areas send to the members along their edges — what
|
|
15
|
+
* `analyzeFrame` adds to `memberLoads` — so they can be checked or previewed.
|
|
16
|
+
*
|
|
17
|
+
* Two-way areas send each point to the nearest edge (corner-bisector split); one-way areas
|
|
18
|
+
* split strips parallel to their unsupported edges half to each end; cantilever areas send
|
|
19
|
+
* `q · c` and a torque `q · c² / 2` per unit length to their support edge (c = depth). Edges
|
|
20
|
+
* split by intermediate nodes are cut at those nodes. Loads are per unit true area and come
|
|
21
|
+
* out as trapezoidal loads in global X, Y and Z (and torques), each tagged with its load case.
|
|
22
|
+
*
|
|
23
|
+
* @param model - The frame model, validated first
|
|
24
|
+
* @returns `memberLoads` and `warnings` (a one-way support edge parallel to the span)
|
|
25
|
+
* @throws {FrameAnalysisError} 301–317 for an invalid model, with every problem in `issues`
|
|
26
|
+
*/
|
|
27
|
+
export declare const distributeAreaLoads: (model: FrameModel) => {
|
|
28
|
+
memberLoads: MemberLoad[];
|
|
29
|
+
warnings: Warnings;
|
|
30
|
+
};
|