@theerapat-s28/ts-structural-eng-tools 3.1.0 → 3.3.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 (324) hide show
  1. package/CHANGELOG.md +48 -1
  2. package/README.md +293 -131
  3. package/dist/core/constants/frame.constant.d.ts +8 -0
  4. package/dist/core/constants/frame.constant.js +9 -1
  5. package/dist/core/constants/frame.constant.js.map +1 -1
  6. package/dist/core/errors/fea.error.d.ts +47 -0
  7. package/dist/{esm/core/errors/frame-analysis.error.js → core/errors/fea.error.js} +14 -5
  8. package/dist/core/errors/fea.error.js.map +1 -0
  9. package/dist/core/index.d.ts +5 -3
  10. package/dist/core/index.js +10 -4
  11. package/dist/core/index.js.map +1 -1
  12. package/dist/esm/core/constants/frame.constant.js +8 -0
  13. package/dist/esm/core/constants/frame.constant.js.map +1 -1
  14. package/dist/{core/errors/frame-analysis.error.js → esm/core/errors/fea.error.js} +10 -9
  15. package/dist/esm/core/errors/fea.error.js.map +1 -0
  16. package/dist/esm/core/index.js +4 -2
  17. package/dist/esm/core/index.js.map +1 -1
  18. package/dist/esm/fea/analysis/index.js +7 -0
  19. package/dist/esm/fea/analysis/index.js.map +1 -0
  20. package/dist/esm/fea/{frame → analysis}/mesh/expand-model.js +30 -41
  21. package/dist/esm/fea/analysis/mesh/expand-model.js.map +1 -0
  22. package/dist/esm/fea/analysis/mesh/member-connectivity.js +66 -0
  23. package/dist/esm/fea/analysis/mesh/member-connectivity.js.map +1 -0
  24. package/dist/esm/fea/{frame → analysis}/post/demand-envelope.js +4 -4
  25. package/dist/esm/fea/analysis/post/demand-envelope.js.map +1 -0
  26. package/dist/esm/fea/analysis/post/envelope.js.map +1 -0
  27. package/dist/esm/fea/{frame → analysis}/post/present-state.js +6 -6
  28. package/dist/esm/fea/analysis/post/present-state.js.map +1 -0
  29. package/dist/esm/fea/{frame/solver/frame-system.js → analysis/solver/analysis-system.js} +17 -90
  30. package/dist/esm/fea/analysis/solver/analysis-system.js.map +1 -0
  31. package/dist/esm/fea/{frame/solver/analyze-frame.js → analysis/solver/analyze.js} +28 -18
  32. package/dist/esm/fea/analysis/solver/analyze.js.map +1 -0
  33. package/dist/esm/fea/{frame → analysis}/solver/combinations.js +8 -8
  34. package/dist/esm/fea/analysis/solver/combinations.js.map +1 -0
  35. package/dist/esm/fea/analysis/solver/distribute-area-loads.js +25 -0
  36. package/dist/esm/fea/analysis/solver/distribute-area-loads.js.map +1 -0
  37. package/dist/esm/fea/analysis/solver/load-case-solver.js +103 -0
  38. package/dist/esm/fea/analysis/solver/load-case-solver.js.map +1 -0
  39. package/dist/esm/fea/analysis/types/model.type.js +2 -0
  40. package/dist/esm/fea/analysis/types/model.type.js.map +1 -0
  41. package/dist/esm/fea/analysis/types/results.type.js +2 -0
  42. package/dist/esm/fea/analysis/types/results.type.js.map +1 -0
  43. package/dist/esm/fea/analysis/validation/validate-model.js +263 -0
  44. package/dist/esm/fea/analysis/validation/validate-model.js.map +1 -0
  45. package/dist/esm/fea/deprecated.js +9 -0
  46. package/dist/esm/fea/deprecated.js.map +1 -0
  47. package/dist/esm/fea/frame/area/{distribute-area-loads.js → area-member-loads.js} +7 -28
  48. package/dist/esm/fea/frame/area/area-member-loads.js.map +1 -0
  49. package/dist/esm/fea/frame/area/edge-members.js.map +1 -1
  50. package/dist/esm/fea/frame/elements/end-releases.js +2 -6
  51. package/dist/esm/fea/frame/elements/end-releases.js.map +1 -1
  52. package/dist/esm/fea/frame/elements/fixed-end-forces.js +5 -5
  53. package/dist/esm/fea/frame/elements/fixed-end-forces.js.map +1 -1
  54. package/dist/esm/fea/frame/elements/static-condensation.js +3 -3
  55. package/dist/esm/fea/frame/elements/static-condensation.js.map +1 -1
  56. package/dist/esm/fea/frame/index.js +1 -4
  57. package/dist/esm/fea/frame/index.js.map +1 -1
  58. package/dist/esm/fea/frame/post/member-diagram.js +4 -4
  59. package/dist/esm/fea/frame/post/member-diagram.js.map +1 -1
  60. package/dist/esm/fea/frame/solver/{global-assembly.js → member-assembly.js} +2 -10
  61. package/dist/esm/fea/frame/solver/member-assembly.js.map +1 -0
  62. package/dist/esm/fea/frame/solver/member-loads.js +141 -0
  63. package/dist/esm/fea/frame/solver/member-loads.js.map +1 -0
  64. package/dist/esm/fea/frame/solver/nodes-along-members.js +73 -0
  65. package/dist/esm/fea/frame/solver/nodes-along-members.js.map +1 -0
  66. package/dist/esm/fea/frame/solver/system-member.js +66 -0
  67. package/dist/esm/fea/frame/solver/system-member.js.map +1 -0
  68. package/dist/esm/fea/frame/transformation/coordinate-transform.js +3 -3
  69. package/dist/esm/fea/frame/transformation/coordinate-transform.js.map +1 -1
  70. package/dist/esm/fea/frame/validation/validate-members.js +164 -0
  71. package/dist/esm/fea/frame/validation/validate-members.js.map +1 -0
  72. package/dist/esm/fea/frame/validation/validate-null-areas.js +88 -0
  73. package/dist/esm/fea/frame/validation/validate-null-areas.js.map +1 -0
  74. package/dist/esm/fea/index.js +4 -1
  75. package/dist/esm/fea/index.js.map +1 -1
  76. package/dist/esm/fea/shared/index.js +2 -0
  77. package/dist/esm/fea/shared/index.js.map +1 -0
  78. package/dist/esm/fea/shared/solver/auto-restraint.js.map +1 -0
  79. package/dist/esm/fea/{frame → shared}/solver/boundary-conditions.js +5 -1
  80. package/dist/esm/fea/shared/solver/boundary-conditions.js.map +1 -0
  81. package/dist/esm/fea/shared/solver/global-assembly.js +10 -0
  82. package/dist/esm/fea/shared/solver/global-assembly.js.map +1 -0
  83. package/dist/esm/fea/shared/types/model.type.js +2 -0
  84. package/dist/esm/fea/shared/types/model.type.js.map +1 -0
  85. package/dist/esm/fea/shared/validation/issues.js +32 -0
  86. package/dist/esm/fea/shared/validation/issues.js.map +1 -0
  87. package/dist/esm/fea/{frame/elements/shell → shell/elements}/dkq-plate.js +1 -1
  88. package/dist/esm/fea/shell/elements/dkq-plate.js.map +1 -0
  89. package/dist/esm/fea/{frame/elements/shell → shell/elements}/flat-shell.js +1 -1
  90. package/dist/esm/fea/shell/elements/flat-shell.js.map +1 -0
  91. package/dist/esm/fea/{frame/elements/shell → shell/elements}/membrane-quad.js +2 -2
  92. package/dist/esm/fea/shell/elements/membrane-quad.js.map +1 -0
  93. package/dist/esm/fea/shell/elements/quad-geometry.js.map +1 -0
  94. package/dist/esm/fea/shell/elements/rigidity.js.map +1 -0
  95. package/dist/esm/fea/{frame/elements/shell → shell/elements}/shell-axes.js +1 -1
  96. package/dist/esm/fea/shell/elements/shell-axes.js.map +1 -0
  97. package/dist/esm/fea/shell/index.js +2 -0
  98. package/dist/esm/fea/shell/index.js.map +1 -0
  99. package/dist/esm/fea/{frame → shell}/mesh/mesh-shells.js +1 -1
  100. package/dist/esm/fea/shell/mesh/mesh-shells.js.map +1 -0
  101. package/dist/esm/fea/{frame → shell}/post/shell-forces.js +4 -4
  102. package/dist/esm/fea/{frame → shell}/post/shell-forces.js.map +1 -1
  103. package/dist/esm/fea/shell/solver/shell-loads.js +53 -0
  104. package/dist/esm/fea/shell/solver/shell-loads.js.map +1 -0
  105. package/dist/esm/fea/shell/solver/system-shell.js +37 -0
  106. package/dist/esm/fea/shell/solver/system-shell.js.map +1 -0
  107. package/dist/esm/fea/shell/types/model.type.js +2 -0
  108. package/dist/esm/fea/shell/types/model.type.js.map +1 -0
  109. package/dist/esm/fea/shell/types/results.type.js +2 -0
  110. package/dist/esm/fea/shell/types/results.type.js.map +1 -0
  111. package/dist/esm/fea/shell/validation/validate-shells.js +98 -0
  112. package/dist/esm/fea/shell/validation/validate-shells.js.map +1 -0
  113. package/dist/esm/index.js +5 -3
  114. package/dist/esm/index.js.map +1 -1
  115. package/dist/fea/analysis/index.d.ts +10 -0
  116. package/dist/fea/analysis/index.js +16 -0
  117. package/dist/fea/analysis/index.js.map +1 -0
  118. package/dist/fea/analysis/mesh/expand-model.d.ts +34 -0
  119. package/dist/fea/{frame → analysis}/mesh/expand-model.js +30 -41
  120. package/dist/fea/analysis/mesh/expand-model.js.map +1 -0
  121. package/dist/fea/analysis/mesh/member-connectivity.d.ts +43 -0
  122. package/dist/fea/analysis/mesh/member-connectivity.js +71 -0
  123. package/dist/fea/analysis/mesh/member-connectivity.js.map +1 -0
  124. package/dist/fea/{frame → analysis}/post/demand-envelope.d.ts +5 -5
  125. package/dist/fea/{frame → analysis}/post/demand-envelope.js +4 -4
  126. package/dist/fea/analysis/post/demand-envelope.js.map +1 -0
  127. package/dist/fea/{frame → analysis}/post/envelope.d.ts +2 -2
  128. package/dist/fea/analysis/post/envelope.js.map +1 -0
  129. package/dist/fea/analysis/post/present-state.d.ts +21 -0
  130. package/dist/fea/{frame → analysis}/post/present-state.js +7 -7
  131. package/dist/fea/analysis/post/present-state.js.map +1 -0
  132. package/dist/fea/analysis/solver/analysis-system.d.ts +46 -0
  133. package/dist/fea/{frame/solver/frame-system.js → analysis/solver/analysis-system.js} +22 -95
  134. package/dist/fea/analysis/solver/analysis-system.js.map +1 -0
  135. package/dist/fea/{frame/solver/analyze-frame.d.ts → analysis/solver/analyze.d.ts} +29 -20
  136. package/dist/fea/{frame/solver/analyze-frame.js → analysis/solver/analyze.js} +33 -23
  137. package/dist/fea/analysis/solver/analyze.js.map +1 -0
  138. package/dist/fea/{frame → analysis}/solver/combinations.d.ts +1 -1
  139. package/dist/fea/{frame → analysis}/solver/combinations.js +8 -8
  140. package/dist/fea/analysis/solver/combinations.js.map +1 -0
  141. package/dist/fea/{frame/area → analysis/solver}/distribute-area-loads.d.ts +6 -15
  142. package/dist/fea/analysis/solver/distribute-area-loads.js +29 -0
  143. package/dist/fea/analysis/solver/distribute-area-loads.js.map +1 -0
  144. package/dist/fea/{frame → analysis}/solver/load-case-solver.d.ts +9 -13
  145. package/dist/fea/analysis/solver/load-case-solver.js +108 -0
  146. package/dist/fea/analysis/solver/load-case-solver.js.map +1 -0
  147. package/dist/fea/analysis/types/model.type.d.ts +80 -0
  148. package/dist/fea/analysis/types/model.type.js +3 -0
  149. package/dist/fea/analysis/types/model.type.js.map +1 -0
  150. package/dist/fea/analysis/types/results.type.d.ts +123 -0
  151. package/dist/fea/analysis/types/results.type.js +3 -0
  152. package/dist/fea/analysis/types/results.type.js.map +1 -0
  153. package/dist/fea/analysis/validation/validate-model.d.ts +12 -0
  154. package/dist/fea/analysis/validation/validate-model.js +267 -0
  155. package/dist/fea/analysis/validation/validate-model.js.map +1 -0
  156. package/dist/fea/deprecated.d.ts +27 -0
  157. package/dist/fea/deprecated.js +12 -0
  158. package/dist/fea/deprecated.js.map +1 -0
  159. package/dist/fea/frame/area/area-member-loads.d.ts +19 -0
  160. package/dist/fea/frame/area/{distribute-area-loads.js → area-member-loads.js} +8 -30
  161. package/dist/fea/frame/area/area-member-loads.js.map +1 -0
  162. package/dist/fea/frame/area/edge-members.d.ts +5 -4
  163. package/dist/fea/frame/area/edge-members.js.map +1 -1
  164. package/dist/fea/frame/elements/end-releases.d.ts +1 -6
  165. package/dist/fea/frame/elements/end-releases.js +4 -8
  166. package/dist/fea/frame/elements/end-releases.js.map +1 -1
  167. package/dist/fea/frame/elements/fixed-end-forces.d.ts +1 -1
  168. package/dist/fea/frame/elements/fixed-end-forces.js +5 -5
  169. package/dist/fea/frame/elements/fixed-end-forces.js.map +1 -1
  170. package/dist/fea/frame/elements/static-condensation.d.ts +1 -1
  171. package/dist/fea/frame/elements/static-condensation.js +3 -3
  172. package/dist/fea/frame/elements/static-condensation.js.map +1 -1
  173. package/dist/fea/frame/index.d.ts +2 -8
  174. package/dist/fea/frame/index.js +2 -10
  175. package/dist/fea/frame/index.js.map +1 -1
  176. package/dist/fea/frame/post/member-diagram.d.ts +8 -8
  177. package/dist/fea/frame/post/member-diagram.js +4 -4
  178. package/dist/fea/frame/post/member-diagram.js.map +1 -1
  179. package/dist/fea/frame/solver/{global-assembly.d.ts → member-assembly.d.ts} +0 -11
  180. package/dist/fea/frame/solver/{global-assembly.js → member-assembly.js} +4 -13
  181. package/dist/fea/frame/solver/member-assembly.js.map +1 -0
  182. package/dist/fea/frame/solver/member-loads.d.ts +21 -0
  183. package/dist/fea/frame/solver/member-loads.js +146 -0
  184. package/dist/fea/frame/solver/member-loads.js.map +1 -0
  185. package/dist/fea/frame/solver/nodes-along-members.d.ts +31 -0
  186. package/dist/fea/frame/solver/nodes-along-members.js +77 -0
  187. package/dist/fea/frame/solver/nodes-along-members.js.map +1 -0
  188. package/dist/fea/frame/solver/system-member.d.ts +51 -0
  189. package/dist/fea/frame/solver/system-member.js +70 -0
  190. package/dist/fea/frame/solver/system-member.js.map +1 -0
  191. package/dist/fea/frame/transformation/coordinate-transform.d.ts +1 -1
  192. package/dist/fea/frame/transformation/coordinate-transform.js +3 -3
  193. package/dist/fea/frame/transformation/coordinate-transform.js.map +1 -1
  194. package/dist/fea/frame/types/model.type.d.ts +16 -175
  195. package/dist/fea/frame/types/results.type.d.ts +17 -152
  196. package/dist/fea/frame/validation/validate-members.d.ts +30 -0
  197. package/dist/fea/frame/validation/validate-members.js +169 -0
  198. package/dist/fea/frame/validation/validate-members.js.map +1 -0
  199. package/dist/fea/frame/validation/validate-null-areas.d.ts +38 -0
  200. package/dist/fea/frame/validation/validate-null-areas.js +93 -0
  201. package/dist/fea/frame/validation/validate-null-areas.js.map +1 -0
  202. package/dist/fea/index.d.ts +4 -0
  203. package/dist/fea/index.js +4 -1
  204. package/dist/fea/index.js.map +1 -1
  205. package/dist/fea/shared/index.d.ts +1 -0
  206. package/dist/fea/shared/index.js +3 -0
  207. package/dist/fea/shared/index.js.map +1 -0
  208. package/dist/fea/shared/solver/auto-restraint.js.map +1 -0
  209. package/dist/fea/{frame → shared}/solver/boundary-conditions.d.ts +5 -0
  210. package/dist/fea/{frame → shared}/solver/boundary-conditions.js +7 -3
  211. package/dist/fea/shared/solver/boundary-conditions.js.map +1 -0
  212. package/dist/fea/shared/solver/global-assembly.d.ts +12 -0
  213. package/dist/fea/shared/solver/global-assembly.js +14 -0
  214. package/dist/fea/shared/solver/global-assembly.js.map +1 -0
  215. package/dist/fea/shared/types/model.type.d.ts +34 -0
  216. package/dist/fea/shared/types/model.type.js +3 -0
  217. package/dist/fea/shared/types/model.type.js.map +1 -0
  218. package/dist/fea/shared/validation/issues.d.ts +9 -0
  219. package/dist/fea/shared/validation/issues.js +38 -0
  220. package/dist/fea/shared/validation/issues.js.map +1 -0
  221. package/dist/fea/{frame/elements/shell → shell/elements}/dkq-plate.d.ts +1 -1
  222. package/dist/fea/{frame/elements/shell → shell/elements}/dkq-plate.js +1 -1
  223. package/dist/fea/shell/elements/dkq-plate.js.map +1 -0
  224. package/dist/fea/{frame/elements/shell → shell/elements}/flat-shell.d.ts +1 -1
  225. package/dist/fea/{frame/elements/shell → shell/elements}/flat-shell.js +1 -1
  226. package/dist/fea/shell/elements/flat-shell.js.map +1 -0
  227. package/dist/fea/{frame/elements/shell → shell/elements}/membrane-quad.d.ts +1 -1
  228. package/dist/fea/{frame/elements/shell → shell/elements}/membrane-quad.js +2 -2
  229. package/dist/fea/shell/elements/membrane-quad.js.map +1 -0
  230. package/dist/fea/shell/elements/quad-geometry.js.map +1 -0
  231. package/dist/fea/{frame/elements/shell → shell/elements}/rigidity.d.ts +1 -1
  232. package/dist/fea/shell/elements/rigidity.js.map +1 -0
  233. package/dist/fea/{frame/elements/shell → shell/elements}/shell-axes.d.ts +1 -1
  234. package/dist/fea/{frame/elements/shell → shell/elements}/shell-axes.js +1 -1
  235. package/dist/fea/shell/elements/shell-axes.js.map +1 -0
  236. package/dist/fea/shell/index.d.ts +2 -0
  237. package/dist/fea/shell/index.js +3 -0
  238. package/dist/fea/shell/index.js.map +1 -0
  239. package/dist/fea/{frame → shell}/mesh/mesh-shells.d.ts +7 -6
  240. package/dist/fea/{frame → shell}/mesh/mesh-shells.js +1 -1
  241. package/dist/fea/shell/mesh/mesh-shells.js.map +1 -0
  242. package/dist/fea/{frame → shell}/post/shell-forces.d.ts +1 -1
  243. package/dist/fea/{frame → shell}/post/shell-forces.js +4 -4
  244. package/dist/fea/{frame → shell}/post/shell-forces.js.map +1 -1
  245. package/dist/fea/shell/solver/shell-loads.d.ts +17 -0
  246. package/dist/fea/shell/solver/shell-loads.js +57 -0
  247. package/dist/fea/shell/solver/shell-loads.js.map +1 -0
  248. package/dist/fea/shell/solver/system-shell.d.ts +29 -0
  249. package/dist/fea/shell/solver/system-shell.js +41 -0
  250. package/dist/fea/shell/solver/system-shell.js.map +1 -0
  251. package/dist/fea/shell/types/model.type.d.ts +57 -0
  252. package/dist/fea/shell/types/model.type.js +3 -0
  253. package/dist/fea/shell/types/model.type.js.map +1 -0
  254. package/dist/fea/shell/types/results.type.d.ts +47 -0
  255. package/dist/fea/shell/types/results.type.js +3 -0
  256. package/dist/fea/shell/types/results.type.js.map +1 -0
  257. package/dist/fea/shell/validation/validate-shells.d.ts +21 -0
  258. package/dist/fea/shell/validation/validate-shells.js +103 -0
  259. package/dist/fea/shell/validation/validate-shells.js.map +1 -0
  260. package/dist/index.d.ts +6 -4
  261. package/dist/index.js +16 -6
  262. package/dist/index.js.map +1 -1
  263. package/package.json +2 -2
  264. package/dist/core/errors/frame-analysis.error.d.ts +0 -37
  265. package/dist/core/errors/frame-analysis.error.js.map +0 -1
  266. package/dist/esm/core/errors/frame-analysis.error.js.map +0 -1
  267. package/dist/esm/fea/frame/area/distribute-area-loads.js.map +0 -1
  268. package/dist/esm/fea/frame/elements/shell/dkq-plate.js.map +0 -1
  269. package/dist/esm/fea/frame/elements/shell/flat-shell.js.map +0 -1
  270. package/dist/esm/fea/frame/elements/shell/membrane-quad.js.map +0 -1
  271. package/dist/esm/fea/frame/elements/shell/quad-geometry.js.map +0 -1
  272. package/dist/esm/fea/frame/elements/shell/rigidity.js.map +0 -1
  273. package/dist/esm/fea/frame/elements/shell/shell-axes.js.map +0 -1
  274. package/dist/esm/fea/frame/mesh/expand-model.js.map +0 -1
  275. package/dist/esm/fea/frame/mesh/mesh-shells.js.map +0 -1
  276. package/dist/esm/fea/frame/post/demand-envelope.js.map +0 -1
  277. package/dist/esm/fea/frame/post/envelope.js.map +0 -1
  278. package/dist/esm/fea/frame/post/present-state.js.map +0 -1
  279. package/dist/esm/fea/frame/solver/analyze-frame.js.map +0 -1
  280. package/dist/esm/fea/frame/solver/auto-restraint.js.map +0 -1
  281. package/dist/esm/fea/frame/solver/boundary-conditions.js.map +0 -1
  282. package/dist/esm/fea/frame/solver/combinations.js.map +0 -1
  283. package/dist/esm/fea/frame/solver/frame-system.js.map +0 -1
  284. package/dist/esm/fea/frame/solver/global-assembly.js.map +0 -1
  285. package/dist/esm/fea/frame/solver/load-case-solver.js +0 -255
  286. package/dist/esm/fea/frame/solver/load-case-solver.js.map +0 -1
  287. package/dist/esm/fea/frame/validation/validate-model.js +0 -529
  288. package/dist/esm/fea/frame/validation/validate-model.js.map +0 -1
  289. package/dist/fea/frame/area/distribute-area-loads.js.map +0 -1
  290. package/dist/fea/frame/elements/shell/dkq-plate.js.map +0 -1
  291. package/dist/fea/frame/elements/shell/flat-shell.js.map +0 -1
  292. package/dist/fea/frame/elements/shell/membrane-quad.js.map +0 -1
  293. package/dist/fea/frame/elements/shell/quad-geometry.js.map +0 -1
  294. package/dist/fea/frame/elements/shell/rigidity.js.map +0 -1
  295. package/dist/fea/frame/elements/shell/shell-axes.js.map +0 -1
  296. package/dist/fea/frame/mesh/expand-model.d.ts +0 -29
  297. package/dist/fea/frame/mesh/expand-model.js.map +0 -1
  298. package/dist/fea/frame/mesh/mesh-shells.js.map +0 -1
  299. package/dist/fea/frame/post/demand-envelope.js.map +0 -1
  300. package/dist/fea/frame/post/envelope.js.map +0 -1
  301. package/dist/fea/frame/post/present-state.d.ts +0 -20
  302. package/dist/fea/frame/post/present-state.js.map +0 -1
  303. package/dist/fea/frame/solver/analyze-frame.js.map +0 -1
  304. package/dist/fea/frame/solver/auto-restraint.js.map +0 -1
  305. package/dist/fea/frame/solver/boundary-conditions.js.map +0 -1
  306. package/dist/fea/frame/solver/combinations.js.map +0 -1
  307. package/dist/fea/frame/solver/frame-system.d.ts +0 -89
  308. package/dist/fea/frame/solver/frame-system.js.map +0 -1
  309. package/dist/fea/frame/solver/global-assembly.js.map +0 -1
  310. package/dist/fea/frame/solver/load-case-solver.js +0 -260
  311. package/dist/fea/frame/solver/load-case-solver.js.map +0 -1
  312. package/dist/fea/frame/validation/validate-model.d.ts +0 -19
  313. package/dist/fea/frame/validation/validate-model.js +0 -535
  314. package/dist/fea/frame/validation/validate-model.js.map +0 -1
  315. /package/dist/esm/fea/{frame → analysis}/post/envelope.js +0 -0
  316. /package/dist/esm/fea/{frame → shared}/solver/auto-restraint.js +0 -0
  317. /package/dist/esm/fea/{frame/elements/shell → shell/elements}/quad-geometry.js +0 -0
  318. /package/dist/esm/fea/{frame/elements/shell → shell/elements}/rigidity.js +0 -0
  319. /package/dist/fea/{frame → analysis}/post/envelope.js +0 -0
  320. /package/dist/fea/{frame → shared}/solver/auto-restraint.d.ts +0 -0
  321. /package/dist/fea/{frame → shared}/solver/auto-restraint.js +0 -0
  322. /package/dist/fea/{frame/elements/shell → shell/elements}/quad-geometry.d.ts +0 -0
  323. /package/dist/fea/{frame/elements/shell → shell/elements}/quad-geometry.js +0 -0
  324. /package/dist/fea/{frame/elements/shell → shell/elements}/rigidity.js +0 -0
@@ -1,18 +1,9 @@
1
1
  import type { Warnings } from "../../../core/types/output-message.type";
2
- import type { FrameModel, MemberLoad } from "../types/model.type";
3
- /**
4
- * Turns the area loads of a model into member loads, assuming the model is valid (as
5
- * `validateFrameModel` checks): each area's edge profiles are built once, then scaled for each
6
- * of its loads and split into global X, Y and Z trapezoidal loads (plus torques for a cantilever).
7
- * Everything is linear in `q`, so load-case superposition still holds.
8
- */
9
- export declare const areaMemberLoads: (model: FrameModel) => {
10
- memberLoads: MemberLoad[];
11
- warnings: Warnings;
12
- };
2
+ import type { MemberLoad } from "../../frame/types/model.type";
3
+ import type { FeaModel } from "../types/model.type";
13
4
  /**
14
5
  * The member loads that a model's null areas send to the members along their edges — what
15
- * `analyzeFrame` adds to `memberLoads` — so they can be checked or previewed.
6
+ * `analyze` adds to `memberLoads` — so they can be checked or previewed.
16
7
  *
17
8
  * Two-way areas send each point to the nearest edge (corner-bisector split); one-way areas
18
9
  * split strips parallel to their unsupported edges half to each end; cantilever areas send
@@ -21,11 +12,11 @@ export declare const areaMemberLoads: (model: FrameModel) => {
21
12
  * `projected` load is first converted, `q · |n · direction|`) and come out as trapezoidal loads
22
13
  * per member length in global X, Y and Z (and torques), each tagged with its load case.
23
14
  *
24
- * @param model - The frame model, validated first
15
+ * @param model - The model, validated first
25
16
  * @returns `memberLoads` and `warnings` (a one-way support edge parallel to the span)
26
- * @throws {FrameAnalysisError} 301–317 for an invalid model, with every problem in `issues`
17
+ * @throws {FeaError} 301–317 for an invalid model, with every problem in `issues`
27
18
  */
28
- export declare const distributeAreaLoads: (model: FrameModel) => {
19
+ export declare const distributeAreaLoads: (model: FeaModel) => {
29
20
  memberLoads: MemberLoad[];
30
21
  warnings: Warnings;
31
22
  };
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.distributeAreaLoads = void 0;
4
+ const area_member_loads_1 = require("../../frame/area/area-member-loads");
5
+ const issues_1 = require("../../shared/validation/issues");
6
+ const validate_model_1 = require("../validation/validate-model");
7
+ /**
8
+ * The member loads that a model's null areas send to the members along their edges — what
9
+ * `analyze` adds to `memberLoads` — so they can be checked or previewed.
10
+ *
11
+ * Two-way areas send each point to the nearest edge (corner-bisector split); one-way areas
12
+ * split strips parallel to their unsupported edges half to each end; cantilever areas send
13
+ * `q · c` and a torque `q · c² / 2` per unit length to their support edge (c = depth). Edges
14
+ * split by intermediate nodes are cut at those nodes. Loads are per unit true area (a
15
+ * `projected` load is first converted, `q · |n · direction|`) and come out as trapezoidal loads
16
+ * per member length in global X, Y and Z (and torques), each tagged with its load case.
17
+ *
18
+ * @param model - The model, validated first
19
+ * @returns `memberLoads` and `warnings` (a one-way support edge parallel to the span)
20
+ * @throws {FeaError} 301–317 for an invalid model, with every problem in `issues`
21
+ */
22
+ const distributeAreaLoads = (model) => {
23
+ const issues = (0, validate_model_1.validateModel)(model);
24
+ if (issues.length > 0)
25
+ (0, issues_1.throwIssues)(issues);
26
+ return (0, area_member_loads_1.areaMemberLoads)(model);
27
+ };
28
+ exports.distributeAreaLoads = distributeAreaLoads;
29
+ //# sourceMappingURL=distribute-area-loads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribute-area-loads.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/distribute-area-loads.ts"],"names":[],"mappings":";;;AACA,6EAAwE;AAExE,8DAAgE;AAGhE,iEAA6D;AAE7D;;;;;;;;;;;;;;GAcG;AACI,MAAM,mBAAmB,GAAG,CACjC,KAAe,EACoC,EAAE;IACrD,MAAM,MAAM,GAAG,IAAA,8BAAa,EAAC,KAAK,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,IAAA,oBAAW,EAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,IAAA,mCAAe,EAAC,KAAK,CAAC,CAAC;AAChC,CAAC,CAAC;AANW,QAAA,mBAAmB,uBAM9B"}
@@ -1,6 +1,8 @@
1
- import { type LocalMemberLoad } from "../elements/fixed-end-forces";
2
- import type { AreaLoad, LoadCase, MemberLoad, NodalLoad } from "../types/model.type";
3
- import type { FrameSystem } from "./frame-system";
1
+ import { type LocalMemberLoad } from "../../frame/elements/fixed-end-forces";
2
+ import type { MemberLoad } from "../../frame/types/model.type";
3
+ import type { AreaLoad } from "../../shared/types/model.type";
4
+ import type { LoadCase, NodalLoad } from "../types/model.type";
5
+ import type { AnalysisSystem } from "./analysis-system";
4
6
  /**
5
7
  * Unrounded result of one load case or combination, in N and mm. Every field is linear in the
6
8
  * loads, so combinations are formed by factoring and adding states.
@@ -16,24 +18,18 @@ export interface RawState {
16
18
  /**
17
19
  * Solves one load case against the prepared, factorised system.
18
20
  *
19
- * Self-weight is `selfWeight · unitWeight · A` per unit member length along global −Z.
21
+ * Members take their loads and self-weight as fixed-end forces (see `memberPieceLoads`); shells
22
+ * take their area loads and self-weight as forces at their corners (see `addShellLoads`).
20
23
  *
21
24
  * @param loadCase - The load case (id and self-weight multiplier)
22
- * @param loads - The nodal and member loads tagged with this load case
23
- *
24
- * Shell areas take `selfWeight · unitWeight · thickness · modifiers.weight` per unit area along
25
- * −Z and their `AreaLoad`s as forces at their corners, each corner the share `∫ Nᵢ dA` of the
26
- * element's area on its mean plane (no corner moments, so a warped element's offsets do not load
27
- * the rotations auto-restraint holds).
28
- *
29
25
  * @param loads - The nodal and member loads tagged with this load case, and its area loads on
30
26
  * shell areas
31
27
  *
32
- * @throws {FrameAnalysisError} 304 if a load has a moment about a joint rotation that nothing
28
+ * @throws {FeaError} 304 if a load has a moment about a joint rotation that nothing
33
29
  * resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
34
30
  * requested for a member without `unitWeight`
35
31
  */
36
- export declare const solveLoadCase: (system: FrameSystem, loadCase: LoadCase, loads: {
32
+ export declare const solveLoadCase: (system: AnalysisSystem, loadCase: LoadCase, loads: {
37
33
  nodalLoads: NodalLoad[];
38
34
  memberLoads: MemberLoad[];
39
35
  shellLoads?: AreaLoad[];
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.combineStates = exports.solveLoadCase = void 0;
4
+ const frame_constant_1 = require("../../../core/constants/frame.constant");
5
+ const fea_error_1 = require("../../../core/errors/fea.error");
6
+ const fixed_end_forces_1 = require("../../frame/elements/fixed-end-forces");
7
+ const member_assembly_1 = require("../../frame/solver/member-assembly");
8
+ const member_loads_1 = require("../../frame/solver/member-loads");
9
+ const global_assembly_1 = require("../../shared/solver/global-assembly");
10
+ const issues_1 = require("../../shared/validation/issues");
11
+ const shell_forces_1 = require("../../shell/post/shell-forces");
12
+ const shell_loads_1 = require("../../shell/solver/shell-loads");
13
+ const matrix_1 = require("../../../utils/matrix");
14
+ const skyline_1 = require("../../../utils/skyline");
15
+ /**
16
+ * Solves one load case against the prepared, factorised system.
17
+ *
18
+ * Members take their loads and self-weight as fixed-end forces (see `memberPieceLoads`); shells
19
+ * take their area loads and self-weight as forces at their corners (see `addShellLoads`).
20
+ *
21
+ * @param loadCase - The load case (id and self-weight multiplier)
22
+ * @param loads - The nodal and member loads tagged with this load case, and its area loads on
23
+ * shell areas
24
+ *
25
+ * @throws {FeaError} 304 if a load has a moment about a joint rotation that nothing
26
+ * resists (an auto-restrained axis), 308 for a load outside its member, 313 if self-weight is
27
+ * requested for a member without `unitWeight`
28
+ */
29
+ const solveLoadCase = (system, loadCase, loads) => {
30
+ const { members, dofCount, boundary, equation, free, factor, nodeIndex, memberIndex } = system;
31
+ const F = new Array(dofCount).fill(0);
32
+ const selfWeight = loadCase.selfWeight ?? 0;
33
+ const memberLoads = (0, member_loads_1.memberPieceLoads)(system.memberGroups, members, memberIndex, loads.memberLoads, loadCase.id, selfWeight);
34
+ const fixed = members.map((member, m) => {
35
+ const condensed = member.condenseFixedEndForces((0, fixed_end_forces_1.fixedEndForces)(memberLoads[m], member.length));
36
+ (0, member_assembly_1.scatterMemberForces)(F, member, condensed, -1);
37
+ return condensed;
38
+ });
39
+ // Shell surface loads as forces at the element corners
40
+ (0, shell_loads_1.addShellLoads)(F, system.shells, system.shellsByArea, loads.shellLoads ?? [], selfWeight);
41
+ for (const load of loads.nodalLoads) {
42
+ const base = 6 * nodeIndex.get(load.nodeId);
43
+ [load.fx, load.fy, load.fz].forEach((v, k) => (F[base + k] += (v ?? 0) * 1e3));
44
+ [load.mx, load.my, load.mz].forEach((v, k) => (F[base + 3 + k] += (v ?? 0) * 1e6));
45
+ }
46
+ // A held rotation axis is decoupled from the structure: a moment about it has no load path.
47
+ let momentScale = 0;
48
+ for (let n = 0; n < system.nodes.length; n++) {
49
+ for (let k = 3; k < 6; k++)
50
+ momentScale = Math.max(momentScale, Math.abs(F[6 * n + k]));
51
+ }
52
+ for (const { node, axis } of system.autoRestraints) {
53
+ const moment = axis.reduce((sum, a, i) => sum + a * F[6 * node + 3 + i], 0);
54
+ if (Math.abs(moment) > frame_constant_1.SINGULARITY_TOLERANCE * momentScale) {
55
+ const lead = axis.reduce((best, a, i) => (Math.abs(a) > Math.abs(axis[best]) ? i : best), 0);
56
+ (0, issues_1.throwIssues)([
57
+ (0, issues_1.modelIssue)(fea_error_1.FeaErrors.STRUCTURE_UNSTABLE, {
58
+ nodeId: system.nodes[node].id,
59
+ dof: ["rx", "ry", "rz"][lead],
60
+ loadCaseId: loadCase.id,
61
+ }),
62
+ ]);
63
+ }
64
+ }
65
+ const U = new Array(dofCount).fill(0);
66
+ if (factor) {
67
+ const solution = (0, skyline_1.skylineSolve)(factor, free.map((dof) => F[dof]));
68
+ free.forEach((dof) => (U[dof] = solution[equation[dof]]));
69
+ }
70
+ // Elastic end forces k·u per member; their global sum is K·U, from which R = K·U − F
71
+ const KU = new Array(dofCount).fill(0);
72
+ const memberForces = members.map((member, m) => {
73
+ const uLocal = (0, matrix_1.matVec)(member.T, (0, member_assembly_1.memberDofs)(member).map((d) => U[d]));
74
+ const elastic = (0, matrix_1.matVec)(member.k, uLocal);
75
+ (0, member_assembly_1.scatterMemberForces)(KU, member, elastic, 1);
76
+ return elastic.map((v, i) => v + fixed[m][i]);
77
+ });
78
+ for (const shell of system.shells) {
79
+ const dofs = (0, global_assembly_1.elementDofs)(shell.nodeIndices);
80
+ const forces = (0, matrix_1.matVec)(shell.element.kGlobal, dofs.map((d) => U[d]));
81
+ dofs.forEach((d, a) => (KU[d] += forces[a]));
82
+ }
83
+ const R = KU.map((v, i) => (boundary.restrained[i] ? v - F[i] : 0));
84
+ const shellForces = system.shells.map((shell) => (0, shell_forces_1.shellRawForces)(shell, U));
85
+ return { U, R, F, memberForces, shellForces, memberLoads };
86
+ };
87
+ exports.solveLoadCase = solveLoadCase;
88
+ /** Superposes factored states: `Σ factor × state`. Member loads are concatenated, scaled. */
89
+ const combineStates = (terms) => {
90
+ const first = terms[0].state;
91
+ const add = (pick, length) => {
92
+ const out = new Array(length).fill(0);
93
+ for (const { state, factor } of terms) {
94
+ pick(state).forEach((v, i) => (out[i] += factor * v));
95
+ }
96
+ return out;
97
+ };
98
+ return {
99
+ U: add((s) => s.U, first.U.length),
100
+ R: add((s) => s.R, first.R.length),
101
+ F: add((s) => s.F, first.F.length),
102
+ memberForces: first.memberForces.map((_, m) => add((s) => s.memberForces[m], 12)),
103
+ shellForces: first.shellForces.map((f, sh) => add((s) => s.shellForces[sh], f.length)),
104
+ memberLoads: first.memberLoads.map((_, m) => terms.flatMap(({ state, factor }) => factor === 0 ? [] : state.memberLoads[m].map((l) => (0, member_loads_1.scaleMemberLoad)(l, factor)))),
105
+ };
106
+ };
107
+ exports.combineStates = combineStates;
108
+ //# sourceMappingURL=load-case-solver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-case-solver.js","sourceRoot":"","sources":["../../../../src/fea/analysis/solver/load-case-solver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import type { Member, MemberLoad, NullArea } from "../../frame/types/model.type";
2
+ import type { AreaLoad, FeaId, FeaNode, Restraint } from "../../shared/types/model.type";
3
+ import type { ShellArea } from "../../shell/types/model.type";
4
+ /**
5
+ * Fixed DOFs along a straight line: every node on the segment between two nodes, including the
6
+ * nodes the engine generates when it meshes shell areas, e.g. a wall base fixed along its
7
+ * length. `true` fixes the DOF; there are no line springs. Combined with point restraints at
8
+ * the same node, a fixed DOF stays fixed.
9
+ */
10
+ export interface LineRestraint {
11
+ nodeIds: [FeaId, FeaId];
12
+ ux?: boolean;
13
+ uy?: boolean;
14
+ uz?: boolean;
15
+ rx?: boolean;
16
+ ry?: boolean;
17
+ rz?: boolean;
18
+ }
19
+ export interface NodalLoad {
20
+ loadCase: string;
21
+ nodeId: FeaId;
22
+ fx?: number;
23
+ fy?: number;
24
+ fz?: number;
25
+ mx?: number;
26
+ my?: number;
27
+ mz?: number;
28
+ }
29
+ /** Descriptive category of a load case; it labels the case and does not change the analysis. */
30
+ export type LoadCaseType = "dead" | "superDead" | "live" | "roofLive" | "snow" | "wind" | "seismic" | "other";
31
+ /**
32
+ * One independently analysed set of loads, e.g. dead, superimposed dead or live. The loads
33
+ * themselves are listed in `FeaModel.nodalLoads` and `FeaModel.memberLoads`, each tagged
34
+ * with its `loadCase`.
35
+ */
36
+ export interface LoadCase {
37
+ id: string;
38
+ name?: string;
39
+ type?: LoadCaseType;
40
+ /**
41
+ * Self-weight multiplier (1 = full self-weight). Applies `selfWeight · unitWeight · A` per unit
42
+ * length of every member and `selfWeight · unitWeight · thickness` (times `modifiers.weight`)
43
+ * per unit area of every shell, along global −Z. Default 0.
44
+ */
45
+ selfWeight?: number;
46
+ }
47
+ /** One term of a load combination: a factor times a load case or another combination. */
48
+ export type CombinationTerm = {
49
+ case: string;
50
+ factor: number;
51
+ } | {
52
+ combination: string;
53
+ factor: number;
54
+ };
55
+ /** A linear combination (sum of factored terms) of load cases and other combinations. */
56
+ export interface LoadCombination {
57
+ id: string;
58
+ name?: string;
59
+ terms: CombinationTerm[];
60
+ }
61
+ export interface FeaModel {
62
+ nodes: FeaNode[];
63
+ /** Frame members; omit for a model of shells only, e.g. a mat foundation. */
64
+ members?: Member[];
65
+ restraints: Restraint[];
66
+ /** Fixed DOFs of every node along straight lines, generated mesh nodes included. */
67
+ lineRestraints?: LineRestraint[];
68
+ loadCases: LoadCase[];
69
+ /** Nodal loads of every load case, each tagged with its `loadCase`. */
70
+ nodalLoads?: NodalLoad[];
71
+ /** Member loads of every load case, each tagged with its `loadCase`. */
72
+ memberLoads?: MemberLoad[];
73
+ /** Null areas that distribute `areaLoads` to the members along their edges. */
74
+ areas?: NullArea[];
75
+ /** Shell areas: four-node flat shell elements with membrane and/or plate stiffness. */
76
+ shells?: ShellArea[];
77
+ /** Area loads of every load case, each tagged with its `loadCase`. */
78
+ areaLoads?: AreaLoad[];
79
+ combinations?: LoadCombination[];
80
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=model.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.type.js","sourceRoot":"","sources":["../../../../src/fea/analysis/types/model.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import type { Warnings } from "../../../core/types/output-message.type";
2
+ import type { MemberDiagram, MemberEndForces, MemberIntermediateNode, MemberNearMissNode, MemberReleaseDeformations, StationComponent } from "../../frame/types/results.type";
3
+ import type { FeaId } from "../../shared/types/model.type";
4
+ import type { FeaMesh, ShellElementForces, ShellForceComponent } from "../../shell/types/results.type";
5
+ import type { LoadCaseType } from "./model.type";
6
+ export interface NodalDisplacement {
7
+ nodeId: FeaId;
8
+ ux: number;
9
+ uy: number;
10
+ uz: number;
11
+ rx: number;
12
+ ry: number;
13
+ rz: number;
14
+ }
15
+ export interface NodalReaction {
16
+ nodeId: FeaId;
17
+ fx: number;
18
+ fy: number;
19
+ fz: number;
20
+ mx: number;
21
+ my: number;
22
+ mz: number;
23
+ }
24
+ /** A rotation direction at a node held by `analyze` because no member resists it. */
25
+ export interface AutoRestrainedDof {
26
+ nodeId: FeaId;
27
+ /** Unit vector of the held rotation axis, global X, Y, Z. */
28
+ axis: [number, number, number];
29
+ /** The global rotation DOF when `axis` is a global axis. */
30
+ dof?: "rx" | "ry" | "rz";
31
+ }
32
+ /** Max or min of a result across combinations, with the combination that produces it. */
33
+ export interface GoverningValue {
34
+ value: number;
35
+ combinationId: string;
36
+ }
37
+ export interface GoverningExtremeValue extends GoverningValue {
38
+ x: number;
39
+ }
40
+ export type Bound<T> = {
41
+ max: T;
42
+ min: T;
43
+ };
44
+ /** Results of one load case or one load combination. */
45
+ export interface FeaCaseResult {
46
+ id: string;
47
+ kind: "case" | "combination";
48
+ name?: string;
49
+ type?: LoadCaseType;
50
+ nodalDisplacements: NodalDisplacement[];
51
+ reactions: NodalReaction[];
52
+ memberEndForces: MemberEndForces[];
53
+ /** One entry per member with any released or spring end DOF, in model order. */
54
+ releaseDeformations: MemberReleaseDeformations[];
55
+ memberDiagrams: MemberDiagram[];
56
+ /** One entry per shell element, area by area in model order (see `FeaResult.mesh`). */
57
+ shellForces: ShellElementForces[];
58
+ equilibriumResidual: {
59
+ force: number;
60
+ moment: number;
61
+ };
62
+ warnings: Warnings;
63
+ }
64
+ /** Max/min of every result across a set of combinations, with the governing combination. */
65
+ export interface FeaEnvelope {
66
+ combinationIds: string[];
67
+ nodalDisplacements: ({
68
+ nodeId: FeaId;
69
+ } & Record<"ux" | "uy" | "uz" | "rx" | "ry" | "rz", Bound<GoverningValue>>)[];
70
+ reactions: ({
71
+ nodeId: FeaId;
72
+ } & Record<"fx" | "fy" | "fz" | "mx" | "my" | "mz", Bound<GoverningValue>>)[];
73
+ members: {
74
+ memberId: FeaId;
75
+ extremes: Record<StationComponent, Bound<GoverningExtremeValue>>;
76
+ }[];
77
+ shells: {
78
+ shellId: FeaId;
79
+ corners: ({
80
+ nodeId: FeaId;
81
+ } & Record<ShellForceComponent, Bound<GoverningValue>>)[];
82
+ }[];
83
+ }
84
+ export interface FeaResult {
85
+ cases: Record<string, FeaCaseResult>;
86
+ combinations: Record<string, FeaCaseResult>;
87
+ /** Envelope over all combinations; absent when the model has none. */
88
+ envelope?: FeaEnvelope;
89
+ /** The shell mesh; absent when the model has no shells. */
90
+ mesh?: FeaMesh;
91
+ calculationDetails: {
92
+ nodeCount: number;
93
+ memberCount: number;
94
+ shellCount: number;
95
+ dofCount: number;
96
+ freeDofCount: number;
97
+ profileSize: number;
98
+ loadCaseCount: number;
99
+ combinationCount: number;
100
+ /** Joint rotations held because every member there releases them (e.g. truss joints). */
101
+ autoRestrainedDofs: AutoRestrainedDof[];
102
+ /**
103
+ * Model nodes lying on a member between its ends that were connected to it (see
104
+ * `Member.connectIntermediateNodes`), member by member from its start.
105
+ */
106
+ intermediateNodes: MemberIntermediateNode[];
107
+ /**
108
+ * Model nodes close to a member but not on it, so not connected to it, each with a
109
+ * "Member connectivity" warning; same order.
110
+ */
111
+ nearMissNodes: MemberNearMissNode[];
112
+ };
113
+ units: {
114
+ force: "kN";
115
+ moment: "kN·m";
116
+ length: "mm";
117
+ rotation: "rad";
118
+ forcePerLength: "kN/m";
119
+ momentPerLength: "kN·m/m";
120
+ stress: "MPa";
121
+ };
122
+ warnings: Warnings;
123
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=results.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results.type.js","sourceRoot":"","sources":["../../../../src/fea/analysis/types/results.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import { type FeaModelIssue } from "../../../core/errors/fea.error";
2
+ import type { FeaModel } from "../types/model.type";
3
+ /**
4
+ * Checks a model without analysing it and returns every problem found, each with the
5
+ * node, member, load case, combination and field it concerns. An empty array means the
6
+ * model can be analysed, apart from an unstable structure (304) and a translation that nothing
7
+ * resists at a node connected only to shells (328), which only assembling the stiffness detects.
8
+ *
9
+ * @param model - The model to check
10
+ * @returns Every problem found (codes 301–303, 305–317 and 326–327, 329), in model order
11
+ */
12
+ export declare const validateModel: (model: FeaModel) => FeaModelIssue[];