-
Notifications
You must be signed in to change notification settings - Fork 2
/
Material.cpp
59 lines (50 loc) · 1.43 KB
/
Material.cpp
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
/*
Author: Blake
Date: 11/8/17
Req. Files: Material.cpp, Particle.h
*/
#include "Material.h"
void Material::addNuclide( Nuclide_ptr newNuclide, double atomFrac )
{
nuclides.push_back( std::make_pair( newNuclide, atomFrac ) );
return;
}
double Material::getMicroXS( Part_ptr p )
{
double xs = 0.0;
for ( auto n : nuclides )
{
// first is pointer to nuclide, second is atomic fraction
xs += n.first->getTotalXS( p ) * n.second;
}
return xs;
}
double Material::getMacroXS( Part_ptr p )
{
return getAtomDensity() * getMicroXS( p );
}
// randomly sample a nuclide based on total cross sections and atomic fractions
Nuclide_ptr Material::sampleNuclide( Part_ptr p )
{
double u = getMicroXS( p ) * Urand();
double s = 0.0;
for ( auto n : nuclides )
{
// first is pointer to nuclide, second is atomic fraction
s += n.first->getTotalXS( p ) * n.second;
if ( s > u ) { return n.first; }
}
assert( false ); // should never reach here
return nullptr;
}
// function that samples an entire collision: sample nuclide, then its reaction,
// and finally process that reaction with input pointers to the working particle p
// and the particle bank
void Material::sampleCollision( Part_ptr p, std::stack< Part_ptr > &bank ) {
// first sample nuclide
Nuclide_ptr N = sampleNuclide( p );
// now get the reaction
Reaction_ptr R = N->sampleReaction( p );
// finally process the reaction
R->sample( p, bank );
}