From fdded8f0d7a6ee4dc95a1dfd0b112bb2a510ee6e Mon Sep 17 00:00:00 2001 From: krande Date: Wed, 20 Dec 2023 21:05:35 +0100 Subject: [PATCH] apply formatting and update visualization in jupyter --- .../rendering_pygfx/render_pygfx_fem_2.py | 5 +- .../rendering_pygfx/render_pygfx_part.py | 4 +- examples/experiments/wgpu_gui/triangle.py | 7 +- examples/experiments/wgpu_gui/wxpy.py | 7 +- .../notebooks/basic_parametric_model.ipynb | 38 +- .../cantilever_fem_eigenfrequency.ipynb | 609 ++---------------- .../notebooks/cantilever_fem_extended.ipynb | 34 +- examples/notebooks/convert_fem.ipynb | 60 +- .../notebooks/convert_genie_xml_to_ifc.ipynb | 48 +- .../notebooks/ifc_revolved_area_solid.ipynb | 4 +- examples/scripts/eigen_analysis.py | 2 +- examples/scripts/param_model_analysis.py | 4 +- examples/scripts/sdof/analyze.py | 147 ++--- examples/scripts/sdof/main.py | 6 +- examples/scripts/sdof/model.py | 2 +- examples/scripts/sdof/plot.py | 8 +- .../convert_length_unit_patch.py | 4 +- .../convert_length_unit_patch_info.py | 4 +- .../convert_length_unit_patch_v3.py | 4 +- .../units_convert/ifc_patch_convert_units.py | 2 +- src/ada/api/beams/geom_beams.py | 10 +- src/ada/api/containers.py | 8 +- src/ada/api/spatial/assembly.py | 4 +- src/ada/api/spatial/part.py | 108 ++-- src/ada/base/physical_objects.py | 24 + .../cadit/ifc/convert_length_unit_patch.py | 2 +- src/ada/cadit/ifc/units_conversion.py | 5 +- src/ada/cadit/step/read/reader_utils.py | 2 +- src/ada/fem/__init__.py | 2 +- src/ada/fem/common.py | 3 +- src/ada/fem/concept.py | 24 +- src/ada/fem/constraints.py | 67 +- .../abaqus/write/write_output_requests.py | 1 - .../fem/formats/abaqus/write/write_parts.py | 1 + src/ada/fem/formats/abaqus/write/writer.py | 7 +- src/ada/fem/formats/code_aster/common.py | 9 +- src/ada/fem/formats/code_aster/execute.py | 21 +- .../formats/code_aster/write/api_helpers.py | 82 +-- .../formats/code_aster/write/steps/dynamic.py | 5 +- .../fem/formats/code_aster/write/write_med.py | 12 +- .../formats/code_aster/write/write_steps.py | 2 +- .../fem/formats/code_aster/write/writer.py | 1 - src/ada/fem/formats/general.py | 2 +- .../fem/formats/sesam/write/write_sections.py | 3 +- src/ada/fem/formats/sesam/write/writer.py | 4 +- src/ada/fem/formats/utils.py | 7 +- src/ada/fem/formats/vtu/write.py | 3 +- src/ada/fem/outputs.py | 36 +- src/ada/fem/results/common.py | 1 + src/ada/fem/results/concepts.py | 23 +- src/ada/fem/results/field_data.py | 4 +- src/ada/fem/results/sqlite_store.py | 5 +- src/ada/fem/sections.py | 9 +- src/ada/fem/shapes/definitions.py | 12 +- src/ada/occ/store.py | 4 +- src/ada/visit/comms.py | 5 +- src/ada/visit/render_pygfx.py | 2 +- src/ada/visit/render_pygfx_helpers.py | 6 +- tests/core/fem/formats/vtu/test_vtu_write.py | 4 +- 59 files changed, 529 insertions(+), 1000 deletions(-) diff --git a/examples/experiments/rendering_pygfx/render_pygfx_fem_2.py b/examples/experiments/rendering_pygfx/render_pygfx_fem_2.py index 3a466fa21..de9ed59de 100644 --- a/examples/experiments/rendering_pygfx/render_pygfx_fem_2.py +++ b/examples/experiments/rendering_pygfx/render_pygfx_fem_2.py @@ -2,9 +2,10 @@ # or # mamba env update -f environment.yml --prune # -import meshio import pathlib +import meshio + import ada from ada.config import logger @@ -21,7 +22,7 @@ def main(): rmed = ada.from_fem_res(rmed_file) # rmed.to_xdmf("temp/eigen_shell_cantilever_code_aster.xdmf") rmed.to_gltf("temp/eigen_shell_cantilever_code_aster.glb") - rmed.to_viewer(1, 'modes___DEPL[0] - 13.5363') + rmed.to_viewer(1, "modes___DEPL[0] - 13.5363") if __name__ == "__main__": diff --git a/examples/experiments/rendering_pygfx/render_pygfx_part.py b/examples/experiments/rendering_pygfx/render_pygfx_part.py index 38d07ac7e..0f8215996 100644 --- a/examples/experiments/rendering_pygfx/render_pygfx_part.py +++ b/examples/experiments/rendering_pygfx/render_pygfx_part.py @@ -29,7 +29,9 @@ def main(): bm5 = ada.Beam("my_beam_xyz_shell", (3, 2, 1), (3.5, 2.5, 1.5), "IPE300", color="red") bm6 = ada.Beam("my_beam_xyz", (1, 2, 1), (1.5, 2.5, 1.5), "IPE300", color="yellow") bm7_taper = ada.BeamTapered("my_Ibeam_taper", (2, 2, 1), (2.5, 2.5, 1.5), "IPE600", "IPE300", color="blue") - bm8_taper = ada.BeamTapered("my_BOX_beam_taper", (4, 2, 1), (4.5, 2.5, 1.5), "BG300x200x8x10", "BG200x200x8x10", color="red") + bm8_taper = ada.BeamTapered( + "my_BOX_beam_taper", (4, 2, 1), (4.5, 2.5, 1.5), "BG300x200x8x10", "BG200x200x8x10", color="red" + ) render_override.update({bm4.guid: GeomRepr.SHELL, bm5.guid: GeomRepr.SHELL}) # All beam profiles as solids diff --git a/examples/experiments/wgpu_gui/triangle.py b/examples/experiments/wgpu_gui/triangle.py index 71354c502..6975082c5 100644 --- a/examples/experiments/wgpu_gui/triangle.py +++ b/examples/experiments/wgpu_gui/triangle.py @@ -17,7 +17,6 @@ import wgpu - # %% Shaders @@ -71,9 +70,7 @@ def main(canvas, power_preference="high-performance", limits=None): async def main_async(canvas): """Async function to setup a viz on the given canvas.""" - adapter = await wgpu.request_adapter_async( - canvas=canvas, power_preference="high-performance" - ) + adapter = await wgpu.request_adapter_async(canvas=canvas, power_preference="high-performance") device = await adapter.request_device_async(required_limits={}) return _main(canvas, device) @@ -157,4 +154,4 @@ def draw_frame(): canvas = WgpuCanvas(size=(640, 480), title="wgpu triangle") main(canvas) - run() \ No newline at end of file + run() diff --git a/examples/experiments/wgpu_gui/wxpy.py b/examples/experiments/wgpu_gui/wxpy.py index d1bc391ce..128b0dd72 100644 --- a/examples/experiments/wgpu_gui/wxpy.py +++ b/examples/experiments/wgpu_gui/wxpy.py @@ -3,11 +3,10 @@ """ # run_example = false -import wx -from wgpu.gui.wx import WgpuWidget import wgpu.backends.rs # noqa: F401, Select Rust backend - +import wx from triangle import main +from wgpu.gui.wx import WgpuWidget class Example(wx.Frame): @@ -38,4 +37,4 @@ def __init__(self): main(example.canvas1) main(example.canvas2) -app.MainLoop() \ No newline at end of file +app.MainLoop() diff --git a/examples/notebooks/basic_parametric_model.ipynb b/examples/notebooks/basic_parametric_model.ipynb index 090681953..2a9c950e4 100644 --- a/examples/notebooks/basic_parametric_model.ipynb +++ b/examples/notebooks/basic_parametric_model.ipynb @@ -2,8 +2,13 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "metadata": {}, + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2023-12-20T18:39:26.243111300Z", + "start_time": "2023-12-20T18:39:23.141930600Z" + } + }, "outputs": [], "source": [ "from ada.param_models.basic_module import SimpleStru\n", @@ -12,15 +17,17 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = Assembly(\"ParamModel\")\n", "\n", - "for x in range(0, 2):\n", - " for y in range(0, 2):\n", - " for z in range(0, 2):\n", + "dim = 4\n", + "\n", + "for x in range(0, dim):\n", + " for y in range(0, dim):\n", + " for z in range(0, dim):\n", " props = dict(name=f\"P{x}{y}{z}\", placement=Placement((x * 5, y * 5, z * 3)))\n", " if z != 0:\n", " props[\"add_bottom_floor\"] = False\n", @@ -33,27 +40,18 @@ "metadata": {}, "outputs": [], "source": [ - "a" + "a.show()" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "pycharm": { "is_executing": true } }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Beginning writing to IFC file \"C:\\work\\code\\adapy\\examples\\temp\\massive_stru.ifc\" using IfcOpenShell\n", - "IFC file creation complete\n" - ] - } - ], + "outputs": [], "source": [ "a.to_ifc(\"temp/massive_stru.ifc\")" ] @@ -75,9 +73,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.11.6" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/examples/notebooks/cantilever_fem_eigenfrequency.ipynb b/examples/notebooks/cantilever_fem_eigenfrequency.ipynb index bef999770..afdbc008b 100644 --- a/examples/notebooks/cantilever_fem_eigenfrequency.ipynb +++ b/examples/notebooks/cantilever_fem_eigenfrequency.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -22,7 +22,7 @@ " assembly = ada.Assembly(\"MyAssembly\") / [ada.Part(\"MyPart\") / bm]\n", " part = bm.parent\n", " part.fem = bm.to_fem_obj(0.1, geom_repr, options=GmshOptions(Mesh_ElementOrder=1))\n", - " nodes = bm.bbox.sides.back(return_fem_nodes=True)\n", + " nodes = bm.bbox().sides.back(return_fem_nodes=True)\n", " assembly.fem.add_bc(ada.fem.Bc(\"Fixed\", ada.fem.FemSet(\"bc_nodes\", nodes), [1, 2, 3, 4, 5, 6]))\n", " assembly.fem.add_step(ada.fem.StepEigen(\"Eigen\", num_eigen_modes=10))\n", " return assembly" @@ -30,22 +30,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Removing old files before copying new\n", - "Created a Calculix input deck at \"c:\\AibelProgs\\ADA\\scratch\\Cantilever_CCX_EIG_sh\"\n", - "--------------------------------------------------------------------------------\n", - "Starting Calculix simulation \"Cantilever_CCX_EIG_sh\" (on Windows) using 2 cpus\n", - "Finished Calculix simulation \"Cantilever_CCX_EIG_sh\"\n", - "--------------------------------------------------------------------------------\n" - ] - } - ], + "outputs": [], "source": [ "a = make_fem(\"shell\")\n", "ccx_res = a.to_fem(\"Cantilever_CCX_EIG_sh\", \"calculix\", overwrite=True, execute=True)" @@ -53,582 +40,80 @@ }, { "cell_type": "code", - "execution_count": 4, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Removing old files before copying new\n", - "Created a Code_Aster input deck at \"c:\\AibelProgs\\ADA\\scratch\\Cantilever_CA_EIG_sh\"\n", - "--------------------------------------------------------------------------------\n", - "Starting CodeAster simulation \"Cantilever_CA_EIG_sh\" (on Windows) using 2 cpus\n", - "Finished CodeAster simulation \"Cantilever_CA_EIG_sh\"\n", - "--------------------------------------------------------------------------------\n" - ] + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false } - ], + }, + "outputs": [], "source": [ "a = make_fem(\"shell\")\n", "ca_res = a.to_fem(\"Cantilever_CA_EIG_sh\", \"code_aster\", overwrite=True, execute=True)" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", - "execution_count": 5, - "outputs": [ - { - "data": { - "text/plain": "", - "text/html": "
" - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false } - ], + }, + "outputs": [], "source": [ "scene = ccx_res.to_trimesh(1, \"DISP\", \"DISP\", 1, 20)\n", "scene.show()" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", - "execution_count": 11, - "outputs": [ - { - "data": { - "text/plain": "", - "text/html": "
" - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false } - ], + }, + "outputs": [], "source": [ "scene = ca_res.to_trimesh(\n", " 5.054232624598001, \"modes___DEPL[0] - 5.05423\", \"modes___DEPL[0] - 5.05423\", 5.054232624598001, 1\n", ")\n", "scene.show()" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", - "execution_count": 7, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NodalFieldData(name='DISP', step=1, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, -3.41087e-06],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, 3.41087e-06],\n", - " [ 7.24000e+02, -2.74524e-03, 1.10826e-01, -8.56491e-06],\n", - " ...,\n", - " [ 3.99900e+03, -9.31715e-04, 2.00099e-02, -7.00671e-05],\n", - " [ 4.00000e+03, -1.37202e-03, 1.00144e-01, 5.60019e-06],\n", - " [ 4.00200e+03, -1.37197e-03, 1.00145e-01, 5.58137e-06]]))\n", - "NodalFieldData(name='STRESS', step=1, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, -2.03936e+08, -1.21381e+07, ..., 2.56137e+07,\n", - " -2.82903e+06, 4.18204e+06],\n", - " [ 7.23000e+02, -2.17485e+08, -1.88964e+07, ..., 2.14314e+07,\n", - " 9.66455e+05, 3.82411e+06],\n", - " [ 7.24000e+02, -6.35956e+03, -2.79858e+04, ..., 3.27970e+04,\n", - " -4.91189e+03, 2.93014e+03],\n", - " ...,\n", - " [ 3.99900e+03, -7.74873e+07, 1.20800e+04, ..., 2.10305e+06,\n", - " 1.04429e+06, -1.18072e+05],\n", - " [ 4.00000e+03, -1.28169e+06, -1.03578e+05, ..., 6.24147e+05,\n", - " -4.15328e+04, -9.39590e+03],\n", - " [ 4.00200e+03, -1.12857e+06, 8.71849e+04, ..., 3.13911e+05,\n", - " -7.05739e+03, -1.84342e+04]]))\n", - "NodalFieldData(name='FORC', step=1, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, 6.53330e+04, -1.07592e+04, -1.53024e+03],\n", - " [ 7.23000e+02, 7.85515e+04, -1.40050e+04, -1.53024e+03],\n", - " [ 7.24000e+02, -1.47971e-01, 8.87822e+00, -4.64128e-04],\n", - " ...,\n", - " [ 3.99900e+03, -1.50657e-01, 3.23767e+00, -1.12640e-02],\n", - " [ 4.00000e+03, -2.21856e-01, 1.61935e+01, 8.97857e-04],\n", - " [ 4.00200e+03, -2.21850e-01, 1.61936e+01, 8.96655e-04]]))\n", - "NodalFieldData(name='ERROR', step=1, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=2, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, -8.68046e-06],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, 8.68046e-06],\n", - " [ 7.24000e+02, -6.08874e-03, -1.57821e-06, -1.09673e-01],\n", - " ...,\n", - " [ 3.99900e+03, 3.85751e-03, -2.37439e-05, -2.06486e-02],\n", - " [ 4.00000e+03, 6.08523e-03, 8.64221e-07, -9.93334e-02],\n", - " [ 4.00200e+03, 5.68611e-03, -1.48364e-06, -9.93333e-02]]))\n", - "NodalFieldData(name='STRESS', step=2, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, -6.91858e+08, -1.76102e+08, ..., 4.61107e+07,\n", - " -1.21985e+07, -1.90158e+07],\n", - " [ 7.23000e+02, -5.51102e+08, -9.80246e+07, ..., 3.30262e+07,\n", - " -1.00248e+07, -2.37452e+07],\n", - " [ 7.24000e+02, -2.42211e+06, -1.50922e+06, ..., -2.05543e+05,\n", - " -1.75751e+05, -2.35575e+05],\n", - " ...,\n", - " [ 3.99900e+03, 3.47924e+08, 1.47204e+07, ..., -7.57701e+06,\n", - " -3.19286e+04, -1.76274e+04],\n", - " [ 4.00000e+03, 5.66981e+06, -9.14460e+05, ..., -1.30009e+06,\n", - " -5.22937e+05, -5.13672e+04],\n", - " [ 4.00200e+03, 6.07139e+06, 1.17821e+06, ..., -1.32627e+06,\n", - " -5.44291e+05, -1.03326e+04]]))\n", - "NodalFieldData(name='FORC', step=2, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, 2.44747e+05, -4.83912e+04, 2.74414e+03],\n", - " [ 7.23000e+02, 1.59511e+05, -6.81642e+04, 2.74415e+03],\n", - " [ 7.24000e+02, -7.11192e+00, -4.65777e-04, -1.29791e+02],\n", - " ...,\n", - " [ 3.99900e+03, 9.43569e+00, -5.28246e-02, -4.93390e+01],\n", - " [ 4.00000e+03, 1.42162e+01, -3.56750e-04, -2.37251e+02],\n", - " [ 4.00200e+03, 1.38985e+01, -1.24734e-03, -2.37251e+02]]))\n", - "NodalFieldData(name='ERROR', step=2, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=3, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, -1.07644e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, 1.07644e-05],\n", - " [ 7.24000e+02, -8.43192e-04, 1.03928e-01, 4.44451e-02],\n", - " ...,\n", - " [ 3.99900e+03, 1.30589e-03, -3.70553e-02, 8.68773e-03],\n", - " [ 4.00000e+03, 4.39261e-04, -1.00334e-01, 2.17195e-02],\n", - " [ 4.00200e+03, 4.54340e-04, -9.38277e-02, 2.17188e-02]]))\n", - "NodalFieldData(name='STRESS', step=3, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, -6.13780e+08, -2.92880e+07, ..., 1.31018e+08,\n", - " -2.18134e+07, 3.09124e+07],\n", - " [ 7.23000e+02, -7.29195e+08, -7.40408e+07, ..., 8.82852e+07,\n", - " -1.07050e+07, 3.01101e+07],\n", - " [ 7.24000e+02, -1.30566e+07, -8.94854e+06, ..., 1.18981e+07,\n", - " 2.71680e+05, 4.51064e+04],\n", - " ...,\n", - " [ 3.99900e+03, -1.07225e+06, 1.38892e+07, ..., -1.35158e+08,\n", - " -3.64020e+05, -1.64143e+07],\n", - " [ 4.00000e+03, -4.60724e+07, -1.31136e+07, ..., 5.14154e+07,\n", - " -3.52024e+06, -3.72914e+06],\n", - " [ 4.00200e+03, -2.81371e+07, 8.43444e+06, ..., -4.10903e+07,\n", - " -2.47936e+06, -3.90687e+06]]))\n", - "NodalFieldData(name='FORC', step=3, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, 1.90591e+05, -2.58796e+04, -1.47553e+04],\n", - " [ 7.23000e+02, 2.91353e+05, -7.56071e+04, -1.47553e+04],\n", - " [ 7.24000e+02, -9.07562e-01, 1.63314e+02, 4.76854e+01],\n", - " ...,\n", - " [ 3.99900e+03, 4.17965e+00, -1.22154e+02, 2.79634e+01],\n", - " [ 4.00000e+03, 1.42308e+00, -3.16214e+02, 6.99483e+01],\n", - " [ 4.00200e+03, 1.45537e+00, -3.09220e+02, 6.99475e+01]]))\n", - "NodalFieldData(name='ERROR', step=3, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=4, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, 2.03003e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, -2.03003e-05],\n", - " [ 7.24000e+02, -9.44095e-03, 1.10146e-01, -2.94108e-04],\n", - " ...,\n", - " [ 3.99900e+03, 1.55703e-03, -6.81696e-02, -5.47525e-04],\n", - " [ 4.00000e+03, -4.69733e-03, 7.35175e-02, 1.01284e-04],\n", - " [ 4.00200e+03, -4.69491e-03, 7.35452e-02, 1.00590e-04]]))\n", - "NodalFieldData(name='STRESS', step=4, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, 1.23044e+09, 7.88113e+07, ..., -1.91663e+08,\n", - " 1.27573e+07, -1.87561e+07],\n", - " [ 7.23000e+02, 1.28704e+09, 1.09565e+08, ..., -1.75883e+08,\n", - " -8.72410e+06, -1.68601e+07],\n", - " [ 7.24000e+02, 1.39786e+05, -5.44813e+05, ..., 7.49161e+05,\n", - " -1.85547e+05, 9.10406e+04],\n", - " ...,\n", - " [ 3.99900e+03, -4.29278e+08, -1.44316e+06, ..., -2.56752e+07,\n", - " 6.17004e+06, 1.42517e+06],\n", - " [ 4.00000e+03, -4.55190e+07, -3.18476e+06, ..., 2.33900e+07,\n", - " -1.44320e+06, -4.87261e+05],\n", - " [ 4.00200e+03, -4.08574e+07, 2.68156e+06, ..., 8.71607e+06,\n", - " -2.22614e+05, -7.84091e+05]]))\n", - "NodalFieldData(name='FORC', step=4, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, -4.15000e+05, 8.33355e+04, 6.08984e+03],\n", - " [ 7.23000e+02, -4.73732e+05, 9.18836e+04, 6.08981e+03],\n", - " [ 7.24000e+02, -1.96657e+01, 3.33268e+02, -6.12414e-01],\n", - " ...,\n", - " [ 3.99900e+03, 9.72829e+00, -4.25459e+02, -3.40102e+00],\n", - " [ 4.00000e+03, -2.93487e+01, 4.59482e+02, 6.23574e-01],\n", - " [ 4.00200e+03, -2.93386e+01, 4.59545e+02, 6.21826e-01]]))\n", - "NodalFieldData(name='ERROR', step=4, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=5, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, -3.58324e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, 3.58324e-05],\n", - " [ 7.24000e+02, 6.48433e-03, -1.22300e-01, -4.74048e-02],\n", - " ...,\n", - " [ 3.99900e+03, 1.08213e-03, -8.38361e-02, 1.89338e-02],\n", - " [ 4.00000e+03, -3.37486e-03, 9.54567e-02, -1.98935e-02],\n", - " [ 4.00200e+03, -3.48792e-03, 8.95547e-02, -1.98891e-02]]))\n", - "NodalFieldData(name='STRESS', step=5, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, -2.05462e+09, -1.01466e+08, ..., 4.68157e+08,\n", - " -6.87334e+07, 1.00161e+08],\n", - " [ 7.23000e+02, -2.42417e+09, -2.45851e+08, ..., 3.32621e+08,\n", - " -3.26414e+07, 9.76999e+07],\n", - " [ 7.24000e+02, 1.01350e+08, 6.85359e+07, ..., -9.57317e+07,\n", - " -2.03287e+06, -6.46503e+05],\n", - " ...,\n", - " [ 3.99900e+03, -6.79769e+08, 7.07168e+07, ..., -1.31830e+08,\n", - " -4.15670e+06, -1.31568e+07],\n", - " [ 4.00000e+03, 2.76382e+08, 9.19853e+07, ..., -3.60706e+08,\n", - " 2.35742e+07, 2.78149e+07],\n", - " [ 4.00200e+03, 1.50429e+08, -5.74205e+07, ..., 3.35355e+08,\n", - " 1.76155e+07, 2.87299e+07]]))\n", - "NodalFieldData(name='FORC', step=5, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, 6.52081e+05, -1.02506e+05, -4.71573e+04],\n", - " [ 7.23000e+02, 9.78615e+05, -2.57949e+05, -4.71570e+04],\n", - " [ 7.24000e+02, 7.42221e+01, -2.01338e+03, -5.38129e+02],\n", - " ...,\n", - " [ 3.99900e+03, 3.68150e+01, -2.93402e+03, 6.47561e+02],\n", - " [ 4.00000e+03, -1.16226e+02, 3.20226e+03, -6.80242e+02],\n", - " [ 4.00200e+03, -1.18805e+02, 3.13426e+03, -6.80191e+02]]))\n", - "NodalFieldData(name='ERROR', step=5, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=6, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, 5.31110e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, -5.31110e-05],\n", - " [ 7.24000e+02, 1.50900e-02, -1.08129e-01, 1.62417e-03],\n", - " ...,\n", - " [ 3.99900e+03, -2.28667e-03, -7.46492e-02, -2.41729e-03],\n", - " [ 4.00000e+03, 7.38672e-03, -5.00939e-02, -3.20093e-04],\n", - " [ 4.00200e+03, 7.36676e-03, -5.01737e-02, -3.15106e-04]]))\n", - "NodalFieldData(name='STRESS', step=6, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, 3.27620e+09, 2.28755e+08, ..., -5.96448e+08,\n", - " 1.89270e+07, -2.61449e+07],\n", - " [ 7.23000e+02, 3.33435e+09, 2.73691e+08, ..., -5.89148e+08,\n", - " -3.44495e+07, -2.17918e+07],\n", - " [ 7.24000e+02, -3.48328e+06, 7.94904e+05, ..., -2.10669e+06,\n", - " 1.39063e+06, -5.26766e+05],\n", - " ...,\n", - " [ 3.99900e+03, -1.52967e+09, -8.74767e+06, ..., 3.37459e+07,\n", - " 2.45595e+07, -5.70183e+06],\n", - " [ 4.00000e+03, 3.14997e+08, 1.76107e+07, ..., -1.68452e+08,\n", - " 9.43228e+06, 4.21574e+06],\n", - " [ 4.00200e+03, 2.89520e+08, -1.48147e+07, ..., -4.55247e+07,\n", - " 9.95467e+05, 6.11768e+06]]))\n", - "NodalFieldData(name='FORC', step=6, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, -1.16470e+06, 2.73597e+05, 4.66125e+03],\n", - " [ 7.23000e+02, -1.24340e+06, 2.56104e+05, 4.66071e+03],\n", - " [ 7.24000e+02, 2.38498e+02, -2.43273e+03, 2.54722e+01],\n", - " ...,\n", - " [ 3.99900e+03, -1.08447e+02, -3.52312e+03, -1.13936e+02],\n", - " [ 4.00000e+03, 3.49967e+02, -2.37737e+03, -1.47692e+01],\n", - " [ 4.00200e+03, 3.49333e+02, -2.37884e+03, -1.46764e+01]]))\n", - "NodalFieldData(name='ERROR', step=6, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=7, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, -3.92189e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, 3.92189e-05],\n", - " [ 7.24000e+02, 1.91367e-02, 4.53245e-05, 1.03924e-01],\n", - " ...,\n", - " [ 3.99900e+03, 4.25719e-03, 9.28204e-05, -7.03186e-02],\n", - " [ 4.00000e+03, -1.90129e-02, -1.69421e-05, 7.06377e-02],\n", - " [ 4.00200e+03, -1.77215e-02, 3.68963e-05, 7.06351e-02]]))\n", - "NodalFieldData(name='STRESS', step=7, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, -3.57806e+09, -1.02879e+09, ..., 3.10005e+08,\n", - " -1.15031e+08, -1.98323e+08],\n", - " [ 7.23000e+02, -2.24156e+09, -3.05142e+08, ..., 1.37605e+08,\n", - " -1.14625e+08, -2.16652e+08],\n", - " [ 7.24000e+02, 7.10809e+07, 4.55847e+07, ..., 6.65950e+06,\n", - " 5.42165e+06, 6.87061e+06],\n", - " ...,\n", - " [ 3.99900e+03, -1.72292e+09, -5.15524e+07, ..., -7.74523e+07,\n", - " -1.23054e+07, 5.51171e+05],\n", - " [ 4.00000e+03, -1.72258e+08, 2.26751e+07, ..., 3.52973e+07,\n", - " 1.18639e+07, 1.84258e+06],\n", - " [ 4.00200e+03, -1.85438e+08, -2.87345e+07, ..., 3.34330e+07,\n", - " 1.23389e+07, 7.03712e+05]]))\n", - "NodalFieldData(name='FORC', step=7, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, 1.37441e+06, -1.87160e+05, 2.42695e+04],\n", - " [ 7.23000e+02, 5.44371e+05, -3.99002e+05, 2.42704e+04],\n", - " [ 7.24000e+02, 7.14263e+02, 4.13462e-01, 3.84474e+03],\n", - " ...,\n", - " [ 3.99900e+03, 3.35341e+02, 8.12720e+00, -5.37031e+03],\n", - " [ 4.00000e+03, -1.41982e+03, 4.76045e-01, 5.39827e+03],\n", - " [ 4.00200e+03, -1.38701e+03, 1.13647e+00, 5.39818e+03]]))\n", - "NodalFieldData(name='ERROR', step=7, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=8, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, -7.21304e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, 7.21304e-05],\n", - " [ 7.24000e+02, -1.46171e-02, 1.33360e-01, 4.52833e-02],\n", - " ...,\n", - " [ 3.99900e+03, -3.86217e-03, -7.04192e-02, 1.48027e-02],\n", - " [ 4.00000e+03, 7.36951e-03, -7.32333e-02, 1.43736e-02],\n", - " [ 4.00200e+03, 7.60898e-03, -6.90380e-02, 1.43693e-02]]))\n", - "NodalFieldData(name='STRESS', step=8, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, -4.16993e+09, -2.16035e+08, ..., 1.04691e+09,\n", - " -1.26699e+08, 1.94384e+08],\n", - " [ 7.23000e+02, -4.87217e+09, -4.93936e+08, ..., 7.93731e+08,\n", - " -5.68941e+07, 1.90096e+08],\n", - " [ 7.24000e+02, -2.31688e+08, -1.50840e+08, ..., 2.32569e+08,\n", - " 4.17304e+06, 2.69319e+06],\n", - " ...,\n", - " [ 3.99900e+03, -1.57695e+09, 8.87811e+07, ..., 4.91800e+08,\n", - " -4.92511e+06, 4.45807e+07],\n", - " [ 4.00000e+03, -2.61274e+08, -1.69201e+08, ..., 6.54300e+08,\n", - " -3.80327e+07, -5.82587e+07],\n", - " [ 4.00200e+03, -2.99515e+07, 9.83051e+07, ..., -8.29370e+08,\n", - " -3.39795e+07, -5.83560e+07]]))\n", - "NodalFieldData(name='FORC', step=8, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, 1.36693e+06, -2.57885e+05, -8.93751e+04],\n", - " [ 7.23000e+02, 2.00083e+06, -5.40826e+05, -8.93731e+04],\n", - " [ 7.24000e+02, -6.37748e+02, 8.20792e+03, 1.94352e+03],\n", - " ...,\n", - " [ 3.99900e+03, -5.00912e+02, -9.36708e+03, 1.92865e+03],\n", - " [ 4.00000e+03, 9.66822e+02, -9.38006e+03, 1.86850e+03],\n", - " [ 4.00200e+03, 9.87695e+02, -9.19336e+03, 1.86835e+03]]))\n", - "NodalFieldData(name='ERROR', step=8, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=9, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, 9.43480e-05],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, -9.43480e-05],\n", - " [ 7.24000e+02, -2.01317e-02, 1.04322e-01, -3.77916e-03],\n", - " ...,\n", - " [ 3.99900e+03, -7.02486e-03, -5.53659e-03, -3.79243e-04],\n", - " [ 4.00000e+03, -9.51981e-03, 2.76243e-02, -1.59914e-04],\n", - " [ 4.00200e+03, -9.44438e-03, 2.75359e-02, -1.76796e-04]]))\n", - "NodalFieldData(name='STRESS', step=9, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, 5.98799e+09, 4.73977e+08, ..., -1.23195e+09,\n", - " -8.88249e+06, 2.77566e+07],\n", - " [ 7.23000e+02, 5.80473e+09, 4.38789e+08, ..., -1.32554e+09,\n", - " -9.80516e+07, 3.42355e+07],\n", - " [ 7.24000e+02, 1.99361e+07, 7.86357e+06, ..., -4.81495e+06,\n", - " -4.94518e+06, 1.26325e+06],\n", - " ...,\n", - " [ 3.99900e+03, -9.67862e+07, 4.60302e+07, ..., 2.07250e+08,\n", - " 1.16529e+05, -3.87978e+07],\n", - " [ 4.00000e+03, -1.01980e+09, -3.68609e+07, ..., 5.66710e+08,\n", - " -2.73301e+07, -1.62892e+07],\n", - " [ 4.00200e+03, -9.68705e+08, 3.05433e+07, ..., 9.47124e+07,\n", - " 3.44857e+04, -2.19260e+07]]))\n", - "NodalFieldData(name='FORC', step=9, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, -2.27447e+06, 6.18947e+05, -2.74584e+04],\n", - " [ 7.23000e+02, -2.17072e+06, 4.65949e+05, -2.74619e+04],\n", - " [ 7.24000e+02, -1.15131e+03, 8.32536e+03, -2.11375e+02],\n", - " ...,\n", - " [ 3.99900e+03, -1.20642e+03, -9.40614e+02, -6.86726e+01],\n", - " [ 4.00000e+03, -1.63011e+03, 4.74660e+03, -3.08259e+01],\n", - " [ 4.00200e+03, -1.62141e+03, 4.74347e+03, -3.19278e+01]]))\n", - "NodalFieldData(name='ERROR', step=9, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n", - "NodalFieldData(name='DISP', step=10, components=['D1', 'D2', 'D3', 'ALL'], values=array([[ 7.21000e+02, 0.00000e+00, 0.00000e+00, 1.22593e-04],\n", - " [ 7.23000e+02, 0.00000e+00, -0.00000e+00, -1.22593e-04],\n", - " [ 7.24000e+02, -2.26488e-02, 1.35106e-01, 4.00456e-02],\n", - " ...,\n", - " [ 3.99900e+03, 8.74643e-03, -6.50017e-03, 2.21745e-03],\n", - " [ 4.00000e+03, 1.08409e-02, -4.27929e-02, 7.55572e-03],\n", - " [ 4.00200e+03, 1.11787e-02, -4.06418e-02, 7.56342e-03]]))\n", - "NodalFieldData(name='STRESS', step=10, components=['SXX', 'SYY', 'SZZ', 'SXY', 'SYZ', 'SZX'], values=array([[ 7.21000e+02, 7.15431e+09, 3.90850e+08, ..., -2.01328e+09,\n", - " 1.92093e+08, -3.18221e+08],\n", - " [ 7.23000e+02, 8.26988e+09, 8.39810e+08, ..., -1.62114e+09,\n", - " 7.96941e+07, -3.12375e+08],\n", - " [ 7.24000e+02, -3.73894e+08, -2.23411e+08, ..., 4.03383e+08,\n", - " 5.24595e+06, 6.87734e+06],\n", - " ...,\n", - " [ 3.99900e+03, -2.36450e+08, 1.03712e+08, ..., -1.40546e+09,\n", - " -2.84517e+06, -9.46439e+07],\n", - " [ 4.00000e+03, 4.70209e+08, -1.84983e+08, ..., 6.63095e+08,\n", - " -2.69351e+07, -8.05495e+07],\n", - " [ 4.00200e+03, 7.18251e+08, 9.04470e+07, ..., -1.44744e+09,\n", - " -4.30182e+07, -7.63412e+07]]))\n", - "NodalFieldData(name='FORC', step=10, components=['F1', 'F2', 'F3', 'ALL'], values=array([[ 7.21000e+02, -2.43673e+06, 5.48563e+05, 1.41641e+05],\n", - " [ 7.23000e+02, -3.47498e+06, 9.70739e+05, 1.41631e+05],\n", - " [ 7.24000e+02, -2.74967e+03, 2.26651e+04, 4.73185e+03],\n", - " ...,\n", - " [ 3.99900e+03, 3.15442e+03, -2.42590e+03, 7.86970e+02],\n", - " [ 4.00000e+03, 3.95451e+03, -1.53097e+04, 2.72263e+03],\n", - " [ 4.00200e+03, 4.03667e+03, -1.50379e+04, 2.72391e+03]]))\n", - "NodalFieldData(name='ERROR', step=10, components=['STR(%)'], values=array([[ 721., 0.],\n", - " [ 723., 0.],\n", - " [ 724., 0.],\n", - " ...,\n", - " [3999., 0.],\n", - " [4000., 0.],\n", - " [4002., 0.]]))\n" - ] + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false } - ], + }, + "outputs": [], "source": [ "for cx in ccx_res.iter_results_by_field_value():\n", " print(cx)" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", - "execution_count": 8, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "NodalFieldData(name='modes___DEPL[0] - 5.05423', step=5.054232624598001, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -2.47193551e-02, 9.98178713e-01, ...,\n", - " -1.33139810e-02, 1.31013175e-04, -1.59825780e-19],\n", - " [ 3.00000000e+00, 2.76803172e-15, 9.98178844e-01, ...,\n", - " -1.34689994e-02, -3.07917368e-14, 2.74395442e-01],\n", - " ...,\n", - " [ 7.18000000e+02, -1.23347475e-02, 8.47167798e-01, ...,\n", - " 1.23743173e-02, -9.86470873e-05, -2.10067683e-20],\n", - " [ 7.19000000e+02, -8.39569590e-03, 1.80613230e-01, ...,\n", - " 7.17880052e-03, -4.55272926e-05, 2.24459492e-20],\n", - " [ 7.20000000e+02, -1.23526873e-02, 9.02048117e-01, ...,\n", - " 1.27844112e-02, -8.56076939e-05, 8.81627408e-20]]))\n", - "NodalFieldData(name='modes___DEPL[1] - 9.75129', step=9.75129233796498, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -3.94961136e-03, 1.95139381e-01, ...,\n", - " 9.18261499e-01, -4.28243886e-03, 2.92702338e-19],\n", - " [ 3.00000000e+00, -2.48538907e-15, 1.95138750e-01, ...,\n", - " 9.22801316e-01, 1.34584205e-14, 5.09347333e-02],\n", - " ...,\n", - " [ 7.18000000e+02, 2.00088082e-03, -1.70924160e-01, ...,\n", - " 8.46655360e-01, -8.80163373e-03, 2.46556010e-19],\n", - " [ 7.19000000e+02, 1.91711640e-03, -4.51094287e-02, ...,\n", - " 2.29326010e-01, -9.43719871e-03, -1.14249057e-19],\n", - " [ 7.20000000e+02, 1.98444957e-03, -1.79770653e-01, ...,\n", - " 8.82676734e-01, -7.35454335e-03, -7.00491225e-20]]))\n", - "NodalFieldData(name='modes___DEPL[2] - 19.4904', step=19.490358543863028, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, 5.36708722e-02, 1.24884706e-06, ...,\n", - " 4.46461847e-03, -2.67864897e-01, 7.91179921e-17],\n", - " [ 3.00000000e+00, 5.36744806e-02, 1.66532307e-13, ...,\n", - " 1.30030855e-12, -2.66302526e-01, 2.08687698e-14],\n", - " ...,\n", - " [ 7.18000000e+02, -5.35636053e-02, 7.23586444e-06, ...,\n", - " 3.26003084e-03, -2.69685606e-01, 4.01932133e-17],\n", - " [ 7.19000000e+02, -3.64413085e-02, 1.95480443e-04, ...,\n", - " -2.63474876e-04, -1.89065181e-01, -2.04126237e-17],\n", - " [ 7.20000000e+02, -5.36436798e-02, 2.68381779e-06, ...,\n", - " 3.49523504e-03, -2.69465208e-01, -2.13409197e-17]]))\n", - "NodalFieldData(name='modes___DEPL[3] - 31.2829', step=31.282929691021273, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -8.15264622e-02, 9.49722740e-01, ...,\n", - " -3.35486865e-01, 7.52326961e-03, 5.54626807e-18],\n", - " [ 3.00000000e+00, 1.45149992e-14, 9.49726923e-01, ...,\n", - " -3.43649118e-01, -4.54339366e-14, 8.91325411e-01],\n", - " ...,\n", - " [ 7.18000000e+02, -3.99333014e-02, 4.53425571e-01, ...,\n", - " 2.23048541e-01, -1.44342465e-02, -2.84550339e-18],\n", - " [ 7.19000000e+02, 1.34501567e-02, -5.88985481e-01, ...,\n", - " -2.95157988e-01, 4.91665985e-03, -5.67088753e-18],\n", - " [ 7.20000000e+02, -4.05226719e-02, 6.32811887e-01, ...,\n", - " 2.80488656e-01, -1.13264464e-02, -2.22189299e-18]]))\n", - "NodalFieldData(name='modes___DEPL[4] - 41.7106', step=41.71058110137183, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -1.45318705e-02, 1.81661927e-01, ...,\n", - " 7.00805602e-01, -1.54416898e-02, -5.14566313e-18],\n", - " [ 3.00000000e+00, -8.48526741e-16, 1.81659740e-01, ...,\n", - " 7.16667395e-01, -5.53523846e-15, 1.84785431e-01],\n", - " ...,\n", - " [ 7.18000000e+02, 7.19995424e-03, -9.29466966e-02, ...,\n", - " 4.43954970e-01, -3.10476359e-02, -2.83895738e-17],\n", - " [ 7.19000000e+02, -2.33132806e-03, 1.10877436e-01, ...,\n", - " -5.33084351e-01, 1.07271083e-02, 1.54954440e-17],\n", - " [ 7.20000000e+02, 7.25570456e-03, -1.25151608e-01, ...,\n", - " 5.72207164e-01, -2.64286630e-02, -2.63083736e-19]]))\n", - "NodalFieldData(name='modes___DEPL[5] - 82.0474', step=82.04739582699456, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, 3.88941028e-02, -2.80138423e-01, ...,\n", - " 5.93696125e-01, -2.36465554e-02, -1.48712996e-17],\n", - " [ 3.00000000e+00, -4.45708846e-15, -2.80147731e-01, ...,\n", - " 6.17052343e-01, 9.61378078e-15, -3.91537348e-01],\n", - " ...,\n", - " [ 7.18000000e+02, 1.77999701e-02, -4.64959400e-02, ...,\n", - " -1.81968211e-01, 5.20522089e-02, -2.74689082e-17],\n", - " [ 7.19000000e+02, -6.05552470e-03, -1.85480100e-01, ...,\n", - " -8.75605788e-01, -2.85857980e-02, 1.67534863e-17],\n", - " [ 7.20000000e+02, 1.89536396e-02, -1.29251891e-01, ...,\n", - " -3.93157614e-01, 4.23813474e-02, 1.31105774e-17]]))\n", - "NodalFieldData(name='modes___DEPL[6] - 105.024', step=105.02446835346396, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -2.29287971e-02, 1.67210144e-01, ...,\n", - " 5.15702863e-01, -2.26991946e-02, 1.28158921e-17],\n", - " [ 3.00000000e+00, -2.16306028e-16, 1.67207548e-01, ...,\n", - " 5.36820094e-01, 1.03283605e-14, 2.78904706e-01],\n", - " ...,\n", - " [ 7.18000000e+02, 1.05700572e-02, -2.91973434e-02, ...,\n", - " 1.41012225e-01, -4.32376874e-02, 2.84723714e-18],\n", - " [ 7.19000000e+02, -3.67355249e-03, -1.11025099e-01, ...,\n", - " 5.00956428e-01, 1.71254097e-02, -1.67646195e-17],\n", - " [ 7.20000000e+02, 1.12118262e-02, -7.82343796e-02, ...,\n", - " 3.24618131e-01, -3.87809655e-02, -2.09291254e-17]]))\n", - "NodalFieldData(name='modes___DEPL[7] - 110', step=110.00003089608711, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, 1.76659532e-01, 3.74690071e-05, ...,\n", - " 1.35732194e-01, -8.70606631e-01, 7.22861470e-17],\n", - " [ 3.00000000e+00, 1.76772029e-01, 4.91920283e-14, ...,\n", - " -5.36290037e-13, -8.20062049e-01, 1.63440585e-13],\n", - " ...,\n", - " [ 7.18000000e+02, -1.73176189e-01, 2.22452644e-04, ...,\n", - " 6.00265648e-02, -9.17004816e-01, 5.61347857e-17],\n", - " [ 7.19000000e+02, 4.25306032e-02, 1.03271111e-03, ...,\n", - " -8.84451656e-02, 2.85886412e-01, -1.33665303e-17],\n", - " [ 7.20000000e+02, -1.75637015e-01, 9.20882336e-05, ...,\n", - " 8.34039558e-02, -9.16149755e-01, 1.90831927e-17]]))\n", - "NodalFieldData(name='modes___DEPL[8] - 122.51', step=122.51034460508012, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -1.25921336e-03, 3.78247334e-02, ...,\n", - " 1.00000000e+00, -4.27237642e-03, 7.08736747e-18],\n", - " [ 3.00000000e+00, 3.10193440e-15, 3.78168886e-02, ...,\n", - " 9.97140056e-01, -1.60964541e-14, -4.72682130e-03],\n", - " ...,\n", - " [ 7.18000000e+02, -5.88595665e-04, 3.01261091e-02, ...,\n", - " -9.91055474e-01, -3.91789521e-04, 4.70445140e-17],\n", - " [ 7.19000000e+02, -6.80354012e-04, 1.62175368e-02, ...,\n", - " -4.49390160e-01, 6.83606627e-03, -3.04318538e-17],\n", - " [ 7.20000000e+02, -6.29637368e-04, 3.28863972e-02, ...,\n", - " -9.89303880e-01, -3.05438288e-04, -2.27388043e-17]]))\n", - "NodalFieldData(name='modes___DEPL[9] - 129.258', step=129.25770426710713, components=['DX', 'DY', 'DZ', 'DRX', 'DRY', 'DRZ'], values=array([[ 1.00000000e+00, 0.00000000e+00, 0.00000000e+00, ...,\n", - " 0.00000000e+00, 0.00000000e+00, 0.00000000e+00],\n", - " [ 2.00000000e+00, -9.75849118e-03, 4.61340891e-02, ...,\n", - " -6.01935581e-01, 2.15761076e-02, 9.35831665e-17],\n", - " [ 3.00000000e+00, -1.41872796e-16, 4.61425865e-02, ...,\n", - " -6.19639830e-01, 1.01025166e-14, 8.30455138e-02],\n", - " ...,\n", - " [ 7.18000000e+02, -4.00367909e-03, -1.12171397e-02, ...,\n", - " 2.25900002e-01, -4.47179626e-02, 6.00139346e-17],\n", - " [ 7.19000000e+02, -2.59912029e-03, 1.14293738e-02, ...,\n", - " -1.44501233e-01, -7.17654397e-02, -1.70864929e-17],\n", - " [ 7.20000000e+02, -4.60738473e-03, 8.43921476e-03, ...,\n", - " 4.13894340e-01, -3.89851135e-02, -1.78693510e-17]]))\n" - ] + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false } - ], + }, + "outputs": [], "source": [ "for ca in ca_res.iter_results_by_field_value():\n", " print(ca)" - ], - "metadata": { - "collapsed": false - } + ] } ], "metadata": { @@ -647,9 +132,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.0" + "version": "3.11.6" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/examples/notebooks/cantilever_fem_extended.ipynb b/examples/notebooks/cantilever_fem_extended.ipynb index a3a154e83..91ab603af 100644 --- a/examples/notebooks/cantilever_fem_extended.ipynb +++ b/examples/notebooks/cantilever_fem_extended.ipynb @@ -70,7 +70,7 @@ " ada.Material(\"S420\", CarbonSteel(\"S420\", plasticity_model=DnvGl16Mat(0.1, \"S420\"))),\n", ")\n", "a = ada.Assembly(\"MyAssembly\") / [ada.Part(\"MyPart\") / bm]\n", - "a" + "a.show()" ] }, { @@ -106,8 +106,8 @@ "origin = np.array([0.2, -0.1, -0.1])\n", "points = [(0, 0), (0.1, 0), (0.05, 0.1)]\n", "\n", - "poly1 = bm.add_penetration(ada.PrimExtrude(\"Poly1\", points, h, normal, origin, xdir))\n", - "bm" + "poly1 = bm.add_boolean(ada.PrimExtrude(\"Poly1\", points, h, normal, origin, xdir))\n", + "bm.show()" ] }, { @@ -124,8 +124,8 @@ "origin += np.array([0.2, 0, 0])\n", "points = [(0, 0, r), (0.1, 0, r), (0.05, 0.1, r)]\n", "\n", - "poly2 = bm.add_penetration(ada.PrimExtrude(\"Poly2\", points, h, normal, origin, xdir))\n", - "bm" + "poly2 = bm.add_boolean(ada.PrimExtrude(\"Poly2\", points, h, normal, origin, xdir))\n", + "bm.show()" ] }, { @@ -142,8 +142,8 @@ "origin += np.array([0.2, 0, 0])\n", "points = [(0, 0, r), (0.1, 0, r), (0.1, 0.2, r), (0.0, 0.2, r)]\n", "\n", - "poly3 = bm.add_penetration(ada.PrimExtrude(\"Poly3\", points, h, normal, origin, xdir))\n", - "bm" + "poly3 = bm.add_boolean(ada.PrimExtrude(\"Poly3\", points, h, normal, origin, xdir))\n", + "bm.show()" ] }, { @@ -160,8 +160,8 @@ "# Cylinder Extrude\n", "x = origin[0] + 0.2\n", "\n", - "cyl = bm.add_penetration(ada.PrimCyl(\"cylinder\", (x, -0.1, 0), (x, 0.1, 0), 0.1))\n", - "bm" + "cyl = bm.add_boolean(ada.PrimCyl(\"cylinder\", (x, -0.1, 0), (x, 0.1, 0), 0.1))\n", + "bm.show()" ] }, { @@ -178,8 +178,8 @@ "# Box Extrude\n", "x += 0.2\n", "\n", - "box = bm.add_penetration(ada.PrimBox(\"box\", (x, -0.1, -0.1), (x + 0.2, 0.1, 0.1)))\n", - "bm" + "box = bm.add_boolean(ada.PrimBox(\"box\", (x, -0.1, -0.1), (x + 0.2, 0.1, 0.1)))\n", + "bm.show()" ] }, { @@ -195,7 +195,7 @@ "source": [ "# Export IFC to the Home folder\n", "a.to_ifc(\"../output/MyBeamWithHoles.ifc\")\n", - "a" + "a.show()" ] }, { @@ -213,7 +213,7 @@ "p = a.get_part(\"MyPart\")\n", "p.fem = bm.to_fem_obj(0.1, \"shell\", options=GmshOptions(Mesh_MeshSizeFromCurvature=True))\n", "\n", - "a" + "a.show()" ] }, { @@ -228,10 +228,10 @@ "outputs": [], "source": [ "# Create a Static Analysis Step with a Gravity load (multiplied with 800 to get deformation)\n", - "step = a.fem.add_step(ada.fem.StepImplicit(\"gravity\", nl_geom=True, init_incr=100.0, total_time=100.0))\n", + "step = a.fem.add_step(ada.fem.StepImplicitStatic(\"gravity\", nl_geom=True, init_incr=100.0, total_time=100.0))\n", "step.add_load(ada.fem.LoadGravity(\"grav\", -9.81 * 800))\n", "\n", - "nodes = bm.bbox.sides.back(return_fem_nodes=True)\n", + "nodes = bm.bbox().sides.back(return_fem_nodes=True)\n", "a.fem.add_bc(ada.fem.Bc(\"Fixed\", ada.fem.FemSet(\"bc_nodes\", nodes), [1, 2, 3]))" ] }, @@ -337,9 +337,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.11.6" } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/examples/notebooks/convert_fem.ipynb b/examples/notebooks/convert_fem.ipynb index ca2534406..ea63e9e02 100644 --- a/examples/notebooks/convert_fem.ipynb +++ b/examples/notebooks/convert_fem.ipynb @@ -2,21 +2,27 @@ "cells": [ { "cell_type": "markdown", - "source": [ - "# Convert FEM models" - ], "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%% md\n" } - } + }, + "source": [ + "# Convert FEM models" + ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, + "jupyter": { + "outputs_hidden": true + }, "pycharm": { "name": "#%%\n" } @@ -28,6 +34,15 @@ }, { "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "pycharm": { + "name": "#%% md\n" + } + }, "source": [ "## Sesam FEM to Abaqus inp and Code Aster\n", "First drag and drop your FEM file onto the explorer window to the left next to the \"convert_fem.ipynb\"\n", @@ -35,50 +50,47 @@ "\n", "In addition to Sesam FEM models you can also import\n", "Abaqus/Calculix (.inp) and Code Aster (.med)." - ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%% md\n" - } - } + ] }, { "cell_type": "code", "execution_count": null, - "outputs": [], - "source": [ - "a = ada.from_fem(\"T1.FEM\")\n", - "a.to_fem(\"MyAbaqusModel\", \"abaqus\", make_zip_file=True, overwrite=True)\n", - "a.to_fem(\"MyCodeAsterModel\", \"code_aster\", make_zip_file=True, overwrite=True)" - ], "metadata": { "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, "pycharm": { "name": "#%%\n" } - } + }, + "outputs": [], + "source": [ + "a = ada.from_fem(\"T1.FEM\")\n", + "a.to_fem(\"MyAbaqusModel\", \"abaqus\", make_zip_file=True, overwrite=True)\n", + "a.to_fem(\"MyCodeAsterModel\", \"code_aster\", make_zip_file=True, overwrite=True)" + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.11.6" } }, "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file + "nbformat_minor": 4 +} diff --git a/examples/notebooks/convert_genie_xml_to_ifc.ipynb b/examples/notebooks/convert_genie_xml_to_ifc.ipynb index eca6d16d4..fb06573bd 100644 --- a/examples/notebooks/convert_genie_xml_to_ifc.ipynb +++ b/examples/notebooks/convert_genie_xml_to_ifc.ipynb @@ -2,18 +2,24 @@ "cells": [ { "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "source": [ "# Convert FEM models" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": 1, "metadata": { - "collapsed": true + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } }, "outputs": [], "source": [ @@ -23,47 +29,53 @@ }, { "cell_type": "markdown", + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "source": [ "## Genie XML to IFC\n", "First drag and drop your XML file onto the explorer window to the left next to the \"*.ipynb\" files\n", "(notebook files). Then change the name from \"\" to whatever the name of your XML file is and what you want the exported IFC to be named." - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + } + }, "outputs": [], "source": [ "a = ada.from_genie_xml(\"my_model.xml\")\n", "a.to_ifc(\"my_model.ifc\")" - ], - "metadata": { - "collapsed": false - } + ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" + "pygments_lexer": "ipython3", + "version": "3.11.6" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 4 } diff --git a/examples/notebooks/ifc_revolved_area_solid.ipynb b/examples/notebooks/ifc_revolved_area_solid.ipynb index 043a04696..4c2653627 100644 --- a/examples/notebooks/ifc_revolved_area_solid.ipynb +++ b/examples/notebooks/ifc_revolved_area_solid.ipynb @@ -264,9 +264,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.11.6" } }, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/examples/scripts/eigen_analysis.py b/examples/scripts/eigen_analysis.py index f65677332..e941b53a9 100644 --- a/examples/scripts/eigen_analysis.py +++ b/examples/scripts/eigen_analysis.py @@ -30,7 +30,7 @@ def run_code_aster(): geo_repr = "solid" a = make_fem(geo_repr) res = a.to_fem(f"Cantilever_CA_EIG_{geo_repr}", "code_aster", scratch_dir=SCRATCH, overwrite=True, execute=True) - res.to_xdmf(res.name.replace('.rmed', ".xdmf")) + res.to_xdmf(res.name.replace(".rmed", ".xdmf")) for x in res.iter_results_by_field_value(): print(x) diff --git a/examples/scripts/param_model_analysis.py b/examples/scripts/param_model_analysis.py index 67832dcf5..7c882454d 100644 --- a/examples/scripts/param_model_analysis.py +++ b/examples/scripts/param_model_analysis.py @@ -28,7 +28,7 @@ def main(): a.fem.add_step(eigen_step()) res = a.to_fem(fem_res, "code_aster", overwrite=True, execute=True, scratch_dir=SCRATCH) mesh = res.to_meshio_mesh(make_3xn_dofs=True) - mesh.write(res_file.with_suffix('.vtu')) + mesh.write(res_file.with_suffix(".vtu")) # res.to_vtu() # a.to_fem("ca_param_model_ses", "sesam", overwrite=True, execute=True) @@ -39,7 +39,7 @@ def read_res(): res_file = (SCRATCH / fem_res / fem_res).with_suffix(".rmed") res = ada.from_fem_res(res_file, "code_aster") mesh = res.to_meshio_mesh(make_3xn_dofs=True) - mesh.write(res_file.with_suffix('.vtu')) + mesh.write(res_file.with_suffix(".vtu")) # res.to_xdmf(res.name + ".xdmf") diff --git a/examples/scripts/sdof/analyze.py b/examples/scripts/sdof/analyze.py index 64f2577d9..50022ed80 100644 --- a/examples/scripts/sdof/analyze.py +++ b/examples/scripts/sdof/analyze.py @@ -10,18 +10,33 @@ from code_aster.Cata.Commands.proj_base import PROJ_BASE import ada -from ada.fem.formats.code_aster.results.results_helpers import export_mesh_data_to_sqlite -from ada.fem.formats.code_aster.write.api_helpers import import_mesh, assign_element_definitions, \ - assign_material_definitions, assign_element_characteristics, assign_boundary_conditions, assign_forces +from ada.fem.formats.code_aster.results.results_helpers import ( + export_mesh_data_to_sqlite, +) +from ada.fem.formats.code_aster.write.api_helpers import ( + assign_boundary_conditions, + assign_element_characteristics, + assign_element_definitions, + assign_forces, + assign_material_definitions, + import_mesh, +) USE_STAR = True if USE_STAR: - from code_aster.Commands import * from code_aster.Cata.Language.SyntaxObjects import _F + from code_aster.Commands import * else: - from code_aster.Commands import IMPR_RESU, POST_ELEM, CREA_CHAMP, DEFI_LIST_REEL, COMB_MATR_ASSE, DYNA_VIBRA, \ - RECU_FONCTION + from code_aster.Commands import ( + IMPR_RESU, + POST_ELEM, + CREA_CHAMP, + DEFI_LIST_REEL, + COMB_MATR_ASSE, + DYNA_VIBRA, + RECU_FONCTION, + ) from code_aster.Supervis.ExecuteCommand import CO @@ -65,29 +80,21 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): # Step Information linear_step: code_aster.ElasticResult = MECA_STATIQUE( - MODELE=model, - CHAM_MATER=material_field, - CARA_ELEM=elem_car, - EXCIT=( - _F(CHARGE=fix), - _F(CHARGE=forces) - ) + MODELE=model, CHAM_MATER=material_field, CARA_ELEM=elem_car, EXCIT=(_F(CHARGE=fix), _F(CHARGE=forces)) ) # Results Information IMPR_RESU( MODELE=model, FORMAT="RESULTAT", - RESU=_F( - NOM_CHAM="DEPL", - GROUP_NO="mass_set", - RESULTAT=linear_step, - FORMAT_R="1PE12.3" - ) + RESU=_F(NOM_CHAM="DEPL", GROUP_NO="mass_set", RESULTAT=linear_step, FORMAT_R="1PE12.3"), ) massin: libaster.Table = POST_ELEM( - MODELE=model, CHAM_MATER=material_field, CARA_ELEM=elem_car, - MASS_INER=_F(GROUP_MA=("mass_set", "spring")), TITRE="massin" + MODELE=model, + CHAM_MATER=material_field, + CARA_ELEM=elem_car, + MASS_INER=_F(GROUP_MA=("mass_set", "spring")), + TITRE="massin", ) IMPR_TABLE(TABLE=massin, NOM_PARA=("LIEU", "MASSE"), FORMAT_R="1PE12.3") ASSEMBLAGE( @@ -95,10 +102,7 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): CARA_ELEM=elem_car, CHARGE=fix, NUME_DDL=CO("numdof"), - MATR_ASSE=( - _F(MATRICE=CO("rigidity"), OPTION="RIGI_MECA"), - _F(MATRICE=CO("masse"), OPTION="MASS_MECA") - ) + MATR_ASSE=(_F(MATRICE=CO("rigidity"), OPTION="RIGI_MECA"), _F(MATRICE=CO("masse"), OPTION="MASS_MECA")), ) rigidity = operator_store.get("rigidity") @@ -118,7 +122,8 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): RESU=_F( RESULTAT=undamped, NOM_PARA=("FREQ", "MASS_GENE", "MASS_EFFE_DX", "MASS_EFFE_DY", "MASS_EFFE_DZ"), - FORM_TABL="OUI") + FORM_TABL="OUI", + ), ) IMPR_RESU(FORMAT="MED", UNITE=80, RESU=_F(RESULTAT=undamped, NOM_CHAM="DEPL")) @@ -127,26 +132,17 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): dsplini: libaster.FieldOnNodesReal = CREA_CHAMP( TYPE_CHAM="NOEU_DEPL_R", NUME_DDL=numdof, - OPERATION="AFFE", PROL_ZERO="OUI", + OPERATION="AFFE", + PROL_ZERO="OUI", MODELE=model, - AFFE=_F( - GROUP_NO="mass_set", - NOM_CMP="DX", VALE=-1 - ) + AFFE=_F(GROUP_NO="mass_set", NOM_CMP="DX", VALE=-1), ) nbvect = 3 PROJ_BASE( BASE=undamped, NB_VECT=nbvect, - MATR_ASSE_GENE=( - _F(MATRICE=CO("stifGen"), MATR_ASSE=rigidity), - _F(MATRICE=CO("massGen"), MATR_ASSE=masse) - ), - VECT_ASSE_GENE=_F( - VECTEUR=CO("dispGen"), - TYPE_VECT="DEPL", - VECT_ASSE=dsplini - ) + MATR_ASSE_GENE=(_F(MATRICE=CO("stifGen"), MATR_ASSE=rigidity), _F(MATRICE=CO("massGen"), MATR_ASSE=masse)), + VECT_ASSE_GENE=_F(VECTEUR=CO("dispGen"), TYPE_VECT="DEPL", VECT_ASSE=dsplini), ) # modal transient analysis # #here we use the previously calculated @@ -159,11 +155,7 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): nperiod = 4.0 liste: libaster.ListOfFloats = DEFI_LIST_REEL( - DEBUT=0.0, - INTERVALLE=_F( - JUSQU_A=nperiod / natfreq, - NOMBRE=int(number * nperiod) - ) + DEBUT=0.0, INTERVALLE=_F(JUSQU_A=nperiod / natfreq, NOMBRE=int(number * nperiod)) ) # make 6 calculations with varying damping factor "xi" @@ -180,26 +172,18 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): dispGen: code_aster.GeneralizedAssemblyMatrixReal = operator_store.get("dispGen") # Define sqlite results database - sqlite_file = (scratch_dir / a.name).with_suffix('.sqlite') + sqlite_file = (scratch_dir / a.name).with_suffix(".sqlite") sql_store = SQLiteFEAStore(sqlite_file, clean_tables=True) export_mesh_data_to_sqlite(0, a.name, mesh, sql_store) - sql_store.insert_table('FieldVars', [ - (0, 'U1', 'Spatial Displacement'), - (1, 'V1', 'Spatial Velocity'), - (2, 'A1', 'Spatial Acceleration') - ] - ) + sql_store.insert_table( + "FieldVars", + [(0, "U1", "Spatial Displacement"), (1, "V1", "Spatial Velocity"), (2, "A1", "Spatial Acceleration")], + ) for i in range(0, it): - sql_store.insert_table('Steps', [(i, 'dynamic', f'xi={xi[i]}', 'TIME')]) - amorG[i] = COMB_MATR_ASSE( - CALC_AMOR_GENE=_F( - RIGI_GENE=stifGen, - MASS_GENE=massGen, - AMOR_REDUIT=xi[i] - ) - ) + sql_store.insert_table("Steps", [(i, "dynamic", f"xi={xi[i]}", "TIME")]) + amorG[i] = COMB_MATR_ASSE(CALC_AMOR_GENE=_F(RIGI_GENE=stifGen, MASS_GENE=massGen, AMOR_REDUIT=xi[i])) tranG[i] = DYNA_VIBRA( BASE_CALCUL="GENE", TYPE_CALCUL="TRAN", @@ -208,53 +192,38 @@ def transient_modal_analysis(a: ada.Assembly, scratch_dir): MATR_AMOR=amorG[i], ETAT_INIT=_F(DEPL=dispGen), INCREMENT=_F(LIST_INST=liste), - SCHEMA_TEMPS=_F(SCHEMA="NEWMARK") + SCHEMA_TEMPS=_F(SCHEMA="NEWMARK"), ) respo[i] = RECU_FONCTION( - RESU_GENE=tranG[i], - TOUT_INST="OUI", - NOM_CHAM="DEPL", - NOM_CMP="DX", - GROUP_NO="mass_set" + RESU_GENE=tranG[i], TOUT_INST="OUI", NOM_CHAM="DEPL", NOM_CMP="DX", GROUP_NO="mass_set" ) IMPR_FONCTION( - FORMAT="TABLEAU", - COURBE=_F(FONCTION=respo[i]), - UNITE=8, - TITRE="DX_endmass", - SOUS_TITRE="DX_endmass" + FORMAT="TABLEAU", COURBE=_F(FONCTION=respo[i]), UNITE=8, TITRE="DX_endmass", SOUS_TITRE="DX_endmass" ) displ: libaster.ListOfFloats = RECU_FONCTION( - RESU_GENE=tranG[i], - TOUT_INST="OUI", - NOM_CHAM="DEPL", - NOM_CMP="DX", - GROUP_NO="mass_set" + RESU_GENE=tranG[i], TOUT_INST="OUI", NOM_CHAM="DEPL", NOM_CMP="DX", GROUP_NO="mass_set" ) speed: libaster.ListOfFloats = RECU_FONCTION( - RESU_GENE=tranG[i], - TOUT_INST="OUI", - NOM_CHAM="VITE", - NOM_CMP="DX", - GROUP_NO="mass_set" + RESU_GENE=tranG[i], TOUT_INST="OUI", NOM_CHAM="VITE", NOM_CMP="DX", GROUP_NO="mass_set" ) accel: libaster.ListOfFloats = RECU_FONCTION( - RESU_GENE=tranG[i], - TOUT_INST="OUI", - NOM_CHAM="ACCE", - NOM_CMP="DX", - GROUP_NO="mass_set" + RESU_GENE=tranG[i], TOUT_INST="OUI", NOM_CHAM="ACCE", NOM_CMP="DX", GROUP_NO="mass_set" + ) + np_t, np_d, np_v, np_a = ( + liste.getValuesAsArray(), + displ.getValuesAsArray(), + speed.getValuesAsArray(), + accel.getValuesAsArray(), ) - np_t, np_d, np_v, np_a = liste.getValuesAsArray(), displ.getValuesAsArray(), speed.getValuesAsArray(), accel.getValuesAsArray() # Write to sqlite db HistOutput - shared_opts = [-1, 'NODAL', 0, -1, 2, i] + shared_opts = [-1, "NODAL", 0, -1, 2, i] sql_store.insert_table("HistOutput", [(*shared_opts, 0, x, y) for x, y in zip(np_t, np_d[:, 1])]) sql_store.insert_table("HistOutput", [(*shared_opts, 1, x, y) for x, y in zip(np_t, np_v[:, 1])]) sql_store.insert_table("HistOutput", [(*shared_opts, 2, x, y) for x, y in zip(np_t, np_a[:, 1])]) - undamped.printMedFile((scratch_dir / a.name).with_suffix('.rmed').as_posix()) + undamped.printMedFile((scratch_dir / a.name).with_suffix(".rmed").as_posix()) sql_store.conn.close() return sqlite_file diff --git a/examples/scripts/sdof/main.py b/examples/scripts/sdof/main.py index 31c7a0e87..d3fd69e19 100644 --- a/examples/scripts/sdof/main.py +++ b/examples/scripts/sdof/main.py @@ -1,12 +1,12 @@ import pathlib from analyze import transient_modal_analysis -from plot import plot_sdof from model import build_model +from plot import plot_sdof def main(): - scratch_dir = pathlib.Path('temp/sdof_test').resolve().absolute() + scratch_dir = pathlib.Path("temp/sdof_test").resolve().absolute() scratch_dir.mkdir(exist_ok=True, parents=True) a = build_model("sdof_test") @@ -14,5 +14,5 @@ def main(): plot_sdof(sql_file, scratch_dir) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/examples/scripts/sdof/model.py b/examples/scripts/sdof/model.py index c789abe4e..36d284790 100644 --- a/examples/scripts/sdof/model.py +++ b/examples/scripts/sdof/model.py @@ -44,4 +44,4 @@ def build_model(name: str): if __name__ == "__main__": - build_model('sdof_local_test') + build_model("sdof_local_test") diff --git a/examples/scripts/sdof/plot.py b/examples/scripts/sdof/plot.py index 0d6fe4faf..91229c4e4 100644 --- a/examples/scripts/sdof/plot.py +++ b/examples/scripts/sdof/plot.py @@ -18,22 +18,22 @@ def plot_sdof(sqlite_file, plot_dir): steps = sql_store.get_steps() if len(steps) == 0: raise ValueError("It appears that there is no step data") - columns = ['Name', "Restype", "PointID", "StepName", "FieldVarName", "Frame", "Value"] + columns = ["Name", "Restype", "PointID", "StepName", "FieldVarName", "Frame", "Value"] fig = go.Figure() for step_id, step_name, step_descr, step_domain_type in steps: # Plot displacement legend = f"{step_name}_{step_descr}_U1" - df = pd.DataFrame(sql_store.get_history_data('U1', step_id), columns=columns) + df = pd.DataFrame(sql_store.get_history_data("U1", step_id), columns=columns) fig.add_trace(go.Scatter(x=df["Frame"], y=df["Value"], mode="lines", name=legend)) # Plot speed legend = f"{step_name}_{step_descr}_V1" - df = pd.DataFrame(sql_store.get_history_data('V1', step_id), columns=columns) + df = pd.DataFrame(sql_store.get_history_data("V1", step_id), columns=columns) fig.add_trace(go.Scatter(x=df["Frame"], y=df["Value"], mode="lines", name=legend)) # Plot acceleration legend = f"{step_name}_{step_descr}_A1" - df = pd.DataFrame(sql_store.get_history_data('A1', step_id), columns=columns) + df = pd.DataFrame(sql_store.get_history_data("A1", step_id), columns=columns) fig.add_trace(go.Scatter(x=df["Frame"], y=df["Value"], mode="lines", name=legend)) fig.update_layout( diff --git a/examples/scripts/units_convert/convert_length_unit_patch.py b/examples/scripts/units_convert/convert_length_unit_patch.py index eec731c65..222e1fd95 100644 --- a/examples/scripts/units_convert/convert_length_unit_patch.py +++ b/examples/scripts/units_convert/convert_length_unit_patch.py @@ -19,8 +19,8 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings -import ifcopenshell.util.pset import ifcopenshell.util.element +import ifcopenshell.util.pset class Patcher: @@ -87,4 +87,4 @@ def patch(self): if self.file.schema == "IFC2X3": ifcopenshell.api.owner.settings.get_user = old_get_user - ifcopenshell.api.owner.settings.get_application = old_get_application \ No newline at end of file + ifcopenshell.api.owner.settings.get_application = old_get_application diff --git a/examples/scripts/units_convert/convert_length_unit_patch_info.py b/examples/scripts/units_convert/convert_length_unit_patch_info.py index e78c80181..6833a5be5 100644 --- a/examples/scripts/units_convert/convert_length_unit_patch_info.py +++ b/examples/scripts/units_convert/convert_length_unit_patch_info.py @@ -20,8 +20,8 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings -import ifcopenshell.util.pset import ifcopenshell.util.element +import ifcopenshell.util.pset class Patcher: @@ -110,5 +110,5 @@ def main(): print(tuple(inverse)) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/examples/scripts/units_convert/convert_length_unit_patch_v3.py b/examples/scripts/units_convert/convert_length_unit_patch_v3.py index 2fcddc025..df35f9eec 100644 --- a/examples/scripts/units_convert/convert_length_unit_patch_v3.py +++ b/examples/scripts/units_convert/convert_length_unit_patch_v3.py @@ -19,8 +19,8 @@ import ifcopenshell import ifcopenshell.api import ifcopenshell.api.owner.settings -import ifcopenshell.util.pset import ifcopenshell.util.element +import ifcopenshell.util.pset class Patcher: @@ -93,4 +93,4 @@ def patch(self): if self.file.schema == "IFC2X3": ifcopenshell.api.owner.settings.get_user = old_get_user - ifcopenshell.api.owner.settings.get_application = old_get_application \ No newline at end of file + ifcopenshell.api.owner.settings.get_application = old_get_application diff --git a/examples/scripts/units_convert/ifc_patch_convert_units.py b/examples/scripts/units_convert/ifc_patch_convert_units.py index 432a469e5..dea20ee0d 100644 --- a/examples/scripts/units_convert/ifc_patch_convert_units.py +++ b/examples/scripts/units_convert/ifc_patch_convert_units.py @@ -29,5 +29,5 @@ def main(): print(tuple(inverse)) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/src/ada/api/beams/geom_beams.py b/src/ada/api/beams/geom_beams.py index b9ef42d03..dd0ade852 100644 --- a/src/ada/api/beams/geom_beams.py +++ b/src/ada/api/beams/geom_beams.py @@ -26,11 +26,11 @@ def straight_beam_to_geom(beam: Beam | PipeSegStraight, is_solid=True) -> Geomet geom = Geometry(beam.guid, solid, beam.color) else: if beam.section.type in ( - beam.section.TYPES.IPROFILE, - beam.section.TYPES.TPROFILE, - beam.section.TYPES.ANGULAR, - beam.section.TYPES.CHANNEL, - beam.section.TYPES.FLATBAR, + beam.section.TYPES.IPROFILE, + beam.section.TYPES.TPROFILE, + beam.section.TYPES.ANGULAR, + beam.section.TYPES.CHANNEL, + beam.section.TYPES.FLATBAR, ): geom = profile_disconnected_to_face_geom(beam) elif beam.section.type == beam.section.TYPES.BOX: diff --git a/src/ada/api/containers.py b/src/ada/api/containers.py index 07630b530..397ff650b 100644 --- a/src/ada/api/containers.py +++ b/src/ada/api/containers.py @@ -941,7 +941,9 @@ def min_nid(self) -> int: def nodes(self) -> list[Node]: return self._nodes - def get_by_volume(self, p=None, vol_box=None, vol_cyl=None, tol=Settings.point_tol, single_member=False) -> list[Node]: + def get_by_volume( + self, p=None, vol_box=None, vol_cyl=None, tol=Settings.point_tol, single_member=False + ) -> list[Node]: """ :param p: Point @@ -1002,12 +1004,12 @@ def eval_p_in_cyl(no): result = list(simplesearch) if len(result) == 0: - logger.info(f'No vertices found using {p=}, {vol_box=}, {vol_cyl=} and {tol=}') + logger.info(f"No vertices found using {p=}, {vol_box=}, {vol_cyl=} and {tol=}") return result if single_member: if len(result) != 1: - logger.warning(f'Returning member at index=0 despite {len(result)=}. Please check your results') + logger.warning(f"Returning member at index=0 despite {len(result)=}. Please check your results") return result[0] return result diff --git a/src/ada/api/spatial/assembly.py b/src/ada/api/spatial/assembly.py index ea062ef59..52de68dae 100644 --- a/src/ada/api/spatial/assembly.py +++ b/src/ada/api/spatial/assembly.py @@ -208,7 +208,9 @@ def to_fem( scratch_dir = Settings.scratch_dir if scratch_dir is None else pathlib.Path(scratch_dir) - write_to_fem(self, name, fem_format, overwrite, fem_converter, scratch_dir, metadata, make_zip_file, model_data_only) + write_to_fem( + self, name, fem_format, overwrite, fem_converter, scratch_dir, metadata, make_zip_file, model_data_only + ) # Execute if execute: diff --git a/src/ada/api/spatial/part.py b/src/ada/api/spatial/part.py index 155870dd5..d58ef62e2 100644 --- a/src/ada/api/spatial/part.py +++ b/src/ada/api/spatial/part.py @@ -41,18 +41,18 @@ class Part(BackendGeom): IFC_CLASSES = SpatialTypes def __init__( - self, - name, - color=None, - placement=None, - fem: FEM = None, - settings: Settings = Settings(), - metadata=None, - parent=None, - units: Units = Units.M, - guid=None, - ifc_store: IfcStore = None, - ifc_class: SpatialTypes = SpatialTypes.IfcBuildingStorey, + self, + name, + color=None, + placement=None, + fem: FEM = None, + settings: Settings = Settings(), + metadata=None, + parent=None, + units: Units = Units.M, + guid=None, + ifc_store: IfcStore = None, + ifc_class: SpatialTypes = SpatialTypes.IfcBuildingStorey, ): from ada import FEM @@ -253,7 +253,7 @@ def add_section(self, section: Section) -> Section: return self._sections.add(section) def add_object(self, obj: Part | Beam | Plate | Wall | Pipe | Shape | Weld | Section): - from ada import Beam, Part, Pipe, Plate, Shape, Wall, Weld, Section + from ada import Beam, Part, Pipe, Plate, Section, Shape, Wall, Weld if isinstance(obj, Beam): return self.add_beam(obj) @@ -275,10 +275,10 @@ def add_object(self, obj: Part | Beam | Plate | Wall | Pipe | Shape | Weld | Sec raise NotImplementedError(f'"{type(obj)}" is not yet supported for smart append') def add_boolean( - self, - boolean: Boolean | PrimExtrude | PrimRevolve | PrimCyl | PrimBox, - add_pen_to_subparts=True, - add_to_layer: str = None, + self, + boolean: Boolean | PrimExtrude | PrimRevolve | PrimCyl | PrimBox, + add_pen_to_subparts=True, + add_to_layer: str = None, ) -> Boolean: def create_pen(pen_): if isinstance(pen_, (PrimExtrude, PrimRevolve, PrimCyl, PrimBox)): @@ -355,16 +355,16 @@ def add_elements_from_ifc(self, ifc_file_path: os.PathLike | str, data_only=Fals raise ValueError(f"Unrecognized {type(obj)=}") def read_step_file( - self, - step_path, - name=None, - scale=None, - transform=None, - rotate=None, - colour=None, - opacity=1.0, - source_units=Units.M, - include_shells=False, + self, + step_path, + name=None, + scale=None, + transform=None, + rotate=None, + colour=None, + opacity=1.0, + source_units=Units.M, + include_shells=False, ): """ @@ -602,7 +602,7 @@ def get_all_subparts(self, include_self=False) -> list[Part]: return list_of_parts def get_all_physical_objects( - self, sub_elements_only=False, by_type=None, filter_by_guids: list[str] = None, pipe_to_segments=False + self, sub_elements_only=False, by_type=None, filter_by_guids: list[str] = None, pipe_to_segments=False ) -> Iterable[Beam | Plate | Wall | Pipe | Shape]: physical_objects = [] if sub_elements_only: @@ -679,19 +679,19 @@ def _on_import(self): raise NotImplementedError() def to_fem_obj( - self, - mesh_size: float, - bm_repr: GeomRepr = GeomRepr.LINE, - pl_repr: GeomRepr = GeomRepr.SHELL, - shp_repr: GeomRepr = GeomRepr.SOLID, - options: GmshOptions = None, - silent=True, - interactive=False, - use_quads=False, - use_hex=False, - experimental_bm_splitting=True, - experimental_pl_splitting=True, - name=None, + self, + mesh_size: float, + bm_repr: GeomRepr = GeomRepr.LINE, + pl_repr: GeomRepr = GeomRepr.SHELL, + shp_repr: GeomRepr = GeomRepr.SOLID, + options: GmshOptions = None, + silent=True, + interactive=False, + use_quads=False, + use_hex=False, + experimental_bm_splitting=True, + experimental_pl_splitting=True, + name=None, ) -> FEM: from ada import Beam, Plate, Shape from ada.fem.elements import Mass @@ -759,7 +759,7 @@ def post_pro(buffer_items, tree): self.to_trimesh_scene(**kwargs).export(gltf_file, buffer_postprocessor=post_pro) def to_trimesh_scene( - self, render_override: dict[str, GeomRepr | str] = None, filter_by_guids=None, merge_meshes=True + self, render_override: dict[str, GeomRepr | str] = None, filter_by_guids=None, merge_meshes=True ): from ada.occ.tessellating import BatchTessellator @@ -769,14 +769,14 @@ def to_trimesh_scene( ) def to_stp( - self, - destination_file, - geom_repr: GeomRepr = GeomRepr.SOLID, - progress_callback: Callable[ - [int, int], - None, - ] = None, - geom_repr_override: dict[str, GeomRepr] = None, + self, + destination_file, + geom_repr: GeomRepr = GeomRepr.SOLID, + progress_callback: Callable[ + [int, int], + None, + ] = None, + geom_repr_override: dict[str, GeomRepr] = None, ): from ada.occ.store import OCCStore @@ -796,6 +796,14 @@ def to_viewer(self, **kwargs): send_to_viewer(self, **kwargs) + def show(self): + from ada.occ.tessellating import BatchTessellator + + bt = BatchTessellator() + scene = bt.tessellate_part(self) + + return scene.show("notebook") + @property def parts(self) -> dict[str, Part]: return self._parts diff --git a/src/ada/base/physical_objects.py b/src/ada/base/physical_objects.py index 717159e16..061d5a194 100644 --- a/src/ada/base/physical_objects.py +++ b/src/ada/base/physical_objects.py @@ -160,6 +160,30 @@ def to_obj_mesh(self, geom_repr: str | GeomRepr = GeomRepr.SOLID, export_config: return occ_geom_to_poly_mesh(self, geom_repr=geom_repr, export_config=export_config) + def show(self): + from itertools import groupby + + import trimesh + + from ada.occ.tessellating import BatchTessellator + from ada.visit.gltf.optimize import concatenate_stores + from ada.visit.gltf.store import merged_mesh_to_trimesh_scene + + bt = BatchTessellator() + mesh_stores = list(bt.batch_tessellate([self])) + + scene = trimesh.Scene() + mesh_map = [] + + for mat_id, meshes in groupby(mesh_stores, lambda x: x.material): + meshes = list(meshes) + + merged_store = concatenate_stores(meshes) + mesh_map.append((mat_id, meshes, merged_store)) + merged_mesh_to_trimesh_scene(scene, merged_store, bt.get_mat_by_id(mat_id), mat_id, None) + + return scene.show("notebook") + @property def booleans(self) -> list[Boolean]: return self._booleans diff --git a/src/ada/cadit/ifc/convert_length_unit_patch.py b/src/ada/cadit/ifc/convert_length_unit_patch.py index 0b730994d..78506b9cb 100644 --- a/src/ada/cadit/ifc/convert_length_unit_patch.py +++ b/src/ada/cadit/ifc/convert_length_unit_patch.py @@ -121,4 +121,4 @@ def patch(self): if self.file.schema == "IFC2X3": ifcopenshell.api.owner.settings.get_user = old_get_user - ifcopenshell.api.owner.settings.get_application = old_get_application \ No newline at end of file + ifcopenshell.api.owner.settings.get_application = old_get_application diff --git a/src/ada/cadit/ifc/units_conversion.py b/src/ada/cadit/ifc/units_conversion.py index a5e088836..6f62b03bd 100644 --- a/src/ada/cadit/ifc/units_conversion.py +++ b/src/ada/cadit/ifc/units_conversion.py @@ -1,8 +1,9 @@ -from typing import Iterable, Any +from typing import Any, Iterable +import ifcopenshell.api import ifcopenshell.util.element import ifcopenshell.util.unit -import ifcopenshell.api + from ada.base.units import Units from ada.cadit.ifc.convert_length_unit_patch import Patcher diff --git a/src/ada/cadit/step/read/reader_utils.py b/src/ada/cadit/step/read/reader_utils.py index 7ff4a626c..9431ed9ba 100644 --- a/src/ada/cadit/step/read/reader_utils.py +++ b/src/ada/cadit/step/read/reader_utils.py @@ -7,9 +7,9 @@ from OCC.Core.TDF import TDF_Label, TDF_LabelSequence from OCC.Core.TopLoc import TopLoc_Location from OCC.Core.TopoDS import TopoDS_Shape, TopoDS_Shell -from ada.config import logger from ada.base.adacpp_interface import adacpp_switch +from ada.config import logger from ada.occ.xcaf_utils import get_color try: diff --git a/src/ada/fem/__init__.py b/src/ada/fem/__init__.py index 66e0cebee..0d22bd6ef 100644 --- a/src/ada/fem/__init__.py +++ b/src/ada/fem/__init__.py @@ -9,7 +9,7 @@ from .outputs import FieldOutput, HistOutput from .sections import ConnectorSection, FemSection from .sets import FemSet -from .steps import StepEigen, StepExplicit, StepImplicitStatic, StepSteadyState, StepImplicitDynamic +from .steps import StepEigen, StepExplicit, StepImplicitStatic, StepSteadyState from .surfaces import Surface __all__ = [ diff --git a/src/ada/fem/common.py b/src/ada/fem/common.py index e6fa42b3b..5cdfa6b69 100644 --- a/src/ada/fem/common.py +++ b/src/ada/fem/common.py @@ -1,9 +1,10 @@ from __future__ import annotations -import numpy as np from dataclasses import dataclass from typing import TYPE_CHECKING +import numpy as np + from ada.config import Settings if TYPE_CHECKING: diff --git a/src/ada/fem/concept.py b/src/ada/fem/concept.py index 97d524ebe..08042984d 100644 --- a/src/ada/fem/concept.py +++ b/src/ada/fem/concept.py @@ -2,7 +2,7 @@ from dataclasses import dataclass, field from itertools import chain -from typing import TYPE_CHECKING, Dict, Iterable, List, Tuple, Union +from typing import TYPE_CHECKING, Dict, Iterable, List, Union from ada.api.containers import Nodes from ada.config import logger @@ -66,8 +66,9 @@ class FEM: constraints: Dict[str, Constraint] = field(init=False, default_factory=dict) bcs: List[Bc] = field(init=False, default_factory=list) - steps: List[Union[StepSteadyState, StepEigen, StepImplicitStatic, StepExplicit]] = field(init=False, - default_factory=list) + steps: List[Union[StepSteadyState, StepEigen, StepImplicitStatic, StepExplicit]] = field( + init=False, default_factory=list + ) nodes: Nodes = field(default_factory=Nodes, init=True) ref_points: Nodes = field(default_factory=Nodes, init=True) @@ -130,13 +131,13 @@ def add_mass(self, mass: Mass) -> Mass: return mass def add_set( - self, - fem_set: FemSet, - p=None, - vol_box=None, - vol_cyl=None, - single_member=False, - tol=1e-4, + self, + fem_set: FemSet, + p=None, + vol_box=None, + vol_cyl=None, + single_member=False, + tol=1e-4, ) -> FemSet: """ :param fem_set: A fem set object @@ -250,7 +251,8 @@ def add_connector(self, connector: Connector) -> Connector: connector.parent = self if not isinstance(self.parent, Assembly): logger.warning( - "Connector Elements can usually only be added to an Assembly object. Please check your model.") + "Connector Elements can usually only be added to an Assembly object. Please check your model." + ) self.elements.add(connector) connector.csys.parent = self diff --git a/src/ada/fem/constraints.py b/src/ada/fem/constraints.py index f21a87716..2acc7d078 100644 --- a/src/ada/fem/constraints.py +++ b/src/ada/fem/constraints.py @@ -9,9 +9,10 @@ from .surfaces import Surface if TYPE_CHECKING: + from ada import Part + from .common import Amplitude from .concept import FEM - from ada import Part class BcTypes: @@ -45,16 +46,16 @@ class Bc(FemBase): TYPES = BcTypes def __init__( - self, - name, - fem_set: FemSet, - dofs, - magnitudes=None, - bc_type=BcTypes.DISPL, - amplitude: "Amplitude" = None, - init_condition=None, - metadata=None, - parent=None, + self, + name, + fem_set: FemSet, + dofs, + magnitudes=None, + bc_type=BcTypes.DISPL, + amplitude: "Amplitude" = None, + init_condition=None, + metadata=None, + parent=None, ): """dofs should be a list with integers from 1-6""" super().__init__(name, metadata, parent) @@ -107,18 +108,18 @@ class Constraint(FemBase): TYPES = ConstraintTypes def __init__( - self, - name, - con_type, - m_set: FemSet | Surface, - s_set: FemSet | Surface, - dofs=None, - pos_tol=None, - mpc_type=None, - csys: Csys = None, - parent=None, - metadata=None, - influence_distance: float = None, + self, + name, + con_type, + m_set: FemSet | Surface, + s_set: FemSet | Surface, + dofs=None, + pos_tol=None, + mpc_type=None, + csys: Csys = None, + parent=None, + metadata=None, + influence_distance: float = None, ): super().__init__(name, metadata, parent) m_set.refs.append(self) @@ -205,16 +206,16 @@ class PredefinedField(FemBase): TYPES = PreDefTypes def __init__( - self, - name, - field_type, - fem_set: FemSet = None, - dofs=None, - magnitude=None, - initial_state_file=None, - initial_state_part=None, - metadata=None, - parent=None, + self, + name, + field_type, + fem_set: FemSet = None, + dofs=None, + magnitude=None, + initial_state_file=None, + initial_state_part=None, + metadata=None, + parent=None, ): super().__init__(name, metadata, parent) self.type = field_type diff --git a/src/ada/fem/formats/abaqus/write/write_output_requests.py b/src/ada/fem/formats/abaqus/write/write_output_requests.py index e62f32266..7c293b828 100644 --- a/src/ada/fem/formats/abaqus/write/write_output_requests.py +++ b/src/ada/fem/formats/abaqus/write/write_output_requests.py @@ -33,7 +33,6 @@ def hist_output_str(hist_output: HistOutput) -> str: else: fem_set_str = instance_name - return f"""*Output, history, {hist_output.int_type}={hist_output.int_value} ** HISTORY OUTPUT: {hist_output.name} ** diff --git a/src/ada/fem/formats/abaqus/write/write_parts.py b/src/ada/fem/formats/abaqus/write/write_parts.py index d3595b45f..6d0fd4ae0 100644 --- a/src/ada/fem/formats/abaqus/write/write_parts.py +++ b/src/ada/fem/formats/abaqus/write/write_parts.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING from ada.fem.conversion_utils import convert_ecc_to_mpc, convert_hinges_2_couplings + from .write_constraints import constraints_str from .write_elements import elements_str from .write_masses import masses_str diff --git a/src/ada/fem/formats/abaqus/write/writer.py b/src/ada/fem/formats/abaqus/write/writer.py index a3792c60a..8c70d6862 100644 --- a/src/ada/fem/formats/abaqus/write/writer.py +++ b/src/ada/fem/formats/abaqus/write/writer.py @@ -1,6 +1,5 @@ from __future__ import annotations -import os from io import StringIO from typing import TYPE_CHECKING @@ -8,7 +7,7 @@ from ...tools import FEA_IO, tool_register from .write_amplitudes import amplitudes_str from .write_bc import boundary_conditions_str -from .write_connectors import connector_sections_str, connectors_str, connector_str, connector_section_str +from .write_connectors import connector_section_str, connector_str from .write_constraints import constraints_str from .write_elements import elements_str from .write_interactions import eval_interactions, int_prop_str @@ -30,7 +29,9 @@ @tool_register(fem_format=FEATypes.ABAQUS, io=FEA_IO.write) -def to_fem(assembly: Assembly, name, analysis_dir=None, metadata=None, writable_obj: StringIO = None, model_data_only=False): +def to_fem( + assembly: Assembly, name, analysis_dir=None, metadata=None, writable_obj: StringIO = None, model_data_only=False +): """Build the Abaqus Analysis input deck""" # Write part bulk files diff --git a/src/ada/fem/formats/code_aster/common.py b/src/ada/fem/formats/code_aster/common.py index b931d969e..36521795e 100644 --- a/src/ada/fem/formats/code_aster/common.py +++ b/src/ada/fem/formats/code_aster/common.py @@ -1,7 +1,14 @@ from enum import Enum from ada.config import logger -from ada.fem.shapes.definitions import LineShapes, ShellShapes, SolidShapes, ConnectorTypes, MassTypes, SpringTypes +from ada.fem.shapes.definitions import ( + ConnectorTypes, + LineShapes, + MassTypes, + ShellShapes, + SolidShapes, + SpringTypes, +) def ada_to_med_type(value): diff --git a/src/ada/fem/formats/code_aster/execute.py b/src/ada/fem/formats/code_aster/execute.py index eec55b179..cd089ea40 100644 --- a/src/ada/fem/formats/code_aster/execute.py +++ b/src/ada/fem/formats/code_aster/execute.py @@ -4,6 +4,7 @@ from functools import wraps from ada.config import logger + from ..utils import LocalExecute @@ -13,15 +14,15 @@ def write_to_log(res_str, fname): def run_code_aster( - inp_path, - cpus=2, - gpus=None, - run_ext=False, - metadata=None, - execute=True, - return_bat_str=False, - exit_on_complete=True, - run_in_shell=False, + inp_path, + cpus=2, + gpus=None, + run_ext=False, + metadata=None, + execute=True, + return_bat_str=False, + exit_on_complete=True, + run_in_shell=False, ): """ @@ -95,7 +96,7 @@ def init_close_code_aster(func_=None, *, info_level=1, temp_dir=None): def actual_decorator(func): @wraps(func) def wrapper(*args, **kwargs): - print('Starting code_aster') + print("Starting code_aster") start = time.time() conda_dir = pathlib.Path(os.getenv("CONDA_PREFIX")) lib_dir = conda_dir / "lib" diff --git a/src/ada/fem/formats/code_aster/write/api_helpers.py b/src/ada/fem/formats/code_aster/write/api_helpers.py index 5ce45d9ca..ea31fc5ff 100644 --- a/src/ada/fem/formats/code_aster/write/api_helpers.py +++ b/src/ada/fem/formats/code_aster/write/api_helpers.py @@ -7,15 +7,15 @@ import code_aster from code_aster.Cata.Commands.meca_statique import MECA_STATIQUE from code_aster.Cata.Language.SyntaxObjects import _F -from code_aster.Commands import DEFI_GROUP, AFFE_MODELE, AFFE_CARA_ELEM, AFFE_CHAR_MECA +from code_aster.Commands import AFFE_CARA_ELEM, AFFE_CHAR_MECA, AFFE_MODELE, DEFI_GROUP import ada.fem -from ada.fem import Elem, Connector, Mass, ConnectorSection +from ada.fem import Connector, ConnectorSection, Elem, Mass from ada.fem.formats.code_aster.write.writer import write_to_med from ada.fem.formats.utils import get_fem_model_from_assembly if TYPE_CHECKING: - from ada import Assembly, FEM + from ada import FEM, Assembly DISPL_DOF_MAP = {1: "DX", 2: "DY", 3: "DZ", 4: "DRX", 5: "DRY", 6: "DRZ"} FORCE_DOF_MAP = {1: "FX", 2: "FY", 3: "FZ", 4: "FRX", 5: "FRY", 6: "FRZ"} @@ -26,17 +26,13 @@ def import_mesh(a: Assembly, scratch_dir): scratch_dir = pathlib.Path(scratch_dir) p = get_fem_model_from_assembly(a) - med_file = (scratch_dir / a.name).with_suffix('.med') + med_file = (scratch_dir / a.name).with_suffix(".med") write_to_med(a.name, p, med_file) mesh = code_aster.Mesh() mesh.readMedFile(med_file.as_posix(), a.name) - DEFI_GROUP( - MAILLAGE=mesh, - reuse=mesh, - CREA_GROUP_NO=_F(TOUT_GROUP_MA="OUI") - ) + DEFI_GROUP(MAILLAGE=mesh, reuse=mesh, CREA_GROUP_NO=_F(TOUT_GROUP_MA="OUI")) return mesh @@ -69,16 +65,15 @@ def assign_element_definitions(a: Assembly, mesh: code_aster.Mesh) -> code_aster discrete_modelings = [] if len(discrete_elements) > 0: elset_names = [el.elset.name for el in discrete_elements] - discrete_modelings.append(_F( - GROUP_MA=elset_names, - PHENOMENE='MECANIQUE', - MODELISATION='DIS_T', - )) - - model: code_aster.Model = AFFE_MODELE( - AFFE=(*discrete_modelings,), - MAILLAGE=mesh - ) + discrete_modelings.append( + _F( + GROUP_MA=elset_names, + PHENOMENE="MECANIQUE", + MODELISATION="DIS_T", + ) + ) + + model: code_aster.Model = AFFE_MODELE(AFFE=(*discrete_modelings,), MAILLAGE=mesh) return model @@ -117,8 +112,9 @@ def assign_material_definitions(a: Assembly, mesh: code_aster.Mesh) -> code_aste return material -def assign_element_characteristics(a: Assembly, model: code_aster.Model, - rigid_size=1e8) -> code_aster.ElementaryCharacteristics: +def assign_element_characteristics( + a: Assembly, model: code_aster.Model, rigid_size=1e8 +) -> code_aster.ElementaryCharacteristics: discrete_elements = [] line_elements = [] @@ -129,10 +125,7 @@ def assign_element_characteristics(a: Assembly, model: code_aster.Model, value = mass else: raise NotImplementedError("A non-scalar mass is not yet supported") - mass_def = _F( - GROUP_MA=elem.elset.name, - CARA="M_T_D_N", VALE=value - ) + mass_def = _F(GROUP_MA=elem.elset.name, CARA="M_T_D_N", VALE=value) discrete_elements.append(mass_def) elif isinstance(elem, Connector): con_sec = elem.con_sec @@ -145,19 +138,13 @@ def assign_element_characteristics(a: Assembly, model: code_aster.Model, for index in con_sec.rigid_dofs: value[index] = rigid_size - con_elem = _F( - GROUP_MA=elem.elset.name, - CARA="K_T_D_L", VALE=value, REPERE="GLOBAL" - ) + con_elem = _F(GROUP_MA=elem.elset.name, CARA="K_T_D_L", VALE=value, REPERE="GLOBAL") discrete_elements.append(con_elem) else: raise NotImplementedError(f"Currently unsupported non-discrete element type {elem}") - elem_car: code_aster.ElementaryCharacteristics = AFFE_CARA_ELEM( - MODELE=model, - DISCRET=discrete_elements - ) + elem_car: code_aster.ElementaryCharacteristics = AFFE_CARA_ELEM(MODELE=model, DISCRET=discrete_elements) return elem_car @@ -185,32 +172,29 @@ def assign_forces(a: Assembly, model: code_aster.Model) -> code_aster.Mechanical nodal_loads = [] for fem in assembly_fem_iterator(a): for load in fem.get_all_loads(): - imposed_loads = {FORCE_DOF_MAP[x]: force for x, force in enumerate(load.forces, start=1) if - float(force) != 0.0} + imposed_loads = { + FORCE_DOF_MAP[x]: force for x, force in enumerate(load.forces, start=1) if float(force) != 0.0 + } ca_load = _F(GROUP_NO=load.fem_set.name, **imposed_loads) nodal_loads.append(ca_load) - forces: code_aster.MechanicalLoadReal = AFFE_CHAR_MECA( - MODELE=model, - FORCE_NODALE=nodal_loads - ) + forces: code_aster.MechanicalLoadReal = AFFE_CHAR_MECA(MODELE=model, FORCE_NODALE=nodal_loads) return forces -def assign_steps(a: Assembly, model: code_aster.Model, fix: code_aster.MechanicalLoadReal, - forces: code_aster.MechanicalLoadReal, material_field: code_aster.MaterialField, - elem_car: code_aster.ElementaryCharacteristics) -> code_aster.ElasticResult: +def assign_steps( + a: Assembly, + model: code_aster.Model, + fix: code_aster.MechanicalLoadReal, + forces: code_aster.MechanicalLoadReal, + material_field: code_aster.MaterialField, + elem_car: code_aster.ElementaryCharacteristics, +) -> code_aster.ElasticResult: for step in a.fem.steps: if isinstance(step, ada.fem.StepImplicitDynamic): raise NotImplementedError("Not yet implemented 'StepImplicitDynamic'") elif isinstance(step, ada.fem.StepImplicitStatic): step.type linear_step: code_aster.ElasticResult = MECA_STATIQUE( - MODELE=model, - CHAM_MATER=material_field, - CARA_ELEM=elem_car, - EXCIT=( - _F(CHARGE=fix), - _F(CHARGE=forces) - ) + MODELE=model, CHAM_MATER=material_field, CARA_ELEM=elem_car, EXCIT=(_F(CHARGE=fix), _F(CHARGE=forces)) ) diff --git a/src/ada/fem/formats/code_aster/write/steps/dynamic.py b/src/ada/fem/formats/code_aster/write/steps/dynamic.py index 42cbade5b..d7bf37ac6 100644 --- a/src/ada/fem/formats/code_aster/write/steps/dynamic.py +++ b/src/ada/fem/formats/code_aster/write/steps/dynamic.py @@ -1,11 +1,12 @@ from __future__ import annotations -from ada.fem.steps import StepImplicitDynamic + from typing import TYPE_CHECKING +from ada.fem.steps import StepImplicitDynamic + if TYPE_CHECKING: import ada def step_dynamic_str(step: StepImplicitDynamic, part: ada.Part) -> str: - return "" diff --git a/src/ada/fem/formats/code_aster/write/write_med.py b/src/ada/fem/formats/code_aster/write/write_med.py index e0e2afafe..a3c233142 100644 --- a/src/ada/fem/formats/code_aster/write/write_med.py +++ b/src/ada/fem/formats/code_aster/write/write_med.py @@ -1,21 +1,23 @@ from __future__ import annotations + from typing import TYPE_CHECKING +import h5py import numpy as np -from ada.config import Settings, logger +from ada.config import Settings from ada.fem.shapes import definitions as shape_def from ..common import IntType, ada_to_med_type from .write_sets import _add_cell_sets, _add_node_sets -import h5py if TYPE_CHECKING: from ada.api.spatial import Part -def med_elements(part: Part, time_step: h5py.Group, profile: str, families: h5py.Group, - int_type: IntType = IntType.INT32): +def med_elements( + part: Part, time_step: h5py.Group, profile: str, families: h5py.Group, int_type: IntType = IntType.INT32 +): """ Add the following ['FAM', 'NOD', 'NUM'] to the 'MAI' group @@ -39,7 +41,7 @@ def get_node_ids_from_element(el_): cells = np.array(list(map(get_node_ids_from_element, elements))) if med_type in elements_group: - raise ValueError(f'med_type {med_type} is already defined. rewrite is needed.') + raise ValueError(f"med_type {med_type} is already defined. rewrite is needed.") med_cells = elements_group.create_group(med_type) med_cells.attrs.create("CGT", 1) diff --git a/src/ada/fem/formats/code_aster/write/write_steps.py b/src/ada/fem/formats/code_aster/write/write_steps.py index a0a2fd5e9..2e8c1a620 100644 --- a/src/ada/fem/formats/code_aster/write/write_steps.py +++ b/src/ada/fem/formats/code_aster/write/write_steps.py @@ -7,7 +7,7 @@ if TYPE_CHECKING: from ada.api.spatial import Part -from .steps import eigen, static, dynamic +from .steps import dynamic, eigen, static def create_step_str(step: StepEigen | StepImplicitStatic, part: Part) -> str: diff --git a/src/ada/fem/formats/code_aster/write/writer.py b/src/ada/fem/formats/code_aster/write/writer.py index 05fbcc2f9..f3059c427 100644 --- a/src/ada/fem/formats/code_aster/write/writer.py +++ b/src/ada/fem/formats/code_aster/write/writer.py @@ -1,6 +1,5 @@ from __future__ import annotations -import pathlib from typing import TYPE_CHECKING import h5py diff --git a/src/ada/fem/formats/general.py b/src/ada/fem/formats/general.py index 25def67af..c5f278f9d 100644 --- a/src/ada/fem/formats/general.py +++ b/src/ada/fem/formats/general.py @@ -114,7 +114,7 @@ def write_to_fem( scratch_dir, metadata: dict, make_zip_file, - model_data_only=False + model_data_only=False, ): from ada.fem.formats.utils import default_fem_res_path, folder_prep, should_convert diff --git a/src/ada/fem/formats/sesam/write/write_sections.py b/src/ada/fem/formats/sesam/write/write_sections.py index 9c2d3593a..48a05a4a5 100644 --- a/src/ada/fem/formats/sesam/write/write_sections.py +++ b/src/ada/fem/formats/sesam/write/write_sections.py @@ -5,6 +5,7 @@ from ada.core.utils import Counter, make_name_fem_ready from ada.fem import FemSection from ada.fem.exceptions.element_support import IncompatibleElements + from .write_utils import write_ff shid = Counter(1) @@ -60,7 +61,7 @@ def create_shell_section_str(fem_sec: FemSection, thick_map) -> str: sh_id = next(shid) thick_map[fem_sec.thickness] = sh_id else: - return '' + return "" return write_ff("GELTH", [(sh_id, fem_sec.thickness, 5)]) diff --git a/src/ada/fem/formats/sesam/write/writer.py b/src/ada/fem/formats/sesam/write/writer.py index 3225e245d..c7f96e4b3 100644 --- a/src/ada/fem/formats/sesam/write/writer.py +++ b/src/ada/fem/formats/sesam/write/writer.py @@ -32,7 +32,9 @@ def to_fem(assembly, name, analysis_dir=None, metadata=None, model_data_only=Fal parts = list(filter(lambda x: len(x.fem.nodes) > 0, assembly.get_all_subparts(include_self=True))) if len(parts) != 1: - raise DoesNotSupportMultiPart(f"Sesam writer currently only works for a single part. Currently found {len(parts)}") + raise DoesNotSupportMultiPart( + f"Sesam writer currently only works for a single part. Currently found {len(parts)}" + ) if len(assembly.fem.steps) > 1: logger.error("Sesam writer currently only supports 1 step. Will only use 1st step") diff --git a/src/ada/fem/formats/utils.py b/src/ada/fem/formats/utils.py index ef7aa2c18..5fb617252 100644 --- a/src/ada/fem/formats/utils.py +++ b/src/ada/fem/formats/utils.py @@ -209,11 +209,14 @@ def get_exe_path(fea_type: FEATypes): exe_name = fea_type env_name = f"ADA_{exe_name}_exe" + env_path = os.getenv(env_name, None) + if env_path is not None: + exe_path = pathlib.Path(env_path) + if exe_path.exists(): + return exe_path if Settings.fem_exe_paths.get(exe_name, None) is not None: exe_path = Settings.fem_exe_paths[exe_name] - elif os.getenv(env_name): - exe_path = os.getenv(env_name) elif shutil.which(f"{exe_name}"): exe_path = shutil.which(f"{exe_name}") elif shutil.which(f"{exe_name}.exe"): diff --git a/src/ada/fem/formats/vtu/write.py b/src/ada/fem/formats/vtu/write.py index d3b8eeb7e..e3348f5d2 100644 --- a/src/ada/fem/formats/vtu/write.py +++ b/src/ada/fem/formats/vtu/write.py @@ -1,9 +1,10 @@ import base64 import pathlib import struct -import numpy as np import xml.etree.ElementTree as ET +import numpy as np + from ada.fem.results.common import ElementBlock, FemNodes from ada.fem.shapes.definitions import LineShapes, ShellShapes diff --git a/src/ada/fem/outputs.py b/src/ada/fem/outputs.py index b09655bcc..5b1603ba0 100644 --- a/src/ada/fem/outputs.py +++ b/src/ada/fem/outputs.py @@ -79,15 +79,15 @@ class HistOutput(FemBase): TYPES_DATA = HistDataTypes def __init__( - self, - name: str, - fem_set: FemSet | None | list[Surface], - set_type: str, - variables: list[str], - int_value=1, - int_type=TYPES_INTERVAL.FREQUENCY, - metadata=None, - parent=None, + self, + name: str, + fem_set: FemSet | None | list[Surface], + set_type: str, + variables: list[str], + int_value=1, + int_type=TYPES_INTERVAL.FREQUENCY, + metadata=None, + parent=None, ): super().__init__(name, metadata, parent) @@ -164,15 +164,15 @@ class FieldOutput(FemBase): default_co = ["CSTRESS", "CDISP", "CFORCE", "CSTATUS"] def __init__( - self, - name, - nodal=None, - element=None, - contact=None, - int_value=1, - int_type=TYPES_INTERVAL.FREQUENCY, - metadata=None, - parent: "Step" = None, + self, + name, + nodal=None, + element=None, + contact=None, + int_value=1, + int_type=TYPES_INTERVAL.FREQUENCY, + metadata=None, + parent: "Step" = None, ): super().__init__(name, metadata, parent) self._nodal = FieldOutput.default_no if nodal is None else nodal diff --git a/src/ada/fem/results/common.py b/src/ada/fem/results/common.py index efbe63039..55aa104cf 100644 --- a/src/ada/fem/results/common.py +++ b/src/ada/fem/results/common.py @@ -332,6 +332,7 @@ def to_meshio_mesh(self, make_3xn_dofs=True) -> meshio.Mesh: def to_vtu(self, filepath, make_3xn_dofs=True): from ada.fem.formats.vtu.write import write_to_vtu_file + cell_data, point_data = self._get_point_and_cell_data() write_to_vtu_file(self.mesh.nodes, self.mesh.elements, point_data, cell_data, filepath) diff --git a/src/ada/fem/results/concepts.py b/src/ada/fem/results/concepts.py index ffbfe47df..2fb35f407 100644 --- a/src/ada/fem/results/concepts.py +++ b/src/ada/fem/results/concepts.py @@ -12,11 +12,12 @@ from ada.config import logger from ada.fem.formats.general import FEATypes from ada.visit.rendering.femviz import get_edges_and_faces_from_meshio, magnitude -from .eigenvalue import EigenDataSummary + from ..formats.abaqus.results import read_abaqus_results from ..formats.calculix.results import read_calculix_results from ..formats.code_aster.results import read_code_aster_results from ..formats.sesam.results import read_sesam_results +from .eigenvalue import EigenDataSummary if TYPE_CHECKING: from ada import Assembly @@ -32,16 +33,16 @@ class Results: } def __init__( - self, - res_path, - name: str = None, - fem_format: str | FEATypes = None, - assembly: None | Assembly = None, - palette=None, - output=None, - overwrite=True, - metadata=None, - import_mesh=False, + self, + res_path, + name: str = None, + fem_format: str | FEATypes = None, + assembly: None | Assembly = None, + palette=None, + output=None, + overwrite=True, + metadata=None, + import_mesh=False, ): if isinstance(fem_format, str): fem_format = FEATypes.from_str(fem_format) diff --git a/src/ada/fem/results/field_data.py b/src/ada/fem/results/field_data.py index ad8528e3d..6a8e7a3a7 100644 --- a/src/ada/fem/results/field_data.py +++ b/src/ada/fem/results/field_data.py @@ -1,11 +1,13 @@ from __future__ import annotations -from ada.fem.shapes.definitions import LineShapes, ShellShapes, SolidShapes + from dataclasses import dataclass from enum import Enum from typing import ClassVar import numpy as np +from ada.fem.shapes.definitions import LineShapes, ShellShapes, SolidShapes + @dataclass class FieldData: diff --git a/src/ada/fem/results/sqlite_store.py b/src/ada/fem/results/sqlite_store.py index 06f04a128..e44276f8c 100644 --- a/src/ada/fem/results/sqlite_store.py +++ b/src/ada/fem/results/sqlite_store.py @@ -66,7 +66,9 @@ def get_field_vars(self): results = self.cursor.fetchall() return results - def get_history_data(self, field_var=None, step_id=None, instance_id=None, point_id=None, elem_id=None, return_df=False): + def get_history_data( + self, field_var=None, step_id=None, instance_id=None, point_id=None, elem_id=None, return_df=False + ): base_query = """SELECT mi.Name, ho.ResType, ho.Region, @@ -115,6 +117,7 @@ def get_history_data(self, field_var=None, step_id=None, instance_id=None, point results = self.cursor.fetchall() if return_df: import pandas as pd + columns = [ "Name", "Restype", diff --git a/src/ada/fem/sections.py b/src/ada/fem/sections.py index 2e524ee10..153c7e3c6 100644 --- a/src/ada/fem/sections.py +++ b/src/ada/fem/sections.py @@ -1,19 +1,18 @@ from __future__ import annotations -from dataclasses import dataclass -from typing import TYPE_CHECKING, List, Union, TypeVar +from typing import TYPE_CHECKING, List, TypeVar, Union import numpy as np from ada.base.types import GeomRepr from ada.config import logger from ada.core.utils import Counter +from ada.core.vector_transforms import normal_to_points_in_plane from ada.core.vector_utils import calc_yvec, calc_zvec, unit_vector, vector_length -from ada.materials import Material -from ada.sections import Section from ada.fem.common import FemBase from ada.fem.shapes import ElemType -from ada.core.vector_transforms import normal_to_points_in_plane +from ada.materials import Material +from ada.sections import Section if TYPE_CHECKING: from ada import Beam, Plate diff --git a/src/ada/fem/shapes/definitions.py b/src/ada/fem/shapes/definitions.py index d389446e5..bad8d2b5b 100644 --- a/src/ada/fem/shapes/definitions.py +++ b/src/ada/fem/shapes/definitions.py @@ -285,12 +285,12 @@ def solids_face_seq(self): @staticmethod def is_valid_elem(elem_type): valid_element_types = ( - LineShapes.get_all() - + ShellShapes.get_all() - + SolidShapes.get_all() - + MassTypes.get_all() - + SpringTypes.get_all() - + ConnectorTypes.get_all() + LineShapes.get_all() + + ShellShapes.get_all() + + SolidShapes.get_all() + + MassTypes.get_all() + + SpringTypes.get_all() + + ConnectorTypes.get_all() ) valid_element_types_upper = [x.value.upper() for x in valid_element_types] value = elem_type.upper() diff --git a/src/ada/occ/store.py b/src/ada/occ/store.py index cea72640f..784df3243 100644 --- a/src/ada/occ/store.py +++ b/src/ada/occ/store.py @@ -63,10 +63,10 @@ def safe_geom(obj_, name_ref=None): occ_geom = BRepBuilderAPI_Transform(occ_geom, trsf, True).Shape() return occ_geom except RuntimeError as e: - logger.warning(f"Failed to add shape {obj.name} due to \"{e}\" from {name_ref}") + logger.warning(f'Failed to add shape {obj.name} due to "{e}" from {name_ref}') return None except BaseException as e: - logger.warning(f"Failed to add shape {obj.name} due to \"{e}\" from {name_ref}") + logger.warning(f'Failed to add shape {obj.name} due to "{e}" from {name_ref}') return None if isinstance(part, StepStore): diff --git a/src/ada/visit/comms.py b/src/ada/visit/comms.py index 878361d50..df5db517d 100644 --- a/src/ada/visit/comms.py +++ b/src/ada/visit/comms.py @@ -5,6 +5,7 @@ import subprocess import sys import time + import trimesh import ada @@ -15,7 +16,9 @@ WEBSOCKET_EXE_PY = pathlib.Path(__file__).parent / "websocket_server.py" -def send_to_viewer(part: ada.Part | trimesh.Scene, host="localhost", port=8765, origins: list[str] = None, meta: dict = None): +def send_to_viewer( + part: ada.Part | trimesh.Scene, host="localhost", port=8765, origins: list[str] = None, meta: dict = None +): if origins is None: send_to_local_viewer(part, host=host, port=port) else: diff --git a/src/ada/visit/render_pygfx.py b/src/ada/visit/render_pygfx.py index c33052b12..901964f2c 100644 --- a/src/ada/visit/render_pygfx.py +++ b/src/ada/visit/render_pygfx.py @@ -90,7 +90,7 @@ def _init_scene(self): def _get_scene_meshes(self, scene: trimesh.Scene, tag: str) -> Iterable[gfx.Mesh]: for key, m in scene.geometry.items(): mesh = gfx_utils.gfx_mesh_from_mesh(m) - if 'node' in key: + if "node" in key: buffer_id = int(float(key.replace("node", ""))) else: buffer_id = len(self._mesh_map) diff --git a/src/ada/visit/render_pygfx_helpers.py b/src/ada/visit/render_pygfx_helpers.py index 2d572a595..bc7c6d6ef 100644 --- a/src/ada/visit/render_pygfx_helpers.py +++ b/src/ada/visit/render_pygfx_helpers.py @@ -74,7 +74,7 @@ def __init__(self, size=1.0, thickness=2): line_positions *= line_size geometry = Geometry(positions=line_positions, colors=colors) - material = LineSegmentMaterial(thickness=thickness, aa=True, color_mode='vertex') + material = LineSegmentMaterial(thickness=thickness, aa=True, color_mode="vertex") super().__init__(geometry, material) @@ -266,7 +266,9 @@ def gfx_mesh_from_mesh( if hasattr(mesh.visual, "material"): mat = tri_mat_to_gfx_mat(mesh.visual.material) else: - logger.warning("No material found for mesh, using default color. Maybe related to changes in trimesh>4?") + logger.warning( + "No material found for mesh, using default color. Maybe related to changes in trimesh>4?" + ) color = mesh.visual.main_color mat = gfx.MeshPhongMaterial(color=color, flat_shading=True) else: diff --git a/tests/core/fem/formats/vtu/test_vtu_write.py b/tests/core/fem/formats/vtu/test_vtu_write.py index 6e5509ad6..0ade11ce9 100644 --- a/tests/core/fem/formats/vtu/test_vtu_write.py +++ b/tests/core/fem/formats/vtu/test_vtu_write.py @@ -2,8 +2,8 @@ from ada.fem.formats.general import FEATypes from ada.fem.formats.vtu.write import write_to_vtu_file -from ada.fem.results.common import ElementInfo, ElementBlock, FemNodes -from ada.fem.shapes.definitions import LineShapes, SolidShapes, ShellShapes +from ada.fem.results.common import ElementBlock, ElementInfo, FemNodes +from ada.fem.shapes.definitions import LineShapes, ShellShapes def test_basic_vtu_write():