标签:
SUNDIALS (SUite of Nonlinear and DIfferential/ALgebraic equation Solvers)是由美国劳伦斯利福摩尔(Lawrence Livemore)国立实验室开发,主要用于求解大规模非线性微分/代数方程。最新的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.
本质上,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还提供了可选择的并行计算能力。
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。
笔者在C盘根目录建立如下路径:
即建立C:\sundials路径,并在其中分别建立三个文件夹:sundials-2.5.0-src、sundials-2.5.0-build、sundials-2.5.0-install。其中,sundials-2.5.0-src用于存放SUNDIALS解压缩文件:
sundials-2.5.0-build存放之后Cmake编译成功生成的VS工程项目文件;
sundials-2.5.0-install存放VS编译生成的函数库文件。
打开sundials-2.5.0-src中CMakeLists.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。
进到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.dll和sundials_cvode.lib。其它各库类似。
生成各库以后,为了便于统一调用方便,源代码提供者另外写了"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文件夹中出现相应文件夹:
关闭sundials.sln工程。
打开"include" →"cvode",其中头文件如下:
其他各库的头文件存放在各自文件夹中。
打开"lib"文件夹,其中库文件如下:
各库文件的dll和lib文件都存放在该路径下。
打开"examples"→" cvode"→" serial", cvode库的示例使用C文件存放在该路径,如下:
其它各库也类似。
重要:将路径"C:\sundials\sundials-2.5.0-install\include"和路径"C:\sundials\sundials-2.5.0-install\lib"添加到系统path环境变量中,完成最终安装。否则,使用过程中,将出现找不到dll的问题。
样例模型采用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$的时间。
在"C:\sundials"路径下,新建工程目录"SundialsWorks"。
打开VS 2013,新建一个VC++的Win32控制台应用程序"SundialsConsole01",位置选择路径"C:\sundials\SundialsWorks\",如下图:
单击"确定","下一步",选择"空项目","完成":
保存项目。
找到路径"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"中头文件处有下划红线。
修改运行平台为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)一次,出错后,将能看到以上完整项目录树。
完成后,回到main文件,在main函数的"return(0);"(约197行)前添加"getchar();"函数,防止生成的Console窗口一闪而过。
执行调试(F5),将弹出执行结果:
如出错,最可能是找不到"sundials_cvode.dll"或"sundials_nvecserial.dll",可关闭SundialsConsole01.sln工程,再打开调试。
如仍然出错,请按照上述诸过程进行检查。一般问题可能出在:
(1)没将"C:\sundials\sundials-2.5.0-install\include"和路径"C:\sundials\sundials-2.5.0-install\lib"添加到系统path环境变量中;
(2)"项目"→"属性"的"C/C++"、"链接器"各项配置未完成;
(3)运行平台没有与库文件的生成平台匹配,如库文件选择了x64,而应用工程选用win32.
?
?
?
?
(未完,待续。。。)
标签:
原文地址:http://www.cnblogs.com/JudeZHU/p/4801992.html