【问题标题】:I don't understand the output of a function in a Fortran95 code我不理解 Fortran95 代码中函数的输出
【发布时间】:2015-02-18 17:14:21
【问题描述】:

我刚开始使用 fotran95;我得到了一个代码,我正在研究它;我遇到了一个调用函数的子例程,但我不明白输出是什么:

这里是子程序

SUBROUTINE collisione(vga, ga, vgb, gb)

IMPLICIT NONE
DOUBLE PRECISION, DIMENSION(3), INTENT(INOUT) :: ga, gb    
DOUBLE PRECISION, DIMENSION(3), INTENT(INOUT) :: vga, vgb  

DOUBLE PRECISION, DIMENSION(3)   :: r, ra, rb, r_r

ra = pos_ini(ga)
rb = pos_ini(gb)


END SUBROUTINE

这里是函数:

FUNCTION pos_ini(g)

IMPLICIT NONE
DOUBLE PRECISION, DIMENSION(3) :: pos_ini
DOUBLE PRECISION, DIMENSION(3), INTENT(IN) :: g

DOUBLE PRECISION, DIMENSION(3) :: es, eg, es_p
DOUBLE PRECISION :: rnd, b, kos, ang 

CALL RANDOM_NUMBER(rnd)
b = 1.D0 - 2.D0*rnd 
kos = SQRT(1.D0 - b*b)
CALL RANDOM_NUMBER(rnd)
ang = pi2 * rnd

es(1) = kos * COS(ang)
es(2) = kos * SIN(ang)
es(3) = b

eg = g / SQRT(DOT_PRODUCT(g,g))

es_p = es - DOT_PRODUCT(es,eg) * eg

pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p)) ! IS THIS THE OUTPUT THAT GIVES THE VALUE OF ra and rb???????

END FUNCTION

(阅读评论)。所以我的问题来了:在子程序中,我看到变量 rarb 是在使用函数 pos_ini 后定义的,其中输入是向量 ga em> 或 gb。 但是在函数 pos_ini 中,我不明白输出是什么;是pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p)) 吗?如果是,为什么?函数pos_ini怎么没有intent(OUT)?

【问题讨论】:

标签: function fortran subroutine fortran95


【解决方案1】:

在 Fortran 中,返回的函数值连接到函数名称或可选 result 子句中的变量。因此,函数值将是函数末尾的 pos_ini 值。

在你的情况下,它是d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))

任何 Fortran 教程都涵盖了这一点。

【讨论】:

    【解决方案2】:

    所以这一行

    FUNCTION pos_ini(g)
    

    开始定义一个名为pos_ini 的函数。而这一行

    DOUBLE PRECISION, DIMENSION(3) :: pos_ini
    

    告诉我们(和编译器)pos_ini 将返回一个包含 3 个元素的双精度数组。除非另有编码(使用result 子句),否则 Fortran 函数会声明(自动或像这里一样,通过显式编写代码)与函数同名的结果变量。还有那一行

    pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))
    

    它定义了pos_ini 的值,定义了函数调用将返回的内容。没有必要将返回变量声明为intent(out),编译器会捕获错误。

    对于返回固有类型的标量值的函数,函数类型的声明(或返回变量的类型,如果你想以这种方式考虑的话)你可以写一个函数开头的语句的

    DOUBLE PRECISION FUNCTION pos_ini(g)
    

    但是,由于您的函数返回一个数组,因此您必须按原样编写代码,明确声明返回变量。

    【讨论】:

      【解决方案3】:

      pos_ini 是一个双精度函数,返回一个包含三个元素的数组。我假设它是在模块中声明的(因为没有声明 pi2d),但这并不重要。

      在 Fortran 中,返回值是通过分配给函数名称(或 RESULT 子句中的名称,此处不适用)来设置的。这是用线完成的

      pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))
      

      这让你感到困惑。

      在这种情况下,这是一个数组赋值。在 Fortran 中,您可以从标量或其他数组、数组算术(按元素完成)以及标量和数组之间的混合算术对数组进行赋值。

      因为 d 没有定义,所以我不能说它是什么。它可以作为范围为 3 的数组或作为标量有效。 es_p 是一个与 pos_ini 范围相同的数组,所以可以。 DOT_PRODUCT 应该是不言自明的;它是一个 sclar,SQRT 也是。

      我建议你阅读this article on Fortran 95 features

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        • 2019-10-17
        • 1970-01-01
        • 2020-05-11
        • 1970-01-01
        相关资源
        最近更新 更多