@theerapat-s28/ts-structural-eng-tools 2.2.0 → 3.0.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 (120) hide show
  1. package/CHANGELOG.md +35 -1
  2. package/README.md +8 -5
  3. package/dist/core/constants/frame.constant.d.ts +15 -0
  4. package/dist/core/constants/frame.constant.js +16 -1
  5. package/dist/core/constants/frame.constant.js.map +1 -1
  6. package/dist/core/errors/frame-analysis.error.d.ts +1 -0
  7. package/dist/core/errors/frame-analysis.error.js +18 -2
  8. package/dist/core/errors/frame-analysis.error.js.map +1 -1
  9. package/dist/core/index.d.ts +1 -1
  10. package/dist/core/index.js +2 -1
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/esm/core/constants/frame.constant.js +15 -0
  13. package/dist/esm/core/constants/frame.constant.js.map +1 -1
  14. package/dist/esm/core/errors/frame-analysis.error.js +18 -2
  15. package/dist/esm/core/errors/frame-analysis.error.js.map +1 -1
  16. package/dist/esm/core/index.js +1 -1
  17. package/dist/esm/core/index.js.map +1 -1
  18. package/dist/esm/fea/frame/area/distribute-area-loads.js +10 -5
  19. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +1 -1
  20. package/dist/esm/fea/frame/elements/shell/dkq-plate.js +109 -0
  21. package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +1 -0
  22. package/dist/esm/fea/frame/elements/shell/flat-shell.js +111 -0
  23. package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +1 -0
  24. package/dist/esm/fea/frame/elements/shell/membrane-quad.js +107 -0
  25. package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +1 -0
  26. package/dist/esm/fea/frame/elements/shell/quad-geometry.js +127 -0
  27. package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +1 -0
  28. package/dist/esm/fea/frame/elements/shell/rigidity.js +19 -0
  29. package/dist/esm/fea/frame/elements/shell/rigidity.js.map +1 -0
  30. package/dist/esm/fea/frame/elements/shell/shell-axes.js +97 -0
  31. package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +1 -0
  32. package/dist/esm/fea/frame/mesh/expand-model.js +129 -0
  33. package/dist/esm/fea/frame/mesh/expand-model.js.map +1 -0
  34. package/dist/esm/fea/frame/mesh/mesh-shells.js +239 -0
  35. package/dist/esm/fea/frame/mesh/mesh-shells.js.map +1 -0
  36. package/dist/esm/fea/frame/post/envelope.js +38 -1
  37. package/dist/esm/fea/frame/post/envelope.js.map +1 -1
  38. package/dist/esm/fea/frame/post/member-diagram.js +51 -2
  39. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
  40. package/dist/esm/fea/frame/post/present-state.js +34 -16
  41. package/dist/esm/fea/frame/post/present-state.js.map +1 -1
  42. package/dist/esm/fea/frame/post/shell-forces.js +111 -0
  43. package/dist/esm/fea/frame/post/shell-forces.js.map +1 -0
  44. package/dist/esm/fea/frame/solver/analyze-frame.js +27 -7
  45. package/dist/esm/fea/frame/solver/analyze-frame.js.map +1 -1
  46. package/dist/esm/fea/frame/solver/auto-restraint.js +58 -10
  47. package/dist/esm/fea/frame/solver/auto-restraint.js.map +1 -1
  48. package/dist/esm/fea/frame/solver/frame-system.js +148 -40
  49. package/dist/esm/fea/frame/solver/frame-system.js.map +1 -1
  50. package/dist/esm/fea/frame/solver/global-assembly.js +5 -3
  51. package/dist/esm/fea/frame/solver/global-assembly.js.map +1 -1
  52. package/dist/esm/fea/frame/solver/load-case-solver.js +111 -11
  53. package/dist/esm/fea/frame/solver/load-case-solver.js.map +1 -1
  54. package/dist/esm/fea/frame/validation/validate-model.js +133 -3
  55. package/dist/esm/fea/frame/validation/validate-model.js.map +1 -1
  56. package/dist/esm/index.js +1 -1
  57. package/dist/esm/index.js.map +1 -1
  58. package/dist/fea/frame/area/distribute-area-loads.d.ts +3 -2
  59. package/dist/fea/frame/area/distribute-area-loads.js +10 -5
  60. package/dist/fea/frame/area/distribute-area-loads.js.map +1 -1
  61. package/dist/fea/frame/elements/shell/dkq-plate.d.ts +50 -0
  62. package/dist/fea/frame/elements/shell/dkq-plate.js +115 -0
  63. package/dist/fea/frame/elements/shell/dkq-plate.js.map +1 -0
  64. package/dist/fea/frame/elements/shell/flat-shell.d.ts +63 -0
  65. package/dist/fea/frame/elements/shell/flat-shell.js +118 -0
  66. package/dist/fea/frame/elements/shell/flat-shell.js.map +1 -0
  67. package/dist/fea/frame/elements/shell/membrane-quad.d.ts +61 -0
  68. package/dist/fea/frame/elements/shell/membrane-quad.js +113 -0
  69. package/dist/fea/frame/elements/shell/membrane-quad.js.map +1 -0
  70. package/dist/fea/frame/elements/shell/quad-geometry.d.ts +71 -0
  71. package/dist/fea/frame/elements/shell/quad-geometry.js +136 -0
  72. package/dist/fea/frame/elements/shell/quad-geometry.js.map +1 -0
  73. package/dist/fea/frame/elements/shell/rigidity.d.ts +14 -0
  74. package/dist/fea/frame/elements/shell/rigidity.js +23 -0
  75. package/dist/fea/frame/elements/shell/rigidity.js.map +1 -0
  76. package/dist/fea/frame/elements/shell/shell-axes.d.ts +43 -0
  77. package/dist/fea/frame/elements/shell/shell-axes.js +102 -0
  78. package/dist/fea/frame/elements/shell/shell-axes.js.map +1 -0
  79. package/dist/fea/frame/index.d.ts +2 -2
  80. package/dist/fea/frame/mesh/expand-model.d.ts +29 -0
  81. package/dist/fea/frame/mesh/expand-model.js +133 -0
  82. package/dist/fea/frame/mesh/expand-model.js.map +1 -0
  83. package/dist/fea/frame/mesh/mesh-shells.d.ts +38 -0
  84. package/dist/fea/frame/mesh/mesh-shells.js +244 -0
  85. package/dist/fea/frame/mesh/mesh-shells.js.map +1 -0
  86. package/dist/fea/frame/post/envelope.js +38 -1
  87. package/dist/fea/frame/post/envelope.js.map +1 -1
  88. package/dist/fea/frame/post/member-diagram.d.ts +21 -1
  89. package/dist/fea/frame/post/member-diagram.js +53 -3
  90. package/dist/fea/frame/post/member-diagram.js.map +1 -1
  91. package/dist/fea/frame/post/present-state.d.ts +3 -2
  92. package/dist/fea/frame/post/present-state.js +33 -15
  93. package/dist/fea/frame/post/present-state.js.map +1 -1
  94. package/dist/fea/frame/post/shell-forces.d.ts +27 -0
  95. package/dist/fea/frame/post/shell-forces.js +116 -0
  96. package/dist/fea/frame/post/shell-forces.js.map +1 -0
  97. package/dist/fea/frame/solver/analyze-frame.d.ts +8 -4
  98. package/dist/fea/frame/solver/analyze-frame.js +27 -7
  99. package/dist/fea/frame/solver/analyze-frame.js.map +1 -1
  100. package/dist/fea/frame/solver/auto-restraint.d.ts +23 -10
  101. package/dist/fea/frame/solver/auto-restraint.js +60 -11
  102. package/dist/fea/frame/solver/auto-restraint.js.map +1 -1
  103. package/dist/fea/frame/solver/frame-system.d.ts +47 -8
  104. package/dist/fea/frame/solver/frame-system.js +146 -38
  105. package/dist/fea/frame/solver/frame-system.js.map +1 -1
  106. package/dist/fea/frame/solver/global-assembly.d.ts +11 -0
  107. package/dist/fea/frame/solver/global-assembly.js +7 -4
  108. package/dist/fea/frame/solver/global-assembly.js.map +1 -1
  109. package/dist/fea/frame/solver/load-case-solver.d.ts +11 -1
  110. package/dist/fea/frame/solver/load-case-solver.js +109 -9
  111. package/dist/fea/frame/solver/load-case-solver.js.map +1 -1
  112. package/dist/fea/frame/types/model.type.d.ts +95 -3
  113. package/dist/fea/frame/types/results.type.d.ts +61 -1
  114. package/dist/fea/frame/validation/validate-model.d.ts +3 -2
  115. package/dist/fea/frame/validation/validate-model.js +133 -3
  116. package/dist/fea/frame/validation/validate-model.js.map +1 -1
  117. package/dist/index.d.ts +2 -2
  118. package/dist/index.js +3 -2
  119. package/dist/index.js.map +1 -1
  120. package/package.json +1 -1
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cornerAreas = exports.cartesianDerivatives = exports.quadJacobian = exports.serendipityShape = exports.midsideShape = exports.bilinearShape = exports.GAUSS_3X3 = exports.GAUSS_2X2 = void 0;
4
+ /** Natural coordinates (ξ, η) of the four corners, counter-clockwise about the normal. */
5
+ const CORNER_XI = [-1, 1, 1, -1];
6
+ const CORNER_ETA = [-1, -1, 1, 1];
7
+ const GAUSS = 1 / Math.sqrt(3);
8
+ /**
9
+ * 2×2 Gauss rule over the parent square −1 ≤ ξ, η ≤ 1: points (±1/√3, ±1/√3), weight 1 each.
10
+ * Exact for polynomials up to cubic in each of ξ and η.
11
+ */
12
+ exports.GAUSS_2X2 = [
13
+ { xi: -GAUSS, eta: -GAUSS, weight: 1 },
14
+ { xi: GAUSS, eta: -GAUSS, weight: 1 },
15
+ { xi: GAUSS, eta: GAUSS, weight: 1 },
16
+ { xi: -GAUSS, eta: GAUSS, weight: 1 },
17
+ ];
18
+ const GAUSS_3 = Math.sqrt(0.6);
19
+ const GAUSS_3_POINTS = [
20
+ { at: -GAUSS_3, weight: 5 / 9 },
21
+ { at: 0, weight: 8 / 9 },
22
+ { at: GAUSS_3, weight: 5 / 9 },
23
+ ];
24
+ /**
25
+ * 3×3 Gauss rule over the parent square: points 0 and ±√0.6 in each direction, weights the
26
+ * products of 5/9, 8/9, 5/9. Exact for polynomials up to quintic in each of ξ and η.
27
+ */
28
+ exports.GAUSS_3X3 = GAUSS_3_POINTS.flatMap((p) => GAUSS_3_POINTS.map((q) => ({ xi: p.at, eta: q.at, weight: p.weight * q.weight })));
29
+ /** Bilinear corner functions `Nᵢ = ¼(1 + ξᵢξ)(1 + ηᵢη)`, i = 1…4. */
30
+ const bilinearShape = (xi, eta) => {
31
+ const N = [];
32
+ const dXi = [];
33
+ const dEta = [];
34
+ for (let i = 0; i < 4; i++) {
35
+ const a = CORNER_XI[i];
36
+ const b = CORNER_ETA[i];
37
+ N.push(0.25 * (1 + a * xi) * (1 + b * eta));
38
+ dXi.push(0.25 * a * (1 + b * eta));
39
+ dEta.push(0.25 * b * (1 + a * xi));
40
+ }
41
+ return { N, dXi, dEta };
42
+ };
43
+ exports.bilinearShape = bilinearShape;
44
+ /**
45
+ * Mid-side functions N₅…N₈, one per edge 1→2, 2→3, 3→4, 4→1 (index k = edge from corner k to
46
+ * corner k + 1): 1 at the edge's midpoint and 0 at every corner and every other midpoint.
47
+ */
48
+ const midsideShape = (xi, eta) => ({
49
+ N: [
50
+ 0.5 * (1 - xi * xi) * (1 - eta),
51
+ 0.5 * (1 + xi) * (1 - eta * eta),
52
+ 0.5 * (1 - xi * xi) * (1 + eta),
53
+ 0.5 * (1 - xi) * (1 - eta * eta),
54
+ ],
55
+ dXi: [-xi * (1 - eta), 0.5 * (1 - eta * eta), -xi * (1 + eta), -0.5 * (1 - eta * eta)],
56
+ dEta: [-0.5 * (1 - xi * xi), -(1 + xi) * eta, 0.5 * (1 - xi * xi), -(1 - xi) * eta],
57
+ });
58
+ exports.midsideShape = midsideShape;
59
+ /**
60
+ * 8-node serendipity functions: the corner functions
61
+ * `Nᵢ = ¼(1 + ξᵢξ)(1 + ηᵢη)(ξᵢξ + ηᵢη − 1)`, i = 1…4, followed by the mid-side functions
62
+ * N₅…N₈ of `midsideShape`. Each is 1 at its own node and 0 at the other seven.
63
+ */
64
+ const serendipityShape = (xi, eta) => {
65
+ const N = [];
66
+ const dXi = [];
67
+ const dEta = [];
68
+ for (let i = 0; i < 4; i++) {
69
+ const a = CORNER_XI[i];
70
+ const b = CORNER_ETA[i];
71
+ N.push(0.25 * (1 + a * xi) * (1 + b * eta) * (a * xi + b * eta - 1));
72
+ dXi.push(0.25 * a * (1 + b * eta) * (2 * a * xi + b * eta));
73
+ dEta.push(0.25 * b * (1 + a * xi) * (a * xi + 2 * b * eta));
74
+ }
75
+ const mid = (0, exports.midsideShape)(xi, eta);
76
+ return { N: [...N, ...mid.N], dXi: [...dXi, ...mid.dXi], dEta: [...dEta, ...mid.dEta] };
77
+ };
78
+ exports.serendipityShape = serendipityShape;
79
+ /**
80
+ * Jacobian of the bilinear map from the parent square to a quadrilateral.
81
+ *
82
+ * @param corners - The four corners in the element plane (mm), counter-clockwise
83
+ * @param xi - Natural coordinate ξ
84
+ * @param eta - Natural coordinate η
85
+ * @returns `det J` and `J⁻¹`; `det J > 0` everywhere for a convex, counter-clockwise quad
86
+ */
87
+ const quadJacobian = (corners, xi, eta) => {
88
+ const { dXi, dEta } = (0, exports.bilinearShape)(xi, eta);
89
+ let xXi = 0;
90
+ let yXi = 0;
91
+ let xEta = 0;
92
+ let yEta = 0;
93
+ for (let i = 0; i < 4; i++) {
94
+ xXi += dXi[i] * corners[i][0];
95
+ yXi += dXi[i] * corners[i][1];
96
+ xEta += dEta[i] * corners[i][0];
97
+ yEta += dEta[i] * corners[i][1];
98
+ }
99
+ const detJ = xXi * yEta - yXi * xEta;
100
+ return {
101
+ detJ,
102
+ inverse: [
103
+ [yEta / detJ, -yXi / detJ],
104
+ [-xEta / detJ, xXi / detJ],
105
+ ],
106
+ };
107
+ };
108
+ exports.quadJacobian = quadJacobian;
109
+ /**
110
+ * Converts ξ, η derivatives of shape functions to x, y derivatives: `[N,x; N,y] = J⁻¹·[N,ξ; N,η]`.
111
+ *
112
+ * @returns `dX[i]` and `dY[i]` for every function i of `shape`
113
+ */
114
+ const cartesianDerivatives = ({ inverse }, shape) => ({
115
+ dX: shape.dXi.map((d, i) => inverse[0][0] * d + inverse[0][1] * shape.dEta[i]),
116
+ dY: shape.dXi.map((d, i) => inverse[1][0] * d + inverse[1][1] * shape.dEta[i]),
117
+ });
118
+ exports.cartesianDerivatives = cartesianDerivatives;
119
+ /**
120
+ * Integrals `∫ Nᵢ dA` of the bilinear corner functions over a quad (2×2 Gauss, exact): the
121
+ * share of a uniform surface load each corner takes. They sum to the quad's area; each is
122
+ * A/4 for a parallelogram.
123
+ *
124
+ * @param corners - The four corners in the element plane (mm), counter-clockwise
125
+ * @returns Four areas in mm²
126
+ */
127
+ const cornerAreas = (corners) => {
128
+ const areas = [0, 0, 0, 0];
129
+ for (const { xi, eta, weight } of exports.GAUSS_2X2) {
130
+ const { detJ } = (0, exports.quadJacobian)(corners, xi, eta);
131
+ (0, exports.bilinearShape)(xi, eta).N.forEach((n, i) => (areas[i] += n * detJ * weight));
132
+ }
133
+ return areas;
134
+ };
135
+ exports.cornerAreas = cornerAreas;
136
+ //# sourceMappingURL=quad-geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quad-geometry.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/shell/quad-geometry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Matrix } from "../../../../utils/matrix";
2
+ /** Stiffness modifiers on the components 11, 22 and 12 of a rigidity matrix (1 = unmodified). */
3
+ export type RigidityModifiers = readonly [number, number, number];
4
+ /**
5
+ * Isotropic rigidity `c·[[1, ν, 0], [ν, 1, 0], [0, 0, (1 − ν)/2]]` with stiffness modifiers applied
6
+ * as `S·D·S`, `S = diag(√f₁₁, √f₂₂, √f₁₂)`: D₁₁, D₂₂ and D₃₃ scale by their own modifier and the
7
+ * coupling D₁₂ by √(f₁₁·f₂₂), so D stays symmetric and positive definite and equal modifiers
8
+ * scale it uniformly.
9
+ *
10
+ * @param c - E·t/(1 − ν²) for a membrane, E·t³/(12(1 − ν²)) for a plate
11
+ * @param nu - Poisson's ratio
12
+ * @param modifiers - Positive modifiers [f₁₁, f₂₂, f₁₂] (default all 1)
13
+ */
14
+ export declare const isotropicRigidity: (c: number, nu: number, modifiers?: RigidityModifiers) => Matrix;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isotropicRigidity = void 0;
4
+ /**
5
+ * Isotropic rigidity `c·[[1, ν, 0], [ν, 1, 0], [0, 0, (1 − ν)/2]]` with stiffness modifiers applied
6
+ * as `S·D·S`, `S = diag(√f₁₁, √f₂₂, √f₁₂)`: D₁₁, D₂₂ and D₃₃ scale by their own modifier and the
7
+ * coupling D₁₂ by √(f₁₁·f₂₂), so D stays symmetric and positive definite and equal modifiers
8
+ * scale it uniformly.
9
+ *
10
+ * @param c - E·t/(1 − ν²) for a membrane, E·t³/(12(1 − ν²)) for a plate
11
+ * @param nu - Poisson's ratio
12
+ * @param modifiers - Positive modifiers [f₁₁, f₂₂, f₁₂] (default all 1)
13
+ */
14
+ const isotropicRigidity = (c, nu, modifiers = [1, 1, 1]) => {
15
+ const [f11, f22, f12] = modifiers;
16
+ return [
17
+ [c * f11, c * nu * Math.sqrt(f11 * f22), 0],
18
+ [c * nu * Math.sqrt(f11 * f22), c * f22, 0],
19
+ [0, 0, ((c * (1 - nu)) / 2) * f12],
20
+ ];
21
+ };
22
+ exports.isotropicRigidity = isotropicRigidity;
23
+ //# sourceMappingURL=rigidity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rigidity.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/shell/rigidity.ts"],"names":[],"mappings":";;;AAKA;;;;;;;;;GASG;AACI,MAAM,iBAAiB,GAAG,CAC/B,CAAS,EACT,EAAU,EACV,YAA+B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAChC,EAAE;IACV,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC;IAClC,OAAO;QACL,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;KACnC,CAAC;AACJ,CAAC,CAAC;AAXW,QAAA,iBAAiB,qBAW5B"}
@@ -0,0 +1,43 @@
1
+ import type { Matrix } from "../../../../utils/matrix";
2
+ import { type Vec2 } from "./quad-geometry";
3
+ /** A point or vector in global axes: X, Y, Z in mm. */
4
+ export type Vec3 = [number, number, number];
5
+ /** A four-node shell element's local axes and its corners on the mean plane. */
6
+ export interface ShellAxes {
7
+ /** Direction cosines, rows = local 1, 2, 3 in global components. */
8
+ lambda: Matrix;
9
+ /** Centroid of the four corners (mm), the origin of the local coordinates. */
10
+ origin: Vec3;
11
+ /** Corners projected onto the mean plane, as local 1–2 coordinates (mm). */
12
+ corners: Vec2[];
13
+ /**
14
+ * Distance of each corner from the mean plane along local 3 (mm): +h, −h, +h, −h, with
15
+ * h = ¼(x₁ − x₂ + x₃ − x₄)·n. All zero for a flat element.
16
+ */
17
+ offsets: number[];
18
+ }
19
+ /**
20
+ * Local axes of a four-node shell element, ETABS-style, and its corners on the mean plane.
21
+ *
22
+ * - Local 3 is the unit normal `n ∥ d₁ × d₂` of the diagonals `d₁ = x₃ − x₁`, `d₂ = x₄ − x₂`: the
23
+ * right-hand rule around the nodes, as for null areas (for four nodes Newell's vector area is
24
+ * exactly `½ d₁ × d₂`).
25
+ * - Non-horizontal element: local 2 is +Z projected onto the plane (upward on a wall) and
26
+ * local 1 = 2 × 3 is horizontal.
27
+ * - Horizontal element (the normal's horizontal part below the vertical-member tolerance):
28
+ * local 1 = +X and local 2 = 3 × 1, so local 2 = +Y when local 3 = +Z.
29
+ * - `angle` then rotates local 1 and 2 about local 3 by the right-hand rule.
30
+ *
31
+ * The mean plane passes through the centroid with normal n; a warped element's corners lie
32
+ * alternately h above and below it.
33
+ *
34
+ * @param points - The four corners in global axes (mm), in order around the element
35
+ * @param angle - Rotation of local 1 and 2 about local 3 in rad (default 0)
36
+ */
37
+ export declare const shellAxes: (points: readonly Vec3[], angle?: number) => ShellAxes;
38
+ /**
39
+ * Whether four corners make a valid shell element: no repeated corner, a non-degenerate
40
+ * convex quadrilateral in order around it (det J > 0 at every corner of the bilinear map), and
41
+ * no corner farther than `SHELL_WARPING_LIMIT · √A` from the mean plane.
42
+ */
43
+ export declare const isValidShellQuad: (points: readonly Vec3[]) => boolean;
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isValidShellQuad = exports.shellAxes = void 0;
4
+ const frame_constant_1 = require("../../../../core/constants/frame.constant");
5
+ const quad_geometry_1 = require("./quad-geometry");
6
+ const sub = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
7
+ const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
8
+ const cross = (a, b) => [
9
+ a[1] * b[2] - a[2] * b[1],
10
+ a[2] * b[0] - a[0] * b[2],
11
+ a[0] * b[1] - a[1] * b[0],
12
+ ];
13
+ const unit = (a) => {
14
+ const n = Math.hypot(a[0], a[1], a[2]);
15
+ return [a[0] / n, a[1] / n, a[2] / n];
16
+ };
17
+ /**
18
+ * Local axes of a four-node shell element, ETABS-style, and its corners on the mean plane.
19
+ *
20
+ * - Local 3 is the unit normal `n ∥ d₁ × d₂` of the diagonals `d₁ = x₃ − x₁`, `d₂ = x₄ − x₂`: the
21
+ * right-hand rule around the nodes, as for null areas (for four nodes Newell's vector area is
22
+ * exactly `½ d₁ × d₂`).
23
+ * - Non-horizontal element: local 2 is +Z projected onto the plane (upward on a wall) and
24
+ * local 1 = 2 × 3 is horizontal.
25
+ * - Horizontal element (the normal's horizontal part below the vertical-member tolerance):
26
+ * local 1 = +X and local 2 = 3 × 1, so local 2 = +Y when local 3 = +Z.
27
+ * - `angle` then rotates local 1 and 2 about local 3 by the right-hand rule.
28
+ *
29
+ * The mean plane passes through the centroid with normal n; a warped element's corners lie
30
+ * alternately h above and below it.
31
+ *
32
+ * @param points - The four corners in global axes (mm), in order around the element
33
+ * @param angle - Rotation of local 1 and 2 about local 3 in rad (default 0)
34
+ */
35
+ const shellAxes = (points, angle = 0) => {
36
+ const e3 = unit(cross(sub(points[2], points[0]), sub(points[3], points[1])));
37
+ let e1;
38
+ let e2;
39
+ if (Math.hypot(e3[0], e3[1]) < frame_constant_1.VERTICAL_MEMBER_TOLERANCE) {
40
+ e1 = [1, 0, 0];
41
+ e2 = cross(e3, e1);
42
+ }
43
+ else {
44
+ e2 = unit([-e3[2] * e3[0], -e3[2] * e3[1], 1 - e3[2] * e3[2]]); // Z − (Z·n)·n
45
+ e1 = cross(e2, e3);
46
+ }
47
+ if (angle !== 0) {
48
+ const c = Math.cos(angle);
49
+ const s = Math.sin(angle);
50
+ const r1 = [c * e1[0] + s * e2[0], c * e1[1] + s * e2[1], c * e1[2] + s * e2[2]];
51
+ const r2 = [-s * e1[0] + c * e2[0], -s * e1[1] + c * e2[1], -s * e1[2] + c * e2[2]];
52
+ e1 = r1;
53
+ e2 = r2;
54
+ }
55
+ const origin = [0, 1, 2].map((k) => (points[0][k] + points[1][k] + points[2][k] + points[3][k]) / 4);
56
+ const relative = points.map((p) => sub(p, origin));
57
+ return {
58
+ lambda: [e1, e2, e3],
59
+ origin,
60
+ corners: relative.map((r) => [dot(r, e1), dot(r, e2)]),
61
+ offsets: relative.map((r) => dot(r, e3)),
62
+ };
63
+ };
64
+ exports.shellAxes = shellAxes;
65
+ /**
66
+ * Whether four corners make a valid shell element: no repeated corner, a non-degenerate
67
+ * convex quadrilateral in order around it (det J > 0 at every corner of the bilinear map), and
68
+ * no corner farther than `SHELL_WARPING_LIMIT · √A` from the mean plane.
69
+ */
70
+ const isValidShellQuad = (points) => {
71
+ const size = Math.max(...points.map((p, i) => {
72
+ const q = points[(i + 1) % 4];
73
+ return Math.hypot(q[0] - p[0], q[1] - p[1], q[2] - p[2]);
74
+ }));
75
+ const tolerance = frame_constant_1.AREA_GEOMETRY_TOLERANCE * size;
76
+ for (let i = 0; i < 4; i++) {
77
+ for (let j = i + 1; j < 4; j++) {
78
+ const [p, q] = [points[i], points[j]];
79
+ if (!(Math.hypot(q[0] - p[0], q[1] - p[1], q[2] - p[2]) > tolerance))
80
+ return false;
81
+ }
82
+ }
83
+ const d1 = [0, 1, 2].map((k) => points[2][k] - points[0][k]);
84
+ const d2 = [0, 1, 2].map((k) => points[3][k] - points[1][k]);
85
+ const area = Math.hypot(d1[1] * d2[2] - d1[2] * d2[1], d1[2] * d2[0] - d1[0] * d2[2], d1[0] * d2[1] - d1[1] * d2[0]) / 2;
86
+ if (!(area > tolerance * size))
87
+ return false;
88
+ const axes = (0, exports.shellAxes)(points);
89
+ for (const [xi, eta] of [
90
+ [-1, -1],
91
+ [1, -1],
92
+ [1, 1],
93
+ [-1, 1],
94
+ ]) {
95
+ if (!((0, quad_geometry_1.quadJacobian)(axes.corners, xi, eta).detJ > (frame_constant_1.AREA_GEOMETRY_TOLERANCE * area) / 4)) {
96
+ return false;
97
+ }
98
+ }
99
+ return Math.max(...axes.offsets.map(Math.abs)) <= frame_constant_1.SHELL_WARPING_LIMIT * Math.sqrt(area);
100
+ };
101
+ exports.isValidShellQuad = isValidShellQuad;
102
+ //# sourceMappingURL=shell-axes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-axes.js","sourceRoot":"","sources":["../../../../../src/fea/frame/elements/shell/shell-axes.ts"],"names":[],"mappings":"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"}
@@ -6,5 +6,5 @@ export { beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, } from "./elemen
6
6
  export { memberAxes } from "./transformation/coordinate-transform";
7
7
  export { memberDemandEnvelope } from "./post/demand-envelope";
8
8
  export type { MemberDemandEnvelope, DemandEnvelopeOptions } from "./post/demand-envelope";
9
- export type { FrameId, FrameNode, DofRestraint, Restraint, DofRelease, MemberEndRelease, Member, NodalLoad, LoadDirection, UniformMemberLoad, PointMemberLoad, TrapezoidalMemberLoad, TorqueMemberLoad, MemberLoad, AreaDistribution, NullArea, AreaLoadDirection, AreaLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, FrameModel, } from "./types/model.type";
10
- export type { NodalDisplacement, NodalReaction, MemberEndForce, MemberEndForces, ReleaseDeformation, MemberReleaseDeformations, AutoRestrainedDof, MemberStation, StationComponent, ExtremeValue, MemberDiagram, GoverningValue, GoverningExtremeValue, Bound, FrameCaseResult, FrameEnvelope, FrameResult, } from "./types/results.type";
9
+ export type { FrameId, FrameNode, DofRestraint, Restraint, LineRestraint, DofRelease, MemberEndRelease, Member, NodalLoad, LoadDirection, UniformMemberLoad, PointMemberLoad, TrapezoidalMemberLoad, TorqueMemberLoad, MemberLoad, AreaDistribution, NullArea, ShellType, ShellSection, ShellModifiers, ShellArea, ShellMesh, AreaLoadDirection, AreaLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, FrameModel, } from "./types/model.type";
10
+ export type { NodalDisplacement, NodalReaction, MemberEndForce, MemberEndForces, ReleaseDeformation, MemberReleaseDeformations, AutoRestrainedDof, MemberStation, StationComponent, ExtremeValue, MemberDiagram, ShellCornerForces, ShellForceComponent, ShellElementForces, FrameMesh, GoverningValue, GoverningExtremeValue, Bound, FrameCaseResult, FrameEnvelope, FrameResult, } from "./types/results.type";
@@ -0,0 +1,29 @@
1
+ import type { Warnings } from "../../../core/types/output-message.type";
2
+ import type { FrameId, FrameModel, Member } from "../types/model.type";
3
+ import type { FrameMesh } from "../types/results.type";
4
+ import { type ShellElement } from "./mesh-shells";
5
+ /** A member with the generated mesh nodes lying inside it, where the solver splits it. */
6
+ export interface SplitMember extends Member {
7
+ /** Generated node ids strictly between its ends, in order from the start. */
8
+ through?: FrameId[];
9
+ }
10
+ /** The model the solver analyses: shells meshed, line restraints spread to their nodes. */
11
+ export interface ExpandedModel {
12
+ /**
13
+ * Nodes include the generated ones; `shells` are the elements; members list the generated
14
+ * nodes they pass through; restraints include the lines.
15
+ */
16
+ model: FrameModel & {
17
+ shells: ShellElement[];
18
+ members: SplitMember[];
19
+ };
20
+ /** The shell mesh for the result; undefined without shells. */
21
+ mesh: FrameMesh | undefined;
22
+ warnings: Warnings;
23
+ }
24
+ /**
25
+ * Meshes a valid model's shell areas, spreads its line restraints and marks the members that
26
+ * generated nodes split (see `meshShells`).
27
+ * Without shells and line restraints the model is returned as it is.
28
+ */
29
+ export declare const expandModel: (model: FrameModel) => ExpandedModel;
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.expandModel = void 0;
4
+ const frame_constant_1 = require("../../../core/constants/frame.constant");
5
+ const shell_axes_1 = require("../elements/shell/shell-axes");
6
+ const mesh_shells_1 = require("./mesh-shells");
7
+ const DOF_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
8
+ /**
9
+ * Restraints of every node on each line restraint's segment (ends included), merged with the
10
+ * point restraints: a DOF fixed by either is fixed.
11
+ */
12
+ const spreadLineRestraints = (model, nodes) => {
13
+ const lines = model.lineRestraints ?? [];
14
+ if (lines.length === 0)
15
+ return model.restraints;
16
+ const position = new Map(nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
17
+ const merged = new Map(model.restraints.map((r) => [r.nodeId, { ...r }]));
18
+ for (const line of lines) {
19
+ const [P, Q] = line.nodeIds.map((id) => position.get(id));
20
+ for (const node of nodes) {
21
+ const on = line.nodeIds.includes(node.id) ||
22
+ (0, mesh_shells_1.pointOnSegment)([node.x, node.y, node.z], P, Q, true) !== null;
23
+ if (!on)
24
+ continue;
25
+ const restraint = merged.get(node.id) ?? { nodeId: node.id };
26
+ for (const key of DOF_KEYS)
27
+ if (line[key] === true)
28
+ restraint[key] = true;
29
+ merged.set(node.id, restraint);
30
+ }
31
+ }
32
+ return [...merged.values()];
33
+ };
34
+ /**
35
+ * Warnings for member nodes lying inside a shell area but not on its mesh: such a node is not
36
+ * connected to the shell.
37
+ */
38
+ const disconnectedNodes = (model, meshNodes) => {
39
+ const warnings = [];
40
+ const shells = model.shells ?? [];
41
+ const position = new Map(model.nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
42
+ const memberNodes = new Set(model.members.flatMap((m) => [m.startNodeId, m.endNodeId]));
43
+ for (const shell of shells) {
44
+ const points = shell.nodeIds.map((id) => position.get(id));
45
+ const axes = (0, shell_axes_1.shellAxes)(points);
46
+ const size = Math.max(...axes.corners.map(([x, y]) => Math.hypot(x, y)));
47
+ const tolerance = frame_constant_1.AREA_GEOMETRY_TOLERANCE * size;
48
+ for (const id of memberNodes) {
49
+ if (meshNodes.has(id))
50
+ continue;
51
+ const p = position.get(id);
52
+ const r = [p[0] - axes.origin[0], p[1] - axes.origin[1], p[2] - axes.origin[2]];
53
+ const [e1, e2, e3] = axes.lambda;
54
+ const z = r[0] * e3[0] + r[1] * e3[1] + r[2] * e3[2];
55
+ if (Math.abs(z) > Math.max(tolerance, ...axes.offsets.map(Math.abs)))
56
+ continue;
57
+ const x = r[0] * e1[0] + r[1] * e1[1] + r[2] * e1[2];
58
+ const y = r[0] * e2[0] + r[1] * e2[1] + r[2] * e2[2];
59
+ const inside = axes.corners.every(([ax, ay], k) => {
60
+ const [bx, by] = axes.corners[(k + 1) % 4];
61
+ return (bx - ax) * (y - ay) - (by - ay) * (x - ax) > tolerance * size;
62
+ });
63
+ if (inside) {
64
+ warnings.push({
65
+ reference: "Shell area meshing",
66
+ message: `Node "${String(id)}" lies inside shell area "${String(shell.id)}" but not on its mesh, so its members are not connected to the shell; divide the area through the node.`,
67
+ });
68
+ }
69
+ }
70
+ }
71
+ return warnings;
72
+ };
73
+ /**
74
+ * The generated nodes lying strictly inside each member (a beam along a meshed edge), so the
75
+ * member can be split there and share them with the shells.
76
+ */
77
+ const splitMembers = (model, generated) => {
78
+ if (generated.length === 0)
79
+ return model.members;
80
+ const position = new Map(model.nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
81
+ return model.members.map((member) => {
82
+ const [P, Q] = [position.get(member.startNodeId), position.get(member.endNodeId)];
83
+ const lo = [0, 1, 2].map((k) => Math.min(P[k], Q[k]));
84
+ const hi = [0, 1, 2].map((k) => Math.max(P[k], Q[k]));
85
+ const slack = frame_constant_1.AREA_GEOMETRY_TOLERANCE * Math.hypot(Q[0] - P[0], Q[1] - P[1], Q[2] - P[2]);
86
+ const through = [];
87
+ for (const node of generated) {
88
+ const x = [node.x, node.y, node.z];
89
+ if (x.some((v, k) => v < lo[k] - slack || v > hi[k] + slack))
90
+ continue;
91
+ const t = (0, mesh_shells_1.pointOnSegment)(x, P, Q);
92
+ if (t !== null)
93
+ through.push({ id: node.id, t });
94
+ }
95
+ return through.length === 0
96
+ ? member
97
+ : { ...member, through: through.sort((a, b) => a.t - b.t).map((h) => h.id) };
98
+ });
99
+ };
100
+ /**
101
+ * Meshes a valid model's shell areas, spreads its line restraints and marks the members that
102
+ * generated nodes split (see `meshShells`).
103
+ * Without shells and line restraints the model is returned as it is.
104
+ */
105
+ const expandModel = (model) => {
106
+ const shells = model.shells ?? [];
107
+ if (shells.length === 0) {
108
+ return {
109
+ model: { ...model, shells: [], restraints: spreadLineRestraints(model, model.nodes) },
110
+ mesh: undefined,
111
+ warnings: [],
112
+ };
113
+ }
114
+ const meshed = (0, mesh_shells_1.meshShells)(model.nodes, shells);
115
+ const nodes = [...model.nodes, ...meshed.nodes];
116
+ const meshNodes = new Set(meshed.elements.flatMap((e) => e.nodeIds));
117
+ return {
118
+ model: {
119
+ ...model,
120
+ nodes,
121
+ members: splitMembers(model, meshed.nodes),
122
+ shells: meshed.elements,
123
+ restraints: spreadLineRestraints(model, nodes),
124
+ },
125
+ mesh: {
126
+ nodes: meshed.nodes,
127
+ shells: meshed.elements.map(({ id, areaId, nodeIds }) => ({ id, areaId, nodeIds })),
128
+ },
129
+ warnings: disconnectedNodes(model, meshNodes),
130
+ };
131
+ };
132
+ exports.expandModel = expandModel;
133
+ //# sourceMappingURL=expand-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expand-model.js","sourceRoot":"","sources":["../../../../src/fea/frame/mesh/expand-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type Vec3 } from "../elements/shell/shell-axes";
2
+ import type { FrameId, FrameNode, ShellArea } from "../types/model.type";
3
+ /** A shell element of the analysed model: a shell area, or one element of its mesh. */
4
+ export interface ShellElement extends ShellArea {
5
+ /** The shell area it belongs to (its own id when the area is one element). */
6
+ areaId: FrameId;
7
+ }
8
+ /** The result of meshing a model's shell areas. */
9
+ export interface ShellMeshResult {
10
+ /** Generated nodes, in global coordinates (mm). */
11
+ nodes: FrameNode[];
12
+ /** Every shell element, area by area in model order. */
13
+ elements: ShellElement[];
14
+ /** Areas that could not be meshed (no conforming division counts, a bad generated element, or a generated id already in use). */
15
+ problems: FrameId[];
16
+ }
17
+ /** Parameter t ∈ (0, 1) of `x` on the segment p → q when it lies strictly inside it, else null. */
18
+ export declare const pointOnSegment: (x: Vec3, p: Vec3, q: Vec3, inclusive?: boolean) => number | null;
19
+ /**
20
+ * Meshes the shell areas of a model whose shells and nodes are valid.
21
+ *
22
+ * - Each area edge is cut into segments at the model nodes lying on it (hard points), so an
23
+ * edge shared whole by two areas, or partly where areas meet at a node (a T-junction), shares
24
+ * its segments.
25
+ * - Every segment gets a division count: at least 1, at least `length / maxSize` for an area
26
+ * with `mesh.maxSize`, and raised until in every area opposite edges add up to the same
27
+ * count (and at least `mesh.divisions`), adding each division where the elements are longest.
28
+ * - Segment nodes are evenly spaced; interior nodes come from transfinite interpolation of the
29
+ * four edges, so a planar area stays planar.
30
+ *
31
+ * An area that ends with 1 × 1 divisions is its own element, with its own id. Generated ids:
32
+ * `"<a>~<b>:<k>"` for the k-th node from model node a to b on a segment, `"<areaId>:<i>,<j>"`
33
+ * for interior nodes and for elements.
34
+ *
35
+ * @param nodes - Model nodes
36
+ * @param shells - Shell areas, each with 4 valid corner nodes
37
+ */
38
+ export declare const meshShells: (nodes: FrameNode[], shells: ShellArea[]) => ShellMeshResult;