deep_causality_physics/photonics/
wrappers.rs

1/*
2 * SPDX-License-Identifier: MIT
3 * Copyright (c) "2025" . The DeepCausality Authors and Contributors. All Rights Reserved.
4 */
5
6use crate::photonics::quantities::{
7    AbcdMatrix, ComplexBeamParameter, JonesVector, OpticalPower, RayAngle, RayHeight, StokesVector,
8    Wavelength,
9};
10use crate::{IndexOfRefraction, Length, Ratio};
11use deep_causality_core::{CausalityError, PropagatingEffect};
12use deep_causality_num::Complex;
13use deep_causality_tensor::CausalTensor;
14
15// Import all kernels from their respective modules
16use crate::photonics::{beam, diffraction, polarization, ray};
17
18// ============================================================================
19// Ray Optics
20// ============================================================================
21
22pub fn ray_transfer(
23    m: &AbcdMatrix,
24    h: RayHeight,
25    a: RayAngle,
26) -> PropagatingEffect<(RayHeight, RayAngle)> {
27    match ray::ray_transfer_kernel(m, h, a) {
28        Ok(res) => PropagatingEffect::pure(res),
29        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
30    }
31}
32
33pub fn snells_law(
34    n1: IndexOfRefraction,
35    n2: IndexOfRefraction,
36    theta1: RayAngle,
37) -> PropagatingEffect<RayAngle> {
38    match ray::snells_law_kernel(n1, n2, theta1) {
39        Ok(theta2) => PropagatingEffect::pure(theta2),
40        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
41    }
42}
43
44pub fn lens_maker(n: IndexOfRefraction, r1: f64, r2: f64) -> PropagatingEffect<OpticalPower> {
45    match ray::lens_maker_kernel(n, r1, r2) {
46        Ok(p) => PropagatingEffect::pure(p),
47        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
48    }
49}
50
51// ============================================================================
52// Polarization
53// ============================================================================
54
55pub fn jones_rotation(
56    jones_matrix: &CausalTensor<Complex<f64>>,
57    angle: RayAngle,
58) -> PropagatingEffect<CausalTensor<Complex<f64>>> {
59    match polarization::jones_rotation_kernel(jones_matrix, angle) {
60        Ok(m) => PropagatingEffect::pure(m),
61        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
62    }
63}
64
65pub fn stokes_from_jones(jones: &JonesVector) -> PropagatingEffect<StokesVector> {
66    match polarization::stokes_from_jones_kernel(jones) {
67        Ok(s) => PropagatingEffect::pure(s),
68        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
69    }
70}
71
72pub fn degree_of_polarization(stokes: &StokesVector) -> PropagatingEffect<Ratio> {
73    match polarization::degree_of_polarization_kernel(stokes) {
74        Ok(r) => PropagatingEffect::pure(r),
75        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
76    }
77}
78
79// ============================================================================
80// Gaussian Beam
81// ============================================================================
82
83pub fn gaussian_q_propagation(
84    q_in: ComplexBeamParameter,
85    matrix: &AbcdMatrix,
86) -> PropagatingEffect<ComplexBeamParameter> {
87    match beam::gaussian_q_propagation_kernel(q_in, matrix) {
88        Ok(q) => PropagatingEffect::pure(q),
89        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
90    }
91}
92
93pub fn beam_spot_size(
94    q: ComplexBeamParameter,
95    wavelength: Wavelength,
96) -> PropagatingEffect<Length> {
97    match beam::beam_spot_size_kernel(q, wavelength) {
98        Ok(w) => PropagatingEffect::pure(w),
99        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
100    }
101}
102
103// ============================================================================
104// Diffraction
105// ============================================================================
106
107pub fn single_slit_irradiance(
108    i0: f64,
109    slit_width: Length,
110    theta: RayAngle,
111    wavelength: Wavelength,
112) -> PropagatingEffect<f64> {
113    match diffraction::single_slit_irradiance_kernel(i0, slit_width, theta, wavelength) {
114        Ok(i) => PropagatingEffect::pure(i),
115        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
116    }
117}
118
119pub fn grating_equation(
120    pitch: Length,
121    order: i32,
122    incidence: RayAngle,
123    wavelength: Wavelength,
124) -> PropagatingEffect<RayAngle> {
125    match diffraction::grating_equation_kernel(pitch, order, incidence, wavelength) {
126        Ok(angle) => PropagatingEffect::pure(angle),
127        Err(e) => PropagatingEffect::from_error(CausalityError::from(e)),
128    }
129}