Sam, you can solve a complex matrix using a real version of PETSc by doubling the size of your matrix and spitting out real/imaginary parts.
See this paper: https://epubs.siam.org/doi/abs/10.1137/S1064827500372262?mobileUi=0 <https://epubs.siam.org/doi/abs/10.1137/S1064827500372262?mobileUi=0> Randy M. > On Sep 28, 2020, at 5:12 PM, Sam Guo <sam....@cd-adapco.com> wrote: > > All I want is to solve both real and complex matrix using either real or > complex version of PETSc. If I load complex version of PETSc, I waste memory > solving real matrix. If I can solve complex matrix using real version of > PETSc, I will accept it. > > On Monday, September 28, 2020, Sam Guo <sam....@cd-adapco.com > <mailto:sam....@cd-adapco.com>> wrote: > If I load complex version of PETSc, how can Vec be real? > > On Monday, September 28, 2020, Matthew Knepley <knep...@gmail.com > <mailto:knep...@gmail.com>> wrote: > On Mon, Sep 28, 2020 at 7:44 PM Sam Guo <sam....@cd-adapco.com > <mailto:sam....@cd-adapco.com>> wrote: > I want to make sure I understand you. I load real version of PETSc. If my > input matrix is complex, > > You said that your matrix was real. > > just get real and imagine parts of PETSc Vec > > No, the PETSc Vec would be real. You would have two vectors. > > Thanks, > > Matt > > and do the matrix vector multiplication. Right? > > On Monday, September 28, 2020, Matthew Knepley <knep...@gmail.com > <mailto:knep...@gmail.com>> wrote: > On Mon, Sep 28, 2020 at 6:29 PM Sam Guo <sam....@cd-adapco.com > <mailto:sam....@cd-adapco.com>> wrote: > “ I think it would be much easier to just decompose your complex work into > real and imaginary parts and use PETSc with real scalars to compute them > separately. > Since you know your matrices have 0 imaginary part, this becomes very > straightforward.” > > I think this is what I am trying to do. But since I have to provide > matrix-vector operator(since I am using shell matrix), the Vec I receive is > complex. I need to convert complex vec to real one and then convert it > back(that’s the code I shown before). > > No, this is not what I am advocating. Keep your vectors real, just keep one > for the real part and one for the imaginary part. Then you can just call > MatMult() twice with your matrix. > > Thanks, > > Matt > > On Monday, September 28, 2020, Matthew Knepley <knep...@gmail.com > <mailto:knep...@gmail.com>> wrote: > On Mon, Sep 28, 2020 at 5:01 PM Sam Guo <sam....@cd-adapco.com > <mailto:sam....@cd-adapco.com>> wrote: > Hi Matt, > Since I use MUMPS as preconditioner, complex uses too much memory if my > input matrix is real. Ideally if I can compile real and complex into > different symbols (like MUMPS) , I can load both version without conflict. > > What I mean to say is that it would be great if it were as simple as using > two different symbols, but unfortunately the problem is more difficult. I was > trying to use > the example of templates. This would be a very intrusive change no matter > what technology you are using. > > So your main memory usage is from the MUMPS factorization, and you cannot > afford to double that usage? > > You could consider writing a version of AIJ that stores real entries, but > allows complex vector values. It would promote to complex for the row dot > product. > However, you would also have to do the same work for all the solves you do > with MUMPS. > > I think it would be much easier to just decompose your complex work into real > and imaginary parts and use PETSc with real scalars to compute them > separately. > Since you know your matrices have 0 imaginary part, this becomes very > straightforward. > > Thanks, > > Matt > > Thanks, > Sam > > On Mon, Sep 28, 2020 at 12:52 PM Matthew Knepley <knep...@gmail.com > <mailto:knep...@gmail.com>> wrote: > On Mon, Sep 28, 2020 at 3:43 PM Sam Guo <sam....@cd-adapco.com > <mailto:sam....@cd-adapco.com>> wrote: > Hi Stefano and PETSc dev team, > I want to try your suggestion to always load complex version of PETSc but > if my input matrix A is real, I want to create shell matrix to matrix-vector > and factorization using real only. > > I do not think that will work as you expect. I will try to explain below. > > I still need to understand how MatRealPart works. Does it just zero out > the image numerical values or does it delete the image memory? > > When we have complex values, we use the "complex" type to allocate and store > them. Thus you cannot talk about just the memory to store imaginary parts. > MatRealPart sets the imaginary parts of all the matrix elements to zero. > > If my input matrix A is real, how do I create a shell matrix to matrix > -vector multiplication y=A*x where A is real, PestcScalar = complex, x and y > are Vec? I notice there is a VecRealPart but it seems it just zeros the image > numerical values. It seems I still have to create a PetscReal pointer to > copy the real part of PetacScalar pointers like following. Can you comment on > it? > > What you suggest would mean rewriting the matrix multiplication algorithm by > hand after extracting the values. I am not sure if this > is really what you want to do. Is the matrix memory really your limiting > factor? Even if you tried to do this with templates, the memory > from temporaries would be very hard to control. > > Thanks, > > Matt > > Thanks, > Sam > > PetscScalar *px = nullptr; > VecGetArrayRead(x, &px); > PetscScalar *py = nullptr; > VecGetArray(y, &py); > int localSize = 0; > VecGetLocalSize(x, &localSize); > std::vector<PetasReal> realX(localSize); // I am using c++ to call PETSc > > //retrieve real part > for(int i = 0; i < localSize; i++) realX[i] = PetscRealPart(px[i]); > > // do real matrix-vector multiplication > // realY=A*realX > // here where realY is std::vector<PetscReal> > > //put real part back to py > for(int i = 0; i < localSize; i++) pv[i] = realY[i]; > VecRestoreArray(y,&py); > > On Tue, May 26, 2020 at 1:49 PM Sam Guo <sam....@cd-adapco.com > <mailto:sam....@cd-adapco.com>> wrote: > Thanks > > On Tuesday, May 26, 2020, Stefano Zampini <stefano.zamp...@gmail.com > <mailto:stefano.zamp...@gmail.com>> wrote: > All the solvers/matrices/vectors works for PetscScalar types (i.e. in your > case complex) > If you need to solve for the real part only, you can duplicate the matrix and > call MatRealPart to zero out the imaginary part. But the solve will always > run in the complex space > You should not be worried about doubling the memory for a matrix (i.e. real > and imaginary part) > > >> On May 26, 2020, at 11:28 PM, Sam Guo <sam....@cd-adapco.com >> <mailto:sam....@cd-adapco.com>> wrote: >> >> complex version is needed since matrix sometimes is real and sometimes is >> complex. I want to solve real matrix without allocating memory for imaginary >> part((except eigen pairs). >> >> On Tuesday, May 26, 2020, Zhang, Hong <hzh...@mcs.anl.gov >> <mailto:hzh...@mcs.anl.gov>> wrote: >> You can build PETSc with complex version, and declare some variables as >> 'PETSC_REAL'. >> Hong >> >> From: petsc-users <petsc-users-boun...@mcs.anl.gov >> <mailto:petsc-users-boun...@mcs.anl.gov>> on behalf of Sam Guo >> <sam....@cd-adapco.com <mailto:sam....@cd-adapco.com>> >> Sent: Tuesday, May 26, 2020 1:00 PM >> To: PETSc <petsc-users@mcs.anl.gov <mailto:petsc-users@mcs.anl.gov>> >> Subject: [petsc-users] using real and complex together >> >> Dear PETSc dev team, >> Can I use both real and complex versions together? >> >> Thanks, >> Sam > > > > -- > 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/> > > > -- > 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/> > > > -- > 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/> > > > -- > 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/>