use num_complex::Complex;
use cartan_dec::line_bundle::Section;
use volterra_dec::QFieldDec;
#[derive(Debug, Clone)]
pub struct NematicField2D {
pub section: Section<2>,
}
impl NematicField2D {
pub fn zeros(nv: usize) -> Self {
Self {
section: Section::<2>::zeros(nv),
}
}
pub fn uniform(nv: usize, q1: f64, q2: f64) -> Self {
Self {
section: Section::<2>::uniform(nv, Complex::new(q1, q2)),
}
}
pub fn from_section(section: Section<2>) -> Self {
Self { section }
}
pub fn n_vertices(&self) -> usize {
self.section.n_vertices()
}
pub fn scalar_order(&self) -> Vec<f64> {
self.section.scalar_order()
}
pub fn mean_scalar_order(&self) -> f64 {
self.section.mean_scalar_order()
}
pub fn trace_q_squared(&self) -> Vec<f64> {
self.section.values.iter().map(|z| 2.0 * z.norm_sqr()).collect()
}
pub fn normalise(&mut self) {
self.section.normalise(1e-15);
}
pub fn to_qfield_dec(&self) -> QFieldDec {
let (q1, q2) = self.section.to_real_components();
QFieldDec {
q1,
q2,
n_vertices: self.section.n_vertices(),
}
}
pub fn from_qfield_dec(q: &QFieldDec) -> Self {
Self {
section: Section::<2>::from_real_components(&q.q1, &q.q2),
}
}
pub fn values(&self) -> &[Complex<f64>] {
&self.section.values
}
pub fn values_mut(&mut self) -> &mut [Complex<f64>] {
&mut self.section.values
}
}