PGI编译器使用fortran类型绑定过程创建错误

时间:2018-11-02 15:34:57

标签: fortran pgi

我正在研究Fortran代码。而且我必须处理许多不同类型的输出文件。因此,要管理所有这些对象,我使用类型对象。

直到现在,我已经在Linux和Windows上使用gfortran编译了代码(在Linux上使用ifort编译了代码);并按预期工作。

因为我希望在不久的将来通过OpenACC将GPU并行计算集成到我的代码中,所以我必须能够使用pgfortran(用于Fortran的PGI编译器)进行编译。 我的问题到了,编译(在Windows上使用pgfortran 18-4-0)没有返回警告,但是在执行时,代码崩溃并出现一个奇怪的错误:[Exit 3221225477] test.exe

因此,我试图找出问题以解决。我终于得到了以下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

似乎类型绑定过程open_file_VTK的目标不是过程open_file_ascii。我认为编译器会因类型绑定过程而迷失方向。例如,如果我删除了OutsFiles并直接在主目录中使用了VTK文件,那么它将起作用。但是,当然,在我的大代码中,我需要这种嵌入类型OutputFile;否则太容易了。

那么这是编译器的错误吗?或者我可以做些什么来解决这个问题?

0 个答案:

没有答案