Source code for matrix_toolkit.pde.equations.helmholtz

"""
Helmholtz equation: -Δu - k²u = f
"""

import numpy as np
from scipy import sparse
from typing import Dict, Any

from matrix_toolkit.pde.base import BasePDEEquation
from matrix_toolkit.pde.config import PDEConfig  


[docs] class HelmholtzEquation(BasePDEEquation): """ The Helmholtz equation: .. math:: -\Delta u - k^2 u = f This equation arises in wave propagation, acoustics, and electromagnetics. Examples: >>> config = PDEConfig( ... dimension=2, ... mesh_size=64, ... coefficients={'wavenumber': 10.0} ... ) >>> eq = HelmholtzEquation(config) >>> A = eq.generate_matrix() """
[docs] def get_operator_name(self) -> str: return "Helmholtz"
[docs] def get_default_coefficients(self) -> Dict[str, Any]: return { 'wavenumber': 1.0, # k in -Δu - k²u }
[docs] def generate_matrix(self) -> sparse.spmatrix: """Generate Helmholtz matrix""" coeffs = self.config.coefficients or self.get_default_coefficients() if self.config.random_params: coeffs = self.randomize_coefficients(self.config.random_seed) k = coeffs.get('wavenumber', 1.0) # Get Laplacian from matrix_toolkit.pde.equations.poisson import PoissonEquation laplacian_config = PDEConfig( dimension=self.config.dimension, domain=self.config.domain, mesh_size=self.config.mesh_size, boundary_condition=self.config.boundary_condition ) poisson = PoissonEquation(laplacian_config) L = poisson.generate_matrix() # Helmholtz: -Δ - k²I n = self.config.total_dofs() I = sparse.eye(n, format='csr') A = L - (k**2) * I return A