LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
precond_apply.c
浏览该文件的文档.
1#include "precond_internal.h"
2
3static lmmc_status_t lmmc_ilu_forward(const lmmc_precond_ilu_impl_t* impl,
4 const lmmc_vec_t* rhs) {
5 for (size_t i = 0; i < impl->size; ++i) {
6 lmmc_real_t sum = rhs->data[i];
7 for (size_t p = impl->row_ptr[i]; p < impl->row_ptr[i + 1]; ++p) {
8 size_t j = impl->col_idx[p];
9 if (j >= i) {
10 continue;
11 }
12 lmmc_real_t product = impl->lu_values[p] * impl->y_arr[j];
13 sum = sum - product;
14 }
15 if (!isfinite(sum)) {
17 }
18 impl->y_arr[i] = sum;
19 }
20 return LMMC_STATUS_OK;
21}
22
23static lmmc_status_t lmmc_ilu_backward(const lmmc_precond_ilu_impl_t* impl,
24 lmmc_vec_t* out) {
25 for (size_t i = impl->size; i > 0; --i) {
26 size_t row = i - 1;
27 lmmc_real_t sum = impl->y_arr[row];
28 for (size_t p = impl->row_ptr[row]; p < impl->row_ptr[row + 1]; ++p) {
29 size_t j = impl->col_idx[p];
30 if (j <= row) {
31 continue;
32 }
33 lmmc_real_t product = impl->lu_values[p] * out->data[j];
34 sum = sum - product;
35 }
36 lmmc_real_t diag = impl->lu_values[impl->diag_pos[row]];
37 if (!isfinite(sum) || !isfinite(diag) || fabs(diag) <= 1e-15) {
39 }
40 out->data[row] = sum / diag;
41 if (!isfinite(out->data[row])) {
43 }
44 }
45 return LMMC_STATUS_OK;
46}
47
49 const lmmc_vec_t* rhs, lmmc_vec_t* out) {
50 const lmmc_precond_ilu_impl_t* impl = precond->impl;
51 if (impl == NULL) {
53 }
54 if (impl->size != precond->size || impl->diag_pos == NULL ||
55 impl->row_ptr == NULL || impl->y_arr == NULL) {
57 }
58 memset(impl->y_arr, 0, impl->size * sizeof(lmmc_real_t));
59 lmmc_status_t st = lmmc_ilu_forward(impl, rhs);
60 if (st != LMMC_STATUS_OK) {
61 return st;
62 }
63 return lmmc_ilu_backward(impl, out);
64}
double lmmc_real_t
Public and internal LMMC real type.
lmmc_real_t * data
一维稠密向量。
通用预处理子句柄。
lmmc_status_t lmmc_ilu_apply(const lmmc_precond_t *precond, const lmmc_vec_t *rhs, lmmc_vec_t *out)
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_INVALID_ARGUMENT