use crate::PhysicsError;
use deep_causality_multivector::{CausalMultiVector, Metric};
use deep_causality_num::{Complex, DivisionAlgebra};
use deep_causality_tensor::CausalTensor;
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct QuantumMetric<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for QuantumMetric<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> QuantumMetric<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
Ok(Self(val))
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<QuantumMetric<R>> for f64 {
fn from(val: QuantumMetric<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct BerryCurvature<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for BerryCurvature<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> BerryCurvature<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
Ok(Self(val))
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<BerryCurvature<R>> for f64 {
fn from(val: BerryCurvature<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct BandDrudeWeight<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for BandDrudeWeight<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> BandDrudeWeight<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
Ok(Self(val))
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<BandDrudeWeight<R>> for f64 {
fn from(val: BandDrudeWeight<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct OrbitalAngularMomentum<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for OrbitalAngularMomentum<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> OrbitalAngularMomentum<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
Ok(Self(val))
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<OrbitalAngularMomentum<R>> for f64 {
fn from(val: OrbitalAngularMomentum<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct Conductance<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for Conductance<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> Conductance<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
if val < R::zero() {
return Err(PhysicsError::PhysicalInvariantBroken(
"Negative Conductance".into(),
));
}
Ok(Self(val))
}
pub fn new_unchecked(val: R) -> Self {
Self(val)
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<Conductance<R>> for f64 {
fn from(val: Conductance<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct Mobility<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for Mobility<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> Mobility<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
if val < R::zero() {
return Err(PhysicsError::PhysicalInvariantBroken(
"Negative Mobility".into(),
));
}
Ok(Self(val))
}
pub fn new_unchecked(val: R) -> Self {
Self(val)
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<Mobility<R>> for f64 {
fn from(val: Mobility<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
pub struct TwistAngle<R: deep_causality_num::RealField>(R);
impl<R: deep_causality_num::RealField> Default for TwistAngle<R> {
fn default() -> Self {
Self(R::zero())
}
}
impl<R: deep_causality_num::RealField> TwistAngle<R> {
pub fn new(val: R) -> Result<Self, PhysicsError> {
Ok(Self(val))
}
pub fn value(&self) -> R {
self.0
}
}
impl<R: deep_causality_num::RealField + deep_causality_num::FromPrimitive> TwistAngle<R> {
pub fn as_degrees(&self) -> R {
let factor =
R::from_f64(180.0 / core::f64::consts::PI).expect("R::from_f64(180/PI) failed");
self.0 * factor
}
pub fn from_degrees(deg: R) -> Self {
let factor =
R::from_f64(core::f64::consts::PI / 180.0).expect("R::from_f64(PI/180) failed");
Self(deg * factor)
}
}
impl<R: deep_causality_num::RealField + Into<f64>> From<TwistAngle<R>> for f64 {
fn from(val: TwistAngle<R>) -> Self {
val.0.into()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Default)]
pub struct OrderParameter(Complex<f64>);
impl OrderParameter {
pub fn new(val: Complex<f64>) -> Self {
Self(val)
}
pub fn value(&self) -> Complex<f64> {
self.0
}
pub fn magnitude_squared(&self) -> f64 {
self.0.norm_sqr()
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct QuantumEigenvector(CausalTensor<Complex<f64>>);
impl QuantumEigenvector {
pub fn new(tensor: CausalTensor<Complex<f64>>) -> Self {
Self(tensor)
}
pub fn inner(&self) -> &CausalTensor<Complex<f64>> {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct QuantumVelocity(CausalTensor<Complex<f64>>);
impl QuantumVelocity {
pub fn new(tensor: CausalTensor<Complex<f64>>) -> Self {
Self(tensor)
}
pub fn inner(&self) -> &CausalTensor<Complex<f64>> {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Momentum(CausalMultiVector<f64>);
impl Default for Momentum {
fn default() -> Self {
Self(CausalMultiVector::new(vec![0.0], Metric::Euclidean(0)).unwrap())
}
}
impl Momentum {
pub fn new(mv: CausalMultiVector<f64>) -> Self {
Self(mv)
}
pub fn inner(&self) -> &CausalMultiVector<f64> {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Displacement(CausalTensor<f64>);
impl Displacement {
pub fn new(tensor: CausalTensor<f64>) -> Self {
Self(tensor)
}
pub fn inner(&self) -> &CausalTensor<f64> {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct Concentration(CausalTensor<f64>);
impl Concentration {
pub fn new(tensor: CausalTensor<f64>) -> Result<Self, PhysicsError> {
for &val in tensor.as_slice() {
if val < 0.0 {
return Err(PhysicsError::PhysicalInvariantBroken(
"Negative Concentration detected".into(),
));
}
}
Ok(Self(tensor))
}
pub fn new_unchecked(tensor: CausalTensor<f64>) -> Self {
Self(tensor)
}
pub fn inner(&self) -> &CausalTensor<f64> {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ChemicalPotentialGradient(CausalTensor<f64>);
impl ChemicalPotentialGradient {
pub fn new(tensor: CausalTensor<f64>) -> Self {
Self(tensor)
}
pub fn inner(&self) -> &CausalTensor<f64> {
&self.0
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct VectorPotential(CausalMultiVector<f64>);
impl Default for VectorPotential {
fn default() -> Self {
Self(CausalMultiVector::new(vec![0.0], Metric::Euclidean(0)).unwrap())
}
}
impl VectorPotential {
pub fn new(mv: CausalMultiVector<f64>) -> Self {
Self(mv)
}
pub fn inner(&self) -> &CausalMultiVector<f64> {
&self.0
}
}