FORTRAN静态库的生成、维护与调用

FORTRAN静态库的生成、维护与调用 (2010-04-15 10:45:59)转载
标签: 杂谈
FORTRAN静态库的生成、维护与调用
一、FORTRAN静态库的生成与维护
FORTRAN 静态库是经过编译的代码块,它与主程序相对独立,可以被主程序调用,是FORTRAN工程类型之一. 静态库包含一系列子程序,但不包括主程序. 静态库一般具有LIB扩展名并包含目标代码,且静态库存放在它们特定的目录中. FORTRAN静态库在组织大型程序和在不同程序之间共享子程序等方面具有较大的优点,其重要性不言而喻. 当将静态库与主程序联系起来时,在主程序中调用静态库中的任何子程序将编译到相应的可执行程序. 应用静态库的时候,只有所需要的子程序才在编译过程中插入到可执行文件(.EXE),这意味着这种可执行文件将比包含所有的子程序所生成的可执行文件小. 而且,不必担心哪些子程序是需要的,哪些是不需要的,编译器将替你做出选择. 同时,当更改静态库中的子程序时,相应的应用程序可以不做任何改变,而只需要对其进行重新的编译链接,即可获得新的结果,这无疑也是方便的.
目前,常用的FORTRAN静态库有很多种,WINDOWS操作系统下的Compaq Visual FORTRAN version 6.5(简称CVF65)自带的数学统计库IMSL就是一个非常全面的静态库,可以用来解决线性代数和统计学上的很多经典问题. 此外,在NCAR互联网站有很多有用的FORTRAN子程序(网址:https://www.360docs.net/doc/6a14764973.html,/softlib/mathlib.html),其中包括地球物理科学问题、离散和快速Fourier变换、可分离的椭圆微分方程、插值、Legendre多项式、普通数学问题、本征值问题求解、线性方程求解、非线性方程求解、常微分方程求解、特殊函数、统计学等常用子程序集等. 这些FORTRAN子程序可以解决很多基础性的问题,因此有很高的利用价值.
在WINDOWS操作系统下,可以用两个命令分别生成静态库. 一个是用‘nmake’命令,它一般用来编译原来应用在UNIX环境下的FORTRAN子程序集,在编译过程中要读取makefile文件中的编译命令,类似于在UNIX下安装软件. 另一个是用‘lib’命令,它可以在WINDOWS环境下编译任何需要集成为静态库的子程序集.
编译静态库在DOS命令行环境下比较方便,以后的命令行都指在此环境下运行. 在编译静态库前,首先要安装CVF65,其次要完成要编译的FORTRAN子程序(*.f90). 对于FORTRAN子程序,最好用FORTRAN90的标准来完成,应该放弃FORTRAN77标准。FORTRAN90是FORTRAN语言从结构化走向面向对象化的重要一步,使FORTRAN语言更加接近C++。在FORTRAN90标准中,对数组的操作既增强了功能又简化了使用,此外自由格式、MODULE、动态数组、指针等的应用大大丰富了FORTRAN语言

,使得编程更加轻松。目前,FORTRAN95和FORTRAN2000标准也在应用,它们与FORTRAN90标准比较类似,主要的改进在并行运算方面,因此目前在单机上应用的主要还是FORTRAN90. 在DOS命令行环境下,进入到FORTRAN子程序所在的子目录,然后按下面两个步骤生成FORTRAN静态库.
(1)键入“df *.f90 /c”,回车,可以看到CVF65编译器对所有的FORTRAN子程序(*.f90)进行编译,生成*.obj文件(注意,编译时,/c中的“c”必须小写).
(2)键入“lib *.obj /out:libname.lib”,回车,可以看到链接生成libname.lib静态库.
需要注意的是,每次加入新的子程序或对静态库中的子程序修改以后,都要按上述两个步骤重新进行编译链接. 生成静态库以后,可用“dumpbin /linkermember libname.lib”来查看静态库中可用的子程序名称. 也可执行“lib /list libname.lib”来查看静态库中的*.obj文件.
当然,也可以在CVF65集成环境下,生成静态库. 步骤如下:
(a)进入到CVF65集成环境下,依次打开菜单File | New | FORTRAN Static Library. 为新的静态库命名,如:libname.lib.
(b)依次打开菜单Project | Add to Project | Files,选择要编译的*.f90子程序到当前工作空间.
(c)依次打开菜单Build | Compile和Build | Build进行编译链接,生成libname.lib静态库(在当前目录中的debug子目录下).
当要编译的静态库需要其它静态库支持时,在步骤(b)中将支持库(*.lib)也加入到当前工作空间,即可顺利编译新的静态库.
从上面的介绍可以看出,无论采用哪种方法,其基本步骤是一致的,即首先生成目标文件*.obj,然后再将这些文件链接成一个静态库文件*.lib. 对于简单的静态库可以按第一种方法在DOS环境下生成,对于需要其它静态库支持的子程序集则可以首先加入库的路径,再在编译时链接这些静态库,最后生成静态库文件.
静态库生成以后还要经常进行更新和维护,以便更有效的利用这些资源. 下面给出维护静态库时常用的命令.
(Ⅰ)将一个编译好的obj文件(如:ok.obj)加入到现有静态库(如:libname.lib),命令为“lib ok.obj libname.lib /out:libname.lib”.
(Ⅱ)将两个或多个静态库合并成一个(all.lib),命令为“lib 1.lib 2.lib 3.lib /out:all.lib”,或“lib *.lib /out:all.lib”.
(Ⅲ)列出静态库中的成员(MEMBER),成员对大小写敏感,命令为“lib libname.lib /list:[outputfilename]”,可给出静态库中的成员,即*.obj.
(Ⅳ)从静态库中解出(extract)特定成员,命令为“lib libname.lib /extract:member”.
(Ⅴ)从库中删除成员,命令为“lib libname.lib /remove:member”.

二、FORTRAN静态库的调用
FORTRAN静态库的调用主要有两种方式,第一种方式是在DOS环境下用命令

行调用,其基本命令为“df *.f *.lib”,值得注意的是,在此种情况下,要设置合适的搜索路径(修改CVF65目录下的子目录bin中的文件dfvars.bat),也可以直接将自己的静态库拷贝到CVF65默认库目录下(CVF65根目录下的子目录lib中). 第二种方式是在CVF65环境下调用. 在此方式下有两种方法:方法一:首先对主程序进行编译,然后将静态库文件插入到当前工作空间(参考第一节步骤(b)),再进行链接,即可获得可执行文件. 方法二:对主程序编译后,依次打开菜单Project->settings…在对话框中选择Link选项卡,在Object/library models项下加入静态库文件的名字,再进行链接,同样可以获得可执行文件.
上面所述的两种方法都比较麻烦。下面介绍在FORTRAN90语言环境中应用MODULE来解决这一问题。首先建立一个F90的module程序,名字为userlibmod.f90,对所有静态库中的子程序在此module程序中加入接口语句。其基本结构如下(为便于叙述,在每行都加了行号,源程序中应无此行号):
1. MODULE userlibmod
2. !DEC$OBJCOMMENT LIB:'LIBNAME.LIB'
3. interface sumab
4. subroutine int_sumab(a,b,c)
5. integer a,b,c
6. …
7. end subroutine int_sumab
8. subroutine real_sumab(a,b,c)
9. real a,b,c
10. …
11. end subroutine real_sumab
12. end interface sumab
13. INTERFACE
14. SUBROUTINE CALENDAR(IY1,IM1,ID1,IY2,IM2,ID2,IUNITS,NDAYS)
15. INTEGER,INTENT(IN):: IY1,IM1,ID1,IY2,IM2,ID2,IUNITS
16. INTEGER,INTENT(OUT):: NDAYS
17. …
18. END SUBROUTINE CALENDAR
19. END INTERFACE
20. END MODULE
从这个module的结构可以看出,第1行要给出module的名字,最好与文件名相同。第2行告诉编译器要链接的静态库的名字(这里虽然看似注释语句,其实不是,此行可以在编译的过程中与编译器进行通讯,不能省略,不然可能造成编译错误)。3到12行是一个有名接口语句,这里边有两个子程序(对整数和实数分别求和)。我们可以用两个子程序名来分别调用对应的两个数求和,也可以用接口名来直接调用这两个子程序,当用接口名来调用时,如果输入的参数是整数,相当于调用int_sumab(a,b,c),如果输入的参数是实数,相当于调用real_sumab(a,b,c)。所以在F90语言中,可以简化调用函数的个数。13到19行定义了另外一个无名接口,接口中也可以加入多个类似14行到18行的子程序或函数,这些子程序或函数必须已经编译到静态库“LIBNAME.LIB”中。20行是module的结束语句。
将编辑好的module程序存盘,在命令行下执行“ df userlibmod.f90 /c”,即可生成MOD文件“userlibmod.mod”。将此MOD文件放入合适的地方,如“ d:/myforlib/include/”,再将生

成的静态库文件放入相应的路径,如“d:/myforlib/lib/”,则一个自己的静态库就建成了。
为了应用此静态库,首先要对CVF65设置合适的搜索路径。打开CVF65集成环境,依次打开菜单“tools | options | directories”,在show directories for下拉菜单中依次点击“include files”和“library files”,然后再下面的“directories”中在空白处依次将“ d:/myforlib/include/”和“d:/myforlib/lib/”加入,点击“ok”按钮,即完成了对搜索路径的设置。现在,就可以方便的调用静态库中的子程序或函数了,只需要在你自己的主程序中第一行加入如下语句“use userlibmod”即可(如果第一行是“program yourprogramname”,则将其加入到此行的下一行)。

三、其它说明
如果你应用的FORTRAN编译器是INTEL VISUAL FORTRAN 9.0 (IVF)以上的版本,可以按照和上面的过程类似的方法来生成静态库,唯一的区别是编译命令不同,IVF用ifort命令进行编译,而lib命令是一致的;此外,对于IVF路径的设置是ifortvars.bat文件,其它的内容都是类似的。需要注意的是,由于采用了不同的编译器,CVF和IVF编译的静态库一般不能共享,需要重新编译。
作者已经发布了自己编译的FORTRAN静态库软件WHIGG F90 LIB(WFL),可以从https://www.360docs.net/doc/6a14764973.html,/yanhm/wfl.htm访问。


Part 2: Using LAPACK subroutines in a Visual Studio INTEL FORTRAN Project
Download the LAPACK precompiled binaries. File names of the precomputed debug libraries end with the letter "d" e.g. BLASd.lib and LAPACKd.lib (in comparison to the release versions BLAS.lib and LAPACK.lib).
Locate your BLAS libraires for your machine. (You may want to choose the Debug config if you choose GOTOBLAS)
Download the LAPACK-VS-Example Visual Studio project and unzip
Move or Copy the libraries from step 1 in the LAPACK-VS-Example folder.
If you are not using the Reference BLAS, you will need to modify change the properties "Linker > General > Additional Library Directory" to tell Visual Studio where the libraries are, and also add the name of your BLAS library in "Linker > Input > Additional Dependencies"
Compile the project and run the resulting executable. You should get the output:



[原创]Windows下也可以编译lapack的静态连接库了

1、Lapacke3.0的编译
今天去lapack的国内镜相网站https://www.360docs.net/doc/6a14764973.html,/lapack/上,发现提供了WINDOWS版本的lapack及编译配置文件,下载地址
https://www.360docs.net/doc/6a14764973.html,/lapack/lapack-pc.zip
https://www.360docs.net/doc/6a14764973.html,/lapack/lapack-pc-df.zip
我用了后来一个,还不知道两个有什么区别。
下载后解压,比较解压路径为G:\lapack。需要修改里面的make.inc文件:
1、修改里面的 HOME = G:\lapack 你解压的文件夹
2、如果用CVF编译的话FORTRAN = df这一个不需要改,如果用IVF编译的话,改为FORTRAN =

ifort
3、修改优化级别OPTS = -optimize:5,默认为2

在makefile文件里把include 这一行头上的叹号注释去掉

然后,点开始菜单里的运行,输入cmd回车后改更路径到G:\lapack,然后输入nmake回车后开始编译,结束后在这个文件夹下就会有三个LIB库文件了。

在DOS提示符下输入nmake blas_testing可对blas进行测试,输入nmake testing可对lapack进行测试,输入nmake timing测试计算时间。

上面是从国内镜像站点下的是3.0版的。

2、Lapacke3.1.1的编译

再来说一下3.1.1版的,这里要感谢f2003提供的源文件,下载地址:https://www.360docs.net/doc/6a14764973.html,/maths/fortran/netlib/

下载后解压一下,在目录内有一个环境变量配置文件set_environment.bat,需要在DOS提示符下输入
set_environment.bat /? 回车
就会提示输入参数了,如果你需要编译的库文件运行在X86(也就是32位机),fortran编译器是IVF,且需要编译blas库,则在DOS提示符下输入
set_environment.bat X86 Intel
如果是要运行在64位机上,可以用
set_environment.bat X64 Intel

然后去看一下makefile文件里的include make.inc这一行是不是被注释了,如果是,解除注释。在这之后可以在DOS提示符下输入nmake即开始编译库文件,结束后会在当前文件夹下生成三个库文件:blas_WIN32.lib,lapack_WIN32.lib,tmglib_WIN32.lib

如果是要用CVF编译,则需要在执行set_environment.bat X86 Intel之后去修改make.inc里的编译器。
主要修改:将里面两个ifort.exe换成df.exe,然后将优化选项改为OPTS = /optimize:5。
记住:一定要在执行完set_environment.bat X86 Intel之后再去修改,因为编译时会用到要一些环境变量,这些环境变量需要由set_environment.bat这个批处理文件来生成,而且在执行这个批处理文件时它从install文件夹下CIPY了一个inc文件来覆盖解压目录下的make.inc。我一开始没注意这个批处理文件,老是生成不成blas库,后来直接到blas目录下去生成blas库后,测试时老提示找不到blas库,需要将这个库COPY到测试目录下才行,很烦。

另外两点建议:
1、建议大家在执行完set_environment.bat X86 Intel后根据自己电脑配置修改make.inc里的优化参数以达到最优性能;
2、建议在编译时先用nmake lib来生成库文件,然后考虑是否进行测试,因为测试可能需要更长的时间。

后来又用CVF编译了一次,发现CVF编译出来库要比IVF编译出来的文件小一点。

Qhull:Qhull是一款三维凸包软件,它可以读取从stdin点设置,然后输出的最小凸集,它包含指向标准输出
请问谁会使用qhull库求三维网格模型的凸包。
我正在做一个算法,要求解一个三维网格模型的凸包。但我对qhull的说明书理解不清楚,没有办法将它与我的程序对接。

特像高手求教!


-结构网格和非结构网格之概念篇 [复制链接]

对于连续的物理系统的数学描述,如航天飞机周围的空气的流动,水坝的应力集中等等,通常是用偏微分方程来完成的。为了在计算机上实现对这些物理系统的行为或状态的模拟,连续的方程必须离散化,在方程的求解域上(时间和空间)仅仅需要有限个点,通过计算这些点上的未知变量既而得到整个区域上的物理量的分布。有限差分,有限体积和有限元等数值方法都是通过这种方法来实现的。这些数值方法的非常重要的一个部分就是实现对求解区域的网格剖分。


网格剖分技术已经有几十年的发展历史了。到目前为止,结构化网格技术发展得相对比较成熟,而非结构化网格技术由于起步较晚,实现比较困难等方面的原因,现在正在处于逐渐走向成熟的阶段。下面就简要介绍一些这方面的情况。


1.1结构化网格


从严格意义上讲,结构化网格是指网格区域内所有的内部点都具有相同的毗邻单元。结构化网格生成技术有大量的文献资料[1,2,3,4]。结构化网格有很多优点:

1.它可以很容易地实现区域的边界拟合,适于流体和表面应力集中等方面的计算。

2.网格生成的速度快。

3.网格生成的质量好

4.数据结构简单

5.对曲面或空间的拟合大多数采用参数化或样条插值的方法得到,区域光滑,与实际的模型更容易接近。

它的最典型的缺点是适用的范围比较窄。尤其随着近几年的计算机和数值方法的快速发展,人们对求解区域的复杂性的要求越来越高,在这种情况下,结构化网格生成技术就显得力不从心了。

结构化网格的生成技术只要有:

代数网格生成方法。主要应用参数化和插值的方法,对处理简单的求解区域十分有效。
PDE网格生成方法。主要用于空间曲面网格的生成。

1.2非结构化网格

同结构化网格的定义相对应,非结构化网格是指网格区域内的内部点不具有相同的毗邻单元。即与网格剖分区域内的不同内点相连的网格数目不同。从定义上可以看出,结构化网格和非结构化网格有相互重叠的部分,即非结构化网格中可能会包含结构化网格的部分。

非结构化网格技术从六十年代开始得到了发展,主要是弥补结构化网格不能够解决任意形状和任意连通区域的网格剖分的缺欠.到90年代时,非结构化网格的文献达到了它的高峰时期.由于非结构化网格的生成技术比较复杂,随着人们对求解区域的复杂性的不断提高,对非结构化网格生成技术的要求越来越高.从现在的文献调查的情况来看,非结构化网格生成技术中只有平面三角形的自动生成技术比较成熟(边界的

恢复问题仍然是一个难题,现在正在广泛讨论),平面四边形网格的生成技术正在走向成熟。而空间任意曲面的三角形、四边形网格的生成,三维任意几何形状实体的四面体网格和六面体网格的生成技术还远远没有达到成熟。需要解决的问题还非常多。主要的困难是从二维到三维以后,待剖分网格的空间区非常复杂,除四面体单元以外,很难生成同一种类型的网格。需要各种网格形式之间的过度,如金字塔形,五面体形等等。

非结构化网格技术的分类,可以根据应用的领域分为应用于差分法的网格生成技术(常常成为grid generation technology)和应用于有限元方法中的网格生成技术(常常成为mesh generation technology),应用于差分计算领域的网格要除了要满足区域的几何形状要求以外,还要满足某些特殊的性质(如垂直正交,与流线平行正交等),因而从技术实现上来说就更困难一些。基于有限元方法的网格生成技术相对非常自由,对生成的网格只要满足一些形状上的要求就可以了。

非结构化网格生成技术还可以从生成网格的方法来区分,从现在的文献资料所涉及的情况来看,主要有以下一些生成方法:

对平面三角形网格生成方法,比较成熟的是基于Delaunay准则的一类网格剖分方法(如Bowyer-Watson Algorithm和Watson’s Algorithm)和波前法(Advancing Front Triangulation)的网格生成方法。另外还有一种基于梯度网格尺寸的三角形网格生成方法,这一方法现在还在发展当中。基于Delannay准则的网格生成方法的优点是速度快,网格的尺寸比较容易控制。缺点是对边界的恢复比较困难,很可能造成网格生成的失败,对这个问题的解决方法现在正在讨论之中。波前法(Advancing Front Triangulation)的优点是对区域边界拟合的比较好,所以在流体力学等对区域边界要求比较高的情况下,常常采用这种方法。它的缺点是对区域内部的网格生成的质量比较差,生成的速度比较慢。

曲面三角形网格生成方法主要有两种,一种是、直接在曲面上生成曲面三角形网格;另外一种是采用结构化和非结构化网格技术偶合的方法,即在平面上生成三角形网格以后再投影到空间的曲面上,这种方法会造成曲面三角形网格的扭曲和局部拉长,因此在平面上必须采用一定的修正技术来保证生成的曲面网格的质量。

平面四边形网格的生成方法有两类主要的方法。一类是间接法,即在区域内部先生成三角形网格,然后分别将两个相邻的三角形合并成为一个四边形。生成的四边形的内角很难保证接近直角。所以在采用一些相应的修正方法(如Smooth, add)加以修正。这种方法的优点是首

先就得到了区域内的整体的网格尺寸的信息,对四边形网格尺寸梯度的控制一直是四边形网格生成技术的难点。缺点是生成的网格质量相对比较差,需要多次的修正,同时需要首先生成三角形网格,生成的速度也比较慢,程序的工作量大。

另外一类是直接法,二维的情况称为铺砖法(paving method)。采用从区域的边界到区域的内部逐层剖分的方法。这种方法到现在已经逐渐替代间接法而称为四边形网格的主要生成方法。它的优点是生成的四边形的网格质量好,对区域边界的拟合比较好,最适合流体力学的计算。缺点是生成的速度慢,程序设计复杂。空间的四边形网格生成方法到现在还是主要采用结构化与非结构化网格相结合的网格生成方法。

三维实体的四面体和六面体网格生成方法现在还远远没有达到成熟。部分四面体网格生成器虽然已经达到了使用的阶段,但是对任意几何体的剖分仍然没有解决,现在的解决方法就是采用分区处理的办法,将复杂的几何区域划分为若干个简单的几何区域然后分别剖分再合成。对凹区的处理更是如此。

六面体的网格生成技术主要采用的是间接方法,即由四面体网格剖分作为基础,然后生成六面体。这种方法生成的速度比较快,但是生成的网格很难达到完全的六面体,会剩下部分的四面体,四面体和六面体之间需要金字塔形的网格来连接。现在还没有看到比较成熟的直接生成六面体的网格生成方法。

其它的网格生成方法:
二维到三维投影的网格生成方法:对比较规则的三维区域,首先在平面上生成三角形或四边形网格然后在Map到三维的各个层面,连接各个层面就生成了三维的网格剖分。这种方法目前应用非常广泛。


建筑设备工程》课程 复习题答案:

https://www.360docs.net/doc/6a14764973.html,/view/a274d436eefdc8d376ee3251.html?from=rec&pos=0&weight=7&lastweight=2&count=5


Gmsh和enGrid是两个基于tetgen和netgen 的开源的有界面的软件~都是划分体网格的~划分体网格的问题很容易的~还有跟牛的技术叫做曲边德劳奈~网格数量又少,效果又好,呵呵呵~搜索这些关键字再说吧~curvilinear mesh有个比较好实施的方法,可以去找找你们的图书馆~很薄的一本书,北航编的,机械学院的一硕士生做的~

相关文档
最新文档