upxo.pxtal.fm_steel_3d.with_subblocks_3d module

FMSteel3DWithSubBlocks: Final state class with full FM steel hierarchy including sub-blocks.

Extends FMSteel3DWithOrientations by adding sub-block (lath) level subdivision within each martensitic block, with per-sub-block orientation spread.

Classes:

FMSteel3DWithSubBlocks: Complete FM steel state class with sub-block hierarchy.

class upxo.pxtal.fm_steel_3d.with_subblocks_3d.FMSteel3DWithSubBlocks(parent, all_subblocks: Dict[str, numpy.ndarray], block_to_subblocks_map: Dict[str, List[str]], subblock_orientations: Dict[str, Tuple[float, float, float]], subblock_slicing_normals: Dict[str, numpy.ndarray] | None = None, random_seed: int | None = None, verbosity: int | None = None, log_sink=None)[source]

Bases: object

Complete 3D FM steel microstructure with sub-block (lath) hierarchy.

Hierarchy: grains -> PAGs -> packets -> blocks -> sub-blocks

_parent

Parent orientation state (full block hierarchy with orientations).

Type:

FMSteel3DWithOrientations

all_subblocks

{subblock_id: (n_voxels, 3) voxel coordinate array}. Sub-block naming: ‘SB_{block_id}_{local}’ where block_id follows the ‘B_{pag_id}_{packet_id}_{local}’ convention.

Type:

dict[str, np.ndarray]

block_to_subblocks_map

{block_id: [subblock_id, …]} — maps every block to its sub-blocks.

Type:

dict[str, list[str]]

subblock_orientations

{subblock_id: (phi1, Phi, phi2)} in degrees — parent block orientation plus a small intra-block spread perturbation.

Type:

dict[str, tuple]

subblock_slicing_normals

{subblock_id: unit_normal (3,)} — inherited from parent block.

Type:

dict[str, np.ndarray]

_random_seed
Type:

int or None

all_subblocks
block_to_subblocks_map
subblock_orientations
subblock_slicing_normals
property lgi: numpy.ndarray
property grain_locs: Dict[int, numpy.ndarray]
property clusters_dict: Dict[int, List[int]]
property all_blocks: Dict[str, numpy.ndarray]
property block_orientations: Dict[str, Tuple[float, float, float]]
property pag_orientations: Dict[int, Tuple[float, float, float]]
property grain_to_blocks_map: Dict[int, List[str]]

grain_id -> [block_id, …] (keys are grain_ids = packet ids).

property grain_to_pag_id: Dict[int, int]

Reverse lookup grain_id -> pag_id.

property grain_to_local_pkt_idx: Dict[int, int]

grain_id -> local_idx.

Type:

1-based local packet ordinal within each PAG

property grain_to_plane_idx: Dict[int, int]

grain_id -> {111}FCC habit-plane index (0-3) from parent block level.

property grain_orientations: Dict[int, Tuple[float, float, float]]

Grain-level BCC orientations from parent orientations level.

property block_slicing_normals: Dict[str, numpy.ndarray]

block_id -> unit normal of the {111}FCC habit plane used to slice it, from parent block level (see FMSteel3DWithBlocks docstring).

property block_to_variant_idx: Dict[str, int]

block_id -> KS variant index (0-5) within its packet, from parent orientations level (see FMSteel3DWithOrientations docstring).

property physical_dimensions
property voxel_size: float
property units: str

Physical unit string (‘microns’, ‘mm’, ‘m’).

property isolated_grains

Isolated grains from parent PAG level.

property retained_austenite_pag_ids

Retained-austenite PAG IDs from parent PAG level (see FMSteel3DWithPAGs docstring).

ensure_isolated_grain_orientations(random_seed: int | None = None) → None[source]

See FMSteel3DWithPAGs.ensure_isolated_grain_orientations.

get_isolated_grain_orientation(gid: int) → Tuple[float, float, float] | None[source]

See FMSteel3DWithPAGs.get_isolated_grain_orientation.

available_phases() → List[int][source]

See FMSteel3DWithOrientations.available_phases.

get_phase_voxels_and_orientations(phase_id: int) → Tuple[Dict, Dict[int, Tuple[float, float, float]]][source]

See FMSteel3DWithOrientations.get_phase_voxels_and_orientations.

PHASE_MARTENSITE here is sub-block granularity (all_subblocks, subblock_orientations) – the finer level this class adds; retained austenite has no sub-block subdivision, so it stays grain granularity exactly as at the block level.

property n_grains: int
property n_pags: int
property n_blocks: int
property n_subblocks: int
reassign_subblock_orientations(intrablock_ori_spread_deg: float = 2.0, random_seed: int | None = None) → None[source]

Re-assign sub-block orientations in-place with a new spread value.

get_subblock_statistics() → Dict[source]

Return basic statistics on the sub-block structure.