aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/Collision/BackgroundMCCCollision.H
blob: da955456c507d8a03982bf42c359935379269474 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* Copyright 2021 Modern Electron
 *
 * This file is part of WarpX.
 *
 * License: BSD-3-Clause-LBNL
 */
#ifndef WARPX_PARTICLES_COLLISION_BACKGROUNDMCCCOLLISION_H_
#define WARPX_PARTICLES_COLLISION_BACKGROUNDMCCCOLLISION_H_

#include "Particles/MultiParticleContainer.H"
#include "CollisionBase.H"
#include "MCCProcess.H"

#include <AMReX_REAL.H>
#include <AMReX_Vector.H>
#include <AMReX_GpuContainers.H>

#include <memory>
#include <string>

class BackgroundMCCCollision final
    : public CollisionBase
{
public:
    BackgroundMCCCollision (std::string collision_name);

    virtual ~BackgroundMCCCollision () = default;

    amrex::Real get_nu_max (amrex::Vector<MCCProcess> const& mcc_processes);

    /** Perform the collisions
     *
     * @param cur_time Current time
     * @param mypc Container of species involved
     *
     */
    void doCollisions (amrex::Real cur_time, MultiParticleContainer* mypc) override;

    /** Perform particle conserving MCC collisions within a tile
     *
     * @param pti particle iterator
     *
     */
    void doBackgroundCollisionsWithinTile ( WarpXParIter& pti );

    /** Perform MCC ionization interactions
     *
     * @param[in] lev the mesh-refinement level
     * @param[in,out] cost pointer to (load balancing) cost corresponding to box where present particles are ionized.
     * @param[in,out] species1,species2 reference to species container used to inject
     * new particles
     *
     */
    void doBackgroundIonization (
                                 int lev,
                                 amrex::LayoutData<amrex::Real>* cost,
                                 WarpXParticleContainer& species1,
                                 WarpXParticleContainer& species2
                                 );

private:

    amrex::Vector<MCCProcess> m_scattering_processes;
    amrex::Vector<MCCProcess> m_ionization_processes;
    amrex::Gpu::DeviceVector<MCCProcess::Executor> m_scattering_processes_exe;
    amrex::Gpu::DeviceVector<MCCProcess::Executor> m_ionization_processes_exe;

    bool init_flag = false;
    bool ionization_flag = false;

    amrex::Real m_mass1;

    amrex::Real m_background_temperature;
    amrex::Real m_background_density;
    amrex::Real m_background_mass;
    amrex::Real m_total_collision_prob;
    amrex::Real m_total_collision_prob_ioniz = 0;
    amrex::Real m_nu_max;
    amrex::Real m_nu_max_ioniz;
};

#endif // WARPX_PARTICLES_COLLISION_BACKGROUNDMCCCOLLISION_H_