#pragma once #include #include // scalar and vector operations double sum_basic(const std::vector& x); double dot_basic(const std::vector& x, const std::vector& y); double dot_kahan(const std::vector& x, const std::vector& y); double norm_basic(const std::vector& x); // matrix-vector, matrix-matrix, polynomial void matvec_rowmajor(const std::vector& A, std::size_t M, std::size_t N, const std::vector& x, std::vector& b); void matmul_rowmajor(const std::vector& A, std::size_t M, std::size_t L, const std::vector& B, std::size_t N, std::vector& C); void polyp_horner(const std::vector& a, const std::vector& x, std::vector& y); struct CSR { std::size_t n; std::vector val; std::vector col; std::vector row_ptr; }; void jacobi_csr(const CSR& K, const std::vector& f, std::vector& u, std::size_t max_iter, double omega, double tol); // build tridiagonal FEM matrix K and rhs f (parallel) void build_fem_system(std::size_t n, CSR& K, std::vector& f); //Jacobi iteration (parallel) void jacobi_csr_parallel(const CSR& K, const std::vector& f, std::vector& u, std::size_t max_iter, double omega, double tol);