pub struct Rib {
pub iter_count: usize,
pub tolerance: f64,
}
Expand description
Recursive Inertial Bisection algorithm
Partitions a mesh based on the nodes coordinates and coresponding weights.
A variant of the Recursive Coordinate Bisection algorithm where a basis change is performed beforehand so that the first coordinate of the new basis is colinear to the inertia axis of the set of points. This has the goal of producing better shaped partition than RCB.
Example
use coupe::Partition as _;
use coupe::Point2D;
// Here, the inertia axis is the y axis.
// We thus expect Rib to split horizontally first.
let points = [
Point2D::new(1., 10.),
Point2D::new(-1., 10.),
Point2D::new(1., -10.),
Point2D::new(-1., -10.),
];
let weights = [1; 4];
let mut partition = [0; 4];
// Generate a partition of 2 parts (1 split).
coupe::Rib { iter_count: 1, ..Default::default() }
.partition(&mut partition, (&points, weights))?;
// The two points at the top are in the same part.
assert_eq!(partition[0], partition[1]);
// The two points at the bottom are in the same part.
assert_eq!(partition[2], partition[3]);
// There are two different parts.
assert_ne!(partition[1], partition[2]);
Reference
Williams, Roy D., 1991. Performance of dynamic load balancing algorithms for unstructured mesh calculations. Concurrency: Practice and Experience, 3(5):457–481. doi:10.1002/cpe.4330030502.
Fields§
§iter_count: usize
The number of iterations of the algorithm. This will yield a partition
of at most 2^num_iter
parts.
tolerance: f64
Same meaning as Rcb::tolerance
.
Trait Implementations§
source§impl<'a, const D: usize, W> Partition<(&'a [Matrix<f64, Const<D>, Const<1>, ArrayStorage<f64, D, 1>>], W)> for Ribwhere
Const<D>: DimSub<Const<1>> + ToTypenum,
DefaultAllocator: Allocator<f64, Const<D>, Const<D>, Buffer = ArrayStorage<f64, D, D>> + Allocator<f64, DimDiff<Const<D>, Const<1>>>,
W: IntoParallelIterator,
W::Item: RcbWeight,
W::Iter: IndexedParallelIterator,
impl<'a, const D: usize, W> Partition<(&'a [Matrix<f64, Const<D>, Const<1>, ArrayStorage<f64, D, 1>>], W)> for Ribwhere Const<D>: DimSub<Const<1>> + ToTypenum, DefaultAllocator: Allocator<f64, Const<D>, Const<D>, Buffer = ArrayStorage<f64, D, D>> + Allocator<f64, DimDiff<Const<D>, Const<1>>>, W: IntoParallelIterator, W::Item: RcbWeight, W::Iter: IndexedParallelIterator,
impl Copy for Rib
Auto Trait Implementations§
impl RefUnwindSafe for Rib
impl Send for Rib
impl Sync for Rib
impl Unpin for Rib
impl UnwindSafe for Rib
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
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pointable for T
impl<T> Pointable for T
§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,
§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read more§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self
is actually part of its subset T
(and can be converted to it).§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.