我是否可以通过Fortran中的几个函数传递可选变量,而无需中间检查var?

时间:2018-09-21 08:34:24

标签: if-statement fortran parameter-passing optional-variables

想象一下,我们有3个相互调用的函数: func1(u,Y,is_D)调用func2,func2调用func3。 并且它们都具有相同的可选变量。

仅在func3中执行带有可选var的操作。接下来的问题是:我可以传递变量而不检查是否存在。只能在最后一个函数func3上执行检查吗?在ifort编译器中它可以工作。但是我想了解是否标准?它是否可以在其他Fortran 90编译器中使用,因为在群集中,用户必须使用提供的编译器?

第二个问题是我可以检查可选变量的存在和值,例如,下一种形式:IF(PRESENT(is_D) .AND. is_D.EQ.1)。在检查第一个子条件是否为TRUE后,我如何理解将检查下一个子条件并可以工作,但是如果为FALSE,它将停止检查下一个语句吗? 有什么标准吗?

FUNCTION func1 (u1, is_D, u2) RESULT(res)
    IMPLICIT NONE
    REAL (pr), DIMENSION (N,M),INTENT(IN) :: u1
    REAL (pr), DIMENSION (N,M),INTENT(IN), OPTIONAL :: u2
    REAL (pr), DIMENSION (N) :: res
    INTEGER, OPTIONAL :: is_D
    res= func2(u1,is_D,u2)
END FUNCTION func1

FUNCTION func2 (u1, is_D, u2) RESULT(res)
    IMPLICIT NONE
    REAL (pr), DIMENSION (N,M),INTENT(IN) :: u1
    REAL (pr), DIMENSION (N,M),INTENT(IN), OPTIONAL :: u2
    REAL (pr), DIMENSION (N) :: res
    INTEGER, OPTIONAL :: is_D
    res = func3(u1,is_D,u2) +func3(u1+1,is_D,u2)
END FUNCTION func2

FUNCTION func3 (u1, is_D, u2) RESULT(res)
    IMPLICIT NONE
    REAL (pr), DIMENSION (N,M),INTENT(IN) :: u1
    REAL (pr), DIMENSION (N,M),INTENT(IN), OPTIONAL :: u2
    REAL (pr), DIMENSION (N) :: res
    INTEGER, OPTIONAL :: is_D
    IF (present(is_D).AND. PRESENT(u2)) THEN
        res = SUM (u2, DIM=2)
    ELSE
        res = SUM (u1,DIM=2)
    END IF
END FUNCTION func3

0 个答案:

没有答案