29 if (fabs(rho_new) <= 1e-30) {
37 if (!isfinite(beta)) {
40 for (
size_t i = 0; i < s->
p.
size; ++i) {
43 if (!isfinite(s->
p.
data[i])) {
62 if (fabs(denom) <= 1e-30) {
66 if (!isfinite(alpha)) {
69 for (
size_t i = 0; i < x->
size; ++i) {
72 if (!isfinite(x->
data[i])) {
86 size_t* iterations,
int* converged) {
91 for (
size_t iter = 0; iter < cfg->
max_iter; ++iter) {
92 st = lmmc_cg_step(a, x, s);
96 *iterations = iter + 1;
105 st = lmmc_cg_direction(precond, s, 0);
120 size_t iterations = 0;
132 st = lmmc_cg_start(a, b, &local, x, &s);
142 st = lmmc_cg_iterate(a, precond, &local, x, &s, out_result, &iterations, &converged);
double lmmc_real_t
Public and internal LMMC real type.
lmmc_status_t lmmc_vec_axpy(lmmc_real_t alpha, const lmmc_vec_t *x, lmmc_vec_t *y)
向量 AXPY 运算: 。
lmmc_status_t lmmc_vec_copy(const lmmc_vec_t *src, lmmc_vec_t *dst)
逐元素复制向量内容:dst = src。
lmmc_status_t lmmc_vec_dot_checked(const lmmc_vec_t *a, const lmmc_vec_t *b, lmmc_real_t *out_dot)
lmmc_status_t lmmc_vec_norm2_checked(const lmmc_vec_t *v, lmmc_real_t *out_norm)
lmmc_status_t lmmc_itersolve_threshold(const lmmc_itersolve_config_t *cfg, const lmmc_vec_t *b, const lmmc_vec_t *r, lmmc_real_t *norm, lmmc_real_t *threshold)
lmmc_status_t lmmc_apply_precond_or_identity(const lmmc_precond_t *precond, const lmmc_vec_t *rhs, lmmc_vec_t *out)
lmmc_status_t lmmc_itersolve_validate(const lmmc_sparse_mat_t *a, const lmmc_vec_t *b, const lmmc_precond_t *precond, const lmmc_itersolve_config_t *cfg, lmmc_vec_t *x, lmmc_itersolve_config_t *out_cfg, lmmc_itersolve_result_t *out_result)
lmmc_status_t lmmc_itersolve_workspace(lmmc_vec_t *const *vectors, const size_t *sizes, size_t count, lmmc_real_t **storage)
所有视图借用求解过程统一分配的存储区,最后一次日志回调后释放。
void lmmc_itersolve_finish(lmmc_itersolve_result_t *result, int converged, size_t iterations, lmmc_real_t norm)
lmmc_status_t lmmc_itersolve_residual(const lmmc_sparse_mat_t *a, const lmmc_vec_t *b, const lmmc_vec_t *x, lmmc_vec_t *ax, lmmc_vec_t *r)
void lmmc_itersolve_initial(lmmc_itersolve_result_t *result, lmmc_real_t norm)
void lmmc_itersolve_do_log(const lmmc_itersolve_config_t *cfg, size_t iter, lmmc_real_t residual_norm)
lmmc_real_t final_residual_norm
lmmc_status_t lmmc_cg_solve(const lmmc_sparse_mat_t *a, const lmmc_vec_t *b, const lmmc_precond_t *precond, const lmmc_itersolve_config_t *cfg, lmmc_vec_t *x, lmmc_itersolve_result_t *out_result)
共轭梯度法(CG)求解对称正定稀疏系统 A*x = b。
void lmmc_memory_free(void *pointer)
lmmc_status_t lmmc_sparse_mat_vec_mul(const lmmc_sparse_mat_t *sparse, const lmmc_vec_t *x, lmmc_vec_t *y)
稀疏矩阵-稠密向量乘法:y = A * x。
通用稀疏矩阵(CSR / CSC 共用同一结构)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE