参考资料

Coordinate Free Mehless Method implementation​e6.ijs.si Medusa: Coordinate Free Mehless Method implementation​e6.ijs.si Projects · E62 Laboratory / Medusa​gitlab.com
2b7aa5c6dc699814b0fd52d10d8648c1.png
地球物理局 地震波动力学实验室 无网格组 译


目 录

石中居士:【文档翻译】Medusa C++库——目录​zhuanlan.zhihu.com

安装和构建

安装

在安装之前,参考:

石中居士:虚拟机中安装Ubuntu及后续配置​zhuanlan.zhihu.com

要想从原版Ubuntu安装开始,请运行:

sudo apt-get install git g++ python3 cmake libhdf5-serial-dev doxygen graphviz
git clone https://gitlab.com/e62Lab/medusa.git --branch master --single-branch
cd medusa
./run_tests.py

以上命令安装了依赖项、克隆了存储库、进入存储库的根文件夹并运行测试。这将构建并运行测试。如果这正常运作,您就可以开始了!否则,就安装任何丢失的包,如果仍然失败,请提出问题!


构建

依赖项列表:

  • 构建工具:如cmake>=2.8.12、++>=4.8、make、python3
  • 用于输入、输出的HDF5库
  • doxygen>=1.8.8和Graphviz,用于生成文档

最好是源代码以外的版本。运行

mkdir -p build
cd build
cmake ..
make

注意,您只需要运行cmake一次,之后只需要用make就足够了。

二进制文件被放进bin/文件夹中。测试可以通过make medusa_run_tests一次性一并运行,或通过make operators_run_tests单独地运行。


链接器错误

在尝试不同的类时,您可能会遇到链接器错误,例如:

Scanning dependencies of target cantilever_beam [100%] Building CXX object
examples/linear_elasticity/CMakeFiles/cantilever_beam.dir/cantilever_beam.cpp.o [100%] Linking CXX executable
../../../examples/linear_elasticity/cantilever_beam /usr/bin/ld: CMakeFiles/cantilever_beam.dir/cantilever_beam.cpp.o: in function
`main': cantilever_beam.cpp:(.text.startup+0x162): undefined reference to `void mm::FindBalancedSupport::operator()
<mm::DomainDiscretization<Eigen::Matrix<double, 2, 1, 0, 2, 1> > >(mm::DomainDiscretization<Eigen::Matrix<double, 2, 1, 0, 2, 1> >&)
const' collect2: error: ld returned 1 exit status

这是预料之中的,而且也是编译时间优化的结果。实际上,可以通过两种方式引入medusa库:

#include <medusa/Medusa_fwd.hpp>

或者

#include <medusa/Medusa.hpp>

第一个版本包含所有符号的声明,但不是所有定义。包括了一些更常用的模板实例,但到目前为止还不是全部。使用未预编译的模板实例将导致程序编译良好,但由于缺少定义,将无法链接。在这种情况下,您有几个选择:包含完整的Medusa库(没有_fwd的头文件),它应该可以正常运作,但您将不得不等待更长的时间完成编译。只包含缺失的头文件(在上面的情况中,头文件为 medusa/bits/domains/FindBalancedSupport.hpp)并需要什么用什么。或者,将您的实例添加到已经预编译的实例中(位于.cpp文件中,如这个)。


HDF5

为了使用HDF5 IO,您需要使用HDF5库。您可以使用命令

sudo apt-get install libhdf5-dev

sudo pacman -S hdf5

来轻松安装它。

Ubuntu将HDFS头文件和库文件放在一个奇怪的文件夹 /usr/{lib, include}/x86_64-linux-gnu/hdf5/serial/ 中(至少在旧版本中是这样)。如果您在cmake执行期间,看到了这样一个错误:

HDF5 sample failed to compile. See errors above.

从而导致位于test/test_hdf_compile.cpp中的示例hdf测试文件编译失败。那么处理整个项目之前,或许最好先编译这个文件。

如果您得到这样一个错误,类似于

fatal error: hdf5.h: No such file or directory

那么编译器就无法看到HDF5头文件。一些发行版尤其是(较老的)Ubuntu,将它们放在非标准文件夹/usr/include/hdf5/serial/ 或 /usr/include/x86_64-linux-gnu/hdf5/serial/ 中。检查这两个文件夹或检查您的发行版hdf包中这些文件的位置。确定位置后,将该目录添加到include目录中,用 -I 标记或在CMakeLists.txt中,使用

include_directories(/usr/include/hdf5/serial/)  # 或者你的合适目录

如果您希望一劳永逸解决这个问题,您可以在您的/usr/include目录中创建指向头文件的软链接,通过输入

sudo ln -s /usr/include/hdf5/serial/* /usr/include

之后,应该不会出现编译时间错误。如果还是有错误,请提出问题。

如果您得到类似于

-lhdf5 not found

的错误,而您已经安装了hdf5,您可能需要将库链接到一个可发现的位置,如/usr/lib/,或将上述目录添加到链接器路径。和上面类似,检查 /usr/lib/x86_64-linux-gnu/hdf5/serial/ 目录并寻找文件 libhdf5.a。找到以后,使用 -L标志指定位置,或者在CMakeList.txt中,使用

link_directories(/usr/lib/x86_64-linux-gnu/hdf5/serial/)  # 或者你的合适目录

或者用软链接一劳永逸地解决这个问题

sudo ln -s /usr/lib/x86_64-linux-gnu/hdf5/serial/* /usr/lib

线性代数

我们使用Eigen作为我们的矩阵库。关于使用参考和文档,参见这里。根据Matlab的快速转换,参见这里。

安装Eigen,命令如下:

apt-get install libeigen3-dev

使用Intel数学内核库(MKL)

安装Intel MKL并不取安装目录。注册并下载MKL。

下载完后解压,运行install.sh。

进入install.sh所在目录,输入

bash install.sh

回车。进入安装界面。按照提示操作即可。

要使用Intel MKL,需要设置正确的包含目录和链接目录。

include_directories(SYSTEM /opt/intel/compilers_and_libraries/linux/mkl/include)    # 改为你的安装路径
link_directories(SYSTEM /opt/intel/compilers_and_libraries/linux/mkl/lib/intel64)
link_directories(SYSTEM /opt/intel/compilers_and_libraries/linux/lib/intel64)

Eigen对MKL有很大的支持。您可以在他们的官网上看到更详细的说明。要将MKL用于数学操作,请在编译时定义EIGEN_USE_MKL_VML。您还必须链接适当的库,并定义MKL_LP64以便在64位系统上使用。启用并行性后,配置显示如下:

target_compile_options(my_target PRIVATE "-fopenmp")
target_compile_definitions(my_target PUBLIC EIGEN_USE_MKL_VML MKL_LP64)
target_link_libraries(my_target medusa mkl_intel_lp64 mkl_intel_thread mkl_core pthread iomp5)

如果您安装了Intel Parallel Studio,这也使您能够通过其Eigen界面使用Pardiso paralle直接稀疏求解器。


使用Intel C/C++编译器

为了在编译Medusa时使用Intel的编译器,对于cmake您有几个标准选项。确保编译器和并通过运行which icc来使其安装在您的PATH中,它应该返回类似于/opt/intel/bin/icc的内容。

你可以当“第一次”调用cmake时定义编译器如下:

cmake .. -DCMAKE_C_COMPILER=$(which icc) -DCMAKE_CXX_COMPILER=$(which icpc)

如果这不是您的第一次调用,请删除build目录并重新开始。

您还可以设置 CXX 和 CC bash变量。在第一次调用cmake之前,您必须导出以下内容:

export CXX="icpc"
export CC="icc"
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐