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解算器可以组织为包括多个模块
- 网格
- 空间解算器
- 时间解算器
- 基础设施,包括数据类型、有限元运算符
- 其他实用程序模块,例如,保存和写入用于重新启动模拟的解决方案文件
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过程?它是否会被直接调用(而不是通过绑定调用)?谢谢你的回答。我觉得直接调用这个过程是一个好方法。