|
LMMC
Lamina Mathematic core
|
迭代求解器使用的预处理子接口。 更多...
结构体 | |
| struct | lmmc_precond_t |
| 通用预处理子句柄。 更多... | |
枚举 | |
| enum | lmmc_precond_type_t { LMMC_PRECOND_NONE = 0 , LMMC_PRECOND_JACOBI = 1 , LMMC_PRECOND_ILU0 = 2 , LMMC_PRECOND_ILUT = 3 } |
| 预处理子类型标识。 更多... | |
函数 | |
| lmmc_status_t | lmmc_precond_create_none (size_t size, lmmc_precond_t *out_precond) |
| 创建恒等预处理子(仅记录尺寸,apply 时直接复制)。 | |
| lmmc_status_t | lmmc_precond_create_jacobi (const lmmc_sparse_mat_t *a, lmmc_precond_t *out_precond) |
| 由稀疏矩阵的对角线创建 Jacobi 预处理子:M = diag(A)。 | |
| lmmc_status_t | lmmc_precond_create_ilu0 (const lmmc_sparse_mat_t *a, lmmc_precond_t *out_precond) |
| 创建 ILU(0) 预处理子(零填充不完全 LU 分解)。 | |
| 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_precond_apply (const lmmc_precond_t *precond, const lmmc_vec_t *rhs, lmmc_vec_t *out) |
| 应用预处理子:求解 M*out = rhs。 | |
| void | lmmc_precond_destroy (lmmc_precond_t *precond) |
| 销毁预处理子,释放内部资源。 | |
| struct lmmc_precond_t |
通用预处理子句柄。
内部 impl 指向具体类型相关的数据结构,调用方仅通过 lmmc_precond_apply / lmmc_precond_destroy 操作。
lmmc_minres_solve 仅接受 NONE 或有限严格正的 Jacobi,以保证 M 对称正定。 其他求解器仍按各自合同接受 ILU0 / ILUT。
| 成员变量 | ||
|---|---|---|
| lmmc_precond_type_t | type |
预处理子类型。 |
| size_t | size |
适用的向量长度。 |
| void * | impl |
内部实现指针。 |
| int | owns_data |
是否拥有内部数据所有权。 |
| enum lmmc_precond_type_t |
| lmmc_status_t lmmc_precond_create_none | ( | size_t | size, |
| lmmc_precond_t * | out_precond ) |
创建恒等预处理子(仅记录尺寸,apply 时直接复制)。
引用了 lmmc_precond_t::impl, lmmc_precond_create_none(), LMMC_PRECOND_NONE, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_precond_t::owns_data, lmmc_precond_t::size , 以及 lmmc_precond_t::type.
被这些函数引用 lmmc_precond_create_none().
| lmmc_status_t lmmc_precond_create_jacobi | ( | const lmmc_sparse_mat_t * | a, |
| lmmc_precond_t * | out_precond ) |
由稀疏矩阵的对角线创建 Jacobi 预处理子:M = diag(A)。
存储 A 对角线的倒数;对角元为零或过小(<1e-15)时返回 SINGULAR_MATRIX。
| [in] | a | 输入稀疏矩阵,满足 sparse_types.h 的规范 CSR 契约,保持不变。 |
| [out] | out_precond | 输出预处理子句柄。 |
引用了 lmmc_sparse_mat_t::cols, lmmc_sparse_mat_t::format, lmmc_precond_t::impl, lmmc_memory_alloc(), lmmc_memory_free(), lmmc_precond_create_jacobi(), LMMC_PRECOND_JACOBI, LMMC_SPARSE_CSR, LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_precond_t::owns_data, lmmc_sparse_mat_t::rows, lmmc_precond_t::size , 以及 lmmc_precond_t::type.
被这些函数引用 lmmc_precond_create_jacobi().
| lmmc_status_t lmmc_precond_create_ilu0 | ( | const lmmc_sparse_mat_t * | a, |
| lmmc_precond_t * | out_precond ) |
创建 ILU(0) 预处理子(零填充不完全 LU 分解)。
复制 A 的结构后就地执行 IKJ 形式的 ILU 分解,保持原非零位置。
| [in] | a | 输入稀疏矩阵,满足 sparse_types.h 的规范 CSR 契约,保持不变。 |
| [out] | out_precond | 输出预处理子句柄。 |
在文件 precond_ilu0.c 第 99 行定义.
引用了 lmmc_sparse_mat_t::cols, lmmc_sparse_mat_t::format, lmmc_precond_t::impl, lmmc_ilu_impl_destroy(), lmmc_precond_create_ilu0(), LMMC_PRECOND_ILU0, LMMC_SPARSE_CSR, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_precond_t::owns_data, lmmc_sparse_mat_t::rows, lmmc_precond_t::size , 以及 lmmc_precond_t::type.
被这些函数引用 lmmc_precond_create_ilu0().
| 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 预处理子。
| [in] | a | 输入稀疏矩阵,满足段内索引严格递增的规范 CSR 契约。 |
| [in] | drop_tol | 填充项绝对值的丢弃阈值,小于该值的填充被丢弃。 |
| [in] | max_fill_per_row | 每行最多保留的非零元个数。 |
| [out] | out_precond | 输出预处理子句柄。 |
在文件 precond_ilut.c 第 195 行定义.
引用了 lmmc_sparse_mat_t::cols, lmmc_sparse_mat_t::format, lmmc_precond_t::impl, lmmc_ilu_impl_create(), lmmc_ilu_impl_destroy(), lmmc_ilu_row_bytes(), lmmc_ilu_row_create(), lmmc_memory_free(), lmmc_precond_create_ilut(), LMMC_PRECOND_ILUT, LMMC_SPARSE_CSR, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_precond_t::owns_data, lmmc_sparse_mat_t::rows, lmmc_precond_t::size, lmmc_precond_t::type , 以及 lmmc_ilu_row_t::values.
被这些函数引用 lmmc_precond_create_ilut().
| lmmc_status_t lmmc_precond_apply | ( | const lmmc_precond_t * | precond, |
| const lmmc_vec_t * | rhs, | ||
| lmmc_vec_t * | out ) |
应用预处理子:求解 M*out = rhs。
根据 precond->type 分派到对应的求解逻辑:
| [in] | precond | 预处理子句柄(不被修改)。 |
| [in] | rhs | 右端向量(不被修改)。 |
| [out] | out | 输出向量,长度须与 rhs 相同,内容被覆写。out 不可与 rhs 别名。 |
引用了 lmmc_vec_t::data, lmmc_ilu_apply(), lmmc_precond_apply(), LMMC_PRECOND_ILU0, LMMC_PRECOND_ILUT, LMMC_PRECOND_JACOBI, LMMC_PRECOND_NONE, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_NOT_IMPLEMENTED, lmmc_vec_copy(), lmmc_precond_t::size, lmmc_vec_t::size , 以及 lmmc_precond_t::type.
被这些函数引用 lmmc_apply_precond_or_identity() , 以及 lmmc_precond_apply().
| void lmmc_precond_destroy | ( | lmmc_precond_t * | precond | ) |
销毁预处理子,释放内部资源。
对 NULL 指针安全。销毁后句柄不可再使用。
| [in,out] | precond | 预处理子句柄,可为 NULL。 |
引用了 lmmc_precond_t::impl, lmmc_ilu_impl_destroy(), lmmc_memory_free(), lmmc_precond_destroy(), LMMC_PRECOND_ILU0, LMMC_PRECOND_ILUT, LMMC_PRECOND_NONE, lmmc_precond_t::owns_data, lmmc_precond_t::size , 以及 lmmc_precond_t::type.
被这些函数引用 lmmc_precond_destroy().