LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
precond_row.c
浏览该文件的文档.
1
#include "
precond_internal.h
"
2
3
lmmc_status_t
lmmc_ilu_row_bytes
(
size_t
n,
size_t
fill,
size_t
* bytes) {
4
size_t
values, indices, marks;
5
if
(!lmmc_safe_mul_size(n,
sizeof
(
lmmc_real_t
), &values) ||
6
!lmmc_safe_mul_size(fill, 2, &indices)) {
7
return
LMMC_STATUS_INVALID_ARGUMENT
;
8
}
9
if
(!lmmc_safe_add_size(indices, n, &indices) ||
10
!lmmc_safe_mul_size(indices,
sizeof
(
size_t
), &indices)) {
11
return
LMMC_STATUS_INVALID_ARGUMENT
;
12
}
13
if
(!lmmc_safe_mul_size(n, 2, &marks)) {
14
return
LMMC_STATUS_INVALID_ARGUMENT
;
15
}
16
const
size_t
alignment = _Alignof(
size_t
);
17
size_t
padding = (alignment - values % alignment) % alignment;
18
if
(!lmmc_safe_add_size(values, padding, &values) ||
19
!lmmc_safe_add_size(values, indices, bytes)) {
20
return
LMMC_STATUS_INVALID_ARGUMENT
;
21
}
22
if
(!lmmc_safe_add_size(*bytes, marks, bytes)) {
23
return
LMMC_STATUS_INVALID_ARGUMENT
;
24
}
25
return
LMMC_STATUS_OK
;
26
}
27
28
lmmc_status_t
lmmc_ilu_row_create
(
size_t
n,
size_t
fill,
size_t
bytes,
29
lmmc_ilu_row_t
* row) {
30
row->
values
=
lmmc_memory_alloc
(bytes);
31
if
(row->
values
== NULL) {
32
return
LMMC_STATUS_ALLOCATION_FAILED
;
33
}
34
memset(row->
values
, 0, bytes);
35
size_t
values = n *
sizeof
(
lmmc_real_t
);
36
const
size_t
alignment = _Alignof(
size_t
);
37
values += (alignment - values % alignment) % alignment;
38
row->
active
= (
size_t
*)((
unsigned
char
*)row->
values
+ values);
39
row->
lower
= row->
active
+ n;
40
row->
upper
= row->
lower
+ fill;
41
row->
present
= (
unsigned
char
*)(row->
upper
+ fill);
42
row->
processed
= row->
present
+ n;
43
row->
count
= 0;
44
return
LMMC_STATUS_OK
;
45
}
46
47
void
lmmc_ilu_row_reset
(
lmmc_ilu_row_t
* row) {
48
for
(
size_t
p = 0; p < row->
count
; ++p) {
49
size_t
col = row->
active
[p];
50
row->
present
[col] = 0;
51
row->
processed
[col] = 0;
52
row->
values
[col] = 0.0;
53
}
54
row->
count
= 0;
55
}
56
57
static
void
lmmc_ilu_sort_columns(
size_t
* values,
size_t
count) {
58
for
(
size_t
i = 1; i < count; ++i) {
59
size_t
key = values[i];
60
size_t
j = i;
61
while
(j > 0 && values[j - 1] > key) {
62
values[j] = values[j - 1];
63
--j;
64
}
65
values[j] = key;
66
}
67
}
68
69
static
size_t
lmmc_ilu_smallest_entry(
const
lmmc_real_t
* values,
70
const
size_t
* cols,
size_t
count) {
71
size_t
minimum = 0;
72
lmmc_real_t
minimum_abs = fabs(values[cols[0]]);
73
for
(
size_t
i = 1; i < count; ++i) {
74
lmmc_real_t
magnitude = fabs(values[cols[i]]);
75
if
(magnitude < minimum_abs) {
76
minimum_abs = magnitude;
77
minimum = i;
78
}
79
}
80
return
minimum;
81
}
82
83
void
lmmc_ilu_select
(
const
lmmc_ilu_row_t
* row,
size_t
i,
int
lower,
84
lmmc_real_t
drop_tol,
size_t
max_keep,
size_t
* cols,
size_t
* count) {
85
size_t
selected = 0;
86
for
(
size_t
p = 0; p < row->
count
; ++p) {
87
size_t
col = row->
active
[p];
88
if
(!row->
present
[col]) {
89
continue
;
90
}
91
if
(lower ? col >= i : col <= i) {
92
continue
;
93
}
94
lmmc_real_t
magnitude = fabs(row->
values
[col]);
95
if
(magnitude <= drop_tol) {
96
continue
;
97
}
98
if
(selected < max_keep) {
99
cols[selected++] = col;
100
}
101
else
{
102
size_t
minimum = lmmc_ilu_smallest_entry(row->
values
, cols, selected);
103
if
(magnitude > fabs(row->
values
[cols[minimum]])) {
104
cols[minimum] = col;
105
}
106
}
107
}
108
lmmc_ilu_sort_columns(cols, selected);
109
*count = selected;
110
}
lmmc_real_t
double lmmc_real_t
Public and internal LMMC real type.
定义
config.h:28
lmmc_memory_alloc
void * lmmc_memory_alloc(size_t size)
定义
memory_bridge.c:46
precond_internal.h
lmmc_ilu_row_create
lmmc_status_t lmmc_ilu_row_create(size_t n, size_t fill, size_t bytes, lmmc_ilu_row_t *row)
定义
precond_row.c:28
lmmc_ilu_row_t::active
size_t * active
定义
precond_internal.h:25
lmmc_ilu_row_t::upper
size_t * upper
定义
precond_internal.h:27
lmmc_ilu_row_t::processed
unsigned char * processed
定义
precond_internal.h:29
lmmc_ilu_row_t::values
lmmc_real_t * values
定义
precond_internal.h:24
lmmc_ilu_row_bytes
lmmc_status_t lmmc_ilu_row_bytes(size_t n, size_t fill, size_t *bytes)
定义
precond_row.c:3
lmmc_ilu_row_t::lower
size_t * lower
定义
precond_internal.h:26
lmmc_ilu_select
void lmmc_ilu_select(const lmmc_ilu_row_t *row, size_t i, int lower, lmmc_real_t drop_tol, size_t max_keep, size_t *cols, size_t *count)
定义
precond_row.c:83
lmmc_ilu_row_t::present
unsigned char * present
定义
precond_internal.h:28
lmmc_ilu_row_t::count
size_t count
定义
precond_internal.h:30
lmmc_ilu_row_reset
void lmmc_ilu_row_reset(lmmc_ilu_row_t *row)
定义
precond_row.c:47
lmmc_ilu_row_t
行工作区仅分配一次,以下指针均借用该内存。
定义
precond_internal.h:23
lmmc_status_t
lmmc_status_t
LMMC 库统一返回的状态码.
定义
status.h:22
LMMC_STATUS_OK
@ LMMC_STATUS_OK
定义
status.h:23
LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_ALLOCATION_FAILED
定义
status.h:26
LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INVALID_ARGUMENT
定义
status.h:24
src
precond_row.c
生成于
, 为 LMMC使用
1.18.0