ConventionalSteelBracedFrame
ConventionalSteelBracedFrame
ConventionalSteelBracedFrame(name_prefix: str = 'conventional_steel_braced_frame', num_stories: int = 5, x_bays: Optional[Sequence[float]] = None, y_bays: Optional[Sequence[float]] = None, story_heights: Optional[Sequence[float]] = None, floor_masses: Optional[Sequence[float]] = None, brace_bays_x: Optional[Dict[str, Sequence[int]]] = None, brace_bays_y: Optional[Dict[str, Sequence[int]]] = None, brace_pattern: str = 'x', brace_area_scale: float = 1.0, target_period: Optional[float] = None, column_sections: Optional[Union[str, Sequence[str], Dict[Tuple[int, int, int], str]]] = None, beam_sections: Optional[Union[str, Sequence[str], Dict[Tuple[int, str, int, int], str]]] = None, brace_sections: Optional[Union[str, Sequence[str], Dict[Tuple[str, int, int], str]]] = None, brace_area: Optional[float] = None, brace_E: Optional[float] = None, n_ele_col: int = 1, n_ele_beam: int = 1, length_unit_system: str = 'm', origin: Tuple[float, float, float] = (0.0, 0.0, 0.0), opensees_exe: Optional[str] = None)
Bases: Building
Generic conventional concentrically braced steel building archetype.
The default model is a symmetric 5-story, 24 m by 24 m braced frame intended
for SSI/DRM studies. It is deliberately separate from
FEMA_SAC_SteelFrame and represents a stiffer conventional building whose
target fixed-base period follows T1 ~= 0.1 * num_stories.
Create the braced-frame archetype definition.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name_prefix
|
str
|
Mesh part and recorder name prefix. |
'conventional_steel_braced_frame'
|
num_stories
|
int
|
Number of stories. Defaults to |
5
|
x_bays
|
Optional[Sequence[float]]
|
X-direction bay widths. Defaults to three 8 m bays. |
None
|
y_bays
|
Optional[Sequence[float]]
|
Y-direction bay widths. Defaults to three 8 m bays. |
None
|
story_heights
|
Optional[Sequence[float]]
|
Story heights. Defaults to |
None
|
floor_masses
|
Optional[Sequence[float]]
|
True masses at floor COM nodes. Defaults to
|
None
|
brace_bays_x
|
Optional[Dict[str, Sequence[int]]]
|
Braced X-bay indices on |
None
|
brace_bays_y
|
Optional[Dict[str, Sequence[int]]]
|
Braced Y-bay indices on |
None
|
brace_pattern
|
str
|
|
'x'
|
brace_area_scale
|
float
|
Multiplier applied to brace section/direct area. |
1.0
|
target_period
|
Optional[float]
|
Optional calibration target. Defaults to |
None
|
column_sections
|
Optional[Union[str, Sequence[str], Dict[Tuple[int, int, int], str]]]
|
Section override for columns. |
None
|
beam_sections
|
Optional[Union[str, Sequence[str], Dict[Tuple[int, str, int, int], str]]]
|
Section override for beams. |
None
|
brace_sections
|
Optional[Union[str, Sequence[str], Dict[Tuple[str, int, int], str]]]
|
Section override for braces. |
None
|
brace_area
|
Optional[float]
|
Direct brace area used when not using AISC sections. |
None
|
brace_E
|
Optional[float]
|
Elastic modulus for direct-area brace material. If omitted, the supplied steel material modulus is used when available. |
None
|
n_ele_col
|
int
|
Number of elements per column member. |
1
|
n_ele_beam
|
int
|
Number of elements per beam member. |
1
|
length_unit_system
|
str
|
Unit system passed to AISC section creation. |
'm'
|
origin
|
Tuple[float, float, float]
|
Building origin. |
(0.0, 0.0, 0.0)
|
opensees_exe
|
Optional[str]
|
Optional OpenSees executable path for validation. |
None
|
Attributes
VALID_BRACE_PATTERNS
class-attribute
instance-attribute
story_heights
instance-attribute
story_heights = list(story_heights) if story_heights is not None else [4.0] + [3.5] * (num_stories - 1)
floor_masses
instance-attribute
brace_bays_x
instance-attribute
brace_bays_x = {'front': list(get('front', [])) if brace_bays_x else [mid_x], 'back': list(get('back', [])) if brace_bays_x else [mid_x]}
brace_bays_y
instance-attribute
brace_bays_y = {'left': list(get('left', [])) if brace_bays_y else [mid_y], 'right': list(get('right', [])) if brace_bays_y else [mid_y]}
target_period
instance-attribute
column_sections
instance-attribute
beam_sections
instance-attribute
brace_sections
instance-attribute
Methods:
get_coordinates
Return X, Y, and Z coordinate arrays for grid and floor elevations.
build
Build columns, beams, braces, and COM nodes as a Femora mesh part.
create_rigid_diaphragms
Create floor rigid diaphragms to COM nodes and fix COM vertical/rocking DOFs.
apply_fixed_base
Fix all base structural grid nodes for fixed-base period checks.
create_gravity_pattern
Create a plain gravity load pattern using true floor masses times g.
get_modes
get_modes(num_modes: int, *, material: Optional[Union[Dict[str, object], Callable]] = None, material_density: Optional[float] = None, opensees_exe: Optional[str] = None, print_results: bool = False, plot: bool = False, plot_scale: Optional[float] = None) -> Dict[str, np.ndarray]
Return modal frequencies, periods, and eigenvectors.
This method builds a copy of the braced frame in a separate temporary
Model instance, applies fixed-base and rigid-diaphragm constraints,
runs OpenSees from a temporary Tcl script, and parses modal data from
OpenSees output.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
num_modes
|
int
|
Number of eigen modes to request from OpenSees. |
required |
material
|
Optional[Union[Dict[str, object], Callable]]
|
Material definition for the isolated modal model. Use
|
None
|
material_density
|
Optional[float]
|
Density used by |
None
|
opensees_exe
|
Optional[str]
|
Optional OpenSees executable path. If omitted, the
|
None
|
print_results
|
bool
|
If |
False
|
plot
|
bool
|
If |
False
|
plot_scale
|
Optional[float]
|
Optional deformation scale for plotting. If omitted, a scale is estimated from the mesh size and eigenvector magnitudes. |
None
|
Returns:
| Type | Description |
|---|---|
Dict[str, ndarray]
|
Dictionary with |
Dict[str, ndarray]
|
|
Dict[str, ndarray]
|
|
Material ownership
get_modes() builds a separate temporary Model() so modal
analysis cannot accidentally mutate the user's active model. For
that reason, do not pass a Material object from another model.
Use a material dictionary or a callable factory so the material is
created inside the temporary modal model with the correct managers
and tags.
Examples:
Default A992 steel:
Custom elastic isotropic material from a dictionary:
result = frame.get_modes(
num_modes=6,
material={
"name": "CustomSteel",
"E": 2.0e8,
"nu": 0.3,
"rho": 7.85,
},
opensees_exe=opensees_path,
)
Advanced material factory:
get_recorders
get_recorders(model, *, file_name: Optional[str] = None, delta_t: Optional[float] = None, element_responses: List[str] = ['force'], node_responses: List[str] = ['displacement', 'acceleration'])
Return an MPCO recorder scoped to this building region.
view_story
Print or plot a story layout with braced bay locations.
estimate_fixed_base_period
estimate_fixed_base_period(model, opensees_exe: Optional[str] = None, num_modes: int = 6, work_dir: Optional[Union[str, Path]] = None) -> Dict[str, object]
Run a fixed-base OpenSees eigen check and return periods/mode types.
calibrate_to_target_period
calibrate_to_target_period(model, target_period: Optional[float] = None, direction: str = 'x', tolerance: float = 0.1, max_iterations: int = 8, opensees_exe: Optional[str] = None) -> Dict[str, object]
Iteratively scale brace area to match the target fixed-base period.
summarize_archetype
Return a dictionary summary of geometry, layout, masses, and calibration state.
_section_for
_section_for(source, story: int, i: int, j: int, default: str, direction: Optional[str] = None) -> str
_resolve_brace_E
Young's modulus for a directly specified brace area (Elastic section).
_scale_elastic_section_geometry
staticmethod
Scale area and inertias for period calibration (axial stiffness ∝ EA).
_get_or_create_brace_section
Elastic brace section referenced by trussSection elements.
_explicit_rot_mass_kind_for_truss
staticmethod
Map brace axis to the same branches as :class:FEMA_SAC_SteelFrame mass logic.
_add_half_rotational_explicit_mass
staticmethod
_add_half_rotational_explicit_mass(grid: UnstructuredGrid, pid: int, M_rot_torsion: float, M_rot_iy: float, M_rot_iz: float, kind: str) -> None
Distribute half the member rotational mass inertia to pid (global Rx,Ry,Rz).
_add_member_self_mass
Lumped translational + rotational mass per line member (explicit dynamics), matching steel_frame.