ImpactX
Loading...
Searching...
No Matches
Integrators.H
Go to the documentation of this file.
1/* Copyright 2022-2023 The Regents of the University of California, through Lawrence
2 * Berkeley National Laboratory (subject to receipt of any required
3 * approvals from the U.S. Dept. of Energy). All rights reserved.
4 *
5 * This file is part of ImpactX.
6 *
7 * Authors: Chad Mitchell, Axel Huebl
8 * License: BSD-3-Clause-LBNL
9 */
10#ifndef IMPACTX_INTEGRATORS_H_
11#define IMPACTX_INTEGRATORS_H_
12
14
15#include <AMReX_Extension.H> // for AMREX_RESTRICT
16#include <AMReX_REAL.H> // for ParticleReal
17#include <AMReX_SmallMatrix.H> // for SmallVector
18
19
21{
22
37 template <typename T_Element>
40 RefPart & refpart,
41 amrex::ParticleReal const zin,
42 amrex::ParticleReal const zout,
43 int const nsteps,
44 T_Element const & element
45 )
46 {
47 using namespace amrex::literals; // for _rt and _prt
48
49 // initialize numerical integration parameters
50 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
51 amrex::ParticleReal const tau1 = dz * 0.5_prt;
52 amrex::ParticleReal const tau2 = dz;
53
54 // initialize the value of the independent variable
55 amrex::ParticleReal zeval = zin;
56
57 // loop over integration steps
58 for(int j=0; j < nsteps; ++j)
59 {
60 element.map1(tau1,refpart,zeval);
61 element.map2(tau2,refpart,zeval);
62 element.map1(tau1,refpart,zeval);
63 }
64 }
65
80 template <typename T_Element>
83 RefPart & refpart,
84 amrex::ParticleReal const zin,
85 amrex::ParticleReal const zout,
86 int const nsteps,
87 T_Element const & element
88 )
89 {
90 using namespace amrex::literals; // for _rt and _prt
91
92 // initialize numerical integration parameters
93 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
94 amrex::ParticleReal const tau1 = dz * 0.5_prt;
95 amrex::ParticleReal const tau2 = dz * 0.5_prt;
96 amrex::ParticleReal const tau3 = dz;
97
98 // initialize the value of the independent variable
99 amrex::ParticleReal zeval = zin;
100
101 // loop over integration steps
102 for(int j=0; j < nsteps; ++j)
103 {
104 element.map1(tau1,refpart,zeval);
105 element.map2(tau2,refpart,zeval);
106 element.map3(tau3,refpart,zeval);
107 element.map2(tau2,refpart,zeval);
108 element.map1(tau1,refpart,zeval);
109 }
110 }
111
129 template <typename T_Element>
132 RefPart & refpart,
133 amrex::ParticleReal const zin,
134 amrex::ParticleReal const zout,
135 int const nsteps,
136 T_Element const & element
137 )
138 {
139 using namespace amrex::literals; // for _rt and _prt
140
141 // initialize numerical integration parameters
142 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
143 constexpr amrex::ParticleReal alpha = -0.2599210498948732_prt; // C++26: 1_prt - std::pow(2_prt,1_prt/3_prt);
144 amrex::ParticleReal const tau2 = dz / (1_prt + alpha);
145 amrex::ParticleReal const tau1 = tau2*0.5_prt;
146 amrex::ParticleReal const tau3 = alpha*tau1;
147 amrex::ParticleReal const tau4 = (alpha - 1_prt)*tau2;
148
149 // initialize the value of the independent variable
150 amrex::ParticleReal zeval = zin;
151
152 // loop over integration steps
153 for (int j=0; j < nsteps; ++j)
154 {
155 element.map1(tau1,refpart,zeval);
156 element.map2(tau2,refpart,zeval);
157 element.map1(tau3,refpart,zeval);
158 element.map2(tau4,refpart,zeval);
159 element.map1(tau3,refpart,zeval);
160 element.map2(tau2,refpart,zeval);
161 element.map1(tau1,refpart,zeval);
162 }
163 }
164
180 template <typename T_Real, typename T_Element>
184 amrex::ParticleReal const zin,
185 amrex::ParticleReal const zout,
186 int const nsteps,
187 RefPart const & refpart,
188 T_Element const & element
189 )
190 {
191 using namespace amrex::literals; // for _rt and _prt
192
193 // initialize numerical integration parameters
194 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
195 amrex::ParticleReal const tau1 = dz * 0.5_prt;
196 amrex::ParticleReal const tau2 = dz;
197
198 // initialize the value of the independent variable
199 amrex::ParticleReal zeval = zin;
200
201 // loop over integration steps
202 for(int j=0; j < nsteps; ++j)
203 {
204 element.map1(tau1,particle,zeval,refpart);
205 element.map2(tau2,particle,zeval,refpart);
206 element.map1(tau1,particle,zeval,refpart);
207 }
208 }
209
210
229 template <typename T_Real, typename T_Element>
233 amrex::ParticleReal const zin,
234 amrex::ParticleReal const zout,
235 int const nsteps,
236 RefPart const & refpart,
237 T_Element const & element
238 )
239 {
240 using namespace amrex::literals; // for _rt and _prt
241
242 // initialize numerical integration parameters
243 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
244 constexpr amrex::ParticleReal alpha = -0.2599210498948732_prt; // C++26: 1_prt - std::pow(2_prt,1_prt/3_prt);
245 amrex::ParticleReal const tau2 = dz/(1_prt + alpha);
246 amrex::ParticleReal const tau1 = tau2*0.5_prt;
247 amrex::ParticleReal const tau3 = alpha*tau1;
248 amrex::ParticleReal const tau4 = (alpha - 1_prt)*tau2;
249
250 // initialize the value of the independent variable
251 amrex::ParticleReal zeval = zin;
252
253 // loop over integration steps
254 for (int j=0; j < nsteps; ++j)
255 {
256 element.map1(tau1,particle,zeval,refpart);
257 element.map2(tau2,particle,zeval,refpart);
258 element.map1(tau3,particle,zeval,refpart);
259 element.map2(tau4,particle,zeval,refpart);
260 element.map1(tau3,particle,zeval,refpart);
261 element.map2(tau2,particle,zeval,refpart);
262 element.map1(tau1,particle,zeval,refpart);
263 }
264 }
265
266
290 template <typename T_Real, typename T_Element>
294 amrex::ParticleReal const zin,
295 amrex::ParticleReal const zout,
296 int const nsteps,
297 RefPart const & refpart,
298 T_Element const & element
299 )
300 {
301 using namespace amrex::literals; // for _rt and _prt
302
303 // initialize numerical integration parameters
304 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
305 amrex::ParticleReal const w0 = 1.31518632068391121888424973_prt;
306 amrex::ParticleReal const w1 = -1.17767998417887100694641568_prt;
307 amrex::ParticleReal const w2 = 0.23557321335935813368479318_prt;
308 amrex::ParticleReal const w3 = 0.78451361047755726381949763_prt;
309
310 amrex::ParticleReal const tau1 = w3 * dz / 2_prt;
311 amrex::ParticleReal const tau2 = w3 * dz;
312 amrex::ParticleReal const tau3 = (w3 + w2) * dz / 2_prt;
313 amrex::ParticleReal const tau4 = w2 * dz;
314 amrex::ParticleReal const tau5 = (w2 + w1) * dz / 2_prt;
315 amrex::ParticleReal const tau6 = w1 * dz;
316 amrex::ParticleReal const tau7 = (w1 + w0) * dz / 2_prt;
317 amrex::ParticleReal const tau8 = w0 * dz;
318
319 // initialize the value of the independent variable
320 amrex::ParticleReal zeval = zin;
321
322 // loop over integration steps
323 for (int j=0; j < nsteps; ++j)
324 {
325 element.map1(tau1,particle,zeval,refpart);
326 element.map2(tau2,particle,zeval,refpart);
327 element.map1(tau3,particle,zeval,refpart);
328 element.map2(tau4,particle,zeval,refpart);
329 element.map1(tau5,particle,zeval,refpart);
330 element.map2(tau6,particle,zeval,refpart);
331 element.map1(tau7,particle,zeval,refpart);
332 element.map2(tau8,particle,zeval,refpart);
333 element.map1(tau7,particle,zeval,refpart);
334 element.map2(tau6,particle,zeval,refpart);
335 element.map1(tau5,particle,zeval,refpart);
336 element.map2(tau4,particle,zeval,refpart);
337 element.map1(tau3,particle,zeval,refpart);
338 element.map2(tau2,particle,zeval,refpart);
339 element.map1(tau1,particle,zeval,refpart);
340 }
341 }
342
359 template <typename T_Real, typename T_Element>
363 amrex::SmallVector<T_Real, 3, 1> & particle_spin,
364 amrex::ParticleReal const tau,
365 amrex::ParticleReal & zeval,
366 RefPart const & refpart,
367 T_Element const & element
368 )
369 {
370 using namespace amrex::literals; // for _rt and _prt
371
372 // initialize numerical integration parameters
373 amrex::ParticleReal const tau1 = tau*0.5_prt;
374 amrex::ParticleReal const tau2 = tau*0.5_prt;
375 amrex::ParticleReal const tau3 = tau;
376
377 // a single second-order step
378 element.map1(tau1,particle,zeval,refpart);
379 element.map2(tau2,particle,zeval,refpart);
380 element.map3(tau3,particle,particle_spin,zeval,refpart);
381 element.map2(tau2,particle,zeval,refpart);
382 element.map1(tau1,particle,zeval,refpart);
383 }
384
402 template <typename T_Real, typename T_Element>
406 amrex::SmallVector<T_Real, 3, 1> & particle_spin,
407 amrex::ParticleReal const tau,
408 amrex::ParticleReal & zeval,
409 RefPart const & refpart,
410 T_Element const & element
411 )
412 {
413 using namespace amrex::literals; // for _rt and _prt
414
415 // initialize numerical integration parameters (Yoshida)
416 constexpr amrex::ParticleReal a = 1.2599210498948732_prt; // C++26 std::pow(2_prt,1_prt/3_prt);
417 constexpr amrex::ParticleReal z0 = 1_prt / (2_prt - a);
418 constexpr amrex::ParticleReal z1 = -a / (2_prt - a);
419 amrex::ParticleReal const tau1 = tau*z0;
420 amrex::ParticleReal const tau2 = tau*z1;
421
422 // a single fourth-order step
423 symp2_integrate_particle_spin_step(particle,particle_spin,tau1,zeval,refpart,element);
424 symp2_integrate_particle_spin_step(particle,particle_spin,tau2,zeval,refpart,element);
425 symp2_integrate_particle_spin_step(particle,particle_spin,tau1,zeval,refpart,element);
426 }
427
428
446 template <typename T_Real, typename T_Element>
450 amrex::SmallVector<T_Real, 3, 1> & particle_spin,
451 amrex::ParticleReal const tau,
452 amrex::ParticleReal & zeval,
453 RefPart const & refpart,
454 T_Element const & element
455 )
456 {
457 using namespace amrex::literals; // for _rt and _prt
458
459 // initialize numerical integration parameters (Yoshida)
460 constexpr amrex::ParticleReal a = 1.148698354997035_prt; // C++26 std::pow(2_prt,1_prt/5_prt);
461 constexpr amrex::ParticleReal z0 = 1_prt / (2_prt - a);
462 constexpr amrex::ParticleReal z1 = -a / (2_prt - a);
463 amrex::ParticleReal const tau1 = tau * z0;
464 amrex::ParticleReal const tau2 = tau * z1;
465
466 // a single sixth-order step
467 symp4_integrate_particle_spin_step(particle,particle_spin,tau1,zeval,refpart,element);
468 symp4_integrate_particle_spin_step(particle,particle_spin,tau2,zeval,refpart,element);
469 symp4_integrate_particle_spin_step(particle,particle_spin,tau1,zeval,refpart,element);
470 }
471
472
491 template <typename T_Real, typename T_Element>
495 amrex::SmallVector<T_Real, 3, 1> & particle_spin,
496 amrex::ParticleReal const zin,
497 amrex::ParticleReal const zout,
498 int const nsteps,
499 int int_order,
500 RefPart const & refpart,
501 T_Element const & element
502 )
503 {
504 using namespace amrex::literals; // for _rt and _prt
505
506 // initialize numerical integration parameters
507 amrex::ParticleReal const dz = (zout - zin) / static_cast<amrex::ParticleReal>(nsteps);
508
509 // initialize the value of the independent variable
510 amrex::ParticleReal zeval = zin;
511
512 // loop over integration steps
513 for(int j=0; j < nsteps; ++j)
514 {
515 if (int_order == 2) {
516 symp2_integrate_particle_spin_step(particle,particle_spin,dz,zeval,refpart,element);
517 } else if (int_order == 4) {
518 symp4_integrate_particle_spin_step(particle,particle_spin,dz,zeval,refpart,element);
519 } else if (int_order == 6) {
520 symp6_integrate_particle_spin_step(particle,particle_spin,dz,zeval,refpart,element);
521 } else {
522 symp2_integrate_particle_spin_step(particle,particle_spin,dz,zeval,refpart,element);
523 }
524 }
525 }
526
527
528} // namespace impactx::integrators
529
530#endif // IMPACTX_INTEGRATORS_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
amrex_particle_real ParticleReal
SmallMatrix< T, N, 1, Order::F, StartIndex > SmallVector
Definition Integrators.H:21
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp2_integrate_particle(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:182
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp4_integrate(RefPart &refpart, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, T_Element const &element)
Definition Integrators.H:131
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp4_integrate_particle(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:231
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp_integrate_particle_spin(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::SmallVector< T_Real, 3, 1 > &particle_spin, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, int int_order, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:493
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp2_integrate_particle_spin_step(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::SmallVector< T_Real, 3, 1 > &particle_spin, amrex::ParticleReal const tau, amrex::ParticleReal &zeval, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:361
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp2_integrate(RefPart &refpart, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, T_Element const &element)
Definition Integrators.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp2_integrate_split3(RefPart &refpart, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, T_Element const &element)
Definition Integrators.H:82
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp6_integrate_particle_spin_step(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::SmallVector< T_Real, 3, 1 > &particle_spin, amrex::ParticleReal const tau, amrex::ParticleReal &zeval, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:448
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp4_integrate_particle_spin_step(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::SmallVector< T_Real, 3, 1 > &particle_spin, amrex::ParticleReal const tau, amrex::ParticleReal &zeval, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:404
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void symp6_integrate_particle(amrex::SmallVector< T_Real, 6, 1 > &particle, amrex::ParticleReal const zin, amrex::ParticleReal const zout, int const nsteps, RefPart const &refpart, T_Element const &element)
Definition Integrators.H:292
Definition ReferenceParticle.H:33