.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/LinearizedElasticity/MeshOptim2.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_LinearizedElasticity_MeshOptim2.py: MeshOptim2 ========== Mesh optimization with the ZZ1 criterion for a bending part. .. GENERATED FROM PYTHON SOURCE LINES 12-182 .. tab-set:: .. tab-item:: Static Scene .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_001.png :alt: MeshOptim2 :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_001.png :class: sphx-glr-single-img .. tab-item:: Interactive Scene .. offlineviewer:: /home/docs/checkouts/readthedocs.org/user_builds/easyfea/checkouts/v1.9.2/docs/examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_001.vtksz .. tab-set:: .. tab-item:: Static Scene .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_002.png :alt: MeshOptim2 :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_002.png :class: sphx-glr-single-img .. tab-item:: Interactive Scene .. offlineviewer:: /home/docs/checkouts/readthedocs.org/user_builds/easyfea/checkouts/v1.9.2/docs/examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_002.vtksz .. tab-set:: .. tab-item:: Static Scene .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_003.png :alt: MeshOptim2 :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_003.png :class: sphx-glr-single-img .. tab-item:: Interactive Scene .. offlineviewer:: /home/docs/checkouts/readthedocs.org/user_builds/easyfea/checkouts/v1.9.2/docs/examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_003.vtksz .. tab-set:: .. tab-item:: Static Scene .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_004.png :alt: MeshOptim2 :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_004.png :class: sphx-glr-single-img .. tab-item:: Interactive Scene .. offlineviewer:: /home/docs/checkouts/readthedocs.org/user_builds/easyfea/checkouts/v1.9.2/docs/examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_004.vtksz .. tab-set:: .. tab-item:: Static Scene .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_005.png :alt: MeshOptim2 :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_005.png :class: sphx-glr-single-img .. tab-item:: Interactive Scene .. offlineviewer:: /home/docs/checkouts/readthedocs.org/user_builds/easyfea/checkouts/v1.9.2/docs/examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_005.vtksz .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_006.gif :alt: MeshOptim2 :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_006.gif :class: sphx-glr-single-img .. image-sg:: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_007.png :alt: Summary :srcset: /examples/LinearizedElasticity/images/sphx_glr_MeshOptim2_007.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none error = 90.460 % error = 89.395 % error = 40.885 % error = 21.390 % error = 9.820 % error = 4.721 % error = 1.596 % error = 0.479 % Generate movie 1/8 (12.50 %) 1.03 s Generate movie 2/8 (25.00 %) 766.74 ms Generate movie 3/8 (37.50 %) 620.35 ms Generate movie 4/8 (50.00 %) 502.88 ms Generate movie 5/8 (62.50 %) 384.16 ms Generate movie 6/8 (75.00 %) 265.27 ms Generate movie 7/8 (87.50 %) 144.26 ms Generate movie 8/8 (100.00 %) 0.00 µs | .. code-block:: Python :lineno-start: 13 import matplotlib.pyplot as plt import numpy as np from EasyFEA import ( Display, Folder, Models, Tic, ElemType, Mesh, Simulations, Paraview, PyVista, ) from EasyFEA.Geoms import Point, Points from EasyFEA.FEM import Calc_projector if __name__ == "__main__": Display.Clear() # ---------------------------------------------- # Configuration # ---------------------------------------------- dim = 2 # geom L = 120 h = L * 2 / 3 b = h r = h / (2 + 1e-2) e = (L - 2 * r) / 2 # outputs folder = Folder.Results_Dir() plotProj = False makeMovie = True makeParaview = False # load P = 800 # N lineLoad = P / h # N/mm surfLoad = P / h / b # N/mm2 # criteria threshold = ( 1 / 100 if dim == 2 else 0.04 ) # Target error for the optimization process iterMax = 20 # Maximum number of iterations coef = 1 / 10 # Scaling coefficient for the optimization process # ---------------------------------------------- # Mesh # ---------------------------------------------- if dim == 2: elemType = ElemType.TRI3 else: elemType = ElemType.TETRA4 meshSize = h / 10 pt1 = Point() pt2 = Point(e, 0) pt3 = Point(e, r, r=r) pt4 = Point(L - e, r, r=r) pt5 = Point(L - e, 0) pt6 = Point(L, 0) pt7 = Point(L, h) pt8 = Point(L - e, h) pt9 = Point(L - e, h - r, r=r) pt10 = Point(e, h - r, r=r) pt11 = Point(e, h) pt12 = Point(0, h) points = Points( [pt1, pt2, pt3, pt4, pt5, pt6, pt7, pt8, pt9, pt10, pt11, pt12], meshSize ) inclusions = [] PyVista.Plot_Geoms(points.Get_Contour()).show() def DoMesh(refineGeom=None) -> Mesh: """Function used to generate the mesh.""" if dim == 2: return points.Mesh_2D(inclusions, elemType, [], [refineGeom]) else: return points.Mesh_Extrude( inclusions, [0, 0, b], [], elemType, [], [refineGeom] ) # Construct the initial mesh mesh = DoMesh() PyVista.Plot_Mesh(mesh).show() # ---------------------------------------------- # Material and Simulation # ---------------------------------------------- material = Models.Elastic.Isotropic(dim, E=210000, v=0.3, thickness=b) simu = Simulations.Elastic(mesh, material) simu.rho = 8100 * 1e-9 def DoSimu(refineGeom: str): simu.mesh = DoMesh(refineGeom) # get the nodes nodes_Fixed = simu.mesh.Nodes_Conditions(lambda x, y, z: x == 0) nodes_Load = simu.mesh.Nodes_Conditions(lambda x, y, z: x == L) # do the simulation simu.Bc_Init() simu.add_dirichlet( nodes_Fixed, [0] * dim, simu.Get_unknowns(), description="Fixed" ) simu.add_surfLoad(nodes_Load, [-surfLoad], ["y"]) simu.Solve() simu.Save_Iter() return simu simu = Simulations.Mesh_Optim_ZZ1(DoSimu, folder, threshold, iterMax, 1 / 10) PyVista.Plot_BoundaryConditions(simu).show() # ---------------------------------------------- # Results # ---------------------------------------------- PyVista.Plot_Mesh(simu.mesh).show() PyVista.Plot(simu, "ZZ1_e", nodeValues=False, nColors=11).show() if plotProj: simu.Set_Iter(0) mesh0 = simu.mesh u0 = np.reshape(simu.displacement, (mesh0.Nn, -1)) simu.Set_Iter(1) mesh1 = simu.mesh proj = Calc_projector(mesh0, mesh1) uProj = np.zeros((mesh1.Nn, dim), dtype=float) for d in range(dim): uProj[:, d] = proj @ u0[:, d] ax = Display.Plot_Result( mesh0, np.linalg.norm(u0, axis=1), plotMesh=True, title="u0" ) ax.plot(*mesh1.coord[:, :dim].T, ls="", marker="+", c="k", label="new nodes") ax.legend() Display.Plot_Result( mesh1, np.linalg.norm(uProj, axis=1), plotMesh=True, title="uProj" ) if makeParaview: Paraview.Save_simu(simu, folder, nodeFields=["ZZ1_e"]) if makeMovie: def func(plotter, n): simu.Set_Iter(n) PyVista.Plot_Mesh(simu, plotter=plotter) zz1 = simu._Calc_ZZ1()[0] plotter.add_title(f"ZZ1 = {zz1 * 100:.2f} %") PyVista.Movie_func(func, len(simu.results), folder, "lmt.gif") Tic.Plot_History() plt.show() .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 7.435 seconds) .. _sphx_glr_download_examples_LinearizedElasticity_MeshOptim2.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: MeshOptim2.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: MeshOptim2.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: MeshOptim2.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_