aboutsummaryrefslogtreecommitdiffstats
path: root/common/placer_math.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/placer_math.c')
-rw-r--r--common/placer_math.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/common/placer_math.c b/common/placer_math.c
new file mode 100644
index 00000000..456bc0a1
--- /dev/null
+++ b/common/placer_math.c
@@ -0,0 +1,43 @@
+#include "taucs.h"
+#include "placer_math.h"
+#include <stdio.h>
+
+void taucif_init_solver() {
+ taucs_logfile("stdout");
+}
+
+struct taucif_system {
+ taucs_ccs_matrix* mat;
+ int ccs_i, ccs_col;
+};
+
+struct taucif_system *taucif_create_system(int rows, int cols, int n_nonzero) {
+ struct taucif_system *sys = taucs_malloc(sizeof(struct taucif_system));
+ sys->mat = taucs_ccs_create(cols, rows, n_nonzero, TAUCS_DOUBLE | TAUCS_SYMMETRIC);
+ // Internal pointers
+ sys->ccs_i = 0;
+ sys->ccs_col = -1;
+ return sys;
+};
+
+void taucif_set_matrix_value(struct taucif_system *sys, int row, int col, double value) {
+ while(sys->ccs_col < col) {
+ sys->mat->colptr[++sys->ccs_col] = sys->ccs_i;
+ }
+ sys->mat->rowind[sys->ccs_i] = row;
+ sys->mat->values.d[sys->ccs_i++] = value;
+}
+
+void taucif_solve_system(struct taucif_system *sys, double *x, double *rhs) {
+ // FIXME: preconditioner, droptol??
+ taucs_ccs_matrix* precond_mat = taucs_ccs_factor_llt(sys->mat, 1e-3, 0);
+ // FIXME: itermax, convergetol
+ int cjres = taucs_conjugate_gradients(sys->mat, taucs_ccs_solve_llt, precond_mat, x, rhs, 1000, 1e-6);
+ taucs_ccs_free(precond_mat);
+}
+
+void taucif_free_system(struct taucif_system *sys) {
+ taucs_ccs_free(sys->mat);
+ taucs_free(sys->mat);
+}
+