|
@@ -6,13 +6,13 @@
|
|
|
* implementation of various kernels for FMM.
|
|
|
*/
|
|
|
|
|
|
-#ifndef _PVFMM_FMM_KERNEL_HPP_
|
|
|
-#define _PVFMM_FMM_KERNEL_HPP_
|
|
|
+#include <string>
|
|
|
|
|
|
#include <pvfmm_common.hpp>
|
|
|
-#include <quad_utils.hpp>
|
|
|
#include <mem_mgr.hpp>
|
|
|
-#include <string>
|
|
|
+
|
|
|
+#ifndef _PVFMM_FMM_KERNEL_HPP_
|
|
|
+#define _PVFMM_FMM_KERNEL_HPP_
|
|
|
|
|
|
namespace pvfmm{
|
|
|
|
|
@@ -41,7 +41,7 @@ struct Kernel{
|
|
|
* \brief Constructor.
|
|
|
*/
|
|
|
Kernel(Ker_t poten, Ker_t dbl_poten, const char* name, int dim_,
|
|
|
- const int (&k_dim)[2], bool homogen_=false, T ker_scale=0,
|
|
|
+ std::pair<int,int> k_dim, bool homogen_=false, T ker_scale=0,
|
|
|
size_t dev_poten=(size_t)NULL, size_t dev_dbl_poten=(size_t)NULL);
|
|
|
|
|
|
/**
|
|
@@ -73,7 +73,7 @@ struct Kernel{
|
|
|
template<typename T, void (*A)(T*, int, T*, int, T*, int, T*, mem::MemoryManager* mem_mgr),
|
|
|
void (*B)(T*, int, T*, int, T*, int, T*, mem::MemoryManager* mem_mgr)>
|
|
|
Kernel<T> BuildKernel(const char* name, int dim,
|
|
|
- const int (&k_dim)[2], bool homogen=false, T ker_scale=0){
|
|
|
+ std::pair<int,int> k_dim, bool homogen=false, T ker_scale=0){
|
|
|
size_t dev_ker_poten ;
|
|
|
size_t dev_dbl_layer_poten;
|
|
|
#ifdef __INTEL_OFFLOAD
|
|
@@ -91,7 +91,7 @@ Kernel<T> BuildKernel(const char* name, int dim,
|
|
|
|
|
|
template<typename T, void (*A)(T*, int, T*, int, T*, int, T*, mem::MemoryManager* mem_mgr)>
|
|
|
Kernel<T> BuildKernel(const char* name, int dim,
|
|
|
- const int (&k_dim)[2], bool homogen=false, T ker_scale=0){
|
|
|
+ std::pair<int,int> k_dim, bool homogen=false, T ker_scale=0){
|
|
|
size_t dev_ker_poten ;
|
|
|
#ifdef __INTEL_OFFLOAD
|
|
|
#pragma offload target(mic:0)
|
|
@@ -133,36 +133,33 @@ void laplace_grad(T* r_src, int src_cnt, T* v_src, int dof, T* r_trg, int trg_cn
|
|
|
|
|
|
|
|
|
|
|
|
-int dim_laplace_poten[2]={1,1};
|
|
|
-int dim_laplace_grad [2]={1,3};
|
|
|
-
|
|
|
#ifdef QuadReal_t
|
|
|
-const Kernel<QuadReal_t> laplace_potn_q=BuildKernel<QuadReal_t, laplace_poten, laplace_dbl_poten>("laplace" , 3, dim_laplace_poten, true, 1.0);
|
|
|
-const Kernel<QuadReal_t> laplace_grad_q=BuildKernel<QuadReal_t, laplace_grad >("laplace_grad", 3, dim_laplace_grad , true, 2.0);
|
|
|
+const Kernel<QuadReal_t> laplace_potn_q=BuildKernel<QuadReal_t, laplace_poten, laplace_dbl_poten>("laplace" , 3, std::pair<int,int>(1,1), true, 1.0);
|
|
|
+const Kernel<QuadReal_t> laplace_grad_q=BuildKernel<QuadReal_t, laplace_grad >("laplace_grad", 3, std::pair<int,int>(1,3), true, 2.0);
|
|
|
#endif
|
|
|
|
|
|
-const Kernel<double > laplace_potn_d=BuildKernel<double , laplace_poten, laplace_dbl_poten>("laplace" , 3, dim_laplace_poten, true, 1.0);
|
|
|
-const Kernel<double > laplace_grad_d=BuildKernel<double , laplace_grad >("laplace_grad", 3, dim_laplace_grad , true, 2.0);
|
|
|
+const Kernel<double > laplace_potn_d=BuildKernel<double , laplace_poten, laplace_dbl_poten>("laplace" , 3, std::pair<int,int>(1,1), true, 1.0);
|
|
|
+const Kernel<double > laplace_grad_d=BuildKernel<double , laplace_grad >("laplace_grad", 3, std::pair<int,int>(1,3), true, 2.0);
|
|
|
|
|
|
-const Kernel<float > laplace_potn_f=BuildKernel<float , laplace_poten, laplace_dbl_poten>("laplace" , 3, dim_laplace_poten, true, 1.0);
|
|
|
-const Kernel<float > laplace_grad_f=BuildKernel<float , laplace_grad >("laplace_grad", 3, dim_laplace_grad , true, 2.0);
|
|
|
+const Kernel<float > laplace_potn_f=BuildKernel<float , laplace_poten, laplace_dbl_poten>("laplace" , 3, std::pair<int,int>(1,1), true, 1.0);
|
|
|
+const Kernel<float > laplace_grad_f=BuildKernel<float , laplace_grad >("laplace_grad", 3, std::pair<int,int>(1,3), true, 2.0);
|
|
|
|
|
|
template<class T>
|
|
|
struct LaplaceKernel{
|
|
|
- static Kernel<T>* potn_ker;
|
|
|
- static Kernel<T>* grad_ker;
|
|
|
+ inline static const Kernel<T>& potn_ker();
|
|
|
+ inline static const Kernel<T>& grad_ker();
|
|
|
};
|
|
|
|
|
|
#ifdef QuadReal_t
|
|
|
-template<> Kernel<QuadReal_t>* LaplaceKernel<QuadReal_t>::potn_ker=(Kernel<QuadReal_t>*)&laplace_potn_q;
|
|
|
-template<> Kernel<QuadReal_t>* LaplaceKernel<QuadReal_t>::grad_ker=(Kernel<QuadReal_t>*)&laplace_grad_q;
|
|
|
+template<> const Kernel<QuadReal_t>& LaplaceKernel<QuadReal_t>::potn_ker(){ return laplace_potn_q; };
|
|
|
+template<> const Kernel<QuadReal_t>& LaplaceKernel<QuadReal_t>::grad_ker(){ return laplace_grad_q; };
|
|
|
#endif
|
|
|
|
|
|
-template<> Kernel<double>* LaplaceKernel<double>::potn_ker=(Kernel<double>*)&laplace_potn_d;
|
|
|
-template<> Kernel<double>* LaplaceKernel<double>::grad_ker=(Kernel<double>*)&laplace_grad_d;
|
|
|
+template<> const Kernel<double>& LaplaceKernel<double>::potn_ker(){ return laplace_potn_d; };
|
|
|
+template<> const Kernel<double>& LaplaceKernel<double>::grad_ker(){ return laplace_grad_d; };
|
|
|
|
|
|
-template<> Kernel<float>* LaplaceKernel<float>::potn_ker=(Kernel<float>*)&laplace_potn_f;
|
|
|
-template<> Kernel<float>* LaplaceKernel<float>::grad_ker=(Kernel<float>*)&laplace_grad_f;
|
|
|
+template<> const Kernel<float>& LaplaceKernel<float>::potn_ker(){ return laplace_potn_f; };
|
|
|
+template<> const Kernel<float>& LaplaceKernel<float>::grad_ker(){ return laplace_grad_f; };
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
//////// STOKES KERNEL ////////
|
|
@@ -189,17 +186,13 @@ void stokes_grad(T* r_src, int src_cnt, T* v_src_, int dof, T* r_trg, int trg_cn
|
|
|
|
|
|
|
|
|
|
|
|
-int dim_stokes_vel [2]={3,3};
|
|
|
-const Kernel<double> ker_stokes_vel =BuildKernel<double, stokes_vel, stokes_sym_dip>("stokes_vel" , 3, dim_stokes_vel ,true,1.0);
|
|
|
+const Kernel<double> ker_stokes_vel =BuildKernel<double, stokes_vel, stokes_sym_dip>("stokes_vel" , 3, std::pair<int,int>(3,3),true,1.0);
|
|
|
|
|
|
-int dim_stokes_press [2]={3,1};
|
|
|
-const Kernel<double> ker_stokes_press =BuildKernel<double, stokes_press >("stokes_press" , 3, dim_stokes_press ,true,2.0);
|
|
|
+const Kernel<double> ker_stokes_press =BuildKernel<double, stokes_press >("stokes_press" , 3, std::pair<int,int>(3,1),true,2.0);
|
|
|
|
|
|
-int dim_stokes_stress[2]={3,9};
|
|
|
-const Kernel<double> ker_stokes_stress=BuildKernel<double, stokes_stress >("stokes_stress", 3, dim_stokes_stress,true,2.0);
|
|
|
+const Kernel<double> ker_stokes_stress=BuildKernel<double, stokes_stress >("stokes_stress", 3, std::pair<int,int>(3,9),true,2.0);
|
|
|
|
|
|
-int dim_stokes_grad [2]={3,9};
|
|
|
-const Kernel<double> ker_stokes_grad =BuildKernel<double, stokes_grad >("stokes_grad" , 3, dim_stokes_grad ,true,2.0);
|
|
|
+const Kernel<double> ker_stokes_grad =BuildKernel<double, stokes_grad >("stokes_grad" , 3, std::pair<int,int>(3,9),true,2.0);
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
//////// BIOT-SAVART KERNEL ////////
|
|
@@ -208,8 +201,7 @@ const Kernel<double> ker_stokes_grad =BuildKernel<double, stokes_grad
|
|
|
template <class T>
|
|
|
void biot_savart(T* r_src, int src_cnt, T* v_src_, int dof, T* r_trg, int trg_cnt, T* k_out, mem::MemoryManager* mem_mgr);
|
|
|
|
|
|
-int dim_biot_savart[2]={3,3};
|
|
|
-const Kernel<double> ker_biot_savart=BuildKernel<double, biot_savart>("biot_savart", 3, dim_biot_savart,true,2.0);
|
|
|
+const Kernel<double> ker_biot_savart=BuildKernel<double, biot_savart>("biot_savart", 3, std::pair<int,int>(3,3),true,2.0);
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
//////// HELMHOLTZ KERNEL ////////
|
|
@@ -227,11 +219,9 @@ void helmholtz_grad(T* r_src, int src_cnt, T* v_src, int dof, T* r_trg, int trg_
|
|
|
|
|
|
|
|
|
|
|
|
-int dim_helmholtz [2]={2,2};
|
|
|
-const Kernel<double> ker_helmholtz =BuildKernel<double, helmholtz_poten>("helmholtz" , 3, dim_helmholtz );
|
|
|
+const Kernel<double> ker_helmholtz =BuildKernel<double, helmholtz_poten>("helmholtz" , 3, std::pair<int,int>(2,2));
|
|
|
|
|
|
-int dim_helmholtz_grad[2]={2,6};
|
|
|
-const Kernel<double> ker_helmholtz_grad=BuildKernel<double, helmholtz_grad >("helmholtz_grad", 3, dim_helmholtz_grad);
|
|
|
+const Kernel<double> ker_helmholtz_grad=BuildKernel<double, helmholtz_grad >("helmholtz_grad", 3, std::pair<int,int>(2,6));
|
|
|
|
|
|
}//end namespace
|
|
|
#ifdef __INTEL_OFFLOAD
|