WarpX
Loading...
Searching...
No Matches
SmartCopy.H
Go to the documentation of this file.
1/* Copyright 2019-2020 Andrew Myers, Axel Huebl,
2 * Maxence Thevenet
3 *
4 * This file is part of WarpX.
5 *
6 * License: BSD-3-Clause-LBNL
7 */
8#ifndef WARPX_SMART_COPY_H_
9#define WARPX_SMART_COPY_H_
10
12#include "SmartUtils.H"
13
14#include <AMReX_GpuContainers.H>
16
17#include <map>
18#include <string>
19
34{
36 const int* m_src_comps_r;
37 const int* m_dst_comps_r;
38
40 const int* m_src_comps_i;
41 const int* m_dst_comps_i;
42
45
46 template <typename DstData, typename SrcData>
48 void operator() (DstData& dst, const SrcData& src, int i_src, int i_dst,
49 amrex::RandomEngine const& engine) const noexcept
50 {
51 // initialize the real components
52 for (int j = 0; j < DstData::NAR; ++j) {
53 dst.m_rdata[j][i_dst] = initializeRealValue(m_policy_real[j], engine);
54 }
55 for (int j = 0; j < dst.m_num_runtime_real; ++j) {
56 dst.m_runtime_rdata[j][i_dst] = initializeRealValue(m_policy_real[j+DstData::NAR], engine);
57 }
58
59 // initialize the int components
60 for (int j = 0; j < DstData::NAI; ++j) {
61 dst.m_idata[j][i_dst] = initializeIntValue(m_policy_int[j]);
62 }
63 for (int j = 0; j < dst.m_num_runtime_int; ++j) {
64 dst.m_runtime_idata[j][i_dst] = initializeIntValue(m_policy_int[j+DstData::NAI]);
65 }
66
67 // copy the shared real components
68 for (int j = 0; j < m_num_copy_real; ++j)
69 {
70 int src_comp, dst_comp;
71 amrex::ParticleReal* AMREX_RESTRICT dst_data;
72 const amrex::ParticleReal* AMREX_RESTRICT src_data;
73
74 if (m_src_comps_r[j] < SrcData::NAR)
75 {
76 // This is a compile-time attribute of the src
77 src_comp = m_src_comps_r[j];
78 src_data = src.m_rdata[src_comp];
79 }
80 else
81 {
82 // This is a runtime attribute of the src
83 src_comp = m_src_comps_r[j] - SrcData::NAR;
84 src_data = src.m_runtime_rdata[src_comp];
85 }
86
87 if (m_dst_comps_r[j] < DstData::NAR)
88 {
89 // This is a compile-time attribute of the dst
90 dst_comp = m_dst_comps_r[j];
91 dst_data = dst.m_rdata[dst_comp];
92 }
93 else
94 {
95 // This is a runtime attribute of the dst
96 dst_comp = m_dst_comps_r[j] - DstData::NAR;
97 dst_data = dst.m_runtime_rdata[dst_comp];
98 }
99
100 dst_data[i_dst] = src_data[i_src];
101 }
102
103 // copy the shared int components
104 for (int j = 0; j < m_num_copy_int; ++j)
105 {
106 int src_comp, dst_comp;
107 int* AMREX_RESTRICT dst_data;
108 int* AMREX_RESTRICT src_data;
109
110 // note, in WarpX we only have runtime int data
111 static_assert(SrcData::NAI == 0 && DstData::NAI == 0,
112 "SmartCopy assumes all int data is runtime-added.");
113
114 src_comp = m_src_comps_i[j];
115 src_data = src.m_runtime_idata[src_comp];
116
117 dst_comp = m_dst_comps_i[j];
118 dst_data = dst.m_runtime_idata[dst_comp];
119
120 dst_data[i_dst] = src_data[i_src];
121 }
122 }
123};
124
133{
138 bool m_defined = false;
139
140public:
141 template <class SrcPC, class DstPC>
142 SmartCopyFactory (const SrcPC& src, const DstPC& dst) noexcept :
143 m_tag_real{getSmartCopyTag(src.GetRealSoANames(), dst.GetRealSoANames())},
144 m_tag_int{getSmartCopyTag(src.GetIntSoANames(), dst.GetIntSoANames())},
145 m_policy_real{getPolicies(dst.GetRealSoANames())},
146 m_policy_int{getPolicies(dst.GetIntSoANames())},
147 m_defined{true}
148 {}
149
150 [[nodiscard]] SmartCopy getSmartCopy () const noexcept
151 {
153 return SmartCopy{m_tag_real.size(),
154 m_tag_real.src_comps.dataPtr(),
155 m_tag_real.dst_comps.dataPtr(),
156 m_tag_int.size(),
157 m_tag_int. src_comps.dataPtr(),
158 m_tag_int. dst_comps.dataPtr(),
159 m_policy_real.dataPtr(),
160 m_policy_int.dataPtr()};
161 }
162
163 [[nodiscard]] bool isDefined () const noexcept { return m_defined; }
164};
165
166#endif //WARPX_SMART_COPY_H_
#define AMREX_ASSERT(EX)
#define AMREX_FORCE_INLINE
#define AMREX_RESTRICT
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int initializeIntValue(const InitializationPolicy policy) noexcept
Definition DefaultInitialization.H:78
InitializationPolicy
This set of initialization policies describes what happens when we need to create a new particle due ...
Definition DefaultInitialization.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal initializeRealValue(const InitializationPolicy policy, amrex::RandomEngine const &engine) noexcept
Definition DefaultInitialization.H:62
amrex::Gpu::DeviceVector< InitializationPolicy > PolicyVec
Definition SmartUtils.H:27
SmartCopyTag getSmartCopyTag(std::vector< std::string > const &src_names, std::vector< std::string > const &dst_names) noexcept
Definition SmartUtils.cpp:37
PolicyVec getPolicies(std::vector< std::string > const &names_vec) noexcept
Definition SmartUtils.cpp:16
SmartCopyTag m_tag_int
Definition SmartCopy.H:135
PolicyVec m_policy_int
Definition SmartCopy.H:137
SmartCopy getSmartCopy() const noexcept
Definition SmartCopy.H:150
SmartCopyFactory(const SrcPC &src, const DstPC &dst) noexcept
Definition SmartCopy.H:142
bool isDefined() const noexcept
Definition SmartCopy.H:163
bool m_defined
Definition SmartCopy.H:138
PolicyVec m_policy_real
Definition SmartCopy.H:136
SmartCopyTag m_tag_real
Definition SmartCopy.H:134
This is a functor for performing a "smart copy" that works in both host and device code.
Definition SmartCopy.H:34
const int * m_dst_comps_i
Definition SmartCopy.H:41
const int * m_dst_comps_r
Definition SmartCopy.H:37
int m_num_copy_int
Definition SmartCopy.H:39
const int * m_src_comps_r
Definition SmartCopy.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(DstData &dst, const SrcData &src, int i_src, int i_dst, amrex::RandomEngine const &engine) const noexcept
Definition SmartCopy.H:48
const int * m_src_comps_i
Definition SmartCopy.H:40
const InitializationPolicy * m_policy_real
Definition SmartCopy.H:43
const InitializationPolicy * m_policy_int
Definition SmartCopy.H:44
int m_num_copy_real
Definition SmartCopy.H:35
Definition SmartUtils.H:30