LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
precond_apply.c
浏览该文件的文档.
1
#include "
precond_internal.h
"
2
3
static
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)) {
16
return
LMMC_STATUS_NUMERICAL_FAILURE
;
17
}
18
impl->
y_arr
[i] = sum;
19
}
20
return
LMMC_STATUS_OK
;
21
}
22
23
static
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) {
38
return
LMMC_STATUS_NUMERICAL_FAILURE
;
39
}
40
out->
data
[row] = sum / diag;
41
if
(!isfinite(out->
data
[row])) {
42
return
LMMC_STATUS_NUMERICAL_FAILURE
;
43
}
44
}
45
return
LMMC_STATUS_OK
;
46
}
47
48
lmmc_status_t
lmmc_ilu_apply
(
const
lmmc_precond_t
* precond,
49
const
lmmc_vec_t
* rhs,
lmmc_vec_t
* out) {
50
const
lmmc_precond_ilu_impl_t
* impl = precond->
impl
;
51
if
(impl == NULL) {
52
return
LMMC_STATUS_INVALID_ARGUMENT
;
53
}
54
if
(impl->
size
!= precond->
size
|| impl->
diag_pos
== NULL ||
55
impl->
row_ptr
== NULL || impl->
y_arr
== NULL) {
56
return
LMMC_STATUS_INVALID_ARGUMENT
;
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
}
lmmc_real_t
double lmmc_real_t
Public and internal LMMC real type.
定义
config.h:28
lmmc_vec_t::data
lmmc_real_t * data
定义
dense_types.h:33
lmmc_vec_t
一维稠密向量。
定义
dense_types.h:31
lmmc_precond_t::impl
void * impl
定义
precond.h:39
lmmc_precond_t::size
size_t size
定义
precond.h:38
lmmc_precond_t
通用预处理子句柄。
定义
precond.h:36
lmmc_ilu_apply
lmmc_status_t lmmc_ilu_apply(const lmmc_precond_t *precond, const lmmc_vec_t *rhs, lmmc_vec_t *out)
定义
precond_apply.c:48
precond_internal.h
lmmc_precond_ilu_impl_t::y_arr
lmmc_real_t * y_arr
定义
precond_internal.h:19
lmmc_precond_ilu_impl_t::diag_pos
size_t * diag_pos
定义
precond_internal.h:18
lmmc_precond_ilu_impl_t::col_idx
size_t * col_idx
定义
precond_internal.h:16
lmmc_precond_ilu_impl_t::lu_values
lmmc_real_t * lu_values
定义
precond_internal.h:17
lmmc_precond_ilu_impl_t::row_ptr
size_t * row_ptr
定义
precond_internal.h:15
lmmc_precond_ilu_impl_t::size
size_t size
定义
precond_internal.h:12
lmmc_precond_ilu_impl_t
定义
precond_internal.h:11
lmmc_status_t
lmmc_status_t
LMMC 库统一返回的状态码.
定义
status.h:22
LMMC_STATUS_OK
@ LMMC_STATUS_OK
定义
status.h:23
LMMC_STATUS_NUMERICAL_FAILURE
@ LMMC_STATUS_NUMERICAL_FAILURE
定义
status.h:29
LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INVALID_ARGUMENT
定义
status.h:24
src
precond_apply.c
生成于
, 为 LMMC使用
1.18.0