Skip to content

Commit aaa1b92

Browse files
authored
Merge pull request #189 from njoy/feature/mf9-mf10-interface
Adding additional interface functions for mf10
2 parents 39a71b1 + d27a77d commit aaa1b92

File tree

8 files changed

+358
-0
lines changed

8 files changed

+358
-0
lines changed

python/src/section/10.python.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,26 @@ void wrapSection_10( python::module& module, python::module& viewmodule ) {
8181
&Section::numberReactionProducts,
8282
"The number of excited states for the reaction product"
8383
)
84+
.def(
85+
86+
"has_excited_state",
87+
&Section::hasExcitedState,
88+
python::arg( "state" ),
89+
"Return whether or not the excited state is present\n\n"
90+
"Arguments:\n"
91+
" self the section\n"
92+
" state the excited state to retrieve"
93+
)
94+
.def(
95+
96+
"reaction_product",
97+
&Section::reactionProduct,
98+
python::arg( "state" ),
99+
"Return the reaction product for the requested excited state\n\n"
100+
"Arguments:\n"
101+
" self the section\n"
102+
" state the excited state to retrieve"
103+
)
84104
.def_property_readonly(
85105

86106
"reaction_products",

python/src/section/9.python.cpp

+20
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,26 @@ void wrapSection_9( python::module& module, python::module& viewmodule ) {
8181
&Section::numberReactionProducts,
8282
"The number of excited states for the reaction product"
8383
)
84+
.def(
85+
86+
"has_excited_state",
87+
&Section::hasExcitedState,
88+
python::arg( "state" ),
89+
"Return whether or not the excited state is present\n\n"
90+
"Arguments:\n"
91+
" self the section\n"
92+
" state the excited state to retrieve"
93+
)
94+
.def(
95+
96+
"reaction_product",
97+
&Section::reactionProduct,
98+
python::arg( "state" ),
99+
"Return the reaction product for the requested excited state\n\n"
100+
"Arguments:\n"
101+
" self the section\n"
102+
" state the excited state to retrieve"
103+
)
84104
.def_property_readonly(
85105

86106
"reaction_products",

python/test/MF10/Test_ENDFtk_MF10_Section.py

+63
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,69 @@ def verify_chunk( self, chunk ) :
9898
self.assertAlmostEqual( 0.1, product.cross_sections[0] )
9999
self.assertAlmostEqual( 0.48, product.cross_sections[1] )
100100

101+
self.assertEqual( True, chunk.has_excited_state( 0 ) )
102+
product = chunk.reaction_product( 0 )
103+
self.assertAlmostEqual( 5.537755e+6, product.QM )
104+
self.assertAlmostEqual( 5.537755e+6, product.mass_difference_qvalue )
105+
self.assertAlmostEqual( 5.537755e+6, product.QI )
106+
self.assertAlmostEqual( 5.537755e+6, product.reaction_qvalue )
107+
self.assertEqual( 95242, product.IZAP )
108+
self.assertEqual( 95242, product.product_identifier )
109+
self.assertEqual( 0, product.LFS )
110+
self.assertEqual( 0, product.excited_level )
111+
self.assertEqual( 2, product.NP )
112+
self.assertEqual( 1, product.NR )
113+
self.assertEqual( 1, len( product.interpolants ) )
114+
self.assertEqual( 1, len( product.boundaries ) )
115+
self.assertEqual( 3, product.interpolants[0] )
116+
self.assertEqual( 2, product.boundaries[0] )
117+
self.assertEqual( 2, len( product.E ) )
118+
self.assertEqual( 2, len( product.energies ) )
119+
self.assertEqual( 2, len( product.XS ) )
120+
self.assertEqual( 2, len( product.cross_sections ) )
121+
self.assertAlmostEqual( 1e-5, product.E[0] )
122+
self.assertAlmostEqual( 3e+7, product.E[1] )
123+
self.assertAlmostEqual( 1e-5, product.energies[0] )
124+
self.assertAlmostEqual( 3e+7, product.energies[1] )
125+
self.assertAlmostEqual( 0.9, product.XS[0] )
126+
self.assertAlmostEqual( 0.52, product.XS[1] )
127+
self.assertAlmostEqual( 0.9, product.cross_sections[0] )
128+
self.assertAlmostEqual( 0.52, product.cross_sections[1] )
129+
130+
self.assertEqual( True, chunk.has_excited_state( 2 ) )
131+
with self.assertRaises( Exception ) :
132+
133+
product = chunk.reaction_product( 1 )
134+
135+
self.assertEqual( True, chunk.has_excited_state( 2 ) )
136+
product = chunk.reaction_product( 2 )
137+
self.assertAlmostEqual( 5.537755e+6, product.QM )
138+
self.assertAlmostEqual( 5.537755e+6, product.mass_difference_qvalue )
139+
self.assertAlmostEqual( 5.489125e+6, product.QI )
140+
self.assertAlmostEqual( 5.489125e+6, product.reaction_qvalue )
141+
self.assertEqual( 95242, product.IZAP )
142+
self.assertEqual( 95242, product.product_identifier )
143+
self.assertEqual( 2, product.LFS )
144+
self.assertEqual( 2, product.excited_level )
145+
self.assertEqual( 2, product.NP )
146+
self.assertEqual( 1, product.NR )
147+
self.assertEqual( 1, len( product.interpolants ) )
148+
self.assertEqual( 1, len( product.boundaries ) )
149+
self.assertEqual( 3, product.interpolants[0] )
150+
self.assertEqual( 2, product.boundaries[0] )
151+
self.assertEqual( 2, len( product.E ) )
152+
self.assertEqual( 2, len( product.energies ) )
153+
self.assertEqual( 2, len( product.XS ) )
154+
self.assertEqual( 2, len( product.cross_sections ) )
155+
self.assertAlmostEqual( 1e-5, product.E[0] )
156+
self.assertAlmostEqual( 3e+7, product.E[1] )
157+
self.assertAlmostEqual( 1e-5, product.energies[0] )
158+
self.assertAlmostEqual( 3e+7, product.energies[1] )
159+
self.assertAlmostEqual( 0.1, product.XS[0] )
160+
self.assertAlmostEqual( 0.48, product.XS[1] )
161+
self.assertAlmostEqual( 0.1, product.cross_sections[0] )
162+
self.assertAlmostEqual( 0.48, product.cross_sections[1] )
163+
101164
self.assertEqual( 7, chunk.NC )
102165

103166
# verify string

python/test/MF9/Test_ENDFtk_MF9_Section.py

+63
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,69 @@ def verify_chunk( self, chunk ) :
9898
self.assertAlmostEqual( 0.1, product.multiplicities[0] )
9999
self.assertAlmostEqual( 0.48, product.multiplicities[1] )
100100

101+
self.assertEqual( True, chunk.has_excited_state( 0 ) )
102+
product = chunk.reaction_product( 0 )
103+
self.assertAlmostEqual( 5.537755e+6, product.QM )
104+
self.assertAlmostEqual( 5.537755e+6, product.mass_difference_qvalue )
105+
self.assertAlmostEqual( 5.537755e+6, product.QI )
106+
self.assertAlmostEqual( 5.537755e+6, product.reaction_qvalue )
107+
self.assertEqual( 95242, product.IZAP )
108+
self.assertEqual( 95242, product.product_identifier )
109+
self.assertEqual( 0, product.LFS )
110+
self.assertEqual( 0, product.excited_level )
111+
self.assertEqual( 2, product.NP )
112+
self.assertEqual( 1, product.NR )
113+
self.assertEqual( 1, len( product.interpolants ) )
114+
self.assertEqual( 1, len( product.boundaries ) )
115+
self.assertEqual( 3, product.interpolants[0] )
116+
self.assertEqual( 2, product.boundaries[0] )
117+
self.assertEqual( 2, len( product.E ) )
118+
self.assertEqual( 2, len( product.energies ) )
119+
self.assertEqual( 2, len( product.Y ) )
120+
self.assertEqual( 2, len( product.multiplicities ) )
121+
self.assertAlmostEqual( 1e-5, product.E[0] )
122+
self.assertAlmostEqual( 3e+7, product.E[1] )
123+
self.assertAlmostEqual( 1e-5, product.energies[0] )
124+
self.assertAlmostEqual( 3e+7, product.energies[1] )
125+
self.assertAlmostEqual( 0.9, product.Y[0] )
126+
self.assertAlmostEqual( 0.52, product.Y[1] )
127+
self.assertAlmostEqual( 0.9, product.multiplicities[0] )
128+
self.assertAlmostEqual( 0.52, product.multiplicities[1] )
129+
130+
self.assertEqual( True, chunk.has_excited_state( 2 ) )
131+
with self.assertRaises( Exception ) :
132+
133+
product = chunk.reaction_product( 1 )
134+
135+
self.assertEqual( True, chunk.has_excited_state( 2 ) )
136+
product = chunk.reaction_product( 2 )
137+
self.assertAlmostEqual( 5.537755e+6, product.QM )
138+
self.assertAlmostEqual( 5.537755e+6, product.mass_difference_qvalue )
139+
self.assertAlmostEqual( 5.489125e+6, product.QI )
140+
self.assertAlmostEqual( 5.489125e+6, product.reaction_qvalue )
141+
self.assertEqual( 95242, product.IZAP )
142+
self.assertEqual( 95242, product.product_identifier )
143+
self.assertEqual( 2, product.LFS )
144+
self.assertEqual( 2, product.excited_level )
145+
self.assertEqual( 2, product.NP )
146+
self.assertEqual( 1, product.NR )
147+
self.assertEqual( 1, len( product.interpolants ) )
148+
self.assertEqual( 1, len( product.boundaries ) )
149+
self.assertEqual( 3, product.interpolants[0] )
150+
self.assertEqual( 2, product.boundaries[0] )
151+
self.assertEqual( 2, len( product.E ) )
152+
self.assertEqual( 2, len( product.energies ) )
153+
self.assertEqual( 2, len( product.Y ) )
154+
self.assertEqual( 2, len( product.multiplicities ) )
155+
self.assertAlmostEqual( 1e-5, product.E[0] )
156+
self.assertAlmostEqual( 3e+7, product.E[1] )
157+
self.assertAlmostEqual( 1e-5, product.energies[0] )
158+
self.assertAlmostEqual( 3e+7, product.energies[1] )
159+
self.assertAlmostEqual( 0.1, product.Y[0] )
160+
self.assertAlmostEqual( 0.48, product.Y[1] )
161+
self.assertAlmostEqual( 0.1, product.multiplicities[0] )
162+
self.assertAlmostEqual( 0.48, product.multiplicities[1] )
163+
101164
self.assertEqual( 7, chunk.NC )
102165

103166
# verify string

src/ENDFtk/section/10.hpp

+35
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,41 @@ namespace section {
5959
*/
6060
int numberReactionProducts() const { return this->NS(); }
6161

62+
/**
63+
* @brief Return whether or not the excited state is present
64+
*
65+
* @param[in] state the excited state to retrieve
66+
*/
67+
bool hasExcitedState( int state ) const {
68+
69+
return std::find_if( this->products_.begin(), this->products_.end(),
70+
[state] ( auto&& product )
71+
{ return product.excitedLevel() == state; } )
72+
!= this->products_.end();
73+
}
74+
75+
/**
76+
* @brief Return the reaction product for the requested excited state
77+
*
78+
* @param[in] state the excited state to retrieve
79+
*/
80+
const ReactionProduct& reactionProduct( int state ) const {
81+
82+
auto iter = std::find_if( this->products_.begin(), this->products_.end(),
83+
[state] ( auto&& product )
84+
{ return product.excitedLevel() == state; } );
85+
if ( this->products_.end() == iter ) {
86+
87+
Log::error( "The requested excited state {} is not present in MF10",
88+
state );
89+
throw std::exception();
90+
}
91+
else {
92+
93+
return *iter;
94+
}
95+
}
96+
6297
/**
6398
* @brief Return the reaction product data
6499
*/

src/ENDFtk/section/10/test/10.test.cpp

+61
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,67 @@ void verifyChunk( const section::Type< 10 >& chunk ) {
206206
CHECK_THAT( 0.1, WithinRel( product.crossSections()[0] ) );
207207
CHECK_THAT( 0.48, WithinRel( product.crossSections()[1] ) );
208208

209+
CHECK( true == chunk.hasExcitedState( 0 ) );
210+
product = chunk.reactionProduct( 0 );
211+
CHECK_THAT( 5.537755e+6, WithinRel( product.QM() ) );
212+
CHECK_THAT( 5.537755e+6, WithinRel( product.massDifferenceQValue() ) );
213+
CHECK_THAT( 5.537755e+6, WithinRel( product.QI() ) );
214+
CHECK_THAT( 5.537755e+6, WithinRel( product.reactionQValue() ) );
215+
CHECK( 95242 == product.IZAP() );
216+
CHECK( 95242 == product.productIdentifier() );
217+
CHECK( 0 == product.LFS() );
218+
CHECK( 0 == product.excitedLevel() );
219+
CHECK( 2 == product.NP() );
220+
CHECK( 1 == product.NR() );
221+
CHECK( 1 == product.interpolants().size() );
222+
CHECK( 1 == product.boundaries().size() );
223+
CHECK( 3 == product.interpolants()[0] );
224+
CHECK( 2 == product.boundaries()[0] );
225+
CHECK( 2 == product.E().size() );
226+
CHECK( 2 == product.energies().size() );
227+
CHECK( 2 == product.XS().size() );
228+
CHECK( 2 == product.crossSections().size() );
229+
CHECK_THAT( 1e-5, WithinRel( product.E()[0] ) );
230+
CHECK_THAT( 3e+7, WithinRel( product.E()[1] ) );
231+
CHECK_THAT( 1e-5, WithinRel( product.energies()[0] ) );
232+
CHECK_THAT( 3e+7, WithinRel( product.energies()[1] ) );
233+
CHECK_THAT( 0.9, WithinRel( product.XS()[0] ) );
234+
CHECK_THAT( 0.52, WithinRel( product.XS()[1] ) );
235+
CHECK_THAT( 0.9, WithinRel( product.crossSections()[0] ) );
236+
CHECK_THAT( 0.52, WithinRel( product.crossSections()[1] ) );
237+
238+
CHECK( false == chunk.hasExcitedState( 1 ) );
239+
CHECK_THROWS( product = chunk.reactionProduct( 1 ) );
240+
241+
CHECK( true == chunk.hasExcitedState( 2 ) );
242+
product = chunk.reactionProduct( 2 );
243+
CHECK_THAT( 5.537755e+6, WithinRel( product.QM() ) );
244+
CHECK_THAT( 5.537755e+6, WithinRel( product.massDifferenceQValue() ) );
245+
CHECK_THAT( 5.489125e+6, WithinRel( product.QI() ) );
246+
CHECK_THAT( 5.489125e+6, WithinRel( product.reactionQValue() ) );
247+
CHECK( 95242 == product.IZAP() );
248+
CHECK( 95242 == product.productIdentifier() );
249+
CHECK( 2 == product.LFS() );
250+
CHECK( 2 == product.excitedLevel() );
251+
CHECK( 2 == product.NP() );
252+
CHECK( 1 == product.NR() );
253+
CHECK( 1 == product.interpolants().size() );
254+
CHECK( 1 == product.boundaries().size() );
255+
CHECK( 3 == product.interpolants()[0] );
256+
CHECK( 2 == product.boundaries()[0] );
257+
CHECK( 2 == product.E().size() );
258+
CHECK( 2 == product.energies().size() );
259+
CHECK( 2 == product.XS().size() );
260+
CHECK( 2 == product.crossSections().size() );
261+
CHECK_THAT( 1e-5, WithinRel( product.E()[0] ) );
262+
CHECK_THAT( 3e+7, WithinRel( product.E()[1] ) );
263+
CHECK_THAT( 1e-5, WithinRel( product.energies()[0] ) );
264+
CHECK_THAT( 3e+7, WithinRel( product.energies()[1] ) );
265+
CHECK_THAT( 0.1, WithinRel( product.XS()[0] ) );
266+
CHECK_THAT( 0.48, WithinRel( product.XS()[1] ) );
267+
CHECK_THAT( 0.1, WithinRel( product.crossSections()[0] ) );
268+
CHECK_THAT( 0.48, WithinRel( product.crossSections()[1] ) );
269+
209270
CHECK( 7 == chunk.NC() );
210271
}
211272

src/ENDFtk/section/9.hpp

+35
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,41 @@ namespace section {
5959
*/
6060
int numberReactionProducts() const { return this->NS(); }
6161

62+
/**
63+
* @brief Return whether or not the excited state is present
64+
*
65+
* @param[in] state the excited state to retrieve
66+
*/
67+
bool hasExcitedState( int state ) const {
68+
69+
return std::find_if( this->products_.begin(), this->products_.end(),
70+
[state] ( auto&& product )
71+
{ return product.excitedLevel() == state; } )
72+
!= this->products_.end();
73+
}
74+
75+
/**
76+
* @brief Return the reaction product for the requested excited state
77+
*
78+
* @param[in] state the excited state to retrieve
79+
*/
80+
const ReactionProduct& reactionProduct( int state ) const {
81+
82+
auto iter = std::find_if( this->products_.begin(), this->products_.end(),
83+
[state] ( auto&& product )
84+
{ return product.excitedLevel() == state; } );
85+
if ( this->products_.end() == iter ) {
86+
87+
Log::error( "The requested excited state {} is not present in MF9",
88+
state );
89+
throw std::exception();
90+
}
91+
else {
92+
93+
return *iter;
94+
}
95+
}
96+
6297
/**
6398
* @brief Return the reaction product data
6499
*/

0 commit comments

Comments
 (0)