Source code for trusspy.handlers.handler_extforce

# -*- coding: utf-8 -*-
"""
title: TrussPy - Truss Solver for Python
author: Andreas Dutzler
year: 2023
"""

import numpy as np

from ..core.external_force import ExternalForce


[docs]class ExternalForceHandler: "Handler for External Forces" def __init__(self): self.nodes = None self.forces = None def __enter__(self): return self def __exit__(self, H_type, H_value, H_traceback): pass
[docs] def add_force(self, F, *args, **kwargs): if "ExternalForce" not in str(type(F)): F = ExternalForce(F, *args, **kwargs) if self.nodes is None: self.nodes = np.array([F.node]) self.forces = np.array([F.force]) else: self.nodes = np.append(self.nodes, F.node) self.forces = np.vstack((self.forces, F.force))
[docs] def del_force(self, label): idx = np.where(self.nodes == label)[0] self.nodes = np.delete(self.nodes, idx, axis=0) self.forces = np.delete(self.forces, idx, axis=0)
[docs] def add_forces(self, FF): for F in FF: self.add_force(F)
[docs] def fix_forces(self, nodelist): # check for missing external forces --> set them all to zero # are nodelist entries in force-nodes? mask = np.isin(nodelist, self.nodes, invert=True) fix_nodes = nodelist[mask] # nodes to fix comp = self.forces.shape[1] for n in fix_nodes: F = ExternalForce(n, np.zeros(comp)) self.add_force(F) indices = np.argsort(self.nodes) self.nodes = self.nodes.take(indices) self.forces = self.forces.take(indices, axis=0)