首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不理解Fortran95代码中函数的输出

我不理解Fortran95代码中函数的输出
EN

Stack Overflow用户
提问于 2015-02-18 17:14:21
回答 3查看 110关注 0票数 0

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

下面是子程序

代码语言:javascript
复制
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

以下是功能:

代码语言:javascript
复制
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中没有意图呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-18 17:25:06

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

在您的例子中,它是espression d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))

这包括在任何Fortran教程中。

票数 2
EN

Stack Overflow用户

发布于 2015-02-18 17:25:18

所以这条线

代码语言:javascript
复制
FUNCTION pos_ini(g)

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

代码语言:javascript
复制
DOUBLE PRECISION, DIMENSION(3) :: pos_ini

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

代码语言:javascript
复制
pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))

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

对于返回固有类型的标量值的函数,函数的类型(或者返回变量的类型)的声明(如果您想这样想的话),您可以按照

代码语言:javascript
复制
DOUBLE PRECISION FUNCTION pos_ini(g)

但是,由于您的函数返回一个数组,所以您必须像以前那样编写代码,显式地声明返回变量。

票数 0
EN

Stack Overflow用户

发布于 2015-02-18 17:51:44

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

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

代码语言:javascript
复制
pos_ini = d * es_p/SQRT(DOT_PRODUCT(es_p,es_p))

这让你很困惑。

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

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

我建议你读本文介绍Fortran 95特性

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28589655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档