Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并两个FORTRAN代码_Fortran - Fatal编程技术网

合并两个FORTRAN代码

合并两个FORTRAN代码,fortran,Fortran,我有两个FORTRAN代码,除了一行代码和OPEN语句中的文件名外,几乎完全相同。这一行不同的代码产生了我正在寻找的两个不同的最终结果,因此我有两个不同的代码 如果可能的话,我想把这两个代码合并成一个 最好的方法是什么?具体来说,我只希望有一个FORTRAN文件,它将运行FORTRAN“代码”中的任意一个。这样,当我需要编辑任一代码时,我只在一个文件中进行编辑。现在有两个不同的文件,这有点不方便 下面是两个不同文件的简化示例代码,即Sample.f90和Sample2.f90。如果我可以使用允许

我有两个FORTRAN代码,除了一行代码和OPEN语句中的文件名外,几乎完全相同。这一行不同的代码产生了我正在寻找的两个不同的最终结果,因此我有两个不同的代码

如果可能的话,我想把这两个代码合并成一个

最好的方法是什么?具体来说,我只希望有一个FORTRAN文件,它将运行FORTRAN“代码”中的任意一个。这样,当我需要编辑任一代码时,我只在一个文件中进行编辑。现在有两个不同的文件,这有点不方便

下面是两个不同文件的简化示例代码,即Sample.f90和Sample2.f90。如果我可以使用允许我选择使用哪个初始条件的IF语句,R=COSx+y或R=SINx+y,该怎么办?我一点也不熟悉如何使用IF语句

PROGRAM SAMPLE !Sample.f90

USE TestModule

IMPLICIT NONE

REAL, DIMENSION(-10,10) :: R
INTEGER :: i,j
REAL :: x,y

OPEN(UNIT = 100, FILE = 'Sample1.dat')

DO j = -10,10
DO i = -10,10

    x = i*0.1
    y = j*0.1

        R(i,j) = COS(x+y)

END DO
END DO

WRITE(100,*) R(0,1)

END PROGRAM 

!The next program is of the form:

PROGRAM SAMPLE2 !Sample2.f90

USE TestModule2

IMPLICIT NONE
REAL, DIMENSION(-10,10) :: R
INTEGER :: i,j
REAL :: x,y
OPEN(UNIT = 101, FILE = 'Sample2.dat')

DO j = -10,10
DO i = -10,10

    x = i*0.1
    y = j*0.1

        R(i,j) = SIN(x+y)

END DO
END DO

WRITE(101,*) R(0,1)

END PROGRAM

还有运行时方法。您有一个要运行哪个版本的交互式查询,然后是一个IF语句,它根据该查询选择两个可选语句之一。另一个版本是使用内在的GET_command_参数从命令行读取选项

编译时方法是使用预处理器选择一条语句或另一条语句,方法是使用编译命令DSYM定义一个符号,例如SYM或not,使用ifdef SYM,else,endif选择要编译的Fortran语句

一些代码片段。将选项声明为整数,将文件名声明为字符串

read (*, '( "Input choice: " )',  advance="no" )  choice

然后:

和类似的IF语句来设置初始条件

或者,您可以在编译命令中包含或不包含-DCHOICEONE,并使用预处理器行:

#ifdef CHOICEONE
   filename = "FileOne.txt"
#else
   filename = "FileTwo.txt"
#endif

等等。

你为什么不给我们看看有问题的代码?帮助您找到解决方案会更容易一些。@JLH代码很长,但这就是为什么我没有发布完整/可验证的示例代码的原因。但是,如果您仍然建议OK(可能不是全部),这足以给我们提供如何帮助您的线索。将它们都放在一个文件中,然后在顶部编写一个函数来选择要运行的。或者更好的办法是只需输入一行,添加不同的行并选择。@Kevin谢谢您的帮助。我觉得这很合乎逻辑。您建议如何将它们都放在一个文件中,或仅放在一个文件中?现在我有两个不同的.f90文件。谢谢你的回答。你能提供实际的FORTRAN代码吗?我不知道如何实施你的建议。如果使用If语句选择初始条件,那么打开行中所有文件的名称如何?我是否也必须将所有打开的文件行移动到IF语句中?此外,您还提到了stackoverflow上的示例-where?使用两个IF语句,一个用于文件名,另一个用于初始条件。@JeffFaraci您真的需要亲自尝试一下。@Holmz您有什么有用的建议吗?@M.S.B.IF语句应该包含什么?我不知道如何使用引用实际FORTRAN文件名的IF语句。如何构造交互式查询?你能提供一些代码吗?否则,对于熟悉这些东西的人来说,你的答案可能听起来不错,但这对我这个初学者来说真的没有太大帮助。谢谢
if (choice /=1 .AND. choice /=2 ) then
   write (*, *) "bad choice"
   stop
end if

if (choice == 1) then
   filename = "FileOne.txt"
else
   filename = "FileTwo.txt"
end if

open (file=filename, ....
#ifdef CHOICEONE
   filename = "FileOne.txt"
#else
   filename = "FileTwo.txt"
#endif