// Copyright: Jon Wilkening, 1999. #ifndef __SYM_MAT_H #define __SYM_MAT_H #ifdef __cplusplus extern "C" { #endif #ifndef HIDE_FROM_DOXYGEN typedef struct sym_mat_elt_struct { int row; double val; } sym_mat_elt; typedef struct sym_mat_list_elt_struct { int next; int row; double val; } sym_mat_list_elt; typedef struct sym_mat_hit_list_elt_struct { int next; int prev; double val; } sym_mat_hit_list_elt; typedef struct sym_mat_elt_list_struct { int n; int size, maxsize; sym_mat_list_elt *space; } sym_mat_elt_list; typedef struct sym_mat_row_elt_struct { int next; int idx; } sym_mat_row_elt; #endif // HIDE_FROM_DOXYGEN typedef struct sym_mat_struct { int n; double flops; // flops to factor A (not counting equil, solve, etc.) int nnzA; // diagonal elements counted even if they are zero int nnzL; // (but they will be nonzero if A is SPD) double scond; // smallest eq / largest eq int no_more_entries; int already_factored; int b_is_set_up; sym_mat_elt_list v; sym_mat_elt *col; // size n sym_mat_hit_list_elt *hits; // size n sym_mat_row_elt *row; // size n int *pa; // size n+1 int *a; // size 1 or nnz_A int *pb; // size n+1 sym_mat_elt *b; // size 1 or nnz_A int *pc; // size n+1 sym_mat_elt *c; // size 1 or nnz_L int *perm1; // size n+1 int *perm2; // size n double *eq; // size n } sym_mat; // allocate space, initial set-up void sym_mat_init(sym_mat *A, int n); // free all space allocated by a sym_mat routine void sym_mat_free(sym_mat *A); // add val to entry A(i,j). indices are 0 based. // Only lower triangle is accessed, so nothing is done if i