@theerapat-s28/ts-structural-eng-tools 3.1.0 → 3.2.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 +284 -127
- package/dist/core/errors/fea.error.d.ts +47 -0
- package/dist/{esm/core/errors/frame-analysis.error.js → core/errors/fea.error.js} +14 -5
- package/dist/core/errors/fea.error.js.map +1 -0
- package/dist/core/index.d.ts +4 -2
- package/dist/core/index.js +8 -4
- package/dist/core/index.js.map +1 -1
- package/dist/{core/errors/frame-analysis.error.js → esm/core/errors/fea.error.js} +10 -9
- package/dist/esm/core/errors/fea.error.js.map +1 -0
- package/dist/esm/core/index.js +3 -1
- package/dist/esm/core/index.js.map +1 -1
- package/dist/esm/fea/analysis/index.js +6 -0
- package/dist/esm/fea/analysis/index.js.map +1 -0
- package/dist/esm/fea/{frame → analysis}/mesh/expand-model.js +12 -6
- package/dist/esm/fea/analysis/mesh/expand-model.js.map +1 -0
- package/dist/esm/fea/{frame → analysis}/post/demand-envelope.js +4 -4
- package/dist/esm/fea/analysis/post/demand-envelope.js.map +1 -0
- package/dist/esm/fea/analysis/post/envelope.js.map +1 -0
- package/dist/esm/fea/{frame → analysis}/post/present-state.js +4 -4
- package/dist/esm/fea/analysis/post/present-state.js.map +1 -0
- package/dist/esm/fea/{frame/solver/frame-system.js → analysis/solver/analysis-system.js} +17 -90
- package/dist/esm/fea/analysis/solver/analysis-system.js.map +1 -0
- package/dist/esm/fea/{frame/solver/analyze-frame.js → analysis/solver/analyze.js} +20 -18
- package/dist/esm/fea/analysis/solver/analyze.js.map +1 -0
- package/dist/esm/fea/{frame → analysis}/solver/combinations.js +8 -8
- package/dist/esm/fea/analysis/solver/combinations.js.map +1 -0
- package/dist/esm/fea/analysis/solver/distribute-area-loads.js +25 -0
- package/dist/esm/fea/analysis/solver/distribute-area-loads.js.map +1 -0
- package/dist/esm/fea/analysis/solver/load-case-solver.js +103 -0
- package/dist/esm/fea/analysis/solver/load-case-solver.js.map +1 -0
- package/dist/esm/fea/analysis/types/model.type.js +2 -0
- package/dist/esm/fea/analysis/types/model.type.js.map +1 -0
- package/dist/esm/fea/analysis/types/results.type.js +2 -0
- package/dist/esm/fea/analysis/types/results.type.js.map +1 -0
- package/dist/esm/fea/analysis/validation/validate-model.js +263 -0
- package/dist/esm/fea/analysis/validation/validate-model.js.map +1 -0
- package/dist/esm/fea/deprecated.js +9 -0
- package/dist/esm/fea/deprecated.js.map +1 -0
- package/dist/esm/fea/frame/area/{distribute-area-loads.js → area-member-loads.js} +7 -28
- package/dist/esm/fea/frame/area/area-member-loads.js.map +1 -0
- package/dist/esm/fea/frame/area/edge-members.js.map +1 -1
- package/dist/esm/fea/frame/elements/end-releases.js +2 -6
- package/dist/esm/fea/frame/elements/end-releases.js.map +1 -1
- package/dist/esm/fea/frame/elements/fixed-end-forces.js +5 -5
- package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -1
- package/dist/esm/fea/frame/elements/static-condensation.js +3 -3
- package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -1
- package/dist/esm/fea/frame/index.js +1 -4
- package/dist/esm/fea/frame/index.js.map +1 -1
- package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/esm/fea/frame/solver/{global-assembly.js → member-assembly.js} +2 -10
- package/dist/esm/fea/frame/solver/member-assembly.js.map +1 -0
- package/dist/esm/fea/frame/solver/member-loads.js +141 -0
- package/dist/esm/fea/frame/solver/member-loads.js.map +1 -0
- package/dist/esm/fea/frame/solver/system-member.js +66 -0
- package/dist/esm/fea/frame/solver/system-member.js.map +1 -0
- package/dist/esm/fea/frame/transformation/coordinate-transform.js +3 -3
- package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -1
- package/dist/esm/fea/frame/validation/validate-members.js +160 -0
- package/dist/esm/fea/frame/validation/validate-members.js.map +1 -0
- package/dist/esm/fea/frame/validation/validate-null-areas.js +88 -0
- package/dist/esm/fea/frame/validation/validate-null-areas.js.map +1 -0
- package/dist/esm/fea/index.js +4 -1
- package/dist/esm/fea/index.js.map +1 -1
- package/dist/esm/fea/shared/index.js +2 -0
- package/dist/esm/fea/shared/index.js.map +1 -0
- package/dist/esm/fea/shared/solver/auto-restraint.js.map +1 -0
- package/dist/esm/fea/{frame → shared}/solver/boundary-conditions.js +5 -1
- package/dist/esm/fea/shared/solver/boundary-conditions.js.map +1 -0
- package/dist/esm/fea/shared/solver/global-assembly.js +10 -0
- package/dist/esm/fea/shared/solver/global-assembly.js.map +1 -0
- package/dist/esm/fea/shared/types/model.type.js +2 -0
- package/dist/esm/fea/shared/types/model.type.js.map +1 -0
- package/dist/esm/fea/shared/validation/issues.js +32 -0
- package/dist/esm/fea/shared/validation/issues.js.map +1 -0
- package/dist/esm/fea/{frame/elements/shell → shell/elements}/dkq-plate.js +1 -1
- package/dist/esm/fea/shell/elements/dkq-plate.js.map +1 -0
- package/dist/esm/fea/{frame/elements/shell → shell/elements}/flat-shell.js +1 -1
- package/dist/esm/fea/shell/elements/flat-shell.js.map +1 -0
- package/dist/esm/fea/{frame/elements/shell → shell/elements}/membrane-quad.js +2 -2
- package/dist/esm/fea/shell/elements/membrane-quad.js.map +1 -0
- package/dist/esm/fea/shell/elements/quad-geometry.js.map +1 -0
- package/dist/esm/fea/shell/elements/rigidity.js.map +1 -0
- package/dist/esm/fea/{frame/elements/shell → shell/elements}/shell-axes.js +1 -1
- package/dist/esm/fea/shell/elements/shell-axes.js.map +1 -0
- package/dist/esm/fea/shell/index.js +2 -0
- package/dist/esm/fea/shell/index.js.map +1 -0
- package/dist/esm/fea/{frame → shell}/mesh/mesh-shells.js +1 -1
- package/dist/esm/fea/shell/mesh/mesh-shells.js.map +1 -0
- package/dist/esm/fea/{frame → shell}/post/shell-forces.js +4 -4
- package/dist/esm/fea/{frame → shell}/post/shell-forces.js.map +1 -1
- package/dist/esm/fea/shell/solver/shell-loads.js +53 -0
- package/dist/esm/fea/shell/solver/shell-loads.js.map +1 -0
- package/dist/esm/fea/shell/solver/system-shell.js +37 -0
- package/dist/esm/fea/shell/solver/system-shell.js.map +1 -0
- package/dist/esm/fea/shell/types/model.type.js +2 -0
- package/dist/esm/fea/shell/types/model.type.js.map +1 -0
- package/dist/esm/fea/shell/types/results.type.js +2 -0
- package/dist/esm/fea/shell/types/results.type.js.map +1 -0
- package/dist/esm/fea/shell/validation/validate-shells.js +98 -0
- package/dist/esm/fea/shell/validation/validate-shells.js.map +1 -0
- package/dist/esm/index.js +5 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/fea/analysis/index.d.ts +8 -0
- package/dist/fea/analysis/index.js +14 -0
- package/dist/fea/analysis/index.js.map +1 -0
- package/dist/fea/{frame → analysis}/mesh/expand-model.d.ts +9 -7
- package/dist/fea/{frame → analysis}/mesh/expand-model.js +12 -6
- package/dist/fea/analysis/mesh/expand-model.js.map +1 -0
- package/dist/fea/{frame → analysis}/post/demand-envelope.d.ts +5 -5
- package/dist/fea/{frame → analysis}/post/demand-envelope.js +4 -4
- package/dist/fea/analysis/post/demand-envelope.js.map +1 -0
- package/dist/fea/{frame → analysis}/post/envelope.d.ts +2 -2
- package/dist/fea/analysis/post/envelope.js.map +1 -0
- package/dist/fea/{frame → analysis}/post/present-state.d.ts +6 -5
- package/dist/fea/{frame → analysis}/post/present-state.js +5 -5
- package/dist/fea/analysis/post/present-state.js.map +1 -0
- package/dist/fea/analysis/solver/analysis-system.d.ts +46 -0
- package/dist/fea/{frame/solver/frame-system.js → analysis/solver/analysis-system.js} +22 -95
- package/dist/fea/analysis/solver/analysis-system.js.map +1 -0
- package/dist/fea/{frame/solver/analyze-frame.d.ts → analysis/solver/analyze.d.ts} +23 -20
- package/dist/fea/{frame/solver/analyze-frame.js → analysis/solver/analyze.js} +25 -23
- package/dist/fea/analysis/solver/analyze.js.map +1 -0
- package/dist/fea/{frame → analysis}/solver/combinations.d.ts +1 -1
- package/dist/fea/{frame → analysis}/solver/combinations.js +8 -8
- package/dist/fea/analysis/solver/combinations.js.map +1 -0
- package/dist/fea/{frame/area → analysis/solver}/distribute-area-loads.d.ts +6 -15
- package/dist/fea/analysis/solver/distribute-area-loads.js +29 -0
- package/dist/fea/analysis/solver/distribute-area-loads.js.map +1 -0
- package/dist/fea/{frame → analysis}/solver/load-case-solver.d.ts +9 -13
- package/dist/fea/analysis/solver/load-case-solver.js +108 -0
- package/dist/fea/analysis/solver/load-case-solver.js.map +1 -0
- package/dist/fea/analysis/types/model.type.d.ts +80 -0
- package/dist/fea/analysis/types/model.type.js +3 -0
- package/dist/fea/analysis/types/model.type.js.map +1 -0
- package/dist/fea/analysis/types/results.type.d.ts +113 -0
- package/dist/fea/analysis/types/results.type.js +3 -0
- package/dist/fea/analysis/types/results.type.js.map +1 -0
- package/dist/fea/analysis/validation/validate-model.d.ts +12 -0
- package/dist/fea/analysis/validation/validate-model.js +267 -0
- package/dist/fea/analysis/validation/validate-model.js.map +1 -0
- package/dist/fea/deprecated.d.ts +27 -0
- package/dist/fea/deprecated.js +12 -0
- package/dist/fea/deprecated.js.map +1 -0
- package/dist/fea/frame/area/area-member-loads.d.ts +19 -0
- package/dist/fea/frame/area/{distribute-area-loads.js → area-member-loads.js} +8 -30
- package/dist/fea/frame/area/area-member-loads.js.map +1 -0
- package/dist/fea/frame/area/edge-members.d.ts +5 -4
- package/dist/fea/frame/area/edge-members.js.map +1 -1
- package/dist/fea/frame/elements/end-releases.d.ts +1 -6
- package/dist/fea/frame/elements/end-releases.js +4 -8
- package/dist/fea/frame/elements/end-releases.js.map +1 -1
- package/dist/fea/frame/elements/fixed-end-forces.d.ts +1 -1
- package/dist/fea/frame/elements/fixed-end-forces.js +5 -5
- package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -1
- package/dist/fea/frame/elements/static-condensation.d.ts +1 -1
- package/dist/fea/frame/elements/static-condensation.js +3 -3
- package/dist/fea/frame/elements/static-condensation.js.map +1 -1
- package/dist/fea/frame/index.d.ts +2 -8
- package/dist/fea/frame/index.js +2 -10
- package/dist/fea/frame/index.js.map +1 -1
- package/dist/fea/frame/post/member-diagram.d.ts +3 -3
- package/dist/fea/frame/post/member-diagram.js.map +1 -1
- package/dist/fea/frame/solver/{global-assembly.d.ts → member-assembly.d.ts} +0 -11
- package/dist/fea/frame/solver/{global-assembly.js → member-assembly.js} +4 -13
- package/dist/fea/frame/solver/member-assembly.js.map +1 -0
- package/dist/fea/frame/solver/member-loads.d.ts +21 -0
- package/dist/fea/frame/solver/member-loads.js +146 -0
- package/dist/fea/frame/solver/member-loads.js.map +1 -0
- package/dist/fea/frame/solver/system-member.d.ts +50 -0
- package/dist/fea/frame/solver/system-member.js +70 -0
- package/dist/fea/frame/solver/system-member.js.map +1 -0
- package/dist/fea/frame/transformation/coordinate-transform.d.ts +1 -1
- package/dist/fea/frame/transformation/coordinate-transform.js +3 -3
- package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -1
- package/dist/fea/frame/types/model.type.d.ts +10 -175
- package/dist/fea/frame/types/results.type.d.ts +4 -159
- package/dist/fea/frame/validation/validate-members.d.ts +30 -0
- package/dist/fea/frame/validation/validate-members.js +165 -0
- package/dist/fea/frame/validation/validate-members.js.map +1 -0
- package/dist/fea/frame/validation/validate-null-areas.d.ts +38 -0
- package/dist/fea/frame/validation/validate-null-areas.js +93 -0
- package/dist/fea/frame/validation/validate-null-areas.js.map +1 -0
- package/dist/fea/index.d.ts +4 -0
- package/dist/fea/index.js +4 -1
- package/dist/fea/index.js.map +1 -1
- package/dist/fea/shared/index.d.ts +1 -0
- package/dist/fea/shared/index.js +3 -0
- package/dist/fea/shared/index.js.map +1 -0
- package/dist/fea/shared/solver/auto-restraint.js.map +1 -0
- package/dist/fea/{frame → shared}/solver/boundary-conditions.d.ts +5 -0
- package/dist/fea/{frame → shared}/solver/boundary-conditions.js +7 -3
- package/dist/fea/shared/solver/boundary-conditions.js.map +1 -0
- package/dist/fea/shared/solver/global-assembly.d.ts +12 -0
- package/dist/fea/shared/solver/global-assembly.js +14 -0
- package/dist/fea/shared/solver/global-assembly.js.map +1 -0
- package/dist/fea/shared/types/model.type.d.ts +34 -0
- package/dist/fea/shared/types/model.type.js +3 -0
- package/dist/fea/shared/types/model.type.js.map +1 -0
- package/dist/fea/shared/validation/issues.d.ts +9 -0
- package/dist/fea/shared/validation/issues.js +38 -0
- package/dist/fea/shared/validation/issues.js.map +1 -0
- package/dist/fea/{frame/elements/shell → shell/elements}/dkq-plate.d.ts +1 -1
- package/dist/fea/{frame/elements/shell → shell/elements}/dkq-plate.js +1 -1
- package/dist/fea/shell/elements/dkq-plate.js.map +1 -0
- package/dist/fea/{frame/elements/shell → shell/elements}/flat-shell.d.ts +1 -1
- package/dist/fea/{frame/elements/shell → shell/elements}/flat-shell.js +1 -1
- package/dist/fea/shell/elements/flat-shell.js.map +1 -0
- package/dist/fea/{frame/elements/shell → shell/elements}/membrane-quad.d.ts +1 -1
- package/dist/fea/{frame/elements/shell → shell/elements}/membrane-quad.js +2 -2
- package/dist/fea/shell/elements/membrane-quad.js.map +1 -0
- package/dist/fea/shell/elements/quad-geometry.js.map +1 -0
- package/dist/fea/{frame/elements/shell → shell/elements}/rigidity.d.ts +1 -1
- package/dist/fea/shell/elements/rigidity.js.map +1 -0
- package/dist/fea/{frame/elements/shell → shell/elements}/shell-axes.d.ts +1 -1
- package/dist/fea/{frame/elements/shell → shell/elements}/shell-axes.js +1 -1
- package/dist/fea/shell/elements/shell-axes.js.map +1 -0
- package/dist/fea/shell/index.d.ts +2 -0
- package/dist/fea/shell/index.js +3 -0
- package/dist/fea/shell/index.js.map +1 -0
- package/dist/fea/{frame → shell}/mesh/mesh-shells.d.ts +7 -6
- package/dist/fea/{frame → shell}/mesh/mesh-shells.js +1 -1
- package/dist/fea/shell/mesh/mesh-shells.js.map +1 -0
- package/dist/fea/{frame → shell}/post/shell-forces.d.ts +1 -1
- package/dist/fea/{frame → shell}/post/shell-forces.js +4 -4
- package/dist/fea/{frame → shell}/post/shell-forces.js.map +1 -1
- package/dist/fea/shell/solver/shell-loads.d.ts +17 -0
- package/dist/fea/shell/solver/shell-loads.js +57 -0
- package/dist/fea/shell/solver/shell-loads.js.map +1 -0
- package/dist/fea/shell/solver/system-shell.d.ts +29 -0
- package/dist/fea/shell/solver/system-shell.js +41 -0
- package/dist/fea/shell/solver/system-shell.js.map +1 -0
- package/dist/fea/shell/types/model.type.d.ts +57 -0
- package/dist/fea/shell/types/model.type.js +3 -0
- package/dist/fea/shell/types/model.type.js.map +1 -0
- package/dist/fea/shell/types/results.type.d.ts +47 -0
- package/dist/fea/shell/types/results.type.js +3 -0
- package/dist/fea/shell/types/results.type.js.map +1 -0
- package/dist/fea/shell/validation/validate-shells.d.ts +21 -0
- package/dist/fea/shell/validation/validate-shells.js +103 -0
- package/dist/fea/shell/validation/validate-shells.js.map +1 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +13 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/core/errors/frame-analysis.error.d.ts +0 -37
- package/dist/core/errors/frame-analysis.error.js.map +0 -1
- package/dist/esm/core/errors/frame-analysis.error.js.map +0 -1
- package/dist/esm/fea/frame/area/distribute-area-loads.js.map +0 -1
- package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +0 -1
- package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +0 -1
- package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +0 -1
- package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +0 -1
- package/dist/esm/fea/frame/elements/shell/rigidity.js.map +0 -1
- package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +0 -1
- package/dist/esm/fea/frame/mesh/expand-model.js.map +0 -1
- package/dist/esm/fea/frame/mesh/mesh-shells.js.map +0 -1
- package/dist/esm/fea/frame/post/demand-envelope.js.map +0 -1
- package/dist/esm/fea/frame/post/envelope.js.map +0 -1
- package/dist/esm/fea/frame/post/present-state.js.map +0 -1
- package/dist/esm/fea/frame/solver/analyze-frame.js.map +0 -1
- package/dist/esm/fea/frame/solver/auto-restraint.js.map +0 -1
- package/dist/esm/fea/frame/solver/boundary-conditions.js.map +0 -1
- package/dist/esm/fea/frame/solver/combinations.js.map +0 -1
- package/dist/esm/fea/frame/solver/frame-system.js.map +0 -1
- package/dist/esm/fea/frame/solver/global-assembly.js.map +0 -1
- package/dist/esm/fea/frame/solver/load-case-solver.js +0 -255
- package/dist/esm/fea/frame/solver/load-case-solver.js.map +0 -1
- package/dist/esm/fea/frame/validation/validate-model.js +0 -529
- package/dist/esm/fea/frame/validation/validate-model.js.map +0 -1
- package/dist/fea/frame/area/distribute-area-loads.js.map +0 -1
- package/dist/fea/frame/elements/shell/dkq-plate.js.map +0 -1
- package/dist/fea/frame/elements/shell/flat-shell.js.map +0 -1
- package/dist/fea/frame/elements/shell/membrane-quad.js.map +0 -1
- package/dist/fea/frame/elements/shell/quad-geometry.js.map +0 -1
- package/dist/fea/frame/elements/shell/rigidity.js.map +0 -1
- package/dist/fea/frame/elements/shell/shell-axes.js.map +0 -1
- package/dist/fea/frame/mesh/expand-model.js.map +0 -1
- package/dist/fea/frame/mesh/mesh-shells.js.map +0 -1
- package/dist/fea/frame/post/demand-envelope.js.map +0 -1
- package/dist/fea/frame/post/envelope.js.map +0 -1
- package/dist/fea/frame/post/present-state.js.map +0 -1
- package/dist/fea/frame/solver/analyze-frame.js.map +0 -1
- package/dist/fea/frame/solver/auto-restraint.js.map +0 -1
- package/dist/fea/frame/solver/boundary-conditions.js.map +0 -1
- package/dist/fea/frame/solver/combinations.js.map +0 -1
- package/dist/fea/frame/solver/frame-system.d.ts +0 -89
- package/dist/fea/frame/solver/frame-system.js.map +0 -1
- package/dist/fea/frame/solver/global-assembly.js.map +0 -1
- package/dist/fea/frame/solver/load-case-solver.js +0 -260
- package/dist/fea/frame/solver/load-case-solver.js.map +0 -1
- package/dist/fea/frame/validation/validate-model.d.ts +0 -19
- package/dist/fea/frame/validation/validate-model.js +0 -535
- package/dist/fea/frame/validation/validate-model.js.map +0 -1
- /package/dist/esm/fea/{frame → analysis}/post/envelope.js +0 -0
- /package/dist/esm/fea/{frame → shared}/solver/auto-restraint.js +0 -0
- /package/dist/esm/fea/{frame/elements/shell → shell/elements}/quad-geometry.js +0 -0
- /package/dist/esm/fea/{frame/elements/shell → shell/elements}/rigidity.js +0 -0
- /package/dist/fea/{frame → analysis}/post/envelope.js +0 -0
- /package/dist/fea/{frame → shared}/solver/auto-restraint.d.ts +0 -0
- /package/dist/fea/{frame → shared}/solver/auto-restraint.js +0 -0
- /package/dist/fea/{frame/elements/shell → shell/elements}/quad-geometry.d.ts +0 -0
- /package/dist/fea/{frame/elements/shell → shell/elements}/quad-geometry.js +0 -0
- /package/dist/fea/{frame/elements/shell → shell/elements}/rigidity.js +0 -0
|
@@ -1,21 +1,10 @@
|
|
|
1
1
|
import { type Matrix } from "../../../utils/matrix";
|
|
2
|
-
/**
|
|
3
|
-
* A stiffness contribution to the global system: the nodes it connects and its stiffness over
|
|
4
|
-
* their DOFs (6 per node, in node order) in global axes. A member is a 2-node element; elements
|
|
5
|
-
* with more nodes assemble the same way.
|
|
6
|
-
*/
|
|
7
|
-
export interface StiffnessElement {
|
|
8
|
-
nodes: number[];
|
|
9
|
-
kGlobal: Matrix;
|
|
10
|
-
}
|
|
11
2
|
export interface AssemblyMember {
|
|
12
3
|
startIndex: number;
|
|
13
4
|
endIndex: number;
|
|
14
5
|
T: Matrix;
|
|
15
6
|
k: Matrix;
|
|
16
7
|
}
|
|
17
|
-
/** Global DOF numbers (6 per node, in node order) of an element connecting `nodes`. */
|
|
18
|
-
export declare const elementDofs: (nodes: readonly number[]) => number[];
|
|
19
8
|
/** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
|
|
20
9
|
export declare const memberDofs: (member: Pick<AssemblyMember, "startIndex" | "endIndex">) => number[];
|
|
21
10
|
/** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.scatterMemberForces = exports.memberGlobalStiffness = exports.memberDofs =
|
|
3
|
+
exports.scatterMemberForces = exports.memberGlobalStiffness = exports.memberDofs = void 0;
|
|
4
|
+
const global_assembly_1 = require("../../shared/solver/global-assembly");
|
|
4
5
|
const matrix_1 = require("../../../utils/matrix");
|
|
5
|
-
/** Global DOF numbers (6 per node, in node order) of an element connecting `nodes`. */
|
|
6
|
-
const elementDofs = (nodes) => {
|
|
7
|
-
const dofs = [];
|
|
8
|
-
for (const node of nodes) {
|
|
9
|
-
for (let k = 0; k < 6; k++)
|
|
10
|
-
dofs.push(6 * node + k);
|
|
11
|
-
}
|
|
12
|
-
return dofs;
|
|
13
|
-
};
|
|
14
|
-
exports.elementDofs = elementDofs;
|
|
15
6
|
/** Global DOF numbers (6 per node) of a member's 12 end DOFs. */
|
|
16
|
-
const memberDofs = (member) => (0,
|
|
7
|
+
const memberDofs = (member) => (0, global_assembly_1.elementDofs)([member.startIndex, member.endIndex]);
|
|
17
8
|
exports.memberDofs = memberDofs;
|
|
18
9
|
/** A member's stiffness in global axes, `Tᵀ·k·T` (N and mm). */
|
|
19
10
|
const memberGlobalStiffness = (member) => (0, matrix_1.matMul)((0, matrix_1.transpose)(member.T), (0, matrix_1.matMul)(member.k, member.T));
|
|
@@ -33,4 +24,4 @@ const scatterMemberForces = (target, member, localForces, sign) => {
|
|
|
33
24
|
}
|
|
34
25
|
};
|
|
35
26
|
exports.scatterMemberForces = scatterMemberForces;
|
|
36
|
-
//# sourceMappingURL=
|
|
27
|
+
//# sourceMappingURL=member-assembly.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-assembly.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/member-assembly.ts"],"names":[],"mappings":";;;AAAA,4EAAqE;AACrE,8CAAmE;AASnE,iEAAiE;AAC1D,MAAM,UAAU,GAAG,CAAC,MAAuD,EAAY,EAAE,CAC9F,IAAA,6BAAW,EAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AADvC,QAAA,UAAU,cAC6B;AAEpD,gEAAgE;AACzD,MAAM,qBAAqB,GAAG,CAAC,MAAsB,EAAU,EAAE,CACtE,IAAA,eAAM,EAAC,IAAA,kBAAS,EAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAD7C,QAAA,qBAAqB,yBACwB;AAE1D;;;;GAIG;AACI,MAAM,mBAAmB,GAAG,CACjC,MAAgB,EAChB,MAA6D,EAC7D,WAAqB,EACrB,IAAY,EACN,EAAE;IACR,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,mBAAmB,uBAY9B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { FeaId } from "../../shared/types/model.type";
|
|
2
|
+
import { type LocalMemberLoad } from "../elements/fixed-end-forces";
|
|
3
|
+
import type { MemberLoad } from "../types/model.type";
|
|
4
|
+
import type { MemberGroup, SystemMember } from "./system-member";
|
|
5
|
+
/**
|
|
6
|
+
* The local loads (N and mm) on every member piece in one load case: each member load, and the
|
|
7
|
+
* self-weight `selfWeight · unitWeight · A` per unit length along global −Z, resolved in the
|
|
8
|
+
* whole member's local axes, then cut at its pieces.
|
|
9
|
+
*
|
|
10
|
+
* @param groups - Model members and the pieces each is analysed as
|
|
11
|
+
* @param pieces - Every member piece
|
|
12
|
+
* @param memberIndex - Index into `groups` of each member id
|
|
13
|
+
* @param loads - The load case's member loads
|
|
14
|
+
* @param loadCaseId - The load case, which tags the self-weight load
|
|
15
|
+
* @param selfWeight - The load case's self-weight multiplier
|
|
16
|
+
* @returns The local loads of each piece, in the order of `pieces`
|
|
17
|
+
* @throws {FeaError} 313 if self-weight is requested for a member without `unitWeight`
|
|
18
|
+
*/
|
|
19
|
+
export declare const memberPieceLoads: (groups: MemberGroup[], pieces: SystemMember[], memberIndex: Map<FeaId, number>, loads: MemberLoad[], loadCaseId: string, selfWeight: number) => LocalMemberLoad[][];
|
|
20
|
+
/** A local member load scaled by `factor`, e.g. for a load combination. */
|
|
21
|
+
export declare const scaleMemberLoad: (load: LocalMemberLoad, factor: number) => LocalMemberLoad;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scaleMemberLoad = exports.memberPieceLoads = void 0;
|
|
4
|
+
const fea_error_1 = require("../../../core/errors/fea.error");
|
|
5
|
+
const fixed_end_forces_1 = require("../elements/fixed-end-forces");
|
|
6
|
+
const GLOBAL_DIRECTIONS = {
|
|
7
|
+
X: [1, 0, 0],
|
|
8
|
+
Y: [0, 1, 0],
|
|
9
|
+
Z: [0, 0, 1],
|
|
10
|
+
};
|
|
11
|
+
/** Resolves a member load into local-axis loads in N and mm. */
|
|
12
|
+
const toLocalLoads = (load, lambda, L) => {
|
|
13
|
+
const components = (direction) => {
|
|
14
|
+
if (direction === "1" || direction === "2" || direction === "3") {
|
|
15
|
+
return [{ axis: Number(direction), factor: 1 }];
|
|
16
|
+
}
|
|
17
|
+
const v = GLOBAL_DIRECTIONS[direction];
|
|
18
|
+
return [1, 2, 3]
|
|
19
|
+
.map((axis) => ({
|
|
20
|
+
axis,
|
|
21
|
+
factor: lambda[axis - 1][0] * v[0] + lambda[axis - 1][1] * v[1] + lambda[axis - 1][2] * v[2],
|
|
22
|
+
}))
|
|
23
|
+
.filter((c) => Math.abs(c.factor) > 1e-12);
|
|
24
|
+
};
|
|
25
|
+
if (load.type === "torque") {
|
|
26
|
+
// kN·m/m = 10³ N·mm/mm
|
|
27
|
+
return [{ type: "torque", t: load.t * 1e3, start: load.start ?? 0, end: load.end ?? L }];
|
|
28
|
+
}
|
|
29
|
+
// per projected length → per member length: Lproj / L = |local 1 × d| = √(1 − (local 1 · d)²)
|
|
30
|
+
let projection = 1;
|
|
31
|
+
if (load.type !== "point" && load.projected) {
|
|
32
|
+
const v = GLOBAL_DIRECTIONS[load.direction];
|
|
33
|
+
const c = lambda[0][0] * v[0] + lambda[0][1] * v[1] + lambda[0][2] * v[2];
|
|
34
|
+
projection = Math.sqrt(Math.max(0, 1 - c * c));
|
|
35
|
+
}
|
|
36
|
+
return components(load.direction).map(({ axis, factor }) => {
|
|
37
|
+
if (load.type === "point")
|
|
38
|
+
return { type: "point", axis, P: load.P * factor * 1e3, a: load.a };
|
|
39
|
+
const [w1, w2] = load.type === "udl" ? [load.w, load.w] : [load.w1, load.w2];
|
|
40
|
+
return {
|
|
41
|
+
type: "distributed",
|
|
42
|
+
axis,
|
|
43
|
+
w1: w1 * factor * projection, // kN/m = N/mm
|
|
44
|
+
w2: w2 * factor * projection,
|
|
45
|
+
start: load.start ?? 0,
|
|
46
|
+
end: load.end ?? L,
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* The part of a member's local loads that falls on one of its pieces, `[offset, offset + L]`,
|
|
52
|
+
* in the piece's own positions. A distributed load or torque is cut at the piece ends; a point
|
|
53
|
+
* load goes to the piece it lies in (at an interior node, to the piece that starts there).
|
|
54
|
+
*/
|
|
55
|
+
const clipLoads = (loads, offset, L, last) => {
|
|
56
|
+
const end = offset + L;
|
|
57
|
+
const tolerance = 1e-9 * end;
|
|
58
|
+
const out = [];
|
|
59
|
+
for (const load of loads) {
|
|
60
|
+
if (load.type === "point") {
|
|
61
|
+
const inside = load.a >= offset - tolerance && (load.a < end - tolerance || last);
|
|
62
|
+
if (inside)
|
|
63
|
+
out.push({ ...load, a: Math.min(L, Math.max(0, load.a - offset)) });
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const from = Math.max(load.start, offset);
|
|
67
|
+
const to = Math.min(load.end, end);
|
|
68
|
+
if (to - from <= tolerance)
|
|
69
|
+
continue;
|
|
70
|
+
if (load.type === "torque") {
|
|
71
|
+
out.push({ ...load, start: from - offset, end: to - offset });
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
out.push({
|
|
75
|
+
...load,
|
|
76
|
+
w1: (0, fixed_end_forces_1.loadIntensity)(load, from),
|
|
77
|
+
w2: (0, fixed_end_forces_1.loadIntensity)(load, to),
|
|
78
|
+
start: from - offset,
|
|
79
|
+
end: to - offset,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* The local loads (N and mm) on every member piece in one load case: each member load, and the
|
|
87
|
+
* self-weight `selfWeight · unitWeight · A` per unit length along global −Z, resolved in the
|
|
88
|
+
* whole member's local axes, then cut at its pieces.
|
|
89
|
+
*
|
|
90
|
+
* @param groups - Model members and the pieces each is analysed as
|
|
91
|
+
* @param pieces - Every member piece
|
|
92
|
+
* @param memberIndex - Index into `groups` of each member id
|
|
93
|
+
* @param loads - The load case's member loads
|
|
94
|
+
* @param loadCaseId - The load case, which tags the self-weight load
|
|
95
|
+
* @param selfWeight - The load case's self-weight multiplier
|
|
96
|
+
* @returns The local loads of each piece, in the order of `pieces`
|
|
97
|
+
* @throws {FeaError} 313 if self-weight is requested for a member without `unitWeight`
|
|
98
|
+
*/
|
|
99
|
+
const memberPieceLoads = (groups, pieces, memberIndex, loads, loadCaseId, selfWeight) => {
|
|
100
|
+
const loadsByMember = groups.map(() => []);
|
|
101
|
+
for (const load of loads) {
|
|
102
|
+
loadsByMember[memberIndex.get(load.memberId)].push(load);
|
|
103
|
+
}
|
|
104
|
+
// local loads of each model member, then of each piece it is analysed as
|
|
105
|
+
const memberLoads = pieces.map(() => []);
|
|
106
|
+
groups.forEach((group, g) => {
|
|
107
|
+
const memberLoadsHere = [...loadsByMember[g]];
|
|
108
|
+
if (selfWeight !== 0) {
|
|
109
|
+
const { unitWeight, A } = group.section;
|
|
110
|
+
if (unitWeight === undefined)
|
|
111
|
+
throw new fea_error_1.FeaError(fea_error_1.FeaErrors.MISSING_UNIT_WEIGHT);
|
|
112
|
+
// kN/m³ · m² = kN/m
|
|
113
|
+
const w = -selfWeight * unitWeight * A * 1e-6;
|
|
114
|
+
if (w !== 0) {
|
|
115
|
+
memberLoadsHere.push({
|
|
116
|
+
loadCase: loadCaseId,
|
|
117
|
+
type: "udl",
|
|
118
|
+
memberId: group.id,
|
|
119
|
+
direction: "Z",
|
|
120
|
+
w,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const local = memberLoadsHere.flatMap((load) => toLocalLoads(load, group.lambda, group.length));
|
|
125
|
+
if (group.pieces.length === 1) {
|
|
126
|
+
memberLoads[group.pieces[0]] = local;
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
group.pieces.forEach((p, k) => {
|
|
130
|
+
const piece = pieces[p];
|
|
131
|
+
memberLoads[p] = clipLoads(local, piece.offset, piece.length, k === group.pieces.length - 1);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
return memberLoads;
|
|
135
|
+
};
|
|
136
|
+
exports.memberPieceLoads = memberPieceLoads;
|
|
137
|
+
/** A local member load scaled by `factor`, e.g. for a load combination. */
|
|
138
|
+
const scaleMemberLoad = (load, factor) => {
|
|
139
|
+
if (load.type === "distributed")
|
|
140
|
+
return { ...load, w1: load.w1 * factor, w2: load.w2 * factor };
|
|
141
|
+
if (load.type === "torque")
|
|
142
|
+
return { ...load, t: load.t * factor };
|
|
143
|
+
return { ...load, P: load.P * factor };
|
|
144
|
+
};
|
|
145
|
+
exports.scaleMemberLoad = scaleMemberLoad;
|
|
146
|
+
//# sourceMappingURL=member-loads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"member-loads.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/member-loads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { SectionProperties } from "../../../core/types/section-properties.type";
|
|
2
|
+
import type { FeaId, FeaNode } from "../../shared/types/model.type";
|
|
3
|
+
import type { Matrix } from "../../../utils/matrix";
|
|
4
|
+
import { type CondensedMember } from "../elements/static-condensation";
|
|
5
|
+
import type { Member } from "../types/model.type";
|
|
6
|
+
import type { AssemblyMember } from "./member-assembly";
|
|
7
|
+
/**
|
|
8
|
+
* A member, or a piece of one, with everything that does not depend on the loads. A member is
|
|
9
|
+
* cut into pieces where generated shell-mesh nodes lie inside it; otherwise it is one piece.
|
|
10
|
+
*/
|
|
11
|
+
export interface SystemMember extends AssemblyMember {
|
|
12
|
+
id: FeaId;
|
|
13
|
+
/** Distance of the piece's start from the member's start (mm); 0 for a whole member. */
|
|
14
|
+
offset: number;
|
|
15
|
+
section: SectionProperties;
|
|
16
|
+
length: number;
|
|
17
|
+
lambda: Matrix;
|
|
18
|
+
/** True when any end DOF is released or tied by a spring. */
|
|
19
|
+
hasReleases: boolean;
|
|
20
|
+
/** Condenses a member's fixed-end forces for its end releases. */
|
|
21
|
+
condenseFixedEndForces: CondensedMember["condenseFixedEndForces"];
|
|
22
|
+
/** The member's own end displacements from its end nodes' (differ across releases). */
|
|
23
|
+
memberEndDisplacements: CondensedMember["memberEndDisplacements"];
|
|
24
|
+
}
|
|
25
|
+
/** A model member and the pieces it is analysed as (one unless the shell mesh splits it). */
|
|
26
|
+
export interface MemberGroup {
|
|
27
|
+
id: FeaId;
|
|
28
|
+
/** Indices of its pieces among all pieces, from the member's start to its end. */
|
|
29
|
+
pieces: number[];
|
|
30
|
+
section: SectionProperties;
|
|
31
|
+
length: number;
|
|
32
|
+
lambda: Matrix;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Builds the pieces of every member of a model that passed `validateModel`: local axes,
|
|
36
|
+
* transformation and local stiffness condensed for the end releases, which apply only at the
|
|
37
|
+
* member's own ends. A member is one piece unless mesh nodes lie inside it.
|
|
38
|
+
*
|
|
39
|
+
* @param members - Members, in model order; after `expandModel` each lists the generated nodes
|
|
40
|
+
* it passes through, in order from its start
|
|
41
|
+
* @param nodes - The analysed nodes, generated mesh nodes included
|
|
42
|
+
* @param nodeIndex - Map from node id to index into `nodes`
|
|
43
|
+
* @returns `pieces` to assemble, and one `group` per member indexing its pieces
|
|
44
|
+
*/
|
|
45
|
+
export declare const prepareSystemMembers: (members: (Member & {
|
|
46
|
+
through?: FeaId[];
|
|
47
|
+
})[], nodes: FeaNode[], nodeIndex: Map<FeaId, number>) => {
|
|
48
|
+
pieces: SystemMember[];
|
|
49
|
+
groups: MemberGroup[];
|
|
50
|
+
};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareSystemMembers = void 0;
|
|
4
|
+
const beam_3d_stiffness_1 = require("../elements/beam-3d-stiffness");
|
|
5
|
+
const end_releases_1 = require("../elements/end-releases");
|
|
6
|
+
const static_condensation_1 = require("../elements/static-condensation");
|
|
7
|
+
const coordinate_transform_1 = require("../transformation/coordinate-transform");
|
|
8
|
+
/**
|
|
9
|
+
* Builds the pieces of every member of a model that passed `validateModel`: local axes,
|
|
10
|
+
* transformation and local stiffness condensed for the end releases, which apply only at the
|
|
11
|
+
* member's own ends. A member is one piece unless mesh nodes lie inside it.
|
|
12
|
+
*
|
|
13
|
+
* @param members - Members, in model order; after `expandModel` each lists the generated nodes
|
|
14
|
+
* it passes through, in order from its start
|
|
15
|
+
* @param nodes - The analysed nodes, generated mesh nodes included
|
|
16
|
+
* @param nodeIndex - Map from node id to index into `nodes`
|
|
17
|
+
* @returns `pieces` to assemble, and one `group` per member indexing its pieces
|
|
18
|
+
*/
|
|
19
|
+
const prepareSystemMembers = (members, nodes, nodeIndex) => {
|
|
20
|
+
const point = (id) => {
|
|
21
|
+
const n = nodes[nodeIndex.get(id)];
|
|
22
|
+
return [n.x, n.y, n.z];
|
|
23
|
+
};
|
|
24
|
+
const systemMembers = [];
|
|
25
|
+
const memberGroups = members.map((member) => {
|
|
26
|
+
// pieces between the member's ends and the mesh nodes inside it (see `expandModel`)
|
|
27
|
+
const chain = [member.startNodeId, ...(member.through ?? []), member.endNodeId];
|
|
28
|
+
const whole = (0, coordinate_transform_1.memberAxes)(point(member.startNodeId), point(member.endNodeId), member.angle ?? 0);
|
|
29
|
+
const { E, G, A, I22, I33, J } = member.section;
|
|
30
|
+
const pieces = [];
|
|
31
|
+
let offset = 0;
|
|
32
|
+
for (let k = 0; k + 1 < chain.length; k++) {
|
|
33
|
+
const { length, lambda } = chain.length === 2
|
|
34
|
+
? whole
|
|
35
|
+
: (0, coordinate_transform_1.memberAxes)(point(chain[k]), point(chain[k + 1]), member.angle ?? 0);
|
|
36
|
+
// releases only at the member's own ends
|
|
37
|
+
const releases = (0, end_releases_1.memberEndReleases)({
|
|
38
|
+
start: k === 0 ? member.releases?.start : undefined,
|
|
39
|
+
end: k === chain.length - 2 ? member.releases?.end : undefined,
|
|
40
|
+
});
|
|
41
|
+
const condensed = (0, static_condensation_1.condenseMember)((0, beam_3d_stiffness_1.beam3dLocalStiffnessRightHanded)(E, G, A, I22, I33, J, length), releases);
|
|
42
|
+
pieces.push(systemMembers.length);
|
|
43
|
+
systemMembers.push({
|
|
44
|
+
id: member.id,
|
|
45
|
+
offset,
|
|
46
|
+
section: member.section,
|
|
47
|
+
startIndex: nodeIndex.get(chain[k]),
|
|
48
|
+
endIndex: nodeIndex.get(chain[k + 1]),
|
|
49
|
+
T: (0, coordinate_transform_1.transformationMatrix)(lambda),
|
|
50
|
+
k: condensed.k,
|
|
51
|
+
hasReleases: releases.length > 0,
|
|
52
|
+
condenseFixedEndForces: condensed.condenseFixedEndForces,
|
|
53
|
+
memberEndDisplacements: condensed.memberEndDisplacements,
|
|
54
|
+
length,
|
|
55
|
+
lambda,
|
|
56
|
+
});
|
|
57
|
+
offset += length;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
id: member.id,
|
|
61
|
+
pieces,
|
|
62
|
+
section: member.section,
|
|
63
|
+
length: whole.length,
|
|
64
|
+
lambda: whole.lambda,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
return { pieces: systemMembers, groups: memberGroups };
|
|
68
|
+
};
|
|
69
|
+
exports.prepareSystemMembers = prepareSystemMembers;
|
|
70
|
+
//# sourceMappingURL=system-member.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-member.js","sourceRoot":"","sources":["../../../../src/fea/frame/solver/system-member.ts"],"names":[],"mappings":";;;AAIA,qEAAgF;AAChF,2DAA6D;AAC7D,yEAAuF;AACvF,iFAA0F;AAiC1F;;;;;;;;;;GAUG;AACI,MAAM,oBAAoB,GAAG,CAClC,OAA2C,EAC3C,KAAgB,EAChB,SAA6B,EACsB,EAAE;IACrD,MAAM,KAAK,GAAG,CAAC,EAAS,EAA4B,EAAE;QACpD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAW,CAAC,CAAC;QAC7C,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC;IACF,MAAM,aAAa,GAAmB,EAAE,CAAC;IACzC,MAAM,YAAY,GAAkB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACzD,oFAAoF;QACpF,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,IAAA,iCAAU,EAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAChG,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;QAChD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GACtB,KAAK,CAAC,MAAM,KAAK,CAAC;gBAChB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAA,iCAAU,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YAC1E,yCAAyC;YACzC,MAAM,QAAQ,GAAG,IAAA,gCAAiB,EAAC;gBACjC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS;gBACnD,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS;aAC/D,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,oCAAc,EAC9B,IAAA,mDAA+B,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,EAC7D,QAAQ,CACT,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAClC,aAAa,CAAC,IAAI,CAAC;gBACjB,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,MAAM;gBACN,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAW;gBAC7C,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAW;gBAC/C,CAAC,EAAE,IAAA,2CAAoB,EAAC,MAAM,CAAC;gBAC/B,CAAC,EAAE,SAAS,CAAC,CAAC;gBACd,WAAW,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAChC,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;gBACxD,sBAAsB,EAAE,SAAS,CAAC,sBAAsB;gBACxD,MAAM;gBACN,MAAM;aACP,CAAC,CAAC;YACH,MAAM,IAAI,MAAM,CAAC;QACnB,CAAC;QACD,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AACzD,CAAC,CAAC;AAzDW,QAAA,oBAAoB,wBAyD/B"}
|
|
@@ -11,7 +11,7 @@ import { type Matrix } from "../../../utils/matrix";
|
|
|
11
11
|
* @param end - End node coordinates in mm
|
|
12
12
|
* @param angle - Member angle in rad (default 0)
|
|
13
13
|
* @returns `{ length, lambda }` with `lambda` rows = local 1, 2, 3 in global components
|
|
14
|
-
* @throws {
|
|
14
|
+
* @throws {FeaError} 301 if the nodes coincide
|
|
15
15
|
*/
|
|
16
16
|
export declare const memberAxes: (start: [number, number, number], end: [number, number, number], angle?: number) => {
|
|
17
17
|
length: number;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.transformationMatrix = exports.memberAxes = void 0;
|
|
4
4
|
const frame_constant_1 = require("../../../core/constants/frame.constant");
|
|
5
|
-
const
|
|
5
|
+
const fea_error_1 = require("../../../core/errors/fea.error");
|
|
6
6
|
const matrix_1 = require("../../../utils/matrix");
|
|
7
7
|
const cross = (a, b) => [
|
|
8
8
|
a[1] * b[2] - a[2] * b[1],
|
|
@@ -23,13 +23,13 @@ const scale = (a, s) => [a[0] * s, a[1] * s, a[2] * s];
|
|
|
23
23
|
* @param end - End node coordinates in mm
|
|
24
24
|
* @param angle - Member angle in rad (default 0)
|
|
25
25
|
* @returns `{ length, lambda }` with `lambda` rows = local 1, 2, 3 in global components
|
|
26
|
-
* @throws {
|
|
26
|
+
* @throws {FeaError} 301 if the nodes coincide
|
|
27
27
|
*/
|
|
28
28
|
const memberAxes = (start, end, angle = 0) => {
|
|
29
29
|
const d = [end[0] - start[0], end[1] - start[1], end[2] - start[2]];
|
|
30
30
|
const length = norm(d);
|
|
31
31
|
if (!(length > 0))
|
|
32
|
-
throw new
|
|
32
|
+
throw new fea_error_1.FeaError(fea_error_1.FeaErrors.ZERO_LENGTH_MEMBER);
|
|
33
33
|
const e1 = scale(d, 1 / length);
|
|
34
34
|
let e2;
|
|
35
35
|
let e3;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinate-transform.js","sourceRoot":"","sources":["../../../../src/fea/frame/transformation/coordinate-transform.ts"],"names":[],"mappings":";;;AAAA,uEAA+E;AAC/E,
|
|
1
|
+
{"version":3,"file":"coordinate-transform.js","sourceRoot":"","sources":["../../../../src/fea/frame/transformation/coordinate-transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +1,5 @@
|
|
|
1
1
|
import type { SectionProperties } from "../../../core/types/section-properties.type";
|
|
2
|
-
|
|
3
|
-
export interface FrameNode {
|
|
4
|
-
id: FrameId;
|
|
5
|
-
x: number;
|
|
6
|
-
y: number;
|
|
7
|
-
z: number;
|
|
8
|
-
}
|
|
9
|
-
/** A restrained DOF: `true` is fixed, a number is a spring stiffness, omitted/`false` is free. */
|
|
10
|
-
export type DofRestraint = boolean | number;
|
|
11
|
-
/**
|
|
12
|
-
* Fixed DOFs along a straight line: every node on the segment between two nodes, including the
|
|
13
|
-
* nodes the engine generates when it meshes shell areas, e.g. a wall base fixed along its
|
|
14
|
-
* length. `true` fixes the DOF; there are no line springs. Combined with point restraints at
|
|
15
|
-
* the same node, a fixed DOF stays fixed.
|
|
16
|
-
*/
|
|
17
|
-
export interface LineRestraint {
|
|
18
|
-
nodeIds: [FrameId, FrameId];
|
|
19
|
-
ux?: boolean;
|
|
20
|
-
uy?: boolean;
|
|
21
|
-
uz?: boolean;
|
|
22
|
-
rx?: boolean;
|
|
23
|
-
ry?: boolean;
|
|
24
|
-
rz?: boolean;
|
|
25
|
-
}
|
|
26
|
-
export interface Restraint {
|
|
27
|
-
nodeId: FrameId;
|
|
28
|
-
ux?: DofRestraint;
|
|
29
|
-
uy?: DofRestraint;
|
|
30
|
-
uz?: DofRestraint;
|
|
31
|
-
rx?: DofRestraint;
|
|
32
|
-
ry?: DofRestraint;
|
|
33
|
-
rz?: DofRestraint;
|
|
34
|
-
}
|
|
2
|
+
import type { FeaId } from "../../shared/types/model.type";
|
|
35
3
|
/**
|
|
36
4
|
* How a member end DOF is tied to its node: `true` (or 0) is a full release that carries no
|
|
37
5
|
* force, a positive number is a spring stiffness in series with the member end (partial
|
|
@@ -48,9 +16,9 @@ export interface MemberEndRelease {
|
|
|
48
16
|
r3?: DofRelease;
|
|
49
17
|
}
|
|
50
18
|
export interface Member {
|
|
51
|
-
id:
|
|
52
|
-
startNodeId:
|
|
53
|
-
endNodeId:
|
|
19
|
+
id: FeaId;
|
|
20
|
+
startNodeId: FeaId;
|
|
21
|
+
endNodeId: FeaId;
|
|
54
22
|
section: SectionProperties;
|
|
55
23
|
angle?: number;
|
|
56
24
|
releases?: {
|
|
@@ -58,16 +26,6 @@ export interface Member {
|
|
|
58
26
|
end?: MemberEndRelease;
|
|
59
27
|
};
|
|
60
28
|
}
|
|
61
|
-
export interface NodalLoad {
|
|
62
|
-
loadCase: string;
|
|
63
|
-
nodeId: FrameId;
|
|
64
|
-
fx?: number;
|
|
65
|
-
fy?: number;
|
|
66
|
-
fz?: number;
|
|
67
|
-
mx?: number;
|
|
68
|
-
my?: number;
|
|
69
|
-
mz?: number;
|
|
70
|
-
}
|
|
71
29
|
/** Load direction: local member axes "1", "2", "3" or global axes "X", "Y", "Z". */
|
|
72
30
|
export type LoadDirection = "1" | "2" | "3" | "X" | "Y" | "Z";
|
|
73
31
|
/**
|
|
@@ -79,7 +37,7 @@ export type LoadDirection = "1" | "2" | "3" | "X" | "Y" | "Z";
|
|
|
79
37
|
export interface UniformMemberLoad {
|
|
80
38
|
loadCase: string;
|
|
81
39
|
type: "udl";
|
|
82
|
-
memberId:
|
|
40
|
+
memberId: FeaId;
|
|
83
41
|
direction: LoadDirection;
|
|
84
42
|
w: number;
|
|
85
43
|
start?: number;
|
|
@@ -89,7 +47,7 @@ export interface UniformMemberLoad {
|
|
|
89
47
|
export interface PointMemberLoad {
|
|
90
48
|
loadCase: string;
|
|
91
49
|
type: "point";
|
|
92
|
-
memberId:
|
|
50
|
+
memberId: FeaId;
|
|
93
51
|
direction: LoadDirection;
|
|
94
52
|
P: number;
|
|
95
53
|
a: number;
|
|
@@ -102,7 +60,7 @@ export interface PointMemberLoad {
|
|
|
102
60
|
export interface TrapezoidalMemberLoad {
|
|
103
61
|
loadCase: string;
|
|
104
62
|
type: "trapezoidal";
|
|
105
|
-
memberId:
|
|
63
|
+
memberId: FeaId;
|
|
106
64
|
direction: LoadDirection;
|
|
107
65
|
w1: number;
|
|
108
66
|
w2: number;
|
|
@@ -117,7 +75,7 @@ export interface TrapezoidalMemberLoad {
|
|
|
117
75
|
export interface TorqueMemberLoad {
|
|
118
76
|
loadCase: string;
|
|
119
77
|
type: "torque";
|
|
120
|
-
memberId:
|
|
78
|
+
memberId: FeaId;
|
|
121
79
|
t: number;
|
|
122
80
|
start?: number;
|
|
123
81
|
end?: number;
|
|
@@ -137,132 +95,9 @@ export type AreaDistribution = "twoWay" | "oneWay" | "cantilever";
|
|
|
137
95
|
* nodes, so nodes listed counter-clockwise seen from above give local 3 = +Z.
|
|
138
96
|
*/
|
|
139
97
|
export interface NullArea {
|
|
140
|
-
id:
|
|
141
|
-
nodeIds:
|
|
98
|
+
id: FeaId;
|
|
99
|
+
nodeIds: FeaId[];
|
|
142
100
|
distribution: AreaDistribution;
|
|
143
101
|
/** Edge indices that carry the load: one-way supports, or the one cantilever support. */
|
|
144
102
|
supportEdges?: number[];
|
|
145
103
|
}
|
|
146
|
-
/**
|
|
147
|
-
* How a shell area carries load: in its plane and in bending (`"shell"`), in its plane only
|
|
148
|
-
* (`"membrane"`: u1, u2 and the rotation about local 3), or in bending only (`"plate"`: u3 and
|
|
149
|
-
* the rotations about local 1 and 2).
|
|
150
|
-
*/
|
|
151
|
-
export type ShellType = "shell" | "membrane" | "plate";
|
|
152
|
-
/** Material and thickness of a shell area. */
|
|
153
|
-
export interface ShellSection {
|
|
154
|
-
thickness: number;
|
|
155
|
-
E: number;
|
|
156
|
-
nu: number;
|
|
157
|
-
unitWeight?: number;
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Stiffness modifiers of a shell area along its local axes 1 and 2 (default 1 each), e.g. for
|
|
161
|
-
* cracked walls and slabs: f11, f22, f12 scale the membrane rigidity and m11, m22, m12 the
|
|
162
|
-
* bending rigidity (each matrix becomes S·D·S, S = diag(√f11, √f22, √f12)); weight scales the
|
|
163
|
-
* self-weight only.
|
|
164
|
-
*/
|
|
165
|
-
export interface ShellModifiers {
|
|
166
|
-
f11?: number;
|
|
167
|
-
f22?: number;
|
|
168
|
-
f12?: number;
|
|
169
|
-
m11?: number;
|
|
170
|
-
m22?: number;
|
|
171
|
-
m12?: number;
|
|
172
|
-
weight?: number;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* How the engine meshes a shell area: `maxSize` (mm) is the largest element side wanted;
|
|
176
|
-
* `divisions` the least number of elements along edges 0–1 and 1–2 (from `nodeIds[0]` to
|
|
177
|
-
* `nodeIds[1]` and from `nodeIds[1]` to `nodeIds[2]`). Counts may grow so that areas sharing an
|
|
178
|
-
* edge, or meeting it at a node, share their mesh nodes.
|
|
179
|
-
*/
|
|
180
|
-
export interface ShellMesh {
|
|
181
|
-
maxSize?: number;
|
|
182
|
-
divisions?: [number, number];
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* A four-node flat shell area: a drilling-rotation membrane and a thin (DKQ) plate, built on
|
|
186
|
-
* the mean plane of its corners. Without `mesh` it is one element, unless a neighbour's mesh or
|
|
187
|
-
* a node lying on its edge forces divisions. Local axis 3 is the normal by the
|
|
188
|
-
* right-hand rule around `nodeIds`; local 2 is +Z projected onto the plane (upward on a wall)
|
|
189
|
-
* and local 1 = 2 × 3 is horizontal, except on a horizontal shell, where local 1 = +X.
|
|
190
|
-
* `angle` rotates local 1 and 2 about local 3. Its id shares one namespace with null areas, so
|
|
191
|
-
* `AreaLoad` can load it.
|
|
192
|
-
*/
|
|
193
|
-
export interface ShellArea {
|
|
194
|
-
id: FrameId;
|
|
195
|
-
nodeIds: FrameId[];
|
|
196
|
-
type?: ShellType;
|
|
197
|
-
section: ShellSection;
|
|
198
|
-
angle?: number;
|
|
199
|
-
modifiers?: ShellModifiers;
|
|
200
|
-
mesh?: ShellMesh;
|
|
201
|
-
}
|
|
202
|
-
/** Area load direction: the area's local normal "3" or a global axis. */
|
|
203
|
-
export type AreaLoadDirection = "3" | "X" | "Y" | "Z";
|
|
204
|
-
/**
|
|
205
|
-
* Uniform load on a null area or a shell area. `q` is per unit true area, or with
|
|
206
|
-
* `projected: true` (global directions only) per unit area projected onto the plane normal to
|
|
207
|
-
* `direction`, e.g. per plan area on a ramp; it is then applied as `q · |n · direction|` on
|
|
208
|
-
* the true area. A null area sends it to the members along its edges; a shell area takes it
|
|
209
|
-
* as forces at its corners, each corner the share `∫ Nᵢ dA` of its area.
|
|
210
|
-
*/
|
|
211
|
-
export interface AreaLoad {
|
|
212
|
-
loadCase: string;
|
|
213
|
-
areaId: FrameId;
|
|
214
|
-
direction: AreaLoadDirection;
|
|
215
|
-
q: number;
|
|
216
|
-
projected?: boolean;
|
|
217
|
-
}
|
|
218
|
-
/** Descriptive category of a load case; it labels the case and does not change the analysis. */
|
|
219
|
-
export type LoadCaseType = "dead" | "superDead" | "live" | "roofLive" | "snow" | "wind" | "seismic" | "other";
|
|
220
|
-
/**
|
|
221
|
-
* One independently analysed set of loads, e.g. dead, superimposed dead or live. The loads
|
|
222
|
-
* themselves are listed in `FrameModel.nodalLoads` and `FrameModel.memberLoads`, each tagged
|
|
223
|
-
* with its `loadCase`.
|
|
224
|
-
*/
|
|
225
|
-
export interface LoadCase {
|
|
226
|
-
id: string;
|
|
227
|
-
name?: string;
|
|
228
|
-
type?: LoadCaseType;
|
|
229
|
-
/**
|
|
230
|
-
* Self-weight multiplier (1 = full self-weight). Applies `selfWeight · unitWeight · A` per unit
|
|
231
|
-
* length of every member and `selfWeight · unitWeight · thickness` (times `modifiers.weight`)
|
|
232
|
-
* per unit area of every shell, along global −Z. Default 0.
|
|
233
|
-
*/
|
|
234
|
-
selfWeight?: number;
|
|
235
|
-
}
|
|
236
|
-
/** One term of a load combination: a factor times a load case or another combination. */
|
|
237
|
-
export type CombinationTerm = {
|
|
238
|
-
case: string;
|
|
239
|
-
factor: number;
|
|
240
|
-
} | {
|
|
241
|
-
combination: string;
|
|
242
|
-
factor: number;
|
|
243
|
-
};
|
|
244
|
-
/** A linear combination (sum of factored terms) of load cases and other combinations. */
|
|
245
|
-
export interface LoadCombination {
|
|
246
|
-
id: string;
|
|
247
|
-
name?: string;
|
|
248
|
-
terms: CombinationTerm[];
|
|
249
|
-
}
|
|
250
|
-
export interface FrameModel {
|
|
251
|
-
nodes: FrameNode[];
|
|
252
|
-
members: Member[];
|
|
253
|
-
restraints: Restraint[];
|
|
254
|
-
/** Fixed DOFs of every node along straight lines, generated mesh nodes included. */
|
|
255
|
-
lineRestraints?: LineRestraint[];
|
|
256
|
-
loadCases: LoadCase[];
|
|
257
|
-
/** Nodal loads of every load case, each tagged with its `loadCase`. */
|
|
258
|
-
nodalLoads?: NodalLoad[];
|
|
259
|
-
/** Member loads of every load case, each tagged with its `loadCase`. */
|
|
260
|
-
memberLoads?: MemberLoad[];
|
|
261
|
-
/** Null areas that distribute `areaLoads` to the members along their edges. */
|
|
262
|
-
areas?: NullArea[];
|
|
263
|
-
/** Shell areas: four-node flat shell elements with membrane and/or plate stiffness. */
|
|
264
|
-
shells?: ShellArea[];
|
|
265
|
-
/** Area loads of every load case, each tagged with its `loadCase`. */
|
|
266
|
-
areaLoads?: AreaLoad[];
|
|
267
|
-
combinations?: LoadCombination[];
|
|
268
|
-
}
|