From 7e797d930fc0e31cb8700cae7b3ac9857514db98 Mon Sep 17 00:00:00 2001 From: Tom Body <tbody@cfs.energy> Date: Thu, 1 Aug 2024 09:15:29 -0400 Subject: [PATCH 1/5] Limit JSON print to 10 significant figures --- cfspopcon/file_io.py | 11 + tests/regression_results/AUG_SepOS_minTe.json | 62 +- tests/regression_results/PRD.json | 790 +++++++++--------- 3 files changed, 437 insertions(+), 426 deletions(-) diff --git a/cfspopcon/file_io.py b/cfspopcon/file_io.py index b4d81a5..d82cb2e 100644 --- a/cfspopcon/file_io.py +++ b/cfspopcon/file_io.py @@ -121,5 +121,16 @@ def write_point_to_file(dataset: xr.Dataset, point_key: str, point_params: dict, output_dir.mkdir(parents=True, exist_ok=True) + class RoundingFloat(float): + """A formatter to control how floats are written to JSON. + + From: https://stackoverflow.com/questions/54370322/how-to-limit-the-number-of-float-digits-jsonencoder-produces + """ + + __repr__ = staticmethod(lambda x: f"{x:#.10g}") + + json.encoder.c_make_encoder = None # type:ignore[attr-defined] + json.encoder.float = RoundingFloat # type:ignore[attr-defined] + with open(output_dir / f"{point_key}.json", "w") as file: json.dump(point.to_dict(), file, indent=4, sort_keys=True) diff --git a/tests/regression_results/AUG_SepOS_minTe.json b/tests/regression_results/AUG_SepOS_minTe.json index 56d1b0c..fb41f44 100644 --- a/tests/regression_results/AUG_SepOS_minTe.json +++ b/tests/regression_results/AUG_SepOS_minTe.json @@ -3,12 +3,12 @@ "coords": { "dim_separatrix_electron_density": { "attrs": {}, - "data": 1.443846153846154, + "data": 1.443846154, "dims": [] }, "dim_separatrix_electron_temp": { "attrs": {}, - "data": 57.51724137931035, + "data": 57.51724138, "dims": [] } }, @@ -17,203 +17,203 @@ "attrs": { "units": "tesla" }, - "data": 0.3265306124226533, + "data": 0.3265306124, "dims": [] }, "B_t_out_mid": { "attrs": { "units": "tesla" }, - "data": 1.927570093457944, + "data": 1.927570093, "dims": [] }, "SepOS_LH_transition": { "attrs": { "units": "dimensionless" }, - "data": 1.0025081265471087, + "data": 1.002508127, "dims": [] }, "SepOS_MHD_limit": { "attrs": { "units": "dimensionless" }, - "data": 0.3560483425183738, + "data": 0.3560483425, "dims": [] }, "SepOS_density_limit": { "attrs": { "units": "dimensionless" }, - "data": 0.5502074424382402, + "data": 0.5502074424, "dims": [] }, "alpha_t": { "attrs": { "units": "dimensionless" }, - "data": 0.5195258259822426, + "data": 0.5195258260, "dims": [] }, "areal_elongation": { "attrs": { "units": "dimensionless" }, - "data": 1.64, + "data": 1.640000000, "dims": [] }, "average_ion_mass": { "attrs": { "units": "unified_atomic_mass_unit" }, - "data": 2.0, + "data": 2.000000000, "dims": [] }, "critical_alpha_MHD": { "attrs": { "units": "dimensionless" }, - "data": 2.5486604604701935, + "data": 2.548660460, "dims": [] }, "cylindrical_safety_factor": { "attrs": { "units": "dimensionless" }, - "data": 4.476700876332845, + "data": 4.476700876, "dims": [] }, "elongation_psi95": { "attrs": { "units": "dimensionless" }, - "data": 1.6, + "data": 1.600000000, "dims": [] }, "elongation_ratio_areal_to_psi95": { "attrs": { "units": "dimensionless" }, - "data": 1.025, + "data": 1.025000000, "dims": [] }, "fraction_of_P_SOL_to_divertor": { "attrs": { "units": "dimensionless" }, - "data": 0.6, + "data": 0.6000000000, "dims": [] }, "inverse_aspect_ratio": { "attrs": { "units": "dimensionless" }, - "data": 0.296969696969697, + "data": 0.2969696970, "dims": [] }, "ion_heat_diffusivity": { "attrs": { "units": "meter ** 2 / second" }, - "data": 0.5, + "data": 0.5000000000, "dims": [] }, "magnetic_field_on_axis": { "attrs": { "units": "tesla" }, - "data": 2.5, + "data": 2.500000000, "dims": [] }, "major_radius": { "attrs": { "units": "meter" }, - "data": 1.65, + "data": 1.650000000, "dims": [] }, "mean_ion_charge_state": { "attrs": { "units": "dimensionless" }, - "data": 1.0, + "data": 1.000000000, "dims": [] }, "minor_radius": { "attrs": { "units": "meter" }, - "data": 0.49, + "data": 0.4900000000, "dims": [] }, "plasma_current": { "attrs": { "units": "ampere" }, - "data": 800000.0, + "data": 800000.0000, "dims": [] }, "poloidal_sound_larmor_radius": { "attrs": { "units": "millimeter" }, - "data": 4.4794720291352315, + "data": 4.479472029, "dims": [] }, "separatrix_electron_density": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 1.443846153846154, + "data": 1.443846154, "dims": [] }, "separatrix_electron_temp": { "attrs": { "units": "electron_volt" }, - "data": 57.51724137931035, + "data": 57.51724138, "dims": [] }, "surface_area": { "attrs": { "units": "meter ** 2" }, - "data": 40.01085451537566, + "data": 40.01085452, "dims": [] }, "sustainment_power_in_electron_channel": { "attrs": { "units": "megawatt" }, - "data": 0.7413990364829475, + "data": 0.7413990365, "dims": [] }, "sustainment_power_in_ion_channel": { "attrs": { "units": "megawatt" }, - "data": 0.16744964593929906, + "data": 0.1674496459, "dims": [] }, "target_electron_temp": { "attrs": { "units": "electron_volt" }, - "data": 10.0, + "data": 10.00000000, "dims": [] }, "triangularity_psi95": { "attrs": { "units": "dimensionless" }, - "data": 0.3, + "data": 0.3000000000, "dims": [] }, "z_effective": { "attrs": { "units": "dimensionless" }, - "data": 1.25, + "data": 1.250000000, "dims": [] } }, diff --git a/tests/regression_results/PRD.json b/tests/regression_results/PRD.json index 62d859f..4c0a58a 100644 --- a/tests/regression_results/PRD.json +++ b/tests/regression_results/PRD.json @@ -3,12 +3,12 @@ "coords": { "dim_average_electron_density": { "attrs": {}, - "data": 25.0, + "data": 25.00000000, "dims": [] }, "dim_average_electron_temp": { "attrs": {}, - "data": 9.137931034482758, + "data": 9.137931034, "dims": [] }, "dim_species": { @@ -30,112 +30,112 @@ "attrs": { "units": "tesla" }, - "data": 3.0527119151332296, + "data": 3.052711915, "dims": [] }, "B_t_out_mid": { "attrs": { "units": "tesla" }, - "data": 9.326504089901384, + "data": 9.326504090, "dims": [] }, "PB_over_R": { "attrs": { "units": "megawatt * tesla / meter" }, - "data": 168.65128665872822, + "data": 168.6512867, "dims": [] }, "PBpRnSq": { "attrs": { "units": "megawatt * tesla / _1e20_per_cubic_metre ** 2 / meter" }, - "data": 8.20119898533133, + "data": 8.201198985, "dims": [] }, "P_LH_thresh": { "attrs": { "units": "megawatt" }, - "data": 24.59383938922551, + "data": 24.59383939, "dims": [] }, "P_alpha": { "attrs": { "units": "megawatt" }, - "data": 22.55867181683056, + "data": 22.55867182, "dims": [] }, "P_auxillary": { "attrs": { "units": "megawatt" }, - "data": 7.702542635179901, + "data": 7.702542635, "dims": [] }, "P_external": { "attrs": { "units": "megawatt" }, - "data": 8.904164505601578, + "data": 8.904164506, "dims": [] }, "P_fusion": { "attrs": { "units": "megawatt" }, - "data": 112.79335908415277, + "data": 112.7933591, "dims": [] }, "P_in": { "attrs": { "units": "megawatt" }, - "data": 31.46283632243214, + "data": 31.46283632, "dims": [] }, "P_launched": { "attrs": { "units": "megawatt" }, - "data": 9.893516117335087, + "data": 9.893516117, "dims": [] }, "P_neutron": { "attrs": { "units": "megawatt" }, - "data": 90.23468726732224, + "data": 90.23468727, "dims": [] }, "P_ohmic": { "attrs": { "units": "megawatt" }, - "data": 1.2016218704216768, + "data": 1.201621870, "dims": [] }, "P_radiation": { "attrs": { "units": "megawatt" }, - "data": 5.8886658045102305, + "data": 5.888665805, "dims": [] }, "P_radiation_from_core_seeded_impurity": { "attrs": { "units": "megawatt" }, - "data": 0.0, + "data": 0.000000000, "dims": [] }, "Q": { "attrs": { "units": "dimensionless" }, - "data": 11.40073536510645, + "data": 11.40073537, "dims": [] }, "SOL_momentum_loss_function": { @@ -147,91 +147,91 @@ "attrs": { "units": "dimensionless" }, - "data": 0.9639499116429592, + "data": 0.9639499116, "dims": [] }, "areal_elongation": { "attrs": { "units": "dimensionless" }, - "data": 1.75, + "data": 1.750000000, "dims": [] }, "average_electron_density": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 25.0, + "data": 25.00000000, "dims": [] }, "average_electron_temp": { "attrs": { "units": "kiloelectron_volt" }, - "data": 9.137931034482758, + "data": 9.137931034, "dims": [] }, "average_ion_density": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 21.35814799897336, + "data": 21.35814800, "dims": [] }, "average_ion_mass": { "attrs": { "units": "unified_atomic_mass_unit" }, - "data": 2.5, + "data": 2.500000000, "dims": [] }, "average_ion_temp": { "attrs": { "units": "kiloelectron_volt" }, - "data": 9.137931034482758, + "data": 9.137931034, "dims": [] }, "average_total_pressure": { "attrs": { "units": "pascal" }, - "data": 732028.9793275861, + "data": 732028.9793, "dims": [] }, "beta_poloidal": { "attrs": { "units": "dimensionless" }, - "data": 0.19742242875250135, + "data": 0.1974224288, "dims": [] }, "beta_toroidal": { "attrs": { "units": "dimensionless" }, - "data": 0.012360853882996833, + "data": 0.01236085388, "dims": [] }, "beta_total": { "attrs": { "units": "dimensionless" }, - "data": 0.011632527455851185, + "data": 0.01163252746, "dims": [] }, "bootstrap_fraction": { "attrs": { "units": "dimensionless" }, - "data": 0.08515124438705672, + "data": 0.08515124439, "dims": [] }, "breakdown_flux_consumption": { "attrs": { "units": "weber" }, - "data": 0.12840000000000001, + "data": 0.1284000000, "dims": [] }, "change_in_dilution": { @@ -239,11 +239,11 @@ "units": "dimensionless" }, "data": [ - 0.12, - 0.024798333717489005, + 0.1200000000, + 0.02479833372, NaN, - 0.0, - 0.0008757463235765251 + 0.000000000, + 0.0008757463236 ], "dims": [ "dim_species" @@ -254,11 +254,11 @@ "units": "dimensionless" }, "data": [ - 0.12, - 0.1735750066579794, + 0.1200000000, + 0.1735750067, NaN, - 0.0, - 0.0502530285602768 + 0.000000000, + 0.05025302856 ], "dims": [ "dim_species" @@ -268,14 +268,14 @@ "attrs": { "units": "dimensionless" }, - "data": 1.0, + "data": 1.000000000, "dims": [] }, "confinement_time_scalar": { "attrs": { "units": "dimensionless" }, - "data": 1.0, + "data": 1.000000000, "dims": [] }, "core_impurity_species": { @@ -287,21 +287,21 @@ "attrs": { "units": "dimensionless" }, - "data": 0.1871625858572634, + "data": 0.1871625859, "dims": [] }, "current_relaxation_time": { "attrs": { "units": "second" }, - "data": 16.361422316376107, + "data": 16.36142232, "dims": [] }, "cylindrical_safety_factor": { "attrs": { "units": "dimensionless" }, - "data": 2.675118549054515, + "data": 2.675118549, "dims": [] }, "density_profile_form": { @@ -313,28 +313,28 @@ "attrs": { "units": "dimensionless" }, - "data": 0.8543259199589345, + "data": 0.8543259200, "dims": [] }, "edge_impurity_concentration": { "attrs": { "units": "dimensionless" }, - "data": 0.08439527531343535, + "data": 0.08439527531, "dims": [] }, "edge_impurity_concentration_in_core": { "attrs": { "units": "dimensionless" }, - "data": 0.01687905506268707, + "data": 0.01687905506, "dims": [] }, "edge_impurity_enrichment": { "attrs": { "units": "dimensionless" }, - "data": 5.0, + "data": 5.000000000, "dims": [] }, "edge_impurity_species": { @@ -346,28 +346,28 @@ "attrs": { "units": "dimensionless" }, - "data": 0.0744319988819624, + "data": 0.07443199888, "dims": [] }, "ejima_coefficient": { "attrs": { "units": "dimensionless" }, - "data": 0.6, + "data": 0.6000000000, "dims": [] }, "electron_density_peaking": { "attrs": { "units": "dimensionless" }, - "data": 1.5011364712930257, + "data": 1.501136471, "dims": [] }, "electron_density_peaking_offset": { "attrs": { "units": "dimensionless" }, - "data": -0.1, + "data": -0.1000000000, "dims": [] }, "electron_density_profile": { @@ -375,56 +375,56 @@ "units": "_1e19_per_cubic_metre" }, "data": [ - 37.53972018043796, - 37.52575417564094, - 37.48388732838437, - 37.41421302417732, - 37.31688651982328, - 37.192124366959796, - 37.04020360921376, - 36.861460757138225, - 36.656290546239276, - 36.42514448450862, - 36.16852919694192, - 35.887004575537986, - 35.581181744233064, - 35.25172084912106, - 34.89932868513999, - 34.524756171161464, - 34.12879568609923, - 33.712278279251606, - 33.276070768606374, - 32.821072741264814, - 32.34821347048002, - 31.8584487640539, - 31.352757758996113, - 30.832139677416684, - 30.29761055860306, - 29.750199982123945, - 29.191310871556677, - 28.63580481195515, - 28.090869945391574, - 27.55630510372329, - 27.031912947005782, - 26.51749989064269, - 26.012876033922094, - 25.517855089912786, - 25.032254316694605, - 24.555894449897405, - 24.088599636523856, - 23.630197370031514, - 23.18051842665035, - 22.7393968029121, - 22.30666965436841, - 21.882177235475183, - 21.465762840620954, - 21.057272746277402, - 20.6565561542508, - 20.263465136013373, - 19.87785457809397, - 19.31315395148588, - 18.30647812801552, - 11.626332483716707 + 37.53972018, + 37.52575418, + 37.48388733, + 37.41421302, + 37.31688652, + 37.19212437, + 37.04020361, + 36.86146076, + 36.65629055, + 36.42514448, + 36.16852920, + 35.88700458, + 35.58118174, + 35.25172085, + 34.89932869, + 34.52475617, + 34.12879569, + 33.71227828, + 33.27607077, + 32.82107274, + 32.34821347, + 31.85844876, + 31.35275776, + 30.83213968, + 30.29761056, + 29.75019998, + 29.19131087, + 28.63580481, + 28.09086995, + 27.55630510, + 27.03191295, + 26.51749989, + 26.01287603, + 25.51785509, + 25.03225432, + 24.55589445, + 24.08859964, + 23.63019737, + 23.18051843, + 22.73939680, + 22.30666965, + 21.88217724, + 21.46576284, + 21.05727275, + 20.65655615, + 20.26346514, + 19.87785458, + 19.31315395, + 18.30647813, + 11.62633248 ], "dims": [ "dim_rho" @@ -435,56 +435,56 @@ "units": "kiloelectron_volt" }, "data": [ - 22.81700031005393, - 22.794916213858393, - 22.72879209094119, - 22.61901119942156, - 22.46620818995649, - 22.271262994778876, - 22.035292388010884, - 21.759639330503582, - 21.44586024142759, - 21.095710365374412, - 20.71112742738783, - 20.294213788755364, - 19.84721733324049, - 19.372511326493818, - 18.872573500483547, - 18.349964619853683, - 17.807306788148814, - 17.247261748912724, - 16.672509429922524, - 16.085726968478994, - 15.489568442015889, - 14.886645511652285, - 14.279509167072204, - 13.67063273969366, - 13.06239632792736, - 12.457072753886544, - 11.857198932297228, - 11.278916509472818, - 10.728837253556305, - 10.205585679849829, - 9.707853386836657, - 9.234395784495796, - 8.784028982178587, - 8.355626828265335, - 7.948118094199611, - 7.560483795858814, - 7.1917546455630434, - 6.841008628350937, - 6.50736869646198, - 6.190000576260198, - 5.888110682115468, - 5.600944132026026, - 5.327782860020225, - 5.067943820617523, - 4.820777280858972, - 4.585665195636339, - 4.36201966225737, - 4.046835325082298, - 3.835898711955329, - 2.4361558507970544 + 22.81700031, + 22.79491621, + 22.72879209, + 22.61901120, + 22.46620819, + 22.27126299, + 22.03529239, + 21.75963933, + 21.44586024, + 21.09571037, + 20.71112743, + 20.29421379, + 19.84721733, + 19.37251133, + 18.87257350, + 18.34996462, + 17.80730679, + 17.24726175, + 16.67250943, + 16.08572697, + 15.48956844, + 14.88664551, + 14.27950917, + 13.67063274, + 13.06239633, + 12.45707275, + 11.85719893, + 11.27891651, + 10.72883725, + 10.20558568, + 9.707853387, + 9.234395784, + 8.784028982, + 8.355626828, + 7.948118094, + 7.560483796, + 7.191754646, + 6.841008628, + 6.507368696, + 6.190000576, + 5.888110682, + 5.600944132, + 5.327782860, + 5.067943821, + 4.820777281, + 4.585665196, + 4.362019662, + 4.046835325, + 3.835898712, + 2.436155851 ], "dims": [ "dim_rho" @@ -494,21 +494,21 @@ "attrs": { "units": "dimensionless" }, - "data": 1.707317073170732, + "data": 1.707317073, "dims": [] }, "elongation_ratio_areal_to_psi95": { "attrs": { "units": "dimensionless" }, - "data": 1.025, + "data": 1.025000000, "dims": [] }, "elongation_ratio_sep_to_areal": { "attrs": { "units": "dimensionless" }, - "data": 1.125, + "data": 1.125000000, "dims": [] }, "energy_confinement_scaling": { @@ -520,56 +520,56 @@ "attrs": { "units": "second" }, - "data": 0.6623169006550258, + "data": 0.6623169007, "dims": [] }, "external_flux": { "attrs": { "units": "weber" }, - "data": 23.59919917115023, + "data": 23.59919917, "dims": [] }, "external_inductance": { "attrs": { "units": "henry" }, - "data": 2.7125516288678424e-06, + "data": 2.712551629e-06, "dims": [] }, "f_shaping": { "attrs": { "units": "dimensionless" }, - "data": 2.6721853873123846, + "data": 2.672185387, "dims": [] }, "fieldline_pitch_at_omp": { "attrs": { "units": "dimensionless" }, - "data": 3.214648364176006, + "data": 3.214648364, "dims": [] }, "flux_needed_from_CS_over_rampup": { "attrs": { "units": "weber" }, - "data": 34.64464918777696, + "data": 34.64464919, "dims": [] }, "fraction_of_P_SOL_to_divertor": { "attrs": { "units": "dimensionless" }, - "data": 0.6, + "data": 0.6000000000, "dims": [] }, "fraction_of_external_power_coupled": { "attrs": { "units": "dimensionless" }, - "data": 0.9, + "data": 0.9000000000, "dims": [] }, "fuel_ion_density_profile": { @@ -577,56 +577,56 @@ "units": "_1e19_per_cubic_metre" }, "data": [ - 29.930067150900502, - 29.92110127101585, - 29.894219743109797, - 29.8494708541808, - 29.786934921944418, - 29.70672405461707, - 29.60898181602275, - 29.493882797422952, - 29.36163209785715, - 29.212464715158934, - 29.046644850178552, - 28.864465127095357, - 28.666245733040473, - 28.452333480570086, - 28.223100796831044, - 27.97894464354134, - 27.72028537216766, - 27.447565518918495, - 27.161248544384176, - 26.861817522842813, - 26.549773786413212, - 26.225635529371754, - 25.889936378059, - 25.543223931884263, - 25.186058280990594, - 24.819010506170905, - 24.44290595138778, - 24.067685187747337, - 23.698224402963213, - 23.33443517613859, - 22.97623044371757, - 22.623524478648758, - 22.27623286986871, - 21.93427250210033, - 21.59756153596137, - 21.266019388378268, - 20.939566713300714, - 20.61812538271217, - 20.301618467932002, - 19.989970221204533, - 19.683106057570825, - 19.38095253701865, - 19.083437346906553, - 18.790489284657667, - 18.502038240719234, - 18.218015181783677, - 17.93835213426727, - 17.526886456122497, - 16.61331776090008, - 10.551016672631755 + 29.93006715, + 29.92110127, + 29.89421974, + 29.84947085, + 29.78693492, + 29.70672405, + 29.60898182, + 29.49388280, + 29.36163210, + 29.21246472, + 29.04664485, + 28.86446513, + 28.66624573, + 28.45233348, + 28.22310080, + 27.97894464, + 27.72028537, + 27.44756552, + 27.16124854, + 26.86181752, + 26.54977379, + 26.22563553, + 25.88993638, + 25.54322393, + 25.18605828, + 24.81901051, + 24.44290595, + 24.06768519, + 23.69822440, + 23.33443518, + 22.97623044, + 22.62352448, + 22.27623287, + 21.93427250, + 21.59756154, + 21.26601939, + 20.93956671, + 20.61812538, + 20.30161847, + 19.98997022, + 19.68310606, + 19.38095254, + 19.08343735, + 18.79048928, + 18.50203824, + 18.21801518, + 17.93835213, + 17.52688646, + 16.61331776, + 10.55101667 ], "dims": [ "dim_rho" @@ -641,28 +641,28 @@ "attrs": { "units": "_1e20_per_cubic_metre * kiloelectron_volt * second" }, - "data": 45.27909640073872, + "data": 45.27909640, "dims": [] }, "greenwald_density_limit": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 85.23982049781885, + "data": 85.23982050, "dims": [] }, "greenwald_fraction": { "attrs": { "units": "dimensionless" }, - "data": 0.2932901530528177, + "data": 0.2932901531, "dims": [] }, "heavier_fuel_species_fraction": { "attrs": { "units": "dimensionless" }, - "data": 0.5, + "data": 0.5000000000, "dims": [] }, "impurity_charge_state": { @@ -670,11 +670,11 @@ "units": "dimensionless" }, "data": [ - 2.0, - 7.999462489512582, - 17.893776835302685, - 45.811693483863905, - 58.38308823843501 + 2.000000000, + 7.999462490, + 17.89377684, + 45.81169348, + 58.38308824 ], "dims": [ "dim_species" @@ -685,11 +685,11 @@ "units": "dimensionless" }, "data": [ - 0.06, - 0.0031, - 0.01687905506268707, - 0.0, - 1.5e-05 + 0.06000000000, + 0.003100000000, + 0.01687905506, + 0.000000000, + 1.500000000e-05 ], "dims": [ "dim_species" @@ -699,28 +699,28 @@ "attrs": { "units": "ampere" }, - "data": 7959184.1738326065, + "data": 7959184.174, "dims": [] }, "internal_flux": { "attrs": { "units": "weber" }, - "data": 11.574036082512393, + "data": 11.57403608, "dims": [] }, "internal_inductance": { "attrs": { "units": "henry" }, - "data": 1.3303489750014244e-06, + "data": 1.330348975e-06, "dims": [] }, "internal_inductivity": { "attrs": { "units": "dimensionless" }, - "data": 1.1444952177978316, + "data": 1.144495218, "dims": [] }, "intrinsic_impurity_concentration": { @@ -728,11 +728,11 @@ "units": "dimensionless" }, "data": [ - 0.06, - 0.0031, + 0.06000000000, + 0.003100000000, NaN, NaN, - 1.5e-05 + 1.500000000e-05 ], "dims": [ "dim_species" @@ -742,28 +742,28 @@ "attrs": { "units": "dimensionless" }, - "data": 0.3081, + "data": 0.3081000000, "dims": [] }, "invmu_0_dLedR": { "attrs": { "units": "dimensionless" }, - "data": 2.163372412583668, + "data": 2.163372413, "dims": [] }, "ion_density_peaking": { "attrs": { "units": "dimensionless" }, - "data": 1.4011364712930259, + "data": 1.401136471, "dims": [] }, "ion_density_peaking_offset": { "attrs": { "units": "dimensionless" }, - "data": -0.2, + "data": -0.2000000000, "dims": [] }, "ion_temp_profile": { @@ -771,56 +771,56 @@ "units": "kiloelectron_volt" }, "data": [ - 22.81700031005393, - 22.794916213858393, - 22.72879209094119, - 22.61901119942156, - 22.46620818995649, - 22.271262994778876, - 22.035292388010884, - 21.759639330503582, - 21.44586024142759, - 21.095710365374412, - 20.71112742738783, - 20.294213788755364, - 19.84721733324049, - 19.372511326493818, - 18.872573500483547, - 18.349964619853683, - 17.807306788148814, - 17.247261748912724, - 16.672509429922524, - 16.085726968478994, - 15.489568442015889, - 14.886645511652285, - 14.279509167072204, - 13.67063273969366, - 13.06239632792736, - 12.457072753886544, - 11.857198932297228, - 11.278916509472818, - 10.728837253556305, - 10.205585679849829, - 9.707853386836657, - 9.234395784495796, - 8.784028982178587, - 8.355626828265335, - 7.948118094199611, - 7.560483795858814, - 7.1917546455630434, - 6.841008628350937, - 6.50736869646198, - 6.190000576260198, - 5.888110682115468, - 5.600944132026026, - 5.327782860020225, - 5.067943820617523, - 4.820777280858972, - 4.585665195636339, - 4.36201966225737, - 4.046835325082298, - 3.835898711955329, - 2.4361558507970544 + 22.81700031, + 22.79491621, + 22.72879209, + 22.61901120, + 22.46620819, + 22.27126299, + 22.03529239, + 21.75963933, + 21.44586024, + 21.09571037, + 20.71112743, + 20.29421379, + 19.84721733, + 19.37251133, + 18.87257350, + 18.34996462, + 17.80730679, + 17.24726175, + 16.67250943, + 16.08572697, + 15.48956844, + 14.88664551, + 14.27950917, + 13.67063274, + 13.06239633, + 12.45707275, + 11.85719893, + 11.27891651, + 10.72883725, + 10.20558568, + 9.707853387, + 9.234395784, + 8.784028982, + 8.355626828, + 7.948118094, + 7.560483796, + 7.191754646, + 6.841008628, + 6.507368696, + 6.190000576, + 5.888110682, + 5.600944132, + 5.327782860, + 5.067943821, + 4.820777281, + 4.585665196, + 4.362019662, + 4.046835325, + 3.835898712, + 2.436155851 ], "dims": [ "dim_rho" @@ -830,28 +830,28 @@ "attrs": { "units": "dimensionless" }, - "data": 1.0, + "data": 1.000000000, "dims": [] }, "kappa_e0": { "attrs": { "units": "watt / electron_volt ** 3.5 / meter" }, - "data": 2600.0, + "data": 2600.000000, "dims": [] }, "lambda_q": { "attrs": { "units": "millimeter" }, - "data": 0.28327233584935924, + "data": 0.2832723358, "dims": [] }, "lambda_q_factor": { "attrs": { "units": "dimensionless" }, - "data": 1.0, + "data": 1.000000000, "dims": [] }, "lambda_q_scaling": { @@ -863,203 +863,203 @@ "attrs": { "units": "dimensionless" }, - "data": 4.3, + "data": 4.300000000, "dims": [] }, "loop_voltage": { "attrs": { "units": "volt" }, - "data": 0.15097299474137646, + "data": 0.1509729947, "dims": [] }, "magnetic_field_on_axis": { "attrs": { "units": "tesla" }, - "data": 12.2, + "data": 12.20000000, "dims": [] }, "major_radius": { "attrs": { "units": "meter" }, - "data": 1.85, + "data": 1.850000000, "dims": [] }, "max_flattop_duration": { "attrs": { "units": "second" }, - "data": 2.3537375861939336, + "data": 2.353737586, "dims": [] }, "min_P_radiation": { "attrs": { "units": "megawatt" }, - "data": 0.0, + "data": 0.000000000, "dims": [] }, "minimum_core_radiated_fraction": { "attrs": { "units": "dimensionless" }, - "data": 0.0, + "data": 0.000000000, "dims": [] }, "minor_radius": { "attrs": { "units": "meter" }, - "data": 0.569985, + "data": 0.5699850000, "dims": [] }, "neoclassical_loop_resistivity": { "attrs": { "units": "meter * ohm" }, - "data": 2.914700219539595e-09, + "data": 2.914700220e-09, "dims": [] }, "nesep_over_nebar": { "attrs": { "units": "dimensionless" }, - "data": 0.3, + "data": 0.3000000000, "dims": [] }, "neutron_power_flux_to_walls": { "attrs": { "units": "megawatt / meter ** 2" }, - "data": 1.6247887524599953, + "data": 1.624788752, "dims": [] }, "neutron_rate": { "attrs": { "units": "1 / second" }, - "data": 4.000004399219608e+19, + "data": 4.000004399e+19, "dims": [] }, "normalized_beta": { "attrs": { "units": "meter * percent * tesla / megaampere" }, - "data": 0.9297754847754564, + "data": 0.9297754848, "dims": [] }, "normalized_inverse_temp_scale_length": { "attrs": { "units": "dimensionless" }, - "data": 2.5, + "data": 2.500000000, "dims": [] }, "nu_star": { "attrs": { "units": "dimensionless" }, - "data": 0.023749339512849004, + "data": 0.02374933951, "dims": [] }, "parallel_connection_length": { "attrs": { "units": "meter" }, - "data": 30.0, + "data": 30.00000000, "dims": [] }, "peak_electron_density": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 37.52841178232564, + "data": 37.52841178, "dims": [] }, "peak_electron_temp": { "attrs": { "units": "kiloelectron_volt" }, - "data": 22.844827586206897, + "data": 22.84482759, "dims": [] }, "peak_fuel_ion_density": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 29.925680120635736, + "data": 29.92568012, "dims": [] }, "peak_ion_temp": { "attrs": { "units": "kiloelectron_volt" }, - "data": 22.844827586206897, + "data": 22.84482759, "dims": [] }, "peak_pressure": { "attrs": { "units": "pascal" }, - "data": 2468917.5023597004, + "data": 2468917.502, "dims": [] }, "plasma_current": { "attrs": { "units": "ampere" }, - "data": 8700000.0, + "data": 8700000.000, "dims": [] }, "plasma_stored_energy": { "attrs": { "units": "megajoule" }, - "data": 20.838368238889625, + "data": 20.83836824, "dims": [] }, "plasma_volume": { "attrs": { "units": "meter ** 3" }, - "data": 19.79484837055445, + "data": 19.79484837, "dims": [] }, "poloidal_field_flux": { "attrs": { "units": "weber" }, - "data": 12.663930174827374, + "data": 12.66393017, "dims": [] }, "power_crossing_separatrix": { "attrs": { "units": "megawatt" }, - "data": 25.574170517921907, + "data": 25.57417052, "dims": [] }, "q_parallel": { "attrs": { "units": "gigawatt / meter ** 2" }, - "data": 11.452217172785087, + "data": 11.45221717, "dims": [] }, "q_perp": { "attrs": { "units": "megawatt / meter ** 2" }, - "data": 5937.516785354829, + "data": 5937.516785, "dims": [] }, "q_star": { "attrs": { "units": "dimensionless" }, - "data": 3.2902757162288694, + "data": 3.290275716, "dims": [] }, "radiated_power_method": { @@ -1071,21 +1071,21 @@ "attrs": { "units": "dimensionless" }, - "data": 1.0, + "data": 1.000000000, "dims": [] }, "ratio_of_P_SOL_to_P_LH": { "attrs": { "units": "dimensionless" }, - "data": 1.039860841293689, + "data": 1.039860841, "dims": [] }, "resistive_flux": { "attrs": { "units": "weber" }, - "data": 12.135344108941705, + "data": 12.13534411, "dims": [] }, "rho": { @@ -1093,56 +1093,56 @@ "units": "dimensionless" }, "data": [ - 0.0, - 0.02, - 0.04, - 0.06, - 0.08, - 0.1, - 0.12, - 0.14, - 0.16, - 0.18, - 0.2, - 0.22, - 0.24, - 0.26, - 0.28, - 0.3, - 0.32, - 0.34, - 0.36, - 0.38, - 0.4, - 0.42, - 0.44, - 0.46, - 0.48, - 0.5, - 0.52, - 0.54, - 0.56, - 0.58, - 0.6, - 0.62, - 0.64, - 0.66, - 0.68, - 0.7000000000000001, - 0.72, - 0.74, - 0.76, - 0.78, - 0.8, - 0.8200000000000001, - 0.84, - 0.86, - 0.88, - 0.9, - 0.92, - 0.9400000000000001, - 0.96, - 0.98 + 0.000000000, + 0.02000000000, + 0.04000000000, + 0.06000000000, + 0.08000000000, + 0.1000000000, + 0.1200000000, + 0.1400000000, + 0.1600000000, + 0.1800000000, + 0.2000000000, + 0.2200000000, + 0.2400000000, + 0.2600000000, + 0.2800000000, + 0.3000000000, + 0.3200000000, + 0.3400000000, + 0.3600000000, + 0.3800000000, + 0.4000000000, + 0.4200000000, + 0.4400000000, + 0.4600000000, + 0.4800000000, + 0.5000000000, + 0.5200000000, + 0.5400000000, + 0.5600000000, + 0.5800000000, + 0.6000000000, + 0.6200000000, + 0.6400000000, + 0.6600000000, + 0.6800000000, + 0.7000000000, + 0.7200000000, + 0.7400000000, + 0.7600000000, + 0.7800000000, + 0.8000000000, + 0.8200000000, + 0.8400000000, + 0.8600000000, + 0.8800000000, + 0.9000000000, + 0.9200000000, + 0.9400000000, + 0.9600000000, + 0.9800000000 ], "dims": [ "dim_rho" @@ -1152,7 +1152,7 @@ "attrs": { "units": "dimensionless" }, - "data": 0.0022127891680210027, + "data": 0.002212789168, "dims": [] }, "safety_factor_on_axis": { @@ -1166,49 +1166,49 @@ "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 7.5, + "data": 7.500000000, "dims": [] }, "separatrix_electron_temp": { "attrs": { "units": "electron_volt" }, - "data": 299.0648656105667, + "data": 299.0648656, "dims": [] }, "separatrix_elongation": { "attrs": { "units": "dimensionless" }, - "data": 1.96875, + "data": 1.968750000, "dims": [] }, "separatrix_triangularity": { "attrs": { "units": "dimensionless" }, - "data": 0.54, + "data": 0.5400000000, "dims": [] }, "spitzer_resistivity": { "attrs": { "units": "meter * ohm" }, - "data": 1.0136457814443183e-09, + "data": 1.013645781e-09, "dims": [] }, "summed_impurity_density": { "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 1.5778750000000001, + "data": 1.577875000, "dims": [] }, "surface_area": { "attrs": { "units": "meter ** 2" }, - "data": 55.536257947812175, + "data": 55.53625795, "dims": [] }, "surface_inductance_coefficients": { @@ -1220,28 +1220,28 @@ "attrs": { "units": "_1e19_per_cubic_metre" }, - "data": 44.85972984158247, + "data": 44.85972984, "dims": [] }, "target_electron_flux": { "attrs": { "units": "1 / meter ** 2 / second" }, - "data": 1.970617339216083e+25, + "data": 1.970617339e+25, "dims": [] }, "target_electron_temp": { "attrs": { "units": "electron_volt" }, - "data": 25.0, + "data": 25.00000000, "dims": [] }, "target_q_parallel": { "attrs": { "units": "gigawatt / meter ** 2" }, - "data": 0.4128534409629226, + "data": 0.4128534410, "dims": [] }, "temp_profile_form": { @@ -1253,14 +1253,14 @@ "attrs": { "units": "dimensionless" }, - "data": 2.5, + "data": 2.500000000, "dims": [] }, "toroidal_flux_expansion": { "attrs": { "units": "dimensionless" }, - "data": 0.6974, + "data": 0.6974000000, "dims": [] }, "total_flux_available_from_CS": { @@ -1274,35 +1274,35 @@ "attrs": { "units": "dimensionless" }, - "data": 2.377505168672477, + "data": 2.377505169, "dims": [] }, "triangularity_psi95": { "attrs": { "units": "dimensionless" }, - "data": 0.3, + "data": 0.3000000000, "dims": [] }, "triangularity_ratio_sep_to_psi95": { "attrs": { "units": "dimensionless" }, - "data": 1.8, + "data": 1.800000000, "dims": [] }, "vertical_field_mutual_inductance": { "attrs": { "units": "dimensionless" }, - "data": 1.0293853117575016, + "data": 1.029385312, "dims": [] }, "vertical_magnetic_field": { "attrs": { "units": "tesla" }, - "data": 1.1441875312785694, + "data": 1.144187531, "dims": [] }, "vertical_magnetic_field_equation": { @@ -1314,14 +1314,14 @@ "attrs": { "units": "meter" }, - "data": 1.1221579687499998, + "data": 1.122157969, "dims": [] }, "z_effective": { "attrs": { "units": "dimensionless" }, - "data": 1.3438280352182561, + "data": 1.343828035, "dims": [] } }, From 73b18ac810849728aef2045382a6613bf06a9680 Mon Sep 17 00:00:00 2001 From: Tom Body <tbody@cfs.energy> Date: Thu, 1 Aug 2024 19:19:54 -0400 Subject: [PATCH 2/5] Compatibility fix for Py3.9 --- cfspopcon/file_io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cfspopcon/file_io.py b/cfspopcon/file_io.py index d82cb2e..c62fcc9 100644 --- a/cfspopcon/file_io.py +++ b/cfspopcon/file_io.py @@ -127,7 +127,7 @@ class RoundingFloat(float): From: https://stackoverflow.com/questions/54370322/how-to-limit-the-number-of-float-digits-jsonencoder-produces """ - __repr__ = staticmethod(lambda x: f"{x:#.10g}") + __repr__ = staticmethod(lambda x: f"{x:#.10g}") # type:ignore[assignment,unused-ignore] json.encoder.c_make_encoder = None # type:ignore[attr-defined] json.encoder.float = RoundingFloat # type:ignore[attr-defined] From b64ac22c9d0620691ffbc1ef2c27b684a87fecdc Mon Sep 17 00:00:00 2001 From: Tom Body <tbody@cfs.energy> Date: Fri, 2 Aug 2024 10:25:27 -0400 Subject: [PATCH 3/5] Add a context manager for modifying the JSON encoder --- cfspopcon/file_io.py | 50 +++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/cfspopcon/file_io.py b/cfspopcon/file_io.py index c62fcc9..401967a 100644 --- a/cfspopcon/file_io.py +++ b/cfspopcon/file_io.py @@ -2,7 +2,7 @@ import json from pathlib import Path -from typing import Any, Literal +from typing import Any, Literal, Self import numpy as np import xarray as xr @@ -91,6 +91,38 @@ def read_dataset_from_netcdf(filepath: Path) -> xr.Dataset: return dataset +# These following lines are needed to modify the representation of floats +# in the JSON file. This is needed, because otherwise small errors in the +# floats lead to a large, meaningless diff of the reference JSON files. + + +class RoundingFloat(float): + """A modified version of the 'float' built-in, with a modified __repr__. + + This is needed because `iterencode` directly uses `float.__repr__` in `floatstr`. + + From: https://stackoverflow.com/questions/54370322/how-to-limit-the-number-of-float-digits-jsonencoder-produces + """ + + __repr__ = staticmethod(lambda x: f"{x:#.10g}") # type:ignore[assignment,unused-ignore] + + +class ModifyJSONFloatRepr: + """A ContextManager to locally modify the representation of floats.""" + + def __enter__(self) -> Self: + """Change the float representation to fixed precision on entry.""" + self.c_make_encoder = json.encoder.c_make_encoder # type:ignore[attr-defined] + json.encoder.c_make_encoder = None # type:ignore[attr-defined] + json.encoder.float = RoundingFloat # type:ignore[attr-defined] + return self + + def __exit__(self, *args: Any) -> None: + """Change the float representation back to the default.""" + json.encoder.c_make_encoder = self.c_make_encoder # type:ignore[attr-defined] + json.encoder.float = float # type:ignore[attr-defined] + + def write_point_to_file(dataset: xr.Dataset, point_key: str, point_params: dict, output_dir: Path) -> None: """Write the analysis values at the named points to a json file.""" mask = build_mask_from_dict(dataset, point_params) @@ -121,16 +153,6 @@ def write_point_to_file(dataset: xr.Dataset, point_key: str, point_params: dict, output_dir.mkdir(parents=True, exist_ok=True) - class RoundingFloat(float): - """A formatter to control how floats are written to JSON. - - From: https://stackoverflow.com/questions/54370322/how-to-limit-the-number-of-float-digits-jsonencoder-produces - """ - - __repr__ = staticmethod(lambda x: f"{x:#.10g}") # type:ignore[assignment,unused-ignore] - - json.encoder.c_make_encoder = None # type:ignore[attr-defined] - json.encoder.float = RoundingFloat # type:ignore[attr-defined] - - with open(output_dir / f"{point_key}.json", "w") as file: - json.dump(point.to_dict(), file, indent=4, sort_keys=True) + with ModifyJSONFloatRepr(): + with open(output_dir / f"{point_key}.json", "w") as file: + json.dump(point.to_dict(), file, indent=4, sort_keys=True) From 805d36fc1ef7289181639702b772d78dda9534c6 Mon Sep 17 00:00:00 2001 From: Tom Body <tbody@cfs.energy> Date: Fri, 2 Aug 2024 10:46:26 -0400 Subject: [PATCH 4/5] Arrrgh Py3.9 --- cfspopcon/file_io.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cfspopcon/file_io.py b/cfspopcon/file_io.py index 401967a..6eaea20 100644 --- a/cfspopcon/file_io.py +++ b/cfspopcon/file_io.py @@ -1,8 +1,14 @@ """Functions for saving results to file and loading those files.""" import json +import sys from pathlib import Path -from typing import Any, Literal, Self +from typing import Any, Literal + +if sys.version_info >= (3, 11, 0): + from typing import Self # type:ignore[attr-defined,unused-ignore] +else: + from typing_extensions import Self # type:ignore[attr-defined,unused-ignore] import numpy as np import xarray as xr From 10038a1cf11c07b93a42459c10cf700ab122f14e Mon Sep 17 00:00:00 2001 From: Christoph Hasse <hassec@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:30:14 -0400 Subject: [PATCH 5/5] make names private --- cfspopcon/file_io.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cfspopcon/file_io.py b/cfspopcon/file_io.py index 6eaea20..d12b237 100644 --- a/cfspopcon/file_io.py +++ b/cfspopcon/file_io.py @@ -102,7 +102,7 @@ def read_dataset_from_netcdf(filepath: Path) -> xr.Dataset: # floats lead to a large, meaningless diff of the reference JSON files. -class RoundingFloat(float): +class _RoundingFloat(float): """A modified version of the 'float' built-in, with a modified __repr__. This is needed because `iterencode` directly uses `float.__repr__` in `floatstr`. @@ -113,14 +113,14 @@ class RoundingFloat(float): __repr__ = staticmethod(lambda x: f"{x:#.10g}") # type:ignore[assignment,unused-ignore] -class ModifyJSONFloatRepr: +class _ModifyJSONFloatRepr: """A ContextManager to locally modify the representation of floats.""" def __enter__(self) -> Self: """Change the float representation to fixed precision on entry.""" self.c_make_encoder = json.encoder.c_make_encoder # type:ignore[attr-defined] json.encoder.c_make_encoder = None # type:ignore[attr-defined] - json.encoder.float = RoundingFloat # type:ignore[attr-defined] + json.encoder.float = _RoundingFloat # type:ignore[attr-defined] return self def __exit__(self, *args: Any) -> None: @@ -159,6 +159,6 @@ def write_point_to_file(dataset: xr.Dataset, point_key: str, point_params: dict, output_dir.mkdir(parents=True, exist_ok=True) - with ModifyJSONFloatRepr(): + with _ModifyJSONFloatRepr(): with open(output_dir / f"{point_key}.json", "w") as file: json.dump(point.to_dict(), file, indent=4, sort_keys=True)