Source code for elastica.rod.rod_base
__doc__ = """Base class for rods"""
from typing import Type
import numpy as np
from numpy.typing import NDArray
from elastica.rod.energy import RodEnergy
from elastica.rod.knot_theory import KnotTheory
[docs]
class RodBase(RodEnergy, KnotTheory):
"""
Base class for all rods.
Notes
-----
All new rod classes must be derived from this RodBase class.
"""
REQUISITE_MODULES: list[Type] = []
# Geometry
n_elems: int
n_nodes: int
# State arrays
position_collection: NDArray[np.float64]
velocity_collection: NDArray[np.float64]
acceleration_collection: NDArray[np.float64]
director_collection: NDArray[np.float64]
omega_collection: NDArray[np.float64]
alpha_collection: NDArray[np.float64]
# External forces/torques
external_forces: NDArray[np.float64]
external_torques: NDArray[np.float64]
# Internal forces/torques
internal_forces: NDArray[np.float64]
internal_torques: NDArray[np.float64]
# Rod-specific properties
mass: NDArray[np.float64]
volume: NDArray[np.float64]
radius: NDArray[np.float64]
tangents: NDArray[np.float64]
lengths: NDArray[np.float64]
rest_lengths: NDArray[np.float64]
rest_voronoi_lengths: NDArray[np.float64]
kappa: NDArray[np.float64]
sigma: NDArray[np.float64]
rest_kappa: NDArray[np.float64]
rest_sigma: NDArray[np.float64]
internal_stress: NDArray[np.float64]
internal_couple: NDArray[np.float64]
dilatation: NDArray[np.float64]
dilatation_rate: NDArray[np.float64]
voronoi_dilatation: NDArray[np.float64]
bend_matrix: NDArray[np.float64]
shear_matrix: NDArray[np.float64]
mass_second_moment_of_inertia: NDArray[np.float64]
inv_mass_second_moment_of_inertia: NDArray[np.float64]
# Ring rod / periodic boundary
ring_rod_flag: bool
ghost_voronoi_idx: NDArray[np.int32]
ghost_elems_idx: NDArray[np.int32]
periodic_boundary_nodes_idx: NDArray[np.int32]
periodic_boundary_elems_idx: NDArray[np.int32]
periodic_boundary_voronoi_idx: NDArray[np.int32]
# Symplectic stepper state
v_w_collection: NDArray[np.float64]
dvdt_dwdt_collection: NDArray[np.float64]