@theerapat-s28/ts-structural-eng-tools 3.3.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 +18 -1
- package/README.md +65 -11
- 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 +0 -34
- package/dist/core/constants/frame.constant.js +2 -35
- 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 +16 -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 +1 -34
- 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/mesh/expand-model.js +1 -1
- package/dist/esm/fea/analysis/mesh/expand-model.js.map +1 -1
- package/dist/esm/fea/analysis/mesh/member-connectivity.js +2 -1
- package/dist/esm/fea/analysis/mesh/member-connectivity.js.map +1 -1
- 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 +9 -2
- 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 +13 -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 +12 -0
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/solver/nodes-along-members.js +1 -1
- package/dist/esm/fea/frame/solver/nodes-along-members.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-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 +1 -1
- 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 +2 -2
- package/dist/fea/analysis/mesh/expand-model.js +3 -3
- package/dist/fea/analysis/mesh/expand-model.js.map +1 -1
- package/dist/fea/analysis/mesh/member-connectivity.js +2 -1
- package/dist/fea/analysis/mesh/member-connectivity.js.map +1 -1
- 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 +7 -0
- package/dist/fea/analysis/post/present-state.js +10 -3
- 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.js +2 -2
- package/dist/fea/analysis/solver/analysis-system.js.map +1 -1
- package/dist/fea/analysis/solver/analyze.d.ts +6 -3
- package/dist/fea/analysis/solver/analyze.js +13 -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 +125 -1
- 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/post/member-diagram.d.ts +9 -0
- package/dist/fea/frame/post/member-diagram.js +14 -1
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/solver/nodes-along-members.js +2 -2
- package/dist/fea/frame/solver/nodes-along-members.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/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 +2 -2
- package/dist/index.js +6 -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 +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,22 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [3.4.0] — 2026-11-07
|
|
10
|
+
|
|
11
|
+
**Design forces from shells: strips over slabs, piers and spandrels on walls.** Add `strips`, `piers` or `spandrels` to a model and every load case and combination reports the resultants a designer needs, with an envelope over the combinations. All three are optional and change no other result, so existing models give the same numbers as 3.3.0.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **Strip forces on shells.** Give the model `strips` (type `ShellStrip`), design strips drawn over a slab as in SAFE or ETABS, and every load case and combination gets `stripForces` (type `StripForces`): the resultants on cuts across each strip at stations along it. A strip is a centreline polyline `points` with `widthLeft` and `widthRight`, an optional plane `normal` (default +Z) and an optional `maxSpacing` between stations (default: 20 divisions per segment); it picks up every shell element in its plane and ignores walls and other planes. Each station gives `P`, `V`, `M`, `T`, `Vp` and `Mp` in kN and kN·m (strip axis 1 along, 2 across, 3 the normal; `M` positive sagging and `V = −dM/dx`, as for members), the same divided by the covered `width` in `perWidth`, and each strip lists the `extremes` along it. `envelope.strips` gives the max and min of every station over the combinations. A strip changes no other result. A cut that is not fully on shells (an opening, a slab edge, a strip wider than the slab) integrates the shells it crosses, reports the covered `width` and adds a warning. The new [strip forces theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/strip-forces.html) show how each value is calculated. New constants `STRIP_PLANE_TOLERANCE` and `STRIP_DEFAULT_DIVISIONS` in `core`; `FeaErrorDetails` gains `stripId`.
|
|
16
|
+
- **Error 330** (`INVALID_STRIP_GEOMETRY`) for a strip with fewer than 2 points, points off its plane, a zero-length or doubled-back segment, a zero normal, or negative or zero widths. A strip id used twice is error 303, and a value that is not a finite number is 314.
|
|
17
|
+
- **Pier and spandrel forces for wall design.** Give the model `piers` (type `WallPier`) and `spandrels` (type `WallSpandrel`), groups of shell areas and members as in ETABS, and every load case and combination gets `pierForces` and `spandrelForces` (types `PierForces`, `SpandrelForces`): one resultant `P`, `V2`, `V3`, `T`, `M2`, `M3` (kN, kN·m) per cut across the whole group, about the centroid of the cut section, with member-diagram signs (`P` positive in tension). A pier lists vertical wall areas (planar, L, C or core walls, and separate legs, which are summed) and members (boundary or embedded columns); it is cut at the bottom and top of each lift, so a floor level gives a `"top"` cut from below and a `"bottom"` cut from above, plus extra elevations in `cuts`. Pier axis 1 is up and 2 runs along the longest area, or set it with `angle`. A spandrel lists areas in one vertical plane plus beams along it; it is cut at its `"left"` and `"right"` ends and at the distances in `cuts`, with axis 1 along it toward +X or +Y (`reverse` flips it) and 2 up. Each cut reports its `section` (type `WallCutSection`: legs, members, length, area and centroid) for wall design. The forces are the element nodal forces summed at the cut, in exact equilibrium with the loads; `envelope.piers` and `envelope.spandrels` give their max and min over the combinations. Pier and spandrel forces change no other result. The new [pier and spandrel theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/pier-spandrel.html) show how each value is calculated. New constants `WALL_VERTICAL_TOLERANCE` and `WALL_CUT_TOLERANCE` in `core`; `FeaErrorDetails` gains `pierId`, `spandrelId` and `position`.
|
|
18
|
+
- **Error 331** (`INVALID_PIER_GEOMETRY`) for a pier or spandrel with an unknown, repeated or doubly assigned area or member, no area or member, a non-vertical pier area or horizontal pier member, a spandrel out of one vertical plane or with a member normal to it, an extra cut that misses the group, or a cut that crosses an area between its mesh lines (divide the area there). An id used twice is error 303, and an invalid `cuts`, `angle` or `reverse` value is 314.
|
|
19
|
+
- The strip types (`ShellStrip`, `StripPoint`, `StripForces`, …) and the strip and wall constants are also exported from the package root.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- The shell element theory notes moved to `fea/theory/shell-element.html`, next to the new strip forces notes. The old address redirects there.
|
|
24
|
+
|
|
9
25
|
## [3.3.0] — 2026-11-03
|
|
10
26
|
|
|
11
27
|
**Members connect to the nodes lying on them.** Draw a girder once, from support to support, and the beams framing into it and the columns landing on it are connected without splitting it by hand. The girder stays one member in the results. Nodes that just miss a member are reported, and the new `memberConnectivity` returns both lists while the user draws, so a frontend can show what is connected. Results change only for models that had a node on a member's span that the member ignored; see Changed.
|
|
@@ -259,7 +275,8 @@ Maintenance release with no changes to the library code.
|
|
|
259
275
|
|
|
260
276
|
First version, under the unscoped name `ts-structural-eng-tools`: `rectBeamMomentCapacity` (singly and doubly reinforced rectangular beams per ACI 318-19), steel plate jacketing, and concrete property helpers.
|
|
261
277
|
|
|
262
|
-
[Unreleased]: https://github.com/theerapat-s28/ts-structural-eng/compare/v3.
|
|
278
|
+
[Unreleased]: https://github.com/theerapat-s28/ts-structural-eng/compare/v3.4.0...HEAD
|
|
279
|
+
[3.4.0]: https://github.com/theerapat-s28/ts-structural-eng/compare/v3.3.0...v3.4.0
|
|
263
280
|
[3.3.0]: https://github.com/theerapat-s28/ts-structural-eng/compare/v3.2.0...v3.3.0
|
|
264
281
|
[3.2.0]: https://github.com/theerapat-s28/ts-structural-eng/compare/v3.1.0...v3.2.0
|
|
265
282
|
[3.1.0]: https://github.com/theerapat-s28/ts-structural-eng/compare/v3.0.0...v3.1.0
|
package/README.md
CHANGED
|
@@ -41,7 +41,9 @@ Full API reference, with parameter tables, worked examples, warnings and error c
|
|
|
41
41
|
- [FEA — Frame and shell analysis](https://theerapat-s28.github.io/ts-structural-eng/fea/) — `@theerapat-s28/ts-structural-eng-tools/fea`
|
|
42
42
|
- [RC Beam Design](https://theerapat-s28.github.io/ts-structural-eng/rc/) — `@theerapat-s28/ts-structural-eng-tools/rc`
|
|
43
43
|
- [Strengthening](https://theerapat-s28.github.io/ts-structural-eng/strengthening/) — `@theerapat-s28/ts-structural-eng-tools/strengthening`
|
|
44
|
-
- [Shell element theory notes](https://theerapat-s28.github.io/ts-structural-eng/shell-element.html) — how the shell element's stiffness is formed, with its benchmarks
|
|
44
|
+
- [Shell element theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/shell-element.html) — how the shell element's stiffness is formed, with its benchmarks
|
|
45
|
+
- [Strip forces theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/strip-forces.html) — how strip forces are integrated from the shell forces, with their sign conventions and checks
|
|
46
|
+
- [Pier and spandrel theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/pier-spandrel.html) — how wall pier and spandrel forces are summed from the element nodal forces, with their sign conventions and checks
|
|
45
47
|
|
|
46
48
|
The pages are served from [`html-docs/`](https://github.com/theerapat-s28/ts-structural-eng/tree/main/html-docs) via GitHub Pages.
|
|
47
49
|
|
|
@@ -252,6 +254,8 @@ A `FeaModel` is plain data. Every load names its `loadCase`, so loads are flat t
|
|
|
252
254
|
| `shells` | Shell areas, `{ id, nodeIds, type?, section, angle?, modifiers?, mesh? }` |
|
|
253
255
|
| `areaLoads` | `{ loadCase, areaId, direction, q, projected? }` in kN/m², on a null area or a shell; `direction` is the area's normal `"3"` or a global axis |
|
|
254
256
|
| `combinations` | `{ id, name?, terms }`, each term `{ case, factor }` or `{ combination, factor }`; nested combinations are expanded |
|
|
257
|
+
| `strips` | Design strips across shells, `{ id, points, widthLeft, widthRight, normal?, maxSpacing? }`; see [Strip forces](#strip-forces) |
|
|
258
|
+
| `piers`, `spandrels` | Wall piers `{ id, areaIds?, memberIds?, cuts?, angle? }` and spandrels `{ id, areaIds, memberIds?, cuts?, reverse? }`; see [Pier and spandrel forces](#pier-and-spandrel-forces) |
|
|
255
259
|
|
|
256
260
|
#### Members
|
|
257
261
|
|
|
@@ -267,11 +271,57 @@ Both are areas that take `areaLoads`, and they share one id namespace.
|
|
|
267
271
|
- **A shell area** has its own stiffness and shares nodes with members and other shells; use it for walls, cores, transfer slabs and mats. It is a four-node flat shell: a drilling-rotation membrane, so a beam framing into a wall in its plane transfers its moment, and a thin (DKQ) plate. `type` is `"shell"` (both parts, the default), `"membrane"` or `"plate"`. `section` is `{ thickness, E, nu, unitWeight? }`, and `modifiers` scale the membrane (`f11`, `f22`, `f12`) and bending (`m11`, `m22`, `m12`) stiffness and the self-weight (`weight`), e.g. for the cracked-section values of ACI 318-19 Table 6.6.3.1.1. Slightly warped quads are allowed, up to `SHELL_WARPING_LIMIT` (0.1·√A off the plane). Local 3 follows the right-hand rule around `nodeIds`, local 2 points up on walls and local 1 is +X on horizontal shells; `angle` rotates them.
|
|
268
272
|
- **Meshing.** Give a shell `mesh: { maxSize }` (mm) or `mesh: { divisions: [n1, n2] }` and the engine divides it into elements. Neighbouring areas share their mesh nodes, including where an area edge meets another at a node; model nodes on an area edge become mesh nodes; and members along a meshed edge are split there internally. Fix supports along a meshed edge with `lineRestraints`, which reach the generated nodes.
|
|
269
273
|
|
|
274
|
+
#### Strip forces
|
|
275
|
+
|
|
276
|
+
Draw a design strip over a slab, as in SAFE or ETABS, and `analyze` returns the forces on cuts across it. The front end draws the strip; the engine takes it as data: a centreline polyline `points` (`{ x, y, z }` in mm, at least two) with `widthLeft` and `widthRight` measured from it (left seen from above). The strip lies in the plane through its points normal to `normal` (default `[0, 0, 1]`) and picks up every shell element in that plane; walls and other planes are ignored.
|
|
277
|
+
|
|
278
|
+
Stations sit at every polyline point and no further apart than `maxSpacing` (default: 20 divisions per segment); a bend has two stations, one normal to each segment. At each station the engine integrates each element's own force field along the cut and returns, in strip axes (1 along, 2 across to the left, 3 the normal), `P` (axial, + tension), `V` (shear, `V = −dM/dx`), `M` (bending, + sagging), `T` (torsion about the strip axis), `Vp` and `Mp` (in-plane shear and moment), plus each divided by the covered `width` in `perWidth`. A cut that is not fully on shells (an opening, a slab edge) integrates what it covers and reports its `width`, with a warning. Strip forces are linear, so combinations superpose them, and `envelope.strips` gives the max and min at every station. The [strip forces theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/strip-forces.html) show how each value is calculated.
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
const result = analyze({
|
|
282
|
+
...model, // a slab of shells
|
|
283
|
+
strips: [
|
|
284
|
+
{
|
|
285
|
+
id: "CS-1",
|
|
286
|
+
points: [{ x: 0, y: 1000, z: 0 }, { x: 6000, y: 1000, z: 0 }],
|
|
287
|
+
widthLeft: 1000, // mm
|
|
288
|
+
widthRight: 1000, // mm
|
|
289
|
+
maxSpacing: 500, // mm
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
});
|
|
293
|
+
const strip = result.combinations.ULS.stripForces[0];
|
|
294
|
+
// strip.stations[i] → { x, point, segment, width, P, V, M, T, Vp, Mp, perWidth: { … } }
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
A strip with a horizontal `normal` also works up a single flat wall (`P`, `Vp`, `Mp`); for grouped walls, cores and walls with columns, use piers.
|
|
298
|
+
|
|
299
|
+
#### Pier and spandrel forces
|
|
300
|
+
|
|
301
|
+
Group walls into piers and coupling beams into spandrels, as in ETABS, and `analyze` returns one resultant per cut across each group, for wall design. A pier lists vertical shell areas (`areaIds`: wall legs, planar or not, connected or not) and members (`memberIds`: boundary or embedded columns). It is cut at the bottom and top of each lift, between consecutive elevations where any of its areas or members starts or ends: a floor level shared by two lifts gives a `"top"` cut from below and a `"bottom"` cut from above, which differ by what the floor delivers. `cuts` adds elevations. A spandrel lists areas in one vertical plane, plus beams along it, and is cut at its `"left"` and `"right"` ends and at the distances in `cuts`. Every cut must lie on the mesh lines of the areas it meets (error 331 otherwise); separate legs are summed together, as ETABS does.
|
|
302
|
+
|
|
303
|
+
Each cut gives `P`, `V2`, `V3`, `T`, `M2`, `M3` (kN, kN·m) about the centroid of the cut section, with the signs of member internal forces: pier axis 1 is up and 2 runs along its longest area (or set it with `angle`); spandrel axis 1 runs along the wall toward +X or +Y (flip it with `reverse`) and 2 is up. Each cut also lists its `section` (each leg's end points and thickness, each member's position and area, the total length, area and centroid) for a later wall design. The forces are the element nodal forces summed at the cut, so they are in exact equilibrium with the loads, and they superpose: `envelope.piers` and `envelope.spandrels` give the max and min at every cut. The [pier and spandrel theory notes](https://theerapat-s28.github.io/ts-structural-eng/fea/theory/pier-spandrel.html) show how each value is calculated.
|
|
304
|
+
|
|
305
|
+
```ts
|
|
306
|
+
const result = analyze({
|
|
307
|
+
...model, // walls of shells, coupled over an opening
|
|
308
|
+
piers: [
|
|
309
|
+
{ id: "P1", areaIds: ["W1", "W1top"] },
|
|
310
|
+
{ id: "P2", areaIds: ["W2", "W2top"] },
|
|
311
|
+
],
|
|
312
|
+
spandrels: [{ id: "S1", areaIds: ["SP"] }],
|
|
313
|
+
});
|
|
314
|
+
const pier = result.combinations.ULS.pierForces[0];
|
|
315
|
+
// pier.cuts[i] → { z, face: "bottom" | "top" | "cut", P, V2, V3, T, M2, M3, section: { legs, members, length, area, centroid } }
|
|
316
|
+
const spandrel = result.combinations.ULS.spandrelForces[0];
|
|
317
|
+
// spandrel.cuts[i] → { x, face: "left" | "right" | "cut", P, V2, V3, T, M2, M3, section }
|
|
318
|
+
```
|
|
319
|
+
|
|
270
320
|
#### The result
|
|
271
321
|
|
|
272
322
|
| Field | What it holds |
|
|
273
323
|
| --- | --- |
|
|
274
|
-
| `cases`, `combinations` | Results keyed by id, each with `nodalDisplacements`, `reactions`, `memberEndForces`, `releaseDeformations`, `memberDiagrams` (`N`, `V2`, `V3`, `T`, `M2`, `M3` and deflections `u1`–`u3` local, `ux`–`uz` global, along each member), `shellForces`, an `equilibriumResidual` check and `warnings` |
|
|
324
|
+
| `cases`, `combinations` | Results keyed by id, each with `nodalDisplacements`, `reactions`, `memberEndForces`, `releaseDeformations`, `memberDiagrams` (`N`, `V2`, `V3`, `T`, `M2`, `M3` and deflections `u1`–`u3` local, `ux`–`uz` global, along each member), `shellForces`, `stripForces`, `pierForces`, `spandrelForces`, an `equilibriumResidual` check and `warnings` |
|
|
275
325
|
| `envelope` | Max and min of every result over the combinations, with the governing combination; absent without combinations |
|
|
276
326
|
| `mesh` | The generated nodes and every shell element with its nodes; absent without shells |
|
|
277
327
|
| `calculationDetails` | Node (generated included), member, shell-element, DOF, load case and combination counts, `profileSize`, `autoRestrainedDofs`, `intermediateNodes` and `nearMissNodes` |
|
|
@@ -315,7 +365,7 @@ ACI 440.2R-17 11.4.2 (spacing, which defers to the ACI 318 limits) and 11.4.3 (`
|
|
|
315
365
|
A design that is valid but breaks a code provision returns normally with an entry in `warnings`, citing the clause (e.g. `"ACI318-19, 9.6.1.2"`). A calculation whose assumptions break down throws instead, never returning a silently wrong result:
|
|
316
366
|
|
|
317
367
|
- **`RCDesignError`** — `code` and `message` from `Errors`: 1XX for RC beam design (e.g. 102, tensile steel not yielding; 105, `Vs` above the 22.5.1.2 limit), 2XX for strengthening and plate connections (201–206).
|
|
318
|
-
- **`FeaError`** — `code` and `message` from `FeaErrors`, `details` locating the problem, and `issues` listing every problem `validateModel` found. Codes 301–317 cover the model, members, loads, null areas and combinations (304 is an unstable structure); 326–329 cover shells: 326 invalid geometry, 327 invalid section, 328 a translation that nothing resists at a node connected only to membranes or plates, 329 an area that cannot be meshed. Match on `code`, not on `message`.
|
|
368
|
+
- **`FeaError`** — `code` and `message` from `FeaErrors`, `details` locating the problem, and `issues` listing every problem `validateModel` found. Codes 301–317 cover the model, members, loads, null areas and combinations (304 is an unstable structure); 326–329 cover shells: 326 invalid geometry, 327 invalid section, 328 a translation that nothing resists at a node connected only to membranes or plates, 329 an area that cannot be meshed; 330 is an invalid strip; 331 an invalid pier or spandrel. Match on `code`, not on `message`.
|
|
319
369
|
|
|
320
370
|
`core` also exports the shared input types, the type guards `isSinglyReinforced`, `hasTopPlate`, `hasBottomPlate` and `hasSidePlate`, and the engineering constants (φ factors, ultimate concrete strain, inertia modifiers, frame-analysis tolerances, `SHELL_WARPING_LIMIT`).
|
|
321
371
|
|
|
@@ -382,19 +432,19 @@ src/
|
|
|
382
432
|
│ │ ├── elements/ # Membrane, DKQ plate, flat shell, local axes, warping links, quad geometry
|
|
383
433
|
│ │ ├── mesh/ # Shell-area meshing
|
|
384
434
|
│ │ ├── solver/ # Shell elements of the system and their surface-load vectors
|
|
385
|
-
│ │ ├── post/ # Shell forces and stresses
|
|
386
|
-
│ │ ├── validation/ # Checks on shell areas
|
|
387
|
-
│ │ └── types/ # Shell-area model and result types
|
|
435
|
+
│ │ ├── post/ # Shell forces and stresses, strip forces
|
|
436
|
+
│ │ ├── validation/ # Checks on shell areas and strips
|
|
437
|
+
│ │ └── types/ # Shell-area and strip model and result types
|
|
388
438
|
│ └── analysis/ # The whole model, members and shells together (direct stiffness method)
|
|
389
439
|
│ ├── index.ts
|
|
390
440
|
│ ├── mesh/ # The analysed model: shell mesh, line restraints, member splitting at model and mesh nodes
|
|
391
441
|
│ ├── solver/ # System build + skyline factorisation, per-case solve, combinations, analyze, distributeAreaLoads
|
|
392
|
-
│ ├── validation/ # validateModel: every input problem, with its location
|
|
393
|
-
│ ├── post/ # Result presentation, envelopes, design demands
|
|
394
|
-
│ └── types/ # FeaModel (load cases, combinations, nodal loads, line restraints) and FeaResult
|
|
442
|
+
│ ├── validation/ # validateModel: every input problem, with its location; pier and spandrel checks
|
|
443
|
+
│ ├── post/ # Result presentation, envelopes, design demands, pier and spandrel forces
|
|
444
|
+
│ └── types/ # FeaModel (load cases, combinations, nodal loads, line restraints, piers, spandrels) and FeaResult
|
|
395
445
|
├── core/ # Shared infrastructure
|
|
396
446
|
│ ├── index.ts
|
|
397
|
-
│ ├── constants/ # RC design constants (ACI 318)
|
|
447
|
+
│ ├── constants/ # RC design constants (ACI 318) in rc.constant.ts; FEA constants in fea.constant.ts (shared), frame.constant.ts and shell.constant.ts
|
|
398
448
|
│ ├── errors/ # RCDesignError and FeaError with their coded entries
|
|
399
449
|
│ └── types/ # Shared types: RC sections, plate jacketing, section properties, warnings, units
|
|
400
450
|
└── utils/ # Helper utilities
|
|
@@ -421,7 +471,11 @@ html-docs/ # HTML API reference, deployed to GitHub Pages
|
|
|
421
471
|
├── rc/index.html
|
|
422
472
|
├── strengthening/index.html
|
|
423
473
|
├── fea/index.html
|
|
424
|
-
|
|
474
|
+
├── fea/theory/
|
|
475
|
+
│ ├── shell-element.html # Shell element theory notes
|
|
476
|
+
│ ├── strip-forces.html # Strip forces: theory and how they are calculated
|
|
477
|
+
│ └── pier-spandrel.html # Pier and spandrel forces: theory and how they are calculated
|
|
478
|
+
└── shell-element.html # Redirect to fea/theory/shell-element.html (old address)
|
|
425
479
|
ROADMAP.md # FEA roadmap and implementation plan (not published)
|
|
426
480
|
.agents/skills/update-version/ # AI agent skill: bump the version and roll the changelog
|
|
427
481
|
.claude/skills/npm-publish/ # AI agent skill: release checklist for publishing to npm
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** A member is vertical when the horizontal projection of its unit axis is below this value. */
|
|
2
|
+
export declare const VERTICAL_MEMBER_TOLERANCE = 0.000001;
|
|
3
|
+
/** Smallest pivot, relative to its own diagonal term, accepted when factorising a stiffness matrix. */
|
|
4
|
+
export declare const SINGULARITY_TOLERANCE = 1e-9;
|
|
5
|
+
/** Relative global-equilibrium residual above which a warning is added. */
|
|
6
|
+
export declare const EQUILIBRIUM_TOLERANCE = 0.000001;
|
|
7
|
+
/**
|
|
8
|
+
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
9
|
+
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
10
|
+
*/
|
|
11
|
+
export declare const AREA_GEOMETRY_TOLERANCE = 0.000001;
|
|
12
|
+
/**
|
|
13
|
+
* A shell area counts as vertical (a wall, for piers and spandrels) when the vertical
|
|
14
|
+
* component of its unit normal is at most this value (about 0.06°).
|
|
15
|
+
*/
|
|
16
|
+
export declare const WALL_VERTICAL_TOLERANCE = 0.001;
|
|
17
|
+
/**
|
|
18
|
+
* Relative tolerance for pier and spandrel cuts: a node lies on a cut when its distance from
|
|
19
|
+
* the cut plane is at most this times the extent of the pier or spandrel along the cut normal.
|
|
20
|
+
*/
|
|
21
|
+
export declare const WALL_CUT_TOLERANCE = 0.000001;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Tolerances shared by the whole FEA model: members, shells and the solver.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WALL_CUT_TOLERANCE = exports.WALL_VERTICAL_TOLERANCE = exports.AREA_GEOMETRY_TOLERANCE = exports.EQUILIBRIUM_TOLERANCE = exports.SINGULARITY_TOLERANCE = exports.VERTICAL_MEMBER_TOLERANCE = void 0;
|
|
5
|
+
/** A member is vertical when the horizontal projection of its unit axis is below this value. */
|
|
6
|
+
exports.VERTICAL_MEMBER_TOLERANCE = 1e-6;
|
|
7
|
+
/** Smallest pivot, relative to its own diagonal term, accepted when factorising a stiffness matrix. */
|
|
8
|
+
exports.SINGULARITY_TOLERANCE = 1e-9;
|
|
9
|
+
/** Relative global-equilibrium residual above which a warning is added. */
|
|
10
|
+
exports.EQUILIBRIUM_TOLERANCE = 1e-6;
|
|
11
|
+
/**
|
|
12
|
+
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
13
|
+
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
14
|
+
*/
|
|
15
|
+
exports.AREA_GEOMETRY_TOLERANCE = 1e-6;
|
|
16
|
+
/**
|
|
17
|
+
* A shell area counts as vertical (a wall, for piers and spandrels) when the vertical
|
|
18
|
+
* component of its unit normal is at most this value (about 0.06°).
|
|
19
|
+
*/
|
|
20
|
+
exports.WALL_VERTICAL_TOLERANCE = 1e-3;
|
|
21
|
+
/**
|
|
22
|
+
* Relative tolerance for pier and spandrel cuts: a node lies on a cut when its distance from
|
|
23
|
+
* the cut plane is at most this times the extent of the pier or spandrel along the cut normal.
|
|
24
|
+
*/
|
|
25
|
+
exports.WALL_CUT_TOLERANCE = 1e-6;
|
|
26
|
+
//# sourceMappingURL=fea.constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fea.constant.js","sourceRoot":"","sources":["../../../src/core/constants/fea.constant.ts"],"names":[],"mappings":";AAAA,4EAA4E;;;AAE5E,gGAAgG;AACnF,QAAA,yBAAyB,GAAG,IAAI,CAAC;AAE9C,uGAAuG;AAC1F,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,2EAA2E;AAC9D,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACU,QAAA,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACU,QAAA,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACU,QAAA,kBAAkB,GAAG,IAAI,CAAC"}
|
|
@@ -1,37 +1,3 @@
|
|
|
1
|
-
/** Poisson's ratio of concrete, for G = E / (2(1 + ν)). */
|
|
2
|
-
export declare const CONCRETE_POISSON_RATIO = 0.2;
|
|
3
|
-
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of beams for elastic analysis at factored load. */
|
|
4
|
-
export declare const BEAM_INERTIA_MODIFIER = 0.35;
|
|
5
|
-
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of columns for elastic analysis at factored load. */
|
|
6
|
-
export declare const COLUMN_INERTIA_MODIFIER = 0.7;
|
|
7
|
-
/** Unit weight of reinforced concrete in kN/m³ — common design practice, not an ACI 318-19 value. */
|
|
8
|
-
export declare const CONCRETE_UNIT_WEIGHT = 24;
|
|
9
|
-
/** A member is vertical when the horizontal projection of its unit axis is below this value. */
|
|
10
|
-
export declare const VERTICAL_MEMBER_TOLERANCE = 0.000001;
|
|
11
|
-
/** Smallest pivot, relative to its own diagonal term, accepted when factorising a stiffness matrix. */
|
|
12
|
-
export declare const SINGULARITY_TOLERANCE = 1e-9;
|
|
13
|
-
/** Relative global-equilibrium residual above which a warning is added. */
|
|
14
|
-
export declare const EQUILIBRIUM_TOLERANCE = 0.000001;
|
|
15
|
-
/**
|
|
16
|
-
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
17
|
-
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
18
|
-
*/
|
|
19
|
-
export declare const AREA_GEOMETRY_TOLERANCE = 0.000001;
|
|
20
|
-
/**
|
|
21
|
-
* Penalty factor γ of the shell membrane's drilling rotation, as a multiple of the shear modulus
|
|
22
|
-
* G: the term ½·γ·t·∫(θ − ω)² dA, integrated at the element centre, ties each element's rotation
|
|
23
|
-
* about the shell normal θ to the in-plane rotation of the material ω = ½(v,x − u,y). γ = G
|
|
24
|
-
* follows Ibrahimbegovic, Taylor & Wilson (1990); with the one-point rule the results change by
|
|
25
|
-
* well under 1 % for γ between 0.01 G and 100 G.
|
|
26
|
-
*/
|
|
27
|
-
export declare const DRILLING_PENALTY_RATIO = 1;
|
|
28
|
-
/**
|
|
29
|
-
* Largest warping of a shell element accepted, as the distance of its corners from their mean
|
|
30
|
-
* plane relative to √A (A = projected area). Warped elements are built flat on the mean plane
|
|
31
|
-
* and linked rigidly to their corners, which is accurate for mild warping (the MacNeal–Harder
|
|
32
|
-
* twisted beam, 0.024, is within 0.5 %); beyond this the element is rejected (326).
|
|
33
|
-
*/
|
|
34
|
-
export declare const SHELL_WARPING_LIMIT = 0.1;
|
|
35
1
|
/**
|
|
36
2
|
* A model node that lies off a member's axis, between its ends, by no more than this fraction
|
|
37
3
|
* of the member's length (and at most `NODE_NEAR_MEMBER_MAX_DISTANCE`), but not on it, gets a
|
|
@@ -1,40 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
// Frame members (line elements).
|
|
2
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.NODE_NEAR_MEMBER_MAX_DISTANCE = exports.NODE_NEAR_MEMBER_RATIO =
|
|
4
|
-
/** Poisson's ratio of concrete, for G = E / (2(1 + ν)). */
|
|
5
|
-
exports.CONCRETE_POISSON_RATIO = 0.2;
|
|
6
|
-
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of beams for elastic analysis at factored load. */
|
|
7
|
-
exports.BEAM_INERTIA_MODIFIER = 0.35;
|
|
8
|
-
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of columns for elastic analysis at factored load. */
|
|
9
|
-
exports.COLUMN_INERTIA_MODIFIER = 0.7;
|
|
10
|
-
/** Unit weight of reinforced concrete in kN/m³ — common design practice, not an ACI 318-19 value. */
|
|
11
|
-
exports.CONCRETE_UNIT_WEIGHT = 24;
|
|
12
|
-
/** A member is vertical when the horizontal projection of its unit axis is below this value. */
|
|
13
|
-
exports.VERTICAL_MEMBER_TOLERANCE = 1e-6;
|
|
14
|
-
/** Smallest pivot, relative to its own diagonal term, accepted when factorising a stiffness matrix. */
|
|
15
|
-
exports.SINGULARITY_TOLERANCE = 1e-9;
|
|
16
|
-
/** Relative global-equilibrium residual above which a warning is added. */
|
|
17
|
-
exports.EQUILIBRIUM_TOLERANCE = 1e-6;
|
|
18
|
-
/**
|
|
19
|
-
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
20
|
-
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
21
|
-
*/
|
|
22
|
-
exports.AREA_GEOMETRY_TOLERANCE = 1e-6;
|
|
23
|
-
/**
|
|
24
|
-
* Penalty factor γ of the shell membrane's drilling rotation, as a multiple of the shear modulus
|
|
25
|
-
* G: the term ½·γ·t·∫(θ − ω)² dA, integrated at the element centre, ties each element's rotation
|
|
26
|
-
* about the shell normal θ to the in-plane rotation of the material ω = ½(v,x − u,y). γ = G
|
|
27
|
-
* follows Ibrahimbegovic, Taylor & Wilson (1990); with the one-point rule the results change by
|
|
28
|
-
* well under 1 % for γ between 0.01 G and 100 G.
|
|
29
|
-
*/
|
|
30
|
-
exports.DRILLING_PENALTY_RATIO = 1;
|
|
31
|
-
/**
|
|
32
|
-
* Largest warping of a shell element accepted, as the distance of its corners from their mean
|
|
33
|
-
* plane relative to √A (A = projected area). Warped elements are built flat on the mean plane
|
|
34
|
-
* and linked rigidly to their corners, which is accurate for mild warping (the MacNeal–Harder
|
|
35
|
-
* twisted beam, 0.024, is within 0.5 %); beyond this the element is rejected (326).
|
|
36
|
-
*/
|
|
37
|
-
exports.SHELL_WARPING_LIMIT = 0.1;
|
|
4
|
+
exports.NODE_NEAR_MEMBER_MAX_DISTANCE = exports.NODE_NEAR_MEMBER_RATIO = void 0;
|
|
38
5
|
/**
|
|
39
6
|
* A model node that lies off a member's axis, between its ends, by no more than this fraction
|
|
40
7
|
* of the member's length (and at most `NODE_NEAR_MEMBER_MAX_DISTANCE`), but not on it, gets a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.constant.js","sourceRoot":"","sources":["../../../src/core/constants/frame.constant.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"frame.constant.js","sourceRoot":"","sources":["../../../src/core/constants/frame.constant.ts"],"names":[],"mappings":";AAAA,iCAAiC;;;AAEjC;;;;GAIG;AACU,QAAA,sBAAsB,GAAG,IAAI,CAAC;AAE3C,oFAAoF;AACvE,QAAA,6BAA6B,GAAG,GAAG,CAAC"}
|
|
@@ -30,3 +30,11 @@ export declare const SIDE_PLATE_REDUCTION_FACTOR_PSI = 0.85;
|
|
|
30
30
|
export declare const DEFAULT_SIDE_PLATE_SIDES = 2;
|
|
31
31
|
export declare const DEFAULT_SIDE_PLATE_ANGLE = 90;
|
|
32
32
|
export declare const MAX_PLATE_BOLT_SPACING = 300;
|
|
33
|
+
/** Poisson's ratio of concrete, for G = E / (2(1 + ν)). */
|
|
34
|
+
export declare const CONCRETE_POISSON_RATIO = 0.2;
|
|
35
|
+
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of beams for elastic analysis at factored load. */
|
|
36
|
+
export declare const BEAM_INERTIA_MODIFIER = 0.35;
|
|
37
|
+
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of columns for elastic analysis at factored load. */
|
|
38
|
+
export declare const COLUMN_INERTIA_MODIFIER = 0.7;
|
|
39
|
+
/** Unit weight of reinforced concrete in kN/m³ — common design practice, not an ACI 318-19 value. */
|
|
40
|
+
export declare const CONCRETE_UNIT_WEIGHT = 24;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MAX_PLATE_BOLT_SPACING = exports.DEFAULT_SIDE_PLATE_ANGLE = exports.DEFAULT_SIDE_PLATE_SIDES = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_SLENDERNESS_COEFFICIENT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.DEFAULT_PLATE_ELASTIC_MODULUS = exports.MIN_ANCHOR_SPACING_DIAMETER_FACTOR = exports.MAX_ANCHOR_FUTA = exports.ANCHOR_FUTA_FYA_FACTOR = exports.ANCHOR_STEEL_SHEAR_COEFFICIENT = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_AV_ABSOLUTE_COEFFICIENT = exports.MIN_AV_SQRT_FC_COEFFICIENT = exports.MAX_STIRRUP_SPACING_HIGH_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_HIGH_VS = exports.MAX_STIRRUP_SPACING_LOW_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_LOW_VS = exports.VS_SPACING_THRESHOLD_COEFFICIENT = exports.MAX_VS_COEFFICIENT = exports.SQRT_FC_SHEAR_LIMIT = exports.CONCRETE_SHEAR_VC_COEFFICIENT = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_LAYER_CLEAR_SPACING = exports.AGGREGATE_SPACING_FACTOR = exports.MIN_BAR_CLEAR_SPACING = exports.DEFAULT_MAX_AGGREGATE_SIZE = exports.DEFAULT_STIRRUP_DIAMETER = exports.DEFAULT_BEAM_COVER = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = void 0;
|
|
3
|
+
exports.CONCRETE_UNIT_WEIGHT = exports.COLUMN_INERTIA_MODIFIER = exports.BEAM_INERTIA_MODIFIER = exports.CONCRETE_POISSON_RATIO = exports.MAX_PLATE_BOLT_SPACING = exports.DEFAULT_SIDE_PLATE_ANGLE = exports.DEFAULT_SIDE_PLATE_SIDES = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_SLENDERNESS_COEFFICIENT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.DEFAULT_PLATE_ELASTIC_MODULUS = exports.MIN_ANCHOR_SPACING_DIAMETER_FACTOR = exports.MAX_ANCHOR_FUTA = exports.ANCHOR_FUTA_FYA_FACTOR = exports.ANCHOR_STEEL_SHEAR_COEFFICIENT = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_AV_ABSOLUTE_COEFFICIENT = exports.MIN_AV_SQRT_FC_COEFFICIENT = exports.MAX_STIRRUP_SPACING_HIGH_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_HIGH_VS = exports.MAX_STIRRUP_SPACING_LOW_VS_DEPTH_FACTOR = exports.MAX_STIRRUP_SPACING_LOW_VS = exports.VS_SPACING_THRESHOLD_COEFFICIENT = exports.MAX_VS_COEFFICIENT = exports.SQRT_FC_SHEAR_LIMIT = exports.CONCRETE_SHEAR_VC_COEFFICIENT = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.MIN_LAYER_CLEAR_SPACING = exports.AGGREGATE_SPACING_FACTOR = exports.MIN_BAR_CLEAR_SPACING = exports.DEFAULT_MAX_AGGREGATE_SIZE = exports.DEFAULT_STIRRUP_DIAMETER = exports.DEFAULT_BEAM_COVER = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = void 0;
|
|
4
4
|
exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = 0.9;
|
|
5
5
|
exports.CONCRETE_ULTIMATE_STRAIN = 0.003;
|
|
6
6
|
// ACI 318-19 Table 20.6.1.3.1: cast-in-place beams, not exposed to weather or in contact with ground
|
|
@@ -63,4 +63,13 @@ exports.DEFAULT_SIDE_PLATE_ANGLE = 90; // degrees from the beam axis
|
|
|
63
63
|
// Practical detailing limit on bolt pitch along a bonded strengthening plate,
|
|
64
64
|
// so the plate is restrained against local buckling / peeling between fasteners
|
|
65
65
|
exports.MAX_PLATE_BOLT_SPACING = 300; // mm
|
|
66
|
+
// Concrete material and cracked-section values used to build member section properties
|
|
67
|
+
/** Poisson's ratio of concrete, for G = E / (2(1 + ν)). */
|
|
68
|
+
exports.CONCRETE_POISSON_RATIO = 0.2;
|
|
69
|
+
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of beams for elastic analysis at factored load. */
|
|
70
|
+
exports.BEAM_INERTIA_MODIFIER = 0.35;
|
|
71
|
+
/** ACI 318-19 Table 6.6.3.1.1(a): effective I of columns for elastic analysis at factored load. */
|
|
72
|
+
exports.COLUMN_INERTIA_MODIFIER = 0.7;
|
|
73
|
+
/** Unit weight of reinforced concrete in kN/m³ — common design practice, not an ACI 318-19 value. */
|
|
74
|
+
exports.CONCRETE_UNIT_WEIGHT = 24;
|
|
66
75
|
//# sourceMappingURL=rc.constant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rc.constant.js","sourceRoot":"","sources":["../../../src/core/constants/rc.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,kCAAkC,GAAG,GAAG,CAAC;AACzC,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAE9C,qGAAqG;AACxF,QAAA,kBAAkB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AACtD,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,KAAK;AACpC,QAAA,0BAA0B,GAAG,EAAE,CAAC,CAAC,iCAAiC;AAE/E,wEAAwE;AAC3D,QAAA,qBAAqB,GAAG,EAAE,CAAC,CAAC,KAAK;AACjC,QAAA,wBAAwB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9C,uDAAuD;AAC1C,QAAA,uBAAuB,GAAG,EAAE,CAAC,CAAC,KAAK;AAEhD,yDAAyD;AAC5C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,kFAAkF;AACrE,QAAA,6BAA6B,GAAG,IAAI,CAAC;AAElD,gFAAgF;AAChF,6DAA6D;AAChD,QAAA,mBAAmB,GAAG,GAAG,CAAC,CAAC,MAAM;AAE9C,qEAAqE;AACxD,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAEvC,yFAAyF;AAC5E,QAAA,gCAAgC,GAAG,IAAI,CAAC,CAAC,uBAAuB;AAE7E,6EAA6E;AAChE,QAAA,0BAA0B,GAAG,GAAG,CAAC,CAAC,KAAK;AACvC,QAAA,uCAAuC,GAAG,GAAG,CAAC,CAAC,MAAM;AAElE,4EAA4E;AAC/D,QAAA,2BAA2B,GAAG,GAAG,CAAC,CAAC,KAAK;AACxC,QAAA,wCAAwC,GAAG,IAAI,CAAC,CAAC,MAAM;AAEpE,0FAA0F;AAC7E,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,2BAA2B,GAAG,IAAI,CAAC;AAEhD,+EAA+E;AAClE,QAAA,sCAAsC,GAAG,IAAI,CAAC;AAE3D,iDAAiD;AACpC,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAElD,qEAAqE;AACxD,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAC7B,QAAA,eAAe,GAAG,GAAG,CAAC,CAAC,MAAM;AAE1C,8EAA8E;AACjE,QAAA,kCAAkC,GAAG,CAAC,CAAC;AAEpD,uFAAuF;AAC1E,QAAA,6BAA6B,GAAG,MAAM,CAAC,CAAC,MAAM;AAE3D,0EAA0E;AAC7D,QAAA,6BAA6B,GAAG,GAAG,CAAC;AAEjD,+EAA+E;AAC/E,iCAAiC;AACpB,QAAA,mCAAmC,GAAG,IAAI,CAAC,CAAC,kBAAkB;AAE3E,gFAAgF;AAChF,mFAAmF;AACnF,qDAAqD;AACxC,QAAA,iCAAiC,GAAG,KAAK,CAAC;AAEvD,8EAA8E;AAC9E,mFAAmF;AACnF,6CAA6C;AAChC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,iEAAiE;AACpD,QAAA,wBAAwB,GAAG,CAAC,CAAC;AAE1C,0DAA0D;AAC7C,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AAEzE,8EAA8E;AAC9E,gFAAgF;AACnE,QAAA,sBAAsB,GAAG,GAAG,CAAC,CAAC,KAAK"}
|
|
1
|
+
{"version":3,"file":"rc.constant.js","sourceRoot":"","sources":["../../../src/core/constants/rc.constant.ts"],"names":[],"mappings":";;;AAAa,QAAA,kCAAkC,GAAG,GAAG,CAAC;AACzC,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAE9C,qGAAqG;AACxF,QAAA,kBAAkB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AACtD,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,KAAK;AACpC,QAAA,0BAA0B,GAAG,EAAE,CAAC,CAAC,iCAAiC;AAE/E,wEAAwE;AAC3D,QAAA,qBAAqB,GAAG,EAAE,CAAC,CAAC,KAAK;AACjC,QAAA,wBAAwB,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9C,uDAAuD;AAC1C,QAAA,uBAAuB,GAAG,EAAE,CAAC,CAAC,KAAK;AAEhD,yDAAyD;AAC5C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,kFAAkF;AACrE,QAAA,6BAA6B,GAAG,IAAI,CAAC;AAElD,gFAAgF;AAChF,6DAA6D;AAChD,QAAA,mBAAmB,GAAG,GAAG,CAAC,CAAC,MAAM;AAE9C,qEAAqE;AACxD,QAAA,kBAAkB,GAAG,IAAI,CAAC;AAEvC,yFAAyF;AAC5E,QAAA,gCAAgC,GAAG,IAAI,CAAC,CAAC,uBAAuB;AAE7E,6EAA6E;AAChE,QAAA,0BAA0B,GAAG,GAAG,CAAC,CAAC,KAAK;AACvC,QAAA,uCAAuC,GAAG,GAAG,CAAC,CAAC,MAAM;AAElE,4EAA4E;AAC/D,QAAA,2BAA2B,GAAG,GAAG,CAAC,CAAC,KAAK;AACxC,QAAA,wCAAwC,GAAG,IAAI,CAAC,CAAC,MAAM;AAEpE,0FAA0F;AAC7E,QAAA,0BAA0B,GAAG,KAAK,CAAC;AACnC,QAAA,2BAA2B,GAAG,IAAI,CAAC;AAEhD,+EAA+E;AAClE,QAAA,sCAAsC,GAAG,IAAI,CAAC;AAE3D,iDAAiD;AACpC,QAAA,8BAA8B,GAAG,GAAG,CAAC;AAElD,qEAAqE;AACxD,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAC7B,QAAA,eAAe,GAAG,GAAG,CAAC,CAAC,MAAM;AAE1C,8EAA8E;AACjE,QAAA,kCAAkC,GAAG,CAAC,CAAC;AAEpD,uFAAuF;AAC1E,QAAA,6BAA6B,GAAG,MAAM,CAAC,CAAC,MAAM;AAE3D,0EAA0E;AAC7D,QAAA,6BAA6B,GAAG,GAAG,CAAC;AAEjD,+EAA+E;AAC/E,iCAAiC;AACpB,QAAA,mCAAmC,GAAG,IAAI,CAAC,CAAC,kBAAkB;AAE3E,gFAAgF;AAChF,mFAAmF;AACnF,qDAAqD;AACxC,QAAA,iCAAiC,GAAG,KAAK,CAAC;AAEvD,8EAA8E;AAC9E,mFAAmF;AACnF,6CAA6C;AAChC,QAAA,+BAA+B,GAAG,IAAI,CAAC;AAEpD,iEAAiE;AACpD,QAAA,wBAAwB,GAAG,CAAC,CAAC;AAE1C,0DAA0D;AAC7C,QAAA,wBAAwB,GAAG,EAAE,CAAC,CAAC,6BAA6B;AAEzE,8EAA8E;AAC9E,gFAAgF;AACnE,QAAA,sBAAsB,GAAG,GAAG,CAAC,CAAC,KAAK;AAEhD,uFAAuF;AACvF,2DAA2D;AAC9C,QAAA,sBAAsB,GAAG,GAAG,CAAC;AAE1C,iGAAiG;AACpF,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,mGAAmG;AACtF,QAAA,uBAAuB,GAAG,GAAG,CAAC;AAE3C,qGAAqG;AACxF,QAAA,oBAAoB,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Penalty factor γ of the shell membrane's drilling rotation, as a multiple of the shear modulus
|
|
3
|
+
* G: the term ½·γ·t·∫(θ − ω)² dA, integrated at the element centre, ties each element's rotation
|
|
4
|
+
* about the shell normal θ to the in-plane rotation of the material ω = ½(v,x − u,y). γ = G
|
|
5
|
+
* follows Ibrahimbegovic, Taylor & Wilson (1990); with the one-point rule the results change by
|
|
6
|
+
* well under 1 % for γ between 0.01 G and 100 G.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DRILLING_PENALTY_RATIO = 1;
|
|
9
|
+
/**
|
|
10
|
+
* Largest warping of a shell element accepted, as the distance of its corners from their mean
|
|
11
|
+
* plane relative to √A (A = projected area). Warped elements are built flat on the mean plane
|
|
12
|
+
* and linked rigidly to their corners, which is accurate for mild warping (the MacNeal–Harder
|
|
13
|
+
* twisted beam, 0.024, is within 0.5 %); beyond this the element is rejected (326).
|
|
14
|
+
*/
|
|
15
|
+
export declare const SHELL_WARPING_LIMIT = 0.1;
|
|
16
|
+
/**
|
|
17
|
+
* A shell element counts as lying in a strip's plane when each of its corners is within this
|
|
18
|
+
* fraction of the element's longest side from that plane (1 mm on a 1 m element). The strip
|
|
19
|
+
* then integrates its forces; elements off the plane, such as walls, are ignored.
|
|
20
|
+
*/
|
|
21
|
+
export declare const STRIP_PLANE_TOLERANCE = 0.001;
|
|
22
|
+
/** Divisions of each strip segment when the strip gives no `maxSpacing`: 21 stations. */
|
|
23
|
+
export declare const STRIP_DEFAULT_DIVISIONS = 20;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Shell elements and strip forces.
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.STRIP_DEFAULT_DIVISIONS = exports.STRIP_PLANE_TOLERANCE = exports.SHELL_WARPING_LIMIT = exports.DRILLING_PENALTY_RATIO = void 0;
|
|
5
|
+
/**
|
|
6
|
+
* Penalty factor γ of the shell membrane's drilling rotation, as a multiple of the shear modulus
|
|
7
|
+
* G: the term ½·γ·t·∫(θ − ω)² dA, integrated at the element centre, ties each element's rotation
|
|
8
|
+
* about the shell normal θ to the in-plane rotation of the material ω = ½(v,x − u,y). γ = G
|
|
9
|
+
* follows Ibrahimbegovic, Taylor & Wilson (1990); with the one-point rule the results change by
|
|
10
|
+
* well under 1 % for γ between 0.01 G and 100 G.
|
|
11
|
+
*/
|
|
12
|
+
exports.DRILLING_PENALTY_RATIO = 1;
|
|
13
|
+
/**
|
|
14
|
+
* Largest warping of a shell element accepted, as the distance of its corners from their mean
|
|
15
|
+
* plane relative to √A (A = projected area). Warped elements are built flat on the mean plane
|
|
16
|
+
* and linked rigidly to their corners, which is accurate for mild warping (the MacNeal–Harder
|
|
17
|
+
* twisted beam, 0.024, is within 0.5 %); beyond this the element is rejected (326).
|
|
18
|
+
*/
|
|
19
|
+
exports.SHELL_WARPING_LIMIT = 0.1;
|
|
20
|
+
/**
|
|
21
|
+
* A shell element counts as lying in a strip's plane when each of its corners is within this
|
|
22
|
+
* fraction of the element's longest side from that plane (1 mm on a 1 m element). The strip
|
|
23
|
+
* then integrates its forces; elements off the plane, such as walls, are ignored.
|
|
24
|
+
*/
|
|
25
|
+
exports.STRIP_PLANE_TOLERANCE = 1e-3;
|
|
26
|
+
/** Divisions of each strip segment when the strip gives no `maxSpacing`: 21 stations. */
|
|
27
|
+
exports.STRIP_DEFAULT_DIVISIONS = 20;
|
|
28
|
+
//# sourceMappingURL=shell.constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.constant.js","sourceRoot":"","sources":["../../../src/core/constants/shell.constant.ts"],"names":[],"mappings":";AAAA,mCAAmC;;;AAEnC;;;;;;GAMG;AACU,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAExC;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAE1C,yFAAyF;AAC5E,QAAA,uBAAuB,GAAG,EAAE,CAAC"}
|
|
@@ -6,6 +6,11 @@ export interface FeaErrorDetails {
|
|
|
6
6
|
memberId?: string | number;
|
|
7
7
|
areaId?: string | number;
|
|
8
8
|
shellId?: string | number;
|
|
9
|
+
stripId?: string | number;
|
|
10
|
+
pierId?: string | number;
|
|
11
|
+
spandrelId?: string | number;
|
|
12
|
+
/** For a pier or spandrel cut: its elevation (pier) or distance from the left end (spandrel), mm. */
|
|
13
|
+
position?: number;
|
|
9
14
|
/** For an area: the edge index, edge i running from `nodeIds[i]` to `nodeIds[i + 1]`. */
|
|
10
15
|
edge?: number;
|
|
11
16
|
loadCaseId?: string;
|
|
@@ -24,7 +24,7 @@ exports.FeaErrors = {
|
|
|
24
24
|
},
|
|
25
25
|
DUPLICATE_ID: {
|
|
26
26
|
code: 303,
|
|
27
|
-
message: "Node ids, member ids and restrained node ids must each be unique, area ids must be unique across null areas and shells, and load case and combination ids must be unique across both lists.",
|
|
27
|
+
message: "Node ids, member ids and restrained node ids must each be unique, area ids must be unique across null areas and shells, strip ids must be unique, and load case and combination ids must be unique across both lists.",
|
|
28
28
|
},
|
|
29
29
|
STRUCTURE_UNSTABLE: {
|
|
30
30
|
code: 304,
|
|
@@ -98,6 +98,14 @@ exports.FeaErrors = {
|
|
|
98
98
|
code: 329,
|
|
99
99
|
message: "Shell areas cannot be meshed: no division counts make the meshes of areas sharing edges meet node to node, a generated element is not a valid quadrilateral, or a generated id is already in use. Divide the areas so they meet edge to edge, or change their mesh sizes.",
|
|
100
100
|
},
|
|
101
|
+
INVALID_STRIP_GEOMETRY: {
|
|
102
|
+
code: 330,
|
|
103
|
+
message: "A strip needs at least 2 points in one plane normal to its normal (default +Z), with no zero-length segment and no segment turning straight back on the previous one; its normal must not be zero, its widths must not be negative, and they must not both be zero.",
|
|
104
|
+
},
|
|
105
|
+
INVALID_PIER_GEOMETRY: {
|
|
106
|
+
code: 331,
|
|
107
|
+
message: "A pier or spandrel must list existing shell areas and members, each at most once and in no other pier (or spandrel); a pier needs at least one area or member, a spandrel at least one area. Pier areas must be vertical and pier members not horizontal; a spandrel's areas must lie in one vertical plane and its members must not be normal to its length. Every cut must lie within the group and on the mesh lines of its areas: divide an area that a cut crosses.",
|
|
108
|
+
},
|
|
101
109
|
};
|
|
102
110
|
// ---- Names before 3.2.0, kept as deprecated aliases until 4.0.0 ------------------------
|
|
103
111
|
/** @deprecated Renamed `FeaError`; this alias is removed in 4.0.0. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fea.error.js","sourceRoot":"","sources":["../../../src/core/errors/fea.error.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fea.error.js","sourceRoot":"","sources":["../../../src/core/errors/fea.error.ts"],"names":[],"mappings":";;;AAuBA,MAAa,QAAS,SAAQ,KAAK;IAOjC,YACE,MAAoB,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,EACzD,UAA2B,EAAE,EAC7B,MAAwB;QAExB,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;CACF;AAnBD,4BAmBC;AAcY,QAAA,SAAS,GAAiC;IACrD,mBAAmB;IACnB,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,sEAAsE;KAChF;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,iGAAiG;KACpG;IACD,YAAY,EAAE;QACZ,IAAI,EAAE,GAAG;QACT,OAAO,EACL,uNAAuN;KAC1N;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,mHAAmH;KACtH;IACD,0BAA0B,EAAE;QAC1B,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,iDAAiD;KAC3D;IACD,eAAe,EAAE;QACf,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yFAAyF;KAC5F;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,4EAA4E;KACtF;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2HAA2H;KAC9H;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,mDAAmD;KAC7D;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4GAA4G;KAC/G;IACD,aAAa,EAAE;QACb,IAAI,EAAE,GAAG;QACT,OAAO,EAAE,gEAAgE;KAC1E;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,wIAAwI;KAC3I;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,8JAA8J;KACjK;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gJAAgJ;KACnJ;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,gIAAgI;KACnI;IACD,yBAAyB,EAAE;QACzB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,6QAA6Q;KAChR;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,yKAAyK;KAC5K;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,4IAA4I;KAC/I;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,8MAA8M;KACjN;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,2QAA2Q;KAC9Q;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,qQAAqQ;KACxQ;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,GAAG;QACT,OAAO,EACL,0cAA0c;KAC7c;CACF,CAAC;AAEF,2FAA2F;AAE3F,sEAAsE;AACzD,QAAA,kBAAkB,GAAG,QAAQ,CAAC;AAG3C,uEAAuE;AAC1D,QAAA,WAAW,GAAG,iBAAS,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -5,8 +5,10 @@ export { hasTopPlate, hasBottomPlate, hasSidePlate } from "./types/plate-jacketi
|
|
|
5
5
|
export type { SectionProperties } from "./types/section-properties.type";
|
|
6
6
|
export type { Warnings, calculationResult } from "./types/output-message.type";
|
|
7
7
|
export type { unit } from "./types/unit.type";
|
|
8
|
-
export { 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, } from "./constants/rc.constant";
|
|
9
|
-
export {
|
|
8
|
+
export { 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, } from "./constants/rc.constant";
|
|
9
|
+
export { VERTICAL_MEMBER_TOLERANCE, SINGULARITY_TOLERANCE, EQUILIBRIUM_TOLERANCE, AREA_GEOMETRY_TOLERANCE, WALL_VERTICAL_TOLERANCE, WALL_CUT_TOLERANCE, } from "./constants/fea.constant";
|
|
10
|
+
export { NODE_NEAR_MEMBER_RATIO, NODE_NEAR_MEMBER_MAX_DISTANCE } from "./constants/frame.constant";
|
|
11
|
+
export { SHELL_WARPING_LIMIT, STRIP_PLANE_TOLERANCE, STRIP_DEFAULT_DIVISIONS, } from "./constants/shell.constant";
|
|
10
12
|
export { RCDesignError, Errors } from "./errors/rc-design.error";
|
|
11
13
|
export { FeaError, FeaErrors } from "./errors/fea.error";
|
|
12
14
|
export type { FeaErrorDetails, FeaModelIssue } from "./errors/fea.error";
|
package/dist/core/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FrameErrors = exports.FrameAnalysisError = exports.FeaErrors = exports.FeaError = exports.Errors = exports.RCDesignError = exports.NODE_NEAR_MEMBER_MAX_DISTANCE = exports.NODE_NEAR_MEMBER_RATIO = exports.
|
|
3
|
+
exports.FrameErrors = exports.FrameAnalysisError = exports.FeaErrors = exports.FeaError = exports.Errors = exports.RCDesignError = exports.STRIP_DEFAULT_DIVISIONS = exports.STRIP_PLANE_TOLERANCE = exports.SHELL_WARPING_LIMIT = exports.NODE_NEAR_MEMBER_MAX_DISTANCE = exports.NODE_NEAR_MEMBER_RATIO = exports.WALL_CUT_TOLERANCE = exports.WALL_VERTICAL_TOLERANCE = exports.AREA_GEOMETRY_TOLERANCE = exports.EQUILIBRIUM_TOLERANCE = exports.SINGULARITY_TOLERANCE = exports.VERTICAL_MEMBER_TOLERANCE = exports.COLUMN_INERTIA_MODIFIER = exports.BEAM_INERTIA_MODIFIER = exports.CONCRETE_UNIT_WEIGHT = exports.CONCRETE_POISSON_RATIO = exports.SIDE_PLATE_REDUCTION_FACTOR_PSI = exports.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT = exports.PLATE_SHEAR_YIELD_COEFFICIENT = exports.MAX_PLATE_BOLT_SPACING = exports.ANCHOR_SHEAR_STRENGTH_REDUCTION_FACTOR = exports.SHEAR_STRENGTH_REDUCTION_FACTOR = exports.CONCRETE_ULTIMATE_STRAIN = exports.FLEXURAL_STRENGTH_REDUCTION_FACTOR = exports.hasSidePlate = exports.hasBottomPlate = exports.hasTopPlate = exports.isSinglyReinforced = void 0;
|
|
4
4
|
var rc_beam_type_1 = require("./types/rc-beam.type");
|
|
5
5
|
Object.defineProperty(exports, "isSinglyReinforced", { enumerable: true, get: function () { return rc_beam_type_1.isSinglyReinforced; } });
|
|
6
6
|
var plate_jacketing_type_1 = require("./types/plate-jacketing.type");
|
|
@@ -17,18 +17,24 @@ Object.defineProperty(exports, "MAX_PLATE_BOLT_SPACING", { enumerable: true, get
|
|
|
17
17
|
Object.defineProperty(exports, "PLATE_SHEAR_YIELD_COEFFICIENT", { enumerable: true, get: function () { return rc_constant_1.PLATE_SHEAR_YIELD_COEFFICIENT; } });
|
|
18
18
|
Object.defineProperty(exports, "SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT", { enumerable: true, get: function () { return rc_constant_1.SIDE_PLATE_EFFECTIVE_STRAIN_LIMIT; } });
|
|
19
19
|
Object.defineProperty(exports, "SIDE_PLATE_REDUCTION_FACTOR_PSI", { enumerable: true, get: function () { return rc_constant_1.SIDE_PLATE_REDUCTION_FACTOR_PSI; } });
|
|
20
|
+
Object.defineProperty(exports, "CONCRETE_POISSON_RATIO", { enumerable: true, get: function () { return rc_constant_1.CONCRETE_POISSON_RATIO; } });
|
|
21
|
+
Object.defineProperty(exports, "CONCRETE_UNIT_WEIGHT", { enumerable: true, get: function () { return rc_constant_1.CONCRETE_UNIT_WEIGHT; } });
|
|
22
|
+
Object.defineProperty(exports, "BEAM_INERTIA_MODIFIER", { enumerable: true, get: function () { return rc_constant_1.BEAM_INERTIA_MODIFIER; } });
|
|
23
|
+
Object.defineProperty(exports, "COLUMN_INERTIA_MODIFIER", { enumerable: true, get: function () { return rc_constant_1.COLUMN_INERTIA_MODIFIER; } });
|
|
24
|
+
var fea_constant_1 = require("./constants/fea.constant");
|
|
25
|
+
Object.defineProperty(exports, "VERTICAL_MEMBER_TOLERANCE", { enumerable: true, get: function () { return fea_constant_1.VERTICAL_MEMBER_TOLERANCE; } });
|
|
26
|
+
Object.defineProperty(exports, "SINGULARITY_TOLERANCE", { enumerable: true, get: function () { return fea_constant_1.SINGULARITY_TOLERANCE; } });
|
|
27
|
+
Object.defineProperty(exports, "EQUILIBRIUM_TOLERANCE", { enumerable: true, get: function () { return fea_constant_1.EQUILIBRIUM_TOLERANCE; } });
|
|
28
|
+
Object.defineProperty(exports, "AREA_GEOMETRY_TOLERANCE", { enumerable: true, get: function () { return fea_constant_1.AREA_GEOMETRY_TOLERANCE; } });
|
|
29
|
+
Object.defineProperty(exports, "WALL_VERTICAL_TOLERANCE", { enumerable: true, get: function () { return fea_constant_1.WALL_VERTICAL_TOLERANCE; } });
|
|
30
|
+
Object.defineProperty(exports, "WALL_CUT_TOLERANCE", { enumerable: true, get: function () { return fea_constant_1.WALL_CUT_TOLERANCE; } });
|
|
20
31
|
var frame_constant_1 = require("./constants/frame.constant");
|
|
21
|
-
Object.defineProperty(exports, "CONCRETE_POISSON_RATIO", { enumerable: true, get: function () { return frame_constant_1.CONCRETE_POISSON_RATIO; } });
|
|
22
|
-
Object.defineProperty(exports, "CONCRETE_UNIT_WEIGHT", { enumerable: true, get: function () { return frame_constant_1.CONCRETE_UNIT_WEIGHT; } });
|
|
23
|
-
Object.defineProperty(exports, "BEAM_INERTIA_MODIFIER", { enumerable: true, get: function () { return frame_constant_1.BEAM_INERTIA_MODIFIER; } });
|
|
24
|
-
Object.defineProperty(exports, "COLUMN_INERTIA_MODIFIER", { enumerable: true, get: function () { return frame_constant_1.COLUMN_INERTIA_MODIFIER; } });
|
|
25
|
-
Object.defineProperty(exports, "VERTICAL_MEMBER_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.VERTICAL_MEMBER_TOLERANCE; } });
|
|
26
|
-
Object.defineProperty(exports, "SINGULARITY_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.SINGULARITY_TOLERANCE; } });
|
|
27
|
-
Object.defineProperty(exports, "EQUILIBRIUM_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.EQUILIBRIUM_TOLERANCE; } });
|
|
28
|
-
Object.defineProperty(exports, "AREA_GEOMETRY_TOLERANCE", { enumerable: true, get: function () { return frame_constant_1.AREA_GEOMETRY_TOLERANCE; } });
|
|
29
|
-
Object.defineProperty(exports, "SHELL_WARPING_LIMIT", { enumerable: true, get: function () { return frame_constant_1.SHELL_WARPING_LIMIT; } });
|
|
30
32
|
Object.defineProperty(exports, "NODE_NEAR_MEMBER_RATIO", { enumerable: true, get: function () { return frame_constant_1.NODE_NEAR_MEMBER_RATIO; } });
|
|
31
33
|
Object.defineProperty(exports, "NODE_NEAR_MEMBER_MAX_DISTANCE", { enumerable: true, get: function () { return frame_constant_1.NODE_NEAR_MEMBER_MAX_DISTANCE; } });
|
|
34
|
+
var shell_constant_1 = require("./constants/shell.constant");
|
|
35
|
+
Object.defineProperty(exports, "SHELL_WARPING_LIMIT", { enumerable: true, get: function () { return shell_constant_1.SHELL_WARPING_LIMIT; } });
|
|
36
|
+
Object.defineProperty(exports, "STRIP_PLANE_TOLERANCE", { enumerable: true, get: function () { return shell_constant_1.STRIP_PLANE_TOLERANCE; } });
|
|
37
|
+
Object.defineProperty(exports, "STRIP_DEFAULT_DIVISIONS", { enumerable: true, get: function () { return shell_constant_1.STRIP_DEFAULT_DIVISIONS; } });
|
|
32
38
|
// Errors
|
|
33
39
|
var rc_design_error_1 = require("./errors/rc-design.error");
|
|
34
40
|
Object.defineProperty(exports, "RCDesignError", { enumerable: true, get: function () { return rc_design_error_1.RCDesignError; } });
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;AAW3B,qEAAyF;AAAhF,mHAAA,WAAW,OAAA;AAAE,sHAAA,cAAc,OAAA;AAAE,oHAAA,YAAY,OAAA;AAKlD,YAAY;AACZ,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAWA,qDAA0D;AAAjD,kHAAA,kBAAkB,OAAA;AAW3B,qEAAyF;AAAhF,mHAAA,WAAW,OAAA;AAAE,sHAAA,cAAc,OAAA;AAAE,oHAAA,YAAY,OAAA;AAKlD,YAAY;AACZ,uDAaiC;AAZ/B,iIAAA,kCAAkC,OAAA;AAClC,uHAAA,wBAAwB,OAAA;AACxB,8HAAA,+BAA+B,OAAA;AAC/B,qIAAA,sCAAsC,OAAA;AACtC,qHAAA,sBAAsB,OAAA;AACtB,4HAAA,6BAA6B,OAAA;AAC7B,gIAAA,iCAAiC,OAAA;AACjC,8HAAA,+BAA+B,OAAA;AAC/B,qHAAA,sBAAsB,OAAA;AACtB,mHAAA,oBAAoB,OAAA;AACpB,oHAAA,qBAAqB,OAAA;AACrB,sHAAA,uBAAuB,OAAA;AAGzB,yDAOkC;AANhC,yHAAA,yBAAyB,OAAA;AACzB,qHAAA,qBAAqB,OAAA;AACrB,qHAAA,qBAAqB,OAAA;AACrB,uHAAA,uBAAuB,OAAA;AACvB,uHAAA,uBAAuB,OAAA;AACvB,kHAAA,kBAAkB,OAAA;AAEpB,6DAAmG;AAA1F,wHAAA,sBAAsB,OAAA;AAAE,+HAAA,6BAA6B,OAAA;AAC9D,6DAIoC;AAHlC,qHAAA,mBAAmB,OAAA;AACnB,uHAAA,qBAAqB,OAAA;AACrB,yHAAA,uBAAuB,OAAA;AAGzB,SAAS;AACT,4DAAiE;AAAxD,gHAAA,aAAa,OAAA;AAAE,yGAAA,MAAM,OAAA;AAC9B,gDAAyD;AAAhD,qGAAA,QAAQ,OAAA;AAAE,sGAAA,SAAS,OAAA;AAE5B,qCAAqC;AACrC,gDAAqE;AAA5D,+GAAA,kBAAkB,OAAA;AAAE,wGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Tolerances shared by the whole FEA model: members, shells and the solver.
|
|
2
|
+
/** A member is vertical when the horizontal projection of its unit axis is below this value. */
|
|
3
|
+
export const VERTICAL_MEMBER_TOLERANCE = 1e-6;
|
|
4
|
+
/** Smallest pivot, relative to its own diagonal term, accepted when factorising a stiffness matrix. */
|
|
5
|
+
export const SINGULARITY_TOLERANCE = 1e-9;
|
|
6
|
+
/** Relative global-equilibrium residual above which a warning is added. */
|
|
7
|
+
export const EQUILIBRIUM_TOLERANCE = 1e-6;
|
|
8
|
+
/**
|
|
9
|
+
* Relative tolerance for null-area geometry (planarity, corners in line, parallel or square
|
|
10
|
+
* edges, nodes lying on an edge): distances are compared with this times the longest edge.
|
|
11
|
+
*/
|
|
12
|
+
export const AREA_GEOMETRY_TOLERANCE = 1e-6;
|
|
13
|
+
/**
|
|
14
|
+
* A shell area counts as vertical (a wall, for piers and spandrels) when the vertical
|
|
15
|
+
* component of its unit normal is at most this value (about 0.06°).
|
|
16
|
+
*/
|
|
17
|
+
export const WALL_VERTICAL_TOLERANCE = 1e-3;
|
|
18
|
+
/**
|
|
19
|
+
* Relative tolerance for pier and spandrel cuts: a node lies on a cut when its distance from
|
|
20
|
+
* the cut plane is at most this times the extent of the pier or spandrel along the cut normal.
|
|
21
|
+
*/
|
|
22
|
+
export const WALL_CUT_TOLERANCE = 1e-6;
|
|
23
|
+
//# sourceMappingURL=fea.constant.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fea.constant.js","sourceRoot":"","sources":["../../../../src/core/constants/fea.constant.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAE5E,gGAAgG;AAChG,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,uGAAuG;AACvG,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC"}
|