aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp')
-rw-r--r--Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp73
1 files changed, 67 insertions, 6 deletions
diff --git a/Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp b/Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp
index 4bbdb4bc4..81acecd3e 100644
--- a/Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp
+++ b/Source/Particles/Collision/BinaryCollision/BinaryCollisionUtils.cpp
@@ -25,20 +25,75 @@ namespace BinaryCollisionUtils{
pp_collision_name.getarr("species", species_names);
auto& species1 = mypc->GetParticleContainerFromName(species_names[0]);
auto& species2 = mypc->GetParticleContainerFromName(species_names[1]);
+ amrex::Vector<std::string> product_species_name;
+ pp_collision_name.getarr("product_species", product_species_name);
if ((species1.AmIA<PhysicalSpecies::hydrogen2>() && species2.AmIA<PhysicalSpecies::hydrogen3>())
||
(species1.AmIA<PhysicalSpecies::hydrogen3>() && species2.AmIA<PhysicalSpecies::hydrogen2>())
)
{
- return NuclearFusionType::DeuteriumTritium;
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ product_species_name.size() == 2u,
+ "ERROR: Deuterium-tritium fusion must contain exactly two product species");
+ auto& product_species1 = mypc->GetParticleContainerFromName(product_species_name[0]);
+ auto& product_species2 = mypc->GetParticleContainerFromName(product_species_name[1]);
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ (product_species1.AmIA<PhysicalSpecies::helium4>() && product_species2.AmIA<PhysicalSpecies::neutron>())
+ ||
+ (product_species1.AmIA<PhysicalSpecies::neutron>() && product_species2.AmIA<PhysicalSpecies::helium4>()),
+ "ERROR: Product species of deuterium-tritium fusion must be of type neutron and helium4");
+ return NuclearFusionType::DeuteriumTritiumToNeutronHelium;
+ }
+ else if (species1.AmIA<PhysicalSpecies::hydrogen2>() && species2.AmIA<PhysicalSpecies::hydrogen2>())
+ {
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ product_species_name.size() == 2u,
+ "ERROR: Deuterium-deuterium fusion must contain exactly two product species");
+ auto& product_species1 = mypc->GetParticleContainerFromName(product_species_name[0]);
+ auto& product_species2 = mypc->GetParticleContainerFromName(product_species_name[1]);
+ if (
+ (product_species1.AmIA<PhysicalSpecies::helium3>() && product_species2.AmIA<PhysicalSpecies::neutron>())
+ ||(product_species1.AmIA<PhysicalSpecies::neutron>() && product_species2.AmIA<PhysicalSpecies::helium3>())){
+ return NuclearFusionType::DeuteriumDeuteriumToNeutronHelium;
+ } else if (
+ (product_species1.AmIA<PhysicalSpecies::hydrogen3>() && product_species2.AmIA<PhysicalSpecies::proton>())
+ ||(product_species1.AmIA<PhysicalSpecies::proton>() && product_species2.AmIA<PhysicalSpecies::hydrogen3>())){
+ return NuclearFusionType::DeuteriumDeuteriumToProtonTritium;
+ } else {
+ amrex::Abort("ERROR: Product species of proton-boron fusion must be of type helium3 and neutron, or tritium and proton");
+ }
+ }
+ else if ((species1.AmIA<PhysicalSpecies::hydrogen2>() && species2.AmIA<PhysicalSpecies::helium3>())
+ ||
+ (species1.AmIA<PhysicalSpecies::helium3>() && species2.AmIA<PhysicalSpecies::hydrogen2>())
+ )
+ {
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ product_species_name.size() == 2u,
+ "ERROR: Deuterium-helium fusion must contain exactly two product species");
+ auto& product_species1 = mypc->GetParticleContainerFromName(product_species_name[0]);
+ auto& product_species2 = mypc->GetParticleContainerFromName(product_species_name[1]);
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ (product_species1.AmIA<PhysicalSpecies::helium4>() && product_species2.AmIA<PhysicalSpecies::proton>())
+ ||
+ (product_species1.AmIA<PhysicalSpecies::proton>() && product_species2.AmIA<PhysicalSpecies::helium4>()),
+ "ERROR: Product species of deuterium-helium fusion must be of type proton and helium4");
+ return NuclearFusionType::DeuteriumHeliumToProtonHelium;
}
else if ((species1.AmIA<PhysicalSpecies::proton>() && species2.AmIA<PhysicalSpecies::boron11>())
||
(species1.AmIA<PhysicalSpecies::boron11>() && species2.AmIA<PhysicalSpecies::proton>())
)
{
- return NuclearFusionType::ProtonBoron;
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ product_species_name.size() == 1,
+ "ERROR: Proton-boron must contain exactly one product species");
+ auto& product_species = mypc->GetParticleContainerFromName(product_species_name[0]);
+ WARPX_ALWAYS_ASSERT_WITH_MESSAGE(
+ product_species.AmIA<PhysicalSpecies::helium>(),
+ "ERROR: Product species of proton-boron fusion must be of type alpha");
+ return NuclearFusionType::ProtonBoronToAlphas;
}
amrex::Abort("Binary nuclear fusion not implemented between species " +
species_names[0] + " of type " + species1.getSpeciesTypeName() +
@@ -63,10 +118,16 @@ namespace BinaryCollisionUtils{
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;
+ if (fusion_type == NuclearFusionType::DeuteriumTritiumToNeutronHelium)
+ return CollisionType::DeuteriumTritiumToNeutronHeliumFusion;
+ if (fusion_type == NuclearFusionType::DeuteriumDeuteriumToProtonTritium)
+ return CollisionType::DeuteriumDeuteriumToProtonTritiumFusion;
+ if (fusion_type == NuclearFusionType::DeuteriumDeuteriumToNeutronHelium)
+ return CollisionType::DeuteriumDeuteriumToNeutronHeliumFusion;
+ if (fusion_type == NuclearFusionType::DeuteriumHeliumToProtonHelium)
+ return CollisionType::DeuteriumHeliumToProtonHeliumFusion;
+ if (fusion_type == NuclearFusionType::ProtonBoronToAlphas)
+ return CollisionType::ProtonBoronToAlphasFusion;
amrex::Abort("Invalid nuclear fusion type");
return CollisionType::Undefined;
}