/******************************************************** * ██████╗ ██████╗████████╗██╗ * ██╔════╝ ██╔════╝╚══██╔══╝██║ * ██║ ███╗██║ ██║ ██║ * ██║ ██║██║ ██║ ██║ * ╚██████╔╝╚██████╗ ██║ ███████╗ * ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝ * 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 . * * 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_nodes, array *fmm_triangles, std::vector *front_node, std::vector *record_node, std::vector *end_node = nullptr, sparray2d *jn = nullptr, array *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_nodes, array *fmm_triangles, seis_point2d_tri *in_source, seis_point2d_tri *in_receiver, array *rece_ele_grad = nullptr, std::vector *close_node_ptr = nullptr, std::vector *record_node_ptr = nullptr, sparray2d *jn_ptr = nullptr, array *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_nodes, array *fmm_triangles, seis_point2d_tri *in_source, seis_point2d_tri *in_receiver, std::vector *reflect_node, array *rece_ele_grad = nullptr, std::vector *close_node_ptr = nullptr, std::vector *record_node_ptr = nullptr, sparray2d *jn_ptr = nullptr, array *tmp_jn_ptr = nullptr, array *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_nodes, array *fmm_tetrahedrons, std::vector *front_node, std::vector *record_node, std::vector *end_node = nullptr, sparray2d *jn = nullptr, array *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_nodes, array *fmm_tetrahedrons, seis_point3d_tet *in_source, seis_point3d_tet *in_receiver, array *rece_ele_grad = nullptr, std::vector *close_node_ptr = nullptr, std::vector *record_node_ptr = nullptr, sparray2d *jn_ptr = nullptr, array *tmp_jn_ptr = nullptr); } #endif //_GCTL_SEISMIC_FMM_KERNEL_H