33 for (
size_t i = 0; i < r->
size; ++i) {
34 if (!isfinite(r->
data[i]) || !isfinite(y->
data[i])) {
37 nonzero |= r->
data[i] != 0.0;
47 if (dot == 0.0 && nonzero) {
76 for (
size_t i = 0; i < s->
v.
size; ++i) {
78 if (!isfinite(s->
v.
data[i])) {
88 if (!isfinite(scale)) {
91 for (
size_t i = 0; i < s->
v.
size; ++i) {
95 for (
size_t i = 0; i < s->
v.
size; ++i) {
105 if (!isfinite(scale)) {
108 for (
size_t i = 0; i < s->
v.
size; ++i) {
127 const double oldeps = s->
epsln;
132 const double gamma = hypot(gbar, s->
beta_next);
133 if (!isfinite(delta) || !isfinite(gbar) || !isfinite(s->
epsln) ||
134 !isfinite(s->
dbar) || !isfinite(gamma)) {
141 s->
cs = gbar / gamma;
143 const double phi = s->
cs * s->
phibar;
145 if (!isfinite(s->
cs) || !isfinite(s->
sn) || !isfinite(phi) || !isfinite(s->
phibar)) {
148 for (
size_t i = 0; i < x->
size; ++i) {
155 for (
size_t i = 0; i < x->
size; ++i) {
157 if (!isfinite(x->
data[i])) {
177 st = lmmc_minres_beta(&s->
r_curr, &s->
y, &s->
beta);
183 for (
size_t iter = 0; iter < cfg->
max_iter; ++iter) {
184 st = lmmc_minres_lanczos(a, precond, cfg, s);
189 st = lmmc_minres_rotate(x, s, &updated);
196 *iterations = iter + 1;
220 lmmc_status_t st = lmmc_minres_validate(a, b, precond, cfg, x, &local);
226 size_t iterations = 0;
231 const size_t n = b->
size;
232 const size_t sizes[] = {n, n, n, n, n, n, n, n, n};
237 st = lmmc_minres_start(a, b, &local, x, &s);
246 st = lmmc_minres_iterate(a, b, precond, &local, x, &s, &iterations, &converged);
double lmmc_real_t
Public and internal LMMC real type.
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_true_residual(const lmmc_sparse_mat_t *a, const lmmc_itersolve_config_t *cfg, const lmmc_vec_t *b, const lmmc_vec_t *x, lmmc_vec_t *r, lmmc_real_t *norm)
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_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)
void lmmc_itersolve_result_init(lmmc_itersolve_result_t *result)
lmmc_status_t lmmc_itersolve_matvec(const lmmc_sparse_mat_t *a, const lmmc_itersolve_config_t *cfg, const lmmc_vec_t *x_in, lmmc_vec_t *y_out)
通过无矩阵算子或稀疏矩阵计算 y = A*x。
void lmmc_itersolve_initial(lmmc_itersolve_result_t *result, lmmc_real_t norm)
lmmc_status_t lmmc_itersolve_dispatch_config(const lmmc_sparse_mat_t *a, const lmmc_vec_t *b, const lmmc_itersolve_config_t *cfg, const lmmc_vec_t *x, lmmc_itersolve_config_t *local)
void lmmc_itersolve_do_log(const lmmc_itersolve_config_t *cfg, size_t iter, lmmc_real_t residual_norm)
lmmc_status_t lmmc_minres_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)
MINRES 求解对称(可能不定)稀疏系统 A x = b 。
void lmmc_memory_free(void *pointer)
lmmc_status_t lmmc_precond_validate_spd(const lmmc_precond_t *precond, size_t size)
通用稀疏矩阵(CSR / CSC 共用同一结构)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_NOT_POSITIVE_DEFINITE
@ LMMC_STATUS_DIMENSION_MISMATCH