Fortran Coder

标题: IMSL编译错误,This name has already been used as an external function name. [打印本页]

作者: 依旧是则徐    时间: 2015-4-7 09:01
标题: IMSL编译错误,This name has already been used as an external function name.
出现这样的错误,修改思路是啥
Error: The same named entity from different modules and/or program units cannot be referenced.   [SXYZ]
   SXYZ(1,0,j)=-15+1*J
---^
Error: This name has already been used as an external function name.   [SXYZ]
   SXYZ(1,0,j)=-15+1*J
---^
Error: This function, which is specified as the left side of an assignment statement, is invalid.   [SXYZ]
   SXYZ(1,0,j)=-15+1*J
这是程序的一部分。
[Fortran] 纯文本查看 复制代码

!主程序
program MAIN
use     NUMERICAL
use     CONSTANT
USE     VARIABLE
USE     IMSL

IMPLICIT NONE
external FCN
                                      !!!主程序出现的变量        
real :: a=20.0                          !牛顿迭代求波数时的初始值        
INTEGER IDO ,ISTEP,NOUT,PSTEP2
real*8  TOL,PARAM(MXPARM),Y(N),TEND,T
INTEGER  I,J, K
  !浮子浮标坐标划分
    zxyz(1,0)=-15
    zxyz(2,0)=0.0
    zxyz(3,0)=0.0

    zxyz(1,22)=15
    zxyz(2,22)=0.0
    zxyz(3,22)=0.0

    do i=1,21
       zxyz(1,i)=-10+1*(i-1)
       zxyz(2,i)=0
       zxyz(3,i)=0
    end do

     ! 梗绳单元划分
   
   do J=1,4
   SXYZ(1,0,j)=-15+1*J
   SXYZ(2,0,j)=0
   SXYZ(3,0,j)=0
   SXYZ(1,0,5)=zxyz(1,1)
   SXYZ(1,0,0)=zxyz(1,0)
   SXYZ(2,0,5)=zxyz(2,1)
   SXYZ(2,0,0)=zxyz(2,0)
   SXYZ(3,0,5)=zxyz(3,1)
   SXYZ(3,0,0)=zxyz(3,0)
end do
   
   do I=1,20
   do J=1,4
      sxyz(1,i,j)=-10+1*(I-1)+0.2*J
      sxyz(2,i,j)=0
      sxyz(3,i,j)=0
      sxyz(1,i,5)=zxyz(1,i+1)
      sxyz(1,i,0)=zxyz(1,i)
      sxyz(2,i,5)=zxyz(2,i+1)
      sxyz(2,i,0)=zxyz(2,i)
      sxyz(3,i,5)=zxyz(3,i+1)
      sxyz(3,i,0)=zxyz(3,i)
   end do
   end do

I=21
do J=1,4
   sxyz(1,i,j)=-10+1*(I-1)+1*J
   sxyz(2,i,j)=0
   sxyz(3,i,j)=0
   sxyz(1,i,5)=zxyz(1,i+1)
   sxyz(1,i,0)=zxyz(1,i)
   sxyz(2,i,5)=zxyz(2,i+1)
   sxyz(2,i,0)=zxyz(2,i)
   sxyz(3,i,5)=zxyz(3,i+1)
   sxyz(3,i,0)=zxyz(3,i)
end do


作者: 楚香饭    时间: 2015-4-7 09:26
use     NUMERICAL
use     CONSTANT
USE     VARIABLE
USE     IMSL
这些模块里,已经有定义过 Sxyz 了,可能冲突
作者: 依旧是则徐    时间: 2015-4-7 10:08
楚香饭 发表于 2015-4-7 09:26
use     NUMERICAL
use     CONSTANT
USE     VARIABLE

对啊,我就是在variable 里面定义了sxyz  其他的都没有定义。而且对于imsl 我不太懂,当我把IMSL去掉之后时,上述error就没有了 ,反倒出现了这个错误error LNK2001: unresolved external symbol _IVPRK@32
Debug/130.exe : fatal error LNK1120: 1 unresolved externals
作者: 楚香饭    时间: 2015-4-7 10:28
本帖最后由 楚香饭 于 2015-4-7 10:31 编辑

试试
use IMSL
改为
use IMSL , sxyz_1 => sxyz

可能 IMSL 里面有一个叫 sxyz 的函数,用来算三维向量的内积。所以给他改个名字。

作者: 依旧是则徐    时间: 2015-4-7 11:00
楚香饭 发表于 2015-4-7 10:28
试试
use IMSL
改为

谢谢,确实有帮助,这个问题解决了!然后又出现了这个问题,请帮忙看下d:\files\ipv\130.f90(634) : Error: The type of the actual argument differs from the type of the dummy argument.   [T]
call IVPRK(IDO, N, FCN, T, TEND, TOL, PARAM, Y)
------------------------^
d:\files\ipv\130.f90(634) : Error: The type of the actual argument differs from the type of the dummy argument.   [TEND]
call IVPRK(IDO, N, FCN, T, TEND, TOL, PARAM, Y)
我看了下我的主程序和子程序里面都定义这个量了(下面贴出来了),为啥还出现这样的问题?

!主程序
program MAIN
use     NUMERICAL
use     CONSTANT
USE     VARIABLE
use     IMSL,sxyz_1=>sxyz

IMPLICIT NONE
external FCN
                                      !!!主程序出现的变量       
real :: a=20.0                          !牛顿迭代求波数时的初始值       
INTEGER IDO ,ISTEP,NOUT,PSTEP2
real*8  TOL,PARAM(MXPARM),Y(N),TEND,T
INTEGER  I,J, K

!子程序
SUBROUTINE FCN(NN,T1,Y,YPRIME)
use CONSTANT
USE VARIABLE
IMPLICIT NONE
INTEGER NN
REAL*8 T1,Y(N),YPRIME(N)
作者: 楚香饭    时间: 2015-4-7 11:09
参数类型不一致。ivprk 用于处理单精度,而 T 是双精度。
尝试使用 DIVPRK 函数
作者: 依旧是则徐    时间: 2015-4-7 12:15
楚香饭 发表于 2015-4-7 11:09
参数类型不一致。ivprk 用于处理单精度,而 T 是双精度。
尝试使用 DIVPRK 函数 ...

非常感谢!编译没问题了.我在运行时又出错了, 提示我的问题是数组fz超出。可是我不太理解,我设定的FUFSUM(3,0:22)没有问题吧?请楼主如果有空暇时,帮我看看下面的文件(链接是文件所在位置),http://pan.baidu.com/s/1o6tA04M
作者: 楚香饭    时间: 2015-4-7 12:32
VARIABLE 模块中,
real*8  sk3(3,0:2,0:22)
而在  shouli.f90 第 50 行:
do i=1,20
do j=0,4
    sk3(1,i,j)=sXYZ(1,i,j+1)-sXYZ(1,i,j)  !// 此处 sk3 越界,i 从1 到 20,但第二维是 0:2
    sk3(2,i,j)=sXYZ(2,i,j+1)-sXYZ(2,i,j)
作者: 依旧是则徐    时间: 2015-4-7 12:54
楚香饭 发表于 2015-4-7 12:32
VARIABLE 模块中,
real*8  sk3(3,0:2,0:22)
而在  shouli.f90 第 50 行:

是的,我改过来了!谢谢!然后我再请教一个问题,我在运行时出现error M6201: MATH     ——sqrt: DOMAIN error。我看了下 shouli.f90中的sqrt公式,没发现错误,帮我检查一下吧!
作者: pasuka    时间: 2015-4-7 13:22
依旧是则徐 发表于 2015-4-7 12:54
是的,我改过来了!谢谢!然后我再请教一个问题,我在运行时出现error M6201: MATH     ——sqrt: DOMA ...

1、请贴出完整的代码,这样挤牙膏的话,就怕下次再发帖就风干喽
2、sqrt默认输入正实数,请检查以下输入值
作者: 楚香饭    时间: 2015-4-7 13:36
楼主的完整代码在 7 楼。

但是我不知道他之前的越界怎么改的,所以也不知道问题在哪儿。

sqrt domian 常见于负数开方。
作者: 依旧是则徐    时间: 2015-4-7 14:39
楚香饭 发表于 2015-4-7 13:36
楼主的完整代码在 7 楼。

但是我不知道他之前的越界怎么改的,所以也不知道问题在哪儿。

越界问题 是把variable模块中的sk3(3,0:2,0:22)改成了sk3(3,0:22,0:5) 改过之后,在运行就出现了sqrt domain,我检查了一下,sqrt里面的值都是平方项的和,不应该出现负值啊,请楚香饭师兄帮忙看看。看能否发现错误,
作者: 依旧是则徐    时间: 2015-4-7 15:55
pasuka 发表于 2015-4-7 13:22
1、请贴出完整的代码,这样挤牙膏的话,就怕下次再发帖就风干喽
2、sqrt默认输入正实数,请检查以下输入 ...

谢谢来帮我解决问题,http://pan.baidu.com/s/1o6tA04M这是链接。如果有空暇,请帮我看看问题在哪?
作者: pasuka    时间: 2015-4-7 19:15
依旧是则徐 发表于 2015-4-7 15:55
谢谢来帮我解决问题,http://pan.baidu.com/s/1o6tA04M这是链接。如果有空暇,请帮我看看问题在哪? ...

粗看代码,没啥注释,也没发现啥问题,由于未装imsl所以没法编译测试
若是被导师强迫写Fortran程序的话,趁早和导师商量改matlab吧,相比Fortran往往事半功倍
作者: 楚香饭    时间: 2015-4-7 20:05
依旧是则徐 发表于 2015-4-7 14:39
越界问题 是把variable模块中的sk3(3,0:2,0:22)改成了sk3(3,0:22,0:5) 改过之后,在运行就出现了sqr ...

sqrt domain 不一定就是负数,有时候本身就是 NaN 也会出错。
至少在我这里,发现很多容易出负数的地方。

例如 130.f90 文件
YITABOU3(i)=Amp*DCOS(WK*X3(i)-W1*T)&
                  -Amp**2*WK/(2*DSINH(2*WK*H)) &
这里的 WK 为 0,导致分母为0

wk 应该是在更早的代码计算:
wk=newton(a,func,dfunc)
这里计算结果为0

可能是由此导致的 NaN

正如 pasuka 所言,没有注释的代码比较难看懂。我想你学习一下如何 Debug 单步运行,或许会让你自己更容易检查错误。

本站的文章:http://debug.w.fcode.cn 会指导你如何学习 Debug
作者: 依旧是则徐    时间: 2015-4-7 20:15
楚香饭 发表于 2015-4-7 20:05
sqrt domain 不一定就是负数,有时候本身就是 NaN 也会出错。
至少在我这里,发现很多容易出负数的地方。 ...

确实是有很多NaN错误,谢谢师兄!我这就看看Debug单步运行的文章。有问题我再来请教!
作者: pasuka    时间: 2015-4-7 20:58
楚香饭 发表于 2015-4-7 20:05
sqrt domain 不一定就是负数,有时候本身就是 NaN 也会出错。
至少在我这里,发现很多容易出负数的地方。 ...

说实话,lz真不如直接matlab写个验证程序,调试起来也不会这么折磨人
作者: 依旧是则徐    时间: 2015-4-7 21:48
pasuka 发表于 2015-4-7 20:58
说实话,lz真不如直接matlab写个验证程序,调试起来也不会这么折磨人

师兄,我现在是刚学用fortran,这个程序也是我自己写的,我也知道有很多错误问题。你说的matlab 验证程序我还不会呢。正想办法学,
作者: pasuka    时间: 2015-4-7 22:14
依旧是则徐 发表于 2015-4-7 21:48
师兄,我现在是刚学用fortran,这个程序也是我自己写的,我也知道有很多错误问题。你说的matlab 验证程序 ...

个么改行来得及,matlab对照帮助文档的例子或者网上找些资料,三周就能入门,搞不定的问题就上网搜索,相关资料可谓铺天盖地,不少高校还购买正版了
Fortran的话,没有C、C++的基础,怎么也得花上三个月到半年的时间入门




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2