117 const int n_external_attr_real = 0,
118 const int n_external_attr_int = 0
120 ,
const bool do_qed_comps =
false )
127 const std::vector<std::string>& user_real_attribs = pc.getUserRealAttribs();
128 const std::vector<std::string>& user_int_attribs = pc.getUserIntAttribs();
129 const std::vector<std::string>& particle_comps = pc.GetRealSoANames();
130 const std::vector<std::string>& particle_icomps = pc.GetIntSoANames();
131 const std::vector<amrex::Parser*>& user_real_attrib_parser = pc.getUserRealAttribParser();
132 const std::vector<amrex::Parser*>& user_int_attrib_parser = pc.getUserIntAttribParser();
137 const int ionization_initial_level = pc.getIonizationInitialLevel();
140 const auto n_user_real_attribs =
static_cast<int>(user_real_attribs.size());
141 const auto n_user_int_attribs =
static_cast<int>(user_int_attribs.size());
143 const auto soa = ptile.getParticleTileData();
147 constexpr int lev = 0;
152 const bool run_on_gpu =
156 for (
int j =
PIdx::nattribs + n_external_attr_real; j < ptile.NumRealComps() ; ++j)
158 auto attr_ptr = ptile.GetStructOfArrays().GetRealData(j).data();
161 auto const it_qsr = std::find(particle_comps.begin(), particle_comps.end(),
"opticalDepthQSR");
162 if (it_qsr != particle_comps.end() &&
163 std::distance(particle_comps.begin(), it_qsr) == j)
165 if (!do_qed_comps) {
continue; }
172 const int ip = i + start;
173 attr_ptr[ip] = quantum_sync_get_opt(engine);
177 for (
int ip = start; ip < stop; ++ip) {
188 auto const it_bw = std::find(particle_comps.begin(), particle_comps.end(),
"opticalDepthBW");
189 if (it_bw != particle_comps.end() &&
190 std::distance(particle_comps.begin(), it_bw) == j)
192 if (!do_qed_comps) {
continue; }
199 const int ip = i + start;
200 attr_ptr[ip] = breit_wheeler_get_opt(engine);
204 for (
int ip = start; ip < stop; ++ip) {
215 for (
int ia = 0; ia < n_user_real_attribs; ++ia)
218 auto const it_ura = std::find(particle_comps.begin(), particle_comps.end(), user_real_attribs[ia]);
219 if (it_ura != particle_comps.end() &&
220 std::distance(particle_comps.begin(), it_ura) == j)
223 user_real_attrib_parser[ia]->compile<7>();
228 const int ip = i + start;
230 get_position(ip, xp, yp, zp);
231 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
232 ux[ip], uy[ip], uz[ip], t);
236 for (
int ip = start; ip < stop; ++ip) {
238 get_position(ip, xp, yp, zp);
239 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
240 ux[ip], uy[ip], uz[ip], t);
248 for (
int j = n_external_attr_int; j < ptile.NumIntComps() ; ++j)
250 auto attr_ptr = ptile.GetStructOfArrays().GetIntData(j).data();
253 auto const it_ioniz = std::find(particle_icomps.begin(), particle_icomps.end(),
"ionizationLevel");
254 if (it_ioniz != particle_icomps.end() &&
255 std::distance(particle_icomps.begin(), it_ioniz) == j)
260 const int ip = i + start;
261 attr_ptr[ip] = ionization_initial_level;
264 for (
int ip = start; ip < stop; ++ip) {
265 attr_ptr[ip] = ionization_initial_level;
270 for (
int ia = 0; ia < n_user_int_attribs; ++ia)
273 auto const it_uia = std::find(particle_icomps.begin(), particle_icomps.end(), user_int_attribs[ia]);
274 if (it_uia != particle_icomps.end() &&
275 std::distance(particle_icomps.begin(), it_uia) == j)
278 user_int_attrib_parser[ia]->compile<7>();
282 const int ip = i + start;
284 get_position(ip, xp, yp, zp);
285 attr_ptr[ip] =
static_cast<int>(
286 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
289 for (
int ip = start; ip < stop; ++ip) {
291 get_position(ip, xp, yp, zp);
292 attr_ptr[ip] =
static_cast<int>(
293 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));