Palace是一款开源的大规模计算电磁学软件包,由亚马逊云端业务实验室(AWS Lab)支持。功能丰富,同时能够在不同的高性能硬件上运行,软件上支持OpenMP, MPI和GPU并行计算。Apache的开源协议也是极为友好。详情参见《使用WELSIM生成电磁计算软件Palace的求解器文件》一文。
尽管Palace功能强大,但作为一款基于Linux开发的科学计算程序,官方并没有提供对Windows操作系统的完全支持。笔者对Palace在Windows系统运行的可行性做了研究,使用Visual Studio编译Palace,生成了原生的Windows版本应用程序,并计算得到仿真结果。
Palace提供了CMake的Superbuild编译方式,会自动下载全部的所需依赖库并完全编译。在Linux下可以顺利编译。然而在Windows系统下,大量的依赖库如PETSc,SLEPc,libCEED,MUMPS等核心依赖库需要手动编译,因此官方提供的Superbuild模式,还无法在Windows下顺利编译。我们需要通过手动建立Visual Studio项目的方法,完成编译。
系统环境与依赖库
操作系统:Windows 10, 64-bit
编译器:Visual Studio 2022 Community, C++17。Inter Fortran Compiler 2022。
Palace版本:0.11.2
依赖库:
Intel MKL:著名的线性矩阵求解器。使用oneAPI 2022.2.0,和Fortran编译器版本一致。
METIS:用于并行计算的网格分区工具。使用5.3版本。
Hypre:计算包,使用2.52版本。
nlhmann/json:一款现代的基于C++的JSON语言读写包。
{fmt}:支持C/C++的输入输出流的格式化工具包。
Eigen:大名顶顶的C++数值计算包,无需编译,支持头文件直接调用。
libCEED:是一款线性代数计算管理终端,支持对各种CPU,GPU和集群的并行计算。
SuperLU_DIST:SuperLU的并行版本,是一个并行的稀疏直接线性代数求解器库。
STRUMPACK:一款大规模稀疏矩阵直接数值计算的开源软件库。
MUMPS:来自法国的求解大规模稀疏线性方程组的开源软件库。
SLEPc:支持复数线性矩阵计算,用于特征值计算。需要基于PETSc编译。
ARPACK-NG:支持复数线性矩阵计算,用于特征值计算。以F77程序为主,无需依赖PETSc,可以独立编译。
GSLIB:用于高阶谱单元的插值计算,可选。
其中,SuperLU_DIST,STRUMPACK,MUMPS三个可选的直接线代求解器至少要有一个。本文选用了MUMPS。SLEPc和ARPACK这两个复数求解器,需要至少一个。如果没有,将无法实现特征值相关的计算。本文选用了ARPACK。
建立项目文件
建立两个项目,分别是静态库项目libpalace,和可执行文件项目palace。libpalace包含所有的头文件和源文件。palace是最后生成的可执行文件,只含有一个main.cpp文件。如图所示,
libpalace项目设置
设置外部头文件链接位置
添加预处理宏命令
CEED_SKIP_VISIBILITY
PALACE_WITH_ARPACK
_CRT_SECURE_NO_WARNINGS
palace项目设置
添加外部头文件和预处理宏命令的方式,与libpalace几乎一样,这里不在赘述。编译可执行程序需要链接所有依赖库。添加的链接库如下
编译后,需要将所有的依赖动态库放置与palace.exe文件在一起,即可运行palace了。测试可执行程序,可以在Windows的命令行下运行。
也可以使用mpiexec命令进行MPI并行计算。GPU并行计算应该也可以实现,会在以后的文章中讨论。
为贡献仿真与开源社区,笔者开源了Palace的编译文件,分享在 https://github.com/WelSimLLC/palace,并提供了编译好的palace.exe可执行文件,供用户直接使用。
总结
目前可用的开源电磁场仿真求解器不多,Palace提供了强大的计算功能同时,也有着很友好的开源协议。Welsim也成为了世界上第一个在Windows下成功编译Palace,并开源编译方法与文件的开发者。
Palace的一些依赖库在Windows下编译也存在难点,将在以后的文章中讨论。
WelSim与作者不隶属于Palace。和Palace开发团队与机构没有直接关系。这里引用Palace仅用作技术博客文章与软件使用的参考。