4#include <oneapi/tbb/enumerable_thread_specific.h>
5#include <oneapi/tbb/concurrent_unordered_map.h>
6#include "../common/utils.h"
10template <
typename value>
45 std::shared_ptr<MortonTree_t>
tree;
56 tbb::enumerable_thread_specific<std::vector<complex_value>>
local_work1;
57 tbb::enumerable_thread_specific<std::vector<complex_value>>
local_work2;
void Multipole(complex_value *a, const std::pair< size_t, size_t > &particle_range, const Vector3d &z0, double *Pnm, std::complex< double > *eim)
std::vector< std::vector< complex_value > > outer_expansions
tbb::enumerable_thread_specific< std::vector< complex_value > > local_work2
void Solve(std::vector< particle_t > &&particles, double eps=1.e-8, int N=FMM_AUTO, int tree_depth=FMM_AUTO)
void M2L(const complex_value *a, const Vector3d &p0, complex_value *b, std::vector< complex_value > &work1, std::vector< complex_value > &work2)
std::vector< Vector3d > dipolevelocities
std::vector< std::vector< complex_value > > inner_expansions
void L2L(const complex_value *a, const Vector3d &p0, complex_value *b, std::vector< complex_value > &work1, std::vector< complex_value > &work2)
std::vector< Vector3d > moments
void RotateZ(const complex_value *a, const std::vector< std::complex< double > > &rotation_exp, complex_value *b)
MortonTree< 3, point3d, value > MortonTree_t
std::vector< Vector3d > forces
void M2M(const complex_value *a, const Vector3d &p0, complex_value *b, std::vector< complex_value > &work1, std::vector< complex_value > &work2)
std::conditional_t< std::is_same_v< value, double >, std::complex< double >, Vector3cd > complex_value
std::vector< double > potentials
std::shared_ptr< MortonTree_t > tree
typename MortonTree_t::TreeCell_t TreeCell_t
tbb::enumerable_thread_specific< std::vector< complex_value > > local_work1
void RotateY(const complex_value *a, const std::vector< double > &dmatrix, complex_value *res)
std::unordered_map< int, std::vector< double > > dmatrix
Vector3< std::complex< double > > Vector3cd