我刚开始使用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中没有意图呢?
发布于 2015-02-18 17:25:06
在Fortran中,返回的函数值连接到可选result子句中的函数名或变量。因此,函数值将是函数末尾的pos_ini值。
在您的例子中,它是espression d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))。
这包括在任何Fortran教程中。
发布于 2015-02-18 17:25:18
所以这条线
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)但是,由于您的函数返回一个数组,所以您必须像以前那样编写代码,显式地声明返回变量。
发布于 2015-02-18 17:51:44
pos_ini是一个双精度函数,返回一个由三个元素组成的数组。我假设它是在模块中声明的(因为没有对pi2和d的声明),但这在这里并不重要。
在Fortran中,返回值是通过赋值给函数名(或RESULT子句中的名称(此处不适用)设置的)。这是用行完成的
pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))这让你很困惑。
在这种情况下,这是一个数组分配。在Fortran中,可以从标量或其他数组、数组算法(按元素进行)和标量与数组之间的混合算法对数组进行赋值。
因为缺乏定义,我不能说它是什么。它作为一个范围为3的数组或作为标量都是有效的。es_p是一个与pos_ini具有相同范围的数组,所以这是可以的。DOT_PRODUCT应该是不言自明的;它是一个sclar,和SQRT一样。
我建议你读本文介绍Fortran 95特性。
https://stackoverflow.com/questions/28589655
复制相似问题