如何解决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
def_mod
如下,
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
funcs_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支持此功能。但是,我不明白为什么会出现上述错误。
我已经检查过this similar post。但是,我认为该帖子不能给我答案。
UPDATE [2020-08-25]:我认为Fortran的子模块功能无法实现我的目标。我的目标解释如下。
我正在基于有限元方法开发CFD求解器,试图以有组织的方式组织求解器。
可以将有限元CFD求解器组织为包括几个模块。
- 网格
- 空间求解器
- 时间求解器
- 基础结构,包括数据类型,有限元运算符
- 其他实用程序模块,例如,保存和编写用于重新启动仿真的解决方案文件
使用CMake进行编译和链接。这些模块放在根文件夹下的不同文件夹中。
这里的一个重要问题是,某些模块处于较低级别,而某些模块处于较高级别。高级模块取决于低级模块。因此,在低级模块中定义的派生类型不能使用在高级别模块中定义的派生类型。这个问题促使我在不同的文件中将类型绑定过程与类型定义分开。
time_info_t
在目录time_base
中的低级base
模块中定义。但是Init
的初始化过程time_info_t
需要重启解决方案rst_info
的信息,该信息在目录{{1}中的更高级别restart
模块中声明}。这可能会导致交叉依赖性问题。
space
是许多模块使用的通用数据结构。因此,我想将time_info_t
的定义保留在较低级别的模块中,但将time_info_t
的实现移至另一个文件中的较高级别的模块。
因此Fortran的子模块功能无法解决此问题。
解决方法
接口块声明一个外部过程(该过程不是固有的,并且未在模块中定义)。模块funcs_mod中的子例程子程序定义模块过程。这两种程序不是同一回事。
您没有为Fortran处理器提供外部过程的定义,因此会抱怨。
将过程定义移出模块(使其成为子例程程序单元),或者使用单独的模块过程并在子模块中定义过程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。