fortran - 如何运行具有太多子程序和函数的 Fortran 文件?
问题描述
存在子程序和函数过多的主程序。一些子例程和函数也使用子例程、函数和模块。由于主程序的清晰性,我决定将它们写在独立的文件中。然后我创建了一个独立的文件作为模块来使用 include 命令收集它们。
现在我有一个主程序和一个独立的模块文件。我编译了程序,但它显示错误。该错误是关于在上述独立文件中缺少提到的子程序。
我的一般问题是:如果你有一个程序,有一个主程序和多个子程序(子程序、函数和模块),它们也有子程序,你用什么方法来组装和运行它?
我在 PLATO 中将代码编写为 fortran95。
我会感谢任何给我一点帮助的评论,并原谅我写的缺点
问题是什么?
考虑以下结构。以独立文件为主程序:
MAIN PROGRAM
CALL A
CALL B
CALL C
END PROGRAM
在作为子程序 A 的独立文件上:
SUBROUTINE A
...
END SUBROUTINE
在作为子程序 B 的独立文件上:
SUBROUTINE B
CALL B1
CALL B2
END SUBROUTINE
---------------
SUBROUTINE B1
...
END SUBROUTINE
--------------
FUNCTION B2
...
END FUNCTION
在作为子程序 C 的独立文件上:
SUBROUTINE C
USE C1
CALL C2
END SUBROUTINE
---------------
SUBROUTINE C1
...
END SUBROUTINE
在作为模块 C1 的独立文件上:
MODULE C1
CONTAINS
SUBROUTINE C1-1
SUBROUTINE C1-2
SUBROUTINE C1-3
...
END MODULE
我做了什么:
我创建了一个独立文件作为模块:
MODUL D
INCLUDE A.F95
INCLUDE B.F95
INCLUDE C.F95
END MODULE
因此,对于主程序:
MAIN PROGRAM
USE D
CALL A
CALL B
CALL C
END PROGRAM
什么是错误:
警告:缺少 A(文件地址)、缺少 B(文件地址)、缺少 C(文件地址)
解决方案
以下 makefile 应该适用于您的设置。
FC := gfortran
main: c1.o d.o main.o
@$(FC) $^ -o main
main.o: main.f90 d.f90
@$(FC) -c $<
d.o: d.f90 a.f90 b.f90 c.f90 c1.o
@$(FC) -c $<
c1.o: c1.f90
@$(FC) -c $<
clean:
@rm -rf *.{o,mod} main
我使用了以下文件(注意文件名和.f90
扩展名)
! main.f90
program main
use d
print *, 'main'
call a()
call b()
call c()
end program
! b.f90
subroutine b()
logical :: tmp
print *, 'b'
call b1()
tmp = b2()
end subroutine
subroutine b1()
print *, 'b1'
end subroutine
logical function b2() ! added: function needs return type.
print *, 'b2'
b2 = .true.
end function
! c.f90
subroutine c()
use c1
print *, 'c'
call c1_1() ! added this line. otherwise module c1 would not be used at all.
call c2()
end subroutine
subroutine c2()
print *, 'c2'
end subroutine
! c1.f90
module c1
contains
subroutine c1_1()
print *, 'c1_1'
end subroutine
subroutine c1_2()
print *, 'c1_2'
end subroutine
subroutine c1_3()
print *, 'c1_3'
end subroutine
end module
! d.90
module d
contains ! added: files a.f90,b.d90,c.f90 define procedures and must be included after `contains`.
include 'a.f90'
include 'b.f90'
include 'c.f90'
end module
推荐阅读
- redux - redux 中 state 的初始值未定义
- python - 在Python中从两个具有不同概率的高斯分布中采样
- css - 修复 FullCalendar 高度以填充窗口
- graphql - 如何在 GraphQL API 中有一个根查询/变异参数?
- bayesian - STAN - 定义因随机变量的先验
- javascript - 在外部窗口选项卡中打开链接
- javascript - JavaScript/TypeScript 动态导入和浏览器 - 选项
- python - 将图像和数据框添加到电子邮件的单个 html 正文中
- grafana - 调用 /render 时出现石墨错误“'ParseResults' 对象没有属性 'raw'”
- apache-kafka-streams - KSQL如何在Stream和Table之间的非键列上执行连接