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 WARPX_SMART_COPY_H_
9 #define WARPX_SMART_COPY_H_
10 
11 #include "DefaultInitialization.H"
12 #include "SmartUtils.H"
13 
14 #include <AMReX_GpuContainers.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>
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 
140 public:
141  template <class SrcPC, class DstPC>
142  SmartCopyFactory (const SrcPC& src, const DstPC& dst) noexcept :
143  m_tag_real{getSmartCopyTag(src.getParticleComps(), dst.getParticleComps())},
144  m_tag_int{getSmartCopyTag(src.getParticleiComps(), dst.getParticleiComps())},
145  m_policy_real{getPolicies(dst.getParticleComps())},
146  m_policy_int{getPolicies(dst.getParticleiComps())},
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(),
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
PolicyVec getPolicies(const NameMap &names) noexcept
Definition: SmartUtils.cpp:16
SmartCopyTag getSmartCopyTag(const NameMap &src, const NameMap &dst) noexcept
Definition: SmartUtils.cpp:34
A factory for creating SmartCopy functors.
Definition: SmartCopy.H:133
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
T * dataPtr() noexcept
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
amrex::Gpu::DeviceVector< int > dst_comps
Definition: SmartUtils.H:33
int size() const noexcept
Definition: SmartUtils.H:35
amrex::Gpu::DeviceVector< int > src_comps
Definition: SmartUtils.H:32