114 const int n_external_attr_real = 0,
115 const int n_external_attr_int = 0
117 ,
const bool do_qed_comps =
false )
124 const std::vector<std::string>& user_real_attribs = pc.getUserRealAttribs();
125 const std::vector<std::string>& user_int_attribs = pc.getUserIntAttribs();
126 const std::vector<std::string>& particle_comps = pc.GetRealSoANames();
127 const std::vector<std::string>& particle_icomps = pc.GetIntSoANames();
128 const std::vector<amrex::Parser*>& user_real_attrib_parser = pc.getUserRealAttribParser();
129 const std::vector<amrex::Parser*>& user_int_attrib_parser = pc.getUserIntAttribParser();
134 const int ionization_initial_level = pc.getIonizationInitialLevel();
137 const auto n_user_real_attribs =
static_cast<int>(user_real_attribs.size());
138 const auto n_user_int_attribs =
static_cast<int>(user_int_attribs.size());
140 const auto soa = ptile.getParticleTileData();
144 constexpr int lev = 0;
149 const bool run_on_gpu =
153 for (
int j =
PIdx::nattribs + n_external_attr_real; j < ptile.NumRealComps() ; ++j)
155 auto attr_ptr = ptile.GetStructOfArrays().GetRealData(j).data();
158 auto const it_qsr = std::find(particle_comps.begin(), particle_comps.end(),
"opticalDepthQSR");
159 if (it_qsr != particle_comps.end() &&
160 std::distance(particle_comps.begin(), it_qsr) == j)
162 if (!do_qed_comps) {
continue; }
169 const int ip = i + start;
170 attr_ptr[ip] = quantum_sync_get_opt(engine);
174 for (
int ip = start; ip < stop; ++ip) {
185 auto const it_bw = std::find(particle_comps.begin(), particle_comps.end(),
"opticalDepthBW");
186 if (it_bw != particle_comps.end() &&
187 std::distance(particle_comps.begin(), it_bw) == j)
189 if (!do_qed_comps) {
continue; }
196 const int ip = i + start;
197 attr_ptr[ip] = breit_wheeler_get_opt(engine);
201 for (
int ip = start; ip < stop; ++ip) {
212 for (
int ia = 0; ia < n_user_real_attribs; ++ia)
215 auto const it_ura = std::find(particle_comps.begin(), particle_comps.end(), user_real_attribs[ia]);
216 if (it_ura != particle_comps.end() &&
217 std::distance(particle_comps.begin(), it_ura) == j)
220 user_real_attrib_parser[ia]->compile<7>();
225 const int ip = i + start;
227 get_position(ip, xp, yp, zp);
228 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
229 ux[ip], uy[ip], uz[ip], t);
233 for (
int ip = start; ip < stop; ++ip) {
235 get_position(ip, xp, yp, zp);
236 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
237 ux[ip], uy[ip], uz[ip], t);
245 for (
int j = n_external_attr_int; j < ptile.NumIntComps() ; ++j)
247 auto attr_ptr = ptile.GetStructOfArrays().GetIntData(j).data();
250 auto const it_ioniz = std::find(particle_icomps.begin(), particle_icomps.end(),
"ionizationLevel");
251 if (it_ioniz != particle_icomps.end() &&
252 std::distance(particle_icomps.begin(), it_ioniz) == j)
257 const int ip = i + start;
258 attr_ptr[ip] = ionization_initial_level;
261 for (
int ip = start; ip < stop; ++ip) {
262 attr_ptr[ip] = ionization_initial_level;
267 for (
int ia = 0; ia < n_user_int_attribs; ++ia)
270 auto const it_uia = std::find(particle_icomps.begin(), particle_icomps.end(), user_int_attribs[ia]);
271 if (it_uia != particle_icomps.end() &&
272 std::distance(particle_icomps.begin(), it_uia) == j)
275 user_int_attrib_parser[ia]->compile<7>();
279 const int ip = i + start;
281 get_position(ip, xp, yp, zp);
282 attr_ptr[ip] =
static_cast<int>(
283 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
286 for (
int ip = start; ip < stop; ++ip) {
288 get_position(ip, xp, yp, zp);
289 attr_ptr[ip] =
static_cast<int>(
290 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));