Esempio n. 1
0
def stiffness_adaptation(system: "SystemElements", verbosity: int,
                         max_iter: int) -> np.ndarray:
    """
    Non linear solver for the nodes by adapting the stiffness of the elements (nodes).

    :return: Vector with displacements.
    """
    system.solve(True, naked=True)
    if verbosity == 0:
        logging.info("Starting stiffness adaptation calculation.")

    # check validity
    assert all(
        [mp > 0 for mpd in system.non_linear_elements.values() for mp in mpd]
    ), "Cannot solve for an mp = 0. If you want a hinge set the spring stiffness equal to 0."

    for c in range(max_iter):
        factors = []

        # update the elements stiffnesses
        for k, v in system.non_linear_elements.items():
            el = system.element_map[k]
            assert el.element_force_vector is not None

            for node_no, mp in v.items():
                if node_no == 1:
                    # Fast Ty
                    m_e = (el.element_force_vector[2] +
                           el.element_primary_force_vector[2])
                else:
                    # Fast Ty
                    m_e = (el.element_force_vector[5] +
                           el.element_primary_force_vector[5])

                if abs(m_e) > mp:
                    el.nodes_plastic[node_no - 1] = True
                if el.nodes_plastic[node_no - 1]:
                    factor = converge(m_e, mp)
                    factors.append(factor)
                    el.update_stiffness(factor, node_no)

        if not np.allclose(factors, 1, 1e-3):
            system.solve(force_linear=True, naked=True)
        else:
            system.post_processor.node_results_elements()
            system.post_processor.node_results_system()
            system.post_processor.reaction_forces()
            system.post_processor.element_results()
            break

    if c == max_iter - 1:
        logging.warning(
            "Couldn't solve the in the amount of iterations given. max_iter={}"
            .format(max_iter))
    elif verbosity == 0:
        logging.info("Solved in {} iterations".format(c))

    assert system.system_displacement_vector is not None
    return system.system_displacement_vector
Esempio n. 2
0
def stiffness_adaptation(system, verbosity, max_iter):
    """
    Non linear solver for the nodes by adapting the stiffness of the elements (nodes).

    :param system: (SystemElements)
    :param verbosity: (int)
    :param max_iter: (int)
    :return: (np.array) Vector with displacements.
    """
    system.solve(True, naked=True)
    if verbosity == 0:
        logging.info("Starting stiffness adaptation calculation.")

    # check validity
    assert all([mp > 0 for mpd in system.non_linear_elements.values() for mp in mpd]), \
        "Cannot solve for an mp = 0. If you want a hinge set the spring stiffness equal to 0."

    for c in range(max_iter):
        factors = []

        # update the elements stiffnesses
        for k, v in system.non_linear_elements.items():
            el = system.element_map[k]

            for node_no, mp in v.items():
                if node_no == 1:
                    # Fast Ty
                    m_e = el.element_force_vector[2] + el.element_primary_force_vector[2]
                else:
                    # Fast Ty
                    m_e = el.element_force_vector[5] + el.element_primary_force_vector[5]

                if abs(m_e) > mp:
                    el.nodes_plastic[node_no - 1] = True
                if el.nodes_plastic[node_no - 1]:
                    factor = converge(m_e, mp)
                    factors.append(factor)
                    el.update_stiffness(factor, node_no)

        if not np.allclose(factors, 1, 1e-3):
            system.solve(force_linear=True, naked=True)
        else:
            system.post_processor.node_results_elements()
            system.post_processor.node_results_system()
            system.post_processor.reaction_forces()
            system.post_processor.element_results()
            break

    if c == max_iter - 1:
        logging.warning("Couldn't solve the in the amount of iterations given. max_iter={}".format(max_iter))
    elif verbosity == 0:
        logging.info("Solved in {} iterations".format(c))
    return system.system_displacement_vector
Esempio n. 3
0
    def _stiffness_adaptation(self, verbosity, max_iter):
        self.solve(True, naked=True)
        if verbosity == 0:
            print("Starting stiffness adaptation calculation.")

        # check validity
        assert all([mp > 0 for mpd in self.non_linear_elements.values() for mp in mpd]), \
            "Cannot solve for an mp = 0. If you want a hinge set the spring stiffness equal to 0."

        for c in range(max_iter):
            factors = []

            # update the elements stiffnesses
            for k, v in self.non_linear_elements.items():
                el = self.element_map[k]

                for node_no, mp in v.items():
                    if node_no == 1:
                        # Fast Ty
                        m_e = el.element_force_vector[
                            2] + el.element_primary_force_vector[2]
                    else:
                        # Fast Ty
                        m_e = el.element_force_vector[
                            5] + el.element_primary_force_vector[5]

                    if abs(m_e) > mp:
                        el.nodes_plastic[node_no - 1] = True
                    if el.nodes_plastic[node_no - 1]:
                        factor = converge(m_e, mp, 3)
                        factors.append(factor)
                        el.update_stiffness(factor, node_no)

            if not np.allclose(factors, 1, 1e-3):
                self.solve(force_linear=True, naked=True)
            else:
                self.post_processor.node_results_elements()
                self.post_processor.node_results_system()
                self.post_processor.reaction_forces()
                self.post_processor.element_results()
                break

        if c == max_iter - 1:
            print("Couldn't solve the in the amount of iterations given.")
        elif verbosity == 0:
            print("Solved in {} iterations".format(c))
        return self.system_displacement_vector
Esempio n. 4
0
    def _stiffness_adaptation(self, verbosity, max_iter):
        self.solve(True, naked=True)
        if verbosity == 0:
            print("Starting stiffness adaptation calculation.")

        for c in range(max_iter):
            factors = []

            # update the elements stiffnesses
            for k, v in self.non_linear_elements.items():
                el = self.element_map[k]

                for node_no, mp in v.items():
                    if node_no == 1:
                        # Fast Ty
                        m_e = el.element_force_vector[2] + el.element_primary_force_vector[2]
                    else:
                        # Fast Ty
                        m_e = el.element_force_vector[5] + el.element_primary_force_vector[5]

                    if abs(m_e) > mp:
                        el.nodes_plastic[node_no - 1] = True
                    if el.nodes_plastic[node_no - 1]:
                        factor = converge(m_e, mp, 3)
                        factors.append(factor)
                        el.update_stiffness(factor, node_no)

            if not np.allclose(factors, 1, 1e-3):
                self.solve(force_linear=True, naked=True)
            else:
                self.post_processor.node_results_elements()
                self.post_processor.node_results_system()
                self.post_processor.reaction_forces()
                self.post_processor.element_results()
                break
        if verbosity == 0:
            print("Solved in {} iterations".format(c))

        return self.system_displacement_vector