use crate::PhysicsError;
use deep_causality_multivector::CausalMultiVector;
use deep_causality_num::RealField;
use deep_causality_tensor::CausalTensor;
use deep_causality_topology::SimplicialManifold;
pub trait GaugeEmOps<S>
where
S: RealField + From<f64> + Into<f64>,
{
fn from_fields(
base: SimplicialManifold<S, S>,
electric_field: CausalMultiVector<S>,
magnetic_field: CausalMultiVector<S>,
) -> Result<Self, PhysicsError>
where
Self: Sized;
fn from_components(ex: S, ey: S, ez: S, bx: S, by: S, bz: S) -> Result<Self, PhysicsError>
where
Self: Sized;
fn plane_wave(amplitude: S, polarization: usize) -> Result<Self, PhysicsError>
where
Self: Sized;
fn electric_field(&self) -> Result<CausalMultiVector<S>, PhysicsError>;
fn magnetic_field(&self) -> Result<CausalMultiVector<S>, PhysicsError>;
fn energy_density(&self) -> Result<S, PhysicsError>;
fn lagrangian_density(&self) -> Result<S, PhysicsError>;
fn poynting_vector(&self) -> Result<CausalMultiVector<S>, PhysicsError>;
fn lorentz_force(
&self,
current_density: &CausalMultiVector<S>,
) -> Result<CausalMultiVector<S>, PhysicsError>;
fn field_invariant(&self) -> Result<S, PhysicsError>;
fn dual_invariant(&self) -> Result<S, PhysicsError>;
fn is_radiation_field(&self) -> Result<bool, PhysicsError>;
fn is_null_field(&self) -> Result<bool, PhysicsError>;
fn momentum_density(&self) -> Result<CausalMultiVector<S>, PhysicsError>;
fn intensity(&self) -> Result<S, PhysicsError>;
fn computed_field_strength(&self) -> Result<CausalTensor<S>, PhysicsError>;
}