我不明白 Fortran95 代码中函数的输出

I don't understand the output of a function in a Fortran95 code

我刚开始使用 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 之后定义的,其中输入是向量 gagb。 但是在函数 pos_ini 中我不明白输出是什么;是 pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p)) 吗??如果是,为什么?为什么函数 pos_ini?

中没有 intent(OUT)

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

在你的例子中是表达 d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))

这在任何 Fortran 教程中都有介绍。

所以这一行

FUNCTION pos_ini(g)

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

DOUBLE PRECISION, DIMENSION(3) :: pos_ini

告诉我们(和编译器)pos_ini 将 return 一个包含 3 个元素的双精度数组。除非以其他方式编码(使用 result 子句),否则 Fortran 函数声明(自动或在此通过显式编写代码)与函数同名的结果变量。和行

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

pos_ini 定义了一个值,它定义了函数调用将 return 编辑的内容。没有必要将 return 变量声明为具有 intent(out).

,编译器会捕获错误

对于 return 内在类型的标量值的函数,函数类型的声明(或者 return 变量的类型,如果您想以这种方式思考事物)您可以按照

的方式编写函数开始语句
DOUBLE PRECISION FUNCTION pos_ini(g)

但是,由于您的函数 return 是一个数组,因此您必须按原样进行编码,显式声明 return 变量。

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

在 Fortran 中,return 值是通过赋值给函数名称(或 RESULT 子句中的名称,此处不适用)来设置的。这是通过

行完成的
pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))

让你不解。

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

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

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