MCNP input files#

The complete API can be found at f4enix.input.MCNPinput.Input

Quick general overview#

# Import the input module
from f4enix.input.MCNPinput import Input

# Load the input file
inp_file = "ITER_1D"
inp = Input.from_input(inp_file)
/home/docs/checkouts/readthedocs.org/user_builds/f4enix/envs/latest/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
# Here are the main attributes of the input
print(inp.cells)
print(inp.surfs)
print(inp.materials)  # datacard class that have their own complete parser
print(inp.transformations)  # uncomplete parser (no transformations in this inp)
print(inp.other_data)  # treated as general data cards, no parser
{'1': <numjuggler.parser.Card object at 0x7d31df723340>, '2': <numjuggler.parser.Card object at 0x7d31df722e30>, '3': <numjuggler.parser.Card object at 0x7d31df722b30>, '4': <numjuggler.parser.Card object at 0x7d31b1d5ebf0>, '5': <numjuggler.parser.Card object at 0x7d31b1d5e9e0>, '6': <numjuggler.parser.Card object at 0x7d31b1d5ea10>, '7': <numjuggler.parser.Card object at 0x7d31b1d5eaa0>, '8': <numjuggler.parser.Card object at 0x7d31b1d5eb60>, '9': <numjuggler.parser.Card object at 0x7d31b1d5eb90>, '10': <numjuggler.parser.Card object at 0x7d31b1d5ec50>, '11': <numjuggler.parser.Card object at 0x7d31b1d5ebc0>, '12': <numjuggler.parser.Card object at 0x7d31b1d5ec80>, '13': <numjuggler.parser.Card object at 0x7d31b1d5ecb0>, '14': <numjuggler.parser.Card object at 0x7d31b1d5ece0>, '15': <numjuggler.parser.Card object at 0x7d31b1d5ed10>, '16': <numjuggler.parser.Card object at 0x7d31b1d5ed40>, '17': <numjuggler.parser.Card object at 0x7d31b1d5ed70>, '18': <numjuggler.parser.Card object at 0x7d31b1d5eda0>, '19': <numjuggler.parser.Card object at 0x7d31b1d5edd0>, '20': <numjuggler.parser.Card object at 0x7d31b1d5ee00>, '21': <numjuggler.parser.Card object at 0x7d31b1d5ee30>, '22': <numjuggler.parser.Card object at 0x7d31b1d5ee60>, '23': <numjuggler.parser.Card object at 0x7d31b1d5ee90>, '24': <numjuggler.parser.Card object at 0x7d31b1d5eec0>, '25': <numjuggler.parser.Card object at 0x7d31b1d5eef0>, '26': <numjuggler.parser.Card object at 0x7d31b1d5ef20>, '27': <numjuggler.parser.Card object at 0x7d31b1d5ef50>, '28': <numjuggler.parser.Card object at 0x7d31b1d5ef80>, '29': <numjuggler.parser.Card object at 0x7d31b1d5efb0>, '30': <numjuggler.parser.Card object at 0x7d31b1d5efe0>, '31': <numjuggler.parser.Card object at 0x7d31b1d5f010>, '32': <numjuggler.parser.Card object at 0x7d31b1d5f040>, '33': <numjuggler.parser.Card object at 0x7d31b1d5f070>, '34': <numjuggler.parser.Card object at 0x7d31b1d5f0a0>, '35': <numjuggler.parser.Card object at 0x7d31b1d5f0d0>, '36': <numjuggler.parser.Card object at 0x7d31b1d5f100>, '37': <numjuggler.parser.Card object at 0x7d31b1d5f130>, '38': <numjuggler.parser.Card object at 0x7d31b1d5f160>, '39': <numjuggler.parser.Card object at 0x7d31b1d5f190>, '40': <numjuggler.parser.Card object at 0x7d31b1d5f1c0>, '41': <numjuggler.parser.Card object at 0x7d31b1d5f1f0>, '42': <numjuggler.parser.Card object at 0x7d31b1d5f220>, '43': <numjuggler.parser.Card object at 0x7d31b1d5f250>, '44': <numjuggler.parser.Card object at 0x7d31b1d5f280>, '45': <numjuggler.parser.Card object at 0x7d31b1d5f2b0>, '46': <numjuggler.parser.Card object at 0x7d31b1d5f2e0>, '47': <numjuggler.parser.Card object at 0x7d31b1d5f310>, '48': <numjuggler.parser.Card object at 0x7d31b1d5f340>, '49': <numjuggler.parser.Card object at 0x7d31b1d5f370>, '50': <numjuggler.parser.Card object at 0x7d31b1d5f3a0>, '51': <numjuggler.parser.Card object at 0x7d31b1d5f3d0>, '52': <numjuggler.parser.Card object at 0x7d31b1d5f400>, '53': <numjuggler.parser.Card object at 0x7d31b1d5f430>, '54': <numjuggler.parser.Card object at 0x7d31b1d5f460>, '55': <numjuggler.parser.Card object at 0x7d31b1d5f490>, '56': <numjuggler.parser.Card object at 0x7d31b1d5f4c0>, '57': <numjuggler.parser.Card object at 0x7d31b1d5f4f0>, '58': <numjuggler.parser.Card object at 0x7d31b1d5f520>, '59': <numjuggler.parser.Card object at 0x7d31b1d5f550>, '60': <numjuggler.parser.Card object at 0x7d31b1d5f580>, '61': <numjuggler.parser.Card object at 0x7d31b1d5f5b0>, '62': <numjuggler.parser.Card object at 0x7d31b1d5f5e0>, '63': <numjuggler.parser.Card object at 0x7d31b1d5f610>, '64': <numjuggler.parser.Card object at 0x7d31b1d5f640>, '65': <numjuggler.parser.Card object at 0x7d31b1d5f670>, '66': <numjuggler.parser.Card object at 0x7d31b1d5f6a0>, '67': <numjuggler.parser.Card object at 0x7d31b1d5f6d0>, '68': <numjuggler.parser.Card object at 0x7d31b1d5f700>, '69': <numjuggler.parser.Card object at 0x7d31b1d5f730>, '70': <numjuggler.parser.Card object at 0x7d31b1d5f760>, '71': <numjuggler.parser.Card object at 0x7d31b1d5f7c0>, '72': <numjuggler.parser.Card object at 0x7d31b1d5f7f0>, '73': <numjuggler.parser.Card object at 0x7d31b1d5f820>, '74': <numjuggler.parser.Card object at 0x7d31b1d5f850>, '75': <numjuggler.parser.Card object at 0x7d31b1d5f880>, '76': <numjuggler.parser.Card object at 0x7d31b1d5f8b0>, '77': <numjuggler.parser.Card object at 0x7d31b1d5f8e0>, '78': <numjuggler.parser.Card object at 0x7d31b1d5f910>, '79': <numjuggler.parser.Card object at 0x7d31b1d5f940>, '80': <numjuggler.parser.Card object at 0x7d31b1d5f970>, '81': <numjuggler.parser.Card object at 0x7d31b1d5f9a0>, '82': <numjuggler.parser.Card object at 0x7d31b1d5f9d0>, '83': <numjuggler.parser.Card object at 0x7d31b1d5fa00>, '84': <numjuggler.parser.Card object at 0x7d31b1d5fa30>, '85': <numjuggler.parser.Card object at 0x7d31b1d5fa90>, '86': <numjuggler.parser.Card object at 0x7d31b1d5fac0>, '87': <numjuggler.parser.Card object at 0x7d31b1d5faf0>, '88': <numjuggler.parser.Card object at 0x7d31b1d5fb20>, '89': <numjuggler.parser.Card object at 0x7d31b1d5fb50>, '90': <numjuggler.parser.Card object at 0x7d31b1d5fb80>, '91': <numjuggler.parser.Card object at 0x7d31b1d5fbb0>, '92': <numjuggler.parser.Card object at 0x7d31b1d5fbe0>, '93': <numjuggler.parser.Card object at 0x7d31b1d5fc10>, '94': <numjuggler.parser.Card object at 0x7d31b1d5fc40>, '95': <numjuggler.parser.Card object at 0x7d31b1d5fc70>, '96': <numjuggler.parser.Card object at 0x7d31b1d5fca0>, '97': <numjuggler.parser.Card object at 0x7d31b1d5fcd0>, '98': <numjuggler.parser.Card object at 0x7d31b1d5fd00>, '99': <numjuggler.parser.Card object at 0x7d31b1d5fd30>, '100': <numjuggler.parser.Card object at 0x7d31b1d5fd60>, '101': <numjuggler.parser.Card object at 0x7d31b1d5fd90>, '102': <numjuggler.parser.Card object at 0x7d31b1d5fdc0>, '103': <numjuggler.parser.Card object at 0x7d31b1d5fdf0>, '104': <numjuggler.parser.Card object at 0x7d31b1d5fe20>, '105': <numjuggler.parser.Card object at 0x7d31b1d5fe50>, '106': <numjuggler.parser.Card object at 0x7d31b1d5feb0>}
{'1': <numjuggler.parser.Card object at 0x7d31b1d5ff10>, '60': <numjuggler.parser.Card object at 0x7d31b1d5ff70>, '61': <numjuggler.parser.Card object at 0x7d31b1d5ffa0>, '62': <numjuggler.parser.Card object at 0x7d31b1d5ffd0>, '63': <numjuggler.parser.Card object at 0x7d31b1d94040>, '64': <numjuggler.parser.Card object at 0x7d31b1d94070>, '65': <numjuggler.parser.Card object at 0x7d31b1d940a0>, '66': <numjuggler.parser.Card object at 0x7d31b1d940d0>, '67': <numjuggler.parser.Card object at 0x7d31b1d94100>, '68': <numjuggler.parser.Card object at 0x7d31b1d94130>, '69': <numjuggler.parser.Card object at 0x7d31b1d94160>, '70': <numjuggler.parser.Card object at 0x7d31b1d94190>, '71': <numjuggler.parser.Card object at 0x7d31b1d941c0>, '72': <numjuggler.parser.Card object at 0x7d31b1d941f0>, '73': <numjuggler.parser.Card object at 0x7d31b1d94220>, '74': <numjuggler.parser.Card object at 0x7d31b1d94250>, '75': <numjuggler.parser.Card object at 0x7d31b1d94280>, '76': <numjuggler.parser.Card object at 0x7d31b1d942b0>, '77': <numjuggler.parser.Card object at 0x7d31b1d942e0>, '78': <numjuggler.parser.Card object at 0x7d31b1d94310>, '2': <numjuggler.parser.Card object at 0x7d31b1d94340>, '3': <numjuggler.parser.Card object at 0x7d31b1d94370>, '4': <numjuggler.parser.Card object at 0x7d31b1d943a0>, '5': <numjuggler.parser.Card object at 0x7d31b1d943d0>, '6': <numjuggler.parser.Card object at 0x7d31b1d94400>, '80': <numjuggler.parser.Card object at 0x7d31b1d94430>, '81': <numjuggler.parser.Card object at 0x7d31b1d94460>, '82': <numjuggler.parser.Card object at 0x7d31b1d94490>, '83': <numjuggler.parser.Card object at 0x7d31b1d944c0>, '7': <numjuggler.parser.Card object at 0x7d31b1d944f0>, '8': <numjuggler.parser.Card object at 0x7d31b1d94520>, '9': <numjuggler.parser.Card object at 0x7d31b1d94550>, '10': <numjuggler.parser.Card object at 0x7d31b1d94580>, '11': <numjuggler.parser.Card object at 0x7d31b1d945b0>, '12': <numjuggler.parser.Card object at 0x7d31b1d945e0>, '13': <numjuggler.parser.Card object at 0x7d31b1d94610>, '14': <numjuggler.parser.Card object at 0x7d31b1d94640>, '15': <numjuggler.parser.Card object at 0x7d31b1d94670>, '16': <numjuggler.parser.Card object at 0x7d31b1d946a0>, '17': <numjuggler.parser.Card object at 0x7d31b1d946d0>, '18': <numjuggler.parser.Card object at 0x7d31b1d94700>, '19': <numjuggler.parser.Card object at 0x7d31b1d94730>, '20': <numjuggler.parser.Card object at 0x7d31b1d94760>, '21': <numjuggler.parser.Card object at 0x7d31b1d94790>, '22': <numjuggler.parser.Card object at 0x7d31b1d947c0>, '23': <numjuggler.parser.Card object at 0x7d31b1d947f0>, '24': <numjuggler.parser.Card object at 0x7d31b1d94820>, '25': <numjuggler.parser.Card object at 0x7d31b1d94850>, '26': <numjuggler.parser.Card object at 0x7d31b1d94880>, '27': <numjuggler.parser.Card object at 0x7d31b1d948b0>, '28': <numjuggler.parser.Card object at 0x7d31b1d948e0>, '29': <numjuggler.parser.Card object at 0x7d31b1d94910>, '30': <numjuggler.parser.Card object at 0x7d31b1d94940>, '31': <numjuggler.parser.Card object at 0x7d31b1d94970>, '32': <numjuggler.parser.Card object at 0x7d31b1d949a0>, '33': <numjuggler.parser.Card object at 0x7d31b1d949d0>, '34': <numjuggler.parser.Card object at 0x7d31b1d94a00>, '35': <numjuggler.parser.Card object at 0x7d31b1d94a30>, '36': <numjuggler.parser.Card object at 0x7d31b1d94a60>, '37': <numjuggler.parser.Card object at 0x7d31b1d94a90>, '38': <numjuggler.parser.Card object at 0x7d31b1d94ac0>, '39': <numjuggler.parser.Card object at 0x7d31b1d94af0>, '40': <numjuggler.parser.Card object at 0x7d31b1d94b20>, '41': <numjuggler.parser.Card object at 0x7d31b1d94b50>, '42': <numjuggler.parser.Card object at 0x7d31b1d94b80>, '43': <numjuggler.parser.Card object at 0x7d31b1d94bb0>, '44': <numjuggler.parser.Card object at 0x7d31b1d94be0>, '45': <numjuggler.parser.Card object at 0x7d31b1d94c10>, '46': <numjuggler.parser.Card object at 0x7d31b1d94c40>, '47': <numjuggler.parser.Card object at 0x7d31b1d94c70>, '48': <numjuggler.parser.Card object at 0x7d31b1d94ca0>, '84': <numjuggler.parser.Card object at 0x7d31b1d94cd0>, '85': <numjuggler.parser.Card object at 0x7d31b1d94d00>, '86': <numjuggler.parser.Card object at 0x7d31b1d94d30>, '87': <numjuggler.parser.Card object at 0x7d31b1d94d60>, '88': <numjuggler.parser.Card object at 0x7d31b1d94d90>, '89': <numjuggler.parser.Card object at 0x7d31b1d94dc0>, '90': <numjuggler.parser.Card object at 0x7d31b1d94df0>, '91': <numjuggler.parser.Card object at 0x7d31b1d94e20>, '92': <numjuggler.parser.Card object at 0x7d31b1d94e50>, '49': <numjuggler.parser.Card object at 0x7d31b1d94e80>, '50': <numjuggler.parser.Card object at 0x7d31b1d94eb0>, '51': <numjuggler.parser.Card object at 0x7d31b1d94ee0>, '52': <numjuggler.parser.Card object at 0x7d31b1d94f10>, '53': <numjuggler.parser.Card object at 0x7d31b1d94f40>, '93': <numjuggler.parser.Card object at 0x7d31b1d94f70>, '94': <numjuggler.parser.Card object at 0x7d31b1d94fa0>, '95': <numjuggler.parser.Card object at 0x7d31b1d94fd0>, '96': <numjuggler.parser.Card object at 0x7d31b1d95000>, '97': <numjuggler.parser.Card object at 0x7d31b1d95030>, '98': <numjuggler.parser.Card object at 0x7d31b1d95060>, '99': <numjuggler.parser.Card object at 0x7d31b1d95090>, '100': <numjuggler.parser.Card object at 0x7d31b1d950c0>, '101': <numjuggler.parser.Card object at 0x7d31b1d950f0>, '102': <numjuggler.parser.Card object at 0x7d31b1d95120>, '103': <numjuggler.parser.Card object at 0x7d31b1d95150>, '104': <numjuggler.parser.Card object at 0x7d31b1d95180>, '105': <numjuggler.parser.Card object at 0x7d31b1d951b0>, '106': <numjuggler.parser.Card object at 0x7d31b1d951e0>, '107': <numjuggler.parser.Card object at 0x7d31b1d95210>, '108': <numjuggler.parser.Card object at 0x7d31b1d95240>, '109': <numjuggler.parser.Card object at 0x7d31b1d95270>, '110': <numjuggler.parser.Card object at 0x7d31b1d952a0>, '111': <numjuggler.parser.Card object at 0x7d31b1d952d0>, '54': <numjuggler.parser.Card object at 0x7d31b1d95300>, '*55': <numjuggler.parser.Card object at 0x7d31b1d95330>, '*56': <numjuggler.parser.Card object at 0x7d31b1d95360>}
{'M1': <f4enix.input.materials.Material object at 0x7d31adefc220>, 'M2': <f4enix.input.materials.Material object at 0x7d31adefc370>, 'M3': <f4enix.input.materials.Material object at 0x7d31adefc9a0>, 'M4': <f4enix.input.materials.Material object at 0x7d31adefcb50>, 'M5': <f4enix.input.materials.Material object at 0x7d31adefcdc0>, 'M6': <f4enix.input.materials.Material object at 0x7d31adefd090>, 'M7': <f4enix.input.materials.Material object at 0x7d31adefd420>, 'M8': <f4enix.input.materials.Material object at 0x7d31adefd930>, 'M9': <f4enix.input.materials.Material object at 0x7d31adefda20>, 'M10': <f4enix.input.materials.Material object at 0x7d31adefe0b0>, 'M11': <f4enix.input.materials.Material object at 0x7d31adf20b20>, 'M12': <f4enix.input.materials.Material object at 0x7d31adf21e70>, 'M13': <f4enix.input.materials.Material object at 0x7d31adf3e620>, 'M14': <f4enix.input.materials.Material object at 0x7d31adf3eb90>, 'M15': <f4enix.input.materials.Material object at 0x7d31adf619c0>, 'M16': <f4enix.input.materials.Material object at 0x7d31adf61bd0>, 'M17': <f4enix.input.materials.Material object at 0x7d31adf61ea0>, 'M18': <f4enix.input.materials.Material object at 0x7d31adf62110>, 'M19': <f4enix.input.materials.Material object at 0x7d31adf62260>, 'M20': <f4enix.input.materials.Material object at 0x7d31adf62410>, 'M21': <f4enix.input.materials.Material object at 0x7d31adf627a0>, 'M74': <f4enix.input.materials.Material object at 0x7d31adf80e50>}
{}
{'SDEF': <numjuggler.parser.Card object at 0x7d31b1d95c30>, 'SP1': <numjuggler.parser.Card object at 0x7d31b1d95c90>, 'SI2': <numjuggler.parser.Card object at 0x7d31b1d95cf0>, 'SP2': <numjuggler.parser.Card object at 0x7d31b1d95d20>, 'SI3': <numjuggler.parser.Card object at 0x7d31b1d95d80>, 'SP3': <numjuggler.parser.Card object at 0x7d31b1d95db0>, 'SI4': <numjuggler.parser.Card object at 0x7d31b1d95e10>, 'SP4': <numjuggler.parser.Card object at 0x7d31b1d95e40>, 'MODE': <numjuggler.parser.Card object at 0x7d31b1d95ea0>, 'PHYS:N': <numjuggler.parser.Card object at 0x7d31b1d95f00>, 'CUT:N': <numjuggler.parser.Card object at 0x7d31b1d95f60>, 'E4': <numjuggler.parser.Card object at 0x7d31b1d95fc0>, 'FC4': <numjuggler.parser.Card object at 0x7d31b1d96020>, 'F4': <numjuggler.parser.Card object at 0x7d31b1d96050>, 'FM4': <numjuggler.parser.Card object at 0x7d31b1d96080>, 'FC204': <numjuggler.parser.Card object at 0x7d31b1d960e0>, 'F204': <numjuggler.parser.Card object at 0x7d31b1d96110>, 'FM204': <numjuggler.parser.Card object at 0x7d31b1d96140>, 'FC14': <numjuggler.parser.Card object at 0x7d31b1d961a0>, 'F14': <numjuggler.parser.Card object at 0x7d31b1d961d0>, 'FM14': <numjuggler.parser.Card object at 0x7d31b1d96200>, 'E14': <numjuggler.parser.Card object at 0x7d31b1d96230>, 'FQ14': <numjuggler.parser.Card object at 0x7d31b1d96260>, 'FC214': <numjuggler.parser.Card object at 0x7d31b1d962c0>, 'F214': <numjuggler.parser.Card object at 0x7d31b1d962f0>, 'FM214': <numjuggler.parser.Card object at 0x7d31b1d96320>, 'FC6': <numjuggler.parser.Card object at 0x7d31b1d96380>, 'F6': <numjuggler.parser.Card object at 0x7d31b1d963b0>, 'FM6': <numjuggler.parser.Card object at 0x7d31b1d963e0>, 'FC16': <numjuggler.parser.Card object at 0x7d31b1d96440>, 'F16': <numjuggler.parser.Card object at 0x7d31b1d96470>, 'FM16': <numjuggler.parser.Card object at 0x7d31b1d964a0>, 'FC26': <numjuggler.parser.Card object at 0x7d31b1d96500>, 'F26': <numjuggler.parser.Card object at 0x7d31b1d96530>, 'FM26': <numjuggler.parser.Card object at 0x7d31b1d96560>, 'FC24': <numjuggler.parser.Card object at 0x7d31b1d965c0>, 'F24': <numjuggler.parser.Card object at 0x7d31b1d965f0>, 'FM24': <numjuggler.parser.Card object at 0x7d31b1d96620>, 'FC34': <numjuggler.parser.Card object at 0x7d31b1d96680>, 'F34': <numjuggler.parser.Card object at 0x7d31b1d966b0>, 'FM34': <numjuggler.parser.Card object at 0x7d31b1d966e0>, 'FC44': <numjuggler.parser.Card object at 0x7d31b1d96740>, 'F44': <numjuggler.parser.Card object at 0x7d31b1d96770>, 'FM44': <numjuggler.parser.Card object at 0x7d31b1d967a0>, 'FC54': <numjuggler.parser.Card object at 0x7d31b1d96800>, 'F54': <numjuggler.parser.Card object at 0x7d31b1d96830>, 'FM54': <numjuggler.parser.Card object at 0x7d31b1d96860>, 'FC64': <numjuggler.parser.Card object at 0x7d31b1d968c0>, 'F64': <numjuggler.parser.Card object at 0x7d31b1d968f0>, 'FM64': <numjuggler.parser.Card object at 0x7d31b1d96920>, 'FC74': <numjuggler.parser.Card object at 0x7d31b1d96980>, 'F74': <numjuggler.parser.Card object at 0x7d31b1d969b0>, 'FM74': <numjuggler.parser.Card object at 0x7d31b1d969e0>, 'FC84': <numjuggler.parser.Card object at 0x7d31b1d96a40>, 'F84': <numjuggler.parser.Card object at 0x7d31b1d96a70>, 'FM84': <numjuggler.parser.Card object at 0x7d31b1d96aa0>, 'FC94': <numjuggler.parser.Card object at 0x7d31b1d96b00>, 'F94': <numjuggler.parser.Card object at 0x7d31b1d96b30>, 'FM94': <numjuggler.parser.Card object at 0x7d31b1d96b60>, 'FC104': <numjuggler.parser.Card object at 0x7d31b1d96bc0>, 'F104': <numjuggler.parser.Card object at 0x7d31b1d96bf0>, 'FM104': <numjuggler.parser.Card object at 0x7d31b1d96c20>, 'FC114': <numjuggler.parser.Card object at 0x7d31b1d96c80>, 'F114': <numjuggler.parser.Card object at 0x7d31b1d96cb0>, 'FM114': <numjuggler.parser.Card object at 0x7d31b1d96ce0>, 'FC124': <numjuggler.parser.Card object at 0x7d31b1d96d40>, 'F124': <numjuggler.parser.Card object at 0x7d31b1d96d70>, 'FM124': <numjuggler.parser.Card object at 0x7d31b1d96da0>, 'FC134': <numjuggler.parser.Card object at 0x7d31b1d96e00>, 'F134': <numjuggler.parser.Card object at 0x7d31b1d96e30>, 'FM134': <numjuggler.parser.Card object at 0x7d31b1d96e60>, 'FC144': <numjuggler.parser.Card object at 0x7d31b1d96ec0>, 'F144': <numjuggler.parser.Card object at 0x7d31b1d96ef0>, 'FM144': <numjuggler.parser.Card object at 0x7d31b1d96f20>, 'FC154': <numjuggler.parser.Card object at 0x7d31b1d96f80>, 'F154': <numjuggler.parser.Card object at 0x7d31b1d96fb0>, 'FM154': <numjuggler.parser.Card object at 0x7d31b1d96fe0>, 'FC164': <numjuggler.parser.Card object at 0x7d31b1d97040>, 'F164': <numjuggler.parser.Card object at 0x7d31b1d97070>, 'FM164': <numjuggler.parser.Card object at 0x7d31b1d970a0>, 'FC174': <numjuggler.parser.Card object at 0x7d31b1d97100>, 'F174': <numjuggler.parser.Card object at 0x7d31b1d97130>, 'E174': <numjuggler.parser.Card object at 0x7d31b1d97160>, 'FM174': <numjuggler.parser.Card object at 0x7d31b1d97190>, 'FC1004': <numjuggler.parser.Card object at 0x7d31b1d971f0>, 'FMESH1004': <numjuggler.parser.Card object at 0x7d31b1d97220>, 'FM1004': <numjuggler.parser.Card object at 0x7d31b1d97250>, 'FC1024': <numjuggler.parser.Card object at 0x7d31b1d972b0>, 'FMESH1024': <numjuggler.parser.Card object at 0x7d31b1d972e0>, 'FM1024': <numjuggler.parser.Card object at 0x7d31b1d97310>, 'PRINT': <numjuggler.parser.Card object at 0x7d31b1d97370>, 'RAND': <numjuggler.parser.Card object at 0x7d31b1d973d0>, 'PRDMP': <numjuggler.parser.Card object at 0x7d31b1d97430>, 'NPS': <numjuggler.parser.Card object at 0x7d31b1d97460>}
# Get a specific card
print(inp.get_cells_by_id([2]))  # cell n.2
print(inp.get_surfs_by_id([1, 2]))  # surfaces n.1 and 2
print(inp.get_cells_by_matID("13"))  # cells to which material 13 is assigned
print(inp.get_materials_subset(["m2", "m3"]))  # materials M2 and M3
print(inp.get_data_cards("SDEF"))  # generic data cards
{'2': <numjuggler.parser.Card object at 0x7d31df722e30>}
{'1': <numjuggler.parser.Card object at 0x7d31b1d5ff10>, '2': <numjuggler.parser.Card object at 0x7d31b1d94340>}
{'2': <numjuggler.parser.Card object at 0x7d31b1d95de0>, '3': <numjuggler.parser.Card object at 0x7d31b1d960b0>, '4': <numjuggler.parser.Card object at 0x7d31b1d96c50>, '5': <numjuggler.parser.Card object at 0x7d31b1d95480>, '6': <numjuggler.parser.Card object at 0x7d31b1d96f50>, '7': <numjuggler.parser.Card object at 0x7d31b1d958d0>, '8': <numjuggler.parser.Card object at 0x7d31b1d95870>, '9': <numjuggler.parser.Card object at 0x7d31b1d954e0>, '10': <numjuggler.parser.Card object at 0x7d31b1d95b70>, '11': <numjuggler.parser.Card object at 0x7d31b1d95ab0>, '12': <numjuggler.parser.Card object at 0x7d31b1d958a0>, '13': <numjuggler.parser.Card object at 0x7d31b1d95a20>, '14': <numjuggler.parser.Card object at 0x7d31b1d953f0>, '15': <numjuggler.parser.Card object at 0x7d31b1d970d0>, '16': <numjuggler.parser.Card object at 0x7d31b1d97280>, '17': <numjuggler.parser.Card object at 0x7d31b1d973a0>, '18': <numjuggler.parser.Card object at 0x7d31b1d95390>, '19': <numjuggler.parser.Card object at 0x7d31adf80fa0>, '20': <numjuggler.parser.Card object at 0x7d31adf81000>, '21': <numjuggler.parser.Card object at 0x7d31adf81060>, '86': <numjuggler.parser.Card object at 0x7d31adf810c0>, '87': <numjuggler.parser.Card object at 0x7d31adf81120>, '88': <numjuggler.parser.Card object at 0x7d31adf81180>, '89': <numjuggler.parser.Card object at 0x7d31adf811e0>, '90': <numjuggler.parser.Card object at 0x7d31adf81240>, '91': <numjuggler.parser.Card object at 0x7d31adf812a0>, '92': <numjuggler.parser.Card object at 0x7d31adf81300>, '93': <numjuggler.parser.Card object at 0x7d31adf81360>, '94': <numjuggler.parser.Card object at 0x7d31adf813c0>, '95': <numjuggler.parser.Card object at 0x7d31adf81420>, '96': <numjuggler.parser.Card object at 0x7d31adf81480>, '97': <numjuggler.parser.Card object at 0x7d31adf814e0>, '98': <numjuggler.parser.Card object at 0x7d31adf81540>, '99': <numjuggler.parser.Card object at 0x7d31adf815a0>, '100': <numjuggler.parser.Card object at 0x7d31adf81600>, '101': <numjuggler.parser.Card object at 0x7d31adf81660>, '102': <numjuggler.parser.Card object at 0x7d31adf816c0>, '103': <numjuggler.parser.Card object at 0x7d31adf81720>, '104': <numjuggler.parser.Card object at 0x7d31adf81780>, '105': <numjuggler.parser.Card object at 0x7d31adf817e0>}
{'M2': <f4enix.input.materials.Material object at 0x7d31adefc370>, 'M3': <f4enix.input.materials.Material object at 0x7d31adefc9a0>}
{'SDEF': <numjuggler.parser.Card object at 0x7d31b1d95c30>}

Working with surfaces and cells#

A common example may be the need to modify some cells attributes based on an arbitrary logic. Here is an example where the density of cells is reduced by a factor depending on the material. If a constant factor has to be used, consider the Input.scale_densities() method

from copy import deepcopy
import tempfile  # To have a scratch directory for the example
import os

# It may be useful to preserve the original input
inp2 = deepcopy(inp)

# Set some density correction factors for specific materials
density_factors = {61: 1.1, 63: 10}

# Cycle on the cells dictionary
for idx_cell, cell in inp2.cells.items():
    # Change density based on material
    # mat = cell._get_value_by_type('mat')
    mat = cell.get_m()
    # get the density of the cell
    rho = cell.get_d()
    if mat in [61, 63]:
        cell.set_d(str(rho * density_factors[mat]))
    elif mat == 0:
        pass  # do not change density of void cells
    else:
        # scale all other densitites by a constant factor
        cell.set_d(str(rho * 0.5))

# Print the modified file
outfile = os.path.join(tempfile.gettempdir(), "new_input.i")
inp2.write(outfile)
print(outfile)
/tmp/new_input.i

This input parser is built on numjuggler, hence every card is a numjuggler.parser.Card. The recommended way to get and modify fields of these cards are to use the _get_value_by_type() and _set_value_by_type() methods, as in the example above. Since numjuggler is lacking extensive documentation, to understand which methods are available, the dir() method can be useful, while the values attributes should be used to verify the available values to get/modify.

print(type(cell))
print(dir(cell))
cell.values
<class 'numjuggler.parser.Card'>
['_Card__cr', '_Card__d', '_Card__f', '_Card__i', '_Card__m', '_Card__st', '_Card__u', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slotnames__', '__str__', '__subclasshook__', '__weakref__', '_get_value_by_type', '_protect_nums', '_set_value_by_type', 'apply_map', 'card', 'cstrg', 'ctype', 'debug', 'dtype', 'geom_prefix', 'geom_suffix', 'get_d', 'get_f', 'get_geom', 'get_imp', 'get_input', 'get_m', 'get_refcells', 'get_u', 'get_values', 'hidden', 'input', 'lines', 'name', 'pos', 'print_debug', 'remove_fill', 'remove_spaces', 'set_d', 'template', 'values']
[(106, 'cel'),
 (0, 'mat'),
 ('', '#gpr'),
 (55, 'sur'),
 (54, 'sur'),
 (56, 'sur'),
 ('', '#gsu')]

Another useful feature is to check wether a range of ints is free or not. This can be done both for cell and surfaces indexes

print(inp2.check_range([1, 2], who="cell"))
print(inp2.check_range(range(1000, 1005), who="cell"))
print(inp2.check_range([1], who="surf"))
False
True
False

The following function finds the first free range of cell and surface ids of a give length.

print(
    "If we need to fit 500 new cells in the model they would start with cell: ",
    inp2.find_first_free_id_range(500),
)
print(
    "If we need to fit 3 models of 1000 new cells each they would start with cell: ",
    inp2.find_first_free_id_range(3 * 1000),
)
If we need to fit 500 new cells in the model they would start with cell:  112
If we need to fit 3 models of 1000 new cells each they would start with cell:  112

We can also visualize the used and free ranges of cell and surface ids with a plot. This helps to quickly identify large enough free ranges for adding new cells or surfaces.

fig, ax = inp2.explore_id_ranges_by_plot()
../../../_images/42fb2abf57edbb0572c2fee7fe5f0d6bdc78bcc171d63672604ada2b2f3ca39f.png

Special actions on cells#

In some cases it may be useful to delete all fill cards that are present in an input (for instance for plotting purposes).

This can be done thanks to an ad hoc method:

u_inp = Input.from_input("test_universe.i")
print("original cell")
print(u_inp.cells["1"].card())

u_inp.delete_fill_cards()
print("after deleting fill cards")
print(u_inp.cells["1"].card())
original cell
c
C Cells section
c Universe level 0
1 0 -1 imp:n=1 fill=125

after deleting fill cards
1 0 -1 imp:n=1     

Working with materials#

Replace a material#

It is possible to replace a material with another one (and another density) or set it to void. This can be done across the entire input or only in specific universes.

# It may be useful to preserve the original input
inp3 = deepcopy(inp)

print("original card:")
print(inp3.cells["2"].card())
# In this case replaces in the entire input
inp3.replace_material(10, "-1", 13)
print("modified card:")
print(inp3.cells["2"].card())
original card:
2     13  7.2058e-002  -55 56   1  -60   imp:n,p=8388608  

modified card:
2     10  -1  -55 56   1  -60   imp:n,p=8388608           

Get info on the material section of the input and switch fraction#

# For many operations on materials a libmanager is needed. For most application
# the default libmanager can be used, check the libmanager documentation for
# more details
from f4enix.input.libmanager import LibManager

libmanager = LibManager()

# Get a summary of the materials defined in the input
df_mat, df_submat = inp.materials.get_info(libmanager)
df_mat
Atom Fraction Mass Fraction
Material Submaterial Element
M1 1 H 2.162999e-02 -0.019046
2 C 1.892004e-02 -0.198524
3 N 2.059998e-03 -0.025207
4 O 2.705996e-02 -0.378226
5 Mg 1.190000e-03 -0.025268
... ... ... ... ...
M74 1 Si 8.157524e-06 -0.000020
Ta 6.330820e-07 -0.000010
Ti 2.392466e-06 -0.000010
Zr 1.255620e-06 -0.000010
W 6.220930e-02 -0.999565

161 rows × 2 columns

# here the fraction used in the MCNP input (i.e. either mass or atom) is used
df_submat
Fraction Sub-Material Fraction Material Fraction
Material Submaterial Element
M1 1 H 2.162999e-02 1.000000 0.256858
2 C 1.892004e-02 1.000000 0.224677
3 N 2.059998e-03 1.000000 0.024463
4 O 2.705996e-02 1.000000 0.321339
5 Al 3.930000e-03 0.299542 0.046669
... ... ... ... ... ...
M74 1 Si 8.157524e-06 0.000131 0.000131
Ta 6.330820e-07 0.000010 0.000010
Ti 2.392466e-06 0.000038 0.000038
W 6.220930e-02 0.996832 0.996832
Zr 1.255620e-06 0.000020 0.000020

161 rows × 3 columns

# switch from atom to mass fraction for all materials
inp2 = deepcopy(inp)

# MaterialSection is implemented as a Sequence, hence, it can be iterated
for material in inp2.materials:
    material.switch_fraction("mass", libmanager)

# verify the change, this time get also the different zaid contribution
df_mat, df_submat = inp2.materials.get_info(libmanager, zaids=True)
df_submat
Fraction Sub-Material Fraction Material Fraction
Material Submaterial Element
M1 1 H -0.019046 1.000000 0.019046
2 C -0.198524 1.000000 0.198524
3 N -0.025207 1.000000 0.025207
4 O -0.378226 1.000000 0.378226
5 Al -0.092636 0.294839 0.092636
... ... ... ... ... ...
M74 1 Si -0.000020 0.000020 0.000020
Ta -0.000010 0.000010 0.000010
Ti -0.000010 0.000010 0.000010
W -0.999565 0.999565 0.999565
Zr -0.000010 0.000010 0.000010

161 rows × 3 columns

# the zaids are print only in the df_mat when requested
df_mat
Atom Fraction Mass Fraction
Material Submaterial Element Isotope
M1 1 H H-1 [1001] 0.256828 -0.019042
H-2 [1002] 0.000030 -0.000004
2 C C-12 [6012] 0.222273 -0.196224
C-13 [6013] 0.002404 -0.002300
3 N N-14 [7014] 0.024374 -0.025109
... ... ... ... ... ...
M74 1 W W-180 [74180] 0.001196 -0.001174
W-182 [74182] 0.264161 -0.262157
W-183 [74183] 0.142647 -0.142344
W-184 [74184] 0.305429 -0.306448
W-186 [74186] 0.283399 -0.287442

506 rows × 2 columns

Translation of the material card to different libraries#

F4Enix allows to translate the materials contained into an input to different libraries. There are different ways to do that:

  • Translate all encountered zaids to a specified library

  • Provide a dictionary specifying which zaids needs to be translated to which libraries

  • Provide a dictionary specifying which original libraries should be converted to which ones.

Hereafter are some examples of all these methods

# --- Change library for all materials ---
inp2.translate("31c", libmanager)
print("All translated to 81c:")
print(inp2.materials["M8"].to_text())

# --- specify a library for every zaid ---
special_zaids = ["4009", "28061"]  # to be translated to specific library
non_special = []
for material in inp2.materials:
    for submaterial in material.submaterials:
        for zaid in submaterial.zaidList:
            zaid_str = zaid.element + zaid.isotope
            if zaid_str not in special_zaids:
                non_special.append(zaid_str)

inp2.translate({"80c": special_zaids, "31c": non_special}, libmanager)
print("\nSpecified library for each isotope:")
print(inp2.materials["M8"].to_text())

# --- specify different libraries depending on the original one ---
# this can be useful when D1S libraries only have to be changed for instance
libs = {"31c": "30c", "80c": "31c"}
inp2.translate(libs, libmanager)
print("\nDifferent libraries based on original one:")
print(inp2.materials["M8"].to_text())
All translated to 81c:
c -------------------------------------------------------------------
M8
c   Cu-Be-Ni:  t.a.d. = 8.6794e-002
      28058.31c       -1.337648E-2     $ Ni-58  WEIGHT(%) 2.0035 AB(%) 66.767
      28060.31c       -5.346947E-3     $ Ni-60  WEIGHT(%) 2.0035 AB(%) 26.688
      28061.31c       -2.697346E-4     $ Ni-61  WEIGHT(%) 2.0035 AB(%) 1.3463
      28062.31c       -7.802716E-4     $ Ni-62  WEIGHT(%) 2.0035 AB(%) 3.8946
      28064.31c       -2.612322E-4     $ Ni-64  WEIGHT(%) 2.0035 AB(%) 1.3039
      29063.31c       -6.676429E-1     $ Cu-63  WEIGHT(%) 97.496 AB(%) 68.479
      29065.31c       -3.073144E-1     $ Cu-65  WEIGHT(%) 97.496 AB(%) 31.521
       4009.31c       -5.008062E-3     $ Be-9   WEIGHT(%) 0.50081 AB(%) 100.0
	 plib=84p
Specified library for each isotope:
c -------------------------------------------------------------------
M8
c   Cu-Be-Ni:  t.a.d. = 8.6794e-002
      28058.31c       -1.337648E-2     $ Ni-58  WEIGHT(%) 2.0035 AB(%) 66.767
      28060.31c       -5.346947E-3     $ Ni-60  WEIGHT(%) 2.0035 AB(%) 26.688
      28061.80c       -2.697346E-4     $ Ni-61  WEIGHT(%) 2.0035 AB(%) 1.3463
      28062.31c       -7.802716E-4     $ Ni-62  WEIGHT(%) 2.0035 AB(%) 3.8946
      28064.31c       -2.612322E-4     $ Ni-64  WEIGHT(%) 2.0035 AB(%) 1.3039
      29063.31c       -6.676429E-1     $ Cu-63  WEIGHT(%) 97.496 AB(%) 68.479
      29065.31c       -3.073144E-1     $ Cu-65  WEIGHT(%) 97.496 AB(%) 31.521
       4009.80c       -5.008062E-3     $ Be-9   WEIGHT(%) 0.50081 AB(%) 100.0
	 plib=84p
Different libraries based on original one:
c -------------------------------------------------------------------
M8
c   Cu-Be-Ni:  t.a.d. = 8.6794e-002
      28058.30c       -1.337648E-2     $ Ni-58  WEIGHT(%) 2.0035 AB(%) 66.767
      28060.30c       -5.346947E-3     $ Ni-60  WEIGHT(%) 2.0035 AB(%) 26.688
      28061.31c       -2.697346E-4     $ Ni-61  WEIGHT(%) 2.0035 AB(%) 1.3463
      28062.30c       -7.802716E-4     $ Ni-62  WEIGHT(%) 2.0035 AB(%) 3.8946
      28064.30c       -2.612322E-4     $ Ni-64  WEIGHT(%) 2.0035 AB(%) 1.3039
      29063.30c       -6.676429E-1     $ Cu-63  WEIGHT(%) 97.496 AB(%) 68.479
      29065.30c       -3.073144E-1     $ Cu-65  WEIGHT(%) 97.496 AB(%) 31.521
       4009.31c       -5.008062E-3     $ Be-9   WEIGHT(%) 0.50081 AB(%) 100.0
	 plib=84p

A special mention should go to dosimetry libraries. Often the user does not wish to modify them during the tranlsation (which should happen only for “transport” libraries). For this reason, it is possible to specify a list of libraries that should be ignored by translation operations as an optional argument of the LibManager

from f4enix.input.materials import SubMaterial

newlibmanager = LibManager(dosimetry_lib=["21c"])
text = [
    "C Headers",
    "      28058.31c  1",
    "      28060.31c  1",
    "      28061.21c  1",
]
submat = SubMaterial.from_text(text)
submat.translate("00c", newlibmanager)
print(submat.to_text())
C Header
      28058.00c        1.000000E+0     $        WEIGHT(%)  AB(%)     
      28060.00c        1.000000E+0     $        WEIGHT(%)  AB(%)     
      28061.21c        1.000000E+0     $        WEIGHT(%)  AB(%)     

Generate new materials from existing ones#

# Generate a new material as a composition of existing ones
# The percentages are intended in mass if the fraction is to be expressed in
# mass or in atom otherwise. The new material is created as 'M1'
new_mat = inp2.materials.generate_material(
    ["m2", "m74"], [0.2, 0.8], "31c", libmanager, fractiontype="mass"
)
print(new_mat.to_text())
C Material: M2 Percentage: 20.0% (mass)
C Material: M74 Percentage: 80.0% (mass)
M1
c  -----------------------------------------------------------------
C           o-------------------------------------------------------o
c           |    Copper                                             |
c           |    t.a.d. =   8.29204E-02                        M2   |
C           o-------------------------------------------------------o
c
C M2, submaterial 1
      29063.31c       -1.369585E-1     $ Cu-63  WEIGHT(%) 100.0 AB(%) 68.479
      29065.31c       -6.304150E-2     $ Cu-65  WEIGHT(%) 100.0 AB(%) 31.521
c
C M74, submaterial 1
      13027.31c       -1.201453E-5     $ Al-27  WEIGHT(%) 0.0015018 AB(%) 100.0
       6012.31c       -2.349665E-5     $ C-12   WEIGHT(%) 0.0029715 AB(%) 98.842
       6013.31c       -2.753824E-7     $ C-13   WEIGHT(%) 0.0029715 AB(%) 1.1584
      20040.31c       -7.742686E-6     $ Ca-40  WEIGHT(%) 0.0010013 AB(%) 96.662
      20042.31c       -5.425701E-8     $ Ca-42  WEIGHT(%) 0.0010013 AB(%) 0.67736
      20043.31c       -1.159086E-8     $ Ca-43  WEIGHT(%) 0.0010013 AB(%) 0.1447
      20044.31c       -1.832560E-7     $ Ca-44  WEIGHT(%) 0.0010013 AB(%) 2.2878
      20046.31c      -3.673774E-10     $ Ca-46  WEIGHT(%) 0.0010013 AB(%) 0.0045864
      20048.31c       -1.792187E-8     $ Ca-48  WEIGHT(%) 0.0010013 AB(%) 0.22374
      27059.31c       -8.009724E-6     $ Co-59  WEIGHT(%) 0.0010012 AB(%) 100.0
      24050.31c       -3.342998E-7     $ Cr-50  WEIGHT(%) 0.0010012 AB(%) 4.1737
      24052.31c       -6.704119E-6     $ Cr-52  WEIGHT(%) 0.0010012 AB(%) 83.699
      24053.31c       -7.748249E-7     $ Cr-53  WEIGHT(%) 0.0010012 AB(%) 9.6735
      24054.31c       -1.965054E-7     $ Cr-54  WEIGHT(%) 0.0010012 AB(%) 2.4533
      29063.31c       -5.486584E-6     $ Cu-63  WEIGHT(%) 0.0010012 AB(%) 68.499
      29065.31c       -2.523103E-6     $ Cu-65  WEIGHT(%) 0.0010012 AB(%) 31.501
      26054.31c       -1.356578E-6     $ Fe-54  WEIGHT(%) 0.0030036 AB(%) 5.6456
      26056.31c       -2.208314E-5     $ Fe-56  WEIGHT(%) 0.0030036 AB(%) 91.902
      26057.31c       -5.191164E-7     $ Fe-57  WEIGHT(%) 0.0030036 AB(%) 2.1604
      26058.31c       -7.029536E-8     $ Fe-58  WEIGHT(%) 0.0030036 AB(%) 0.29254
       1001.31c       -4.003929E-6     $ H-1    WEIGHT(%) 0.00050061 AB(%) 99.977
       1002.31c      -9.203023E-10     $ H-2    WEIGHT(%) 0.00050061 AB(%) 0.02298
      19039.31c       -7.443313E-6     $ K-39   WEIGHT(%) 0.0010011 AB(%) 92.937
      19040.31c      -9.577965E-10     $ K-40   WEIGHT(%) 0.0010011 AB(%) 0.011959
      19041.31c       -5.647107E-7     $ K-41   WEIGHT(%) 0.0010011 AB(%) 7.051
      12024.31c       -3.121783E-6     $ Mg-24  WEIGHT(%) 0.00050061 AB(%) 77.95
      12025.31c       -4.117021E-7     $ Mg-25  WEIGHT(%) 0.00050061 AB(%) 10.28
      12026.31c       -4.713673E-7     $ Mg-26  WEIGHT(%) 0.00050061 AB(%) 11.77
      25055.31c       -4.004868E-6     $ Mn-55  WEIGHT(%) 0.00050061 AB(%) 100.0
      42092.31c       -1.138774E-5     $ Mo-92  WEIGHT(%) 0.010012 AB(%) 14.217
      42094.31c       -7.252501E-6     $ Mo-94  WEIGHT(%) 0.010012 AB(%) 9.0546
      42095.31c       -1.261515E-5     $ Mo-95  WEIGHT(%) 0.010012 AB(%) 15.75
      42096.31c       -1.335646E-5     $ Mo-96  WEIGHT(%) 0.010012 AB(%) 16.675
      42097.31c       -7.726974E-6     $ Mo-97  WEIGHT(%) 0.010012 AB(%) 9.647
      42098.31c       -1.972517E-5     $ Mo-98  WEIGHT(%) 0.010012 AB(%) 24.627
      42100.31c       -8.033012E-6     $ Mo-100 WEIGHT(%) 0.010012 AB(%) 10.029
       7014.31c       -7.978127E-6     $ N-14   WEIGHT(%) 0.0010013 AB(%) 99.602
       7015.31c       -3.188774E-8     $ N-15   WEIGHT(%) 0.0010013 AB(%) 0.3981
      11023.31c       -8.009689E-6     $ Na-23  WEIGHT(%) 0.0010012 AB(%) 100.0
      41093.31c       -8.009716E-6     $ Nb-93  WEIGHT(%) 0.0010012 AB(%) 100.0
      28058.31c       -1.076462E-5     $ Ni-58  WEIGHT(%) 0.0020024 AB(%) 67.198
      28060.31c       -4.289338E-6     $ Ni-60  WEIGHT(%) 0.0020024 AB(%) 26.776
      28061.31c       -1.895663E-7     $ Ni-61  WEIGHT(%) 0.0020024 AB(%) 1.1834
      28062.31c       -6.143145E-7     $ Ni-62  WEIGHT(%) 0.0020024 AB(%) 3.8348
      28064.31c       -1.614991E-7     $ Ni-64  WEIGHT(%) 0.0020024 AB(%) 1.0082
       8016.31c       -2.390572E-5     $ O-16   WEIGHT(%) 0.0029963 AB(%) 99.729
       8017.31c       -9.678044E-9     $ O-17   WEIGHT(%) 0.0029963 AB(%) 0.040375
       8018.31c       -5.528194E-8     $ O-18   WEIGHT(%) 0.0029963 AB(%) 0.23062
      15031.31c       -4.004808E-5     $ P-31   WEIGHT(%) 0.005006 AB(%) 100.0
      82204.31c       -1.088356E-7     $ Pb-204 WEIGHT(%) 0.0009872 AB(%) 1.3781
      82206.31c       -1.891913E-6     $ Pb-206 WEIGHT(%) 0.0009872 AB(%) 23.956
      82207.31c       -1.743340E-6     $ Pb-207 WEIGHT(%) 0.0009872 AB(%) 22.074
      82208.31c       -4.153525E-6     $ Pb-208 WEIGHT(%) 0.0009872 AB(%) 52.592
      16032.31c       -3.793265E-6     $ S-32   WEIGHT(%) 0.00050061 AB(%) 94.715
      16033.31c       -3.088613E-8     $ S-33   WEIGHT(%) 0.00050061 AB(%) 0.77121
      16034.31c       -1.803114E-7     $ S-34   WEIGHT(%) 0.00050061 AB(%) 4.5023
      16036.31c      -4.492321E-10     $ S-36   WEIGHT(%) 0.00050061 AB(%) 0.011217
      14028.31c       -1.471739E-5     $ Si-28  WEIGHT(%) 0.0020024 AB(%) 91.874
      14029.31c       -7.740048E-7     $ Si-29  WEIGHT(%) 0.0020024 AB(%) 4.8317
      14030.31c       -5.277873E-7     $ Si-30  WEIGHT(%) 0.0020024 AB(%) 3.2947
      73181.31c       -8.009681E-6     $ Ta-181 WEIGHT(%) 0.0010012 AB(%) 100.0
      22046.31c       -6.343764E-7     $ Ti-46  WEIGHT(%) 0.0010009 AB(%) 7.9226
      22047.31c       -5.845310E-7     $ Ti-47  WEIGHT(%) 0.0010009 AB(%) 7.3001
      22048.31c       -5.912271E-6     $ Ti-48  WEIGHT(%) 0.0010009 AB(%) 73.837
      22049.31c       -4.431130E-7     $ Ti-49  WEIGHT(%) 0.0010009 AB(%) 5.5339
      22050.31c       -4.329136E-7     $ Ti-50  WEIGHT(%) 0.0010009 AB(%) 5.4066
      40090.31c       -4.060946E-6     $ Zr-90  WEIGHT(%) 0.0010011 AB(%) 50.706
      40091.31c       -8.954570E-7     $ Zr-91  WEIGHT(%) 0.0010011 AB(%) 11.181
      40092.31c       -1.383769E-6     $ Zr-92  WEIGHT(%) 0.0010011 AB(%) 17.278
      40094.31c       -1.432863E-6     $ Zr-94  WEIGHT(%) 0.0010011 AB(%) 17.891
      40096.31c       -2.357623E-7     $ Zr-96  WEIGHT(%) 0.0010011 AB(%) 2.9438
      74180.31c       -9.392522E-4     $ W-180  WEIGHT(%) 99.957 AB(%) 0.11746
      74182.31c       -2.097256E-1     $ W-182  WEIGHT(%) 99.957 AB(%) 26.227
      74183.31c       -1.138753E-1     $ W-183  WEIGHT(%) 99.957 AB(%) 14.241
      74184.31c       -2.451585E-1     $ W-184  WEIGHT(%) 99.957 AB(%) 30.658
      74186.31c       -2.299535E-1     $ W-186  WEIGHT(%) 99.957 AB(%) 28.757

Generate a material from a list of zaids or elements#

it is also possible to generate a material from a list of zaids. If the “natural zaids” notation is used, the elements are expanded automatically as shown in the following example.

from f4enix.input.materials import Material
from f4enix.input.libmanager import LibManager

libman = LibManager()  # always needed when libraries are involved
zaids = [
    (1000, -4.7),
    (5000, -30.4),
    (6000, -28.3),
    (11000, -3.2),
    (16000, -33.1),
    (14000, -0.06),
    (26000, -0.08),
    (7000, -0.4),
]
newmat = Material.from_zaids(zaids, libman, "31c", "header of the material")
print(newmat.to_text())
C header of the material
M1
       1001.31c       -4.698638E+0     $ H-1    WEIGHT(%) 4.6887 AB(%) 99.971
       1002.31c       -1.361756E-3     $ H-2    WEIGHT(%) 4.6887 AB(%) 0.028974
       5010.31c       -5.531343E+0     $ B-10   WEIGHT(%) 30.327 AB(%) 18.195
       5011.31c       -2.486866E+1     $ B-11   WEIGHT(%) 30.327 AB(%) 81.805
       6012.31c       -2.797523E+1     $ C-12   WEIGHT(%) 28.232 AB(%) 98.852
       6013.31c       -3.247744E-1     $ C-13   WEIGHT(%) 28.232 AB(%) 1.1476
      11023.31c       -3.200000E+0     $ Na-23  WEIGHT(%) 3.1923 AB(%) 100.0
      16032.31c       -3.130391E+1     $ S-32   WEIGHT(%) 33.021 AB(%) 94.574
      16033.31c       -2.596888E-1     $ S-33   WEIGHT(%) 33.021 AB(%) 0.78456
      16034.31c       -1.530534E+0     $ S-34   WEIGHT(%) 33.021 AB(%) 4.624
      16036.31c       -5.866145E-3     $ S-36   WEIGHT(%) 33.021 AB(%) 0.017722
      14028.31c       -5.513970E-2     $ Si-28  WEIGHT(%) 0.059856 AB(%) 91.899
      14029.31c       -2.892181E-3     $ Si-29  WEIGHT(%) 0.059856 AB(%) 4.8203
      14030.31c       -1.968119E-3     $ Si-30  WEIGHT(%) 0.059856 AB(%) 3.2802
      26054.31c       -4.516447E-3     $ Fe-54  WEIGHT(%) 0.079808 AB(%) 5.6456
      26056.31c       -7.352122E-2     $ Fe-56  WEIGHT(%) 0.079808 AB(%) 91.902
      26057.31c       -1.728295E-3     $ Fe-57  WEIGHT(%) 0.079808 AB(%) 2.1604
      26058.31c       -2.340355E-4     $ Fe-58  WEIGHT(%) 0.079808 AB(%) 0.29254
       7014.31c       -3.983744E-1     $ N-14   WEIGHT(%) 0.39904 AB(%) 99.594
       7015.31c       -1.625644E-3     $ N-15   WEIGHT(%) 0.39904 AB(%) 0.40641

The elements/zaids to be added can be specified with the zaid number but also using their formula as shown below

zaids = [("1001", -100), ("B-0", -200), ("C-12", -50)]
newmat = Material.from_zaids(zaids, libman, "31c", "header of the material")
print(newmat.to_text())
C header of the material
M1
       1001.31c       -1.000000E+2     $ H-1    WEIGHT(%) 28.571 AB(%) 100.0
       5010.31c       -3.639041E+1     $ B-10   WEIGHT(%) 57.143 AB(%) 18.195
       5011.31c       -1.636096E+2     $ B-11   WEIGHT(%) 57.143 AB(%) 81.805
       6012.31c       -5.000000E+1     $ C-12   WEIGHT(%) 14.286 AB(%) 100.0

Renumbering and Merging#

A very common task when dealing with MCNP input is renumbering. The numjuggler capabilities have been restored also in F4Enix with the exception of renumbering materials

newinp = deepcopy(inp)

newinp.renumber(cells=100, surfs=120, translations=10, universes=10)
# when used like that, the keys of the dictionary will not be updated
print("keys are not modified by renumbering:")
print(newinp.cells.keys())
print("\n\n")
# it is recommeded then to operate the renumbering only at the end of the
# pre-processing
outfile = os.path.join(tempfile.gettempdir(), "renum.i")
newinp.write(outfile)

print("but the renumbering correctly happens when dumped:\n")
with open(outfile, "r") as infile:
    for i, line in enumerate(infile):
        print(line.strip("\n"))
        if i > 20:
            break
keys are not modified by renumbering:
dict_keys(['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', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106'])



but the renumbering correctly happens when dumped:

ITER 1D
c  -use endfb8.0 with ljj builds of mcnp6
c 
c  mcnp6.mpi n=inp173 
c 
c        bohm edits
c             -added ebin to f14 photon flux tally
c 
c        Cells section:
101    0                -175 176 -121          imp:n,p=8388608
102     13  7.2058e-002  -175 176   121  -180   imp:n,p=8388608  
103     13  7.2058e-002  -175 176  180  -181   imp:n,p=8388608  
104     13  7.2058e-002  -175 176  181  -182   imp:n,p=4194304  
105     13  7.2058e-002  -175 176  182  -183   imp:n,p=4194304  
106     13  7.2058e-002  -175 176  183  -184   imp:n,p=2097152  
107     13  7.2058e-002  -175 176  184  -185   imp:n,p=2097152  
108     13  7.2058e-002  -175 176  185  -186   imp:n,p=1048576   
109     13  7.2058e-002  -175 176  186  -187   imp:n,p=1048576   
110    13  7.2058e-002  -175 176  187  -188   imp:n,p=524288 
111    13  7.2058e-002  -175 176  188  -189   imp:n,p=524288 
112    13  7.2058e-002  -175 176  189  -190   imp:n,p=262144  
113    13  7.2058e-002  -175 176  190  -191   imp:n,p=262144  
# keys can be updated if needed, it will cost a bit in term of performance
# this do not guarantee that all internal numjuggler parameters are also updated
newinp = deepcopy(inp)

# the renumber_all option can be useful
newinp.renumber(renum_all=1000, update_keys=True)
# when used like that, the keys of the dictionary will not be updated
print("now dict keys are also renumbered:")
print(newinp.cells.keys())
print("\n\n")
now dict keys are also renumbered:
dict_keys(['1001', '1002', '1003', '1004', '1005', '1006', '1007', '1008', '1009', '1010', '1011', '1012', '1013', '1014', '1015', '1016', '1017', '1018', '1019', '1020', '1021', '1022', '1023', '1024', '1025', '1026', '1027', '1028', '1029', '1030', '1031', '1032', '1033', '1034', '1035', '1036', '1037', '1038', '1039', '1040', '1041', '1042', '1043', '1044', '1045', '1046', '1047', '1048', '1049', '1050', '1051', '1052', '1053', '1054', '1055', '1056', '1057', '1058', '1059', '1060', '1061', '1062', '1063', '1064', '1065', '1066', '1067', '1068', '1069', '1070', '1071', '1072', '1073', '1074', '1075', '1076', '1077', '1078', '1079', '1080', '1081', '1082', '1083', '1084', '1085', '1086', '1087', '1088', '1089', '1090', '1091', '1092', '1093', '1094', '1095', '1096', '1097', '1098', '1099', '1100', '1101', '1102', '1103', '1104', '1105', '1106'])

The ability to renumber is often connected by the ability to merge two different mcnp inputs into a single one. A check is made to not duplicate the ID of cells, surfaces, materials or transformations. All other cards, if with duplicated ID, will be the ones of inp2 in the example below

# just for the sake of the example, the same but renumbered input is merged
inp1 = deepcopy(inp)
print(f"original cells: {len(inp1.cells)}, original surfs: {len(inp1.surfs)}")
inp2 = deepcopy(inp)

inp2.renumber(renum_all=1000, update_keys=True)
inp1.merge(inp2)
print(f"merged cells: {len(inp1.cells)}, original surfs: {len(inp1.surfs)}")
original cells: 106, original surfs: 107
merged cells: 212, original surfs: 214

Hash and Cut#

Sometimes it may be useful to cut certain cells with a surface or hash them with a cell.

# cut the cell with a surface
newinp = deepcopy(inp)
cell = newinp.cells["2"]
print(f"original cell:\n{cell.card()}")
Input.add_surface(cell, 3, inplace=True)
print(f"cell after cut:\n{cell.card()}")
original cell:
2     13  7.2058e-002  -55 56   1  -60   imp:n,p=8388608  

cell after cut:
2 13 7.2058e-002 ( -55 56 1 -60 ) 3 imp:n,p=8388608
# hash a cell with a surface
newinp = deepcopy(inp)
cell = newinp.cells["2"]
print(f"original cell:\n{cell.card()}")
Input.hash_cell(cell, 3, inplace=True)
print(f"cell after hash:\n{cell.card()}")

# it is also possible to hash multiple cells at once, this is always done inplace
print("multiple hashes:")
hashes = {1: [3, 4], 2: [6]}
newinp = deepcopy(inp)
newinp.hash_multiple_cells(hashes)
for id in [3, 4, 6]:
    print(newinp.cells[str(id)].card())
original cell:
2     13  7.2058e-002  -55 56   1  -60   imp:n,p=8388608  

cell after hash:
2 13 7.2058e-002 ( -55 56 1 -60 ) #3  imp:n,p=8388608

multiple hashes:
3 13 7.2058e-002 ( -55 56 60 -61 ) #1  imp:n,p=8388608

4 13 7.2058e-002 ( -55 56 61 -62 ) #1  imp:n,p=4194304

6 13 7.2058e-002 ( -55 56 63 -64 ) #2  imp:n,p=2097152

Working with tallies#

Get an implemented tallies summary#

When producing a report, it can be useful to have a summary of the tallies defined in the input

# Normal tallies
inp.get_tally_summary()
Particle Description Normalization Other multipliers
Tally
4 N Neutrons Flux (energy binned) [#/cm^2] 1.222e21 NaN
6 NP Total Nuclear Heating [W/g] 1.9577e8 NaN
14 P Photons Flux (energy binned) [#/cm^2] 1.222e21 NaN
16 N Neutron Heating [W/g] 1.9577e8 NaN
24 N Fe dpa/FPY 3.8566e8 [16, 444]
26 P Gamma Heating [W/g] 1.9577e8 NaN
34 N He in 316SS appm/FPY 3.8566e10 [11, (207:206)]
44 N H in 316SS appm/FPY 3.8566e10 [11, (203:204:205)]
54 N T in 316SS appm/FPY 3.8566e10 [11, 205]
64 N Cu dpa/FPY 3.8566e8 [2, 444]
74 N He in CuBeNi appm/FPY 3.8566e10 [8, (207:206)]
84 N H in CuBeNi appm/FPY 3.8566e10 [8, (203:204:205)]
94 N T in CuBeNi appm/FPY 3.8566e10 [8, 205]
104 N Ni dpa/FPY 3.8566e8 [17, 444]
114 N He in Inconel appm/FPY 3.8566e10 [12, (207:206)]
124 N H in Inconel appm/FPY 3.8566e10 [12, (203:204:205)]
134 N T in Inconel appm/FPY 3.8566e10 [12, 205]
144 N He in Be appm/FPY 3.8566e10 [9, (207:206)]
154 N H in Be appm/FPY 3.8566e10 [9, (203:204:205)]
164 N T in Be appm/FPY 3.8566e10 [9, 205]
174 N fast (E>0.1 MeV) fluence at magnet n/cm2/FPY 3.8566e28 NaN
204 N Total Neutron Flux [#/cm^2] 1.222e21 NaN
214 P Total Photons Flux [#/cm^2] 1.222e21 NaN
# FMESHES
inp.get_tally_summary(fmesh=True)
Particle Description Normalization Other multipliers
Tally
1004 N Neutron Flux [#/cc/s] 1.222e21 NaN
1024 P Photon Flux [#/cc/s] 1.222e21 NaN

Adding new tallies#

Tallies are not explicitly handled with ad hoc object in F4Enix for the moment but the numjuggler cards can be accessed through the Input.other_data dictionary. Nevertheless, a method is provided to conveniently add ‘F’ tallies to an existing input

import numpy as np

newinput = deepcopy(inp)
cells = range(100, 150)  # whatever array of integers
energies = np.linspace(1e4, 1e5, 100)  # whatever array of floats
newinput.add_F_tally(
    4,  # ID of the tally
    ["N", "P"],  # particles to be tallied
    cells,  # either cells or surfaces ints to tally
    energies=energies,  # energies to tally (optional)
    description="Test F4 tally",  # description of the tally
    add_SD=True,  # add SD card equal 1 for each bin
    add_total=True,  # add total to the cell or surface bin
    multiplier="1 -52 1",  # multiplier for the tally
)

# shortcut to print the result, writing the input to a file would give the same
# result
for idx, card in newinput.other_data.items():
    # Even if FC, SD, E and FM are connected to F4 they are still stored as
    # separate cards
    if idx in ["F4", "FC4", "SD4", "E4", "FM4"]:
        print(card.card())
E4
     1.0000e+04 1.0909e+04 1.1818e+04 1.2727e+04 1.3636e+04 1.4545e+04
     1.5455e+04 1.6364e+04 1.7273e+04 1.8182e+04 1.9091e+04 2.0000e+04
     2.0909e+04 2.1818e+04 2.2727e+04 2.3636e+04 2.4545e+04 2.5455e+04
     2.6364e+04 2.7273e+04 2.8182e+04 2.9091e+04 3.0000e+04 3.0909e+04
     3.1818e+04 3.2727e+04 3.3636e+04 3.4545e+04 3.5455e+04 3.6364e+04
     3.7273e+04 3.8182e+04 3.9091e+04 4.0000e+04 4.0909e+04 4.1818e+04
     4.2727e+04 4.3636e+04 4.4545e+04 4.5455e+04 4.6364e+04 4.7273e+04
     4.8182e+04 4.9091e+04 5.0000e+04 5.0909e+04 5.1818e+04 5.2727e+04
     5.3636e+04 5.4545e+04 5.5455e+04 5.6364e+04 5.7273e+04 5.8182e+04
     5.9091e+04 6.0000e+04 6.0909e+04 6.1818e+04 6.2727e+04 6.3636e+04
     6.4545e+04 6.5455e+04 6.6364e+04 6.7273e+04 6.8182e+04 6.9091e+04
     7.0000e+04 7.0909e+04 7.1818e+04 7.2727e+04 7.3636e+04 7.4545e+04
     7.5455e+04 7.6364e+04 7.7273e+04 7.8182e+04 7.9091e+04 8.0000e+04
     8.0909e+04 8.1818e+04 8.2727e+04 8.3636e+04 8.4545e+04 8.5455e+04
     8.6364e+04 8.7273e+04 8.8182e+04 8.9091e+04 9.0000e+04 9.0909e+04
     9.1818e+04 9.2727e+04 9.3636e+04 9.4545e+04 9.5455e+04 9.6364e+04
      9.7273e+04 9.8182e+04 9.9091e+04 1.0000e+05 

FC4 Test F4 tally

F4:N,P
     100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
     117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
      134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 T 

FM4 1 -52 1

SD4 1 50R

You can also add a more complex cell definition in the tally as a string:

newinput = deepcopy(inp)
cells = [
    "((1 2 3 4 5 6) < 10)",
    12,
    "(((1 2 3 4 5 6) 18) < 11)",
    19,
    20,
    "((1 2 3 4 5 11) < 20)",
]  # whatever array of integers
energies = np.linspace(1e4, 1e5, 100)  # whatever array of floats
newinput.add_F_tally(
    14,  # ID of the tally
    ["N"],  # particles to be tallied
    cells,  # either cells or surfaces ints to tally
    description="Test F14 tally",  # description of the tally
    add_SD=True,  # add SD card equal 1 for each bin
    add_total=True,  # add total to the cell or surface bin
    multiplier="1 -52 1",  # multiplier for the tally
)

# shortcut to print the result, writing the input to a file would give the same
# result
for idx, card in newinput.other_data.items():
    # Even if FC, SD, E and FM are connected to F4 they are still stored as
    # separate cards
    if idx in ["F14", "FC14", "SD14", "E14", "FM14"]:
        print(card.card())
FC14 Test F14 tally

F14:N
     ((1 2 3 4 5 6) < 10) 12 (((1 2 3 4 5 6) 18) < 11) 19 20 ((1 2 3 4 5
      11) < 20) T 

FM14 1 -52 1

e14 .1 1 5 10 20 t

SD14 1 6R

Extract a sub-input#

Another capability implemented in the MCNP inputs is the possibility to extract a minimum working MCNP input given a set of cells. All transformation cards, surfaces, universes and material cards related to these cells will also be extracted. Cell definitions using the # operator are also supported.

cells_to_extract = [34, 35, 36]
outfile = os.path.join(tempfile.gettempdir(), "extracted.i")
inp.extract_cells(cells_to_extract, outfile)

with open(outfile, "r") as infile:
    for line in infile:
        print(line.strip("\n"))
ITER 1D
34   7   1.0028e-001  -55 56  10 -11     imp:n,p=64
35   11  8.5299e-002  -55 56  11 -12     imp:n,p=32
36   7   1.0028e-001  -55 56  12 -13     imp:n,p=32

10   cz 447.9 
11   cz 451   
12   cz 455.2 
13   cz 458.2 
*55   pz  1000.0
*56   pz -1000.0

c ------------------------------------------------------------------
C           o-------------------------------------------------------o
c           |    H2O                    
c           |                                                       |
c           |                                                       |
c           |    t.a.d. =   1.0028e-001                        M7   |
C           o-------------------------------------------------------o
c     
M7
       1001.31c        6.684830E-2     $        WEIGHT(%)  AB(%)     
       1002.31c        7.688440E-6     $        WEIGHT(%)  AB(%)     
c         8016.70c 3.34280E-02  $ O        (nat.)
       8016.31c        3.334680E-2     $        WEIGHT(%)  AB(%)     
       8017.31c        1.270260E-5     $        WEIGHT(%)  AB(%)     
       8018.31c        6.852740E-5     $        WEIGHT(%)  AB(%)     
	 plib=84p
c ------------------------------------------------------------------
c           o-------------------------------------------------------o
C           |     S.S. 316L(N)-IG.....100 %                         |   
c           |                                                       | 
c           |     t.a.d.  = 8.5299e-002                       M11   |
C           o-------------------------------------------------------o
c
c
M11
       5010.31c        8.707160E-7     $        WEIGHT(%)  AB(%)     
       5011.31c        3.504740E-6     $        WEIGHT(%)  AB(%)     
c         6012.21c 7.08895E-05  $ C    (nat.)
       6012.31c        7.013100E-5     $        WEIGHT(%)  AB(%)     
       6013.31c        7.585180E-7     $        WEIGHT(%)  AB(%)     
c         7014.21c 2.36402E-04  $ N    (nat.)
       7014.31c        2.355410E-4     $        WEIGHT(%)  AB(%)     
       7015.31c        8.605030E-7     $        WEIGHT(%)  AB(%)     
c         8016.70c 5.89895E-06  $ O    (nat.)
       8016.31c        5.884620E-6     $        WEIGHT(%)  AB(%)     
       8017.31c        2.241600E-9     $        WEIGHT(%)  AB(%)     
       8018.31c        1.209280E-8     $        WEIGHT(%)  AB(%)     
      13027.31c        5.259500E-4     $        WEIGHT(%)  AB(%)     
      14028.31c        7.145600E-4     $        WEIGHT(%)  AB(%)     
      14029.31c        3.628300E-5     $        WEIGHT(%)  AB(%)     
      14030.31c        2.391800E-5     $        WEIGHT(%)  AB(%)     
      15031.31c        3.970720E-5     $        WEIGHT(%)  AB(%)     
c        16000.21c 1.47526E-05  $ S    (nat.)
      16032.31c        1.401790E-5     $        WEIGHT(%)  AB(%)     
      16033.31c        1.106450E-7     $        WEIGHT(%)  AB(%)     
      16034.31c        6.210840E-7     $        WEIGHT(%)  AB(%)     
      16036.31c        2.950520E-9     $        WEIGHT(%)  AB(%)     
c        19000.21c 6.04926E-07  $ K    (nat.)
      19039.31c        5.641540E-7     $        WEIGHT(%)  AB(%)     
      19040.31c       6.049260E-11     $        WEIGHT(%)  AB(%)     
      19041.31c        4.071150E-8     $        WEIGHT(%)  AB(%)     
      22046.31c        3.260400E-6     $        WEIGHT(%)  AB(%)     
      22047.31c        2.940200E-6     $        WEIGHT(%)  AB(%)     
      22048.31c        2.913400E-5     $        WEIGHT(%)  AB(%)     
      22049.31c        2.138000E-6     $        WEIGHT(%)  AB(%)     
      22050.31c        2.047100E-6     $        WEIGHT(%)  AB(%)     
c        23000.21c 3.71431E-06  $ V    (nat.)
      23050.31c        9.285780E-9     $        WEIGHT(%)  AB(%)     
      23051.31c        3.705020E-6     $        WEIGHT(%)  AB(%)     
      24050.31c        6.689300E-4     $        WEIGHT(%)  AB(%)     
      24052.31c        1.303600E-2     $        WEIGHT(%)  AB(%)     
      24053.31c        1.493400E-3     $        WEIGHT(%)  AB(%)     
      24054.31c        3.733600E-4     $        WEIGHT(%)  AB(%)     
      25055.31c        1.463750E-3     $        WEIGHT(%)  AB(%)     
      26054.31c        3.165200E-3     $        WEIGHT(%)  AB(%)     
      26056.31c        5.004400E-2     $        WEIGHT(%)  AB(%)     
      26057.31c        1.200600E-3     $        WEIGHT(%)  AB(%)     
      26058.31c        1.637200E-4     $        WEIGHT(%)  AB(%)     
      27059.31c        2.407970E-5     $        WEIGHT(%)  AB(%)     
      28058.31c        7.202200E-3     $        WEIGHT(%)  AB(%)     
      28060.31c        2.787300E-3     $        WEIGHT(%)  AB(%)     
      28061.31c        1.383000E-4     $        WEIGHT(%)  AB(%)     
      28062.31c        3.829800E-4     $        WEIGHT(%)  AB(%)     
      28064.31c        1.276600E-4     $        WEIGHT(%)  AB(%)     
      29063.31c        5.147510E-5     $        WEIGHT(%)  AB(%)     
      29065.31c        2.296460E-5     $        WEIGHT(%)  AB(%)     
c        40000.21c 1.03708E-06  $ Zr-nat.
      40090.31c        5.335780E-7     $        WEIGHT(%)  AB(%)     
      40091.31c        1.163600E-7     $        WEIGHT(%)  AB(%)     
      40092.31c        1.778590E-7     $        WEIGHT(%)  AB(%)     
      40094.31c        1.802450E-7     $        WEIGHT(%)  AB(%)     
      40096.31c        2.903820E-8     $        WEIGHT(%)  AB(%)     
      41093.31c        1.018300E-6     $        WEIGHT(%)  AB(%)     
      42092.31c        1.829400E-4     $        WEIGHT(%)  AB(%)     
      42094.31c        1.140300E-4     $        WEIGHT(%)  AB(%)     
      42095.31c        1.962500E-4     $        WEIGHT(%)  AB(%)     
      42096.31c        2.056200E-4     $        WEIGHT(%)  AB(%)     
      42097.31c        1.177300E-4     $        WEIGHT(%)  AB(%)     
      42098.31c        2.974600E-4     $        WEIGHT(%)  AB(%)     
      42100.31c        1.187100E-4     $        WEIGHT(%)  AB(%)     
c        50000.21c 7.96952E-07  $ Sn   (nat.)
      50112.31c        7.730430E-9     $        WEIGHT(%)  AB(%)     
      50114.31c        5.259880E-9     $        WEIGHT(%)  AB(%)     
      50115.31c        2.709640E-9     $        WEIGHT(%)  AB(%)     
      50116.31c        1.158770E-7     $        WEIGHT(%)  AB(%)     
      50117.31c        6.120590E-8     $        WEIGHT(%)  AB(%)     
      50118.31c        1.930220E-7     $        WEIGHT(%)  AB(%)     
      50119.31c        6.845820E-8     $        WEIGHT(%)  AB(%)     
      50120.31c        2.596470E-7     $        WEIGHT(%)  AB(%)     
      50122.31c        3.689890E-8     $        WEIGHT(%)  AB(%)     
      50124.31c        4.614350E-8     $        WEIGHT(%)  AB(%)     
      73181.31c        1.307090E-7     $        WEIGHT(%)  AB(%)     
      74180.31c       3.083810E-10     $        WEIGHT(%)  AB(%)     
      74182.31c        6.810080E-8     $        WEIGHT(%)  AB(%)     
      74183.31c        3.677440E-8     $        WEIGHT(%)  AB(%)     
      74184.31c        7.873990E-8     $        WEIGHT(%)  AB(%)     
      74186.31c        7.306060E-8     $        WEIGHT(%)  AB(%)     
      82204.31c        2.556720E-9     $        WEIGHT(%)  AB(%)     
      82206.31c        4.401210E-8     $        WEIGHT(%)  AB(%)     
      82207.31c        4.035970E-8     $        WEIGHT(%)  AB(%)     
      82208.31c        9.569450E-8     $        WEIGHT(%)  AB(%)     
      83209.31c        1.810820E-7     $        WEIGHT(%)  AB(%)     
	 plib=84p
c
c       o-----------------------------------------------------------------o
c       |               s o u r c e  d e s c r i p t i o n                |
c       o-----------------------------------------------------------------o
sdef  erg=d1  cel=51   x=d2 y=d3 z=d4   wgt=1
c
c    Source probability function for energy sampling:
c    Muir velocity Gaussian energy spectrum (DT fusion at 10 keV):
sp1   -6
c    Coordinates sampling (x,y,z):
si2    -1115.2  1115.2
sp2      0    1
c
si3    -1115.2  1115.2
sp3      0    1
c
si4    -1000.2  1000.2
sp4      0    1
c
c void
c   --------------------------------------------------------------
c               source for volume calculations
c sdef  erg=14.1 sur=57 nrm=-1 wgt=2.82743e+7
c   --------------------------------------------------------------
c 
mode    n p
c 
c phys:n  20 1e-8
c change phys card for mcnp6
phys:n  100 1e-8 $ change emax to default 100 MeV
c  phys:p  20 1
cut:n   j j -0.5 -0.25 j
c
c vol:n  106j
c  -----------------------------
C    TALLY ENERGY CARD VITAMIN-J 175-group structure                       
C                                            
E4    1.00001E-07 4.13994E-07 5.31579E-07 6.82560E-07 8.76425E-07
      1.12535E-06 1.44498E-06 1.85539E-06 2.38237E-06 3.05902E-06
      3.92786E-06 5.04348E-06 6.47595E-06 8.31529E-06 1.06770E-05
      1.37096E-05 1.76035E-05 2.26033E-05 2.90232E-05 3.72665E-05
      4.78512E-05 6.14421E-05 7.88932E-05 1.01301E-04 1.30073E-04
      1.67017E-04 2.14454E-04 2.75364E-04 3.53575E-04 4.53999E-04
      5.82947E-04 7.48518E-04 9.61117E-04 1.23410E-03 1.58461E-03
      2.03468E-03 2.24867E-03 2.48517E-03 2.61259E-03 2.74654E-03
      3.03539E-03 3.35463E-03 3.70744E-03 4.30742E-03 5.53084E-03
      7.10174E-03 9.11882E-03 1.05946E-02 1.17088E-02 1.50344E-02
      1.93045E-02 2.18749E-02 2.35786E-02 2.41755E-02 2.47875E-02
      2.60584E-02 2.70001E-02 2.85011E-02 3.18278E-02 3.43067E-02
      4.08677E-02 4.63092E-02 5.24752E-02 5.65622E-02 6.73795E-02
      7.20245E-02 7.94987E-02 8.25034E-02 8.65170E-02 9.80365E-02
      1.11090E-01 1.16786E-01 1.22773E-01 1.29068E-01 1.35686E-01
      1.42642E-01 1.49956E-01 1.57644E-01 1.65727E-01 1.74224E-01
      1.83156E-01 1.92547E-01 2.02419E-01 2.12797E-01 2.23708E-01
      2.35177E-01 2.47235E-01 2.73237E-01 2.87246E-01 2.94518E-01
      2.97211E-01 2.98491E-01 3.01974E-01 3.33733E-01 3.68832E-01
      3.87742E-01 4.07622E-01 4.50492E-01 4.97871E-01 5.23397E-01
      5.50232E-01 5.78443E-01 6.08101E-01 6.39279E-01 6.72055E-01
      7.06512E-01 7.42736E-01 7.80817E-01 8.20850E-01 8.62936E-01
      9.07180E-01 9.61672E-01 1.00259E+00 1.10803E+00 1.16484E+00
      1.22456E+00 1.28735E+00 1.35335E+00 1.42274E+00 1.49569E+00
      1.57237E+00 1.65299E+00 1.73774E+00 1.82684E+00 1.92050E+00
      2.01897E+00 2.12248E+00 2.23130E+00 2.30693E+00 2.34570E+00
      2.36533E+00 2.38513E+00 2.46597E+00 2.59240E+00 2.72532E+00
      2.86505E+00 3.01194E+00 3.16637E+00 3.32871E+00 3.67879E+00
      4.06570E+00 4.49329E+00 4.72367E+00 4.96585E+00 5.22046E+00
      5.48812E+00 5.76950E+00 6.06531E+00 6.37628E+00 6.59241E+00
      6.70320E+00 7.04688E+00 7.40818E+00 7.78801E+00 8.18731E+00
      8.60708E+00 9.04837E+00 9.51229E+00 1.00000E+01 1.05127E+01
      1.10517E+01 1.16183E+01 1.22140E+01 1.25232E+01 1.28403E+01
      1.34986E+01 1.38403E+01 1.41907E+01 1.45499E+01 1.49182E+01
      1.56831E+01 1.64872E+01 1.69046E+01 1.73325E+01 1.96403E+01
C 
c   --------------------------------------------------------------------
fc4  Neutrons Flux (energy binned) [#/cm^2]
f4:n
                 2 3  4  5  6  
                 7  8  9  10 11 
                 12 13 14 15 16 
                 17 18 19 20 21 
                 22 24 25 26 27 
                 28 29 30 31 33 
                 34 35 36 37 38 
                 39 40 41 42 43 
                 44 45 46 47 48 
                 49 53 54 55 56 
                 57 58 59 60 61 
                 62 63 64 65 66 
                 67 68 69 71 72 
                 73 74 75 76 77 
                 78 79 80 81 82 
                 83 85 86 87 88 
                 89 90 91 92 93 
                 94  95  96  97  98 
                 99  100 101 102 103
                 104 105
fm4   1.222e21
c      ----------------------------------           
c
fc204  Total Neutron Flux [#/cm^2]
f204:n
                 2 3  4  5  6  
                 7  8  9  10 11 
                 12 13 14 15 16 
                 17 18 19 20 21 
                 22 24 25 26 27 
                 28 29 30 31 33 
                 34 35 36 37 38 
                 39 40 41 42 43 
                 44 45 46 47 48 
                 49 53 54 55 56 
                 57 58 59 60 61 
                 62 63 64 65 66 
                 67 68 69 71 72 
                 73 74 75 76 77 
                 78 79 80 81 82 
                 83 85 86 87 88 
                 89 90 91 92 93 
                 94  95  96  97  98 
                 99  100 101 102 103
                 104 105
fm204   1.222e21
c      ----------------------------------           
c
fc14  Photons Flux (energy binned) [#/cm^2]
f14:p
                  2 3  4  5  6 
                  7  8  9  10 11
                  12 13 14 15 16
                  17 18 19 20 21
                  22 24 25 26 27
                  28 29 30 31 33
                  34 35 36 37 38
                  39 40 41 42 43
                  44 45 46 47 48
                  49 53 54 55 56
                  57 58 59 60 61
                  62 63 64 65 66
                  67 68 69 71 72
                  73 74 75 76 77
                  78 79 80 81 82
                  83 85 86 87 88
                  89 90 91 92 93
                  94  95  96  97  98 
                  99  100 101 102 103
                  104 105
fm14   1.222e21
e14 .1 1 5 10 20 t
fq14 f e $ change tally printout cell/surf down,ebins across top
c      ---------------------------------
c
fc214  Total Photons Flux [#/cm^2]
f214:p
                  2 3  4  5  6 
                  7  8  9  10 11
                  12 13 14 15 16
                  17 18 19 20 21
                  22 24 25 26 27
                  28 29 30 31 33
                  34 35 36 37 38
                  39 40 41 42 43
                  44 45 46 47 48
                  49 53 54 55 56
                  57 58 59 60 61
                  62 63 64 65 66
                  67 68 69 71 72
                  73 74 75 76 77
                  78 79 80 81 82
                  83 85 86 87 88
                  89 90 91 92 93
                  94  95  96  97  98 
                  99  100 101 102 103
                  104 105
fm214   1.222e21
c      ---------------------------------
c
fc6   Total Nuclear Heating [W/g]
f6:np
                  2 3  4  5  6 
                  7  8  9  10 11
                  12 13 14 15 16
                  17 18 19 20 21
                  22 24 25 26 27
                  28 29 30 31 33
                  34 35 36 37 38
                  39 40 41 42 43
                  44 45 46 47 48
                  49 53 54 55 56
                  57 58 59 60 61
                  62 63 64 65 66
                  67 68 69 71 72
                  73 74 75 76 77
                  78 79 80 81 82
                  83 85 86 87 88
                  89 90 91 92 93
                  94  95  96  97  98 
                  99  100 101 102 103
                  104 105
fm6   1.9577e8
c      -----------------------------
fc16   Neutron Heating [W/g]
f16:n
                 2 3  4  5  6 
                 7  8  9  10 11
                 12 13 14 15 16
                 17 18 19 20 21
                 22 24 25 26 27
                 28 29 30 31 33
                 34 35 36 37 38
                 39 40 41 42 43
                 44 45 46 47 48
                 49 53 54 55 56
                 57 58 59 60 61
                 62 63 64 65 66
                 67 68 69 71 72
                 73 74 75 76 77
                 78 79 80 81 82
                 83 85 86 87 88
                 89 90 91 92 93
                 94  95  96  97  98 
                 99  100 101 102 103
                 104 105
fm16   1.9577e8
c        --------------------------
fc26   Gamma Heating [W/g]
f26:p
                  2 3  4  5  6 
                  7  8  9  10 11
                  12 13 14 15 16
                  17 18 19 20 21
                  22 24 25 26 27
                  28 29 30 31 33
                  34 35 36 37 38
                  39 40 41 42 43
                  44 45 46 47 48
                  49 53 54 55 56
                  57 58 59 60 61
                  62 63 64 65 66
                  67 68 69 71 72
                  73 74 75 76 77
                  78 79 80 81 82
                  83 85 86 87 88
                  89 90 91 92 93
                  94  95  96  97  98 
                  99  100 101 102 103
                  104 105
fm26   1.9577e8
c    -------------------------------
fc24   Fe dpa/FPY
f24:n   47 
        45 43 41 39 37 35 33 
        26 30 29 28 27
        21
        55
        57 59 61 63 65 67 69
        72 73 74 75 76 77 78 79 80 81
        86
fm24   3.8566e8   16 444
c      ------------------------------
fc34   He in 316SS appm/FPY
f34:n   47
        45 43 41 39 37 35 33
        26 30 29 28 27
        21
        55
        57 59 61 63 65 67 69
        72 73 74 75 76 77 78 79 80 81
        86
fm34   3.8566e10   11 (207:206)
c   ----------------------------------
fc44   H in 316SS appm/FPY
f44:n   47
        45 43 41 39 37 35 33
        26 30 29 28 27
        21
        55
        57 59 61 63 65 67 69
        72 73 74 75 76 77 78 79 80 81
        86
fm44   3.8566e10   11  (203:204:205)
c   ----------------------------------
fc54   T in 316SS appm/FPY
f54:n   47
        45 43 41 39 37 35 33
        26 30 29 28 27
        21
        55
        57 59 61 63 65 67 69
        72 73 74 75 76 77 78 79 80 81
        86
fm54   3.8566e10   11 205
c     -------------------------------
fc64   Cu dpa/FPY
f64:n  48 21 54 86
fm64   3.8566e8   2 444
c      ------------------------------
fc74   He in CuBeNi appm/FPY
f74:n   48 21 54 86
fm74   3.8566e10   8 (207:206)
c   ----------------------------------
fc84   H in CuBeNi appm/FPY
f84:n   48 21 54 86
fm84   3.8566e10   8  (203:204:205)
c   ----------------------------------
fc94   T in CuBeNi appm/FPY
f94:n   48 21 54 86
fm94   3.8566e10   8 205
c    ________________________________
fc104   Ni dpa/FPY
f104:n  31 25 71 82
fm104   3.8566e8   17 444
c      ------------------------------
fc114   He in Inconel appm/FPY
f114:n   31 25 71 82
fm114   3.8566e10   12 (207:206)
c   ----------------------------------
fc124   H in Inconel appm/FPY
f124:n   31 25 71 82
fm124   3.8566e10   12  (203:204:205)
c   ----------------------------------
fc134   T in Inconel appm/FPY
f134:n   31 25 71 82
fm134   3.8566e10   12 205
c    ________________________________
fc144   He in Be appm/FPY
f144:n   49 53
fm144   3.8566e10   9 (207:206)
c   ----------------------------------
fc154   H in Be appm/FPY
f154:n   49 53
fm154   3.8566e10   9  (203:204:205)
c   ----------------------------------
fc164   T in Be appm/FPY
f164:n   49 53
fm164   3.8566e10   9 205
c    ________________________________
fc174   fast (E>0.1 MeV) fluence at magnet n/cm2/FPY
f174:n  21 86
e174    0.1 20
fm174   3.8566e28
c     ------------------------------
C
FC1004  Neutron Flux [#/cc/s]
FMESH1004:N GEOM=XYZ ORIGIN=-1300 -1300 -900
                    IMESH=1300   IINTS=130
                        JMESH=1300   JINTS=130
                        KMESH=900    KINTS= 90
FM1004   1.222e21
C
C
FC1024  Photon Flux [#/cc/s]
FMESH1024:P GEOM=XYZ ORIGIN=-1300 -1300 -900
                    IMESH=1300   IINTS=130
                        JMESH=1300   JINTS=130
                        KMESH=900    KINTS= 90
FM1024   1.222e21
C
print  110
c original nps,prdmp 
c BW added 110 above                   
c prdmp  100000 100000 1 1 100000
c BW changed above NDM from 1000000 to 500000       
c nps    500000  
C BW originally was 100000
c ctme   1000
c BW commented out line above =computer time cutoff
c 
rand gen=1 seed=19073486328213 $ change random number seed (default ends in 5)
c 
c nps 160e6             $ number of particles
prdmp j 16e6 1 1 $ write mctal,save only the last dump 
NPS 1e7 

The extract_universe method allows the creation of a new MCNP input with the selected universe. The universe keywords will be erased from the cell definitions.

inp_universes = Input.from_input("test_universe.i")
# both extract_universe() and extract_cells() also allow to renumber cards
# the arguments are the same as for the renumber() function
offset_dict = {"cells": 100, "surfs": 150}
outfile = os.path.join(tempfile.gettempdir(), "extracted_universe.i")
inp_universes.extract_universe(125, outfile, renumber_offsets=offset_dict)
with open(outfile, "r") as infile:
    for line in infile:
        print(line.strip("\n"))
Title
C
c Universe level 1
121 4 -1.0 -171 imp:n=1    
122 0      -172 imp:n=1    
399 0 #121 #122    imp:n=1    

171 SX 25 10
172 SX -25 10

M4
       2003.31c        2.460820E-8     $        WEIGHT(%)  AB(%)     
       2004.31c        1.836430E-2     $        WEIGHT(%)  AB(%)     
C Data cards section
sdef pos 0 0 0

Get info summaries on input cells#

It is possible to print a summary of the cells defined in the input that reports the material, density universe and filler

inp_universes.get_cells_summary()
material density universe filler
cell
1 0 0.0 NaN 125.0
21 4 -1.0 125.0 NaN
22 0 0.0 125.0 NaN
99 0 0.0 NaN NaN
299 0 0.0 125.0 NaN

Or even get a summary of the range of densities used for the different materials. All densities are converted to g/cc.

inp.get_densities_range()
Min density [g/cc] Max density [g/cc]
Material ID
1 1.900794 1.900794
7 0.999978 0.999978
8 8.875125 8.875125
11 7.856840 7.856840
12 8.284558 8.284558
13 5.944160 5.944160
14 3.446482 3.446482
15 5.114038 5.114038
74 1.820000 1.820000

Miscellaneous#

Deal with FENDL3.1d faulty isotopes#

FENDL3.1 has some faulty isotopes that produce negative heating. F4Enix conveniently stores these isotopes in a global variable for the user to easily translate them in another library

from f4enix.core.constants import FAULTY_ISOTOPES

newinp = deepcopy(inp)
# first of all collect all the zaids that are present in the input and not in
# the faulty isotopes
other_zaids = []
for material in newinp.materials:
    for submaterial in material.submaterials:
        for zaid in submaterial.zaidList:
            zaidnum = zaid.element + zaid.isotope
            if zaidnum not in FAULTY_ISOTOPES:
                other_zaids.append(zaidnum)
newinp.translate({"21c": FAULTY_ISOTOPES, "31c": other_zaids}, libmanager)

Prepare a void check#

You can prepare an input for a void check calculation: the function sets the mode to void, sets the input spherical surface as source and assigns the proper weigth to the source. It will run the NPS set by the user.

from numjuggler import parser

newinp = deepcopy(inp)

# Create a spherical surface for the void check
sphere = parser.Card(["12345 SO 100\n"], 4, -1)
sphere.get_values()

newinp.prepare_void_check(sphere, 1e6)

print(newinp.other_data["SDEF"].card())
SDEF PAR=N NRM=-1 SUR=12345 WGT=31415.926535897932 DIR=d1

Get formatted cell or surface id ranges#

from f4enix.input.MCNPinput import get_formatted_range

print(get_formatted_range([21, 22, 23] + list(range(25, 100))))
21 22 23 25 73I 99