use crate::calculus::pde::common::extract_domain_length;
use crate::calculus::pde::registry::PDEError;
use crate::calculus::pde::types::BoundaryCondition;
use crate::core::{Expression, Symbol};
pub fn compute_dirichlet_1d_eigenvalues(
boundary_conditions: &[BoundaryCondition],
spatial_var: &Symbol,
max_terms: usize,
) -> Result<Vec<Expression>, PDEError> {
if boundary_conditions.is_empty() {
let eigenvalues: Vec<_> = (1..=max_terms)
.map(|n| Expression::integer(n as i64))
.collect();
return Ok(eigenvalues);
}
let domain_length = extract_domain_length(boundary_conditions, spatial_var)?;
let eigenvalues: Vec<_> = (1..=max_terms)
.map(|n| {
let n_expr = Expression::integer(n as i64);
let pi = Expression::pi();
Expression::pow(
Expression::mul(vec![
n_expr,
pi,
Expression::pow(domain_length.clone(), Expression::integer(-1)),
]),
Expression::integer(2),
)
})
.collect();
Ok(eigenvalues)
}
pub fn compute_wave_eigenvalues(
boundary_conditions: &[BoundaryCondition],
spatial_var: &Symbol,
max_terms: usize,
) -> Result<Vec<Expression>, PDEError> {
if boundary_conditions.is_empty() {
let eigenvalues: Vec<_> = (1..=max_terms)
.map(|n| Expression::integer(n as i64))
.collect();
return Ok(eigenvalues);
}
let domain_length = extract_domain_length(boundary_conditions, spatial_var)?;
let eigenvalues: Vec<_> = (1..=max_terms)
.map(|n| {
let n_expr = Expression::integer(n as i64);
let pi = Expression::pi();
Expression::mul(vec![
n_expr,
pi,
Expression::pow(domain_length.clone(), Expression::integer(-1)),
])
})
.collect();
Ok(eigenvalues)
}