dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #18394
Re: [Question #112556]: Linear solver in C++
Question #112556 on DOLFIN changed:
https://answers.launchpad.net/dolfin/+question/112556
Status: Open => Answered
Garth Wells proposed the following answer:
On May 28 2010, Phil Marinier wrote:
>New question #112556 on DOLFIN:
>https://answers.launchpad.net/dolfin/+question/112556
>
> I am attempting to use LinearSolver in C++ to do some simple matrix and
> vector solution, as in 3x3 or 5x5. I get this error.
>
>
> [0]PETSC ERROR: --------------------- Error Message
> ------------------------------------ [0]PETSC ERROR: Object is in wrong
> state! [0]PETSC ERROR: Not for unassembled matrix! [0]PETSC ERROR:
> ------------------------------------------------------------------------
> [0]PETSC ERROR: Petsc Release Version 3.0.0, Patch 8, Fri Aug 21 14:02:12
> CDT 2009
>
>
> This seems to suggest that I cannot use LinearSolver in the code
> directly, that instead I have to make a form file. Is this in fact the
> case? and if so how would I make that form file?
>
You need to call A.apply(), X.apply(), etc before using the matrix and
vectors.
Manipulating small matrices using sparse linear algebra objects will be
dead slow. I would recommend using Armadillo (take a look in
dolfin/adaptivity for an example).
Garth
>
> This is my code in case it is relevant. I am doing some simple
> interpolation to calculate a step size for an iterative non-linear
> problem. This is the test program I wrote.
>
>
>int main()
>{
> //declare and initialise
> int degree = 4;
> double *x = new double[degree + 1];
> double *y = new double[degree + 1];
>
> std::vector<dolfin::uint> columns;
> std::vector<double> values;
>
> dolfin::LinearSolver linSolver;
> dolfin::Matrix X(degree + 1, degree + 1);
> dolfin::Vector Y(degree + 1);
> dolfin::Vector A(degree + 1);
>
> //generate test points
> x[0] = 0;
> y[0] = 0;
>
> x[1] = 1;
> y[1] = -2;
>
> x[2] = 2;
> y[2] = -1;
>
> x[3] = 3;
> y[3] = -2;
>
> x[4] = 4;
> y[4] = 0;
>
>
> //set vector
> Y.set_local(y);
>
> //set matrix
> for (int j = 0; j <= degree; j ++)
> columns.push_back(dolfin::uint(j));
>
> for (dolfin::uint row = 0; row < dolfin::uint(degree); row++){
>
> for (int j = 0; j <= degree; j++)
> values.push_back( power(x[row], (degree - j) ) );
>
> X.setrow(row, columns, values);
>
> values.clear();
> }
>
> //solve [X]{A} = {Y} where A is the coefficients of the polynomial
> linSolver.solve(X, A, Y);
>
> //output
> for (int j = 0; j <= degree; j++)
> std::cout << A[j] << std::endl;
>
> //clean up
> delete [] x;
> delete [] y;
>}
>
>
>Any help is appreciated. Thank you.
>
>You received this question notification because you are a member of
>DOLFIN Team, which is an answer contact for DOLFIN.
>
>_______________________________________________
>Mailing list: https://launchpad.net/~dolfin
>Post to : dolfin@xxxxxxxxxxxxxxxxxxx
>Unsubscribe : https://launchpad.net/~dolfin
>More help : https://help.launchpad.net/ListHelp
>
You received this question notification because you are a member of
DOLFIN Team, which is an answer contact for DOLFIN.