LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
sparse_lu.c 文件参考
#include <string.h>
#include <math.h>
#include "memory_bridge.h"
#include "internal.h"
#include "lmmc/sparse.h"
#include "sparse_direct_internal.h"
sparse_lu.c 的引用(Include)关系图:

浏览该文件的源代码.

函数

lmmc_status_t lmmc_sparse_lu_symbolic (const lmmc_sparse_mat_t *a, lmmc_sparse_lu_t **out_lu)
 稀疏 LU 符号分析:去重简单图与贪心残余度重排序。
lmmc_status_t lmmc_sparse_lu_numeric (const lmmc_sparse_mat_t *a, lmmc_sparse_lu_t *lu)
 稀疏 LU 数值分解:稠密列工作区左看算法与部分主元法。
lmmc_status_t lmmc_sparse_lu_solve (const lmmc_sparse_lu_t *lu, const lmmc_vec_t *b, lmmc_vec_t *x)
 使用残余度排序的 LU 因子求解 A*x = b。
void lmmc_sparse_lu_destroy (lmmc_sparse_lu_t *lu)
 销毁稀疏 LU 上下文。

函数说明

◆ lmmc_sparse_lu_symbolic()

lmmc_status_t lmmc_sparse_lu_symbolic ( const lmmc_sparse_mat_t * a,
lmmc_sparse_lu_t ** out_lu )

稀疏 LU 符号分析:去重简单图与贪心残余度重排序。

分析矩阵的稀疏结构,计算确定性的度数/原索引顺序,并预分配 L/U 因子的存储空间。矩阵结构不变、仅数值变化时可复用分析结果。

参数
[in]a输入方阵,rows 须等于 cols。
[out]out_lu返回的 LU 上下文句柄,调用方需配对调用 lmmc_sparse_lu_destroy 释放。
返回
副作用
  • 分配堆内存(LU 上下文 + 内部工作数组)。a 保持原值。
  • 若 a 为 CSR 格式,内部会临时转换为 CSC 并在返回前释放。

在文件 sparse_lu.c 第 49 行定义.

引用了 lmmc_sparse_lu_t::col_perm, lmmc_sparse_mat_t::cols, lmmc_sparse_lu_t::L_nnz, lmmc_memory_alloc(), lmmc_sparse_destroy(), lmmc_sparse_direct_csc(), lmmc_sparse_lu_destroy(), lmmc_sparse_lu_symbolic(), lmmc_sparse_residual_reorder(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_sparse_lu_t::n, lmmc_sparse_mat_t::nnz, lmmc_sparse_mat_t::rows , 以及 lmmc_sparse_lu_t::U_nnz.

被这些函数引用 lmmc_sparse_lu_symbolic().

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

◆ lmmc_sparse_lu_numeric()

lmmc_status_t lmmc_sparse_lu_numeric ( const lmmc_sparse_mat_t * a,
lmmc_sparse_lu_t * lu )

稀疏 LU 数值分解:稠密列工作区左看算法与部分主元法。

每列散布到稠密工作区并由已有 L 列更新;矩阵数值变化但结构不变时可复用 lu。

参数
[in]a输入方阵,维度须与符号分析时一致。
[in,out]lu已完成符号分析的 LU 上下文,数值因子被覆写。
返回
副作用
  • 修改 lu 内部的 L/U 数值数组和行置换。
  • 分配临时工作内存并在返回前释放。

稠密列工作区与逆行置换。

在文件 sparse_lu.c 第 284 行定义.

引用了 lmmc_sparse_mat_t::cols, lmmc_memory_alloc_array(), lmmc_memory_free(), lmmc_sparse_destroy(), lmmc_sparse_direct_csc(), lmmc_sparse_lu_numeric(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_sparse_lu_t::n , 以及 lmmc_sparse_mat_t::rows.

被这些函数引用 lmmc_sparse_lu_numeric().

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

◆ lmmc_sparse_lu_solve()

lmmc_status_t lmmc_sparse_lu_solve ( const lmmc_sparse_lu_t * lu,
const lmmc_vec_t * b,
lmmc_vec_t * x )

使用残余度排序的 LU 因子求解 A*x = b。

使用已分解的稀疏 LU 因子求解 A*x = b。

分解满足 P*A*Q = L*U,其中 P 为部分主元行置换,Q 为残余度列置换。

使用残余度排序的 LU 因子求解 A*x = b。

求解公式:x = Q * U^{-1} * L^{-1} * P * b,其中 P 为行置换,Q 为残余度列置换。 lu 必须已完成 符号分析与数值分解两阶段。

参数
[in]luLU 上下文。
[in]b右端向量,长度须等于 lu->n。
[out]x解向量,长度须等于 lu->n,覆写原内容。
返回
副作用
  • 覆写 x->data。分配并释放长度为 n 的临时工作数组。

应用行置换:work = P * b。

还原列置换:x = Q * y。

col_perm[k] 为置换后第 k 列的原列索引。

在文件 sparse_lu.c 第 380 行定义.

引用了 lmmc_sparse_lu_t::col_perm, lmmc_vec_t::data, lmmc_memory_alloc_array(), lmmc_memory_free(), lmmc_sparse_lu_solve(), LMMC_STATUS_ALLOCATION_FAILED, LMMC_STATUS_DIMENSION_MISMATCH, LMMC_STATUS_INVALID_ARGUMENT, LMMC_STATUS_OK, lmmc_sparse_lu_t::n, lmmc_sparse_lu_t::row_perm , 以及 lmmc_vec_t::size.

被这些函数引用 lmmc_sparse_lu_solve().

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

◆ lmmc_sparse_lu_destroy()

void lmmc_sparse_lu_destroy ( lmmc_sparse_lu_t * lu)

销毁稀疏 LU 上下文。

在文件 sparse_lu.c 第 426 行定义.

引用了 lmmc_sparse_lu_t::col_perm, lmmc_sparse_lu_t::L_col_ptr, lmmc_sparse_lu_t::L_row_idx, lmmc_sparse_lu_t::L_values, lmmc_memory_free(), lmmc_sparse_lu_destroy(), lmmc_sparse_lu_t::row_perm, lmmc_sparse_lu_t::U_col_ptr, lmmc_sparse_lu_t::U_row_idx , 以及 lmmc_sparse_lu_t::U_values.

被这些函数引用 lmmc_sparse_lu_destroy() , 以及 lmmc_sparse_lu_symbolic().

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