[petsc-users] Reading Vectors from a PETSc Vec
Mohammad Ali Yaqteen
mhyaqteen at sju.ac.kr
Mon Nov 14 18:50:32 CST 2022
I am using Eigen library to which I have to write these vector values from PETSc Vec. tdof is the length of the vector that I need and ei is the number of value in as an index:
PetscInt ei[tdof];
PetscScalar eveci[tdof];
for (int i = 0; i < tdof; i++)
ei[i] = i;
if (nconv>0)
{
eval.setZero(nconv);
evec.setZero(KS.rows(),nconv);
PetscCall(PetscPrintf(PETSC_COMM_WORLD,
" k ||Ax-kx||/||kx||\n"
" ----------------- ------------------\n"));
for (int i = 0; i < nconv; i++)
{
PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,xr,xi));
PetscCall(EPSComputeError(eps,i,EPS_ERROR_RELATIVE,&error1));
#if defined(PETSC_USE_COMPLEX)
re = PetscRealPart(kr);
im = PetscImaginaryPart(kr);
#else
re = kr;
im = ki;
#endif
if (im!=0.0) PetscCall(PetscPrintf(PETSC_COMM_WORLD," %9f%+9fi %12g\n",(double)re,(double)im,(double)error1));
else PetscCall(PetscPrintf(PETSC_COMM_WORLD," %12f %12g\n",(double)re,(double)error1));
eval(i) = re;
VecGetValues(xr, tdof, ei, eveci);
for (int j = 0; j < tdof; j++)
{
evec(j, i) = eveci[j];
}
}
PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n"));
}
Thank you
Ali
________________________________
From: Matthew Knepley <knepley at gmail.com>
Sent: Tuesday, November 15, 2022 9:43 AM
To: Mohammad Ali Yaqteen <mhyaqteen at sju.ac.kr>
Cc: petsc-users at mcs.anl.gov <petsc-users at mcs.anl.gov>
Subject: Re: [petsc-users] Reading Vectors from a PETSc Vec
On Mon, Nov 14, 2022 at 7:39 PM Mohammad Ali Yaqteen <mhyaqteen at sju.ac.kr<mailto:mhyaqteen at sju.ac.kr>> wrote:
I am using the following procedure to read from Vec, but it keeps giving me the same values! I was told that using VecGetValues gives wrog output.
By who? It does not give the wrong output.
You do not show where in the code you define tdof and ei[].
If not this, then what function should be used to read the contents of a vector?
I think it would be simpler for you to use VecGetArrayRead(), unless you want values from other processes.
Thanks,
Matt
for (int i = 0; i < nconv; i++)
{
PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,xr,xi));
PetscCall(EPSComputeError(eps,i,EPS_ERROR_RELATIVE,&error1));
#if defined(PETSC_USE_COMPLEX)
re = PetscRealPart(kr);
im = PetscImaginaryPart(kr);
#else
re = kr;
im = ki;
#endif
if (im!=0.0) PetscCall(PetscPrintf(PETSC_COMM_WORLD," %9f%+9fi %12g\n",(double)re,(double)im,(double)error1));
else PetscCall(PetscPrintf(PETSC_COMM_WORLD," %12f %12g\n",(double)re,(double)error1));
eval(i) = re;
VecGetValues(xr, tdof, ei, eveci);
for (int j = 0; j < tdof; j++)
{
evec(j, i) = eveci[j];
}
}
PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n"));
Thank you
Ali
--
What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
-- Norbert Wiener
https://www.cse.buffalo.edu/~knepley/<http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20221115/aebfb1d7/attachment.html>
More information about the petsc-users
mailing list