LMMC
Lamina Mathematic core
载入中...
搜索中...
未找到
precond_workspace.c
浏览该文件的文档.
1#include "precond_internal.h"
2
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
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 }
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 }
43 }
47 lmmc_memory_free(impl);
48}
49
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) {
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)) {
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);
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 }
106 }
107
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
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)) {
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)) {
124 }
125 lmmc_precond_ilu_impl_t* impl = lmmc_memory_alloc(sizeof(*impl));
126 if (impl == NULL) {
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) {
137 }
138 memset(impl->y_arr, 0, y_bytes);
139 *out = impl;
140 return LMMC_STATUS_OK;
141}
#define LMMC_REAL_CLEAR(x)
释放一个 lmmc_real_t 变量(POD 类型为空操作)。
#define LMMC_REAL_INIT(x)
初始化一个 lmmc_real_t 变量(POD 类型为空操作)。
double lmmc_real_t
Public and internal LMMC real type.
#define LMMC_REAL_SET(dst, src)
将一个 lmmc_real_t 赋值到另一个:*dst = *src 。
#define LMMC_REAL_SET_D(dst, dbl)
将一个 double 字面量赋值到 lmmc_real_t 。
void * lmmc_memory_alloc(size_t size)
void lmmc_memory_free(void *pointer)
lmmc_status_t lmmc_ilu_impl_reserve(lmmc_precond_ilu_impl_t *impl, size_t required)
lmmc_status_t lmmc_ilu_impl_create(size_t size, lmmc_precond_ilu_impl_t **out)
void lmmc_ilu_impl_destroy(lmmc_precond_ilu_impl_t *impl)
int lmmc_find_col_pos(const size_t *cols, size_t start, size_t end, size_t col, size_t *pos)
lmmc_status_t
LMMC 库统一返回的状态码.
@ LMMC_STATUS_OK
@ LMMC_STATUS_ALLOCATION_FAILED
@ LMMC_STATUS_INVALID_ARGUMENT