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/stable/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 0x7f0bb66d4190>, '2': <numjuggler.parser.Card object at 0x7f0bb66d4970>, '3': <numjuggler.parser.Card object at 0x7f0bb66d7ee0>, '4': <numjuggler.parser.Card object at 0x7f0b80527130>, '5': <numjuggler.parser.Card object at 0x7f0b80526f20>, '6': <numjuggler.parser.Card object at 0x7f0b80526f50>, '7': <numjuggler.parser.Card object at 0x7f0b80526fe0>, '8': <numjuggler.parser.Card object at 0x7f0b805270a0>, '9': <numjuggler.parser.Card object at 0x7f0b805270d0>, '10': <numjuggler.parser.Card object at 0x7f0b80527190>, '11': <numjuggler.parser.Card object at 0x7f0b80527100>, '12': <numjuggler.parser.Card object at 0x7f0b805271c0>, '13': <numjuggler.parser.Card object at 0x7f0b805271f0>, '14': <numjuggler.parser.Card object at 0x7f0b80527220>, '15': <numjuggler.parser.Card object at 0x7f0b80527250>, '16': <numjuggler.parser.Card object at 0x7f0b80527280>, '17': <numjuggler.parser.Card object at 0x7f0b805272b0>, '18': <numjuggler.parser.Card object at 0x7f0b805272e0>, '19': <numjuggler.parser.Card object at 0x7f0b80527310>, '20': <numjuggler.parser.Card object at 0x7f0b80527340>, '21': <numjuggler.parser.Card object at 0x7f0b80527370>, '22': <numjuggler.parser.Card object at 0x7f0b805273a0>, '23': <numjuggler.parser.Card object at 0x7f0b805273d0>, '24': <numjuggler.parser.Card object at 0x7f0b80527400>, '25': <numjuggler.parser.Card object at 0x7f0b80527430>, '26': <numjuggler.parser.Card object at 0x7f0b80527460>, '27': <numjuggler.parser.Card object at 0x7f0b80527490>, '28': <numjuggler.parser.Card object at 0x7f0b805274c0>, '29': <numjuggler.parser.Card object at 0x7f0b805274f0>, '30': <numjuggler.parser.Card object at 0x7f0b80527520>, '31': <numjuggler.parser.Card object at 0x7f0b80527550>, '32': <numjuggler.parser.Card object at 0x7f0b80527580>, '33': <numjuggler.parser.Card object at 0x7f0b805275b0>, '34': <numjuggler.parser.Card object at 0x7f0b805275e0>, '35': <numjuggler.parser.Card object at 0x7f0b80527610>, '36': <numjuggler.parser.Card object at 0x7f0b80527640>, '37': <numjuggler.parser.Card object at 0x7f0b80527670>, '38': <numjuggler.parser.Card object at 0x7f0b805276a0>, '39': <numjuggler.parser.Card object at 0x7f0b805276d0>, '40': <numjuggler.parser.Card object at 0x7f0b80527700>, '41': <numjuggler.parser.Card object at 0x7f0b80527730>, '42': <numjuggler.parser.Card object at 0x7f0b80527760>, '43': <numjuggler.parser.Card object at 0x7f0b80527790>, '44': <numjuggler.parser.Card object at 0x7f0b805277c0>, '45': <numjuggler.parser.Card object at 0x7f0b805277f0>, '46': <numjuggler.parser.Card object at 0x7f0b80527820>, '47': <numjuggler.parser.Card object at 0x7f0b80527850>, '48': <numjuggler.parser.Card object at 0x7f0b80527880>, '49': <numjuggler.parser.Card object at 0x7f0b805278b0>, '50': <numjuggler.parser.Card object at 0x7f0b805278e0>, '51': <numjuggler.parser.Card object at 0x7f0b80527910>, '52': <numjuggler.parser.Card object at 0x7f0b80527940>, '53': <numjuggler.parser.Card object at 0x7f0b80527970>, '54': <numjuggler.parser.Card object at 0x7f0b805279a0>, '55': <numjuggler.parser.Card object at 0x7f0b805279d0>, '56': <numjuggler.parser.Card object at 0x7f0b80527a00>, '57': <numjuggler.parser.Card object at 0x7f0b80527a30>, '58': <numjuggler.parser.Card object at 0x7f0b80527a60>, '59': <numjuggler.parser.Card object at 0x7f0b80527a90>, '60': <numjuggler.parser.Card object at 0x7f0b80527ac0>, '61': <numjuggler.parser.Card object at 0x7f0b80527af0>, '62': <numjuggler.parser.Card object at 0x7f0b80527b20>, '63': <numjuggler.parser.Card object at 0x7f0b80527b50>, '64': <numjuggler.parser.Card object at 0x7f0b80527b80>, '65': <numjuggler.parser.Card object at 0x7f0b80527bb0>, '66': <numjuggler.parser.Card object at 0x7f0b80527be0>, '67': <numjuggler.parser.Card object at 0x7f0b80527c10>, '68': <numjuggler.parser.Card object at 0x7f0b80527c40>, '69': <numjuggler.parser.Card object at 0x7f0b80527c70>, '70': <numjuggler.parser.Card object at 0x7f0b80527ca0>, '71': <numjuggler.parser.Card object at 0x7f0b80527d00>, '72': <numjuggler.parser.Card object at 0x7f0b80527d30>, '73': <numjuggler.parser.Card object at 0x7f0b80527d60>, '74': <numjuggler.parser.Card object at 0x7f0b80527d90>, '75': <numjuggler.parser.Card object at 0x7f0b80527dc0>, '76': <numjuggler.parser.Card object at 0x7f0b80527df0>, '77': <numjuggler.parser.Card object at 0x7f0b80527e20>, '78': <numjuggler.parser.Card object at 0x7f0b80527e50>, '79': <numjuggler.parser.Card object at 0x7f0b80527e80>, '80': <numjuggler.parser.Card object at 0x7f0b80527eb0>, '81': <numjuggler.parser.Card object at 0x7f0b80527ee0>, '82': <numjuggler.parser.Card object at 0x7f0b80527f10>, '83': <numjuggler.parser.Card object at 0x7f0b80527f40>, '84': <numjuggler.parser.Card object at 0x7f0b80527f70>, '85': <numjuggler.parser.Card object at 0x7f0b80527fd0>, '86': <numjuggler.parser.Card object at 0x7f0b80564040>, '87': <numjuggler.parser.Card object at 0x7f0b80564070>, '88': <numjuggler.parser.Card object at 0x7f0b805640a0>, '89': <numjuggler.parser.Card object at 0x7f0b805640d0>, '90': <numjuggler.parser.Card object at 0x7f0b80564100>, '91': <numjuggler.parser.Card object at 0x7f0b80564130>, '92': <numjuggler.parser.Card object at 0x7f0b80564160>, '93': <numjuggler.parser.Card object at 0x7f0b80564190>, '94': <numjuggler.parser.Card object at 0x7f0b805641c0>, '95': <numjuggler.parser.Card object at 0x7f0b805641f0>, '96': <numjuggler.parser.Card object at 0x7f0b80564220>, '97': <numjuggler.parser.Card object at 0x7f0b80564250>, '98': <numjuggler.parser.Card object at 0x7f0b80564280>, '99': <numjuggler.parser.Card object at 0x7f0b805642b0>, '100': <numjuggler.parser.Card object at 0x7f0b805642e0>, '101': <numjuggler.parser.Card object at 0x7f0b80564310>, '102': <numjuggler.parser.Card object at 0x7f0b80564340>, '103': <numjuggler.parser.Card object at 0x7f0b80564370>, '104': <numjuggler.parser.Card object at 0x7f0b805643a0>, '105': <numjuggler.parser.Card object at 0x7f0b805643d0>, '106': <numjuggler.parser.Card object at 0x7f0b80564430>}
{'1': <numjuggler.parser.Card object at 0x7f0b80564490>, '60': <numjuggler.parser.Card object at 0x7f0b805644f0>, '61': <numjuggler.parser.Card object at 0x7f0b80564520>, '62': <numjuggler.parser.Card object at 0x7f0b80564550>, '63': <numjuggler.parser.Card object at 0x7f0b80564580>, '64': <numjuggler.parser.Card object at 0x7f0b805645b0>, '65': <numjuggler.parser.Card object at 0x7f0b805645e0>, '66': <numjuggler.parser.Card object at 0x7f0b80564610>, '67': <numjuggler.parser.Card object at 0x7f0b80564640>, '68': <numjuggler.parser.Card object at 0x7f0b80564670>, '69': <numjuggler.parser.Card object at 0x7f0b805646a0>, '70': <numjuggler.parser.Card object at 0x7f0b805646d0>, '71': <numjuggler.parser.Card object at 0x7f0b80564700>, '72': <numjuggler.parser.Card object at 0x7f0b80564730>, '73': <numjuggler.parser.Card object at 0x7f0b80564760>, '74': <numjuggler.parser.Card object at 0x7f0b80564790>, '75': <numjuggler.parser.Card object at 0x7f0b805647c0>, '76': <numjuggler.parser.Card object at 0x7f0b805647f0>, '77': <numjuggler.parser.Card object at 0x7f0b80564820>, '78': <numjuggler.parser.Card object at 0x7f0b80564850>, '2': <numjuggler.parser.Card object at 0x7f0b80564880>, '3': <numjuggler.parser.Card object at 0x7f0b805648b0>, '4': <numjuggler.parser.Card object at 0x7f0b805648e0>, '5': <numjuggler.parser.Card object at 0x7f0b80564910>, '6': <numjuggler.parser.Card object at 0x7f0b80564940>, '80': <numjuggler.parser.Card object at 0x7f0b80564970>, '81': <numjuggler.parser.Card object at 0x7f0b805649a0>, '82': <numjuggler.parser.Card object at 0x7f0b805649d0>, '83': <numjuggler.parser.Card object at 0x7f0b80564a00>, '7': <numjuggler.parser.Card object at 0x7f0b80564a30>, '8': <numjuggler.parser.Card object at 0x7f0b80564a60>, '9': <numjuggler.parser.Card object at 0x7f0b80564a90>, '10': <numjuggler.parser.Card object at 0x7f0b80564ac0>, '11': <numjuggler.parser.Card object at 0x7f0b80564af0>, '12': <numjuggler.parser.Card object at 0x7f0b80564b20>, '13': <numjuggler.parser.Card object at 0x7f0b80564b50>, '14': <numjuggler.parser.Card object at 0x7f0b80564b80>, '15': <numjuggler.parser.Card object at 0x7f0b80564bb0>, '16': <numjuggler.parser.Card object at 0x7f0b80564be0>, '17': <numjuggler.parser.Card object at 0x7f0b80564c10>, '18': <numjuggler.parser.Card object at 0x7f0b80564c40>, '19': <numjuggler.parser.Card object at 0x7f0b80564c70>, '20': <numjuggler.parser.Card object at 0x7f0b80564ca0>, '21': <numjuggler.parser.Card object at 0x7f0b80564cd0>, '22': <numjuggler.parser.Card object at 0x7f0b80564d00>, '23': <numjuggler.parser.Card object at 0x7f0b80564d30>, '24': <numjuggler.parser.Card object at 0x7f0b80564d60>, '25': <numjuggler.parser.Card object at 0x7f0b80564d90>, '26': <numjuggler.parser.Card object at 0x7f0b80564dc0>, '27': <numjuggler.parser.Card object at 0x7f0b80564df0>, '28': <numjuggler.parser.Card object at 0x7f0b80564e20>, '29': <numjuggler.parser.Card object at 0x7f0b80564e50>, '30': <numjuggler.parser.Card object at 0x7f0b80564e80>, '31': <numjuggler.parser.Card object at 0x7f0b80564eb0>, '32': <numjuggler.parser.Card object at 0x7f0b80564ee0>, '33': <numjuggler.parser.Card object at 0x7f0b80564f10>, '34': <numjuggler.parser.Card object at 0x7f0b80564f40>, '35': <numjuggler.parser.Card object at 0x7f0b80564f70>, '36': <numjuggler.parser.Card object at 0x7f0b80564fa0>, '37': <numjuggler.parser.Card object at 0x7f0b80564fd0>, '38': <numjuggler.parser.Card object at 0x7f0b80565000>, '39': <numjuggler.parser.Card object at 0x7f0b80565030>, '40': <numjuggler.parser.Card object at 0x7f0b80565060>, '41': <numjuggler.parser.Card object at 0x7f0b80565090>, '42': <numjuggler.parser.Card object at 0x7f0b805650c0>, '43': <numjuggler.parser.Card object at 0x7f0b805650f0>, '44': <numjuggler.parser.Card object at 0x7f0b80565120>, '45': <numjuggler.parser.Card object at 0x7f0b80565150>, '46': <numjuggler.parser.Card object at 0x7f0b80565180>, '47': <numjuggler.parser.Card object at 0x7f0b805651b0>, '48': <numjuggler.parser.Card object at 0x7f0b805651e0>, '84': <numjuggler.parser.Card object at 0x7f0b80565210>, '85': <numjuggler.parser.Card object at 0x7f0b80565240>, '86': <numjuggler.parser.Card object at 0x7f0b80565270>, '87': <numjuggler.parser.Card object at 0x7f0b805652a0>, '88': <numjuggler.parser.Card object at 0x7f0b805652d0>, '89': <numjuggler.parser.Card object at 0x7f0b80565300>, '90': <numjuggler.parser.Card object at 0x7f0b80565330>, '91': <numjuggler.parser.Card object at 0x7f0b80565360>, '92': <numjuggler.parser.Card object at 0x7f0b80565390>, '49': <numjuggler.parser.Card object at 0x7f0b805653c0>, '50': <numjuggler.parser.Card object at 0x7f0b805653f0>, '51': <numjuggler.parser.Card object at 0x7f0b80565420>, '52': <numjuggler.parser.Card object at 0x7f0b80565450>, '53': <numjuggler.parser.Card object at 0x7f0b80565480>, '93': <numjuggler.parser.Card object at 0x7f0b805654b0>, '94': <numjuggler.parser.Card object at 0x7f0b805654e0>, '95': <numjuggler.parser.Card object at 0x7f0b80565510>, '96': <numjuggler.parser.Card object at 0x7f0b80565540>, '97': <numjuggler.parser.Card object at 0x7f0b80565570>, '98': <numjuggler.parser.Card object at 0x7f0b805655a0>, '99': <numjuggler.parser.Card object at 0x7f0b805655d0>, '100': <numjuggler.parser.Card object at 0x7f0b80565600>, '101': <numjuggler.parser.Card object at 0x7f0b80565630>, '102': <numjuggler.parser.Card object at 0x7f0b80565660>, '103': <numjuggler.parser.Card object at 0x7f0b80565690>, '104': <numjuggler.parser.Card object at 0x7f0b805656c0>, '105': <numjuggler.parser.Card object at 0x7f0b805656f0>, '106': <numjuggler.parser.Card object at 0x7f0b80565720>, '107': <numjuggler.parser.Card object at 0x7f0b80565750>, '108': <numjuggler.parser.Card object at 0x7f0b80565780>, '109': <numjuggler.parser.Card object at 0x7f0b805657b0>, '110': <numjuggler.parser.Card object at 0x7f0b805657e0>, '111': <numjuggler.parser.Card object at 0x7f0b80565810>, '54': <numjuggler.parser.Card object at 0x7f0b80565840>, '*55': <numjuggler.parser.Card object at 0x7f0b80565870>, '*56': <numjuggler.parser.Card object at 0x7f0b805658a0>}
{'M1': <f4enix.input.materials.Material object at 0x7f0b7bb64760>, 'M2': <f4enix.input.materials.Material object at 0x7f0b7bb648b0>, 'M3': <f4enix.input.materials.Material object at 0x7f0b7bb64ee0>, 'M4': <f4enix.input.materials.Material object at 0x7f0b7bb65090>, 'M5': <f4enix.input.materials.Material object at 0x7f0b7bb65300>, 'M6': <f4enix.input.materials.Material object at 0x7f0b7bb655d0>, 'M7': <f4enix.input.materials.Material object at 0x7f0b7bb65960>, 'M8': <f4enix.input.materials.Material object at 0x7f0b7bb65e70>, 'M9': <f4enix.input.materials.Material object at 0x7f0b7bb65f60>, 'M10': <f4enix.input.materials.Material object at 0x7f0b7bb665f0>, 'M11': <f4enix.input.materials.Material object at 0x7f0b7bb89060>, 'M12': <f4enix.input.materials.Material object at 0x7f0b7bb8a3b0>, 'M13': <f4enix.input.materials.Material object at 0x7f0b7bba6b60>, 'M14': <f4enix.input.materials.Material object at 0x7f0b7bba70d0>, 'M15': <f4enix.input.materials.Material object at 0x7f0b7bbc5f00>, 'M16': <f4enix.input.materials.Material object at 0x7f0b7bbc6110>, 'M17': <f4enix.input.materials.Material object at 0x7f0b7bbc63e0>, 'M18': <f4enix.input.materials.Material object at 0x7f0b7bbc6650>, 'M19': <f4enix.input.materials.Material object at 0x7f0b7bbc67a0>, 'M20': <f4enix.input.materials.Material object at 0x7f0b7bbc6950>, 'M21': <f4enix.input.materials.Material object at 0x7f0b7bbc6ce0>, 'M74': <f4enix.input.materials.Material object at 0x7f0b7bbe9390>}
{}
{'SDEF': <numjuggler.parser.Card object at 0x7f0b80566170>, 'SP1': <numjuggler.parser.Card object at 0x7f0b805661d0>, 'SI2': <numjuggler.parser.Card object at 0x7f0b80566230>, 'SP2': <numjuggler.parser.Card object at 0x7f0b80566260>, 'SI3': <numjuggler.parser.Card object at 0x7f0b805662c0>, 'SP3': <numjuggler.parser.Card object at 0x7f0b805662f0>, 'SI4': <numjuggler.parser.Card object at 0x7f0b80566350>, 'SP4': <numjuggler.parser.Card object at 0x7f0b80566380>, 'MODE': <numjuggler.parser.Card object at 0x7f0b805663e0>, 'PHYS:N': <numjuggler.parser.Card object at 0x7f0b80566440>, 'CUT:N': <numjuggler.parser.Card object at 0x7f0b805664a0>, 'E4': <numjuggler.parser.Card object at 0x7f0b80566500>, 'FC4': <numjuggler.parser.Card object at 0x7f0b80566560>, 'F4': <numjuggler.parser.Card object at 0x7f0b80566590>, 'FM4': <numjuggler.parser.Card object at 0x7f0b805665c0>, 'FC204': <numjuggler.parser.Card object at 0x7f0b80566620>, 'F204': <numjuggler.parser.Card object at 0x7f0b80566650>, 'FM204': <numjuggler.parser.Card object at 0x7f0b80566680>, 'FC14': <numjuggler.parser.Card object at 0x7f0b805666e0>, 'F14': <numjuggler.parser.Card object at 0x7f0b80566710>, 'FM14': <numjuggler.parser.Card object at 0x7f0b80566740>, 'E14': <numjuggler.parser.Card object at 0x7f0b80566770>, 'FQ14': <numjuggler.parser.Card object at 0x7f0b805667a0>, 'FC214': <numjuggler.parser.Card object at 0x7f0b80566800>, 'F214': <numjuggler.parser.Card object at 0x7f0b80566830>, 'FM214': <numjuggler.parser.Card object at 0x7f0b80566860>, 'FC6': <numjuggler.parser.Card object at 0x7f0b805668c0>, 'F6': <numjuggler.parser.Card object at 0x7f0b805668f0>, 'FM6': <numjuggler.parser.Card object at 0x7f0b80566920>, 'FC16': <numjuggler.parser.Card object at 0x7f0b80566980>, 'F16': <numjuggler.parser.Card object at 0x7f0b805669b0>, 'FM16': <numjuggler.parser.Card object at 0x7f0b805669e0>, 'FC26': <numjuggler.parser.Card object at 0x7f0b80566a40>, 'F26': <numjuggler.parser.Card object at 0x7f0b80566a70>, 'FM26': <numjuggler.parser.Card object at 0x7f0b80566aa0>, 'FC24': <numjuggler.parser.Card object at 0x7f0b80566b00>, 'F24': <numjuggler.parser.Card object at 0x7f0b80566b30>, 'FM24': <numjuggler.parser.Card object at 0x7f0b80566b60>, 'FC34': <numjuggler.parser.Card object at 0x7f0b80566bc0>, 'F34': <numjuggler.parser.Card object at 0x7f0b80566bf0>, 'FM34': <numjuggler.parser.Card object at 0x7f0b80566c20>, 'FC44': <numjuggler.parser.Card object at 0x7f0b80566c80>, 'F44': <numjuggler.parser.Card object at 0x7f0b80566cb0>, 'FM44': <numjuggler.parser.Card object at 0x7f0b80566ce0>, 'FC54': <numjuggler.parser.Card object at 0x7f0b80566d40>, 'F54': <numjuggler.parser.Card object at 0x7f0b80566d70>, 'FM54': <numjuggler.parser.Card object at 0x7f0b80566da0>, 'FC64': <numjuggler.parser.Card object at 0x7f0b80566e00>, 'F64': <numjuggler.parser.Card object at 0x7f0b80566e30>, 'FM64': <numjuggler.parser.Card object at 0x7f0b80566e60>, 'FC74': <numjuggler.parser.Card object at 0x7f0b80566ec0>, 'F74': <numjuggler.parser.Card object at 0x7f0b80566ef0>, 'FM74': <numjuggler.parser.Card object at 0x7f0b80566f20>, 'FC84': <numjuggler.parser.Card object at 0x7f0b80566f80>, 'F84': <numjuggler.parser.Card object at 0x7f0b80566fb0>, 'FM84': <numjuggler.parser.Card object at 0x7f0b80566fe0>, 'FC94': <numjuggler.parser.Card object at 0x7f0b80567040>, 'F94': <numjuggler.parser.Card object at 0x7f0b80567070>, 'FM94': <numjuggler.parser.Card object at 0x7f0b805670a0>, 'FC104': <numjuggler.parser.Card object at 0x7f0b80567100>, 'F104': <numjuggler.parser.Card object at 0x7f0b80567130>, 'FM104': <numjuggler.parser.Card object at 0x7f0b80567160>, 'FC114': <numjuggler.parser.Card object at 0x7f0b805671c0>, 'F114': <numjuggler.parser.Card object at 0x7f0b805671f0>, 'FM114': <numjuggler.parser.Card object at 0x7f0b80567220>, 'FC124': <numjuggler.parser.Card object at 0x7f0b80567280>, 'F124': <numjuggler.parser.Card object at 0x7f0b805672b0>, 'FM124': <numjuggler.parser.Card object at 0x7f0b805672e0>, 'FC134': <numjuggler.parser.Card object at 0x7f0b80567340>, 'F134': <numjuggler.parser.Card object at 0x7f0b80567370>, 'FM134': <numjuggler.parser.Card object at 0x7f0b805673a0>, 'FC144': <numjuggler.parser.Card object at 0x7f0b80567400>, 'F144': <numjuggler.parser.Card object at 0x7f0b80567430>, 'FM144': <numjuggler.parser.Card object at 0x7f0b80567460>, 'FC154': <numjuggler.parser.Card object at 0x7f0b805674c0>, 'F154': <numjuggler.parser.Card object at 0x7f0b805674f0>, 'FM154': <numjuggler.parser.Card object at 0x7f0b80567520>, 'FC164': <numjuggler.parser.Card object at 0x7f0b80567580>, 'F164': <numjuggler.parser.Card object at 0x7f0b805675b0>, 'FM164': <numjuggler.parser.Card object at 0x7f0b805675e0>, 'FC174': <numjuggler.parser.Card object at 0x7f0b80567640>, 'F174': <numjuggler.parser.Card object at 0x7f0b80567670>, 'E174': <numjuggler.parser.Card object at 0x7f0b805676a0>, 'FM174': <numjuggler.parser.Card object at 0x7f0b805676d0>, 'FC1004': <numjuggler.parser.Card object at 0x7f0b80567730>, 'FMESH1004': <numjuggler.parser.Card object at 0x7f0b80567760>, 'FM1004': <numjuggler.parser.Card object at 0x7f0b80567790>, 'FC1024': <numjuggler.parser.Card object at 0x7f0b805677f0>, 'FMESH1024': <numjuggler.parser.Card object at 0x7f0b80567820>, 'FM1024': <numjuggler.parser.Card object at 0x7f0b80567850>, 'PRINT': <numjuggler.parser.Card object at 0x7f0b805678b0>, 'RAND': <numjuggler.parser.Card object at 0x7f0b80567910>, 'PRDMP': <numjuggler.parser.Card object at 0x7f0b80567970>, 'NPS': <numjuggler.parser.Card object at 0x7f0b805679a0>}
# 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 0x7f0bb66d4970>}
{'1': <numjuggler.parser.Card object at 0x7f0b80564490>, '2': <numjuggler.parser.Card object at 0x7f0b80564880>}
{'2': <numjuggler.parser.Card object at 0x7f0b80566320>, '3': <numjuggler.parser.Card object at 0x7f0b80566020>, '4': <numjuggler.parser.Card object at 0x7f0b80565ea0>, '5': <numjuggler.parser.Card object at 0x7f0b80565a20>, '6': <numjuggler.parser.Card object at 0x7f0b80567550>, '7': <numjuggler.parser.Card object at 0x7f0b80565e10>, '8': <numjuggler.parser.Card object at 0x7f0b80565e40>, '9': <numjuggler.parser.Card object at 0x7f0b80566140>, '10': <numjuggler.parser.Card object at 0x7f0b80565ff0>, '11': <numjuggler.parser.Card object at 0x7f0b80567250>, '12': <numjuggler.parser.Card object at 0x7f0b80565f90>, '13': <numjuggler.parser.Card object at 0x7f0b80566080>, '14': <numjuggler.parser.Card object at 0x7f0b805670d0>, '15': <numjuggler.parser.Card object at 0x7f0b80567700>, '16': <numjuggler.parser.Card object at 0x7f0b80567880>, '17': <numjuggler.parser.Card object at 0x7f0b80567940>, '18': <numjuggler.parser.Card object at 0x7f0b805658d0>, '19': <numjuggler.parser.Card object at 0x7f0b7bbe94e0>, '20': <numjuggler.parser.Card object at 0x7f0b7bbe9540>, '21': <numjuggler.parser.Card object at 0x7f0b7bbe95a0>, '86': <numjuggler.parser.Card object at 0x7f0b7bbe9600>, '87': <numjuggler.parser.Card object at 0x7f0b7bbe9660>, '88': <numjuggler.parser.Card object at 0x7f0b7bbe96c0>, '89': <numjuggler.parser.Card object at 0x7f0b7bbe9720>, '90': <numjuggler.parser.Card object at 0x7f0b7bbe9780>, '91': <numjuggler.parser.Card object at 0x7f0b7bbe97e0>, '92': <numjuggler.parser.Card object at 0x7f0b7bbe9840>, '93': <numjuggler.parser.Card object at 0x7f0b7bbe98a0>, '94': <numjuggler.parser.Card object at 0x7f0b7bbe9900>, '95': <numjuggler.parser.Card object at 0x7f0b7bbe9960>, '96': <numjuggler.parser.Card object at 0x7f0b7bbe99c0>, '97': <numjuggler.parser.Card object at 0x7f0b7bbe9a20>, '98': <numjuggler.parser.Card object at 0x7f0b7bbe9a80>, '99': <numjuggler.parser.Card object at 0x7f0b7bbe9ae0>, '100': <numjuggler.parser.Card object at 0x7f0b7bbe9b40>, '101': <numjuggler.parser.Card object at 0x7f0b7bbe9ba0>, '102': <numjuggler.parser.Card object at 0x7f0b7bbe9c00>, '103': <numjuggler.parser.Card object at 0x7f0b7bbe9c60>, '104': <numjuggler.parser.Card object at 0x7f0b7bbe9cc0>, '105': <numjuggler.parser.Card object at 0x7f0b7bbe9d20>}
{'M2': <f4enix.input.materials.Material object at 0x7f0b7bb648b0>, 'M3': <f4enix.input.materials.Material object at 0x7f0b7bb64ee0>}
{'SDEF': <numjuggler.parser.Card object at 0x7f0b80566170>}
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()
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 | 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 | 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 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