diff --git a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test.ipynb b/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test.ipynb index 31b08e9a1..a0dff4edf 100644 --- a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test.ipynb +++ b/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test.ipynb @@ -1,355 +1,470 @@ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Test of Structural Mechanics\n", "We will now test the python interface of teh structural mechanics part.\n", "For that we will use the test `test/test_model/test_structural_mechanics_model/test_structural_mechanics_model_bernoulli_beam_2.cc`, which we will simply reproduce.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error importing pyakantu, try the other one\n" + ] + } + ], + "source": [ + "try:\n", + " import pyakantu as pyaka\n", + "except:\n", + " print(\"Error importing pyakantu, try the other one\")\n", + " import py11_akantu as pyaka\n", + " \n", + "import copy\n", + "import numpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, "outputs": [], "source": [ - "import py11_akantu as pyaka" + "import matplotlib\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating the Mesh" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Create a mesh for the two dimensional case\n", "beam = pyaka.Mesh(2)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now create the connectivity array for the beam." + ] + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "# read in the mesh description\n", - "beam.read(\"_bernoulli_beam_2.msh\", pyaka.MeshIOType._miot_gmsh_struct)" + "beam.addConnectivityType(pyaka._bernoulli_beam_2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Creating the Model" + "We need a `MeshAccessor` in order to change the size of the mesh entities." ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "model = pyaka.StructuralMechanicsModel(beam)" + "beamAcc = pyaka.MeshAccessor(beam)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### Setting up the Modell" + "Now we create the array to store the nodes and the connectivities and give them their size. " ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 6, "metadata": {}, + "outputs": [], "source": [ - "##### Creating and Inserting the Materials" + "beamAcc.resizeConnectivity(2, pyaka._bernoulli_beam_2)\n", + "beamAcc.resizeNodes(3)" ] }, { - "cell_type": "code", - "execution_count": 6, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "mat1 = pyaka.StructuralMaterial()\n", - "mat1.E = 3e10;\n", - "mat1.I = 0.0025;\n", - "mat1.A = 0.01;\n", - "model.addMaterial(mat1)" + "#### Setting the Nodes" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "mat2 = pyaka.StructuralMaterial()\n", - "mat2.E = 3e10;\n", - "mat2.I = 0.00128;\n", - "mat2.A = 0.01;\n", - "model.addMaterial(mat2)" + "Nodes = beam.getNodes()\n", + "Nodes[0, :] = [0., 0.]\n", + "Nodes[1, :] = [1., 0.]\n", + "Nodes[2, :] = [2., 0.]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### Initializing the Model" + "#### Setting the Connections" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "#model.initFull(pyaka.AnalysisMethod._static)\n", - "model.initFull()" + "Conn = beam.getConnectivity(pyaka._bernoulli_beam_2)\n", + "Conn[0, :] = [0, 1]\n", + "Conn[1, :] = [1, 2]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### Assigning the Materials" + "#### Ready\n", + "We have to make the mesh ready." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "beamAcc.makeReady()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating the Model" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ - "materials = model.getElementMaterialMap(pyaka.ElementType._bernoulli_beam_2)" + "model = pyaka.StructuralMechanicsModel(beam)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Setting up the Modell" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Creating and Inserting the Materials" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[1693225798],\n", - " [ 21951]], dtype=uint32)" + "0" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "materials" + "mat1 = pyaka.StructuralMaterial()\n", + "mat1.E = 1e9\n", + "mat1.rho = 1.\n", + "mat1.I = 1.\n", + "mat1.Iz = 1.\n", + "mat1.Iy = 1.\n", + "mat1.A = 1.\n", + "mat1.GJ = 1.\n", + "model.addMaterial(mat1)" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 12, "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "Once we have written to the `materials` variable, everything becomes unstable.\n", - "And the kernel will die." + "mat2 = pyaka.StructuralMaterial()\n", + "mat2.E = 1e9\n", + "mat2.rho = 1.\n", + "mat2.I = 1.\n", + "mat2.Iz = 1.\n", + "mat2.Iy = 1.\n", + "mat2.A = 1.\n", + "mat2.GJ = 1.\n", + "model.addMaterial(mat2)" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "materials[0][0] = 0\n", - "materials[1][0] = 1" + "##### Initializing the Model" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ - "materials" + "model.initFull(pyaka.AnalysisMethod._implicit_dynamic)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "##### Setting Boundaries" + "##### Assigning the Materials" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ - "M = 3600.\n", - "q = -6000.\n", - "L = 10." + "materials = model.getElementMaterialMap(pyaka.ElementType._bernoulli_beam_2)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "forces = model.getExternalForce()\n", - "forces" + "materials[0][0] = 0\n", + "materials[1][0] = 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Setting Boundaries" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# Neumann\n", + "# Apply a force of `10` at the last (right most) node.\n", "forces = model.getExternalForce()\n", - "forces[2, 2] = -M\n", - "forces[0, 1] = q * L / 2\n", - "forces[0, 2] = q * L * L / 12\n", - "forces[1, 1] = q * L / 2\n", - "forces[1, 2] = -q * L * L / 12\n", - "forces" + "forces[:] = 0\n", + "forces[2, 0] = 10." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Dirichlets\n", + "# Block all dofs of the first node, since it is fixed.\n", + "# All other nodes have no restrictions\n", "boundary = model.getBlockedDOFs()\n", "boundary[0, :] = True\n", "boundary[1, :] = False\n", "boundary[2, :] = False\n", - "boundary[2, 1] = True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model.getExternalForce()" + "#boundary[2, 0] = True" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solving the System" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ - "model.solveStep()" + "# Set up the system\n", + "deltaT = 1e-10\n", + "model.setTimeStep(deltaT)\n", + "solver = model.getNonLinearSolver()\n", + "solver.set(\"max_iterations\", 100)\n", + "solver.set(\"threshold\", 1e-8)\n", + "solver.set(\"convergence_type\", pyaka.SolveConvergenceCriteria.solution)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# Perform N time steps.\n", + "# At each step records the displacement of all three nodes in x direction.\n", + "N = 10000 \n", + "disp1 = np.zeros(N)\n", + "disp2 = np.zeros(N)\n", + "disp0 = np.zeros(N)\n", + "times = np.zeros(N)\n", + "\n", + "for i in range(N):\n", + " model.solveStep()\n", + " disp = model.getDisplacement()\n", + " disp0[i] = disp[0, 0]\n", + " disp1[i] = disp[1, 0]\n", + " disp2[i] = disp[2, 0]\n", + " times[i] = deltaT * i" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "disp = model.getDisplacement()" + "plt.plot(times, disp0, color='k', label = \"left node (fix)\")\n", + "plt.plot(times, disp1, color='g', label = \"middle node\")\n", + "plt.plot(times, disp2, color='b', label = \"right node\")\n", + "\n", + "plt.title(\"Displacement in $x$ of the nodes\")\n", + "plt.xlabel(\"Time [S]\")\n", + "plt.ylabel(\"displacement [m]\")\n", + "\n", + "plt.legend()\n", + "\n", + "plt.show()" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "d1 = disp[1, 2]\n", - "d2 = disp[2, 2]\n", - "d3 = disp[1, 0]" + "What I do not understand is, why the middle node goes backwards?\n", + "This gopuld be the bug.\n", + "However an analytical solution must be claculated.\n", + "\n", + "I also think that the influence of the Young's modulus is not clearly visiable.\n", + "But I saw the influence of the density." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "d1, 5.6 / 4800" - ] + "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# " + ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.1" } }, "nbformat": 4, "nbformat_minor": 4 }