首页 > 解决方案 > 如何运行具有太多子程序和函数的 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(文件地址)

标签: fortran

解决方案


以下 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

推荐阅读