numerics 0.1.0
Loading...
Searching...
No Matches
Application Example: Projection Step

This page shows the numerics pattern used by a matrix-free pressure projection.

Matrix-Free Pressure Operator

[&](const num::Vector& p, num::Vector& Ap) {
apply_negative_laplacian_with_boundary_rows(p, Ap, nx, ny);
},
nx * ny);
CallableOp< F > make_op(F f, idx rows, idx cols)
Definition callable.hpp:39

Solve the Poisson System

num::Vector pressure(nx * ny, 0.0);
num::SolverResult info = num::cg(A, rhs, pressure, 1e-8, 1000, num::Backend::blas);
SolverResult cg(const Matrix &A, const Vector &b, Vector &x, real tol=1e-10, idx max_iter=1000, Backend backend=default_backend)
Definition cg.cpp:8

The same code can switch to the sequential backend for diagnostics:

num::SolverResult ref = num::cg(A, rhs, pressure, 1e-10, 2000, num::Backend::seq);

Projection Skeleton

advect_velocity(u, v, dt);
build_divergence_rhs(u, v, rhs);
num::cg(A, rhs, pressure, 1e-8, 1000, num::best_backend);
subtract_pressure_gradient(u, v, pressure, dt);
apply_boundary_conditions(u, v);
constexpr Backend best_backend
Definition policy.hpp:64

This example is intentionally matrix-free: the pressure matrix is represented by the stencil application, not by assembled CSR storage.