bem/core/solver/
mod.rs

1//! Linear solvers for BEM
2//!
3//! This module provides various solvers for BEM systems:
4//!
5//! - [`direct`] - Direct LU factorization (for small systems)
6//! - [`cgs`] - Conjugate Gradient Squared (for iterative solving)
7//! - [`bicgstab`] - BiCGSTAB (alternative iterative solver)
8//! - [`gmres`] - GMRES (recommended for large BEM problems)
9//! - [`fmm_interface`] - Interface to use FMM operators with iterative solvers
10//! - [`preconditioner`] - Basic preconditioners
11//! - [`ilu_preconditioner`] - ILU preconditioner (recommended for BEM)
12//! - [`batched_blas`] - Batched BLAS operations for optimized matrix computations
13//!
14//! ## Solver Selection Guide
15//!
16//! For BEM systems, we recommend:
17//!
18//! | System Size | Solver | Configuration |
19//! |-------------|--------|---------------|
20//! | N < 1000 | Direct LU | - |
21//! | N < 10000 | GMRES(50) + ILU | `GmresConfig::for_small_problems()` |
22//! | N > 10000 | GMRES(100) + ILU | `GmresConfig::for_large_bem()` |
23//!
24//! GMRES is generally preferred for large BEM problems due to:
25//! - Monotonic convergence (unlike CGS which can be erratic)
26//! - Better handling of non-symmetric matrices
27//! - Configurable memory usage via restart parameter
28//!
29//! ## Preconditioning Strategy
30//!
31//! BEM systems are ill-conditioned. Simple diagonal (Jacobi) preconditioning
32//! is **not sufficient**. Use ILU preconditioning:
33//!
34//! ```ignore
35//! use bem::core::solver::{
36//!     gmres_solve_with_ilu, GmresConfig, IluMethod, IluScanningDegree
37//! };
38//!
39//! let config = GmresConfig::for_large_bem();
40//! let solution = gmres_solve_with_ilu(
41//!     &matrix,
42//!     &rhs,
43//!     IluMethod::Tbem,
44//!     IluScanningDegree::Fine,
45//!     &config,
46//! );
47//! ```
48
49pub mod batched_blas;
50pub mod bicgstab;
51pub mod cgs;
52pub mod direct;
53pub mod fmm_interface;
54pub mod gmres;
55pub mod ilu_preconditioner;
56pub mod preconditioner;
57
58// Core operator types
59pub use fmm_interface::{
60    CsrOperator, DenseOperator, DiagonalPreconditioner, LinearOperator, MlfmmOperator,
61    SlfmmOperator,
62};
63
64// ILU preconditioner and solve functions (recommended for BEM)
65pub use fmm_interface::{
66    ilu_diagnostics, solve_tbem_with_ilu, solve_with_ilu, solve_with_ilu_operator, IluDiagnostics,
67    IluOperator,
68};
69
70// GMRES solver and ILU integration
71pub use fmm_interface::{gmres_solve_with_ilu, gmres_solve_with_ilu_operator, solve_gmres};
72
73// Hierarchical FMM preconditioner solvers
74pub use fmm_interface::{gmres_solve_fmm_hierarchical, gmres_solve_with_hierarchical_precond};
75
76// Batched BLAS FMM solvers (optimized for large problems)
77pub use fmm_interface::{gmres_solve_fmm_batched, gmres_solve_fmm_batched_with_ilu};
78
79// Frequency-adaptive mesh utilities
80pub use fmm_interface::{
81    recommended_mesh_resolution, mesh_resolution_for_frequency_range,
82    estimate_element_count, AdaptiveMeshConfig,
83};
84
85// Preconditioner types
86pub use preconditioner::{
87    BlockDiagonalPreconditioner, DiagonalPreconditioner as BasicDiagonalPreconditioner,
88    HierarchicalFmmPreconditioner, IdentityPreconditioner, Preconditioner,
89    RowScalingPreconditioner, SparseNearfieldIlu,
90};
91
92// ILU configuration types
93pub use ilu_preconditioner::{IluMethod, IluPreconditioner, IluScanningDegree, IluSetup};
94
95// GMRES configuration and solution types
96pub use gmres::{gmres_solve, gmres_solve_preconditioned, GmresConfig, GmresSolution};
97
98// Batched BLAS operations for optimized FMM matvec
99pub use batched_blas::{
100    SlfmmMatvecWorkspace, slfmm_matvec_batched, create_batched_matvec,
101    batched_t_matrix_apply, batched_s_matrix_apply, batched_d_matrix_apply,
102    batched_near_field_apply,
103};