Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Fortran:将类型绑定过程与单独文件中的类型定义分开_Oop_Fortran - Fatal编程技术网

Oop Fortran:将类型绑定过程与单独文件中的类型定义分开

Oop Fortran:将类型绑定过程与单独文件中的类型定义分开,oop,fortran,Oop,Fortran,我试图在单独的文件中将类型绑定过程与类型定义分开。 但我失败了。这是密码 主要方案如下: program main ! use def_mod use funcs_mod ! implicit none ! type(time_info_t) :: tinfo ! continue ! call tinfo%InitTimeInfo() ! write(*,*) tinfo%it, tinfo%time ! end program main

我试图在单独的文件中将类型绑定过程与类型定义分开。 但我失败了。这是密码

主要方案如下:

program main
  !
  use def_mod
  use funcs_mod
  !
  implicit none
  !
  type(time_info_t) :: tinfo
  !
  continue
  !
  call tinfo%InitTimeInfo()
  !
  write(*,*) tinfo%it, tinfo%time
  !
end program main
module def_mod
  !
  implicit none
  !
  public
  !
  type :: time_info_t
    !
    integer :: it
    real :: time
    !
    contains
    !
    procedure :: InitTimeInfo
    !
  end type time_info_t
  !
  type(time_info_t) :: time_info
  !
  interface
    !
    subroutine InitTimeInfo(this)
      !
      import time_info_t
      class(time_info_t) :: this
      !
    end subroutine InitTimeInfo
    !
  end interface
  !
contains
  !
  !
end module def_mod
module funcs_mod
  !
  implicit none
  !
  public
  !
contains
  !
  subroutine InitTimeInfo(this)
    !
    use def_mod, only: time_info_t
    !
    class(time_info_t) :: this
    !
    continue
    !
    this%it = 0
    this%time = 4.0
    !
  end subroutine InitTimeInfo
  !
end module funcs_mod
def_mod
如下所示:

program main
  !
  use def_mod
  use funcs_mod
  !
  implicit none
  !
  type(time_info_t) :: tinfo
  !
  continue
  !
  call tinfo%InitTimeInfo()
  !
  write(*,*) tinfo%it, tinfo%time
  !
end program main
module def_mod
  !
  implicit none
  !
  public
  !
  type :: time_info_t
    !
    integer :: it
    real :: time
    !
    contains
    !
    procedure :: InitTimeInfo
    !
  end type time_info_t
  !
  type(time_info_t) :: time_info
  !
  interface
    !
    subroutine InitTimeInfo(this)
      !
      import time_info_t
      class(time_info_t) :: this
      !
    end subroutine InitTimeInfo
    !
  end interface
  !
contains
  !
  !
end module def_mod
module funcs_mod
  !
  implicit none
  !
  public
  !
contains
  !
  subroutine InitTimeInfo(this)
    !
    use def_mod, only: time_info_t
    !
    class(time_info_t) :: this
    !
    continue
    !
    this%it = 0
    this%time = 4.0
    !
  end subroutine InitTimeInfo
  !
end module funcs_mod
功能模块如下所示:

program main
  !
  use def_mod
  use funcs_mod
  !
  implicit none
  !
  type(time_info_t) :: tinfo
  !
  continue
  !
  call tinfo%InitTimeInfo()
  !
  write(*,*) tinfo%it, tinfo%time
  !
end program main
module def_mod
  !
  implicit none
  !
  public
  !
  type :: time_info_t
    !
    integer :: it
    real :: time
    !
    contains
    !
    procedure :: InitTimeInfo
    !
  end type time_info_t
  !
  type(time_info_t) :: time_info
  !
  interface
    !
    subroutine InitTimeInfo(this)
      !
      import time_info_t
      class(time_info_t) :: this
      !
    end subroutine InitTimeInfo
    !
  end interface
  !
contains
  !
  !
end module def_mod
module funcs_mod
  !
  implicit none
  !
  public
  !
contains
  !
  subroutine InitTimeInfo(this)
    !
    use def_mod, only: time_info_t
    !
    class(time_info_t) :: this
    !
    continue
    !
    this%it = 0
    this%time = 4.0
    !
  end subroutine InitTimeInfo
  !
end module funcs_mod
我执行以下命令来编译和链接程序

ifort -c def.f90
ifort -c funcs.f90
ifort -o test test.f90 def.o funcs.o
它报告以下错误

/tmp/ifortigFJkD.o: In function `MAIN__':
test.f90:(.text+0x86): undefined reference to `inittimeinfo_'
/tmp/ifortigFJkD.o:(.rodata+0x0): undefined reference to `inittimeinfo_'
我觉得Fortran支持这个特性。不过,我不明白为何会出现上述错误

我查过了。然而,我不认为这篇文章给了我答案


更新[2020-08-25]:我认为Fortran的子模块功能无法实现我的目标。我的目标解释如下

我正在开发一个基于有限元方法的CFD解算器,试图以一种有组织的方式组织解算器

有限元CFD解算器可以组织为包括多个模块

  • 网格
  • 空间解算器
  • 时间解算器
  • 基础设施,包括数据类型、有限元运算符
  • 其他实用程序模块,例如,保存和写入用于重新启动模拟的解决方案文件
使用CMake编译并链接它们。这些模块放在根文件夹下的不同文件夹中

这里的一个重要问题是,一些模块位于较低级别,而一些模块位于较高级别。高电平模块依赖于低电平模块。因此,在低级模块中定义的派生类型不能使用在高级模块中定义的派生类型。这个问题促使我将类型绑定过程与单独文件中的类型定义分开

time\u info\t
在目录
base
中的低级
time\u base
模块中定义。但是
time\u info\t
的初始化过程
Init
需要重启解决方案
rst\u info
的信息,该信息在位于目录
空间
的更高级别
restart
模块中声明。这可能会导致交叉依赖问题

time\u info\t
是许多模块使用的常用数据结构。因此,我希望将
time\u info\t
的定义保留在低级模块中,但将
time\u info\t%Init
的实现移动到另一个文件中的更高级模块中


因此Fortran的子模块功能无法解决这个问题。

接口块声明了一个外部过程(一个不是内在的过程,也不是在模块中定义的过程)。模块funcsu mod中的子程序定义了一个模块过程。这两种程序不是一回事

您没有向Fortran处理器提供外部过程的定义,因此它会抱怨


将过程定义移出模块(使其成为子程序程序单元),或使用单独的模块过程并在子模块中定义过程。

@HighPerformanceMark Hi,我知道子模块功能。但我认为这不能解决我的问题。我补充了关于我的问题的更多信息。你能再检查一遍吗?谢谢@HighPerformanceMark很抱歉造成混乱。我觉得直接调用Init过程是一种好方法。谢谢你的评论。嗨,我知道子模块的功能。但我认为这不能解决我的问题。我补充了关于我的问题的更多信息。你能再检查一遍吗?谢谢我的答案的最后一句(以及您在问题中所链接的问题/答案)是您问题的两种可能解决方案。为什么需要在模块中使用InitTimeInfo过程?它是否会被直接调用(而不是通过绑定调用)?谢谢你的回答。我觉得直接调用这个过程是一个好方法。