interface
  subroutine PetscFortranPrintToFileUnit(unit, str, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    integer unit
    character(len=*), intent(in) :: str
    PetscErrorCode, intent(out):: ierr
  end subroutine

  subroutine PetscViewerASCIIOpenWithFileUnit(comm, unit, lab, ierr)
    use, intrinsic :: ISO_C_binding
    use petscmpi
    import tPetscViewer
    MPIU_Comm, intent(in) :: comm
    integer, intent(in) :: unit
    PetscViewer, intent(out) :: lab
    PetscErrorCode, intent(out):: ierr
  end subroutine

  subroutine PetscViewerASCIISetFileUnit(lab, unit, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer, intent(in) :: lab
    integer, intent(in) :: unit
    PetscErrorCode, intent(out):: ierr
  end subroutine
end interface

#if defined(_WIN32) && defined(PETSC_USE_SHARED_LIBRARIES)
!DEC$ ATTRIBUTES DLLEXPORT::PetscFortranPrintToFileUnit
!DEC$ ATTRIBUTES DLLEXPORT::PetscViewerASCIIOpenWithFileUnit
!DEC$ ATTRIBUTES DLLEXPORT::PetscViewerASCIISetFileUnit
#endif

interface PetscViewerBinaryWrite
  subroutine PetscViewerBinaryWriteInt(v, a, cnt, tmp, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer v
    PetscInt a(*)
    PetscInt cnt
    PetscBool tmp
    PetscErrorCode, intent(out):: ierr
  end subroutine
  subroutine PetscViewerBinaryWriteScalar(v, a, cnt, tmp, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer v
    PetscScalar a(*)
    PetscInt cnt
    PetscBool tmp
    PetscErrorCode, intent(out):: ierr
  end subroutine
#if defined(PETSC_USE_COMPLEX)
  subroutine PetscViewerBinaryWriteReal(v, a, cnt, tmp, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer v
    PetscReal a(*)
    PetscInt cnt
    PetscBool tmp
    PetscErrorCode, intent(out):: ierr
  end subroutine
#endif
end interface PetscViewerBinaryWrite

interface PetscViewerBinaryRead
  subroutine PetscViewerBinaryReadInt(v, a, cnt, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer v
    PetscInt a(*)
    PetscInt cnt
    PetscErrorCode, intent(out):: ierr
  end subroutine
  subroutine PetscViewerBinaryReadScalar(v, a, cnt, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer v
    PetscScalar a(*)
    PetscInt cnt
    PetscErrorCode, intent(out):: ierr
  end subroutine
#if defined(PETSC_USE_COMPLEX)
  subroutine PetscViewerBinaryReadReal(v, a, cnt, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer v
    PetscReal a(*)
    PetscInt cnt
    PetscErrorCode, intent(out):: ierr
  end subroutine
#endif
end interface PetscViewerBinaryRead

interface PetscViewerHDF5WriteAttribute
  subroutine PetscViewerHDF5WriteAttributeInt(viewer, parent, name, value, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer :: viewer
    character(len=*), intent(in) :: parent, name
    PetscInt, intent(in) :: value
    PetscErrorCode, intent(out):: ierr
  end subroutine PetscViewerHDF5WriteAttributeInt
  subroutine PetscViewerHDF5WriteAttributeScalar(viewer, parent, name, value, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer :: viewer
    character(len=*), intent(in) :: parent, name
    PetscScalar, intent(in) :: value
    PetscErrorCode, intent(out):: ierr
  end subroutine PetscViewerHDF5WriteAttributeScalar
#if defined(PETSC_USE_COMPLEX)
  subroutine PetscViewerHDF5WriteAttributeReal(viewer, parent, name, value, ierr)
    use, intrinsic :: ISO_C_binding
    import tPetscViewer
    PetscViewer :: viewer
    character(len=*), intent(in) :: parent, name
    PetscReal, intent(in) :: value
    PetscErrorCode, intent(out):: ierr
  end subroutine PetscViewerHDF5WriteAttributeReal
#endif
end interface PetscViewerHDF5WriteAttribute
