Source code for sigmaepsilon.solid.fourier.loads.rectangleload
from typing import Iterable
import numpy as np
from numpy import ndarray
from ..preproc import rhs_rect_const, rhs_rect_mc
from ..utils import points_to_rectangle_region
from ..protocols import NavierProblemProtocol
from .loads import LoadCase, Float1d, Float2d
from ..config import Config
__all__ = ["RectangleLoad"]
[docs]
class RectangleLoad(LoadCase[Float2d, Float1d]):
"""
A class to handle loads defined over a single rectangle.
Parameters
----------
domain: :class:`~sigmaepsilon.solid.fourier.loads.Float2d`
The coordinates of the lower-left and upper-right points of the region
where the load is applied. Default is ``None``.
value: :class:`~sigmaepsilon.solid.fourier.loads.Float1d`
Load intensities for each dof in the order :math:`f_z, m_x, m_y`.
num_mc: int, Optional
The number of sampling points for Monte Carlo integration. If no value
is provided, the global config value is used.
.. hint::
For a detailed explanation of the sign conventions, refer to
:ref:`this <plate_sign_conventions>` section of the theory guide.
"""
@property
def region(self) -> Iterable:
"""
Returns the region as a list of 4 values x0, y0, w, and h, where x0 and y0 are
the coordinates of the bottom-left corner, w and h are the width and height
of the region.
"""
return points_to_rectangle_region(np.array(self.domain))
[docs]
def rhs(self, problem: NavierProblemProtocol) -> ndarray:
"""
Returns the coefficients as a NumPy array.
Parameters
----------
problem: :class:`~sigmaepsilon.solid.fourier.problem.NavierProblem`
A problem the coefficients are generated for. If not specified,
the attached problem of the object is used. Default is None.
Returns
-------
numpy.ndarray
2d float array of shape (H, 3), where H is the total number
of harmonic terms involved (defined for the problem).
"""
assert problem.model_type.is_2d, f"Invalid model type {problem.model_type}."
domain = np.array(self.domain, dtype=float)
values = self.value
n_MC = self._num_mc or Config.NUM_MC_SAMPLES_PLATE
has_symbolic_load = any(not isinstance(vi, (float, int)) for vi in values)
if has_symbolic_load:
return rhs_rect_mc(problem.size, problem.shape, domain, values, n_MC=n_MC)
else:
values = np.array(values, dtype=float)
return rhs_rect_const(problem.size, problem.shape, domain, values)