numerics
Loading...
Searching...
No Matches
diffusion.hpp
Go to the documentation of this file.
1/// @file pde/diffusion.hpp
2/// @brief Explicit Euler diffusion steps for 2D uniform grids.
3///
4/// diffusion_step_2d -- u += coeff * ∆_periodic(u), periodic BC
5/// diffusion_step_2d_dirichlet -- u += coeff * ∆_dirichlet(u), Dirichlet BC
6///
7/// coeff = α·dt/h² where α is the diffusion coefficient.
8///
9/// Typical usage (viscosity in Navier-Stokes):
10/// @code
11/// const double coeff = dt * nu / (h * h);
12/// num::pde::diffusion_step_2d(u_star, N, coeff, num::best_backend);
13/// num::pde::diffusion_step_2d(v_star, N, coeff, num::best_backend);
14/// @endcode
15#pragma once
16
17#include "pde/stencil.hpp"
18#include "core/vector.hpp"
19#include "core/policy.hpp"
20
21namespace num::pde {
22
23/// Explicit Euler diffusion step on a periodic 2D grid:
24/// u += coeff * ∆_periodic(u)
25///
26/// @param u NxN field vector (row-major)
27/// @param N Grid side length
28/// @param coeff Diffusion coefficient * dt / h² (e.g. nu*dt/h² for viscosity)
29/// @param b Backend for the axpy accumulation
30inline void diffusion_step_2d(Vector& u, int N, double coeff,
32 Vector lap(u.size());
34 axpy(coeff, lap, u, b);
35}
36
37/// Explicit Euler diffusion step with Dirichlet (zero) BCs:
38/// u += coeff * ∆_dirichlet(u)
39inline void diffusion_step_2d_dirichlet(Vector& u, int N, double coeff,
41 Vector lap(u.size());
43 axpy(coeff, lap, u, b);
44}
45
46} // namespace num::pde
constexpr idx size() const noexcept
Definition vector.hpp:77
void diffusion_step_2d_dirichlet(Vector &u, int N, double coeff, Backend b=best_backend)
Definition diffusion.hpp:39
void diffusion_step_2d(Vector &u, int N, double coeff, Backend b=best_backend)
Definition diffusion.hpp:30
void laplacian_stencil_2d(const BasicVector< T > &x, BasicVector< T > &y, int N)
Definition stencil.hpp:32
Backend
Selects which backend handles a linalg operation.
Definition policy.hpp:19
constexpr Backend best_backend
Best backend for memory-bound vector ops: blas > omp > blocked.
Definition policy.hpp:65
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
void laplacian_stencil_2d_periodic(const BasicVector< T > &x, BasicVector< T > &y, int N)
Definition stencil.hpp:52
void axpy(real alpha, const Vector &x, Vector &y, Backend b=default_backend)
y += alpha * x
Definition vector.cpp:46
Higher-order stencil and grid-sweep utilities.
Backend enum for linear algebra operations.
Vector operations.