WarpX
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 SMART_COPY_H_
9 #define SMART_COPY_H_
10 
11 #include "DefaultInitialization.H"
12 #include "SmartUtils.H"
13 
14 #include <AMReX_GpuContainers.H>
15 #include <AMReX_ParallelDescriptor.H>
16 
17 #include <map>
18 #include <string>
19 
33 struct SmartCopy
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>
47  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
48  void operator() (DstData& dst, const SrcData& src, int i_src, int i_dst,
49  amrex::RandomEngine const& engine) const noexcept
50  {
51  // the particle struct is always copied over
52  dst.m_aos[i_dst] = src.m_aos[i_src];
53 
54  // initialize the real components
55  for (int j = 0; j < DstData::NAR; ++j)
56  dst.m_rdata[j][i_dst] = initializeRealValue(m_policy_real[j], engine);
57  for (int j = 0; j < dst.m_num_runtime_real; ++j)
58  dst.m_runtime_rdata[j][i_dst] = initializeRealValue(m_policy_real[j+DstData::NAR], engine);
59 
60  // initialize the int components
61  for (int j = 0; j < DstData::NAI; ++j)
62  dst.m_idata[j][i_dst] = initializeIntValue(m_policy_int[j]);
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  // copy the shared real components
67  for (int j = 0; j < m_num_copy_real; ++j)
68  {
69  int src_comp, dst_comp;
70  amrex::ParticleReal* AMREX_RESTRICT dst_data;
71  const amrex::ParticleReal* AMREX_RESTRICT src_data;
72 
73  if (m_src_comps_r[j] < SrcData::NAR)
74  {
75  // This is a compile-time attribute of the src
76  src_comp = m_src_comps_r[j];
77  src_data = src.m_rdata[src_comp];
78  }
79  else
80  {
81  // This is a runtime attribute of the src
82  src_comp = m_src_comps_r[j] - SrcData::NAR;
83  src_data = src.m_runtime_rdata[src_comp];
84  }
85 
86  if (m_dst_comps_r[j] < DstData::NAR)
87  {
88  // This is a compile-time attribute of the dst
89  dst_comp = m_dst_comps_r[j];
90  dst_data = dst.m_rdata[dst_comp];
91  }
92  else
93  {
94  // This is a runtime attribute of the dst
95  dst_comp = m_dst_comps_r[j] - DstData::NAR;
96  dst_data = dst.m_runtime_rdata[dst_comp];
97  }
98 
99  dst_data[i_dst] = src_data[i_src];
100  }
101 
102  // copy the shared int components
103  for (int j = 0; j < m_num_copy_int; ++j)
104  {
105  int src_comp, dst_comp;
106  int* AMREX_RESTRICT dst_data;
107  int* AMREX_RESTRICT src_data;
108 
109  if (m_src_comps_i[j] < SrcData::NAI)
110  {
111  src_comp = m_src_comps_i[j];
112  src_data = src.m_idata[src_comp];
113  }
114  else
115  {
116  src_comp = m_src_comps_i[j] - SrcData::NAI;
117  src_data = src.m_runtime_idata[src_comp];
118  }
119 
120  if (m_dst_comps_i[j] < DstData::NAI)
121  {
122  dst_comp = m_dst_comps_i[j];
123  dst_data = dst.m_idata[dst_comp];
124  }
125  else
126  {
127  dst_comp = m_dst_comps_i[j] - DstData::NAI;
128  dst_data = dst.m_runtime_idata[dst_comp];
129  }
130 
131  dst_data[i_dst] = src_data[i_src];
132  }
133  }
134 };
135 
144 {
149  bool m_defined;
150 
151 public:
152  template <class SrcPC, class DstPC>
153  SmartCopyFactory (const SrcPC& src, const DstPC& dst) noexcept
154  : m_defined(false)
155  {
156  m_tag_real = getSmartCopyTag(src.getParticleComps(), dst.getParticleComps());
157  m_tag_int = getSmartCopyTag(src.getParticleiComps(), dst.getParticleiComps());
158 
159  m_policy_real = getPolicies(dst.getParticleComps());
160  m_policy_int = getPolicies(dst.getParticleiComps());
161 
162  m_defined = true;
163  }
164 
165  SmartCopy getSmartCopy () const noexcept
166  {
167  AMREX_ASSERT(m_defined);
168  return SmartCopy{m_tag_real.size(),
169  m_tag_real.src_comps.dataPtr(),
170  m_tag_real.dst_comps.dataPtr(),
171  m_tag_int.size(),
172  m_tag_int. src_comps.dataPtr(),
173  m_tag_int. dst_comps.dataPtr(),
174  m_policy_real.dataPtr(),
175  m_policy_int.dataPtr()};
176  }
177 
178  bool isDefined () const noexcept { return m_defined; }
179 };
180 
181 #endif
int m_num_copy_int
Definition: SmartCopy.H:39
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_dst_comps_i
Definition: SmartCopy.H:41
SmartCopyTag getSmartCopyTag(const NameMap &src, const NameMap &dst) noexcept
Definition: SmartUtils.cpp:21
PolicyVec m_policy_int
Definition: SmartCopy.H:148
SmartCopyTag m_tag_int
Definition: SmartCopy.H:146
int m_num_copy_real
Definition: SmartCopy.H:35
const int * m_src_comps_r
Definition: SmartCopy.H:36
int size() const noexcept
Definition: SmartUtils.H:23
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int initializeIntValue(const InitializationPolicy policy) noexcept
Definition: DefaultInitialization.H:72
const InitializationPolicy * m_policy_real
Definition: SmartCopy.H:43
const InitializationPolicy * m_policy_int
Definition: SmartCopy.H:44
amrex::Gpu::DeviceVector< InitializationPolicy > PolicyVec
Definition: SmartUtils.H:15
const int * m_dst_comps_r
Definition: SmartCopy.H:37
Definition: SmartUtils.H:17
bool m_defined
Definition: SmartCopy.H:149
const int * m_src_comps_i
Definition: SmartCopy.H:40
SmartCopyFactory(const SrcPC &src, const DstPC &dst) noexcept
Definition: SmartCopy.H:153
PolicyVec m_policy_real
Definition: SmartCopy.H:147
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal initializeRealValue(const InitializationPolicy policy, amrex::RandomEngine const &engine) noexcept
Definition: DefaultInitialization.H:56
amrex::Gpu::DeviceVector< int > dst_comps
Definition: SmartUtils.H:21
InitializationPolicy
This set of initialization policies describes what happens when we need to create a new particle due ...
Definition: DefaultInitialization.H:33
PolicyVec getPolicies(const NameMap &names) noexcept
Definition: SmartUtils.cpp:10
SmartCopyTag m_tag_real
Definition: SmartCopy.H:145
This is a functor for performing a "smart copy" that works in both host and device code...
Definition: SmartCopy.H:33
bool isDefined() const noexcept
Definition: SmartCopy.H:178
SmartCopy getSmartCopy() const noexcept
Definition: SmartCopy.H:165
A factory for creating SmartCopy functors.
Definition: SmartCopy.H:143
amrex::Gpu::DeviceVector< int > src_comps
Definition: SmartUtils.H:20