25 void casadi_ldl(
const casadi_int* sp_a,
const T1* a,
26 const casadi_int* sp_lt, T1* lt, T1* d,
const casadi_int* p, T1* w) {
27 const casadi_int *lt_colind, *lt_row, *a_colind, *a_row;
28 casadi_int n, r, c, c1, k, k2;
31 lt_colind=sp_lt+2; lt_row=sp_lt+2+n+1;
32 a_colind=sp_a+2; a_row=sp_a+2+n+1;
34 for (r=0; r<n; ++r) w[r] = 0;
38 for (k=a_colind[c1]; k<a_colind[c1+1]; ++k) w[a_row[k]] = a[k];
39 for (k=lt_colind[c]; k<lt_colind[c+1]; ++k) lt[k] = w[p[lt_row[k]]];
41 for (k=a_colind[c1]; k<a_colind[c1+1]; ++k) w[a_row[k]] = 0;
45 for (k=lt_colind[c]; k<lt_colind[c+1]; ++k) {
48 for (k2=lt_colind[r]; k2<lt_colind[r+1]; ++k2) {
49 lt[k] -= lt[k2] * w[lt_row[k2]];
57 for (k=lt_colind[c]; k<lt_colind[c+1]; ++k) w[lt_row[k]] = 0;
64 void casadi_ldl_trs(
const casadi_int* sp_r,
const T1* nz_r, T1* x, casadi_int tr) {
65 casadi_int ncol, c, k;
66 const casadi_int *colind, *row;
69 colind=sp_r+2; row=sp_r+2+ncol+1;
72 for (c=0; c<ncol; ++c) {
73 for (k=colind[c]; k<colind[c+1]; ++k) {
74 x[c] -= nz_r[k]*x[row[k]];
79 for (c=ncol-1; c>=0; --c) {
80 for (k=colind[c+1]-1; k>=colind[c]; --k) {
81 x[row[k]] -= nz_r[k]*x[c];
90 void casadi_ldl_solve(T1* x, casadi_int nrhs,
const casadi_int* sp_lt,
const T1* lt,
91 const T1* d,
const casadi_int* p, T1* w) {
93 casadi_int n = sp_lt[1];
94 for (k=0; k<nrhs; ++k) {
97 for (i=0; i<n; ++i) w[i] = x[p[i]];
99 casadi_ldl_trs(sp_lt, lt, w, 1);
101 for (i=0; i<n; ++i) w[i] /= d[i];
103 casadi_ldl_trs(sp_lt, lt, w, 0);
105 for (i=0; i<n; ++i) x[p[i]] = w[i];