PGI compiler creates an error with a fortran type-bound procedures

Viewed 177

I am working on a Fortran code. And I have to deal with many different type of output file. So to manage all of them, I use type objects.

Until now, I have compiled my code with gfortran on linux and windows (and ifort on linux) ; and it works as expected.

Because, I want in a close future to integrate GPU parallel computing to my code with OpenACC, I have to be able to compile it with pgfortran (the PGI compiler for Fortran). Here arrives my problem, the compilation (with pgfortran 18-4-0 on windows) returns me no warning, but at the execute the code crashes with a strange error: [Exit 3221225477] test.exe.

Therefore, I tried to isolate the problem, in order to solve it. I finally get the following MWE:

MODULE VTK_IO
   implicit none

   type, abstract :: FormatVTK
   contains
      procedure(VTK_open_file),nopass, deferred :: open_file_VTK
      procedure(VTK_close_file),nopass, deferred :: close_file_VTK
   end type FormatVTK

   type, extends(FormatVTK) :: FormatAscii
   contains
      procedure, nopass :: open_file_VTK => open_file_ascii
      procedure, nopass :: close_file_VTK => close_file_ascii
   end type FormatAscii

   type,  public      :: VTKfileHandler
      integer                    :: unit
      class(FormatVTK), allocatable    :: type
   end type VTKfileHandler

   abstract interface
      subroutine VTK_open_file( fd )
         import VTKfileHandler
         class(VTKfileHandler), intent(inout) :: fd
      end subroutine
      subroutine VTK_close_file(fd)
         import VTKfileHandler
         class(VTKfileHandler), intent(in)    :: fd
      end subroutine
   end interface


contains
   subroutine open_file_ascii( fd )
      implicit none
      class(VTKfileHandler), intent(inout) :: fd
      character(len=80)                     :: f
      !-------------------------------------------------------------------------

      write(unit=*, fmt=*) 'open_file_ascii: start'
      ! stop 6969
      f='test_file.txt'

      open(newunit    = fd%unit,          &
         file       = trim(adjustl(f)), &
         form       = 'FORMATTED',      & ! FORMATTED
         access     = 'STREAM',         & ! SEQUENTIAL
         action     = 'WRITE',          &
         status     = 'REPLACE')

      write(unit=fd%unit,fmt='(100A)') "# vtk DataFile Version "
      write(unit=*, fmt=*) 'open_file_ascii: end'
   end subroutine open_file_ascii

   subroutine close_file_ascii(fd)
      implicit none
      class(VTKfileHandler), intent(in) :: fd
      !-------------------------------------------------------------------------

      close(unit=fd%unit)
      write(unit=*, fmt=*) 'close_file_ascii: done'
   end subroutine close_file_ascii
end module vtk_IO


PROGRAM Test_open
   USE VTK_IO
   IMPLICIT NONE

   type :: OutputFile
      class (VTKfileHandler), allocatable :: VTKfile
   end type OutputFile

   type (OutputFile) :: OutsFiles
   !----------------------------------------------------------------------------

   print*,  'START: Test_open'

   Print*,'initialise_outputs: start'
      allocate(VTKfileHandler :: OutsFiles%VTKfile )
      allocate(FormatAscii :: OutsFiles%VTKfile%type)
   Print*,'initialise_outputs: end'
     call OutsFiles%VTKfile%type%open_file_VTK(OutsFiles%VTKfile)
     call  OutsFiles%VTKfile%type%close_file_VTK(OutsFiles%VTKfile)
   print*,  'END: Test_open'
END PROGRAM Test_open

It seems like the type-bound procedure open_file_VTK is not targetting the procedure open_file_ascii. I think that the compiler get lost with the type-bounded procedure. For example, if I remove the OutsFiles and use directly a VTKfile in the main, it works. But, of course, I need this embedding type OutputFile, in my big code ; otherwise it would be too easy.

So is it a bug from the compiler ? Or can I do something to solve this problem ?

0 Answers
Related