gctl_seismic/lib/seismic/fmm_kernel.h

191 lines
12 KiB
C
Raw Normal View History

2024-09-10 20:22:53 +08:00
/********************************************************
*
*
*
*
*
*
* 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