1 #ifndef MPIMIS_BASICTOOLS
2 #define MPIMIS_BASICTOOLS
6 #include <malloc/malloc.h>
16 typedef bool boolean_function(
int,
int,
void*,
int n);
17 typedef double function_1D(
double);
18 typedef double function_2D(
double,
double);
32 } Discretization_Scheme;
34 #define ZERO_THRESHOLD 0.00000000000001
35 #define SQRT2 1.414213562373095049
36 #define TWOPI 6.283185307179586476
37 #define FOURPI 12.566370614359172953
47 double scalar_product(
double* a,
double* b,
int n);
48 double euclidean_norm(
double* a,
int n);
49 double frobenius_norm(
double* A,
int rows,
int cols);
50 double normalize_vector(
double* a,
int n);
53 double vector_distance(
double* a,
double* b,
int n);
55 void make_orthonormal_to_system(
double* a,
double* A,
int k,
int n);
62 inline double* allocate_vector(
int size) {
63 return (
double*)malloc(size *
sizeof(
double));
65 inline void free_vector(
double* v) {
66 if(v != NULL) free((
void*)v);
68 inline void fill_vector(
double* v,
int n,
double value) {
69 for(
int i = 0; i < n; i++) v[i] = value;
71 inline void fill_vector_rand(
double* v,
int n) {
72 for(
int i = 0; i < n; i++) v[i] = rand();
74 inline void clear_vector(
double* v,
int n) {
79 inline void scale_vector(
double* v,
int n,
double c) {
80 for(
int i = 0; i < n; i++) v[i] *= c;
82 inline double sum_vector(
double* v,
int n);
83 inline double average_vector(
double* v,
int n);
86 inline double max(
double a,
double b){
return a > b ? a : b;};
87 inline double min(
double a,
double b){
return a < b ? a : b;};
88 inline int max(
int a,
int b){
return a > b ? a : b;};
89 inline int min(
int a,
int b){
return a < b ? a : b;};
91 double min_vector(
double* v,
int n);
92 double max_vector(
double* v,
int n);
93 double min_abs_vector(
double* v,
int n);
94 double max_abs_vector(
double* v,
int n);
96 int min_vector(
int* v,
int n);
97 int max_vector(
int* v,
int n);
98 int min_abs_vector(
int* v,
int n);
99 int max_abs_vector(
int* v,
int n);
103 void matrix_times_matrix(
double* A,
char* A_transposed,
int A_rows,
int A_cols,
double* B,
char* B_transposed,
int B_rows,
int B_cols,
double* C,
double alpha,
double beta);
106 void matrix_times_vector(
double* A,
char* A_transposed,
int A_rows,
int A_cols,
double* b,
double* c,
double alpha,
double beta);
109 void triangular_matrix_times_matrix(
double* A,
char* uplo,
double* X,
int rows,
int cols);
112 void triangular_matrix_times_vector(
double* A,
char* uplo,
int n,
double* x);
115 void transpose_matrix(
double* A,
int m,
int n);
118 void get_matrix_block(
double* A,
int rows,
int cols,
int block_row_start,
int block_col_start,
int block_rows,
int block_cols,
double* B);
122 int invert_matrix(
double* A,
int n);
125 void print_vector(
double* v,
int n);
126 void print_matrix(
double* A,
int m,
int n);
127 void fprint_vector(
char* filename,
double* v,
int n);
128 void fscan_vector(
char* filename,
double* v,
int n);
129 void fprint_matrix(
char* filename,
double* A,
int rows,
int cols);
132 void fill_matrix(
double* A,
double (*)(
int,
int,
void*),
int rows,
int cols,
void* data);
133 void fill_matrix(
double* A, function_2D* k,
int rows,
int cols,
double* grdpoints);
140 double ipow(
double x,
int y);
143 double log(
double x,
double a);
146 int iipow(
int x,
int y);
148 double sgn(
double x);
149 double sqr(
double x);
150 double cube(
double x);
151 double cubert(
double x);
152 int factorial(
int n);
155 void fill_hrefined_grid(
double a,
double b,
int cLevels,
int n,
double* grid);
156 void fill_uniform_grid(
double a,
double b,
int n,
double* grid);
158 void fill_exponential_data(function_1D f,
int cLevels,
int n,
double* d);
159 void fill_uniform_data(function_1D f,
int n,
double* d);
161 void transform_grid_m2l(
double& xmin,
double& xmax,
int n,
double* x);
162 void transform_grid_l2m(
double& xmin,
double& xmax,
int n,
double* x);
164 void fill_vector_from_function(function_1D f,
double* grid,
int n,
double* v, Discretization_Scheme ds = DS_POINTWISE);
166 int get_hrefined_index(
double h,
int n,
double x);
167 int get_uniform_index(
double h,
double x);
168 int get_index(
double* x,
int n,
double x0);
173 void generate_orthonormal_matrix(
double* Q,
int k,
int n);
174 void generate_vector(
double* v,
int n);
175 void generate_normalized_vector(
double* v,
int n);
188 int solve_tridiagonal_system(
double* diaf,
double* ldiaf,
double* udiaf,
double* b,
double* x,
int n);
190 inline int iround(
double x) {
return (
int)(x + 0.5); }
192 #endif // MPIMIS_BASICTOOLS