【发布时间】:2016-06-26 02:37:31
【问题描述】:
我正在做关于在 ANSYS CFX 上进行风力涡轮机模拟的硕士论文。要计算参数,我必须使用 FORTRAN 编写的代码。我遇到了一个非常奇怪的问题,需要你的帮助。完整的 fortran 代码很长,但我只会在导致问题的代码中发布子例程。
我正在使用子程序将叶片划分为径向元素。使用两种类型的划分,然后将元素的径向位置存储在两个一维数组 RI 和 RJ 中。
稍后在代码中,我遇到了一些错误,我将其追溯到这个子程序,它没有给我正确的 RJ 值。子程序给出了正确的 RI 值。然后我使用计算correct values of RJ 的相同循环显示了 RJ 的结果。幸运的是,RJ 的值是正确的。然后在同一个子程序中,在那个循环之后,我立即开始另一个循环以再次显示 RJ 的值,不幸的是这次它们不正确incorrect values of RJ,即使两个循环之间没有任何东西可以改变 RJ 的值。似乎 RJ 的每个元素都被 RI 的下一个元素替换。因此,我开始知道这是错误的根源。我重新检查了程序,似乎没有错误,错误源于子程序内部的某个地方。我在没有 ANSYS CFX 的 fortran 上使用另一个程序使用相同的子程序来计算风力涡轮机的性能,尽管这两个程序中的两个子程序完全相同,但这个问题并没有出现在该程序中。我在这件事上需要帮助,因为过去几天我都陷入了困境。我正在使用 INTEL COMPOSER 附带的 Intel fortran 编译器。
子程序如下
CALL INIT(M,PI,PREC,R,HUBRAD,RI,RJ)
SUBROUTINE INIT(M,PI,PREC,R,HUBRAD,RI,RJ)
INTEGER:: M
REAL:: PI,PREC,R,HUBRAD
REAL:: RI(41),RJ(41)
!,RRI,RRJ)
CALL LLPOINTS (PI,PREC,R,HUBRAD,M,RI,RJ)
return
End Subroutine
SUBROUTINE LLPOINTS (PI,PREC,R,HUBRAD,M,RI,RJ)
!Input arguments: M,Pi, PREC, R, HUBRAD
!Output arguments : RI, RJ
INTEGER:: M
REAL::PREC,R,HUBRAD
REAL:: RI(41),RJ(41)
INTEGER :: J
character*100 ::string1, string2, string3
CALL MESAGE( 'WRITE', 'subroutine INIT START' )
CALL MESAGE( 'WRITE', "RI RJ DJ")
DO J=1,M+1
IF (J.LT.M+1) THEN
RI(J)=0.5E+00*(1.E+00+HUBRAD/R)-0.5E+00*(1.E+00-HUBRAD/R)
&*COS((J-0.5E+00)*PI/M)
RJ(J)=0.5E+00*(1.E+00+HUBRAD/R)-0.5E+00*(1.E+00-HUBRAD/R)
&*COS((J-1.E+00)*PI/M)
IF (ABS(RI(J)).LT.(1/PREC)) THEN
STOP
ENDIF
ELSE
RJ(J)=1.E+00
END IF
write (string1,*) RI(J)
write (string2,*) RJ(J)
CALL MESAGE( 'WRITE', string1//' '//string2)
END DO
CALL MESAGE( 'WRITE','ri rj')
do j =1,m
write (string1,*) RI(J)
write (string2,*) RJ(J)
CALL MESAGE( 'WRITE', string1//' '//string2 )
end do
CALL MESAGE( 'WRITE', 'subroutine LLINE OK' )
END SUBROUTINE
您会想知道为什么 LLPOINTS 无缘无故地存在于 INIT 子例程中。实际上在原程序中子程序INIT还有很多其他的子程序。我只使用了 LLPOINTS 并丢弃了其余的因为我不需要它们
我已经检查过我的程序在任何子程序中都没有隐含的 none,根据我的有限知识,这些子程序应该存在。当我在所有子例程中添加隐式 none 时,出现了一些编译错误,并且似乎在这些错误中,我发现存在与许多变量的声明有关的问题。我已经解决了这些问题,现在当所有问题都得到解决时,我在编译中遇到了以下错误,这在implicit none之前没有出现。
错误:函数 ACD_Dp 中引用的外部符号 LLINE 无法解析。
我不知道如何处理这个错误
【问题讨论】:
-
您能否说明如何调用此子例程 (
LLPOINTS),以及如何定义RI和RJ的实际参数?实际参数可能被错误地传递,以至于它们指向的内存区域仅相差 1。 -
基本上参数“m”是涡轮叶片被划分成的数字。m的值从另一个输入文件中读取并传递给这个子程序。我已经测试过了,m 的值被正确地传递给了这个子程序。 RI 和 RJ 的大小故意限制为 41。这样做是为了避免可分配的数组。默认情况下,该程序只能工作到 m=40 个元素(划分为两个数组 RI n RJ 使得 RI 元素的数量等于 m 并且 RJ 元素的数量等于 m+1)。任何小于 40 的 m 值都应该有效。
-
检查我编辑的问题以调用(LLifine)子程序
-
你在某处有任何名为
LLINE的函数(或子程序)吗?LLINE在你的日常生活中是如何使用的?编译器认为LLINE是一个函数,而它在任何源代码中都找不到它的定义(在链接时)。
标签: arrays fortran intel-fortran