1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! IDE (Integro-Differential Equation) solvers for Numra.
//!
//! This crate provides methods for solving Volterra integro-differential equations:
//!
//! ```text
//! y'(t) = f(t, y) + ∫₀ᵗ K(t, s, y(s)) ds
//! ```
//!
//! where K is the memory kernel representing history-dependent effects.
//!
//! # Memory Kernels
//!
//! The crate supports various kernel types:
//! - **Exponential kernels**: K(t,s) = a * exp(-b*(t-s)), efficient via Prony series
//! - **Power-law kernels**: K(t,s) = (t-s)^(-α), fractional memory
//! - **Custom kernels**: User-defined kernel functions
//!
//! # Solvers
//!
//! - [`VolterraSolver`] - General Volterra IDE solver using quadrature
//! - [`PronySolver`] - Efficient solver for sum-of-exponentials kernels
//!
//! # Example
//!
//! ```
//! use numra_ide::{IdeSystem, VolterraSolver, IdeSolver, IdeOptions, Kernel};
//! use numra_ide::kernels::ExponentialKernel;
//!
//! // Viscoelastic material: y' = -k*y + ∫ K(t-s)*y(s) ds
//! struct Viscoelastic {
//! k: f64,
//! kernel: ExponentialKernel<f64>,
//! }
//!
//! impl IdeSystem<f64> for Viscoelastic {
//! fn dim(&self) -> usize { 1 }
//!
//! fn rhs(&self, _t: f64, y: &[f64], f: &mut [f64]) {
//! f[0] = -self.k * y[0];
//! }
//!
//! fn kernel(&self, t: f64, s: f64, y: &[f64], k: &mut [f64]) {
//! k[0] = self.kernel.evaluate(t - s) * y[0];
//! }
//! }
//! ```
//!
//! Author: Moussa Leblouba
//! Date: 2 February 2026
//! Modified: 2 May 2026
pub use Scalar;
pub use ;
pub use ;
pub use ;
pub use ;