Seismo-VLAB  1.3
An Open-Source Finite Element Software for Meso-Scale Simulations

Background

The lin3DTruss2 class creates a linearized three-dimensional truss element with two-nodes. Each node has three degrees-of-freedom, and each degree-of-freedom represents a translation in the X-, Y-, and Z-directions. Figure provides a simple representation of this element in which the local coordinates are represented by r-axis, and (1) and (2) represent the start and end nodes of the element respectively. The element mass, damping and stiffness matrices, as well as internal force vector are computed in local-coordinates and then transformed into global coordinates. No numerical integration is employed for this element.

lin3DTruss2.png

The {lin3DTruss2} lumped mass matrix in global coordinates is:

\[ \textbf{M}^\textrm{e} = \rho \,\textrm{AL} \,\textbf{T}_\textrm{e}^\top \begin{bmatrix} \frac{1}{2} & 0 & 0 & 0 & 0 & 0 \\ 0 & \frac{1}{2} & 0 & 0 & 0 & 0 \\ 0 & 0 & \frac{1}{2} & 0 & 0 & 0 \\ 0 & 0 & 0 & \frac{1}{2} & 0 & 0 \\ 0 & 0 & 0 & 0 & \frac{1}{2} & 0 \\ 0 & 0 & 0 & 0 & 0 & \frac{1}{2} \end{bmatrix} \textbf{T}_\textrm{e} \,, \]

while the consistent mass matrix iin global coordinates is:

\[ \textbf{M}^\textrm{e} = \rho \,\textrm{AL} \, \textbf{T}_\textrm{e}^\top \begin{bmatrix} \frac{1}{3} & 0 & 0 & \frac{1}{6} & 0 & 0 \\ 0 & \frac{1}{3} & 0 & 0 & \frac{1}{6} & 0 \\ 0 & 0 & \frac{1}{3} & 0 & 0 &\frac{1}{6} \\ \frac{1}{6} & 0 & 0 & \frac{1}{3} & 0 & 0 \\ 0 & \frac{1}{6} & 0 & 0 & \frac{1}{3} & 0 \\ 0 & 0 & \frac{1}{6} & 0 & 0 & \frac{1}{3} \end{bmatrix} \textbf{T}_\textrm{e} \,, \]

where the transformation matrix is

\[ \textbf{T}_\textrm{e} = \begin{bmatrix} \hat{\textbf{N}} & 0 \\ 0 & \hat{\textbf{N}} \end{bmatrix}\,, \]

and \(\hat{\textbf{N}} = [\hat{\textrm{n}}_1, \hat{\textrm{n}}_2, \hat{\textrm{n}}_3]^\top\) is the unit matrix of local coordinate axes, and \(\hat{\textrm{n}}_\textrm{i}\) is the unit vector of the i-th local coordinate axis. Note that \(\hat{\textbf{N}} \in \mathbb{R}^{3 \times 3}\), and \(\hat{\textrm{n}}_\textrm{i} \in \mathbb{R}^3\).

The lin3DTruss2 stiffness matrix in in local coordinates is computed as

\[ \mathcal{K}^\textrm{e} = \frac{EA}{L} \begin{bmatrix} 1 & -1 \\ -1 & 1 \end{bmatrix} \,, \]

and the stiffness matrix in global coordinates is \(\textbf{K}^\textrm{e} = \textbf{T}_\textrm{e}^\top \mathcal{K}^\textrm{e} \,\textbf{T}_\textrm{e}\). However, the transformation matrix from local to global axes is \(\textbf{T}_\textrm{e} = \begin{bmatrix} \hat{\textrm{n}}_1^\top & 0 \\ 0 & \hat{\textrm{n}}_1^\top \end{bmatrix}\), where \(\hat{\textrm{n}}_1 \in \mathbb{R}^{3}\) is the unit vector along the truss. Note that \(\textbf{M}^\textrm{e}, \textbf{C}^\textrm{e} , \textbf{K}^\textrm{e} \in \mathbb{R}^{\textrm{N}_\textrm{dof}^\textrm{e} \times \textrm{N}_\textrm{dof}^\textrm{e}}\) with \(\textrm{N}_\textrm{dof}^\textrm{e} = 6\) in this case.

REFERENCE:

  • Bathe, K. Jurgen, "Finite Element Procedures", Chapter 5: pages 339-340. Prentice-Hall, 1996.

Pre-Analysis

The python Pre-Analysis in the 01-Pre_Process/Method/Attach.py file provides with an interface to populate the Entities dictionary. This file contains several functions to populate specific fields. For example, to create a lin3DTruss2, using json format, use:

  • addElement(tag, name='lin3DTruss2', conn, attributes):

    • tag : The identifier of this element, i.e., tag > -1
    • name : Seismo-VLAB element class name
    • conn : Connectivity array of this element
    • attributes : Specific properties for the created element, for example
      • 'material' is the hight of the line cross section.
      • 'area' is the cross section area.

    Example

    A LIN3DTRUSS2 element can be defined using the python interface as follows:
    SVL.addElement(tag=1, name='lin3DTruss2', conn=[1,2], attributes={'area': 0.5, 'material': 1})

    Application
    Please refer to the C03-ST_Lin_3DAxial_Elastic_Truss2.py file located at 03-Validations/01-Debugging/ to see an example on how to define a lin3DTruss2 element.

On the contrary, the 01-Pre_Process/Method/Remove.py file provides with an interface to depopulate the Entities dictionary. For example, to remove an already define Element, use:

  • delElement(tag):
    • tag : The identifier of the element to be removed, i.e., tag > -1

Run-Analysis

The C++ Run-Analysis in the 02-Run_Process/04-Elements/03-Truss/lin3DTruss2.cpp file provides the class implementation. A lin3DTruss2 element is created using the built-in json parse-structure provided in the Driver.hpp. A lin3DTruss2 is defined inside the "Elements" json field indicating its "Tag" as follows,

  • {
        "Elements": {
            "Tag": {
                "name" : "LIN3DTRUSS2",
                "conn" : [ ],
                "attributes": {
                    "area": double,
                    "material": int
                }
            }
        }
    }
    
    Variable Description
    Tag Unique element object identifier.
    conn The element connectivity node array.
    area The cross-section area of the element.
    materialThe biaxial material identifier.

    Attention
    This formulation only allows small deformations.
    Material non-linearity can be used in this element.
    Example

    A LIN3DTRUSS2 element between nodes 1 and 2, made of material 1, and area 0.5 is constructed as:
    { "Elements": { "1": { "name" : "LIN3DTRUSS2", "conn" : [1,2], "attributes": { "area": 0.50, "material": 1 } } } }