@theerapat-s28/ts-structural-eng-tools 3.2.0 → 3.4.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/CHANGELOG.md +33 -1
- package/README.md +77 -18
- package/dist/core/constants/fea.constant.d.ts +21 -0
- package/dist/core/constants/fea.constant.js +26 -0
- package/dist/core/constants/fea.constant.js.map +1 -0
- package/dist/core/constants/frame.constant.d.ts +6 -32
- package/dist/core/constants/frame.constant.js +8 -33
- package/dist/core/constants/frame.constant.js.map +1 -1
- package/dist/core/constants/rc.constant.d.ts +8 -0
- package/dist/core/constants/rc.constant.js +10 -1
- package/dist/core/constants/rc.constant.js.map +1 -1
- package/dist/core/constants/shell.constant.d.ts +23 -0
- package/dist/core/constants/shell.constant.js +28 -0
- package/dist/core/constants/shell.constant.js.map +1 -0
- package/dist/core/errors/fea.error.d.ts +5 -0
- package/dist/core/errors/fea.error.js +9 -1
- package/dist/core/errors/fea.error.js.map +1 -1
- package/dist/core/index.d.ts +4 -2
- package/dist/core/index.js +18 -10
- package/dist/core/index.js.map +1 -1
- package/dist/esm/core/constants/fea.constant.js +23 -0
- package/dist/esm/core/constants/fea.constant.js.map +1 -0
- package/dist/esm/core/constants/frame.constant.js +7 -32
- package/dist/esm/core/constants/frame.constant.js.map +1 -1
- package/dist/esm/core/constants/rc.constant.js +9 -0
- package/dist/esm/core/constants/rc.constant.js.map +1 -1
- package/dist/esm/core/constants/shell.constant.js +25 -0
- package/dist/esm/core/constants/shell.constant.js.map +1 -0
- package/dist/esm/core/errors/fea.error.js +9 -1
- package/dist/esm/core/errors/fea.error.js.map +1 -1
- package/dist/esm/core/index.js +4 -2
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/fea/analysis/index.js +1 -0
- package/dist/esm/fea/analysis/index.js.map +1 -1
- package/dist/esm/fea/analysis/mesh/expand-model.js +27 -44
- package/dist/esm/fea/analysis/mesh/expand-model.js.map +1 -1
- package/dist/esm/fea/analysis/mesh/member-connectivity.js +67 -0
- package/dist/esm/fea/analysis/mesh/member-connectivity.js.map +1 -0
- package/dist/esm/fea/analysis/post/envelope.js +70 -0
- package/dist/esm/fea/analysis/post/envelope.js.map +1 -1
- package/dist/esm/fea/analysis/post/present-state.js +11 -4
- package/dist/esm/fea/analysis/post/present-state.js.map +1 -1
- package/dist/esm/fea/analysis/post/wall-forces.js +299 -0
- package/dist/esm/fea/analysis/post/wall-forces.js.map +1 -0
- package/dist/esm/fea/analysis/post/wall-geometry.js +173 -0
- package/dist/esm/fea/analysis/post/wall-geometry.js.map +1 -0
- package/dist/esm/fea/analysis/solver/analysis-system.js +1 -1
- package/dist/esm/fea/analysis/solver/analysis-system.js.map +1 -1
- package/dist/esm/fea/analysis/solver/analyze.js +21 -5
- package/dist/esm/fea/analysis/solver/analyze.js.map +1 -1
- package/dist/esm/fea/analysis/solver/load-case-solver.js +4 -3
- package/dist/esm/fea/analysis/solver/load-case-solver.js.map +1 -1
- package/dist/esm/fea/analysis/validation/validate-model.js +20 -2
- package/dist/esm/fea/analysis/validation/validate-model.js.map +1 -1
- package/dist/esm/fea/analysis/validation/validate-walls.js +226 -0
- package/dist/esm/fea/analysis/validation/validate-walls.js.map +1 -0
- package/dist/esm/fea/frame/area/area-geometry.js +1 -1
- package/dist/esm/fea/frame/area/area-geometry.js.map +1 -1
- package/dist/esm/fea/frame/area/area-member-loads.js +1 -1
- package/dist/esm/fea/frame/area/area-member-loads.js.map +1 -1
- package/dist/esm/fea/frame/area/edge-members.js +1 -1
- package/dist/esm/fea/frame/area/edge-members.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js +16 -4
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/solver/nodes-along-members.js +73 -0
- package/dist/esm/fea/frame/solver/nodes-along-members.js.map +1 -0
- package/dist/esm/fea/frame/solver/system-member.js +4 -4
- package/dist/esm/fea/frame/solver/system-member.js.map +1 -1
- package/dist/esm/fea/frame/transformation/coordinate-transform.js +1 -1
- package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-members.js +6 -2
- package/dist/esm/fea/frame/validation/validate-members.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-null-areas.js +1 -1
- package/dist/esm/fea/frame/validation/validate-null-areas.js.map +1 -1
- package/dist/esm/fea/shared/solver/auto-restraint.js +1 -1
- package/dist/esm/fea/shared/solver/auto-restraint.js.map +1 -1
- package/dist/esm/fea/shared/validation/issues.js +8 -0
- package/dist/esm/fea/shared/validation/issues.js.map +1 -1
- package/dist/esm/fea/shell/elements/membrane-quad.js +1 -1
- package/dist/esm/fea/shell/elements/shell-axes.js +2 -1
- package/dist/esm/fea/shell/elements/shell-axes.js.map +1 -1
- package/dist/esm/fea/shell/mesh/mesh-shells.js +1 -1
- package/dist/esm/fea/shell/mesh/mesh-shells.js.map +1 -1
- package/dist/esm/fea/shell/post/strip-forces.js +341 -0
- package/dist/esm/fea/shell/post/strip-forces.js.map +1 -0
- package/dist/esm/fea/shell/solver/shell-loads.js +3 -0
- package/dist/esm/fea/shell/solver/shell-loads.js.map +1 -1
- package/dist/esm/fea/shell/validation/validate-shells.js +9 -2
- package/dist/esm/fea/shell/validation/validate-shells.js.map +1 -1
- package/dist/esm/fea/shell/validation/validate-strips.js +99 -0
- package/dist/esm/fea/shell/validation/validate-strips.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/rc/rc-section-properties.js +1 -1
- package/dist/esm/rc/rc-section-properties.js.map +1 -1
- package/dist/fea/analysis/index.d.ts +4 -2
- package/dist/fea/analysis/index.js +3 -1
- package/dist/fea/analysis/index.js.map +1 -1
- package/dist/fea/analysis/mesh/expand-model.d.ts +10 -7
- package/dist/fea/analysis/mesh/expand-model.js +28 -45
- package/dist/fea/analysis/mesh/expand-model.js.map +1 -1
- package/dist/fea/analysis/mesh/member-connectivity.d.ts +43 -0
- package/dist/fea/analysis/mesh/member-connectivity.js +72 -0
- package/dist/fea/analysis/mesh/member-connectivity.js.map +1 -0
- package/dist/fea/analysis/post/envelope.js +70 -0
- package/dist/fea/analysis/post/envelope.js.map +1 -1
- package/dist/fea/analysis/post/present-state.d.ts +8 -1
- package/dist/fea/analysis/post/present-state.js +12 -5
- package/dist/fea/analysis/post/present-state.js.map +1 -1
- package/dist/fea/analysis/post/wall-forces.d.ts +65 -0
- package/dist/fea/analysis/post/wall-forces.js +305 -0
- package/dist/fea/analysis/post/wall-forces.js.map +1 -0
- package/dist/fea/analysis/post/wall-geometry.d.ts +73 -0
- package/dist/fea/analysis/post/wall-geometry.js +188 -0
- package/dist/fea/analysis/post/wall-geometry.js.map +1 -0
- package/dist/fea/analysis/solver/analysis-system.d.ts +1 -1
- package/dist/fea/analysis/solver/analysis-system.js +2 -2
- package/dist/fea/analysis/solver/analysis-system.js.map +1 -1
- package/dist/fea/analysis/solver/analyze.d.ts +12 -3
- package/dist/fea/analysis/solver/analyze.js +21 -5
- package/dist/fea/analysis/solver/analyze.js.map +1 -1
- package/dist/fea/analysis/solver/load-case-solver.d.ts +1 -0
- package/dist/fea/analysis/solver/load-case-solver.js +5 -4
- package/dist/fea/analysis/solver/load-case-solver.js.map +1 -1
- package/dist/fea/analysis/types/model.type.d.ts +58 -1
- package/dist/fea/analysis/types/results.type.d.ts +136 -2
- package/dist/fea/analysis/validation/validate-model.d.ts +1 -1
- package/dist/fea/analysis/validation/validate-model.js +20 -2
- package/dist/fea/analysis/validation/validate-model.js.map +1 -1
- package/dist/fea/analysis/validation/validate-walls.d.ts +35 -0
- package/dist/fea/analysis/validation/validate-walls.js +230 -0
- package/dist/fea/analysis/validation/validate-walls.js.map +1 -0
- package/dist/fea/frame/area/area-geometry.js +5 -5
- package/dist/fea/frame/area/area-geometry.js.map +1 -1
- package/dist/fea/frame/area/area-member-loads.js +7 -7
- package/dist/fea/frame/area/area-member-loads.js.map +1 -1
- package/dist/fea/frame/area/edge-members.js +2 -2
- package/dist/fea/frame/area/edge-members.js.map +1 -1
- package/dist/fea/frame/index.d.ts +1 -1
- package/dist/fea/frame/post/member-diagram.d.ts +14 -5
- package/dist/fea/frame/post/member-diagram.js +18 -5
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/solver/nodes-along-members.d.ts +31 -0
- package/dist/fea/frame/solver/nodes-along-members.js +77 -0
- package/dist/fea/frame/solver/nodes-along-members.js.map +1 -0
- package/dist/fea/frame/solver/system-member.d.ts +6 -5
- package/dist/fea/frame/solver/system-member.js +4 -4
- package/dist/fea/frame/solver/system-member.js.map +1 -1
- package/dist/fea/frame/transformation/coordinate-transform.js +2 -2
- package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +6 -0
- package/dist/fea/frame/types/results.type.d.ts +20 -0
- package/dist/fea/frame/validation/validate-members.d.ts +2 -2
- package/dist/fea/frame/validation/validate-members.js +6 -2
- package/dist/fea/frame/validation/validate-members.js.map +1 -1
- package/dist/fea/frame/validation/validate-null-areas.js +2 -2
- package/dist/fea/frame/validation/validate-null-areas.js.map +1 -1
- package/dist/fea/shared/solver/auto-restraint.js +3 -3
- package/dist/fea/shared/solver/auto-restraint.js.map +1 -1
- package/dist/fea/shared/validation/issues.js +8 -0
- package/dist/fea/shared/validation/issues.js.map +1 -1
- package/dist/fea/shell/elements/membrane-quad.js +2 -2
- package/dist/fea/shell/elements/shell-axes.js +6 -5
- package/dist/fea/shell/elements/shell-axes.js.map +1 -1
- package/dist/fea/shell/index.d.ts +2 -2
- package/dist/fea/shell/mesh/mesh-shells.js +2 -2
- package/dist/fea/shell/mesh/mesh-shells.js.map +1 -1
- package/dist/fea/shell/post/strip-forces.d.ts +69 -0
- package/dist/fea/shell/post/strip-forces.js +349 -0
- package/dist/fea/shell/post/strip-forces.js.map +1 -0
- package/dist/fea/shell/solver/shell-loads.d.ts +3 -1
- package/dist/fea/shell/solver/shell-loads.js +3 -0
- package/dist/fea/shell/solver/shell-loads.js.map +1 -1
- package/dist/fea/shell/types/model.type.d.ts +31 -0
- package/dist/fea/shell/types/results.type.d.ts +54 -0
- package/dist/fea/shell/validation/validate-shells.d.ts +7 -2
- package/dist/fea/shell/validation/validate-shells.js +9 -2
- package/dist/fea/shell/validation/validate-shells.js.map +1 -1
- package/dist/fea/shell/validation/validate-strips.d.ts +11 -0
- package/dist/fea/shell/validation/validate-strips.js +103 -0
- package/dist/fea/shell/validation/validate-strips.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/rc/rc-section-properties.js +4 -4
- package/dist/rc/rc-section-properties.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { AREA_GEOMETRY_TOLERANCE } from "../../../core/constants/fea.constant.js";
|
|
2
|
+
import { FeaErrors } from "../../../core/errors/fea.error.js";
|
|
3
|
+
import { isFiniteNumber, modelIssue } from "../../shared/validation/issues.js";
|
|
4
|
+
/**
|
|
5
|
+
* Checks the model's strips: unique ids, finite points, widths, normal and spacing, and the
|
|
6
|
+
* geometry (at least 2 points in one plane normal to `normal`, no zero-length segment, no
|
|
7
|
+
* segment turning straight back, widths not negative and not both 0).
|
|
8
|
+
*
|
|
9
|
+
* @param strips - The model's strips
|
|
10
|
+
* @returns Every problem found (codes 303, 314 and 330), in model order, with `stripId`
|
|
11
|
+
*/
|
|
12
|
+
export const validateStrips = (strips) => {
|
|
13
|
+
const issues = [];
|
|
14
|
+
const add = (std, details) => issues.push(modelIssue(std, details));
|
|
15
|
+
const ids = strips.map((s) => s.id);
|
|
16
|
+
for (const stripId of new Set(ids.filter((id, i) => ids.indexOf(id) !== i))) {
|
|
17
|
+
add(FeaErrors.DUPLICATE_ID, { stripId, field: "id" });
|
|
18
|
+
}
|
|
19
|
+
for (const strip of strips) {
|
|
20
|
+
const at = { stripId: strip.id };
|
|
21
|
+
let pointsOk = true;
|
|
22
|
+
const points = strip.points;
|
|
23
|
+
if (!Array.isArray(points) || points.length < 2) {
|
|
24
|
+
add(FeaErrors.INVALID_STRIP_GEOMETRY, { ...at, field: "points" });
|
|
25
|
+
pointsOk = false;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
points.forEach((p, i) => {
|
|
29
|
+
for (const key of ["x", "y", "z"]) {
|
|
30
|
+
const value = p?.[key];
|
|
31
|
+
if (!isFiniteNumber(value)) {
|
|
32
|
+
add(FeaErrors.INVALID_INPUT_VALUE, { ...at, field: `points[${i}].${key}` });
|
|
33
|
+
pointsOk = false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
let normal = [0, 0, 1];
|
|
39
|
+
const given = strip.normal;
|
|
40
|
+
if (given !== undefined) {
|
|
41
|
+
if (!Array.isArray(given) || given.length !== 3 || !given.every(isFiniteNumber)) {
|
|
42
|
+
add(FeaErrors.INVALID_INPUT_VALUE, { ...at, field: "normal" });
|
|
43
|
+
normal = undefined;
|
|
44
|
+
}
|
|
45
|
+
else if (Math.hypot(given[0], given[1], given[2]) === 0) {
|
|
46
|
+
add(FeaErrors.INVALID_STRIP_GEOMETRY, { ...at, field: "normal" });
|
|
47
|
+
normal = undefined;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
normal = given;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
let widthsOk = true;
|
|
54
|
+
for (const field of ["widthLeft", "widthRight"]) {
|
|
55
|
+
const value = strip[field];
|
|
56
|
+
if (!isFiniteNumber(value)) {
|
|
57
|
+
add(FeaErrors.INVALID_INPUT_VALUE, { ...at, field });
|
|
58
|
+
widthsOk = false;
|
|
59
|
+
}
|
|
60
|
+
else if (value < 0) {
|
|
61
|
+
add(FeaErrors.INVALID_STRIP_GEOMETRY, { ...at, field });
|
|
62
|
+
widthsOk = false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (widthsOk && strip.widthLeft + strip.widthRight === 0) {
|
|
66
|
+
add(FeaErrors.INVALID_STRIP_GEOMETRY, { ...at, field: "widthLeft" });
|
|
67
|
+
}
|
|
68
|
+
const spacing = strip.maxSpacing;
|
|
69
|
+
if (spacing !== undefined && !(isFiniteNumber(spacing) && spacing > 0)) {
|
|
70
|
+
add(FeaErrors.INVALID_INPUT_VALUE, { ...at, field: "maxSpacing" });
|
|
71
|
+
}
|
|
72
|
+
if (!pointsOk || !normal)
|
|
73
|
+
continue;
|
|
74
|
+
const length = Math.hypot(normal[0], normal[1], normal[2]);
|
|
75
|
+
const n = normal.map((c) => c / length);
|
|
76
|
+
const xyz = strip.points.map((p) => [p.x, p.y, p.z]);
|
|
77
|
+
const along = xyz.slice(1).map((q, i) => {
|
|
78
|
+
const d = [0, 1, 2].map((k) => q[k] - xyz[i][k]);
|
|
79
|
+
const out = d[0] * n[0] + d[1] * n[1] + d[2] * n[2];
|
|
80
|
+
return [d[0] - out * n[0], d[1] - out * n[1], d[2] - out * n[2]];
|
|
81
|
+
});
|
|
82
|
+
const lengths = along.map((d) => Math.hypot(d[0], d[1], d[2]));
|
|
83
|
+
const total = lengths.reduce((sum, l) => sum + l, 0);
|
|
84
|
+
const tolerance = AREA_GEOMETRY_TOLERANCE * total;
|
|
85
|
+
const offPlane = xyz.some((p) => Math.abs((p[0] - xyz[0][0]) * n[0] + (p[1] - xyz[0][1]) * n[1] + (p[2] - xyz[0][2]) * n[2]) > tolerance);
|
|
86
|
+
const zeroSegment = lengths.some((l) => !(l > tolerance));
|
|
87
|
+
const foldsBack = !zeroSegment &&
|
|
88
|
+
along.slice(1).some((d, i) => {
|
|
89
|
+
const e = along[i];
|
|
90
|
+
const cos = (d[0] * e[0] + d[1] * e[1] + d[2] * e[2]) / (lengths[i] * lengths[i + 1]);
|
|
91
|
+
return cos <= -1 + AREA_GEOMETRY_TOLERANCE;
|
|
92
|
+
});
|
|
93
|
+
if (offPlane || zeroSegment || foldsBack) {
|
|
94
|
+
add(FeaErrors.INVALID_STRIP_GEOMETRY, { ...at, field: "points" });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return issues;
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=validate-strips.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-strips.js","sourceRoot":"","sources":["../../../../../src/fea/shell/validation/validate-strips.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// RC Beam Design
|
|
2
2
|
export { rectBeamMomentCapacity, rectBeamBarLayout, concreteShearCapacity, stirrupShearCapacity, checkStirrupRequirement, concreteBeta, concreteElasticModulus, psiToMpa, rectBeamToSectionProperties, } from "./rc/index.js";
|
|
3
3
|
// FEA — frame and shell analysis
|
|
4
|
-
export { analyze, createAnalysis, validateModel, distributeAreaLoads, beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, memberAxes, memberDemandEnvelope, } from "./fea/index.js";
|
|
4
|
+
export { analyze, createAnalysis, validateModel, distributeAreaLoads, beam3dLocalStiffness, beam3dLocalStiffnessRightHanded, memberAxes, memberDemandEnvelope, memberConnectivity, } from "./fea/index.js";
|
|
5
5
|
// Deprecated FEA names, removed in 4.0.0
|
|
6
6
|
export { analyzeFrame, createFrameAnalysis, validateFrameModel } from "./fea/index.js";
|
|
7
7
|
// Strengthening
|
|
8
8
|
export { calculateSteelJacketedBeamMomentCapacity, plateInterfaceShearFlow, boltShearCapacity, plateInterfaceBoltRequirement, sidePlateShearCapacityByWebYielding, sidePlateShearCapacityByTensionTie, compareSidePlateShearCapacity, } from "./strengthening/index.js";
|
|
9
|
-
export { isSinglyReinforced, hasTopPlate, hasBottomPlate, hasSidePlate, FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, AREA_GEOMETRY_TOLERANCE, SHELL_WARPING_LIMIT, RCDesignError, Errors, FeaError, FeaErrors, FrameAnalysisError, FrameErrors, } from "./core/index.js";
|
|
9
|
+
export { isSinglyReinforced, hasTopPlate, hasBottomPlate, hasSidePlate, FLEXURAL_STRENGTH_REDUCTION_FACTOR, CONCRETE_ULTIMATE_STRAIN, SHEAR_STRENGTH_REDUCTION_FACTOR, ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR, MAX_PLATE_BOLT_SPACING, PLATE_SHEAR_YIELD_COEFFICIENT, SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT, SIDE_PLATE_REDUCTION_FACTOR_PSI, CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, AREA_GEOMETRY_TOLERANCE, WALL_VERTICAL_TOLERANCE, WALL_CUT_TOLERANCE, SHELL_WARPING_LIMIT, STRIP_PLANE_TOLERANCE, STRIP_DEFAULT_DIVISIONS, NODE_NEAR_MEMBER_RATIO, NODE_NEAR_MEMBER_MAX_DISTANCE, RCDesignError, Errors, FeaError, FeaErrors, FrameAnalysisError, FrameErrors, } from "./core/index.js";
|
|
10
10
|
// Utilities
|
|
11
11
|
export { solveQuadratic, roundToDecimalPlaces, mergeWarnings, zeros, identity, transpose, matMul, matVec, choleskyFactor, choleskySolveFactored, choleskySolve, solveLinearSystem, createSkyline, skylineAdd, skylineGet, skylineSize, skylineFactor, skylineSolve, reverseCuthillMcKee, } from "./utils/index.js";
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EACtB,QAAQ,EACR,2BAA2B,GAC5B,MAAM,MAAM,CAAC;AAGd,iCAAiC;AACjC,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,+BAA+B,EAC/B,UAAU,EACV,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AACjB,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,YAAY,EACZ,sBAAsB,EACtB,QAAQ,EACR,2BAA2B,GAC5B,MAAM,MAAM,CAAC;AAGd,iCAAiC;AACjC,OAAO,EACL,OAAO,EACP,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,+BAA+B,EAC/B,UAAU,EACV,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,OAAO,CAAC;AAgFf,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAa9E,gBAAgB;AAChB,OAAO,EACL,wCAAwC,EACxC,uBAAuB,EACvB,iBAAiB,EACjB,6BAA6B,EAC7B,mCAAmC,EACnC,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AA8BzB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,kCAAkC,EAClC,wBAAwB,EACxB,+BAA+B,EAC/B,sCAAsC,EACtC,sBAAsB,EACtB,6BAA6B,EAC7B,iCAAiC,EACjC,+BAA+B,EAC/B,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,6BAA6B,EAC7B,aAAa,EACb,MAAM,EACN,QAAQ,EACR,SAAS,EACT,kBAAkB,EAClB,WAAW,GACZ,MAAM,QAAQ,CAAC;AAEhB,YAAY;AACZ,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,aAAa,EACb,KAAK,EACL,QAAQ,EACR,SAAS,EACT,MAAM,EACN,MAAM,EACN,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,mBAAmB,GACpB,MAAM,SAAS,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, } from "../core/constants/
|
|
1
|
+
import { BEAM_INERTIA_MODIFIER, COLUMN_INERTIA_MODIFIER, CONCRETE_POISSON_RATIO, CONCRETE_UNIT_WEIGHT, } from "../core/constants/rc.constant.js";
|
|
2
2
|
import { concreteElasticModulus } from "./general.js";
|
|
3
3
|
/**
|
|
4
4
|
* Saint-Venant torsion constant of a solid rectangle:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc-section-properties.js","sourceRoot":"","sources":["../../../src/rc/rc-section-properties.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,
|
|
1
|
+
{"version":3,"file":"rc-section-properties.js","sourceRoot":"","sources":["../../../src/rc/rc-section-properties.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAanD;;;GAGG;AACH,MAAM,wBAAwB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;IAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,OAAiD,EACjD,UAAoC,EAAE,EACtC,EAAE;IACF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACxC,MAAM,QAAQ,GACZ,OAAO,CAAC,eAAe;QACvB,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,IAAI,sBAAsB,CAAC;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,oBAAoB,CAAC;IAC9D,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;IAE9B,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,sBAAsB;YACjC,OAAO,EACL,+IAA+I;SAClJ,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,iBAAiB,GAAsB;QAC3C,CAAC;QACD,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACrB,CAAC,EAAE,CAAC,GAAG,CAAC;QACR,GAAG,EAAE,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;QACjC,GAAG,EAAE,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE;QACjC,CAAC,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;QACjC,UAAU;KACX,CAAC;IAEF,OAAO;QACL,iBAAiB;QACjB,kBAAkB,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE;QAC/E,IAAI,EAAE,YAAY;QAClB,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -3,6 +3,8 @@ export type { AnalyzeOptions, Analysis } from "./solver/analyze";
|
|
|
3
3
|
export { validateModel } from "./validation/validate-model";
|
|
4
4
|
export { distributeAreaLoads } from "./solver/distribute-area-loads";
|
|
5
5
|
export { memberDemandEnvelope } from "./post/demand-envelope";
|
|
6
|
+
export { memberConnectivity } from "./mesh/member-connectivity";
|
|
7
|
+
export type { MemberConnectivity } from "./mesh/member-connectivity";
|
|
6
8
|
export type { MemberDemandEnvelope, DemandEnvelopeOptions } from "./post/demand-envelope";
|
|
7
|
-
export type { LineRestraint, NodalLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, FeaModel, } from "./types/model.type";
|
|
8
|
-
export type { NodalDisplacement, NodalReaction, AutoRestrainedDof, GoverningValue, GoverningExtremeValue, Bound, FeaCaseResult, FeaEnvelope, FeaResult, } from "./types/results.type";
|
|
9
|
+
export type { LineRestraint, NodalLoad, LoadCaseType, LoadCase, CombinationTerm, LoadCombination, WallPier, WallSpandrel, FeaModel, } from "./types/model.type";
|
|
10
|
+
export type { NodalDisplacement, NodalReaction, AutoRestrainedDof, GoverningValue, GoverningExtremeValue, Bound, FeaCaseResult, FeaEnvelope, FeaResult, WallResultants, WallForceComponent, WallSectionLeg, WallSectionMember, WallCutSection, PierCutFace, PierCut, PierForces, SpandrelCutFace, SpandrelCut, SpandrelForces, } from "./types/results.type";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.memberDemandEnvelope = exports.distributeAreaLoads = exports.validateModel = exports.createAnalysis = exports.analyze = void 0;
|
|
3
|
+
exports.memberConnectivity = exports.memberDemandEnvelope = exports.distributeAreaLoads = exports.validateModel = exports.createAnalysis = exports.analyze = void 0;
|
|
4
4
|
// Analysis of the whole model: members and shells together
|
|
5
5
|
var analyze_1 = require("./solver/analyze");
|
|
6
6
|
Object.defineProperty(exports, "analyze", { enumerable: true, get: function () { return analyze_1.analyze; } });
|
|
@@ -11,4 +11,6 @@ var distribute_area_loads_1 = require("./solver/distribute-area-loads");
|
|
|
11
11
|
Object.defineProperty(exports, "distributeAreaLoads", { enumerable: true, get: function () { return distribute_area_loads_1.distributeAreaLoads; } });
|
|
12
12
|
var demand_envelope_1 = require("./post/demand-envelope");
|
|
13
13
|
Object.defineProperty(exports, "memberDemandEnvelope", { enumerable: true, get: function () { return demand_envelope_1.memberDemandEnvelope; } });
|
|
14
|
+
var member_connectivity_1 = require("./mesh/member-connectivity");
|
|
15
|
+
Object.defineProperty(exports, "memberConnectivity", { enumerable: true, get: function () { return member_connectivity_1.memberConnectivity; } });
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fea/analysis/index.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC3D,4CAA2D;AAAlD,kGAAA,OAAO,OAAA;AAAE,yGAAA,cAAc,OAAA;AAEhC,8DAA4D;AAAnD,+GAAA,aAAa,OAAA;AACtB,wEAAqE;AAA5D,4HAAA,mBAAmB,OAAA;AAC5B,0DAA8D;AAArD,uHAAA,oBAAoB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/fea/analysis/index.ts"],"names":[],"mappings":";;;AAAA,2DAA2D;AAC3D,4CAA2D;AAAlD,kGAAA,OAAO,OAAA;AAAE,yGAAA,cAAc,OAAA;AAEhC,8DAA4D;AAAnD,+GAAA,aAAa,OAAA;AACtB,wEAAqE;AAA5D,4HAAA,mBAAmB,OAAA;AAC5B,0DAA8D;AAArD,uHAAA,oBAAoB,OAAA;AAC7B,kEAAgE;AAAvD,yHAAA,kBAAkB,OAAA"}
|
|
@@ -4,16 +4,17 @@ import type { FeaId } from "../../shared/types/model.type";
|
|
|
4
4
|
import { type ShellElement } from "../../shell/mesh/mesh-shells";
|
|
5
5
|
import type { FeaMesh } from "../../shell/types/results.type";
|
|
6
6
|
import type { FeaModel } from "../types/model.type";
|
|
7
|
-
|
|
7
|
+
import { type MemberConnectivity } from "./member-connectivity";
|
|
8
|
+
/** A member with the nodes lying inside it, where the solver splits it. */
|
|
8
9
|
export interface SplitMember extends Member {
|
|
9
|
-
/**
|
|
10
|
+
/** Model and generated node ids strictly between its ends, in order from the start. */
|
|
10
11
|
through?: FeaId[];
|
|
11
12
|
}
|
|
12
13
|
/** The model the solver analyses: shells meshed, line restraints spread to their nodes. */
|
|
13
14
|
export interface ExpandedModel {
|
|
14
15
|
/**
|
|
15
|
-
* Nodes include the generated ones; `shells` are the elements; members list the
|
|
16
|
-
*
|
|
16
|
+
* Nodes include the generated ones; `shells` are the elements; members list the nodes they
|
|
17
|
+
* pass through; restraints include the lines.
|
|
17
18
|
*/
|
|
18
19
|
model: FeaModel & {
|
|
19
20
|
shells: ShellElement[];
|
|
@@ -21,11 +22,13 @@ export interface ExpandedModel {
|
|
|
21
22
|
};
|
|
22
23
|
/** The shell mesh for the result; undefined without shells. */
|
|
23
24
|
mesh: FeaMesh | undefined;
|
|
25
|
+
/** Model nodes connected to members, and those that just miss one (see `memberConnectivity`). */
|
|
26
|
+
connectivity: MemberConnectivity;
|
|
24
27
|
warnings: Warnings;
|
|
25
28
|
}
|
|
26
29
|
/**
|
|
27
|
-
* Meshes a valid model's shell areas, spreads its line restraints and marks
|
|
28
|
-
* generated nodes
|
|
29
|
-
*
|
|
30
|
+
* Meshes a valid model's shell areas, spreads its line restraints and marks where each member
|
|
31
|
+
* is split: at the generated mesh nodes and at the model nodes on it (see `meshShells` and
|
|
32
|
+
* `splitMembers`).
|
|
30
33
|
*/
|
|
31
34
|
export declare const expandModel: (model: FeaModel) => ExpandedModel;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.expandModel = void 0;
|
|
4
|
-
const
|
|
4
|
+
const fea_constant_1 = require("../../../core/constants/fea.constant");
|
|
5
|
+
const nodes_along_members_1 = require("../../frame/solver/nodes-along-members");
|
|
5
6
|
const shell_axes_1 = require("../../shell/elements/shell-axes");
|
|
6
7
|
const mesh_shells_1 = require("../../shell/mesh/mesh-shells");
|
|
8
|
+
const member_connectivity_1 = require("./member-connectivity");
|
|
7
9
|
const DOF_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
8
10
|
/**
|
|
9
11
|
* Restraints of every node on each line restraint's segment (ends included), merged with the
|
|
@@ -44,7 +46,7 @@ const disconnectedNodes = (model, meshNodes) => {
|
|
|
44
46
|
const points = shell.nodeIds.map((id) => position.get(id));
|
|
45
47
|
const axes = (0, shell_axes_1.shellAxes)(points);
|
|
46
48
|
const size = Math.max(...axes.corners.map(([x, y]) => Math.hypot(x, y)));
|
|
47
|
-
const tolerance =
|
|
49
|
+
const tolerance = fea_constant_1.AREA_GEOMETRY_TOLERANCE * size;
|
|
48
50
|
for (const id of memberNodes) {
|
|
49
51
|
if (meshNodes.has(id))
|
|
50
52
|
continue;
|
|
@@ -71,68 +73,49 @@ const disconnectedNodes = (model, meshNodes) => {
|
|
|
71
73
|
return warnings;
|
|
72
74
|
};
|
|
73
75
|
/**
|
|
74
|
-
* The
|
|
75
|
-
*
|
|
76
|
+
* The nodes lying strictly inside each member, where the solver splits it: the generated mesh
|
|
77
|
+
* nodes (a beam along a meshed edge, so it shares them with the shells) and the model nodes it
|
|
78
|
+
* connects to (see `findMemberConnectivity`).
|
|
76
79
|
*/
|
|
77
80
|
const splitMembers = (model, generated) => {
|
|
78
81
|
const members = model.members ?? [];
|
|
79
|
-
|
|
80
|
-
return members;
|
|
82
|
+
const { connected, connectivity } = (0, member_connectivity_1.findMemberConnectivity)(model);
|
|
81
83
|
const position = new Map(model.nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
const slack = frame_constant_1.AREA_GEOMETRY_TOLERANCE * Math.hypot(Q[0] - P[0], Q[1] - P[1], Q[2] - P[2]);
|
|
87
|
-
const through = [];
|
|
88
|
-
for (const node of generated) {
|
|
89
|
-
const x = [node.x, node.y, node.z];
|
|
90
|
-
if (x.some((v, k) => v < lo[k] - slack || v > hi[k] + slack))
|
|
91
|
-
continue;
|
|
92
|
-
const t = (0, mesh_shells_1.pointOnSegment)(x, P, Q);
|
|
93
|
-
if (t !== null)
|
|
94
|
-
through.push({ id: node.id, t });
|
|
95
|
-
}
|
|
96
|
-
return through.length === 0
|
|
97
|
-
? member
|
|
98
|
-
: { ...member, through: through.sort((a, b) => a.t - b.t).map((h) => h.id) };
|
|
84
|
+
const meshed = (0, nodes_along_members_1.nodesAlongMembers)(members, (id) => position.get(id), generated, (_, L) => fea_constant_1.AREA_GEOMETRY_TOLERANCE * L);
|
|
85
|
+
const split = members.map((member, i) => {
|
|
86
|
+
const through = [...connected[i], ...meshed[i]].sort((a, b) => a.x - b.x).map((h) => h.nodeId);
|
|
87
|
+
return through.length === 0 ? member : { ...member, through };
|
|
99
88
|
});
|
|
89
|
+
return { members: split, connectivity };
|
|
100
90
|
};
|
|
101
91
|
/**
|
|
102
|
-
* Meshes a valid model's shell areas, spreads its line restraints and marks
|
|
103
|
-
* generated nodes
|
|
104
|
-
*
|
|
92
|
+
* Meshes a valid model's shell areas, spreads its line restraints and marks where each member
|
|
93
|
+
* is split: at the generated mesh nodes and at the model nodes on it (see `meshShells` and
|
|
94
|
+
* `splitMembers`).
|
|
105
95
|
*/
|
|
106
96
|
const expandModel = (model) => {
|
|
107
97
|
const shells = model.shells ?? [];
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
members: model.members ?? [],
|
|
113
|
-
shells: [],
|
|
114
|
-
restraints: spreadLineRestraints(model, model.nodes),
|
|
115
|
-
},
|
|
116
|
-
mesh: undefined,
|
|
117
|
-
warnings: [],
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
const meshed = (0, mesh_shells_1.meshShells)(model.nodes, shells);
|
|
121
|
-
const nodes = [...model.nodes, ...meshed.nodes];
|
|
122
|
-
const meshNodes = new Set(meshed.elements.flatMap((e) => e.nodeIds));
|
|
98
|
+
const meshed = shells.length > 0 ? (0, mesh_shells_1.meshShells)(model.nodes, shells) : undefined;
|
|
99
|
+
const nodes = meshed ? [...model.nodes, ...meshed.nodes] : model.nodes;
|
|
100
|
+
const split = splitMembers(model, meshed?.nodes ?? []);
|
|
101
|
+
const meshNodes = new Set(meshed?.elements.flatMap((e) => e.nodeIds));
|
|
123
102
|
return {
|
|
124
103
|
model: {
|
|
125
104
|
...model,
|
|
126
105
|
nodes,
|
|
127
|
-
members:
|
|
128
|
-
shells: meshed
|
|
106
|
+
members: split.members,
|
|
107
|
+
shells: meshed?.elements ?? [],
|
|
129
108
|
restraints: spreadLineRestraints(model, nodes),
|
|
130
109
|
},
|
|
131
|
-
mesh: {
|
|
110
|
+
mesh: meshed && {
|
|
132
111
|
nodes: meshed.nodes,
|
|
133
112
|
shells: meshed.elements.map(({ id, areaId, nodeIds }) => ({ id, areaId, nodeIds })),
|
|
134
113
|
},
|
|
135
|
-
|
|
114
|
+
connectivity: split.connectivity,
|
|
115
|
+
warnings: [
|
|
116
|
+
...split.connectivity.warnings,
|
|
117
|
+
...(meshed ? disconnectedNodes(model, meshNodes) : []),
|
|
118
|
+
],
|
|
136
119
|
};
|
|
137
120
|
};
|
|
138
121
|
exports.expandModel = expandModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expand-model.js","sourceRoot":"","sources":["../../../../src/fea/analysis/mesh/expand-model.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"expand-model.js","sourceRoot":"","sources":["../../../../src/fea/analysis/mesh/expand-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Warnings } from "../../../core/types/output-message.type";
|
|
2
|
+
import { type NodeAlongMember } from "../../frame/solver/nodes-along-members";
|
|
3
|
+
import type { MemberIntermediateNode, MemberNearMissNode } from "../../frame/types/results.type";
|
|
4
|
+
import type { FeaModel } from "../types/model.type";
|
|
5
|
+
/** How the members of a model connect to the model nodes lying on or near them. */
|
|
6
|
+
export interface MemberConnectivity {
|
|
7
|
+
/** Model nodes on a member between its ends, connected to it; member by member from its start. */
|
|
8
|
+
intermediateNodes: MemberIntermediateNode[];
|
|
9
|
+
/** Model nodes close to a member but not on it, so not connected; in the same order. */
|
|
10
|
+
nearMissNodes: MemberNearMissNode[];
|
|
11
|
+
/** One "Member connectivity" warning per near miss. */
|
|
12
|
+
warnings: Warnings;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The connectivity of a model's members, and for each member the model nodes it connects to
|
|
16
|
+
* (unrounded, in order from its start), which is where the solver splits it. Members with an
|
|
17
|
+
* unknown or invalid end node or zero length, and nodes with invalid coordinates, are skipped,
|
|
18
|
+
* so a model that is still being edited can be checked.
|
|
19
|
+
*/
|
|
20
|
+
export declare const findMemberConnectivity: (model: FeaModel) => {
|
|
21
|
+
connected: NodeAlongMember[][];
|
|
22
|
+
connectivity: MemberConnectivity;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Finds how a model's members connect to the model nodes lying on or near them, without
|
|
26
|
+
* analysing it: the same check `analyze` makes, cheap enough to run on every edit so a
|
|
27
|
+
* frontend can mark the points while the user draws (`analyze` cannot report them when the
|
|
28
|
+
* model is unstable).
|
|
29
|
+
*
|
|
30
|
+
* - A model node within `AREA_GEOMETRY_TOLERANCE` × the member length of a member's axis,
|
|
31
|
+
* strictly between its ends, is connected to it: listed in `intermediateNodes`.
|
|
32
|
+
* - A model node further off, but within `NODE_NEAR_MEMBER_RATIO` × the length and at most
|
|
33
|
+
* `NODE_NEAR_MEMBER_MAX_DISTANCE`, is not connected: listed in `nearMissNodes`, with a
|
|
34
|
+
* warning.
|
|
35
|
+
*
|
|
36
|
+
* Members with `connectIntermediateNodes: false` are skipped. The model need not be valid:
|
|
37
|
+
* members with an unknown or invalid end node or zero length, and nodes with invalid
|
|
38
|
+
* coordinates, are skipped (`validateModel` reports them). Shell-mesh nodes are not included.
|
|
39
|
+
*
|
|
40
|
+
* @param model - The model; only its nodes and members are used
|
|
41
|
+
* @returns `intermediateNodes`, `nearMissNodes` (positions and distances in mm) and `warnings`
|
|
42
|
+
*/
|
|
43
|
+
export declare const memberConnectivity: (model: FeaModel) => MemberConnectivity;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.memberConnectivity = exports.findMemberConnectivity = void 0;
|
|
4
|
+
const fea_constant_1 = require("../../../core/constants/fea.constant");
|
|
5
|
+
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
6
|
+
const nodes_along_members_1 = require("../../frame/solver/nodes-along-members");
|
|
7
|
+
const issues_1 = require("../../shared/validation/issues");
|
|
8
|
+
const math_1 = require("../../../utils/math");
|
|
9
|
+
/** Near-miss distance (mm) for a member of length `L`: see `NODE_NEAR_MEMBER_RATIO`. */
|
|
10
|
+
const nearMissDistance = (L) => Math.min(frame_constant_1.NODE_NEAR_MEMBER_RATIO * L, frame_constant_1.NODE_NEAR_MEMBER_MAX_DISTANCE);
|
|
11
|
+
/** Formats a distance in mm for a warning, to three significant figures. */
|
|
12
|
+
const formatMm = (v) => String(Number(v.toPrecision(3)));
|
|
13
|
+
const NOWHERE = [Number.NaN, Number.NaN, Number.NaN];
|
|
14
|
+
/**
|
|
15
|
+
* The connectivity of a model's members, and for each member the model nodes it connects to
|
|
16
|
+
* (unrounded, in order from its start), which is where the solver splits it. Members with an
|
|
17
|
+
* unknown or invalid end node or zero length, and nodes with invalid coordinates, are skipped,
|
|
18
|
+
* so a model that is still being edited can be checked.
|
|
19
|
+
*/
|
|
20
|
+
const findMemberConnectivity = (model) => {
|
|
21
|
+
const members = model.members ?? [];
|
|
22
|
+
const nodes = (model.nodes ?? []).filter((n) => (0, issues_1.isFiniteNumber)(n.x) && (0, issues_1.isFiniteNumber)(n.y) && (0, issues_1.isFiniteNumber)(n.z));
|
|
23
|
+
const position = new Map(nodes.map((n) => [n.id, [n.x, n.y, n.z]]));
|
|
24
|
+
// an unknown end gives a NaN length, which skips the member
|
|
25
|
+
const found = (0, nodes_along_members_1.nodesAlongMembers)(members, (id) => position.get(id) ?? NOWHERE, nodes, (member, L) => member.connectIntermediateNodes === false
|
|
26
|
+
? null
|
|
27
|
+
: Math.max(fea_constant_1.AREA_GEOMETRY_TOLERANCE * L, nearMissDistance(L)));
|
|
28
|
+
const intermediateNodes = [];
|
|
29
|
+
const nearMissNodes = [];
|
|
30
|
+
const warnings = [];
|
|
31
|
+
members.forEach((member, i) => {
|
|
32
|
+
for (const h of found[i]) {
|
|
33
|
+
const at = { memberId: member.id, nodeId: h.nodeId, x: (0, math_1.roundToDecimalPlaces)(h.x, 3) };
|
|
34
|
+
if (h.on) {
|
|
35
|
+
intermediateNodes.push(at);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
nearMissNodes.push({ ...at, distance: (0, math_1.roundToDecimalPlaces)(h.distance, 3) });
|
|
39
|
+
warnings.push({
|
|
40
|
+
reference: "Member connectivity",
|
|
41
|
+
message: `Node "${String(h.nodeId)}" is ${formatMm(h.distance)} mm from member "${String(member.id)}" (${formatMm(h.x)} mm from its start) but not on it, so it is not connected to the member; move the node onto the member if they should be connected.`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
connected: found.map((hits) => hits.filter((h) => h.on)),
|
|
47
|
+
connectivity: { intermediateNodes, nearMissNodes, warnings },
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
exports.findMemberConnectivity = findMemberConnectivity;
|
|
51
|
+
/**
|
|
52
|
+
* Finds how a model's members connect to the model nodes lying on or near them, without
|
|
53
|
+
* analysing it: the same check `analyze` makes, cheap enough to run on every edit so a
|
|
54
|
+
* frontend can mark the points while the user draws (`analyze` cannot report them when the
|
|
55
|
+
* model is unstable).
|
|
56
|
+
*
|
|
57
|
+
* - A model node within `AREA_GEOMETRY_TOLERANCE` × the member length of a member's axis,
|
|
58
|
+
* strictly between its ends, is connected to it: listed in `intermediateNodes`.
|
|
59
|
+
* - A model node further off, but within `NODE_NEAR_MEMBER_RATIO` × the length and at most
|
|
60
|
+
* `NODE_NEAR_MEMBER_MAX_DISTANCE`, is not connected: listed in `nearMissNodes`, with a
|
|
61
|
+
* warning.
|
|
62
|
+
*
|
|
63
|
+
* Members with `connectIntermediateNodes: false` are skipped. The model need not be valid:
|
|
64
|
+
* members with an unknown or invalid end node or zero length, and nodes with invalid
|
|
65
|
+
* coordinates, are skipped (`validateModel` reports them). Shell-mesh nodes are not included.
|
|
66
|
+
*
|
|
67
|
+
* @param model - The model; only its nodes and members are used
|
|
68
|
+
* @returns `intermediateNodes`, `nearMissNodes` (positions and distances in mm) and `warnings`
|
|
69
|
+
*/
|
|
70
|
+
const memberConnectivity = (model) => (0, exports.findMemberConnectivity)(model).connectivity;
|
|
71
|
+
exports.memberConnectivity = memberConnectivity;
|
|
72
|
+
//# sourceMappingURL=member-connectivity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-connectivity.js","sourceRoot":"","sources":["../../../../src/fea/analysis/mesh/member-connectivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildEnvelope = void 0;
|
|
4
|
+
const strip_forces_1 = require("../../shell/post/strip-forces");
|
|
5
|
+
const wall_forces_1 = require("./wall-forces");
|
|
4
6
|
const DISPLACEMENT_KEYS = ["ux", "uy", "uz", "rx", "ry", "rz"];
|
|
5
7
|
const REACTION_KEYS = ["fx", "fy", "fz", "mx", "my", "mz"];
|
|
6
8
|
const COMPONENTS = ["N", "V2", "V3", "T", "M2", "M3", "u1", "u2", "u3"];
|
|
@@ -88,12 +90,80 @@ const buildEnvelope = (results) => {
|
|
|
88
90
|
return entry;
|
|
89
91
|
}),
|
|
90
92
|
}));
|
|
93
|
+
const strips = first.stripForces.map((strip, s) => ({
|
|
94
|
+
stripId: strip.stripId,
|
|
95
|
+
stations: strip.stations.map((station, i) => {
|
|
96
|
+
const entry = {
|
|
97
|
+
x: station.x,
|
|
98
|
+
segment: station.segment,
|
|
99
|
+
perWidth: {},
|
|
100
|
+
};
|
|
101
|
+
for (const key of strip_forces_1.STRIP_COMPONENTS) {
|
|
102
|
+
let total;
|
|
103
|
+
let perWidth;
|
|
104
|
+
for (const r of results) {
|
|
105
|
+
const at = r.stripForces[s].stations[i];
|
|
106
|
+
const g = { value: at[key], combinationId: r.id };
|
|
107
|
+
const w = { value: at.perWidth[key], combinationId: r.id };
|
|
108
|
+
total = update(total, g, g);
|
|
109
|
+
perWidth = update(perWidth, w, w);
|
|
110
|
+
}
|
|
111
|
+
entry[key] = total;
|
|
112
|
+
entry.perWidth[key] = perWidth;
|
|
113
|
+
}
|
|
114
|
+
return entry;
|
|
115
|
+
}),
|
|
116
|
+
extremes: Object.fromEntries(strip_forces_1.STRIP_COMPONENTS.map((key) => {
|
|
117
|
+
let bound;
|
|
118
|
+
for (const r of results) {
|
|
119
|
+
const e = r.stripForces[s].extremes[key];
|
|
120
|
+
bound = update(bound, { ...e.max, combinationId: r.id }, { ...e.min, combinationId: r.id });
|
|
121
|
+
}
|
|
122
|
+
return [key, bound];
|
|
123
|
+
})),
|
|
124
|
+
}));
|
|
125
|
+
const piers = first.pierForces.map((pier, p) => ({
|
|
126
|
+
pierId: pier.pierId,
|
|
127
|
+
cuts: pier.cuts.map((cut, i) => {
|
|
128
|
+
const entry = { z: cut.z, face: cut.face };
|
|
129
|
+
for (const key of wall_forces_1.WALL_COMPONENTS) {
|
|
130
|
+
let bound;
|
|
131
|
+
for (const r of results) {
|
|
132
|
+
const g = { value: r.pierForces[p].cuts[i][key], combinationId: r.id };
|
|
133
|
+
bound = update(bound, g, g);
|
|
134
|
+
}
|
|
135
|
+
entry[key] = bound;
|
|
136
|
+
}
|
|
137
|
+
return entry;
|
|
138
|
+
}),
|
|
139
|
+
}));
|
|
140
|
+
const spandrels = first.spandrelForces.map((spandrel, p) => ({
|
|
141
|
+
spandrelId: spandrel.spandrelId,
|
|
142
|
+
cuts: spandrel.cuts.map((cut, i) => {
|
|
143
|
+
const entry = {
|
|
144
|
+
x: cut.x,
|
|
145
|
+
face: cut.face,
|
|
146
|
+
};
|
|
147
|
+
for (const key of wall_forces_1.WALL_COMPONENTS) {
|
|
148
|
+
let bound;
|
|
149
|
+
for (const r of results) {
|
|
150
|
+
const g = { value: r.spandrelForces[p].cuts[i][key], combinationId: r.id };
|
|
151
|
+
bound = update(bound, g, g);
|
|
152
|
+
}
|
|
153
|
+
entry[key] = bound;
|
|
154
|
+
}
|
|
155
|
+
return entry;
|
|
156
|
+
}),
|
|
157
|
+
}));
|
|
91
158
|
return {
|
|
92
159
|
combinationIds: results.map((r) => r.id),
|
|
93
160
|
nodalDisplacements,
|
|
94
161
|
reactions,
|
|
95
162
|
members,
|
|
96
163
|
shells,
|
|
164
|
+
strips,
|
|
165
|
+
piers,
|
|
166
|
+
spandrels,
|
|
97
167
|
};
|
|
98
168
|
};
|
|
99
169
|
exports.buildEnvelope = buildEnvelope;
|