xdfem2d 2026.10.4__tar.gz

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 (237) hide show
  1. xdfem2d-2026.10.4/.github/ISSUE_TEMPLATE/config.yml +10 -0
  2. xdfem2d-2026.10.4/.github/README.md +6 -0
  3. xdfem2d-2026.10.4/.gitignore +62 -0
  4. xdfem2d-2026.10.4/.python-version +1 -0
  5. xdfem2d-2026.10.4/LICENSE.md +59 -0
  6. xdfem2d-2026.10.4/PKG-INFO +275 -0
  7. xdfem2d-2026.10.4/README.md +191 -0
  8. xdfem2d-2026.10.4/examples/3-span-granite.py +85 -0
  9. xdfem2d-2026.10.4/examples/complex_wall_frame.x2d +0 -0
  10. xdfem2d-2026.10.4/examples/complex_wall_frame_symmetric.x2d +0 -0
  11. xdfem2d-2026.10.4/examples/example-arch.x2d +0 -0
  12. xdfem2d-2026.10.4/examples/example-continuous_beam.x2d +0 -0
  13. xdfem2d-2026.10.4/examples/example-cuts.py +82 -0
  14. xdfem2d-2026.10.4/examples/example-frame_and_wall.x2d +0 -0
  15. xdfem2d-2026.10.4/examples/example-grillage-cantilever.py +88 -0
  16. xdfem2d-2026.10.4/examples/example-grillage.py +80 -0
  17. xdfem2d-2026.10.4/examples/example-modal_frame.x2d +0 -0
  18. xdfem2d-2026.10.4/examples/example-sequences.x2d +0 -0
  19. xdfem2d-2026.10.4/examples/example-simple_beam_plane.x2d +0 -0
  20. xdfem2d-2026.10.4/examples/example-slab-mitc3.py +126 -0
  21. xdfem2d-2026.10.4/examples/example-slab-quad.py +149 -0
  22. xdfem2d-2026.10.4/examples/example-slab.py +101 -0
  23. xdfem2d-2026.10.4/examples/example-tension.x2d +0 -0
  24. xdfem2d-2026.10.4/examples/example-truss.x2d +0 -0
  25. xdfem2d-2026.10.4/examples/example.py +77 -0
  26. xdfem2d-2026.10.4/examples/example_2level_2bay_full.x2d +0 -0
  27. xdfem2d-2026.10.4/examples/make_dynamic_example.py +99 -0
  28. xdfem2d-2026.10.4/examples/model_export.dxf +3626 -0
  29. xdfem2d-2026.10.4/examples/model_robot_export.str +0 -0
  30. xdfem2d-2026.10.4/examples/test_frame.dxf +232 -0
  31. xdfem2d-2026.10.4/examples/ziR3V0tX +0 -0
  32. xdfem2d-2026.10.4/pyproject.toml +135 -0
  33. xdfem2d-2026.10.4/src/xdfem2d/__init__.py +195 -0
  34. xdfem2d-2026.10.4/src/xdfem2d/_compat.py +127 -0
  35. xdfem2d-2026.10.4/src/xdfem2d/assembly.py +529 -0
  36. xdfem2d-2026.10.4/src/xdfem2d/beam_bars_layout.py +67 -0
  37. xdfem2d-2026.10.4/src/xdfem2d/beam_bars_params.py +275 -0
  38. xdfem2d-2026.10.4/src/xdfem2d/beam_rebar.py +415 -0
  39. xdfem2d-2026.10.4/src/xdfem2d/combinations.py +145 -0
  40. xdfem2d-2026.10.4/src/xdfem2d/constraints.py +92 -0
  41. xdfem2d-2026.10.4/src/xdfem2d/cuts.py +897 -0
  42. xdfem2d-2026.10.4/src/xdfem2d/databases.py +352 -0
  43. xdfem2d-2026.10.4/src/xdfem2d/design_report.py +1439 -0
  44. xdfem2d-2026.10.4/src/xdfem2d/detailing.py +1736 -0
  45. xdfem2d-2026.10.4/src/xdfem2d/detailing_lengths.py +248 -0
  46. xdfem2d-2026.10.4/src/xdfem2d/dxf_io.py +445 -0
  47. xdfem2d-2026.10.4/src/xdfem2d/elements.py +154 -0
  48. xdfem2d-2026.10.4/src/xdfem2d/elements_grid.py +87 -0
  49. xdfem2d-2026.10.4/src/xdfem2d/file_io.py +210 -0
  50. xdfem2d-2026.10.4/src/xdfem2d/geo_expand.py +1377 -0
  51. xdfem2d-2026.10.4/src/xdfem2d/ifc_io.py +972 -0
  52. xdfem2d-2026.10.4/src/xdfem2d/import_io.py +712 -0
  53. xdfem2d-2026.10.4/src/xdfem2d/loads.py +1065 -0
  54. xdfem2d-2026.10.4/src/xdfem2d/member_utils.py +273 -0
  55. xdfem2d-2026.10.4/src/xdfem2d/meshing.py +927 -0
  56. xdfem2d-2026.10.4/src/xdfem2d/model_check.py +659 -0
  57. xdfem2d-2026.10.4/src/xdfem2d/model_json.py +795 -0
  58. xdfem2d-2026.10.4/src/xdfem2d/model_stats.py +377 -0
  59. xdfem2d-2026.10.4/src/xdfem2d/models.py +2301 -0
  60. xdfem2d-2026.10.4/src/xdfem2d/phasing.py +1044 -0
  61. xdfem2d-2026.10.4/src/xdfem2d/plate_common.py +118 -0
  62. xdfem2d-2026.10.4/src/xdfem2d/postprocess.py +346 -0
  63. xdfem2d-2026.10.4/src/xdfem2d/punching.py +293 -0
  64. xdfem2d-2026.10.4/src/xdfem2d/quad_elements.py +405 -0
  65. xdfem2d-2026.10.4/src/xdfem2d/quad_elements_dkt4.py +239 -0
  66. xdfem2d-2026.10.4/src/xdfem2d/quad_elements_mitc4.py +250 -0
  67. xdfem2d-2026.10.4/src/xdfem2d/rc_design.py +2789 -0
  68. xdfem2d-2026.10.4/src/xdfem2d/references.py +514 -0
  69. xdfem2d-2026.10.4/src/xdfem2d/report_io.py +1300 -0
  70. xdfem2d-2026.10.4/src/xdfem2d/results_io.py +64 -0
  71. xdfem2d-2026.10.4/src/xdfem2d/robot_io.py +253 -0
  72. xdfem2d-2026.10.4/src/xdfem2d/sap2000_io.py +1657 -0
  73. xdfem2d-2026.10.4/src/xdfem2d/script_check.py +2239 -0
  74. xdfem2d-2026.10.4/src/xdfem2d/script_export.py +883 -0
  75. xdfem2d-2026.10.4/src/xdfem2d/script_runner.py +155 -0
  76. xdfem2d-2026.10.4/src/xdfem2d/seismic.py +72 -0
  77. xdfem2d-2026.10.4/src/xdfem2d/solver.py +2379 -0
  78. xdfem2d-2026.10.4/src/xdfem2d/steel_design.py +438 -0
  79. xdfem2d-2026.10.4/src/xdfem2d/structure.py +4615 -0
  80. xdfem2d-2026.10.4/src/xdfem2d/structure_io.py +1128 -0
  81. xdfem2d-2026.10.4/src/xdfem2d/structure_io_checked.py +710 -0
  82. xdfem2d-2026.10.4/src/xdfem2d/subdivide.py +628 -0
  83. xdfem2d-2026.10.4/src/xdfem2d/template_api.py +739 -0
  84. xdfem2d-2026.10.4/src/xdfem2d/templates.py +1778 -0
  85. xdfem2d-2026.10.4/src/xdfem2d/timber_design.py +584 -0
  86. xdfem2d-2026.10.4/src/xdfem2d/tri_elements.py +195 -0
  87. xdfem2d-2026.10.4/src/xdfem2d/tri_elements_allman.py +330 -0
  88. xdfem2d-2026.10.4/src/xdfem2d/tri_elements_dkt.py +295 -0
  89. xdfem2d-2026.10.4/src/xdfem2d/tri_elements_esfem.py +234 -0
  90. xdfem2d-2026.10.4/src/xdfem2d/tri_elements_mitc3.py +260 -0
  91. xdfem2d-2026.10.4/src/xdfem2d/variants.py +519 -0
  92. xdfem2d-2026.10.4/src/xdfem2d/workflows.py +651 -0
  93. xdfem2d-2026.10.4/tests/README.md +85 -0
  94. xdfem2d-2026.10.4/tests/conftest.py +54 -0
  95. xdfem2d-2026.10.4/tests/context.py +49 -0
  96. xdfem2d-2026.10.4/tests/tests_engine/__init__.py +1 -0
  97. xdfem2d-2026.10.4/tests/tests_engine/test_action_type.py +156 -0
  98. xdfem2d-2026.10.4/tests/tests_engine/test_action_type_consumers.py +91 -0
  99. xdfem2d-2026.10.4/tests/tests_engine/test_api.py +371 -0
  100. xdfem2d-2026.10.4/tests/tests_engine/test_area_accessors.py +146 -0
  101. xdfem2d-2026.10.4/tests/tests_engine/test_area_element_helpers.py +63 -0
  102. xdfem2d-2026.10.4/tests/tests_engine/test_area_id_and_pdelta_guards.py +93 -0
  103. xdfem2d-2026.10.4/tests/tests_engine/test_area_target_type_checks.py +98 -0
  104. xdfem2d-2026.10.4/tests/tests_engine/test_bake_object_loads.py +147 -0
  105. xdfem2d-2026.10.4/tests/tests_engine/test_beam_bars_layout.py +86 -0
  106. xdfem2d-2026.10.4/tests/tests_engine/test_beam_bars_params.py +260 -0
  107. xdfem2d-2026.10.4/tests/tests_engine/test_beam_rebar.py +116 -0
  108. xdfem2d-2026.10.4/tests/tests_engine/test_beam_tags.py +361 -0
  109. xdfem2d-2026.10.4/tests/tests_engine/test_canonical_supports.py +216 -0
  110. xdfem2d-2026.10.4/tests/tests_engine/test_combinations.py +71 -0
  111. xdfem2d-2026.10.4/tests/tests_engine/test_constraints.py +449 -0
  112. xdfem2d-2026.10.4/tests/tests_engine/test_cuts_area_resultants.py +211 -0
  113. xdfem2d-2026.10.4/tests/tests_engine/test_cuts_bar_resultants.py +190 -0
  114. xdfem2d-2026.10.4/tests/tests_engine/test_cuts_geometry.py +208 -0
  115. xdfem2d-2026.10.4/tests/tests_engine/test_cuts_persistence.py +142 -0
  116. xdfem2d-2026.10.4/tests/tests_engine/test_cuts_quad_area_resultants.py +177 -0
  117. xdfem2d-2026.10.4/tests/tests_engine/test_cuts_result.py +230 -0
  118. xdfem2d-2026.10.4/tests/tests_engine/test_databases.py +69 -0
  119. xdfem2d-2026.10.4/tests/tests_engine/test_detailing.py +1230 -0
  120. xdfem2d-2026.10.4/tests/tests_engine/test_detailing_lengths.py +287 -0
  121. xdfem2d-2026.10.4/tests/tests_engine/test_domain.py +134 -0
  122. xdfem2d-2026.10.4/tests/tests_engine/test_edge_supports.py +267 -0
  123. xdfem2d-2026.10.4/tests/tests_engine/test_export.py +124 -0
  124. xdfem2d-2026.10.4/tests/tests_engine/test_file_io.py +96 -0
  125. xdfem2d-2026.10.4/tests/tests_engine/test_geo_rename.py +103 -0
  126. xdfem2d-2026.10.4/tests/tests_engine/test_geometry_objects.py +627 -0
  127. xdfem2d-2026.10.4/tests/tests_engine/test_id_existence_checks.py +154 -0
  128. xdfem2d-2026.10.4/tests/tests_engine/test_ifc_io.py +287 -0
  129. xdfem2d-2026.10.4/tests/tests_engine/test_import_variant.py +198 -0
  130. xdfem2d-2026.10.4/tests/tests_engine/test_load_case_case_folding.py +215 -0
  131. xdfem2d-2026.10.4/tests/tests_engine/test_member_utils.py +102 -0
  132. xdfem2d-2026.10.4/tests/tests_engine/test_meshing.py +273 -0
  133. xdfem2d-2026.10.4/tests/tests_engine/test_model_json.py +603 -0
  134. xdfem2d-2026.10.4/tests/tests_engine/test_model_stats.py +225 -0
  135. xdfem2d-2026.10.4/tests/tests_engine/test_nested_combinations.py +261 -0
  136. xdfem2d-2026.10.4/tests/tests_engine/test_optional_extras.py +163 -0
  137. xdfem2d-2026.10.4/tests/tests_engine/test_phase5_persistence.py +128 -0
  138. xdfem2d-2026.10.4/tests/tests_engine/test_phasing.py +129 -0
  139. xdfem2d-2026.10.4/tests/tests_engine/test_public_api.py +129 -0
  140. xdfem2d-2026.10.4/tests/tests_engine/test_quad_assembly.py +227 -0
  141. xdfem2d-2026.10.4/tests/tests_engine/test_quad_data_model.py +172 -0
  142. xdfem2d-2026.10.4/tests/tests_engine/test_quad_elements.py +165 -0
  143. xdfem2d-2026.10.4/tests/tests_engine/test_quad_elements_plate.py +166 -0
  144. xdfem2d-2026.10.4/tests/tests_engine/test_quad_meshing.py +304 -0
  145. xdfem2d-2026.10.4/tests/tests_engine/test_quad_prefer_paired_sections.py +143 -0
  146. xdfem2d-2026.10.4/tests/tests_engine/test_quad_stresses.py +286 -0
  147. xdfem2d-2026.10.4/tests/tests_engine/test_rc_columns.py +301 -0
  148. xdfem2d-2026.10.4/tests/tests_engine/test_rc_design.py +687 -0
  149. xdfem2d-2026.10.4/tests/tests_engine/test_reference_problems.py +128 -0
  150. xdfem2d-2026.10.4/tests/tests_engine/test_report_io.py +271 -0
  151. xdfem2d-2026.10.4/tests/tests_engine/test_sap2000_io.py +540 -0
  152. xdfem2d-2026.10.4/tests/tests_engine/test_script_check.py +1043 -0
  153. xdfem2d-2026.10.4/tests/tests_engine/test_script_editor.py +337 -0
  154. xdfem2d-2026.10.4/tests/tests_engine/test_script_export.py +349 -0
  155. xdfem2d-2026.10.4/tests/tests_engine/test_section_angle.py +69 -0
  156. xdfem2d-2026.10.4/tests/tests_engine/test_section_design_props.py +77 -0
  157. xdfem2d-2026.10.4/tests/tests_engine/test_seismic.py +96 -0
  158. xdfem2d-2026.10.4/tests/tests_engine/test_sequence.py +213 -0
  159. xdfem2d-2026.10.4/tests/tests_engine/test_sequence_corrections.py +315 -0
  160. xdfem2d-2026.10.4/tests/tests_engine/test_steel_design.py +85 -0
  161. xdfem2d-2026.10.4/tests/tests_engine/test_structure_io_checked.py +209 -0
  162. xdfem2d-2026.10.4/tests/tests_engine/test_subdivide.py +407 -0
  163. xdfem2d-2026.10.4/tests/tests_engine/test_subdivide_loads.py +57 -0
  164. xdfem2d-2026.10.4/tests/tests_engine/test_template_api.py +441 -0
  165. xdfem2d-2026.10.4/tests/tests_engine/test_template_quad_sections_paired.py +151 -0
  166. xdfem2d-2026.10.4/tests/tests_engine/test_templates.py +402 -0
  167. xdfem2d-2026.10.4/tests/tests_engine/test_used_names.py +79 -0
  168. xdfem2d-2026.10.4/tests/tests_engine/test_variant_model.py +87 -0
  169. xdfem2d-2026.10.4/tests/tests_engine/test_variant_sync.py +449 -0
  170. xdfem2d-2026.10.4/tests/tests_engine/test_variant_workflows_perf.py +115 -0
  171. xdfem2d-2026.10.4/tests/tests_engine/test_variants.py +220 -0
  172. xdfem2d-2026.10.4/tests/tests_model/__init__.py +1 -0
  173. xdfem2d-2026.10.4/tests/tests_model/test_advanced.py +629 -0
  174. xdfem2d-2026.10.4/tests/tests_model/test_allman_patch.py +158 -0
  175. xdfem2d-2026.10.4/tests/tests_model/test_constraints_validation.py +110 -0
  176. xdfem2d-2026.10.4/tests/tests_model/test_create_accepts_ids_and_objects.py +109 -0
  177. xdfem2d-2026.10.4/tests/tests_model/test_create_layer_invariant.py +242 -0
  178. xdfem2d-2026.10.4/tests/tests_model/test_cst.py +248 -0
  179. xdfem2d-2026.10.4/tests/tests_model/test_deferred_effects.py +62 -0
  180. xdfem2d-2026.10.4/tests/tests_model/test_design_report.py +137 -0
  181. xdfem2d-2026.10.4/tests/tests_model/test_dkt.py +527 -0
  182. xdfem2d-2026.10.4/tests/tests_model/test_dkt_dynamics.py +194 -0
  183. xdfem2d-2026.10.4/tests/tests_model/test_element_point_loads.py +141 -0
  184. xdfem2d-2026.10.4/tests/tests_model/test_esfem_modal.py +117 -0
  185. xdfem2d-2026.10.4/tests/tests_model/test_grid.py +291 -0
  186. xdfem2d-2026.10.4/tests/tests_model/test_grillage_reinforcement.py +81 -0
  187. xdfem2d-2026.10.4/tests/tests_model/test_incremental_solve.py +157 -0
  188. xdfem2d-2026.10.4/tests/tests_model/test_line_distributed.py +101 -0
  189. xdfem2d-2026.10.4/tests/tests_model/test_loads_facade_widening.py +216 -0
  190. xdfem2d-2026.10.4/tests/tests_model/test_material_from_grade.py +63 -0
  191. xdfem2d-2026.10.4/tests/tests_model/test_member_displacements.py +98 -0
  192. xdfem2d-2026.10.4/tests/tests_model/test_mitc3.py +150 -0
  193. xdfem2d-2026.10.4/tests/tests_model/test_mitc3_validation.py +178 -0
  194. xdfem2d-2026.10.4/tests/tests_model/test_modal_validation.py +492 -0
  195. xdfem2d-2026.10.4/tests/tests_model/test_nonlinear_springs.py +171 -0
  196. xdfem2d-2026.10.4/tests/tests_model/test_plate_common.py +82 -0
  197. xdfem2d-2026.10.4/tests/tests_model/test_plate_covers.py +93 -0
  198. xdfem2d-2026.10.4/tests/tests_model/test_plate_templates.py +163 -0
  199. xdfem2d-2026.10.4/tests/tests_model/test_postprocess.py +105 -0
  200. xdfem2d-2026.10.4/tests/tests_model/test_punching.py +175 -0
  201. xdfem2d-2026.10.4/tests/tests_model/test_punching_quad_lookup.py +114 -0
  202. xdfem2d-2026.10.4/tests/tests_model/test_quad_area_spring_and_thermal.py +365 -0
  203. xdfem2d-2026.10.4/tests/tests_model/test_quad_dynamics.py +192 -0
  204. xdfem2d-2026.10.4/tests/tests_model/test_quad_edge_load.py +63 -0
  205. xdfem2d-2026.10.4/tests/tests_model/test_quad_reinforcement_and_punching.py +261 -0
  206. xdfem2d-2026.10.4/tests/tests_model/test_quad_rename.py +88 -0
  207. xdfem2d-2026.10.4/tests/tests_model/test_references.py +261 -0
  208. xdfem2d-2026.10.4/tests/tests_model/test_simple_api.py +305 -0
  209. xdfem2d-2026.10.4/tests/tests_model/test_slab_reinforcement.py +135 -0
  210. xdfem2d-2026.10.4/tests/tests_model/test_special.py +264 -0
  211. xdfem2d-2026.10.4/tests/tests_model/test_springs_objects.py +140 -0
  212. xdfem2d-2026.10.4/tests/tests_model/test_springs_validation.py +308 -0
  213. xdfem2d-2026.10.4/tests/tests_model/test_steel_section_geom.py +44 -0
  214. xdfem2d-2026.10.4/tests/tests_model/test_timber_load_duration.py +62 -0
  215. xdfem2d-2026.10.4/tests/tests_model/test_tri_temperature.py +391 -0
  216. xdfem2d-2026.10.4/tests/tests_model/test_validation.py +274 -0
  217. xdfem2d-2026.10.4/tests/tests_model/test_validation_x2d.py +261 -0
  218. xdfem2d-2026.10.4/validation/README.md +313 -0
  219. xdfem2d-2026.10.4/validation/Validacao_Programa_MEF.docx +0 -0
  220. xdfem2d-2026.10.4/validation/Validacao_Programa_MEF_resultados.docx +0 -0
  221. xdfem2d-2026.10.4/validation/build_x2d.py +37 -0
  222. xdfem2d-2026.10.4/validation/design_cases.py +337 -0
  223. xdfem2d-2026.10.4/validation/design_cases_b.py +367 -0
  224. xdfem2d-2026.10.4/validation/design_cases_manual.md +175 -0
  225. xdfem2d-2026.10.4/validation/design_cases_manual.py +317 -0
  226. xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check.x2d +0 -0
  227. xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check2.x2d +0 -0
  228. xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check3_rhs.x2d +0 -0
  229. xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check3_rhs_plate.x2d +0 -0
  230. xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check4_chs.x2d +0 -0
  231. xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check4_chs_plate.x2d +0 -0
  232. xdfem2d-2026.10.4/validation/make_report.py +581 -0
  233. xdfem2d-2026.10.4/validation/modal_cases.py +569 -0
  234. xdfem2d-2026.10.4/validation/report_sections.py +990 -0
  235. xdfem2d-2026.10.4/validation/solve_all.py +174 -0
  236. xdfem2d-2026.10.4/validation/validate_quads.py +143 -0
  237. xdfem2d-2026.10.4/validation/validation_cases.py +1612 -0
@@ -0,0 +1,10 @@
1
+ # Vai para o main do repositório público em cada release do motor. Não editar
2
+ # lá: o push é --force e a árvore é substituída.
3
+ blank_issues_enabled: true
4
+ contact_links:
5
+ - name: Documentação
6
+ url: https://pcachim.github.io/xdfem2D
7
+ about: Guia da aplicação e referência da biblioteca.
8
+ - name: Descarregar a aplicação
9
+ url: https://github.com/pcachim/xdfem2D/releases
10
+ about: Executáveis para macOS, Windows e Linux.
@@ -0,0 +1,6 @@
1
+ Conteúdo copiado para a raiz do `.github/` do repositório público em cada
2
+ release do motor.
3
+
4
+ Está aqui, e não lá, porque a publicação é um espelho: o `main` público é
5
+ substituído por completo a cada release, portanto qualquer coisa editada
6
+ diretamente lá desaparece na seguinte.
@@ -0,0 +1,62 @@
1
+ # Python-generated files
2
+ __pycache__/
3
+ *.py[oc]
4
+ build/
5
+ dist/
6
+ wheels/
7
+ *.egg-info
8
+
9
+ # Virtual environments
10
+ .venv
11
+ .venv-build
12
+
13
+ # MkDocs build output
14
+ *.DS_Store
15
+ app/
16
+ dev/
17
+ site/
18
+
19
+ # Fine-tuning artifacts (large / regenerable — keep only the source in tunning/)
20
+ .venv-tune/
21
+ llama.cpp/
22
+ # LLM weights — nunca commitar (GB); só o gguf/Modelfile viaja no repo.
23
+ gguf/
24
+ gguf*
25
+ tunning/fused/
26
+ tunning/adapters/
27
+ tunning/gguf/
28
+ tunning/mlx_data/
29
+ tunning/dataset.jsonl
30
+ models/
31
+ # Rede de seguranca: pesos de modelos, onde quer que estejam. Foi um .gguf
32
+ # esquecido que encheu o .git com GB; estes padroes evitam a repeticao.
33
+ *.gguf
34
+ *.safetensors
35
+ # tunning/qa_teacher.jsonl — NAO ignorado de proposito: e gerado pelo teacher_pass.py
36
+ # mas e pequeno e precisa de viajar para a nuvem (Colab/Kaggle) com o repo.
37
+ tunning/.ipynb_checkpoints/
38
+ COMMIT_MSG.txt
39
+ TODO.txt
40
+ TODO.md
41
+ MIGRATION_PLAN.txt
42
+ EUROCODEPY_INTERACTION.md
43
+ release.yml
44
+ lixo*
45
+ api_keys.md
46
+ *.txt
47
+ *.json
48
+ !data/styles/*.json
49
+ .trash/
50
+ licensing/*
51
+ !licensing/generate_license.py
52
+ !licensing/passos_implementacao_xdfem2d.md
53
+ !licensing/limite.json
54
+ !licensing/license_public_key.pem
55
+ license_private_key.pem
56
+ Claude outputs
57
+
58
+ # Ficheiros de trabalho (fine-tuning / router)
59
+ *.joblib
60
+ tunning/*.log
61
+ tunning/*.bak-*
62
+ tunning/*.jsonl.bak-*
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,59 @@
1
+ xdfem2d — GNU Lesser General Public License v3
2
+ ================================================
3
+
4
+ This licence covers the **calculation engine**: the `xdfem2d` Python package,
5
+ published on PyPI under that name.
6
+
7
+ It does **not** cover the xdfem2D desktop application — the graphical interface
8
+ and the assistant, which form a separate package — distributed as freeware in
9
+ compiled form only, under its own terms (see [LICENSE.md](LICENSE.md)). Nothing
10
+ in those terms restricts the rights granted here.
11
+
12
+ (Described by package rather than by directory on purpose: this file travels
13
+ with the engine to a repository where the application's directories do not
14
+ exist, and a licence that points at a path the reader cannot find tells them
15
+ nothing.)
16
+
17
+ ---
18
+
19
+ Copyright (c) 2026 Paulo Cachim
20
+
21
+ The xdfem2d calculation engine is free software: you can redistribute it
22
+ and/or modify it under the terms of the GNU Lesser General Public License
23
+ as published by the Free Software Foundation, either version 3 of the
24
+ License, or (at your option) any later version.
25
+
26
+ The xdfem2d calculation engine is distributed in the hope that it will be
27
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
28
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
29
+ General Public License for more details.
30
+
31
+ You should have received a copy of the GNU Lesser General Public License
32
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
33
+
34
+ Full LGPL v3 text: <https://www.gnu.org/licenses/lgpl-3.0.html>
35
+
36
+ ---
37
+
38
+ Engineering notice
39
+ ------------------
40
+
41
+ The warranty disclaimer above is the operative legal text, and the following
42
+ adds nothing to it — but it is the part that matters in practice, so it is
43
+ stated plainly rather than left to be inferred from capital letters.
44
+
45
+ xdfem2d computes structural analysis and reinforcement design results. Those
46
+ results are not verified, certified, or checked against any code of practice
47
+ by their being produced. The software is an aid to calculation and not a
48
+ substitute for engineering judgement. Anyone using its output in the design,
49
+ verification, or construction of a real structure is responsible for
50
+ independently verifying it, and remains the engineer of record.
51
+
52
+ Third-party components
53
+ ----------------------
54
+
55
+ The engine depends on other packages, each under its own licence — NumPy,
56
+ SciPy, eurocodepy and others listed in pyproject.toml. They are
57
+ dependencies, not part of this Software, and are not relicensed by this
58
+ file. See NOTICE.md for the components bundled with the compiled
59
+ application, where the distinction matters a great deal more.
@@ -0,0 +1,275 @@
1
+ Metadata-Version: 2.5
2
+ Name: xdfem2d
3
+ Version: 2026.10.4
4
+ Summary: 2D plane frame and shell finite element analysis
5
+ License: xdfem2d — GNU Lesser General Public License v3
6
+ ================================================
7
+
8
+ This licence covers the **calculation engine**: the `xdfem2d` Python package,
9
+ published on PyPI under that name.
10
+
11
+ It does **not** cover the xdfem2D desktop application — the graphical interface
12
+ and the assistant, which form a separate package — distributed as freeware in
13
+ compiled form only, under its own terms (see [LICENSE.md](LICENSE.md)). Nothing
14
+ in those terms restricts the rights granted here.
15
+
16
+ (Described by package rather than by directory on purpose: this file travels
17
+ with the engine to a repository where the application's directories do not
18
+ exist, and a licence that points at a path the reader cannot find tells them
19
+ nothing.)
20
+
21
+ ---
22
+
23
+ Copyright (c) 2026 Paulo Cachim
24
+
25
+ The xdfem2d calculation engine is free software: you can redistribute it
26
+ and/or modify it under the terms of the GNU Lesser General Public License
27
+ as published by the Free Software Foundation, either version 3 of the
28
+ License, or (at your option) any later version.
29
+
30
+ The xdfem2d calculation engine is distributed in the hope that it will be
31
+ useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
32
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
33
+ General Public License for more details.
34
+
35
+ You should have received a copy of the GNU Lesser General Public License
36
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
37
+
38
+ Full LGPL v3 text: <https://www.gnu.org/licenses/lgpl-3.0.html>
39
+
40
+ ---
41
+
42
+ Engineering notice
43
+ ------------------
44
+
45
+ The warranty disclaimer above is the operative legal text, and the following
46
+ adds nothing to it — but it is the part that matters in practice, so it is
47
+ stated plainly rather than left to be inferred from capital letters.
48
+
49
+ xdfem2d computes structural analysis and reinforcement design results. Those
50
+ results are not verified, certified, or checked against any code of practice
51
+ by their being produced. The software is an aid to calculation and not a
52
+ substitute for engineering judgement. Anyone using its output in the design,
53
+ verification, or construction of a real structure is responsible for
54
+ independently verifying it, and remains the engineer of record.
55
+
56
+ Third-party components
57
+ ----------------------
58
+
59
+ The engine depends on other packages, each under its own licence — NumPy,
60
+ SciPy, eurocodepy and others listed in pyproject.toml. They are
61
+ dependencies, not part of this Software, and are not relicensed by this
62
+ file. See NOTICE.md for the components bundled with the compiled
63
+ application, where the distinction matters a great deal more.
64
+ License-File: LICENSE.md
65
+ Requires-Python: >=3.12
66
+ Requires-Dist: eurocodepy>=2027.0.7
67
+ Requires-Dist: numpy>=2.4.6
68
+ Requires-Dist: scipy>=1.11
69
+ Provides-Extra: all
70
+ Requires-Dist: ezdxf>=1.3; extra == 'all'
71
+ Requires-Dist: ifcopenshell>=0.8; extra == 'all'
72
+ Requires-Dist: matplotlib>=3.10.9; extra == 'all'
73
+ Requires-Dist: openpyxl>=3.1; extra == 'all'
74
+ Requires-Dist: python-docx>=1.1; extra == 'all'
75
+ Provides-Extra: dxf
76
+ Requires-Dist: ezdxf>=1.3; extra == 'dxf'
77
+ Provides-Extra: ifc
78
+ Requires-Dist: ifcopenshell>=0.8; extra == 'ifc'
79
+ Provides-Extra: report
80
+ Requires-Dist: matplotlib>=3.10.9; extra == 'report'
81
+ Requires-Dist: openpyxl>=3.1; extra == 'report'
82
+ Requires-Dist: python-docx>=1.1; extra == 'report'
83
+ Description-Content-Type: text/markdown
84
+
85
+ # xdfem2D
86
+
87
+ [![Engine on PyPI](https://img.shields.io/pypi/v/xdfem2d?label=engine)](https://pypi.org/project/xdfem2d/)
88
+ [![Python versions](https://img.shields.io/badge/python-3.12%2B-blue)](https://pypi.org/project/xdfem2d/)
89
+ [![Licence: LGPLv3](https://img.shields.io/badge/licence-LGPLv3-blue)](https://github.com/pcachim/xdfem2D/blob/main/LICENSE.md)
90
+ [![App release](https://img.shields.io/github/v/release/pcachim/xdfem2D?label=app)](https://github.com/pcachim/xdfem2D/releases)
91
+
92
+ This repository holds two things, under two licences.
93
+
94
+ **The calculation engine** — the source in this tree, `xdfem2d`, is a Python
95
+ library for two-dimensional finite element analysis of frames, shells, slabs
96
+ and grillages, under the GNU Lesser General Public License v3 (LGPLv3). No
97
+ interface, no dependency on one: it builds a model, solves it, and gives back
98
+ numbers.
99
+
100
+ **The desktop application** — a graphical interface built on that engine, with
101
+ an assistant that can answer questions about the model you have open. It is
102
+ free to use, distributed as a compiled application under its own terms, and its
103
+ source is not published. Download it from
104
+ [Releases](https://github.com/pcachim/xdfem2D/releases); the documentation is
105
+ at [pcachim.github.io/xdfem2D](https://pcachim.github.io/xdfem2D).
106
+
107
+ The rest of this page is about the library. Releases tagged `engine-v*` are
108
+ the engine; those tagged `v*` are the application.
109
+
110
+ ## Install
111
+
112
+ Python **3.12 or later**.
113
+
114
+ ```bash
115
+ pip install xdfem2d
116
+ ```
117
+
118
+ The core install is NumPy, SciPy and
119
+ [eurocodepy](https://github.com/pcachim/eurocodepy) — what solving and design
120
+ need. Reporting and file exchange are separate extras, because a solver running
121
+ in a script or a service should not have to install a Word library:
122
+
123
+ ```bash
124
+ pip install "xdfem2d[report]" # matplotlib, openpyxl, python-docx
125
+ pip install "xdfem2d[dxf]" # ezdxf
126
+ pip install "xdfem2d[ifc]" # ifcopenshell — IFC (openBIM) import/export
127
+ pip install "xdfem2d[all]" # all of the above
128
+ ```
129
+
130
+ Everything they cover is reached lazily, so the engine imports, assembles,
131
+ solves and designs without them.
132
+
133
+ ## Versioning
134
+
135
+ The engine and the desktop app are versioned and released independently, on
136
+ separate cycles — an engine release does not imply a matching app release,
137
+ and vice versa. Don't expect the two numbers to line up. The app's **Help →
138
+ About** dialog lists both, so a bug report can name the right one.
139
+
140
+ ---
141
+
142
+ ## A first model
143
+
144
+ ```python
145
+ from xdfem2d import Structure2D
146
+
147
+ s = Structure2D()
148
+ s.add_material('C30/37', elastic_modulus=33e6, unit_weight=25.0)
149
+ s.add_section('S', 'C30/37', b=0.3, h=0.5)
150
+ s.add_node('N1', 0.0, 0.0)
151
+ s.add_node('N2', 6.0, 0.0)
152
+ s.add_bar_element('E1', 'N1', 'N2', 'S')
153
+ s.add_support('PIN', ux=True, uy=True)
154
+ s.add_support('ROLL', uy=True)
155
+ s.assign_support('N1', 'PIN')
156
+ s.assign_support('N2', 'ROLL')
157
+ s.add_load_case('LC')
158
+ s.add_distributed_load('E1', 'LC', fye=-20.0, fyd=-20.0)
159
+ s.add_analysis_case('LIN', 'Linear', {'LC': 1.0})
160
+
161
+ results = s.calculate()
162
+ print(results['reactions']['LC']['N1']) # [Rx, Ry, Mz] — 60 kN up at N1
163
+ ```
164
+
165
+ Units are metres, kN, kN·m and kN/m². Angles are in degrees where an angle is
166
+ named. The full API is in the
167
+ [Engine Reference](https://pcachim.github.io/xdfem2D/engine-api.html).
168
+
169
+ ## What it does
170
+
171
+ - **Two analysis domains** — a model is either *plane* (frames and walls in
172
+ their plane: ux, uy, θz) or *plate* (slabs and grillages out of plane: w, θx,
173
+ θy). The DOF machinery is shared; only the meaning of the three components
174
+ changes, so cases, combinations, envelopes and phasing work identically in
175
+ both.
176
+ - **Bar elements** — plane frames and trusses (releases, offsets, springs) and,
177
+ in the plate domain, grillage beams (bending + St-Venant torsion GJ/L).
178
+ - **Triangular and quadrilateral elements** — plane stress / plane strain
179
+ membranes (CST, Allman, ES-FEM; QM6, Q4) and, in the plate domain, plate
180
+ bending: MITC3 (shear-deformable Mindlin–Reissner, the default — thin and
181
+ thick slabs) and DKT (thin-plate Kirchhoff), plus MITC4 and DKT4 quads. They
182
+ report moments mx/my/mxy, principal moments, shears and Wood–Armer design
183
+ moments.
184
+ - **Slab loads** — transverse pressure pz, self-weight, a through-thickness
185
+ thermal gradient, and Winkler area springs (slab on grade). A mesher expands
186
+ geometric regions into elements.
187
+ - **Analysis** — linear static, non-linear (unilateral springs), P-Delta,
188
+ modal, and response spectrum (EC8); in the plate domain the modes are the
189
+ out-of-plane (vertical) vibration.
190
+ - **Load cases and combinations**, including nested combinations, envelopes and
191
+ Eurocode (EN 1990) generation.
192
+ - **Design to Eurocodes**, via [eurocodepy](https://github.com/pcachim/eurocodepy)
193
+ (LGPLv3): reinforced concrete (EC2), steel members (EC3) and timber members
194
+ (EC5).
195
+ - **Construction phasing** and model variants.
196
+ - **File formats** — its own `.x2d`, plus SAP2000 `.s2k`, Robot, DXF, IFC and
197
+ Excel.
198
+
199
+ ## Validation and known limits
200
+
201
+ [`validation/`](https://github.com/pcachim/xdfem2D/tree/main/validation) holds
202
+ cases with a closed-form solution, built by the same code that the test suite
203
+ runs, together with the generated report (`Validacao_Programa_MEF_resultados.docx`,
204
+ in Portuguese). They cover bars (N/V/M, settlement, temperature, curved arch),
205
+ membrane triangles, DKT and MITC3 plates against Navier and Mindlin series,
206
+ grillages, node and Winkler springs, multi-point constraints, modal analysis
207
+ (closed-form frequencies, effective masses) and the response-spectrum chain
208
+ (SRSS, CQC, interpolation), and the plate quads.
209
+
210
+ What that does and does not establish, so the result is not taken for more:
211
+
212
+ - **Validated against a formula** is not **validated for your structure**. A
213
+ case here checks that an element reproduces a textbook solution, not that it
214
+ suits a given geometry, mesh or load path.
215
+ - The response-spectrum cases check the spectral chain (Sd = Sa/ω², SRSS,
216
+ CQC); they do not certify the EC8 parameters you choose.
217
+ - **Design** (EC2/EC3/EC5) is checked on worked examples in `validation/`; it is
218
+ an aid to calculation, not a code-compliance certificate.
219
+ - P-Delta, construction phasing and variants have regression tests but no
220
+ closed-form case in `validation/`.
221
+ - **Mass is lumped and diagonal**: concentrated masses give exact frequencies,
222
+ distributed mass converges as O(h²) from below. Rotary inertia exists only if
223
+ `mtz` is given. Mass is taken from the absolute value of Fy, and the
224
+ percentages of effective mass refer to the mass on the free DOFs.
225
+ - **Multi-point constraints are imposed by penalty** (relative error ~10⁻⁶,
226
+ with a tiny spurious reaction).
227
+ - **Element springs are lumped** (k·L/2 at each end): a uniform state is
228
+ exact, a varying one converges as O(h²). Unilateral springs are honoured
229
+ only by `NonLinear` analysis cases.
230
+ - The CST triangle converges slowly, from below, in bending; the Allman
231
+ triangle converges faster.
232
+
233
+ ## A note on results
234
+
235
+ xdfem2d computes analysis and design results. It does not verify them, and
236
+ producing a number is not the same as the number being right for your problem.
237
+ It is an aid to calculation, not a substitute for engineering judgement:
238
+ anyone using its output in the design or construction of a real structure is
239
+ responsible for verifying it independently and remains the engineer of record.
240
+
241
+ ## Citing
242
+
243
+ If xdfem2d contributes to published work, please cite the version you used:
244
+
245
+ > Cachim, P. *xdfem2D — 2D finite element analysis of frames, walls, slabs and
246
+ > grillages* (engine version X.Y.Z). https://github.com/pcachim/xdfem2D
247
+
248
+ The version is in `xdfem2d.__version__` and on
249
+ [PyPI](https://pypi.org/project/xdfem2d/).
250
+
251
+ ## Support and contributing
252
+
253
+ Bugs and questions, for the library or the application, go to
254
+ [Issues](https://github.com/pcachim/xdfem2D/issues). A report with a model
255
+ that reproduces the problem is the most useful thing you can send. For
256
+ anything else, write to [eurocodepy@gmail.com](mailto:eurocodepy@gmail.com).
257
+ The documentation is at [pcachim.github.io/xdfem2D](https://pcachim.github.io/xdfem2D).
258
+
259
+ This tree is a mirror. Development happens in a private repository and each
260
+ engine release replaces it wholesale, so a pull request here has nowhere to
261
+ land — it would be overwritten by the next one.
262
+
263
+ ## Licence
264
+
265
+ The engine — everything in this tree — is under the **LGPLv3**; see
266
+ [LICENSE.md](https://github.com/pcachim/xdfem2D/blob/main/LICENSE.md). It
267
+ depends on [eurocodepy](https://github.com/pcachim/eurocodepy), also LGPLv3,
268
+ for its Eurocode material databases and design checks.
269
+
270
+ The desktop application is a separate work, distributed as freeware in compiled
271
+ form under its own terms (see the
272
+ [Licenses page](https://pcachim.github.io/xdfem2D/license.html), and
273
+ `LICENSE.md` shipped with the app). Nothing in those terms restricts your
274
+ rights to the engine: you may use, modify and redistribute it under the LGPLv3,
275
+ from here or from PyPI.
@@ -0,0 +1,191 @@
1
+ # xdfem2D
2
+
3
+ [![Engine on PyPI](https://img.shields.io/pypi/v/xdfem2d?label=engine)](https://pypi.org/project/xdfem2d/)
4
+ [![Python versions](https://img.shields.io/badge/python-3.12%2B-blue)](https://pypi.org/project/xdfem2d/)
5
+ [![Licence: LGPLv3](https://img.shields.io/badge/licence-LGPLv3-blue)](https://github.com/pcachim/xdfem2D/blob/main/LICENSE.md)
6
+ [![App release](https://img.shields.io/github/v/release/pcachim/xdfem2D?label=app)](https://github.com/pcachim/xdfem2D/releases)
7
+
8
+ This repository holds two things, under two licences.
9
+
10
+ **The calculation engine** — the source in this tree, `xdfem2d`, is a Python
11
+ library for two-dimensional finite element analysis of frames, shells, slabs
12
+ and grillages, under the GNU Lesser General Public License v3 (LGPLv3). No
13
+ interface, no dependency on one: it builds a model, solves it, and gives back
14
+ numbers.
15
+
16
+ **The desktop application** — a graphical interface built on that engine, with
17
+ an assistant that can answer questions about the model you have open. It is
18
+ free to use, distributed as a compiled application under its own terms, and its
19
+ source is not published. Download it from
20
+ [Releases](https://github.com/pcachim/xdfem2D/releases); the documentation is
21
+ at [pcachim.github.io/xdfem2D](https://pcachim.github.io/xdfem2D).
22
+
23
+ The rest of this page is about the library. Releases tagged `engine-v*` are
24
+ the engine; those tagged `v*` are the application.
25
+
26
+ ## Install
27
+
28
+ Python **3.12 or later**.
29
+
30
+ ```bash
31
+ pip install xdfem2d
32
+ ```
33
+
34
+ The core install is NumPy, SciPy and
35
+ [eurocodepy](https://github.com/pcachim/eurocodepy) — what solving and design
36
+ need. Reporting and file exchange are separate extras, because a solver running
37
+ in a script or a service should not have to install a Word library:
38
+
39
+ ```bash
40
+ pip install "xdfem2d[report]" # matplotlib, openpyxl, python-docx
41
+ pip install "xdfem2d[dxf]" # ezdxf
42
+ pip install "xdfem2d[ifc]" # ifcopenshell — IFC (openBIM) import/export
43
+ pip install "xdfem2d[all]" # all of the above
44
+ ```
45
+
46
+ Everything they cover is reached lazily, so the engine imports, assembles,
47
+ solves and designs without them.
48
+
49
+ ## Versioning
50
+
51
+ The engine and the desktop app are versioned and released independently, on
52
+ separate cycles — an engine release does not imply a matching app release,
53
+ and vice versa. Don't expect the two numbers to line up. The app's **Help →
54
+ About** dialog lists both, so a bug report can name the right one.
55
+
56
+ ---
57
+
58
+ ## A first model
59
+
60
+ ```python
61
+ from xdfem2d import Structure2D
62
+
63
+ s = Structure2D()
64
+ s.add_material('C30/37', elastic_modulus=33e6, unit_weight=25.0)
65
+ s.add_section('S', 'C30/37', b=0.3, h=0.5)
66
+ s.add_node('N1', 0.0, 0.0)
67
+ s.add_node('N2', 6.0, 0.0)
68
+ s.add_bar_element('E1', 'N1', 'N2', 'S')
69
+ s.add_support('PIN', ux=True, uy=True)
70
+ s.add_support('ROLL', uy=True)
71
+ s.assign_support('N1', 'PIN')
72
+ s.assign_support('N2', 'ROLL')
73
+ s.add_load_case('LC')
74
+ s.add_distributed_load('E1', 'LC', fye=-20.0, fyd=-20.0)
75
+ s.add_analysis_case('LIN', 'Linear', {'LC': 1.0})
76
+
77
+ results = s.calculate()
78
+ print(results['reactions']['LC']['N1']) # [Rx, Ry, Mz] — 60 kN up at N1
79
+ ```
80
+
81
+ Units are metres, kN, kN·m and kN/m². Angles are in degrees where an angle is
82
+ named. The full API is in the
83
+ [Engine Reference](https://pcachim.github.io/xdfem2D/engine-api.html).
84
+
85
+ ## What it does
86
+
87
+ - **Two analysis domains** — a model is either *plane* (frames and walls in
88
+ their plane: ux, uy, θz) or *plate* (slabs and grillages out of plane: w, θx,
89
+ θy). The DOF machinery is shared; only the meaning of the three components
90
+ changes, so cases, combinations, envelopes and phasing work identically in
91
+ both.
92
+ - **Bar elements** — plane frames and trusses (releases, offsets, springs) and,
93
+ in the plate domain, grillage beams (bending + St-Venant torsion GJ/L).
94
+ - **Triangular and quadrilateral elements** — plane stress / plane strain
95
+ membranes (CST, Allman, ES-FEM; QM6, Q4) and, in the plate domain, plate
96
+ bending: MITC3 (shear-deformable Mindlin–Reissner, the default — thin and
97
+ thick slabs) and DKT (thin-plate Kirchhoff), plus MITC4 and DKT4 quads. They
98
+ report moments mx/my/mxy, principal moments, shears and Wood–Armer design
99
+ moments.
100
+ - **Slab loads** — transverse pressure pz, self-weight, a through-thickness
101
+ thermal gradient, and Winkler area springs (slab on grade). A mesher expands
102
+ geometric regions into elements.
103
+ - **Analysis** — linear static, non-linear (unilateral springs), P-Delta,
104
+ modal, and response spectrum (EC8); in the plate domain the modes are the
105
+ out-of-plane (vertical) vibration.
106
+ - **Load cases and combinations**, including nested combinations, envelopes and
107
+ Eurocode (EN 1990) generation.
108
+ - **Design to Eurocodes**, via [eurocodepy](https://github.com/pcachim/eurocodepy)
109
+ (LGPLv3): reinforced concrete (EC2), steel members (EC3) and timber members
110
+ (EC5).
111
+ - **Construction phasing** and model variants.
112
+ - **File formats** — its own `.x2d`, plus SAP2000 `.s2k`, Robot, DXF, IFC and
113
+ Excel.
114
+
115
+ ## Validation and known limits
116
+
117
+ [`validation/`](https://github.com/pcachim/xdfem2D/tree/main/validation) holds
118
+ cases with a closed-form solution, built by the same code that the test suite
119
+ runs, together with the generated report (`Validacao_Programa_MEF_resultados.docx`,
120
+ in Portuguese). They cover bars (N/V/M, settlement, temperature, curved arch),
121
+ membrane triangles, DKT and MITC3 plates against Navier and Mindlin series,
122
+ grillages, node and Winkler springs, multi-point constraints, modal analysis
123
+ (closed-form frequencies, effective masses) and the response-spectrum chain
124
+ (SRSS, CQC, interpolation), and the plate quads.
125
+
126
+ What that does and does not establish, so the result is not taken for more:
127
+
128
+ - **Validated against a formula** is not **validated for your structure**. A
129
+ case here checks that an element reproduces a textbook solution, not that it
130
+ suits a given geometry, mesh or load path.
131
+ - The response-spectrum cases check the spectral chain (Sd = Sa/ω², SRSS,
132
+ CQC); they do not certify the EC8 parameters you choose.
133
+ - **Design** (EC2/EC3/EC5) is checked on worked examples in `validation/`; it is
134
+ an aid to calculation, not a code-compliance certificate.
135
+ - P-Delta, construction phasing and variants have regression tests but no
136
+ closed-form case in `validation/`.
137
+ - **Mass is lumped and diagonal**: concentrated masses give exact frequencies,
138
+ distributed mass converges as O(h²) from below. Rotary inertia exists only if
139
+ `mtz` is given. Mass is taken from the absolute value of Fy, and the
140
+ percentages of effective mass refer to the mass on the free DOFs.
141
+ - **Multi-point constraints are imposed by penalty** (relative error ~10⁻⁶,
142
+ with a tiny spurious reaction).
143
+ - **Element springs are lumped** (k·L/2 at each end): a uniform state is
144
+ exact, a varying one converges as O(h²). Unilateral springs are honoured
145
+ only by `NonLinear` analysis cases.
146
+ - The CST triangle converges slowly, from below, in bending; the Allman
147
+ triangle converges faster.
148
+
149
+ ## A note on results
150
+
151
+ xdfem2d computes analysis and design results. It does not verify them, and
152
+ producing a number is not the same as the number being right for your problem.
153
+ It is an aid to calculation, not a substitute for engineering judgement:
154
+ anyone using its output in the design or construction of a real structure is
155
+ responsible for verifying it independently and remains the engineer of record.
156
+
157
+ ## Citing
158
+
159
+ If xdfem2d contributes to published work, please cite the version you used:
160
+
161
+ > Cachim, P. *xdfem2D — 2D finite element analysis of frames, walls, slabs and
162
+ > grillages* (engine version X.Y.Z). https://github.com/pcachim/xdfem2D
163
+
164
+ The version is in `xdfem2d.__version__` and on
165
+ [PyPI](https://pypi.org/project/xdfem2d/).
166
+
167
+ ## Support and contributing
168
+
169
+ Bugs and questions, for the library or the application, go to
170
+ [Issues](https://github.com/pcachim/xdfem2D/issues). A report with a model
171
+ that reproduces the problem is the most useful thing you can send. For
172
+ anything else, write to [eurocodepy@gmail.com](mailto:eurocodepy@gmail.com).
173
+ The documentation is at [pcachim.github.io/xdfem2D](https://pcachim.github.io/xdfem2D).
174
+
175
+ This tree is a mirror. Development happens in a private repository and each
176
+ engine release replaces it wholesale, so a pull request here has nowhere to
177
+ land — it would be overwritten by the next one.
178
+
179
+ ## Licence
180
+
181
+ The engine — everything in this tree — is under the **LGPLv3**; see
182
+ [LICENSE.md](https://github.com/pcachim/xdfem2D/blob/main/LICENSE.md). It
183
+ depends on [eurocodepy](https://github.com/pcachim/eurocodepy), also LGPLv3,
184
+ for its Eurocode material databases and design checks.
185
+
186
+ The desktop application is a separate work, distributed as freeware in compiled
187
+ form under its own terms (see the
188
+ [Licenses page](https://pcachim.github.io/xdfem2D/license.html), and
189
+ `LICENSE.md` shipped with the app). Nothing in those terms restricts your
190
+ rights to the engine: you may use, modify and redistribute it under the LGPLv3,
191
+ from here or from PyPI.