• 如何在Windows下使用LAPACK和ARPACK [转]


    我最近打算开始学写Fortran程序和使用LAPACK和ARPACK。在学校的Linux上,一个make就搞定了。但是我自己的电脑是 Windows 7系统,什么cmake, nmake的我都试过了,没有一个能够make出来的。网上也有很多Windows下怎么用LAPACK的资料,有的直接给我一个编好的 LAPACK.lib,结果发现不能在gfortran上连接;有的要改Makefile什么的,我觉得都是写给高手看的。所以从前天开始我自己在家里捣 鼓了一个周末,终于弄通了,写个总结在这里做个备忘。希望有情况跟我类似的人会得到帮助。

    一、Fortran 的安装
    我需要一个可以在Window下使用的Fortran编译器。我不喜欢Compaq Fortran 的原因是它调试通过的程序,经常不能在学校的gfortran上面通过;而且它 的编辑器没有 code folding 非常不爽;还有就是太贵买不起。我比较推荐 Simply Fortran编辑器,小巧简单,并自带一个gfortran的编译器(Simply Fortran的安装程序:simplyfortran-1.9-setup.exe), 注册费是25美元。Simply Fortran安装起来以后,在安装目录下的 mingw\bin 这里面就有GNU的编译器 gcc 和 gfortran以及其它一堆有用的工具,这些东西下面会用到。当然如果只想要编译器的话可以直接安装 gfortran (安装程序:gfortran-windows-20110214.exe),安装好了以后编译器在gfortran\bin里面。

    二、LAPACK库的编译
    接下来,我要把LAPACK弄起来。于是我到netlib上下载了最新版本(lapack-3.3.0.tgz),然后解压缩出来。由于我没有BLAS库,所以我想把BLAS和LAPACK一起编译成一个库以后就可以一起用了。具体做法如下:
    1. 打开解压缩文件夹,把lapack-3.3.0\BLAS\SRC里面的所有*.f文件 以及 lapack-3.3.0\INSTALL里面的dlamch.f和slamch.f两个文件 都复制到 lapack-3.3.0\SRC 文件夹里面。复制的时候提示有两个文件是重复的,我选择了不要覆盖。这样BLAS和LAPACK两个库的源文件都在一起了。
    2. 然后cmd进入DOS,先检查path里面有没有 mingw\bin (或者gfortran\bin)。
    E:\lapack-3.3.0>path
    PATH=D:\Program Files\Simply Fortran\fwin\mingw\bin;......
    如果Simply Fortran安装正确的话,应该会自动添加mingw\bin到搜索路径的。如果没有的话就手动添加一下
    E:\lapack-3.3.0>path=D:\Program Files\Simply Fortran\fwin\mingw\bin; %path%
    Simply Fortran的安装目录根据自己情况要修改一下。
    3. DOS进入lapack-3.3.0\SRC目录,用gfortran 开始编译
    E:\lapack-3.3.0>cd SRC
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c *.f -O2
    (等待十几分钟,可以在Windows下看到SRC文件夹里面源源不断地冒出.o文件)
    然后以下文件需要无优化地重新编译
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c slaruv.f -O0
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c dlaruv.f -O0
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c sla_wwaddw.f -O0
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c dla_wwaddw.f -O0
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c cla_wwaddw.f -O0
    E:\lapack-3.3.0\SRC>gfortran -fimplicit-none -g -c zla_wwaddw.f -O0
    我是一行一行执行的……
    4. 用ar 连接成一个库
    E:\lapack-3.3.0\SRC>ar rcs liblapack.a *.o
    这样就在SRC文件夹里得到LAPACK库文件 liblapack.a。

    三、ARPACK库的编译
    先到ARPACK的官方网站去下载程序包,我选择下载了 arpack96.tar.gz 和补丁 patch.tar.gz
    1. 把两个压缩文件分别解压以后,第一步是先打上补丁。复制patch下的ARPACK 粘贴到 arpack96 里面去覆盖同名文件, 在Win7上会提示合并文件夹,选择是,然后会提示复制和替换文件,选择全部替换就行了。
    2. 把 arpack96\ARPACK\BLAS,arpack96\ARPACK\LAPACK 和 arpack96\ARPACK\UTIL 中的 *.f 文件都复制到 arpack96\ARPACK\SRC 里面去。然后有三个源文件需要改动。首先,找到second.f 打开,把里面的内容改成:
          SUBROUTINE SECOND( T )
          REAL T
          CALL CPU_TIME(T)
          RETURN
          END
    保 存。因为原来的程序要调用ETIME来返回时间,但是连接的时候会出错提示找不到ETIME。我看了一下gfortran 里好像是用 CPU_TIME 来计时的,所以就改过来。还有就是 dnrm2.f 和 snrm2.f 使用了ASSIGN statement, 这个语句在Fortran 95 的标准里面已经被删除了,所以gfortran 不能编译这两个文件。因此,需要到netlib上下载它们的更新版本: dnrm2.fsnrm2.f 并替换旧版文件。
    3. 接下来编译ARPACK和LAPACK基本原理是类似的。用DOS进入 arpack96\ARPACK\SRC 目录,用gfortran 开始编译:
    E:\arpack96\ARPACK\SRC>gfortran -fimplicit-none -g -c *.f -O2
    4. 用ar 连接成一个库
    E:\arpack96\ARPACK\SRC>ar rcs libarpack.a *.o
    这样就在SRC文件夹里得到ARPACK库文件 libarpack.a。

    四、LAPACK的使用
    如果用gfortran直接编译的话,有两种选择。第一种方法,先把liblapack.a和libarpack.a复制到程序源文件的目录下,然后一起编译
    gfortran foo.f90 liblapack.a libarpack.a
    第二种方法是把liblapack.a和libarpack.a复制到 gfortran 所在目录下的 \lib 里面,然后以后编译的时候只要加上 -llapack 或 -larpack的flag就可以了
    gfortran foo.f90 -llapack -larpack
    这个就和Linux下是一样的了。

    在Simply Fortran里面用的话,先确保 liblapack.a和libarpack.a 已经复制到 mingw\lib 里面,然后从Options菜单打开Project Options,在Project Flags的Linkers里面添加 -llapack 或 -larpack 就行了,不过每个project都要设定project flags。注意要用1.11以上版本的Simply Fortran,旧版的Project Flags放置的位置有 bug。

    [转] http://www.douban.com/note/132392388/

  • 相关阅读:
    Java学习8.31
    Java学习8.30
    Java学习8.29
    Java学习8.28
    Java学习8.27
    Java学习8.26
    242. Valid Anagram 有效的字符串
    680. Valid Palindrome II 对称字符串-可删一个字母版本
    151. Reverse Words in a String翻转一句话中的单词
    155. Min Stack 155.最小栈
  • 原文地址:https://www.cnblogs.com/longdouhzt/p/2459753.html
Copyright © 2020-2023  润新知