码迷,mamicode.com
首页 > 其他好文 > 详细

SUNDIALS库的编译和使用

时间:2015-09-11 20:54:01      阅读:334      评论:0      收藏:0      [点我收藏+]

标签:

1 简介

SUNDIALS (SUite of Nonlinear and DIfferential/ALgebraic equation Solvers)是由美国劳伦斯利福摩尔(Lawrence Livemore)国立实验室开发,主要用于求解大规模非线性微分/代数方程。最新的2.6.x2015.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.

本质上,SUNDIALSFORTRAN中针对非线性微分/代数方程的几个有名函数包进行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,先安装。

SUNDIALShttp://computation.llnl.gov/casc/sundials/download/download.php

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

Cmakehttp://www.cmake.org/download/

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

1.2 Cmake编译SUNDIALS-2.5.0

1.2.1 建立工作目录

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

技术分享

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

技术分享

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

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

1.2.2 Cmake编译

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

技术分享

打开Cmake,如图

技术分享

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

技术分享

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

技术分享

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

技术分享

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

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

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

技术分享

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

技术分享

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

技术分享

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

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

技术分享

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

技术分享

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

关闭CMake

1.3 动态库生成

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

技术分享

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

技术分享

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

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

技术分享

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

技术分享

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

技术分享

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

1.4 动态库安装

生成各库以后,为了便于统一调用方便,源代码提供者另外写了"INSTALL"工程,能将所有使用中需要的头文件(include)和库文件(dlllib)和案例文件(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文件夹中出现相应文件夹:

技术分享

关闭sundials.sln工程。

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

技术分享

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

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

技术分享

各库文件的dlllib文件都存放在该路径下。

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

技术分享

其它各库也类似。

重要:将路径"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\",如下图:

技术分享

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

技术分享

保存项目。

2.2.2 添加样例C文件

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

技术分享

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

技术分享

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

技术分享

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

技术分享

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

2.2.3 配置编译参数

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

技术分享

单击"项目"→"属性"

技术分享

找到"配置属性"→"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),将弹出执行结果:

技术分享

如出错,最可能是找不到"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.

?

?

?

?

(未完,待续。。。)

SUNDIALS库的编译和使用

标签:

原文地址:http://www.cnblogs.com/JudeZHU/p/4801992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!