def test_get_set_chain_br(simple_chain): """Test minor modifications to capture branch ratios""" expected = {"C": {"A": 0.7, "B": 0.3}} assert simple_chain.get_branch_ratios() == expected # safely modify new_chain = Chain.from_xml("chain_test.xml") new_br = {"C": {"A": 0.5, "B": 0.5}, "A": {"C": 0.99, "B": 0.01}} new_chain.set_branch_ratios(new_br) assert new_chain.get_branch_ratios() == new_br # write, re-read new_chain.export_to_xml("chain_mod.xml") assert Chain.from_xml("chain_mod.xml").get_branch_ratios() == new_br # Test non-strict [warn, not error] setting bad_br = {"B": {"X": 0.6, "A": 0.4}, "X": {"A": 0.5, "C": 0.5}} bad_br.update(new_br) new_chain.set_branch_ratios(bad_br, strict=False) assert new_chain.get_branch_ratios() == new_br # Ensure capture reactions are removed rem_br = {"A": {"C": 1.0}} new_chain.set_branch_ratios(rem_br) # A is not in returned dict because there is no branch assert "A" not in new_chain.get_branch_ratios()
def test_getitem(): """Test nuc_by_ind converter function.""" chain = Chain() chain.nuclides = ["NucA", "NucB", "NucC"] chain.nuclide_dict = {nuc: chain.nuclides.index(nuc) for nuc in chain.nuclides} assert "NucA" == chain["NucA"] assert "NucB" == chain["NucB"] assert "NucC" == chain["NucC"]
def test_export_to_xml(run_in_tmpdir): """Test writing a depletion chain to XML.""" # Prevent different MPI ranks from conflicting filename = 'test{}.xml'.format(comm.rank) H1 = nuclide.Nuclide("H1") A = nuclide.Nuclide("A") A.half_life = 2.36520e4 A.decay_modes = [ nuclide.DecayTuple("beta1", "B", 0.6), nuclide.DecayTuple("beta2", "C", 0.4) ] A.reactions = [ nuclide.ReactionTuple("(n,gamma)", "C", 0.0, 1.0), nuclide.ReactionTuple("(n,p)", "B", 0.0, 1.0) ] B = nuclide.Nuclide("B") B.half_life = 3.29040e4 B.decay_modes = [nuclide.DecayTuple("beta", "A", 1.0)] B.reactions = [ nuclide.ReactionTuple("(n,gamma)", "C", 0.0, 1.0), nuclide.ReactionTuple("(n,d)", "A", 0.0, 1.0) ] C = nuclide.Nuclide("C") C.reactions = [ nuclide.ReactionTuple("fission", None, 2.0e8, 1.0), nuclide.ReactionTuple("(n,gamma)", "A", 0.0, 0.7), nuclide.ReactionTuple("(n,gamma)", "B", 0.0, 0.3) ] C.yield_data = nuclide.FissionYieldDistribution( {0.0253: { "A": 0.0292737, "B": 0.002566345 }}) chain = Chain() chain.nuclides = [H1, A, B, C] chain.export_to_xml(filename) chain_xml = open(filename, 'r').read() assert _TEST_CHAIN == chain_xml
def test_fission_yield_attribute(simple_chain): """Test the fission_yields property""" thermal_yields = simple_chain.get_default_fission_yields() # generate default with property assert simple_chain.fission_yields[0] == thermal_yields empty_chain = Chain() empty_chain.fission_yields = thermal_yields assert empty_chain.fission_yields[0] == thermal_yields empty_chain.fission_yields = [thermal_yields] * 2 assert empty_chain.fission_yields[0] == thermal_yields assert empty_chain.fission_yields[1] == thermal_yields # test failure with deplete function # number fission yields != number of materials dummy_conc = [[1, 2]] * (len(empty_chain.fission_yields) + 1) with pytest.raises(ValueError, match="fission yield.*not equal.*compositions"): pool.deplete(cram.CRAM48, empty_chain, dummy_conc, None, 0.5)
def test_set_fiss_q(): """Make sure new fission q values can be set on the chain""" new_q = {"U235": 2.0E8, "U238": 2.0E8, "U234": 5.0E7} chain_file = Path(__file__).parents[1] / "chain_simple.xml" mod_chain = Chain.from_xml(chain_file, new_q) for name, q in new_q.items(): chain_nuc = mod_chain[name] for rx in chain_nuc.reactions: if rx.type == 'fission': assert rx.Q == q
def test_from_endf(): """Test depletion chain building from ENDF files""" endf_data = Path(os.environ['OPENMC_ENDF_DATA']) decay_data = (endf_data / 'decay').glob('*.endf') fpy_data = (endf_data / 'nfy').glob('*.endf') neutron_data = (endf_data / 'neutrons').glob('*.endf') chain = Chain.from_endf(decay_data, fpy_data, neutron_data) assert len(chain) == len(chain.nuclides) == len(chain.nuclide_dict) == 3820 for nuc in chain.nuclides: assert nuc == chain[nuc.name]
def test_validate_inputs(): c = Chain() with pytest.raises(TypeError, match="tolerance"): c.validate(tolerance=None) with pytest.raises(ValueError, match="tolerance"): c.validate(tolerance=-1)
def test_capture_branch_no_rxn(): """Ensure capture reactions that don't exist aren't created""" u4br = {"U234": {"U235": 0.5, "U235_m1": 0.5}} chain_file = Path(__file__).parents[1] / "chain_simple.xml" chain = Chain.from_xml(chain_file) u5m = nuclide.Nuclide("U235_m1") chain.nuclides.append(u5m) chain.nuclide_dict[u5m.name] = len(chain.nuclides) - 1 with pytest.raises(AttributeError, match="U234"): chain.set_branch_ratios(u4br)
def test_capture_branch_infer_ground(): """Ensure the ground state is infered if not given""" # Make up a metastable capture transition: infer_br = {"Xe135": {"Xe136_m1": 0.5}} set_br = {"Xe135": {"Xe136": 0.5, "Xe136_m1": 0.5}} chain_file = Path(__file__).parents[1] / "chain_simple.xml" chain = Chain.from_xml(chain_file) # Create nuclide to be added into the chain xe136m = nuclide.Nuclide("Xe136_m1") chain.nuclides.append(xe136m) chain.nuclide_dict[xe136m.name] = len(chain.nuclides) - 1 chain.set_branch_ratios(infer_br, "(n,gamma)") assert chain.get_branch_ratios("(n,gamma)") == set_br
def test_set_alpha_branches(): """Test setting of alpha reaction branching ratios""" # Build a mock chain chain = Chain() parent = nuclide.Nuclide() parent.name = "A" he4 = nuclide.Nuclide() he4.name = "He4" ground_tgt = nuclide.Nuclide() ground_tgt.name = "B" meta_tgt = nuclide.Nuclide() meta_tgt.name = "B_m1" for ix, nuc in enumerate((parent, ground_tgt, meta_tgt, he4)): chain.nuclides.append(nuc) chain.nuclide_dict[nuc.name] = ix # add reactions to parent parent.reactions.append(nuclide.ReactionTuple( "(n,a)", ground_tgt.name, 1.0, 0.6)) parent.reactions.append(nuclide.ReactionTuple( "(n,a)", meta_tgt.name, 1.0, 0.4)) parent.reactions.append(nuclide.ReactionTuple( "(n,a)", he4.name, 1.0, 1.0)) expected_ref = {"A": {"B": 0.6, "B_m1": 0.4}} assert chain.get_branch_ratios("(n,a)") == expected_ref # alter and check again altered = {"A": {"B": 0.5, "B_m1": 0.5}} chain.set_branch_ratios(altered, "(n,a)") assert chain.get_branch_ratios("(n,a)") == altered # make sure that alpha particle still produced for r in parent.reactions: if r.target == he4.name: break else: raise ValueError("Helium has been removed and should not have been")
def test_len(): """Test depletion chain length.""" chain = Chain() chain.nuclides = ["NucA", "NucB", "NucC"] assert len(chain) == 3
def test_init(): """Test depletion chain initialization.""" chain = Chain() assert isinstance(chain.nuclides, list) assert isinstance(chain.nuclide_dict, Mapping)
def endf_chain(): endf_data = Path(os.environ['OPENMC_ENDF_DATA']) decay_data = (endf_data / 'decay').glob('*.endf') fpy_data = (endf_data / 'nfy').glob('*.endf') neutron_data = (endf_data / 'neutrons').glob('*.endf') return Chain.from_endf(decay_data, fpy_data, neutron_data)
def gnd_simple_chain(): chainfile = Path(__file__).parents[1] / "chain_simple.xml" return Chain.from_xml(chainfile)
def simple_chain(): with cdtemp(): with open('chain_test.xml', 'w') as fh: fh.write(_TEST_CHAIN) yield Chain.from_xml('chain_test.xml')