必备条件

需要具备基本的Linux和Python相关知识.

我们假定用户已经预装Linux操作系统(推荐安装Ubuntu 14-18)以及Python(2.7)和一些基本Python库(例如numpy), 其他第三方库(例如Boost和Qt)可以在稍后进行安装。

基本的Linux操作命令

用户仅需掌握少许Linux基本命令即可开始SudoDEM的安装和使用。

Linux基本命令(参见下文)可使用命令行执行,命令行的开启可使用快捷键 “CTRL+ALT+T” 或者使用系统菜单。

  • sudo apt-get install package[^2]: 该命令可用于使用超级用户权限为系统安装对应名字的库。

  • pwd: 该命令可用于打印当前命令行的工作路径。

  • cd directory:该命令用于切换命令行的工作文件夹路径,文件夹路径可以是相对或者绝对路径。此处我们别介绍两个特别的文件夹路径名字,即 ‘.’ 和 ‘..'。’.' 表示当前文件夹路径,'..‘表示当前文件夹的上一层文件夹路径,这两种路径名字都属于相对文件夹路径,方便用户轻松切换路径。例如 ' cd ../sub’ 将会切换到与当前文件夹路径同级的另一个叫做 ‘sub’ 的文件夹。而 ‘cd /home/user’ 则会切换到当前登录用户家目录文件夹下。

  • prog 或 ./path/prog: 该命令用于执行一个名为 prog 的程序。如果该程序处于命令行搜索路径下,则键入 prog 即可成功执行;若该程序不在命令行搜索路径下,则需要在指定该程序所处的相对或绝对路径后才可成功执行。

  • ‘CTRL+C’: 该命令用于终止一个正在命令行运行的程序。

    $> sudo apt-get install python-numpy
    $> pwd
    $> cd /home/
    $> sudodem3d

Python 2.7

Python是缩进敏感型程序,缩进帮助Python进行作用域的划分。'#' 符号用于Python代码的单行注释。下面的代码给出了Python的一些基本的语法结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import math # 导入math库,math库包含了一些基本的数学运算工具

# 定义一些数字
a = 2 # 整型
b = 5
c = 2.0 # 浮点型
d = a/b # d是整型
e = c/b # e是浮点型
print a, d, e # 打印a, d, e的值到命令行

#定义一些字符串
a = 'abc' # 我们可以赋值任意类型的值到任意类型的变量当中
b = "this is a 'Python' script."
print a, b

#定义列表,元组以及字典用于Python基本数据的存储
c = [1,2,3,'ss'] # 列表
d = (1,2,3,'ss') # 元组
c[0] = 5 # 改变列表c的第一个元素,索引是从0开始计算的
d[0] = 5 # 报错!因为元组在初始化后是不可以被修改的,这和列表是完全不同的
d={1:22,2:33,4:'ssss','w':123} #字典:其中1, 2, 4, 'w'属于键,而22, 33, 'ssss'和123属于键对应的值
print d[1], d[4], d['w']

# 定义空的列表和字典用于稍后的数据存储
c = list() # an empty list
d = dict() # an empty dict
#测试表达式
if 1>2:
    print "1 is greater than 2, really?"
else:
    if 2 in [1, 2, 3]: # 如果2在列表[1, 2, 3]中
        #此处我们开始一个for循环
        for i in range(5): # 等价于 for i in [0, 1, 2, 3, 4]
            print i # 用于打印显示for循环的i值
            # 在c和d中追加一些数据
            c.append(math.cos(i)*10 + 2.0**5) # 追加 10*cos(i) + 2.0^5 的值到列表 c,这里cos来自math库。
            if i not in d.keys(): # 如果i不属于d字典的键
                d[i] = str(i)

#我们可以使用函数对我们的命令进行封装
def GoodJob(input_number, keyword1 = 1, keyword2 = True):
    if keyword2: # 等价于 if keyword2 == True
        print "the input number is", input
    input_number += keyword1 # 这里 input_number 的值被更新为 input_number + keyword1
    return input_number # 返回 input_number 的值
    
# 运行函数
a = GoodJob(2) # a = 3, 打印信息将会显示 'the input number is 3'
b = GoodJob(3, keyword1 = 5, keyword2 = False) # b = 8, 这里函数将不会打印任何信息

恭喜你!你现在已经掌握了运行数值模拟所必要的全部知识!

但也许这对于好学的你来说还不够!你可能会好奇更多酷炫的技术,比如如何进行文件的读写操作,如何利用Python进行面向对象编程。别急,我们后续教程会逐步为你呈现!

库的安装

SudoDEM 托管于GitHub 请点击这里。 我们将会给出两种 SudoDEM 的安装方式方便大家选择。

二进制安装

第一步: 获取安装包[^3]

你可以从这里下载已经编译好的 SudoDEM 二进制程序 , 然后将该二进制包解压到任意文件夹 (例如, /home/xxx/)。 如果你已经下载了 SudoDEM 主程序,但是没有包含对应的第三方库,你需要再下载 "3rdlibs.tar.xz" 并将其解压在 SudoDEM 子文件夹 "lib" 中。你可以参考下文所示的 SudoDEM 文件结构:

::: {.forest} for tree= font=, grow'=0, child anchor=west, parent anchor=south, anchor=west, calign=first, inner xsep=7pt, edge path= (!u.south west) +(7.5pt,0) |- (.child anchor) pic folder ; , file/.style=edge path=(!u.south west) +(7.5pt,0) |- (.child anchor) ;, inner xsep=2pt,font= , before typesetting nodes= if n=1 insert before=[,phantom] , fit=band, before computing xy=l=15pt, [/home/xxx/SudoDEM/ [bin/ [sudodem3d] ] [lib/ [3rdlibs/] [sudodem/] ] [share/ ] ] :::

第二步: 设置环境变量 PATH

sudodem3d 安装路径(例如,'/home/xxx/SudoDEM/bin')添加到环境变量配置文件中(例如,'/home/xxx/.bashrc'):

PATH=${PATH}:/home/xxx/SudoDEM/bin

不使用超级用户权限的 sudodem3d 源代码编译安装

下面的视频也许会帮助你完成 sudodem3d 的源代码编译安装(注:用户可以直接复制视频中的命令)。

(1) 文件夹结构

在源代码文件解压后,你将会看到如下文件夹结构

./home/xxx/SudoDEM

  • [SudoDEM2D]
  • [SudoDEM3D]
  • [scripts]
  • [INSTALL]
  • [LICENSE]
  • [Readme.md]

::: {.forest} for tree= font=, grow'=0, child anchor=west, parent anchor=south, anchor=west, calign=first, inner xsep=7pt, edge path= (!u.south west) +(7.5pt,0) |- (.child anchor) pic folder ; , file/.style=edge path=(!u.south west) +(7.5pt,0) |- (.child anchor) ;, inner xsep=2pt,font= , before typesetting nodes= if n=1 insert before=[,phantom] , fit=band, before computing xy=l=15pt, [/home/xxx/SudoDEM [SudoDEM2D ] [SudoDEM3D ] [scripts] [INSTALL,file ] [LICENSE,file ] [Readme.md,file ] ] :::

用户可以添加子文件夹, 例如, ‘3rdlib’, ‘build2d’, ‘build3d’和 ‘sudodeminstall’到 ‘SudoDEM’ 文件夹中。现在文件夹结构将会被更新如下:

::: {.forest} for tree= font=, grow’=0, child anchor=west, parent anchor=south, anchor=west, calign=first, inner xsep=7pt, edge path= (!u.south west) +(7.5pt,0) |- (.child anchor) pic folder ; , file/.style=edge path=(!u.south west) +(7.5pt,0) |- (.child anchor) ;, inner xsep=2pt,font= , before typesetting nodes= if n=1 insert before=[,phantom] , fit=band, before computing xy=l=15pt, [/home/xxx/SudoDEM [SudoDEM2D ] [SudoDEM3D ] [3rdlib] [build2d] [build3d] [sudodeminstall] [scripts] [INSTALL,file ] [LICENSE,file ] [Readme.md,file ] ] :::

子文件夹 ‘3rdlib’ 用于存放第三方库的文件。需要注明的是该文件夹不仅存放第三方库的头文件,同时还将存放第三方库库编译后的动态链接库文件 ('*.so.*')。 在 ‘SudoDEM’ 编译完成后,用户需要手动将 ‘SudoDEM’ 所依赖的所有第三方库的对应文件拷贝到子文件夹 ‘3rdlib’ 中。‘SudoDEM’ 的二维和三维版本的编译分别在 ‘build2d’ 和 ‘build3d’ 中进行,编译后的所有生成文件将会被安装在 ‘sudodeminstall’ 文件夹中。

(2) 编译第三方库

::: {.forest} for tree= font=, grow’=0, child anchor=west, parent anchor=south, anchor=west, calign=first, inner xsep=7pt, edge path= (!u.south west) +(7.5pt,0) |- (.child anchor) pic folder ; , file/.style=edge path=(!u.south west) +(7.5pt,0) |- (.child anchor) ;, inner xsep=2pt,font= , before typesetting nodes= if n=1 insert before=[,phantom] , fit=band, before computing xy=l=15pt, [/home/xxx/SudoDEM/3rdlib [boost-1_6_7] [eigen3.3.5] [libQGLViewer-2.6.3] [minieigen] ] :::

主要第三方依赖库:

  • Boost-1.67
    从 Boost 官方网站下载对应的源代码文件 (https://www.boost.org/users/history/version_1_67_0.html) 或者可以选择从 github 下载 (https://github.com/SwaySZ/boost-1_6_7)。

    cd boost-1\_6\_7
        ./bootstrap.sh --prefix=$PWD/../boost167 --with-libraries=python,thread,filesystem,iostreams,regex,serialization,system,date_time link=shared runtime-link=shared --without-icu
        ./b2 -j3
        ./b2 install
    
  • Eigen-3.3.5: 无需安装但需要包含所有的头文件。 用户可以选择从我们提供的 github 仓库来下载 (https://github.com/SwaySZ/Eigen-3.3.5).

  • MiniEigen
    github 仓库下载地址 (https://github.com/SwaySZ/minieigen). 在 CMakeLists.txt' 设置已经编译好的 Boost 的路径:

    set(BOOST_ROOT "/home/swayzhao/software/DEM/3rdlib/boost167")
    

    然后执行,

    mkdir build
    cd build
    cmake ../
    make
    

    编译完成后请拷贝文件 ‘minieigen.so’ 到 SudoDEM 子文件夹 ‘lib/3rdlibs/py’ 下面。

  • LibQGLViewer-2.6.3
    从 github 仓库下载对应的源代码 (https://github.com/SwaySZ/libQGLViewer-2.6.3)

    cd QGLViewer
    qmake
    make
    

其他工具和依赖库:

  • biuld-essential, cmake

  • freeglut3-dev

  • zlib1g-dev (boost)

  • python-dev (boost)

  • pyqt4-dev-tools

  • qt4-default

  • python-numpy python-tk

  • libbz2-dev

  • python-xlib python-qt4

  • ipython3.0 python-matplotlib

  • libxi-dev

  • libglib2.0-dev

  • libxmu-dev

(3) 编译 SudoDEM 主程序

我们将在这一小节给出 SudoDEM3D 的编译示例。编译前请确认你的文件夹结构如下:

::: {.forest} for tree= font=, grow'=0, child anchor=west, parent anchor=south, anchor=west, calign=first, inner xsep=7pt, edge path= (!u.south west) +(7.5pt,0) |- (.child anchor) pic folder ; , file/.style=edge path=(!u.south west) +(7.5pt,0) |- (.child anchor) ;, inner xsep=2pt,font= , before typesetting nodes= if n=1 insert before=[,phantom] , fit=band, before computing xy=l=15pt, [/home/xxx/SudoDEM/SudoDEM3D [cMake] [CMakeLists.txt, file] [core] [doc] [gui] [lib] [pkg] [py] ] :::

编译前用户需要修改 ‘CMakeLists.txt’ 用于 SudoDEM 安装路径以及第三方依赖库的路径设置。

(a) 设置安装路径:

SET(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/../sudodeminstall/SudoDEM3D")

(b) 设置 Boost 库的路径:

  set(BOOST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/../3rdlib/boost167")

(c) QGLViewer 的头文件以及动态链接库通过下面两行来设置:

set(QGLVIEWER_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../3rdlib/libQGLViewer-2.6.3/")
set(QGLVIEWER_LIBRARIES "${CMAKE_CURRENT_SOURCE_DIR}/../3rdlib/libQGLViewer-2.6.3/QGLViewer/libQGLViewer.so")

(d) 拷贝已经安装完成的 numpy 和 pyqt4 文件到 SudoDEM 子文件夹 ‘./lib/3rdlibs/py’。你也许需要修改 cmake 的配置文件 FindNumPy.cmake 用于 numpy 的路径搜索:

set(DPDIR "${CMAKE_CURRENT_SOURCE_DIR}/../dem2dinstall/SudoDEM/lib/3rdlibs/py/")

编译并安装 SudoDEM3D:

cd build3d
cmake ../SudoDEM3D
make -j3
make install

‘sudodem3d’ 的二进制文件将会被安装在 ‘/home/xxx/SudoDEM/sudodeminstall/SudoDEM3D/bin/’ 路径下。 用户可将该路径添加到环境变量中 ('/home/xxx/.bashrc'):

PATH=${PATH}:/home/xxx/SudoDEM/sudodeminstall/SudoDEM3D/bin

编译后的 SudoDEM 文件夹结构如下所示:

::: {.forest} for tree= font=, grow'=0, child anchor=west, parent anchor=south, anchor=west, calign=first, inner xsep=7pt, edge path= (!u.south west) +(7.5pt,0) |- (.child anchor) pic folder ; , file/.style=edge path=(!u.south west) +(7.5pt,0) |- (.child anchor) ;, inner xsep=2pt,font= , before typesetting nodes= if n=1 insert before=[,phantom] , fit=band, before computing xy=l=15pt, [/home/xxx/SudoDEM/sudodeminstall [bin ] [lib [3rdlibs [*.so,file] [py [minieigen.so,file] [numpy] [PyQt4] [other Python modules,file] ] ] [sudodem] ] [share] ] :::

需要注明的是: SudoDEM 的安装将会覆盖除 ‘3rdlibs’ 以外的所有子文件夹。用户需要拷贝第三方库的编译文件 (boost, libQGLViewer, minieigen) 到 ‘3rdlibs’ 中。如果系统有关于 3rd-libraries 的报错, 用户则需要检查当前的文件夹结构是否如教程所示。

重要: 用户可通过脚本 ‘changerpath.sh’ 添加运行时动态链接库搜索路径。

cd 3rdlibs
cp /home/xxx/SudoDEM/scripts/changerpath.sh .
chmod +x changerpath.sh
./changerpath.sh

注: ‘changerpath.sh’ 将会为 ‘3rdlibs’ 下所有的第三方库添加动态链接库运行时搜索路径 ‘$ORIGIN’,同时为所有的 ‘3rdlibs/py/PyQt4’ 下的第三方库添加动态链接库运行时搜索路径 ‘$ORIGIN/../../'。

动态链接库运行时搜索路径将会为运行程序提供最高优先级的动态链接库寻址路径,以此来避免潜在的用户安装库和系统安装库的版本冲突问题。