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)