Newer
Older
"""
This is an empty docstring.
"""
import numpy as np
class Constraint:
def __init__(self, free):
def is_free(self, c_component):
return self.free[c_component]
class Force:
def __init__(self, force_components):
self.components = np.array(force_components, dtype='float64')
def get_component(self, c_component):
return self.components[c_component]
class Node:
def __init__(self, position):
self.position = np.array(position, dtype='float64')
self.displacement = None
self.constraint = None
self.forces = None
self.dof_numbers = np.zeros((3,1))
def set_constraint(self, new_constraint):
self.constraint = new_constraint
def set_force(self, new_force):
self.force = new_force
def get_position(self):
return self.position
def get_displacement(self):
return self.displacement
def get_constraint(self):
return self.constraint
self.dof_numbers = np.array([current_dof, current_dof + 1, current_dof + 2], dtype='int32').reshape(3,1)
self.dof_numbers[i] = -1
else:
self.dof_numbers[i] = current_dof
current_dof = current_dof + 1
class Element:
def __init__(self, elastic_modulus, area, node_1, node_2):
self.elastic_modulus = elastic_modulus
self. area = area
self.node_1 = node_1
self.node_2 = node_2
def get_elastic_modulus(self):
return self.elastic_modulus
def get_area(self):
return self.area
def get_node_1(self):
return self.node_1
def get_node_2(self):
return self.node_2
def get_dofs(self):
return self.dof_numbers
def get_length(self):
return np.linalg.norm(self.node_1.get_position() -
self.node_2.get_position())
diff = self.node_1.get_position() - self.node_2.get_position()
EAL = self.get_elastic_modulus() * self.get_area() / self.get_length() ** 3
K_11 = EAL * np.outer(diff, diff)
K_22 = EAL * np.outer(-diff, -diff)
K_12 = EAL * np.outer(diff, -diff)
K_21 = K_12
K_11_12 = np.concatenate((K_11, K_12), axis=1)
K_21_22 = np.concatenate((K_21, K_22), axis=1)
K = np.concatenate((K_11_12, K_21_22), axis=0)
return K
def enumerate_dofs(self):
self.dof_numbers = np.concatenate([self.node_1.get_dof_numbers(),
def compute_force(self):
position_node_1 = self.get_node_1().get_position()
position_node_2 = self.get_node_2().get_position()
displacement_node_1 = self.get_node_1().get_displacement()
displacement_node_2 = self.get_node_2().get_displacement()
uN1 = np.dot(T, displacement_node_1)
uN2 = np.dot(T, displacement_node_2)
eStrain = (uN2-uN1) * (1/self.get_length())
N = eStrain * self.get_elastic_modulus() * self.get_area()
return N
def print_element(self):
print('Element:/n')
print('E = {}\nArea = {}\nlength = {}'.format(self.get_elastic_modulus(),
self.get_area(),
self.get_length()))
class Visualizer:
def __init__(self, struct):
self.struct = struct
self.num_elements = self.struct.get_number_elements()
def get_node(self, node_id):
self.nodes[node_id]
def get_element(self, element_id):
self.elements[element_id]
def get_number_elements(self):
return len(self.elements)
def add_node(self, position_new_node):
self.nodes.append(Node(position_new_node))
return self.get_node[-1]
def add_element(self, elastic_modulus, area, node_1_id, node_2_id):
self.elements.append(Element(elastic_modulus, area,
def enumerate_dofs(self):
NEQ = int(0)
for i in range(self.get_number_nodes()):
NEQ = self.get_node(i).enumerate_dofs(i)
for j in range(self.get_number_elements()):
self.get_element(j).enumerate_dofs();
return NEQ
def assemble_load_vector(self, rGlobal):
for nod in range(self.get_number_nodes()):
DOF = self.get_node(nod).get_dofs_numbers()
if self.get_node(nod).get_force() is not None:
force = self.get_node(nod).get_force()
for i in range(3):
if DOF[i] != -1:
rGlobal[DOF[i]] = rGlobal[DOF[i]] + force[i]
def print_structure(self):
print("ESCRIBIR ALGO ACA")