      Interface
       Subroutine PetscPrintf(m,c,ierr)
          MPI_Comm :: m
          character(len=*) :: c
          PetscErrorCode :: ierr
       End Subroutine
        Subroutine PetscOptionsGetInt(o,p,n,v,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscInt v
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetReal(o,p,n,v,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscReal v
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetScalar(o,p,n,v,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscScalar v
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetBool(o,p,n,v,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscBool v
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetString(o,p,n,v,s,ierr)
          import tPetscOptions
          PetscOptions o
          character(*) v
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetIntArray(o,p,n,v,c,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscInt v(*),c
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetScalarArray(o,p,n,v,c,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscScalar v(*)
          PetscInt c
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine
        Subroutine PetscOptionsGetRealArray(o,p,n,v,c,s,ierr)
          import tPetscOptions
          PetscOptions o
          PetscReal v(*)
          PetscInt c
          character(*) p,n
          PetscBool s
          PetscErrorCode ierr
        End Subroutine

#if defined(PETSC_HAVE_FORTRAN_FREE_LINE_LENGTH_NONE)
      subroutine PetscErrorf(ierr,line,file)
       PetscErrorCode, intent(in) :: ierr
       integer, intent(in) ::  line
       character(*) file
      end Subroutine PetscErrorf

      subroutine PetscErrorMPI(ierr,line,file)
       PetscErrorCode, intent(inout) :: ierr
       integer, intent(in) ::  line
       character(*) file
      end Subroutine PetscErrorMPI
#else
      subroutine PetscErrorf(ierr)
       PetscErrorCode, intent(in) :: ierr
      end Subroutine PetscErrorf

      subroutine PetscErrorMPI(ierr)
       PetscErrorCode, intent(inout) :: ierr
      end Subroutine PetscErrorMPI
#endif

      subroutine PetscSubcommGetParent(a,b,z)
       import tPetscSubcomm
       PetscSubcomm a ! PetscSubcomm
       MPI_Comm b ! MPI_Comm
       PetscErrorCode z
       end subroutine
      subroutine PetscSubcommGetContiguousParent(a,b,z)
       import tPetscSubcomm
       PetscSubcomm a ! PetscSubcomm
       MPI_Comm b ! MPI_Comm
       PetscErrorCode z
       end subroutine
      subroutine PetscSubcommGetChild(a,b,z)
       import tPetscSubcomm
       PetscSubcomm a ! PetscSubcomm
       MPI_Comm b ! MPI_Comm
       PetscErrorCode z
       end subroutine

      subroutine MPIU_abort(comm,ierr)
      MPI_Comm,intent(in) ::  comm
      PetscErrorCode,intent(in) ::  ierr
      end subroutine

      subroutine PetscViewerASCIIStdoutSetFileUnit(unit,z)
        integer4 unit
        PetscErrorCode,intent(out) :: z
      end subroutine

      subroutine PetscLogEventBegin(event,ierr)
        PetscLogEvent, intent(in) :: event
        PetscErrorCode, intent(out) :: ierr
      end subroutine PetscLogEventBegin

      subroutine PetscLogEventEnd(event,ierr)
        PetscLogEvent, intent(in) :: event
        PetscErrorCode, intent(out) :: ierr
      end subroutine PetscLogEventEnd
      end Interface

      Interface
      function PetscASend(c, d) bind(c,name='PetscASend') result(i)
          use,intrinsic :: iso_c_binding
          implicit none
          integer(c_int), value :: c
          integer(c_int), value :: d
          integer(c_int)        :: i
      end function PetscASend

      function PetscARecv(c, d) bind(c,name='PetscARecv') result(i)
          use,intrinsic :: iso_c_binding
          implicit none
          integer(c_int), value :: c
          integer(c_int), value :: d
          integer(c_int)        :: i
      end function PetscARecv

      function PetscAReduce() bind(c,name='PetscAReduce') result(i)
          use,intrinsic :: iso_c_binding
          implicit none
          integer(c_int) :: i
      end function PetscAReduce
      end Interface

      Interface
        Subroutine PetscIntArray1dDestroyF90(a,ierr)
          PetscInt, Pointer :: a(:)
          PetscErrorCode    :: ierr
        End Subroutine
      End Interface

      Interface PetscShmgetAllocateArrayScalar
        Subroutine PetscShmgetAllocateArrayScalar(start, len, d1, ierr)
          PetscInt :: start, len
          PetscScalar, pointer :: d1(:)
          PetscErrorCode ierr
        End Subroutine
      End Interface

      Interface PetscShmgetDeallocateArrayScalar
        Subroutine PetscShmgetDeallocateArrayScalar(d1, ierr)
          PetscScalar, pointer :: d1(:)
          PetscErrorCode ierr
        End Subroutine
      End Interface

      Interface PetscShmgetAllocateArrayInt
        Subroutine PetscShmgetAllocateArrayInt(start, len, d1, ierr)
          PetscInt :: start, len
          PetscInt, pointer :: d1(:)
          PetscErrorCode ierr
        End Subroutine
      End Interface

      Interface PetscShmgetDeallocateArrayInt
        Subroutine PetscShmgetDeallocateArrayInt(d1, ierr)
          PetscInt, pointer :: d1(:)
          PetscErrorCode ierr
        End Subroutine
      End Interface