119 const int n_external_attr_real,
120 const int n_external_attr_int,
121 const std::vector<std::string>& user_real_attribs,
122 const std::vector<std::string>& user_int_attribs,
123 const std::vector<std::string>& particle_comps,
124 const std::vector<std::string>& particle_icomps,
125 const std::vector<amrex::Parser*>& user_real_attrib_parser,
126 const std::vector<amrex::Parser*>& user_int_attrib_parser,
128 const bool do_qed_comps,
132 const int ionization_initial_level,
135 using namespace amrex::literals;
138 const auto n_user_real_attribs =
static_cast<int>(user_real_attribs.size());
139 const auto n_user_int_attribs =
static_cast<int>(user_int_attribs.size());
141 const auto soa = ptile.getParticleTileData();
145 constexpr int lev = 0;
149 for (
int j =
PIdx::nattribs + n_external_attr_real; j < ptile.NumRealComps() ; ++j)
151 auto attr_ptr = ptile.GetStructOfArrays().GetRealData(j).data();
154 auto const it_qsr = std::find(particle_comps.begin(), particle_comps.end(),
"opticalDepthQSR");
155 if (it_qsr != particle_comps.end() &&
156 std::distance(particle_comps.begin(), it_qsr) == j)
158 if (!do_qed_comps) {
continue; }
165 const int ip = i + start;
166 attr_ptr[ip] = quantum_sync_get_opt(engine);
170 for (
int ip = start; ip < stop; ++ip) {
181 auto const it_bw = std::find(particle_comps.begin(), particle_comps.end(),
"opticalDepthBW");
182 if (it_bw != particle_comps.end() &&
183 std::distance(particle_comps.begin(), it_bw) == j)
185 if (!do_qed_comps) {
continue; }
192 const int ip = i + start;
193 attr_ptr[ip] = breit_wheeler_get_opt(engine);
197 for (
int ip = start; ip < stop; ++ip) {
208 for (
int ia = 0; ia < n_user_real_attribs; ++ia)
211 auto const it_ura = std::find(particle_comps.begin(), particle_comps.end(), user_real_attribs[ia]);
212 if (it_ura != particle_comps.end() &&
213 std::distance(particle_comps.begin(), it_ura) == j)
216 user_real_attrib_parser[ia]->compile<7>();
221 const int ip = i + start;
222 amrex::ParticleReal xp, yp, zp;
223 get_position(ip, xp, yp, zp);
224 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
225 ux[ip], uy[ip], uz[ip], t);
229 for (
int ip = start; ip < stop; ++ip) {
230 amrex::ParticleReal xp, yp, zp;
231 get_position(ip, xp, yp, zp);
232 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
233 ux[ip], uy[ip], uz[ip], t);
241 for (
int j = n_external_attr_int; j < ptile.NumIntComps() ; ++j)
243 auto attr_ptr = ptile.GetStructOfArrays().GetIntData(j).data();
246 auto const it_ioniz = std::find(particle_icomps.begin(), particle_icomps.end(),
"ionizationLevel");
247 if (it_ioniz != particle_icomps.end() &&
248 std::distance(particle_icomps.begin(), it_ioniz) == j)
253 const int ip = i + start;
254 attr_ptr[ip] = ionization_initial_level;
257 for (
int ip = start; ip < stop; ++ip) {
258 attr_ptr[ip] = ionization_initial_level;
263 for (
int ia = 0; ia < n_user_int_attribs; ++ia)
266 auto const it_uia = std::find(particle_icomps.begin(), particle_icomps.end(), user_int_attribs[ia]);
267 if (it_uia != particle_icomps.end() &&
268 std::distance(particle_icomps.begin(), it_uia) == j)
271 user_int_attrib_parser[ia]->compile<7>();
275 const int ip = i + start;
276 amrex::ParticleReal xp, yp, zp;
277 get_position(ip, xp, yp, zp);
278 attr_ptr[ip] =
static_cast<int>(
279 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
282 for (
int ip = start; ip < stop; ++ip) {
283 amrex::ParticleReal xp, yp, zp;
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));