[petsc-users] from standard fortran program to PETSc
Satish Balay
balay at mcs.anl.gov
Fri Jun 19 14:23:48 CDT 2015
Sorry - I should have checked the code closer. [real(dp) vs
PetscScalar]
MatSetValues() expects PetscScalar.
You cannot pass in 'real*8' in place of 'complex*16' [i.e PetscScalar]
- and expect it to work. This is what I meat by 'make sure the types
match manually'
You'll have to convert real*8 to complex*16 yourself before calling
MatSetValues().
Satish
On Fri, 19 Jun 2015, Anthony Paul Haas wrote:
> Hi Satish,
>
> Thanks for your answer. In the attached program, I have declared the
> following standard fortran arrays: real(dp),dimension(:,:),allocatable ::
> D1X,D2X,D1Y,D2Y
> Let's say these are real matrix derivatives that I need to insert in my
> complex A matrix (it could also be some real baseflow from a similarity
> solver). I have filled D1Y with 999.d0 just to test (see line 169). Then I
> insert D1Y in the global (complex) matrix with call
> MatSetValues(A,ny,idxm2,ny,idxn2,D1Y,INSERT_VALUES,ierr). I expected that
> in the Matrix A, this would be automatically converted to 999.0 + 0.0i but
> when I view A, I see 999 + 999 i or even 999 + 1.0326e-321 i. Is there a
> way to insert D1Y as is and obtain the proper behavior? How would you do it?
>
> Thanks
>
> Anthony
>
> On Fri, Jun 19, 2015 at 11:08 AM, Satish Balay <balay at mcs.anl.gov> wrote:
>
> > On Fri, 19 Jun 2015, Anthony Haas wrote:
> >
> > > Hi,
> > >
> > > I have a Fortran90 program that solves a complex linear generalized
> > eigenvalue
> > > problem (GEVP) using standard fortran 90 programming:
> > >
> > > Subroutines, modules, allocatable arrays, real(8), int,...
> > >
> > > This program uses Lapack to solve the GEVP. The program is mainly made
> > off:
> > >
> > > 1) set dimensions of problem and initialize arrays,...
> > > 2) compute the baseflow (for instance boundary layer flow)
> > > 3) build the (stability) complex generalized eigenvalue problem ==> build
> > > (dense) matrices A and B
> > > 4) solve the GEVP with Lapack
> > >
> > > Now I want to use PETSc + SLEPc to use sparse matrices. Do I need to
> > > rewrite/modify everything in terms of PETSc variables as follows:
> > >
> > > - int -> PetscInt
> > > - real(8) -> PetscScalar
> > perhaps you mean: PetscReal
> >
> > > - complex*16 -> PetscScalar
> > >
> > > or is it possible to reuse all that F90 code? For instance I have a
> > similarity
> > > solver that computes Blasius solution. If that similarity solver
> > provides me
> > > with u and v velocities in terms of standard fortran90 real(8)
> > variables, how
> > > should I do to use these variables to build my complex matrix? Should I
> > > convert them to Petsc variables? How?
> > >
> >
> > You can use the current datatypes used in your code - And always make
> > sure the types match manually. [Fortran does not have typecheck anyway..]
> >
> > > what should I do with my Fortran90 allocatable arrays?
> > >
> > > real(dp),allocatable,dimension(:,:) :: u-->
> > > PetscScalar,allocatable,dimension(:,:) :: u ????
> >
> > Either should work.
> >
> > You can add the following to your code:
> >
> > #if !defined(PETSC_USE_COMPLEX)
> > #error "this code requires PETSc --with-scalar-type=complex build"
> > #endif
> > #if !defined(PETSC_USE_REAL_DOUBLE)
> > #error "this code requires PETSc --with-precision=real build"
> > #endif
> >
> > Satish
> >
>
More information about the petsc-users
mailing list