简介
汇总自行创建的Python函数,主要关于MINEOS和SPECNM相关输入、输出文件的创建与读取。
汇总函数包位于最后一章:函数包
中。
模型创建相关
使用MINEOS模型创建相关的nd模型与平均化模型。
使用Obspy.taup创建npz模型以供Taup绘图使用
1 | def create_taupnd_model(model_dir, model_name, output_dir): |
通过已有模型进行平均化
需要个性化的内容:
1、原始模型文件的路径。该模型必须为MINEOS所需格式。路径名包含绝对路径及文件名称。例如:
/home/shizhiyuanubuntu/PycharmProjects/Seismology/models/old_models/prem_noocean.txt
2、需要平均化的边界R值列表。
该列表中的所有值为平均化之后各个层的边界半径值,单位为m。注意:需要从小到大排列,且没有重复,并包含地表与球心半径值。
例如:
1 | boundaries = [0., 1221500, 3480000, 6291000, 6371000] |
3、输出模型名称。
不包含后缀的名称。
1 | model_name = 'prem_mean_LVZ_350' |
4、ICB与CMB的半径R值。
需要通过该值查找输出响应索引,因此需要指明ICB与CMB的R值。
例如:
1 | ICB = 1221500. |
5、是否需要添加低速带。
此选项在平均化模型之后进行,手动设置低速带顶底边界和vp、vs速度。
例如:
1 | ifLVZ = True |
代码:
1 | from numpy import pi |
读取MINEOS模型的相关内容
简介:读取MINEOS模型
输入:
- modelfile MINEOS模型文件绝对路径
输出:
- 一个列表,包含:
[Radius, rho, vp, vs, qp, qs, eta]
其中每一个元素为一个列表,如Radius
为一个列表,其他元素对应Radius
相同索引所在的值。
1 | import os |
将MINEOS模型转化为nd模型
需要引入读取MINEOS模型的相关内容
中的两个函数
个性化修改项:
- model_name 输出的nd模型的名称,不带后缀。程序会自动添加nd后缀
- model_dir 输入的MINEOS模型的绝对路径。
这里的示例中使用相同的模型名称,因此直接调用更加方便。
第一项为模型所在文件夹路径,第二项为模型名称,第三项为MINEOS模型文件格式后缀。
1 | model_name = 'prem_mean_LVZ_300' |
绘制MINEOS模型
模型绘制可以自行进行,这里提供一个绘图示例,每一种参数单独绘制在子图中。
1 | import matplotlib.pyplot as plt |
MINEOS输出内容读取
振型文件读取
振型文件指由MINEOS min_bran输出的文件,一般命名为模型名称+_振型类型
,振型类型为S、T或R。
函数
put_freq_in_same:将MINEOS输出的振型文件的一个参数整合为一个列表,按照n、l排列
read_mineos_modefile:读取MINEOS输出的振型文件中的相关信息并输出
put_0_velocity:取同一个径向阶数值的相关参数。
1 | import matplotlib.pyplot as plt |
振型文件读取内容绘图示例
1 | # 读取振型文件 |
本征函数文件读取
函数
- mineos_file_read
1 | import numpy as np |
SPECNM输出内容读取
振型相关文件的读取
1 | def read_SPECNM_mode_frequency_output(mode_file_freq): |
读取并绘制本征函数
绘制单个本征函数图像
1 | from specnm import rayleigh_fg |
绘制本征函数图像
1 | import specnm |
函数包
SPECNM_read.py
简介:关于SPECNM软件相关输出内容的读取、绘图、和一些数学操作。
函数目录:
- get_filename(path) 对文件是否存在进行判断与处理
- read_SPECNM_mode_frequency_output(mode_file_freq) 读取SPECNM振型输出文件;仅输出频率信息
- find_specnm_mode_freq(mode_file, radial_order, angular_order)
- SPECNM_mode_name_make(all_dir, model_name, mode_type)
- read_SPECNM_mode_output(mode_file, modetype) 读取SPECNM振型输出文件;相关函数为 Love_output 等SPECNM振型输出函数
- find_freq(mode_file, modetype, angular_order, radial_order) 寻找SPECNM特定一系列振型的频率,已知振型参数n(radial order)、l(angular order)
- open_file_and_plot_eigenfunctions_signal(radial_order, angular_order, data_dir, eigenfunction_type=‘U’, linestyle=‘k-’,ifdr = False, ifnormalized=0) 输出单个本征函数文件,绘制图像。输出为plot的一条曲线,需要自行设置figure以及plot.show()
- specnm_file_read(wdir, mode_type, radial_order, angular_order) 读取SPECNM本征函数文件
- plot_specnm_eigenfunction_with_eig(wradius, weigenfunction , ifnormalized=0,
ifnegative=False, mode_type=‘W’, linecolorsytle=‘k-’,
linewidth=1, if_radius_normalized = False, ifaxis=False, ifboundary=False,
ifreverse=False, iflines=False) 绘制特定振型的本征函数,输入为本征函数值 - plot_W_eigenfunction(wdir, radial_order, angular_order, ifnormalized=0,
ifnegative=False, mode_type=‘W’, linecolorsytle=‘k-’,
linewidth=1, if_radius_normalized = False, ifaxis=False, ifboundary=False,
ifreverse=False, iflines=False) 绘制特定振型的本征函数, 输入为本征函数文件路径
2024.6.21 新增关于插值与归一化的内容
- specnm_eig_interpolate(Radius, eigenfunction, order=5, ext=3) 对某一个本征函数序列进行样条插值,使用scipy.interpolate.InterpolatedUnivariateSpline函数。
- specnm_eig_interpolate_R(splfunctions, split_radius, R) 返回某一半径值位置的本征函数插值得到的值
- specnm_eig_interpolate_Rs(splfunctions, split_radius, Rs) 使用新的Radius序列计算插值后的本征函数。
- normalize_toroidal(model_radius, rho, angular_order, eigen_radius, W, mode_freq, W_order=5, W_ext=1, rho_order=1, rho_ext=1) 对环型振型本征函数分量W进行归一化,使用MINEOS的归一化方法
- normalize_spheroidal(model_radius, rho, angular_order, eigen_radius, U, V, mode_freq, U_order=5, U_ext=1, V_order=5, V_ext=1, rho_order=1, rho_ext=1) 对球型振型本征函数分量W进行归一化,使用MINEOS的归一化方法
- specnm_eigenfunction_normalize(specnm_output_dir, model_name, model_dir, mode_type, radial_order, angular_order) 通过输入SPECNM本征函数文件进行读取并归一化,给出归一化的本征函数和半径
1 | import os |
MINEOS_read.py
关于MINEOS软件输入与输出、模型相关的函数:
函数列表:
- get_filename(path)
- MINEOS_model_read(modelfile) 读取MINEOS模型,即MINEOS DEMO中给出的标准模型
- put_freq_in_same(n, l, freq, nmax=10000, lmax=101, ifnan=True) 将MINEOS输出的振型文件的一个参数整合为一个列表,按照n、l排列
- read_mineos_modefile(modefile_dir, model_name, mode_type) 读取MINEOS输出的振型文件中的相关信息并输出
- put_0_velocity(n,frequency, ph_vel, grop_vel, ni = 0) 取同一个径向阶数值的相关参数。
- mineos_file_read(MINEOS_eigenfunction_dir, Modetype, radial_order, angular_order, Mineos_file=[]) 读取MINEOS单个本征函数文件
- numofzero(numb) 添加0,因为MINEOS输出的本征函数文件命名规则需要添加很多0,因此使用该函数创建本征函数名以供读取使用。
- MINEOS_eigenfunction_file_name(radial_order, angular_order) 创建MINEOS本征函数文件名
- plot_MINEOS_W_eigenfunction(wdir, radial_order, angular_order, ifnormalized=0,
ifnegative=False, mode_type=‘W’, linecolorsytle=‘k-’,
linewidth=1, if_radius_normalized = False, ifaxis=False, ifboundary=False,
ifreverse=False, iflines=False) 绘制特定振型的本征函数 2024.6.21 已解决ifnormalized = 0时存在BUG
1 | import os |