diff --git a/openmc/deplete/chain.py b/openmc/deplete/chain.py index 689546b86bf..3076815ded5 100644 --- a/openmc/deplete/chain.py +++ b/openmc/deplete/chain.py @@ -1237,6 +1237,54 @@ def reduce(self, initial_isotopes, level=None): return new_chain + def get_decay_daughters(self, nuclide, max_half_life=None): + """Return all nuclides reachable via decay from a given nuclide. + + Unlike :meth:`reduce`, this follows only decay paths (not + reactions such as neutron capture) and returns a set of nuclide + names rather than a new :class:`Chain`. + + Parameters + ---------- + nuclide : str + Name of the parent nuclide. + max_half_life : float, optional + Maximum daughter half-life in seconds. Stops descending a + branch when a daughter's half-life exceeds this value. If + None, all radioactive daughters are returned regardless of + half-life. + + Returns + ------- + set of str + Names of all decay daughters reachable from the parent. + + """ + daughters = set() + stack = [nuclide] + visited = set() + while stack: + name = stack.pop() + if name in visited: + continue + visited.add(name) + if name not in self.nuclide_dict: + continue + for mode in self[name].decay_modes: + target = mode.target + if target is None or target in visited: + continue + if target not in self.nuclide_dict: + continue + target_nuc = self[target] + if target_nuc.half_life is None or target_nuc.half_life <= 0: + continue + if max_half_life is not None and target_nuc.half_life >= max_half_life: + continue + daughters.add(target) + stack.append(target) + return daughters + def _follow(self, isotopes, level): """Return all isotopes present up to depth level""" found = isotopes.copy() diff --git a/openmc/material.py b/openmc/material.py index 239bc01f771..b09fac4a4db 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -1597,6 +1597,7 @@ def waste_disposal_rating( limits: str | dict[str, float] = 'Fetter', metal: bool = False, by_nuclide: bool = False, + chain=None, ) -> float | dict[str, float]: """Return the waste disposal rating for the material. @@ -1630,6 +1631,37 @@ def waste_disposal_rating( short-lived radionuclides - 'NRC_short_C': Uses the 10 CFR 61.55 class C limits for short-lived radionuclides + The following options use clearance values from the German + Strahlenschutzverordnung (StrlSchV) 2018, Anlage 4, Tabelle 1. + These limits are in [Bq/g] and the material activity will be + compared using the same units. + + - 'StrlSchV_unrestricted': Unrestricted clearance of solid and + liquid substances (column 3) + - 'StrlSchV_metal_recycling': Metal scrap recycling (column 14) + - 'StrlSchV_landfill_100': Landfill disposal for facilities + receiving ≤100 Mg/a (column 8) + - 'StrlSchV_landfill_1000': Landfill disposal for facilities + receiving ≤1000 Mg/a (column 10) + - 'StrlSchV_incineration_100': Incineration for facilities + receiving ≤100 Mg/a (column 9) + - 'StrlSchV_incineration_1000': Incineration for facilities + receiving ≤1000 Mg/a (column 11) + - 'StrlSchV_soil': Soil surface clearance (column 7) + - 'StrlSchV_rubble': Building rubble clearance for >1000 Mg/a + (column 6) + + .. note:: + Some nuclides in Anlage 4 are listed with a '+' suffix, + indicating that their clearance value includes daughter + nuclides in secular equilibrium. When a depletion chain is + provided via the ``chain`` parameter, daughters in secular + equilibrium are automatically excluded from the + sum-of-fractions to avoid double-counting. Without a + chain, all nuclides with clearance entries are counted + individually, which may overestimate the rating for some + decay chains. + metal : bool, optional Whether or not the material is in metal form (only applicable for NRC based limits) @@ -1639,6 +1671,11 @@ def waste_disposal_rating( nuclide names and the values are the waste disposal ratings for each nuclide. If False, a single float value is returned that represents the overall waste disposal rating for the material. + chain : openmc.deplete.Chain, optional + Depletion chain used to identify daughter nuclides in secular + equilibrium for StrlSchV limits. When provided, daughters + covered by a parent's '+' clearance value are excluded from + the sum-of-fractions to avoid double-counting. Returns ------- @@ -1651,7 +1688,7 @@ def waste_disposal_rating( Material.waste_classification() """ - return waste._waste_disposal_rating(self, limits, metal, by_nuclide) + return waste._waste_disposal_rating(self, limits, metal, by_nuclide, chain) def clone(self, memo: dict | None = None) -> Material: """Create a copy of this material with a new unique ID. diff --git a/openmc/waste.py b/openmc/waste.py index 80cfc0adcba..9a315cace2c 100644 --- a/openmc/waste.py +++ b/openmc/waste.py @@ -3,6 +3,27 @@ import openmc from openmc.data import half_life +# Nuclides whose clearance values in StrlSchV Anlage 4 are listed with a '+' +# suffix, meaning the value accounts for daughter nuclides in secular +# equilibrium. When a depletion chain is available, daughters of these nuclides +# are excluded from the sum-of-fractions to avoid double-counting. +_STRLSCHV_PLUS_PARENTS = { + "Ac225", "Ac227", "Ag108_m1", "Ag110_m1", "Am242_m1", "Am243", "As73", + "At211", "Bi210_m1", "Bi212", "Bk249", "Ca45", "Cd109", "Cd115", + "Cd115_m1", "Ce144", "Cf253", "Cm247", "Cs137", "Fe52", "Fe60", "Gd146", + "Ge68", "Hf172", "Hf178_m2", "Hf182", "Hg194", "Hg195_m1", "Hg197_m1", + "I135", "In111", "In114_m1", "Ir189", "Lu177_m1", "Mo99", "Np237", + "Os191", "Os194", "Pa230", "Pb202", "Pb210", "Pd103", "Pd109", "Pt191", + "Pt197_m1", "Pu239", "Pu241", "Pu244", "Ra223", "Ra224", "Ra226", + "Ra228", "Rb81", "Rb83", "Re186_m1", "Re189", "Rn222", "Ru103", "Ru105", + "Ru106", "Sb125", "Si32", "Sn113", "Sn121_m1", "Sn126", "Sr82", "Sr89", + "Sr90", "Sr91", "Ta178_m1", "Tc95_m1", "Te127_m1", "Te129_m1", + "Te131_m1", "Te132", "Th228", "Th229", "Th234", "Ti44", "Tm167", "U230", + "U232", "U235", "U238", "W178", "W188", "Xe122", "Y87", "Zn69_m1", + "Zr95", "Zr97", +} + + def _waste_classification(mat: openmc.Material, metal: bool = True) -> str: """Classify a material for near-surface waste disposal. @@ -81,6 +102,7 @@ def _waste_disposal_rating( limits: str | dict[str, float] = 'Fetter', metal: bool = False, by_nuclide: bool = False, + chain=None, ) -> float | dict[str, float]: """Return the waste disposal rating for a material. @@ -109,6 +131,36 @@ def _waste_disposal_rating( radionuclides - 'NRC_short_C': Uses the 10 CFR 61.55 class C limits for short-lived radionuclides + The following options use clearance values from the German + Strahlenschutzverordnung (StrlSchV) 2018, Anlage 4, Tabelle 1. + These limits are in [Bq/g] and the material activity will be + compared using the same units. + + - 'StrlSchV_unrestricted': Unrestricted clearance of solid and + liquid substances (column 3) + - 'StrlSchV_metal_recycling': Metal scrap recycling (column 14) + - 'StrlSchV_landfill_100': Landfill disposal for facilities + receiving ≤100 Mg/a (column 8) + - 'StrlSchV_landfill_1000': Landfill disposal for facilities + receiving ≤1000 Mg/a (column 10) + - 'StrlSchV_incineration_100': Incineration for facilities + receiving ≤100 Mg/a (column 9) + - 'StrlSchV_incineration_1000': Incineration for facilities + receiving ≤1000 Mg/a (column 11) + - 'StrlSchV_soil': Soil surface clearance (column 7) + - 'StrlSchV_rubble': Building rubble clearance for >1000 Mg/a + (column 6) + + .. note:: + Some nuclides in Anlage 4 are listed with a '+' suffix, + indicating that their clearance value includes daughter + nuclides in secular equilibrium. When a depletion chain is + provided via the ``chain`` parameter, daughters in secular + equilibrium are automatically excluded from the + sum-of-fractions to avoid double-counting. Without a chain, + all nuclides with clearance entries are counted individually, + which may overestimate the rating for some decay chains. + metal : bool, optional Whether or not the material is in metal form (only applicable for NRC based limits) @@ -118,6 +170,11 @@ def _waste_disposal_rating( nuclide names and the values are the waste disposal ratings for each nuclide. If False, a single float value is returned that represents the overall waste disposal rating for the material. + chain : openmc.deplete.Chain, optional + Depletion chain used to identify daughter nuclides in secular + equilibrium for StrlSchV limits. When provided, daughters covered + by a parent's '+' clearance value are excluded from the + sum-of-fractions to avoid double-counting. Returns ------- @@ -125,6 +182,8 @@ def _waste_disposal_rating( The waste disposal rating for the material or its constituent nuclides. """ + units = None + is_strlschv = False if limits == 'Fetter': # Specific activity limits for radionuclides with half-lives between 5 # years and 1e12 years from Table 2 in Fetter @@ -277,10 +336,1693 @@ def _waste_disposal_rating( # from Table 2 in 10 CFR 61.55 limits = {'Ni63': 7000.0 if metal else 700.0, 'Sr90': 7000.0, 'Cs137': 4600.0} + elif limits == 'StrlSchV_unrestricted': + # Unrestricted clearance (uneingeschränkte Freigabe) + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 3 in Bq/g + limits = { + "Ac225": 10.0, + "Ac227": 1.0e-02, + "Ac228": 10.0, + "Ag105": 1.0, + "Ag108_m1": 1.0e-01, + "Ag110_m1": 1.0e-01, + "Ag111": 100.0, + "Am241": 1.0e-01, + "Am242_m1": 1.0e-01, + "Am243": 1.0e-01, + "Am244": 10.0, + "Ar37": 1.0e+06, + "Ar39": 1.0e+07, + "As72": 10.0, + "As73": 1000.0, + "As74": 10.0, + "As76": 10.0, + "As77": 1000.0, + "At211": 1000.0, + "Au193": 100.0, + "Au194": 10.0, + "Au195": 10.0, + "Au198": 10.0, + "Au199": 100.0, + "Ba131": 10.0, + "Ba133": 1.0e-01, + "Ba133_m1": 100.0, + "Ba140": 1.0, + "Be10": 100.0, + "Be7": 10.0, + "Bi206": 1.0, + "Bi207": 1.0e-01, + "Bi210": 1000.0, + "Bi210_m1": 1.0e-01, + "Bi212": 10.0, + "Bk247": 1.0e-01, + "Bk249": 100.0, + "Br76": 10.0, + "Br77": 100.0, + "Br82": 1.0, + "C14": 1.0, + "Ca41": 100.0, + "Ca45": 100.0, + "Ca47": 10.0, + "Cd109": 1.0, + "Cd113_m1": 1.0e-01, + "Cd115": 10.0, + "Cd115_m1": 100.0, + "Ce139": 1.0, + "Ce141": 100.0, + "Ce143": 10.0, + "Ce144": 10.0, + "Cf248": 1.0, + "Cf249": 1.0e-01, + "Cf250": 1.0, + "Cf251": 1.0e-01, + "Cf252": 1.0, + "Cf253": 100.0, + "Cf254": 1.0, + "Cl36": 1.0, + "Cl38": 10.0, + "Cm240": 100.0, + "Cm241": 10.0, + "Cm242": 10.0, + "Cm243": 1.0, + "Cm244": 1.0, + "Cm245": 1.0e-01, + "Cm246": 1.0e-01, + "Cm247": 1.0e-01, + "Cm248": 1.0e-01, + "Co55": 10.0, + "Co56": 1.0e-01, + "Co57": 1.0, + "Co58": 1.0, + "Co60": 1.0e-01, + "Cr51": 100.0, + "Cs129": 10.0, + "Cs131": 1000.0, + "Cs132": 10.0, + "Cs134": 1.0e-01, + "Cs134_m1": 1000.0, + "Cs135": 100.0, + "Cs136": 1.0, + "Cs137": 1.0e-01, + "Cu64": 100.0, + "Dy159": 100.0, + "Dy165": 1000.0, + "Dy166": 100.0, + "Er169": 1000.0, + "Er171": 100.0, + "Eu150": 1.0e-01, + "Eu152": 1.0e-01, + "Eu152_m1": 100.0, + "Eu154": 1.0e-01, + "Eu155": 1.0, + "Eu156": 10.0, + "F18": 10.0, + "Fe52": 10.0, + "Fe55": 1000.0, + "Fe59": 1.0, + "Fe60": 10.0, + "Ga67": 100.0, + "Ga68": 10.0, + "Ga72": 10.0, + "Gd146": 1.0, + "Gd148": 1.0, + "Gd153": 10.0, + "Gd159": 100.0, + "Ge68": 1.0e-01, + "Ge71": 1.0e+04, + "Ge77": 10.0, + "H3": 100.0, + "Hf172": 1.0, + "Hf175": 1.0, + "Hf178_m2": 1.0e-01, + "Hf181": 1.0, + "Hf182": 1.0e-01, + "Hg194": 1.0e-01, + "Hg195_m1": 100.0, + "Hg197": 100.0, + "Hg197_m1": 100.0, + "Hg203": 10.0, + "Ho166": 100.0, + "Ho166_m1": 1.0e-01, + "I123": 100.0, + "I124": 10.0, + "I125": 100.0, + "I126": 10.0, + "I129": 1.0e-02, + "I131": 10.0, + "I132": 10.0, + "I133": 10.0, + "I135": 10.0, + "In111": 10.0, + "In113_m1": 100.0, + "In114_m1": 10.0, + "In115_m1": 100.0, + "Ir189": 100.0, + "Ir190": 1.0, + "Ir192": 1.0, + "Ir194": 100.0, + "Ir194_m2": 1.0e-01, + "K40": 1.0, + "K42": 100.0, + "K43": 10.0, + "Kr81": 1.0e+04, + "Kr85": 1.0e+05, + "Kr85_m1": 1000.0, + "Kr87": 100.0, + "La137": 100.0, + "La140": 1.0, + "Lu172": 10.0, + "Lu173": 1.0, + "Lu174": 1.0, + "Lu174_m1": 10.0, + "Lu177": 100.0, + "Lu177_m1": 1.0e-01, + "Mn52": 1.0, + "Mn53": 100.0, + "Mn54": 1.0e-01, + "Mn56": 10.0, + "Mo93": 10.0, + "Mo99": 10.0, + "Na22": 1.0e-01, + "Na24": 1.0, + "Nb93_m1": 10.0, + "Nb94": 1.0e-01, + "Nb95": 1.0, + "Nb97": 10.0, + "Nd147": 100.0, + "Nd149": 100.0, + "Ni59": 100.0, + "Ni63": 100.0, + "Ni65": 10.0, + "Np235": 100.0, + "Np236": 1.0, + "Np236_m1": 1000.0, + "Np237": 1.0, + "Np239": 100.0, + "Os185": 1.0, + "Os191": 100.0, + "Os191_m1": 1000.0, + "Os193": 100.0, + "Os194": 1.0, + "P32": 1000.0, + "P33": 1000.0, + "Pa230": 10.0, + "Pa231": 1.0e-02, + "Pa233": 10.0, + "Pb201": 10.0, + "Pb202": 1.0e-01, + "Pb203": 10.0, + "Pb205": 10.0, + "Pb210": 1.0e-01, + "Pb212": 10.0, + "Pd103": 1000.0, + "Pd107": 1000.0, + "Pd109": 100.0, + "Pm143": 1.0, + "Pm144": 1.0e-01, + "Pm145": 10.0, + "Pm146": 1.0e-01, + "Pm147": 1000.0, + "Pm148_m1": 1.0, + "Pm149": 1000.0, + "Pm151": 100.0, + "Po208": 1.0, + "Po210": 1.0, + "Pr142": 100.0, + "Pr143": 1000.0, + "Pt188": 10.0, + "Pt191": 10.0, + "Pt193": 10.0, + "Pt193_m1": 1000.0, + "Pt195_m1": 100.0, + "Pt197": 1000.0, + "Pt197_m1": 100.0, + "Pu236": 1.0, + "Pu237": 100.0, + "Pu238": 1.0e-01, + "Pu239": 1.0e-01, + "Pu240": 1.0e-01, + "Pu241": 10.0, + "Pu242": 1.0e-01, + "Pu244": 1.0e-01, + "Ra223": 100.0, + "Ra224": 10.0, + "Ra225": 10.0, + "Ra226": 1.0e-02, + "Ra228": 1.0e-01, + "Rb81": 10.0, + "Rb83": 1.0, + "Rb84": 1.0, + "Rb86": 100.0, + "Re184": 1.0, + "Re184_m1": 1.0e-01, + "Re186": 1000.0, + "Re186_m1": 1.0, + "Re187": 1000.0, + "Re188": 100.0, + "Re189": 100.0, + "Rh101": 1.0, + "Rh102": 1.0e-01, + "Rh102_m1": 1.0, + "Rh103_m1": 1.0e+04, + "Rh105": 100.0, + "Rn222": 10.0, + "Ru103": 1.0, + "Ru105": 10.0, + "Ru106": 1.0e-01, + "Ru97": 10.0, + "S35": 100.0, + "Sb122": 10.0, + "Sb124": 1.0, + "Sb125": 1.0e-01, + "Sb126": 10.0, + "Sc46": 1.0e-01, + "Sc47": 100.0, + "Sc48": 1.0, + "Se75": 1.0, + "Se79": 1.0e-01, + "Si31": 1000.0, + "Si32": 100.0, + "Sm145": 10.0, + "Sm147": 1.0, + "Sm151": 1000.0, + "Sm153": 100.0, + "Sn113": 1.0, + "Sn117_m1": 100.0, + "Sn119_m1": 10.0, + "Sn121_m1": 1.0, + "Sn123": 100.0, + "Sn125": 10.0, + "Sn126": 1.0e-01, + "Sr82": 1.0, + "Sr85": 1.0, + "Sr85_m1": 100.0, + "Sr87_m1": 100.0, + "Sr89": 1000.0, + "Sr90": 1.0, + "Sr91": 10.0, + "Sr92": 10.0, + "Ta178_m1": 10.0, + "Ta179": 10.0, + "Ta182": 1.0e-01, + "Tb157": 100.0, + "Tb158": 1.0e-01, + "Tb160": 1.0, + "Tc95_m1": 1.0, + "Tc96": 1.0, + "Tc97": 10.0, + "Tc97_m1": 100.0, + "Tc98": 1.0e-01, + "Tc99": 1.0, + "Tc99_m1": 100.0, + "Te121": 10.0, + "Te121_m1": 1.0, + "Te123_m1": 1.0, + "Te125_m1": 1000.0, + "Te127": 1000.0, + "Te127_m1": 10.0, + "Te129_m1": 10.0, + "Te131_m1": 10.0, + "Te132": 1.0, + "Th227": 10.0, + "Th228": 1.0e-01, + "Th229": 1.0e-01, + "Th230": 1.0e-01, + "Th231": 1000.0, + "Th232": 10.0, + "Th234": 100.0, + "Ti44": 1.0e-01, + "Tl200": 10.0, + "Tl201": 100.0, + "Tl202": 10.0, + "Tl204": 1.0, + "Tm167": 100.0, + "Tm170": 100.0, + "Tm171": 1000.0, + "U230": 10.0, + "U232": 1.0e-01, + "U233": 1.0, + "U234": 1.0, + "U235": 1.0, + "U236": 10.0, + "U238": 1.0, + "V48": 1.0, + "V49": 1.0e+04, + "W178": 100.0, + "W181": 10.0, + "W185": 1000.0, + "W187": 10.0, + "W188": 10.0, + "Xe122": 100.0, + "Xe123": 100.0, + "Xe127": 1000.0, + "Xe131_m1": 1.0e+04, + "Xe133": 1000.0, + "Xe135": 1000.0, + "Y87": 10.0, + "Y88": 1.0e-01, + "Y90": 1000.0, + "Y91": 100.0, + "Y91_m1": 100.0, + "Y92": 100.0, + "Y93": 100.0, + "Yb169": 10.0, + "Yb175": 100.0, + "Zn65": 1.0e-01, + "Zn69_m1": 10.0, + "Zr88": 1.0, + "Zr93": 10.0, + "Zr95": 1.0, + "Zr97": 10.0, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_rubble': + # Building rubble clearance >1000 Mg/a + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 6 in Bq/g + limits = { + "Ac228": 2.0e-01, + "Ag105": 5.0e-01, + "Ag108_m1": 1.0e-01, + "Ag110_m1": 8.0e-02, + "Ag111": 9.0, + "Am241": 5.0e-02, + "Am242_m1": 9.0e-02, + "Am243": 9.0e-02, + "As73": 100.0, + "As74": 3.0e-01, + "As76": 5.0e-01, + "As77": 30.0, + "At211": 10.0, + "Au198": 6.0e-01, + "Au199": 6.0e-01, + "Ba131": 5.0e-01, + "Ba140": 8.0e-02, + "Be7": 30.0, + "Bi206": 7.0e-02, + "Bi207": 2.0e-01, + "Bi210": 9.0, + "Bi212": 2.0e-01, + "Bk249": 20.0, + "Br82": 10.0, + "C14": 10.0, + "Ca45": 400.0, + "Ca47": 2.0e-01, + "Cd109": 20.0, + "Cd115": 6.0e-01, + "Cd115_m1": 10.0, + "Ce139": 2.0, + "Ce141": 4.0, + "Ce143": 9.0e-01, + "Ce144": 5.0, + "Cf248": 4.0e-01, + "Cf249": 6.0e-02, + "Cf250": 1.0e-01, + "Cf251": 5.0e-02, + "Cf252": 2.0e-01, + "Cf253": 1.0e-01, + "Cf254": 1.0e-01, + "Cl36": 3.0e-01, + "Cl38": 2.0e-01, + "Cm242": 7.0e-01, + "Cm243": 1.0e-01, + "Cm244": 8.0e-02, + "Cm245": 4.0e-02, + "Cm246": 5.0e-02, + "Cm247": 1.0e-01, + "Cm248": 3.0e-02, + "Co55": 1.0e-01, + "Co56": 6.0e-02, + "Co57": 3.0, + "Co58": 2.0e-01, + "Co60": 9.0e-02, + "Cr51": 8.0, + "Cs129": 9.0e-01, + "Cs131": 200.0, + "Cs132": 3.0e-01, + "Cs134": 1.0e-01, + "Cs134_m1": 20.0, + "Cs135": 20.0, + "Cs136": 1.0e-01, + "Cs137": 4.0e-01, + "Cu64": 1.0, + "Dy165": 10.0, + "Dy166": 5.0, + "Er169": 100.0, + "Er171": 7.0e-01, + "Eu152": 2.0e-01, + "Eu152_m1": 7.0e-01, + "Eu154": 2.0e-01, + "Eu155": 8.0, + "Fe52": 7.0e-02, + "Fe55": 200.0, + "Fe59": 2.0e-01, + "Ga72": 8.0e-02, + "Gd153": 6.0, + "Gd159": 7.0, + "Ge68": 2.0e-01, + "Ge71": 4000.0, + "H3": 60.0, + "Hf181": 4.0e-01, + "Hg197": 9.0, + "Hg197_m1": 4.0, + "Hg203": 1.0, + "Ho166": 10.0, + "I123": 2.0, + "I125": 3.0, + "I126": 5.0e-01, + "I129": 6.0e-02, + "I131": 6.0e-01, + "I132": 1.0e-01, + "I133": 4.0e-01, + "I135": 1.0e-01, + "In111": 7.0e-01, + "In113_m1": 9.0e-01, + "In114_m1": 2.0, + "In115_m1": 2.0, + "Ir190": 8.0e-02, + "Ir192": 3.0e-01, + "Ir194": 2.0, + "K40": 8.0e-01, + "K42": 8.0e-01, + "K43": 2.0e-01, + "La140": 1.0e-01, + "Lu177": 9.0, + "Mn52": 6.0e-02, + "Mn53": 60.0, + "Mn54": 3.0e-01, + "Mn56": 1.0e-01, + "Mo93": 4.0, + "Mo99": 2.0, + "Na22": 1.0e-01, + "Nb93_m1": 400.0, + "Nb94": 1.0e-01, + "Nb95": 3.0e-01, + "Nb97": 3.0e-01, + "Nd147": 2.0, + "Nd149": 7.0e-01, + "Ni59": 300.0, + "Ni63": 300.0, + "Ni65": 4.0e-01, + "Np237": 1.0e-01, + "Np239": 2.0, + "Os185": 3.0e-01, + "Os191": 7.0, + "Os191_m1": 200.0, + "Os193": 4.0, + "P32": 20.0, + "P33": 200.0, + "Pa230": 4.0e-01, + "Pa231": 4.0e-03, + "Pa233": 1.0, + "Pb203": 9.0e-01, + "Pb210": 3.0e-02, + "Pb212": 1.0e-01, + "Pd103": 300.0, + "Pd109": 300.0, + "Pm147": 200.0, + "Pm149": 20.0, + "Po210": 4.0e-02, + "Pr142": 4.0, + "Pr143": 40.0, + "Pt191": 1.0, + "Pt193_m1": 70.0, + "Pt197": 20.0, + "Pt197_m1": 4.0, + "Pu236": 2.0e-01, + "Pu237": 9.0, + "Pu238": 8.0e-02, + "Pu239": 8.0e-02, + "Pu240": 8.0e-02, + "Pu241": 2.0, + "Pu242": 4.0e-02, + "Pu244": 4.0e-02, + "Ra223": 4.0e-01, + "Ra224": 1.0e-01, + "Ra225": 2.0e-01, + "Ra226": 3.0e-02, + "Ra228": 1.0e-01, + "Rb83": 4.0e-01, + "Rb86": 2.0, + "Re186": 20.0, + "Re188": 4.0, + "Rh103_m1": 7000.0, + "Rh105": 3.0, + "Ru103": 4.0, + "Ru105": 3.0e-01, + "Ru106": 1.0, + "Ru97": 1.0, + "S35": 500.0, + "Sb122": 5.0e-01, + "Sb124": 5.0e-01, + "Sb125": 5.0e-01, + "Sc46": 1.0e-01, + "Sc47": 3.0, + "Sc48": 7.0e-02, + "Se75": 7.0e-01, + "Sm151": 500.0, + "Sm153": 10.0, + "Sn113": 9.0e-01, + "Sn125": 7.0e-01, + "Sr85": 4.0e-01, + "Sr85_m1": 1.0, + "Sr87_m1": 7.0e-01, + "Sr89": 20.0, + "Sr90": 6.0e-01, + "Sr91": 3.0e-01, + "Sr92": 2.0e-01, + "Ta182": 2.0e-01, + "Tb160": 2.0e-01, + "Tc96": 9.0e-02, + "Tc97": 6.0, + "Tc97_m1": 9.0, + "Tc99": 6.0e-01, + "Tc99_m1": 2.0, + "Te123_m1": 2.0, + "Te125_m1": 60.0, + "Te127": 50.0, + "Te127_m1": 30.0, + "Te129_m1": 3.0, + "Te131_m1": 2.0e-01, + "Te132": 9.0e-02, + "Th227": 2.0e-01, + "Th228": 7.0e-02, + "Th229": 2.0e-02, + "Th230": 5.0e-02, + "Th231": 40.0, + "Th232": 3.0e-02, + "Th234": 10.0, + "Tl200": 2.0e-01, + "Tl201": 6.0, + "Tl202": 5.0e-01, + "Tl204": 40.0, + "Tm170": 40.0, + "Tm171": 500.0, + "U230": 2.0e-01, + "U232": 5.0e-02, + "U233": 3.0e-01, + "U234": 4.0e-01, + "U235": 3.0e-01, + "U236": 4.0e-01, + "U238": 4.0e-01, + "V48": 8.0e-02, + "W181": 20.0, + "W185": 100.0, + "W187": 5.0e-01, + "W188": 2.0, + "Y88": 8.0e-02, + "Y90": 600.0, + "Y91": 20.0, + "Y91_m1": 4.0e-01, + "Y92": 9.0e-01, + "Y93": 3.0, + "Yb175": 6.0, + "Zn65": 4.0e-01, + "Zn69_m1": 6.0e-01, + "Zr93": 10.0, + "Zr95": 9.0e-02, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_soil': + # Soil surface clearance + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 7 in Bq/g + limits = { + "Ag105": 1.0e-01, + "Ag108_m1": 7.0e-03, + "Ag110_m1": 7.0e-03, + "Ag111": 4.0e-01, + "Am241": 6.0e-02, + "Am242_m1": 7.0e-02, + "Am243": 5.0e-02, + "As73": 40.0, + "As74": 1.0e-01, + "Ba131": 2.0e-01, + "Ba140": 3.0e-02, + "Be7": 2.0, + "Bi207": 5.0e-02, + "C14": 4.0e-02, + "Ca45": 4.0e-02, + "Cd109": 3.0e-02, + "Cd115_m1": 4.0e-02, + "Ce139": 7.0e-01, + "Ce141": 1.0, + "Ce144": 4.0e-01, + "Cm242": 4.0e-01, + "Cm243": 7.0e-02, + "Cm244": 8.0e-02, + "Cm245": 5.0e-02, + "Cm246": 5.0e-02, + "Cm247": 4.0e-02, + "Cm248": 1.0e-02, + "Co56": 2.0e-02, + "Co57": 8.0e-01, + "Co58": 8.0e-02, + "Co60": 3.0e-02, + "Cr51": 3.0, + "Cs131": 30.0, + "Cs134": 5.0e-02, + "Cs135": 4.0e-01, + "Cs136": 4.0e-02, + "Cs137": 6.0e-02, + "Er169": 50.0, + "Eu152": 7.0e-02, + "Eu154": 6.0e-02, + "Eu155": 2.0, + "Fe55": 6.0, + "Fe59": 6.0e-02, + "Gd153": 1.0, + "Ge71": 50.0, + "H3": 3.0, + "Hf181": 2.0e-01, + "I125": 9.0e-02, + "I126": 2.0e-01, + "I131": 2.0e-01, + "In114_m1": 3.0e-02, + "Ir190": 6.0e-02, + "Ir192": 1.0e-01, + "Mn53": 3.0, + "Mn54": 9.0e-02, + "Mo93": 2.0e-01, + "Na22": 4.0e-03, + "Nb93_m1": 4.0, + "Nb94": 5.0e-02, + "Nb95": 1.0e-01, + "Nd147": 7.0e-01, + "Ni59": 8.0, + "Ni63": 3.0, + "Os185": 1.0e-01, + "Os191": 2.0, + "P32": 2.0e-02, + "P33": 8.0e-02, + "Pa230": 1.0e-01, + "Pa233": 4.0e-01, + "Pd103": 20.0, + "Pm147": 20.0, + "Pr143": 20.0, + "Pu236": 1.0e-01, + "Pu237": 2.0, + "Pu238": 6.0e-02, + "Pu239": 4.0e-02, + "Pu240": 4.0e-02, + "Pu241": 4.0, + "Pu242": 4.0e-02, + "Pu244": 4.0e-02, + "Ra223": 1.0e-02, + "Rb86": 5.0e-02, + "Ru103": 2.0e-01, + "Ru106": 3.0e-01, + "S35": 1.0e-02, + "Sb124": 4.0e-02, + "Sb125": 8.0e-02, + "Sc46": 4.0e-02, + "Se75": 4.0e-03, + "Sm151": 40.0, + "Sn113": 1.0e-01, + "Sn125": 2.0e-01, + "Sr85": 1.0e-01, + "Sr89": 3.0e-02, + "Sr90": 2.0e-03, + "Ta182": 6.0e-02, + "Tb160": 7.0e-02, + "Tc97": 8.0e-02, + "Tc97_m1": 1.0e-02, + "Te123_m1": 7.0e-03, + "Te125_m1": 2.0e-02, + "Te129_m1": 2.0, + "Tl202": 2.0e-01, + "Tl204": 4.0e-02, + "Tm170": 6.0, + "Tm171": 60.0, + "V48": 3.0e-02, + "W181": 4.0, + "W185": 3.0, + "Y91": 5.0, + "Zn65": 1.0e-02, + "Zr93": 20.0, + "Zr95": 1.0e-01, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_landfill_100': + # Landfill disposal ≤100 Mg/a clearance + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 8 in Bq/g + limits = { + "Ac227": 1.0e-01, + "Ag105": 30.0, + "Ag108_m1": 9.0, + "Ag110_m1": 6.0, + "Ag111": 700.0, + "Am241": 1.0, + "Am242_m1": 1.0, + "Am243": 1.0, + "As73": 1000.0, + "As74": 10.0, + "Au195": 1000.0, + "Ba131": 40.0, + "Ba133": 40.0, + "Ba140": 10.0, + "Be7": 300.0, + "Bi207": 10.0, + "Bk249": 900.0, + "C14": 4000.0, + "Ca41": 200.0, + "Ca45": 5000.0, + "Cd109": 800.0, + "Cd115_m1": 700.0, + "Ce139": 100.0, + "Ce141": 100.0, + "Ce144": 100.0, + "Cf248": 10.0, + "Cf249": 1.0, + "Cf250": 10.0, + "Cf251": 1.0, + "Cf252": 10.0, + "Cf253": 100.0, + "Cf254": 1.0, + "Cl36": 3.0, + "Cm242": 80.0, + "Cm243": 1.0, + "Cm244": 10.0, + "Cm245": 1.0, + "Cm246": 1.0, + "Cm247": 1.0, + "Cm248": 1.0, + "Co56": 4.0, + "Co57": 100.0, + "Co58": 10.0, + "Co60": 6.0, + "Cr51": 500.0, + "Cs131": 1000.0, + "Cs134": 10.0, + "Cs135": 300.0, + "Cs136": 9.0, + "Cs137": 10.0, + "Er169": 1.0e+04, + "Eu152": 10.0, + "Eu154": 10.0, + "Eu155": 100.0, + "Fe55": 1.0e+04, + "Fe59": 10.0, + "Gd153": 100.0, + "Ge68": 10.0, + "Ge71": 1.0e+04, + "H3": 6.0e+04, + "Hf181": 10.0, + "Hg203": 70.0, + "Ho166_m1": 10.0, + "I125": 800.0, + "I126": 40.0, + "I129": 6.0e-01, + "I131": 50.0, + "In114_m1": 100.0, + "Ir190": 6.0, + "Ir192": 10.0, + "Ir194_m2": 6.0, + "Lu177_m1": 30.0, + "Mn53": 600.0, + "Mn54": 10.0, + "Mo93": 40.0, + "Na22": 7.0, + "Nb93_m1": 1.0e+04, + "Nb94": 10.0, + "Nb95": 10.0, + "Nd147": 100.0, + "Ni59": 3000.0, + "Ni63": 1.0e+04, + "Np237": 1.0, + "Os185": 10.0, + "Os191": 100.0, + "P32": 1000.0, + "P33": 1.0e+05, + "Pa230": 10.0, + "Pa231": 1.0e-01, + "Pa233": 80.0, + "Pb210": 30.0, + "Pd103": 1000.0, + "Pm146": 30.0, + "Pm147": 1.0e+04, + "Po210": 10.0, + "Pr143": 1.0e+04, + "Pu236": 10.0, + "Pu237": 500.0, + "Pu238": 1.0, + "Pu239": 1.0, + "Pu240": 1.0, + "Pu241": 100.0, + "Pu242": 1.0, + "Pu244": 1.0, + "Ra223": 30.0, + "Ra225": 50.0, + "Ra226": 4.0e-01, + "Ra228": 5.0, + "Rb83": 30.0, + "Rb86": 100.0, + "Ru103": 30.0, + "Ru106": 70.0, + "S35": 5000.0, + "Sb124": 9.0, + "Sb125": 40.0, + "Sc46": 8.0, + "Se75": 40.0, + "Sm151": 1.0e+04, + "Sn113": 60.0, + "Sn125": 60.0, + "Sr85": 30.0, + "Sr89": 1000.0, + "Sr90": 6.0, + "Ta182": 10.0, + "Tb158": 20.0, + "Tb160": 10.0, + "Tc97": 70.0, + "Tc97_m1": 1000.0, + "Tc99": 7.0, + "Te123_m1": 100.0, + "Te125_m1": 1000.0, + "Te127_m1": 300.0, + "Te129_m1": 200.0, + "Th227": 10.0, + "Th228": 1.0, + "Th229": 1.0, + "Th230": 5.0e-01, + "Th232": 7.0e-01, + "Th234": 900.0, + "Tl202": 40.0, + "Tl204": 900.0, + "Tm170": 1000.0, + "Tm171": 1.0e+04, + "U230": 10.0, + "U232": 1.0, + "U233": 5.0, + "U234": 6.0, + "U235": 3.0, + "U236": 6.0, + "U238": 6.0, + "V48": 6.0, + "W181": 1000.0, + "W185": 1.0e+04, + "W188": 100.0, + "Y88": 6.0, + "Y91": 1000.0, + "Yb169": 200.0, + "Zn65": 10.0, + "Zr93": 800.0, + "Zr95": 10.0, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_incineration_100': + # Incineration ≤100 Mg/a clearance + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 9 in Bq/g + limits = { + "Ac225": 70.0, + "Ac227": 1.0e-01, + "Ag105": 40.0, + "Ag108_m1": 10.0, + "Ag110_m1": 6.0, + "Ag111": 1000.0, + "Am241": 1.0, + "Am242_m1": 1.0, + "Am243": 1.0, + "As73": 1000.0, + "As74": 10.0, + "Ba131": 60.0, + "Ba133": 80.0, + "Ba140": 10.0, + "Be7": 400.0, + "Bi207": 10.0, + "Bk249": 1000.0, + "C14": 4000.0, + "Ca41": 1000.0, + "Ca45": 1.0e+04, + "Cd109": 4000.0, + "Cd113_m1": 800.0, + "Cd115_m1": 700.0, + "Ce139": 100.0, + "Ce141": 100.0, + "Ce144": 100.0, + "Cf248": 10.0, + "Cf249": 1.0, + "Cf250": 10.0, + "Cf251": 1.0, + "Cf252": 10.0, + "Cf253": 100.0, + "Cf254": 1.0, + "Cl36": 3.0, + "Cm242": 100.0, + "Cm243": 1.0, + "Cm244": 10.0, + "Cm245": 1.0, + "Cm246": 1.0, + "Cm247": 1.0, + "Cm248": 1.0, + "Co56": 5.0, + "Co57": 100.0, + "Co58": 10.0, + "Co60": 7.0, + "Cr51": 900.0, + "Cs131": 1000.0, + "Cs134": 10.0, + "Cs135": 3000.0, + "Cs136": 9.0, + "Cs137": 10.0, + "Er169": 1.0e+04, + "Eu152": 10.0, + "Eu154": 10.0, + "Eu155": 100.0, + "Fe55": 1.0e+04, + "Fe59": 10.0, + "Gd148": 30.0, + "Gd153": 100.0, + "Ge68": 10.0, + "Ge71": 1.0e+04, + "H3": 1.0e+05, + "Hf175": 80.0, + "Hf181": 10.0, + "Hg203": 100.0, + "I125": 1000.0, + "I126": 50.0, + "I129": 6.0e-01, + "I131": 70.0, + "In114_m1": 100.0, + "Ir190": 8.0, + "Ir192": 10.0, + "Ir194_m2": 10.0, + "Mn53": 4000.0, + "Mn54": 10.0, + "Mo93": 300.0, + "Na22": 9.0, + "Nb93_m1": 1.0e+04, + "Nb94": 10.0, + "Nb95": 10.0, + "Nd147": 100.0, + "Ni59": 1.0e+04, + "Ni63": 6.0e+04, + "Np237": 1.0, + "Os185": 10.0, + "Os191": 100.0, + "Os194": 200.0, + "P32": 1000.0, + "P33": 1.0e+05, + "Pa230": 10.0, + "Pa231": 1.0, + "Pa233": 100.0, + "Pb210": 80.0, + "Pd103": 1000.0, + "Pm147": 1.0e+04, + "Po208": 50.0, + "Po210": 10.0, + "Pr143": 1.0e+04, + "Pu236": 10.0, + "Pu237": 1000.0, + "Pu238": 1.0, + "Pu239": 1.0, + "Pu240": 1.0, + "Pu241": 100.0, + "Pu242": 1.0, + "Pu244": 1.0, + "Ra223": 60.0, + "Ra225": 90.0, + "Ra226": 5.0, + "Ra228": 8.0, + "Rb83": 40.0, + "Rb84": 20.0, + "Rb86": 100.0, + "Re184": 20.0, + "Rh101": 100.0, + "Rh102_m1": 40.0, + "Ru103": 50.0, + "Ru106": 100.0, + "S35": 2.0e+04, + "Sb124": 9.0, + "Sb125": 40.0, + "Sc46": 9.0, + "Se75": 70.0, + "Sm151": 1.0e+04, + "Sn113": 80.0, + "Sn123": 2000.0, + "Sn125": 60.0, + "Sr85": 40.0, + "Sr89": 1000.0, + "Sr90": 40.0, + "Ta182": 10.0, + "Tb160": 10.0, + "Tc97": 60.0, + "Tc97_m1": 1000.0, + "Tc99": 6.0, + "Te123_m1": 100.0, + "Te125_m1": 1000.0, + "Te127_m1": 1000.0, + "Te129_m1": 300.0, + "Th227": 10.0, + "Th228": 1.0, + "Th229": 1.0, + "Th230": 1.0, + "Th232": 5.0, + "Th234": 1000.0, + "Ti44": 7.0, + "Tl202": 60.0, + "Tl204": 9000.0, + "Tm170": 1000.0, + "Tm171": 1.0e+04, + "U230": 10.0, + "U232": 1.0, + "U233": 10.0, + "U234": 10.0, + "U235": 4.0, + "U236": 10.0, + "U238": 10.0, + "V48": 7.0, + "W181": 1000.0, + "W185": 1.0e+04, + "W188": 100.0, + "Y88": 7.0, + "Y91": 1000.0, + "Zn65": 10.0, + "Zr93": 8000.0, + "Zr95": 10.0, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_landfill_1000': + # Landfill disposal ≤1000 Mg/a clearance + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 10 in Bq/g + limits = { + "Ac227": 1.0e-01, + "Ag105": 9.0, + "Ag108_m1": 1.0, + "Ag110_m1": 2.0, + "Ag111": 200.0, + "Am241": 1.0, + "Am242_m1": 1.0, + "Am243": 9.0e-01, + "As73": 1000.0, + "As74": 7.0, + "Au195": 100.0, + "Ba131": 10.0, + "Ba133": 10.0, + "Ba140": 3.0, + "Be7": 90.0, + "Bi207": 3.0, + "Bk249": 300.0, + "C14": 400.0, + "Ca41": 20.0, + "Ca45": 500.0, + "Cd109": 80.0, + "Cd115_m1": 200.0, + "Ce139": 40.0, + "Ce141": 80.0, + "Ce144": 100.0, + "Cf248": 10.0, + "Cf249": 1.0, + "Cf250": 4.0, + "Cf251": 1.0, + "Cf252": 7.0, + "Cf253": 70.0, + "Cf254": 1.0, + "Cl36": 3.0e-01, + "Cm242": 20.0, + "Cm243": 1.0, + "Cm244": 5.0, + "Cm245": 6.0e-01, + "Cm246": 1.0, + "Cm247": 3.0e-01, + "Cm248": 2.0e-01, + "Co56": 1.0, + "Co57": 50.0, + "Co58": 5.0, + "Co60": 2.0, + "Cr51": 100.0, + "Cs131": 1000.0, + "Cs134": 3.0, + "Cs135": 30.0, + "Cs136": 3.0, + "Cs137": 8.0, + "Er169": 1.0e+04, + "Eu152": 4.0, + "Eu154": 4.0, + "Eu155": 100.0, + "Fe55": 7000.0, + "Fe59": 4.0, + "Gd153": 100.0, + "Ge68": 5.0, + "Ge71": 1.0e+04, + "H3": 6000.0, + "Hf181": 9.0, + "Hg203": 20.0, + "Ho166_m1": 3.0, + "I125": 80.0, + "I126": 10.0, + "I129": 6.0e-02, + "I131": 20.0, + "In114_m1": 40.0, + "Ir190": 2.0, + "Ir192": 6.0, + "Ir194_m2": 2.0, + "Lu177_m1": 5.0, + "Mn53": 60.0, + "Mn54": 6.0, + "Mo93": 4.0, + "Na22": 2.0, + "Nb93_m1": 4000.0, + "Nb94": 3.0, + "Nb95": 6.0, + "Nd147": 50.0, + "Ni59": 300.0, + "Ni63": 1000.0, + "Np237": 1.0e-01, + "Os185": 7.0, + "Os191": 100.0, + "P32": 1000.0, + "P33": 2.0e+04, + "Pa230": 8.0, + "Pa231": 1.0e-02, + "Pa233": 20.0, + "Pb210": 3.0, + "Pd103": 1000.0, + "Pm146": 6.0, + "Pm147": 1.0e+04, + "Po210": 3.0, + "Pr143": 1.0e+04, + "Pu236": 6.0, + "Pu237": 100.0, + "Pu238": 1.0, + "Pu239": 5.0e-01, + "Pu240": 6.0e-01, + "Pu241": 40.0, + "Pu242": 5.0e-01, + "Pu244": 3.0e-01, + "Ra223": 10.0, + "Ra225": 10.0, + "Ra226": 4.0e-02, + "Ra228": 2.0, + "Rb83": 9.0, + "Rb86": 60.0, + "Ru103": 10.0, + "Ru106": 20.0, + "S35": 500.0, + "Sb124": 3.0, + "Sb125": 10.0, + "Sc46": 2.0, + "Se75": 10.0, + "Sm151": 1.0e+04, + "Sn113": 20.0, + "Sn125": 20.0, + "Sr85": 9.0, + "Sr89": 1000.0, + "Sr90": 6.0e-01, + "Ta182": 4.0, + "Tb158": 6.0, + "Tb160": 4.0, + "Tc97": 7.0, + "Tc97_m1": 200.0, + "Tc99": 7.0e-01, + "Te123_m1": 40.0, + "Te125_m1": 500.0, + "Te127_m1": 30.0, + "Te129_m1": 70.0, + "Th227": 7.0, + "Th228": 1.0, + "Th229": 1.0, + "Th230": 5.0e-02, + "Th232": 7.0e-02, + "Th234": 300.0, + "Tl202": 10.0, + "Tl204": 90.0, + "Tm170": 1000.0, + "Tm171": 1.0e+04, + "U230": 9.0, + "U232": 5.0e-01, + "U233": 5.0e-01, + "U234": 6.0e-01, + "U235": 3.0e-01, + "U236": 6.0e-01, + "U238": 6.0e-01, + "V48": 2.0, + "W181": 400.0, + "W185": 3000.0, + "W188": 80.0, + "Y88": 2.0, + "Y91": 1000.0, + "Yb169": 20.0, + "Zn65": 8.0, + "Zr93": 80.0, + "Zr95": 4.0, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_incineration_1000': + # Incineration ≤1000 Mg/a clearance + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 11 in Bq/g + limits = { + "Ac225": 20.0, + "Ac227": 1.0e-01, + "Ag105": 4.0, + "Ag108_m1": 1.0, + "Ag110_m1": 6.0e-01, + "Ag111": 200.0, + "Am241": 1.0, + "Am242_m1": 1.0, + "Am243": 1.0, + "As73": 1000.0, + "As74": 3.0, + "Ba131": 10.0, + "Ba133": 10.0, + "Ba140": 3.0, + "Be7": 40.0, + "Bi207": 1.0, + "Bk249": 700.0, + "C14": 400.0, + "Ca41": 100.0, + "Ca45": 4000.0, + "Cd109": 400.0, + "Cd113_m1": 8.0, + "Cd115_m1": 70.0, + "Ce139": 40.0, + "Ce141": 80.0, + "Ce144": 100.0, + "Cf248": 10.0, + "Cf249": 1.0, + "Cf250": 8.0, + "Cf251": 1.0, + "Cf252": 10.0, + "Cf253": 100.0, + "Cf254": 1.0, + "Cl36": 3.0e-01, + "Cm242": 50.0, + "Cm243": 1.0, + "Cm244": 10.0, + "Cm245": 1.0, + "Cm246": 1.0, + "Cm247": 1.0, + "Cm248": 1.0, + "Co56": 1.0, + "Co57": 50.0, + "Co58": 5.0, + "Co60": 2.0, + "Cr51": 100.0, + "Cs131": 1000.0, + "Cs134": 1.0, + "Cs135": 300.0, + "Cs136": 1.0, + "Cs137": 3.0, + "Er169": 1.0e+04, + "Eu152": 4.0, + "Eu154": 4.0, + "Eu155": 100.0, + "Fe55": 1.0e+04, + "Fe59": 4.0, + "Gd148": 8.0, + "Gd153": 100.0, + "Ge68": 2.0, + "Ge71": 1.0e+04, + "H3": 1.0e+04, + "Hf175": 10.0, + "Hf181": 9.0, + "Hg203": 10.0, + "I125": 100.0, + "I126": 5.0, + "I129": 6.0e-02, + "I131": 9.0, + "In114_m1": 20.0, + "Ir190": 2.0, + "Ir192": 6.0, + "Ir194_m2": 2.0, + "Mn53": 400.0, + "Mn54": 6.0, + "Mo93": 30.0, + "Na22": 2.0, + "Nb93_m1": 1.0e+04, + "Nb94": 3.0, + "Nb95": 6.0, + "Nd147": 50.0, + "Ni59": 3000.0, + "Ni63": 6000.0, + "Np237": 1.0, + "Os185": 7.0, + "Os191": 100.0, + "Os194": 50.0, + "P32": 1000.0, + "P33": 1.0e+05, + "Pa230": 8.0, + "Pa231": 1.0e-01, + "Pa233": 20.0, + "Pb210": 8.0, + "Pd103": 1000.0, + "Pm147": 1.0e+04, + "Po208": 5.0, + "Po210": 10.0, + "Pr143": 1.0e+04, + "Pu236": 10.0, + "Pu237": 100.0, + "Pu238": 1.0, + "Pu239": 1.0, + "Pu240": 1.0, + "Pu241": 100.0, + "Pu242": 1.0, + "Pu244": 1.0, + "Ra223": 20.0, + "Ra225": 30.0, + "Ra226": 5.0e-01, + "Ra228": 2.0, + "Rb83": 9.0, + "Rb84": 6.0, + "Rb86": 60.0, + "Re184": 6.0, + "Rh101": 20.0, + "Rh102_m1": 9.0, + "Ru103": 10.0, + "Ru106": 20.0, + "S35": 2000.0, + "Sb124": 9.0e-01, + "Sb125": 4.0, + "Sc46": 2.0, + "Se75": 7.0, + "Sm151": 1.0e+04, + "Sn113": 8.0, + "Sn123": 200.0, + "Sn125": 8.0, + "Sr85": 9.0, + "Sr89": 1000.0, + "Sr90": 4.0, + "Ta182": 4.0, + "Tb160": 4.0, + "Tc97": 6.0, + "Tc97_m1": 300.0, + "Tc99": 6.0e-01, + "Te123_m1": 30.0, + "Te125_m1": 1000.0, + "Te127_m1": 300.0, + "Te129_m1": 30.0, + "Th227": 10.0, + "Th228": 1.0, + "Th229": 1.0, + "Th230": 3.0e-01, + "Th232": 7.0e-01, + "Th234": 300.0, + "Ti44": 7.0e-01, + "Tl202": 7.0, + "Tl204": 900.0, + "Tm170": 1000.0, + "Tm171": 1.0e+04, + "U230": 10.0, + "U232": 1.0, + "U233": 4.0, + "U234": 2.0, + "U235": 4.0e-01, + "U236": 6.0, + "U238": 5.0, + "V48": 2.0, + "W181": 400.0, + "W185": 1.0e+04, + "W188": 80.0, + "Y88": 2.0, + "Y91": 1000.0, + "Zn65": 3.0, + "Zr93": 800.0, + "Zr95": 4.0, + } + units = 'Bq/g' + is_strlschv = True + + elif limits == 'StrlSchV_metal_recycling': + # Metal scrap recycling clearance + # from StrlSchV 2018 Anlage 4, Tabelle 1, Spalte 14 in Bq/g + limits = { + "Ac227": 3.0e-02, + "Ac228": 10.0, + "Ag105": 40.0, + "Ag108_m1": 8.0e-01, + "Ag110_m1": 5.0e-01, + "Ag111": 40.0, + "Am241": 3.0e-01, + "Am242_m1": 3.0e-01, + "Am243": 3.0e-01, + "As73": 100.0, + "As74": 10.0, + "As76": 100.0, + "As77": 1000.0, + "At211": 1000.0, + "Au198": 100.0, + "Au199": 100.0, + "Ba131": 90.0, + "Ba133": 2.0, + "Ba140": 10.0, + "Be7": 300.0, + "Bi206": 10.0, + "Bi207": 6.0e-01, + "Bi210": 1000.0, + "Bi212": 10.0, + "Bk249": 200.0, + "Br82": 10.0, + "C14": 80.0, + "Ca45": 600.0, + "Ca47": 10.0, + "Cd109": 20.0, + "Cd115": 100.0, + "Cd115_m1": 20.0, + "Ce139": 9.0, + "Ce141": 70.0, + "Ce143": 100.0, + "Ce144": 10.0, + "Cf248": 3.0, + "Cf249": 4.0e-01, + "Cf250": 9.0e-01, + "Cf251": 4.0e-01, + "Cf252": 1.0, + "Cf253": 40.0, + "Cf254": 7.0e-01, + "Cl36": 10.0, + "Cl38": 10.0, + "Cm242": 5.0, + "Cm243": 4.0e-01, + "Cm244": 5.0e-01, + "Cm245": 3.0e-01, + "Cm246": 3.0e-01, + "Cm247": 3.0e-01, + "Cm248": 8.0e-02, + "Co55": 10.0, + "Co56": 4.0e-01, + "Co57": 20.0, + "Co58": 1.0, + "Co60": 6.0e-01, + "Cr51": 1000.0, + "Cs129": 100.0, + "Cs131": 900.0, + "Cs132": 10.0, + "Cs134": 2.0e-01, + "Cs134_m1": 1000.0, + "Cs135": 20.0, + "Cs136": 10.0, + "Cs137": 6.0e-01, + "Cu64": 100.0, + "Dy165": 1000.0, + "Dy166": 1000.0, + "Er169": 100.0, + "Er171": 100.0, + "Eu152": 5.0e-01, + "Eu152_m1": 100.0, + "Eu154": 5.0e-01, + "Eu155": 30.0, + "F18": 10.0, + "Fe52": 10.0, + "Fe55": 1.0e+04, + "Fe59": 10.0, + "Ga72": 10.0, + "Gd153": 20.0, + "Gd159": 1000.0, + "Ge71": 4000.0, + "H3": 1000.0, + "Hf181": 10.0, + "Hg197": 100.0, + "Hg197_m1": 100.0, + "Hg203": 2.0, + "Ho166": 1000.0, + "I123": 100.0, + "I125": 3.0, + "I126": 2.0, + "I129": 4.0e-01, + "I131": 2.0, + "I132": 10.0, + "I133": 10.0, + "I135": 10.0, + "In111": 100.0, + "In113_m1": 100.0, + "In114_m1": 10.0, + "In115_m1": 100.0, + "Ir190": 10.0, + "Ir192": 2.0, + "Ir194": 100.0, + "K42": 100.0, + "K43": 10.0, + "La140": 10.0, + "Lu177": 1000.0, + "Mn52": 10.0, + "Mn53": 1.0e+04, + "Mn54": 2.0, + "Mn56": 10.0, + "Mo93": 200.0, + "Mo99": 100.0, + "Na22": 1.0e-01, + "Na24": 10.0, + "Nb93_m1": 400.0, + "Nb94": 4.0e-01, + "Nb95": 10.0, + "Nb97": 10.0, + "Nd147": 50.0, + "Nd149": 100.0, + "Ni59": 1.0e+04, + "Ni63": 1.0e+04, + "Ni65": 10.0, + "Np237": 6.0e-01, + "Np239": 100.0, + "Os185": 5.0e-01, + "Os191": 90.0, + "Os191_m1": 1000.0, + "Os193": 100.0, + "P32": 20.0, + "P33": 200.0, + "Pa230": 10.0, + "Pa231": 2.0e-01, + "Pa233": 60.0, + "Pb203": 100.0, + "Pb210": 6.0e-02, + "Pb212": 10.0, + "Pd103": 300.0, + "Pd109": 1000.0, + "Pm147": 6000.0, + "Pm149": 1000.0, + "Po210": 1.0, + "Pr142": 100.0, + "Pr143": 40.0, + "Pt191": 100.0, + "Pt193_m1": 1000.0, + "Pt197": 1000.0, + "Pt197_m1": 100.0, + "Pu236": 7.0e-01, + "Pu237": 500.0, + "Pu238": 3.0e-01, + "Pu239": 2.0e-01, + "Pu240": 2.0e-01, + "Pu241": 10.0, + "Pu242": 3.0e-01, + "Pu244": 3.0e-01, + "Ra223": 5.0e-01, + "Ra224": 10.0, + "Ra225": 4.0e-01, + "Ra226": 5.0e-02, + "Ra228": 7.0e-01, + "Rb83": 7.0e-01, + "Rb86": 20.0, + "Re186": 1000.0, + "Re188": 100.0, + "Rh103_m1": 1.0e+04, + "Rh105": 100.0, + "Ru103": 40.0, + "Ru105": 10.0, + "Ru106": 1.0, + "Ru97": 100.0, + "S35": 600.0, + "Sb122": 100.0, + "Sb124": 5.0e-01, + "Sb125": 3.0, + "Sc46": 3.0e-01, + "Sc47": 100.0, + "Sc48": 10.0, + "Se75": 3.0, + "Si31": 1000.0, + "Si32": 500.0, + "Sm151": 7000.0, + "Sm153": 100.0, + "Sn113": 2.0, + "Sn125": 20.0, + "Sr85": 1.0, + "Sr85_m1": 100.0, + "Sr87_m1": 100.0, + "Sr89": 20.0, + "Sr90": 9.0, + "Sr91": 10.0, + "Sr92": 10.0, + "Ta182": 5.0e-01, + "Tb160": 6.0e-01, + "Tc96": 10.0, + "Tc97": 400.0, + "Tc97_m1": 1000.0, + "Tc99": 40.0, + "Tc99_m1": 100.0, + "Te123_m1": 10.0, + "Te125_m1": 60.0, + "Te127": 1000.0, + "Te127_m1": 50.0, + "Te129_m1": 20.0, + "Te131_m1": 10.0, + "Te132": 100.0, + "Th227": 3.0e-01, + "Th228": 4.0e-01, + "Th229": 1.0e-01, + "Th230": 3.0e-01, + "Th231": 1000.0, + "Th232": 3.0e-01, + "Th234": 10.0, + "Tl200": 10.0, + "Tl201": 100.0, + "Tl202": 100.0, + "Tl204": 300.0, + "Tm170": 70.0, + "Tm171": 700.0, + "U230": 9.0e-01, + "U232": 3.0e-01, + "U233": 3.0, + "U234": 2.0, + "U235": 8.0e-01, + "U236": 3.0, + "U238": 2.0, + "V48": 1.0, + "W181": 60.0, + "W185": 700.0, + "W187": 100.0, + "Y88": 2.0e-01, + "Y90": 1000.0, + "Y91": 30.0, + "Y91_m1": 100.0, + "Y92": 100.0, + "Y93": 100.0, + "Yb175": 1000.0, + "Zn65": 5.0e-01, + "Zn69_m1": 100.0, + "Zr93": 10.0, + "Zr95": 6.0e-01, + "Zr97": 10.0, + } + units = 'Bq/g' + is_strlschv = True + + # Determine activity units based on the limit set + if units is None: + units = 'Ci/m3' + + # For StrlSchV limits, exclude daughters already covered by '+' parents + excluded = set() + if is_strlschv and chain is not None: + for parent in _STRLSCHV_PLUS_PARENTS: + if parent not in chain.nuclide_dict: + continue + parent_hl = chain[parent].half_life + if parent_hl is not None and parent_hl > 0: + excluded |= chain.get_decay_daughters( + parent, max_half_life=parent_hl + ) + # Calculate the sum of the fractions of the activity of each radionuclide # compared to the specified limits ratio = {} - for nuc, ci_m3 in mat.get_activity(units="Ci/m3", by_nuclide=True).items(): - if nuc in limits: - ratio[nuc] = ci_m3 / limits[nuc] + for nuc, activity in mat.get_activity(units=units, by_nuclide=True).items(): + if nuc in limits and nuc not in excluded: + ratio[nuc] = activity / limits[nuc] return ratio if by_nuclide else sum(ratio.values()) diff --git a/tests/unit_tests/test_waste_classification.py b/tests/unit_tests/test_waste_classification.py index 072590df965..3edf71e1706 100644 --- a/tests/unit_tests/test_waste_classification.py +++ b/tests/unit_tests/test_waste_classification.py @@ -1,6 +1,8 @@ import random import openmc +from openmc.deplete import Chain +from openmc.deplete.nuclide import Nuclide, DecayTuple import pytest @@ -100,3 +102,212 @@ def test_waste_disposal_rating(): wdr = mat.waste_disposal_rating(limits={'K40': 4*ci_m3}, by_nuclide=True) assert isinstance(wdr, dict) assert wdr['K40'] == pytest.approx(1/4) + + +def test_strlschv_unrestricted(): + """Test German StrlSchV unrestricted clearance rating""" + # Co-60 unrestricted clearance limit is 0.1 Bq/g. + # Create a material with Co60 and stable Co59 (which should not + # contribute to the waste disposal rating). + mat = openmc.Material() + mat.add_nuclide('Co59', 1e-10) + mat.add_nuclide('Co60', 1e-12) + bq_g = mat.get_activity('Bq/g', by_nuclide=True)['Co60'] + + # Rating should equal activity / limit (Co59 is stable, no contribution) + expected = bq_g / 0.1 + rating = mat.waste_disposal_rating(limits='StrlSchV_unrestricted') + assert rating == pytest.approx(expected, rel=1e-3) + + # by_nuclide should return dict with Co60 entry + wdr = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', by_nuclide=True + ) + assert isinstance(wdr, dict) + assert 'Co60' in wdr + assert wdr['Co60'] == pytest.approx(expected, rel=1e-3) + + +def test_strlschv_metal_recycling(): + """Test German StrlSchV metal scrap recycling clearance rating""" + # Co-60 metal recycling limit is 0.6 Bq/g, which is less restrictive + # than the unrestricted clearance limit of 0.1 Bq/g. + mat = openmc.Material() + mat.add_nuclide('Co60', 1e-12) + + unrestricted = mat.waste_disposal_rating(limits='StrlSchV_unrestricted') + metal = mat.waste_disposal_rating(limits='StrlSchV_metal_recycling') + + # Metal recycling limit is 6x higher, so rating should be 6x lower + assert unrestricted == pytest.approx(6.0 * metal, rel=1e-3) + + +def test_strlschv_sum_rule(): + """Test that the sum-of-fractions rule works for StrlSchV limits""" + # Create material with two nuclides, each at half their unrestricted limit + # Co-60 limit = 0.1 Bq/g, Cs-137 limit = 0.1 Bq/g + mat = openmc.Material() + mat.add_nuclide('Co60', 1e-12) + mat.add_nuclide('Cs137', 1e-12) + + wdr = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', by_nuclide=True + ) + assert 'Co60' in wdr + assert 'Cs137' in wdr + + # Total rating should be the sum of individual contributions + total = mat.waste_disposal_rating(limits='StrlSchV_unrestricted') + assert total == pytest.approx(wdr['Co60'] + wdr['Cs137'], rel=1e-6) + + +@pytest.mark.parametrize("pathway", [ + 'StrlSchV_unrestricted', + 'StrlSchV_metal_recycling', + 'StrlSchV_landfill_100', + 'StrlSchV_landfill_1000', + 'StrlSchV_incineration_100', + 'StrlSchV_incineration_1000', + 'StrlSchV_soil', + 'StrlSchV_rubble', +]) +def test_strlschv_all_pathways(pathway): + """Test that all StrlSchV pathways return valid ratings""" + mat = openmc.Material() + mat.add_nuclide('Co60', 1e-12) + + rating = mat.waste_disposal_rating(limits=pathway) + assert isinstance(rating, float) + assert rating > 0.0 + + wdr = mat.waste_disposal_rating(limits=pathway, by_nuclide=True) + assert isinstance(wdr, dict) + assert rating == pytest.approx(sum(wdr.values()), rel=1e-6) + + +def _make_test_chain(): + """Build a minimal chain with Cs137 -> Ba137_m1 and Sr90 -> Y90.""" + chain = Chain() + + cs137 = Nuclide("Cs137") + cs137.half_life = 9.49e8 # ~30 years in seconds + cs137.add_decay_mode("beta-", "Ba137_m1", 0.947) + cs137.add_decay_mode("beta-", "Ba137", 0.053) + + ba137_m1 = Nuclide("Ba137_m1") + ba137_m1.half_life = 153.12 # seconds + ba137_m1.add_decay_mode("IT", "Ba137", 1.0) + + ba137 = Nuclide("Ba137") + ba137.half_life = None # stable + + sr90 = Nuclide("Sr90") + sr90.half_life = 9.09e8 # ~28.8 years in seconds + sr90.add_decay_mode("beta-", "Y90", 1.0) + + y90 = Nuclide("Y90") + y90.half_life = 2.304e5 # ~2.67 days in seconds + y90.add_decay_mode("beta-", "Zr90", 1.0) + + zr90 = Nuclide("Zr90") + zr90.half_life = None # stable + + co60 = Nuclide("Co60") + co60.half_life = 1.66e8 # ~5.27 years + co60.add_decay_mode("beta-", "Ni60", 1.0) + + ni60 = Nuclide("Ni60") + ni60.half_life = None # stable + + chain.nuclides = [cs137, ba137_m1, ba137, sr90, y90, zr90, co60, ni60] + chain.nuclide_dict = {n.name: i for i, n in enumerate(chain.nuclides)} + return chain + + +def test_strlschv_chain_excludes_daughters(): + """Test that providing a chain excludes '+' daughters from the rating.""" + chain = _make_test_chain() + + # Sr-90 is a '+' parent. Y-90 is its daughter in secular equilibrium. + # Both have entries in the unrestricted clearance table (Sr90 at 1 Bq/g, + # Y90 at 1000 Bq/g). Without a chain, both contribute to the sum. + # With a chain, Y-90 should be excluded. + mat = openmc.Material() + mat.add_nuclide('Sr90', 1e-12) + mat.add_nuclide('Y90', 1e-12) + + rating_no_chain = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted' + ) + rating_with_chain = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', chain=chain + ) + + # With chain, Y90 should be excluded so rating should be lower + assert rating_with_chain < rating_no_chain + + # by_nuclide with chain should not contain Y90 + wdr = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', by_nuclide=True, chain=chain + ) + assert 'Sr90' in wdr + assert 'Y90' not in wdr + + +def test_strlschv_chain_excludes_sr90_daughter(): + """Test that Y90 is excluded as a daughter of Sr90+.""" + chain = _make_test_chain() + + mat = openmc.Material() + mat.add_nuclide('Sr90', 1e-12) + mat.add_nuclide('Y90', 1e-12) + + wdr_no_chain = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', by_nuclide=True + ) + wdr_with_chain = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', by_nuclide=True, chain=chain + ) + + # Without chain, both Sr90 and Y90 contribute + assert 'Sr90' in wdr_no_chain + assert 'Y90' in wdr_no_chain + + # With chain, Y90 is excluded as daughter of Sr90+ + assert 'Sr90' in wdr_with_chain + assert 'Y90' not in wdr_with_chain + + +def test_strlschv_chain_no_effect_on_non_plus(): + """Test that the chain does not exclude non-'+' nuclides.""" + chain = _make_test_chain() + + # Co-60 is NOT a '+' parent (it has a non-'+' entry in the table). + # Its daughter Ni-60 is stable and has no clearance entry. + # The chain should not affect the Co-60 rating. + mat = openmc.Material() + mat.add_nuclide('Co60', 1e-12) + + rating_no_chain = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted' + ) + rating_with_chain = mat.waste_disposal_rating( + limits='StrlSchV_unrestricted', chain=chain + ) + + assert rating_no_chain == pytest.approx(rating_with_chain, rel=1e-6) + + +def test_strlschv_chain_no_effect_on_nrc(): + """Test that the chain parameter has no effect on NRC/Fetter limits.""" + chain = _make_test_chain() + + mat = openmc.Material() + mat.add_nuclide('Cs137', 1e-10) + + rating_no_chain = mat.waste_disposal_rating(limits='Fetter') + rating_with_chain = mat.waste_disposal_rating( + limits='Fetter', chain=chain + ) + + assert rating_no_chain == pytest.approx(rating_with_chain, rel=1e-6)