合并两个FORTRAN代码

时间:2017-07-11 02:14:25

标签: fortran

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

如果可能,我想将这两个代码合并为一个。

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

下面是两个不同文件的简化示例代码,Sample.f90和Sample2.f90。我可以使用哪些IF语句,允许我选择使用哪个初始条件,R = COS(x + y)或R = SIN(x + 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

1 个答案:

答案 0 :(得分:1)

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

编译时方法是使用预处理器通过使用编译命令(-DSYM)定义符号(例如,SYM)来选择一个语句或另一个语句,使用#ifdef SYM,#else, #endif选择要编译的Fortran语句。

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

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

call GET_COMMAND_ARGUMENT ( 1, string )
read (string, *)  choice

然后:

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, ....

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

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

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