爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 16323|回复: 22

[其他] 求助:ncl调用fortran

[复制链接]

新浪微博达人勋

发表于 2016-8-22 21:19:46 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 王磊 于 2016-8-22 21:21 编辑

最近由于一个ncl代码跑起来太费时间,故想调用fortran的子程序来节约时候。参照了官网的例子,自己写了一个小测试程序,主要是为了测试计算速度。目前fortran代码成功编译,但是写的stub接口却无法通过WRAPIT,求指教可能的解决途径。
附:
(1)fortran 代码如下(try0822.f90):
subroutine try0822(a,b,c,n)
    implicit none
    integer  n
    integer,intent(in) :: a(n),b(n)
    integer  c(n)

    integer i,j,k

    do i=1,n
        do j=1,n
            do k=1,n
                c(k)=a(k)+b(k)
            end do
        end do
    end do
end subroutine try0822

stub程序如下(try0822.stub)
C NCLFORTSTART    (字符C处顶格写的)
      SUBROUTINE try0822(a,b,c,n)   (空出前6格,类似于f77语法)
      implicit none
      integer n
      integer,intent(in) :: a(n),b(n)
      integer  c(n)
C NCLEND

使用WRAPIT编译,提示的错误为:
WRAPIT Version: 120209
A syntax error occurred while parsing: ,
COMPILING try0822.f90
LINKING
END WRAPIT

代码与服务器上书写,为防止错误,已经使用dos2unix进行转码。求此错误的解决方法。另外,求教stub的文件的语法规范,以及需要注意的事项是?

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-23 07:04:04 | 显示全部楼层

回帖奖励 +2 金钱

先编译fortran程序生成exe文件,然后用NCL的系统命令调用exe文件
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-23 08:37:02 | 显示全部楼层
robin_ouc 发表于 2016-8-23 07:04
先编译fortran程序生成exe文件,然后用NCL的系统命令调用exe文件

您好,单独的子程序无法连接成为可执行文件,这个似乎行不通。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-23 08:48:49 | 显示全部楼层
,intent(in) :: 这段去掉
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-23 08:49:40 | 显示全部楼层
把stub中的 ,intent(in) :: 这段去掉,f90可以不去
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-23 09:56:12 | 显示全部楼层
robindct 发表于 2016-8-23 08:49
把stub中的 ,intent(in) :: 这段去掉,f90可以不去

谢谢,改动这点后,确实可以成功运行了。我看了手册,这里确实没有intenet(in)属性,谢谢啦。这样来说,是需要声明各个参数的类型即可,不需要intent(in),intent(out)这些属性是吗?另外,我看论坛说,如果是字符串传递,长度需要设定为*。除过这两点,是否有其他需要注意的地方?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-23 11:05:19 | 显示全部楼层
其实在我的理解(个人理解,不一定正确),stub就是一个接口文件,是按照一定声明规则给ncl预留接口用的,而对于ncl并不能完全解释所有Fortran的声明语句,所以即使stub使用f77规范编写,不代表WRAPIT在解释时,能明白所有Fortran语句。
需要注意的地方,我能想到的是多维数组传递时注意顺序。
还有对于字符串传递时,我在之前的帖子给其他坛友说过,并非一定要传递(*),这里非常值得注意的一点是NCL的字符串对应两种类型,即string和character(字符型数组)两种,在ncl对应的fortran的字符串其实是character。我猜想大概是string应该是类似C中以"\0"或其他字符结尾的(这个仅是猜测,没有找到官方文档的相关解释)。而对于character传递时,则要求等长~~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-23 12:07:09 | 显示全部楼层
robindct 发表于 2016-8-23 11:05
其实在我的理解(个人理解,不一定正确),stub就是一个接口文件,是按照一定声明规则给ncl预留接口用的, ...

好的,谢谢你。我在ncl中调用fortran,因该只是涉及到计算。其他的处理过程都用ncl的一些内部功能解决。再次感谢你的帮助。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-23 14:58:44 | 显示全部楼层
pangzi_xu 发表于 2016-8-23 07:49
调用exe的话参数不能传递

能,fortran也可以用外部参数
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-23 14:59:19 | 显示全部楼层
王磊 发表于 2016-8-23 08:37
您好,单独的子程序无法连接成为可执行文件,这个似乎行不通。

加一个主程序就可以了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表