基于VS2017的C++ SuperLU混合编程
一、SuperLU介绍
SuperLU:是一个通用库,用于直接求解大型稀疏非对称线性方程组。该库是用C编写的,可以从C或Fortran程序调用。它使用MPI、OpenMP和CUDA来支持各种形式的并行性。它支持实数据类型和复杂数据类型、单精度和双精度以及64位整数索引。库例程使用部分旋转执行LU分解,三角系统通过正向和反向替换进行求解。LU分解例程可以处理非方矩阵,但三角解仅对方矩阵执行。矩阵列可以通过库或用户提供的例程进行预排序(分解前)。这种稀疏性的预排序完全独立于因式分解。为提高向后稳定性,提供了工作精度迭代求精子程序。还提供了使系统平衡、估计条件数、计算相对后向误差和估计精化解的误差界的例程。
官网下载SuperLU文件地址:http://crd-legacy.lbl.gov/~xiaoye/SuperLU/
二、生成SuperLU静态库文件
1、 生成SuperLU.lib
2.1.1、新建项目
我已经下载了SuperLU相关文件到D:\other-systems\SUPERLU\SuperLU目录下
此处为了方便后期使用SuperLU库,项目命名为SuperLU。
新建项目之后将之前下好的D:\other-systems\SUPERLU\SuperLU\SRC 中的所有的.c文件添加到项目源文件文件夹中,所有的.h文件添加到项目头文件文件夹中。
2.1.2、配置属性
项目右键—>属性
工程的属性-> C/C+±>常规->附加包含目录中添加D:\other-systems\SUPERLU\SuperLU\SRC 文件夹路径
然后在工程 右击 -> 属性 -> 配置属性 -> 常规-> 配置类型-> 选择 静态库(.lib)单击确定。
或者在建立工程的时候选择直接创建静态库;
2.1.3、编译
在Debug模式调试编译无error后生成Release版本,直接编译会出现以下错误
原因是Visual C++ 2017 使用了更加安全的 run-time library routines 。新的Security CRT functions(就是那些带有“_s”后缀的函数),请参见:《CRT函数的安全增强的版本》
下面给出这个问题的解决方案:
方法一:将原来的旧函数替换成新的 Security CRT functions。
方法二:用以下方法屏蔽这个警告:
1. 在预编译头文件stdafx.h里(注意:一定要在没有include任何头文件之前)定义下面的宏:
#define _CRT_SECURE_NO_DEPRECATE
2. 或声明 #pragma warning(disable:4996)
3. 更改预处理定义:
项目->属性->配置属性->C/C++ -> 预处理器 -> 预处理器定义,增加: _CRT_SECURE_NO_DEPRECATE
做以上修改之后又出现以下错误
原因:
在VS2017创建项目时,会有一个勾选项,叫做“安全开发生命周期(SDL)检查”,这个东西是微软在VS2012新推出的东西,为了是能更好的监管开发者的代码安全,如果勾选上这一项,那么他将严格按照SDL的规则编译代码,会有一些以前常用的函数无法通过编译,比如在VS2010中的scanf是warning那么在VS2017中就是error了。
也就是在编译的时候,当SDL检查启用时,编译器会严格检测缓冲区的溢出,并且会在delete某个指针时,自动为这个指针定义一个非有效的值,防止在delete以后仍用到这个指针时出错。还有就是会在你定义一个对象时,自动为这个对象赋值零。
从这些功能来看,有些功能还是不错的,不但方便了程序员使用也增强了程序的健壮性,但是对老版本程序的兼容就会出现问题,以前程序中编译通过的内容也许在VS2012中就没有办法通过。
解决办法:
问题解决方法:
有一个选择打开和关闭SDL检查的位置就是:项目属性->配置属性->C/C+±>SDL检查,选测是或者否。
此时我们选择”否”,则上面的那个错误就不会出现了
再编译就不会出错了
此时我们改为生成Release版本编译
在Release文件下生成了SuperLU.lib
2、 生成SuperLU.lib
2.2.1、新建项目
此处为了方便后期使用BLAS库,项目命名为BLAS。
由于SuperLU需要调用BLAS库中的一些函数,所以需要编译BLAS库。SuperLU官网上说BLAS库速度不快,推荐使用Intel MKL、ATLAS、GotoBLAS。为方便仅以SuperLU下载文件中附带的CBLAS文件夹下的BLAS为例编译,BLAS的编译与前者SuperLU类似。
1) 新建工程(命名BLAS),将D:\other-systems\SUPERLU\SuperLU\CBLAS文件夹下的头文件和源文件添加到工程文件目录中,然后将工程属性改为静态库(.lib)。
2) 将D:\other-systems\SUPERLU\SuperLU\CBLAS添加到 项目 -> 属性 -> C/C++ -> 常规 -> 附加包含目录;
3) 在Debug模式下调试编译,成功后生成Release版本。
编译过程中遇到以上问题的解决办法一样。
3、 调用SuperLU.lib库
2.3.1、新建mySuperLU项目,并配置SuperLU库
(1)将路径 D:\other-systems\SUPERLU\SuperLU\SRC添加到 项目属性 —> VC++目录 —>包含目录中,将之前编译好的SuperLU.lib(release文件夹下)和BLAS.lib(release文件夹下)复制到E:\programmer\mySuperLU\Debug文件夹下,没有的话可以新建,然后将E:\programmer\mySuperLU\Debug路径添加到项目属性 —> VC++目录 —>库目录中;
(2) 再把路径E:\programmer\SuperLU\Release(此路径下包含文件SuperLu.lib)和路径E:\programmer\SuperLU\Release(此路径下包含文件BLAS.lib)添加到项目属性 —> 链接器 —>常规—>附加库目录中;
(3)将SuperLU.lib和BLAS.lib添加到项目属性—>链接器—>输入—>附加依赖项—>编辑—>附加依赖项—>确定。
2.3.2、调用方法
代码来源于SuperLU Package.(新建mySuperLU.c文件)
#include "stdafx.h"
#include "slu_ddefs.h"void main(int argc, char *argv[])
{/** Purpose* =======** This is the small 5x5 example used in the Sections 2 and 3 of the* Users' Guide to illustrate how to call a SuperLU routine, and the* matrix data structures used by SuperLU.**/SuperMatrix A, L, U, B;double *a, *rhs;double s, u, p, e, r, l;int *asub, *xa;int *perm_r; /* row permutations from partial pivoting */int *perm_c; /* column permutation vector */int nrhs, info, i, m, n, nnz, permc_spec;superlu_options_t options;SuperLUStat_t stat;/* Initialize matrix A. */m = n = 5;nnz = 12;if (!(a = doubleMalloc(nnz))) ABORT("Malloc fails for a[].");if (!(asub = intMalloc(nnz))) ABORT("Malloc fails for asub[].");if (!(xa = intMalloc(n + 1))) ABORT("Malloc fails for xa[].");s = 19.0; u = 21.0; p = 16.0; e = 5.0; r = 18.0; l = 12.0;a[0] = s; a[1] = l; a[2] = l; a[3] = u; a[4] = l; a[5] = l;a[6] = u; a[7] = p; a[8] = u; a[9] = e; a[10] = u; a[11] = r;asub[0] = 0; asub[1] = 1; asub[2] = 4; asub[3] = 1;asub[4] = 2; asub[5] = 4; asub[6] = 0; asub[7] = 2;asub[8] = 0; asub[9] = 3; asub[10] = 3; asub[11] = 4;xa[0] = 0; xa[1] = 3; xa[2] = 6; xa[3] = 8; xa[4] = 10; xa[5] = 12;/* Create matrix A in the format expected by SuperLU. */dCreate_CompCol_Matrix(&A, m, n, nnz, a, asub, xa, SLU_NC, SLU_D, SLU_GE);/* Create right-hand side matrix B. */nrhs = 1;if (!(rhs = doubleMalloc(m * nrhs))) ABORT("Malloc fails for rhs[].");for (i = 0; i < m; ++i) rhs[i] = 1.0;dCreate_Dense_Matrix(&B, m, nrhs, rhs, m, SLU_DN, SLU_D, SLU_GE);if (!(perm_r = intMalloc(m))) ABORT("Malloc fails for perm_r[].");if (!(perm_c = intMalloc(n))) ABORT("Malloc fails for perm_c[].");/* Set the default input options. */set_default_options(&options);options.ColPerm = NATURAL;/* Initialize the statistics variables. */StatInit(&stat);/* Solve the linear system. */dgssv(&options, &A, perm_c, perm_r, &L, &U, &B, &stat, &info);dPrint_CompCol_Matrix("A", &A);dPrint_CompCol_Matrix("U", &U);dPrint_SuperNode_Matrix("L", &L);print_int_vec("\nperm_r", m, perm_r);dPrint_Dense_Matrix("B", &B);/* De-allocate storage */SUPERLU_FREE(rhs);SUPERLU_FREE(perm_r);SUPERLU_FREE(perm_c);Destroy_CompCol_Matrix(&A);Destroy_SuperMatrix_Store(&B);Destroy_SuperNode_Matrix(&L);Destroy_CompCol_Matrix(&U);StatFree(&stat);getchar();
}
VS2017C++ const char* 类型的实参与char *类型的形参不兼容解决办法
解决方法
法1 将结构体中定义的 char * 前面加上 "const"修饰
法2 在Visual Studio 2019右侧栏创建的项目上右击“项目名称”——>“属性”——>“C/C++”——>“语言”,将“符合模式”改为“否”即可。如下所示:
再编译则可以成功
参考链接:https://blog.csdn.net/Santorinisu/article/details/80275557
https://blog.csdn.net/jingmiaa/article/details/52344057
https://blog.csdn.net/gindar/article/details/8010794
基于VS2017的C++ SuperLU混合编程相关推荐
- 基于引擎的matlab+vc混合编程的配置
前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...
- qt web混合编程_基于Qt与MATLAB的混合编程技术
摘要:在Qt雷达仿真系统中,数据处理及图形显示尤为重要.本文为此提出了一种Qt与MATLAB混合编程的方法.通过VC++和MATLAB混合编程技术,将MATLAB函数封装成动态链接库,Qt调用这个动态 ...
- C++ SuperLU 混合编程
1. 软件版本信息 Windows 10 Visual Studio 2015 Professional SuperLU Package 2. 软件下载链接 SuperLU Introduction ...
- jvm字节码和基于jvm的多语言混合编程
字节码 IT领域的三大难题 CPU OS 编译器 多语言混合编程 如何搞懂jvm <自己动手写java虚拟机>作者使用的是go语言,比较投机取巧,因为go语言有比较完整的垃圾回收机制,如果 ...
- matlab元胞自动机学风演化,利用MATLAB和VC60混合编程技术研究元胞自动机动态演化过程...
利用MATLAB和VC60混合编程技术研究元胞自动机动态演化过程 第! !卷!第期 ! 成都理工大学学报! 自然科学版 !# $ % - 2: 5 34- 1 -6;!9 ? : A ? $ % $ ...
- VS2017的C#语言与matlab2014A的m语言混合编程的方法
VS2017的C#语言与matlab2014A的m语言混合编程的方法 摘要: 有两种方法能够实现C#语言调用matlab编写的函数:一种是利用matlab应用类型库直接调用matlab函数:另一种是将 ...
- Matlab与C/C++混合编程 (基于Opencv库)
之前用过基于VS2018 与MATLAB2018a 混合编程(C++特性)(见https://blog.csdn.net/wwwoowww/article/details/83013801),奈何后来 ...
- matlab与vc混合编程指导书.doc,vc与matlab混合编程—基于com.doc
vc与matlab混合编程-基于com.doc VC与MATLAB混合编程基于COM2010年03月21日星期日1118注意旨在提供一份VC调用MATLAB的快速试验参考和一些实际经验,不保证所有内容 ...
- 螺杆泵matlab,基于Matlab与VC++混合编程的螺杆泵转子型线设计
2011年第 3期 (总 227期 ) · 1 · 收稿日期: 2010 - 12 - 23 基金项目:国家高技术研究发展计划资助项目 (2007AA05Z208) 设计研究 文章编号: 100622 ...
最新文章
- java基础-集合:list
- HTTP/TCP/IP协议
- 分享Kali Linux 2016.2第45周VMware虚拟机
- NVIDIA Jetson Xavier NX中安装的python库包的版本
- python plot 坐标轴范围,Python,Matplotlib,子图:如何设置轴范围?
- CHROME开发者工具的小技巧
- oracle ora-00026,oracle错误代码
- Spring框架----通用切入点表达式
- 因果推断笔记——DR :Doubly Robust学习笔记(二十)
- 动态规划实战篇--斐波那契数列
- chrome官网下载win64离线安装包
- 怎么在windows系统中远程控制服务器
- WiFi通信模块框图
- 2014年5月欧洲地区SAT写作真题及解题技巧
- STM32F1基于正点原子HAL库IIC驱动SH1106芯片的OLED屏
- Python .format()的详细使用(英文版)
- 全网多种方法解决未连接到互联网 代理服务器出现问题,或者地址有误的错误
- mac版免费吃鸡游戏(荒野行动)
- BZOJ 3875 Ahoi2014 骑士游戏
- 微软新品发布会汇总:更新Surface硬件产品 首发智能耳机