27 #include "linsol_tridiag.hpp"
28 #include "casadi/core/global_options.hpp"
33 int CASADI_LINSOL_TRIDIAG_EXPORT
36 plugin->name =
"tridiag";
38 plugin->version = CASADI_VERSION;
67 m->ctr.resize(
nrow());
86 const casadi_int *a_colind;
93 m->ctr[0] = A[a_colind[0] + 1] / A[a_colind[0] + 0];
94 for (i = 1; i <
nrow(); i++) {
96 double denom = A[a_colind[i] + 1] - A[a_colind[i] + 0] * m->ctr[i - 1];
97 m->ctr[i] = A[a_colind[i] + 2] / denom;
104 m->c[0] = A[a_colind[1] + 0] / A[a_colind[0] + 0];
105 double denom = A[a_colind[1] + 1] - A[a_colind[1 - 1] + 1] * m->c[1 - 1];
106 m->c[1] = A[a_colind[1 + 1] + 0] / denom;
107 for (i = 2; i <
nrow(); i++) {
109 double denom = A[a_colind[i] + 1] - A[a_colind[i - 1] + 2] * m->c[i - 1];
110 m->c[i] = A[a_colind[i + 1] + 0] / denom;
116 for (k = 0; k < nrhs; k++) {
119 m->d[0] = x[0] / A[a_colind[0] + 0];
120 for (i = 1; i <
nrow(); i++) {
122 double denom = A[a_colind[i] + 1] - A[a_colind[i] + 0] * m->ctr[i - 1];
123 m->d[i] = (x[i] - A[a_colind[i] + 0] * m->d[i - 1]) / denom;
127 for (i =
nrow() - 2; i >= 0; i--) {
128 x[i] = m->d[i] - m->ctr[i] * x[i + 1];
132 m->d[0] = x[0] / A[a_colind[0] + 0];
133 double denom = A[a_colind[1] + 1] - A[a_colind[1 - 1] + 1] * m->c[1 - 1];
134 m->d[1] = (x[1] - A[a_colind[1 - 1] + 1] * m->d[1 - 1]) / denom;
135 for (i = 2; i <
nrow(); i++) {
137 double denom = A[a_colind[i] + 1] - A[a_colind[i - 1] + 2] * m->c[i - 1];
138 m->d[i] = (x[i] - A[a_colind[i - 1] + 2] * m->d[i - 1]) / denom;
142 for (i =
nrow() - 2; i >= 0; i--) {
143 x[i] = m->d[i] - m->c[i] * x[i + 1];
152 casadi_int nrhs,
bool tr)
const {
153 casadi_error(
"Not implemented");
Helper class for C code generation.
void init(const Dict &opts) override
Initialize.
casadi_int nrow() const
Get sparsity pattern.
int init_mem(void *mem) const override
Initalize memory block.
int nfact(void *mem, const double *A) const override
Numeric factorization.
static const std::string meta_doc
A documentation string.
int init_mem(void *mem) const override
Initalize memory block.
int solve(void *mem, const double *A, double *x, casadi_int nrhs, bool tr) const override
int sfact(void *mem, const double *A) const override
static LinsolInternal * creator(const std::string &name, const Sparsity &sp)
Create a new LinsolInternal.
void init(const Dict &opts) override
Initialize.
void generate(CodeGenerator &g, const std::string &A, const std::string &x, casadi_int nrhs, bool tr) const override
Generate C code.
~LinsolTridiag() override
LinsolTridiag(const std::string &name, const Sparsity &sp)
static void registerPlugin(const Plugin &plugin, bool needs_lock=true)
Register an integrator in the factory.
static const Options options_
Options.
void clear_mem()
Clear all memory (called from destructor)
int CASADI_LINSOL_TRIDIAG_EXPORT casadi_register_linsol_tridiag(LinsolInternal::Plugin *plugin)
GenericType::Dict Dict
C++ equivalent of Python's dict or MATLAB's struct.
void CASADI_LINSOL_TRIDIAG_EXPORT casadi_load_linsol_tridiag()