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.
- xdfem2d-2026.10.4/.github/ISSUE_TEMPLATE/config.yml +10 -0
- xdfem2d-2026.10.4/.github/README.md +6 -0
- xdfem2d-2026.10.4/.gitignore +62 -0
- xdfem2d-2026.10.4/.python-version +1 -0
- xdfem2d-2026.10.4/LICENSE.md +59 -0
- xdfem2d-2026.10.4/PKG-INFO +275 -0
- xdfem2d-2026.10.4/README.md +191 -0
- xdfem2d-2026.10.4/examples/3-span-granite.py +85 -0
- xdfem2d-2026.10.4/examples/complex_wall_frame.x2d +0 -0
- xdfem2d-2026.10.4/examples/complex_wall_frame_symmetric.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-arch.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-continuous_beam.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-cuts.py +82 -0
- xdfem2d-2026.10.4/examples/example-frame_and_wall.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-grillage-cantilever.py +88 -0
- xdfem2d-2026.10.4/examples/example-grillage.py +80 -0
- xdfem2d-2026.10.4/examples/example-modal_frame.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-sequences.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-simple_beam_plane.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-slab-mitc3.py +126 -0
- xdfem2d-2026.10.4/examples/example-slab-quad.py +149 -0
- xdfem2d-2026.10.4/examples/example-slab.py +101 -0
- xdfem2d-2026.10.4/examples/example-tension.x2d +0 -0
- xdfem2d-2026.10.4/examples/example-truss.x2d +0 -0
- xdfem2d-2026.10.4/examples/example.py +77 -0
- xdfem2d-2026.10.4/examples/example_2level_2bay_full.x2d +0 -0
- xdfem2d-2026.10.4/examples/make_dynamic_example.py +99 -0
- xdfem2d-2026.10.4/examples/model_export.dxf +3626 -0
- xdfem2d-2026.10.4/examples/model_robot_export.str +0 -0
- xdfem2d-2026.10.4/examples/test_frame.dxf +232 -0
- xdfem2d-2026.10.4/examples/ziR3V0tX +0 -0
- xdfem2d-2026.10.4/pyproject.toml +135 -0
- xdfem2d-2026.10.4/src/xdfem2d/__init__.py +195 -0
- xdfem2d-2026.10.4/src/xdfem2d/_compat.py +127 -0
- xdfem2d-2026.10.4/src/xdfem2d/assembly.py +529 -0
- xdfem2d-2026.10.4/src/xdfem2d/beam_bars_layout.py +67 -0
- xdfem2d-2026.10.4/src/xdfem2d/beam_bars_params.py +275 -0
- xdfem2d-2026.10.4/src/xdfem2d/beam_rebar.py +415 -0
- xdfem2d-2026.10.4/src/xdfem2d/combinations.py +145 -0
- xdfem2d-2026.10.4/src/xdfem2d/constraints.py +92 -0
- xdfem2d-2026.10.4/src/xdfem2d/cuts.py +897 -0
- xdfem2d-2026.10.4/src/xdfem2d/databases.py +352 -0
- xdfem2d-2026.10.4/src/xdfem2d/design_report.py +1439 -0
- xdfem2d-2026.10.4/src/xdfem2d/detailing.py +1736 -0
- xdfem2d-2026.10.4/src/xdfem2d/detailing_lengths.py +248 -0
- xdfem2d-2026.10.4/src/xdfem2d/dxf_io.py +445 -0
- xdfem2d-2026.10.4/src/xdfem2d/elements.py +154 -0
- xdfem2d-2026.10.4/src/xdfem2d/elements_grid.py +87 -0
- xdfem2d-2026.10.4/src/xdfem2d/file_io.py +210 -0
- xdfem2d-2026.10.4/src/xdfem2d/geo_expand.py +1377 -0
- xdfem2d-2026.10.4/src/xdfem2d/ifc_io.py +972 -0
- xdfem2d-2026.10.4/src/xdfem2d/import_io.py +712 -0
- xdfem2d-2026.10.4/src/xdfem2d/loads.py +1065 -0
- xdfem2d-2026.10.4/src/xdfem2d/member_utils.py +273 -0
- xdfem2d-2026.10.4/src/xdfem2d/meshing.py +927 -0
- xdfem2d-2026.10.4/src/xdfem2d/model_check.py +659 -0
- xdfem2d-2026.10.4/src/xdfem2d/model_json.py +795 -0
- xdfem2d-2026.10.4/src/xdfem2d/model_stats.py +377 -0
- xdfem2d-2026.10.4/src/xdfem2d/models.py +2301 -0
- xdfem2d-2026.10.4/src/xdfem2d/phasing.py +1044 -0
- xdfem2d-2026.10.4/src/xdfem2d/plate_common.py +118 -0
- xdfem2d-2026.10.4/src/xdfem2d/postprocess.py +346 -0
- xdfem2d-2026.10.4/src/xdfem2d/punching.py +293 -0
- xdfem2d-2026.10.4/src/xdfem2d/quad_elements.py +405 -0
- xdfem2d-2026.10.4/src/xdfem2d/quad_elements_dkt4.py +239 -0
- xdfem2d-2026.10.4/src/xdfem2d/quad_elements_mitc4.py +250 -0
- xdfem2d-2026.10.4/src/xdfem2d/rc_design.py +2789 -0
- xdfem2d-2026.10.4/src/xdfem2d/references.py +514 -0
- xdfem2d-2026.10.4/src/xdfem2d/report_io.py +1300 -0
- xdfem2d-2026.10.4/src/xdfem2d/results_io.py +64 -0
- xdfem2d-2026.10.4/src/xdfem2d/robot_io.py +253 -0
- xdfem2d-2026.10.4/src/xdfem2d/sap2000_io.py +1657 -0
- xdfem2d-2026.10.4/src/xdfem2d/script_check.py +2239 -0
- xdfem2d-2026.10.4/src/xdfem2d/script_export.py +883 -0
- xdfem2d-2026.10.4/src/xdfem2d/script_runner.py +155 -0
- xdfem2d-2026.10.4/src/xdfem2d/seismic.py +72 -0
- xdfem2d-2026.10.4/src/xdfem2d/solver.py +2379 -0
- xdfem2d-2026.10.4/src/xdfem2d/steel_design.py +438 -0
- xdfem2d-2026.10.4/src/xdfem2d/structure.py +4615 -0
- xdfem2d-2026.10.4/src/xdfem2d/structure_io.py +1128 -0
- xdfem2d-2026.10.4/src/xdfem2d/structure_io_checked.py +710 -0
- xdfem2d-2026.10.4/src/xdfem2d/subdivide.py +628 -0
- xdfem2d-2026.10.4/src/xdfem2d/template_api.py +739 -0
- xdfem2d-2026.10.4/src/xdfem2d/templates.py +1778 -0
- xdfem2d-2026.10.4/src/xdfem2d/timber_design.py +584 -0
- xdfem2d-2026.10.4/src/xdfem2d/tri_elements.py +195 -0
- xdfem2d-2026.10.4/src/xdfem2d/tri_elements_allman.py +330 -0
- xdfem2d-2026.10.4/src/xdfem2d/tri_elements_dkt.py +295 -0
- xdfem2d-2026.10.4/src/xdfem2d/tri_elements_esfem.py +234 -0
- xdfem2d-2026.10.4/src/xdfem2d/tri_elements_mitc3.py +260 -0
- xdfem2d-2026.10.4/src/xdfem2d/variants.py +519 -0
- xdfem2d-2026.10.4/src/xdfem2d/workflows.py +651 -0
- xdfem2d-2026.10.4/tests/README.md +85 -0
- xdfem2d-2026.10.4/tests/conftest.py +54 -0
- xdfem2d-2026.10.4/tests/context.py +49 -0
- xdfem2d-2026.10.4/tests/tests_engine/__init__.py +1 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_action_type.py +156 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_action_type_consumers.py +91 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_api.py +371 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_area_accessors.py +146 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_area_element_helpers.py +63 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_area_id_and_pdelta_guards.py +93 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_area_target_type_checks.py +98 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_bake_object_loads.py +147 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_beam_bars_layout.py +86 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_beam_bars_params.py +260 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_beam_rebar.py +116 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_beam_tags.py +361 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_canonical_supports.py +216 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_combinations.py +71 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_constraints.py +449 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_cuts_area_resultants.py +211 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_cuts_bar_resultants.py +190 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_cuts_geometry.py +208 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_cuts_persistence.py +142 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_cuts_quad_area_resultants.py +177 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_cuts_result.py +230 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_databases.py +69 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_detailing.py +1230 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_detailing_lengths.py +287 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_domain.py +134 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_edge_supports.py +267 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_export.py +124 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_file_io.py +96 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_geo_rename.py +103 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_geometry_objects.py +627 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_id_existence_checks.py +154 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_ifc_io.py +287 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_import_variant.py +198 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_load_case_case_folding.py +215 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_member_utils.py +102 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_meshing.py +273 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_model_json.py +603 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_model_stats.py +225 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_nested_combinations.py +261 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_optional_extras.py +163 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_phase5_persistence.py +128 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_phasing.py +129 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_public_api.py +129 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_assembly.py +227 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_data_model.py +172 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_elements.py +165 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_elements_plate.py +166 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_meshing.py +304 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_prefer_paired_sections.py +143 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_quad_stresses.py +286 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_rc_columns.py +301 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_rc_design.py +687 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_reference_problems.py +128 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_report_io.py +271 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_sap2000_io.py +540 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_script_check.py +1043 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_script_editor.py +337 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_script_export.py +349 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_section_angle.py +69 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_section_design_props.py +77 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_seismic.py +96 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_sequence.py +213 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_sequence_corrections.py +315 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_steel_design.py +85 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_structure_io_checked.py +209 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_subdivide.py +407 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_subdivide_loads.py +57 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_template_api.py +441 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_template_quad_sections_paired.py +151 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_templates.py +402 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_used_names.py +79 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_variant_model.py +87 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_variant_sync.py +449 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_variant_workflows_perf.py +115 -0
- xdfem2d-2026.10.4/tests/tests_engine/test_variants.py +220 -0
- xdfem2d-2026.10.4/tests/tests_model/__init__.py +1 -0
- xdfem2d-2026.10.4/tests/tests_model/test_advanced.py +629 -0
- xdfem2d-2026.10.4/tests/tests_model/test_allman_patch.py +158 -0
- xdfem2d-2026.10.4/tests/tests_model/test_constraints_validation.py +110 -0
- xdfem2d-2026.10.4/tests/tests_model/test_create_accepts_ids_and_objects.py +109 -0
- xdfem2d-2026.10.4/tests/tests_model/test_create_layer_invariant.py +242 -0
- xdfem2d-2026.10.4/tests/tests_model/test_cst.py +248 -0
- xdfem2d-2026.10.4/tests/tests_model/test_deferred_effects.py +62 -0
- xdfem2d-2026.10.4/tests/tests_model/test_design_report.py +137 -0
- xdfem2d-2026.10.4/tests/tests_model/test_dkt.py +527 -0
- xdfem2d-2026.10.4/tests/tests_model/test_dkt_dynamics.py +194 -0
- xdfem2d-2026.10.4/tests/tests_model/test_element_point_loads.py +141 -0
- xdfem2d-2026.10.4/tests/tests_model/test_esfem_modal.py +117 -0
- xdfem2d-2026.10.4/tests/tests_model/test_grid.py +291 -0
- xdfem2d-2026.10.4/tests/tests_model/test_grillage_reinforcement.py +81 -0
- xdfem2d-2026.10.4/tests/tests_model/test_incremental_solve.py +157 -0
- xdfem2d-2026.10.4/tests/tests_model/test_line_distributed.py +101 -0
- xdfem2d-2026.10.4/tests/tests_model/test_loads_facade_widening.py +216 -0
- xdfem2d-2026.10.4/tests/tests_model/test_material_from_grade.py +63 -0
- xdfem2d-2026.10.4/tests/tests_model/test_member_displacements.py +98 -0
- xdfem2d-2026.10.4/tests/tests_model/test_mitc3.py +150 -0
- xdfem2d-2026.10.4/tests/tests_model/test_mitc3_validation.py +178 -0
- xdfem2d-2026.10.4/tests/tests_model/test_modal_validation.py +492 -0
- xdfem2d-2026.10.4/tests/tests_model/test_nonlinear_springs.py +171 -0
- xdfem2d-2026.10.4/tests/tests_model/test_plate_common.py +82 -0
- xdfem2d-2026.10.4/tests/tests_model/test_plate_covers.py +93 -0
- xdfem2d-2026.10.4/tests/tests_model/test_plate_templates.py +163 -0
- xdfem2d-2026.10.4/tests/tests_model/test_postprocess.py +105 -0
- xdfem2d-2026.10.4/tests/tests_model/test_punching.py +175 -0
- xdfem2d-2026.10.4/tests/tests_model/test_punching_quad_lookup.py +114 -0
- xdfem2d-2026.10.4/tests/tests_model/test_quad_area_spring_and_thermal.py +365 -0
- xdfem2d-2026.10.4/tests/tests_model/test_quad_dynamics.py +192 -0
- xdfem2d-2026.10.4/tests/tests_model/test_quad_edge_load.py +63 -0
- xdfem2d-2026.10.4/tests/tests_model/test_quad_reinforcement_and_punching.py +261 -0
- xdfem2d-2026.10.4/tests/tests_model/test_quad_rename.py +88 -0
- xdfem2d-2026.10.4/tests/tests_model/test_references.py +261 -0
- xdfem2d-2026.10.4/tests/tests_model/test_simple_api.py +305 -0
- xdfem2d-2026.10.4/tests/tests_model/test_slab_reinforcement.py +135 -0
- xdfem2d-2026.10.4/tests/tests_model/test_special.py +264 -0
- xdfem2d-2026.10.4/tests/tests_model/test_springs_objects.py +140 -0
- xdfem2d-2026.10.4/tests/tests_model/test_springs_validation.py +308 -0
- xdfem2d-2026.10.4/tests/tests_model/test_steel_section_geom.py +44 -0
- xdfem2d-2026.10.4/tests/tests_model/test_timber_load_duration.py +62 -0
- xdfem2d-2026.10.4/tests/tests_model/test_tri_temperature.py +391 -0
- xdfem2d-2026.10.4/tests/tests_model/test_validation.py +274 -0
- xdfem2d-2026.10.4/tests/tests_model/test_validation_x2d.py +261 -0
- xdfem2d-2026.10.4/validation/README.md +313 -0
- xdfem2d-2026.10.4/validation/Validacao_Programa_MEF.docx +0 -0
- xdfem2d-2026.10.4/validation/Validacao_Programa_MEF_resultados.docx +0 -0
- xdfem2d-2026.10.4/validation/build_x2d.py +37 -0
- xdfem2d-2026.10.4/validation/design_cases.py +337 -0
- xdfem2d-2026.10.4/validation/design_cases_b.py +367 -0
- xdfem2d-2026.10.4/validation/design_cases_manual.md +175 -0
- xdfem2d-2026.10.4/validation/design_cases_manual.py +317 -0
- xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check.x2d +0 -0
- xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check2.x2d +0 -0
- xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check3_rhs.x2d +0 -0
- xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check3_rhs_plate.x2d +0 -0
- xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check4_chs.x2d +0 -0
- xdfem2d-2026.10.4/validation/ec3_eurocodeapplied_check4_chs_plate.x2d +0 -0
- xdfem2d-2026.10.4/validation/make_report.py +581 -0
- xdfem2d-2026.10.4/validation/modal_cases.py +569 -0
- xdfem2d-2026.10.4/validation/report_sections.py +990 -0
- xdfem2d-2026.10.4/validation/solve_all.py +174 -0
- xdfem2d-2026.10.4/validation/validate_quads.py +143 -0
- 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
|
+
[](https://pypi.org/project/xdfem2d/)
|
|
88
|
+
[](https://pypi.org/project/xdfem2d/)
|
|
89
|
+
[](https://github.com/pcachim/xdfem2D/blob/main/LICENSE.md)
|
|
90
|
+
[](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
|
+
[](https://pypi.org/project/xdfem2d/)
|
|
4
|
+
[](https://pypi.org/project/xdfem2d/)
|
|
5
|
+
[](https://github.com/pcachim/xdfem2D/blob/main/LICENSE.md)
|
|
6
|
+
[](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.
|