No, that won't work. What the set() function does is
for i < num_rows:
for j < num_cols:
A[rows[i], cols[j]] = vals[i*num_rows + j]
So, the length for vals needs to be num_rows*num_cols.
To create an identity matrix, it should be enough to do
Matrix A(N, N);
unsigned int rows[N];
for (unsigned int i = 0; i < N; i++)
rows[i] = i;
A.ident(rows, N);
A.apply();
By the way, it looks like we need to change the order of arguments in
the ident function. The size argument should come before the array
argument (same as in PETSc and many other libraries). We have changed
this for add(), set(), get() but forgot to fix it for ident(). So watch
out for the change of order in parameters...
/Anders
Mads Hoel wrote:
> I think so, but maybe the experts should answer. :P
>
> Regards,
> Mads Hoel
>
> ------- Forwarded message -------
> From: jesperc <[EMAIL PROTECTED]>
> To: "Mads Hoel" <[EMAIL PROTECTED]>
> Cc:
> Subject: Re: [DOLFIN-dev] Identity matrix
> Date: Wed, 18 Jul 2007 16:29:43 +0200
>
> Hi,
>
> Yes, I see that this has changed in the new version but I still use the
> old one.
> However, I see now that the number of columns and rows can be different
> which indicates that set() may work in another way than I thought.
> Doesn't val={1,2}, col={3,4}, row={5,6} mean that element (5,3) is 1 and
> element (6,4) is 2?
>
> Regards, Jesper
>
> Mads Hoel skrev:
>> On Wed, 18 Jul 2007 15:56:48 +0200, jesperc <[EMAIL PROTECTED]> wrote:
>>
>>> A->set(vals, cols, n, rows, n);
>> void set (const real *block, uint m, const uint *rows, uint n, const
>> uint *cols)
>> Set block of values.
>>
>> I think you need to rearrange the parameters
>>
>> A->set(vals, cols, n, rows, n); to A->set(vals, n, rows, n, cols);
>>
>> Regards,
>> Mads Hoel
> _______________________________________________
> DOLFIN-dev mailing list
> [email protected]
> http://www.fenics.org/mailman/listinfo/dolfin-dev
>
_______________________________________________
DOLFIN-dev mailing list
[email protected]
http://www.fenics.org/mailman/listinfo/dolfin-dev