请选择 进入手机版 | 继续访问电脑版
爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5978|回复: 8

ncl中调用fortran程序生成so文件后无法调用

[复制链接]

新浪微博达人勋

发表于 2016-8-10 16:40:25 | 显示全部楼层 |阅读模式
NCL
系统平台:
问题截图: -
问题概况: ncl中调用fortran程序生成so文件后ncl脚本调用出错
我看过提问的智慧: 看过
自己思考时长(天): 3

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

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

x
用fortran写了一个读取micaps第四类格式的程序(fortran中可以使用),准备在ncl中调用,成功生成了so文件,最后一步ncl脚本中调用时报错(已排除平台问题,ncl官网中的实例能够运行成功)报错如下:
warning:Could not find Init() in external file /home/jxlc/ncl/ncl-fortran/readm490.so, file not loaded
warning:error at line 2 in file test.ncl
ncl脚本第二行:external EX01 "./readm490.so"附上fortran程序,stub文件和ncl脚本
fortran程序:

subroutine readm4(filename,x,y,&
r1h,diamond,num,title,yy,&
mm,dd,starthr,ybhr,level,xspace,yspace,&
startlon,endlon,startlat,endlat,xnum,ynum,&
cint,cstart,cend,smooth,jiacu)
    character(16) filename
    integer x,y,num,yy,mm,dd,starthr,ybhr,level,xnum,ynum
    integer i,j,k,m
    character(8) diamond
    character(40) title
    real r1h(x,y),xspace,yspace,startlon,endlon,startlat,endlat,cint,cstart,cend,smooth,jiacu
    open(10,file=filename,status='old',ERR=111)
    read(10,*) diamond,num,title
    read(10,*) yy,mm,dd,starthr,ybhr,level,xspace,yspace,startlon,endlon,startlat,endlat,xnum,ynum
    read(10,*) cint,cstart,cend,smooth,jiacu
    do i=1,y
      read(10,*) (r1h(j,i),j=1,x)
    enddo
    close(10)
    111 continue
    return
end
相应的readm490.stub文件内容:
C NCLFORTSTART
subroutine readm4(filename,x,y,&
r1h,diamond,num,title,yy,&
mm,dd,starthr,ybhr,level,xspace,yspace,&
startlon,endlon,startlat,endlat,xnum,ynum,&
cint,cstart,cend,smooth,jiacu)
    character(16) filename
    integer x,y,num,yy,mm,dd,starthr,ybhr,level,xnum,ynum
    integer i,j,k,m
    character(8) diamond
    character(40) title
    real r1h(x,y),xspace,yspace,startlon,endlon,startlat,endlat,cint,cstart,cend,smooth,jiacu
C NCLEND
ncl脚本内容如下:

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
external READ "/home/jxlc/ncl/ncl-fortran/readm490.so"
begin
;
; Calculate three values of a quadraticequation
;
  filename="16070108.001"
  x=351
  y=301
  r1h=new((/x,y/),float)
  diamond="20160808"
  num1=1
  yy=1
  mm=1
  dd=1
  starthr=1
  ybhr=1
  level=1
  xnum=1
  ynum=1
  title="20160808"
  xspace=0.1
  yspace=0.1
  startlon=0.1
  endlon=0.1
  startlat=0.1
  endlat=0.1
  cint=0.1
  cstart=0.1

  cend=0.1
  smooth=0.1
  jiacu=0.1
  READ::readm4(filename,x,y,r1h,diamond,num1,title,yy,mm,dd,starthr,ybhr,level,xspace,yspace,startlon,endlon,startlat,endlat,xnum,ynum,cint,cstart,cend,smooth,jiacu) ; Call the NCL version of

end

东西有点乱,请大神指导
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-11 09:57:19 | 显示全部楼层
本帖最后由 robindct 于 2016-8-11 11:53 编辑

刚才的回复有点问题,重新更正了一下


                               
登录/注册后可看大图
我是神奇分割线

                               
登录/注册后可看大图



有两个问题你需要解决:
1、stub文件必须使用f77格式声明;
2、stub声明部分, 对于数组,ncl向fortran传递时会发生转置,所以要注意(x,y) --> (y,x) 的变换。对于字符串,ncl有string和character(字符型数组)两种,所以要注意ncl和fortran数据类型对应关系。建议使用ncl传递string,在stub声明character*(*)。如果ncl一定要传递character,那么一定要注意数组的size必须一致。

我手头没有Micaps第四类数据,建议楼主发一个样例文件,以便测试
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-11 10:22:38 | 显示全部楼层
非常感谢!
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2016-8-11 10:58:35 | 显示全部楼层

更正了一点小错误,敬请参考
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-11 11:15:55 | 显示全部楼层
添加个micaps第四类文件供大神测试

16070108.001

949.88 KB, 下载次数: 2

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

新浪微博达人勋

 楼主| 发表于 2016-8-11 11:21:37 | 显示全部楼层
robindct 发表于 2016-8-11 09:57
刚才的回复有点问题,重新更正了一下

我是神奇分割线

感谢回复,收获良多,能不能对f77格式不太熟悉,能不能贴一个stub样本,非常感谢
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-8-11 11:52:11 | 显示全部楼层
根据你的stub修改,仅供参考~~

C NCLFORTSTART
      subroutine readm4(filename,x,y,
     $ r1h,diamond,num,title,yy,
     $ mm,dd,starthr,ybhr,level,xspace,yspace,
     $ startlon,endlon,startlat,endlat,xnum,ynum,
     $ cint,cstart,cend,smooth,jiacu)
        character*16 filename
        integer x,y,num,yy,mm,dd,starthr,ybhr,level,xnum,ynum
        integer i,j,k,m
        character*8 diamond
        character*40 title
        real r1h(x,y)
        real xspace,yspace,startlon,endlon,startlat,
     $   endlat,cint,cstart,cend,smooth,jiacu
C NCLEND
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-8-11 13:22:55 | 显示全部楼层
robindct 发表于 2016-8-11 11:52
根据你的stub修改,仅供参考~~

C NCLFORTSTART

非常感谢,根据你的stub,问题解决了!
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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