@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.
Files changed (193) hide show
  1. package/README.md +57 -6
  2. package/dist/core/constants/frame.constant.d.ts +19 -0
  3. package/dist/core/constants/frame.constant.js +23 -0
  4. package/dist/core/constants/frame.constant.js.map +1 -0
  5. package/dist/core/errors/frame-analysis.error.d.ts +36 -0
  6. package/dist/core/errors/frame-analysis.error.js +86 -0
  7. package/dist/core/errors/frame-analysis.error.js.map +1 -0
  8. package/dist/core/index.d.ts +4 -0
  9. package/dist/core/index.js +13 -1
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/types/section-properties.type.d.ts +13 -0
  12. package/dist/core/types/section-properties.type.js +3 -0
  13. package/dist/core/types/section-properties.type.js.map +1 -0
  14. package/dist/esm/core/constants/frame.constant.js +20 -0
  15. package/dist/esm/core/constants/frame.constant.js.map +1 -0
  16. package/dist/esm/core/constants/rc.constant.js +63 -0
  17. package/dist/esm/core/constants/rc.constant.js.map +1 -0
  18. package/dist/esm/core/errors/frame-analysis.error.js +82 -0
  19. package/dist/esm/core/errors/frame-analysis.error.js.map +1 -0
  20. package/dist/esm/core/errors/rc-design.error.js +64 -0
  21. package/dist/esm/core/errors/rc-design.error.js.map +1 -0
  22. package/dist/esm/core/index.js +9 -0
  23. package/dist/esm/core/index.js.map +1 -0
  24. package/dist/esm/core/types/output-message.type.js +2 -0
  25. package/dist/esm/core/types/output-message.type.js.map +1 -0
  26. package/dist/esm/core/types/plate-jacketing.type.js +18 -0
  27. package/dist/esm/core/types/plate-jacketing.type.js.map +1 -0
  28. package/dist/esm/core/types/rc-beam.type.js +11 -0
  29. package/dist/esm/core/types/rc-beam.type.js.map +1 -0
  30. package/dist/esm/core/types/section-properties.type.js +2 -0
  31. package/dist/esm/core/types/section-properties.type.js.map +1 -0
  32. package/dist/esm/core/types/unit.type.js +2 -0
  33. package/dist/esm/core/types/unit.type.js.map +1 -0
  34. package/dist/esm/fea/frame/area/area-geometry.js +132 -0
  35. package/dist/esm/fea/frame/area/area-geometry.js.map +1 -0
  36. package/dist/esm/fea/frame/area/distribute-area-loads.js +267 -0
  37. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -0
  38. package/dist/esm/fea/frame/area/edge-members.js +62 -0
  39. package/dist/esm/fea/frame/area/edge-members.js.map +1 -0
  40. package/dist/esm/fea/frame/elements/beam-3d-stiffness.js +84 -0
  41. package/dist/esm/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
  42. package/dist/esm/fea/frame/elements/fixed-end-forces.js +88 -0
  43. package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -0
  44. package/dist/esm/fea/frame/elements/static-condensation.js +55 -0
  45. package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -0
  46. package/dist/esm/fea/frame/index.js +7 -0
  47. package/dist/esm/fea/frame/index.js.map +1 -0
  48. package/dist/esm/fea/frame/post/demand-envelope.js +97 -0
  49. package/dist/esm/fea/frame/post/demand-envelope.js.map +1 -0
  50. package/dist/esm/fea/frame/post/envelope.js +59 -0
  51. package/dist/esm/fea/frame/post/envelope.js.map +1 -0
  52. package/dist/esm/fea/frame/post/member-diagram.js +375 -0
  53. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -0
  54. package/dist/esm/fea/frame/post/present-state.js +106 -0
  55. package/dist/esm/fea/frame/post/present-state.js.map +1 -0
  56. package/dist/esm/fea/frame/solver/analyze-frame.js +131 -0
  57. package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -0
  58. package/dist/esm/fea/frame/solver/boundary-conditions.js +33 -0
  59. package/dist/esm/fea/frame/solver/boundary-conditions.js.map +1 -0
  60. package/dist/esm/fea/frame/solver/combinations.js +69 -0
  61. package/dist/esm/fea/frame/solver/combinations.js.map +1 -0
  62. package/dist/esm/fea/frame/solver/frame-system.js +122 -0
  63. package/dist/esm/fea/frame/solver/frame-system.js.map +1 -0
  64. package/dist/esm/fea/frame/solver/global-assembly.js +27 -0
  65. package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -0
  66. package/dist/esm/fea/frame/solver/load-case-solver.js +133 -0
  67. package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -0
  68. package/dist/esm/fea/frame/transformation/coordinate-transform.js +71 -0
  69. package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -0
  70. package/dist/esm/fea/frame/types/model.type.js +2 -0
  71. package/dist/esm/fea/frame/types/model.type.js.map +1 -0
  72. package/dist/esm/fea/frame/types/results.type.js +2 -0
  73. package/dist/esm/fea/frame/types/results.type.js.map +1 -0
  74. package/dist/esm/fea/frame/validation/validate-model.js +389 -0
  75. package/dist/esm/fea/frame/validation/validate-model.js.map +1 -0
  76. package/dist/esm/fea/index.js +3 -0
  77. package/dist/esm/fea/index.js.map +1 -0
  78. package/dist/esm/index.js +10 -0
  79. package/dist/esm/index.js.map +1 -0
  80. package/dist/esm/package.json +1 -0
  81. package/dist/esm/rc/general.js +32 -0
  82. package/dist/esm/rc/general.js.map +1 -0
  83. package/dist/esm/rc/index.js +5 -0
  84. package/dist/esm/rc/index.js.map +1 -0
  85. package/dist/esm/rc/rc-bar-layout.js +89 -0
  86. package/dist/esm/rc/rc-bar-layout.js.map +1 -0
  87. package/dist/esm/rc/rc-beam-design.js +320 -0
  88. package/dist/esm/rc/rc-beam-design.js.map +1 -0
  89. package/dist/esm/rc/rc-section-properties.js +55 -0
  90. package/dist/esm/rc/rc-section-properties.js.map +1 -0
  91. package/dist/esm/strengthening/index.js +4 -0
  92. package/dist/esm/strengthening/index.js.map +1 -0
  93. package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js +338 -0
  94. package/dist/esm/strengthening/rc-beam-plate-interface-bolts.js.map +1 -0
  95. package/dist/esm/strengthening/rc-beam-side-plate-shear.js +381 -0
  96. package/dist/esm/strengthening/rc-beam-side-plate-shear.js.map +1 -0
  97. package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js +90 -0
  98. package/dist/esm/strengthening/rc-beam-steel-plate-jacketing.js.map +1 -0
  99. package/dist/esm/utils/index.js +5 -0
  100. package/dist/esm/utils/index.js.map +1 -0
  101. package/dist/esm/utils/math.js +30 -0
  102. package/dist/esm/utils/math.js.map +1 -0
  103. package/dist/esm/utils/matrix.js +145 -0
  104. package/dist/esm/utils/matrix.js.map +1 -0
  105. package/dist/esm/utils/merge-warning.js +11 -0
  106. package/dist/esm/utils/merge-warning.js.map +1 -0
  107. package/dist/esm/utils/skyline.js +151 -0
  108. package/dist/esm/utils/skyline.js.map +1 -0
  109. package/dist/fea/frame/area/area-geometry.d.ts +56 -0
  110. package/dist/fea/frame/area/area-geometry.js +142 -0
  111. package/dist/fea/frame/area/area-geometry.js.map +1 -0
  112. package/dist/fea/frame/area/distribute-area-loads.d.ts +30 -0
  113. package/dist/fea/frame/area/distribute-area-loads.js +272 -0
  114. package/dist/fea/frame/area/distribute-area-loads.js.map +1 -0
  115. package/dist/fea/frame/area/edge-members.d.ts +25 -0
  116. package/dist/fea/frame/area/edge-members.js +67 -0
  117. package/dist/fea/frame/area/edge-members.js.map +1 -0
  118. package/dist/fea/frame/elements/beam-3d-stiffness.d.ts +29 -0
  119. package/dist/fea/frame/elements/beam-3d-stiffness.js +90 -0
  120. package/dist/fea/frame/elements/beam-3d-stiffness.js.map +1 -0
  121. package/dist/fea/frame/elements/fixed-end-forces.d.ts +36 -0
  122. package/dist/fea/frame/elements/fixed-end-forces.js +93 -0
  123. package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -0
  124. package/dist/fea/frame/elements/static-condensation.d.ts +19 -0
  125. package/dist/fea/frame/elements/static-condensation.js +59 -0
  126. package/dist/fea/frame/elements/static-condensation.js.map +1 -0
  127. package/dist/fea/frame/index.d.ts +10 -0
  128. package/dist/fea/frame/index.js +18 -0
  129. package/dist/fea/frame/index.js.map +1 -0
  130. package/dist/fea/frame/post/demand-envelope.d.ts +36 -0
  131. package/dist/fea/frame/post/demand-envelope.js +101 -0
  132. package/dist/fea/frame/post/demand-envelope.js.map +1 -0
  133. package/dist/fea/frame/post/envelope.d.ts +8 -0
  134. package/dist/fea/frame/post/envelope.js +63 -0
  135. package/dist/fea/frame/post/envelope.js.map +1 -0
  136. package/dist/fea/frame/post/member-diagram.d.ts +26 -0
  137. package/dist/fea/frame/post/member-diagram.js +379 -0
  138. package/dist/fea/frame/post/member-diagram.js.map +1 -0
  139. package/dist/fea/frame/post/present-state.d.ts +19 -0
  140. package/dist/fea/frame/post/present-state.js +111 -0
  141. package/dist/fea/frame/post/present-state.js.map +1 -0
  142. package/dist/fea/frame/solver/analyze-frame.d.ts +70 -0
  143. package/dist/fea/frame/solver/analyze-frame.js +136 -0
  144. package/dist/fea/frame/solver/analyze-frame.js.map +1 -0
  145. package/dist/fea/frame/solver/boundary-conditions.d.ts +14 -0
  146. package/dist/fea/frame/solver/boundary-conditions.js +37 -0
  147. package/dist/fea/frame/solver/boundary-conditions.js.map +1 -0
  148. package/dist/fea/frame/solver/combinations.d.ts +11 -0
  149. package/dist/fea/frame/solver/combinations.js +73 -0
  150. package/dist/fea/frame/solver/combinations.js.map +1 -0
  151. package/dist/fea/frame/solver/frame-system.d.ts +42 -0
  152. package/dist/fea/frame/solver/frame-system.js +126 -0
  153. package/dist/fea/frame/solver/frame-system.js.map +1 -0
  154. package/dist/fea/frame/solver/global-assembly.d.ts +17 -0
  155. package/dist/fea/frame/solver/global-assembly.js +33 -0
  156. package/dist/fea/frame/solver/global-assembly.js.map +1 -0
  157. package/dist/fea/frame/solver/load-case-solver.d.ts +34 -0
  158. package/dist/fea/frame/solver/load-case-solver.js +138 -0
  159. package/dist/fea/frame/solver/load-case-solver.js.map +1 -0
  160. package/dist/fea/frame/transformation/coordinate-transform.d.ts +21 -0
  161. package/dist/fea/frame/transformation/coordinate-transform.js +76 -0
  162. package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -0
  163. package/dist/fea/frame/types/model.type.d.ts +170 -0
  164. package/dist/fea/frame/types/model.type.js +3 -0
  165. package/dist/fea/frame/types/model.type.js.map +1 -0
  166. package/dist/fea/frame/types/results.type.d.ts +134 -0
  167. package/dist/fea/frame/types/results.type.js +3 -0
  168. package/dist/fea/frame/types/results.type.js.map +1 -0
  169. package/dist/fea/frame/validation/validate-model.d.ts +18 -0
  170. package/dist/fea/frame/validation/validate-model.js +395 -0
  171. package/dist/fea/frame/validation/validate-model.js.map +1 -0
  172. package/dist/fea/index.d.ts +1 -0
  173. package/dist/fea/index.js +19 -0
  174. package/dist/fea/index.js.map +1 -0
  175. package/dist/index.d.ts +8 -4
  176. package/dist/index.js +37 -1
  177. package/dist/index.js.map +1 -1
  178. package/dist/rc/index.d.ts +2 -0
  179. package/dist/rc/index.js +3 -1
  180. package/dist/rc/index.js.map +1 -1
  181. package/dist/rc/rc-section-properties.d.ts +35 -0
  182. package/dist/rc/rc-section-properties.js +59 -0
  183. package/dist/rc/rc-section-properties.js.map +1 -0
  184. package/dist/utils/index.d.ts +4 -0
  185. package/dist/utils/index.js +19 -1
  186. package/dist/utils/index.js.map +1 -1
  187. package/dist/utils/matrix.d.ts +45 -0
  188. package/dist/utils/matrix.js +157 -0
  189. package/dist/utils/matrix.js.map +1 -0
  190. package/dist/utils/skyline.d.ts +49 -0
  191. package/dist/utils/skyline.js +161 -0
  192. package/dist/utils/skyline.js.map +1 -0
  193. 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
+ };