我不明白 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
(阅读评论)。所以我的问题来了:在子例程中,我看到变量 ra 和 rb 是在使用函数 pos_ini 之后定义的,其中输入是向量 ga 或 gb。
但是在函数 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 一个包含三个元素的数组。我假设它是在一个模块内声明的(因为 pi2
和 d
没有声明),但这在这里并不重要。
在 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 也是。
我刚开始使用 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
(阅读评论)。所以我的问题来了:在子例程中,我看到变量 ra 和 rb 是在使用函数 pos_ini 之后定义的,其中输入是向量 ga 或 gb。
但是在函数 pos_ini 中我不明白输出是什么;是 pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))
吗??如果是,为什么?为什么函数 pos_ini?
在 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 一个包含三个元素的数组。我假设它是在一个模块内声明的(因为 pi2
和 d
没有声明),但这在这里并不重要。
在 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 也是。