[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