Skip to content
Snippets Groups Projects
oofem_classes.py 5.92 KiB
Newer Older
  • Learn to ignore specific revisions
  • Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    """
    This is an empty docstring.
    """
    
    import numpy as np
    
    
    class Constraint:
        def __init__(self, free):
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            self.free = free # poner dtype boolean
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        def is_free(self, c_component):
            return self.free[c_component]
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def print_constraint(self):
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            print('{}'.format(self.free))
    
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    class Force:
        def __init__(self, force_components):
            self.components = np.array(force_components, dtype='float64')
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def get_component(self, c_component):
            return self.components[c_component]
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def print_force(self):
            print('{}'.format(self.components))
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    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))
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        def set_displacement(self, new_displacement):
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            self.displacement = np.array(new_displacement, dtype='float64')
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        def set_constraint(self, new_constraint):
            self.constraint = new_constraint
    
        def set_force(self, new_force):
            self.force = new_force
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def get_position(self):
            return self.position
    
        def get_displacement(self):
            return self.displacement
    
        def get_constraint(self):
            return self.constraint
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def get_force(self):
            return self.force
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def get_dof_numbers(self):
            return self.dof_numbers
    
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def enumerate_dofs(self, start):
            current_dof = start
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            if self.constraint == None:
    
                self.dof_numbers = np.array([current_dof, current_dof + 1, current_dof + 2], dtype='int32').reshape(3,1)
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
            else:
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
                for i in range(3):
                    if self.constraint.is_free(i) == False:
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
                        self.dof_numbers[i] = -1
                    else:
                        self.dof_numbers[i] = current_dof
                        current_dof = current_dof + 1
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            return current_dof
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def print_node(self):
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            print('{}'.format(self.position))
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    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
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            self.dof_numbers = None
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        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
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def get_length(self):
            return np.linalg.norm(self.node_1.get_position() -
                                  self.node_2.get_position())
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def compute_stiffness_matrix(self):
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            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)
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            K = np.concatenate((K_11_12, K_21_22), axis=0)
    
            return K
            
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        def enumerate_dofs(self):
            self.dof_numbers = np.concatenate([self.node_1.get_dof_numbers(),
    
                                               self.node_2.get_dof_numbers()])
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        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()
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            T = (position_node_2 - position_node_1) / self.get_length()
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            uN1 = np.dot(T, displacement_node_1)
            uN2 = np.dot(T, displacement_node_2)
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            eStrain = (uN2-uN1) * (1/self.get_length())
    
            N = eStrain * self.get_elastic_modulus() * self.get_area()
    
            return N
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def print_element(self):
            print('Element:/n')
            print('E = {}\nArea = {}\nlength = {}'.format(self.get_elastic_modulus(),
                                                          self.get_area(),
                                                          self.get_length()))
    
    class Visualizer:
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def __init__(self, struct):
            self.struct = struct
            self.displacement_scale
            self.symbol_scale
            self.num_elements = self.struct.get_number_elements()
    
    class Structure:
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def __init__(self):
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            self.nodes = list()
            self.elements = list()
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            self.structure_displacement = None
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        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)
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def get_number_nodes(self):
            return len(self.nodes)
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
        def add_node(self, position_new_node):
            self.nodes.append(Node(position_new_node))
            return self.get_node[-1]
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        def add_element(self, elastic_modulus, area, node_1_id, node_2_id):
            self.elements.append(Element(elastic_modulus, area,
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
                                         self.get_node[node_1_id],
                                         self.get_node[node_2_id]))
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
            return self.get_element[-1]
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
    
    
    Ernesto Oquelis's avatar
    Ernesto Oquelis committed
        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")