回 帖 发 新 帖 刷新版面

主题:[原创]IMSL在IVF中的安装和应用(Windows系统)

IMSL在IVF中的安装和应用 (Windows系统)
-----------------------------------------------------

1. IMSL在IVF中的安装
2. IMSL在IVF中的调用
3. 其它程序库的调用

-----------------------------------------------------


1. IMSL在IVF中的安装

1) 如果是IVF pro版本自带的IMSL,直接安装就OK.可以直接阅读第2部分。

2) 如果是手动安装,IVF与IMSL版本不同,要注意以下问题
        
    a) 首先,安装IMSL到缺省目录 (不同的版本,目录可能不同)
       例如,IMSL5.0的安装路径是C:\Program Files\VNI\CTT6.0\
    
    b)如果是在IDE环境下调用IMSL,那么需要首先设置IMSL在IVF中
      的搜索路径,其设置方法为:
    
      设置步骤:  

        (1) 打开IVF9.*/10.* in Visual studio .net 2003/2005 IDE;

        (2) 打开菜单 Tools|options...

        (3) 选择左侧的 ”Intel(R) Fortran“ ,再选”Gerneral“或是”compiler“,
            然后在右侧找到 "Project Directories"或是“compiler Selection”.
            然后在下面你可以看到 "Libraries" 和 "Includes". 
            点击右侧的 "..." 在Includes打开窗口中输入IMSL的include搜索路径,
            在Libraries打开的窗口中输入IMSL的lib搜索路径
 
            对于IMSL5.0,其include路径为:
            C:\Program Files\VNI\CTT6.0\include\IA32
            C:\Program Files\VNI\CTT6.0\include\IA32_s
            其lib路径是:
            C:\Program Files\VNI\CTT6.0\lib\IA32
 
            如果是其他版本,也请查找类似目录。在include和lib目录下的某个目录,
            一般说,include某个目录下应该有很多*.mod文件,在lib的某个目录下有很多
            *.lib或*.dll文件,这就是正确的路径所在。

        (4)选择“ok”,完成设置。


  c)如果需要在命令行的方式下调用IMSL,且IVF的版本与IMSL的版本不一致,
     则需要手动进行如下修改:

        (1) 首先找到ifortvars这个IVF的设置文件,例如:
            C:\Program Files\Intel\Compiler\Fortran\10.1.011\IA32\Bin\ifortvars.bat

        (2) 用文本编辑器打开这个文件,你会找到类似的一行:
            if exist "%FNL_DIR%\IA32\bin\fnlsetup.bat" call "%FNL_DIR%\IA32\bin\fnlsetup.bat"
            这个句子的目的是查找IMSL的目录下是否有fnlsetup.bat这个文件,如果有的话,就执行它。
            当然,不同的IVF版本,这一行可能有差别,我这里给出的是10.1.011版本的内容。

            如果你不是对应的IMSL版本,可能不存在fnlsetup.bat这个文件,例如在IMSL5.0的安装目录下存在
            C:\Program Files\VNI\CTT6.0\ctt\bin\cttsetup.bat 这个文件。那么你就需要更改ifortvars.bat
            里面的内容,从而调用正确的bat文件。例如,IMSL5.0在IVF10.1.011下,要在ifortvars.bat文件中
            加入下面一行
            if exist "C:\Program Files\VNI\CTT6.0\ctt\bin\cttsetup.bat" call "C:\Program Files\VNI\CTT6.0\ctt\bin\cttsetup.bat " IA32
            这样就可以正确在命令行方式下调用IMSL了。
            
---------------------------------------------------------------------------------------------------------------------------------------------------------------            

2. IMSL在IVF中的调用

1)找到IMSL中合适的函数或子程序(在开始菜单中,安装IMSL的目录下会找到一个pdf文件,里面是IMSL的说明文件,包括函数和子程序的
   详细信息,并有例子)

2)在自己的程序中调用IMSL. 首先在IVF的帮助文档中“index”选项卡下输入IMSL,就可以看到
   Using from the Command Line
   Using from IDE
   这两项主要内容,请仔细阅读这个部分。一般情况下,调用IMSL需要注意两个地方:
    a) 加入 INCLUDE 'link_fnl_static.h' 或是类似的语句在你的主程序中,不同的库函数选用不同的*.h文件
    b) 加入合适的use 语句,例如
       use IMSL 
       use lin_sol_gen_int
       use rand_gen_int
       use error_option_packet
       等,你可以在IMSL的帮助文档中看到如何应用合适的use 语句
    c) 在主程序中call IMSL中的functions或是subroutines
    d) 编译,链接,得到执行程序。

3)在命令行中调用和编译:
   首先在command窗口中执行ifortvars这个命令,如果不能执行,请直接从开始菜单中的IVF目录下面直接运行这个程序(Build Environment for applications running on IA-32),
   或是将此文件所在的目录写入path环境变量,使其可以执行。
   然后用ifort命令对你的主程序进行编译即可。


---------------------------------------------------------------------------------------------------------------------------------------------------------------

3. 其它程序库的调用
   学会了IMSL的调用,其实其他的程序库如CXML,LAPACK, BLAS, WFL等在IVF下的调用都是类似过程,即主要要设置好include和lib的路径,使得编译器
   可以找到需要包含的mod文件和链接的lib文件,这个过程大同小异。



-----------------------------------------------------
Good Luck!

Addison
2008.01.05

注意:上述内容可以自由转载,请保持信息完整,并不做任何修改。

Qusetions and Suggestions: addison0220_cn .AT. sina.com  


回复列表 (共12个回复)

11 楼

一个关于IMSL的问题

在IVF9.1和IMSL5.0,编译DLL出现问题。为了编译通过,必须设置:
在项目->属性->FORTRAN->External Procedures->Call Convention中必须使用Default选项,编译很顺利,但是这样编译出来的Dll不能被调用,(我试过了,比如VB,Borland C++Builder中调用即报错).如果我在上述位置选择其它选项时比如CVF,则编译时提示IMSL中的函数不能识别,也就不能编译成功。

另外,如果不使用IMSL,则可以在上述设置中选择CVF,或者STDCALL, REFERENCE选项,这样编译出来的DLL文件即可以在其它程序里面调用,请教高手,能否解释为什么会这样?有没有办法解决这个问题。

程序如下:

subroutine Dll1()

  ! Expose subroutine Dll1 to users of this DLL
  !
  !!DEC$ ATTRIBUTES DLLEXPORT::Dll1
 ! include 'link_f90_dll.h'
  include 'link_f90_static.h'
  !include 'link_f90_static_smp.h'
  use lin_sol_gen_int
  use rand_gen_int
  use error_option_packet
  use lin_sol_lsq_int
  use rand_gen_int
  ! Variables
  implicit none
  integer(8) n,IPATH
  real(8) A(1:2,1:2)
  real(8) B(1:2)
  real(8) X(1:2)
  
  IPATH=1
  A(1,1)=1
  A(1,2)=2
  A(2,1)=3
  A(2,2)=4
  B(1)=1
  B(2)=5
  
  CALL DLSLCG (n, A, n, B, IPATH, X) 
  ! Body of Dll1

end subroutine Dll1

12 楼


为什么我的设置之后,编译运行出现错误,说:无法启动此程序,因为计算机中丢失imsl_dll.dll

我来回复

您尚未登录,请登录后再回复。点此登录或注册