aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp
blob: 4bbdb4bc4a155c6e0e126cc1184dfbebcd063155 (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
/* Copyright 2021 Neil Zaim
 *
 * This file is part of WarpX.
 *
 * License: BSD-3-Clause-LBNL
 */

#include "BinaryCollisionUtils.H"

#include "Particles/MultiParticleContainer.H"
#include "Particles/WarpXParticleContainer.H"

#include <AMReX_ParmParse.H>
#include <AMReX_Vector.H>

#include <string>

namespace BinaryCollisionUtils{

    NuclearFusionType get_nuclear_fusion_type (const std::string collision_name,
                                               MultiParticleContainer const * const mypc)
        {
            amrex::ParmParse pp_collision_name(collision_name);
            amrex::Vector<std::string> species_names;
            pp_collision_name.getarr("species", species_names);
            auto& species1 = mypc->GetParticleContainerFromName(species_names[0]);
            auto& species2 = mypc->GetParticleContainerFromName(species_names[1]);

            if ((species1.AmIA<PhysicalSpecies::hydrogen2>() && species2.AmIA<PhysicalSpecies::hydrogen3>())
                ||
                (species1.AmIA<PhysicalSpecies::hydrogen3>() && species2.AmIA<PhysicalSpecies::hydrogen2>())
                )
            {
                return NuclearFusionType::DeuteriumTritium;
            }
            else if ((species1.AmIA<PhysicalSpecies::proton>() && species2.AmIA<PhysicalSpecies::boron11>())
                ||
                (species1.AmIA<PhysicalSpecies::boron11>() && species2.AmIA<PhysicalSpecies::proton>())
                )
            {
                return NuclearFusionType::ProtonBoron;
            }
            amrex::Abort("Binary nuclear fusion not implemented between species " +
                         species_names[0] + " of type " + species1.getSpeciesTypeName() +
                         " and species " + species_names[1] + " of type " +
                         species2.getSpeciesTypeName());
            return NuclearFusionType::Undefined;
        }

    CollisionType get_collision_type (const std::string collision_name,
                                      MultiParticleContainer const * const mypc)
        {
            amrex::ParmParse pp_collision_name(collision_name);
            std::string type;
            pp_collision_name.get("type", type);
            if (type == "nuclearfusion") {
                NuclearFusionType fusion_type = get_nuclear_fusion_type(collision_name, mypc);
                return nuclear_fusion_type_to_collision_type(fusion_type);
            }
            amrex::Abort(type + " is not a valid type of collision that creates new particles");
            return CollisionType::Undefined;
        }

    CollisionType nuclear_fusion_type_to_collision_type (const NuclearFusionType fusion_type)
        {
            if (fusion_type == NuclearFusionType::DeuteriumTritium)
                return CollisionType::DeuteriumTritiumFusion;
            if (fusion_type == NuclearFusionType::ProtonBoron)
                return CollisionType::ProtonBoronFusion;
            amrex::Abort("Invalid nuclear fusion type");
            return CollisionType::Undefined;
        }
}