xlnt库如何编译_SUNDIALS库的编译和使用

2023-05-16

1简介

SUNDIALS (SUite of Nonlinear and DIfferential/ALgebraic equation Solvers)是由美国劳伦斯利福摩尔国立实验室(Lawrence Livermore National Laboratory)开发的C语言函数库,主要用于求解大规模非线性微分/代数方程。最新的2.6.x(2015.9.9.)包括以下求解器:

CVODE    solves initial value problems for ordinary differential equation (ODE) systems.

CVODES    solves ODE systems and includes sensitivity analysis capabilities (forward and adjoint).

ARKODE    solves initial value ODE problems with additive Runge-Kutta methods, include support for IMEX methods.

IDA    solves initial value problems for differential-algebraic equation (DAE) systems.

IDAS    solves DAE systems and includes sensitivity analysis capabilities (forward and adjoint).

KINSOL    solves nonlinear algebraic systems.

In addition, SUNDIALS provides a Matlab interface to CVODES, IDAS, and KINSOL, sundialsTB.

其中主要的求解器经过了数十年的不断开发和完善,如下图所示:

8b021e5ac43daabc0c1ea7f5b0870d1d.png

本质上,SUNDIALS将之前开发的FORTRAN函数包进行C翻译而不是C++翻译。根据说明,这种做法有以下几点理由:

First, a general movement away from Fortran and toward C in scientific computing is apparent.

Second, the pointer, structure, and dynamic memory allocation features in C are extremely useful in software of this complexity, with the great variety of method options offered.

Finally, we prefer C over C++ for kinsol because of the wider availability of C compilers, the potentially greater efficiency of C, and the greater ease of interfacing the solver to applications written in Fortran.

SUNDIALS还提供了可选择的并行计算能力。

1编译

1.1准备

Win7 SP1 64位旗舰版。

Visual Studio 2013 SP3 win64,先安装。

SUNDIALS:http://computation.llnl.gov/casc/sundials/download/download.php。

建议下载2.5.0版本(不具有ARKODE求解器),笔者测试时(2015.9.9.),用Cmake编译2.6.0时似乎有一些问题。

Cmake:http://www.cmake.org/download/。

笔者测试时(2015.9.9.),用Cmake 3.3.1。

1.2 Cmake编译SUNDIALS-2.5.0

1.2.1建立工作目录

笔者在C盘根目录建立如下路径:

fae3f8deab714ce56c46e511d8074919.png

即建立C:\sundials路径,并在其中分别建立三个文件夹:sundials-2.5.0-src、sundials-2.5.0-build、sundials-2.5.0-install。其中,sundials-2.5.0-src用于存放SUNDIALS解压缩文件:

640184ae4ba72be723cd3d7c12683816.png

sundials-2.5.0-build存放之后Cmake编译成功生成的VS工程项目文件;

sundials-2.5.0-install存放VS编译生成的函数库文件。

1.2.2 Cmake编译

打开sundials-2.5.0-src中CMakeLists.txt,找到"# Set some variables with info on the SUNDIALS project",将SUNDIALS版本号从2.4.0改为2.5.0,保存,关闭:

faebcfd45181b1be696cf1abb58dc8a8.png

打开Cmake,如图

21f9a6cdf26b7b1ee265389e7da12f6a.png

在"Where is the source code:"右边"Browse Source…"单击浏览到上面建立的sundials-2.5.0-src文件夹;在"Where to build the binaries:"右边"Browse Build…"单击浏览到上面建立的sundials-2.5.0-build文件夹。如图:

f31d1598aee2b5857f1a3111c4b7d6ad.png

单击"Configure",弹出编译器选择界面:

ed3078386e2c25a2f159b71ad95840d4.png

选择"Visual Studio 12 2013 Win64",选取"Use default native compilers",单击"Finish",返回Cmake主界面,等待配置完成:

550e9816b9fb7f06c99392333785db4f.png

应该看到通知框中出现"Configuring done"字样,过程中可能出现Warning。如果出现Error,需按提示查找原因。

其中,红色表示需要确认的选择,例如是不是配置BUILD_CVODE这一项,打钩表示有选择意向,要再次单击"Configure"才能配置。在后面所讲的配置完成后,多次单击"Configure",直到所有红色消除,表示配置完成。

找到"CMAKE_INSTALL_PREFIX"一项,将其路径改为上面建立的sundials-2.5.0-install文件夹路径,即

5280aaa0436e4b87e7bc503242e7f182.png

找到"BUILD_SHARED_LIBS",勾选上;找到"BUILD_STATIC_LIBS",取消勾选。这一操作,将输出动态链接库(SHARED_LIBS,.dll和其对应的.lib);而默认是只输出静态库(STATIC_LIBS,.lib)。笔者选择动态链接库,主要考虑以后可能需要和其他语言混合编程,如C#等,实现SUNDIALS库计算,其他语言做GUI和图形化。

1620e51f1c92c3cacd42452533df8f47.png

找到"EXAMPLES_ENABLE"项,勾选上。这将在sundials-2.5.0-install文件夹中输出样例C文件,便于学习和复用。

efd814662accdba3cebd72fd78b0ba13.png

其它各选项,笔者未做测试,可以看到其中还有诸如"MPI_ENABLE"项可以设置并行计算。

配置好选择项以后,点击"Configure",两次,直到所有红色消除,如下:

445ed83df14e39213a45bf63c5fe6e0b.png

配置完成,单击"Generate",开始向sundials-2.5.0-build文件夹生成按照以上配置产生的VS 2013 Win64 C语言dll工程:

c662a354e2ff7c3b0a10a2439a656539.png

大约2s,看到上图所示"Generating done"字样,生成成功。

关闭CMake。

1.3动态库生成

进到sundials-2.5.0-build文件夹,可看到生成了sundials.sln工程。

a148df7cea5d3afd163cc2809286ec46.png

双击"sundials.sln",打开该工程,在对应的"解决方案资源管理器"中将出现相应的子工程:

838b6198a2771cd1aa0e533d49a7884e.png

其中,有三个子工程的字母全大写,分别是"ALL_BUILD"、"INSTALL"和"ZERO_CHECK"。

重要:请注意所使用的编译方案,在使用编译生成的库时,需要对应相应的配置,否则将出现不能识别dll的错误。

077960336030f3bd3aec5f0a92aebec9.png

右键单击"ALL_BUILD"工程,出现:

183ac579f6d5af119e3b4b2f514ecc34.png

单击"生成",将在sundials-2.5.0-build的各自工程目录文件夹中生成相应的动态链接库,例如cvode的库,找到"C:\sundials\sundials-2.5.0-build\src\cvode\Debug"路径,如下:

d5bf704520845400378563a7525868a2.png

看到,已经生成了sundials_cvode.dll和sundials_cvode.lib。其它各库类似。

1.4动态库安装

生成各库以后,为了便于统一调用方便,源代码提供者另外写了"INSTALL"工程,能将所有使用中需要的头文件(include)和库文件(dll和lib)和案例文件(Example)复制到前面定义的sundials-2.5.0-install文件夹中。

也就是说,当"ALL_BUILD"工程被编译后,sundials-2.5.0-install文件夹仍然是空的;只有将"INSTALL"工程编译后,sundials-2.5.0-install文件夹才被写入对应内容。

右键单击"INSTALL"工程,单击"生成"。成功后,sundials-2.5.0-install文件夹中出现相应文件夹:

056f98190490f004960776a1aab5808a.png

关闭sundials.sln工程。

打开"include" →"cvode",其中头文件如下:

d3c69c7ea673aa6a6f84abee597debe5.png

其他各库的头文件存放在各自文件夹中。

打开"lib"文件夹,其中库文件如下:

c87845e311db5c9fdbf4121c51f303c6.png

各库文件的dll和lib文件都存放在该路径下。

打开"examples"→" cvode"→" serial",cvode库的示例使用C文件存放在该路径,如下:

65bb635f83852182dc3b7a7a40ba14e8.png

其它各库也类似。

重要:将路径"C:\sundials\sundials-2.5.0-install\include"和路径"C:\sundials\sundials-2.5.0-install\lib"添加到系统path环境变量中,完成最终安装。否则,使用过程中,将出现找不到dll的问题。

2试用

2.1样例模型说明

样例模型采用SUNDIALS包提供的文件"cvRoberts_dns.c",其中描述了一个三物料化学反应问题,如下方程组所示:

\[\frac{d{{y}_{1}}}{dt}=-0.04{{y}_{1}}+{{10}^{4}}{{y}_{2}}{{y}_{3}},\]

\[\frac{d{{y}_{2}}}{dt}=0.04{{y}_{1}}-{{10}^{4}}{{y}_{2}}{{y}_{3}}-3\times {{10}^{7}}y_{2}^{2},\]

\[\frac{d{{y}_{3}}}{dt}=3\times {{10}^{7}}y_{2}^{2}.\]

其求解时域为$t\in \left[ 0,4\times {{10}^{10}} \right]$,其初始条件为:

\[{{y}_{1}}\left( 0 \right)=1.0,\]

\[{{y}_{2}}\left( 0 \right)=0.0,\]

\[{{y}_{3}}\left( 0 \right)=0.0.\]

在求解该动态问题的同时,还会利用求根技术,找到${{y}_{1}}={{10}^{-4}}$和${{y}_{3}}=0.01$的时间。

2.2 Console工程

2.2.1空白工程新建

在"C:\sundials"路径下,新建工程目录"SundialsWorks"。

打开VS 2013,新建一个VC++的Win32控制台应用程序"SundialsConsole01",位置选择路径"C:\sundials\SundialsWorks\",如下图:

356d8cff30effd26359a2574335138ce.png

单击"确定","下一步",选择"空项目","完成":

90cabe434b98b4cb22c2d9ce39554dc1.png

保存项目。

2.2.2添加样例C文件

找到路径"C:\sundials\SundialsWorks\SundialsConsole01",新建"src"文件夹:

c5e9f62fcffc68a1240455f625c4c7a5.png

将目录"C:\sundials\sundials-2.5.0-install\examples\cvode\serial"中的文件"cvRoberts_dns.c"复制到新建的"C:\sundials\SundialsWorks\SundialsConsole01\src"路径下:

326f799213acf11bbdc14e864b8fe76c.png

在SundialsConsole01.sln工程的解决方案资源管理器中,右键"源文件"→"添加"→"现有项",如图:

d5027793f1216447e61e3cba1fd5534b.png

浏览到"C:\sundials\SundialsWorks\SundialsConsole01\src"路径,选取文件"cvRoberts_dns.c",成功后,单击该文件:

5854d1c224768a69ecc1653a9567a35d.png

由于此时,并未给项目选择依赖的头文件和库文件,打开的"cvRoberts_dns.c"中头文件处有下划红线。

2.2.3配置编译参数

修改运行平台为x64,以匹配库文件:

a7bccd7afbee6135e35c8889cb5caeef.png

单击"项目"→"属性":

39f18464145252279a75fd0c41061738.png

找到"配置属性"→"C/C++"→"常规",在"附加包含目录"中添加路径:C:\sundials\sundials-2.5.0-install\include

找到"配置属性"→"链接器"→"常规",在"附加库目录"中添加路径:C:\sundials\sundials-2.5.0-install\lib

找到"配置属性"→"链接器"→"输入",在"附加依赖项"中添加:sundials_cvode.lib;sundials_nvecserial.lib(用分号隔开)

找不到以上各项,可以先调试(F5)一次,出错后,将能看到以上完整项目录树。

2.2.4编译生成结果

完成后,回到main文件,在main函数的"return(0);"(约197行)前添加"getchar();"函数,防止生成的Console窗口一闪而过。

执行调试(F5),将弹出执行结果:

33d548bc23a25ef92d51a0ec2e59eb4e.png

如出错,最可能是找不到"sundials_cvode.dll"或"sundials_nvecserial.dll",可关闭SundialsConsole01.sln工程,再打开调试。

2.2.5重要注意

如仍然出错,请按照上述诸过程进行检查。一般问题可能出在:

(1)没将"C:\sundials\sundials-2.5.0-install\include"和路径"C:\sundials\sundials-2.5.0-install\lib"添加到系统path

(2)"项目"→"属性"的"C/C++"、"链接器"各项配置未完成;

(3)运行平台没有与库文件的生成平台匹配,如库文件选择了x64,而应用工程选用win32.

(未完,待续。。。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

xlnt库如何编译_SUNDIALS库的编译和使用 的相关文章

随机推荐