SUNDIALS库的编译和使用
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.
其中主要的求解器经过了数十年的不断开发和完善,如下图所示:
本质上,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还提供了可选择的并行计算能力。
2.编译
2.1 准备
- Visual Studio
- SUNDIALS 官网地址
- CMake 官网地址
CMAKE安装:
安装步骤:
step 1:
step 2:
step 3:
step 4:
2.2 Cmake编译SUNDIALS-X.X.X
(此处我选择编译SUNDIALS-5.5.0)
2.2.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编译生成的函数库文件。
2.2.2 Cmake编译
打开CMake软件:
在"Where is the source code:“右边"Browse Source…“单击浏览到上面建立的sundials-X.X.X-src文件夹;在"Where to build the binaries:” 右边"Browse Build…“单击浏览到上面建立的sundials-X.X.X-build文件夹。如图:
选择"Visual Studio 12 2013 Win64”,选取"Use default native compilers”,单击"Finish",返回Cmake主界面,等待配置完成:
【意外情况1:】在日志中查看错误如下:
The system is: Windows - 10.0.18362 - AMD64
AMD64即x64,是一种64位元的电脑处理器架构。它是基于现有32位元的x86架构,由AMD公司所开发。
【解决方案1:】
错误原因是因为cmake使用的编译器问题,在选择Visual Studio 14 2015 Win64后,没有报错。
配置完成后,界面如下:通知框中出现"Configuring done"字样。
其中,红色表示需要确认的选择,例如是不是配置BUILD_CVODE这一项,打钩表示有选择意向,要再次单击"Configure"才能配置。在后面所讲的配置完成后,多次单击"Configure",直到所有红色消除,表示配置完成。
找到"CMAKE_INSTALL_PREFIX"一项,将其路径改为上面建立的sundials-X.X.X-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文件,便于学习和复用。
【意外情况2:】
在选择第一项后,出现以下错误:fatal error C1083: 无法打开包括文件:No such file or directory
在日志文件中查看错误如下:
2.2.3 动态库生成
进到sundials-X.X.X-build文件夹,可看到生成了sundials.sln工程。
双击"sundials.sln",打开该工程,在对应的"解决方案资源管理器"中将出现相应的子工程:
右键单击"ALL_BUILD"工程,单击"生成",将在sundials-X.X.0-build的各自工程目录文件夹中生成相应的动态链接库,例如cvode的库,找到"C:\sundials\sundials-X.X.0-build\src\cvode\Debug"路径,如下:
看到,已经生成了sundials_cvode.dll和sundials_cvode.lib。其它各库类似。
【错误1:】当选择x64时
【错误2:】当选择Win32时
按照上述步骤,界面如下所示:
2.2.4 动态库安装
生成各库以后,为了便于统一调用方便,源代码提供者另外写了"INSTALL"工程,能将所有使用中需要的头文件(include)和库文件(dll和lib)和案例文件(Example)复制到前面定义的sundials-X.X.X-install文件夹中。
也就是说,当"ALL_BUILD"工程被编译后,sundials-X.X.X-install文件夹仍然是空的;只有将"INSTALL"工程编译后,sundials-X.X.X-install文件夹才被写入对应内容。
右键单击"INSTALL"工程,单击"生成"。成功后,sundials-X.X.X-install文件夹中出现相应文件夹:
在VS工程中,添加c/c++工程中外部头文件(.h),lib库,dll库的基本步骤 参考
VS开发过程中,“无法打开源文件 xxxx.h”问题的解决方法?
PIHM模型使用Sundials库:
尝试:
1.第一次选择编译sundials5.5.0,将各.c文件引用的头文件明确后,因缺少三个函数,报错。试尝试将sundials2.2.0中的此三个头文件复制进去但无法编译失败。
尝试将所有的头文件放在一个文件夹内,但因各头文件有相互调用的关系,因而不可行。
2.将sundials2.2.0中的头文件按照各文件夹整理好,但函数无法识别各头文件。
3.尝试sundials2.4.0版本,但缺少sundials_smalldense头文件,将其复制进去后编译,还是无此头文件,尝试失败。
4.下载多个版本后,发现sundials2.2.0和sundials2.3.0有模型所需函数,但无法用CMake软件进行编译。
dll文件如下:
sundials_cvode.dll
sundials_cvodes.dll
sundials_ida.dll
sundials_idas.dll
sundials_kinsol.dll
sundials_nvecserial.dll
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)