LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
precond.h 文件参考

迭代求解器使用的预处理子接口。 更多...

#include <stddef.h>
#include "lmmc/dense.h"
#include "lmmc/sparse.h"
#include "lmmc/status.h"
precond.h 的引用(Include)关系图:
此图展示该文件被哪些文件直接或间接地引用了:

浏览该文件的源代码.

结构体

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)
 销毁预处理子,释放内部资源。

详细描述

迭代求解器使用的预处理子接口。

当前支持:恒等(无预处理)、Jacobi(对角)、ILU(0) 和 ILUT 。

在文件 precond.h 中定义.


结构体说明

◆ lmmc_precond_t

struct lmmc_precond_t

通用预处理子句柄。

内部 impl 指向具体类型相关的数据结构,调用方仅通过 lmmc_precond_apply / lmmc_precond_destroy 操作。

lmmc_minres_solve 仅接受 NONE 或有限严格正的 Jacobi,以保证 M 对称正定。 其他求解器仍按各自合同接受 ILU0 / ILUT。

在文件 precond.h 第 36 行定义.

lmmc_precond_t 的协作图:
成员变量
lmmc_precond_type_t type

预处理子类型。

size_t size

适用的向量长度。

void * impl

内部实现指针。

int owns_data

是否拥有内部数据所有权。

枚举类型说明

◆ lmmc_precond_type_t

预处理子类型标识。

枚举值
LMMC_PRECOND_NONE 0 

恒等预处理,等价于无预处理。

LMMC_PRECOND_JACOBI 1 

Jacobi (对角线倒数)。

LMMC_PRECOND_ILU0 2 

不完全 LU 分解,零填充。

LMMC_PRECOND_ILUT 3 

阈值与最大填充控制的不完全 LU 分解。

在文件 precond.h 第 20 行定义.

函数说明

◆ lmmc_precond_create_none()

lmmc_status_t lmmc_precond_create_none ( size_t size,
lmmc_precond_t * out_precond )

创建恒等预处理子(仅记录尺寸,apply 时直接复制)。

在文件 precond.c 第 28 行定义.

引用了 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_precond_create_jacobi()

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_precond_destroy 释放。

在文件 precond.c 第 58 行定义.

引用了 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_precond_create_ilu0()

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输出预处理子句柄。
返回
注解
分配堆内存,调用方须用 lmmc_precond_destroy 释放。

在文件 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_precond_create_ilut()

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_precond_apply()

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 分派到对应的求解逻辑:

  • NONE:直接复制 rhs 到 out。
  • JACOBI:逐元素乘以对角线倒数。
  • ILU0/ILUT:前代 + 回代。
参数
[in]precond预处理子句柄(不被修改)。
[in]rhs右端向量(不被修改)。
[out]out输出向量,长度须与 rhs 相同,内容被覆写。out 不可与 rhs 别名。
返回
副作用
  • 覆写 out->data。无内存分配。

在文件 precond.c 第 120 行定义.

引用了 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().

函数调用图:
这是这个函数的调用关系图:

◆ lmmc_precond_destroy()

void lmmc_precond_destroy ( lmmc_precond_t * precond)

销毁预处理子,释放内部资源。

对 NULL 指针安全。销毁后句柄不可再使用。

参数
[in,out]precond预处理子句柄,可为 NULL。
副作用
  • 释放 impl 指向的内部数据结构。

在文件 precond.c 第 86 行定义.

引用了 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().

函数调用图:
这是这个函数的调用关系图: