@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.
Files changed (305) hide show
  1. package/CHANGELOG.md +33 -1
  2. package/README.md +284 -127
  3. package/dist/core/errors/fea.error.d.ts +47 -0
  4. package/dist/{esm/core/errors/frame-analysis.error.js → core/errors/fea.error.js} +14 -5
  5. package/dist/core/errors/fea.error.js.map +1 -0
  6. package/dist/core/index.d.ts +4 -2
  7. package/dist/core/index.js +8 -4
  8. package/dist/core/index.js.map +1 -1
  9. package/dist/{core/errors/frame-analysis.error.js → esm/core/errors/fea.error.js} +10 -9
  10. package/dist/esm/core/errors/fea.error.js.map +1 -0
  11. package/dist/esm/core/index.js +3 -1
  12. package/dist/esm/core/index.js.map +1 -1
  13. package/dist/esm/fea/analysis/index.js +6 -0
  14. package/dist/esm/fea/analysis/index.js.map +1 -0
  15. package/dist/esm/fea/{frame → analysis}/mesh/expand-model.js +12 -6
  16. package/dist/esm/fea/analysis/mesh/expand-model.js.map +1 -0
  17. package/dist/esm/fea/{frame → analysis}/post/demand-envelope.js +4 -4
  18. package/dist/esm/fea/analysis/post/demand-envelope.js.map +1 -0
  19. package/dist/esm/fea/analysis/post/envelope.js.map +1 -0
  20. package/dist/esm/fea/{frame → analysis}/post/present-state.js +4 -4
  21. package/dist/esm/fea/analysis/post/present-state.js.map +1 -0
  22. package/dist/esm/fea/{frame/solver/frame-system.js → analysis/solver/analysis-system.js} +17 -90
  23. package/dist/esm/fea/analysis/solver/analysis-system.js.map +1 -0
  24. package/dist/esm/fea/{frame/solver/analyze-frame.js → analysis/solver/analyze.js} +20 -18
  25. package/dist/esm/fea/analysis/solver/analyze.js.map +1 -0
  26. package/dist/esm/fea/{frame → analysis}/solver/combinations.js +8 -8
  27. package/dist/esm/fea/analysis/solver/combinations.js.map +1 -0
  28. package/dist/esm/fea/analysis/solver/distribute-area-loads.js +25 -0
  29. package/dist/esm/fea/analysis/solver/distribute-area-loads.js.map +1 -0
  30. package/dist/esm/fea/analysis/solver/load-case-solver.js +103 -0
  31. package/dist/esm/fea/analysis/solver/load-case-solver.js.map +1 -0
  32. package/dist/esm/fea/analysis/types/model.type.js +2 -0
  33. package/dist/esm/fea/analysis/types/model.type.js.map +1 -0
  34. package/dist/esm/fea/analysis/types/results.type.js +2 -0
  35. package/dist/esm/fea/analysis/types/results.type.js.map +1 -0
  36. package/dist/esm/fea/analysis/validation/validate-model.js +263 -0
  37. package/dist/esm/fea/analysis/validation/validate-model.js.map +1 -0
  38. package/dist/esm/fea/deprecated.js +9 -0
  39. package/dist/esm/fea/deprecated.js.map +1 -0
  40. package/dist/esm/fea/frame/area/{distribute-area-loads.js → area-member-loads.js} +7 -28
  41. package/dist/esm/fea/frame/area/area-member-loads.js.map +1 -0
  42. package/dist/esm/fea/frame/area/edge-members.js.map +1 -1
  43. package/dist/esm/fea/frame/elements/end-releases.js +2 -6
  44. package/dist/esm/fea/frame/elements/end-releases.js.map +1 -1
  45. package/dist/esm/fea/frame/elements/fixed-end-forces.js +5 -5
  46. package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -1
  47. package/dist/esm/fea/frame/elements/static-condensation.js +3 -3
  48. package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -1
  49. package/dist/esm/fea/frame/index.js +1 -4
  50. package/dist/esm/fea/frame/index.js.map +1 -1
  51. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
  52. package/dist/esm/fea/frame/solver/{global-assembly.js → member-assembly.js} +2 -10
  53. package/dist/esm/fea/frame/solver/member-assembly.js.map +1 -0
  54. package/dist/esm/fea/frame/solver/member-loads.js +141 -0
  55. package/dist/esm/fea/frame/solver/member-loads.js.map +1 -0
  56. package/dist/esm/fea/frame/solver/system-member.js +66 -0
  57. package/dist/esm/fea/frame/solver/system-member.js.map +1 -0
  58. package/dist/esm/fea/frame/transformation/coordinate-transform.js +3 -3
  59. package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -1
  60. package/dist/esm/fea/frame/validation/validate-members.js +160 -0
  61. package/dist/esm/fea/frame/validation/validate-members.js.map +1 -0
  62. package/dist/esm/fea/frame/validation/validate-null-areas.js +88 -0
  63. package/dist/esm/fea/frame/validation/validate-null-areas.js.map +1 -0
  64. package/dist/esm/fea/index.js +4 -1
  65. package/dist/esm/fea/index.js.map +1 -1
  66. package/dist/esm/fea/shared/index.js +2 -0
  67. package/dist/esm/fea/shared/index.js.map +1 -0
  68. package/dist/esm/fea/shared/solver/auto-restraint.js.map +1 -0
  69. package/dist/esm/fea/{frame → shared}/solver/boundary-conditions.js +5 -1
  70. package/dist/esm/fea/shared/solver/boundary-conditions.js.map +1 -0
  71. package/dist/esm/fea/shared/solver/global-assembly.js +10 -0
  72. package/dist/esm/fea/shared/solver/global-assembly.js.map +1 -0
  73. package/dist/esm/fea/shared/types/model.type.js +2 -0
  74. package/dist/esm/fea/shared/types/model.type.js.map +1 -0
  75. package/dist/esm/fea/shared/validation/issues.js +32 -0
  76. package/dist/esm/fea/shared/validation/issues.js.map +1 -0
  77. package/dist/esm/fea/{frame/elements/shell → shell/elements}/dkq-plate.js +1 -1
  78. package/dist/esm/fea/shell/elements/dkq-plate.js.map +1 -0
  79. package/dist/esm/fea/{frame/elements/shell → shell/elements}/flat-shell.js +1 -1
  80. package/dist/esm/fea/shell/elements/flat-shell.js.map +1 -0
  81. package/dist/esm/fea/{frame/elements/shell → shell/elements}/membrane-quad.js +2 -2
  82. package/dist/esm/fea/shell/elements/membrane-quad.js.map +1 -0
  83. package/dist/esm/fea/shell/elements/quad-geometry.js.map +1 -0
  84. package/dist/esm/fea/shell/elements/rigidity.js.map +1 -0
  85. package/dist/esm/fea/{frame/elements/shell → shell/elements}/shell-axes.js +1 -1
  86. package/dist/esm/fea/shell/elements/shell-axes.js.map +1 -0
  87. package/dist/esm/fea/shell/index.js +2 -0
  88. package/dist/esm/fea/shell/index.js.map +1 -0
  89. package/dist/esm/fea/{frame → shell}/mesh/mesh-shells.js +1 -1
  90. package/dist/esm/fea/shell/mesh/mesh-shells.js.map +1 -0
  91. package/dist/esm/fea/{frame → shell}/post/shell-forces.js +4 -4
  92. package/dist/esm/fea/{frame → shell}/post/shell-forces.js.map +1 -1
  93. package/dist/esm/fea/shell/solver/shell-loads.js +53 -0
  94. package/dist/esm/fea/shell/solver/shell-loads.js.map +1 -0
  95. package/dist/esm/fea/shell/solver/system-shell.js +37 -0
  96. package/dist/esm/fea/shell/solver/system-shell.js.map +1 -0
  97. package/dist/esm/fea/shell/types/model.type.js +2 -0
  98. package/dist/esm/fea/shell/types/model.type.js.map +1 -0
  99. package/dist/esm/fea/shell/types/results.type.js +2 -0
  100. package/dist/esm/fea/shell/types/results.type.js.map +1 -0
  101. package/dist/esm/fea/shell/validation/validate-shells.js +98 -0
  102. package/dist/esm/fea/shell/validation/validate-shells.js.map +1 -0
  103. package/dist/esm/index.js +5 -3
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/fea/analysis/index.d.ts +8 -0
  106. package/dist/fea/analysis/index.js +14 -0
  107. package/dist/fea/analysis/index.js.map +1 -0
  108. package/dist/fea/{frame → analysis}/mesh/expand-model.d.ts +9 -7
  109. package/dist/fea/{frame → analysis}/mesh/expand-model.js +12 -6
  110. package/dist/fea/analysis/mesh/expand-model.js.map +1 -0
  111. package/dist/fea/{frame → analysis}/post/demand-envelope.d.ts +5 -5
  112. package/dist/fea/{frame → analysis}/post/demand-envelope.js +4 -4
  113. package/dist/fea/analysis/post/demand-envelope.js.map +1 -0
  114. package/dist/fea/{frame → analysis}/post/envelope.d.ts +2 -2
  115. package/dist/fea/analysis/post/envelope.js.map +1 -0
  116. package/dist/fea/{frame → analysis}/post/present-state.d.ts +6 -5
  117. package/dist/fea/{frame → analysis}/post/present-state.js +5 -5
  118. package/dist/fea/analysis/post/present-state.js.map +1 -0
  119. package/dist/fea/analysis/solver/analysis-system.d.ts +46 -0
  120. package/dist/fea/{frame/solver/frame-system.js → analysis/solver/analysis-system.js} +22 -95
  121. package/dist/fea/analysis/solver/analysis-system.js.map +1 -0
  122. package/dist/fea/{frame/solver/analyze-frame.d.ts → analysis/solver/analyze.d.ts} +23 -20
  123. package/dist/fea/{frame/solver/analyze-frame.js → analysis/solver/analyze.js} +25 -23
  124. package/dist/fea/analysis/solver/analyze.js.map +1 -0
  125. package/dist/fea/{frame → analysis}/solver/combinations.d.ts +1 -1
  126. package/dist/fea/{frame → analysis}/solver/combinations.js +8 -8
  127. package/dist/fea/analysis/solver/combinations.js.map +1 -0
  128. package/dist/fea/{frame/area → analysis/solver}/distribute-area-loads.d.ts +6 -15
  129. package/dist/fea/analysis/solver/distribute-area-loads.js +29 -0
  130. package/dist/fea/analysis/solver/distribute-area-loads.js.map +1 -0
  131. package/dist/fea/{frame → analysis}/solver/load-case-solver.d.ts +9 -13
  132. package/dist/fea/analysis/solver/load-case-solver.js +108 -0
  133. package/dist/fea/analysis/solver/load-case-solver.js.map +1 -0
  134. package/dist/fea/analysis/types/model.type.d.ts +80 -0
  135. package/dist/fea/analysis/types/model.type.js +3 -0
  136. package/dist/fea/analysis/types/model.type.js.map +1 -0
  137. package/dist/fea/analysis/types/results.type.d.ts +113 -0
  138. package/dist/fea/analysis/types/results.type.js +3 -0
  139. package/dist/fea/analysis/types/results.type.js.map +1 -0
  140. package/dist/fea/analysis/validation/validate-model.d.ts +12 -0
  141. package/dist/fea/analysis/validation/validate-model.js +267 -0
  142. package/dist/fea/analysis/validation/validate-model.js.map +1 -0
  143. package/dist/fea/deprecated.d.ts +27 -0
  144. package/dist/fea/deprecated.js +12 -0
  145. package/dist/fea/deprecated.js.map +1 -0
  146. package/dist/fea/frame/area/area-member-loads.d.ts +19 -0
  147. package/dist/fea/frame/area/{distribute-area-loads.js → area-member-loads.js} +8 -30
  148. package/dist/fea/frame/area/area-member-loads.js.map +1 -0
  149. package/dist/fea/frame/area/edge-members.d.ts +5 -4
  150. package/dist/fea/frame/area/edge-members.js.map +1 -1
  151. package/dist/fea/frame/elements/end-releases.d.ts +1 -6
  152. package/dist/fea/frame/elements/end-releases.js +4 -8
  153. package/dist/fea/frame/elements/end-releases.js.map +1 -1
  154. package/dist/fea/frame/elements/fixed-end-forces.d.ts +1 -1
  155. package/dist/fea/frame/elements/fixed-end-forces.js +5 -5
  156. package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -1
  157. package/dist/fea/frame/elements/static-condensation.d.ts +1 -1
  158. package/dist/fea/frame/elements/static-condensation.js +3 -3
  159. package/dist/fea/frame/elements/static-condensation.js.map +1 -1
  160. package/dist/fea/frame/index.d.ts +2 -8
  161. package/dist/fea/frame/index.js +2 -10
  162. package/dist/fea/frame/index.js.map +1 -1
  163. package/dist/fea/frame/post/member-diagram.d.ts +3 -3
  164. package/dist/fea/frame/post/member-diagram.js.map +1 -1
  165. package/dist/fea/frame/solver/{global-assembly.d.ts → member-assembly.d.ts} +0 -11
  166. package/dist/fea/frame/solver/{global-assembly.js → member-assembly.js} +4 -13
  167. package/dist/fea/frame/solver/member-assembly.js.map +1 -0
  168. package/dist/fea/frame/solver/member-loads.d.ts +21 -0
  169. package/dist/fea/frame/solver/member-loads.js +146 -0
  170. package/dist/fea/frame/solver/member-loads.js.map +1 -0
  171. package/dist/fea/frame/solver/system-member.d.ts +50 -0
  172. package/dist/fea/frame/solver/system-member.js +70 -0
  173. package/dist/fea/frame/solver/system-member.js.map +1 -0
  174. package/dist/fea/frame/transformation/coordinate-transform.d.ts +1 -1
  175. package/dist/fea/frame/transformation/coordinate-transform.js +3 -3
  176. package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -1
  177. package/dist/fea/frame/types/model.type.d.ts +10 -175
  178. package/dist/fea/frame/types/results.type.d.ts +4 -159
  179. package/dist/fea/frame/validation/validate-members.d.ts +30 -0
  180. package/dist/fea/frame/validation/validate-members.js +165 -0
  181. package/dist/fea/frame/validation/validate-members.js.map +1 -0
  182. package/dist/fea/frame/validation/validate-null-areas.d.ts +38 -0
  183. package/dist/fea/frame/validation/validate-null-areas.js +93 -0
  184. package/dist/fea/frame/validation/validate-null-areas.js.map +1 -0
  185. package/dist/fea/index.d.ts +4 -0
  186. package/dist/fea/index.js +4 -1
  187. package/dist/fea/index.js.map +1 -1
  188. package/dist/fea/shared/index.d.ts +1 -0
  189. package/dist/fea/shared/index.js +3 -0
  190. package/dist/fea/shared/index.js.map +1 -0
  191. package/dist/fea/shared/solver/auto-restraint.js.map +1 -0
  192. package/dist/fea/{frame → shared}/solver/boundary-conditions.d.ts +5 -0
  193. package/dist/fea/{frame → shared}/solver/boundary-conditions.js +7 -3
  194. package/dist/fea/shared/solver/boundary-conditions.js.map +1 -0
  195. package/dist/fea/shared/solver/global-assembly.d.ts +12 -0
  196. package/dist/fea/shared/solver/global-assembly.js +14 -0
  197. package/dist/fea/shared/solver/global-assembly.js.map +1 -0
  198. package/dist/fea/shared/types/model.type.d.ts +34 -0
  199. package/dist/fea/shared/types/model.type.js +3 -0
  200. package/dist/fea/shared/types/model.type.js.map +1 -0
  201. package/dist/fea/shared/validation/issues.d.ts +9 -0
  202. package/dist/fea/shared/validation/issues.js +38 -0
  203. package/dist/fea/shared/validation/issues.js.map +1 -0
  204. package/dist/fea/{frame/elements/shell → shell/elements}/dkq-plate.d.ts +1 -1
  205. package/dist/fea/{frame/elements/shell → shell/elements}/dkq-plate.js +1 -1
  206. package/dist/fea/shell/elements/dkq-plate.js.map +1 -0
  207. package/dist/fea/{frame/elements/shell → shell/elements}/flat-shell.d.ts +1 -1
  208. package/dist/fea/{frame/elements/shell → shell/elements}/flat-shell.js +1 -1
  209. package/dist/fea/shell/elements/flat-shell.js.map +1 -0
  210. package/dist/fea/{frame/elements/shell → shell/elements}/membrane-quad.d.ts +1 -1
  211. package/dist/fea/{frame/elements/shell → shell/elements}/membrane-quad.js +2 -2
  212. package/dist/fea/shell/elements/membrane-quad.js.map +1 -0
  213. package/dist/fea/shell/elements/quad-geometry.js.map +1 -0
  214. package/dist/fea/{frame/elements/shell → shell/elements}/rigidity.d.ts +1 -1
  215. package/dist/fea/shell/elements/rigidity.js.map +1 -0
  216. package/dist/fea/{frame/elements/shell → shell/elements}/shell-axes.d.ts +1 -1
  217. package/dist/fea/{frame/elements/shell → shell/elements}/shell-axes.js +1 -1
  218. package/dist/fea/shell/elements/shell-axes.js.map +1 -0
  219. package/dist/fea/shell/index.d.ts +2 -0
  220. package/dist/fea/shell/index.js +3 -0
  221. package/dist/fea/shell/index.js.map +1 -0
  222. package/dist/fea/{frame → shell}/mesh/mesh-shells.d.ts +7 -6
  223. package/dist/fea/{frame → shell}/mesh/mesh-shells.js +1 -1
  224. package/dist/fea/shell/mesh/mesh-shells.js.map +1 -0
  225. package/dist/fea/{frame → shell}/post/shell-forces.d.ts +1 -1
  226. package/dist/fea/{frame → shell}/post/shell-forces.js +4 -4
  227. package/dist/fea/{frame → shell}/post/shell-forces.js.map +1 -1
  228. package/dist/fea/shell/solver/shell-loads.d.ts +17 -0
  229. package/dist/fea/shell/solver/shell-loads.js +57 -0
  230. package/dist/fea/shell/solver/shell-loads.js.map +1 -0
  231. package/dist/fea/shell/solver/system-shell.d.ts +29 -0
  232. package/dist/fea/shell/solver/system-shell.js +41 -0
  233. package/dist/fea/shell/solver/system-shell.js.map +1 -0
  234. package/dist/fea/shell/types/model.type.d.ts +57 -0
  235. package/dist/fea/shell/types/model.type.js +3 -0
  236. package/dist/fea/shell/types/model.type.js.map +1 -0
  237. package/dist/fea/shell/types/results.type.d.ts +47 -0
  238. package/dist/fea/shell/types/results.type.js +3 -0
  239. package/dist/fea/shell/types/results.type.js.map +1 -0
  240. package/dist/fea/shell/validation/validate-shells.d.ts +21 -0
  241. package/dist/fea/shell/validation/validate-shells.js +103 -0
  242. package/dist/fea/shell/validation/validate-shells.js.map +1 -0
  243. package/dist/index.d.ts +6 -4
  244. package/dist/index.js +13 -6
  245. package/dist/index.js.map +1 -1
  246. package/package.json +1 -1
  247. package/dist/core/errors/frame-analysis.error.d.ts +0 -37
  248. package/dist/core/errors/frame-analysis.error.js.map +0 -1
  249. package/dist/esm/core/errors/frame-analysis.error.js.map +0 -1
  250. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +0 -1
  251. package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +0 -1
  252. package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +0 -1
  253. package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +0 -1
  254. package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +0 -1
  255. package/dist/esm/fea/frame/elements/shell/rigidity.js.map +0 -1
  256. package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +0 -1
  257. package/dist/esm/fea/frame/mesh/expand-model.js.map +0 -1
  258. package/dist/esm/fea/frame/mesh/mesh-shells.js.map +0 -1
  259. package/dist/esm/fea/frame/post/demand-envelope.js.map +0 -1
  260. package/dist/esm/fea/frame/post/envelope.js.map +0 -1
  261. package/dist/esm/fea/frame/post/present-state.js.map +0 -1
  262. package/dist/esm/fea/frame/solver/analyze-frame.js.map +0 -1
  263. package/dist/esm/fea/frame/solver/auto-restraint.js.map +0 -1
  264. package/dist/esm/fea/frame/solver/boundary-conditions.js.map +0 -1
  265. package/dist/esm/fea/frame/solver/combinations.js.map +0 -1
  266. package/dist/esm/fea/frame/solver/frame-system.js.map +0 -1
  267. package/dist/esm/fea/frame/solver/global-assembly.js.map +0 -1
  268. package/dist/esm/fea/frame/solver/load-case-solver.js +0 -255
  269. package/dist/esm/fea/frame/solver/load-case-solver.js.map +0 -1
  270. package/dist/esm/fea/frame/validation/validate-model.js +0 -529
  271. package/dist/esm/fea/frame/validation/validate-model.js.map +0 -1
  272. package/dist/fea/frame/area/distribute-area-loads.js.map +0 -1
  273. package/dist/fea/frame/elements/shell/dkq-plate.js.map +0 -1
  274. package/dist/fea/frame/elements/shell/flat-shell.js.map +0 -1
  275. package/dist/fea/frame/elements/shell/membrane-quad.js.map +0 -1
  276. package/dist/fea/frame/elements/shell/quad-geometry.js.map +0 -1
  277. package/dist/fea/frame/elements/shell/rigidity.js.map +0 -1
  278. package/dist/fea/frame/elements/shell/shell-axes.js.map +0 -1
  279. package/dist/fea/frame/mesh/expand-model.js.map +0 -1
  280. package/dist/fea/frame/mesh/mesh-shells.js.map +0 -1
  281. package/dist/fea/frame/post/demand-envelope.js.map +0 -1
  282. package/dist/fea/frame/post/envelope.js.map +0 -1
  283. package/dist/fea/frame/post/present-state.js.map +0 -1
  284. package/dist/fea/frame/solver/analyze-frame.js.map +0 -1
  285. package/dist/fea/frame/solver/auto-restraint.js.map +0 -1
  286. package/dist/fea/frame/solver/boundary-conditions.js.map +0 -1
  287. package/dist/fea/frame/solver/combinations.js.map +0 -1
  288. package/dist/fea/frame/solver/frame-system.d.ts +0 -89
  289. package/dist/fea/frame/solver/frame-system.js.map +0 -1
  290. package/dist/fea/frame/solver/global-assembly.js.map +0 -1
  291. package/dist/fea/frame/solver/load-case-solver.js +0 -260
  292. package/dist/fea/frame/solver/load-case-solver.js.map +0 -1
  293. package/dist/fea/frame/validation/validate-model.d.ts +0 -19
  294. package/dist/fea/frame/validation/validate-model.js +0 -535
  295. package/dist/fea/frame/validation/validate-model.js.map +0 -1
  296. /package/dist/esm/fea/{frame → analysis}/post/envelope.js +0 -0
  297. /package/dist/esm/fea/{frame → shared}/solver/auto-restraint.js +0 -0
  298. /package/dist/esm/fea/{frame/elements/shell → shell/elements}/quad-geometry.js +0 -0
  299. /package/dist/esm/fea/{frame/elements/shell → shell/elements}/rigidity.js +0 -0
  300. /package/dist/fea/{frame → analysis}/post/envelope.js +0 -0
  301. /package/dist/fea/{frame → shared}/solver/auto-restraint.d.ts +0 -0
  302. /package/dist/fea/{frame → shared}/solver/auto-restraint.js +0 -0
  303. /package/dist/fea/{frame/elements/shell → shell/elements}/quad-geometry.d.ts +0 -0
  304. /package/dist/fea/{frame/elements/shell → shell/elements}/quad-geometry.js +0 -0
  305. /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 = exports.elementDofs = void 0;
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, exports.elementDofs)([member.startIndex, member.endIndex]);
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=global-assembly.js.map
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":"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"}
@@ -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 {FrameAnalysisError} 301 if the nodes coincide
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 frame_analysis_error_1 = require("../../../core/errors/frame-analysis.error");
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 {FrameAnalysisError} 301 if the nodes coincide
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 frame_analysis_error_1.FrameAnalysisError(frame_analysis_error_1.FrameErrors.ZERO_LENGTH_MEMBER);
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":"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"}
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
- export type FrameId = string | number;
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: FrameId;
52
- startNodeId: FrameId;
53
- endNodeId: FrameId;
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: FrameId;
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: FrameId;
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: FrameId;
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: FrameId;
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: FrameId;
141
- nodeIds: FrameId[];
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
- }