1#ifndef __CORE_POST_PROCESS_PUBLIC_HPP__
2#define __CORE_POST_PROCESS_PUBLIC_HPP__
3#include "Kokkos_Atomic.hpp"
4#include "Kokkos_Core_fwd.hpp"
5#include "common/common.hpp"
7#include "mc/traits.hpp"
8#include <Kokkos_Core.hpp>
10#include <mc/particles_container.hpp>
12template <
typename MemorySpace>
13using ParticlePropertyViewType = Kokkos::View<double**, Kokkos::LayoutRight, MemorySpace>;
16 Kokkos::Subview<ParticlePropertyViewType<ComputeSpace>,
decltype(Kokkos::ALL), std::size_t>;
26 template <HasExportPropertiesFull Model,
typename ExecutionSpace>
29 const typename Model::SelfParticle& model,
30 ParticlePropertyViewType<ComputeSpace>& particle_values,
31 ParticlePropertyViewType<ComputeSpace>& spatial_values,
34 Kokkos::Experimental::ScatterView<double**, Kokkos::LayoutRight, ComputeSpace>
35 scatter_spatial_values(spatial_values);
38 "kernel_get_properties",
39 Kokkos::RangePolicy<ExecutionSpace>(0, n_p),
40 KOKKOS_LAMBDA(
const int i_particle) {
45 auto access = scatter_spatial_values.access();
47 for (std::size_t i = 0; i < Model::n_var; ++i)
49 access(i, position(i_particle)) += model(i_particle, i);
50 particle_values(i, i_particle) = model(i_particle, i);
52 auto mass = Model::mass(i_particle, model);
53 access(Model::n_var, position(i_particle)) += mass;
54 particle_values(Model::n_var, i_particle) = mass;
57 Kokkos::Experimental::contribute(spatial_values, scatter_spatial_values);
60 template <HasExportPropertiesPartial Model,
typename ExecutionSpace>
63 const typename Model::SelfParticle& model,
64 ParticlePropertyViewType<ComputeSpace>& particle_values,
65 ParticlePropertyViewType<ComputeSpace>& spatial_values,
68 Kokkos::Experimental::ScatterView<double**, Kokkos::LayoutRight, ComputeSpace>
69 scatter_spatial_values(spatial_values);
70 static const auto indices = Model::get_number();
72 static Kokkos::View<size_t*, HostSpace> host_index(
"host_index", indices.size());
74 for (std::size_t i = 0; i < indices.size(); ++i)
76 host_index(i) = indices[i];
79 const Kokkos::View<const size_t*, ComputeSpace> kindices =
80 Kokkos::create_mirror_view_and_copy(ComputeSpace(), host_index);
82 "kernel_get_properties",
83 Kokkos::RangePolicy<ExecutionSpace>(0, n_p),
84 KOKKOS_LAMBDA(
const int i_particle) {
91 auto access = scatter_spatial_values.access();
93 for (
size_t k_var = 0; k_var < kindices.extent(0); ++k_var)
95 const auto index_export = kindices(k_var);
96 const auto current = model(i_particle, index_export);
98 access(k_var, position(i_particle)) += current;
99 particle_values(k_var, i_particle) = current;
101 const auto mass = Model::mass(i_particle, model);
102 access(kindices.extent(0), position(i_particle)) += mass;
103 particle_values(kindices.extent(0), i_particle) = mass;
106 Kokkos::Experimental::contribute(spatial_values, scatter_spatial_values);
109 template <ModelType M>
110 std::optional<PostProcessing::BonceBuffer>
118 const std::size_t n_p =
121 auto ar = M::names();
122 properties.
vnames = std::vector<std::string>(ar.begin(), ar.end());
123 properties.
vnames.emplace_back(
"mass");
125 std::size_t n_var = M::n_var + 1;
128 n_var = ar.size() + 1;
130 ParticlePropertyViewType<ComputeSpace> spatial_values(
131 "property_spatial", n_var, n_compartment);
132 ParticlePropertyViewType<ComputeSpace> particle_values(
"property_values", n_var, n_p);
154 Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), particle_values);
156 Kokkos::create_mirror_view_and_copy(Kokkos::HostSpace(), spatial_values);
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:135
Model::SelfParticle model
Definition particles_container.hpp:148
KOKKOS_INLINE_FUNCTION std::size_t n_particles() const
Gets the number of particles in the container.
Definition particles_container.hpp:171
MC::ParticlePositions position
Definition particles_container.hpp:149
std::size_t counter
Definition particles_container.hpp:177
void clean_dead(std::size_t to_remove)
Definition particles_container.hpp:395
MC::ParticleStatus status
Definition particles_container.hpp:150
SFNIAE way to check whether model allow partial value saving.
Definition traits.hpp:152
Model that can export properties.
Definition traits.hpp:159
Kokkos::View< Status *, ComputeSpace > ParticleStatus
Definition alias.hpp:20
Kokkos::View< uint64_t *, ComputeSpace > ParticlePositions
Definition alias.hpp:19
Definition impl_post_process.hpp:17
void inner(std::size_t n_p, const MC::ParticlePositions &position, const typename Model::SelfParticle &model, ParticlePropertyViewType< ComputeSpace > &particle_values, ParticlePropertyViewType< ComputeSpace > &spatial_values, const MC::ParticleStatus &status)
Definition post_process.hpp:27
std::optional< PostProcessing::BonceBuffer > get_properties(MC::ParticlesContainer< M > &container, const std::size_t n_compartment)
Definition post_process.hpp:111
void inner_partial(const std::size_t n_p, const MC::ParticlePositions &position, const typename Model::SelfParticle &model, ParticlePropertyViewType< ComputeSpace > &particle_values, ParticlePropertyViewType< ComputeSpace > &spatial_values, const MC::ParticleStatus &status)
Definition post_process.hpp:61
Definition post_process.hpp:20
ParticlePropertyViewType< HostSpace > spatial_values
Definition post_process.hpp:22
std::vector< std::string > vnames
Definition post_process.hpp:23
ParticlePropertyViewType< HostSpace > particle_values
Definition post_process.hpp:21