window编译并运行TOY2DAC

二维全波形建模和反演(TOY2DAC)


1. 背景

全波形反演指利用非线性寻优方法反演给定时窗内的波形记录以获取影响地震波传播的相关物性参数(如弹性参数、粘弹性参数、各向异性参数、密度等)的方法。
就是利用波场模拟和实际地震资料对比,通过多次迭代使预测波场和实际地震资料匹配一致,求取地下地质参数的一种地震反演方法。
从数学上来看,是要建立模型与现有地震数据的非线性关系,一般运用动力学知识。
TOY2DAC只包括各向同性的频域建模和反演

2. Package include

  • bin 编译后的二进制文件
  • doc 说明文档
  • include 编译期间包含的文件
  • src 所有的源代码,用Fortran语言和并行MPI指令编写
  • 0README 包含说明如何运行代码的内容

3. 环境

Fortran语言和C语言编译器
MUMPS库:大型稀疏LU矩阵分解,同时该库需要安装METIS库
MKL库:计算标准顺序和并行线性代数问题
ATLAS库:矩阵线性代数运算库

4. 编译

  • Makefile.inc文件包含的变量:CC,FC,FL分别是C语言编译器,Fortran语言编译器和链接调用;OPTF,OPTC,OPTL,OPTFF分别是调用Fortran编译,C编译,链接和Fortran90编译;OPT_PRE是预处理标志,只有设置标志才能实现双精度编译;INC是代码所有路径;LIB定义了库,ETX定义了二进制名称末尾扩展名。
  • Makefile文件里面的变量全部定义完成后,只需make命令就可以完成编译工作

5. 理论

TOY2DAC从一个从猜测的m0初值开始,为了解决下式最小值的问题
公式 公式(1)

- m表示待恢复的地下参数
- S表示数据集的总数
- ds表示第s个数据集
- us(m)是频域波传播问题的解
- R是将波场us(m)映射到接收机位置的约束算子  

公式 公式(2)

- A(m)表示二维频域声学(an)各向同性波传播算子  

在各向同性的情况下,上式被写作:
公式 公式(3)

w是角频率
vp(x)是压力波速度
p(x)是密度

在这种情况下,地下参数m可取以下的值:

1. vp(x):压力波速度的单参数反演
2. ρ(x): 密度的单参数反演
3. [vP (x),ρ(x)]集合:压力波和密度的多参数反演

5.1 正演问题

  • 正演问题包含在公式2中
  • TOY2DAC实现了一种四阶离散化方案
  • 公式2相当于一个稀疏的大规模线性系统的解
  • 当数据集变大时,只需要一个LU分解,S线性方程组可以通过正代和反代来求解

5.2 反演问题

反演问题基于一个局部下降函数
公式 公式(4)

αk是一个通过线性搜索的比例参数
∆mk为下降方向
这个下降方向取决于优化算法的选择,最基础的选择如下所示:
公式 公式(5)
TOY2DAC实现的是截断式牛顿迭代法

5.3 频域选择问题

  • 高效cpu频率域FWI通常是通过单个频率的连续反转来实现的,即从低频率到高频率
  • 这定义了一个多分辨率框架,减轻了与高频跳周期人工制品相关的反问题的非线性。
  • 高效cpu算法可以通过选择少量的粗采样频率来设计,这样可以减少频率和孔径角密集采样产生的波数冗余。
  • TOY2DAC包含一个简单的框架,它只运行一组频率。如果需要多个组,TOY2DAC必须启动几次。

6.频域有限差分建模引擎的输入文件

6.1 介质参数文件

介质参数文件是包含介质物理属性的二进制文件(直接访问简单精度实数)。它是建模模式下的仿真介质或反演的起始模型。文件的名称应该放在输入文件中。包含的参数有:

各向同性粘声模拟的纵波速度、纵波质量因子、密度
这些文件应该包含nz×nx的值

6.2 acquisition文件

  • 它是一个ASCII码文件,文件的格式如下:
  • 第一列和第二列是z轴和x轴坐标,三四列用不到,第五列表示来自源还是接收器

6.3 mumps input 文件

这个文件是允许管理一些MUMPS处理器的优化选项,一共四个参数:

icntl 7:选择MUMPS中的排序算法,一般默认7
icntl 14:优化松弛因子,在4.9以后的版本就不用了
icntl 23:确定每个MPI进程上允许存储LU因子的表的大小
keep 84:一般取最大值16

6.4 toy2dac_input文件

  • 优化该项目的主要文件
mode of the code:选择模式,一般就是1,FWI
forward modeling tool: 模式1提供各向同性介质的频域有限差分,模式2在TTI各向异性介质中提供了一个频域有限差分
acquisition:接收文件的名称

6.5 fdfd input文件

优化频域有限差分建模引擎的文件

nz,nx 是坐标
h 是步长
file name是各向同性输入模型文件的名称
pml tunning: pml振幅的值。取90一般
free surface是在介质顶部附加一个自由表面边界条件的附加参数
itypes为震源类型:爆炸(0)或垂直力(1)。ityper为接收机类型:水听器(0)(或垂直检波器(1),但尚未实现)。这个选项只有在使用Hicks插值时才有可能
slaplace是拉普拉斯常数,即。,用于随时间指数衰减地震波场的频率虚部

6.6 freq management文件

  • 管理频率
  • 第一行表示仿真或FWI频率组中涉及的频率数
  • 第二行表示频率列表

7运行TOY2DAC

7.1输出文件在建模模式下

主要输出文件为接收端数据(复值频域)。接收机位置频域内的数据文件通常称为:data_modeling。这是一个直接访问二进制文件。这些文件的顺序如下:
data_bloc_frequency_1 data_bloc_frequency_2 … data_bloc_frequency_N
其中N号是由用户在文件freq management中的,
输入图片说明
输入图片说明

对于每个频段组数据块data_bloc_frequency_i,数据排序如下:

data_bloc_source_1 data_bloc_source_2 … data_bloc_source_L

最后,对于每个源块,数据排序如下:

data_receiver_1 data_receiver_2 … data_receiver_K

如果每个源有相同数量的接收方,可以使用
ximage < data_modeling n1=2*nrec 查看

其中nrec = 接收机数量。

7.2输出文件在FWI模式下

输出文件如下:

  1. 这里是列表文本输出日志的标准输出,其中包含几个信息,特别是在问题的情况下…;

  2. invparinter : 包含反演过程中的所有中间模型。注意,注意,在用于反演的参数化过程中,模型是按顺序存储的;

  3. invparfinal :包含用于反演的参数化的最终模型;

  4. param XX inter : 包含所有按顺序存储的中间模型,用于参数XX。在各向同性中,XX代表vp、rho和qp;在各向异性中,XX是vp、rho、qp、epsilon、delta和 theta;

  5. param XX final : 包含参数XX的最终模型。在各向同性中,XX代表vp、rho和qp;在各向异性中,XX是vp、rho、qp、epsilon、delta和 theta;

  6. iterate *.dat : 包含收敛信息的优化例程输出日志。

文件invparinter, invparfinal, param XX inter和param XX final可以用一个ximage命令来查看:
ximage < param_vp_final n1=101

其中101是 nz 的大小。

8.示例

本部分介绍了TOY2DAC包中两个可用的模型。这些模板同时考虑了FWI(全波形反演)和建模问题。

高斯扰动模型

这个迷你模型非常适合是在用户平台上测试代码,因为它可以在几分钟内运行,并且只需要较小内存。它还可以让用户理解:为其预期结果,FWI在一个简单的类似于boxcard的配置是怎样工作的。此模型由1个目录组成:”run ball template”.

该目录包括了run ball模板包含在模式0下运行TOY2DAC所需的文件,以便计算同质背景下的频域数据和在V_P中有1个周期异常。一旦TOY2DAC编译完成,模型可以通过以下不同的操作来运行:

  1. 创建一个本地副本(以保持模板目录干净…)

  2. 介质的描述在”vp_ball,qp 和 rho“中。用户可以以ximage的形式绘制他们。例如:(这条指令官方给的不全)

    1
    ximage < vp_ball n1=101 d1=20 d2=20 label1=’depth in m’ label2=’distance in m’ &
    1. 查看输入文件后,检查文件”fdfd_input”的“vp_ball qp rho”和在”toy2dac_input”文件中的“mode=0”,然后用户可以运行模型。例如:

      1
      mpirun -n 4 ../bin/toy2dac
    2. 程序结束后(在4个处理器上所用时间为几秒钟),“观察到的数据“存储在文件”data_modeling “中,可以用于反演。

然后用户可以运行FWI程序:

  1. 介质的笛卡尔描述在文件”vp_homogeneous,qp and rho. “中。用户可以使用ximage来绘制它们。例如:(这条指令官方给的不全)
1
ximage < vp\_homogeneous n1=101 d1=20 d2=20 label1=’depth in m’ label2=’distance in m
  1. 查看输入文件后,检查文件”fdfd_input”的“vp homogeneous qp rho” ,观察到的数据文件在”fwi_input” 的第一行被设置为“data modeling”, “toy2dac_input”文件的“mode=1”,,然后用户可以运行模型。例如:

    1
    mpirun -n 4 ../bin/toy2dac

    程序结束后(在4个处理器上所用时间为几分钟),用户可以查看最终的模型。例如:(这条指令官方给的不全)

    1
    2
    ximage < param_vp_final n1=101 d1=20 d2=20 label1=’depth in m’ \\
    label2=’distance in m’ &

    其他二进制文件(中间文件等)也可以在文件terateXXX.dat中查看,其中XXX取决于所选择的优化方法。

Marmousi 模型

这个模型是一个简单的地球物理配置,并且在几分钟内就可以运行。此模板由1个目录组成”run marmousi template “

该目录包含在模式0中运行TOY2DAC所需的文件,以便在真正的marmousi模型中计算频域数据。一旦TOY2DAC编译完成,模型可以通过以下不同的操作来运行:

  1. 创建一个本地副本(以保持模板目录干净…)

  2. 介质的描述在”vp_Marmousi_exact,qp 和 rho“中。用户可以以ximage的形式绘制他们。例如:(这条指令官方给的不全)

    1
    ximage < vp_Marmousi_exact n1=141 d1=25 d2=25 label1=’depth in m’ label2=’distance in
  3. 查看输入文件后,检查文件”fdfd_input”的“vp_Marmousi_exact l qp rho”和在”toy2dac_input”文件中的“mode=0”,然后用户可以运行模型。例如:

    1
    mpirun -n 4 ../bin/toy2dac
  4. 程序结束后(在4个处理器),“观察到的数据“存储在文件”data_modeling “中,可以用于反演。

    然后用户可以运行FWI程序:

  5. 介质的笛卡尔描述在文件”vp_Marmousi_init ,qp and rho. “中。用户可以使用ximage来绘制它们。例如:(这条指令官方给的不全)

    1
    ximage < vp_Marmousi_init n1=141 d1=25 d2=25 label1=’depth in m’ label2=’distance in
  6. 查看输入文件后,检查文件”fdfd_input”的“vp_Marmousi_init qp rho” ,观察到的数据文件在”fwi_input” 的第一行被设置为“data modeling”, “toy2dac_input”文件的“mode=1”,,然后用户可以运行模型。例如:

    1
    mpirun -n 4 ../bin/toy2dac

    程序结束后(在4个处理器上所用时间为几分钟),用户可以查看最终的模型。例如:(这条指令官方给的不全)

    1
    2
    ximage < param_vp_final n1=141 d1=25 d2=25 label1=’depth in m’ \\
    label2=’distance in m’ &

    其他二进制文件(中间文件等)也可以在文件terateXXX.dat中查看,其中XXX取决于所选择的优化方法。

Ubuntu设置和查看环境变量

查看环境变量有三个命令

  1. env

    env命令是environment的缩写,用于列出所有的环境变量

  2. export

    单独使用export命令也可以像env列出所有的环境变量,不过export命令还有其他额外的功能

  3. echo $PATH

    echo $PATH用于列出变量PATH的值,里面包含了已添加的目录

1
<basedir> = /public/home/daizy_   or   /public/home/pabebe/software/

安装intel编译器

下载网址:https://software.intel.com/en-us/qualify-for-free-software/student

安装包名:parallel_studio_xe_2020_update1_cluster_edition.tgz

参考:https://www.jianshu.com/p/d5895e1f836f

安装方法:

1
2
3
4
5
6
7
8
9
10
11
tar -xzvf parallel_studio_xe_2020_update1_cluster_edition.tgz
cd parallel_studio_xe_2020_update1_cluster_edition_online
./install.sh

#在bashrc文件中添加以下三行,vim插入模式 按8再按i
vim ~/.bashrc
export PATH=<basedir>/intel/bin:$PATH
export LD_LIBRARY_PATH = <basedir>/intel/compilers_and_libraries_2020.1.217/linux/compiler/lib/intel64:<basedir>/intel/mkl/lib/intel64:$LD_LIBRARY_PATH
source /public/home/andaoer/intel/impi/2019.7.217/intel64/bin/mpivars.sh

source ~/.bashrc
1
2
3
4
5
6
7
8
cd ~/software/parallel_studio_xe_2020_update1_cluster_edition_online
./install.sh
vim ~/.bashrc
#我的
export PATH=/public/home/pabebe/intel/bin:$PATH
export LD_LIBRARY_PATH= /public/home/pabebe/intel/compilers_and_libraries_2020.1.217/linux/compiler/lib/intel64:/public/home/pabebe/intel/mkl/lib/intel64:$LD_LIBRARY_PATH
source /public/home/pabebe/intel/impi/2019.7.217/intel64/bin/mpivars.sh
source ~/.bashrc

注意事项:1.该安装包中包含了Intel MKL,icc,impi的安装,无需进行这些库的另外安装

​ 2.学生可用学校邮箱申请免费安装包,申请后1~2天会收到含有激活码的邮件。

​ 3.无学校邮箱也可直接下载付费安装包,可以免费试用30天

安装parmetis

下载

安装包名:parmetis-4.0.3.tar.gz

安装方法:

1
2
3
4
5
6
7
8
9
10
11
tar -xzvf  parmetis-4.0.3.tar.gz

把 <basedir>/parmetis-4.0.3/metis/include/metis.h 中的 IDXTYPEWIDTH 改为64(针对64位系统)
新建文件夹parmetis403,把 <basedir>/parmetis-4.0.3/makefile 中
修改-prefix=/public/home/daizy_/parmetis403(路径默认/usr/local,在超算平台会报错)

make config
make
make install

将/public/home/daizy_/parmetis403/bin添加到PATH中
1
2
3
#我的
cd ~/software/parmetis-4.0.3
export PATH=/public/home/pabebe/software/parmetis403/bin:$PATH

安装scotch

下载网址:https://gforge.inria.fr/projects/scotch

安装包名:scotch_6.0.9.tar.gz

参考:https://blog.nickwhyy.top/scotch/

安装方法:

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
#确认编译环境
make --version
which lex
which yacc

新建文件夹scotch609,把 makefile 中修改-prefix=/public/home/daizy_/scotch609
# /public/home/pabebe/software/scotch609

cd ~/scotch_6.0.9/src
# cd ~/software/scotch_6.0.9/src
#先看下Makefile.inc.x86-64_pc_linux2.icc有没有被污染
ln -s Make.inc/Makefile.inc.x86-64_pc_linux2.icc Makefile.inc

make scotch
make install

cd esmumps

make scotch
make install

修改Makefile.inc文件,
添加INC=<impi/include>路径, /public/home/daizy_/intel/impi/2019.7.217/intel64/include
删除CFLAGS中的-restrict,LDFLAGS中添加 -lirc
# /public/home/pabebe/intel/impi/2019.7.217/intel64/include

cd ../
make ptscotch
make install

cd esmumps

make ptscotch
make ptinstall

编译scotch时的makefile.inc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
EXE		=
LIB = .a
OBJ = .o

MAKE = make
AR = ar
ARFLAGS = -ruv
CAT = cat
CCS = icc
CCP = mpicc
CCD = icc
CFLAGS = -O3 -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_PTHREAD -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -DSCOTCH_PTHREAD -restrict -DIDXSIZE64
CLIBFLAGS =
LDFLAGS = -lz -lm -lrt -pthread
CP = cp
LEX = flex -Pscotchyy -olex.yy.c
LN = ln
MKDIR = mkdir -p
MV = mv
RANLIB = ranlib
YACC = bison -pscotchyy -y -b y

编译ptscotch时的makefile.inc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
EXE		=
LIB = .a
OBJ = .o
INC = /public/home/pabebe/intel/impi/2019.7.217/intel164/include
MAKE = make
AR = ar
ARFLAGS = -ruv
CAT = cat
CCS = icc
CCP = mpicc
CCD = icc
CFLAGS = -O3 -DCOMMON_FILE_COMPRESS_GZ -DCOMMON_PTHREAD -DCOMMON_RANDOM_FIXED_SEED -DSCOTCH_RENAME -DSCOTCH_PTHREAD -DIDXSIZE64
CLIBFLAGS =
LDFLAGS = -lz -lm -lrt -pthread -lirc
CP = cp
LEX = flex -Pscotchyy -olex.yy.c
LN = ln
MKDIR = mkdir -p
MV = mv
RANLIB = ranlib
YACC = bison -pscotchyy -y -b y

bug

can’t find -lirc

导入他们自带的intel环境(先导杯曙光超算平台提供) 最好每次都检查一下

1
2
module load  compiler/intel/2017.5.239 
module list

安装MUMPS

下载网址:http://mumps.enseeiht.fr/

安装包名:MUMPS_5.3.1.tar.gz

参考:https://blog.csdn.net/jiangjjp2812/article/details/49632697

https://blog.csdn.net/weixin_30721899/article/details/96455694

https://www.cnblogs.com/Orien/p/5920285.html

https://zhuanlan.zhihu.com/p/136580603

安装方法:

1
2
3
4
5
6
7
8
9
10
cd MUMPS_5.3.1   
# cd ~/software/MUMPS_5.3.1
#将Make.inc/Makefile.INTEL.PAR复制在MUMP_5.3.1根目录下
#需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。
cp -i Make.inc/Makefile.INTEL.PAR ./Makefile.inc

#修改Makefile.inc中的路径

make all lib
#编译成功的标识-会在lib目录下生成6个库文件

注意事项:Makefile.inc中路径的修改不仅仅是网上教程的几行,所有库的路径都需要根据自己的环境进行修改,可以根据报错来检查路径是否错误。MUMPS在make过程中基本所有的错误都源于库路径不正确。如果-openmp报错,将Makefile.inc的openmp改为qopenmp

编译MUMPS时的makefile.inc文件

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#
# This file is part of MUMPS 5.3.1, released
# on Fri Apr 10 13:52:30 UTC 2020
#
#Begin orderings

# NOTE that PORD is distributed within MUMPS by default. It is recommended to
# install other orderings. For that, you need to obtain the corresponding package
# and modify the variables below accordingly.
# For example, to have Metis available within MUMPS:
# 1/ download Metis and compile it
# 2/ uncomment (suppress # in first column) lines
# starting with LMETISDIR, LMETIS
# 3/ add -Dmetis in line ORDERINGSF
# ORDERINGSF = -Dpord -Dmetis
# 4/ Compile and install MUMPS
# make clean; make (to clean up previous installation)
#
# Metis/ParMetis and SCOTCH/PT-SCOTCH (ver 6.0 and later) orderings are recommended.
#

# 添加根路径
LADIR = /public/home/pabebe/software
topdir = $(LADIR)/MUMPS_5.3.1

# 添加scotch
SCOTCHDIR = ${LADIR}/scotch_6.0.9
ISCOTCH = -I$(SCOTCHDIR)/include
#
# You have to choose one among the following two lines depending on
# the type of analysis you want to perform. If you want to perform only
# sequential analysis choose the first (remember to add -Dscotch in the ORDERINGSF
# variable below); for both parallel and sequential analysis choose the second
# line (remember to add -Dptscotch in the ORDERINGSF variable below)

#LSCOTCH = -L$(SCOTCHDIR)/lib -lesmumps -lscotch -lscotcherr
# 添加ptscotch库
LSCOTCH = -L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr -lesmumps -lscotch -lscotcherr


LPORDDIR = $(topdir)/PORD/lib/
IPORD = -I$(topdir)/PORD/include/
LPORD = -L$(LPORDDIR) -lpord

#LMETISDIR = /opt/metis-5.1.0/build/Linux-x86_64/libmetis
#IMETIS = /opt/metis-5.1.0/include

# You have to choose one among the following two lines depending on
# the type of analysis you want to perform. If you want to perform only
# sequential analysis choose the first (remember to add -Dmetis in the ORDERINGSF
# variable below); for both parallel and sequential analysis choose the second
# line (remember to add -Dparmetis in the ORDERINGSF variable below)

#LMETIS = -L$(LMETISDIR) -lmetis
#LMETIS = -L$(LMETISDIR) -lparmetis -lmetis
# 添加parmetis库
LMETIS = -L$(LADIR)/parmetis-4.0.3/build/Linux-x86_64/libmetis -L$(LADIR)/parmetis-4.0.3/build/Linux-x86_64/libparmetis -lparmetis -lmetis

# The following variables will be used in the compilation process.
# Please note that -Dptscotch and -Dparmetis imply -Dscotch and -Dmetis respectively.
# If you want to use Metis 4.X or an older version, you should use -Dmetis4 instead of -Dmetis
# or in addition with -Dparmetis (if you are using parmetis 3.X or older).
# 并行-Dptscotch and -Dparmetis
ORDERINGSF = -Dscotch -Dmetis -Dpord -Dptscotch -Dparmetis
#ORDERINGSF = -Dpord
ORDERINGSC = $(ORDERINGSF)

LORDERINGS = $(LMETIS) $(LPORD) $(LSCOTCH)
IORDERINGSF = $(ISCOTCH)
IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH)

#End orderings
########################################################################
################################################################################

PLAT =
LIBEXT = .a
OUTC = -o
OUTF = -o
RM = /bin/rm -f
CC = mpiicc
FC = mpiifort
FL = mpiifort
AR = ar vr
#RANLIB = ranlib
RANLIB = echo
# Make this variable point to the path where the Intel MKL library is
# installed. It is set to the default install directory for Intel MKL.

# 添加Intel MKL
MKLROOT=/public/home/pabebe/intel/mkl/lib/intel64
SCALAP = -L$(MKLROOT) -lmkl_scalapack_lp64 -lmkl_blacs_intelmpi_lp64

#LAPACK = -L$(MKLROOT) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core
#LIBPAR = $(SCALAP) $(LAPACK)

SEFTDEF= -L/public/home/pabebe/intel/compilers_and_libraries_2020.1.217/linux/mpi/intel64/lib/
LIBPAR = $(SCALAP) $(SEFTDEF)$(LPORD) $(LMETIS) $(LSCOTCH)


INCSEQ = -I$(topdir)/libseq
LIBSEQ = $(LAPACK) -L$(topdir)/libseq -lmpiseq

LIBBLAS = -L$(MKLROOT) -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core
LIBOTHERS = -lpthread

#Preprocessor defs for calling Fortran from C (-DAdd_ or -DAdd__ or -DUPPER)
CDEFS = -DAdd_

#Begin Optimized options
OPTF = -O -nofor_main -DBLR_MT -qopenmp -DGEMMT_AVAILABLE
OPTL = -O -nofor_main -qopenmp
OPTC = -O -qopenmp
#End Optimized options

# 添加INCPAR
INCPAR = -I$(topdir)/include -I $(LADIR)/parmetis-4.0.3/include -I $(LADIR)/parmetis-4.0.3/metis/include

INCS = $(INCPAR)
LIBS = $(LIBPAR)
LIBSEQNEEDED =

bug

error: “METIS_ERROR” has already been declared in the current scope

将scotch_6.0.9/include/parmetis.h 里 第94-101注释掉,不然编译出错s

scotch_6.0.9/include/metis.h(90): error: identifier “SCOTCH_Num” is undefined

将第90行 typedef SCOTCH_Num idx_t;修改为typedef int idx_t;

/public/home/pabebe/software/scotch_6.0.9/lib/libptscotch.a(dgraph_band.o): In function _SCOTCHdgraphBand2Coll': dgraph_band.c:(.text+0xf5): undefined reference to_SCOTCHmemAllocGroup’
/public/home/pabebe/software/scotch_6.0.9/lib/libptscotch.a(dgraph_band.o): In function _SCOTCHdgraphBand2Ptop': dgraph_band.c:(.text+0x7b8): undefined reference to_SCOTCHmemAllocGroup’
/public/home/pabebe/software/scotch_6.0.9/lib/libptscotch.a(dgraph_band.o): In function `_SCOTCHdgraphBand’:

一大堆关于scotch未定义的错

Make.inc 在LSCOTCH = -L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr 后面添加这几个库 -lesmumps -lscotch -lscotcherr

ar: two different operation options specified,这个是因为多个库文件要链接时,一定要每个库文件前都有一个 -l 选项

MUMPS

提示缺少metis.h,将metis/include里的同名文件复制到MUMPS/PORD/include中

MUMPS2

MUMPS

MUMPS2

安装TOOLBOX_OPTIMIZATION

1
2
3
cd TOOLBOX_OPTIMIZATION
#cd ~/software/TOOLBOX_OPTIMIZATION
make

安装 toy2dac

下载:https://seiscope2.osug.fr/TOY2DAC,82?lang=fr

参考:https://zhuanlan.zhihu.com/p/136580603

http://bbs.fcode.cn/thread-1562-1-1.html

安装步骤:

1
2
3
4
5
<basedir>/toy2dac/src/MAKE.INC/Makefile.inc_THERA 复制到 src目录下,重命名问Makefile.inc

修改Makefile,inc的所有路径:LADIR,OPTIM,SCOTCHDIR,LMUMPS,LMKL等等;将-assume -byterecl删除,否则会报错

在src目录中make,可在<basedir>/toy2dac/bin目录下生成目标文件toy2dacsp

注意事项:

1
make过程中会频繁报错,基本都是路径不正确导致,请检查路径是否正确并手动添加库文件路径。
1
2
3
#我的
cd ~/software/TOY2DAC_V2.6_2019_05_24/src
make

编译toy2dac时的makefile.inc文件

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
LADIR =  /public/home/pabebe/software

OPTIM = $(LADIR)/TOOLBOX_OPTIMIZATION

###########################################
# SETUP THE ARCHITECTURE
###########################################
###########################################
# structure 32 bits nothing to do
# structure LP64 with 32 bits integer
# the most used environment openmpi is set for that

IA=_lp64

# structure ILP64 with 64 bits integer
# require specific openmpi
#IA=_ilp64

###########################################
# SET SINGLE PRECISION(sp) VERSUS DOUBLE PRECISION(dp) CODE
###########################################
EXT=sp


RM = /bin/rm -f

CC = mpiicc
FC = mpiifort
FL = mpiifort

AR = ar vr
RANLIB = echo

#DOUBLE VERSUS SINGLE PRECISION LU FACTORIZATION:
# -D_sp (single precision)
# -D_dp (double precision)

OPT_PRE = -cpp -D_$(EXT)


#OPTIONS COMPILE
OPTF = -O3 $(OPT_PRE) # -assume byterecl
OPTC = -O3 $(OPT_PRE)
OPTL = -O3 $(OPT_PRE) # -assume byterecl
#OPTF = -O3
#OPTC = -O3
#OPTL = -O3
#OPTF = -assume byterecl -check all -debug -g -O0 -fp-stack-check -traceback -ftrapuv -implicitnone -warn truncated_source -warn argument_checking \
#-warn declarations -warn alignments -warn ignore_loc -warn usage -mcmodel=medium -shared-intel $(OPT_PRE)
#OPTC = -I/usr/openwin/include -debug all -CB -traceback
#OPTL = -assume byterecl -check all -debug -g -O0 -fp-stack-check -traceback -ftrapuv -implicitnone -warn truncated_source -warn argument_checking \
#-warn declarations -warn alignments -warn ignore_loc -warn usage -mcmodel=medium -shared-intel $(OPT_PRE)
OPTFF = ${OPTF}

#Begin orderings

SCOTCHDIR = $(LADIR)/scotch_6.0.9
ISCOTCH = -I$(SCOTCHDIR)/include
LSCOTCH = -L$(SCOTCHDIR)/lib -lptesmumps -lptscotch -lptscotcherr -lesmumps -lscotch -lscotcherr

topdir = $(LADIR)/MUMPS_5.3.1
IPORD = -I$(topdir)/PORD/include/
LPORD = -L$(topdir)/PORD/lib/ -lpord

LMETIS = -L$(LADIR)/parmetis-4.0.3/build/Linux-x86_64/libmetis -L$(LADIR)/parmetis-4.0.3/build/Linux-x86_64/libparmetis -lparmetis -lmetis

# The following variables will be used in the compilation process.
# Please note that -Dptscotch and -Dparmetis imply -Dscotch and -Dmetis respectively.
ORDERINGSF = -Dscotch -Dmetis -Dpord -Dptscotch -Dparmetis
#ORDERINGSF = -Dmetis -Dpord -Dparmetis
ORDERINGSC = $(ORDERINGSF)

LORDERINGS = $(LMETIS) $(LPORD) $(LSCOTCH)
IORDERINGSF = $(ISCOTCH)
IORDERINGSC = $(IMETIS) $(IPORD) $(ISCOTCH)

LMUMPS = -L$(topdir)/lib -lcmumps -lmumps_common
IMUMPS = -I$(topdir)/include

#
# MKL LIBRARY ...
#
#############################################################################
#LMKL=-L $(LIBRARY_PATH) -lmkl_intel$(IA) -lmkl_intel_thread -lmkl_core -lmkl_blas95$(IA) -lmkl_scalapack$(IA) -lmkl_blacs_openmpi$(IA) -lmkl_lapack95$(IA) -lifcore -lm -openmp -lpthread


LMKL = -L/public/home/pabebe/intel/mkl/lib/intel64 -L/public/home/pabebe/intel/compilers_and_libraries_2020.1.217/linux/compiler/lib/intel64 -liomp5 -lmkl_intel$(IA) -lmkl_intel_thread -lmkl_core -lmkl_blas95$(IA) -lmkl_scalapack$(IA) -lmkl_blacs_intelmpi$(IA) -lmkl_lapack95$(IA) -lifcore -qopenmp -lpthread -lm

LOPTIM=-L $(OPTIM)/lib -lSEISCOPE_OPTIM
IOPTIM = -I $(OPTIM)/COMMON/include


# 添加INCPAR
INCPAR = $(IMUMPS) $(IPORD) -I ../include $(IOPTIM) -I $(LADIR)/parmetis-4.0.3/include -I $(LADIR)/parmetis-4.0.3/metis/include

LIBPAR=$(LMUMPS) $(LPORD) $(LMETIS) $(LSCOTCH) $(LMKL) $(LOPTIM)

#Parallel:
INC = $(INCPAR)
LIB = $(LIBPAR)

## FOR LIBRARIES BUILD-UP
INCL = $(IMUMPS) $(IPORD) -I ../include $(IOPTIM) -I $(LADIR)/parmetis-4.0.3/include -I $(LADIR)/parmetis-4.0.3/metis/include

bug

toy2dac

​ gfortran 严格一些,默认情况下,不允许每行超过132列的长度。在Fortran中当程序代码中的一行超过132个字符时,至多可以有39个续行。续行标志固定为“&”。当一行代码的最后一个字符为“&”时,则表道示下一行与本行接续;当一行代码的第一个字符为“&”时,则表示本行与上一行接续。

/public/home/pabebe/software//MUMPS_5.3.1/lib/libcmumps.a(csol_aux.o): undefined reference to symbol ‘__svml_roundf4’

在makefile最后一行修改为

1
$(FL)  $(OPTL) $(SUBINV) toy2dac.o $(LIB) -lsvml -lintlc -o $(BIN)/toy2dac$(EXT)

安装Ximage

下载:https://pypi.org/project/ximage/#files

运行toy2dac

1
2
3
4
5
6
7
8
# 以高斯扰动模型为例
# run_ball是对 run_ball_template的拷贝
cd ~/software/TOY2DAC_V2.6_2019_05_24/run_ball
# cd ~/software/TOY2DAC_V2.6_2019_05_24/run_marmousi
# 建模

mpirun -n 4 ../bin/toy2dacsp
# 反演

vp_homogeneous qp rho epsilon delta theta

bug

runerror

出现无法连接到intel指定库的情况。

intel环境没有设置好

---------------- 本文结束 ----------------

本文标题:window编译并运行TOY2DAC

文章作者:Pabebe

发布时间:2020年07月26日 - 13:19:03

最后更新:2020年08月10日 - 13:05:00

原始链接:https://pabebezz.github.io/article/71a7f63d/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%