Source code for magboltz_gui.util.parser

"""Read and write Magboltz card files from the GUI data model."""

from pathlib import Path

from magboltz_gui.data.input_cards import InputCards, InputGas


[docs] def load(filename: Path) -> InputCards: """Parse one Magboltz card file into an :class:`InputCards` object.""" with filename.open("r") as f: # Card 1 line = f.readline() parts = line.strip().split() num_gases = int(parts[0]) number_of_real_collisions = int(parts[1]) enable_penning = bool(parts[2] == "1") enable_thermal = bool(parts[3] == "1") final_energy = float(parts[4]) # Card 2 line = f.readline() gas_ids = [int(x) for x in line.strip().split()[:num_gases]] # Card 3 line = f.readline() parts = line.strip().split() gas_fracs = [float(x) for x in parts[:num_gases]] gas_temperature = float(parts[6]) gas_pressure = float(parts[7]) # Card 4 line = f.readline() parts = line.strip().split() electric_field = float(parts[0]) magnetic_field = float(parts[1]) angle = float(parts[2]) # Rebuild gases list gases = [InputGas(gas_id=gas_ids[i], gas_frac=gas_fracs[i]) for i in range(num_gases)] return InputCards( gases=gases, number_of_real_collisions=number_of_real_collisions, enable_penning=enable_penning, enable_thermal=enable_thermal, final_energy=final_energy, gas_temperature=gas_temperature, gas_pressure=gas_pressure, electric_field=electric_field, magnetic_field=magnetic_field, angle=angle, )
[docs] def save(input_cards: InputCards, filename: Path) -> None: """Serialize :class:`InputCards` back to the Magboltz card format.""" gas_ids = [gas.gas_id for gas in input_cards.gases] + [80] * (6 - len(input_cards.gases)) total = sum(gas.gas_frac for gas in input_cards.gases) if total > 0: normalized = [gas.gas_frac * 100.0 / total for gas in input_cards.gases] else: normalized = [0.0 for _ in input_cards.gases] gas_fracs = normalized + [0.0] * (6 - len(input_cards.gases)) with filename.open("w") as f: # Card 1 f.write( f"{len(input_cards.gases)}\t{input_cards.number_of_real_collisions}\t{'1' if input_cards.enable_penning else '0'}\t{'1' if input_cards.enable_thermal else '0'}\t{input_cards.final_energy}\n" ) # Card 2 f.write("\t".join(str(v) for v in gas_ids) + "\n") # Card 3 f.write("\t".join(str(v) for v in gas_fracs)) f.write(f"\t{input_cards.gas_temperature}\t{input_cards.gas_pressure}\n") # Card 4 f.write(f"{input_cards.electric_field}\t{input_cards.magnetic_field}\t{input_cards.angle}\n") # Card 4N + 1 f.write("{} {} {} {} {}\n".format(0, 0, 0, 0, 0.0))