Source code for openflash.meem_problem
import numpy as np
from openflash.geometry import Geometry
[docs]
class MEEMProblem:
"""
Encapsulates the full configuration and computation targets for a MEEM scenario.
"""
def __init__(self, geometry: Geometry):
"""
Initialize a MEEMProblem instance.
Parameters
----------
geometry : Geometry
The full system geometry, including all domains.
"""
self.geometry = geometry
self.domain_list = geometry.domain_list
self.frequencies = np.array([]) # Angular frequencies ω (rad/s)
[docs]
def set_frequencies(self, frequencies: np.ndarray):
"""
Set the angular frequencies for this problem.
Parameters
----------
frequencies : np.ndarray
Array of angular frequencies or omega (rad/s).
"""
assert np.all(frequencies > 0), "All frequencies must be positive"
assert isinstance(frequencies, np.ndarray), "frequencies must be a numpy array"
self.frequencies = frequencies
@property
def modes(self) -> np.ndarray:
"""
Infers the active modes (degrees of freedom) from the
heaving flags set on the geometry's bodies.
This assumes the body index (0, 1, 2...) corresponds
to the mode index.
"""
# Assumes bodies are SteppedBody or CoordinateBody
heaving_bodies = [
i for i, body in enumerate(self.geometry.body_arrangement.bodies)
if body.heaving
]
return np.array(heaving_bodies)