Struct libceed::elem_restriction::ElemRestriction[][src]

pub struct ElemRestriction<'a> { /* fields omitted */ }

Implementations

impl<'a> ElemRestriction<'a>[src]

pub fn create(
    ceed: &'a Ceed,
    nelem: usize,
    elemsize: usize,
    ncomp: usize,
    compstride: usize,
    lsize: usize,
    mtype: MemType,
    offsets: &[i32]
) -> Result<Self, CeedError>
[src]

pub fn create_strided(
    ceed: &'a Ceed,
    nelem: usize,
    elemsize: usize,
    ncomp: usize,
    lsize: usize,
    strides: [i32; 3]
) -> Result<Self, CeedError>
[src]

pub fn create_lvector(&self) -> Result<Vector<'_>, CeedError>[src]

Create an Lvector for an ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let lvector = r.create_lvector().unwrap();

assert_eq!(lvector.length(), nelem + 1, "Incorrect Lvector size");

pub fn create_evector(&self) -> Result<Vector<'_>, CeedError>[src]

Create an Evector for an ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let evector = r.create_evector().unwrap();

assert_eq!(evector.length(), nelem * 2, "Incorrect Evector size");

pub fn create_vectors(&self) -> Result<(Vector<'_>, Vector<'_>), CeedError>[src]

Create Vectors for an ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let (lvector, evector) = r.create_vectors().unwrap();

assert_eq!(lvector.length(), nelem + 1, "Incorrect Lvector size");
assert_eq!(evector.length(), nelem * 2, "Incorrect Evector size");

pub fn apply(
    &self,
    tmode: TransposeMode,
    u: &Vector<'_>,
    ru: &mut Vector<'_>
) -> Result<i32, CeedError>
[src]

Restrict an Lvector to an Evector or apply its transpose

arguments

  • tmode - Apply restriction or transpose
  • u - Input vector (of size lsize when TransposeMode::NoTranspose)
  • ru - Output vector (of shape [nelem * elemsize] when TransposeMode::NoTranspose). Ordering of the Evector is decided by the backend.
let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let x = ceed.vector_from_slice(&[0., 1., 2., 3.]).unwrap();
let mut y = ceed.vector(nelem * 2).unwrap();
y.set_value(0.0);

r.apply(TransposeMode::NoTranspose, &x, &mut y).unwrap();

y.view().iter().enumerate().for_each(|(i, arr)| {
    assert_eq!(
        *arr,
        ((i + 1) / 2) as f64,
        "Incorrect value in restricted vector"
    );
});

pub fn comp_stride(&self) -> usize[src]

Returns the Lvector component stride

let nelem = 3;
let compstride = 1;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, compstride, nelem + 1, MemType::Host, &ind)
    .unwrap();

let c = r.comp_stride();
assert_eq!(c, compstride, "Incorrect component stride");

pub fn num_elements(&self) -> usize[src]

Returns the total number of elements in the range of a ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let n = r.num_elements();
assert_eq!(n, nelem, "Incorrect number of elements");

pub fn elem_size(&self) -> usize[src]

Returns the size of elements in the ElemRestriction

let nelem = 3;
let elem_size = 2;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, elem_size, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let e = r.elem_size();
assert_eq!(e, elem_size, "Incorrect element size");

pub fn lvector_size(&self) -> usize[src]

Returns the size of the Lvector for an ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let lsize = r.lvector_size();
assert_eq!(lsize, nelem + 1);

pub fn num_components(&self) -> usize[src]

Returns the number of components in the elements of an ElemRestriction

let nelem = 3;
let ncomp = 42;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 42, 1, ncomp * (nelem + 1), MemType::Host, &ind)
    .unwrap();

let n = r.num_components();
assert_eq!(n, ncomp, "Incorrect number of components");

pub fn multiplicity(&self, mult: &mut Vector<'_>) -> Result<i32, CeedError>[src]

Returns the multiplicity of nodes in an ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();

let mut mult = ceed.vector(nelem + 1).unwrap();
mult.set_value(0.0);

r.multiplicity(&mut mult).unwrap();

mult.view().iter().enumerate().for_each(|(i, arr)| {
    assert_eq!(
        if (i == 0 || i == nelem) { 1. } else { 2. },
        *arr,
        "Incorrect multiplicity array"
    );
});

Trait Implementations

impl<'a> Display for ElemRestriction<'a>[src]

fn fmt(&self, f: &mut Formatter<'_>) -> Result[src]

View an ElemRestriction

let nelem = 3;
let mut ind: Vec<i32> = vec![0; 2 * nelem];
for i in 0..nelem {
    ind[2 * i + 0] = i as i32;
    ind[2 * i + 1] = (i + 1) as i32;
}
let r = ceed
    .elem_restriction(nelem, 2, 1, 1, nelem + 1, MemType::Host, &ind)
    .unwrap();
println!("{}", r);

impl<'a> Drop for ElemRestriction<'a>[src]

impl<'a> From<&'a ElemRestriction<'_>> for ElemRestrictionOpt<'a>[src]

Construct a ElemRestrictionOpt reference from a ElemRestriction reference

Auto Trait Implementations

impl<'a> RefUnwindSafe for ElemRestriction<'a>

impl<'a> !Send for ElemRestriction<'a>

impl<'a> !Sync for ElemRestriction<'a>

impl<'a> Unpin for ElemRestriction<'a>

impl<'a> UnwindSafe for ElemRestriction<'a>

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> ToString for T where
    T: Display + ?Sized
[src]

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.