[petsc-dev] MatCreateVecs from Fortran problem

Satish Balay balay at mcs.anl.gov
Tue Mar 17 14:19:08 CDT 2020


The issue is:

C has:

Vec v=NULL;
Vec *v=NULL;

However its not clear how to implement this with current f90 interface.

I think we currently have:

Vec v = PETSC_NULL_VEC = 0 => the second one.

What you are looking for is the first one. I see this is automatically
set.  I don't see this initialization in petsc - so perhaps the
compiler is doing this automatically? [atleast by gfortran]

Satish

-------------

Breakpoint 2, MAIN__ () at ex1f.F90:51
51            x = PETSC_NULL_VEC
(gdb) list 33
28      !
29            Vec              x,b,u
30            Mat              A
31            KSP              ksp
32            PC               pc
33            PetscReal        norm,tol
34            PetscErrorCode   ierr
35            PetscInt i,n,col(3),its,i1,i2,i3
36            PetscBool  flg
37            PetscMPIInt size
(gdb) p x
$2 = ( v = -2 )
(gdb) p b
$3 = ( v = -2 )
(gdb) p u
$4 = ( v = -2 )
(gdb) p A
$5 = ( v = -2 )
(gdb) p ksp
$6 = ( v = -2 )
(gdb) p pc
$7 = ( v = -2 )
(gdb) c
Continuing.

Breakpoint 3, MAIN__ () at ex1f.F90:52
52            call MPI_Comm_size(PETSC_COMM_WORLD,size,ierr)
(gdb) p x
$8 = ( v = 0 )
(gdb) 



On Tue, 17 Mar 2020, Mark Adams wrote:

> >
> > Passing NULL to MatCreateVecs() means that you do not want a vector out:
> >
> >
> Yes, I want both vectors out and we pass it Vec that have been initialized
> with PETSC_NULL_VEC
> 
> 
> >
> > https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatCreateVecs.html
> >
> > I am guessing that this was broken in 3.7 so that it ignored NULL input,
> > but we fixed that.
> >
> >
> v3.7 has these CHKFORTRANNULLOBJECT. Well the "fix" broke working code
> 
> ex73f90t does not initialize the "x" vector that it gives
> to matcreatevecs_. Should we just remove initialization of our vectors to
> PETSC_NUILL_VEC?
> 
> Is the PETSc model that you don't inialized PETSc object to NULL because
> you check that pointers are valid PETSc pointers instead of testing on
> NULL? So maybe we should remove all these initializations.
> 
> Thanks,
> Mark
> 
> 
> >   Thanks,
> >
> >     Matt
> >
> >
> >> call MatCreateVecs(solver%KKTmat,solver%xVec2,solver%bVec2,ierr)
> >>
> >> Petsc code:
> >> PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec
> >> *left, int *ierr)
> >> {
> >> PetscPrintf(PETSC_COMM_SELF,"ZZZ 1) matcreatevecs_ start right=%p
> >> left=%p\n",right,left);
> >>   CHKFORTRANNULLOBJECT(right);
> >>   CHKFORTRANNULLOBJECT(left);
> >> PetscPrintf(PETSC_COMM_SELF,"ZZZ 2) matcreatevecs_ start right=%p
> >> left=%p\n",right,left);
> >>   *ierr = MatCreateVecs(*mat,right,left);
> >> }
> >>
> >> produces this:
> >>
> >> ZZZ 1) matcreatevecs_ start right=0x7fffffff3758 left=0x7fffffff3760
> >> ZZZ 2) matcreatevecs_ start right=(nil) left=(nil)
> >>
> >> Shouldn't  this be?
> >>
> >> PETSC_EXTERN void PETSC_STDCALL matcreatevecs_(Mat *mat,Vec *right,Vec
> >> *left, int *ierr)
> >> {
> >>   *ierr = MatCreateVecs(*mat,right,left);
> >> }
> >>
> >>
> >
> > --
> > 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/>
> >
> 



More information about the petsc-dev mailing list