{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import theme\n", "theme.load_style()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Lesson 4: Plane and Space Trusses" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\"Creative\n", "\n", "This lecture by Tim Fuller is licensed under the\n", "Creative Commons Attribution 4.0 International License. All code examples are also licensed under the [MIT license](http://opensource.org/licenses/MIT)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "# Topics\n", "\n", "- [Introduction](#intro)\n", "- [Local and Global Coordinates](#loc_glob_coords)\n", " - [Overview](#lg_overview)\n", " - [Coordinate Transformation](#coord_trans)\n", " - [Truss Equations in Global Coordinates](#g_trusseq)\n", "- [Example](#ex1)\n", " - [Element Connectivity](#el_conn_ex1)\n", " - [Boundary Conditions](#bcs_ex1)\n", " - [Solution](#sol_ex1)\n", "- [Computational Implementation](#computational_implementation)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "# Introduction[](#top)\n", "\n", "\n", "\n", "Are the above structures frames or trusses?\n", "\n", "**Frame**\n", "\n", "- Carries transverse and bending loads\n", "- Members are connected rigidly\n", "\n", "**Truss**\n", "\n", "- Members only carry axial loads (no transverse shearing or bending)\n", "- Members are connected by pins that allow free rotation \n", "\n", "Because of their pin connections, individual members of truesses support only axial loads, as shown below.\n", "\n", "\n", "\n", "Because of this property, members of trusses are termed \"two force\" members. Importantly, though members in a truss support only loads along their axis, the truss is capable of supporting loads in the $XY$ plane (2D plane trusses) or $XYZ$ space (3D space trusses). This gives rise to the notion of a \"local\" coordinate system for individual members and a a \"global\" coordinate system for the truss. In general, force-displacement relationships for members are formulated in their local coordinate system and transformed to the global truss coordinate system where they are solved. The remainder of this chapter will focus on formulating and solving these systems of equations for trusses." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "# Local and Global Coordinate Systems[](#top)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Overview\n", "\n", "A member of a truss is a 1D two-force member embedded in a 2D (plane truss) or 3D (space truss) coordinate system, as shown below. In their local coordinates ($\\hat{x}$, $\\hat{y}$), members of a truss experience forces and displacements in only their local $\\hat{x}$ direction. When viewed in the global coordinates, members experience forces and displacements in the $x$ and the $y$ coordinate directions.\n", "\n", "To accomodate the extra dimensionality, rows and columns of zeros are inserted in the local element stiffness equation corresponding to the (non-existent) forces and displacements in the local $\\hat{y}$ direction.\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
1D element coordinate system
\n", " $$ \n", " \\begin{Bmatrix} f_{i\\hat{x}} \\\\ f_{j\\hat{x}} \\end{Bmatrix} =\n", " k^{(e)}\\begin{bmatrix} 1 & -1 \\\\ -1 & 1 \\end{bmatrix}\n", " \\begin{Bmatrix} u_{i\\hat{x}} \\\\ u_{j\\hat{x}} \\end{Bmatrix}\n", " $$\n", "
\n", "
2D element coordinate system
\n", " $$ \n", " \\begin{Bmatrix} \n", " f_{i\\hat{x}} \\\\ f_{i\\hat{y}} \\\\ f_{j\\hat{x}} \\\\ f_{j\\hat{y}}\n", " \\end{Bmatrix} =\n", " k^{(e)}\\begin{bmatrix} \n", " 1 & 0 & -1 & 0 \\\\ \n", " 0 & 0 & 0 & 0 \\\\\n", " -1 & 0 & 1 & 0 \\\\\n", " 0 & 0 & 0 & 0 \\\\\n", " \\end{bmatrix}\n", " \\begin{Bmatrix} \n", " u_{i\\hat{x}} \\\\ u_{i\\hat{y}} \\\\ u_{j\\hat{x}} \\\\ u_{j\\hat{y}} \n", " \\end{Bmatrix}$$\n", "
\n", "\n", "Casting the local equations in the global 2D system requires a change of coordinates by means of [Coordinate Transformations](#coord_trans)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Coordinate Transformation\n", "\n", "Consider the vector $\\boldsymbol{v}$ represented in a local coordinate system ($\\hat{x},\\hat{y}$) embedded in a global coordinate system ($x,y$).\n", "\n", "\n", "\n", "The components of $\\boldsymbol{v}$ in the local coordinate system $v_{\\hat{x}}$ and $v_{\\hat{y}}$ are related to the components $v_x$ and $v_y$ in the global coordinates by\n", "\n", "$$\n", "\\begin{align}\n", "v_x &= v_{\\hat{x}} \\cos \\theta - v_{\\hat{y}} \\sin \\theta \\\\\n", "v_y &= v_{\\hat{x}} \\sin \\theta + v_{\\hat{y}} \\cos \\theta\n", "\\end{align}\n", "$$\n", "\n", "In matrix form, we say\n", "\n", "$$\n", "\\begin{Bmatrix} v_x \\\\ v_y \\end{Bmatrix} = \n", "\\begin{bmatrix} \n", "\\cos \\theta & -\\sin \\theta \\\\ \\sin \\theta & \\cos \\theta \n", "\\end{bmatrix}\n", "\\begin{Bmatrix} v_{\\hat{x}} \\\\ v_{\\hat{y}} \\end{Bmatrix}\n", "$$\n", "\n", "we recognize \n", "\n", "$$\n", "R_{ij} = \\begin{bmatrix} \n", "\\cos \\theta & -\\sin \\theta \\\\ \\sin \\theta & \\cos \\theta \n", "\\end{bmatrix}\n", "$$\n", "\n", "as the familiar rotation matrix.\n", "\n", "The components of displacement and force in the local coordinates transform similarly. In compact notation we right\n", "\n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
Displacement relationship
\n", "$$\n", "\\begin{align}\n", "u_{ix} &= u_{i\\hat{x}} \\cos \\theta - u_{i\\hat{y}} \\sin \\theta \\\\\n", "u_{iy} &= u_{i\\hat{x}} \\sin \\theta + u_{i\\hat{y}} \\cos \\theta \\\\\n", "u_{jx} &= u_{j\\hat{x}} \\cos \\theta - u_{j\\hat{y}} \\sin \\theta \\\\\n", "u_{jy} &= u_{j\\hat{x}} \\sin \\theta + u_{j\\hat{y}} \\cos \\theta\n", "\\end{align}\n", "$$\n", "
\n", "
Force relationship
\n", "$$\n", "\\begin{align}\n", "f_{ix} &= f_{i\\hat{x}} \\cos \\theta - f_{i\\hat{y}} \\sin \\theta \\\\\n", "f_{iy} &= f_{i\\hat{x}} \\sin \\theta + f_{i\\hat{y}} \\cos \\theta \\\\\n", "f_{jx} &= f_{j\\hat{x}} \\cos \\theta - f_{j\\hat{y}} \\sin \\theta \\\\\n", "f_{jy} &= f_{j\\hat{x}} \\sin \\theta + f_{j\\hat{y}} \\cos \\theta\n", "\\end{align}\n", "$$\n", "
\n", "\n", "In matrix notation, we write\n", "\n", "$$\n", "\\begin{Bmatrix} u_{ix} \\\\ u_{iy} \\\\ u_{jx} \\\\ u_{jy} \\end{Bmatrix} = \n", "\\begin{bmatrix} \n", "\\cos \\theta & -\\sin \\theta & 0 & 0 \\\\ \n", "\\sin \\theta & \\cos \\theta & 0 & 0 \\\\\n", "0 & 0 & \\cos \\theta & -\\sin \\theta \\\\ \n", "0 & 0 & \\sin \\theta & \\cos \\theta \n", "\\end{bmatrix}\n", "\\begin{Bmatrix} u_{i\\hat{x}} \\\\ u_{i\\hat{y}} \\\\ u_{j\\hat{x}} \\\\ u_{j\\hat{y}} \\end{Bmatrix}\n", "$$\n", "\n", "and similarly for the force." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Remark
\n", "Each node now has 2 degrees of freedom\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Remark
\n", " \n", "Note the ordering of the nodal displacements for the now multi-DOF displacement array above, repeated here\n", "\n", "$$\n", "\\begin{Bmatrix} \n", "u_{1x} \\\\ \n", "u_{1y} \\\\ \n", "u_{2x} \\\\ \n", "u_{2y} \\\\\n", "\\vdots \\\\\n", "u_{nx} \\\\ \n", "u_{ny} \\\\ \n", "\\end{Bmatrix}\n", "\\begin{matrix} \n", "\\longleftarrow 1^{\\text{st}} \\text{ and } 2^{\\text{nd}} \\text{ DOF for node 1} \\\\[8pt]\n", "\\longleftarrow 1^{\\text{st}} \\text{ and } 2^{\\text{nd}} \\text{ DOF for node 2} \\\\[7pt]\n", "\\vdots \\\\[7pt]\n", "\\longleftarrow 1^{\\text{st}} \\text{ and } 2^{\\text{nd}} \\text{ DOF for node n}\n", "\\end{matrix}\n", "$$\n", "\n", "Other node ordering schemes exit, such as\n", "\n", "$$\n", "\\begin{Bmatrix} \n", "u_{1x} \\\\ \n", "u_{2x} \\\\ \n", "\\vdots \\\\\n", "u_{nx} \\\\\n", "u_{1y} \\\\ \n", "u_{2y} \\\\\n", "\\vdots \\\\\n", "u_{ny} \\\\ \n", "\\end{Bmatrix}\n", "$$\n", "\n", "Each ordering technique has its merit. In this course, we adopt the former ordering method.\n", "\n", "With the chosen array ordering, the global degree of freedom $DOF$ of the local degree of freedom $dof$ of node $i$ is given by\n", "
\n", "\n", "$$DOF = 2i + dof$$\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Truss Equations in the Global Coordinates[](#top)\n", "\n", "Returning to the force displacement relationships. The transformation from local to global coordinates for the displacement and force arrays is given by\n", "\n", "$$\n", "\\{u\\} = [T]\\{\\hat{u}\\}\n", "$$\n", "$$\n", "\\{f\\} = [T]\\{\\hat{f}\\}\n", "$$\n", "\n", "where\n", "\n", "$$\n", "T = \\begin{bmatrix}\n", "\\cos \\theta & -\\sin \\theta & 0 & 0 \\\\\n", "\\sin \\theta & \\cos \\theta & 0& 0 \\\\\n", "0 & 0 & \\cos \\theta & -\\sin \\theta \\\\\n", "0 & 0 & \\sin \\theta & \\cos \\theta\n", "\\end{bmatrix}\n", "$$\n", "\n", "In the local coordinates, recall that\n", "\n", "$$\n", "\\{\\hat{f}\\} = [\\hat{k}] \\{\\hat{u}\\}\n", "$$\n", "\n", "or,\n", "\n", "$$\n", "\\{\\hat{f}\\} = [T]^{-1} \\{f\\} = [\\hat{k}] \\{\\hat{u}\\} = [\\hat{k}] [T]^{-1} \\{u\n", "\\}$$\n", "\n", "which simplifies to\n", "\n", "$$\n", "\\{f\\} = [T] \\{\\hat{u}\\} [T]^{-1} \\{u\\}\n", "$$\n", "\n", "or\n", "\n", "$$\n", "\\{f\\} = [k] \\{u\\}\n", "$$\n", "\n", "where\n", "\n", "$$\n", "[k] = [T] \\{\\hat{k}\\} [T]^{-1}\n", "$$\n", "\n", "You'll recall from linear algebra that $[T]$ is orthogonal, so $[T]^{-1} = [T]^{T}$\n", "\n", "Following through on the multiplication leads to \n", "\n", "$$\n", "[k] = \\hat{k}\\begin{bmatrix} \\cos^{2} \\theta & \\sin \\theta \\cos \\theta & -\\cos^{2} \\theta & -\\sin \\theta \\cos \\theta \\\\ \\sin \\theta \\cos \\theta & \\sin^{2} \\theta & - \\sin \\theta \\cos \\theta & - \\sin^{2} \\theta \\\\ - \\cos^{2} \\theta & - \\sin \\theta \\cos \\theta & \\cos^{2} \\theta & \\sin \\theta \\cos \\theta \\\\ - \\sin \\theta \\cos \\theta & - \\sin^{2} \\theta & \\sin \\theta \\cos \\theta & \\sin^{2} \\theta\\end{bmatrix}\n", "$$\n", "\n", "It turns out that $[k]$ has the same structure as $[\\hat{k}]$, namely\n", "\n", "$$\n", "[k] = \\hat{k}\\begin{bmatrix} a & b \\\\ -b & a \\end{bmatrix}\n", "$$\n", "\n", "In $[\\hat{k}]$, $a=b=1$ whereas in $[k]$, $a$ and $b$ are matrices. Being that the two views of the element stiffness have the same structure, the assembly of the components in to the global stiffness also has the same structure, as shown in the images below for five element structures in 1 and 2D.\n", "\n", "\n", "\n", " \n", " \n", "\n", "
\n", " \n", " \n", " \n", "
\n", "\n", "Note that the assembly procedure is the same and that, generally speaking, the shape of $[K]$ is $n_{\\text{dof}}^{\\text{sys}} \\times n_{\\text{dof}}^{\\text{sys}}$, $n_{\\text{dof}}^{\\text{sys}} = n\\cdot n_{\\text{dof}}^{\\text{n}}$ where $n$ and $n_{\\text{dof}}^{\\text{n}}$ are the number of nodes and the number of degrees of freedom per node, respectively. We see then that the assembly procedure in 1D is just a special case of the assembly procedure in 2D (any D, really). We'll see how to exploit this fact to generalize our existing finite element solver to solve systems in multiple dimensions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Alternative Method of Assembling $[k]$\n", "\n", "It turns out that we need to explicitly compute all the $\\theta$ to compute $[k]$. Recall\n", "\n", "\n", "\n", "So, \n", "\n", "$$\n", "[k] = [T] [\\hat{k}] [T]^{T} = \\hat{k}\\begin{bmatrix} \n", "n_{x}^{2} & n_{x} n_{y} & -n_{x}^{2} & -n_{x} n_{y}\\\\\n", "n_{x} n_{y} & n_{y}^{2} & -n_{x} n_{y} & -n_{y}^{2}\\\\\n", "-n_{x}^{2} & -n_{x} n_{y} & n_{x}^{2} & n_{x} n_{y}\\\\\n", "-n_{x} n_{y} & -n_{y}^{2} & n_{x} n_{y} & n_{y}^{2}\n", "\\end{bmatrix}\n", "$$\n", "\n", "The matrix above can be computed from the *outer product* of $\\boldsymbol{n}$ with itself. The outer product (often called the dyadic product) is denoted in some texts as $\\boldsymbol{a} \\otimes \\boldsymbol{b}$ and is defined as\n", "\n", "$$\n", "\\boldsymbol{C} = \\boldsymbol{a} \\otimes \\boldsymbol{b}\n", "\\qquad C_{ij} = a_i b_j\n", "$$\n", "\n", "#### Calculating Element Unit Vectors\n", "\n", "Exactly how do we calculate the unit vectors needed by the previous relationship? Consider the following truss, in particular element 3\n", "\n", "\n", "\n", "The nodes $i$ and $j$ associated with each element come from the element connectivity table. $x_i$ and $x_j$ come from the table of nodal coordinates.\n", "\n", "The element direction vector is given by\n", "\n", "$$\n", "v^{(3)} = x_j - x_i\n", "$$\n", "\n", "and the element length is\n", "\n", "$$\n", "l^{(3)} = || v^{(3)} || = \\sqrt{v^{(3)} \\cdot v^{(3)}} = \\sqrt{v_x^2 + v_y^2}\n", "$$\n", "\n", "Finally, the element unit vector is\n", "\n", "$$\n", "n^{(3)} = \\frac{v^{(3)}}{l^{(3)}}\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "# Example[](#top)\n", "\n", "Let's put it together with an example. Let us consider the following truss. We begin as with the 1D problems by analyzing the element connectivity and determining boundary conditions\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "## Element Connectivity\n", "\n", "Assembling the stiffness matrix is analogous to assembling 1D systems. We use a connectivity table as before\n", "\n", "| Element Number | Node i | Node j |\n", "| :-------------: |:------:| :-----:|\n", "| 1 | 1 | 2 | \n", "| 2 | 1 | 3 |\n", "\n", "## Boundary Conditions\n", "\n", "### Pinned Boundary Conditions\n", "\n", "The boundary conditions on the nodes 2 and 3 are examples of pinned boundary conditions - not allowing moving in the $x$ or the $y$ directions. Or, $u_{2x} = u_{2y} = u_{3x} = u_{3y} = 0$.\n", "\n", "### Roller Boundary Conditions\n", "\n", "The boundary condition on $x$ dof of node 1 is an example of a roller boundary condition. The displacement $u_{1y}$ is a model *unknown*\n", "\n", "### Displacement Boundary Conditions\n", "\n", "The boundary condition on the $y$ dof of noe 1 is an example of a displacement boundary condition. The displacement $u_{1x} = -\\delta$.\n", "\n", "### Force Boundary Conditions\n", "\n", "A nodal force is applied at node 1: $f_{1y} = P$\n", "\n", "## Solution\n", "\n", "The solution to the above problem is worked out in the computational cell below. One new thing to note is the use of the `femlib.viewer.display_truss` method that produces plots of truss members. See the usage below and the `femlib.viewer.display_truss` docstring for details. Also note the use of `-1` in the call to `np.reshape`. See the `numpy` [reshape](http://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html) documentation for details." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np\n", "from sympy import symbols, cos, sin, init_printing, Matrix\n", "init_printing()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\nXgPUEe/vBwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "[[-0.05 0.0882842]\n", " [ 0. 0. ]\n", " [ 0. 0. ]]\n" ] } ], "source": [ "# allows plots to be displayed inline\n", "%matplotlib inline\n", "from femlib.ifem import display_truss\n", "\n", "num_node = 3\n", "num_dof_per_node = 2\n", "num_elem = 2\n", "num_dof = num_node * num_dof_per_node\n", "\n", "# vertices[i,j] is the jth coordinate of the ith node\n", "node_map = [1, 2, 3]\n", "vertices = np.array([[0., 0.], \n", " [3., 4.], \n", " [0., 4.]])\n", "\n", "# connect[i,j] is the jth node number of the ith element\n", "connect = np.array([[1, 2], [1, 3]])\n", "\n", "# material properties\n", "E, A = 70E+09, 5 * .01 * .01\n", "\n", "# Load\n", "P = 1000E+03\n", "\n", "# Boundary conditions\n", "delta = .05\n", "\n", "# Element 1 stiffness\n", "v1 = vertices[1] - vertices[0]\n", "l1 = np.sqrt(np.dot(v1, v1))\n", "n1 = v1 / l1\n", "n1n1 = np.outer(n1, n1)\n", "k1 = A * E / l1 * n1n1\n", "\n", "# Element 2 stiffness\n", "v2 = vertices[2] - vertices[0]\n", "l2 = np.sqrt(np.dot(v2, v2))\n", "n2 = v2 / l2\n", "n2n2 = np.outer(n2, n2)\n", "k2 = A * E / l2 * n2n2\n", "\n", "# Global stiffness\n", "K = np.zeros((num_dof, num_dof))\n", "\n", "# Element 1 contribution to global stiffness. Note, that\n", "# K1 is a 2x2 so that we are adding in the full 4x4 element\n", "# stiffness to the global stiffness\n", "i, j = connect[0] - 1\n", "I, J = num_dof_per_node * i, num_dof_per_node * j\n", "K[I:I+2, I:I+2] += k1\n", "K[J:J+2, J:J+2] += k1\n", "K[I:I+2, J:J+2] -= k1\n", "K[J:J+2, I:I+2] -= k1\n", "\n", "# Element 2 contribution to global stiffness\n", "i, j = connect[1] - 1\n", "I, J = num_dof_per_node * i, num_dof_per_node * j\n", "K[I:I+2, I:I+2] += k2\n", "K[J:J+2, J:J+2] += k2\n", "K[I:I+2, J:J+2] -= k2\n", "K[J:J+2, I:I+2] -= k2\n", "\n", "# Global force\n", "F = np.zeros(num_dof)\n", "\n", "# P applied to node 1 in y direction\n", "node, dof = 0, 1\n", "F[num_dof_per_node * node + dof] = P\n", "\n", "# Apply boundary conditions via penalty method\n", "X = 1.e30\n", "Kbc = K.copy()\n", "Fbc = F.copy()\n", "\n", "# node 1: -delta applied in x direction\n", "Kbc[0,0] = X\n", "Fbc[0] = -delta * X\n", "\n", "# nodes 2,3: 0 applied to x,y directions\n", "Kbc[2,2] = Kbc[3,3] = Kbc[4,4] = Kbc[5,5] = X\n", "Fbc[2] = Fbc[3] = Fbc[4] = Fbc[5] = 0 *X\n", "\n", "# Solve for displacement\n", "u = np.linalg.solve(Kbc, Fbc)\n", "\n", "# Find reactions\n", "r = np.dot(K, u) - F\n", "\n", "# Updated nodal positions\n", "x = vertices + u.reshape((num_node, -1))\n", "\n", "# Display the truss\n", "display_truss(vertices, connect)\n", "\n", "# display the results\n", "display_truss(vertices, connect, overlay=x, oc=\"b\", ol=\"Deformed\")\n", "\n", "print u.reshape((num_node, -1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " \n", "# Computational Implementation[](#top)\n", "\n", "Would it be possible to modify `oned.solve_system` in such a way that it would be able to solve a truss problem and still be compatible with our `uniform_bar` and `tapered_bar` applications? Yes! And it requires only a slight modification to the assembly procedures to boot.\n", "\n", "Let's investigate the current `oned.solve_system` code and identify places where it will need to be modified, starting with the assembly of the global stiffness\n", "\n", "\n", "\n", "\n", "\n", "
\n", "
\n",
    "K = np.zeros((num_dof, num_dof))\n",
    "for (el, nodes) in enumerate(connect):\n",
    "    i = dof_map(nodes[0])\n",
    "    j = dof_map(nodes[1])\n",
    "    K[i, i] += k[el]\n",
    "    K[j, j] += k[el]\n",
    "    K[i, j] -= k[el]\n",
    "    K[j, i] -= k[el]\n",
    "
\n", "
\n", "

Note

\n", "The implicit assumption that k[el] is a scalar is made in the algorithm. For problems in more than 1 dimension (like a plane truss), k[el] is instead a matrix.\n", "
\n", "
\n", "\n", "The question then arises: how do we modify the above algorithm to allow for `k[el]` to be a matrix? The answer is quite simple, change the left hand side of the assignment, e.g, `K[i, i] += k[el]` to use the appropriate slice of `K` and not just a single index. The details are left as an exercise at the end of the chapter.\n", "\n", "
\n", "It turns out the modifying the global stiffness assembly is the only change needed to convert our existing code to work with trusses!\n", "
" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }