Source code for trusspy.core.analysis
# -*- coding: utf-8 -*-
"""
title: TrussPy - Truss Solver for Python
author: Andreas Dutzler
year: 2023
"""
import numpy as np
[docs]class Analysis:
"""Analysis class containing all data for one increment.
Attributes
----------
U : None
placeholder for 2d-array with total displacement vector at the end of the inc.
`U.shape = (nnodes, ndim)`. To get Ux,Uy,Uz of node i type: `U[i]`
U0 : None
placeholder for 2d-array with total displacement vector at the beginning of the
inc. `U0.shape = (nnodes, ndim)`. To get U0x,U0y,U0z of node i type: `U0[i]`
r : None
placeholder for 2d-array with internal force vector
`r.shape = (nnodes, ndim)`. To get rx,ry,rz of node i type: `r[i]`
g : None
placeholder for 2d-array with equilibrium vector
`g.shape = (nnodes, ndim)`. To get gx,gy,gz of node i type: `g[i]`
K : None
placeholder for 4d-array with stiffness matrix
`K.shape = (nnodes,nnodes,ndim,ndim)`. To get K with shape (ndim,ndim)
between force of node i w.r.t. displacement of node j type K[i,j].
stretch : None
placeholder for 2d-array with stretch vector
`stretch.shape = (nelems, 1)`. To get stretch of element i
type: `stretch[i]`
element_force : None
placeholder for 2d-array with element force vector
`element_force.shape = (nelems, 1)`. To get element_force of element i
type: `element_force[i]`
element_stress : None
placeholder for 2d-array with element stress vector
`element_stress.shape = (nelems, 1)`. To get element_stress of element i
type: `element_stress[i]`
element_stress0 : None
placeholder for 2d-array with element stress vector at the beginning of the
increment ``element_stress0.shape = (nelems, 1)``. To get element_stress0 of
element ``i`` type: ``element_stress0[i]``.
DOF0 : None
placeholder for indices of inactive (locked) degree of freedoms
DOF1 : None
placeholder for indices of active (free) degree of freedoms
Ured : None
placeholder for reduced dispaclement vector
(only active components of U)
Vred : None
placeholder for reduced dispaclement vector
(only active components of V)
state_v : None
placeholder for state variable vector
"""
def __init__(self):
self.U = None
self.U0 = None
self.r = None
self.g = None
self.K = None
self.stretch = None
self.element_force = None
self.element_stress0 = None
self.element_stress = None
self.DOF0 = None
self.DOF1 = None
self.Ured = None
self.rred = None
self.state_v = None
self.dVmax = None
[docs] def build(self, nnodes, nelems, ndim, DOF0, DOF1, nstatev=0):
"""Build/initialize analysis class with given dimensions regarding
nodes and dimension.
Parameter
---------
nnodes : int
Number of nodes
nelems : int
Number of elements
ndim : int
Dimension of analysis
DOF0 : int
indices of inactive (locked) degree of freedoms
(generated with flattened degree of freedoms)
DOF1 : int
indices of active (free) degree of freedoms
(generated with flattened degree of freedoms)
Raises
------
ValueError : Result is not empty and can't be built.
Dimensions already set.
"""
if self.U is None:
self.step = 1
self.U = np.zeros((nnodes, ndim))
self.U0 = np.zeros((nnodes, ndim))
self.r = np.zeros((nnodes, ndim))
self.g = np.zeros((nnodes, ndim))
self.K = np.zeros((nnodes, nnodes, ndim, ndim))
self.stretch = np.zeros((nelems, 1))
self.element_force = np.zeros((nelems, 1))
self.element_stress0 = np.zeros((nelems, 1))
self.element_stress = np.zeros((nelems, 1))
self.DOF0 = DOF0
self.DOF1 = DOF1
self.Ured = self.get_U(flat=True)[DOF1]
self.rred = self.get_r(flat=True)[DOF1]
if nstatev > 0:
self.state_v = np.zeros((nelems, nstatev))
else:
self.state_v = None
else:
raise ValueError("Displacements or Residuals already loaded.")
[docs] def get_U(self, flat=False, red=False):
"get flattened/reduced set of displacement vector U"
if flat:
return self.U.flatten()
elif red:
return self.Ured
else:
return self.U
[docs] def get_r(self, flat=False, red=False):
"get flattened/reduced set of interal force vector r"
if flat:
return self.r.flatten()
elif red:
return self.rred
else:
return self.r