爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 9872|回复: 6

怎么查看ncl函数源代码

[复制链接]

新浪微博达人勋

发表于 2018-4-8 11:42:29 | 显示全部楼层 |阅读模式

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

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

x
最近在做统计分析时用到了计算均方根误差的函数dim_rmsd,这个函数计算的结果和其他方法的得到了结果有一点出入。所以想查看这个函数的源代码是什么写的,看了$NCARG_ROOT/lib/ncarg/nclscripts/csm下的函数库文件,没有找到想要的结果。不知道在哪里可以查看该函数的源代码,希望知道的朋友能够说一下,谢谢。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-4-8 12:47:32 | 显示全部楼层
本帖最后由 packard 于 2018-4-8 14:14 编辑

你说的函数是用Fortran和C编译好的,涉及以下文件,尤其是最后的那个文件。(rmsd.f 附在帖子最后)
[packard@rcnx01 ~]$ gncl dim_rmsd
/n/home05/packard/sw/ncl-6.4.0/lib/libnfp.a:statW.o:00000000000051d6 Tdim_rmsd_W
nfp
/n/home05/packard/sw/ncl-6.4.0/source-6.4.0/ni/src/lib/nfp
/n/home05/packard/sw/ncl-6.4.0/source-6.4.0/ni/src/lib/nfp/statW.c
/n/home05/packard/sw/ncl-6.4.0/source-6.4.0/ni/src/lib/nfp/wrapper.c
drmsd
/n/home05/packard/sw/ncl-6.4.0/lib/libnfpfort.a:rmsd.o:0000000000000000 Tdrmsd_
nfpfort
/n/home05/packard/sw/ncl-6.4.0/source-6.4.0/ni/src/lib/nfpfort
/n/home05/packard/sw/ncl-6.4.0/source-6.4.0/ni/src/lib/nfpfort/rmsd.f

/n/home05/packard/sw/ncl-6.4.0/source-6.4.0/ni/src/lib/nfpfort/rmsd.f:2:      SUBROUTINE DRMSD(X,Y,NPTS,XMSG,YMSG,XYRMSD,NPTUSE,IER)

原装的 rmsd.f 在官网上的ncl 源代码包(不是precompiled 预编译的),如: https://www.earthsystemgrid.org/ ... _ncarg-6.4.0.tar.gz
我这里把它解压(tar -zxvf ncl_ncarg-6.4.0.tar.gz)到了 source-6.4.0/

以上搜索结果,是用我写的自动搜索代码产生的,代码在以下帖子:
http://bbs.06climate.com/forum.php?mod=viewthread&tid=58871
(原来我的代码搜索这个函数时有个bug,现在修复了,所以也谢谢你的提问。)

C NCLFORTSTART
      
SUBROUTINEDRMSD(X,Y,NPTS,XMSG,YMSG,XYRMSD,NPTUSE,IER)
      
IMPLICITNONE
c
c NCL:    rmsd =dim_rmsd(x,y)
c         interface mustchk that the length of x and y are the same
c                                         input
      
INTEGERNPTS
      
DOUBLE PRECISIONX(NPTS),Y(NPTS),XMSG,YMSG
c                                         output
      
INTEGERNPTUSE,IER
      
DOUBLE PRECISIONXYRMSD
C NCLEND

c this routine will calculate estimates of the first two  moments
c .   of the vector xcontaining missing data.

c input arguments:
c .   x,y      - input vectors
c .   npts     - length of x and y
c .   xmsg,ymsg- missingcode: if there are no msg values
c .                           set xmsg to some value which will
c .                           not be encountered.

c output arguments:
c .   xyrmsd   - root-mean-square-difference
c .   nptuse  - no. of points used to calculate theestimates
c .   ier      - if (ier.ne.0) an error has occurred

c note :
c .   uncalculatedquantities are set to xmsg (nptuse set to zero)

      
INTEGERN
      
DOUBLE PRECISIONRN

      NPTUSE
=0
      XYRMSD
=XMSG

      
IF(NPTS.LT.1) THEN
          IER
=1
         
RETURN
      
END IF

      IER
=0
      XYRMSD
=0.D0
      RN
=0.D0
      
DON = 1,NPTS
         
IF(X(N).NE.XMSG .AND.Y(N).NE.YMSG) THEN
              RN
=RN + 1.0D0
              XYRMSD
=XYRMSD + (X(N)-Y(N))**2
         
END IF
      
END DO

      NPTUSE
=RN

      
IF(RN.GT.0.D0) THEN
          XYRMSD
=SQRT(XYRMSD/RN)
      
ELSE
          XYRMSD
=XMSG
C error code for all msg values
          IER
=2
      
END IF

      
RETURN
      
END
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2018-4-8 17:13:20 | 显示全部楼层
之前我就运行层主过的脚本,不过出现了错误。当时我以为是跟版本有关(我用的是6.2.0,下载的源代码包也是6.2.0,并改了相应的路径)。由于接触shell脚本和正则的时间不久,所以不能够完全理解你脚本中的意思。现在运行更新后的脚本,已经可以查找到函数的源代码。感谢你的指导!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-4-8 23:22:59 | 显示全部楼层
今朝几朵白云生 发表于 2018-4-8 17:13
之前我就运行层主过的脚本,不过出现了错误。当时我以为是跟版本有关(我用的是6.2.0,下载的源代码包也是6 ...

再次感谢你发现这个bug。这个代码还在测试阶段,可能还有若干bug。。
使用什么版本的ncl,就下载什么版本的ncl源代码,这个是对的。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-4-10 20:21:28 | 显示全部楼层
{:eb502:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2019-9-4 16:27:58 | 显示全部楼层
本帖最后由 summerson 于 2019-9-4 16:29 编辑

赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2019-9-23 09:58:47 | 显示全部楼层
谢谢两位的帖子
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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