diff --git a/examples/python/CMakeLists.txt b/examples/python/CMakeLists.txt index 343e776e5..8f5758fd4 100644 --- a/examples/python/CMakeLists.txt +++ b/examples/python/CMakeLists.txt @@ -1,9 +1,10 @@ add_subdirectory(custom-material) add_subdirectory(dynamics) add_subdirectory(eigen_modes) add_subdirectory(plate-hole) add_subdirectory(stiffness_matrix) +add_subdirectory(structural_mechanics) package_add_files_to_package( examples/python/README.rst ) diff --git a/examples/python/structural_mechanics/CMakeLists.txt b/examples/python/structural_mechanics/CMakeLists.txt new file mode 100644 index 000000000..f8a6b2751 --- /dev/null +++ b/examples/python/structural_mechanics/CMakeLists.txt @@ -0,0 +1,14 @@ +register_example(structural_mechanics.py + SCRIPT structural_mechanics.py + PYTHON + ) + +register_example(structural_mechanics_softening.py + SCRIPT structural_mechanics.py + PYTHON + ) + +register_example(structural_mechanics_dynamics.py + SCRIPT structural_mechanics.py + PYTHON + ) diff --git a/examples/python/structural_mechanics/structural_mechanics.py b/examples/python/structural_mechanics/structural_mechanics.py new file mode 100644 index 000000000..8599a50a0 --- /dev/null +++ b/examples/python/structural_mechanics/structural_mechanics.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python +# coding: utf-8 + +# # Test of Structural Mechanics +# In this example a beam, consisting of two elements, three nodes, is created. +# The left most node is fixed and a force is applied at the right most node. +import akantu as aka +import numpy +import matplotlib.pyplot as plt +import numpy as np + +# ### Creating the Mesh +# Create a mesh for the two dimensional case +beam = aka.Mesh(2) + +# We now create the connectivity array for the beam. +beam.addConnectivity(aka._bernoulli_beam_2) + +# We need a `MeshAccessor` in order to change the size of the mesh entities. +beamAcc = aka.MeshAccessor(beam) + +# Now we create the array to store the nodes and the connectivities and give them their size. +beamAcc.resizeConnectivity(2, aka._bernoulli_beam_2) +beamAcc.resizeNodes(3) + +Nodes = beam.getNodes() +Nodes[0, :] = [0., 0.] +Nodes[1, :] = [1., 0.] +Nodes[2, :] = [2., 0.] + +# #### Setting the Connections +Conn = beam.getConnectivity(aka._bernoulli_beam_2) +Conn[0, :] = [0, 1] +Conn[1, :] = [1, 2] + +# #### Ready +# We have to make the mesh ready. +beamAcc.makeReady() + + +# ### Creating the Model +model = aka.StructuralMechanicsModel(beam) + +# #### Setting up the Modell +# ##### Creating and Inserting the Materials +mat1 = aka.StructuralMaterial() +mat1.E = 1e9 +mat1.rho = 1. +mat1.I = 1. +mat1.Iz = 1. +mat1.Iy = 1. +mat1.A = 1. +mat1.GJ = 1. +model.addMaterial(mat1) + +mat2 = aka.StructuralMaterial() +mat2.E = 1e9 +mat2.rho = 1. +mat2.I = 1. +mat2.Iz = 1. +mat2.Iy = 1. +mat2.A = 1. +mat2.GJ = 1. +model.addMaterial(mat2) + +# ##### Initializing the Model +model.initFull(aka._implicit_dynamic) + +# ##### Assigning the Materials +materials = model.getElementMaterial(aka._bernoulli_beam_2) +materials[0][0] = 0 +materials[1][0] = 1 + +# ##### Setting Boundaries + +# Neumann +# Apply a force of `10` at the last (right most) node. +forces = model.getExternalForce() +forces[:] = 0 +forces[2, 0] = 100. + +# Dirichlets +# Block all dofs of the first node, since it is fixed. +# All other nodes have no restrictions +boundary = model.getBlockedDOFs() +boundary[0, :] = True +boundary[1, :] = False +boundary[2, :] = False + +# ### Solving the System + +# Set up the system +deltaT = 1e-10 +model.setTimeStep(deltaT) +solver = model.getNonLinearSolver() +solver.set("max_iterations", 100) +solver.set("threshold", 1e-8) +solver.set("convergence_type", aka.SolveConvergenceCriteria.solution) + +# Perform N time steps. +# At each step records the displacement of all three nodes in x direction. +N = 1000000 + +disp1 = np.zeros(N) +disp2 = np.zeros(N) +disp0 = np.zeros(N) +times = np.zeros(N) + +for i in range(N): + model.solveStep() + disp = model.getDisplacement() + disp0[i] = disp[0, 0] + disp1[i] = disp[1, 0] + disp2[i] = disp[2, 0] + times[i] = deltaT * i + +disps = [disp0, disp1, disp2] +maxMin = [-1.0, 1.0] + +for d in disps: + maxMin[0] = max(np.max(d), maxMin[0]) + maxMin[1] = min(np.min(d), maxMin[1]) + +plt.plot(disp1, times, color='g', label = "middle node") +plt.plot(disp2, times, color='b', label = "right node") + +plt.title("Displacement in $x$ of the nodes") +plt.ylabel("Time [S]") +plt.xlabel("displacement [m]") + +plt.xlim((maxMin[1] * 1.3, maxMin[0] * 1.1)) + +plt.legend() + +plt.show() diff --git a/examples/python/structural_mechanics/structural_mechanics_dynamics.py b/examples/python/structural_mechanics/structural_mechanics_dynamics.py new file mode 100644 index 000000000..b3d7cf850 --- /dev/null +++ b/examples/python/structural_mechanics/structural_mechanics_dynamics.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python +# coding: utf-8 + +import akantu as aka +import numpy +import matplotlib.pyplot as plt +import numpy as np + +# ### Creating the Mesh +# Create a mesh for the two dimensional case +el_type = aka._bernoulli_beam_2 +beam = aka.Mesh(2) + +# We now create the connectivity array for the beam. +beam.addConnectivityType(el_type) + +# We need a `MeshAccessor` in order to change the size of the mesh entities. +beamAcc = aka.MeshAccessor(beam) + +# Now we create the array to store the nodes and the connectivities and give them their size. +nb_elem = 40 +L = 2 +beamAcc.resizeConnectivity(nb_elem, el_type) +beamAcc.resizeNodes(nb_elem + 1) + +# #### Setting the Nodes +Nodes = beam.getNodes() +length = L / nb_elem +Nodes[:, :] = 0. +Nodes[:, 0] = np.arange(nb_elem+1) * length + +# #### Setting the Connections +Conn = beam.getConnectivity(el_type) + +for e in range(nb_elem): + Conn[e, :] = [e, e + 1] + +# #### Ready +# We have to make the mesh ready. +beamAcc.makeReady() + +# ### Creating the Model +model = aka.StructuralMechanicsModel(beam) + +if el_type == aka._bernoulli_beam_3: + normal = beam.getDataReal("extra_normal", el_type) + + for e in range(nb_elem): + normal[e, :] = [0, 0, 1] + +# #### Setting up the Modell +# ##### Creating and Inserting the Materials +mat1 = aka.StructuralMaterial() +mat1.E = 1e9 +mat1.rho = 10. +mat1.I = 1. +mat1.Iz = 1. +mat1.Iy = 1. +mat1.A = 1. +mat1.GJ = 1. +model.addMaterial(mat1, 'mat1') + +# ##### Initializing the Model +model.initFull(aka.AnalysisMethod._implicit_dynamic) + +# ##### Assigning the Materials +materials = model.getElementMaterial(el_type) +materials[:, :] = 0 + +# ##### Setting Boundaries +# Neumann +F = 1e4 +no_print = int(nb_elem / 2) + +# Apply a force of `10` at the last (right most) node. +forces = model.getExternalForce() +forces[:, :] = 0 +forces[no_print, 1] = F + +# Dirichlets +# Block all dofs of the first node, since it is fixed. +# All other nodes have no restrictions +boundary = model.getBlockedDOFs() +boundary[:, :] = False + +boundary[0, 0] = True +boundary[0, 1] = True + +if el_type == aka._bernoulli_beam_3: + boundary[0, 2] = True + +boundary[nb_elem, 1] = True + +# ### Solving the System +# Set up the system +deltaT = 1e-6 +model.setTimeStep(deltaT) +solver = model.getNonLinearSolver() +solver.set("max_iterations", 100) +solver.set("threshold", 1e-8) +solver.set("convergence_type", aka.SolveConvergenceCriteria.solution) + +model.assembleMatrix("M") +M_ = model.getDOFManager().getMatrix("M") +M = aka.AkantuSparseMatrix(M_) + +model.assembleMatrix("K") +K_ = model.getDOFManager().getMatrix("K") +K = aka.AkantuSparseMatrix(K_) + +C_ = model.getDOFManager().getMatrix("C") +C_.add(M_, 0.00001) +C_.add(K_, 0.00001) + +def analytical_solution(time, L, rho, E, A, I, F): + omega = np.pi**2 / L**2 * np.sqrt(E * I / rho) + sum = 0. + N = 110 + for n in range(1, N, 2): + sum += (1. - np.cos(n * n * omega * time)) / n**4 + + return 2. * F * L**3 / np.pi**4 / E / I * sum + +# Perform N time steps. +# At each step records the displacement of all three nodes in x direction. +N = 900 + +mat1 = model.getMaterial('mat1') + +disp = model.getDisplacement() +velo = model.getVelocity() +disp[:, :] = 0. + +displs = np.zeros(N) + +ekin = np.zeros(N) +epot = np.zeros(N) +ework = np.zeros(N) +_ework = 0. + +for i in range(1, N): + model.solveStep() + displs[i] = disp[no_print, 1] + + _ework += F * velo[no_print, 1] * deltaT + + ekin[i] = model.getEnergy("kinetic") + epot[i] = model.getEnergy("potential") + ework[i] = _ework + + +def sol(x): + return analytical_solution(x, L, mat1.rho, mat1.E, + mat1.A, mat1.I, F) + + +times = np.arange(N) * deltaT +plt.plot(times, sol(times)) +plt.plot(times, displs) +plt.plot(times, displs - sol(times)) + +# What I do not fully understand is why the middle node first go backwards until it goes forward. +# I could imagine that there is some vibration, because everything is in rest. +np.max(displs - sol(times)) +plt.plot(times, ekin+epot) +plt.plot(times, ework) diff --git a/examples/python/structural_mechanics/structural_mechanics_softening.py b/examples/python/structural_mechanics/structural_mechanics_softening.py new file mode 100644 index 000000000..b196c8a71 --- /dev/null +++ b/examples/python/structural_mechanics/structural_mechanics_softening.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python +# coding: utf-8 + +# # Test of Structural Mechanics +# In this test there is a beam consisting of three parts, all have the same materials. +# The left most node is fixed. +# On the right most node a force is applied in x direction. +# +# After a certain time, the material of the middle _element_ is waekened, lower Young's modulus. +# In each step the modulus is lowered by a coinstant factor. + +import akantu as aka +import numpy +import matplotlib.pyplot as plt +import numpy as np + + +# ### Creating the Mesh +# Create a mesh for the two dimensional case +beam = aka.Mesh(2) + +# We now create the connectivity array for the beam. +beam.addConnectivityType(aka._bernoulli_beam_2) + +# We need a `MeshAccessor` in order to change the size of the mesh entities. +beamAcc = aka.MeshAccessor(beam) + +# Now we create the array to store the nodes and the connectivities and give them their size. +beamAcc.resizeConnectivity(3, aka._bernoulli_beam_2) +beamAcc.resizeNodes(4) + +# #### Setting the Nodes +Nodes = beam.getNodes() +Nodes[0, :] = [0., 0.] +Nodes[1, :] = [1., 0.] +Nodes[2, :] = [2., 0.] +Nodes[3, :] = [3., 0.] + + +# #### Setting the Connections +Conn = beam.getConnectivity(aka._bernoulli_beam_2) +Conn[0, :] = [0, 1] +Conn[1, :] = [1, 2] +Conn[2, :] = [2, 3] + +#### Ready +# We have to make the mesh ready. +beamAcc.makeReady() + +# ### Creating the Model +model = aka.StructuralMechanicsModel(beam) + +# #### Setting up the Modell +# ##### Creating and Inserting the Materials +mat1 = aka.StructuralMaterial() +mat1.E = 1e9 +mat1.rho = 1. +mat1.I = 1. +mat1.Iz = 1. +mat1.Iy = 1. +mat1.A = 1. +mat1.GJ = 1. +mat1ID = model.addMaterial(mat1, 'mat1') + +mat2 = aka.StructuralMaterial() +mat2.E = 1e9 +mat2.rho = 1. +mat2.I = 1. +mat2.Iz = 1. +mat2.Iy = 1. +mat2.A = 1. +mat2.GJ = 1. +mat2ID = model.addMaterial(mat2, 'mat2') + +mat3 = aka.StructuralMaterial() +mat3.E = mat2.E / 100000 +mat3.rho = 1. +mat3.I = 1. +mat3.Iz = 1. +mat3.Iy = 1. +mat3.A = mat2.A / 100 +mat3.GJ = 1. +mat3ID = model.addMaterial(mat3, 'mat3') + +# ##### Initializing the Model +model.initFull(aka.AnalysisMethod._implicit_dynamic) + +# ##### Assigning the Materials +materials = model.getElementMaterial(aka._bernoulli_beam_2) + +materials[0][0] = mat1ID +materials[1][0] = mat2ID +materials[2][0] = mat1ID + + +# ##### Setting Boundaries +# Neumann +# Apply a force of `10` at the last (right most) node. +forces = model.getExternalForce() +forces[:] = 0 +forces[2, 0] = 100. + +# Dirichlets +# Block all dofs of the first node, since it is fixed. +# All other nodes have no restrictions +boundary = model.getBlockedDOFs() +boundary[0, :] = True +boundary[1, :] = False +boundary[2, :] = False +boundary[3, :] = False + +# ### Solving the System +# Set up the system +deltaT = 1e-9 +model.setTimeStep(deltaT) +solver = model.getNonLinearSolver() +solver.set("max_iterations", 100) +solver.set("threshold", 1e-8) +solver.set("convergence_type", aka.SolveConvergenceCriteria.solution) + +# Perform N time steps. +# At each step records the displacement of all three nodes in x direction. +N = 10000 * 60 + +disp0 = np.zeros(N) +disp1 = np.zeros(N) +disp2 = np.zeros(N) +disp3 = np.zeros(N) +times = np.zeros(N) +switchT = None +switchEnd = None + +softDuration = 1000 +SoftStart = (N // 2) - softDuration // 2 +SoftEnd = SoftStart + softDuration +if(softDuration > 0): + softFactor = (model.getMaterial('mat3ID').E / model.getMaterial('mat2ID').E) ** (1.0 / softDuration) + +mat2 = model.getMaterial('mat2') + +for i in range(N): + times[i] = deltaT * i + + if((SoftStart <= i <= SoftEnd) and (softDuration > 0)): + if switchT is None: + switchT = times[i] + elif(i == SoftEnd): + switchEnd = times[i] + # + mat2.E *= softFactor + # + + model.solveStep() + disp = model.getDisplacement() + disp0[i] = disp[0, 0] + disp1[i] = disp[1, 0] + disp2[i] = disp[2, 0] + disp3[i] = disp[3, 0] + +disps = [disp0, disp1, disp2, disp3] +maxMin = [-1.0, 1.0] + +for d in disps: + maxMin[0] = max(np.max(d), maxMin[0]) + maxMin[1] = min(np.min(d), maxMin[1]) + +#plt.plot(disp0, times, color='k', label = "left node (fix)") +plt.plot(disp1, times, color='g', label = "middle, left node") +plt.plot(disp2, times, color='g', linestyle = '--', label = "middle, right node") +plt.plot(disp3, times, color='b', label = "right node") + +if(softDuration > 0): + plt.plot((maxMin[1], maxMin[0]), (switchT, switchT),) + plt.plot((maxMin[1], maxMin[0]), (switchEnd, switchEnd), ) + +plt.title("Displacement in $x$ of the nodes") +plt.ylabel("Time [S]") +plt.xlabel("displacement [m]") +plt.xlim((maxMin[1] * 1.3, maxMin[0] * 1.1)) +plt.legend() +plt.show() + +# If the softening is disabled, then the displacement looks wierd. +# Because the displacement first increases and then decreases. +# In this case `softDuration > 0` holds. +# +# However if the softening is enabled, it looks rather good. +# The left middle node will start to vibrate, because it is not pulled in the other direction. diff --git a/examples/structural_mechanics/python_interface/.gitignore b/examples/structural_mechanics/python_interface/.gitignore deleted file mode 100644 index 848ba680f..000000000 --- a/examples/structural_mechanics/python_interface/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -.ipynb_checkpoints -*.so diff --git a/examples/structural_mechanics/python_interface/_bernoulli_beam_2.msh b/examples/structural_mechanics/python_interface/_bernoulli_beam_2.msh deleted file mode 100644 index f2cd27e88..000000000 --- a/examples/structural_mechanics/python_interface/_bernoulli_beam_2.msh +++ /dev/null @@ -1,14 +0,0 @@ -$MeshFormat -2.2 0 8 -$EndMeshFormat -$Nodes -3 -1 0 0 0 -2 10 0 0 -3 18 0 0 -$EndNodes -$Elements -2 -1 1 2 0 1 1 2 -2 1 2 0 1 2 3 -$EndElements diff --git a/examples/structural_mechanics/python_interface/structural_mechanics.py b/examples/structural_mechanics/python_interface/structural_mechanics.py deleted file mode 100644 index e7a70d071..000000000 --- a/examples/structural_mechanics/python_interface/structural_mechanics.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# # Test of Structural Mechanics -# We will now test the python interface of teh structural mechanics part. -# 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. -import py11_akantu as aka - -# Creating the Mesh - -# Create a mesh for the two dimensional case -beam = aka.Mesh(2) - -# read in the mesh description -beam.read("_bernoulli_beam_2.msh", aka.MeshIOType._miot_gmsh_struct) - -# Creating the Model -model = aka.StructuralMechanicsModel(beam) - -# Setting up the Model - -# Creating and Inserting the Materials -mat1 = aka.StructuralMaterial() -mat1.E = 3e10 -mat1.I = 0.0025 -mat1.A = 0.01 -model.addMaterial(mat1) - -mat2 = aka.StructuralMaterial() -mat2.E = 3e10 -mat2.I = 0.00128 -mat2.A = 0.01 -model.addMaterial(mat2) - -# Initializing the Model -# model.initFull(analysis_method = aka.AnalysisMethod._static) -model.initFull() - -# Assigning the Materials -materials = model.getElementMaterialMap(aka.ElementType._bernoulli_beam_2) - -print(hex(materials.ctypes.data)) - -# Once we have written to the `materials` variable, everything becomes unstable. -# And the kernel will die. -materials[0][0] = 0 -materials[1][0] = 1 - -print(materials) - - -# Setting Boundaries -M = 3600. -q = -6000. -L = 10. - -forces = model.getExternalForce() -print(forces) - -# Neumann -forces[2, 2] = -M -forces[0, 1] = q * L / 2 -forces[0, 2] = q * L * L / 12 -forces[1, 1] = q * L / 2 -forces[1, 2] = -q * L * L / 12 -print(forces) - -# Dirichlets -boundary = model.getBlockedDOFs() -boundary[0, :] = True -boundary[1, :] = False -boundary[2, :] = False -boundary[2, 1] = True - -print(model.getExternalForce()) - -model.solveStep() - -disp = model.getDisplacement() -d1 = disp[1, 2] -d2 = disp[2, 2] -d3 = disp[1, 0] - -print(d1, 5.6 / 4800) diff --git a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_3D.ipynb b/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_3D.ipynb deleted file mode 100644 index 1a454f0ab..000000000 --- a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_3D.ipynb +++ /dev/null @@ -1,592 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test of Structural Mechanics (3D)\n", - "This notebook is based on the `test2`, in fact it is the same as that, however this time it is done in 3D.\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 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": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a mesh for the 2 dimensional case\n", - "beam = pyaka.Mesh(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now create the connectivity array for the beam." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "beam.addConnectivityType(pyaka._bernoulli_beam_3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a `MeshAccessor` in order to change the size of the mesh entities." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc = pyaka.MeshAccessor(beam)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we create the array to store the nodes and the connectivities and give them their size. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc.resizeConnectivity(3, pyaka._bernoulli_beam_3)\n", - "beamAcc.resizeNodes(4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "Nodes = beam.getNodes()\n", - "Nodes[0, :] = [0., 0., 0.]\n", - "Nodes[1, :] = [1., 0., 0.]\n", - "Nodes[2, :] = [2., 0., 0.]\n", - "Nodes[3, :] = [3., 0., 0.]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Connections" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "Conn = beam.getConnectivity(pyaka._bernoulli_beam_3)\n", - "Conn[0, :] = [0, 1]\n", - "Conn[1, :] = [1, 2]\n", - "Conn[2, :] = [2, 3]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Ready\n", - "We have to make the mesh ready." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc.makeReady()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Extra Normals" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We first test if the extra normals are here, however we expect them to be missing." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "As we have expected the 'extra_normal' are not present.\n" - ] - } - ], - "source": [ - "if(beam.hasExtraNormal(pyaka._bernoulli_beam_3)):\n", - " print(\"The 'extra_normal' are pressent, which is kind of strange\")\n", - "else:\n", - " print(\"As we have expected the 'extra_normal' are not present.\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - " We will now create them, fpr the Bernoulli Beam in 3 dimensions.\n", - " Note that they are only needed in three dimensions and not if the problem is in two dimensions." - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "eNorm = beam.makeExtraNormal(pyaka._bernoulli_beam_3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now setting the extra normals.\n", - "\n", - "The format of the normals are a bit special.\n", - "Each element need one to compute a basis at its tip.\n", - "Thus the requirement is, that during the computation the `extra_normal`, that is associated to an element, must never become parallel to the connection vector connecting the two nodes marking the ends of the element.\n", - "\n", - "Thus using the vector $\\vec{n} = \\left(1.0,\\, 0.0,\\, 0.0\\right)$, is an error, since it is parallel to the connection vector.\n", - "Another choice would be $\\vec{n} = \\left(0.0,\\, 0.0,\\, 1.0\\right)$ or any other.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "for i in range(eNorm.shape[0]):\n", - " eNorm[i, :] = [0.0, 0.0, 1.0]" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[0., 0., 1.],\n", - " [0., 0., 1.],\n", - " [0., 0., 1.]])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "beam.makeExtraNormal(pyaka._bernoulli_beam_3)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "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": 15, - "metadata": {}, - "outputs": [], - "source": [ - "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", - "mat1ID = model.addMaterial(mat1)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "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", - "mat2ID = model.addMaterial(mat2)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "mat3 = pyaka.StructuralMaterial()\n", - "mat3.E = mat2.E / 100000\n", - "mat3.rho = 1.\n", - "mat3.I = 1.\n", - "mat3.Iz = 1.\n", - "mat3.Iy = 1.\n", - "mat3.A = mat2.A / 100\n", - "mat3.GJ = 1.\n", - "mat3ID = model.addMaterial(mat3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Initializing the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "model.initFull(pyaka.AnalysisMethod._implicit_dynamic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Assigning the Materials" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "materials = model.getElementMaterialMap(pyaka.ElementType._bernoulli_beam_3)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "materials[0][0] = mat2ID\n", - "materials[1][0] = mat2ID\n", - "materials[2][0] = mat2ID" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Setting Boundaries" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "# Neumann\n", - "# Apply a force of `10` at the last (right most) node.\n", - "forces = model.getExternalForce()\n", - "forces[:] = 0\n", - "forces[2, 0] = 100." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "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[3, :] = False\n", - "#boundary[2, 0] = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the System" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "# Set up the system\n", - "deltaT = 1e-9\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": 24, - "metadata": {}, - "outputs": [], - "source": [ - "# Perform N time steps.\n", - "# At each step records the displacement of all three nodes in x direction.\n", - "N = 10000 * 60\n", - "\n", - "disp0 = np.zeros(N)\n", - "disp1 = np.zeros(N)\n", - "disp2 = np.zeros(N)\n", - "disp3 = np.zeros(N)\n", - "times = np.zeros(N)\n", - "switchT = None\n", - "switchEnd = None\n", - "\n", - "softDuration = 1000\n", - "SoftStart = (N // 2) - softDuration // 2\n", - "SoftEnd = SoftStart + softDuration\n", - "if(softDuration > 0):\n", - " softFactor = (model.getMaterialByID(mat3ID).E / model.getMaterialByID(mat2ID).E ) ** (1.0 / softDuration)\n", - "\n", - "\n", - "\n", - "for i in range(N):\n", - " times[i] = deltaT * i\n", - " \n", - " if((SoftStart <= i <= SoftEnd) and (softDuration > 0)):\n", - " if switchT is None:\n", - " switchT = times[i]\n", - " elif(i == SoftEnd):\n", - " switchEnd = times[i]\n", - " #\n", - " mat2.E *= softFactor\n", - " newMat = model.addMaterial(mat2)\n", - " materials[1][0] = newMat\n", - " #\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", - " disp3[i] = disp[3, 0]\n", - "\n", - "disps = [disp0, disp1, disp2, disp3]\n", - "maxMin = [-1.0, 1.0]\n", - "\n", - "for d in disps:\n", - " maxMin[0] = max(np.max(d), maxMin[0])\n", - " maxMin[1] = min(np.min(d), maxMin[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#plt.plot(disp0, times, color='k', label = \"left node (fix)\")\n", - "plt.plot(disp1, times, color='g', label = \"middle, left node\")\n", - "plt.plot(disp2, times, color='g', linestyle = '--', label = \"middle, right node\")\n", - "plt.plot(disp3, times, color='b', label = \"right node\")\n", - "\n", - "if(softDuration > 0):\n", - " plt.plot((maxMin[1], maxMin[0]), (switchT, switchT),)\n", - " plt.plot((maxMin[1], maxMin[0]), (switchEnd, switchEnd), )\n", - "\n", - "plt.title(\"Displacement in $x$ of the nodes\")\n", - "plt.ylabel(\"Time [S]\")\n", - "plt.xlabel(\"displacement [m]\")\n", - "\n", - "plt.xlim((maxMin[1] * 1.3, maxMin[0] * 1.1))\n", - "\n", - "plt.legend()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the softening is disabled, then the displacement looks wierd.\n", - "Because the displacement first increases and then decreases.\n", - "In this case `softDuration > 0` holds.\n", - "\n", - "However if the softening is enabled, it looks rather good.\n", - "The left middle node will start to vibrate, because it is not pulled in the other direction.\n", - "\n", - "\n" - ] - } - ], - "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 -} 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 deleted file mode 100644 index b21bbc5e2..000000000 --- a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test.ipynb +++ /dev/null @@ -1,463 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test of Structural Mechanics\n", - "In this example a beam, consisting of two elements, three nodes, is created.\n", - "The left most node is fixed and a force is applied at the right most node.\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 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": 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": 4, - "metadata": {}, - "outputs": [], - "source": [ - "beam.addConnectivityType(pyaka._bernoulli_beam_2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a `MeshAccessor` in order to change the size of the mesh entities." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc = pyaka.MeshAccessor(beam)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we create the array to store the nodes and the connectivities and give them their size. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc.resizeConnectivity(2, pyaka._bernoulli_beam_2)\n", - "beamAcc.resizeNodes(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "Nodes = beam.getNodes()\n", - "Nodes[0, :] = [0., 0.]\n", - "Nodes[1, :] = [1., 0.]\n", - "Nodes[2, :] = [2., 0.]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Connections" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "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": [ - "#### 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": [ - "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": [ - "0" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "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": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "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": "markdown", - "metadata": {}, - "source": [ - "##### Initializing the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "model.initFull(pyaka.AnalysisMethod._implicit_dynamic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Assigning the Materials" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "materials = model.getElementMaterialMap(pyaka.ElementType._bernoulli_beam_2)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "materials[0][0] = 0\n", - "materials[1][0] = 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Setting Boundaries" - ] - }, - { - "cell_type": "code", - "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[:] = 0\n", - "forces[2, 0] = 100." - ] - }, - { - "cell_type": "code", - "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, 0] = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the System" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# 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": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Perform N time steps.\n", - "# At each step records the displacement of all three nodes in x direction.\n", - "N = 1000000\n", - "\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", - " \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\n", - " \n", - "disps = [disp0, disp1, disp2]\n", - "maxMin = [-1.0, 1.0]\n", - "\n", - "for d in disps:\n", - " maxMin[0] = max(np.max(d), maxMin[0])\n", - " maxMin[1] = min(np.min(d), maxMin[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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sfmAjPHB2n1rOR533BJQLrR3L7zzDrz7Lvz5J1xzjetefcMNOfM0W2osARnjg2W7lgFQ7wJLQLlFdDQMHepGqT5xAm65BZ54AnL4vdapsgRkjA+sA0LuoAqLF7tRC774AvLmhe7d3f08Vav6HZ3/clmDL+e54YYb+Ouvv1Itk9J0BytWrGD69LMGm8gUiQdENWezDgg528mT8Omn0LAhXHUVzJwJTz0F27bBqFGWfE6xT3+YUlUSEhKYPn06xYsXT9c2QpmATMriEuJY+cdKu/6TA+3d68Zmq1gR7rwTDh9213diYuCVV+D88/2OMHuxBBRGtm7dyuWXX84DDzxA3bp12bFjB5UqVWL//v0ADBw4kGrVqnHdddfRtWtXhgwZcrru5MmTz5gu4eTJkzz//PNMnDiR2rVrM3HixDP2NWbMGDp27Mj1119PlSpVePLJJ0+v++yzz6hZsyZXXHHF6cFNAT766CMuu+wymjZtyqJFi04v37dvH7feeiv169enfv36Z6zLjdbtW8exuGOWgHKQX391oxVceCEMGOBGKvjuO3cPz/33QwrzQOZ6dg0onR59FFasyNxt1q7tumWmZv369Xz00Ue89957ZyyPioriiy++4NdffyUuLo66detSr97/vuCSmy7hpZdeIioqiuHDhye7rxUrVvDrr79SoEABqlatykMPPURERARPPfUUy5Yto0SJErRu3ZopU6bQsGFDBgwYwLJlyyhWrBjNmzenjjdeyCOPPELfvn25+uqr2b59O23atGHdunUZOVRhbdlu64CQE8TFwddfw9tvw48/QuHC8K9/wUMP2Sm2YFkCCjMVK1akUaNGZy1fuHAh7du3p5A3JvvNN998xvrkpksIpGXLlhQrVgyA6tWrs23bNg4cOECzZs04NWPsHXfcwYIFCwDOWN65c+fTA4nOnj2btWvXnt7u33//zeHDhylatGiwbztHWbbLOiCEsz/+gA8+cNdytm93c/G88Qb07AnpPBuea1kCSqdALZVQKVy4cLLLA43pl9x0CYEknvrhVL20TrEAkJCQwM8//3w6OeZ2y3Yvo875dawDQhhRdTOPjhgBU6a41k+rVq71c/PNueOm0VCwv4Ac4uqrr+abb77h+PHjHDlyhG+//TZgnaJFi3L48OE07adhw4bMnz+f/fv3Ex8fz2effUbTpk1p2LAh8+bN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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#plt.plot(disp0, times, color='k', label = \"left node (fix)\")\n", - "plt.plot(disp1, times, color='g', label = \"middle node\")\n", - "plt.plot(disp2, times, color='b', label = \"right node\")\n", - "\n", - "plt.title(\"Displacement in $x$ of the nodes\")\n", - "plt.ylabel(\"Time [S]\")\n", - "plt.xlabel(\"displacement [m]\")\n", - "\n", - "plt.xlim((maxMin[1] * 1.3, maxMin[0] * 1.1))\n", - "\n", - "plt.legend()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What I do not fully understand is why the middle node first go backwards until it goes forward.\n", - "I could imagine that there is some vibration, because everything is in rest." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "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 -} diff --git a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test2.ipynb b/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test2.ipynb deleted file mode 100644 index da0b40095..000000000 --- a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test2.ipynb +++ /dev/null @@ -1,493 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test of Structural Mechanics\n", - "In this test there is a beam consisting of three parts, all have the same materials.\n", - "The left most node is fixed.\n", - "On the right most node a force is applied in x direction.\n", - "\n", - "After a certain time, the material of the middle _element_ is waekened, lower Young's modulus.\n", - "In each step the modulus is lowered by a coinstant factor.\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 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": 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": 4, - "metadata": {}, - "outputs": [], - "source": [ - "beam.addConnectivityType(pyaka._bernoulli_beam_2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a `MeshAccessor` in order to change the size of the mesh entities." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc = pyaka.MeshAccessor(beam)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we create the array to store the nodes and the connectivities and give them their size. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc.resizeConnectivity(3, pyaka._bernoulli_beam_2)\n", - "beamAcc.resizeNodes(4)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "Nodes = beam.getNodes()\n", - "Nodes[0, :] = [0., 0.]\n", - "Nodes[1, :] = [1., 0.]\n", - "Nodes[2, :] = [2., 0.]\n", - "Nodes[3, :] = [3., 0.]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Connections" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "Conn = beam.getConnectivity(pyaka._bernoulli_beam_2)\n", - "Conn[0, :] = [0, 1]\n", - "Conn[1, :] = [1, 2]\n", - "Conn[2, :] = [2, 3]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 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": [ - "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": [], - "source": [ - "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", - "mat1ID = model.addMaterial(mat1)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "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", - "mat2ID = model.addMaterial(mat2)" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "mat3 = pyaka.StructuralMaterial()\n", - "mat3.E = mat2.E / 100000\n", - "mat3.rho = 1.\n", - "mat3.I = 1.\n", - "mat3.Iz = 1.\n", - "mat3.Iy = 1.\n", - "mat3.A = mat2.A / 100\n", - "mat3.GJ = 1.\n", - "mat3ID = model.addMaterial(mat3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Initializing the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "model.initFull(pyaka.AnalysisMethod._implicit_dynamic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Assigning the Materials" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "materials = model.getElementMaterialMap(pyaka.ElementType._bernoulli_beam_2)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "materials[0][0] = mat2ID\n", - "materials[1][0] = mat2ID\n", - "materials[2][0] = mat2ID" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Setting Boundaries" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "# Neumann\n", - "# Apply a force of `10` at the last (right most) node.\n", - "forces = model.getExternalForce()\n", - "forces[:] = 0\n", - "forces[2, 0] = 100." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "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[3, :] = False\n", - "#boundary[2, 0] = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the System" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Set up the system\n", - "deltaT = 1e-9\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": 20, - "metadata": {}, - "outputs": [], - "source": [ - "# Perform N time steps.\n", - "# At each step records the displacement of all three nodes in x direction.\n", - "N = 10000 * 60\n", - "\n", - "disp0 = np.zeros(N)\n", - "disp1 = np.zeros(N)\n", - "disp2 = np.zeros(N)\n", - "disp3 = np.zeros(N)\n", - "times = np.zeros(N)\n", - "switchT = None\n", - "switchEnd = None\n", - "\n", - "softDuration = 1000\n", - "SoftStart = (N // 2) - softDuration // 2\n", - "SoftEnd = SoftStart + softDuration\n", - "if(softDuration > 0):\n", - " softFactor = (model.getMaterialByID(mat3ID).E / model.getMaterialByID(mat2ID).E ) ** (1.0 / softDuration)\n", - "\n", - "\n", - "\n", - "for i in range(N):\n", - " times[i] = deltaT * i\n", - " \n", - " if((SoftStart <= i <= SoftEnd) and (softDuration > 0)):\n", - " if switchT is None:\n", - " switchT = times[i]\n", - " elif(i == SoftEnd):\n", - " switchEnd = times[i]\n", - " #\n", - " mat2.E *= softFactor\n", - " newMat = model.addMaterial(mat2)\n", - " materials[1][0] = newMat\n", - " #\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", - " disp3[i] = disp[3, 0]\n", - "\n", - "disps = [disp0, disp1, disp2, disp3]\n", - "maxMin = [-1.0, 1.0]\n", - "\n", - "for d in disps:\n", - " maxMin[0] = max(np.max(d), maxMin[0])\n", - " maxMin[1] = min(np.min(d), maxMin[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "#plt.plot(disp0, times, color='k', label = \"left node (fix)\")\n", - "plt.plot(disp1, times, color='g', label = \"middle, left node\")\n", - "plt.plot(disp2, times, color='g', linestyle = '--', label = \"middle, right node\")\n", - "plt.plot(disp3, times, color='b', label = \"right node\")\n", - "\n", - "if(softDuration > 0):\n", - " plt.plot((maxMin[1], maxMin[0]), (switchT, switchT),)\n", - " plt.plot((maxMin[1], maxMin[0]), (switchEnd, switchEnd), )\n", - "\n", - "plt.title(\"Displacement in $x$ of the nodes\")\n", - "plt.ylabel(\"Time [S]\")\n", - "plt.xlabel(\"displacement [m]\")\n", - "\n", - "plt.xlim((maxMin[1] * 1.3, maxMin[0] * 1.1))\n", - "\n", - "plt.legend()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If the softening is disabled, then the displacement looks wierd.\n", - "Because the displacement first increases and then decreases.\n", - "In this case `softDuration > 0` holds.\n", - "\n", - "However if the softening is enabled, it looks rather good.\n", - "The left middle node will start to vibrate, because it is not pulled in the other direction.\n", - "\n", - "\n" - ] - } - ], - "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 -} diff --git a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test_dynamics.ipynb b/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test_dynamics.ipynb deleted file mode 100644 index 98c1f67c7..000000000 --- a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test_dynamics.ipynb +++ /dev/null @@ -1,751 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test of Structural Mechanics\n", - "In this example a beam, consisting of two elements, three nodes, is created.\n", - "The left most node is fixed and a force is applied at the right most node.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import akantu as pyaka\n", - " \n", - "import copy\n", - "import numpy" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "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": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a mesh for the two dimensional case\n", - "el_type = pyaka._bernoulli_beam_2\n", - "beam = pyaka.Mesh(2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We now create the connectivity array for the beam." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "beam.addConnectivityType(el_type)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a `MeshAccessor` in order to change the size of the mesh entities." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "beamAcc = pyaka.MeshAccessor(beam)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we create the array to store the nodes and the connectivities and give them their size. " - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "nb_elem = 40\n", - "L = 2\n", - "beamAcc.resizeConnectivity(nb_elem, el_type)\n", - "beamAcc.resizeNodes(nb_elem + 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Nodes" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "Nodes = beam.getNodes()\n", - "length = L / nb_elem\n", - "Nodes[:, :] = 0.\n", - "Nodes[:, 0] = np.arange(nb_elem+1) * length" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting the Connections" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "Conn = beam.getConnectivity(el_type)\n", - "\n", - "for e in range(nb_elem):\n", - " Conn[e, :] = [e, e + 1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 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": [ - "model = pyaka.StructuralMechanicsModel(beam)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "if el_type == pyaka._bernoulli_beam_3:\n", - " normal = beam.getDataReal(\"extra_normal\", el_type)\n", - "\n", - " for e in range(nb_elem):\n", - " normal[e, :] = [0, 0, 1]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Setting up the Modell" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Creating and Inserting the Materials" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mat1 = pyaka.StructuralMaterial()\n", - "mat1.E = 1e9\n", - "mat1.rho = 10.\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", - "metadata": {}, - "source": [ - "##### Initializing the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "model.initFull(pyaka.AnalysisMethod._implicit_dynamic)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Assigning the Materials" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "materials = model.getElementMaterial(el_type)" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "materials[:, :] = 0" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Setting Boundaries" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "20\n" - ] - } - ], - "source": [ - "# Neumann\n", - "F = 1e4\n", - "no_print = int(nb_elem / 2)\n", - "\n", - "print(no_print)\n", - "\n", - "# Apply a force of `10` at the last (right most) node.\n", - "forces = model.getExternalForce()\n", - "forces[:, :] = 0\n", - "forces[no_print, 1] = F" - ] - }, - { - "cell_type": "code", - "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[:, :] = False\n", - "\n", - "boundary[0, 0] = True\n", - "boundary[0, 1] = True\n", - "\n", - "if el_type == pyaka._bernoulli_beam_3:\n", - " boundary[0, 2] = True\n", - "\n", - "boundary[nb_elem, 1] = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the System" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Set up the system\n", - "deltaT = 1e-6\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": 19, - "metadata": {}, - "outputs": [], - "source": [ - "model.assembleMatrix(\"M\")\n", - "M_ = model.getDOFManager().getMatrix(\"M\")\n", - "M = pyaka.AkantuSparseMatrix(M_)" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "model.assembleMatrix(\"K\")\n", - "K_ = model.getDOFManager().getMatrix(\"K\")\n", - "K = pyaka.AkantuSparseMatrix(K_)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [], - "source": [ - "C_ = model.getDOFManager().getMatrix(\"C\")\n", - "C_.add(M_, 0.00001)\n", - "C_.add(K_, 0.00001)" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "def Mmat2D(L=1, A=1, rho=1):\n", - " return rho*A*L/420 * np.matrix([\n", - " [140, 0, 0, 70, 0, 0],\n", - " [ 0, 156, 22*L, 0, 54, -13*L],\n", - " [ 0, 22*L, 4*L**2, 0, 13*L, -3*L**2],\n", - " [ 70, 0, 0, 140, 0, 0],\n", - " [ 0, 54, 13*L, 0, 156, -22*L],\n", - " [ 0,-13*L, -3*L**2, 0, -22*L, 4*L**2]])" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "def Kmat2D(L=1, A=1, E=1, I=1):\n", - " return np.matrix([\n", - " [ E*A/L, 0, 0, -E*A/L, 0, 0],\n", - " [ 0, 12*E*I/L**3, 6*E*I/L**2, 0, -12*E*I/L**3, 6*E*I/L**2],\n", - " [ 0, 6*E*I/L**2, 4*E*I/L, 0, -6*E*I/L**2, 2*E*I/L],\n", - " [-E*A/L, 0, 0, E*A/L, 0, 0],\n", - " [ 0, -12*E*I/L**3, -6*E*I/L**2, 0, 12*E*I/L**3, -6*E*I/L**2],\n", - " [ 0, 6*E*I/L**2, 2*E*I/L, 0, -6*E*I/L**2, 4*E*I/L]])" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def Mmat3D(L=1, A=1, rho=1):\n", - " return rho*A*L/420 * np.matrix([\n", - " [140, 0, 0, 0, 0, 0, 70, 0, 0, 0, 0, 0],\n", - " [ 0, 156, 0, 0, 0, 22*L, 0, 54, 0, 0, 0, -13*L],\n", - " [ 0, 0, 156, 0, -22*L, 0, 0, 0, 54, 0, 13*L, 0],\n", - " [ 0, 0, 0, 140, 0, 0, 0, 0, 0, 70, 0, 0],\n", - " [ 0, 0, -22*L, 0, 4*L**2, 0, 0, 0, -13*L, 0, -3*L**2, 0],\n", - " [ 0, 22*L, 0, 0, 0, 4*L**2, 0, 13*L, 0, 0, 0, -3*L**2],\n", - " [ 70, 0, 0, 0, 0, 0, 140, 0, 0, 0, 0, 0],\n", - " [ 0, 54, 0, 0, 0, 13*L, 0, 156, 0, 0, 0, -22*L],\n", - " [ 0, 0, 54, 0, -13*L, 0, 0, 0, 156, 0, 22*L, 0],\n", - " [ 0, 0, 0, 70, 0, 0, 0, 0, 0, 140, 0, 0],\n", - " [ 0, 0, 13*L, 0, -3*L**2, 0, 0, 0, 22*L, 0, 4*L**2, 0],\n", - " [ 0, -13*L, 0, 0, 0, -3*L**2, 0, -22*L, 0, 0, 0, 4*L**2]])" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [], - "source": [ - "def Kmat3D(L=1, A=1, E=1, Iy=1, Iz=1, GJ=1):\n", - " a1 = E * A / L\n", - " b1 = 12 * E * Iz / L**3\n", - " b2 = 6 * E * Iz / L**2\n", - " b3 = 4 * E * Iz / L\n", - " b4 = 2 * E * Iz / L\n", - " \n", - " c1 = 12 * E * Iy / L**3\n", - " c2 = 6 * E * Iy / L**2\n", - " c3 = 4 * E * Iy / L\n", - " c4 = 2 * E * Iy / L\n", - " \n", - " d1 = GJ / L\n", - " \n", - " return np.matrix([\n", - " [ a1, 0, 0, 0, 0, 0, -a1, 0, 0, 0, 0, 0],\n", - " [ 0, b1, 0, 0, 0, b2, 0, -b1, 0, 0, 0, b2],\n", - " [ 0, 0, c1, 0, -c2, 0, 0, 0, -c1, 0, -c2, 0],\n", - " [ 0, 0, 0, d1, 0, 0, 0, 0, 0, -d1, 0, 0],\n", - " [ 0, 0, -c2, 0, c3, 0, 0, 0, c2, 0, c4, 0],\n", - " [ 0, b2, 0, 0, 0, b3, 0, -b2, 0, 0, 0, b4],\n", - " [ -a1, 0, 0, 0, 0, 0, a1, 0, 0, 0, 0, 0],\n", - " [ 0, -b1, 0, 0, 0, -b2, 0, b1, 0, 0, 0, -b2],\n", - " [ 0, 0, -c1, 0, c2, 0, 0, 0, c1, 0, c2, 0],\n", - " [ 0, 0, 0, -d1, 0, 0, 0, 0, 0, d1, 0, 0],\n", - " [ 0, 0, -c2, 0, c4, 0, 0, 0, c2, 0, c3, 0],\n", - " [ 0, b2, 0, 0, 0, b4, 0, -b2, 0, 0, 0, b3]])\n" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [], - "source": [ - "if el_type == pyaka._bernoulli_beam_2:\n", - " kmat1 = Kmat2D(E=mat1.E, A=mat1.A, I=mat1.I, L=length)\n", - " mmat1 = Mmat2D(A=mat1.A, L=length, rho=mat1.rho)\n", - " nb_dofs = 3\n", - "else:\n", - " kmat1 = Kmat3D(E=mat1.E, A=mat1.A,\n", - " Iy=mat1.Iy, Iz=mat1.Iz,\n", - " GJ=mat1.GJ, L=length)\n", - " mmat1 = Mmat3D(A=mat1.A, L=length, rho=mat1.rho)\n", - " nb_dofs = 6" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": {}, - "outputs": [], - "source": [ - "def assemble(Mg, Me, n1, n2, nd):\n", - " s1 = n1 * nd\n", - " s2 = n2 * nd\n", - " \n", - " Mg[s1:s1+nd, s1:s1+nd] += Me[ 0:nd , 0:nd ]\n", - " Mg[s2:s2+nd, s2:s2+nd] += Me[nd:2*nd, nd:2*nd]\n", - " Mg[s1:s1+nd, s2:s2+nd] += Me[ 0:nd , nd:2*nd]\n", - " Mg[s2:s2+nd, s1:s1+nd] += Me[nd:2*nd, 0:nd ]" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [], - "source": [ - "total_nb_dofs = nb_dofs * (nb_elem + 1)\n", - "\n", - "Ka = np.zeros((total_nb_dofs, total_nb_dofs))\n", - "Ma = np.zeros((total_nb_dofs, total_nb_dofs))\n", - "\n", - "for e in range(nb_elem):\n", - " n1, n2 = Conn[e, :]\n", - " \n", - " assemble(Ka, kmat1, n1, n2, nb_dofs)\n", - " assemble(Ma, mmat1, n1, n2, nb_dofs)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "3.2757195579646225e-15\n", - "9.075211880647167e-16\n" - ] - } - ], - "source": [ - "print(np.linalg.norm(Ka - K.todense())/np.linalg.norm(Ka))\n", - "print(np.linalg.norm(Ma - M.todense())/np.linalg.norm(Ma))" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [], - "source": [ - "def analytical_solution(time, L, rho, E, A, I, F):\n", - " omega = np.pi**2 / L**2 * np.sqrt(E * I / rho)\n", - " sum = 0.\n", - " N = 110\n", - " for n in range(1, N, 2):\n", - " sum += (1. - np.cos(n * n * omega * time)) / n**4\n", - "\n", - " return 2. * F * L**3 / np.pi**4 / E / I * sum" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "# Perform N time steps.\n", - "# At each step records the displacement of all three nodes in x direction.\n", - "N = 900\n", - "\n", - "disp = model.getDisplacement()\n", - "velo = model.getVelocity()\n", - "disp[:, :] = 0.\n", - "\n", - "displs = np.zeros(N)\n", - "\n", - "ekin = np.zeros(N)\n", - "epot = np.zeros(N)\n", - "ework = np.zeros(N)\n", - "_ework = 0.\n", - "\n", - "\n", - "\n", - "for i in range(1, N):\n", - " model.solveStep() \n", - " displs[i] = disp[no_print, 1]\n", - " \n", - " _ework += F * velo[no_print, 1] * deltaT\n", - " \n", - " ekin[i] = model.getEnergy(\"kinetic\")\n", - " epot[i] = model.getEnergy(\"potential\")\n", - " ework[i] = _ework\n", - " \n" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 32, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "def sol(x):\n", - " return analytical_solution(x, L, mat1.rho, mat1.E,\n", - " mat1.A, mat1.I, F)\n", - "\n", - "times = np.arange(N) * deltaT\n", - "plt.plot(times, sol(times))\n", - "plt.plot(times, displs)" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(times, displs - sol(times))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What I do not fully understand is why the middle node first go backwards until it goes forward.\n", - "I could imagine that there is some vibration, because everything is in rest." - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1.5108795139938372e-06" - ] - }, - "execution_count": 34, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.max(displs - sol(times)) " - ] - }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD4CAYAAADlwTGnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABJTUlEQVR4nO3dd1iUV9r48e+hiSBFikgRUMCCNYJd04yJpmlM2TTTdjdret0k7+6+v82++76bbM1uNj1ZE9N7MdE0TYy9K1gABSwgvUivM+f3xxkMkgEGmD7nc11cwMxTzjzi3POcct9CSommaZrmebwc3QBN0zTNMXQA0DRN81A6AGiapnkoHQA0TdM8lA4AmqZpHsrH0Q3oi4iICJmYmOjoZmiaprmU3bt3V0gpI7s+7lIBIDExkV27djm6GZqmaS5FCHHc3OO6C0jTNM1D6QCgaZrmoXQA0DRN81A6AGiapnkoHQA0TdM8lA4AmqZpHkoHAE3TNA/lUusA3J7RCHnroHgfhCbA2EvBL8DRrdI0zU3pAOAsmqrhvWVwbOOPj4UmwHXvQlSq49qlaZrb0l1AzqCtGd65Hgq2w6X/hN8Uw7JPwNAKKy+FyjxHt1DTNDekA4Az+OFJOLEFljwP6beqbp+k8+GW1SCN8OGt0N7q6FZqmuZmdABwtLIs2Pw0TLkRJl515nPhSXD5v6E4A7Y965j2aZrmtnQAcLTv/wR+gXDhH80/P+4yGL0INvwd6svt2zZN09yaDgCOVHoIslbBjOUQENb9dhf+Edoa9F2ApmlWpQOAI+18BXz8YeYdPW8XkQLjLoedK6Clzj5t0zTN7ekA4CitDZD5PqQu6fnTf4fZ90JLDex53eZN0zTNM+gA4CgHPobWOki7xbLt49JgxEzY+R+Q0qZN0zTNM+gA4CgZ70B4CsTPtHyfqcugKk+tF9A0TRsgHQAcob4Mjm+BCUtBCMv3S10CvoGw902bNU3TNM+hA4AjZH8BSDWw2xeDhsD4JXDwE2hrskXLNE3zIDoAOMKhVTB0JESN7/u+E6+C1nrI+8767dI0zaPoAGBvzTUq4du4y/rW/dMhcR74h6ogommaNgA6ANjb0Y1gbIeUC/u3v7cvjLkYDn+p8wNpmjYgOgDYW/73aiB3xPT+H2PcZaY7iQ3Wa5emaR5HBwB7y/seEueAz6D+HyPpfBVEdDeQpmkDYFEAEEIsFELkCCFyhRCPmXleCCGeNj2fKYSYanp8hBDieyFElhDioBDivk77PC6EOCmE2Gf6uth6L8tJnTqh5vGPOm9gx/H1h+T5cORbvShM07R+6zUACCG8gWeBRUAqcJ0QomuJqkVAiunrduB50+PtwENSynHATOCuLvs+JaWcYvpaM7CX4gLy16vvSQMMAADJF0BdkUonrWma1g+W3AFMB3KllPlSylbgXWBxl20WA69LZRsQKoSIllIWSyn3AEgp64AsINaK7Xct+eshKBoixw78WMnz1ffctQM/lqZpHsmSABALFHT6vZCfvon3uo0QIhE4C+icx+BuU5fRCiHEUHMnF0LcLoTYJYTYVV7uwvnwpVSrfxPm9G/6Z1chcRA5ThWR1zRN6wdLAoC5d6uuHc89biOEGAJ8BNwvpaw1Pfw8kARMAYqBv5s7uZTyJSllupQyPTIy0oLmOqmaAqgr7lvun94kz1dBpbXBesfUNM1jWBIACoERnX6PA4os3UYI4Yt6839LSvlxxwZSylIppUFKaQReRnU1ua8TphufETOsd8zk+apw/NGN1jumpmkew5IAsBNIEUKMFEL4AdcCXecfrgJuMs0GmgnUSCmLhRAC+A+QJaX8R+cdhBDRnX69AjjQ71fhCgq2gd8QGNZ1/HwA4meD9yA4qtcDaJrWdz69bSClbBdC3A18DXgDK6SUB4UQy03PvwCsAS4GcoFG4FbT7nOAZcB+IcQ+02O/Mc34+YsQYgqqq+gY8CsrvSbnVLAd4tLBu9dLbjlff7Wg7Ji+A9A0re8sejcyvWGv6fLYC51+lsBdZvbbhPnxAaSUy/rUUlfWUgelB+HsX1v/2InzYP0T0FQNg82Oo2uappmlVwLbQ+FOkEbr9v93SJwLSDi+1frH1jTNrekAYA+Fu9X3uHTrHzs2TRWWP7bJ+sfWNM2t6QBgD8X7ICwJ/EOsf2xff4ibphPDaZrWZzoA2EPRPoiZYrvjJ86DkgPQWGW7c2ia5nZ0ALC1hgqoLYToKbY7R8c4wAk9DqBpmuV0ALC1on3quy3vAOLS1XqA41tsdw5N09yOFSela2YV71Xfoyf3uunRigb+/GU2245WEjrYl+tnxPPzuaPw9uold5DPIIg5S6010DRNs5C+A7C14gwIG9XrAPC+glNc/u9NbMmrYOH44cSEDuZPa7K5863dtBuMvZ9nxHR1t9HWbJ12a5rm9nQAsLWijF77/0tqmrnl1R0MDfTjy/vP5skrJ/H2L2fyu0vG8fXBUv5vjQU5/+NngrFNzTjSNE2zgA4AttRYBTUneuz/l1LyyEeZtLQZefXWacSGDj793C/mjeKW2Ym8uvkY2/Irez5XnCmX3oltVmi4pmmeQAcAWyrq6P+f0u0ma7PK2HC4nEcWjiEpcshPnn9k4RhGhA3m8VUHMRp7KP84JFKtNSjYMcBGa5rmKXQAsKWSTPU9epLZp41GyZ+/ymZUZCA3zkwwu02Anw8PXziG7JI6Vu8v7vl8I2aogWBdJ1jTNAvoAGBLpQchZES3SdrWZZeRW1bP/ReMxte7+3+KyybFkDJsCM+vz0P29OYePwMaK6Aqf6At1zTNA+gAYEulh3rM/79i01FiQvy5eMLwHg/j5SW4ZU4ih4pr2XOiuvsNO5LN6emgmqZZQAcAWzG0QcVhiDIfALKKa9maX8nNsxPx6eHTf4clU2IJGuTDG1uPd79RxBg13VQPBGuaZgEdAGyl4oialjlsvNmn39tZgJ+PF9dOi7focIGDfLgyLY7V+4s51dhqfiMvLzUbSA8Ea5pmAR0AbKX0oPpu5g6gzWDk84wiLhg3jJAAX4sPeeXUONoMkq8PlnS/UVw6lGerIjSaYjTAkbXw7f+DT++CtY+r3w3tjm6ZpjmUTgVhK2UHwcsHwlN+8tTGI+VUNrRyxVlxfTrkhNhgEsMD+DyjmJ91d+cQmw5INQV15Nn9aLibOboBvngQKo+Atx8EREBDOWx6CiJGw0VPQMoFjm6lpjmEvgOwldJD6g3Gx+8nT326t4ihAb6cMzqyT4cUQnDZ5Bi25FVQXtdifqPYqer7yd19bbH72fYCrLwcjO1w1avwWAE8lAW/Oal+NxrgrSth7R/Uz5rmYXQAsJUy8zOAWtuNfJ9dxoWpw/Hz6fvlv3RSDEYJX3XXDRQQpnIPFe7q87HdyqZ/wlePwthL4I7NMGGpKp4DKnnehKVw51aYejNs+gesugeMFuRc0jQ3ogOALTTXQE2B2f7/7UcrqWtpZ0FqVL8OPTpqCPFhAXyfXdb9RrFpcHJPv47vFvZ/CGt/DxOugmteB79A89v5DILLn4Zz/wv2vQVfPWbfdmqag+kAYAtlpuRtZmYAfXuoFH9fL+amRPTr0EIIzh87jM25FTS1dtNtEZsOdUVQW9Svc7i0iiPq03z8bFjyHHh5977POY/CrLthx4uw5w3bt1HTnIQOALbQzQwgKSVrD5UyLyUSf18L3pi6cf7YYbS0G9maX2F+g9g09d3TxgEM7fDRz9Un+6v+o75bQghY8D8w6jxY/eCPOZw0zc3pAGAL5dngN0SlgejkYFEtRTXN/e7+6TBjVBgBft6sy+qmG2j4RPDy9bxxgJ0vq/oLlz4FwTF929fLG65aAYGR8PGvdF0FzSPoAGAL5TlqBpA4s5LX+hz1hn3+2GEDOvwgH29mJ0WwKbebOwBffxUEPOkOoK4Uvv8TJM2H1CX9O0ZAGFz+b6jIgfV/smrzNM0Z6QBgCxVHVADoYlNuBanRwUQMsbBrogdzksM5XtlIYXWj+Q1i01RXhqdMb1z3P9DWBIv+8pPA2yfJ8yHtFtjyb3U3oWluzKIAIIRYKITIEULkCiF+MlVCKE+bns8UQkw1PT5CCPG9ECJLCHFQCHFfp33ChBDfCiGOmL6bT5npappr1QBs5JkBoLG1nT3HT/V78LerWUnhAGzN66ZQTFw6tNarfETuriIXMt6G6bdDRPLAj3fBH2BwGHz5qE6trbm1XgOAEMIbeBZYBKQC1wkhus5vXASkmL5uB543Pd4OPCSlHAfMBO7qtO9jwDopZQqwzvS766s4or5HjDnj4Z3Hqmk1GJmTbJ0AMHpYEOGBft0HgI6BYE8YB/jhz+A9CObeb53jDQ6FC34PJ7aqKaWa5qYsuQOYDuRKKfOllK3Au8DiLtssBl6XyjYgVAgRLaUsllLuAZBS1gFZQGynfVaafl4JLBnYS3ESFTnqe+SZAWBzbgV+3l5MS7TOjY6Xl2BmUjhb8irN1wgIS1KZQd19HKD8MBz4EKb/EoYMbGzlDFNuhJiz4Nv/htYG6x1X05yIJQEgFijo9HshP76JW7yNECIROAvoSFYfJaUsBjB9t+L/Xgcqz1EzcIaOPOPhTUcqmJoQSoCf9dIvzU4Kp6S2maMVZt6gvLwgZiqcdPM7gC1Pq0//c+7rfdu+8PKChX+GumLY/oJ1j61pTsKSAGBuRK3rR84etxFCDAE+Au6XUtZa3jwQQtwuhNglhNhVXl7el10do+IwhCeB949v9NUNrRwqrmVOknW6fzrMGqXGAbb0NA5QeghauxkodnUNFZD5Pky+FgKte20BVWFt9ELY/C9oOmX942uag1kSAAqBzhPa44CuS0y73UYI4Yt6839LSvlxp21KhRDRpm2iAbOT2qWUL0kp06WU6ZGRfUue5hAdU0A72XmsCoCZpoFbaxkZEUjEED/2HO+mSlhsGkiD+85m2f0qGFpgxnLbneP836nUHlv+bbtzaJqDWBIAdgIpQoiRQgg/4FpgVZdtVgE3mWYDzQRqpJTFQggB/AfIklL+w8w+N5t+vhn4rN+vwlm0t0D10Z/0/+86Xo2ftxcTY0OsejohBFPjh7K7uzKR7rwiuL0Vdryi5v0PG2u78wyfCOOXwrbnod4F7kA1rQ96DQBSynbgbuBr1CDu+1LKg0KI5UKIjo9ea4B8IBd4GbjT9PgcYBlwvhBin+nrYtNzTwILhBBHgAWm311bVT5Io9k7gElxIQNK/9CdtIShHK9sNJ8eesgwCIl3zwBw6DOoL4GZd/a+7UCd91tob4bN/7T9uTTNjiwakZRSrkG9yXd+7IVOP0vgLjP7bcL8+ABSykpgfl8a6/TKTTOAOgWAplYDB07W8PO5o2xyynTTrKI9J6q5aLyZ4vKxbjoQvGclDE2EpPNtf66IZJh4Fex6FeY9pFYMa5ob0CuBralj0VXEj1XAMgpP0WaQVpv+2dX4mBD8vL26HweIS4dTJ9yr+6IqH45thLNuVLN17GHuA9DWoGcEaW5Fl4S0pvIc1eXSKf/8LtMAcFqCbQKAv683E2KD2d3TQDBA0R4YfZFN2mB3+94G4QWTr7ffOYeNg7GXqgAw+x4YFGS/czuj1gbI+gLy1kHRPlX/wtAGvgEQPgqip8CYRTDqXMuzsmp2pwOANVXk/CQFxM5j1YyOGkJowE9LQ1pLWsJQVm49Tku7gUE+XcYZoierN8uTu90jABgNKgAkzYeQrstRbGzeg5D9BexaYf11B66i6ZSqoLbrNWipgYBwiJ8FyReoN/qO9CP7P1SztAIiYNovYOZyGOwe2V7ciQ4A1iIlVOZDwtzTDxmMkj3Hq7l8Sh9TE/dRWsJQXt54lINFtUyN7/KfzC9QlaZ0l5QQed9D7Um4yAHZOmPTVM2ALc+ovEO+g+3fBkeREjLehW9+C41VMH6JugYjZprvhmtvgaMbYOcr8MOTqtjOeb+FtFvPWCOjOZYeA7CW+lLVRxz242DvkbI66lrabdb906HjTb/H9QAnd7tHYrO9b6hPnWMu7n1bW5j3EDSUwd43HXN+R2ipg49+AZ8uh/AU+NUGuPo1SJjd/RiMzyBIWQDXvwfLN0HUBFjzMLy6ECrz7Np8rXs6AFhLxx91+I8BIKPgFABTRoTa9NTDgv2JCfEns7DG/AaxadB8Sg2eurLmWsj5UtX69bFdl1qPEudC3HSVgsLQ7pg22FNdCby6CA5+ohbF3boGoif17RjDJ8LNn8PSV1T30Avz1ApuzeF0ALCWKlMACEs6/dC+ghqC/X1IDO+mKLkVTYwLIbPwlPknTy8Ic/FC8Tlr1MrfiVc5rg1CqBlBp06oN0V3VpELr1ygujavfx/O/rVlNZbNEQImXQ13bIWYKfDxL+Gb33lOvQonpQOAtVTmqSRwncpAZhScYvKIULy8BlCgxEKT4kI5VtlITWPbT5+MHKtmZ7j6eoADH6lZVnHTHNuO0QvVNd38T/foVjOn6iisvEwtgLt1DaRcYJ3jhsTCTZ/BtF+q9Bpv/0xnW3UgHQCspSofhiacHuBqajWQU1rH5LhQu5y+I83EgSIz3UDePiq1sSuvCG6sgrzvYMIVA6v4ZQ1eXmoWUOkByF3r2LbYQk0hrLwc2pvUm3XMFOse39sXLvmbqt2ct06dq7HKuufQLKIDgLVU5Z/R/XOwqAaDUTLZxv3/HSbFqQDQ/TjAVCjOVDl0XFHWKjC2w4QrHd0SZcJVEBwHm55ydEusq6VOfSpvPgXLPoWo8bY7V/ptcM0bULIfVixUgUf7KSnVeJPRaPVD6wBgDVKqABDeuf//FACT46ybAK47oQF+xIcFsP/kKfMbxKap/vPSA3Zpj9Ud+AjCk2F4HwcgbcXHD2bdBcc3Q8EOR7fGOowGNdunLAuuftX6n/zNGXcpLPtY1V1YsRCqj9n+nM6qrgQOfKzGRl5fAs9MgydGwB+Gwh/DIf87q59ST8i1hrpiaGs8YwpoRmENMSH+DAv2t1szJsaFnJ559BOdM4PGTrVbm6yirgSOboRzHnF8909nU2+CDX+BTf+E6952dGsGbu3v4fBXcPHf1MIue0mcq2YJvb4YXrtU/Rw2svf93EHNSVXPOns1FO1Vj3n7qbU7kWNVrqtBweqxoda/JjoAWEPH9MpOdwAdA8D2NCk2hNWZxVTWtxA+pMvy+5AREBjpmjOBDn0GSJWW2ZkMGgLTf6UWOpVl2zYtta0dWqUGZaf9QpXXtLeYKXDzqh+DwC1fuG8QkFKNZ+14GY58rTIIx02D8/9bveFHTbDbNGfdBWQNHWsATHcAVQ2tnKhqtHsAmGjqbtp/0sw4gBAQm+6aA8FZn6tPQ874Bjv9dvAZrNYFuKqqo/DZ3aqE6EVPOK4d0ZPhplVqQeVrl7j+upWupITD36iptW8uVf8X59wP9+6DX6yFsx9Wd+d2XOOiA4A1VOWpWzTTFNAM03x8e80A6tAxE2h/TwvCKg6rCleuorFK9bOPvdTRLTEvMBzSbobM91xzELO9BT64RSVtv/o1xy2w6xA9SXUBtTWpOwF3WTVcnAGvXgxvXw31ZXDpP+GBg3DB7x16p6MDgDVU5qnc9KZFMpkFNQjx4ydyewny92VUZCCZ5u4AwNT3L3/sa3QFh79St8hjL3F0S7o3y1QKY+uzjm1Hf6x9HIr3wZIX1DRmZ9Cxcri9Wd0JVOQ6ukX911ABq+6FF89RySIv+QfcuwfSb3V8sEUHAOuoOnrGFNCs4loSwwMZMsj+QywTY0M40GMAwLW6gbJXQ1CMWsfgrELj1bTQ3Stdaz770Q2w7TnVjTXWQbmVujN8ggoChjZ47eIfiy25Cikh8wN4Jh32vQUz74B7dsO0n6t1EE5CB4CBMhpNawB+nAGUVVLLuGjH5IsfHxNMcU0zVQ1m5vsPHqqmUrrKQHBrI+SuU5/+nWn2jzlz7lN91ztednRLLNNcA5/eqf4eLviDo1tjXtR4uGW1ejN97RIoPeToFlmmrgTevQE+/oW6vss3w8InnDIdtg4AA1VXrFZMmpLA1be0c7yykbHDgx3SnNRo1e2UVVxrfoPYNJUa2hVSGOR/r66tM3f/dIhKVSkitr/gGqkNvvovqC2CK14CvwBHt6Z7w8aqVBTCG1ZeqhaNOSspIeM9eHaGWuF84f/CbV875+QFEx0ABqpLEricEvXGOy7aQQEgRp33oLmUEKACQH2J+s/v7LJXg3+ImifuCuY+AE1Vzp8qOusL1S0x70GIS3N0a3oXkaKCgI+/yk/kjGNYtcXwznXwye0QOUalwJ59T/+T59mJDgADdToNtAoAWcV1AA7rAgoL9CM6xJ9DRT3cAYDzjwMY2lXq59ELnarPtEfxM1V1rC3/Vn3Xzqi+HD6/T62oPvsRR7fGcuFJqjvIb4iaHZS7ztEtUqSEfe/AczPUHetFf4JbvzyjLrgz0wFgoKry1RTQYFWeMKu4liB/H2JDHVctKjU6mEPddQENn6iyljp7ACjYpj5Nu0L3T2dz7lf1cQ985OiW/JSU6s2/pQ6WvuQUs1D6JGwk/PwbNePu7WtUaVBHqi1S7fh0OUSOU339s+5y+k/9nekAMFBV+WqJtukfPau4lnHDgxEOHLRMjQkmr7yB5jYzudZ9Bqkg4OwBIHs1eA9StX9dScqFahn/pn/aJHnXgGS8AzmrYf5/qyL3rig4RnUHJcyBT++A7/9k/+ssJex5A56dqVKULHxStSki2b7tsAIdAAaqMu9094/RKMkuqXNY90+H1OhgDEZJTkmd+Q1i01Q/qrMW45BS9VMnnafSLbgSLy91F1CeBUe+cXRrfnSqAL58FOJnw8w7Hd2agfEPgRs+hCk3wA9/Vour7DX9tvoYvHklrLpbTVW9Y7Oa4ulCn/o70wFgIIxGqD56egpoQXUjja0Ghw0Adxgfo2YCddsNFJsGrfVqVbAzKtkPNSdcr/unw4SlalX4pn84x2wro1G9YRkNsOQ5l32zOoOPHyx+VtUUOLoBXjwbjm+x3flaG9XdxjPT4cQ2lTDv5i/OyP/linQAGIi6IrVa8fQAsGNnAHWIGzqYoEE+3Q8Ex6Wr787aDZS9GhAwepGjW9I/3r5qXUDBdjUd0NF2/Qfy18NF/+deCdaEUDUFbvtaBbVXF8EXD6ra0dZiNPw4tfOHP6v01XfvVAnzvFz/7dP1X4EjdUkCd6i4Di8Bo6Mc2wXk5SUYFx3c/VTQsCQYFAKFO+3bMEtlr1YzaoZEOrol/Tf1ZghNgG8fd+xYQGUefPv/1FhK2i2Oa4ctxU6FO7bAzLtg1wr4dxpsf2lgxY/aW1Xh+mdnqKmd/iHqE/9VK1RZSzdhUQAQQiwUQuQIIXKFEI+ZeV4IIZ42PZ8phJja6bkVQogyIcSBLvs8LoQ4KYTYZ/pysrXoFuiyBiCruJbEiEAG+zn+Fjs1JpjskjoMRjNdEF5e6i7AGQuZVB+D0v2u2/3TwcdPpfct3e+4GUFGg1rt6+0Li59x/tXUA+EXCAv/BL9YBxGj4ctfw78mw/on1fiHJaSEkgMqP9JTqapwvbefqlr2qw0wcp5NX4Ij9JqsRgjhDTwLLAAKgZ1CiFVSys7rshcBKaavGcDzpu8ArwHPAK+bOfxTUsq/9bv1jlaZpxanmKaAZpfUMsnOGUC7kxoTTGOrgeOVDYyKNDOQGj8Lvv8/aKp2riXq2WvU9zGu93ngJyZcCVv+Bd/9EVIX23/a5dZn1HTaK15Ss2c8QVyaqiWQ953Kc7T+SVj/BAwbr97AI8eq3E1+geoNv7ECTp1Q2TqPb1VjT8JLdT+m36runNygq6c7lmQrmw7kSinzAYQQ7wKLgc4BYDHwupRSAtuEEKFCiGgpZbGUcoMQItHaDXcKVUdNU0C9qGtuo6CqiWunxTu6VYCaCQRwsKi2mwAwE5BQsBNGX2jfxvUke7WaRunig2uAeuO44HE1a2THi2plqL0UZ8J3/6vSaE+6xn7ndQZCQPJ89VV1VNWTOPIN7HldVe4zJyhaTY44+2G1+DAoyr5tdhBLAkAs0PkeqpAfP933tE0sUNzLse8WQtwE7AIeklJWd91ACHE7cDtAfLxzvLmeVpV3uvsn2zTlcuxwx/b/d0iJGoKPl+BQcS2XTTbz6S82Dbx84MRW5wkADZVwYgvMe8jRLbGepPlqbcD6J02F5KNtf86WevjwVggIh8uedu+un96EjYQ596ovoxFqC1UZxvYmdQcQGKGyzbryeNMAWHJvY+6vp2vHsiXbdPU8kARMQQWKv5vbSEr5kpQyXUqZHhnpRP9IRqP6dGFKAucsM4A6DPLxJiUqqPuZQH4BqgLTiW32bVhPXCH3f18JAYv+rFJDfPvf9jnnml+r7smlL6uCNZri5aW6fxJmqdKLyfPV/wEPffMHywJAITCi0+9xQNdMYpZscwYpZamU0iClNAIvo7qaXEdtIRhaOg0A1xEy2JfoEPsVge9NanQwB7sLAKDGAU7uVlWhnEH2ajWeEj3F0S2xrrBRKlHc/g/UdExbynhPFRk/5xG3HLTUrMuSALATSBFCjBRC+AHXAqu6bLMKuMk0G2gmUCOl7LH7RwjR+V74CuBAd9s6pS6F4LOKVQ0AR6aA6Co1JpiK+hbK6prNbxA/UwWx4gz7Nsyc1gY1Z94Vcv/3x9z7VW74z+62XUnOon0q10/8bNdK9KY5TK8BQErZDtwNfA1kAe9LKQ8KIZYLIZabNlsD5AO5qE/zp9eaCyHeAbYCY4QQhUKIn5ue+osQYr8QIhM4D3jAWi/KLjqtAehIu+CoGgDd6UhJ0ZGh9CdGzFTfT2y1U4t6kLtOLapz1tq/A+U7GK54USUQ+/JR6x+/vlwVIQkIh2tWgrf9q9FprseivxIp5RrUm3znx17o9LME7upm3+u6eXyZ5c10QlX5agpoUAzHKxtoajOcnnnjLDrac6iolnNGm+nnHBKpurBObFMrVx0pezX4h0LCbKsfuqSmmVc3H+WHw+UUnWoiyN+X9MSh/GzaCGaNCrffXVtcuhrg3vAXSFmgpolaQ1szvL8MGivhtq9gyDDrHFdze/pjQn9V5qm+XS+v0zOAnGUAuENogB+xoYO7rw4GahwgZ40a1HbUfGdDGxz+Us39t2Lufyklr2w8yt+/zaHdIJmVFM60xDCqG1vZcLicz/YVsWjCcP64ZAIRQwZZ7bw9OucRNQ7w2d1qwdLwiQM7nqENPrxN3cVdtQJiplijlZqH0AGgv6ryTxd9yCquxUuoqZfOZlxPtQFAjQPsexMqj6hKRo5wbJPqF7di90+bwcivP8jg031FLEiN4v9dmsqIsB9LHza3GVix+Sj//PYImYWbeePn082vl7A2b1/42Rvw0nnwzvUqv31/p4YaDfDZXSrF86K/Wu+OQvMY7rvEzZaMhjOygGYVq8VW/r6OTwHRVWp0EPnl9eZrA4C6AwA4vtl+jeoqezX4DFZT86zAaJQ88mEmn+4r4uELR/PSsrQz3vwB/H29ufPcZD68YxbNbQaufmErxyrsVMs3aDhc+5YqeLPyMqgr7fsx2prhg5sh8z04/3cw43brt1NzezoA9EdNIRhazygD6WzdPx1SY4IxSrqvDRCepFZBHt1g34Z1MBpVAEieb7Xi5P9ce5hP9p7k1xeN4e7zU3rs458UF8r7y2dhlJJbXt1BVcMAEoj1RexUuOEDqD2pslhWHLF831MF8PrlaoXrRU/A2b+2XTs1t6YDQH90SgJX09TGyVNNDi8C053U6F5qAwgBI89RlY0ckbWyaK9Kq22l7p/1OWU8/V0uV6XFcee5lqWTSIocwis3T6OoppmHP8hA2iuHf8JsWPaJ6v56eb4qJt/TuY1GVX/2hblQehCufg1muXhxF82hdADoj06F4LM7VgA72RTQDr3WBgAYebZKilWeZb+Gdcj+AoQ3jL5owIeqaWrj1x9mMiYqiD8untCn2T1pCUP57cXj+C67jNe2HBtwWywWPxNu/x6iUlV//kvnqFq39WUqGEipkpXt/A+8OE/Vnw1PVtkpx19hv3ZqbkkPAvdH1VHVZx0UTdb+Y4DzzQDq4OUlGBsd1PNAcMeK0aMbIGq8fRrWIfsLSJwLAWEDPtSTX2ZTWd/Cipun9Ssl902zEth4pJwn1mQzLyWS5GF2GtQPjYdb1qgVvJueUrVuAXwD1HiTwbRSO2qCyuw58Wq3zlCp2Y8OAP1RZZoCKgTZJXUMDfAlKthO0wj7ITU6mA93F2I0Sry8zHwqDo1XWU3zf1D1Te2l/LAqSzntlwM+1M5jVbyz4wS/nDeSiXEh/TqGEIInlk5i/t/X89+fHuDtX86w3xoBLy8460aYfD0U71PlDWuLVKWrkBGquyhqvHuuktYcRgeA/qjMg2FjgY4UEMFOlQKiq9SYYBq2GjhR1UhiRKD5jUaeDQc/AUO7/VaRHvpMfR9g8jcpJf+7Oovhwf48sGD0gI4VGTSIRxeN5befHOCTvSdZOjVuQMfrMy8vNUAcO7X3bTVtgPR9ZF8Z2lXVqrAklQKi1PlSQHTV60AwwKhzoKXWvnmBDn6i0lEMsMTemv0lZBSc4sELRxPgN/Dgdd20eKaMCOWJL7NpbG0f8PE0zVnpANBXtYVgbIPwJI5WNNDcZnTaGUAdUqKG4O0lel4RnHi2+m6vIublOVB2ECYsHdBh2gxG/vp1NmOigrjSSp/WvbwE/33pOMrrWlix6ahVjqlpzkgHgL7qlAQuu8S5agB0x9/Xm6TIwJ5nAg2JhJizVOUkezjwMSBg3OUDOsznGUUcq2zk4YvG4G1ufKOf0hLCuDA1ihd+yKey3knSZWualekA0FcdaaDDksgqrsXbSzhlCoiuUntLCQGQchEU7lKVuWxJStX9kzBnQBWyjEbJc+vzGDs8iAvGWT8B2iMLx9DY2s6/v8u1+rE1zRnoANBXlXngGwhBw8kqriMpMpBBPs6XAqKr1Jhgimuaqe5ppevoCwEJuWtt25iyQ1CRAxMGNo/926xScsvquePcJJsMwicPC+LqtBG8veMEZbXd1FTQNBemA0BfVeWfngLaMQPIFXS0s8dxgOizIDASjnxt28Yc+BiE14C6f6SUPPd9LvFhAVwy0XZ1du88Tw32v7wx32bn0DRH0QGgr6ryIGwkpxpbKa5pdrkA0GM3kJcXJC9QxVkMNpr9YjSq0ogjzx5Q3vqdx6rJKKzh9rNH4eNtuz/jhPBAFk+O4c1tJ+yXJ0jT7EQHgL7omAIannS6yparBICIIYOICh7U80AwqG6g5lNQuNM2DTmxFU4dh8lm6wRZ7PWtxwjy92Hp1IFNIbXEnecl0dxu0DOCNLejA0Bf1JwAY/vpAWCAccOdewpoZxYNBCedD16+KkWDLex7G/yGwLjL+n2IstpmvjpQwtVpI6wy7783ycOCuHhCNCu3HKOmqc3m59M0e9EBoC86FYLPKq4lPNCPyCDnTQHR1bjoYHLL6mlp76Y2AIB/iAoChz7rOTNlf7Q2wKFPIXUJ+HWzItkC7+wooN0oWTYrwWpN680d5yZR19LOeztP2O2cmmZrOgD0ReWPU0CzS+qcPgVEV6kxwbQbJUdK63vecPwVUFMAJ3dbtwFZX0BrPUzpf/dPm8HI2zuOMy8lgpHdpbWwgQmxIcwaFc5rm4/RZnBA2mxNswEdAPqiKg/8htA+OIKc0jqnXwHcVaolA8EAYxaBt5+aq29Ne99Qiefi+1/4fe2hUkprW7hpVqL12mWhX8wbSVFNM18eKLH7uTXNFnQA6ItKNQPoaGUjre1Gp88B1FVCeCABft49TwUFGBwKSfPh4KfWKxJTngPHNsLUmweUyvjdnQVEh/hz/ljrL/zqzXljhjEqIpBXNubbr2iMptmQDgB9UZUH4cmnP0G7ygygDt5egjHDg3qfCQSqwHhtofVqBe98Rd1VTL2534coqWlm45FyrpwaZ9W0D5by8hLcNnckmYU17Dpebffza5q16XTQljK0QfVxGL+U7JI6fL2F/QqGWFFqdDCrMoqQUvY8fjHuUjUgvGfljwVj+qulTpUyTF2icg7108d7CzFKuCrNzimaO7lyahx/+yaHVzbmMy1x4EVsXNmholq+zyljz/FqimqaqW1qY8ggH4aH+DN5RCjzUiJIix9qvgaF5hR0ALBU9XGQBjUDaG8tSZFD8PNxvRuo1Jhg3tp+gpOnmogb2kMRdt/BMOlnsHslLKoaWMWujHehtQ6m97/wi5SSD3cVMj0xrPuaBnYw2M+bG2bE89z6PI5XNpAQ7ri2OILRKFlzoJjn1+dx0HQnmTxsCInhgYwbHkR9Szsnqhp55rsjPL3uCLGhg7lldiI3zIy3y5RdrW/0v4ilOgrBhyeTVVzL7KQIx7ann04PBBfV9hwAQHXX7HgJMt/rf6UwQxtsfhripqmvftpzopr8igaWW1jo3ZZumpXISxvyeW3LMX5/mZ1LaDrQoaJaHvs4k8zCGlKGDeEPl4/n0knRhA/56VTo+pZ2vj1Uwns7C/i/NVm8uCGP/1o0jqVTY11q5py7c72PsI5SqTJCVvuPoLS2xeVmAHUYMzwIISyYCQQwfALEpqmC5P0dDM58Xy2gm/fwgMoZfrCrkAA/b5vm/bFUVLA/l06K4YNdhdQ1u//CMCklL/6Qx+JnN1F0qom/Xz2Zr+4/m5tnJ5p98wcYMsiHK86K493bZ/HRHbMYERbAQx9kcP3L2yk61WTnV6B1x6IAIIRYKITIEULkCiEeM/O8EEI8bXo+UwgxtdNzK4QQZUKIA132CRNCfCuEOGL6PnTgL8eGKvPAP5SsU+qmydUGgDsE+PkwMqKX2gCdzbwTKo9Azuq+n8xoUEXOoybC6Iv6vr9JU6uBLzKLWTQhmsBBznHTeuucROpb2nl/V6Gjm2JTzW0G7nt3H098mc0F46L45oFzuDKtb4PwaQlhfLR8Nk8sncj+kzVc/PRGvj1UasNWa5bqNQAIIbyBZ4FFQCpwnRAitctmi4AU09ftwPOdnnsNWGjm0I8B66SUKcA60+/OqyoPwpM4VKJyALnaFNDOUqODySqxMACkLlEF4zf+o+8rg/e9rYLH2QP79L82q5T6lnauTLN93h9LTYoLJT1hKK9tOYrB6J5TQmua2rj+5W18nlnEry8aw3M3TCUs0K9fx/LyElw3PZ4v7plL3NDB/PL1Xfx73RE9ndbBLLkDmA7kSinzpZStwLvA4i7bLAZel8o2IFQIEQ0gpdwAVJk57mJgpennlcCSfrTffirzTDmA6ogYMsilUkB0lRoTTEFVk2V5bbx9YO79ULQHcr60/CQtdfDdHyFuOqR2/XPpm1UZRUQFD2LGyPABHcfabps7koKqJtZmud+n2eqGVm54ZRv7T9bw/A1Tueu8ZKv03SdGBPLRHbNZelYsf//2MA99kNFzahLNpiwJALFAQaffC02P9XWbrqKklMUApu9mV/YIIW4XQuwSQuwqLy+3oLk20NYENYUQnkx2Sa3L9v936Oi+yrZkHABgyg0QMQa++S20W1gecf2TUF8KC58Y0Kf/mqY2fsgp59JJMQ6Z+9+TC1OjiA0dzKub3StLaH1LO8tWbOdwaT0vLktj4QTrjrsM8vHm79dM5sEFo/l4z0l+sXIXTa06CDiCJQHA3P+6rvdtlmzTL1LKl6SU6VLK9MjI/s8hH5Cqo4CkfehIjpTWn55J46rGW1IcpjNvX1j4J5UMb/PTvW9/bBNsfRbSb4O49AG0FL4+WEKrwchlk2MGdBxb8PH24ubZCWzLr+JgUY2jm2MVre1Glr+xm6ziOl68MY3zx0bZ5DxCCO6dn8JfrprE5twKbl6xwyMG1J2NJQGgEBjR6fc4oKgf23RV2tFNZPpeZkFbHMM0BbTQK5ZWg5GxLn4HEBk0iIghfpbNBOqQfAGMXwo/PAkFPdQKqCuBj2+HoYlw4f8OuK2fZxSREB7A5LiQAR/LFn6WHk+Anzevbj7m6KYMmJSSX3+YwabcCp5cOpHz7JBu45r0Efzr2rPYc6KaG/+zg1ONuuiOPVkSAHYCKUKIkUIIP+BaYFWXbVYBN5lmA80Eajq6d3qwCujIC3Az8Fkf2m1flSoAHGhSc/9ddQZQByEE4yypDdDVpU9BcCy8c63K7dNVfTm8dRU0nYJrVg4o5TNARX0Lm3MruGxSjNPOHQ8J8OWqtDhW7SuivM7C7jEn9dz6PD7bV8TDF47m6vQRve9gJZdNjuH5G9PIKqpl2X92eGzNheY2A5tzK3jhhzzueWcvVzy3mTlPfseE33/N6N99yYbD1u8C7zUASCnbgbuBr4Es4H0p5UEhxHIhxHLTZmuAfCAXeBm4s2N/IcQ7wFZgjBCiUAjxc9NTTwILhBBHgAWm351TZS4ERrK/0oiftxdJka6XAqKr1JhgDpfU09reh/n9g0Phxo9Vn/4rC2Dvm9DeqiqlZX0BL58HFbnws9chevKA27hmfzFGiVN2/3R2y+xEWg1G3tp+3NFN6bfvc8r42zc5XD45hrvOS7b7+RekRvHisjSyS2q55dUd1LfYqCSpk2loaef9XQXc9tpOpvzPN9zwynae/DKbPcerCfDzZsbIMK5JH8Ftc0YSO3Sw1c9v0aRqKeUa1Jt858de6PSzBO7qZl+zyd+llJXAfItb6khV+aYVwHUkDxuCrw1r0NrLxNgQWg1GckrqmNiX7pWIZPjFOvjwVvjsLvjiAUCAoQUiRsOtq9XiMSv4PKOIMVFBjHHyqmujIodw3phI3tx2nDvOTWKQj7ejm9QnxysbuO+dvYwdHsyfr5zksLut88YO45nrp3LXW3u49dUdrLxtutumj8gpqeO1LUdZta+IhlYDI8IGc+20eM4ZHcmUEaEM7ed0275yz6trbZV5kHwBWQdrmZfimikgupocFwpARuGpvgUAgKEJKgjkrlUDvtKo0jyMXgg+1vnDPXmqiZ3Hqnn4wtFWOZ6t3TZ3JMv+s4MvMoq50oHJ6vqqqdXAr97YjRCCF29MY7CfY4PXReOH869rz+Ked/bwi5W7WHHLNPx9XSug9iSz8BTPfJfLN4dKGezrzaWTovnZtBGkJQx1SODVAaA3LXVQX0JDUALldS0uPwOoQ9zQwYQF+pFZeAroR2lFISBlgfqygdWZag6Bs3f/dJibHEHKsCGs2HzUpfLd/HH1IXJK63jt1unEh/eSG8pOLpkUTathMg++n8Htb+zmpWVpLh8ECqsbefLLbL7ILCZksC/3zU/h1jmJhAbY55N+d3QA6I2pDvAJ1BuRqw8AdxBCMCkuhMxC55y+uCqjiMlxIS6TbVMIVSvgvz7ez46jVcwY5VyL1sz5+mAJb28/wa/OHsU5ox00xbobV5wVR1u75JGPMrnrrT08f2OaS2bfrW9p57nvc3ll01G8BNw7P4VfzhtJkL+vo5sG6GRwvTPNADrUorp+xjp5f3RfTIoL5XBpHY2tzjXgll9ez4GTtS7z6b/DFWfFMjTAlxUusDCspKaZRz/KZEJsMA9dOMbRzTHrmmkj+OOSCazLLuPOt/b0bcKCE1ifU8ZFT23gufV5XDIxmu8eOpcHF4x2mjd/0AGgd6YAsKMmlGFBg7rNfuiKJseFYJRw4GQfp4Pa2OcZxQgBl05yrQDg7+vN9TPi+eZQKQVVjY5uTreMRslDH+yjpc3Iv649y6k/WS+bmcD/LB7P2qxS7nxrt0ukjahuaOXB9/dxy6s7GeznzUd3zOKpn00hJtT6s3gGynn/5Z1FVR4Ex5JR2uo23T8dJpkGgtU4gHOQUrIq4yTTE8MYHuLv6Ob02bKZiXgLwcotxxzdlG69vDGfzbmV/P6yVJeY0nzTrET+uGQCa7PKuOPNPTS3OW8QWLO/mAVP/cCqfUXcc34yq++dS1qC81aO0wGgNxVHMIYlkVde73YBIDJoELGhg8lwonGArOI68sobXK77p8PwEH8umRTNezsLnHIu+/7CGv76dQ6LJgznZ9Pst9hroJbNTOD/rpjAd9llLH9zt9MFgbLaZpa/sZs739rD8BB/Prt7Dg9dOMbppwTrANATKaHiMKcCRtJmkKTGuFcAAEwDwacc3YzTVmUU4e0luNgJCr/0121zRlLX0s472084uilnaGhp59539xIZNIgnlk50mZlKHW6YkcATSyeyPqecm5wkbYSUkvd3FXDBP37gu5wyHl04lk/vnMP4GOdMXdKVDgA9qS+FllqOe6l53e4yBbSzSXGhHK9spLrBOf4zfZFZxNzkiH7nnXcGk0eEMjc5ghc35DvVJ9X/+fwQxyob+Mc1Uxw+/bC/rpsez9PXncW+glNc9cJWTjqwulhBVSM3rdjBIx9mMmZ4EF/dN487zk3Cx4UWirpOSx3BlO/mQEsU/r5ejHRgMXJb6UiylnnS8d1AewtOUVjd5LLdP53dc34yFfUtvLPDOe4CvtxfzHu7CrjjnCRmJTn/FNWeXD45hpW3Tae0tpkrnt1s9ztYo1Hy2uajXPTPDew5Xs0fF4/nvdtnMcoFxlO60gGgJxWHAdhSG8bY4cFOl4/eGibGheAlYM/xakc3hVX7ivDz8eKi8bZJQWxPM0aFM2NkGC/8kOfwu4CiU0089vF+JseF8MAC11hZ3ZtZSeF8uHw2vt5eXPX8Vt7aftwu1cUOnKzh6he38vjnh0hPDOPrB85m2axEvFz0vUEHgJ5UHEH6BbG51Nct+/8Bgvx9GTM8mN0ODgAGo2T1/mLOHzPMqeZJD8R981MorW3h/V0FvW9sIwaj5IH39tFmUFM+3SGPVYcxw4P4/J65zEwK57efHOC+d/fZrCuzqqGV33yyn8ue2cTRigb+dvVkVt46jbihzrF6ur/c56/BFipyaBuaRG2zwS37/zukJwxl74lq2g2OW2iz/Wgl5XUtbtH902FWUjjTEofyzHe5Dlts98IPeWw/WsUfLh9Poht2YYYF+vHqLdN4aMFo1uwv5oJ//MDnGUVWuxuobW7jX2uPcM5fv+e9nQXcMjuR7x8+l6vS4lxuEN0cHQB6UnGECn+VJ8dd7wAA0hOH0tBqINtU8N4RPs8oItDPm/PtUITEXoQQPLpwLGV1Lfxno/1XB+8rOMVT3x7mkknRXOVCCer6yttLcM/8FD6/Zy4xoYO55529LH1+C1tyK/odCIprmvjHt4eZ9+fveWrtYWaOCmfNvfP4/WXjCRnsHneooHMBda+lDmpPcnToYoRwrxQQXaUlDAVg17EqJsTaf/paa7uRLw+UsCA1yuHZKK0tPTGMi8ZH8cIPeVw3I54IO60kr29p57539xIV7M+flrjelM/+GBcdzCd3zubD3YX8a90Rrn9lO2Oigrhu+gguSI3qtbumuqGV77LL+PJACd/nlGGUkvljo7j/ghSH/L+wBx0AulNxBICM5ihGRgS6bV5ygNjQwQwP9mfX8WpumTPS7ufflFvOqcY2t+r+6eyRhWNZm7WBp749zP9dMdHm55NS8uhHmRRUNfLu7bMICXCfT6y98fH24trp8Sw5K5ZP9p7k7e0nePzzQzz++SFGRgQyJiqIxIhAAv288fYWVDe0UlzTzKGiWvIrGgCICh7E7WeP4rpp8U6TIdVW3PddbaBMAWDzqaGkJrhv9w+oroq0xKEOGwj+PEOlyJ2X4lwZKa0lKXIIy2YmsHLrMa5JH8HkEaE2Pd+rm4+xOrOYRxaOYfpI501DYEv+vt5cNz2e66bHk1tWx/qccrYfreJwWR3rsktpM0jTdl4MC/Jn7PAgrkyLY15KBBNjQzzijgl0AOheRQ7Sy4ftNaE86Mb9/x3SE4ayOrOYk6eaiLVj0qrmNgPfHCzhsskxTp2UbKAevFANUv7mk/18dtccmy0W2nWsij+tyWJBahR3nJNkk3O4muRhQSQPC+IX80adfqzdYKTdKBnk4+Uxb/bmuO//uIGqOEzzkHja8XHrGUAd0k0Jq3Ydq7Lreb/LLqOh1eC23T8dgv19+f1l4zlYVMtrNkoUV1zTxJ1v7SF26GD+dvVkj35j642Ptxf+vt4ef410AOhOxRHKBsUD7j0DqENqTDBB/j5szau063k/zygiYsggZrpAAZWBunjicM4fO4y/fp3D4VLrzriqa27j1ld30thq4MVlaW41U0WzHR0AzDG0Q2UeuTKWiCGDGBbkemmJ+8rbSzBzVDib8yrsds7a5ja+yy7jkonD3XKVdVdCCJ68ciJB/j7c+85eq60QbjMYuevtvRwpq+e5G6Yydrj7f2DRrEMHAHOq8sDYxt7GYR7x6b/DnKRwCqqa7FbMZHVmMS3tRq6Y6r5z1LsaFuTPX6+eTHZJHb/5ZP+AFyy1G4w89H4GGw6X86crJnC2k5V21JybDgDmlB4EYGNNJOOi3Xf+f1dzklXZy8259rkL+HhPIUmRgacT0nmK88YM44ELRvPxnpP8+7vcfh+n3WDk/vf2sSqjiMcWjeVn0+Kt2ErNE+gAYE5ZFlJ4kW2IYaKbLgAxJ3nYEIYFDWKzHcYBjlc2sPNYNVe6yZL6vrp3fjJLp8byj28P8+IPeX3ev7a5jZ+v3MUXmcX85uKxLNczfrR+0NNAzSk7RG1APC1NfkyKDXV0a+xGCMGc5Ag2HilHSmnTN+aP9pxECFVI3RMJIXhy6SRa2o088WU2lQ2tPHLRGIumhx4squG+d/dxrKKBJ5ZO5Lrp+pO/1j/6DsCc0oOc8EkkZLAvI8Kcr5CzLc1OCqeivpUcK89S6cxolHy8p5C5yRFEh3jW9e3Mz8eLp689ixtnxvPShnyueXErB3qoy1DT2Mafv8pm8TObqWlq442fz9Bv/tqAWHQHIIRYCPwL8AZekVI+2eV5YXr+YqARuEVKuaenfYUQjwO/BMpNh/mNlHLNQF/QgLU2QPUxMgbPZlKc56wI7NAxDrDxcIXNZpPsOFZFYXUTD13oHrnpB8LbS/C/SyYyLTGM//fZQS799ybmpURw0fjhJA8bgo+XoKC6kc25lXx1oIT6lnaWnhXL/7ss1WWremnOo9cAIITwBp4FFgCFwE4hxCop5aFOmy0CUkxfM4DngRkW7PuUlPJvVns11lCeDUi21A5j4mTP6f/vEBM6mLHDg1ibVcovzx7V+w798NHuQgL9vLlo/HCbHN8VLZ4Sy7ljhrFi01E+2lPI7z49cMbzQYN8WDhhOD+fO5JxHrAwUbMPS+4ApgO5Usp8ACHEu8BioHMAWAy8LtWctm1CiFAhRDSQaMG+zqVUNe2QMY7LPWx2SocFqVE8tz6PU42tVv+UWdPUxheZxSyeEuPWCfb6I2SwLw8sGM39F6RQWN3EscoGjBKiQ/wZFRHoUrVmNddgyV9ULNC5pFGh6TFLtult37uFEJlCiBVCiKHmTi6EuF0IsUsIsau8vNzcJtZVlkW7lz8nZBQT40Jtfz4ndMG4KAxGyfoc61/vT/YU0tRm4IYZCVY/trsQQjAiLIB5KZGcMzqS0VFB+s1fswlL/qrMdYJ3Xb3S3TY97fs8kARMAYqBv5s7uZTyJSllupQyPTLSDotcyg5S7JfA0EB/YkLcfwWwORNjQxgWNIhvs0qtelwpJW9tP8HkuBAmeujdlaY5E0sCQCEwotPvcUCRhdt0u6+UslRKaZBSGoGXUV1Njld6iCxDHBM9cAC4g5eXYP64YfyQU05Lu/UKmu88Vs2Rsnr96V/TnIQlAWAnkCKEGCmE8AOuBVZ12WYVcJNQZgI1UsrinvY1jRF0uAI4gKM1VEBDGTubhjPJgxaAmXPh+OHUt7Sz4bD1VgW/ue04Qf4+bp/5U9NcRa8BQErZDtwNfA1kAe9LKQ8KIZYLIZabNlsD5AO5qE/zd/a0r2mfvwgh9gshMoHzgAes97L6qTgDgAPGRI/t/+8wNzmCsEA/Ptt30irHKzrVxOr9xVyTPsLtyj5qmquyaBqGaX7+mi6PvdDpZwncZem+pseX9aml9lC8D4CDxkQmeXgfta+3F5dMjOaD3QXUt7QzZNDAZuys2KSKot821/4lJzVNM09PLeisOINy3xiCQiOICvbMAeDOFk+JobnNyFcHSgZ0nJqmNt7ZcYJLJ0XbtdqYpmk90wGgs6J9ZBgSmZpgdkaqx0lLGMrIiEDe2XFiQMd5c9txGloN/HKebRaWaZrWPzoAdGiqhlPH2d0ST1p8qKNb4xSEENwwI57dx6s5WNR9jpqe1DS18eIPecwfO4wJHj6wrmnORgeADsWZAOyXI0kz1cfV4Oq0Efj7evHmtuP92v+VjfnUNrfzoM77o2lORweADqYB4DzvJMZ6UBGY3oQE+HLFWXF8tOckJTXNfdq3rK6ZFZuOcsnEaMbH6E//muZsdADoUJxBqdcwEkbE4auX3Z/hznOTMBolz63vW/WqJ9Zk02aQOuunpjkp/U5nYizczd72RNL0APBPjAgL4Or0Eby7o4ATlZbVC96SV8Ene0/yq3NGMSpyiI1bqGlaf+gAAFBfhtepY+wypOgA0I175yfj5+PFbz/tvZB5dUMrD72fQWJ4AHeem2ynFmqa1lc6AAAU7ABgjzGFs0boAGBOdMhgHl04ho1HKnhnR0G327UbjDz4/j4q6lt45vqpetWvpjkxHQAACnfQjg9twyYyNFBXWerODTMSmJscwe9XHWDTkZ/mCGozGHnkw0y+zynn95eN19M+Nc3J6QAAGE/sYL8cybRknaSsJ15egmevn8rIiEBufW0Hr2zMp7nNgJSSAydruP7lbXy89yQPLRjNjTN1xk9Nc3a6JFN7KxTtYbfhfGYnhTu6NU4vJMCXD341mwfe38f/rs7iL1/nEOjnTXVjGyGDfXnqZ5O54qw4RzdT0zQL6ABQvA8vQwt75WiuGaUXgFkiJMCX/9yczrb8Kr7PKaOhpZ2x0cFcOjFad6FpmgvRAeDoDwDURM0g2N/XwY1xHUIIZiWFM0vfNWmay/L4AGDI+4EcmcCElCRHN0XTNM2uPHsQuK0JCraz2TCeuckRjm6NpmmaXXl2ACjYgbexlb3ek5g+Uvf/a5rmWTy6C0jmfY8BLwYlzcHPx7NjoaZpnsejA0DLwc/ZbRjH7FRdplDTNM/juR97K/PwP5XLWpnGuWOGObo1mqZpduexAUBmrwagLHo+kUGDHNwaTdM0+/PYLqDGzM84bkxgTvpURzdF0zTNITzzDqDqKIGlu/jSOINFE4Y7ujWapmkO4ZF3AIZ97yAQFCcu0akLNE3zWJ4XAAzttOx8nT2GVC6em+7o1miapjmMx3UByYOfENBUzOqAxZw7Ws/+0TTNc3nWHYDRQP26v1JqjGHCedfg5SUc3SJN0zSHsegOQAixUAiRI4TIFUI8ZuZ5IYR42vR8phBiam/7CiHChBDfCiGOmL7bvBZj6/YVBNXk8M7g67hmmi5YommaZ+s1AAghvIFngUVAKnCdECK1y2aLgBTT1+3A8xbs+xiwTkqZAqwz/W4zLSf3Y/j292wxpHLulcvx9fa43i9N07QzWPIuOB3IlVLmSylbgXeBxV22WQy8LpVtQKgQIrqXfRcDK00/rwSWDOyldG/rq48iXz6POoMvR+f9lXm671/TNM2iABALFHT6vdD0mCXb9LRvlJSyGMD03ey7shDidiHELiHErvLycgua+1PeITHsHbqQY0u/4IYL5/brGJqmae7GkkFgcyOl0sJtLNm3R1LKl4CXANLT0/u0b4fpS+/rz26apmluzZI7gEJgRKff44AiC7fpad9SUzcRpu9lljdb0zRNGyhLAsBOIEUIMVII4QdcC6zqss0q4CbTbKCZQI2pW6enfVcBN5t+vhn4bICvRdM0TeuDXruApJTtQoi7ga8Bb2CFlPKgEGK56fkXgDXAxUAu0Ajc2tO+pkM/CbwvhPg5cAK42qqvTNM0TeuRkLJf3eoOkZ6eLnft2uXoZmiaprkUIcRuKeVPct/oyfCapmkeSgcATdM0D6UDgKZpmofSAUDTNM1DudQgsBCiHDjez90jgAorNsfV6etxJn09fqSvxZnc4XokSCkjuz7oUgFgIIQQu8yNgnsqfT3OpK/Hj/S1OJM7Xw/dBaRpmuahdADQNE3zUJ4UAF5ydAOcjL4eZ9LX40f6WpzJba+Hx4wBaJqmaWfypDsATdM0rRMdADRN0zyUywQAexemF0L8l2n7HCHERbZ/hX1jz+shhFgghNgthNhv+n6+fV6l5ez992F6Pl4IUS+EeNi2r65vHPB/ZZIQYqsQ4qDpb8Tf9q/Scnb+v+IrhFhpug5ZQoj/ss+r7CcppdN/oVJJ5wGjAD8gA0jtss3FwJeoKmQzge297Qv8BXjM9PNjwJ9NP6eathsEjDTt7+3o6+DA63EWEGP6eQJw0tHXwJHXo9MxPwI+AB529DVw4N+GD5AJTDb9Hu7h/1euB941/RwAHAMSHX0duvtylTsAexemX4z6R2yRUh5F1TmYbqPX1h92vR5Syr1Syo5KbgcBfyHEIBu9tv6w998HQoglQD7qejgTe1+LC4FMKWUGgJSyUkppsNFr6w97Xw8JBAohfIDBQCtQa5uXNnCuEgDsXZjekvM5kr2vR2dXAnullC39br312fV6CCECgUeBP1ip/dZk77+N0YAUQnwthNgjhHjEKq/Ceux9PT4EGoBiVKGrv0kpqwb+MmzDkqLwzsDehekHXMzexux9PdQBhRgP/Bn1qc+Z2Pt6/AF4SkpZL4S53R3K3tfCB5gLTENVA1wnVPGRdb011E7sfT2mAwYgBhgKbBRCrJVS5vfWUEdwlQAwkML0fj3sWyqEiJZSFoszC9Nbcj5Hsvf1QAgRB3wC3CSlzLPKq7Aee1+PGcBVQoi/AKGAUQjRLKV8xhovZoAc8X/lByllBYAQYg0wFXCWAGDv63E98JWUsg0oE0JsBtJR3YXOx9GDEJZ8oQJVPmpAtmMwZnyXbS7hzIGcHb3tC/yVMwdy/mL6eTxnDgLn41wDW/a+HqGm7a509Gt3huvR5biP41yDwPb+2xgK7EENePoAa4FLHH0dHHg9HgVeNR0rEDgETHL0dej2+ji6AX34h7wYOIwalf+t6bHlwHLTzwJ41vT8fiC9p31Nj4ejPqkcMX0P6/Tcb03b5wCLHP36HXk9gN+h+jX3dfoa5uhr4Mi/j07bPI4TBQBHXAvgRtRg+AHMBElHf9n5/8oQ1Mywg6g3/187+vX39KVTQWiapnkoV5kFpGmaplmZDgCapmkeSgcATdM0D6UDgKZpmofSAUDTNM1D6QCgaZrmoXQA0DRN81D/H2DoAihHczLoAAAAAElFTkSuQmCC\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plt.plot(times, ekin+epot)\n", - "plt.plot(times, ework)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "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 -} diff --git a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test_static.ipynb b/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test_static.ipynb deleted file mode 100644 index f6cdb9c13..000000000 --- a/examples/structural_mechanics/python_interface/structural_mechanics_python_interface_test_static.ipynb +++ /dev/null @@ -1,323 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Test of Structural Mechanics\n", - "This nodebook is based on the test `test_structural_mechanics_model_bernoulli_beam_2.cc`.\n", - "It shows how meshes can be read in from the file system." - ] - }, - { - "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 matplotlib\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the Mesh\n", - "We will read it in from a file directly, instead of manually create it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# Create a mesh for the two dimensional case\n", - "beam = pyaka.Mesh(2)\n", - "beam.read(\"_bernoulli_beam_2.msh\", pyaka._miot_gmsh_struct)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Creating the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "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": 5, - "metadata": {}, - "outputs": [], - "source": [ - "mat1 = pyaka.StructuralMaterial()\n", - "mat1.E = 3e10\n", - "mat1.I = 0.0025\n", - "mat1.A = 0.01\n", - "mat1ID = model.addMaterial(mat1)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "mat2 = pyaka.StructuralMaterial()\n", - "mat2.E = 3e10\n", - "mat2.I = 0.00128\n", - "mat2.A = 0.01\n", - "mat2ID = model.addMaterial(mat2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Initializing the Model" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "model.initFull(pyaka.AnalysisMethod._static)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Assigning the Materials" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "materials = model.getElementMaterialMap(pyaka.ElementType._bernoulli_beam_2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "materials[0][0] = mat1ID\n", - "materials[1][0] = mat2ID" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "##### Setting Boundaries" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Neumann\n", - "M = 3600\n", - "q = 6000\n", - "L = 10\n", - "forces = model.getExternalForce()\n", - "forces[:] = 0\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[2, 0] = mat2.E * mat2.A / 18 \n", - "forces[2, 2] = -M" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "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[1, 1] = True\n", - "boundary[2, :] = False\n", - "boundary[2, 1] = True" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Solving the System" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "model.solveStep()\n", - "disp = model.getDisplacement()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Extract the solution" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [], - "source": [ - "d1 = disp[1, 2]\n", - "d2 = disp[2, 2]\n", - "d3 = disp[1, 0]\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Compare with Analytical Solution\n", - "For reference see the referenced file above." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "d1_ex = 5.6 / 4800\n", - "d2_ex = -3.7 / 4800\n", - "d3_ex = 10. / 18" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from math import isclose " - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "It worked\n" - ] - } - ], - "source": [ - "status = True\n", - "if not isclose(d1_ex, d1):\n", - " print(\"Failed for d1, expected '{}' but got '{}'\".format(d1_ex, d1))\n", - " status = False\n", - "if not isclose(d2_ex, d2):\n", - " print(\"Failed for d2, expected '{}' but got '{}'\".format(d2_ex, d2))\n", - " status = False\n", - "if not isclose(d3_ex, d3):\n", - " print(\"Failed for d3, expected '{}' but got '{}'\".format(d3_ex, d3))\n", - " status = False\n", - "if status:\n", - " print(\"It worked\")\n", - "else:\n", - " raise ValueError(\"There is an error, some tests failed.\")" - ] - } - ], - "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 -}