use crate::DType;
use numr::runtime::Runtime;
use numr::tensor::Tensor;
use crate::pde::error::PdeResult;
use crate::pde::types::{
BoundarySpec, FdmOptions, FdmResult, Grid2D, Grid3D, TimeDependentOptions, TimeResult,
};
#[allow(clippy::too_many_arguments)]
pub trait FiniteDifferenceAlgorithms<R: Runtime<DType = DType>> {
fn fdm_poisson(
&self,
f: &Tensor<R>,
grid: &Grid2D,
boundary: &[BoundarySpec<R>],
options: &FdmOptions,
) -> PdeResult<FdmResult<R>>;
fn fdm_heat_2d(
&self,
u0: &Tensor<R>,
alpha: f64,
source: Option<&Tensor<R>>,
grid: &Grid2D,
boundary: &[BoundarySpec<R>],
time_opts: &TimeDependentOptions,
options: &FdmOptions,
) -> PdeResult<TimeResult<R>>;
fn fdm_heat_3d(
&self,
u0: &Tensor<R>,
alpha: f64,
source: Option<&Tensor<R>>,
grid: &Grid3D,
boundary: &[BoundarySpec<R>],
time_opts: &TimeDependentOptions,
options: &FdmOptions,
) -> PdeResult<TimeResult<R>>;
fn fdm_wave(
&self,
u0: &Tensor<R>,
v0: &Tensor<R>,
c: f64,
source: Option<&Tensor<R>>,
grid: &Grid2D,
boundary: &[BoundarySpec<R>],
time_opts: &TimeDependentOptions,
options: &FdmOptions,
) -> PdeResult<TimeResult<R>>;
}