我有两个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
答案 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
等