-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathacr_blockDiagonal.h
143 lines (102 loc) · 2.64 KB
/
acr_blockDiagonal.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#ifndef _acr_blockDiagonal_h
#define _acr_blockDiagonal_h
#include "hlib-c.h"
#include "acr_debug.h"
#include <stdio.h>
// Matrix Block
typedef struct _crDenBlock crDenBlock;
typedef crDenBlock *pcrDenBlock;
struct _crDenBlock {
int size;
hlib_matrix_t e;
};
typedef struct _crLevel crLevel;
typedef crLevel *pcrLevel;
struct _crLevel {
int numBlocks;
pcrDenBlock* block;
};
typedef struct _crDiag crDiag;
typedef crDiag *pcrDiag;
struct _crDiag {
int numLevels;
pcrLevel* level;
};
////////////////////////////////////////////////////////////////////////////////
// Simple Vector
typedef struct _Vec acrVec;
typedef acrVec *pVec;
struct _Vec {
int size;
hlib_vector_t e;
};
// Level Vector
typedef struct _crVecLevel crVecLevel;
typedef crVecLevel *pcrVecLevel;
struct _crVecLevel {
int numBlocks;
pVec* block;
};
typedef struct _crVec crVec;
typedef crVec *pcrVec;
struct _crVec {
int numLevels;
pcrVecLevel* level;
};
////////////////////////////////////////////////////////////////////////////////
// CR block Diagonal Matrix functions
pcrDiag
new_crDiag(int q, int n);
void
print_crDiag(pcrDiag AUXD, char* NAME);
void
print_crDiag_level(pcrDiag AUXD, int level, char* NAME);
double
memory_crDiag_level(pcrDiag AUXD);
void
del_crDiag(pcrDiag Diag);
void
del_supermatrix(hlib_matrix_t A);
////////////////////////////////////////////////////////////////////////////////
// CR block vector functions
pVec
new_Vec(int size);
void
scale_Vec(pVec vec, double alpha);
void
del_Vec(pVec vec);
void
copy_Vec(pVec Va, pVec Vb);
void
add_Vec(pVec y, double a, pVec x);
void
print_Vec(pVec vec, char *NAME);
////////////////////////////////////////////////////////////////////////////////
// CR block Diagonal Vector functions
pcrVec
new_crVec(int q, int n);
void
del_crVec(pcrVec crV);
void
print_crVec(pcrVec crvec, char* varName);
void
print_crVec_level(pcrVec crvec, int lev, char* varName);
////////////////////////////////////////////////////////////////////////////////
// CR vectors
pcrVecLevel
new_crVecLevel(int q, int iiq, int n);
void
del_crVecLevel(pcrVecLevel crVecLev);
void
print_crVecLevel(pcrVecLevel crVecLev, char* varName);
void
copy_crVecLevel(pcrVecLevel VecLevA, pcrVecLevel VecLevB);
////////////////////////////////////////////////////////////////////////////////
#ifdef freemem
#undef freemem
#endif
#define freemem(p) dofreemem(p,__FILE__,__LINE__),p=NULL
/* Do not use dofreemem directly! */
void
dofreemem(void *p, const char *file, int line);
#endif