6 for (
size_t p = a->
row_ptr[i]; p < a->row_ptr[i + 1]; ++p) {
9 if (!isfinite(value)) {
19 if (!isfinite(row->
values[col])) {
27static size_t lmmc_ilut_next_lower(
const lmmc_ilu_row_t* row,
size_t i) {
28 size_t k = (size_t)-1;
29 for (
size_t p = 0; p < row->
count; ++p) {
30 size_t col = row->
active[p];
34 if (k == (
size_t)-1 || col < k) {
43 for (
size_t p = impl->
diag_pos[k] + 1; p < impl->row_ptr[k + 1]; ++p) {
49 if (!isfinite(delta)) {
60 if (!isfinite(row->
values[j])) {
74 if (fabs(aik) <= drop_tol) {
83 if (!isfinite(diag) || fabs(diag) <= 1e-15) {
87 if (!isfinite(multiplier)) {
90 row->
values[k] = multiplier;
91 return lmmc_ilut_subtract_upper(impl, row, k, multiplier);
97 size_t k = lmmc_ilut_next_lower(row, i);
98 if (k == (
size_t)-1) {
101 lmmc_status_t st = lmmc_ilut_eliminate_entry(impl, row, k, drop_tol);
110 for (
size_t p = 0; p < count; ++p) {
111 size_t col = cols[p];
113 if (!isfinite(value)) {
132 if (!isfinite(diag) || fabs(diag) <= 1e-15) {
135 size_t lower_count, upper_count;
138 size_t needed = lower_count + 1 + upper_count;
139 if (impl->
nnz > (
size_t)-1 - needed) {
146 st = lmmc_ilut_append_entries(impl, row, row->
lower, lower_count);
154 st = lmmc_ilut_append_entries(impl, row, row->
upper, upper_count);
165 size_t capacity = a->
nnz;
169 if (capacity < a->rows && a->
rows <= (
size_t)-1 - capacity) {
177 for (
size_t i = 0; i < a->
rows; ++i) {
178 st = lmmc_ilut_load_row(a, i, row);
182 st = lmmc_ilut_eliminate_row(impl, row, i, drop_tol);
186 st = lmmc_ilut_store_row(impl, row, i, drop_tol, fill);
200 drop_tol < 0.0 || max_fill_per_row == 0) {
219 st = lmmc_ilut_factor(a, impl, &row, drop_tol, max_fill_per_row);
228 out_precond->
impl = impl;
double lmmc_real_t
Public and internal LMMC real type.
void lmmc_memory_free(void *pointer)
lmmc_status_t lmmc_precond_create_ilut(const lmmc_sparse_mat_t *a, lmmc_real_t drop_tol, size_t max_fill_per_row, lmmc_precond_t *out_precond)
创建 ILUT 预处理子。
lmmc_status_t lmmc_ilu_impl_reserve(lmmc_precond_ilu_impl_t *impl, size_t required)
lmmc_status_t lmmc_ilu_row_create(size_t n, size_t fill, size_t bytes, lmmc_ilu_row_t *row)
lmmc_status_t lmmc_ilu_impl_create(size_t size, lmmc_precond_ilu_impl_t **out)
unsigned char * processed
void lmmc_ilu_impl_destroy(lmmc_precond_ilu_impl_t *impl)
lmmc_status_t lmmc_ilu_row_bytes(size_t n, size_t fill, size_t *bytes)
void lmmc_ilu_select(const lmmc_ilu_row_t *row, size_t i, int lower, lmmc_real_t drop_tol, size_t max_keep, size_t *cols, size_t *count)
void lmmc_ilu_row_reset(lmmc_ilu_row_t *row)
lmmc_sparse_format_t format
通用稀疏矩阵(CSR / CSC 共用同一结构)。
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_DIMENSION_MISMATCH
@ LMMC_STATUS_SINGULAR_MATRIX
@ LMMC_STATUS_INVALID_ARGUMENT