BioCMAMC-ST
udf_includes.hpp
1#ifndef __BIO__EXT_MODULE_DEF__
2#define __BIO__EXT_MODULE_DEF__
3
4#ifdef DECLARE_EXPORT_UDF
5# include <dynlib/dyn_module.hpp>
6# include <dynlib/dynlib.hpp>
7# include <memory>
8#endif
9#include <Kokkos_Core.hpp>
10#include <mc/prng/prng.hpp>
11#include <mc/traits.hpp>
12#include <models/udf_model.hpp>
13
17namespace UnsafeUDF
18{
22 struct Loader
23 {
24 static std::size_t (*set_nvar_udf)();
25
26 static void (*init_udf)(const MC::KPRNG::pool_type& random_pool,
27 std::size_t idx,
28 const Models::UdfModel::SelfParticle& arr); //< init function ptr
29
30 static MC::Status (*update_udf)(const MC::KPRNG::pool_type& random_pool,
31 float d_t,
32 std::size_t idx,
34 const MC::LocalConcentration& c); //< update function ptr
35
36 static void (*contribution_udf)(
37 std::size_t idx,
38 std::size_t position,
39 double weight,
41 const MC::ContributionView& contributions); //< contribution function ptr
42
43 static void (*division_udf)(
44 const MC::KPRNG::pool_type& random_pool,
45 std::size_t idx,
46 std::size_t idx2,
48 const MC::DynParticlesModel<float>& buffer_arr); //< division function ptr
49
50 static double (*mass)(std::size_t idx,
51 const MC::DynParticlesModel<float>& arr); //< mass function ptr
52
53 static std::vector<std::string_view> (*names)();
54
55 static std::vector<std::size_t> (*get_number)();
56
57 // static std::vector<std::string> (*names)(); //< names function ptr
58
59#ifdef DECLARE_EXPORT_UDF
63 [[nodiscard]] static std::shared_ptr<DynamicLibrary> init_lib(std::string_view path);
64#endif
65 };
66
67} // namespace UnsafeUDF
68
69#ifdef DECLARE_EXPORT_UDF
70
71using init_udf_ptr = decltype(UnsafeUDF::Loader::init_udf); //< init function ptr type
72using update_udf_ptr = decltype(UnsafeUDF::Loader::update_udf); //< update function ptr type
73using contribution_udf_ptr =
74 decltype(UnsafeUDF::Loader::contribution_udf); //< contribution function ptr type
75using division_udf_ptr = decltype(UnsafeUDF::Loader::division_udf); //< division function ptr type
76using mass_udf_ptr = decltype(UnsafeUDF::Loader::mass);
77using set_nvar_udf_ptr = decltype(UnsafeUDF::Loader::set_nvar_udf); //< division function ptr type
78
79using names_udf_ptr = decltype(UnsafeUDF::Loader::names);
80using get_number_udf_ptr = decltype(UnsafeUDF::Loader::get_number); //< division function ptr type
81
82// clang-format off
86DEFINE_MODULE(
87 MODULE_ITEM(init_udf)
88 MODULE_ITEM(update_udf)
89 MODULE_ITEM(contribution_udf)
90 MODULE_ITEM(division_udf)
91 MODULE_ITEM(mass_udf)
92 MODULE_ITEM(names_udf)
93 MODULE_ITEM(get_number_udf)
94 MODULE_ITEM(set_nvar_udf)
95 )
96// clang-format on
97#endif
98
99#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:41
Kokkos::Experimental::ScatterView< double **, Kokkos::LayoutRight > ContributionView
Definition alias.hpp:30
Status
Definition alias.hpp:11
Kokkos::View< F ** > DynParticlesModel
Definition traits.hpp:34
Unsafe namespace to handle UDF (User-defined function) via dynamic library loading.
Definition udf_includes.hpp:18
MC::DynParticlesModel< FloatType > SelfParticle
Definition udf_model.hpp:17
Static class to access to low-level configuration to load dynamic library.
Definition udf_includes.hpp:23
static std::vector< std::string_view >(* names)()
Definition udf_includes.hpp:53
static std::size_t(* set_nvar_udf)()
Definition udf_includes.hpp:24
static std::vector< std::size_t >(* get_number)()
Definition udf_includes.hpp:55
static void(* init_udf)(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const Models::UdfModel::SelfParticle &arr)
Definition udf_includes.hpp:26
static double(* mass)(std::size_t idx, const MC::DynParticlesModel< float > &arr)
Definition udf_includes.hpp:50
static MC::Status(* update_udf)(const MC::KPRNG::pool_type &random_pool, float d_t, std::size_t idx, const Models::UdfModel::SelfParticle &arr, const MC::LocalConcentration &c)
Definition udf_includes.hpp:30
static void(* contribution_udf)(std::size_t idx, std::size_t position, double weight, const Models::UdfModel::SelfParticle &arr, const MC::ContributionView &contributions)
Definition udf_includes.hpp:36
static void(* division_udf)(const MC::KPRNG::pool_type &random_pool, std::size_t idx, std::size_t idx2, const MC::DynParticlesModel< float > &arr, const MC::DynParticlesModel< float > &buffer_arr)
Definition udf_includes.hpp:43