/********************************************************
* ██████╗ ██████╗████████╗██╗
* ██╔════╝ ██╔════╝╚══██╔══╝██║
* ██║ ███╗██║ ██║ ██║
* ██║ ██║██║ ██║ ██║
* ╚██████╔╝╚██████╗ ██║ ███████╗
* ╚═════╝ ╚═════╝ ╚═╝ ╚══════╝
* 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