Matrix operation
Matthew Knepley
knepley at mcs.anl.gov
Wed Feb 22 15:19:31 CST 2006
billy at dem.uminho.pt writes:
> Thank you very much for your answers.
>
> I was thinking why doesn't PETSc allow functions inside functions (like LASPack)?
>
> h += (Diag(A) - A) * u <=> AddAsgn_VV (h, Mul_QV (Sub_QQ (Diag_Q (A), A), u));
Its an error reporting discipline since C does not allow exceptions.
Matt
> Billy
>
>
>
> Quoting Matthew Knepley <knepley at mcs.anl.gov>:
>
>> Hong Zhang <hzhang at mcs.anl.gov> writes:
>>
>> I would recommend the later
>>
>> MatGetDiagonal(A, diag);
>> VecPointwiseMult(w, diag, u);
>> MatMult(A, u, v);
>> VecAXPY(w, -1.0, v);
>>
>> Matt
>>
>> > Billy,
>> >
>> > You can do
>> > MatGetDiagonal(A,diag);
>> > MatMult(A,u,&vtmp);
>> > VecGetArray(diag,diag_array);
>> > VecGetArray(vtmp,vtmp_array);
>> > VecGetArray(u,u_arrar);
>> > VecGetArray(h,h_array);
>> > VecGetLocalSize(h,&n);
>> > for (i=0; i<n; i++){
>> > h_array[i] += diag_array[i]*u_array[i] - vtmp_array[i];
>> > }
>> > VecRestoreArray(h,h_array);
>> > VecRestoreArray()
>> > ...
>> >
>> > or you can use VecPointwiseMult() got get
>> > Diag(A)*u.
>> >
>> > Hong
>> >
>> > On Mon, 20 Feb 2006 billy at dem.uminho.pt wrote:
>> >
>> >>
>> >> Hello,
>> >>
>> >> I would like to do the following matrix-vector operation in PETSc:
>> >>
>> >> h += (Diag(A) - A) * u
>> >>
>> >> where A is a matrix, Diag(A) is a matrix and h, u are vectors. It is the
>> >> multiplication of a matrix with diagonals set to zero with a vector.
>> >>
>> >>
>> >> How can I do this in PETSc? because MatGetDiagonal gives a vector not a
>> matrix.
>> >>
>> >>
>> >> Billy.
>> >>
>> >>
>> >>
>> >
>> >
>> >
>>
>> --
>> "Failure has a thousand explanations. Success doesn't need one" -- Sir Alec
>> Guiness
>>
>>
>
>
>
>
--
"Failure has a thousand explanations. Success doesn't need one" -- Sir Alec Guiness
More information about the petsc-users
mailing list