我是Fortran的新手,但我正试图找到一种方法,我可以从我编写的程序中检索信息,而不将它们作为我的新文件中的子程序包含在内。到目前为止,我的新文件中有4个子程序,我希望能够将半径输入到所有4个并接收各自的输出。
这是我的代码的基本格式 - 基本上我想表明我需要4个独立的程序才能获得当前程序表达式所需的所有变量。 到目前为止,我已经尝试使用include和call表达式,但是他们无法检索我需要的信息以便返回到我的文件中,并且他们提出了“不适用”的答案。
program practicedynamo
implicit none
real:: A,B,C, Radius
real::Bsquared,Vsquared
read*,radius
call programA(radius,A)
call programB(radius,B)
call programC(radius,C)
Vsquared=(1.0/3.0)*B
Bsquared= 4*pi*density*Vsquared
gradient=radius*C
Rvector=Bsquared*Vsquared*gradient
ThetaVector=Rvector*sin(A)
end program practicedynamo
!and then my four subroutines would be placed afterwards
!here is an example of one of my subroutines within my actual code (the version above has been simplified and I've changed the variables)
subroutine testdensity(radius,density)
implicit none
real::radius,x,sunradius,density
if (radius>0.and.radius<=695500000) then
sunradius=695500000
x=radius/sunradius
density=((519*x**4.0)-(1630*x**3.0)+(1844*x*x)-(889*x)+155)
print*," "
density=density*1000
print*,"the density is",density, "kg per meters cubed"
else
print*, "this radius is not an option for the sun"
end if
end subroutine testdensity
答案 0 :(得分:5)
您还没有提到如何编译代码,但这里有一些将多个源文件包含在单个可执行文件中的一般方法。您不需要包含文件,您可以单独编译它们并将它们链接在一起。建议编写一个Makefile来执行此操作,您可以在其他地方找到大量示例。
要将多个文件编译为一个可执行文件,只需在编译时将它们全部列出
gfortran -o output programA.f90 programB.f90 programC.90 mainprogram.f90
如果您不想将它们全部编译在一起或在构建时必须重新编译,则可以编译单个对象,例如
gfortran -c -o programA.o programA.f90
gfortran -c -o programB.o programB.f90
gfortran -c -o programC.o programC.f90
然后链接为
gfortran -o output mainprogram.f90 programA.o programB.o programC.o
如果您正在尝试使用库并希望程序A-C位于独立库中,您可以先按上述方法编译对象,然后
ar rcs libABC.a programA.o programB.o programC.o
然后将主程序编译为
gfortran -o output mainprogram.f90 libABC.a
如果您没有使用模块,那么您将负责确保对外部子例程的调用与外部文件中声明的接口匹配。为了安全并让编译器捕获不匹配参数的问题,您可以在程序中声明显式接口,或者将外部代码放入模块中,并将use
模块放在主程序中。