LMMC
Lamina Mathematic core
Toggle main menu visibility
载入中...
搜索中...
未找到
precond_workspace.c
浏览该文件的文档.
1
#include "
precond_internal.h
"
2
3
int
lmmc_find_col_pos
(
4
const
size_t
* col_idx,
5
size_t
start,
6
size_t
end,
7
size_t
target_col,
8
size_t
* out_pos
9
) {
10
size_t
p = 0;
11
12
if
(col_idx == NULL || out_pos == NULL || start > end) {
13
return
0;
14
}
15
16
for
(p = start; p < end; ++p) {
17
if
(col_idx[p] == target_col) {
18
*out_pos = p;
19
return
1;
20
}
21
}
22
return
0;
23
}
24
25
void
lmmc_ilu_impl_destroy
(
lmmc_precond_ilu_impl_t
* impl) {
26
if
(impl == NULL) {
27
return
;
28
}
29
30
if
(impl->
lu_values
!= NULL) {
31
size_t
k;
32
for
(k = 0; k < impl->
capacity
; ++k) {
33
LMMC_REAL_CLEAR
(&impl->
lu_values
[k]);
34
}
35
lmmc_memory_free
(impl->
lu_values
);
36
}
37
if
(impl->
y_arr
!= NULL) {
38
size_t
k;
39
for
(k = 0; k < impl->
size
; ++k) {
40
LMMC_REAL_CLEAR
(&impl->
y_arr
[k]);
41
}
42
lmmc_memory_free
(impl->
y_arr
);
43
}
44
lmmc_memory_free
(impl->
diag_pos
);
45
lmmc_memory_free
(impl->
col_idx
);
46
lmmc_memory_free
(impl->
row_ptr
);
47
lmmc_memory_free
(impl);
48
}
49
50
lmmc_status_t
lmmc_ilu_impl_reserve
(
lmmc_precond_ilu_impl_t
* impl,
size_t
required_capacity) {
51
size_t
new_capacity = 0;
52
size_t
idx_bytes = 0;
53
size_t
val_bytes = 0;
54
size_t
* new_col_idx = NULL;
55
lmmc_real_t
* new_lu_values = NULL;
56
57
if
(impl == NULL) {
58
return
LMMC_STATUS_INVALID_ARGUMENT
;
59
}
60
61
if
(required_capacity <= impl->capacity) {
62
return
LMMC_STATUS_OK
;
63
}
64
65
new_capacity = (impl->
capacity
== 0) ? 16 : impl->
capacity
;
66
while
(new_capacity < required_capacity) {
67
size_t
doubled = 0;
68
if
(!lmmc_safe_mul_size(new_capacity, 2, &doubled)) {
69
new_capacity = required_capacity;
70
break
;
71
}
72
new_capacity = doubled;
73
}
74
75
if
(!lmmc_safe_mul_size(new_capacity,
sizeof
(
size_t
), &idx_bytes) ||
76
!lmmc_safe_mul_size(new_capacity,
sizeof
(
lmmc_real_t
), &val_bytes)) {
77
return
LMMC_STATUS_INVALID_ARGUMENT
;
78
}
79
80
new_col_idx = (
size_t
*)
lmmc_memory_alloc
(idx_bytes);
81
new_lu_values = (
lmmc_real_t
*)
lmmc_memory_alloc
(val_bytes);
82
if
(new_col_idx == NULL || new_lu_values == NULL) {
83
lmmc_memory_free
(new_lu_values);
84
lmmc_memory_free
(new_col_idx);
85
return
LMMC_STATUS_ALLOCATION_FAILED
;
86
}
87
88
size_t
k;
89
for
(k = 0; k < new_capacity; ++k) {
90
LMMC_REAL_INIT
(&new_lu_values[k]);
91
LMMC_REAL_SET_D
(&new_lu_values[k], 0.0);
92
}
93
94
if
(impl->
nnz
> 0) {
95
memcpy(new_col_idx, impl->
col_idx
, impl->
nnz
*
sizeof
(
size_t
));
96
for
(k = 0; k < impl->
nnz
; ++k) {
97
LMMC_REAL_SET
(&new_lu_values[k], &impl->
lu_values
[k]);
98
}
99
}
100
101
if
(impl->
lu_values
!= NULL) {
102
for
(k = 0; k < impl->
capacity
; ++k) {
103
LMMC_REAL_CLEAR
(&impl->
lu_values
[k]);
104
}
105
lmmc_memory_free
(impl->
lu_values
);
106
}
107
108
lmmc_memory_free
(impl->
col_idx
);
109
impl->
col_idx
= new_col_idx;
110
impl->
lu_values
= new_lu_values;
111
impl->
capacity
= new_capacity;
112
return
LMMC_STATUS_OK
;
113
}
114
115
lmmc_status_t
lmmc_ilu_impl_create
(
size_t
size,
lmmc_precond_ilu_impl_t
** out) {
116
size_t
rows, row_bytes, diag_bytes, y_bytes;
117
if
(!lmmc_safe_add_size(size, 1, &rows) ||
118
!lmmc_safe_mul_size(rows,
sizeof
(
size_t
), &row_bytes)) {
119
return
LMMC_STATUS_INVALID_ARGUMENT
;
120
}
121
if
(!lmmc_safe_mul_size(size,
sizeof
(
size_t
), &diag_bytes) ||
122
!lmmc_safe_mul_size(size,
sizeof
(
lmmc_real_t
), &y_bytes)) {
123
return
LMMC_STATUS_INVALID_ARGUMENT
;
124
}
125
lmmc_precond_ilu_impl_t
* impl =
lmmc_memory_alloc
(
sizeof
(*impl));
126
if
(impl == NULL) {
127
return
LMMC_STATUS_ALLOCATION_FAILED
;
128
}
129
memset(impl, 0,
sizeof
(*impl));
130
impl->
size
= size;
131
impl->
row_ptr
=
lmmc_memory_alloc
(row_bytes);
132
impl->
diag_pos
=
lmmc_memory_alloc
(diag_bytes);
133
impl->
y_arr
=
lmmc_memory_alloc
(y_bytes);
134
if
(impl->
row_ptr
== NULL || impl->
diag_pos
== NULL || impl->
y_arr
== NULL) {
135
lmmc_ilu_impl_destroy
(impl);
136
return
LMMC_STATUS_ALLOCATION_FAILED
;
137
}
138
memset(impl->
y_arr
, 0, y_bytes);
139
*out = impl;
140
return
LMMC_STATUS_OK
;
141
}
LMMC_REAL_CLEAR
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
定义
config.h:38
LMMC_REAL_INIT
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
定义
config.h:36
lmmc_real_t
double lmmc_real_t
Public and internal LMMC real type.
定义
config.h:28
LMMC_REAL_SET
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
定义
config.h:41
LMMC_REAL_SET_D
#define LMMC_REAL_SET_D(dst, dbl)
将一个 double 字面量赋值到 lmmc_real_t 。
定义
config.h:43
lmmc_memory_alloc
void * lmmc_memory_alloc(size_t size)
定义
memory_bridge.c:46
lmmc_memory_free
void lmmc_memory_free(void *pointer)
定义
memory_bridge.c:75
precond_internal.h
lmmc_precond_ilu_impl_t::capacity
size_t capacity
定义
precond_internal.h:14
lmmc_ilu_impl_reserve
lmmc_status_t lmmc_ilu_impl_reserve(lmmc_precond_ilu_impl_t *impl, size_t required)
定义
precond_workspace.c:50
lmmc_ilu_impl_create
lmmc_status_t lmmc_ilu_impl_create(size_t size, lmmc_precond_ilu_impl_t **out)
定义
precond_workspace.c:115
lmmc_precond_ilu_impl_t::nnz
size_t nnz
定义
precond_internal.h:13
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_ilu_impl_destroy
void lmmc_ilu_impl_destroy(lmmc_precond_ilu_impl_t *impl)
定义
precond_workspace.c:25
lmmc_find_col_pos
int lmmc_find_col_pos(const size_t *cols, size_t start, size_t end, size_t col, size_t *pos)
定义
precond_workspace.c:3
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_ALLOCATION_FAILED
@ LMMC_STATUS_ALLOCATION_FAILED
定义
status.h:26
LMMC_STATUS_INVALID_ARGUMENT
@ LMMC_STATUS_INVALID_ARGUMENT
定义
status.h:24
src
precond_workspace.c
生成于
, 为 LMMC使用
1.18.0