pub struct MlfmmSystem {
pub num_levels: usize,
pub near_matrix: Vec<NearFieldBlock>,
pub t_matrices: Vec<LevelMatrices>,
pub d_matrices: Vec<Vec<DMatrixEntry>>,
pub s_matrices: Vec<LevelMatrices>,
pub rhs: Array1<Complex64>,
pub num_dofs: usize,
pub leaf_dof_indices: Vec<Vec<usize>>,
pub sphere_points_per_level: Vec<usize>,
/* private fields */
}Expand description
Result of MLFMM assembly
Fields§
§num_levels: usizeNumber of levels in the tree
near_matrix: Vec<NearFieldBlock>Near-field coefficient matrix at leaf level (sparse, stored as dense blocks)
t_matrices: Vec<LevelMatrices>T-matrices at each level (child-to-parent aggregation) Level 0 has no T-matrices (root)
d_matrices: Vec<Vec<DMatrixEntry>>D-matrices for far-field translation at each level
s_matrices: Vec<LevelMatrices>S-matrices at each level (parent-to-child disaggregation)
rhs: Array1<Complex64>RHS vector
num_dofs: usizeNumber of DOFs
leaf_dof_indices: Vec<Vec<usize>>DOF mappings at leaf level: for each leaf cluster, the global DOF indices
sphere_points_per_level: Vec<usize>Number of sphere points at each level
Implementations§
Source§impl MlfmmSystem
impl MlfmmSystem
Sourcepub fn new(
num_dofs: usize,
num_levels: usize,
cluster_levels: Vec<ClusterLevel>,
) -> Self
pub fn new( num_dofs: usize, num_levels: usize, cluster_levels: Vec<ClusterLevel>, ) -> Self
Create a new empty MLFMM system
Sourcepub fn matvec(&self, x: &Array1<Complex64>) -> Array1<Complex64>
pub fn matvec(&self, x: &Array1<Complex64>) -> Array1<Complex64>
Apply the MLFMM operator: y = ([N] + [S][D][T]) * x
Multi-level version with upward/downward passes.
The algorithm proceeds as follows:
- Near-field: Direct interactions between nearby leaf clusters
- Upward pass: Aggregate source multipoles from leaves to root (M2M translations)
- Translation: Translate multipoles to locals between far clusters at each level (M2L)
- Downward pass: Disaggregate local expansions from root to leaves (L2L translations)
- Evaluation: Evaluate local expansions at leaf DOFs
§Arguments
x- Input vector (length = num_dofs)
§Returns
y- Output vector (length = num_dofs), y = A*x
Sourcepub fn get_cluster(&self, level: usize, index: usize) -> Option<&Cluster>
pub fn get_cluster(&self, level: usize, index: usize) -> Option<&Cluster>
Get cluster at given level and index
Sourcepub fn num_clusters_at_level(&self, level: usize) -> usize
pub fn num_clusters_at_level(&self, level: usize) -> usize
Get number of clusters at a given level
Auto Trait Implementations§
impl Freeze for MlfmmSystem
impl RefUnwindSafe for MlfmmSystem
impl Send for MlfmmSystem
impl Sync for MlfmmSystem
impl Unpin for MlfmmSystem
impl UnwindSafe for MlfmmSystem
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more