191 lines
12 KiB
C++
191 lines
12 KiB
C++
/********************************************************
|
||
* ██████╗ ██████╗████████╗██╗
|
||
* ██╔════╝ ██╔════╝╚══██╔══╝██║
|
||
* ██║ ███╗██║ ██║ ██║
|
||
* ██║ ██║██║ ██║ ██║
|
||
* ╚██████╔╝╚██████╗ ██║ ███████╗
|
||
* ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
|
||
* Geophysical Computational Tools & Library (GCTL)
|
||
*
|
||
* Copyright (c) 2022 Yi Zhang (yizhang-geo@zju.edu.cn)
|
||
*
|
||
* GCTL is distributed under a dual licensing scheme. You can redistribute
|
||
* it and/or modify it under the terms of the GNU Lesser General Public
|
||
* License as published by the Free Software Foundation, either version 2
|
||
* of the License, or (at your option) any later version. You should have
|
||
* received a copy of the GNU Lesser General Public License along with this
|
||
* program. If not, see <http://www.gnu.org/licenses/>.
|
||
*
|
||
* If the terms and conditions of the LGPL v.2. would prevent you from using
|
||
* the GCTL, please consider the option to obtain a commercial license for a
|
||
* fee. These licenses are offered by the GCTL's original author. As a rule,
|
||
* licenses are provided "as-is", unlimited in time for a one time fee. Please
|
||
* send corresponding requests to: yizhang-geo@zju.edu.cn. Please do not forget
|
||
* to include some description of your company and the realm of its activities.
|
||
* Also add information on how to contact you by electronic and paper mail.
|
||
******************************************************/
|
||
|
||
#ifndef _GCTL_SEISMIC_FMM_KERNEL_H
|
||
#define _GCTL_SEISMIC_FMM_KERNEL_H
|
||
|
||
#include "gctl/core.h"
|
||
#include "fmm_data.h"
|
||
|
||
namespace gctl
|
||
{
|
||
/**
|
||
* @brief 使用二维三角网络的快速进行法计算初至波到时
|
||
*
|
||
* @param fmm_nodes 二维三角网络顶点数组
|
||
* @param fmm_triangles 二维三角形网络元素数组
|
||
* @param end_node 用于判定计算是否结束的顶点指针向量
|
||
* @param front_node FMM波前面顶点指针的向量的指针
|
||
* @param record_node FMM行进顺序的顶点指针的向量的指针
|
||
* @param jn 网络顶点走时相对于元素慢度的梯度值的指针。
|
||
* 需提前开辟空间,大小为fmm_nodes->size()
|
||
* @param temp_jn 计算jn_ptr时使用的临时梯度数组指针。
|
||
* 需提前开辟空间,大小为fmm_triangles->size()
|
||
*/
|
||
void fmm2d_forward_triangle(array<fmm_vertex2dc> *fmm_nodes,
|
||
array<fmm_triangle2d> *fmm_triangles,
|
||
std::vector<fmm_vertex2dc*> *front_node,
|
||
std::vector<fmm_vertex2dc*> *record_node,
|
||
std::vector<fmm_vertex2dc*> *end_node = nullptr,
|
||
sparray2d<double> *jn = nullptr,
|
||
array<double> *temp_jn = nullptr);
|
||
|
||
/**
|
||
* @brief 计算从一个激发点至一个接收点的初至波走时(体波直达)以及走时相对的模型元素慢度的梯度值
|
||
*
|
||
* 此函数有5个默认参数:
|
||
* 1. rece_ele_grad 当梯度数组不为空时,计算接收点走时相对于模型元素慢度的梯度值。
|
||
* 2. tmp_jn_ptr 梯度数组指针。若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 3. jn_ptr 网络顶点走时相对于元素慢度的梯度值的指针,若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 4. close_node_ptr FMM计算中保存波前面顶点指针的向量,若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 5. record_node_ptr FMM梯度计算中保存行进顺序的顶点指针的向量,若此指针为空,函数会使用
|
||
* 内部变量。在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
*
|
||
* @param fmm_nodes 三角网络顶点数组
|
||
* @param fmm_triangles 三角形网络元素数组
|
||
* @param in_source 源点位置指针,注意必须提前确定源点所在的三角形
|
||
* @param in_receiver 接收点位置指针,注意必须提前确定接收点所在的三角形
|
||
* @param rece_ele_grad 梯度数组指针。需提前开辟空间,大小为fmm_triangles->size()
|
||
* @param jn_ptr 网络顶点走时相对于元素慢度的梯度值的指针
|
||
* 需提前开辟空间,大小为fmm_nodes->size()
|
||
* @param tmp_jn_ptr 梯度数组指针。需提前开辟空间,大小为fmm_triangles->size()
|
||
* @param close_node_ptr FMM波前面顶点指针的向量的指针
|
||
* @param record_node_ptr FMM行进顺序的顶点指针的向量的指针
|
||
*/
|
||
void source2receiver_direct(array<fmm_vertex2dc> *fmm_nodes,
|
||
array<fmm_triangle2d> *fmm_triangles,
|
||
seis_point2d_tri *in_source,
|
||
seis_point2d_tri *in_receiver,
|
||
array<double> *rece_ele_grad = nullptr,
|
||
std::vector<fmm_vertex2dc*> *close_node_ptr = nullptr,
|
||
std::vector<fmm_vertex2dc*> *record_node_ptr = nullptr,
|
||
sparray2d<double> *jn_ptr = nullptr,
|
||
array<double> *tmp_jn_ptr = nullptr);
|
||
|
||
/**
|
||
* @brief 计算从一个激发点至一个接收点的初至波走时(反射波)以及走时相对的模型元素慢度的梯度值
|
||
*
|
||
* 此函数有6个默认参数:
|
||
* 1. rece_ele_grad 当梯度数组不为空时,计算接收点走时相对于模型元素慢度的梯度值。
|
||
* 2. tmp_jn_ptr 梯度数组指针。若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 3. jn_ptr 网络顶点走时相对于元素慢度的梯度值的指针,若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 4. close_node_ptr FMM计算中保存波前面顶点指针的向量,若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 5. record_node_ptr FMM梯度计算中保存行进顺序的顶点指针的向量,若此指针为空,函数会使用
|
||
* 内部变量。在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 6. reflect_index 记录反射面所在位置的向量。若此指针为空,函数会使用内部变量。在大规模计
|
||
* 算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
*
|
||
* @param fmm_nodes 三角网络顶点数组
|
||
* @param fmm_triangles 三角形网络元素数组
|
||
* @param in_source 源点位置指针,注意必须提前确定源点所在的三角形
|
||
* @param in_receiver 接收点位置指针,注意必须提前确定接收点所在的三角形
|
||
* @param reflect_node 反射面上的顶点指针向量
|
||
* @param rece_ele_grad 梯度数组指针。需提前开辟空间,大小为fmm_triangles->size()
|
||
* @param close_node_ptr FMM波前面顶点指针的向量的指针
|
||
* @param record_node_ptr FMM行进顺序的顶点指针的向量的指针
|
||
* @param jn_ptr 网络顶点走时相对于元素慢度的梯度值的指针
|
||
* 需提前开辟空间,大小为fmm_nodes->size()
|
||
* @param tmp_jn_ptr 梯度数组指针。需提前开辟空间,大小为fmm_triangles->size()
|
||
* @param reflect_index 反射面上的顶点标识
|
||
*/
|
||
void source2receiver_reflect(array<fmm_vertex2dc> *fmm_nodes,
|
||
array<fmm_triangle2d> *fmm_triangles,
|
||
seis_point2d_tri *in_source,
|
||
seis_point2d_tri *in_receiver,
|
||
std::vector<fmm_vertex2dc*> *reflect_node,
|
||
array<double> *rece_ele_grad = nullptr,
|
||
std::vector<fmm_vertex2dc*> *close_node_ptr = nullptr,
|
||
std::vector<fmm_vertex2dc*> *record_node_ptr = nullptr,
|
||
sparray2d<double> *jn_ptr = nullptr,
|
||
array<double> *tmp_jn_ptr = nullptr,
|
||
array<bool> *reflect_index = nullptr);
|
||
|
||
|
||
/**
|
||
* @brief 使用三维四面体网络的快速进行法计算初至波到时
|
||
*
|
||
* @param fmm_nodes 三维四面体网络顶点数组
|
||
* @param fmm_triangles 三维四面体网络元素数组
|
||
* @param end_node 用于判定计算是否结束的顶点指针向量
|
||
* @param close_node FMM波前面顶点指针的向量的指针
|
||
* @param record_node FMM行进顺序的顶点指针的向量的指针
|
||
* @param jn 网络顶点走时相对于元素慢度的梯度值的指针。
|
||
* 需提前开辟空间,大小为fmm_nodes->size()
|
||
* @param tmp_jn 计算jn_ptr时使用的临时梯度数组指针。
|
||
* 需提前开辟空间,大小为fmm_tetrahedrons->size()
|
||
*/
|
||
void fmm3d_forward_tetrahedron(array<fmm_vertex3dc> *fmm_nodes,
|
||
array<fmm_tetrahedron> *fmm_tetrahedrons,
|
||
std::vector<fmm_vertex3dc*> *front_node,
|
||
std::vector<fmm_vertex3dc*> *record_node,
|
||
std::vector<fmm_vertex3dc*> *end_node = nullptr,
|
||
sparray2d<double> *jn = nullptr,
|
||
array<double> *temp_jn =nullptr);
|
||
|
||
/**
|
||
* @brief 计算从一个激发点至一个接收点的初至波走时(体波直达)以及走时相对的模型元素慢度的梯度值
|
||
*
|
||
* 此函数有5个默认参数:
|
||
* 1. rece_ele_grad 当梯度数组不为空时,计算接收点走时相对于模型元素慢度的梯度值。
|
||
* 2. tmp_jn_ptr 梯度数组指针。若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 3. jn_ptr 网络顶点走时相对于元素慢度的梯度值的指针,若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 4. close_node_ptr FMM计算中保存波前面顶点指针的向量,若此指针为空,函数会使用内部变量。
|
||
* 在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
* 5. record_node_ptr FMM梯度计算中保存行进顺序的顶点指针的向量,若此指针为空,函数会使用
|
||
* 内部变量。在大规模计算时最好提供一个外部向量指针,扩大生存域,避免在函数内部反复生成新的向量。
|
||
*
|
||
* @param fmm_nodes 四面体网络顶点数组
|
||
* @param fmm_tetrahedrons 四面体网络元素数组
|
||
* @param in_source 源点位置指针,注意必须提前确定源点所在的三角形
|
||
* @param in_receiver 接收点位置指针,注意必须提前确定接收点所在的三角形
|
||
* @param rece_ele_grad 梯度数组指针。需提前开辟空间,大小为fmm_triangles->size()
|
||
* @param jn_ptr 网络顶点走时相对于元素慢度的梯度值的指针
|
||
* 需提前开辟空间,大小为fmm_nodes->size()
|
||
* @param tmp_jn_ptr 梯度数组指针。需提前开辟空间,大小为fmm_triangles->size()
|
||
* @param close_node_ptr FMM波前面顶点指针的向量的指针
|
||
* @param record_node_ptr FMM行进顺序的顶点指针的向量的指针
|
||
*/
|
||
void source2receiver_direct(array<fmm_vertex3dc> *fmm_nodes,
|
||
array<fmm_tetrahedron> *fmm_tetrahedrons,
|
||
seis_point3d_tet *in_source,
|
||
seis_point3d_tet *in_receiver,
|
||
array<double> *rece_ele_grad = nullptr,
|
||
std::vector<fmm_vertex3dc*> *close_node_ptr = nullptr,
|
||
std::vector<fmm_vertex3dc*> *record_node_ptr = nullptr,
|
||
sparray2d<double> *jn_ptr = nullptr,
|
||
array<double> *tmp_jn_ptr = nullptr);
|
||
}
|
||
|
||
#endif //_GCTL_SEISMIC_FMM_KERNEL_H
|